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
@@ -5,7 +5,7 @@
5
5
  "hooks": [
6
6
  {
7
7
  "type": "command",
8
- "command": "bash .qoder/hooks/session-start.sh"
8
+ "command": "node .qoder/hooks/session-start.mjs"
9
9
  }
10
10
  ]
11
11
  }
@@ -15,7 +15,7 @@
15
15
  "hooks": [
16
16
  {
17
17
  "type": "command",
18
- "command": "bash .qoder/hooks/prompt-submit.sh"
18
+ "command": "node .qoder/hooks/prompt-submit.mjs"
19
19
  }
20
20
  ]
21
21
  }
@@ -26,11 +26,11 @@
26
26
  "hooks": [
27
27
  {
28
28
  "type": "command",
29
- "command": "bash .qoder/hooks/pre-tool-use.sh"
29
+ "command": "node .qoder/hooks/pre-tool-use.mjs"
30
30
  },
31
31
  {
32
32
  "type": "command",
33
- "command": "bash .qoder/hooks/doc-format-guard.sh"
33
+ "command": "node .qoder/hooks/doc-format-guard.mjs"
34
34
  }
35
35
  ]
36
36
  }
@@ -41,11 +41,11 @@
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
44
- "command": "bash .qoder/hooks/post-tool-use.sh"
44
+ "command": "node .qoder/hooks/post-tool-use.mjs"
45
45
  },
46
46
  {
47
47
  "type": "command",
48
- "command": "bash .qoder/hooks/doc-format-guard.sh"
48
+ "command": "node .qoder/hooks/doc-format-guard.mjs"
49
49
  }
50
50
  ]
51
51
  }
@@ -55,7 +55,7 @@
55
55
  "hooks": [
56
56
  {
57
57
  "type": "command",
58
- "command": "bash .qoder/hooks/post-tool-failure.sh"
58
+ "command": "node .qoder/hooks/post-tool-failure.mjs"
59
59
  }
60
60
  ]
61
61
  }
@@ -65,7 +65,7 @@
65
65
  "hooks": [
66
66
  {
67
67
  "type": "command",
68
- "command": "bash .qoder/hooks/stop-check.sh"
68
+ "command": "node .qoder/hooks/stop-check.mjs"
69
69
  }
70
70
  ]
71
71
  }
@@ -75,7 +75,7 @@
75
75
  "hooks": [
76
76
  {
77
77
  "type": "command",
78
- "command": "bash .qoder/hooks/subagent-guard.sh"
78
+ "command": "node .qoder/hooks/subagent-guard.mjs"
79
79
  }
80
80
  ]
81
81
  }
@@ -85,7 +85,7 @@
85
85
  "hooks": [
86
86
  {
87
87
  "type": "command",
88
- "command": "bash .qoder/hooks/subagent-guard.sh"
88
+ "command": "node .qoder/hooks/subagent-guard.mjs"
89
89
  }
90
90
  ]
91
91
  }
@@ -95,7 +95,7 @@
95
95
  "hooks": [
96
96
  {
97
97
  "type": "command",
98
- "command": "bash .qoder/hooks/pre-compact.sh"
98
+ "command": "node .qoder/hooks/pre-compact.mjs"
99
99
  }
100
100
  ]
101
101
  }
@@ -106,7 +106,7 @@
106
106
  "hooks": [
107
107
  {
108
108
  "type": "command",
109
- "command": "bash .qoder/hooks/notification.sh"
109
+ "command": "node .qoder/hooks/notification.mjs"
110
110
  }
111
111
  ]
112
112
  }
@@ -116,7 +116,7 @@
116
116
  "hooks": [
117
117
  {
118
118
  "type": "command",
119
- "command": "bash .qoder/hooks/permission-gate.sh"
119
+ "command": "node .qoder/hooks/permission-gate.mjs"
120
120
  }
121
121
  ]
122
122
  }
