内容来源: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 存在用量限制;成本章节只是作者当时的个人快照。下文完整保留原始正文。

展示 Claude Code 工作台架构、.claude 目录、Jetson 硬件及外部服务的信息图

经常有人问我,单打独斗时是怎样把事情做完的。简短答案是:好工具。完整答案则涉及一个配了大量配置文件的 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、代码、搜索、文档、沟通、生产力,还有少数其他类别。我写过它们的工作原理,以及具体的 DevOpsToggl 类别。

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 --forcegit 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”;智能体定义的出现,则是因为原始日志输出一直在吞噬我的上下文窗口。

它不是产品,而是一张工作台。就像任何好用的工作台一样,所有工具都还在我上次放下它们的位置。