add-coder 0.3.26 → 0.3.28

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 (323) hide show
  1. package/README.md +282 -155
  2. package/dist/index.js +481 -209
  3. package/package.json +15 -4
  4. package/templates/.add-coder-src-hash.json +186 -185
  5. package/templates/adapters/claude/hooks/doc-format-guard.ts +32 -0
  6. package/templates/adapters/claude/hooks/lib/claude-env.ts +7 -0
  7. package/templates/adapters/claude/hooks/notification.ts +24 -0
  8. package/templates/adapters/claude/hooks/permission-denied.ts +33 -0
  9. package/templates/adapters/claude/hooks/permission-gate.ts +12 -0
  10. package/templates/adapters/claude/hooks/post-tool-failure.ts +4 -0
  11. package/templates/adapters/claude/hooks/post-tool-use.ts +17 -0
  12. package/templates/adapters/claude/hooks/pre-compact.ts +10 -0
  13. package/templates/adapters/claude/hooks/pre-tool-use.ts +81 -0
  14. package/templates/adapters/claude/hooks/prompt-submit.ts +82 -0
  15. package/templates/adapters/claude/hooks/review-checklist.ts +4 -0
  16. package/templates/adapters/claude/hooks/session-end.ts +10 -0
  17. package/templates/adapters/claude/hooks/session-start.ts +24 -0
  18. package/templates/adapters/claude/hooks/stop-check.ts +15 -0
  19. package/templates/adapters/claude/hooks/stop-failure.ts +34 -0
  20. package/templates/adapters/claude/hooks/subagent-guard.ts +25 -0
  21. package/templates/adapters/claude/hooks/subagent-stop.ts +12 -0
  22. package/templates/adapters/claude/settings.json +13 -13
  23. package/templates/adapters/codex/config.toml.example +12 -0
  24. package/templates/adapters/codex/hooks/doc-format-guard.ts +30 -0
  25. package/templates/adapters/codex/hooks/notification.ts +26 -0
  26. package/templates/adapters/codex/hooks/permission-gate.ts +15 -0
  27. package/templates/adapters/codex/hooks/post-tool-failure.ts +14 -0
  28. package/templates/adapters/codex/hooks/post-tool-use.ts +85 -0
  29. package/templates/adapters/codex/hooks/pre-compact.ts +20 -0
  30. package/templates/adapters/codex/hooks/pre-tool-use.ts +141 -0
  31. package/templates/adapters/codex/hooks/prompt-submit.ts +38 -0
  32. package/templates/adapters/codex/hooks/review-checklist.ts +5 -0
  33. package/templates/adapters/codex/hooks/session-end.ts +19 -0
  34. package/templates/adapters/codex/hooks/session-start.ts +45 -0
  35. package/templates/adapters/codex/hooks/stop-check.ts +59 -0
  36. package/templates/adapters/codex/hooks/subagent-guard.ts +22 -0
  37. package/templates/adapters/codex/hooks/subagent-stop.ts +20 -0
  38. package/templates/adapters/codex/hooks.json +67 -1
  39. package/templates/adapters/qoder/hooks/doc-format-guard.ts +34 -0
  40. package/templates/adapters/qoder/hooks/lib/context-inject.ts +61 -0
  41. package/templates/adapters/qoder/hooks/lib/qoder-env.ts +23 -0
  42. package/templates/adapters/qoder/hooks/lib/review-checklist.ts +5 -0
  43. package/templates/adapters/qoder/hooks/notification.ts +34 -0
  44. package/templates/adapters/qoder/hooks/permission-gate.ts +26 -0
  45. package/templates/adapters/qoder/hooks/post-tool-failure.ts +30 -0
  46. package/templates/adapters/qoder/hooks/post-tool-use.ts +32 -0
  47. package/templates/adapters/qoder/hooks/pre-compact.ts +16 -0
  48. package/templates/adapters/qoder/hooks/pre-tool-use.ts +112 -0
  49. package/templates/adapters/qoder/hooks/prompt-submit.ts +66 -0
  50. package/templates/adapters/qoder/hooks/review-checklist.ts +24 -0
  51. package/templates/adapters/qoder/hooks/session-end.ts +27 -0
  52. package/templates/adapters/qoder/hooks/session-start.ts +83 -0
  53. package/templates/adapters/qoder/hooks/stop-check.ts +69 -0
  54. package/templates/adapters/qoder/hooks/subagent-guard.ts +16 -0
  55. package/templates/adapters/qoder/hooks/subagent-stop.ts +33 -0
  56. package/templates/adapters/qoder/settings.json +13 -13
  57. package/templates/adapters/trae/hooks/doc-format-guard.ts +30 -0
  58. package/templates/adapters/trae/hooks/notification.ts +22 -0
  59. package/templates/adapters/trae/hooks/permission-gate.ts +15 -0
  60. package/templates/adapters/trae/hooks/post-tool-failure.ts +14 -0
  61. package/templates/adapters/trae/hooks/post-tool-use.ts +24 -0
  62. package/templates/adapters/trae/hooks/pre-compact.ts +15 -0
  63. package/templates/adapters/trae/hooks/pre-tool-use.ts +40 -0
  64. package/templates/adapters/trae/hooks/prompt-submit.ts +29 -0
  65. package/templates/adapters/trae/hooks/review-checklist.ts +5 -0
  66. package/templates/adapters/trae/hooks/session-end.ts +16 -0
  67. package/templates/adapters/trae/hooks/session-start.ts +15 -0
  68. package/templates/adapters/trae/hooks/stop-check.ts +20 -0
  69. package/templates/adapters/trae/hooks/subagent-guard.ts +22 -0
  70. package/templates/adapters/trae/hooks/subagent-stop.ts +15 -0
  71. package/templates/adapters/trae/hooks.json +1 -1
  72. package/templates/adapters/vscode/hooks/doc-format-guard.ts +27 -0
  73. package/templates/adapters/vscode/hooks/notification.ts +22 -0
  74. package/templates/adapters/vscode/hooks/permission-gate.ts +15 -0
  75. package/templates/adapters/vscode/hooks/post-tool-failure.ts +32 -0
  76. package/templates/adapters/vscode/hooks/post-tool-use.ts +25 -0
  77. package/templates/adapters/vscode/hooks/pre-compact.ts +15 -0
  78. package/templates/adapters/vscode/hooks/pre-tool-use.ts +78 -0
  79. package/templates/adapters/vscode/hooks/prompt-submit.ts +74 -0
  80. package/templates/adapters/vscode/hooks/review-checklist.ts +5 -0
  81. package/templates/adapters/vscode/hooks/session-end.ts +16 -0
  82. package/templates/adapters/vscode/hooks/session-start.ts +24 -0
  83. package/templates/adapters/vscode/hooks/stop-check.ts +21 -0
  84. package/templates/adapters/vscode/hooks/subagent-guard.ts +21 -0
  85. package/templates/adapters/vscode/hooks/subagent-stop.ts +15 -0
  86. package/templates/core/docs/ADD-governance-claude-code.md +4 -4
  87. package/templates/core/docs/ADD-governance-codex.md +6 -6
  88. package/templates/core/docs/ADD-governance-qoder-cn.md +5 -5
  89. package/templates/core/docs/ADD-governance-trae.md +3 -3
  90. package/templates/core/docs/ADD-governance-vscode-copilot.md +22 -23
  91. package/templates/core/governance/audit-bridge.ts +47 -0
  92. package/templates/core/governance/common.ts +299 -0
  93. package/templates/core/governance/context-inject.ts +53 -0
  94. package/templates/core/governance/doc-format-guard.ts +440 -0
  95. package/templates/core/governance/notification-router.ts +62 -0
  96. package/templates/core/governance/notify.ts +66 -0
  97. package/templates/core/governance/permission-gate-router.ts +42 -0
  98. package/templates/core/governance/post-tool-failure-router.ts +56 -0
  99. package/templates/core/governance/post-tool-router.ts +212 -0
  100. package/templates/core/governance/pre-compact-guard.ts +41 -0
  101. package/templates/core/governance/pre-tool-guard.ts +309 -0
  102. package/templates/core/governance/preload-templates.ts +241 -0
  103. package/templates/core/governance/prompt-router.ts +222 -0
  104. package/templates/core/governance/review-checklist-guard.ts +186 -0
  105. package/templates/core/governance/rules.ts +720 -0
  106. package/templates/core/governance/session-end.ts +88 -0
  107. package/templates/core/governance/session-start-guard.ts +99 -0
  108. package/templates/core/governance/state-detect.ts +6 -0
  109. package/templates/core/governance/stop-router.ts +140 -0
  110. package/templates/core/governance/subagent-guard-router.ts +35 -0
  111. package/templates/core/governance/subagent-stop-router.ts +93 -0
  112. package/templates/core/governance/subagent-stop.ts +75 -0
  113. package/templates/core/governance/vocabulary.ts +109 -0
  114. package/templates/core/hooks/doc-format-guard.ts +21 -0
  115. package/templates/core/hooks/notification.ts +11 -0
  116. package/templates/core/hooks/permission-gate.ts +7 -0
  117. package/templates/core/hooks/post-tool-failure.ts +7 -0
  118. package/templates/core/hooks/post-tool-use.ts +23 -0
  119. package/templates/core/hooks/pre-compact.ts +9 -0
  120. package/templates/core/hooks/pre-tool-use.ts +30 -0
  121. package/templates/core/hooks/prompt-submit.ts +11 -0
  122. package/templates/core/hooks/review-checklist.ts +4 -0
  123. package/templates/core/hooks/session-end.ts +10 -0
  124. package/templates/core/hooks/session-start.ts +9 -0
  125. package/templates/core/hooks/stop-check.ts +14 -0
  126. package/templates/core/hooks/subagent-guard.ts +8 -0
  127. package/templates/core/hooks/subagent-stop.ts +9 -0
  128. package/templates/core/prisma/add.prisma +140 -82
  129. package/templates/core/rules/project_rules.md +27 -24
  130. package/templates/core/scripts/db-ensure.sh +8 -0
  131. package/templates/core/scripts/gen-plan-index.sh +4 -15
  132. package/templates/core/scripts/mcp-server/notifications/hitl.ts +9 -1
  133. package/templates/core/scripts/mcp-server/notifications/hook.ts +25 -9
  134. package/templates/core/scripts/mcp-server/resources/hitl-approval-widget.ts +34 -0
  135. package/templates/core/scripts/mcp-server/resources/hook-events-report.ts +14 -2
  136. package/templates/core/scripts/mcp-server/resources/index.ts +2 -0
  137. package/templates/core/scripts/mcp-server/sampling/review.ts +25 -10
  138. package/templates/core/scripts/mcp-server/shared/db-types.ts +33 -8
  139. package/templates/core/scripts/mcp-server/shared/dps-scoring.strategy.ts +1 -1
  140. package/templates/core/scripts/mcp-server/shared/env.ts +28 -8
  141. package/templates/core/scripts/mcp-server/shared/fs.ts +3 -0
  142. package/templates/core/scripts/mcp-server/shared/hitl-interaction.strategy.ts +2 -3
  143. package/templates/core/scripts/mcp-server/shared/hitl-lifecycle-mutation.ts +129 -0
  144. package/templates/core/scripts/mcp-server/shared/hitl-proposal-mutation.ts +98 -0
  145. package/templates/core/scripts/mcp-server/shared/hitl-ui.ts +3 -0
  146. package/templates/core/scripts/mcp-server/shared/plan-lifecycle-events.ts +62 -0
  147. package/templates/core/scripts/mcp-server/shared/plan-lifecycle-mutation.ts +78 -0
  148. package/templates/core/scripts/mcp-server/shared/plan-lifecycle-subscriber.ts +145 -0
  149. package/templates/core/scripts/mcp-server/shared/plan-lifecycle.ts +153 -0
  150. package/templates/core/scripts/mcp-server/shared/plan-round-events.ts +56 -0
  151. package/templates/core/scripts/mcp-server/shared/plan-round-mutation.ts +143 -0
  152. package/templates/core/scripts/mcp-server/shared/plan-round-store.ts +47 -0
  153. package/templates/core/scripts/mcp-server/shared/plan-round-subscriber.ts +99 -0
  154. package/templates/core/scripts/mcp-server/shared/plan-status-store.ts +37 -0
  155. package/templates/core/scripts/mcp-server/shared/plan-tracking-mutation.ts +71 -0
  156. package/templates/core/scripts/mcp-server/shared/prisma.ts +12 -6
  157. package/templates/core/scripts/mcp-server/shared/project-root-strategy.ts +1 -2
  158. package/templates/core/scripts/mcp-server/shared/quant-recheck.strategy.ts +16 -0
  159. package/templates/core/scripts/mcp-server/shared/redact.ts +28 -0
  160. package/templates/core/scripts/mcp-server/shared/response.ts +3 -2
  161. package/templates/core/scripts/mcp-server/shared/runtime-context.ts +77 -0
  162. package/templates/core/scripts/mcp-server/shared/schema-topology.ts +159 -0
  163. package/templates/core/scripts/mcp-server/tools/audit.ts +49 -7
  164. package/templates/core/scripts/mcp-server/tools/context.ts +117 -121
  165. package/templates/core/scripts/mcp-server/tools/contract.ts +34 -9
  166. package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_status.ts +50 -3
  167. package/templates/core/scripts/mcp-server/tools/gateway/check_doc_similarity.ts +218 -0
  168. package/templates/core/scripts/mcp-server/tools/gateway/check_dps.ts +22 -7
  169. package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +86 -4
  170. package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +19 -6
  171. package/templates/core/scripts/mcp-server/tools/gateway/index.ts +2 -0
  172. package/templates/core/scripts/mcp-server/tools/hitl.ts +160 -75
  173. package/templates/core/scripts/mcp-server/tools/hook-event-report.ts +9 -2
  174. package/templates/core/scripts/mcp-server/tools/index.ts +69 -3
  175. package/templates/core/scripts/mcp-server/tools/plan.ts +152 -17
  176. package/templates/core/scripts/mcp-server/tools/review.ts +44 -15
  177. package/templates/core/scripts/mcp-server.ts +60 -1
  178. package/templates/core/scripts/plan-status-bridge.ts +26 -0
  179. package/templates/core/skills/add-paradigm/SKILL.md +2 -2
  180. package/templates/core/templates/add-route-template.schema.json +24 -56
  181. package/templates/core/templates/collab-contract-template.md +1 -1
  182. package/templates/core/templates/handoff-multi-round-template.schema.json +48 -0
  183. package/templates/core/templates/handoff-single-round-template.schema.json +92 -0
  184. package/templates/core/templates/handoff-single-round.schema.json +1 -1
  185. package/templates/core/templates/hitl-approval-widget.html +222 -37
  186. package/templates/core/templates/spec-template.schema.json +9 -46
  187. package/templates/core/templates/standard-plan-template.schema.json +1 -1
  188. package/templates/core/templates/tasks-template.schema.json +13 -54
  189. package/templates/adapters/claude/hooks/doc-format-guard.sh +0 -202
  190. package/templates/adapters/claude/hooks/lib/common.sh +0 -261
  191. package/templates/adapters/claude/hooks/lib/context-inject.sh +0 -96
  192. package/templates/adapters/claude/hooks/lib/notify.sh +0 -34
  193. package/templates/adapters/claude/hooks/lib/preload-templates.sh +0 -187
  194. package/templates/adapters/claude/hooks/lib/session-end.sh +0 -76
  195. package/templates/adapters/claude/hooks/lib/state-detect.sh +0 -117
  196. package/templates/adapters/claude/hooks/lib/subagent-stop.sh +0 -90
  197. package/templates/adapters/claude/hooks/lib/vocabulary.sh +0 -56
  198. package/templates/adapters/claude/hooks/notification.sh +0 -45
  199. package/templates/adapters/claude/hooks/permission-denied.sh +0 -42
  200. package/templates/adapters/claude/hooks/permission-gate.sh +0 -18
  201. package/templates/adapters/claude/hooks/post-tool-failure.sh +0 -10
  202. package/templates/adapters/claude/hooks/post-tool-use.sh +0 -35
  203. package/templates/adapters/claude/hooks/pre-compact.sh +0 -37
  204. package/templates/adapters/claude/hooks/pre-tool-use.sh +0 -153
  205. package/templates/adapters/claude/hooks/prompt-submit.sh +0 -99
  206. package/templates/adapters/claude/hooks/review-checklist.sh +0 -10
  207. package/templates/adapters/claude/hooks/session-end.sh +0 -21
  208. package/templates/adapters/claude/hooks/session-start.sh +0 -36
  209. package/templates/adapters/claude/hooks/stop-check.sh +0 -45
  210. package/templates/adapters/claude/hooks/stop-failure.sh +0 -44
  211. package/templates/adapters/claude/hooks/subagent-guard.sh +0 -36
  212. package/templates/adapters/claude/hooks/subagent-stop.sh +0 -20
  213. package/templates/adapters/codex/hooks/doc-format-guard.sh +0 -261
  214. package/templates/adapters/codex/hooks/lib/common.sh +0 -261
  215. package/templates/adapters/codex/hooks/lib/context-inject.sh +0 -96
  216. package/templates/adapters/codex/hooks/lib/notify.sh +0 -34
  217. package/templates/adapters/codex/hooks/lib/preload-templates.sh +0 -187
  218. package/templates/adapters/codex/hooks/lib/session-end.sh +0 -76
  219. package/templates/adapters/codex/hooks/lib/state-detect.sh +0 -117
  220. package/templates/adapters/codex/hooks/lib/subagent-stop.sh +0 -90
  221. package/templates/adapters/codex/hooks/lib/vocabulary.sh +0 -56
  222. package/templates/adapters/codex/hooks/notification.sh +0 -45
  223. package/templates/adapters/codex/hooks/permission-gate.sh +0 -18
  224. package/templates/adapters/codex/hooks/post-tool-failure.sh +0 -10
  225. package/templates/adapters/codex/hooks/post-tool-use.sh +0 -138
  226. package/templates/adapters/codex/hooks/pre-compact.sh +0 -37
  227. package/templates/adapters/codex/hooks/pre-tool-use.sh +0 -217
  228. package/templates/adapters/codex/hooks/prompt-submit.sh +0 -87
  229. package/templates/adapters/codex/hooks/review-checklist.sh +0 -10
  230. package/templates/adapters/codex/hooks/session-end.sh +0 -38
  231. package/templates/adapters/codex/hooks/session-start.sh +0 -53
  232. package/templates/adapters/codex/hooks/stop-check.sh +0 -45
  233. package/templates/adapters/codex/hooks/subagent-guard.sh +0 -15
  234. package/templates/adapters/codex/hooks/subagent-stop.sh +0 -47
  235. package/templates/adapters/qoder/hooks/doc-format-guard.sh +0 -260
  236. package/templates/adapters/qoder/hooks/lib/common.sh +0 -261
  237. package/templates/adapters/qoder/hooks/lib/context-inject.sh +0 -96
  238. package/templates/adapters/qoder/hooks/lib/notify.sh +0 -34
  239. package/templates/adapters/qoder/hooks/lib/preload-templates.sh +0 -187
  240. package/templates/adapters/qoder/hooks/lib/session-end.sh +0 -76
  241. package/templates/adapters/qoder/hooks/lib/state-detect.sh +0 -117
  242. package/templates/adapters/qoder/hooks/lib/subagent-stop.sh +0 -90
  243. package/templates/adapters/qoder/hooks/lib/vocabulary.sh +0 -56
  244. package/templates/adapters/qoder/hooks/notification.sh +0 -25
  245. package/templates/adapters/qoder/hooks/permission-gate.sh +0 -8
  246. package/templates/adapters/qoder/hooks/post-tool-failure.sh +0 -8
  247. package/templates/adapters/qoder/hooks/post-tool-use.sh +0 -121
  248. package/templates/adapters/qoder/hooks/pre-compact.sh +0 -37
  249. package/templates/adapters/qoder/hooks/pre-tool-use.sh +0 -154
  250. package/templates/adapters/qoder/hooks/prompt-submit.sh +0 -96
  251. package/templates/adapters/qoder/hooks/review-checklist.sh +0 -157
  252. package/templates/adapters/qoder/hooks/session-end.sh +0 -24
  253. package/templates/adapters/qoder/hooks/session-start.sh +0 -45
  254. package/templates/adapters/qoder/hooks/stop-check.sh +0 -48
  255. package/templates/adapters/qoder/hooks/subagent-guard.sh +0 -27
  256. package/templates/adapters/qoder/hooks/subagent-stop.sh +0 -26
  257. package/templates/adapters/trae/hooks/doc-format-guard.sh +0 -261
  258. package/templates/adapters/trae/hooks/lib/common.sh +0 -261
  259. package/templates/adapters/trae/hooks/lib/context-inject.sh +0 -96
  260. package/templates/adapters/trae/hooks/lib/notify.sh +0 -34
  261. package/templates/adapters/trae/hooks/lib/preload-templates.sh +0 -187
  262. package/templates/adapters/trae/hooks/lib/session-end.sh +0 -76
  263. package/templates/adapters/trae/hooks/lib/state-detect.sh +0 -117
  264. package/templates/adapters/trae/hooks/lib/subagent-stop.sh +0 -90
  265. package/templates/adapters/trae/hooks/lib/vocabulary.sh +0 -56
  266. package/templates/adapters/trae/hooks/notification.sh +0 -45
  267. package/templates/adapters/trae/hooks/permission-gate.sh +0 -18
  268. package/templates/adapters/trae/hooks/post-tool-failure.sh +0 -10
  269. package/templates/adapters/trae/hooks/post-tool-use.sh +0 -138
  270. package/templates/adapters/trae/hooks/pre-compact.sh +0 -37
  271. package/templates/adapters/trae/hooks/pre-tool-use.sh +0 -217
  272. package/templates/adapters/trae/hooks/prompt-submit.sh +0 -87
  273. package/templates/adapters/trae/hooks/review-checklist.sh +0 -10
  274. package/templates/adapters/trae/hooks/session-end.sh +0 -38
  275. package/templates/adapters/trae/hooks/session-start.sh +0 -53
  276. package/templates/adapters/trae/hooks/stop-check.sh +0 -45
  277. package/templates/adapters/trae/hooks/subagent-guard.sh +0 -15
  278. package/templates/adapters/trae/hooks/subagent-stop.sh +0 -47
  279. package/templates/adapters/vscode/hooks/doc-format-guard.sh +0 -201
  280. package/templates/adapters/vscode/hooks/lib/common.sh +0 -261
  281. package/templates/adapters/vscode/hooks/lib/context-inject.sh +0 -96
  282. package/templates/adapters/vscode/hooks/lib/notify.sh +0 -34
  283. package/templates/adapters/vscode/hooks/lib/preload-templates.sh +0 -187
  284. package/templates/adapters/vscode/hooks/lib/session-end.sh +0 -76
  285. package/templates/adapters/vscode/hooks/lib/state-detect.sh +0 -117
  286. package/templates/adapters/vscode/hooks/lib/subagent-stop.sh +0 -90
  287. package/templates/adapters/vscode/hooks/lib/vocabulary.sh +0 -56
  288. package/templates/adapters/vscode/hooks/notification.sh +0 -45
  289. package/templates/adapters/vscode/hooks/permission-gate.sh +0 -18
  290. package/templates/adapters/vscode/hooks/post-tool-failure.sh +0 -28
  291. package/templates/adapters/vscode/hooks/post-tool-use.sh +0 -35
  292. package/templates/adapters/vscode/hooks/pre-compact.sh +0 -37
  293. package/templates/adapters/vscode/hooks/pre-tool-use.sh +0 -153
  294. package/templates/adapters/vscode/hooks/prompt-submit.sh +0 -99
  295. package/templates/adapters/vscode/hooks/review-checklist.sh +0 -10
  296. package/templates/adapters/vscode/hooks/session-end.sh +0 -13
  297. package/templates/adapters/vscode/hooks/session-start.sh +0 -35
  298. package/templates/adapters/vscode/hooks/stop-check.sh +0 -53
  299. package/templates/adapters/vscode/hooks/subagent-guard.sh +0 -37
  300. package/templates/adapters/vscode/hooks/subagent-stop.sh +0 -12
  301. package/templates/core/hooks/doc-format-guard.sh +0 -261
  302. package/templates/core/hooks/lib/common.sh +0 -261
  303. package/templates/core/hooks/lib/context-inject.sh +0 -96
  304. package/templates/core/hooks/lib/notify.sh +0 -34
  305. package/templates/core/hooks/lib/preload-templates.sh +0 -187
  306. package/templates/core/hooks/lib/session-end.sh +0 -76
  307. package/templates/core/hooks/lib/state-detect.sh +0 -117
  308. package/templates/core/hooks/lib/subagent-stop.sh +0 -90
  309. package/templates/core/hooks/lib/vocabulary.sh +0 -56
  310. package/templates/core/hooks/notification.sh +0 -45
  311. package/templates/core/hooks/permission-gate.sh +0 -18
  312. package/templates/core/hooks/post-tool-failure.sh +0 -10
  313. package/templates/core/hooks/post-tool-use.sh +0 -138
  314. package/templates/core/hooks/pre-compact.sh +0 -37
  315. package/templates/core/hooks/pre-tool-use.sh +0 -217
  316. package/templates/core/hooks/prompt-submit.sh +0 -87
  317. package/templates/core/hooks/review-checklist.sh +0 -10
  318. package/templates/core/hooks/session-end.sh +0 -38
  319. package/templates/core/hooks/session-start.sh +0 -53
  320. package/templates/core/hooks/stop-check.sh +0 -45
  321. package/templates/core/hooks/subagent-guard.sh +0 -15
  322. package/templates/core/hooks/subagent-stop.sh +0 -47
  323. package/templates/shared/hooks-lib/common.sh +0 -22
