add-coder 0.3.27 → 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 (262) hide show
  1. package/README.md +246 -145
  2. package/package.json +2 -1
  3. package/templates/.add-coder-src-hash.json +126 -148
  4. package/templates/adapters/claude/hooks/doc-format-guard.ts +32 -0
  5. package/templates/adapters/claude/hooks/lib/claude-env.ts +7 -0
  6. package/templates/adapters/claude/hooks/notification.ts +24 -0
  7. package/templates/adapters/claude/hooks/permission-denied.ts +33 -0
  8. package/templates/adapters/claude/hooks/permission-gate.ts +12 -0
  9. package/templates/adapters/claude/hooks/post-tool-failure.ts +4 -0
  10. package/templates/adapters/claude/hooks/post-tool-use.ts +17 -0
  11. package/templates/adapters/claude/hooks/pre-compact.ts +10 -0
  12. package/templates/adapters/claude/hooks/pre-tool-use.ts +81 -0
  13. package/templates/adapters/claude/hooks/prompt-submit.ts +82 -0
  14. package/templates/adapters/claude/hooks/review-checklist.ts +4 -0
  15. package/templates/adapters/claude/hooks/session-end.ts +10 -0
  16. package/templates/adapters/claude/hooks/session-start.ts +24 -0
  17. package/templates/adapters/claude/hooks/stop-check.ts +15 -0
  18. package/templates/adapters/claude/hooks/stop-failure.ts +34 -0
  19. package/templates/adapters/claude/hooks/subagent-guard.ts +25 -0
  20. package/templates/adapters/claude/hooks/subagent-stop.ts +12 -0
  21. package/templates/adapters/claude/settings.json +13 -13
  22. package/templates/adapters/codex/hooks/doc-format-guard.ts +30 -0
  23. package/templates/adapters/codex/hooks/notification.ts +26 -0
  24. package/templates/adapters/codex/hooks/permission-gate.ts +15 -0
  25. package/templates/adapters/codex/hooks/post-tool-failure.ts +14 -0
  26. package/templates/adapters/codex/hooks/post-tool-use.ts +85 -0
  27. package/templates/adapters/codex/hooks/pre-compact.ts +20 -0
  28. package/templates/adapters/codex/hooks/pre-tool-use.ts +141 -0
  29. package/templates/adapters/codex/hooks/prompt-submit.ts +38 -0
  30. package/templates/adapters/codex/hooks/review-checklist.ts +5 -0
  31. package/templates/adapters/codex/hooks/session-end.ts +19 -0
  32. package/templates/adapters/codex/hooks/session-start.ts +45 -0
  33. package/templates/adapters/codex/hooks/stop-check.ts +59 -0
  34. package/templates/adapters/codex/hooks/subagent-guard.ts +22 -0
  35. package/templates/adapters/codex/hooks/subagent-stop.ts +20 -0
  36. package/templates/adapters/codex/hooks.json +5 -5
  37. package/templates/adapters/qoder/hooks/doc-format-guard.ts +34 -0
  38. package/templates/adapters/qoder/hooks/lib/context-inject.ts +61 -0
  39. package/templates/adapters/qoder/hooks/lib/qoder-env.ts +23 -0
  40. package/templates/adapters/qoder/hooks/lib/review-checklist.ts +5 -0
  41. package/templates/adapters/qoder/hooks/notification.ts +34 -0
  42. package/templates/adapters/qoder/hooks/permission-gate.ts +26 -0
  43. package/templates/adapters/qoder/hooks/post-tool-failure.ts +30 -0
  44. package/templates/adapters/qoder/hooks/post-tool-use.ts +32 -0
  45. package/templates/adapters/qoder/hooks/pre-compact.ts +16 -0
  46. package/templates/adapters/qoder/hooks/pre-tool-use.ts +112 -0
  47. package/templates/adapters/qoder/hooks/prompt-submit.ts +66 -0
  48. package/templates/adapters/qoder/hooks/review-checklist.ts +24 -0
  49. package/templates/adapters/qoder/hooks/session-end.ts +27 -0
  50. package/templates/adapters/qoder/hooks/session-start.ts +83 -0
  51. package/templates/adapters/qoder/hooks/stop-check.ts +69 -0
  52. package/templates/adapters/qoder/hooks/subagent-guard.ts +16 -0
  53. package/templates/adapters/qoder/hooks/subagent-stop.ts +33 -0
  54. package/templates/adapters/qoder/settings.json +13 -13
  55. package/templates/adapters/trae/hooks/doc-format-guard.ts +30 -0
  56. package/templates/adapters/trae/hooks/notification.ts +22 -0
  57. package/templates/adapters/trae/hooks/permission-gate.ts +15 -0
  58. package/templates/adapters/trae/hooks/post-tool-failure.ts +14 -0
  59. package/templates/adapters/trae/hooks/post-tool-use.ts +24 -0
  60. package/templates/adapters/trae/hooks/pre-compact.ts +15 -0
  61. package/templates/adapters/trae/hooks/pre-tool-use.ts +40 -0
  62. package/templates/adapters/trae/hooks/prompt-submit.ts +29 -0
  63. package/templates/adapters/trae/hooks/review-checklist.ts +5 -0
  64. package/templates/adapters/trae/hooks/session-end.ts +16 -0
  65. package/templates/adapters/trae/hooks/session-start.ts +15 -0
  66. package/templates/adapters/trae/hooks/stop-check.ts +20 -0
  67. package/templates/adapters/trae/hooks/subagent-guard.ts +22 -0
  68. package/templates/adapters/trae/hooks/subagent-stop.ts +15 -0
  69. package/templates/adapters/trae/hooks.json +1 -1
  70. package/templates/adapters/vscode/hooks/doc-format-guard.ts +27 -0
  71. package/templates/adapters/vscode/hooks/notification.ts +22 -0
  72. package/templates/adapters/vscode/hooks/permission-gate.ts +15 -0
  73. package/templates/adapters/vscode/hooks/post-tool-failure.ts +32 -0
  74. package/templates/adapters/vscode/hooks/post-tool-use.ts +25 -0
  75. package/templates/adapters/vscode/hooks/pre-compact.ts +15 -0
  76. package/templates/adapters/vscode/hooks/pre-tool-use.ts +78 -0
  77. package/templates/adapters/vscode/hooks/prompt-submit.ts +74 -0
  78. package/templates/adapters/vscode/hooks/review-checklist.ts +5 -0
  79. package/templates/adapters/vscode/hooks/session-end.ts +16 -0
  80. package/templates/adapters/vscode/hooks/session-start.ts +24 -0
  81. package/templates/adapters/vscode/hooks/stop-check.ts +21 -0
  82. package/templates/adapters/vscode/hooks/subagent-guard.ts +21 -0
  83. package/templates/adapters/vscode/hooks/subagent-stop.ts +15 -0
  84. package/templates/core/docs/ADD-governance-claude-code.md +3 -3
  85. package/templates/core/docs/ADD-governance-codex.md +5 -5
  86. package/templates/core/docs/ADD-governance-qoder-cn.md +4 -4
  87. package/templates/core/docs/ADD-governance-trae.md +2 -2
  88. package/templates/core/docs/ADD-governance-vscode-copilot.md +21 -22
  89. package/templates/core/governance/audit-bridge.ts +47 -0
  90. package/templates/core/governance/common.ts +299 -0
  91. package/templates/core/governance/context-inject.ts +53 -0
  92. package/templates/core/governance/doc-format-guard.ts +440 -0
  93. package/templates/core/governance/notification-router.ts +62 -0
  94. package/templates/core/governance/notify.ts +66 -0
  95. package/templates/core/governance/permission-gate-router.ts +42 -0
  96. package/templates/core/governance/post-tool-failure-router.ts +56 -0
  97. package/templates/core/governance/post-tool-router.ts +212 -0
  98. package/templates/core/governance/pre-compact-guard.ts +41 -0
  99. package/templates/core/governance/pre-tool-guard.ts +309 -0
  100. package/templates/core/governance/preload-templates.ts +241 -0
  101. package/templates/core/governance/prompt-router.ts +222 -0
  102. package/templates/core/governance/review-checklist-guard.ts +186 -0
  103. package/templates/core/governance/rules.ts +720 -0
  104. package/templates/core/governance/session-end.ts +88 -0
  105. package/templates/core/governance/session-start-guard.ts +99 -0
  106. package/templates/core/governance/state-detect.ts +6 -0
  107. package/templates/core/governance/stop-router.ts +140 -0
  108. package/templates/core/governance/subagent-guard-router.ts +35 -0
  109. package/templates/core/governance/subagent-stop-router.ts +93 -0
  110. package/templates/core/governance/subagent-stop.ts +75 -0
  111. package/templates/core/governance/vocabulary.ts +109 -0
  112. package/templates/core/hooks/doc-format-guard.ts +21 -0
  113. package/templates/core/hooks/notification.ts +11 -0
  114. package/templates/core/hooks/permission-gate.ts +7 -0
  115. package/templates/core/hooks/post-tool-failure.ts +7 -0
  116. package/templates/core/hooks/post-tool-use.ts +23 -0
  117. package/templates/core/hooks/pre-compact.ts +9 -0
  118. package/templates/core/hooks/pre-tool-use.ts +30 -0
  119. package/templates/core/hooks/prompt-submit.ts +11 -0
  120. package/templates/core/hooks/review-checklist.ts +4 -0
  121. package/templates/core/hooks/session-end.ts +10 -0
  122. package/templates/core/hooks/session-start.ts +9 -0
  123. package/templates/core/hooks/stop-check.ts +14 -0
  124. package/templates/core/hooks/subagent-guard.ts +8 -0
  125. package/templates/core/hooks/subagent-stop.ts +9 -0
  126. package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +12 -1
  127. package/templates/core/scripts/mcp-server/tools/plan.ts +12 -2
  128. package/templates/adapters/claude/hooks/doc-format-guard.sh +0 -283
  129. package/templates/adapters/claude/hooks/lib/common.sh +0 -220
  130. package/templates/adapters/claude/hooks/lib/context-inject.sh +0 -96
  131. package/templates/adapters/claude/hooks/lib/notify.sh +0 -36
  132. package/templates/adapters/claude/hooks/lib/preload-templates.sh +0 -212
  133. package/templates/adapters/claude/hooks/lib/session-end.sh +0 -76
  134. package/templates/adapters/claude/hooks/lib/state-detect.sh +0 -13
  135. package/templates/adapters/claude/hooks/lib/subagent-stop.sh +0 -90
  136. package/templates/adapters/claude/hooks/lib/vocabulary.sh +0 -62
  137. package/templates/adapters/claude/hooks/notification.sh +0 -45
  138. package/templates/adapters/claude/hooks/permission-denied.sh +0 -42
  139. package/templates/adapters/claude/hooks/permission-gate.sh +0 -18
  140. package/templates/adapters/claude/hooks/post-tool-failure.sh +0 -10
  141. package/templates/adapters/claude/hooks/post-tool-use.sh +0 -35
  142. package/templates/adapters/claude/hooks/pre-compact.sh +0 -37
  143. package/templates/adapters/claude/hooks/pre-tool-use.sh +0 -153
  144. package/templates/adapters/claude/hooks/prompt-submit.sh +0 -99
  145. package/templates/adapters/claude/hooks/review-checklist.sh +0 -10
  146. package/templates/adapters/claude/hooks/session-end.sh +0 -21
  147. package/templates/adapters/claude/hooks/session-start.sh +0 -36
  148. package/templates/adapters/claude/hooks/stop-check.sh +0 -54
  149. package/templates/adapters/claude/hooks/stop-failure.sh +0 -44
  150. package/templates/adapters/claude/hooks/subagent-guard.sh +0 -36
  151. package/templates/adapters/claude/hooks/subagent-stop.sh +0 -20
  152. package/templates/adapters/codex/hooks/doc-format-guard.sh +0 -343
  153. package/templates/adapters/codex/hooks/lib/common.sh +0 -209
  154. package/templates/adapters/codex/hooks/lib/context-inject.sh +0 -96
  155. package/templates/adapters/codex/hooks/lib/notify.sh +0 -36
  156. package/templates/adapters/codex/hooks/lib/preload-templates.sh +0 -208
  157. package/templates/adapters/codex/hooks/lib/session-end.sh +0 -76
  158. package/templates/adapters/codex/hooks/lib/state-detect.sh +0 -8
  159. package/templates/adapters/codex/hooks/lib/subagent-stop.sh +0 -90
  160. package/templates/adapters/codex/hooks/lib/vocabulary.sh +0 -51
  161. package/templates/adapters/codex/hooks/notification.sh +0 -30
  162. package/templates/adapters/codex/hooks/permission-gate.sh +0 -18
  163. package/templates/adapters/codex/hooks/post-tool-failure.sh +0 -10
  164. package/templates/adapters/codex/hooks/post-tool-use.sh +0 -43
  165. package/templates/adapters/codex/hooks/pre-compact.sh +0 -37
  166. package/templates/adapters/codex/hooks/pre-tool-use.sh +0 -130
  167. package/templates/adapters/codex/hooks/prompt-submit.sh +0 -92
  168. package/templates/adapters/codex/hooks/review-checklist.sh +0 -10
  169. package/templates/adapters/codex/hooks/session-end.sh +0 -38
  170. package/templates/adapters/codex/hooks/session-start.sh +0 -63
  171. package/templates/adapters/codex/hooks/stop-check.sh +0 -71
  172. package/templates/adapters/codex/hooks/subagent-guard.sh +0 -15
  173. package/templates/adapters/codex/hooks/subagent-stop.sh +0 -47
  174. package/templates/adapters/qoder/hooks/doc-format-guard.sh +0 -341
  175. package/templates/adapters/qoder/hooks/lib/common.sh +0 -223
  176. package/templates/adapters/qoder/hooks/lib/context-inject.sh +0 -96
  177. package/templates/adapters/qoder/hooks/lib/notify.sh +0 -36
  178. package/templates/adapters/qoder/hooks/lib/preload-templates.sh +0 -212
  179. package/templates/adapters/qoder/hooks/lib/session-end.sh +0 -76
  180. package/templates/adapters/qoder/hooks/lib/state-detect.sh +0 -13
  181. package/templates/adapters/qoder/hooks/lib/subagent-stop.sh +0 -90
  182. package/templates/adapters/qoder/hooks/lib/vocabulary.sh +0 -62
  183. package/templates/adapters/qoder/hooks/notification.sh +0 -25
  184. package/templates/adapters/qoder/hooks/permission-gate.sh +0 -8
  185. package/templates/adapters/qoder/hooks/post-tool-failure.sh +0 -8
  186. package/templates/adapters/qoder/hooks/post-tool-use.sh +0 -121
  187. package/templates/adapters/qoder/hooks/pre-compact.sh +0 -37
  188. package/templates/adapters/qoder/hooks/pre-tool-use.sh +0 -154
  189. package/templates/adapters/qoder/hooks/prompt-submit.sh +0 -96
  190. package/templates/adapters/qoder/hooks/review-checklist.sh +0 -157
  191. package/templates/adapters/qoder/hooks/session-end.sh +0 -24
  192. package/templates/adapters/qoder/hooks/session-start.sh +0 -45
  193. package/templates/adapters/qoder/hooks/stop-check.sh +0 -59
  194. package/templates/adapters/qoder/hooks/subagent-guard.sh +0 -27
  195. package/templates/adapters/qoder/hooks/subagent-stop.sh +0 -26
  196. package/templates/adapters/trae/hooks/doc-format-guard.sh +0 -343
  197. package/templates/adapters/trae/hooks/lib/common.sh +0 -220
  198. package/templates/adapters/trae/hooks/lib/context-inject.sh +0 -96
  199. package/templates/adapters/trae/hooks/lib/notify.sh +0 -36
  200. package/templates/adapters/trae/hooks/lib/preload-templates.sh +0 -212
  201. package/templates/adapters/trae/hooks/lib/session-end.sh +0 -76
  202. package/templates/adapters/trae/hooks/lib/state-detect.sh +0 -10
  203. package/templates/adapters/trae/hooks/lib/subagent-stop.sh +0 -90
  204. package/templates/adapters/trae/hooks/lib/vocabulary.sh +0 -62
  205. package/templates/adapters/trae/hooks/notification.sh +0 -45
  206. package/templates/adapters/trae/hooks/permission-gate.sh +0 -18
  207. package/templates/adapters/trae/hooks/post-tool-failure.sh +0 -10
  208. package/templates/adapters/trae/hooks/post-tool-use.sh +0 -138
  209. package/templates/adapters/trae/hooks/pre-compact.sh +0 -37
  210. package/templates/adapters/trae/hooks/pre-tool-use.sh +0 -223
  211. package/templates/adapters/trae/hooks/prompt-submit.sh +0 -87
  212. package/templates/adapters/trae/hooks/review-checklist.sh +0 -10
  213. package/templates/adapters/trae/hooks/session-end.sh +0 -38
  214. package/templates/adapters/trae/hooks/session-start.sh +0 -53
  215. package/templates/adapters/trae/hooks/stop-check.sh +0 -54
  216. package/templates/adapters/trae/hooks/subagent-guard.sh +0 -15
  217. package/templates/adapters/trae/hooks/subagent-stop.sh +0 -47
  218. package/templates/adapters/vscode/hooks/doc-format-guard.sh +0 -282
  219. package/templates/adapters/vscode/hooks/lib/common.sh +0 -220
  220. package/templates/adapters/vscode/hooks/lib/context-inject.sh +0 -96
  221. package/templates/adapters/vscode/hooks/lib/notify.sh +0 -36
  222. package/templates/adapters/vscode/hooks/lib/preload-templates.sh +0 -212
  223. package/templates/adapters/vscode/hooks/lib/session-end.sh +0 -76
  224. package/templates/adapters/vscode/hooks/lib/state-detect.sh +0 -13
  225. package/templates/adapters/vscode/hooks/lib/subagent-stop.sh +0 -90
  226. package/templates/adapters/vscode/hooks/lib/vocabulary.sh +0 -62
  227. package/templates/adapters/vscode/hooks/notification.sh +0 -43
  228. package/templates/adapters/vscode/hooks/permission-gate.sh +0 -18
  229. package/templates/adapters/vscode/hooks/post-tool-failure.sh +0 -28
  230. package/templates/adapters/vscode/hooks/post-tool-use.sh +0 -35
  231. package/templates/adapters/vscode/hooks/pre-compact.sh +0 -37
  232. package/templates/adapters/vscode/hooks/pre-tool-use.sh +0 -153
  233. package/templates/adapters/vscode/hooks/prompt-submit.sh +0 -99
  234. package/templates/adapters/vscode/hooks/review-checklist.sh +0 -10
  235. package/templates/adapters/vscode/hooks/session-end.sh +0 -13
  236. package/templates/adapters/vscode/hooks/session-start.sh +0 -35
  237. package/templates/adapters/vscode/hooks/stop-check.sh +0 -62
  238. package/templates/adapters/vscode/hooks/subagent-guard.sh +0 -37
  239. package/templates/adapters/vscode/hooks/subagent-stop.sh +0 -12
  240. package/templates/core/hooks/doc-format-guard.sh +0 -343
  241. package/templates/core/hooks/lib/common.sh +0 -220
  242. package/templates/core/hooks/lib/context-inject.sh +0 -96
  243. package/templates/core/hooks/lib/notify.sh +0 -36
  244. package/templates/core/hooks/lib/preload-templates.sh +0 -212
  245. package/templates/core/hooks/lib/session-end.sh +0 -76
  246. package/templates/core/hooks/lib/state-detect.sh +0 -10
  247. package/templates/core/hooks/lib/subagent-stop.sh +0 -90
  248. package/templates/core/hooks/lib/vocabulary.sh +0 -62
  249. package/templates/core/hooks/notification.sh +0 -45
  250. package/templates/core/hooks/permission-gate.sh +0 -18
  251. package/templates/core/hooks/post-tool-failure.sh +0 -10
  252. package/templates/core/hooks/post-tool-use.sh +0 -138
  253. package/templates/core/hooks/pre-compact.sh +0 -37
  254. package/templates/core/hooks/pre-tool-use.sh +0 -223
  255. package/templates/core/hooks/prompt-submit.sh +0 -87
  256. package/templates/core/hooks/review-checklist.sh +0 -10
  257. package/templates/core/hooks/session-end.sh +0 -38
  258. package/templates/core/hooks/session-start.sh +0 -53
  259. package/templates/core/hooks/stop-check.sh +0 -54
  260. package/templates/core/hooks/subagent-guard.sh +0 -15
  261. package/templates/core/hooks/subagent-stop.sh +0 -47
  262. package/templates/shared/hooks-lib/common.sh +0 -22
