add-coder 0.1.17 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.en.md +13 -3
  2. package/README.md +9 -8
  3. package/dist/index.js +72 -98
  4. package/package.json +1 -1
  5. package/templates/adapters/claude/hooks/doc-format-guard.sh +164 -9
  6. package/templates/adapters/claude/hooks/notification.sh +29 -0
  7. package/templates/adapters/claude/hooks/permission-denied.sh +42 -0
  8. package/templates/adapters/claude/hooks/post-tool-use.sh +25 -8
  9. package/templates/adapters/claude/hooks/pre-compact.sh +31 -8
  10. package/templates/adapters/claude/hooks/pre-tool-use.sh +63 -13
  11. package/templates/adapters/claude/hooks/prompt-submit.sh +70 -8
  12. package/templates/adapters/claude/hooks/session-end.sh +21 -0
  13. package/templates/adapters/claude/hooks/session-start.sh +26 -13
  14. package/templates/adapters/claude/hooks/stop-check.sh +40 -5
  15. package/templates/adapters/claude/hooks/stop-failure.sh +44 -0
  16. package/templates/adapters/claude/hooks/subagent-guard.sh +29 -8
  17. package/templates/adapters/claude/hooks/subagent-stop.sh +20 -0
  18. package/templates/adapters/codex/hooks/notification.sh +38 -0
  19. package/templates/adapters/codex/hooks/post-tool-use.sh +35 -0
  20. package/templates/adapters/codex/hooks/pre-tool-use.sh +78 -0
  21. package/templates/adapters/codex/hooks/prompt-submit.sh +78 -0
  22. package/templates/adapters/codex/hooks/session-start.sh +36 -0
  23. package/templates/adapters/codex/hooks/stop-check.sh +45 -0
  24. package/templates/adapters/codex/hooks.json +1 -0
  25. package/templates/adapters/codex/settings.json +1 -0
  26. package/templates/adapters/qoder/hooks/doc-format-guard.sh +9 -1
  27. package/templates/adapters/qoder/hooks/lib/vocabulary.sh +1 -1
  28. package/templates/adapters/qoder/hooks/notification.sh +8 -5
  29. package/templates/adapters/qoder/hooks/post-tool-use.sh +21 -11
  30. package/templates/adapters/qoder/hooks/pre-compact.sh +31 -6
  31. package/templates/adapters/qoder/hooks/pre-tool-use.sh +66 -64
  32. package/templates/adapters/qoder/hooks/prompt-submit.sh +12 -2
  33. package/templates/adapters/qoder/hooks/session-end.sh +24 -0
  34. package/templates/adapters/qoder/hooks/session-start.sh +22 -7
  35. package/templates/adapters/qoder/hooks/stop-check.sh +18 -41
  36. package/templates/adapters/qoder/hooks/subagent-guard.sh +22 -6
  37. package/templates/adapters/qoder/hooks/subagent-stop.sh +26 -0
  38. package/templates/adapters/qoder/settings.json +13 -13
  39. package/templates/adapters/trae/hooks/notification.sh +38 -0
  40. package/templates/adapters/trae/hooks/post-tool-failure.sh +10 -0
  41. package/templates/adapters/trae/hooks/post-tool-use.sh +35 -0
  42. package/templates/adapters/trae/hooks/pre-compact.sh +37 -0
  43. package/templates/adapters/trae/hooks/pre-tool-use.sh +78 -0
  44. package/templates/adapters/trae/hooks/prompt-submit.sh +78 -0
  45. package/templates/adapters/trae/hooks/session-end.sh +21 -0
  46. package/templates/adapters/trae/hooks/session-start.sh +36 -0
  47. package/templates/adapters/trae/hooks/stop-check.sh +45 -0
  48. package/templates/adapters/trae/hooks/subagent-guard.sh +36 -0
  49. package/templates/adapters/trae/hooks/subagent-stop.sh +20 -0
  50. package/templates/adapters/trae/hooks.json +1 -0
  51. package/templates/adapters/trae/settings.json +1 -0
  52. package/templates/adapters/vscode/.github/hooks/error-occurred.json +1 -0
  53. package/templates/adapters/vscode/.github/hooks/post-tool-use.json +1 -0
  54. package/templates/adapters/vscode/.github/hooks/pre-compact.json +1 -0
  55. package/templates/adapters/vscode/.github/hooks/pre-tool-use.json +14 -0
  56. package/templates/adapters/vscode/.github/hooks/session-end.json +1 -0
  57. package/templates/adapters/vscode/.github/hooks/session-start.json +14 -0
  58. package/templates/adapters/vscode/.github/hooks/stop-check.json +1 -0
  59. package/templates/adapters/vscode/.github/hooks/subagent-start.json +1 -0
  60. package/templates/adapters/vscode/.github/hooks/subagent-stop.json +1 -0
  61. package/templates/adapters/vscode/.github/hooks/user-prompt-submit.json +14 -0
  62. package/templates/adapters/vscode/hooks/notification.sh +37 -0
  63. package/templates/adapters/vscode/hooks/post-tool-failure.sh +28 -0
  64. package/templates/adapters/vscode/hooks/post-tool-use.sh +35 -0
  65. package/templates/adapters/vscode/hooks/pre-compact.sh +37 -0
  66. package/templates/adapters/vscode/hooks/pre-tool-use.sh +78 -0
  67. package/templates/adapters/vscode/hooks/prompt-submit.sh +78 -0
  68. package/templates/adapters/vscode/hooks/session-end.sh +13 -0
  69. package/templates/adapters/vscode/hooks/session-start.sh +35 -0
  70. package/templates/adapters/vscode/hooks/stop-check.sh +53 -0
  71. package/templates/adapters/vscode/hooks/subagent-guard.sh +37 -0
  72. package/templates/adapters/vscode/hooks/subagent-stop.sh +12 -0
  73. package/templates/adapters/vscode/launch.json +1 -1
  74. package/templates/adapters/vscode/settings.json +2 -3
  75. package/templates/adapters/vscode/tasks.json +3 -3
  76. package/templates/core/docs/ADD-governance-claude-code.md +121 -0
  77. package/templates/core/docs/ADD-governance-codex.md +75 -0
  78. package/templates/core/docs/ADD-governance-qoder-cn.md +99 -0
  79. package/templates/core/docs/ADD-governance-trae.md +63 -0
  80. package/templates/core/docs/ADD-governance-vscode-copilot.md +132 -0
  81. package/templates/core/hooks/doc-format-guard.sh +164 -9
  82. package/templates/core/hooks/lib/common.sh +261 -0
  83. package/templates/core/hooks/lib/preload-templates.sh +187 -0
  84. package/templates/core/hooks/lib/session-end.sh +76 -0
  85. package/templates/core/hooks/lib/subagent-stop.sh +90 -0
  86. package/templates/core/hooks/notification.sh +29 -0
  87. package/templates/core/hooks/post-tool-use.sh +25 -8
  88. package/templates/core/hooks/pre-compact.sh +31 -8
  89. package/templates/core/hooks/pre-tool-use.sh +63 -13
  90. package/templates/core/hooks/prompt-submit.sh +70 -8
  91. package/templates/core/hooks/session-end.sh +38 -0
  92. package/templates/core/hooks/session-start.sh +26 -13
  93. package/templates/core/hooks/stop-check.sh +40 -5
  94. package/templates/core/hooks/subagent-stop.sh +47 -0
  95. package/templates/core/rules/project_rules.md +1 -1
  96. package/templates/core/scripts/mcp-server.ts +38 -120
  97. package/templates/core/skills/add-paradigm/SKILL.md +24 -0
  98. package/templates/core/hooks/lib/context-inject.sh +0 -96
  99. package/templates/core/hooks/lib/state-detect.sh +0 -104
  100. package/templates/core/hooks/lib/vocabulary.sh +0 -49