@@ -0,0 +1,74 @@
1
+ // prompt-submit.ts — UserPromptSubmit 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PromptRouter(L1/L2/L3 模板方法);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① extractPrompt: grep 正则提取(无 jq)
4
+ // ② acceptedText: 验收 4 行(无 ★ 同步检查行——vscode bash 原文)
5
+ // ③ onAccepted: 无 review-checklist 子进程
6
+ // ④ onDevKwMatched: stderr "[ADD PromptSubmit] 检测到开发关键词"
7
+ // ⑤ layer2ToStderr: false(Layer2 提示输出 stdout)
8
+ // ⑥ layer3Text: 「[ADD 当前状态]」多行块
9
+ // ⑦ afterLayer3: 模板全文注入(--full --top 5)
10
+
11
+ import { readHookInput } from "../../../core/governance/common.js"
12
+ import { PreloadTemplates } from "../../../core/governance/preload-templates.js"
13
+ import { PromptRouter } from "../../../core/governance/prompt-router.js"
14
+
15
+ const MAGIC_DIR = process.env.MAGIC_DIR || ".vscode"
16
+
17
+ class VscodePromptRouter extends PromptRouter {
18
+ /** ① prompt 提取(对齐 bash grep/sed,无 jq) */
19
+ protected override extractPrompt(input: string): string {
20
+ return input.match(/"prompt"\s*:\s*"([^"]*)"/)?.[1] ?? ""
21
+ }
22
+
23
+ /** ② 验收幂等文本(vscode 4 行,无 ★ 同步检查) */
24
+ protected override acceptedText(): string {
25
+ return `[ADD 验收] ⚠️ 已验收。进入 Review 模式:
26
+ ① 重新检查 checklist [T]/[R] 项
27
+ ② 审查 audit 记录完整性
28
+ ③ 如有差异 → Review 回流至 handoff(增量更新)
29
+ ④ 无差异 → 记录 'Review 已确认,无新发现'
30
+ `
31
+ }
32
+
33
+ /** ③ 验收后置(vscode 无 review-checklist 子进程) */
34
+ protected override onAccepted(_handoff: string, _addRoute: string): void {
35
+ // vscode 协议: 无子进程调用
36
+ }
37
+
38
+ /** ④ 开发关键词命中提示(stderr) */
39
+ protected override onDevKwMatched(): void {
40
+ process.stderr.write("[ADD PromptSubmit] 检测到开发关键词\n")
41
+ }
42
+
43
+ /** ⑤ Layer 2 输出通道(vscode: stdout) */
44
+ protected override layer2ToStderr(): boolean {
45
+ return false
46
+ }
47
+
48
+ /** ⑥ Layer 3 状态文本(多行块) */
49
+ protected override layer3Text(plan: string, rounds: string, step: string, handoff: string): string {
50
+ return `[ADD 当前状态]
51
+ Plan: ${plan}
52
+ 轮次: ${rounds}
53
+ 当前 Step: ${step}
54
+ handoff: ${handoff}
55
+ `
56
+ }
57
+
58
+ /** ⑦ Layer 3 附加注入: 模板全文(--full --top 5 + tpl-injected 去重) */
59
+ protected override afterLayer3(): void {
60
+ try {
61
+ const preload = new PreloadTemplates()
62
+ preload.validate()
63
+ if (!preload.isInjected()) {
64
+ process.stdout.write(preload.full(5))
65
+ preload.markInjected()
66
+ }
67
+ } catch {
68
+ /* 对齐 bash [ -f "$TPL_SCRIPT" ] 缺失时跳过 */
69
+ }
70
+ }
71
+ }
72
+
73
+ const input = readHookInput()
74
+ process.exit(new VscodePromptRouter(MAGIC_DIR).run(input))
@@ -0,0 +1,5 @@
1
+ // review-checklist.ts — Review 检查清单校验(VS Code Copilot 版)
2
+ // bash 版缺陷修复: SHARED_LIB 路径断裂,TS 版 import core common.js(内联)。
3
+
4
+ process.stdout.write("[ADD ReviewChecklist] 请在提交前确认 checklist.md 全部项已勾选。\n")
5
+ process.exit(0)
@@ -0,0 +1,16 @@
1
+ // session-end.ts — SessionEnd 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core SessionEndGuard,命名子类 VscodeSessionEndGuard:
3
+ // 完整治理(标记清理 + 审计结算 + Stop 兜底)——能力对齐注(2026-08-14 发现):
4
+ // bash 版薄包装 source lib/session-end.sh 后 main 因 BASH_SOURCE 守卫不执行
5
+ // (卡位 #2 完全失效);TS 版实现完整治理,与 core/qoder/trae 对齐。
6
+ // 当前无 override,命名子类承载端身份 + 未来演进位
7
+ // 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)
8
+
9
+ import { SessionEndGuard } from "../../../core/governance/session-end.js"
10
+
11
+ class VscodeSessionEndGuard extends SessionEndGuard {
12
+ // 当前无 override(清理/结算/兜底与 core 基线一致);命名子类承载端身份 + 未来演进位
13
+ }
14
+
15
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
16
+ process.exit(new VscodeSessionEndGuard(PROJECT_DIR).run())
@@ -0,0 +1,24 @@
1
+ // session-start.ts — SessionStart 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core SessionStartGuard,命名子类 VscodeSessionStartGuard:
3
+ // ① emitState(纯文本状态块)+ ② emitIndex(模板索引)= 基类默认(与 vscode bash 原文逐字一致)
4
+ // ③ emitTodoReminder / ④ emitHitlPending = override 为空(vscode bash 原文仅两段,
5
+ // 无代办/HITL 段——与 claude 同构差异,2026-08-14 实态核验)
6
+ // 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)
7
+
8
+ import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
9
+
10
+ class VscodeSessionStartGuard extends SessionStartGuard {
11
+ /** ③ vscode 版无代办刷新段 */
12
+ protected override emitTodoReminder(_state: string | null): void {
13
+ // vscode 协议: 无代办刷新段(bash 原文仅两段)
14
+ }
15
+
16
+ /** ④ vscode 版无 HITL 待审批段 */
17
+ protected override emitHitlPending(): void {
18
+ // vscode 协议: 无 HITL 检测段(bash 原文仅两段)
19
+ }
20
+ }
21
+
22
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
23
+
24
+ process.exit(new VscodeSessionStartGuard(process.env.PROJECT_DIR).run())
@@ -0,0 +1,21 @@
1
+ // stop-check.ts — Stop 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core StopRouter,命名子类 VscodeStopRouter:
3
+ // bash 原文与 core 逐字相同(2026-08-14 实态核验: vscode bash L40/L56 与 core bash L32/L48
4
+ // 均为 build_stop_context 无 echo,Q2/Q4 换行语义对齐 core TS +"\n")——当前无 override,
5
+ // 命名子类承载端身份 + 未来演进位
6
+ // 协议差异: 无(纯文本形态同 core);MAGIC_DIR 物理推导注入(对齐 bash export)
7
+
8
+ import { tryResolveMagicDir } from "../../../core/governance/common.js"
9
+ import { StopRouter } from "../../../core/governance/stop-router.js"
10
+
11
+ class VscodeStopRouter extends StopRouter {
12
+ // 当前无 override(Q0-Q4 分流与 core 基线一致);命名子类承载端身份 + 未来演进位
13
+ }
14
+
15
+ // 对齐 bash: MAGIC_DIR 从物理位置推导并 export(入口注入优先)
16
+ const inferredMagicDir = tryResolveMagicDir()
17
+ if (inferredMagicDir && !process.env.MAGIC_DIR) {
18
+ process.env.MAGIC_DIR = inferredMagicDir
19
+ }
20
+
21
+ process.exit(new VscodeStopRouter().run())
@@ -0,0 +1,21 @@
1
+ // subagent-guard.ts — SubagentStart 入口(VS Code Copilot 版,Task 3.1 继承体系)
2
+ // 继承 core SubagentGuardRouter(状态注入模板方法——能力对齐);仅 override 协议差异:
3
+ // ① 输出形态: 纯文本状态块(core/qoder 是 hookSpecificOutput JSON)
4
+
5
+ import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
6
+
7
+ class VscodeSubagentGuardRouter extends SubagentGuardRouter {
8
+ /** ① 纯文本状态块(vscode 协议,与 claude 同构) */
9
+ protected override emit(state: string): void {
10
+ const [plan, step, rounds, handoff] = state.split("::")
11
+ process.stdout.write(`[ADD SubagentStart] 子代理上下文注入:
12
+ Plan: ${plan}
13
+ Step: ${step}
14
+ 轮次: ${rounds}
15
+ handoff: ${handoff}
16
+ 遵循 ADD 规范,完成后请检查 checklist 对应项
17
+ `)
18
+ }
19
+ }
20
+
21
+ process.exit(new VscodeSubagentGuardRouter().run())
@@ -0,0 +1,15 @@
1
+ // subagent-stop.ts — SubagentStop 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core SubagentStopRouter,命名子类 VscodeSubagentStopRouter:
3
+ // 边界校验 + 审计聚合与 core 逐字同构(2026-08-14 实态核验: vscode 完整实现版
4
+ // 与 core 相同,收敛为子类)——当前无 override,命名子类承载端身份 + 未来演进位
5
+ // 协议差异: 无
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
9
+
10
+ class VscodeSubagentStopRouter extends SubagentStopRouter {
11
+ // 当前无 override(边界校验 + 审计聚合与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ const input = readHookInput()
15
+ process.exit(new VscodeSubagentStopRouter().run(input))
@@ -1,7 +1,7 @@
1
1
  # ADD 范式在 Claude Code 上的确定性运行
2
2
 
3
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)
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md) | [issue-6-report](../reports/issue-6-tool-call-throttling-report.md)
5
5
  > **Hook 参考**: https://code.claude.com/docs/zh-CN/hooks
