Imported from ymymssss/ohmyopenagent (
src/hooks/AGENTS.md). Install upstream withnpx skills add ymymssss/ohmyopenagent --skill hooks. Copyright stays with the author.
src/hooks/ — 48 个生命周期钩子
生成时间: 2026-03-06
概述
48 个钩子分布在独立模块和单文件中。三层组合:核心钩子(39) + 延续钩子(7) + 技能钩子(2)。所有钩子遵循 createXXXHook(deps) → HookFunction 工厂模式。
钩子层级
第一层:会话钩子(23)— create-session-hooks.ts
结构
hooks/
├── atlas/ # 主编排(757 行)
├── anthropic-context-window-limit-recovery/ # 自动摘要
├── anthropic-effort/ # 推理努力级别调整
├── anthropic-image-context/ # Anthropic 图像上下文处理
├── auto-slash-command/ # 检测 /command 模式
├── auto-update-checker/ # 插件更新检查
├── background-notification/ # 系统通知
├── beast-mode-system/ # Beast 模式系统提示注入
├── category-skill-reminder/ # 提醒类别技能
├── claude-code-hooks/ # settings.json 兼容层
├── comment-checker/ # 防止 AI 垃圾内容
├── compaction-context-injector/ # 压缩时注入上下文
├── compaction-todo-preserver/ # 压缩时保留 todo
├── delegate-task-retry/ # 重试失败的委托
├── directory-agents-injector/ # 自动注入 AGENTS.md
├── directory-readme-injector/ # 自动注入 README.md
├── edit-error-recovery/ # 从失败中恢复
├── hashline-edit-diff-enhancer/ # hashline 编辑的增强 diff 输出
├── hashline-read-enhancer/ # 为 Read 输出添加 LINE#ID 哈希
├── interactive-bash-session/ # Tmux 会话管理
├── json-error-recovery/ # JSON 解析错误纠正
├── keyword-detector/ # ultrawork/search/analyze 模式
├── model-fallback/ # 提供商级模型回退
├── no-hephaestus-non-gpt/ # 阻止 Hephaestus 使用非 GPT
├── no-sisyphus-gpt/ # 阻止 Sisyphus 使用 GPT
├── non-interactive-env/ # 非 TTY 环境处理
├── prometheus-md-only/ # Planner 只读模式
├── question-label-truncator/ # 自动截断问题标签
├── ralph-loop/ # 自引用开发循环
├── read-image-resizer/ # 调整图像大小以提高上下文效率
├── rules-injector/ # 条件规则
├── runtime-fallback/ # API 错误时自动切换模型
├── session-recovery/ # 自动从崩溃中恢复
├── sisyphus-junior-notepad/ # Sisyphus Junior 记事本
├── start-work/ # Sisyphus 工作会话启动器
├── stop-continuation-guard/ # 守护停止延续
├── task-reminder/ # 任务系统使用提醒
├── task-resume-info/ # 取消任务的重启信息
├── tasks-todowrite-disabler/ # 任务系统激活时禁用 TodoWrite
├── think-mode/ # 动态思考预算
├── thinking-block-validator/ # 确保 <thinking> 块有效
├── todo-continuation-enforcer/ # 强制完成 TODO
├── unstable-agent-babysitter/ # 监控不稳定智能体行为
├── write-existing-file-guard/ # 要求写前先读
└── index.ts # 钩子聚合与注册
| 钩子 | 事件 | 用途 |
|---|---|---|
| contextWindowMonitor | session.idle | 跟踪上下文窗口使用 |
| preemptiveCompaction | session.idle | 在达到限制前触发压缩 |
| sessionRecovery | session.error | 可恢复错误时自动重试 |
| sessionNotification | session.idle | 完成时发送系统通知 |
| thinkMode | chat.params | 模型变体切换(扩展思考) |
| anthropicContextWindowLimitRecovery | session.error | 多策略上下文恢复(截断、压缩) |
| autoUpdateChecker | session.created | 检查 npm 插件更新 |
| agentUsageReminder | chat.message | 提醒可用智能体 |
| nonInteractiveEnv | chat.message | 为 run 命令调整行为 |
| interactiveBashSession | tool.execute | 交互式工具的 Tmux 会话 |
| ralphLoop | event | 自引用开发循环(boulder 延续) |
| editErrorRecovery | tool.execute.after | 重试失败的文件编辑 |
| delegateTaskRetry | tool.execute.after | 重试失败的任务委托 |
| startWork | chat.message | /start-work 命令处理器 |
| prometheusMdOnly | tool.execute.before | 强制 Prometheus 只写 .md |
| sisyphusJuniorNotepad | chat.message | 子智能体的记事本注入 |
| questionLabelTruncator | tool.execute.before | 截断过长的提问标签 |
| taskResumeInfo | chat.message | 恢复时注入任务上下文 |
| anthropicEffort | chat.params | 调整推理努力级别 |
| modelFallback | chat.params | 错误时提供商级模型回退 |
| noSisyphusGpt | chat.message | 阻止 Sisyphus 使用 GPT 模型(吐司警告) |
| noHephaestusNonGpt | chat.message | 阻止 Hephaestus 使用非 GPT 模型 |
| runtimeFallback | event | API 提供商错误时自动切换模型 |
第二层:工具守卫钩子(12)— create-tool-guard-hooks.ts
| 钩子 | 事件 | 用途 |
|---|---|---|
| commentChecker | tool.execute.after | 阻止 AI 生成的注释模式 |
| toolOutputTruncator | tool.execute.after | 截断过大的工具输出 |
| directoryAgentsInjector | tool.execute.before | 将目录 AGENTS.md 注入上下文 |
| directoryReadmeInjector | tool.execute.before | 将目录 README.md 注入上下文 |
| emptyTaskResponseDetector | tool.execute.after | 检测空任务响应 |
| rulesInjector | tool.execute.before | 条件规则注入(AGENTS.md、配置) |
| tasksTodowriteDisabler | tool.execute.before | 任务系统激活时禁用 TodoWrite |
| writeExistingFileGuard | tool.execute.before | 现有文件写前需先读 |
| hashlineReadEnhancer | tool.execute.after | 用行哈希增强 Read 输出 |
| jsonErrorRecovery | tool.execute.after | 检测 JSON 解析错误,注入纠正提醒 |
第三层:转换钩子(4)— create-transform-hooks.ts
| 钩子 | 事件 | 用途 |
|---|---|---|
| claudeCodeHooks | messages.transform | Claude Code settings.json 兼容性 |
| keywordDetector | messages.transform | 检测 ultrawork/search/analyze 模式 |
| contextInjectorMessagesTransform | messages.transform | 将 AGENTS.md/README.md 注入上下文 |
| thinkingBlockValidator | messages.transform | 验证 thinking 块结构 |
第四层:延续钩子(7)— create-continuation-hooks.ts
| 钩子 | 事件 | 用途 |
|---|---|---|
| stopContinuationGuard | chat.message | /stop-continuation 命令处理器 |
| compactionContextInjector | session.compacted | 压缩后重新注入上下文 |
| compactionTodoPreserver | session.compacted | 压缩时保留 todo |
| todoContinuationEnforcer | session.idle | Boulder:强制完成未完 todo 后继续 |
| unstableAgentBabysitter | session.idle | 监控不稳定智能体行为 |
| backgroundNotificationHook | event | 后台任务完成通知 |
| atlasHook | event | boulder/后台会话的主编排器 |
第五层:技能钩子(2)— create-skill-hooks.ts
| 钩子 | 事件 | 用途 |
|---|---|---|
| categorySkillReminder | chat.message | 提醒类别+技能委托 |
| autoSlashCommand | chat.message | 自动检测用户输入中的 /command |
关键钩子(复杂)
anthropic-context-window-limit-recovery(31 文件,约 2230 行)
达到上下文限制时的多策略恢复。策略:截断、压缩、摘要。
atlas(17 文件,约 1976 行)
boulder 会话的主编排器。决策门:会话类型 → 中止检查 → 失败计数 → 后台任务 → 智能体匹配 → 计划完整性 → 冷却(5s)。在 session.idle 时注入延续提示。
ralph-loop(14 文件,约 1687 行)
通过 /ralph-loop 命令的自引用开发循环。状态保存在 .sisyphus/ralph-loop.local.md。检测 AI 输出中的 <promise>DONE</promise>。默认最多 100 次迭代。
todo-continuation-enforcer(13 文件,约 2061 行)
"Boulder" 机制。强制智能体在 todo 未完成时继续。2s 倒计时吐司 → 延续注入。指数退避:30s 基准,失败 ×2,最多 5 次连续失败后暂停 5 分钟。
keyword-detector(约 1665 行)
从用户输入检测模式:ultrawork、search、analyze、prove-yourself。注入模式特定的系统提示。
rules-injector(19 文件,约 1604 行)
从 AGENTS.md、配置、技能规则的条件规则注入。评估条件以确定适用的规则。
独立钩子(位于 src/hooks/ 根目录)
| 文件 | 用途 |
|---|---|
| context-window-monitor.ts | 跟踪上下文窗口百分比 |
| preemptive-compaction.ts | 在硬限制前触发压缩 |
| tool-output-truncator.ts | 按 token 数截断工具输出 |
| session-notification.ts + 4 个辅助 | 会话完成时的系统通知 |
| empty-task-response-detector.ts | 检测空/失败的任务响应 |
| session-todo-status.ts | Todo 完成状态跟踪 |
如何添加钩子
- 在
src/hooks/{name}/index.ts创建createXXXHook(deps)工厂 - 在适当的层级文件注册(
src/plugin/hooks/create-{tier}-hooks.ts) - 将钩子名称添加到
src/config/schema/hooks.tsHookNameSchema - 钩子接收
(event, ctx)— 返回值取决于事件类型
(文件结束 — 共 167 行)