1. 为什么 TS 开发者需要反 Vibe Coding 的配置骨架
如果你写 TypeScript,大概率刷到过 Matt Pocock 的名字。Total TypeScript、类型体操教学、TS 错误翻译器,他几乎一个人撑起了英文 TS 教学社区的半边天。最近他开源了一个叫mattpocock/skills的仓库,副标题写得很直白:Skills For Real Engineers。README 里态度也很明确——这些 Skills 是做真实开发用的,不是用来 Vibe Coding 的。
Vibe Coding 指的是那种凭感觉跟 AI 聊几句就把代码生出来的方式。爽是真爽,但维护起来谁用谁知道。Matt 的观点是:BMAD、Spec-Kit 这类框架把流程做成了黑盒,中间某一步出 bug 你很难钻进去修。而 Skills 是一组很小、很容易改、能自由组合的技能片段,不绑死特定模型,Claude Code、Codex 都能跑。
问题来了:Skills 装好之后,真正约束 AI 编码行为的其实是settings.json这类配置文件。很多人装完 Skills 就以为万事大吉,结果 agent 该乱推分支还是乱推,该写水平切片测试还是照写。这篇就交付一份可复制的settings.json配置骨架,配合 TaoToken 统一 Key 接入,让 AI Skills 真正按预期生效。适合正在用 Claude Code 或 Codex 写 TypeScript、想让 AI 遵守工程纪律的开发者。
2. TaoToken 前置:统一 Key 与接入准备
在配置settings.json之前,先把 Key 的事情理清楚。如果你同时用 Claude Code、Codex 或者别的 agent,每个工具单独配 Key、单独记额度,时间一长很容易乱。TaoToken 的思路是提供一个统一的 API 入口,把模型调用收敛到一处管理。
你需要先拿到一个可用的 API Key。访问控制台创建:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite创建完 Key 之后,在 API Keys 页面可以查看和管理:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewriteAPI 的基础地址是https://taotoken.net/api,注意这个地址不带 UTM 参数,配置里直接写这个就行。接入文档在这里:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite如果你用的是 Claude Code,官方还提供了 Anthropic 兼容的接入说明:
https://taotoken.net/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=ClaudeCodeAnthropic&utm_campaign=rewrite注意:Key 只创建一次就够,不要每个项目都新建。统一 Key 的意义就在于所有 agent 共用一套凭证,额度、日志、限流都在一处看。
拿到 Key 之后,先别急着写settings.json。建议先用模型对话页面确认 Key 能正常调通:
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite这一步能排除掉大部分"配置写对了但 Key 本身有问题"的情况。确认能正常返回内容,再往下走。
3. 可复制的 settings.json 配置骨架
下面这份骨架是围绕 Matt Pocock Skills 的反 Vibe Coding 理念设计的。核心思路有三条:第一,用 hook 拦截危险 git 操作,对应/git-guardrails-claude-code;第二,用权限白名单约束 agent 能碰哪些文件;第三,把 Skills 的初始化约定写进配置,避免 Skills 之间因为约定不统一互相打架。
先看完整骨架,再逐段解释。
{ "apiKey": "sk-your-taotoken-key", "baseUrl": "https://taotoken.net/api", "model": "claude-sonnet-4-20250514", "permissions": { "allow": [ "Read", "Glob", "Grep", "Edit:src/**", "Edit:tests/**", "Edit:docs/**", "Bash(npm run test:*)", "Bash(npm run lint:*)", "Bash(npx tsc --noEmit)" ], "deny": [ "Bash(git push:*)", "Bash(git reset --hard:*)", "Bash(git clean -f:*)", "Bash(git branch -D:*)", "Bash(git checkout .:*)", "Bash(git restore .:*)", "Edit:.env*", "Edit:**/secrets/**" ] }, "hooks": { "PreToolUse": [ { "matcher": "Bash", "command": "node .claude/hooks/git-guardrails.js" } ] }, "skills": { "setup": "/setup-matt-pocock-skills", "issueTracker": "github", "triageLabels": [ "needs-triage", "needs-info", "ready-for-agent", "ready-for-human", "wontfix" ], "docsDir": "docs", "contextFile": "CONTEXT.md", "adrDir": "docs/adr" } }逐段说明。apiKey和baseUrl是 TaoToken 的统一接入点,所有 agent 共用这一份。model按你实际用的模型填,这里只是示例。
permissions.allow里我特意把Edit限制在src、tests、docs三个目录。这是反 Vibe Coding 的关键一步——agent 不能随手改根目录的配置文件,也不能碰构建产物。Bash只放行测试、lint、类型检查这三类只读或可回滚的命令。
permissions.deny对应/git-guardrails-claude-code拦截的那批危险操作。git push、git reset --hard、git clean -f、git branch -D、git checkout .、git restore .全部拒绝。被拦下来时 agent 会看到"你没有权限执行这个命令",只能来找你确认。
hooks.PreToolUse是双保险。即使deny列表漏了某条,hook 脚本还能再拦一层。脚本内容参考仓库里的实现,核心是匹配命令字符串,命中就返回非零退出码。
skills段对应/setup-matt-pocock-skills初始化器问的三个问题:issue tracker 用哪个、triage 用什么 label、文档放哪个目录。把答案写进配置,Skills 才知道这个仓库的"语境"。
提示:
CONTEXT.md和docs/adr/是 Matt 反复强调的两个文件。前者沉淀领域术语,后者记录架构决策。配置里显式声明路径,/grill-with-docs才知道往哪写。
4. 验证请求与成功结果
配置写完不算完,得验证 AI Skills 是否真的按预期生效。分三步走。
第一步,验证 Key 和 baseUrl 通不通。用 curl 直接打一次:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-your-taotoken-key" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [{"role": "user", "content": "reply with ok"}] }'返回里能看到content字段且有文本,说明 Key 和地址都对。如果返回 401,检查 Key 有没有复制全;返回 404,检查 baseUrl 是不是写成了带路径的完整地址。
第二步,验证 git guardrails 生效。在项目里让 agent 执行一条被 deny 的命令,比如:
git push origin main预期结果是命令被拦截,agent 收到权限拒绝的反馈,转而向你确认。如果命令直接跑出去了,说明deny列表或 hook 没生效,回去检查settings.json的路径和 hook 脚本的执行权限。
第三步,验证 Skills 初始化。跑一次/setup-matt-pocock-skills,看它问的三个问题是否和配置里写的一致。然后触发/grill-me,观察 agent 是不是一次只问一个问题、每个问题都给出推荐答案。如果它一口气抛了五个问题,说明 Skill 没加载对,检查skills.setup字段。
实测下来,这三步走完,大部分配置问题都能定位。成功的结果是:agent 不再乱推分支,编辑范围被限制在指定目录,/grill-me按预期逐题追问。
5. 本篇常见错排查
配置过程中踩过的坑集中在几个地方,逐个说。
报错一:PreToolUse hook exited with code 1但命令还是执行了。这是 hook 脚本返回了非零退出码,但 Claude Code 的版本不支持阻断式 hook。检查你的 Claude Code 版本,旧版本只记录不阻断。升级到支持PreToolUse阻断的版本,或者在deny列表里把命令补全。
报错二:Edit权限写了src/**但 agent 还是改不了文件。路径匹配是相对项目根目录的,如果你在子目录里启动 agent,src/**匹配不到。改成绝对路径或者从项目根启动。另外注意**和*的区别,src/*只匹配一层。
报错三:/grill-with-docs找不到CONTEXT.md。这个 Skill 默认在项目根找CONTEXT.md。如果你在配置里把contextFile改成了别的路径,Skill 本身不一定认。要么保持默认,要么在 Skill 的SKILL.md里改描述字段。
报错四:TaoToken 返回 429。这是限流。统一 Key 的好处这时候体现出来了——去控制台看额度用量,确认是不是某个 agent 把额度跑满了。可以在配置里给不同 agent 设不同的model,把重活分给额度充足的模型。
报错五:/tdd产出的测试还是水平切片。检查 Skill 有没有真正加载。水平切片的典型特征是先写一堆测试再写实现。如果 agent 还是这么干,说明/tdd的 prompt 没生效,回去确认skills段配置和 Skill 安装路径。
注意:排查顺序建议从 Key 通不通开始,再到权限,最后到 Skill 行为。很多"Skill 不生效"其实是 Key 或权限的问题,别一上来就怀疑 Skill。
6. 长期编码与 Agent 场景的下一步
如果你只是偶尔用 AI 写几段代码,上面这份配置够用了。但如果你打算长期用 Claude Code 或 Codex 做 TypeScript 项目,甚至跑 Agent 自动化,建议看一下 Coding Plan:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewriteCoding Plan 适合那种每天都要跟 agent 打交道、需要稳定额度和统一管理的场景。配合这份settings.json骨架,把 git guardrails、权限白名单、Skills 初始化三件事固定下来,AI 就不再是那个"凭感觉写代码"的 Vibe 工具,而是遵守工程纪律的协作者。
Matt 这套 Skills 最值得琢磨的地方,是它出自一个 TypeScript 教育者之手,不是 AI 公司的产品经理。它代表了一线工程师对 AI 协作的真实诉求:可控、可改、可组合,反对任何把流程变黑盒的做法。配置骨架只是起点,真正起作用的是你愿不愿意在每次改动前先来一轮/grill-me,愿不愿意把领域术语沉淀进CONTEXT.md。这些习惯,AI 替代不了。