6
6
 
7
7
  ---
@@ -17,7 +17,7 @@ Claude Code 支持 17 种事件,按频率分三档:
17
17
  | 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure、PermissionRequest、PermissionDenied |
18
18
  | 其他 | PreCompact、SubagentStart、SubagentStop、Notification、ConfigChange、WorktreeCreate/Remove |
19
19
 
20
- 配置位置:`.claude/hooks/*.sh` + `.claude/settings.json`
20
+ 配置位置:`.claude/hooks/*.mjs`(TS 源码 esbuild 烘焙零依赖产物)+ `.claude/settings.json`(command 直调 node)——2026-08-14 hook node 化实态,bash 待退役
21
21
 
22
22
  ---
23
23
 
@@ -65,13 +65,13 @@ Claude Code 的注入通道为 **stdout → additionalContext**——hook 脚本
65
65
  │ │
66
66
  │ SessionStart │
67
67
  │ ├─ detect_active_add() 扫描 plans/ 恢复 ADD 状态 │
68
- │ ├─ preload-templates.sh --index │
68
+ │ ├─ preload-templates.mjs --index │
69
69
  │ └─ stdout → additionalContext 注入 │
70
70
  │ │ │
71
71
  │ ▼ │
72
72
  │ UserPromptSubmit │
