内容来源:Bits, Bugs, and Opinions。https://tomakl.dev/posts/my-claude-code-setup/
原题:The 120-file Claude Code developer workbench
原发布时间:2026-03-03
48 条命令、18 个智能体、22 条规则、11 个 Hooks:我如何把 CLI 编程助手改造成面向 DevOps 和自动化的完整开发环境。
归档关系:这是 Tomasz 的 Claude Code 配置系列的奠基文章。已经归档的自定义命令、DevOps、Hooks 以及 Skills/智能体文章,分别扩展了这个工作台的各个部分。随着配置演进,其中的数量也发生变化;归档保留了每个时间点的原始数值。
兼容性与安全说明(核对日期:2026-07-21):当前 Skills 使用
.claude/skills/<name>/SKILL.md;旧版.claude/commands/仍然可用。Rules 会在启动时加载,除非通过paths限定作用域。下方的权限 Hook JSON 早于当前事件专用 Hook Schema,其中的字符串防护只能作为纵深防御,不能充当安全边界。真实 Vault 值不应暴露在 Shell 历史中,也应审查 OSC 52 剪贴板文本。最后,Claude Max 存在用量限制;成本章节只是作者当时的个人快照。下文完整保留原始正文。

经常有人问我,单打独斗时是怎样把事情做完的。简短答案是:好工具。完整答案则涉及一个配了大量配置文件的 CLI 编程助手。
过去几个月,我一直在把 Claude Code 配置成开发工作的主要助手。我没有编写框架,也没有构建抽象层,只是往 .claude/ 目录中加入文件,让它理解我的项目、偏好和工作流。它仍然只是助手,每个决定仍然由我作出,但它替我省下了数小时的打字时间。
下面就是这套配置。
目录结构
所有内容都放在一个 Git 仓库中,而 .claude/ 目录才是真正有意思的地方:
.claude/
commands/ # 48 条斜杠命令,按类别组织
agents/ # 18 份专业智能体定义
rules/ # 22 条行为规则(始终加载)
hooks/ # 11 个由事件触发的 Shell 脚本
skills/ # 4 份可复用知识文件
Commands 是我输入的快捷命令。/deploy 会启动一次 Trigger.dev 部署,/morning 汇总每日简报,/humanize 清理文本,/gemini-image 生成图片。共有 48 条命令,分布在 11 个类别中:内容、分析、媒体、DevOps、代码、搜索、文档、沟通、生产力,还有少数其他类别。我写过它们的工作原理,以及具体的 DevOps 和 Toggl 类别。
Rules 是 Claude 自动读取的内容。每次对话开始时,22 份规则文件都会加载到上下文中。它们涵盖各种要求,从“绝不直接编辑 .env 文件”,到“始终使用 clip 脚本把命令复制到剪贴板”,再到“事实性问题使用 Tavily,不要只依赖训练数据”。其中一份规则文件只列出了让文本显得像 AI 写作的禁用词汇和短语。
智能体
这是配置真正精彩的部分。我有 18 份智能体定义,分别作为专业助手工作。每一份都是 Markdown 文件,说明智能体的关注重点及行为方式。我告诉它们要做什么,它们完成跑腿工作,我再审查结果。
举几个例子:
• enterprise-app-specialist 帮我调试生产问题。我会把错误和基础设施上下文交给它;它深入分析日志与配置,再给我一份带建议的总结。真正要修什么,由我决定。
• email-writer 用我的语气起草邮件。它知道我的风格偏好,也知道我会以 tomakl 署名。它先向我展示全文,我按需编辑、批准,然后由它复制到剪贴板。
• server-command-advisor 帮我为远程服务器构造命令。它查找文档、建议正确的参数,再把命令复制到我的剪贴板。我会亲自粘贴和执行。
• deploy-verifier 检查部署是否成功,包括容器健康状况、Web 端点和 Worker 状态。
• vault-secret-rotator 帮我审计和轮换 HashiCorp Vault 中的密钥。
这些智能体不与主对话共享上下文窗口,这是有意为之。原始日志和搜索结果会留在智能体上下文中,我拿到的是干净的摘要。
Hooks
Hooks 是在特定事件发生时触发的 Shell 脚本。我有 11 个。
权限 Hook 最重要。它会自动批准读取操作、搜索命令和安全工具,自动拒绝 rm -rf /、git push --force 和 git reset --hard,其余操作则要求手动确认。这样,我既能快速工作,也不会意外毁掉什么。
# permission-auto-approve.sh(简化版)
case "$TOOL" in
Read|Glob|Grep) echo '{"decision":"approve"}' ;;
Bash)
case "$COMMAND" in
*"rm -rf /"*) echo '{"decision":"deny"}' ;;
*"git push --force"*) echo '{"decision":"deny"}' ;;
# ……更多模式
esac ;;
esac
其他 Hooks 会扫描 Bash 输出中泄漏的密钥、对编辑后的文件运行 Lint、在会话结束时保存 Git 状态,还会在我进行评分时检测并记录下来,以便长期追踪质量。另有一个 Pre-commit Hook,会在 AWS Key、私钥和调试语句进入仓库之前将其捕捉。
硬件
我的桌子下面放着一台配有 8 GB 内存的 NVIDIA Jetson。它采用 ARM64 架构,运行 Ubuntu 22.04,并托管:
• Trigger.dev(10 个 Docker 容器,自托管)
• GitHub Actions Runner(自托管,接收 CI/CD 作业)
• HashiCorp Vault(保存所有密钥,启动时自动解封)
• AdGuard Home(为整个局域网提供 DNS 级广告拦截)
• Privoxy(HTTP 级广告拦截,约 10.3 万条过滤规则)
• Samba(NAS 共享,用于在 PC 和服务器之间交换文件)
• n8n(工作流自动化)
• 这个博客(Hugo 运行在 Docker 容器中,Nginx 监听 8090 端口;进一步了解它如何运行)
所有服务都位于 Cloudflare Tunnel 之后,路由器没有转发任何端口,各个子域名却都能正常使用。
Trigger.dev 任务
我在 Jetson 上自托管 Trigger.dev,用于运行需要定时或按需执行的后台任务。它有 16 个任务文件,分属多个类别:
• 博客自动化(生成封面、每周新闻摘要、发布通知)
• 事件监控
• 学校沟通(没错,它会给我孩子的老师发消息)
• 查询驾照预约(抓取政府网站)
• 追踪太阳能电池板发电量
• 每周 AI 新闻调研
这些任务使用 TypeScript 编写,通过 GitHub Actions 部署到同一台 Jetson。我还为 Trigger.dev 配置了一个 MCP 服务器,因此可以在 Claude Code 会话中触发任务、检查运行状态和进行部署。
密钥
所有密钥都保存在 Vault 中。.env、.mcp.json 和 .env.local 都是生成文件,我绝不会直接编辑。一个名为 inject.sh 的 Shell 脚本会从 Vault 读取数据并写入配置文件。如果需要新的 API Key,我会把它添加到 Vault,再重新运行脚本。
vault kv put secret/services/telegram bot_token=xxx chat_id=yyy
scripts/vault/inject.sh
# 现在,.env 中已经有 TELEGRAM_BOT_TOKEN 和 TELEGRAM_CHAT_ID
剪贴板技巧
这只是一个很小的技巧,却改变了我的工作方式。一个名为 clip 的脚本会使用 OSC 52 转义序列,把文本发送到 Windows Terminal 剪贴板。助手提出命令时,会自动复制到我的剪贴板;我按 Alt+Tab 切换到服务器终端,再粘贴。真正运行命令的人是我。
这是因为我通过 Windows Terminal SSH 登录到开发服务器。转义序列会沿 SSH 连接返回终端模拟器,由模拟器把内容写入 Windows 剪贴板。不需要 X11 转发,不需要 xclip,也不需要折腾 tmux 缓冲区。
写作规则
我的 Rules 目录中有一个 humanizer.md 文件,列出了所有让文本听起来像机器生成的模式:禁用 “delve”“crucial”“landscape” 等词;禁用 “Not only…but…” 和 “It’s not just about…” 等句式;还禁用滥用破折号、每个列表项都使用粗体标签等格式。
我借助 AI 生成的每一段文字——无论邮件、工单还是博客文章——都会经过这些规则。目的不是隐藏 AI 参与过,而是写出不会让人一看就失去兴趣的文字。观点仍然由我书写,助手只负责帮我打字。
成本
我订阅 Claude Max,不统计 Token,也不会路由到更便宜的模型。Gemini 图片生成使用免费层,Vault 免费,Jetson 是一次性硬件采购,Trigger.dev 自托管,因此没有 SaaS 费用。持续支出只有 Claude 订阅与域名。
值得投入吗
.claude/ 目录大约包含 120 个文件。对于一个编程助手来说,这确实是大量配置。但每个文件的存在,都是因为我遇到过一个问题,并且只解决了一次。权限 Hook 的出现,是因为我曾意外运行破坏性命令;Humanizer 的出现,是因为我厌倦了从每封邮件里删掉 “delve”;智能体定义的出现,则是因为原始日志输出一直在吞噬我的上下文窗口。
它不是产品,而是一张工作台。就像任何好用的工作台一样,所有工具都还在我上次放下它们的位置。