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_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite创建完 Key 之后在 API Keys 页面可以查看和管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewriteAPI 的基础地址是https://taotoken.net/api注意这个地址不带 UTM 参数配置里直接写这个就行。接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你用的是 Claude Code官方还提供了 Anthropic 兼容的接入说明https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite注意Key 只创建一次就够不要每个项目都新建。统一 Key 的意义就在于所有 agent 共用一套凭证额度、日志、限流都在一处看。拿到 Key 之后先别急着写settings.json。建议先用模型对话页面确认 Key 能正常调通https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite这一步能排除掉大部分配置写对了但 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 还是改不了文件。路径匹配是相对项目根目录的如果你在子目录里启动 agentsrc/**匹配不到。改成绝对路径或者从项目根启动。另外注意**和*的区别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 Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewriteCoding Plan 适合那种每天都要跟 agent 打交道、需要稳定额度和统一管理的场景。配合这份settings.json骨架把 git guardrails、权限白名单、Skills 初始化三件事固定下来AI 就不再是那个凭感觉写代码的 Vibe 工具而是遵守工程纪律的协作者。Matt 这套 Skills 最值得琢磨的地方是它出自一个 TypeScript 教育者之手不是 AI 公司的产品经理。它代表了一线工程师对 AI 协作的真实诉求可控、可改、可组合反对任何把流程变黑盒的做法。配置骨架只是起点真正起作用的是你愿不愿意在每次改动前先来一轮/grill-me愿不愿意把领域术语沉淀进CONTEXT.md。这些习惯AI 替代不了。