73
73
  │ ├─ match_trigger() 检测 ADD 触发词 │
74
- │ ├─ 首次命中 → preload-templates.sh --full │
74
+ │ ├─ 首次命中 → preload-templates.mjs --full │
75
75
  │ ├─ touch tpl-injected 标记 │
76
76
  │ └─ 同会话二次命中 → 短路 │
77
77
  │ │ │
@@ -1,7 +1,7 @@
1
1
  # ADD 范式在 Codex 上的确定性运行
2
2
 
3
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)
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
5
  > **Hook 参考**: https://www.runoob.com/codex/codex-hooks.html | Codex 设置 → 导入其他 agent 配置
6
6
 
7
7
  ---
@@ -44,15 +44,15 @@ Notification ─────────────────→ ⑫ 开发
44
44
 
45
45
  Codex 的注入通道为 **stdout**(与 Claude Code 兼容)。Codex 支持导入 Claude Code Hook 配置,可通过双通道架构获得完整治理:
46
46
 
47
- - **Codex 原生**(6 事件,`.codex/hooks.json` → `.codex/hooks/xxx.sh`)
48
- - **Claude Code 导入**(14 事件,`.claude/settings.json` → `.claude/hooks/xxx.sh`)——Codex 设置中开启「导入其他 agent 配置」即可。同一套脚本,两通道共享,脚本内置幂等保护。
47
+ - **Codex 原生**(5 事件,`.codex/hooks.json` → `.codex/hooks/*.mjs` node 直调——2026-08-14 node 化实态,bash 待退役)
48
+ - **Claude Code 导入**(11 事件,`.claude/settings.json` → `.claude/hooks/*.mjs`)——Codex 设置中开启「导入其他 agent 配置」即可。同一套产物,两通道共享,脚本内置幂等保护。
49
49
 
