定制 Hook
Hook 支持按平台和按事件分档:
SessionStarthook 在 Claude Code、Cursor、OpenCode、Gemini CLI、Qoder、CodeBuddy、Copilot、Droid 上原生启用(以及开了~/.codex/config.toml里codex_hooks = true的 Codex)。Kiro 的 Agent Hook 是用户自己配的,Trellis 不原生带任何。PreToolUse(sub-agent 上下文注入) 在 Claude Code、Cursor、OpenCode、CodeBuddy、Droid 原生启用。其他 hook 可用平台通过 sub-agent 内部的 pull-based prelude 替代。UserPromptSubmit(工作流状态提示) 平台范围与SessionStart相同。- Kilo、Antigravity、Windsurf 完全没有 hook 原语,行为通过 workflow 文件 + skill 交付。
Hook 类型
| Hook | 触发 | 用途 |
|---|---|---|
SessionStart | 会话开始 | 加载上下文、初始化环境 |
UserPromptSubmit | 用户提交提示词 | 提示 AI 注意当前任务的状态 |
PreToolUse | 工具调用前 | 拦截、修改参数、注入上下文 |
PostToolUse | 工具调用后 | 记录活动、触发后续动作 |
settings.json 或 hooks.json 引用 Python 脚本)。OpenCode 用 JS 插件(.opencode/plugins/ 下的 factory 函数),事件语义相同。其余 hook 可用平台(Codex、Gemini、Qoder、Copilot)只跑 session-start.py——没有 PreToolUse——通过各平台原生的配置文件配置。
settings.json 配置(Claude Code)
在 .claude/settings.json 配置 hook:
- 每个事件类型是
{ matcher, hooks }块的数组。 matcher:匹配规则("startup"匹配会话开始、"Task"匹配 Task 工具调用、"*"匹配任意)。hooks:匹配时按顺序执行的命令数组。$CLAUDE_PROJECT_DIR:Claude Code 自动展开为项目根。timeout:秒,超时则跳过该 hook。
原生 hook
session-start.py:上下文加载
触发:SessionStart。
行为:
- 读
.trellis/.developer拿开发者身份。 - 读
.trellis/workflow.md拿工作流契约。 - 读
.trellis/workspace/{name}/index.md拿会话历史。 - 读
git log拿最近提交。 - 读活跃任务。
inject-workflow-state.py:工作流状态提示
触发:UserPromptSubmit。
行为:有活跃任务时,在用户消息末尾追加一段简短面包屑,提醒 AI 当前任务处于哪个阶段(planning / in_progress / finishing)。内容从 .trellis/workflow.md 里解析。
inject-subagent-context.py:规范注入引擎
触发:PreToolUse,匹配 Task 工具调用。
行为(详见 §4.3):
- 拦截 Task 调用。
- 按
subagent_type读对应 JSONL(implement.jsonl、check.jsonl、research.jsonl)。 - 读 JSONL 中引用的所有文件。
- 组装 sub-agent 的 prompt(spec + 需求 + 原始指令)。
- 每个 sub-agent 在启动时一次性拿到完整上下文,没有 resume。
- 只 hook
trellis-*sub-agent;自定义 sub-agent 要想享受注入,必须自己改这个文件或自建注入逻辑。
编写自定义 hook
Hook 从 stdin 读 JSON 输入,向 stdout 输出 JSON 结果。 输入格式(PreToolUse 示例):示例:自动测试 hook
.claude/hooks/auto-test.py:
settings.json 注册: