关于 debug-hooks
用于系统排查 Claude Code 钩子的技能,指导开发者检查输出、注册、文件、手动测试、静默故障,以及 TypeScript 修改后的重新构建。
主要功能
- 01检查日志与缓存输出
- 02核对项目和全局注册
- 03检查钩子脚本与编译文件
- 04手动运行钩子
- 05查找静默故障并重新构建 TypeScript
适用场景
- 01排查钩子未触发
- 02追踪钩子没有输出的原因
- 03检查重复的钩子注册
- 04使 TypeScript 修改更新到可运行文件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ parcadei/ continuous-claude-v3 --skill debug-hooks安装后在 Claude Code 中输入/debug-hooks确认已加载。
详细介绍
调试钩子
用于调试 Claude Code 钩子的系统化工作流。
适用场景
-“钩子未触发” -“钩子输出错误” -“SessionEnd 无法正常工作” -“PostToolUse 钩子未触发” -“为什么我的钩子没有运行?”
工作流
1. 先检查输出(先观察,再编辑)
# Check project cache
ls -la $CLAUDE_PROJECT_DIR/.claude/cache/
# Check specific outputs
ls -la $CLAUDE_PROJECT_DIR/.claude/cache/learnings/
# Check for debug logs
tail $CLAUDE_PROJECT_DIR/.claude/cache/*.log 2>/dev/null
# Also check global (common mistake: wrong path)
ls -la ~/.claude/cache/ 2>/dev/null
2. 验证钩子注册情况
# Project settings
cat $CLAUDE_PROJECT_DIR/.claude/settings.json | grep -A 20 '"SessionEnd"\|"PostToolUse"\|"UserPromptSubmit"'
# Global settings (hooks merge from both)
cat ~/.claude/settings.json | grep -A 20 '"SessionEnd"\|"PostToolUse"\|"UserPromptSubmit"'
3. 检查钩子文件是否存在
# Shell wrappers
ls -la $CLAUDE_PROJECT_DIR/.claude/hooks/*.sh
# Compiled bundles (if using TypeScript)
ls -la $CLAUDE_PROJECT_DIR/.claude/hooks/dist/*.mjs
4. 手动测试钩子
# SessionEnd hook
echo '{"session_id": "test-123", "reason": "clear", "transcript_path": "/tmp/test"}' | \
$CLAUDE_PROJECT_DIR/.claude/hooks/session-end-cleanup.sh
# PostToolUse hook (Write tool example)
echo '{"tool_name": "Write", "tool_input": {"file_path": "test.md"}, "session_id": "test-123"}' | \
$CLAUDE_PROJECT_DIR/.claude/hooks/handoff-index.sh
5. 检查静默失败
如果使用 stdio: 'ignore' 进行分离式启动:
// This pattern hides errors!
spawn(cmd, args, { detached: true, stdio: 'ignore' })
修复方法: 添加临时日志:
const logFile = fs.openSync('.claude/cache/debug.log', 'a');
spawn(cmd, args, {
detached: true,
stdio: ['ignore', logFile, logFile] // capture stdout/stderr
});
6. 编辑后重新构建
如果编辑了 TypeScript 源代码,则必须重新构建:
cd $CLAUDE_PROJECT_DIR/.claude/hooks
npx esbuild src/session-end-cleanup.ts \
--bundle --platform=node --format=esm \
--outfile=dist/session-end-cleanup.mjs
仅修改源代码不会生效——Shell 包装脚本运行的是打包后的 .mjs。
常见问题
| 症状 | 可能原因 | 修复方法 |
|---|---|---|
| 钩子从未运行 | 未在 settings.json 中注册 | 在设置中的正确事件下添加钩子 |
| 钩子运行但没有输出 | 分离式启动隐藏了错误 | 添加日志,手动检查 |
| 会话 ID 错误 | 使用了“最近的”查询 | 显式传入 ID |
| 本地正常,CI 中不正常 | 缺少依赖项 | 检查 npx/node 是否可用 |
| 运行两次 | 同时在全局和项目中注册 | 删除重复项 |
调试检查清单
- 输出是否存在?(
ls -la .claude/cache/) - 是否已注册?(
grep -A10 '"hooks"' .claude/settings.json) - 文件是否存在?(
ls .claude/hooks/*.sh) - 打包文件是否为最新?(
ls -la .claude/hooks/dist/) - 手动测试是否正常?(
echo '{}' | ./hook.sh) - 是否不存在静默失败?(检查是否使用了
stdio: 'ignore')
来源会话
根据 10 个会话整理而成(占所有经验的 83%):
- a541f08a, 1c21e6c8, 6a9f2d7a, a8bd5cea, 2ca1a178, 657ce0b2, 3998f3a2, 2a829f12, 0b46cfd7, 862f6e2c
评论
支持 Markdown