50
50
  ```
51
51
  npx add-coder init --adapter=codex
52
52
 
53
- ├──→ .codex/hooks.json (6 事件 → .codex/hooks/xxx.sh
53
+ ├──→ .codex/hooks.json (5 事件 → .codex/hooks/*.mjs
54
54
  ├──→ .codex/settings.json
55
- └──→ .claude/ ★ (含完整 14 事件 hooks + settings.json + mcp.json)
55
+ └──→ .claude/ ★ (含完整 11 事件 hooks + settings.json + mcp.json)
56
56
  ```
57
57
 
58
58
  | 注入场景 | 触发事件 | 注入内容 | 通道 |
@@ -66,7 +66,7 @@ npx add-coder init --adapter=codex
66
66
 
67
67
  | 维度 | Codex | Claude Code |
68
68
  |---|---|---|
69
- | 事件数 | 0 (原生) / 14 (导入 Claude) | 17 |
69
+ | 事件数 | 5 (原生) / 11 (导入 Claude) | 17 |
70
70
  | 配置格式 | `.codex/hooks.json` | `.claude/settings.json` |
71
71
  | Claude Hook 导入 | ✅ 原生支持(导入其他 agent 配置) | — |
72
72
  | 全局 Hook | `~/.codex/hooks.json` | `~/.claude/settings.json` |
