图 2:Hook 生命周期 - 从 SessionStart 到 SessionEnd 的完整流程 会话开始阶段 SessionStart → 会话开始或恢复 InstructionsLoaded → TaskCompleted → 任务标记完成 ConfigChange → 配置文件变更 WorktreeCreate → 创建工作树 WorktreeRemove → 移除工作树 PreCompact → 上下文压缩前 SessionEnd :会话结束时清理资源 关键洞察: 会话级事件:SessionStart、SessionEnd 每个会话只触发一次 循环事件:在代理循环中,某些事件会反复触发(PreToolUse、PostToolUse 种 Hook 事件,按生命周期阶段分类: 会话管理(4 种) 事件 触发时机 可阻止 匹配器支持 典型用途 SessionStart 会话开始或恢复 ❌ ✅ 加载上下文、设置环境变量、显示项目状态 SessionEnd 16 种 Hook 事件覆盖了 Claude Code 的完整生命周期: 会话管理:SessionStart、SessionEnd、InstructionsLoaded、ConfigChange 用户交互
PreToolUse → 拦截危险部署、门控审查 agent PostToolUse → 编辑时路由上下文、检测循环 Stop → 验证完成候选品(transcript × git diff) SessionEnd PreToolUse → 每次工具调用之前 PostToolUse → 每次工具调用之后 PreCompact → 上下文压缩之前 Stop → agent 尝试停止时 SessionEnd 038 的记录,Claude Code 源码中有 28 种 hook 事件: Claude Code 原生 Hook 事件 会话生命周期 SessionStart ← 会话开始时触发 SessionEnd 每 50 次调用注入 Objective Recitation precompact.sh 压缩丢失关键信息 压缩前注入不可降级规则 + 原始目标 session-reflection 经验无法积累 SessionEnd AI 编程工具 依赖项 具体机制 wow-harness 怎么用的 7 阶段 Hook 协议 SessionStart/PreToolUse/PostToolUse/PreCompact/Stop/SessionEnd
session_timer.py"start2>/dev/null||true-Stop→python"$HOME/.claude/hooks/session_timer.py"stop2>/dev/null||true-SessionEnd
工具执行前 拦截危险命令、修改参数 PostToolUse 工具执行后 自动格式化、通知 Notification Claude 等待输入时 桌面通知 SessionStart 会话开始时 加载环境变量 SessionEnd
save-hook.ts # PostToolUse │ │ ├── summary-hook.ts # Stop │ │ ├── cleanup-hook.ts # SessionEnd
PreToolUse工具执行前拦截危险命令、修改参数PostToolUse工具执行后自动格式化、通知NotificationClaude等待输入时桌面通知SessionStart会话开始时加载环境变量SessionEnd
→ 每次工具调用之前 PostToolUse → 每次工具调用之后 PreCompact → 上下文压缩之前 Stop → agent 尝试停止时 SessionEnd
这个插件会挂钩到Claude Code的生命周期——SessionStart初始化记忆,PostToolUse捕获动作,UserPromptSubmit注入相关上下文,PreCompact在上下文重置前保留记忆,SessionEnd
SessionEnd(会话结束) 触发时机:Claude Code会话完全结束时 执行内容:标记会话为已完成,确保所有数据持久化 双数据库存储系统 claude-mem使用两个数据库来存储记忆: SQLite
• UserPromptSubmit:用户提交指令时,记录问题和上下文 • PostToolUse:工具执行后,捕获Read/Write/Edit等操作 • Stop:任务暂停时,保存中间状态 • SessionEnd
系统里有几个角色各自分工: 5 个生命周期钩子 SessionStart、UserPromptSubmit、PostToolUse、Stop、SessionEnd,全程自动触发,不用你手动喊 一个常驻
Claude 结束时触发,质量门槛(比如「测试必须通过才能算完成」) UserPromptSubmit:你按回车时触发,做 prompt 验证 Notification:桌面通知 SessionStart/SessionEnd
的平均值替换它 将柱子添加到内部栈以供下一个过滤器或策略立即处理(回放过滤器将接管) 分解柱子第二部分的解剖: 复制传入数据柱 将 OHL 价格替换为Close价格 将时间更改为日期 + sessionend data.OpenInterest] = oi # Adjust times dt = datetime.datetime.combine(datadt, data.p.sessionend ohlbar[data.DateTime] = data.date2num(dt) dt = datetime.datetime.combine(datadt, data.p.sessionend data.OpenInterest] = oi # Adjust times dt = datetime.datetime.combine(datadt, data.p.sessionend
SessionEnd — 会话终止时触发。用于清理或审计日志。InstructionsLoaded — 当CLAUDE.md或.claude/rules/*.md文件被加载到上下文时触发。
times and - removed) ''' if data.sessionstart <= data.datetime.tm(0) <= data.sessionend compression=1, sessionstart=dtstart, # internally just the "time" part will be used sessionend Reset sessionend to MAXDATE & fall through - If session end is flagged as MAXDATE data.datetime.tm2datetime(data.sessionstart) self.sessend = sessend = data.datetime.tm2datetime(data.sessionend
UserPromptSubmit → PreToolUse → [PermissionRequest] → Tool Execution → PostToolUse/PostToolUseFailure → Stop → SessionEnd
返回错误]I-->K[工具执行结果处理]K-->L[AI生成响应/子代理执行]L-->|子代理完成|M[触发SubagentStop]L-->|主代理完成响应|N[触发Stop]M-->NN-->|触发SessionEnd
Hook类型(4类,25个事件):工具Hook:PreToolUse,PostToolUse,PostToolUseFailure,PermissionRequest会话Hook:SessionStart,SessionEnd
主 Agent 准备停止时 检查是否跑了测试/build SubagentStop 子 Agent 准备停止时 验证子任务完成度 SessionStart 会话开始时 加载环境变量、设置项目上下文 SessionEnd
原生支持 11-13 个 Hook 生命周期事件,覆盖从 SessionStart(会话开始)到 PreToolUse/PostToolUse(工具使用前后)再到 Stop(Agent 即将停止)和 SessionEnd