@@ -0,0 +1,30 @@
1
+ // doc-format-guard.ts — schema.json 驱动的 ADD 文档格式守卫(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core DocFormatGuard,命名子类 TraeDocFormatGuard:
3
+ // ① 探测链与 core 数据驱动同语义(PLAN 元信息 → 一、Plan 概述 → 四、Handoff → simple-plan,
4
+ // 2026-08-14 实态核验 trae 独立类 L133-135 与 core 基线一致)→ 当前无 override
5
+ // (空子类承载端身份 + 未来演进位)
6
+ // 协议差异仅剩: MAGIC_DIR 兜底 = ".trae"(构造参数)
7
+
8
+ import { readFileSync } from "node:fs"
9
+ import { DocFormatGuard } from "../../../core/governance/doc-format-guard.js"
10
+
11
+ class TraeDocFormatGuard extends DocFormatGuard {
12
+ /** 协议差异封装: MAGIC_DIR 兜底 = ".trae"(trae 端) */
13
+ constructor(projectDir: string, magicDir: string) {
14
+ super(projectDir, magicDir)
15
+ }
16
+
17
+ // 当前无 override(探测链/算法段同 core);未来 trae 协议演进在此扩展,不改 core
18
+ }
19
+
20
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
21
+ const MAGIC_DIR = process.env.MAGIC_DIR || ".trae"
22
+
23
+ const guard = new TraeDocFormatGuard(PROJECT_DIR, MAGIC_DIR)
24
+ let raw = ""
25
+ try {
26
+ raw = readFileSync(0, "utf-8")
27
+ } catch {
28
+ raw = ""
29
+ }
30
+ process.exitCode = guard.run(raw)
@@ -0,0 +1,22 @@
1
+ // notification.ts — Notification 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core NotificationRouter,命名子类 TraeNotificationRouter:
3
+ // ① 探测循环(.claude/.qoder/.vscode/.add)+ reviews 提醒 = 基类(bash 原文逐字)
4
+ // ② 兜底 magicDir = ".add"(bash 原文 `${MAGIC_DIR:-.add}` 照搬,构造参数注入)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(trae 无注入链)+ fallbackMagicDir
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { NotificationRouter } from "../../../core/governance/notification-router.js"
9
+
10
+ class TraeNotificationRouter extends NotificationRouter {
11
+ /** 协议差异封装: fallbackMagicDir = ".add"(trae bash 原文 ${MAGIC_DIR:-.add} 逐字) */
12
+ constructor(projectDir: string) {
13
+ super(projectDir, ".add")
14
+ }
15
+
16
+ // 当前无 override(探测循环 + 提醒文本与 core 基线一致);命名子类承载端身份 + 未来演进位
17
+ }
18
+
19
+ const input = readHookInput()
20
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
21
+
22
+ process.exit(new TraeNotificationRouter(PROJECT_DIR).run(input))
@@ -0,0 +1,15 @@
1
+ // permission-gate.ts — PermissionRequest 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PermissionGateRouter,命名子类 TraePermissionGateRouter:
3
+ // ① tool_name 缺失回退 ""(bash `// empty` 语义)——基类默认,无 override
4
+ // ② emit = 基类默认(仅高风险工具 Bash/Write/Edit stdout 二次确认,bash 原文逐字)
5
+ // 协议差异: 无(与 core 同构);命名子类承载端身份 + 未来演进位
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { PermissionGateRouter } from "../../../core/governance/permission-gate-router.js"
9
+
10
+ class TraePermissionGateRouter extends PermissionGateRouter {
11
+ // 当前无 override(`// empty` 回退 + 高风险工具提示与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ const input = readHookInput()
15
+ process.exit(new TraePermissionGateRouter().run(input))
@@ -0,0 +1,14 @@
1
+ // post-tool-failure.ts — PostToolUseFailure 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PostToolFailureRouter,命名子类 TraePostToolFailureRouter:
3
+ // ① emit = 基类默认(stdout 固定文本——bash 原文逐字,trae 为占位实现)
4
+ // 协议差异: 无(与 core 同构);命名子类承载端身份 + 未来演进位
5
+
6
+ import { readHookInput } from "../../../core/governance/common.js"
7
+ import { PostToolFailureRouter } from "../../../core/governance/post-tool-failure-router.js"
8
+
9
+ class TraePostToolFailureRouter extends PostToolFailureRouter {
10
+ // 当前无 override(stdout 固定提示与 core 基线一致);命名子类承载端身份 + 未来演进位
11
+ }
12
+
13
+ const input = readHookInput()
14
+ process.exit(new TraePostToolFailureRouter().run(input))
@@ -0,0 +1,24 @@
1
+ // post-tool-use.ts — PostToolUse 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PostToolRouter,命名子类 TraePostToolRouter:
3
+ // ① §1 DPS 自动化 + §2a-e 文档守卫 + §3 Bash 增强 = 基类
4
+ // (2026-08-14 实态核验: trae 手写版与 core PostToolRouter 逐字同构)
5
+ // 协议差异仅剩: MAGIC_DIR 兜底 = ".trae"(构造参数封装——原手写版误用 ".qoder" 兜底,已修正)
6
+
7
+ import { jsonGet, readHookInput } from "../../../core/governance/common.js"
8
+ import { PostToolRouter } from "../../../core/governance/post-tool-router.js"
9
+
10
+ class TraePostToolRouter extends PostToolRouter {
11
+ /** 协议差异封装: MAGIC_DIR 兜底 = ".trae"(原手写版复制 qoder 时误用 ".qoder" 兜底,2026-08-14 修正) */
12
+ constructor(projectDir: string) {
13
+ super(projectDir, process.env.MAGIC_DIR || ".trae")
14
+ }
15
+
16
+ // 当前无 override(段落能力与 core 基线一致);命名子类承载端身份 + 未来演进位
17
+ }
18
+
19
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
20
+ const input = readHookInput()
21
+ const toolName = jsonGet(input, "tool_name")
22
+ if (toolName === "") process.exit(0)
23
+
24
+ process.exit(new TraePostToolRouter(PROJECT_DIR).run(input, toolName))
@@ -0,0 +1,15 @@
1
+ // pre-compact.ts — 上下文压缩前 ADD 状态保存(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PreCompactGuard,命名子类 TraePreCompactGuard:
3
+ // ① 状态保存到恢复标记 + ② tpl 标记清理 = 基类(与 trae bash 原文逐字同构,
4
+ // 2026-08-14 实态核验——手写版逻辑与 core 基类完全一致,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(trae 无注入链)
6
+
7
+ import { PreCompactGuard } from "../../../core/governance/pre-compact-guard.js"
8
+
9
+ class TraePreCompactGuard extends PreCompactGuard {
10
+ // 当前无 override(状态保存/恢复清单/tpl 清理与 core 基线一致);命名子类承载端身份 + 未来演进位
11
+ }
12
+
13
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
14
+
15
+ process.exit(new TraePreCompactGuard().run())
@@ -0,0 +1,40 @@
1
+ // pre-tool-use.ts — PreToolUse 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PreToolUseGuard,命名子类 TraePreToolUseGuard:
3
+ // ① 检测链: 构造传 adapterName="trae" → 加载 [guard.adapter_detectors] trae 独立链
4
+ // (与 core 同正则同序,stderr 为 trae 长文本版——2026-08-14 实态核验,TOML 数据化)
5
+ // ② onBlock/onSectionAPass/onNoPlanAllow/onSensitiveDeny/largeFileText/onHitlDeny
6
+ // = core 基类默认(逐字对照 trae bash 原文一致:JSON ask + logBlock + 事件 + exit 2;
7
+ // HITL 失败 exit 0 放行)
8
+ // 协议差异仅剩: MAGIC_DIR 兜底 = ".trae"(构造参数)
9
+
10
+ import { jsonGet, readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
11
+ import { PreToolUseGuard } from "../../../core/governance/pre-tool-guard.js"
12
+
13
+ class TraePreToolUseGuard extends PreToolUseGuard {
14
+ /** ① trae 独立检测链(TOML [guard.adapter_detectors] adapter=trae) */
15
+ constructor(projectDir: string, magicDir: string) {
16
+ super(projectDir, magicDir, "trae")
17
+ }
18
+
19
+ // 其余扩展点与 core 基线一致(trae bash 原文逐字对照);命名子类承载端身份 + 未来演进位
20
+ }
21
+
22
+ const input = readHookInput()
23
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
24
+
25
+ // 探测 MAGIC_DIR(唯一解析链:注入优先 → 物理位置推导)
26
+ let MAGIC_DIR = process.env.MAGIC_DIR
27
+ if (!MAGIC_DIR) {
28
+ MAGIC_DIR = tryResolveMagicDir() || ".trae"
29
+ }
30
+
31
+ const toolName = jsonGet(input, "tool_name")
32
+ const command = jsonGet(input, "command")
33
+
34
+ const guard = new TraePreToolUseGuard(PROJECT_DIR, MAGIC_DIR)
35
+
36
+ if (command !== "") {
37
+ process.exit(guard.runSectionA(input))
38
+ } else {
39
+ process.exit(guard.runSectionB(input, toolName))
40
+ }
@@ -0,0 +1,29 @@
1
+ // prompt-submit.ts — UserPromptSubmit 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core PromptRouter(L1/L2/L3 模板方法);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① extractPrompt = 基类默认(jsonGet 与 bash `jq -r '.prompt // empty'` 同语义)
4
+ // ② acceptedText = 基类默认(trae bash 原文 6 行含 ★ 同步检查,与 core 逐字一致)
5
+ // ③ onAccepted: 输出 review-checklist 占位文本(trae bash 调占位脚本;core 是子进程 stdio ignore)
6
+ // ④ layer2ToStderr: false——Layer2 提示输出 stdout(trae bash heredoc 无重定向)
7
+ // 协议差异仅剩: MAGIC_DIR 兜底 = ".trae"(构造参数)
8
+
9
+ import { readHookInput } from "../../../core/governance/common.js"
10
+ import { PromptRouter } from "../../../core/governance/prompt-router.js"
11
+
12
+ const MAGIC_DIR = process.env.MAGIC_DIR || ".trae"
13
+
14
+ class TraePromptRouter extends PromptRouter {
15
+ /** ③ 验收后置: 输出 review-checklist 占位文本(trae bash 调占位脚本逐字) */
16
+ protected override onAccepted(_handoff: string, _addRoute: string): void {
17
+ process.stdout.write("[ADD ReviewChecklist] 请在提交前确认 checklist.md 全部项已勾选。\n")
18
+ }
19
+
20
+ /** ④ Layer 2 输出通道(trae: stdout——bash heredoc 无重定向) */
21
+ protected override layer2ToStderr(): boolean {
22
+ return false
23
+ }
24
+
25
+ // 其余(extractPrompt/acceptedText/layer3Text/dailyWarnText/afterLayer3)与 core 基线一致
26
+ }
27
+
28
+ const input = readHookInput()
29
+ process.exit(new TraePromptRouter(MAGIC_DIR).run(input))
@@ -0,0 +1,5 @@
1
+ // review-checklist.ts — Review 检查清单校验(Trae 版)
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 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core SessionEndGuard,命名子类 TraeSessionEndGuard:
3
+ // ① 清理标记(tpl + dev)+ ② 审计结算(stderr)+ ③ Stop 兜底 = 基类
4
+ // (2026-08-14 实态核验: trae 手写版与 core SessionEndGuard 逐字同构——bash 原文
5
+ // 清理 → 警告 → checklist 快照 → 结算,收敛为子类无 override)
6
+ // 协议差异仅剩: PROJECT_DIR = $PWD(trae 无注入链)
7
+
8
+ import { SessionEndGuard } from "../../../core/governance/session-end.js"
9
+
10
+ class TraeSessionEndGuard extends SessionEndGuard {
11
+ // 当前无 override(清理/结算/兜底与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
15
+
16
+ process.exit(new TraeSessionEndGuard(process.env.PROJECT_DIR).run())
@@ -0,0 +1,15 @@
1
+ // session-start.ts — SessionStart 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core SessionStartGuard,命名子类 TraeSessionStartGuard:
3
+ // ① 状态恢复 + ② 模板索引 + ③ 代办 + ④ HITL 待审批 = 基类默认
4
+ // (2026-08-14 实态核验: trae bash 原文四段与 core 逐字一致,收敛为子类无 override)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(trae 无注入链)
6
+
7
+ import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
8
+
9
+ class TraeSessionStartGuard extends SessionStartGuard {
10
+ // 当前无 override(四段与 core 基线一致);命名子类承载端身份 + 未来演进位
11
+ }
12
+
13
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
14
+
15
+ process.exit(new TraeSessionStartGuard(process.env.PROJECT_DIR).run())
@@ -0,0 +1,20 @@
1
+ // stop-check.ts — Stop 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core StopRouter,命名子类 TraeStopRouter:
3
+ // ① Q0-Q4 四象限分流 = 基类(2026-08-14 实态核验: trae bash 原文与 core 逐字相同——
4
+ // bash diff 为空,收敛为子类无 override)
5
+ // 协议差异: 无(纯文本形态同 core);MAGIC_DIR 物理推导注入(对齐 bash export)
6
+
7
+ import { tryResolveMagicDir } from "../../../core/governance/common.js"
8
+ import { StopRouter } from "../../../core/governance/stop-router.js"
9
+
10
+ class TraeStopRouter extends StopRouter {
11
+ // 当前无 override(Q0-Q4 分流与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ // 对齐 bash: MAGIC_DIR 从物理位置推导并 export(入口注入优先)
15
+ const inferredMagicDir = tryResolveMagicDir()
16
+ if (inferredMagicDir && !process.env.MAGIC_DIR) {
17
+ process.env.MAGIC_DIR = inferredMagicDir
18
+ }
19
+
20
+ process.exit(new TraeStopRouter().run())
@@ -0,0 +1,22 @@
1
+ // subagent-guard.ts — SubagentStart 入口(Trae 版,Task 3.1 继承体系)
2
+ // 继承 core SubagentGuardRouter(状态注入模板方法——能力对齐):
3
+ // 能力对齐注: 原 trae 为弱版(事件提示空话),已对齐强版(状态注入)
4
+ // ① 输出形态: 纯文本状态块(core/qoder 是 hookSpecificOutput JSON)
5
+
6
+ import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
7
+
8
+ class TraeSubagentGuardRouter extends SubagentGuardRouter {
9
+ /** ① 纯文本状态块(trae 协议,与 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 TraeSubagentGuardRouter().run())
@@ -0,0 +1,15 @@
1
+ // subagent-stop.ts — SubagentStop 入口(Trae 版,Task 6.1 继承体系)
2
+ // 继承 core SubagentStopRouter,命名子类 TraeSubagentStopRouter:
3
+ // ① 边界校验 + deliverables 越界检查 + 审计聚合 = 基类(与 trae bash 原文逐字同构,
4
+ // 2026-08-14 实态核验——手写版逻辑与 core 基类完全一致,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(trae 无注入链)
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
9
+
10
+ class TraeSubagentStopRouter extends SubagentStopRouter {
11
+ // 当前无 override(边界校验 + 审计聚合与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ const input = readHookInput()
15
+ process.exit(new TraeSubagentStopRouter().run(input))
@@ -1 +1 @@
1
- {"hooks":{"SessionStart":[{"command":"bash .trae/hooks/session-start.sh"}],"UserPromptSubmit":[{"command":"bash .trae/hooks/prompt-submit.sh"}],"PreToolUse":[{"command":"bash .trae/hooks/pre-tool-use.sh"}],"PostToolUse":[{"command":"bash .trae/hooks/post-tool-use.sh"}],"Stop":[{"command":"bash .trae/hooks/stop-check.sh"}],"Notification":[{"matcher":"result","command":"bash .trae/hooks/notification.sh"}]}}
1
+ {"hooks":{"SessionStart":[{"command":"node .trae/hooks/session-start.mjs"}],"UserPromptSubmit":[{"command":"node .trae/hooks/prompt-submit.mjs"}],"PreToolUse":[{"command":"node .trae/hooks/pre-tool-use.mjs"}],"PostToolUse":[{"command":"node .trae/hooks/post-tool-use.mjs"}],"Stop":[{"command":"node .trae/hooks/stop-check.mjs"}],"Notification":[{"matcher":"result","command":"node .trae/hooks/notification.mjs"}]}}
@@ -0,0 +1,27 @@
1
+ // doc-format-guard.ts — schema.json 驱动的 ADD 文档格式守卫(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core DocFormatGuard,命名子类 VscodeDocFormatGuard:
3
+ // 探测链 = core 基线(PLAN 元信息 → 一、Plan 概述 → 四、Handoff → simple-plan,
4
+ // 2026-08-14 实态核验与 core 同语义);
5
+ // 差异点仅一个: 无算法规则段(反作弊/HITL 表/handoff 冲突不校验,bash 原文无此段)
6
+
7
+ import { readFileSync } from "node:fs"
8
+ import { DocFormatGuard } from "../../../core/governance/doc-format-guard.js"
9
+
10
+ class VscodeDocFormatGuard extends DocFormatGuard {
11
+ /** 无算法规则段(vscode bash 原文无反作弊/HITL 表/handoff 冲突校验) */
12
+ protected override runAlgoChecks(_templateName: string, _filePath: string, _content: string): void {
13
+ // vscode 协议: 不执行算法化规则校验
14
+ }
15
+ }
16
+
17
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
18
+ const MAGIC_DIR = process.env.MAGIC_DIR || ".vscode"
19
+
20
+ const guard = new VscodeDocFormatGuard(PROJECT_DIR, MAGIC_DIR)
21
+ let raw = ""
22
+ try {
23
+ raw = readFileSync(0, "utf-8")
24
+ } catch {
25
+ raw = ""
26
+ }
27
+ process.exitCode = guard.run(raw)
@@ -0,0 +1,22 @@
1
+ // notification.ts — Notification Review 提醒(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core NotificationRouter,命名子类 VscodeNotificationRouter:
3
+ // ① 探测循环(.claude/.qoder/.vscode/.add)与 reviews 提醒逻辑 = 基类(bash 原文逐字对齐)
4
+ // ② 兜底 magicDir = ".vscode"(构造参数注入,vscode 协议差异)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)+ fallbackMagicDir
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { NotificationRouter } from "../../../core/governance/notification-router.js"
9
+
10
+ class VscodeNotificationRouter extends NotificationRouter {
11
+ /** 协议差异封装: fallbackMagicDir = ".vscode"(vscode 端兜底,bash 原文逐字) */
12
+ constructor(projectDir: string) {
13
+ super(projectDir, ".vscode")
14
+ }
15
+
16
+ // 当前无 override(探测循环 + 提醒文本与 core 基线一致);命名子类承载端身份 + 未来演进位
17
+ }
18
+
19
+ const input = readHookInput()
20
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
21
+
22
+ process.exit(new VscodeNotificationRouter(PROJECT_DIR).run(input))
@@ -0,0 +1,15 @@
1
+ // permission-gate.ts — PermissionRequest 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PermissionGateRouter,命名子类 VscodePermissionGateRouter:
3
+ // ① tool_name 缺失回退 ""(bash `// empty` 语义)——基类默认,无 override
4
+ // ② emit = 基类默认(仅高风险工具 Bash/Write/Edit stdout 二次确认,bash 原文逐字)
5
+ // 协议差异: 无(与 core 同构);命名子类承载端身份 + 未来演进位
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { PermissionGateRouter } from "../../../core/governance/permission-gate-router.js"
9
+
10
+ class VscodePermissionGateRouter extends PermissionGateRouter {
11
+ // 当前无 override(`// empty` 回退 + 高风险工具提示与 core 基线一致);命名子类承载端身份 + 未来演进位
12
+ }
13
+
14
+ const input = readHookInput()
15
+ process.exit(new VscodePermissionGateRouter().run(input))
@@ -0,0 +1,32 @@
1
+ // post-tool-failure.ts — PostToolUseFailure 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PostToolFailureRouter,命名子类 VscodePostToolFailureRouter:
3
+ // ① error 缺失回退 "未知错误"(bash grep || echo 语义)
4
+ // ② emit override: 429 限流降级(bash 原文逐字——429/rate.limit/too many requests
5
+ // → 串行模式建议;否则通用失败提示)——vscode 特有能力,全 stderr
6
+
7
+ import { readHookInput } from "../../../core/governance/common.js"
8
+ import { PostToolFailureRouter } from "../../../core/governance/post-tool-failure-router.js"
9
+
10
+ class VscodePostToolFailureRouter extends PostToolFailureRouter {
11
+ /** ① 空输入走 fallback(bash grep || echo 语义:空输入 → "未知错误") */
12
+ protected override emptyUsesFallback(): boolean {
13
+ return true
14
+ }
15
+
16
+ /** ② error 缺失回退 "未知错误"(bash grep || echo 语义) */
17
+ protected override fallbackError(): string {
18
+ return "未知错误"
19
+ }
20
+
21
+ /** ② 429 限流降级(bash 原文逐字) */
22
+ protected override emit(_toolName: string, error: string): void {
23
+ if (/429|rate\.limit|too many requests/.test(error)) {
24
+ process.stderr.write("[ADD PostToolFailure] ⚠️ 检测到 429 限流。建议切换为串行模式,降低并行调用数。\n")
25
+ } else {
26
+ process.stderr.write(`[ADD PostToolFailure] 工具调用失败: ${error}。请检查并修复。\n`)
27
+ }
28
+ }
29
+ }
30
+
31
+ const input = readHookInput()
32
+ process.exit(new VscodePostToolFailureRouter().run(input))
@@ -0,0 +1,25 @@
1
+ // post-tool-use.ts — PostToolUse 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PostToolRouter,命名子类 VscodePostToolRouter:
3
+ // 六端实态核验(2026-08-14): post-tool-use 段落能力统一 core 全段
4
+ // (§1 DPS 自动化 + §2a-e 文档守卫 + §3 Bash 增强)——当前无 override,
5
+ // 命名子类承载端身份 + 未来演进位(如 vscode 协议支持 feedback JSON 时在此扩展)
6
+ // 协议差异仅剩: MAGIC_DIR 兜底 = ".vscode"(构造参数注入)
7
+
8
+ import { jsonGet, readHookInput } from "../../../core/governance/common.js"
9
+ import { PostToolRouter } from "../../../core/governance/post-tool-router.js"
10
+
11
+ class VscodePostToolRouter extends PostToolRouter {
12
+ /** 协议差异封装: MAGIC_DIR 兜底 = ".vscode"(env 注入优先,bash 原文逐字) */
13
+ constructor(projectDir: string) {
14
+ super(projectDir, process.env.MAGIC_DIR || ".vscode")
15
+ }
16
+
17
+ // 当前无 override(段落能力与 core 基线一致);命名子类承载端身份 + 未来演进位
18
+ }
19
+
20
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
21
+ const input = readHookInput()
22
+ const toolName = jsonGet(input, "tool_name")
23
+ if (toolName === "") process.exit(0)
24
+
25
+ process.exit(new VscodePostToolRouter(PROJECT_DIR).run(input, toolName))
@@ -0,0 +1,15 @@
1
+ // pre-compact.ts — 上下文压缩前 ADD 状态保存(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PreCompactGuard,命名子类 VscodePreCompactGuard:
3
+ // ① 状态保存到恢复标记 + ② tpl 标记清理 = 基类(与 vscode bash 原文逐字同构,
4
+ // 2026-08-14 实态核验——手写版逻辑与 core 基类完全一致,收敛为子类)
5
+ // 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)
6
+
7
+ import { PreCompactGuard } from "../../../core/governance/pre-compact-guard.js"
8
+
9
+ class VscodePreCompactGuard extends PreCompactGuard {
10
+ // 当前无 override(状态保存/恢复清单/tpl 清理与 core 基线一致);命名子类承载端身份 + 未来演进位
11
+ }
12
+
13
+ process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
14
+
15
+ process.exit(new VscodePreCompactGuard().run())
@@ -0,0 +1,78 @@
1
+ // pre-tool-use.ts — PreToolUse 入口(VS Code Copilot 版,Task 5.1 继承体系)
2
+ // 继承 core PreToolUseGuard(模板方法固化治理流程);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① 检测链: 构造传 adapterName="vscode" → 加载 [guard.adapter_detectors] vscode 独立链
4
+ // (与 claude/qoder 同构四段链,2026-08-14 实态核验)
5
+ // ② onBlock: 纯 stderr(无 askJson / logBlock)+ 事件 + exit 2
6
+ // ③ onNoPlanAllow: allow JSON + exit 2(bash 原文缺陷照搬: allow decision + exit 2)
7
+ // ④ onSensitiveDeny: 纯 stderr(无 denyJson)+ 事件 + exit 2
8
+ // ⑤ onSectionAPass: Bash 放行 markDevAction
9
+ // ⑥ onOtherTool: ③ Read matcher 模板提示(同 claude)
10
+
11
+ import { jsonGet, markDevAction, readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
12
+ import { writeHookEvent } from "../../../core/governance/notify.js"
13
+ import { PreToolUseGuard } from "../../../core/governance/pre-tool-guard.js"
14
+
15
+ const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
16
+ const inferred = tryResolveMagicDir()
17
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
18
+ const MAGIC_DIR = process.env.MAGIC_DIR || ""
19
+
20
+ class VscodePreToolUseGuard extends PreToolUseGuard {
21
+ constructor(projectDir: string, magicDir: string) {
22
+ super(projectDir, magicDir, "vscode")
23
+ }
24
+
25
+ /** ② §A 阻断: 纯 stderr({{cmd}} 模板替换)+ 事件 + exit 2(无 askJson / logBlock) */
26
+ protected override onBlock(blocked: { reason: string; stderr: string }, command: string): number {
27
+ process.stderr.write(blocked.stderr.replaceAll("{{cmd}}", command))
28
+ writeHookEvent("pre-tool-use", "deny", command, blocked.reason, this.planKeyword, this.planStatus)
29
+ return 2
30
+ }
31
+
32
+ /** ③ §B 无 Plan 放行: 提示 + allow JSON + 事件 + exit 2(bash 原文缺陷照搬) */
33
+ protected override onNoPlanAllow(toolName: string, filePath: string): number {
34
+ process.stderr.write("[ADD 提示] 正在写入 Plan/Spec/Review 文档但无活跃 ADD Plan——首次创建场景放行,建议先执行 add-paradigm 生成 Plan+add-route\n")
35
+ process.stdout.write('{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":"无活跃 ADD Plan 但为 Plan/Spec/Review 写入(首次创建场景),提示而非拦截"}}\n')
36
+ writeHookEvent("pre-tool-use", "info", filePath, "无活跃 ADD Plan 下写入 Plan/Spec/Review(首次创建放行)", this.planKeyword, this.planStatus)
37
+ return 2
38
+ }
39
+
40
+ /** ④ §B 敏感文件: 纯 stderr(无 denyJson)+ 事件 + exit 2 */
41
+ protected override onSensitiveDeny(filePath: string): number {
42
+ process.stderr.write(`⛔ 敏感文件受保护,禁止写入: ${filePath}\n`)
43
+ writeHookEvent("pre-tool-use", "deny", filePath, "敏感文件受保护", this.planKeyword, this.planStatus)
44
+ return 2
45
+ }
46
+
47
+ /** ⑤ §A 放行后处理: bash 原文 mark_dev_action */
48
+ protected override onSectionAPass(_command: string): void {
49
+ markDevAction()
50
+ }
51
+
52
+ /** ⑥ ③ Read matcher: 模板路径兜底提示 */
53
+ protected override onOtherTool(input: string, toolName: string): number {
54
+ if (toolName === "Read") {
55
+ const filePath = jsonGet(input, "file_path")
56
+ if (/templates\//.test(filePath)) {
57
+ process.stderr.write("[ADD PreToolUse] 提示: 模板文件已通过 hook 预读到上下文,可跳过重复读取\n")
58
+ }
59
+ }
60
+ return 0
61
+ }
62
+ }
63
+
64
+ const input = readHookInput()
65
+ let toolName = jsonGet(input, "tool_name")
66
+ if (toolName === "") {
67
+ toolName = input.match(/"tool_name"\s*:\s*"([^"]*)"/)?.[1] ?? ""
68
+ }
69
+
70
+ const guard = new VscodePreToolUseGuard(PROJECT_DIR, MAGIC_DIR)
71
+
72
+ if (toolName === "Bash") {
73
+ process.exit(guard.runSectionA(input))
74
+ } else if (toolName === "Write" || toolName === "Edit" || toolName === "SearchReplace") {
75
+ process.exit(guard.runSectionB(input, toolName))
76
+ } else {
77
+ process.exit(guard.runSectionC(input, toolName))
78
+ }