@@ -1,7 +1,7 @@
1
1
  # ADD 范式在 Qoder CN 上的确定性运行
2
2
 
3
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)
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
5
  > **Hook 参考**: https://help.aliyun.com/zh/lingma/qoder-cn-update-log
6
6
 
7
7
  ---
@@ -17,7 +17,7 @@ Qoder CN v1.7.0(2026-07-15)升级至 30+ 事件。以下为 ADD 治理覆盖
17
17
  | 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure |
18
18
  | 其他 | SubagentStart(v1.7.0 新增)、SubagentStop(v1.7.0 新增)、Notification(v1.7.0 新增) |
19
19
 
20
- 配置位置:`.qoder/hooks/*.sh` + `.qoder/settings.json`
20
+ 配置位置:`.qoder/hooks/*.mjs`(TS 源码 esbuild 烘焙零依赖产物)+ `.qoder/settings.json`(command 直调 node)——2026-08-14 hook node 化实态,bash 待退役
21
21
 
22
22
  **关键差异**:Qoder CN 不支持 PreCompact / PermissionRequest / PermissionDenied / StopFailure / ConfigChange / Worktree——这些 Claude Code 独有事件在 Qoder 端无对应 hookpoint,相关脚本不编译到 Qoder adapter。
23
23
 
@@ -54,7 +54,7 @@ Qoder CN 的注入通道为 **stderr → 下一轮 system prompt 注入**。这
54
54
  | 开发触发 | UserPromptSubmit(首次命中) | 13 个模板全文 | stderr → 下一轮 system prompt |
55
55
  | 去重 | UserPromptSubmit(同会话后续命中) | 短路跳过 | — |
56
56
 
57
- **重要约束**:Qoder 端 `prompt-submit.sh` 已有 73 行完善的触发词路由系统(Layer 1 精准 P0 触发词 → Layer 2 开发关键词检测 → Layer 3 活跃 ADD 状态注入 + 验收幂等保护)。模板全文注入逻辑以**增量方式**插入 Layer 2 之后,禁止覆盖现有分流逻辑。
57
+ **重要约束**:Qoder 端 `prompt-submit.mjs`(TS 版,core `prompt-router.ts` 继承)已有完善的触发词路由系统(Layer 1 精准 P0 触发词 → Layer 2 开发关键词检测 → Layer 3 活跃 ADD 状态注入 + 验收幂等保护)。模板全文注入逻辑以**增量方式**插入 Layer 2 之后,禁止覆盖现有分流逻辑。
58
58
 
59
59
  ---
60
60
 
@@ -89,11 +89,11 @@ UserPromptSubmit hook additional context: ADD workflow active. ...
89
89
  | hook 注册了但不执行 | `command` 缺少 `bash` 前缀 | settings.json 所有 command 加 `bash` 前缀 |
90
90
  | hook 执行但 stdout 未被注入 | 纯文本不被 IDE 解析为 additionalContext | 改用 JSON 格式:`{"hookSpecificOutput":{"hookEventName":"...","additionalContext":"..."}}` |
