问题:会话开了,该跑的检查却总忘
Claude Code 很擅长改代码,但不擅长替你记住「提交前还差哪几步」。多人协作或长任务里,常见漏项是:
- 改完 TypeScript 没跑类型检查
- 动了依赖却忘了锁文件校验
- 改了脚本却没跑最小冒烟测试
- 无人值守跑到一半,机器上其实已经红了,你还在本机等「看起来成功」
有人会在仓库的 .claude/settings.json(或项目约定的 hooks / 命令配置)里挂固定检查命令,让会话在关键节点自动执行那些「常忘的校验」。这比口头叮嘱可靠:规则写进仓库,人换了、会话断了,检查还在。
把这套配置放在新加坡常开的 Mac mini 上,收益更明显——本机关盖、UU 远程连接断开,远端会话仍按同一套检查门禁往下走。账号与订阅由你自行准备;本文只谈稳定合规的使用环境与可重复的工程步骤。
目标:把「常忘的校验」写成可版本化的门禁
目标不是多装一套花哨插件,而是三件事同时成立:
- 检查命令进仓库:和代码一起被 review,而不是只活在某个人本机记忆里。
- 触发点明确:例如会话开始、一批文件改完、准备提交 / 推送前——按你团队真实流程选,不要一口气挂二十个会拖死会话的重任务。
- 机器常开且环境固定:Node、Xcode 命令行工具、测试依赖装在同一台新加坡 Mac mini 上,避免「本机能过、远端不过」的漂移。
步骤一:先盘点「你们真正漏过的检查」
打开最近两周的事故或返工记录,只挑重复出现的漏项,例如:
| 漏项类型 | 示例命令(按项目改) | |----------|----------------------| | 类型 / 静态检查 | npx tsc --noEmit | | 单测冒烟 | npm test -- --runInBand --testPathPattern=smoke | | 锁文件与安装一致性 | npm ci --dry-run 或团队约定的校验脚本 | | 格式 / lint | npm run lint | | iOS 侧最小编译 | xcodebuild -scheme YourApp -destination 'platform=macOS' build(仅在确有 macOS 目标时) |
原则:
- 单次自动检查总时长控制在可接受范围(很多团队先压到一两分钟内);太重的全量 CI 仍留给流水线。
- 命令必须非交互:不能弹 GUI 等人点。
- 失败要有清晰退出码,方便 hook / 包装脚本判断。
把清单写成仓库里的 scripts/claude-gates.sh(名称自定),比把五条裸命令直接塞进配置更好维护。
步骤二:在 Mac mini 上固定运行环境
在新加坡 Mac mini(整机独享)上做一次「可复现」安装,并写进你自己的开机 / 登录备忘:
- 用固定用户登录图形会话或 SSH;工作目录固定到项目路径,例如
$HOME/work/your-app。 - 安装项目需要的运行时(Node、Python、Ruby 等)与包管理器;版本与 CI 对齐,可用
.nvmrc/.tool-versions一类文件钉死。 - 确认命令行能跑通
scripts/claude-gates.sh,且失败时退出码非 0:
cd "$HOME/work/your-app"
chmod +x scripts/claude-gates.sh
./scripts/claude-gates.sh
echo "exit=$?"
- 需要 Xcode 相关检查时,先在这台机器上接受许可并装好对应 Command Line Tools;不要假设本机笔记本的 Xcode 状态会自动同步过来。
- 用
tmux或可接回会话启动 Claude Code,避免 UU 远程连接断开就丢掉终端上下文。
环境只配在 Mac mini 上,本机负责编辑与确认。这样「自动检查」跑的是同一套二进制与同一份 node_modules 策略,结果才有参考价值。
步骤三:把门禁挂进 .claude/settings.json(或等价 hooks)
具体字段名随 Claude Code 版本可能调整,以你本机 claude 文档与 settings schema 为准。思路是统一的:在约定生命周期调用你的门禁脚本。
示例(示意结构,键名请按当前版本校正):
{
"permissions": {
"deny": [
"Write(.env)",
"Write(.env.*)",
"Bash(rm -rf /)"
]
},
"hooks": {
"afterEdit": [
{
"matcher": ".*\\.(ts|tsx|js|jsx)$",
"command": "./scripts/claude-gates.sh --quick"
}
],
"beforeCommit": [
{
"command": "./scripts/claude-gates.sh --full"
}
]
}
}
落地时注意:
- 路径相对仓库根:会话的工作目录要固定到仓库根,否则相对路径会找错脚本。
- 分档:
--quick只跑类型与 lint;--full再加测试。编辑过程中每次全量测试会拖垮节奏。 - 与权限策略一起提交:门禁脚本能跑,不代表允许 agent 改
.env或清掉门禁本身。对 settings、密钥文件的写入单独 deny(可与「禁止自改 settings」一类策略配合,但不替代门禁)。 - 失败即停:包装脚本应在任一子检查失败时
exit 1,并打印是哪一步挂了。不要「全红仍继续大胆提交」。
若你团队不用 hooks 字段,也可以在 CLAUDE.md 里写「完成一批改动后必须运行 ./scripts/claude-gates.sh」——但硬触发仍比纯文档更稳。文档负责解释为什么,配置负责保证会发生。
步骤四:在无人值守长任务里验收
在 Mac mini 上开一次受控演练:
- 故意引入一个类型错误或让 lint 失败。
- 让 Claude Code 按常規流程改文件,观察 hook / 门禁是否拦住后续「声称已完成」的步骤。
- 修好错误后再跑,确认退出码归零。
- 断开本机 UU 远程连接 10 分钟,SSH 回去看会话与门禁日志是否仍按预期。
- 把演练结果记进仓库
docs/claude-gates.md:触发点、命令、已知慢项、谁有权改脚本。
验收标准很简单:人可以离开桌面,机器仍按同一套检查说话。
步骤五:和本机「随手点一下」比,差在哪里
| 做法 | 结果 | |------|------| | 只靠聊天里提醒「记得跑一下测试」 | 换会话就忘,无人值守更不可靠 | | 只在本机装检查,远端不装 | 本机绿、Mac mini 红,排查成本翻倍 | | 仓库门禁 + 新加坡 Mac mini 固定环境 | 检查与运行时绑定,可过夜、可接回、可 review |
适合放到整机环境的信号包括:检查依赖本机装不全、希望笔记本合盖后任务继续、需要同一时区与稳定网络跑安装与编译、以及多人共用同一套门禁脚本而不想每人改一遍本机。
Zumac.Ai 在新加坡提供 Mac mini 整机独享,接入新加坡家庭宽带。新客户整机租用 ¥999/月 起;季付、半年付、年付有折扣。交付后可用 UU 远程连接;SSH 按你的安全策略自行开启。Claude 账号仍由你自行准备。咨询可 Telegram @singatao。
小结
把「常忘的校验」写进仓库门禁,再让 Claude Code 在关键节点自动执行,比反复口头提醒管用。关键是:命令非交互、分档快速/完整、与权限策略一同提交,并在新加坡常开 Mac mini 上固定运行时。先做一次「故意造红再转绿」的演练,再交给长任务。方案与交付见 zumac.ai。
