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,85 @@
1
+ // post-tool-use.ts — PostToolUse 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core PostToolRouter,命名子类 CodexPostToolRouter(codex 私有协议差异 override):
3
+ // ① isFileTool: +SearchReplace(codex 支持 file_path/path 双字段)
4
+ // ② extractFilePath: file_path ?? path(codex 工具输入形态)
5
+ // ③ emitAuditReminder: 简化文本(无 ADD-7 字样,bash 原文逐字)
6
+ // ④ emitBashDone: lint/typecheck/test 闭环提示(bash 原文逐字)
7
+ // ⑤ applyPatchMatcher: 解析 `*** Add|Update|Delete File:` 行逐文件 report(codex apply_patch 特有)
8
+ // ⑥ docGuardText: 「请检查双向链接与 Plan/Spec 状态」(bash 原文逐字)
9
+ // 入口差异: PROJECT_DIR=git toplevel(codex 大文件协议)+ MAGIC_DIR 注入
10
+
11
+ import { execSync } from "node:child_process"
12
+ import { jsonGet, readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
13
+ import { PostToolRouter } from "../../../core/governance/post-tool-router.js"
14
+
15
+ class CodexPostToolRouter extends PostToolRouter {
16
+ /** ① codex 文件写工具含 SearchReplace */
17
+ protected override isFileTool(toolName: string): boolean {
18
+ return toolName === "Edit" || toolName === "Write" || toolName === "SearchReplace"
19
+ }
20
+
21
+ /** ② file_path ?? path(codex 工具输入形态) */
22
+ protected override extractFilePath(input: string): string {
23
+ const fp = jsonGet(input, "file_path")
24
+ if (fp !== "") return fp
25
+ return jsonGet(input, "path")
26
+ }
27
+
28
+ /** ③ 审计提醒(codex bash 原文逐字——无 ADD-7 字样) */
29
+ protected override emitAuditReminder(filePath: string): string {
30
+ return `[ADD PostToolUse] 文件已写入: ${filePath};请执行 record_dev_operation 落库审计。\n`
31
+ }
32
+
33
+ /** ④ Bash 增强(codex bash 原文逐字——lint/typecheck/test 闭环) */
34
+ protected override emitBashDone(): string {
35
+ return "[ADD PostToolUse] Bash 命令完成;若产生 lint/typecheck/test 错误,请在本轮闭环。\n"
36
+ }
37
+
38
+ /** ⑤ apply_patch: 解析 `*** Add|Update|Delete File:` 行逐文件 report(codex 特有) */
39
+ protected override applyPatchMatcher(input: string): void {
40
+ let patchCommand = ""
41
+ if (input.trim() !== "") {
42
+ try {
43
+ const parsed = JSON.parse(input) as { tool_input?: { command?: unknown } }
44
+ patchCommand = typeof parsed.tool_input?.command === "string" ? parsed.tool_input.command : ""
45
+ } catch {
46
+ patchCommand = ""
47
+ }
48
+ }
49
+ const patchPaths: string[] = []
50
+ for (const line of patchCommand.split("\n")) {
51
+ const m = line.match(/^\*\*\* (Add|Update|Delete) File: (.+)$/)
52
+ if (m) patchPaths.push(m[2])
53
+ }
54
+ for (const p of patchPaths) this.reportFile(p)
55
+ }
56
+
57
+ /** 对齐 bash _report_file:ADD 文档守卫 + 审计提醒(codex 版) */
58
+ private reportFile(filePath: string): void {
59
+ if (filePath === "") return
60
+ if (/(^|\/)\.codex\/(plans|specs|reviews)\//.test(filePath)) {
61
+ this.emitLine(`[ADD PostToolUse] ADD 文档已写入: ${filePath};请检查双向链接与 Plan/Spec 状态。\n`)
62
+ }
63
+ this.emitLine(`[ADD PostToolUse] 文件已写入: ${filePath};请执行 record_dev_operation 落库审计。\n`)
64
+ // Task 8.1: apply_patch 也是文件写入路径——接入审计桥接(ADD-7 自动化)
65
+ this.emitWriteEvent(filePath)
66
+ }
67
+ }
68
+
69
+ // 对齐 bash: git rev-parse --show-toplevel || pwd
70
+ function resolveProjectDir(): string {
71
+ try {
72
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim()
73
+ } catch {
74
+ return process.cwd()
75
+ }
76
+ }
77
+ const PROJECT_DIR = resolveProjectDir()
78
+ process.env.PROJECT_DIR = PROJECT_DIR
79
+ process.env.MAGIC_DIR = tryResolveMagicDir() || ".codex"
80
+
81
+ const input = readHookInput()
82
+ const toolName = jsonGet(input, "tool_name")
83
+ if (toolName === "") process.exit(0)
84
+
85
+ process.exit(new CodexPostToolRouter(PROJECT_DIR, process.env.MAGIC_DIR).run(input, toolName))
@@ -0,0 +1,20 @@
1
+ // pre-compact.ts — 上下文压缩前 ADD 状态保存(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core PreCompactGuard,命名子类 CodexPreCompactGuard:
3
+ // ① 状态保存到恢复标记 + ② tpl 标记清理 = 基类(与 codex bash 原文逐字同构,
4
+ // 2026-08-14 实态核验——手写版逻辑与 core 基类完全一致,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(codex 小文件无 git toplevel,bash 原文逐字)
6
+ // + MAGIC_DIR 唯一解析链注入(.codex 兜底)
7
+
8
+ import { tryResolveMagicDir } from "../../../core/governance/common.js"
9
+ import { PreCompactGuard } from "../../../core/governance/pre-compact-guard.js"
10
+
11
+ class CodexPreCompactGuard extends PreCompactGuard {
12
+ // 当前无 override(状态保存/恢复清单/tpl 清理与 core 基线一致);命名子类承载端身份 + 未来演进位
13
+ }
14
+
15
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
16
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
17
+ const inferred = tryResolveMagicDir()
18
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
19
+
20
+ process.exit(new CodexPreCompactGuard().run())
@@ -0,0 +1,141 @@
1
+ // pre-tool-use.ts — PreToolUse 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core PreToolUseGuard,命名子类 CodexPreToolUseGuard(codex 私有协议差异 override):
3
+ // ① 检测链: adapterName="codex" → [guard.adapter_detectors] codex 链(同 core 正则 + codex reason)
4
+ // ② onBlock/onSensitiveDeny/onHitlDeny: JSON **deny** 形态(core 是 ask;codex bash 原文 _deny 逐字,
5
+ // stderr `⛔ [ADD PreToolUse] reason` + logBlock + 事件 + exit 2)
6
+ // ③ onOtherTool: apply_patch 特有(解析 `*** Add|Update|Delete File:` 路径 → guardFilePath 逐文件 + markDevAction)
7
+ // ④ ~~sensitiveFileRegex / hitlExemptReviews / hitlMarkers~~ → Task 9.4.4 三项上提 core 默认(2026-08-14)
8
+ // ⑤ noPlanHint: true——无 Plan 仅 stderr 提示后继续(codex 协议差异保留)
9
+ // 入口差异: PROJECT_DIR=git toplevel + cd 统一 cwd + MAGIC_DIR 注入
10
+
11
+ import { execSync } from "node:child_process"
12
+ import { existsSync } from "node:fs"
13
+ import { join } from "node:path"
14
+ import { jsonGet, markDevAction, readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
15
+ import { writeHookEvent } from "../../../core/governance/notify.js"
16
+ import { PreToolUseGuard } from "../../../core/governance/pre-tool-guard.js"
17
+
18
+ class CodexPreToolUseGuard extends PreToolUseGuard {
19
+ constructor(projectDir: string, magicDir: string) {
20
+ super(projectDir, magicDir, "codex")
21
+ }
22
+
23
+ /** ② §A 阻断: JSON deny(core 是 ask——codex bash 原文 _deny 逐字) */
24
+ protected override onBlock(blocked: { reason: string; stderr: string }, command: string): number {
25
+ process.stderr.write(`⛔ [ADD PreToolUse] ${blocked.reason}\n`)
26
+ process.stdout.write(
27
+ JSON.stringify({
28
+ hookSpecificOutput: {
29
+ hookEventName: "PreToolUse",
30
+ permissionDecision: "deny",
31
+ permissionDecisionReason: blocked.reason,
32
+ },
33
+ }) + "\n"
34
+ )
35
+ this.logBlock("检测器链", command)
36
+ writeHookEvent("pre-tool-use", "deny", command, blocked.reason, this.planKeyword, this.planStatus)
37
+ return 2
38
+ }
39
+
40
+ /** ② 敏感文件: JSON deny + 事件 + exit 2(core 无事件) */
41
+ protected override onSensitiveDeny(filePath: string): number {
42
+ const reason = `敏感文件受保护,禁止写入: ${filePath}`
43
+ process.stderr.write(`⛔ [ADD PreToolUse] ${reason}\n`)
44
+ process.stdout.write(
45
+ JSON.stringify({
46
+ hookSpecificOutput: {
47
+ hookEventName: "PreToolUse",
48
+ permissionDecision: "deny",
49
+ permissionDecisionReason: reason,
50
+ },
51
+ }) + "\n"
52
+ )
53
+ this.logBlock("sensitive-file", filePath)
54
+ writeHookEvent("pre-tool-use", "deny", `Write ${filePath}`, reason, this.planKeyword, this.planStatus)
55
+ return 2
56
+ }
57
+
58
+ /** ② HITL: JSON deny + 事件 + exit 2(core 是 exit 0 放行——codex 阻断) */
59
+ protected override onHitlDeny(toolName: string, filePath: string, tongyiMarker: string): number {
60
+ const reason = `HITL 未同意: ${filePath}。请先 create_hitl,再由人工 update_hitl(TONGYI)。`
61
+ process.stderr.write(`⛔ [ADD PreToolUse] ${reason}\n`)
62
+ process.stdout.write(
63
+ JSON.stringify({
64
+ hookSpecificOutput: {
65
+ hookEventName: "PreToolUse",
66
+ permissionDecision: "deny",
67
+ permissionDecisionReason: reason,
68
+ },
69
+ }) + "\n"
70
+ )
71
+ this.logBlock("hitl", filePath)
72
+ writeHookEvent("pre-tool-use", "deny", `${toolName} ${filePath}`, `HITL 未同意: ${tongyiMarker}`, this.planKeyword, this.planStatus)
73
+ return 2
74
+ }
75
+
76
+ /** ③ apply_patch: 解析 patch 路径 → guardFilePath 逐文件 + markDevAction(codex 特有) */
77
+ protected override onOtherTool(input: string, toolName: string): number {
78
+ if (toolName !== "apply_patch") return 0
79
+ let patchCommand = ""
80
+ if (input.trim() !== "") {
81
+ try {
82
+ const parsed = JSON.parse(input) as { tool_input?: { command?: unknown } }
83
+ patchCommand = typeof parsed.tool_input?.command === "string" ? parsed.tool_input.command : ""
84
+ } catch {
85
+ patchCommand = ""
86
+ }
87
+ }
88
+ const patchPaths: string[] = []
89
+ for (const line of patchCommand.split("\n")) {
90
+ const m = line.match(/^\*\*\* (Add|Update|Delete) File: (.+)$/)
91
+ if (m) patchPaths.push(m[2])
92
+ }
93
+ for (const p of patchPaths) {
94
+ if (p !== "") {
95
+ // Task 9.4 修复: guardFilePath 返回阻断码(敏感/HITL),apply_patch 路径必须透传 exit
96
+ const guardCode = this.guardFilePath(p, "apply_patch")
97
+ if (guardCode !== 0) return guardCode
98
+ }
99
+ }
100
+ markDevAction()
101
+ return 0
102
+ }
103
+
104
+ /** ⑦ 无 Plan 仅提示后继续(codex bash 原文) */
105
+ protected override noPlanHint(): boolean {
106
+ return true
107
+ }
108
+ }
109
+ // 注: ④ sensitiveFileRegex / ⑤ hitlExemptReviews / ⑥ hitlMarkers override 已删除——
110
+ // 2026-08-14 Task 9.4.4 三项上提 core 默认(锚定正则 / 仅 -runtime 豁免 / 双哨兵),收敛无 diff。
111
+
112
+ // 对齐 bash: git rev-parse --show-toplevel || pwd + cd
113
+ function resolveProjectDir(): string {
114
+ try {
115
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim()
116
+ } catch {
117
+ return process.cwd()
118
+ }
119
+ }
120
+ const PROJECT_DIR = resolveProjectDir()
121
+ process.env.PROJECT_DIR = PROJECT_DIR
122
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
123
+ const MAGIC_DIR = tryResolveMagicDir() || ".codex"
124
+ process.env.MAGIC_DIR = MAGIC_DIR
125
+ process.chdir(PROJECT_DIR) // 统一 cwd,避免从 repo 子目录启动时写偏审计文件
126
+
127
+ const input = readHookInput()
128
+ const toolName = jsonGet(input, "tool_name")
129
+ // Task 9.4 修复: Bash 与 apply_patch 的 command 均在 tool_input——分流依据 tool_name
130
+ // (原 jsonGet 顶层 command 判断会把 apply_patch 的 patch body 误当 Bash 命令走 §A)
131
+
132
+ const guard = new CodexPreToolUseGuard(PROJECT_DIR, MAGIC_DIR)
133
+
134
+ if (toolName === "Bash") {
135
+ process.exit(guard.runSectionA(input))
136
+ } else if (toolName === "apply_patch") {
137
+ // apply_patch 的 payload 在 tool_input.command——只走 §C matcher(避免把 patch body 误判成 shell)
138
+ process.exit(guard.runSectionC(input, toolName))
139
+ } else {
140
+ process.exit(guard.runSectionB(input, toolName))
141
+ }
@@ -0,0 +1,38 @@
1
+ // prompt-submit.ts — UserPromptSubmit 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core PromptRouter(L1/L2/L3 模板方法);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① extractPrompt = 基类默认(jsonGet 与 bash jq 同语义)
4
+ // ② acceptedText = 基类默认(codex bash 原文 6 行含 ★ 同步检查,与 core 逐字一致)
5
+ // ③ onAccepted: 输出 review-checklist 占位文本(codex bash 调占位脚本;core 是子进程 stdio ignore)
6
+ // ④ layer2ToStderr = 基类默认 true(codex bash 原文 Layer2 走 stderr)
7
+ // ⑤ layer3Text/日报 = 基类默认(codex bash 原文与 core 逐字一致)
8
+ // 入口差异: PROJECT_DIR=git toplevel + cd 统一 cwd(codex 大文件协议)+ MAGIC_DIR 注入
9
+
10
+ import { execSync } from "node:child_process"
11
+ import { readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
12
+ import { PromptRouter } from "../../../core/governance/prompt-router.js"
13
+
14
+ class CodexPromptRouter extends PromptRouter {
15
+ /** ③ 验收后置: 输出 review-checklist 占位文本(codex bash 调占位脚本逐字) */
16
+ protected override onAccepted(_handoff: string, _addRoute: string): void {
17
+ process.stdout.write("[ADD ReviewChecklist] 请在提交前确认 checklist.md 全部项已勾选。\n")
18
+ }
19
+
20
+ // 其余(extractPrompt/acceptedText/layer2ToStderr/layer3Text/dailyWarnText)与 core 基线一致
21
+ }
22
+
23
+ // 对齐 bash: git rev-parse --show-toplevel || pwd + cd
24
+ function resolveProjectDir(): string {
25
+ try {
26
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim()
27
+ } catch {
28
+ return process.cwd()
29
+ }
30
+ }
31
+ const PROJECT_DIR = resolveProjectDir()
32
+ process.env.PROJECT_DIR = PROJECT_DIR
33
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
34
+ process.env.MAGIC_DIR = tryResolveMagicDir() || ".codex"
35
+ process.chdir(PROJECT_DIR) // 对齐 bash cd "$PROJECT_DIR"
36
+
37
+ const input = readHookInput()
38
+ process.exit(new CodexPromptRouter(process.env.MAGIC_DIR).run(input))
@@ -0,0 +1,5 @@
1
+ // review-checklist.ts — Review 检查清单校验(Codex 版)
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,19 @@
1
+ // session-end.ts — SessionEnd 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core SessionEndGuard,命名子类 CodexSessionEndGuard:
3
+ // ① 清理标记(tpl + dev)+ ② 审计结算(stderr)+ ③ Stop 兜底 = 基类
4
+ // (2026-08-14 实态核验: codex 手写版与 core SessionEndGuard 逐字同构,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(codex 小文件无 git toplevel)+ MAGIC_DIR 注入
6
+
7
+ import { tryResolveMagicDir } from "../../../core/governance/common.js"
8
+ import { SessionEndGuard } from "../../../core/governance/session-end.js"
9
+
10
+ class CodexSessionEndGuard extends SessionEndGuard {
11
+ // 当前无 override(清理/结算/兜底与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
15
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
16
+ const inferred = tryResolveMagicDir()
17
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
18
+
19
+ process.exit(new CodexSessionEndGuard(process.env.PROJECT_DIR).run())
@@ -0,0 +1,45 @@
1
+ // session-start.ts — SessionStart 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core SessionStartGuard,命名子类 CodexSessionStartGuard:
3
+ // ① emitState/emitTodoReminder/emitHitlPending = 基类默认(bash 原文逐字一致)
4
+ // ② emitIndex override: 自定义列表格式(codex bash 原文——`## ADD 可用模板清单` + `- f` 简单列出,
5
+ // 非 PreloadTemplates 表格格式)
6
+ // 入口差异: PROJECT_DIR=git toplevel(codex 大文件协议)+ MAGIC_DIR 注入(.codex 兜底)
7
+
8
+ import { existsSync, readdirSync } from "node:fs"
9
+ import { join } from "node:path"
10
+ import { execSync } from "node:child_process"
11
+ import { tryResolveMagicDir } from "../../../core/governance/common.js"
12
+ import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
13
+
14
+ class CodexSessionStartGuard extends SessionStartGuard {
15
+ /** ② 模板索引: 自定义列表格式(codex bash 原文逐字,非表格) */
16
+ protected override emitIndex(): void {
17
+ const TEMPLATES_DIR = join(this.projectDir, this.magicDir, "templates")
18
+ if (existsSync(TEMPLATES_DIR)) {
19
+ process.stdout.write("## ADD 可用模板清单\n")
20
+ try {
21
+ for (const f of readdirSync(TEMPLATES_DIR)) {
22
+ if (f.endsWith(".md")) process.stdout.write(`- ${f}\n`)
23
+ }
24
+ } catch {
25
+ /* ignore(对齐 bash 读取失败跳过) */
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ // 对齐 bash: git rev-parse --show-toplevel || pwd
32
+ function resolveProjectDir(): string {
33
+ try {
34
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim()
35
+ } catch {
36
+ return process.cwd()
37
+ }
38
+ }
39
+ const PROJECT_DIR = resolveProjectDir()
40
+ process.env.PROJECT_DIR = PROJECT_DIR
41
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
42
+ const MAGIC_DIR = tryResolveMagicDir() || ".codex"
43
+ process.env.MAGIC_DIR = MAGIC_DIR
44
+
45
+ process.exit(new CodexSessionStartGuard(PROJECT_DIR).run())
@@ -0,0 +1,59 @@
1
+ // stop-check.ts — Stop 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core StopRouter,命名子类 CodexStopRouter:
3
+ // ① Q0/Q1/Q2 = 基类默认(stderr + exit 语义,与 codex bash 原文逐字一致)
4
+ // ② emitQ3 override: {systemMessage} JSON(codex 私有协议——plan/approval/tasks 字段)
5
+ // ③ emitQ4Pass override: {systemMessage} JSON(codex stdout 契约——Q4 通过形态;
6
+ // ~~q4Check override~~ → 2026-08-14 Task 9.4.4④ 删除,回归 core 双维度组合(DB 进度 + checklist 质量))
7
+ // 入口差异: PROJECT_DIR=git toplevel(codex 大文件协议)+ stopHookActive 续跑保护 + MAGIC_DIR 注入
8
+
9
+ import { execSync } from "node:child_process"
10
+ import { readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
11
+ import { StopRouter } from "../../../core/governance/stop-router.js"
12
+
13
+ /** 对齐 bash jq -nc --arg message '{systemMessage: $message}'(codex 私有协议) */
14
+ function systemMessage(message: string): string {
15
+ return JSON.stringify({ systemMessage: message })
16
+ }
17
+
18
+ class CodexStopRouter extends StopRouter {
19
+ /** ② Q3: systemMessage JSON(codex 协议——approval/tasks 字段,bash 原文逐字) */
20
+ protected override emitQ3(plan: string, approval: string, tasks: string): number {
21
+ process.stdout.write(systemMessage(`[ADD Stop] Plan: ${plan};approval: ${approval};tasks: ${tasks}。本次无代码改动。`) + "\n")
22
+ return 0
23
+ }
24
+
25
+ /** ③ Q4 通过: systemMessage JSON(codex stdout 契约——Task 9.4.4④ 新增,
26
+ * 原 q4Check 完成分支的 systemMessage 语义保留到协议层) */
27
+ protected override emitQ4Pass(): number {
28
+ process.stdout.write(systemMessage("[ADD Stop] ✅ 验收通过——checklist 全部勾选,devlog 已记录。DB Plan tasks 已完成;可进入 Review/closure。") + "\n")
29
+ return 0
30
+ }
31
+ }
32
+
33
+ // 对齐 bash: git rev-parse --show-toplevel || pwd
34
+ function resolveProjectDir(): string {
35
+ try {
36
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf-8" }).trim()
37
+ } catch {
38
+ return process.cwd()
39
+ }
40
+ }
41
+ const PROJECT_DIR = resolveProjectDir()
42
+ process.env.PROJECT_DIR = PROJECT_DIR
43
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
44
+ process.env.MAGIC_DIR = tryResolveMagicDir() || ".codex"
45
+
46
+ const input = readHookInput()
47
+ let stopHookActive = false
48
+ if (input.trim() !== "") {
49
+ try {
50
+ const parsed = JSON.parse(input) as { stop_hook_active?: unknown }
51
+ stopHookActive = parsed.stop_hook_active === true
52
+ } catch {
53
+ stopHookActive = false
54
+ }
55
+ }
56
+ // codex 续跑保护: 内部 Stop 触发时跳过(bash 原文逐字)
57
+ if (stopHookActive) process.exit(0)
58
+
59
+ process.exit(new CodexStopRouter().run())
@@ -0,0 +1,22 @@
1
+ // subagent-guard.ts — SubagentStart 入口(Codex 版,Task 3.1 继承体系)
2
+ // 继承 core SubagentGuardRouter(状态注入模板方法——能力对齐):
3
+ // 能力对齐注: 原 codex 为弱版(事件提示空话),已对齐强版(状态注入)
4
+ // ① 输出形态: 纯文本状态块(core/qoder 是 hookSpecificOutput JSON)
5
+
6
+ import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
7
+
8
+ class CodexSubagentGuardRouter extends SubagentGuardRouter {
9
+ /** ① 纯文本状态块(codex 协议,与 claude 同构) */
10
+ protected override emit(state: string): void {
11
+ const [plan, step, rounds, handoff] = state.split("::")
12
+ process.stdout.write(`[ADD SubagentStart] 子代理上下文注入:
13
+ Plan: ${plan}
14
+ Step: ${step}
15
+ 轮次: ${rounds}
16
+ handoff: ${handoff}
17
+ 遵循 ADD 规范,完成后请检查 checklist 对应项
18
+ `)
19
+ }
20
+ }
21
+
22
+ process.exit(new CodexSubagentGuardRouter().run())
@@ -0,0 +1,20 @@
1
+ // subagent-stop.ts — SubagentStop 入口(Codex 版,Task 7.1 继承体系)
2
+ // 继承 core SubagentStopRouter,命名子类 CodexSubagentStopRouter:
3
+ // ① 边界校验 + deliverables 越界检查 + 审计聚合 = 基类(与 codex bash 原文逐字同构,
4
+ // 2026-08-14 实态核验——手写版逻辑与 core 基类完全一致,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(codex 小文件无 git toplevel)+ MAGIC_DIR 注入
6
+
7
+ import { readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
8
+ import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
9
+
10
+ class CodexSubagentStopRouter extends SubagentStopRouter {
11
+ // 当前无 override(边界校验 + 审计聚合与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
15
+ // 对齐 bash export MAGIC_DIR=".codex":唯一解析链(注入优先 → 物理推导),推导失败回退 .codex
16
+ const inferred = tryResolveMagicDir()
17
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
18
+
19
+ const input = readHookInput()
20
+ process.exit(new CodexSubagentStopRouter().run(input))
@@ -1 +1,67 @@
1
- {"hooks":{"SessionStart":[{"command":"bash .codex/hooks/session-start.sh"}],"UserPromptSubmit":[{"command":"bash .codex/hooks/prompt-submit.sh"}],"PreToolUse":[{"command":"bash .codex/hooks/pre-tool-use.sh"}],"PostToolUse":[{"command":"bash .codex/hooks/post-tool-use.sh"}],"Stop":[{"command":"bash .codex/hooks/stop-check.sh"}],"Notification":[{"matcher":"result","command":"bash .codex/hooks/notification.sh"}]}}
1
+ {
2
+ "description": "ADD governance hooks for Codex.",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "matcher": "^(startup|resume|clear|compact)$",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/session-start.mjs\"",
11
+ "statusMessage": "Loading ADD state",
12
+ "additionalContextLimit": 5000
13
+ }
14
+ ]
15
+ }
16
+ ],
17
+ "UserPromptSubmit": [
18
+ {
19
+ "hooks": [
20
+ {
21
+ "type": "command",
22
+ "command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/prompt-submit.mjs\"",
23
+ "statusMessage": "Routing ADD workflow"
24
+ }
25
+ ]
26
+ }
27
+ ],
28
+ "PreToolUse": [
29
+ {
30
+ "matcher": "^(Bash|apply_patch|Edit|Write)$",
31
+ "hooks": [
32
+ {
33
+ "type": "command",
34
+ "command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/pre-tool-use.mjs\"",
35
+ "statusMessage": "Checking ADD policy",
36
+ "timeout": 30
37
+ }
38
+ ]
39
+ }
40
+ ],
41
+ "PostToolUse": [
42
+ {
43
+ "matcher": "^(Bash|apply_patch|Edit|Write)$",
44
+ "hooks": [
45
+ {
46
+ "type": "command",
47
+ "command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/post-tool-use.mjs\"",
48
+ "statusMessage": "Recording ADD result",
49
+ "timeout": 30
50
+ }
51
+ ]
52
+ }
53
+ ],
54
+ "Stop": [
55
+ {
56
+ "hooks": [
57
+ {
58
+ "type": "command",
59
+ "command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/stop-check.mjs\"",
60
+ "statusMessage": "Checking ADD closure",
61
+ "timeout": 30
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ }
@@ -0,0 +1,34 @@
1
+ // doc-format-guard.ts — schema.json 驱动的 ADD 文档格式守卫(Qoder CN 版,Task 4.1 继承体系)
2
+ // 继承 core DocFormatGuard,命名子类 QoderDocFormatGuard——六端实态核验(2026-08-14):
3
+ // 探测链与 core 数据驱动同语义(PLAN 元信息 → 一、Plan 概述 → 四、Handoff → simple-plan,
4
+ // 无 claude 的 Handoff 前置差异)→ 当前无 override(空子类承载端身份 + 未来演进位);
5
+ // 文本漂移(「doc-format-guard.sh」残留)已在 core 修正(TS 时代无 .sh)。
6
+ // 协议差异仅剩: PROJECT_DIR 注入链(qoder-env)
7
+
8
+ import { readFileSync } from "node:fs"
9
+ import { DocFormatGuard } from "../../../core/governance/doc-format-guard.js"
10
+ import { injectProjectDir } from "./lib/qoder-env.js"
11
+
12
+ /**
13
+ * Qoder DocFormatGuard(命名子类):
14
+ * 当前无 override(探测链同 core);未来 qoder 协议演进(如 hookSpecificOutput 新字段)
15
+ * 在此扩展,不改 core 基类。
16
+ */
17
+ class QoderDocFormatGuard extends DocFormatGuard {
18
+ constructor(projectDir: string, magicDir: string) {
19
+ super(projectDir, magicDir)
20
+ }
21
+ }
22
+
23
+ injectProjectDir()
24
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
25
+ const MAGIC_DIR = process.env.MAGIC_DIR || ".qoder"
26
+
27
+ const guard = new QoderDocFormatGuard(PROJECT_DIR, MAGIC_DIR)
28
+ let raw = ""
29
+ try {
30
+ raw = readFileSync(0, "utf-8")
31
+ } catch {
32
+ raw = ""
33
+ }
34
+ process.exitCode = guard.run(raw)
@@ -0,0 +1,61 @@
1
+ // lib/context-inject.ts — 上下文注入模板(Qoder CN 版,Task 4.1 diff 合并 core)
2
+ // R2 回流: context-inject diff 已合并——7 象限文本真源 = hook-context-rules.toml
3
+ // ([context.quadrants] core 基线 + [context.adapter_quadrants] qoder 差异)
4
+ // 差异保留(行为等价红线):
5
+ // has_add_dev_unclosed: qoder 版含「(不要等下次会话)」文本差异
6
+ // ~~{{info}} 字面量不插值~~ → 2026-08-14 Task 9.4.1 修复: 回归统一 replaceAll 插值语义
7
+ // (bash <<'EOF' 单引号 heredoc 缺陷照搬——issues 参数实际不生效,已修复)
8
+
9
+ import { context } from "../../../../core/governance/rules.js"
10
+
11
+ /** 象限条目(rules.context.quadrants / adapter_quadrants 结构) */
12
+ interface Quadrant {
13
+ adapter?: string
14
+ id: string
15
+ consumed: boolean
16
+ text: string
17
+ }
18
+
19
+ /** 结构化 SessionStart JSON 注入(与 core buildSessionStartJson 逐字一致) */
20
+ export function buildSessionStartJson(
21
+ plan: string,
22
+ step: string,
23
+ round: string,
24
+ handoff: string
25
+ ): string {
26
+ return `{
27
+ "continue": true,
28
+ "hookSpecificOutput": {
29
+ "hookEventName": "SessionStart",
30
+ "additionalContext": "上次 ADD 流程未完成:\\n Plan: ${plan}\\n 轮次: ${round}\\n 当前 Step: ${step} (add-route)\\n 恢复命令: query_audit_logs({ planKeyword: '${plan}' })\\n handoff: ${handoff}"
31
+ }
32
+ }
33
+ `
34
+ }
35
+
36
+ /** 象限文本索引(adapter 差异优先,回退 core 基线) */
37
+ const QUADRANTS: Map<string, Quadrant> = new Map()
38
+ for (const q of ((context.adapter_quadrants as unknown as Quadrant[]) ?? []).filter((x) => x.adapter === "qoder")) {
39
+ QUADRANTS.set(q.id, q)
40
+ }
41
+ for (const q of ((context.quadrants as unknown as Quadrant[]) ?? [])) {
42
+ if (!QUADRANTS.has(q.id)) QUADRANTS.set(q.id, q)
43
+ }
44
+
45
+ /**
46
+ * Stop 七象限分流 few-shot 上下文(Qoder CN 版)。
47
+ * Task 9.4.1 修复: has_add_dev_unclosed 的 {{info}} 正常插值(原 bash <<'EOF' 缺陷照搬——不 replace)
48
+ */
49
+ export function buildStopContext(quadrant: string, info: string): string {
50
+ const q = QUADRANTS.get(quadrant)
51
+ if (!q) return ""
52
+ return q.text.replaceAll("{{info}}", info)
53
+ }
54
+
55
+ /** 写操作前置守卫上下文(与 core buildPretoolContext 逐字对齐) */
56
+ export function buildPretoolContext(plan: string, round: string): string {
57
+ return `[ADD PreToolUse] 当前 Plan: ${plan},轮次: ${round}。
58
+ 本次写入应属于 ADD Step 3 代码实现阶段。
59
+ 完成后执行 record_dev_operation 记录审计。
60
+ `
61
+ }
@@ -0,0 +1,23 @@
1
+ // lib/qoder-env.ts — Qoder CN 私有环境解析(PROJECT_DIR 注入链)
2
+ // 契约: qoder 端所有 hook 的 PROJECT_DIR 来源 = ${CLAUDE_PROJECT_DIR:-${QODER_PROJECT_DIR:-${QODERCN_PROJECT_DIR:-$PWD}}}
3
+ // (对齐 qoder state-detect.sh 宿主注入链,与 claude-env.ts 同构)
4
+
5
+ /** 解析项目根目录(对齐 bash ${CLAUDE_PROJECT_DIR:-${QODER_PROJECT_DIR:-${QODERCN_PROJECT_DIR:-$PWD}}}) */
6
+ export function resolveQoderProjectDir(): string {
7
+ return (
8
+ process.env.CLAUDE_PROJECT_DIR ||
9
+ process.env.QODER_PROJECT_DIR ||
10
+ process.env.QODERCN_PROJECT_DIR ||
11
+ process.cwd()
12
+ )
13
+ }
14
+
15
+ /**
16
+ * 注入 PROJECT_DIR 到 process.env(对齐 bash export PROJECT_DIR)。
17
+ * 入口统一调用;后续 hash/路径计算均消费该值。
18
+ */
19
+ export function injectProjectDir(): string {
20
+ const dir = resolveQoderProjectDir()
21
+ process.env.PROJECT_DIR = dir
22
+ return dir
23
+ }
@@ -0,0 +1,5 @@
1
+ // lib/review-checklist.ts — 验收 Review 模式(Qoder CN 版,Task 4.1 收敛)
2
+ // R2 回流: review-checklist 逻辑已收敛 core governance/review-checklist-guard.ts
3
+ // (checkReviewQuality 逐字迁移 + specRoot 参数化);本文件仅 re-export 保持 import 兼容。
4
+
5
+ export { checkReviewQuality } from "../../../../core/governance/review-checklist-guard.js"