91
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` 语句之前 |
92
+ | `detect_active_add` 返回空 | node PROJECT_DIR 未注入 | `tryResolveMagicDir` 注入链前置(env 优先 物理推导) |
93
93
  | additionalContext 有时注入有时不注入 | 注入代码在 Layer 1 之后——P0 触发词匹配后 `exit 0` 跳过了注入 | 将 additionalContext 注入移到 Layer 1 之前 |
94
94
 
95
95
  ### 关键设计决策
96
96
 
97
- 1. **`PROJECT_DIR` 必须最先设置**:所有 `source lib/*.sh` 之前,因为被 source 的脚本可能依赖 `${PROJECT_DIR}` 定位文件
97
+ 1. **`PROJECT_DIR` 注入链最先执行**:env 优先(QODER/QODERCN_PROJECT_DIR)→ `tryResolveMagicDir` 物理推导——入口薄壳首行,因为治理库可能依赖 `${PROJECT_DIR}` 定位文件
98
98
  2. **additionalContext 放在入口最前**:在任何 `exit` 分支之前,确保所有代码路径都能注入上下文
99
99
  3. **Stop/PreToolUse 不用 JSON**:中断/阻断类输出走 stderr 纯文本,不走 stdout JSON
@@ -1,7 +1,7 @@
1
1
  # ADD 范式在 Trae 上的确定性运行
2
2
 
3
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)
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md)
5
5
  > **Hook 参考**: https://docs.trae.cn/ide_automate-actions-with-hooks | https://docs.trae.cn/ide_hook-configuration-reference
6
6
 
7
7
  ---
@@ -42,7 +42,7 @@ Notification ─────────────────→ ⑫ 开发
42
42
 
43
43
  ## 注入通道
44
44
 
45
- Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导入 Claude Code Hook 配置,因此 `prompt-submit.sh` 和 `session-start.sh` 的 stdout 输出方式与 Claude Code 端一致。
45
+ Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导入 Claude Code Hook 配置,因此 `prompt-submit.mjs` 和 `session-start.mjs` 的 stdout 输出方式与 Claude Code 端一致(2026-08-14 node 化实态,bash 待退役)。
46
46
 
47
47
  | 注入场景 | 触发事件 | 注入内容 | 通道 |
48
48
  |---|---|---|---|
@@ -55,7 +55,7 @@ Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导
55
55
 
56
56
  | 维度 | Trae | Claude Code |
57
57
  |---|---|---|
58
- | 事件数 | 0 (原生) / 14 (导入 Claude) | 17 |
58
+ | 事件数 | 6 (原生) / 11 (导入 Claude) | 17 |
59
59
  | 配置格式 | `hooks.json` | `.claude/settings.json` |
60
60
  | Claude Hook 导入 | ✅ 原生支持 | — |
61
61
  | SessionEnd | ❌ | ✅ |
@@ -1,7 +1,7 @@
1
1
  # ADD 范式在 VS Code Copilot 上的确定性运行
2
2
 
3
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)
4
+ > **关联文档**:[add-coder-hook-full-alignment-plan-v1](../plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md) | [issue-6-report](../reports/issue-6-tool-call-throttling-report.md)
5
5
  > **Hook 参考**: https://docs.github.com/zh/copilot/concepts/agents/hooks | https://vscode.js.cn/docs/agent-customization/hooks
6
6
  > **VS Code 版本要求**: 1.127+(Agent Hook 预览),1.129+(Agent Host 架构,支持 `.claude/settings.json`)
7
7
 
@@ -19,9 +19,9 @@ VS Code Copilot 支持 10 种 Agent Hook 事件(官方 8 + Cloud Agent 2):
19
19
  | 子 agent | **SubagentStart**、**SubagentStop** |
20
20
  | 其他 | **PreCompact**、errorOccurred(Cloud Agent 专属) |
21
21
 
22
- 配置位置:`.github/hooks/*.json`(JSON 格式,`command` 字段指向 shell 脚本)
22
+ 配置位置:`.vscode/hooks/*.mjs`(TS 源码 esbuild 烘焙零依赖产物,node 直调——2026-08-14 node 化实态,bash 待退役)
23
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`——双通道共享同一套完整脚本。
24
+ **关键差异 vs Claude Code**:不支持 PostToolUseFailure / StopFailure / Notification / PermissionRequest。但 **VS Code 1.129+ Agent Host 同时读取 `.claude/settings.json`**,`npx add-coder init --adapter=vscode` 会同步产出 `.claude/` 目录,双通道共享同一套 `.mjs` 产物(node 直调)。
25
25
 
26
26
  ---
27
27
 
@@ -48,36 +48,35 @@ errorOccurred ────────────────→ ⑮ 错误分
48
48
 
49
49
  ## 注入通道
50
50
 
51
- VS Code Copilot 的注入通道为 **`.github/hooks/*.json` `command` stdout**。
51
+ VS Code Copilot 的注入通道为 **hook 配置的 `command` stdout**(node 直调 `.mjs` 产物)。
52
52
 
53
53
  VS Code 1.129+ 的 Agent Host 架构让同一项目支持多 Agent 并行运行——Copilot、Claude Code 各走各的通道:
54
54
 
55
- | 通道 | 配置位置 | 脚本路径 | 说明 |
55
+ | 通道 | 配置位置 | 产物路径 | 说明 |
56
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 直接读取 |
57
+ | **VS Code 原生** | `.vscode/hooks/` | `.vscode/hooks/*.mjs` | 14 入口 node 产物,command 直调 |
58
+ | **Agent Host (Claude)** | `.claude/settings.json` | `.claude/hooks/*.mjs` | 同一套产物,Claude Code agent 直接读取 |
59
59
 
60
60
  ```
61
61
  npx add-coder init --adapter=vscode
62
62
 
63
- ├──→ .github/hooks/*.json10 个,→ .claude/hooks/xxx.sh)
63
+ ├──→ .vscode/hooks/*.mjs14 入口,node 直调)
64
64
  ├──→ .vscode/settings.json (MCP 配置)
65
- ├──→ .vscode/hooks/lib/ (共享库)
66
65
  └──→ .claude/ ★ (Agent Host 双通道,含完整 hooks + settings.json + mcp.json)
67
66
  ```
68
67
 
69
68
  | 注入场景 | 触发事件 | 注入内容 | 配置 |
70
69
  |---|---|---|---|
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` |
70
+ | 会话启动 | SessionStart | 模板索引 | `.vscode/hooks/session-start.mjs --index` |
71
+ | 开发触发 | UserPromptSubmit | 13 个模板全文 | `.vscode/hooks/preload-templates.mjs --full --top 5 --mark` |
73
72
 
74
73
  ---
75
74
 
76
75
  ## 路径约定
77
76
 
78
- VS Code Copilot hooks 必须位于 **项目根目录** 的 `.github/hooks/` 下。`npx add-coder init --adapter vscode` 会将 JSON 文件分发到此路径,而非 `.vscode/` 子目录。
77
+ VS Code Copilot hooks 产物位于 **项目根目录** 的 `.vscode/hooks/`(14 入口 node 产物)。`npx add-coder init --adapter vscode` 会将 TS 源码烘焙分发到此路径;Agent Host(1.129+)同时读取 `.claude/` 双通道。
79
78
 
80
- **Issue #6 背景**:本端的 429 并发问题是最初触发源。轮次 1 优先交付 `session-start.json` + `user-prompt-submit.json` 两个文件,仅这两个 JSON 即可消灭模板读取风暴(429 不再触发)。
79
+ **Issue #6 背景**:本端的 429 并发问题是最初触发源。轮次 1 优先交付 `session-start` + `user-prompt-submit` 两个入口,仅这两个即可消灭模板读取风暴(429 不再触发)。
81
80
 
82
81
  ---
83
82
 
@@ -85,9 +84,9 @@ VS Code Copilot hooks 必须位于 **项目根目录** 的 `.github/hooks/` 下
85
84
 
86
85
  | 维度 | VS Code Copilot | Claude Code |
87
86
  |---|---|---|
88
- | 配置格式 | `.github/hooks/*.json` | `.claude/settings.json` |
89
- | 注入通道 | JSON command stdout | stdout → additionalContext |
90
- | 脚本路径 | `.claude/hooks/xxx.sh`(与 Claude 共享) | `.claude/hooks/xxx.sh` |
87
+ | 配置格式 | `.vscode/hooks/*.mjs`(command 直调) | `.claude/settings.json` |
88
+ | 注入通道 | command stdout | stdout → additionalContext |
89
+ | 产物路径 | `.vscode/hooks/*.mjs`(与 Claude 共享治理层) | `.claude/hooks/*.mjs` |
91
90
  | 独有事件 | errorOccurred | PermissionRequest/Denied / StopFailure / Notification / PostToolUseFailure |
92
91
  | 子 agent 启动 | ✅ SubagentStart | ✅ SubagentStart |
93
92
  | Agent Host 双通道 | ✅ `.claude/` 同步产出 | — |
@@ -96,7 +95,7 @@ VS Code Copilot hooks 必须位于 **项目根目录** 的 `.github/hooks/` 下
96
95
 
97
96
  ## 自定义 Hook 源切换
98
97
 
99
- VS Code Copilot 的 `.github/hooks/*.json` 默认指向 `.vscode/hooks/xxx.sh`(VS Code 原生完整脚本)。项目同时产出 `.claude/` 目录(含 Claude Code 完整 hook 体系 + settings.json),两套体系可切换。
98
+ VS Code Copilot 的 `.vscode/hooks/*.mjs` VS Code 原生 node 产物(14 入口)。项目同时产出 `.claude/` 目录(含 Claude Code 完整 hook 体系 + settings.json),两套体系可切换。
100
99
 
101
100
  ### 两套体系对比
102
101
 
@@ -107,21 +106,21 @@ VS Code Copilot 的 `.github/hooks/*.json` 默认指向 `.vscode/hooks/xxx.sh`
107
106
  | 环境变量 | `$PWD`(VS Code cwd=项目根) | `$CLAUDE_PROJECT_DIR` |
108
107
  | 退出码阻断 | ✅ exit 2(与 Claude 相同) | ✅ exit 2 |
109
108
  | 上下文注入 | stdout 纯文本(VS Code 格式) | stdout → additionalContext(Claude 格式) |
110
- | 共享 lib | ✅ `hooks/lib/common.sh` | ✅ `hooks/lib/common.sh` |
109
+ | 共享治理层 | ✅ core governance 内联(0 复制) | ✅ core governance 内联(0 复制) |
111
110
  | 治理能力 | 完整四路守卫 + 验收阻断 + 审计 | 完整四路守卫 + 验收阻断 + 审计(与 VS Code 版同等) |
112
111
 
113
- > **两套实现代码质量同等,能力完整,差异仅在于环境变量和输出格式。**
112
+ > **两套实现质量同等,能力完整,差异仅在于环境变量和输出格式。**
114
113
 
115
114
  ### 切换方式
116
115
 
117
- 编辑 `.github/hooks/` 下的任意 JSON 文件,将 `bash` 字段中的路径从 `.vscode/hooks/` 改为 `.claude/hooks/` 即可:
116
+ 编辑 hook 配置(settings.json / Agent Host 通道),将 `command` 中的路径从 `.vscode/hooks/` 改为 `.claude/hooks/` 即可:
118
117
 
119
118
  ```json
120
119
  // 默认(VS Code 原生,推荐)
121
- "bash": "bash .vscode/hooks/pre-tool-use.sh"
120
+ "command": "node .vscode/hooks/pre-tool-use.mjs"
122
121
 
123
- // 切换为 Claude Code 体系(如果同时使用 Claude Code 并希望统一脚本)
124
- "bash": "bash .claude/hooks/pre-tool-use.sh"
122
+ // 切换为 Claude Code 体系(如果同时使用 Claude Code 并希望统一产物)
123
+ "command": "node .claude/hooks/pre-tool-use.mjs"
125
124
  ```
126
125
 
127
126
  **切换场景建议**:
@@ -0,0 +1,47 @@
1
+ // audit-bridge.ts — AuditBridge(审计桥接,Task 8.1 事件面扩展,ADD-7 自动化)
2
+ // 设计(Spec §4 嵌入式三层,回流 R1):
3
+ // ① 主路径(现状不动): 拦截事件 writeHookEvent(jsonl) → MCP 常驻 fs.watch 消费 → devOperation 落库
4
+ // ② 事件面扩展(本类): post-tool-use 文件写入 → 写 hook 事件(decision="write")→ 同一 jsonl 主路径
5
+ // → MCP 常驻侧自动消费落库(幂等 dedupKey: hook::ts::planKeyword + decision + cmd)
6
+ // ③ 自然演化: Claude mcp_tool 直调 record_dev_operation 由 handlerTypes 维度声明驱动(TOML 一行切换)
7
+ //
8
+ // 与 writeHookEvent 的关系: 复用其 jsonl 写入 + 轮转逻辑(event.file 真源),
9
+ // 但路径必须用本类 magicDir 构造参数(writeHookEvent 默认 env.MAGIC_DIR || ".qoder"
10
+ // 兜底——core/adapter 入口多数未回写 env.MAGIC_DIR,依赖 env 会错写 .qoder/reports)。
11
+
12
+ import { writeHookEvent } from "./notify.js"
13
+
14
+ /**
15
+ * 审计桥接:post-tool-use 文件写入事件面扩展。
16
+ * emit() 幂等——同文件同秒重复写入由 MCP 消费端 dedupKey 去重,落库唯一。
17
+ */
18
+ export class AuditBridge {
19
+ private readonly projectDir: string
20
+ private readonly magicDir: string
21
+
22
+ constructor(projectDir: string, magicDir: string) {
23
+ this.projectDir = projectDir
24
+ this.magicDir = magicDir
25
+ }
26
+
27
+ /**
28
+ * 文件写入审计事件(decision="write")。
29
+ * @param filePath 被写入文件路径(绝对/相对均可,MCP 消费端以 cmd 为 targetId)
30
+ */
31
+ emit(filePath: string): void {
32
+ if (!filePath || filePath === "") return
33
+ const planKeyword = this.extractPlanKeyword(filePath)
34
+ writeHookEvent("post-tool-use", "write", filePath, "文件写入审计(ADD-7 自动化)", planKeyword, "none", "", this.magicDir)
35
+ }
36
+
37
+ /**
38
+ * 从写入路径提取 planKeyword(plans/specs/reviews 目录下命名规范文件):
39
+ * xxx-plan-v1.md / xxx-add-route-v1.md / xxx-review-v1.md → xxx-{suffix}-vN
40
+ * 其余路径 → "unknown"(与拦截事件缺省语义一致)。
41
+ */
42
+ private extractPlanKeyword(filePath: string): string {
43
+ void this.projectDir
44
+ const m = filePath.match(/([^/]+-(?:plan|add-route|review)-v\d+)\.md$/)
45
+ return m ? m[1] : "unknown"
46
+ }
47
+ }