06_Claude Code之Commands(命令)与Hooks(钩子)系统

张开发
2026/4/21 1:54:59 15 分钟阅读

分享文章

06_Claude Code之Commands(命令)与Hooks(钩子)系统
06 Claude Code之Commands命令与Hooks钩子系统Commands 和 Hooks 是 Claude Code 的两大胶水层功能分别解决高频操作复用和 AI 行动拦截两大问题。本文详解 Commands 的编写规范、三种触发方式、与 Subagents 的选择决策树以及 Hooks 系统的三种类型PreToolUse、PostToolUse、Stop的工作原理和实战配置。通过真实踩坑案例展示如何用 Hooks 防止生产事故构建安全可控的 AI 开发环境。关键字Claude Code Commands、Hooks、自定义命令、PreToolUse、PostToolUse、Stop Hook、自动化、工作流拦截、安全防护标签Claude CodeHooks钩子自定义命令工作流自动化安全防护开发工具DevOps写在前面Commands 和 Hooks 是 Claude Code 里两个相对低调的功能但对于想把 Claude Code 深度集成进开发工作流的人来说它们是不可或缺的胶水层。Commands 解决高频操作如何快速复用Hooks 解决如何在 AI 行动前后插入自定义逻辑。我自己最深的感受来自一次生产事故Claude 在帮我修复 bug 时顺手删除了一个临时目录恰好那个目录里有还没上传的文件。这之后我在团队所有项目里加了PreToolUseHook拦截所有包含rm的命令要求二次确认。从那以后再也没出过类似问题。一、Commands 系统封装工作流的快捷方式什么是 CommandsCommands 就是可以用/command-name调用的自定义工作流。放在.claude/commands/目录下的 Markdown 文件每个文件对应一个命令。.claude/commands/ -- techdebt.md → /techdebt -- context-dump.md → /context-dump -- catchup.md → /catchup -- security-scan.md → /security-scan -- gen-changelog.md → /gen-changelog创建第一个 Command以技术债务分析为例!-- .claude/commands/techdebt.md -- --- description: 分析当前项目的技术债务生成优先级排序的改进建议 --- # 技术债务分析 请对当前项目进行全面的技术债务分析包括 1. **代码质量债务** - 运行 grep -r TODO\|FIXME\|HACK\|XXX --include*.go src/ - 查找超过100行的函数 - 识别重复代码片段 2. **依赖债务** - 检查 go.mod 中的依赖版本 - 识别已有更新版本的包 3. **测试债务** - 计算整体测试覆盖率 - 识别没有测试的核心模块 4. **文档债务** - 检查公共 API 的注释完整性 ## 输出格式 生成一个 TECHDEBT.md 文件按以下格式组织 markdown # 技术债务报告 - {日期} ## 高优先级建议本季度处理 ... ## 中优先级建议下季度处理 ... ## 低优先级有空可处理 ...保存后随时输入 /techdebt 启动分析。 ### 动态内容在 Commands 中嵌入 Shell 输出 Commands 支持用 !command 语法在加载时动态注入 Shell 命令的输出 markdown --- description: 根据最近的git提交生成变更日志 --- # 生成变更日志 当前分支最近的提交 !git log --oneline -20 当前版本标签 !git describe --tags --abbrev0 请根据以上提交记录按照约定式提交规范Conventional Commits 生成 CHANGELOG.md 的新章节。格式要求 - feat/fix/chore 分类 - 关联 PR 编号如果提交信息包含 - 清晰的用户友好描述不是提交信息的简单复制!git log --oneline -20在命令被调用时会执行结果直接注入到上下文。Commands vs Skills 的选择判断标准 -- 高频重复操作参数固定 → Commands | 例每次提交前的检查清单 | -- 需要专业领域知识任务复杂 → Skills | 例领域特定的代码审查规范 | -- 两者皆有 → Commands 调用 Skills 例/deploy 命令 deploy Skill包含完整部署规范二、Hooks 系统AI 行动的拦截层Hooks 让你在 Claude 的每个关键动作前后插入自定义逻辑。这是真正的AI 行为治理能力。Hooks 事件类型Claude Code 生命周期中的 Hook 事件点 会话开始 ↓ SessionStart Hook ← 加载项目上下文 ↓ 用户发送消息 ↓ Claude 决定调用工具 ↓ PreToolUse Hook ← 拦截/修改/阻止工具调用 ↓ 工具执行如Bash命令、文件修改 ↓ PostToolUse Hook ← 处理工具结果、触发后续动作 ↓ Claude 生成回复 ↓ Stop Hook ← 回合结束时处理 ↓ CwdChanged Hook ← 目录变更时触发Hooks 配置文件位置// .claude/settings.json项目共享// .claude/settings.local.json本地不提交// ~/.claude/settings.json全局{hooks:{PreToolUse:[...],PostToolUse:[...],Stop:[...],SessionStart:[...],CwdChanged:[...]}}三、实战 Hooks 配方配方一危险命令防护最重要{hooks:{PreToolUse:[{matcher:Bash,hooks:[{type:command,command:.claude/hooks/dangerous-command-check.sh}]}]}}#!/bin/bash# .claude/hooks/dangerous-command-check.shCOMMAND$(echo$1|jq-r.tool_input.command // empty)# 危险命令模式DANGEROUS_PATTERNS(rm -rfDROP TABLEDELETE FROM.*WHERE.*11chmod -R 777dd if)forpatternin${DANGEROUS_PATTERNS[]};doifecho$COMMAND|grep-qi$pattern;thenjq-n--argreason危险命令被拦截:$pattern。如需执行请手动运行。\{ hookSpecificOutput: { hookEventName: PreToolUse, permissionDecision: deny, permissionDecisionReason: $reason } }exit0fidoneexit0配方二文件修改后自动格式化{hooks:{PostToolUse:[{matcher:Write|Edit,hooks:[{type:command,command:.claude/hooks/auto-format.sh,async:true}]}]}}#!/bin/bash# .claude/hooks/auto-format.shFILE$(echo$1|jq-r.tool_input.path // .tool_input.file_path // empty)if[-z$FILE];thenexit0ficase${FILE##*.}ingo)gofmt-w$FILEgoimports-w$FILE2/dev/null||true;;ts|tsx)npx prettier--write$FILE2/dev/null||true;;py)black$FILE2/dev/null||true;;esacexit0async: true让格式化在后台进行不阻塞 Claude 继续工作。配方三目录变更时自动加载环境{hooks:{CwdChanged:[{hooks:[{type:command,command:.claude/hooks/load-env.sh}]}]}}#!/bin/bash# .claude/hooks/load-env.sh - 类似 direnv 的自动环境加载NEW_DIR$(echo$1|jq-r.cwd // empty)if[-f$NEW_DIR/.env.claude];then# 将环境变量写入 Claude 的环境文件whileIFSread-rline;do[[$line~^#.*$ ]] continue[[-z$line]]continueechoexport$line$CLAUDE_ENV_FILEdone$NEW_DIR/.env.claudefiexit0配方四任务完成时播放提示音{hooks:{Stop:[{hooks:[{type:command,command:powershell -c \[console]::beep(800, 300)\}]}]}}在 Windows 上用系统蜂鸣声macOS 上用afplay /System/Library/Sounds/Glass.aiffLinux 用paplay /usr/share/sounds/freedesktop/stereo/complete.oga。配方五权限请求路由给高级模型这个配方让所有权限请求都经过 Opus 模型的安全判断{hooks:{PreToolUse:[{matcher:Bash,hooks:[{type:prompt,model:claude-opus-4-5,prompt:这个Bash命令安全吗命令$TOOL_INPUT\n\n如果安全返回 {\decision\:\allow\}如果危险返回 {\decision\:\deny\,\reason\:\原因\}}]}]}}四、Hooks 的四种类型对比类型适用场景性能开销commandShell 脚本处理低进程调用http远程服务通知中网络请求promptLLM 判断决策高API 调用agent复杂验证任务最高完整 Agent日常安全防护用command类型脚本判断只有需要语义理解的场景才升级到prompt或agent。五、调试 Hooks# 查看 Hook 执行详情claude--debug# 测试 Hook 脚本echo{tool_input:{command:rm -rf /tmp/test}}|.claude/hooks/dangerous-command-check.sh# 查看 Hook 执行日志tail-f~/.claude/logs/hooks.log总结Commands 让高频工作流可以一键复用Hooks 让 AI 行为可以被程序化治理。这两个功能组合起来是把 Claude Code 从个人助手升级为可信工程工具的关键。最重要的起步建议先加一个 PreToolUse Hook 来防护危险命令这是性价比最高的第一步。其他的可以随着使用逐步添加。

更多文章