@@ -0,0 +1,66 @@
1
+ // prompt-submit.ts — UserPromptSubmit 入口(Qoder CN 版,Task 4.1 继承体系)
2
+ // 继承 core PromptRouter(L1/L2/L3 模板方法);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① preamble: 无条件 "ADD workflow active" JSON 注入(Qoder 主端协议)
4
+ // ② onAccepted: review-checklist 内存调用(checkReviewQuality,非 core 子进程)
5
+ // ③ devKwMatched: 逐个正则 some(core 是 join("|") 单正则)
6
+ // ④ layer3Json: true——Layer3 输出 hookSpecificOutput JSON 包
7
+ // ⑤ dailyInContext: true——日报并入 additionalContext(core 独立行)
8
+ // ⑥ dailyWarnText: 「建议创建 Plan」(无"或检查 hooks 误报")
9
+
10
+ import { readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
11
+ import { PromptRouter } from "../../../core/governance/prompt-router.js"
12
+ import { checkReviewQuality } from "../../../core/governance/review-checklist-guard.js"
13
+ import { injectProjectDir } from "./lib/qoder-env.js"
14
+
15
+ injectProjectDir()
16
+ const inferred = tryResolveMagicDir()
17
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
18
+ const MAGIC_DIR = process.env.MAGIC_DIR ?? ".qoder"
19
+
20
+ class QoderPromptRouter extends PromptRouter {
21
+ /** ① 前置注入: 无条件 JSON(Qoder CN IDE stdout JSON 注入模型上下文) */
22
+ protected override preamble(_input: string): void {
23
+ process.stdout.write(
24
+ JSON.stringify({
25
+ hookSpecificOutput: {
26
+ hookEventName: "UserPromptSubmit",
27
+ additionalContext: "ADD workflow active. Templates preloaded. Use add-paradigm SKILL.",
28
+ },
29
+ }) + "\n"
30
+ )
31
+ }
32
+
33
+ /** ② 验收后置: checklist 质量检查内存调用(bash 外部调用 → TS 内存调用,stdout 直出行为等价) */
34
+ protected override onAccepted(handoff: string, addRoute: string): void {
35
+ process.stdout.write(checkReviewQuality(handoff, addRoute) + "\n")
36
+ }
37
+
38
+ /** ③ 开发关键词匹配: 逐个正则 some */
39
+ protected override devKwMatched(prompt: string, devKw: string[]): boolean {
40
+ return devKw.some((kw) => {
41
+ try {
42
+ return new RegExp(kw, "i").test(prompt)
43
+ } catch {
44
+ return false
45
+ }
46
+ })
47
+ }
48
+
49
+ /** ④ Layer3 JSON 输出 */
50
+ protected override layer3Json(): boolean {
51
+ return true
52
+ }
53
+
54
+ /** ⑤ 日报并入 additionalContext */
55
+ protected override dailyInContext(): boolean {
56
+ return true
57
+ }
58
+
59
+ /** ⑥ 日报告警文本(无"或检查 hooks 误报") */
60
+ protected override dailyWarnText(noPlan: number, threshold: number): string {
61
+ return `[Hook ⚠️] 无 Plan 提示已达 ${noPlan} 次(≥${threshold}),建议创建 Plan`
62
+ }
63
+ }
64
+
65
+ const input = readHookInput()
66
+ process.exit(new QoderPromptRouter(MAGIC_DIR).run(input))
@@ -0,0 +1,24 @@
1
+ // review-checklist.ts — 验收 Review 模式(Qoder CN 版,Task 4.1 继承体系补全)
2
+ // 继承 core ReviewChecklistGuard,命名子类 QoderReviewChecklistGuard:
3
+ // ① specRoot = ".qoder/specs"(构造参数——checkReviewQuality 默认值同,qoder 协议差异)
4
+ // ② Step 0 准入失败 exit 1 语义 = 基类(qoder bash 原文逐字)
5
+ // 被 prompt-submit 的「验收」幂等检查后调用。
6
+
7
+ import { ReviewChecklistGuard } from "../../../core/governance/review-checklist-guard.js"
8
+ import { injectProjectDir } from "./lib/qoder-env.js"
9
+
10
+ class QoderReviewChecklistGuard extends ReviewChecklistGuard {
11
+ /** 协议差异封装: specRoot = ".qoder/specs"(qoder 端 spec 目录) */
12
+ constructor() {
13
+ super(".qoder/specs")
14
+ }
15
+
16
+ // 当前无 override(Step 0 准入 exit 1 语义与 core 基线一致);命名子类承载端身份 + 未来演进位
17
+ }
18
+
19
+ injectProjectDir()
20
+
21
+ const handoff = process.argv[2] ?? ""
22
+ const addRoute = process.argv[3] ?? ""
23
+
24
+ process.exit(new QoderReviewChecklistGuard().run(handoff, addRoute))
@@ -0,0 +1,27 @@
1
+ // session-end.ts — SessionEnd 入口(Qoder CN 版,Task 4.1 继承体系补全)
2
+ // 继承 core SessionEndGuard,命名子类 QoderSessionEndGuard:
3
+ // ① 清理标记(tpl + dev)= 基类(bash 原文逐字)
4
+ // ② emitSettle override: stdout JSON additionalContext(qoder 协议——
5
+ // 含 fallbackMsg 检测,bash 缺陷照搬: 清理后 hasDevAction 恒 false,fallbackMsg 恒空)
6
+ // ③ stopFallback = 基类(清理后 hasDevAction 恒 false → 恒无操作,与 qoder bash 原文等价)
7
+
8
+ import { hasDevAction, localIsoSeconds } from "../../../core/governance/common.js"
9
+ import { SessionEndGuard } from "../../../core/governance/session-end.js"
10
+ import { injectProjectDir } from "./lib/qoder-env.js"
11
+
12
+ class QoderSessionEndGuard extends SessionEndGuard {
13
+ /** ② qoder 协议: stdout JSON additionalContext(含 fallbackMsg 检测——bash 缺陷照搬顺序) */
14
+ protected override emitSettle(): void {
15
+ // bash 缺陷照搬: 先清理 dev 标记再检查 has_dev_action——清理后检查恒为 false
16
+ let fallbackMsg = ""
17
+ if (hasDevAction()) {
18
+ fallbackMsg = "⚠️ 检测到 dev action 标记未清除——Stop 可能未触发验收检查"
19
+ }
20
+ const ctx = `[ADD SessionEnd] 会话结束 — ${localIsoSeconds()}。标记已清理。${fallbackMsg}`
21
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "SessionEnd", additionalContext: ctx } }) + "\n")
22
+ }
23
+ }
24
+
25
+ injectProjectDir()
26
+
27
+ process.exit(new QoderSessionEndGuard().run())
@@ -0,0 +1,83 @@
1
+ // session-start.ts — SessionStart 入口(Qoder CN 版,Task 4.1 继承体系)
2
+ // 继承 core SessionStartGuard;仅 override 协议差异(bash 原文逐字对照):
3
+ // ① emitState: JSON 注入(ADD: plan Step.. Round.. + 代办并入)
4
+ // ② emitIndex: JSON 注入(lines 计数,对齐 bash wc -l)
5
+ // ③ emitTodoReminder: 空(代办已并入状态段)
6
+ // ④ emitHitlPending: JSON 注入
7
+
8
+ import { existsSync, readdirSync, statSync } from "node:fs"
9
+ import { join } from "node:path"
10
+ import { detectActiveAdd, tryResolveMagicDir } from "../../../core/governance/common.js"
11
+ import { PreloadTemplates } from "../../../core/governance/preload-templates.js"
12
+ import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
13
+ import { injectProjectDir } from "./lib/qoder-env.js"
14
+
15
+ const PROJECT_DIR = injectProjectDir()
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
+ /** JSON 输出助手(Qoder stdout 规范) */
21
+ function sessionJson(context: string): string {
22
+ return JSON.stringify({ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: context } }) + "\n"
23
+ }
24
+
25
+ class QoderSessionStartGuard extends SessionStartGuard {
26
+ constructor(projectDir: string) {
27
+ super(projectDir)
28
+ }
29
+
30
+ /** ① 状态恢复: JSON 注入(ADD: plan Step.. Round.. + 代办并入) */
31
+ protected override emitState(state: string | null): void {
32
+ if (state === null) return
33
+ const [plan, step, rounds] = state.split("::")
34
+ let addCtx = `ADD: ${plan} Step${step} Round${rounds}`
35
+ addCtx += "\n[代办] 如有未加载的 IDE 代办清单,请从 tasks.md §IDE JSON 刷新 TodoWrite"
36
+ process.stdout.write(sessionJson(addCtx))
37
+ }
38
+
39
+ /** ② 模板索引: JSON 注入(对齐 bash bash "$TPL_SCRIPT" --index | wc -l) */
40
+ protected override emitIndex(): void {
41
+ try {
42
+ const preload = new PreloadTemplates()
43
+ preload.validate()
44
+ const idx = preload.index()
45
+ const lines = idx.split("\n").length - 1 // wc -l 语义
46
+ process.stdout.write(sessionJson(`${lines} ADD templates available. Use preload-templates.sh --index for list.`))
47
+ } catch {
48
+ /* 对齐 bash [ -f "$TPL_SCRIPT" ] 缺失时跳过 */
49
+ }
50
+ }
51
+
52
+ /** ③ 代办已并入状态段 */
53
+ protected override emitTodoReminder(_state: string | null): void {
54
+ // qoder 协议: 代办并入 emitState
55
+ }
56
+
57
+ /** ④ HITL 待审批: JSON 注入(对齐 bash find *.hitl.md -mtime -7) */
58
+ protected override emitHitlPending(): void {
59
+ const plansDir = join(PROJECT_DIR, MAGIC_DIR, "plans")
60
+ if (MAGIC_DIR !== "" && existsSync(plansDir)) {
61
+ const weekAgo = Date.now() - 7 * 24 * 3600 * 1000
62
+ let hitlCount = 0
63
+ try {
64
+ hitlCount = readdirSync(plansDir)
65
+ .filter((f) => f.endsWith(".hitl.md"))
66
+ .filter((f) => {
67
+ try {
68
+ return statSync(join(plansDir, f)).mtimeMs >= weekAgo
69
+ } catch {
70
+ return false
71
+ }
72
+ }).length
73
+ } catch {
74
+ hitlCount = 0
75
+ }
76
+ if (hitlCount > 0) {
77
+ process.stdout.write(sessionJson(`[HITL 待审批] 检测到 ${hitlCount} 个待审批 HITL 提案,请检查并处理`))
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ process.exit(new QoderSessionStartGuard(PROJECT_DIR).run())
@@ -0,0 +1,69 @@
1
+ // stop-check.ts — Stop 入口(Qoder CN 版,Task 4.1 继承体系)
2
+ // 继承 core StopRouter(Q0-Q4 模板方法);仅 override 协议差异(bash 原文逐字对照):
3
+ // ① stop_hook_active=true → 跳过(Qoder 内部 Stop 触发,入口解析)
4
+ // ② emitQ0/Q3/Q4Pass: stdout 输出 hookSpecificOutput JSON(Qoder stdout 规范)
5
+ // ③ emitQ2/emitQ4Unclosed: stderr 无 \n 后缀(qoder 版差异)
6
+ // ④ ~~unclosedInterpolate: false~~ → 已修复(Task 9.4.1: 回归基类 true 插值语义)
7
+
8
+ import { readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
9
+ import { StopRouter } from "../../../core/governance/stop-router.js"
10
+ import { buildStopContext } from "./lib/context-inject.js"
11
+ import { injectProjectDir } from "./lib/qoder-env.js"
12
+
13
+ /** JSON 输出助手(Qoder stdout 规范) */
14
+ function stopJson(context: string): string {
15
+ return JSON.stringify({ hookSpecificOutput: { hookEventName: "Stop", additionalContext: context } }) + "\n"
16
+ }
17
+
18
+ class QoderStopRouter extends StopRouter {
19
+ /** ② Q0: stderr + stdout JSON + 2 */
20
+ protected override emitQ0(reason: string): number {
21
+ process.stderr.write(`[ADD Stop] ⛔ Plan status 暂不可用(${reason})。未回退 Handoff/add-route 猜测,请恢复数据库或 MCP resolver 后重试。\n`)
22
+ process.stdout.write(stopJson(`[ADD Stop] Plan status 暂不可用(${reason}),fail-closed 阻断`))
23
+ return 2
24
+ }
25
+
26
+ /** ③ Q2: stderr few-shot 无 \n 后缀(qoder 差异) */
27
+ protected override emitQ2(): number {
28
+ process.stderr.write(buildStopContext("no_add_has_dev", ""))
29
+ return 2
30
+ }
31
+
32
+ /** ② Q3: stdout JSON + 0 */
33
+ protected override emitQ3(plan: string, rounds: string, step: string): number {
34
+ process.stdout.write(stopJson(`[ADD Stop] Plan: ${plan}, 轮次: ${rounds}, Step: ${step}。本次无代码改动,下次继续时执行 session-init 恢复上下文。`))
35
+ return 0
36
+ }
37
+
38
+ /** ③④ Q4 未闭环: stderr 无 \n + 字面量缺陷照搬(不插值) */
39
+ protected override emitQ4Unclosed(info: string): number {
40
+ process.stderr.write(buildStopContext("has_add_dev_unclosed", info))
41
+ return 2
42
+ }
43
+
44
+ /** ② Q4 通过: stdout JSON + 0 */
45
+ protected override emitQ4Pass(): number {
46
+ process.stdout.write(stopJson("[ADD Stop] ✅ 验收通过——checklist 全部勾选,devlog 已记录。"))
47
+ return 0
48
+ }
49
+ }
50
+ // 注: ④ unclosedInterpolate 缺陷照搬(false → {{info}} 传空串不插值)已修复——
51
+ // 2026-08-14 Task 9.4.1 删除 override,回归基类 true(插值语义),golden 反写。
52
+
53
+ // ── 入口 ──
54
+ // 对齐 bash: stop_hook_active=true → 跳过(Qoder 内部 Stop 触发)
55
+ const input = readHookInput()
56
+ let stopActive = "false"
57
+ try {
58
+ const parsed = JSON.parse(input) as { stop_hook_active?: unknown }
59
+ stopActive = typeof parsed.stop_hook_active === "string" ? parsed.stop_hook_active : "false"
60
+ } catch {
61
+ stopActive = "false"
62
+ }
63
+ if (stopActive === "true") process.exit(0)
64
+
65
+ injectProjectDir()
66
+ const inferred = tryResolveMagicDir()
67
+ if (inferred && !process.env.MAGIC_DIR) process.env.MAGIC_DIR = inferred
68
+
69
+ process.exit(new QoderStopRouter().run())
@@ -0,0 +1,16 @@
1
+ // subagent-guard.ts — SubagentStart 入口(Qoder CN 版,Task 4.1 继承体系)
2
+ // 继承 core SubagentGuardRouter,命名子类 QoderSubagentGuardRouter:
3
+ // 输出形态 = 基类默认(hookSpecificOutput JSON,与 core 同构)——当前无 override,
4
+ // 命名子类承载端身份 + 未来演进位(如 SubagentStart 新增字段)。
5
+ // 协议差异: PROJECT_DIR 注入链(qoder-env)
6
+
7
+ import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
8
+ import { injectProjectDir } from "./lib/qoder-env.js"
9
+
10
+ class QoderSubagentGuardRouter extends SubagentGuardRouter {
11
+ // 当前无 override(基类 JSON 输出即 qoder 协议)
12
+ }
13
+
14
+ injectProjectDir()
15
+
16
+ process.exit(new QoderSubagentGuardRouter().run())
@@ -0,0 +1,33 @@
1
+ // subagent-stop.ts — SubagentStop 入口(Qoder CN 版,Task 4.1 继承体系补全)
2
+ // 继承 core SubagentStopRouter,命名子类 QoderSubagentStopRouter(qoder 协议差异 override):
3
+ // ① checkDeliverables: false——qoder 轻量提示无阻断(bash 原文无交付物越界检查)
4
+ // ② emitNoPlanWarn: stdout JSON(qoder 协议;core 是 stderr 文本)
5
+ // ③ emitBoundaryPass: stdout JSON(qoder 协议;core 是 stderr 两行审计)
6
+
7
+ import { detectActiveAdd, readHookInput } from "../../../core/governance/common.js"
8
+ import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
9
+ import { injectProjectDir } from "./lib/qoder-env.js"
10
+
11
+ class QoderSubagentStopRouter extends SubagentStopRouter {
12
+ /** ① qoder 轻量提示无阻断(bash 原文无交付物越界检查) */
13
+ protected override checkDeliverables(): boolean {
14
+ return false
15
+ }
16
+
17
+ /** ② 无活跃 Plan: stdout JSON(qoder 协议) */
18
+ protected override emitNoPlanWarn(agentName: string): void {
19
+ const ctx = `[ADD SubagentStop] ⚠️ ${agentName} 已完成,但无活跃 ADD Plan 无法校验边界。`
20
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "SubagentStop", additionalContext: ctx } }) + "\n")
21
+ }
22
+
23
+ /** ③ 边界通过: stdout JSON(qoder 协议——bash 原文逐字文本) */
24
+ protected override emitBoundaryPass(agentName: string, planKw: string, handoff: string): void {
25
+ const ctx = `[ADD SubagentStop] ${agentName} 子代理结束。Plan: ${planKw}, handoff: ${handoff}。边界校验通过,审计已聚合。`
26
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "SubagentStop", additionalContext: ctx } }) + "\n")
27
+ }
28
+ }
29
+
30
+ injectProjectDir()
31
+
32
+ const input = readHookInput()
33
+ process.exit(new QoderSubagentStopRouter().run(input))
@@ -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())