@@ -2,10 +2,9 @@
2
2
  "mcp": {
3
3
  "servers": {
4
4
  "{{projectName}}-dev-tools": {
5
- "command": "npx",
5
+ "command": "{{mcpServerCommand}}",
6
6
  "args": [
7
- "tsx",
8
- "scripts/add-coder-mcp-server.ts"
7
+ ".vscode/scripts/mcp-server.ts"
9
8
  ],
10
9
  "env": {
11
10
  "NODE_ENV": "development"
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "label": "ADD: Run MCP Server",
6
6
  "type": "shell",
7
- "command": "{{mcpServerCommand}} .qoder/scripts/mcp-server.ts",
7
+ "command": "{{mcpServerCommand}} {{magicDir}}/scripts/mcp-server.ts",
8
8
  "presentation": {
9
9
  "reveal": "always",
10
10
  "panel": "new"
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "label": "ADD: Check Plan Exists (Pre-save)",
16
16
  "type": "shell",
17
- "command": "echo 'VS Code 无原生 hook,请在保存源码前手动确认 Plan 已创建。' && ls .qoder/plans/ 2>/dev/null || echo '⚠ 未找到 .qoder/plans/ 目录'",
17
+ "command": "ls {{magicDir}}/plans/ 2>/dev/null || echo '⚠ 未找到 {{magicDir}}/plans/ 目录'",
18
18
  "presentation": {
19
19
  "reveal": "silent",
20
20
  "panel": "shared"
@@ -27,7 +27,7 @@
27
27
  {
28
28
  "label": "ADD: Checklist Audit",
29
29
  "type": "shell",
30
- "command": "echo '请手动检查 .qoder/specs/ 下的 checklist.md 勾选状态'",
30
+ "command": "echo '请手动检查 {{magicDir}}/specs/ 下的 checklist.md 勾选状态'",
31
31
  "presentation": {
32
32
  "reveal": "silent",
33
33
  "panel": "shared"
@@ -0,0 +1,121 @@
1
+ # ADD 范式在 Claude Code 上的确定性运行
2
+
3
+ > **定位**:描述 ADD 范式如何通过 Claude Code 的 Hook 机制在 agent 生命周期中确定性运行。面向 add-coder 用户和贡献者,说明每个 hook 事件的治理职能和注入通道。
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md) | [issue-6-report](../.qoder/reports/issue-6-tool-call-throttling-report.md)
5
+ > **Hook 参考**: https://code.claude.com/docs/zh-CN/hooks
6
+
7
+ ---
8
+
9
+ ## Claude Code Hook 事件模型
10
+
11
+ Claude Code 支持 17 种事件,按频率分三档:
12
+
13
+ | 频率 | 事件 |
14
+ |---|---|
15
+ | 每会话一次 | SessionStart、SessionEnd |
16
+ | 每轮一次 | UserPromptSubmit、Stop、StopFailure |
17
+ | 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure、PermissionRequest、PermissionDenied |
18
+ | 其他 | PreCompact、SubagentStart、SubagentStop、Notification、ConfigChange、WorktreeCreate/Remove |
19
+
20
+ 配置位置:`.claude/hooks/*.sh` + `.claude/settings.json`
21
+
22
+ ---
23
+
24
+ ## ADD 治理卡位映射
25
+
26
+ ```
27
+ Claude Code Agent 生命周期 ADD 治理卡位
28
+ ───────────────────────────── ─────────────────────
29
+ SessionStart ─────────────────→ ① 模板索引注入 + ADD 状态恢复
30
+ SessionEnd ─────────────────→ ② 标记清理 + 审计结算 + Stop 兜底
31
+ UserPromptSubmit ────────────→ ③ 触发词路由 + 模板全文注入 + 契约卡位
32
+ PreToolUse ─────────────────→ ④ 危险命令/模板路径兜底/写入前置守卫
33
+ PostToolUse ─────────────────→ ⑤ 格式化 + 文档守卫 + 审计落库
34
+ PostToolUseFailure ───────────→ ⑥ 失败等价审计(ADD-6) + 429 降级
35
+ Stop ─────────────────→ ⑦ 验收检查 + devlog + 阻断
36
+ StopFailure ─────────────────→ ⑧ 紧急审计转储 + 异常标记
37
+ PreCompact ─────────────────→ ⑨ ADD 状态保存 + 恢复清单导出
38
+ SubagentStart ────────────────→ ⑩ 子 agent 上下文传递 + 审计初始化
39
+ SubagentStop ─────────────────→ ⑪ 子 agent 结果校验 + 审计聚合
40
+ Notification ─────────────────→ ⑫ 开发提醒/Token 预警
41
+ PermissionRequest ────────────→ ⑬ 分级决策(allow/deny/ask)
42
+ PermissionDenied ─────────────→ ⑭ 拒绝原因记录 + 替代方案
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 注入通道
48
+
49
+ Claude Code 的注入通道为 **stdout → additionalContext**——hook 脚本的 stdout 输出会自动作为额外上下文注入模型。
50
+
51
+ | 注入场景 | 触发事件 | 注入内容 | Token 成本 |
52
+ |---|---|---|---|
53
+ | 会话启动 | SessionStart | 模板索引(13 个文件名 + 一行用途) | ~500 token |
54
+ | 开发触发 | UserPromptSubmit(首次命中 ADD 关键词) | 13 个模板全文 | 依模板总量 |
55
+ | 去重 | UserPromptSubmit(同会话后续命中) | 短路跳过(tpl-injected 标记文件) | 0 |
56
+
57
+ ---
58
+
59
+ ## 完整生命周期数据流
60
+
61
+ ```
62
+ ┌──────────────────────────────────────────────────────┐
63
+ │ Claude Code 会话 │
64
+ ├──────────────────────────────────────────────────────┤
65
+ │ │
66
+ │ SessionStart │
67
+ │ ├─ detect_active_add() 扫描 plans/ 恢复 ADD 状态 │
68
+ │ ├─ preload-templates.sh --index │
69
+ │ └─ stdout → additionalContext 注入 │
70
+ │ │ │
71
+ │ ▼ │
72
+ │ UserPromptSubmit │
73
+ │ ├─ match_trigger() 检测 ADD 触发词 │
74
+ │ ├─ 首次命中 → preload-templates.sh --full │
75
+ │ ├─ touch tpl-injected 标记 │
76
+ │ └─ 同会话二次命中 → 短路 │
77
+ │ │ │
78
+ │ ▼ │
79
+ │ ┌──── 工具调用循环 ────┐ │
80
+ │ │ PreToolUse │ │
81
+ │ │ ├─ Bash → 危险命令拦截│ │
82
+ │ │ ├─ Write → 写入前置守卫│ │
83
+ │ │ └─ Read → 模板路径兜底 │ │
84
+ │ │ │ │ │
85
+ │ │ [工具执行] │ │
86
+ │ │ │ │ │
87
+ │ │ PostToolUse │ │
88
+ │ │ ├─ Edit → 格式化+文档守卫│ │
89
+ │ │ └─ record_dev_operation│ │
90
+ │ └────────────────────────┘ │
91
+ │ │ │
92
+ │ ▼ │
93
+ │ Stop(可阻断) │
94
+ │ ├─ checklist 验证 + tsc + RAHS │
95
+ │ ├─ 不通过 → exit 2 阻断 │
96
+ │ └─ 通过 → devlog + exit 0 │
97
+ │ │ │
98
+ │ ▼ │
99
+ │ PreCompact │
100
+ │ ├─ 保存 ADD 状态到标记文件 │
101
+ │ └─ rm tpl-injected(允许重注) │
102
+ │ │ │
103
+ │ ▼ │
104
+ │ SessionEnd │
105
+ │ ├─ rm tpl-injected 清理 │
106
+ │ ├─ query_audit_logs 汇总 │
107
+ │ └─ Stop 未触发兜底 │
108
+ │ │
109
+ └──────────────────────────────────────────────────────┘
110
+ ```
111
+
112
+ ---
113
+
114
+ ## Claude Code 独有治理能力
115
+
116
+ | 事件 | 能力 |
117
+ |---|---|
118
+ | PermissionRequest | 自动放行 Read/Grep/Glob,拦截 rm -rf/DROP TABLE |
119
+ | PermissionDenied | 记录拒绝原因 + 建议替代方案 |
120
+ | StopFailure | 异常退出前紧急 dump State |
121
+ | ConfigChange | settings.json 热重载 + 变更审计 |
@@ -0,0 +1,75 @@
1
+ # ADD 范式在 Codex 上的确定性运行
2
+
3
+ > **定位**:描述 ADD 范式如何通过 Codex 的 Hook 机制在 agent 生命周期中确定性运行。
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
+ > **Hook 参考**: https://www.runoob.com/codex/codex-hooks.html | Codex 设置 → 导入其他 agent 配置
6
+
7
+ ---
8
+
9
+ ## Codex Hook 事件模型
10
+
11
+ Codex 支持 6 种 Hook 事件:
12
+
13
+ | 频率 | 事件 |
14
+ |---|---|
15
+ | 每会话一次 | SessionStart |
16
+ | 每轮一次 | UserPromptSubmit、Stop |
17
+ | 每次工具调用 | PreToolUse、PostToolUse |
18
+ | 异步 | Notification |
19
+
20
+ 配置位置:项目级 `.codex/hooks.json`(或 `~/.codex/hooks.json` 全局)
21
+
22
+ **关键差异**:Codex 不支持 SessionEnd / PreCompact / SubagentStart / SubagentStop / PostToolUseFailure / StopFailure。但 **支持导入 Claude Code Hook 配置**(设置 → 导入其他 agent 配置 → 选择 Claude Code),可通过 Claude 通道获得完整 14 事件体系。`npx add-coder init --adapter=codex` 同步产出 `.claude/` 目录。
23
+
24
+ ---
25
+
26
+ ## ADD 治理卡位映射
27
+
28
+ ```
29
+ Codex Agent 生命周期 ADD 治理卡位
30
+ ───────────────────────────── ─────────────────────
31
+ SessionStart ─────────────────→ ① 模板索引注入 + ADD 状态恢复
32
+ UserPromptSubmit ────────────→ ③ 触发词路由 + 模板全文注入
33
+ PreToolUse ─────────────────→ ④ 危险命令/模板路径兜底/写入前置守卫
34
+ PostToolUse ─────────────────→ ⑤ 格式化 + 文档守卫 + 审计落库
35
+ Stop ─────────────────→ ⑦ 验收检查 + devlog + 阻断
36
+ Notification ─────────────────→ ⑫ 开发提醒/Token 预警
37
+ ```
38
+
39
+ > **Codex 端不支持的卡位**:②(SessionEnd)→ 无 hookpoint;⑥(PostToolUseFailure)→ 无 hookpoint;⑧⑨⑩⑪⑬⑭⑮ → 无 hookpoint。
40
+
41
+ ---
42
+
43
+ ## 注入通道
44
+
45
+ Codex 的注入通道为 **stdout**(与 Claude Code 兼容)。Codex 支持导入 Claude Code Hook 配置,可通过双通道架构获得完整治理:
46
+
47
+ - **Codex 原生**(6 事件,`.codex/hooks.json` → `.codex/hooks/xxx.sh`)
48
+ - **Claude Code 导入**(14 事件,`.claude/settings.json` → `.claude/hooks/xxx.sh`)——Codex 设置中开启「导入其他 agent 配置」即可。同一套脚本,两通道共享,脚本内置幂等保护。
49
+
50
+ ```
51
+ npx add-coder init --adapter=codex
52
+
53
+ ├──→ .codex/hooks.json (6 事件 → .codex/hooks/xxx.sh)
54
+ ├──→ .codex/settings.json
55
+ └──→ .claude/ ★ (含完整 14 事件 hooks + settings.json + mcp.json)
56
+ ```
57
+
58
+ | 注入场景 | 触发事件 | 注入内容 | 通道 |
59
+ |---|---|---|---|
60
+ | 会话启动 | SessionStart | 模板索引 + ADD 状态 | stdout |
61
+ | 开发触发 | UserPromptSubmit | 13 个模板全文 | stdout |
62
+
63
+ ---
64
+
65
+ ## 端差异汇总
66
+
67
+ | 维度 | Codex | Claude Code |
68
+ |---|---|---|
69
+ | 事件数 | 0 (原生) / 14 (导入 Claude) | 17 |
70
+ | 配置格式 | `.codex/hooks.json` | `.claude/settings.json` |
71
+ | Claude Hook 导入 | ✅ 原生支持(导入其他 agent 配置) | — |
72
+ | 全局 Hook | `~/.codex/hooks.json` | `~/.claude/settings.json` |
73
+ | SessionEnd | ❌ | ✅ |
74
+ | PreCompact | ❌ | ✅ |
75
+ | 权限系统 | PreToolUse 可阻断 | PermissionRequest/Denied |
@@ -0,0 +1,99 @@
1
+ # ADD 范式在 Qoder CN 上的确定性运行
2
+
3
+ > **定位**:描述 ADD 范式如何通过 Qoder CN 的 Hook 机制在 agent 生命周期中确定性运行。
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
+ > **Hook 参考**: https://help.aliyun.com/zh/lingma/qoder-cn-update-log
6
+
7
+ ---
8
+
9
+ ## Qoder CN Hook 事件模型
10
+
11
+ Qoder CN v1.7.0(2026-07-15)升级至 30+ 事件。以下为 ADD 治理覆盖的 10 个核心事件:
12
+
13
+ | 频率 | 事件 |
14
+ |---|---|
15
+ | 每会话一次 | SessionStart(v1.7.0 新增)、SessionEnd(v1.7.0 新增) |
16
+ | 每轮一次 | UserPromptSubmit、Stop |
17
+ | 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure |
18
+ | 其他 | SubagentStart(v1.7.0 新增)、SubagentStop(v1.7.0 新增)、Notification(v1.7.0 新增) |
19
+
20
+ 配置位置:`.qoder/hooks/*.sh` + `.qoder/settings.json`
21
+
22
+ **关键差异**:Qoder CN 不支持 PreCompact / PermissionRequest / PermissionDenied / StopFailure / ConfigChange / Worktree——这些 Claude Code 独有事件在 Qoder 端无对应 hookpoint,相关脚本不编译到 Qoder adapter。
23
+
24
+ ---
25
+
26
+ ## ADD 治理卡位映射
27
+
28
+ ```
29
+ Qoder CN Agent 生命周期 ADD 治理卡位
30
+ ───────────────────────────── ─────────────────────
31
+ SessionStart ─────────────────→ ① 模板索引注入 + ADD 状态恢复
32
+ SessionEnd ─────────────────→ ② 标记清理 + 审计结算 + Stop 兜底
33
+ UserPromptSubmit ────────────→ ③ 触发词路由 + 模板全文注入(增量插入 Layer 1/2/3)
34
+ PreToolUse ─────────────────→ ④ 危险命令/模板路径兜底/写入前置守卫
35
+ PostToolUse ─────────────────→ ⑤ 格式化 + 文档守卫 + 审计落库
36
+ PostToolUseFailure ───────────→ ⑥ 失败等价审计(ADD-6) + 429 降级
37
+ Stop ─────────────────→ ⑦ 验收检查 + devlog + 阻断(RAHS 不可用时降级为基础检查)
38
+ SubagentStart ────────────────→ ⑩ 子 agent 上下文传递 + 审计初始化
39
+ SubagentStop ─────────────────→ ⑪ 子 agent 结果校验 + 审计聚合
40
+ Notification ─────────────────→ ⑫ 开发提醒/Token 预警
41
+ ```
42
+
43
+ > **Qoder 端不支持的卡位**:⑧(StopFailure)→ 无 hookpoint;⑨(PreCompact)→ 无 hookpoint;⑬⑭(权限)→ 由 Qoder IDE 内置权限系统处理。
44
+
45
+ ---
46
+
47
+ ## 注入通道
48
+
49
+ Qoder CN 的注入通道为 **stderr → 下一轮 system prompt 注入**。这与 Claude Code 的 stdout 直接注入不同——stderr 内容不会即时进入当前轮上下文,而是在模型下一轮响应前由 Qoder IDE 自动注入 system prompt。
50
+
51
+ | 注入场景 | 触发事件 | 注入内容 | 通道 |
52
+ |---|---|---|---|
53
+ | 会话启动 | SessionStart | 模板索引 + ADD 状态 | stderr → 下一轮 system prompt |
54
+ | 开发触发 | UserPromptSubmit(首次命中) | 13 个模板全文 | stderr → 下一轮 system prompt |
55
+ | 去重 | UserPromptSubmit(同会话后续命中) | 短路跳过 | — |
56
+
57
+ **重要约束**:Qoder 端 `prompt-submit.sh` 已有 73 行完善的触发词路由系统(Layer 1 精准 P0 触发词 → Layer 2 开发关键词检测 → Layer 3 活跃 ADD 状态注入 + 验收幂等保护)。模板全文注入逻辑以**增量方式**插入 Layer 2 之后,禁止覆盖现有分流逻辑。
58
+
59
+ ---
60
+
61
+ ## 端差异汇总
62
+
63
+ | 维度 | Claude Code | Qoder CN |
64
+ |---|---|---|
65
+ | 注入通道 | stdout → additionalContext | stdout → additionalContext(JSON hookSpecificOutput) |
66
+ | PreCompact | ✅ | ❌ |
67
+ | 权限系统 | PermissionRequest/Denied hook | IDE 内置权限弹窗 |
68
+ | StopFailure | ✅ | ❌ |
69
+ | 独有特性 | ConfigChange / Worktree | asyncRewake(v1.7.0)+ if 条件匹配 |
70
+
71
+ ---
72
+
73
+ ## 调试与排错
74
+
75
+ ### Hook 日志路径
76
+
77
+ Qoder CN IDE 的 hook 执行遥测日志位于 `~/.qoder-cn/logs/latest/`。当 hook 脚本通过 stdout 输出 `hookSpecificOutput.additionalContext` JSON 时,IDE 会在日志中记录:
78
+
79
+ ```
80
+ UserPromptSubmit hook additional context: ADD workflow active. ...
81
+ ```
82
+
83
+ 这是验证 additionalContext 是否成功注入的**唯一确定性证据**——日志有这行 = 注入成功。
84
+
85
+ ### 常见排错清单
86
+
87
+ | 现象 | 根因 | 修复 |
88
+ |---|---|---|
89
+ | hook 注册了但不执行 | `command` 缺少 `bash` 前缀 | settings.json 所有 command 加 `bash` 前缀 |
90
+ | hook 执行但 stdout 未被注入 | 纯文本不被 IDE 解析为 additionalContext | 改用 JSON 格式:`{"hookSpecificOutput":{"hookEventName":"...","additionalContext":"..."}}` |
91
+ | 脚本 exit 0 但没有输出 | `VOCABULARY_FILE` 用了 `$PWD`,hook 运行时 cwd 不是项目根 | 改为 `${PROJECT_DIR:-$PWD}` |
92
+ | `detect_active_add` 返回空 | `PROJECT_DIR` 在 `source lib/vocabulary.sh` 之后才设置 | `export PROJECT_DIR` 移到所有 `source` 语句之前 |
93
+ | additionalContext 有时注入有时不注入 | 注入代码在 Layer 1 之后——P0 触发词匹配后 `exit 0` 跳过了注入 | 将 additionalContext 注入移到 Layer 1 之前 |
94
+
95
+ ### 关键设计决策
96
+
97
+ 1. **`PROJECT_DIR` 必须最先设置**:所有 `source lib/*.sh` 之前,因为被 source 的脚本可能依赖 `${PROJECT_DIR}` 定位文件
98
+ 2. **additionalContext 放在入口最前**:在任何 `exit` 分支之前,确保所有代码路径都能注入上下文
99
+ 3. **Stop/PreToolUse 不用 JSON**:中断/阻断类输出走 stderr 纯文本,不走 stdout JSON
@@ -0,0 +1,63 @@
1
+ # ADD 范式在 Trae 上的确定性运行
2
+
3
+ > **定位**:描述 ADD 范式如何通过 Trae 的 Hook 机制在 agent 生命周期中确定性运行。
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
+ > **Hook 参考**: https://docs.trae.cn/ide_automate-actions-with-hooks | https://docs.trae.cn/ide_hook-configuration-reference
6
+
7
+ ---
8
+
9
+ ## Trae Hook 事件模型
10
+
11
+ Trae v3.3.66(2026-06-12)支持 6 种 Hook 事件:
12
+
13
+ | 频率 | 事件 |
14
+ |---|---|
15
+ | 每会话一次 | SessionStart |
16
+ | 每轮一次 | UserPromptSubmit、Stop |
17
+ | 每次工具调用 | PreToolUse、PostToolUse |
18
+ | 异步 | Notification |
19
+
20
+ 配置位置:项目级 `hooks.json`(通过 设置 > Hooks 管理,或直接编辑 JSON 文件)
21
+
22
+ **关键差异**:Trae 不支持 SessionEnd / PreCompact / SubagentStart / SubagentStop / PostToolUseFailure / StopFailure。但 **支持导入 Claude Code Hook 配置**(`.claude/settings.json`),可通过 Claude 通道获得完整 14 事件体系。`npx add-coder init --adapter=trae` 同步产出 `.claude/` 目录。
23
+
24
+ ---
25
+
26
+ ## ADD 治理卡位映射
27
+
28
+ ```
29
+ Trae Agent 生命周期 ADD 治理卡位
30
+ ───────────────────────────── ─────────────────────
31
+ SessionStart ─────────────────→ ① 模板索引注入 + ADD 状态恢复
32
+ UserPromptSubmit ────────────→ ③ 触发词路由 + 模板全文注入
33
+ PreToolUse ─────────────────→ ④ 危险命令/模板路径兜底/写入前置守卫
34
+ PostToolUse ─────────────────→ ⑤ 格式化 + 文档守卫 + 审计落库
35
+ Stop ─────────────────→ ⑦ 验收检查 + devlog + 阻断
36
+ Notification ─────────────────→ ⑫ 开发提醒/Token 预警
37
+ ```
38
+
39
+ > **Trae 端不支持的卡位**:②(SessionEnd)→ 无 hookpoint;⑥(PostToolUseFailure)→ 无 hookpoint;⑧⑨⑩⑪⑬⑭⑮ → 无 hookpoint。
40
+
41
+ ---
42
+
43
+ ## 注入通道
44
+
45
+ Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导入 Claude Code Hook 配置,因此 `prompt-submit.sh` 和 `session-start.sh` 的 stdout 输出方式与 Claude Code 端一致。
46
+
47
+ | 注入场景 | 触发事件 | 注入内容 | 通道 |
48
+ |---|---|---|---|
49
+ | 会话启动 | SessionStart | 模板索引 + ADD 状态 | stdout |
50
+ | 开发触发 | UserPromptSubmit | 13 个模板全文 | stdout |
51
+
52
+ ---
53
+
54
+ ## 端差异汇总
55
+
56
+ | 维度 | Trae | Claude Code |
57
+ |---|---|---|
58
+ | 事件数 | 0 (原生) / 14 (导入 Claude) | 17 |
59
+ | 配置格式 | `hooks.json` | `.claude/settings.json` |
60
+ | Claude Hook 导入 | ✅ 原生支持 | — |
61
+ | SessionEnd | ❌ | ✅ |
62
+ | PreCompact | ❌ | ✅ |
63
+ | 权限系统 | 无 hookpoint | PermissionRequest/Denied |
@@ -0,0 +1,132 @@
1
+ # ADD 范式在 VS Code Copilot 上的确定性运行
2
+
3
+ > **定位**:描述 ADD 范式如何通过 VS Code Copilot 的 Agent Hook 机制在 agent 生命周期中确定性运行。
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md) | [issue-6-report](../.qoder/reports/issue-6-tool-call-throttling-report.md)
5
+ > **Hook 参考**: https://docs.github.com/zh/copilot/concepts/agents/hooks | https://vscode.js.cn/docs/agent-customization/hooks
6
+ > **VS Code 版本要求**: 1.127+(Agent Hook 预览),1.129+(Agent Host 架构,支持 `.claude/settings.json`)
7
+
8
+ ---
9
+
10
+ ## VS Code Copilot Hook 事件模型
11
+
12
+ VS Code Copilot 支持 10 种 Agent Hook 事件(官方 8 + Cloud Agent 2):
13
+
14
+ | 频率 | 事件 |
15
+ |---|---|
16
+ | 每会话一次 | **SessionStart**、**SessionEnd** |
17
+ | 每轮一次 | **UserPromptSubmit**、**Stop** |
18
+ | 每次工具调用 | **PreToolUse**、**PostToolUse** |
19
+ | 子 agent | **SubagentStart**、**SubagentStop** |
20
+ | 其他 | **PreCompact**、errorOccurred(Cloud Agent 专属) |
21
+
22
+ 配置位置:`.github/hooks/*.json`(JSON 格式,`command` 字段指向 shell 脚本)
23
+
24
+ **关键差异 vs Claude Code**:不支持 PostToolUseFailure / StopFailure / Notification / PermissionRequest。但 **VS Code 1.129+ Agent Host 同时读取 `.claude/settings.json`**,`npx add-coder init --adapter=vscode` 会同步产出 `.claude/` 目录,`.github/hooks/*.json` 的 `command` 统一指向 `.claude/hooks/xxx.sh`——双通道共享同一套完整脚本。
25
+
26
+ ---
27
+
28
+ ## ADD 治理卡位映射
29
+
30
+ ```
31
+ VS Code Copilot Agent 生命周期 ADD 治理卡位
32
+ ───────────────────────────── ─────────────────────
33
+ SessionStart ─────────────────→ ① 模板索引注入 + ADD 状态恢复
34
+ SessionEnd ─────────────────→ ② 标记清理 + 审计结算 + Stop 兜底
35
+ UserPromptSubmit ────────────→ ③ 触发词路由 + 模板全文注入
36
+ PreToolUse ─────────────────→ ④ 危险命令/模板路径兜底/写入前置守卫
37
+ PostToolUse ─────────────────→ ⑤ 格式化 + 文档守卫 + 审计落库
38
+ Stop ─────────────────→ ⑦ 验收检查 + devlog + 阻断
39
+ PreCompact ─────────────────→ ⑨ ADD 状态保存 + 恢复清单导出
40
+ SubagentStart─────────────────→ ⑩ ADD 上下文注入子 agent + 审计初始化
41
+ SubagentStop ─────────────────→ ⑪ 子 agent 结果校验 + 审计聚合
42
+ errorOccurred ────────────────→ ⑮ 错误分类 + 429 降级 + 审计(Cloud Agent 独有)
43
+ ```
44
+
45
+ > **VS Code Copilot 端不支持的卡位**:⑥→ 合入 errorOccurred;⑧ → 无 hookpoint;⑫ → 无 hookpoint;⑬⑭ → IDE 内置处理。
46
+
47
+ ---
48
+
49
+ ## 注入通道
50
+
51
+ VS Code Copilot 的注入通道为 **`.github/hooks/*.json` 的 `command` stdout**。
52
+
53
+ VS Code 1.129+ 的 Agent Host 架构让同一项目支持多 Agent 并行运行——Copilot、Claude Code 各走各的通道:
54
+
55
+ | 通道 | 配置位置 | 脚本路径 | 说明 |
56
+ |---|---|---|---|
57
+ | **VS Code 原生** | `.github/hooks/*.json` | `.claude/hooks/xxx.sh` | 10 个 JSON 文件,command 指向完整 Claude 脚本 |
58
+ | **Agent Host (Claude)** | `.claude/settings.json` | `.claude/hooks/xxx.sh` | 同一套脚本,Claude Code agent 直接读取 |
59
+
60
+ ```
61
+ npx add-coder init --adapter=vscode
62
+
63
+ ├──→ .github/hooks/*.json (10 个,→ .claude/hooks/xxx.sh)
64
+ ├──→ .vscode/settings.json (MCP 配置)
65
+ ├──→ .vscode/hooks/lib/ (共享库)
66
+ └──→ .claude/ ★ (Agent Host 双通道,含完整 hooks + settings.json + mcp.json)
67
+ ```
68
+
69
+ | 注入场景 | 触发事件 | 注入内容 | 配置 |
70
+ |---|---|---|---|
71
+ | 会话启动 | SessionStart | 模板索引 | `session-start.json` → `.claude/hooks/lib/preload-templates.sh --index` |
72
+ | 开发触发 | UserPromptSubmit | 13 个模板全文 | `user-prompt-submit.json` → `.claude/hooks/lib/preload-templates.sh --full --top 5 --mark` |
73
+
74
+ ---
75
+
76
+ ## 路径约定
77
+
78
+ VS Code Copilot hooks 必须位于 **项目根目录** 的 `.github/hooks/` 下。`npx add-coder init --adapter vscode` 会将 JSON 文件分发到此路径,而非 `.vscode/` 子目录。
79
+
80
+ **Issue #6 背景**:本端的 429 并发问题是最初触发源。轮次 1 优先交付 `session-start.json` + `user-prompt-submit.json` 两个文件,仅这两个 JSON 即可消灭模板读取风暴(429 不再触发)。
81
+
82
+ ---
83
+
84
+ ## 端差异汇总
85
+
86
+ | 维度 | VS Code Copilot | Claude Code |
87
+ |---|---|---|
88
+ | 配置格式 | `.github/hooks/*.json` | `.claude/settings.json` |
89
+ | 注入通道 | JSON command stdout | stdout → additionalContext |
90
+ | 脚本路径 | `.claude/hooks/xxx.sh`(与 Claude 共享) | `.claude/hooks/xxx.sh` |
91
+ | 独有事件 | errorOccurred | PermissionRequest/Denied / StopFailure / Notification / PostToolUseFailure |
92
+ | 子 agent 启动 | ✅ SubagentStart | ✅ SubagentStart |
93
+ | Agent Host 双通道 | ✅ `.claude/` 同步产出 | — |
94
+
95
+ ---
96
+
97
+ ## 自定义 Hook 源切换
98
+
99
+ VS Code Copilot 的 `.github/hooks/*.json` 默认指向 `.vscode/hooks/xxx.sh`(VS Code 原生完整脚本)。项目同时产出 `.claude/` 目录(含 Claude Code 完整 hook 体系 + settings.json),两套体系可切换。
100
+
101
+ ### 两套体系对比
102
+
103
+ | 维度 | `.vscode/hooks/`(默认) | `.claude/hooks/`(备选) |
104
+ |---|---|---|
105
+ | 适配 IDE | VS Code Copilot | Claude Code(Agent Host / CLI) |
106
+ | 事件覆盖 | 10 个(VS Code 全事件) | 14 个(Claude 全事件,含 Notification/PermissionRequest/StopFailure) |
107
+ | 环境变量 | `$PWD`(VS Code cwd=项目根) | `$CLAUDE_PROJECT_DIR` |
108
+ | 退出码阻断 | ✅ exit 2(与 Claude 相同) | ✅ exit 2 |
109
+ | 上下文注入 | stdout 纯文本(VS Code 格式) | stdout → additionalContext(Claude 格式) |
110
+ | 共享 lib | ✅ `hooks/lib/common.sh` | ✅ `hooks/lib/common.sh` |
111
+ | 治理能力 | 完整四路守卫 + 验收阻断 + 审计 | 完整四路守卫 + 验收阻断 + 审计(与 VS Code 版同等) |
112
+
113
+ > **两套实现代码质量同等,能力完整,差异仅在于环境变量和输出格式。**
114
+
115
+ ### 切换方式
116
+
117
+ 编辑 `.github/hooks/` 下的任意 JSON 文件,将 `bash` 字段中的路径从 `.vscode/hooks/` 改为 `.claude/hooks/` 即可:
118
+
119
+ ```json
120
+ // 默认(VS Code 原生,推荐)
121
+ "bash": "bash .vscode/hooks/pre-tool-use.sh"
122
+
123
+ // 切换为 Claude Code 体系(如果同时使用 Claude Code 并希望统一脚本)
124
+ "bash": "bash .claude/hooks/pre-tool-use.sh"
125
+ ```
126
+
127
+ **切换场景建议**:
128
+ - 只用 VS Code Copilot → 保持默认 `.vscode/hooks/`
129
+ - VS Code + Claude Code 混用 → 切到 `.claude/hooks/` 统一脚本(Copilot 会同时加载两套来源,但脚本幂等)
130
+ - 只用 Claude Code CLI → 不需要改 JSON,直接走 `.claude/settings.json`
131
+
132
+ ---