1. 为什么你的 Claude Code 总在重复踩同一个坑用 Claude Code 写代码超过一周你大概率经历过这种循环新开一个会话它把any类型塞满整个文件你提醒一次下一个会话它又把console.log留在生产代码里你再提醒一次。问题不在于模型不够聪明而在于每个新会话都是一张白纸——你写在CLAUDE.md里的规范对模型来说只是建议不是约束。我试过把规范写得极其详细甚至用加粗和感叹号强调结果模型该忘还是忘。后来才想明白提示词是概率性的模型可能遵守也可能忽略而 Hooks 是确定性的只要事件触发命令就一定执行。这就是 Claude Code Hooks 的核心价值——把对 AI 的期望变成对 AI 的约束。Claude Code Hooks 是官方提供的一套生命周期钩子机制允许你在特定事件发生时自动执行 Shell 命令。它支持 12 种事件但日常开发中真正高频使用的是三类PreToolUse工具执行前拦截、PostToolUse工具执行后处理、UserPromptSubmit用户发消息时注入上下文。本文聚焦这三类的落地实践给出可直接复制的settings.json配置片段并说明如何把模型请求的 Base URL 统一改到 TaoToken方便集中管理 Key 和调用通道。适合谁读正在用或准备用 Claude Code 的开发者尤其是被重复提醒折磨过、想让工程规范自动生效的人。读完你能拿到三套可运行的配置、逐条验证动作以及常见报错的排查路径。2. TaoToken 前置准备统一 Key 与 Base URL 配置在配置 Hooks 之前先把模型请求的通道理顺。Claude Code 默认走 Anthropic 官方接口但如果你希望统一管理多个项目的 Key、集中查看调用量或者在不同工具间复用同一套凭证把 Base URL 指向 TaoToken 是更省心的做法。TaoToken 提供兼容 Anthropic 协议的 API 通道Claude Code 只需改两个环境变量即可接入。2.1 获取 API Key 与确认 Base URL先到 TaoToken 控制台创建一个 API Key。地址是https://taotoken.net/api注意 API 端点不带 UTM 参数控制台入口在https://taotoken.net/console。创建后复制 Key形如sk-xxxxxxxx。Base URL 使用https://taotoken.net/api。这个地址兼容 Anthropic 的/v1/messages协议Claude Code 会直接向它发起请求。2.2 三件套Base URL Key Model ID无论你用 Claude Code、Cline 还是其他支持 Anthropic 协议的工具接入时都需要三件套对齐配置项值说明Base URLhttps://taotoken.net/api兼容 Anthropic 协议API Keysk-xxxxxxxx控制台创建妥善保存Model IDclaude-sonnet-4-5-20250929等按需选择需与通道支持的模型一致2.3 在 Claude Code 中设置环境变量Claude Code 读取ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY两个环境变量。你可以在 shell 配置文件里写入# ~/.zshrc 或 ~/.bashrc export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key保存后执行source ~/.zshrc生效。如果你用 Claude Code 的settings.json管理配置也可以在env字段里声明{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key } }这样配置的好处是项目级settings.json可以覆盖全局配置不同项目用不同 Key 互不干扰。验证是否生效运行claude后随便问一句如果能正常返回说明通道已通。若报 401先检查 Key 是否复制完整、是否有多余空格。3. 可复制配置三类 Hooks 的 settings.json 片段Hooks 配置存放在~/.claude/settings.json全局或项目根目录.claude/settings.json项目级。项目级优先级更高适合放项目特有的规则。下面给出三类 Hooks 的完整配置片段你可以直接复制后按需修改。3.1 PostToolUse写后即格式化这是使用率最高的 Hook。每次 Claude 写入或编辑文件后自动运行 Prettier。配置如下{ hooks: { PostToolUse: [ { matcher: Edit|MultiEdit|Write, hooks: [ { type: command, command: jq -r .tool_input.file_path | { read file_path; if echo \$file_path\ | grep -qE \\.(ts|tsx|js|jsx|css|less|scss|json)$; then npx prettier --write \$file_path\; fi; } } ] } ] } }这段命令的逻辑是从 stdin 的 JSON 里提取file_path判断扩展名是否属于前端代码匹配则执行 Prettier。matcher用正则限定只在Edit、MultiEdit、Write三个工具上触发避免误伤其他操作。3.2 PreToolUse拦截危险命令与超大读取PreToolUse 在工具执行前触发退出码 2 会阻止操作并把 stderr 反馈给模型。下面这个脚本拦截两类行为读取超过 1000 行的文件、执行rm -rf类危险命令。先创建脚本~/.claude/hooks/pre-guard.py#!/usr/bin/env python3 import json, sys, os, re data json.load(sys.stdin) tool data.get(tool_name, ) params data.get(tool_input, {}) # 拦截超大文件全量读取 if tool Read: fp params.get(file_path, ) if fp and os.path.exists(fp): try: with open(fp, r, errorsignore) as f: lines sum(1 for _ in f) if lines 1000 and offset not in params: print(fFile has {lines} lines. Use offsetlimit., filesys.stderr) sys.exit(2) except Exception: pass # 拦截危险命令 if tool Bash: cmd params.get(command, ) if re.search(rrm\s-rf\s/, cmd): print(Blocked: dangerous rm command., filesys.stderr) sys.exit(2) sys.exit(0)赋予执行权限chmod x ~/.claude/hooks/pre-guard.py然后在settings.json里注册{ hooks: { PreToolUse: [ { matcher: Read|Bash, hooks: [ { type: command, command: python3 ~/.claude/hooks/pre-guard.py } ] } ] } }退出码 2 是关键它不只是报错而是真正阻止工具执行并把 stderr 内容作为反馈注入模型上下文。模型看到File has 3200 lines. Use offsetlimit.后会自动改用带offset和limit的精确读取。3.3 UserPromptSubmit每次输入自动注入规范UserPromptSubmit 在用户发送消息时触发可以把项目约束、待办提醒、安全策略注入模型上下文。创建脚本~/.claude/hooks/inject-rules.sh#!/bin/bash cat EOF [PROJECT RULES - MANDATORY] 1. 禁止使用 any 类型必须显式声明类型。 2. 禁止提交 console.log调试用 logger。 3. 所有异步函数必须处理错误分支。 4. 修改数据库 schema 前必须先输出迁移计划。 EOFchmod x后注册{ hooks: { UserPromptSubmit: [ { matcher: , hooks: [ { type: command, command: bash ~/.claude/hooks/inject-rules.sh } ] } ] } }注意matcher留空表示对所有用户输入生效。这段文本会在每次交互时注入相当于每次对话都重新强调一遍规范比写在CLAUDE.md里靠模型记忆可靠得多。3.4 合并后的完整 settings.json把三类 Hooks 合并到一个文件里项目级.claude/settings.json内容如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key }, hooks: { PreToolUse: [ { matcher: Read|Bash, hooks: [ { type: command, command: python3 ~/.claude/hooks/pre-guard.py } ] } ], PostToolUse: [ { matcher: Edit|MultiEdit|Write, hooks: [ { type: command, command: jq -r .tool_input.file_path | { read file_path; if echo \$file_path\ | grep -qE \\.(ts|tsx|js|jsx|css|less|scss|json)$; then npx prettier --write \$file_path\; fi; } } ] } ], UserPromptSubmit: [ { matcher: , hooks: [ { type: command, command: bash ~/.claude/hooks/inject-rules.sh } ] } ] } }保存后重启 Claude Code 会话配置即生效。建议先用项目级配置测试确认无误后再考虑提升到全局。4. 验证请求逐条确认 Hook 真的生效配置写完不代表生效必须逐条验证。下面给出三类 Hooks 的验证动作和预期结果。4.1 验证 PostToolUse 格式化在项目里让 Claude 写一个故意格式混乱的 TS 文件比如const x1;function foo( ){return x1}保存后观察终端输出。如果 Hook 生效你会看到 Prettier 的执行日志文件被自动格式化为const x 1; function foo() { return x 1; }如果没有任何输出检查jq是否安装which jq以及npx prettier是否在项目依赖里。常见问题是jq未安装导致管道断裂命令静默失败。4.2 验证 PreToolUse 拦截让 Claude 读取一个超过 1000 行的文件比如node_modules里某个大文件。如果 Hook 生效Claude 会收到File has N lines. Use offsetlimit.的反馈并自动改用带offset的读取方式。你可以在终端看到工具调用被阻止的记录。再测试危险命令拦截让 Claude 执行rm -rf /tmp/test注意不是根目录避免误伤。如果脚本正则匹配到rm -rf /会阻止并反馈。这里要小心测试环境别真的删了重要目录。4.3 验证 UserPromptSubmit 注入随便发一句你好然后查看 Claude 的响应。如果注入生效模型会在回答里体现出对项目规范的遵守比如主动避免any类型。更直接的验证方式是让 Claude 复述当前生效的规则它应该能准确说出注入的 4 条规范。4.4 验证 TaoToken 通道运行claude后问一个简单问题比如11 等于几。如果能正常返回说明 Base URL 和 Key 配置正确。你也可以在 TaoToken 控制台查看调用记录确认请求确实走了统一通道。如果返回 401检查 Key如果返回模型不存在检查 Model ID 是否与通道支持的模型一致。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配置 Hooks 和 TaoToken 通道时最容易撞上四类报错。下面逐个给出原因和修复路径。5.1 401 Unauthorized最常见的原因是 Key 错误或未生效。排查顺序第一确认ANTHROPIC_API_KEY环境变量已source生效用echo $ANTHROPIC_API_KEY检查第二确认 Key 没有多余空格或换行第三确认 Base URL 是https://taotoken.net/api而不是带/v1的路径。如果项目级settings.json和全局配置冲突项目级会覆盖全局检查两处是否都写对了。5.2 local proxy failed这个报错通常出现在网络层。Claude Code 无法连接到 Base URL 时会报此错。检查ANTHROPIC_BASE_URL是否拼写正确以及本机网络是否能访问该地址。可以用curl -I https://taotoken.net/api测试连通性。如果公司网络有出口限制需要联系网络管理员放行。5.3 reading choices 相关报错这类报错多出现在模型返回格式异常时比如通道返回了非预期的 JSON 结构。排查方向确认 Model ID 与通道支持的模型一致不要用通道不支持的模型名。如果刚切换通道重启 Claude Code 会话让配置重新加载。另外检查settings.json是否是合法 JSON用jq . .claude/settings.json验证语法。5.4 OAuth 相关报错Claude Code 某些版本会尝试 OAuth 登录流程。如果你用 API Key 接入需要在配置里明确禁用 OAuth 或确保环境变量优先。检查是否有残留的 OAuth token 文件通常在~/.claude/下必要时清理后重新用 Key 登录。如果同时配置了 OAuth 和 API Key可能产生冲突建议只保留一种认证方式。5.5 Hook 脚本不执行如果 Hooks 配置了但没反应先检查脚本是否有执行权限chmod x再检查settings.json的 JSON 语法。用claude --debug启动可以看到 Hook 的加载日志。另外注意matcher正则是否匹配到了实际工具名比如Edit|MultiEdit|Write要确保工具名拼写正确。6. 把规范变成基础设施CTA 与长期实践Hooks 的本质是把对 AI 的期望转化为对 AI 的约束。三类核心模式覆盖了大部分场景PostToolUse 保证代码规范一致性PreToolUse 控制资源消耗和安全边界UserPromptSubmit 实现动态上下文注入。配合 TaoToken 统一 Key 和 Base URL你可以在多个项目间复用同一套凭证集中查看调用情况。开始使用不需要一步到位。建议从一个 PostToolUse 的 Prettier 格式化起步感受到确定性的好处后再逐步添加 PreToolUse 拦截和 UserPromptSubmit 注入。每加一个 Hook都用第 4 节的验证动作确认生效避免配置了却没起作用。如果你在排障或接入过程中遇到问题可以查阅接入文档和 API Keys 管理页面获取最新配置说明。想先验证模型通道是否通畅可以直接在模型对话里试一句。长期做编码和 Agent 任务的话Coding Plan 提供了更集中的额度管理方式适合把多个项目的调用统一起来。最可靠的 AI 工作流不是 AI 足够聪明而是犯错的机会足够少。Hooks 让你把工程规范从每次提醒变成自动执行这才是它真正的价值。