add-coder 0.3.27 → 0.3.29
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.
- package/README.md +252 -150
- package/package.json +2 -1
- package/templates/.add-coder-src-hash.json +126 -148
- package/templates/adapters/claude/hooks/doc-format-guard.ts +32 -0
- package/templates/adapters/claude/hooks/lib/claude-env.ts +7 -0
- package/templates/adapters/claude/hooks/notification.ts +24 -0
- package/templates/adapters/claude/hooks/permission-denied.ts +33 -0
- package/templates/adapters/claude/hooks/permission-gate.ts +12 -0
- package/templates/adapters/claude/hooks/post-tool-failure.ts +4 -0
- package/templates/adapters/claude/hooks/post-tool-use.ts +17 -0
- package/templates/adapters/claude/hooks/pre-compact.ts +10 -0
- package/templates/adapters/claude/hooks/pre-tool-use.ts +81 -0
- package/templates/adapters/claude/hooks/prompt-submit.ts +82 -0
- package/templates/adapters/claude/hooks/review-checklist.ts +4 -0
- package/templates/adapters/claude/hooks/session-end.ts +10 -0
- package/templates/adapters/claude/hooks/session-start.ts +24 -0
- package/templates/adapters/claude/hooks/stop-check.ts +15 -0
- package/templates/adapters/claude/hooks/stop-failure.ts +34 -0
- package/templates/adapters/claude/hooks/subagent-guard.ts +25 -0
- package/templates/adapters/claude/hooks/subagent-stop.ts +12 -0
- package/templates/adapters/claude/settings.json +13 -13
- package/templates/adapters/codex/hooks/doc-format-guard.ts +30 -0
- package/templates/adapters/codex/hooks/notification.ts +26 -0
- package/templates/adapters/codex/hooks/permission-gate.ts +15 -0
- package/templates/adapters/codex/hooks/post-tool-failure.ts +14 -0
- package/templates/adapters/codex/hooks/post-tool-use.ts +85 -0
- package/templates/adapters/codex/hooks/pre-compact.ts +20 -0
- package/templates/adapters/codex/hooks/pre-tool-use.ts +141 -0
- package/templates/adapters/codex/hooks/prompt-submit.ts +38 -0
- package/templates/adapters/codex/hooks/review-checklist.ts +5 -0
- package/templates/adapters/codex/hooks/session-end.ts +19 -0
- package/templates/adapters/codex/hooks/session-start.ts +45 -0
- package/templates/adapters/codex/hooks/stop-check.ts +59 -0
- package/templates/adapters/codex/hooks/subagent-guard.ts +22 -0
- package/templates/adapters/codex/hooks/subagent-stop.ts +20 -0
- package/templates/adapters/codex/hooks.json +5 -5
- package/templates/adapters/qoder/hooks/doc-format-guard.ts +34 -0
- package/templates/adapters/qoder/hooks/lib/context-inject.ts +61 -0
- package/templates/adapters/qoder/hooks/lib/qoder-env.ts +23 -0
- package/templates/adapters/qoder/hooks/lib/review-checklist.ts +5 -0
- package/templates/adapters/qoder/hooks/notification.ts +34 -0
- package/templates/adapters/qoder/hooks/permission-gate.ts +26 -0
- package/templates/adapters/qoder/hooks/post-tool-failure.ts +30 -0
- package/templates/adapters/qoder/hooks/post-tool-use.ts +32 -0
- package/templates/adapters/qoder/hooks/pre-compact.ts +16 -0
- package/templates/adapters/qoder/hooks/pre-tool-use.ts +112 -0
- package/templates/adapters/qoder/hooks/prompt-submit.ts +66 -0
- package/templates/adapters/qoder/hooks/review-checklist.ts +24 -0
- package/templates/adapters/qoder/hooks/session-end.ts +27 -0
- package/templates/adapters/qoder/hooks/session-start.ts +83 -0
- package/templates/adapters/qoder/hooks/stop-check.ts +69 -0
- package/templates/adapters/qoder/hooks/subagent-guard.ts +16 -0
- package/templates/adapters/qoder/hooks/subagent-stop.ts +33 -0
- package/templates/adapters/qoder/settings.json +13 -13
- package/templates/adapters/trae/hooks/doc-format-guard.ts +30 -0
- package/templates/adapters/trae/hooks/notification.ts +22 -0
- package/templates/adapters/trae/hooks/permission-gate.ts +15 -0
- package/templates/adapters/trae/hooks/post-tool-failure.ts +14 -0
- package/templates/adapters/trae/hooks/post-tool-use.ts +24 -0
- package/templates/adapters/trae/hooks/pre-compact.ts +15 -0
- package/templates/adapters/trae/hooks/pre-tool-use.ts +40 -0
- package/templates/adapters/trae/hooks/prompt-submit.ts +29 -0
- package/templates/adapters/trae/hooks/review-checklist.ts +5 -0
- package/templates/adapters/trae/hooks/session-end.ts +16 -0
- package/templates/adapters/trae/hooks/session-start.ts +15 -0
- package/templates/adapters/trae/hooks/stop-check.ts +20 -0
- package/templates/adapters/trae/hooks/subagent-guard.ts +22 -0
- package/templates/adapters/trae/hooks/subagent-stop.ts +15 -0
- package/templates/adapters/trae/hooks.json +1 -1
- package/templates/adapters/vscode/hooks/doc-format-guard.ts +27 -0
- package/templates/adapters/vscode/hooks/notification.ts +22 -0
- package/templates/adapters/vscode/hooks/permission-gate.ts +15 -0
- package/templates/adapters/vscode/hooks/post-tool-failure.ts +32 -0
- package/templates/adapters/vscode/hooks/post-tool-use.ts +25 -0
- package/templates/adapters/vscode/hooks/pre-compact.ts +15 -0
- package/templates/adapters/vscode/hooks/pre-tool-use.ts +78 -0
- package/templates/adapters/vscode/hooks/prompt-submit.ts +74 -0
- package/templates/adapters/vscode/hooks/review-checklist.ts +5 -0
- package/templates/adapters/vscode/hooks/session-end.ts +16 -0
- package/templates/adapters/vscode/hooks/session-start.ts +24 -0
- package/templates/adapters/vscode/hooks/stop-check.ts +21 -0
- package/templates/adapters/vscode/hooks/subagent-guard.ts +21 -0
- package/templates/adapters/vscode/hooks/subagent-stop.ts +15 -0
- package/templates/core/docs/ADD-governance-claude-code.md +3 -3
- package/templates/core/docs/ADD-governance-codex.md +5 -5
- package/templates/core/docs/ADD-governance-qoder-cn.md +4 -4
- package/templates/core/docs/ADD-governance-trae.md +2 -2
- package/templates/core/docs/ADD-governance-vscode-copilot.md +21 -22
- package/templates/core/governance/audit-bridge.ts +47 -0
- package/templates/core/governance/common.ts +299 -0
- package/templates/core/governance/context-inject.ts +53 -0
- package/templates/core/governance/doc-format-guard.ts +440 -0
- package/templates/core/governance/notification-router.ts +62 -0
- package/templates/core/governance/notify.ts +66 -0
- package/templates/core/governance/permission-gate-router.ts +42 -0
- package/templates/core/governance/post-tool-failure-router.ts +56 -0
- package/templates/core/governance/post-tool-router.ts +212 -0
- package/templates/core/governance/pre-compact-guard.ts +41 -0
- package/templates/core/governance/pre-tool-guard.ts +309 -0
- package/templates/core/governance/preload-templates.ts +241 -0
- package/templates/core/governance/prompt-router.ts +222 -0
- package/templates/core/governance/review-checklist-guard.ts +186 -0
- package/templates/core/governance/rules.ts +720 -0
- package/templates/core/governance/session-end.ts +88 -0
- package/templates/core/governance/session-start-guard.ts +99 -0
- package/templates/core/governance/state-detect.ts +6 -0
- package/templates/core/governance/stop-router.ts +140 -0
- package/templates/core/governance/subagent-guard-router.ts +35 -0
- package/templates/core/governance/subagent-stop-router.ts +93 -0
- package/templates/core/governance/subagent-stop.ts +75 -0
- package/templates/core/governance/vocabulary.ts +109 -0
- package/templates/core/hooks/doc-format-guard.ts +21 -0
- package/templates/core/hooks/notification.ts +11 -0
- package/templates/core/hooks/permission-gate.ts +7 -0
- package/templates/core/hooks/post-tool-failure.ts +7 -0
- package/templates/core/hooks/post-tool-use.ts +23 -0
- package/templates/core/hooks/pre-compact.ts +9 -0
- package/templates/core/hooks/pre-tool-use.ts +30 -0
- package/templates/core/hooks/prompt-submit.ts +11 -0
- package/templates/core/hooks/review-checklist.ts +4 -0
- package/templates/core/hooks/session-end.ts +10 -0
- package/templates/core/hooks/session-start.ts +9 -0
- package/templates/core/hooks/stop-check.ts +14 -0
- package/templates/core/hooks/subagent-guard.ts +8 -0
- package/templates/core/hooks/subagent-stop.ts +9 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +12 -1
- package/templates/core/scripts/mcp-server/tools/plan.ts +12 -2
- package/templates/adapters/claude/hooks/doc-format-guard.sh +0 -283
- package/templates/adapters/claude/hooks/lib/common.sh +0 -220
- package/templates/adapters/claude/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/claude/hooks/lib/notify.sh +0 -36
- package/templates/adapters/claude/hooks/lib/preload-templates.sh +0 -212
- package/templates/adapters/claude/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/claude/hooks/lib/state-detect.sh +0 -13
- package/templates/adapters/claude/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/claude/hooks/lib/vocabulary.sh +0 -62
- package/templates/adapters/claude/hooks/notification.sh +0 -45
- package/templates/adapters/claude/hooks/permission-denied.sh +0 -42
- package/templates/adapters/claude/hooks/permission-gate.sh +0 -18
- package/templates/adapters/claude/hooks/post-tool-failure.sh +0 -10
- package/templates/adapters/claude/hooks/post-tool-use.sh +0 -35
- package/templates/adapters/claude/hooks/pre-compact.sh +0 -37
- package/templates/adapters/claude/hooks/pre-tool-use.sh +0 -153
- package/templates/adapters/claude/hooks/prompt-submit.sh +0 -99
- package/templates/adapters/claude/hooks/review-checklist.sh +0 -10
- package/templates/adapters/claude/hooks/session-end.sh +0 -21
- package/templates/adapters/claude/hooks/session-start.sh +0 -36
- package/templates/adapters/claude/hooks/stop-check.sh +0 -54
- package/templates/adapters/claude/hooks/stop-failure.sh +0 -44
- package/templates/adapters/claude/hooks/subagent-guard.sh +0 -36
- package/templates/adapters/claude/hooks/subagent-stop.sh +0 -20
- package/templates/adapters/codex/hooks/doc-format-guard.sh +0 -343
- package/templates/adapters/codex/hooks/lib/common.sh +0 -209
- package/templates/adapters/codex/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/codex/hooks/lib/notify.sh +0 -36
- package/templates/adapters/codex/hooks/lib/preload-templates.sh +0 -208
- package/templates/adapters/codex/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/codex/hooks/lib/state-detect.sh +0 -8
- package/templates/adapters/codex/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/codex/hooks/lib/vocabulary.sh +0 -51
- package/templates/adapters/codex/hooks/notification.sh +0 -30
- package/templates/adapters/codex/hooks/permission-gate.sh +0 -18
- package/templates/adapters/codex/hooks/post-tool-failure.sh +0 -10
- package/templates/adapters/codex/hooks/post-tool-use.sh +0 -43
- package/templates/adapters/codex/hooks/pre-compact.sh +0 -37
- package/templates/adapters/codex/hooks/pre-tool-use.sh +0 -130
- package/templates/adapters/codex/hooks/prompt-submit.sh +0 -92
- package/templates/adapters/codex/hooks/review-checklist.sh +0 -10
- package/templates/adapters/codex/hooks/session-end.sh +0 -38
- package/templates/adapters/codex/hooks/session-start.sh +0 -63
- package/templates/adapters/codex/hooks/stop-check.sh +0 -71
- package/templates/adapters/codex/hooks/subagent-guard.sh +0 -15
- package/templates/adapters/codex/hooks/subagent-stop.sh +0 -47
- package/templates/adapters/qoder/hooks/doc-format-guard.sh +0 -341
- package/templates/adapters/qoder/hooks/lib/common.sh +0 -223
- package/templates/adapters/qoder/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/qoder/hooks/lib/notify.sh +0 -36
- package/templates/adapters/qoder/hooks/lib/preload-templates.sh +0 -212
- package/templates/adapters/qoder/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/qoder/hooks/lib/state-detect.sh +0 -13
- package/templates/adapters/qoder/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/qoder/hooks/lib/vocabulary.sh +0 -62
- package/templates/adapters/qoder/hooks/notification.sh +0 -25
- package/templates/adapters/qoder/hooks/permission-gate.sh +0 -8
- package/templates/adapters/qoder/hooks/post-tool-failure.sh +0 -8
- package/templates/adapters/qoder/hooks/post-tool-use.sh +0 -121
- package/templates/adapters/qoder/hooks/pre-compact.sh +0 -37
- package/templates/adapters/qoder/hooks/pre-tool-use.sh +0 -154
- package/templates/adapters/qoder/hooks/prompt-submit.sh +0 -96
- package/templates/adapters/qoder/hooks/review-checklist.sh +0 -157
- package/templates/adapters/qoder/hooks/session-end.sh +0 -24
- package/templates/adapters/qoder/hooks/session-start.sh +0 -45
- package/templates/adapters/qoder/hooks/stop-check.sh +0 -59
- package/templates/adapters/qoder/hooks/subagent-guard.sh +0 -27
- package/templates/adapters/qoder/hooks/subagent-stop.sh +0 -26
- package/templates/adapters/trae/hooks/doc-format-guard.sh +0 -343
- package/templates/adapters/trae/hooks/lib/common.sh +0 -220
- package/templates/adapters/trae/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/trae/hooks/lib/notify.sh +0 -36
- package/templates/adapters/trae/hooks/lib/preload-templates.sh +0 -212
- package/templates/adapters/trae/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/trae/hooks/lib/state-detect.sh +0 -10
- package/templates/adapters/trae/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/trae/hooks/lib/vocabulary.sh +0 -62
- package/templates/adapters/trae/hooks/notification.sh +0 -45
- package/templates/adapters/trae/hooks/permission-gate.sh +0 -18
- package/templates/adapters/trae/hooks/post-tool-failure.sh +0 -10
- package/templates/adapters/trae/hooks/post-tool-use.sh +0 -138
- package/templates/adapters/trae/hooks/pre-compact.sh +0 -37
- package/templates/adapters/trae/hooks/pre-tool-use.sh +0 -223
- package/templates/adapters/trae/hooks/prompt-submit.sh +0 -87
- package/templates/adapters/trae/hooks/review-checklist.sh +0 -10
- package/templates/adapters/trae/hooks/session-end.sh +0 -38
- package/templates/adapters/trae/hooks/session-start.sh +0 -53
- package/templates/adapters/trae/hooks/stop-check.sh +0 -54
- package/templates/adapters/trae/hooks/subagent-guard.sh +0 -15
- package/templates/adapters/trae/hooks/subagent-stop.sh +0 -47
- package/templates/adapters/vscode/hooks/doc-format-guard.sh +0 -282
- package/templates/adapters/vscode/hooks/lib/common.sh +0 -220
- package/templates/adapters/vscode/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/vscode/hooks/lib/notify.sh +0 -36
- package/templates/adapters/vscode/hooks/lib/preload-templates.sh +0 -212
- package/templates/adapters/vscode/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/vscode/hooks/lib/state-detect.sh +0 -13
- package/templates/adapters/vscode/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/vscode/hooks/lib/vocabulary.sh +0 -62
- package/templates/adapters/vscode/hooks/notification.sh +0 -43
- package/templates/adapters/vscode/hooks/permission-gate.sh +0 -18
- package/templates/adapters/vscode/hooks/post-tool-failure.sh +0 -28
- package/templates/adapters/vscode/hooks/post-tool-use.sh +0 -35
- package/templates/adapters/vscode/hooks/pre-compact.sh +0 -37
- package/templates/adapters/vscode/hooks/pre-tool-use.sh +0 -153
- package/templates/adapters/vscode/hooks/prompt-submit.sh +0 -99
- package/templates/adapters/vscode/hooks/review-checklist.sh +0 -10
- package/templates/adapters/vscode/hooks/session-end.sh +0 -13
- package/templates/adapters/vscode/hooks/session-start.sh +0 -35
- package/templates/adapters/vscode/hooks/stop-check.sh +0 -62
- package/templates/adapters/vscode/hooks/subagent-guard.sh +0 -37
- package/templates/adapters/vscode/hooks/subagent-stop.sh +0 -12
- package/templates/core/hooks/doc-format-guard.sh +0 -343
- package/templates/core/hooks/lib/common.sh +0 -220
- package/templates/core/hooks/lib/context-inject.sh +0 -96
- package/templates/core/hooks/lib/notify.sh +0 -36
- package/templates/core/hooks/lib/preload-templates.sh +0 -212
- package/templates/core/hooks/lib/session-end.sh +0 -76
- package/templates/core/hooks/lib/state-detect.sh +0 -10
- package/templates/core/hooks/lib/subagent-stop.sh +0 -90
- package/templates/core/hooks/lib/vocabulary.sh +0 -62
- package/templates/core/hooks/notification.sh +0 -45
- package/templates/core/hooks/permission-gate.sh +0 -18
- package/templates/core/hooks/post-tool-failure.sh +0 -10
- package/templates/core/hooks/post-tool-use.sh +0 -138
- package/templates/core/hooks/pre-compact.sh +0 -37
- package/templates/core/hooks/pre-tool-use.sh +0 -223
- package/templates/core/hooks/prompt-submit.sh +0 -87
- package/templates/core/hooks/review-checklist.sh +0 -10
- package/templates/core/hooks/session-end.sh +0 -38
- package/templates/core/hooks/session-start.sh +0 -53
- package/templates/core/hooks/stop-check.sh +0 -54
- package/templates/core/hooks/subagent-guard.sh +0 -15
- package/templates/core/hooks/subagent-stop.sh +0 -47
- package/templates/shared/hooks-lib/common.sh +0 -22
|
@@ -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":"
|
|
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
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// prompt-submit.ts — UserPromptSubmit 入口(VS Code Copilot 版,Task 5.1 继承体系)
|
|
2
|
+
// 继承 core PromptRouter(L1/L2/L3 模板方法);仅 override 协议差异(bash 原文逐字对照):
|
|
3
|
+
// ① extractPrompt: grep 正则提取(无 jq)
|
|
4
|
+
// ② acceptedText: 验收 4 行(无 ★ 同步检查行——vscode bash 原文)
|
|
5
|
+
// ③ onAccepted: 无 review-checklist 子进程
|
|
6
|
+
// ④ onDevKwMatched: stderr "[ADD PromptSubmit] 检测到开发关键词"
|
|
7
|
+
// ⑤ layer2ToStderr: false(Layer2 提示输出 stdout)
|
|
8
|
+
// ⑥ layer3Text: 「[ADD 当前状态]」多行块
|
|
9
|
+
// ⑦ afterLayer3: 模板全文注入(--full --top 5)
|
|
10
|
+
|
|
11
|
+
import { readHookInput } from "../../../core/governance/common.js"
|
|
12
|
+
import { PreloadTemplates } from "../../../core/governance/preload-templates.js"
|
|
13
|
+
import { PromptRouter } from "../../../core/governance/prompt-router.js"
|
|
14
|
+
|
|
15
|
+
const MAGIC_DIR = process.env.MAGIC_DIR || ".vscode"
|
|
16
|
+
|
|
17
|
+
class VscodePromptRouter extends PromptRouter {
|
|
18
|
+
/** ① prompt 提取(对齐 bash grep/sed,无 jq) */
|
|
19
|
+
protected override extractPrompt(input: string): string {
|
|
20
|
+
return input.match(/"prompt"\s*:\s*"([^"]*)"/)?.[1] ?? ""
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** ② 验收幂等文本(vscode 4 行,无 ★ 同步检查) */
|
|
24
|
+
protected override acceptedText(): string {
|
|
25
|
+
return `[ADD 验收] ⚠️ 已验收。进入 Review 模式:
|
|
26
|
+
① 重新检查 checklist [T]/[R] 项
|
|
27
|
+
② 审查 audit 记录完整性
|
|
28
|
+
③ 如有差异 → Review 回流至 handoff(增量更新)
|
|
29
|
+
④ 无差异 → 记录 'Review 已确认,无新发现'
|
|
30
|
+
`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** ③ 验收后置(vscode 无 review-checklist 子进程) */
|
|
34
|
+
protected override onAccepted(_handoff: string, _addRoute: string): void {
|
|
35
|
+
// vscode 协议: 无子进程调用
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** ④ 开发关键词命中提示(stderr) */
|
|
39
|
+
protected override onDevKwMatched(): void {
|
|
40
|
+
process.stderr.write("[ADD PromptSubmit] 检测到开发关键词\n")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** ⑤ Layer 2 输出通道(vscode: stdout) */
|
|
44
|
+
protected override layer2ToStderr(): boolean {
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** ⑥ Layer 3 状态文本(多行块) */
|
|
49
|
+
protected override layer3Text(plan: string, rounds: string, step: string, handoff: string): string {
|
|
50
|
+
return `[ADD 当前状态]
|
|
51
|
+
Plan: ${plan}
|
|
52
|
+
轮次: ${rounds}
|
|
53
|
+
当前 Step: ${step}
|
|
54
|
+
handoff: ${handoff}
|
|
55
|
+
`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** ⑦ Layer 3 附加注入: 模板全文(--full --top 5 + tpl-injected 去重) */
|
|
59
|
+
protected override afterLayer3(): void {
|
|
60
|
+
try {
|
|
61
|
+
const preload = new PreloadTemplates()
|
|
62
|
+
preload.validate()
|
|
63
|
+
if (!preload.isInjected()) {
|
|
64
|
+
process.stdout.write(preload.full(5))
|
|
65
|
+
preload.markInjected()
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
/* 对齐 bash [ -f "$TPL_SCRIPT" ] 缺失时跳过 */
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const input = readHookInput()
|
|
74
|
+
process.exit(new VscodePromptRouter(MAGIC_DIR).run(input))
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// session-end.ts — SessionEnd 入口(VS Code Copilot 版,Task 5.1 继承体系)
|
|
2
|
+
// 继承 core SessionEndGuard,命名子类 VscodeSessionEndGuard:
|
|
3
|
+
// 完整治理(标记清理 + 审计结算 + Stop 兜底)——能力对齐注(2026-08-14 发现):
|
|
4
|
+
// bash 版薄包装 source lib/session-end.sh 后 main 因 BASH_SOURCE 守卫不执行
|
|
5
|
+
// (卡位 #2 完全失效);TS 版实现完整治理,与 core/qoder/trae 对齐。
|
|
6
|
+
// 当前无 override,命名子类承载端身份 + 未来演进位
|
|
7
|
+
// 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)
|
|
8
|
+
|
|
9
|
+
import { SessionEndGuard } from "../../../core/governance/session-end.js"
|
|
10
|
+
|
|
11
|
+
class VscodeSessionEndGuard extends SessionEndGuard {
|
|
12
|
+
// 当前无 override(清理/结算/兜底与 core 基线一致);命名子类承载端身份 + 未来演进位
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
|
|
16
|
+
process.exit(new VscodeSessionEndGuard(PROJECT_DIR).run())
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// session-start.ts — SessionStart 入口(VS Code Copilot 版,Task 5.1 继承体系)
|
|
2
|
+
// 继承 core SessionStartGuard,命名子类 VscodeSessionStartGuard:
|
|
3
|
+
// ① emitState(纯文本状态块)+ ② emitIndex(模板索引)= 基类默认(与 vscode bash 原文逐字一致)
|
|
4
|
+
// ③ emitTodoReminder / ④ emitHitlPending = override 为空(vscode bash 原文仅两段,
|
|
5
|
+
// 无代办/HITL 段——与 claude 同构差异,2026-08-14 实态核验)
|
|
6
|
+
// 协议差异仅剩: PROJECT_DIR = $PWD(vscode 无注入链)
|
|
7
|
+
|
|
8
|
+
import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
|
|
9
|
+
|
|
10
|
+
class VscodeSessionStartGuard extends SessionStartGuard {
|
|
11
|
+
/** ③ vscode 版无代办刷新段 */
|
|
12
|
+
protected override emitTodoReminder(_state: string | null): void {
|
|
13
|
+
// vscode 协议: 无代办刷新段(bash 原文仅两段)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** ④ vscode 版无 HITL 待审批段 */
|
|
17
|
+
protected override emitHitlPending(): void {
|
|
18
|
+
// vscode 协议: 无 HITL 检测段(bash 原文仅两段)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
process.env.PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
|
|
23
|
+
|
|
24
|
+
process.exit(new VscodeSessionStartGuard(process.env.PROJECT_DIR).run())
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// stop-check.ts — Stop 入口(VS Code Copilot 版,Task 5.1 继承体系)
|
|
2
|
+
// 继承 core StopRouter,命名子类 VscodeStopRouter:
|
|
3
|
+
// bash 原文与 core 逐字相同(2026-08-14 实态核验: vscode bash L40/L56 与 core bash L32/L48
|
|
4
|
+
// 均为 build_stop_context 无 echo,Q2/Q4 换行语义对齐 core TS +"\n")——当前无 override,
|
|
5
|
+
// 命名子类承载端身份 + 未来演进位
|
|
6
|
+
// 协议差异: 无(纯文本形态同 core);MAGIC_DIR 物理推导注入(对齐 bash export)
|
|
7
|
+
|
|
8
|
+
import { tryResolveMagicDir } from "../../../core/governance/common.js"
|
|
9
|
+
import { StopRouter } from "../../../core/governance/stop-router.js"
|
|
10
|
+
|
|
11
|
+
class VscodeStopRouter extends StopRouter {
|
|
12
|
+
// 当前无 override(Q0-Q4 分流与 core 基线一致);命名子类承载端身份 + 未来演进位
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// 对齐 bash: MAGIC_DIR 从物理位置推导并 export(入口注入优先)
|
|
16
|
+
const inferredMagicDir = tryResolveMagicDir()
|
|
17
|
+
if (inferredMagicDir && !process.env.MAGIC_DIR) {
|
|
18
|
+
process.env.MAGIC_DIR = inferredMagicDir
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
process.exit(new VscodeStopRouter().run())
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// subagent-guard.ts — SubagentStart 入口(VS Code Copilot 版,Task 3.1 继承体系)
|
|
2
|
+
// 继承 core SubagentGuardRouter(状态注入模板方法——能力对齐);仅 override 协议差异:
|
|
3
|
+
// ① 输出形态: 纯文本状态块(core/qoder 是 hookSpecificOutput JSON)
|
|
4
|
+
|
|
5
|
+
import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
|
|
6
|
+
|
|
7
|
+
class VscodeSubagentGuardRouter extends SubagentGuardRouter {
|
|
8
|
+
/** ① 纯文本状态块(vscode 协议,与 claude 同构) */
|
|
9
|
+
protected override emit(state: string): void {
|
|
10
|
+
const [plan, step, rounds, handoff] = state.split("::")
|
|
11
|
+
process.stdout.write(`[ADD SubagentStart] 子代理上下文注入:
|
|
12
|
+
Plan: ${plan}
|
|
13
|
+
Step: ${step}
|
|
14
|
+
轮次: ${rounds}
|
|
15
|
+
handoff: ${handoff}
|
|
16
|
+
遵循 ADD 规范,完成后请检查 checklist 对应项
|
|
17
|
+
`)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
process.exit(new VscodeSubagentGuardRouter().run())
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// subagent-stop.ts — SubagentStop 入口(VS Code Copilot 版,Task 5.1 继承体系)
|
|
2
|
+
// 继承 core SubagentStopRouter,命名子类 VscodeSubagentStopRouter:
|
|
3
|
+
// 边界校验 + 审计聚合与 core 逐字同构(2026-08-14 实态核验: vscode 完整实现版
|
|
4
|
+
// 与 core 相同,收敛为子类)——当前无 override,命名子类承载端身份 + 未来演进位
|
|
5
|
+
// 协议差异: 无
|
|
6
|
+
|
|
7
|
+
import { readHookInput } from "../../../core/governance/common.js"
|
|
8
|
+
import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
|
|
9
|
+
|
|
10
|
+
class VscodeSubagentStopRouter extends SubagentStopRouter {
|
|
11
|
+
// 当前无 override(边界校验 + 审计聚合与 core 基线一致);命名子类承载端身份 + 未来演进位
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const input = readHookInput()
|
|
15
|
+
process.exit(new VscodeSubagentStopRouter().run(input))
|
|
@@ -17,7 +17,7 @@ Claude Code 支持 17 种事件,按频率分三档:
|
|
|
17
17
|
| 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure、PermissionRequest、PermissionDenied |
|
|
18
18
|
| 其他 | PreCompact、SubagentStart、SubagentStop、Notification、ConfigChange、WorktreeCreate/Remove |
|
|
19
19
|
|
|
20
|
-
配置位置:`.claude/hooks/*.
|
|
20
|
+
配置位置:`.claude/hooks/*.mjs`(TS 源码 esbuild 烘焙零依赖产物)+ `.claude/settings.json`(command 直调 node)——2026-08-14 hook node 化实态,bash 待退役
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -65,13 +65,13 @@ Claude Code 的注入通道为 **stdout → additionalContext**——hook 脚本
|
|
|
65
65
|
│ │
|
|
66
66
|
│ SessionStart │
|
|
67
67
|
│ ├─ detect_active_add() 扫描 plans/ 恢复 ADD 状态 │
|
|
68
|
-
│ ├─ preload-templates.
|
|
68
|
+
│ ├─ preload-templates.mjs --index │
|
|
69
69
|
│ └─ stdout → additionalContext 注入 │
|
|
70
70
|
│ │ │
|
|
71
71
|
│ ▼ │
|
|
72
72
|
│ UserPromptSubmit │
|
|
73
73
|
│ ├─ match_trigger() 检测 ADD 触发词 │
|
|
74
|
-
│ ├─ 首次命中 → preload-templates.
|
|
74
|
+
│ ├─ 首次命中 → preload-templates.mjs --full │
|
|
75
75
|
│ ├─ touch tpl-injected 标记 │
|
|
76
76
|
│ └─ 同会话二次命中 → 短路 │
|
|
77
77
|
│ │ │
|
|
@@ -44,15 +44,15 @@ Notification ─────────────────→ ⑫ 开发
|
|
|
44
44
|
|
|
45
45
|
Codex 的注入通道为 **stdout**(与 Claude Code 兼容)。Codex 支持导入 Claude Code Hook 配置,可通过双通道架构获得完整治理:
|
|
46
46
|
|
|
47
|
-
- **Codex 原生**(
|
|
48
|
-
- **Claude Code 导入**(
|
|
47
|
+
- **Codex 原生**(5 事件,`.codex/hooks.json` → `.codex/hooks/*.mjs` node 直调——2026-08-14 node 化实态,bash 待退役)
|
|
48
|
+
- **Claude Code 导入**(11 事件,`.claude/settings.json` → `.claude/hooks/*.mjs`)——Codex 设置中开启「导入其他 agent 配置」即可。同一套产物,两通道共享,脚本内置幂等保护。
|
|
49
49
|
|
|
50
50
|
```
|
|
51
51
|
npx add-coder init --adapter=codex
|
|
52
52
|
│
|
|
53
|
-
├──→ .codex/hooks.json (
|
|
53
|
+
├──→ .codex/hooks.json (5 事件 → .codex/hooks/*.mjs)
|
|
54
54
|
├──→ .codex/settings.json
|
|
55
|
-
└──→ .claude/ ★ (含完整
|
|
55
|
+
└──→ .claude/ ★ (含完整 11 事件 hooks + settings.json + mcp.json)
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
| 注入场景 | 触发事件 | 注入内容 | 通道 |
|
|
@@ -66,7 +66,7 @@ npx add-coder init --adapter=codex
|
|
|
66
66
|
|
|
67
67
|
| 维度 | Codex | Claude Code |
|
|
68
68
|
|---|---|---|
|
|
69
|
-
| 事件数 |
|
|
69
|
+
| 事件数 | 5 (原生) / 11 (导入 Claude) | 17 |
|
|
70
70
|
| 配置格式 | `.codex/hooks.json` | `.claude/settings.json` |
|
|
71
71
|
| Claude Hook 导入 | ✅ 原生支持(导入其他 agent 配置) | — |
|
|
72
72
|
| 全局 Hook | `~/.codex/hooks.json` | `~/.claude/settings.json` |
|
|
@@ -17,7 +17,7 @@ Qoder CN v1.7.0(2026-07-15)升级至 30+ 事件。以下为 ADD 治理覆盖
|
|
|
17
17
|
| 每次工具调用 | PreToolUse、PostToolUse、PostToolUseFailure |
|
|
18
18
|
| 其他 | SubagentStart(v1.7.0 新增)、SubagentStop(v1.7.0 新增)、Notification(v1.7.0 新增) |
|
|
19
19
|
|
|
20
|
-
配置位置:`.qoder/hooks/*.
|
|
20
|
+
配置位置:`.qoder/hooks/*.mjs`(TS 源码 esbuild 烘焙零依赖产物)+ `.qoder/settings.json`(command 直调 node)——2026-08-14 hook node 化实态,bash 待退役
|
|
21
21
|
|
|
22
22
|
**关键差异**:Qoder CN 不支持 PreCompact / PermissionRequest / PermissionDenied / StopFailure / ConfigChange / Worktree——这些 Claude Code 独有事件在 Qoder 端无对应 hookpoint,相关脚本不编译到 Qoder adapter。
|
|
23
23
|
|
|
@@ -54,7 +54,7 @@ Qoder CN 的注入通道为 **stderr → 下一轮 system prompt 注入**。这
|
|
|
54
54
|
| 开发触发 | UserPromptSubmit(首次命中) | 13 个模板全文 | stderr → 下一轮 system prompt |
|
|
55
55
|
| 去重 | UserPromptSubmit(同会话后续命中) | 短路跳过 | — |
|
|
56
56
|
|
|
57
|
-
**重要约束**:Qoder 端 `prompt-submit.
|
|
57
|
+
**重要约束**:Qoder 端 `prompt-submit.mjs`(TS 版,core `prompt-router.ts` 继承)已有完善的触发词路由系统(Layer 1 精准 P0 触发词 → Layer 2 开发关键词检测 → Layer 3 活跃 ADD 状态注入 + 验收幂等保护)。模板全文注入逻辑以**增量方式**插入 Layer 2 之后,禁止覆盖现有分流逻辑。
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -89,11 +89,11 @@ UserPromptSubmit hook additional context: ADD workflow active. ...
|
|
|
89
89
|
| hook 注册了但不执行 | `command` 缺少 `bash` 前缀 | settings.json 所有 command 加 `bash` 前缀 |
|
|
90
90
|
| hook 执行但 stdout 未被注入 | 纯文本不被 IDE 解析为 additionalContext | 改用 JSON 格式:`{"hookSpecificOutput":{"hookEventName":"...","additionalContext":"..."}}` |
|
|
91
91
|
| 脚本 exit 0 但没有输出 | `VOCABULARY_FILE` 用了 `$PWD`,hook 运行时 cwd 不是项目根 | 改为 `${PROJECT_DIR:-$PWD}` |
|
|
92
|
-
| `detect_active_add` 返回空 |
|
|
92
|
+
| `detect_active_add` 返回空 | node 版 PROJECT_DIR 未注入 | `tryResolveMagicDir` 注入链前置(env 优先 → 物理推导) |
|
|
93
93
|
| additionalContext 有时注入有时不注入 | 注入代码在 Layer 1 之后——P0 触发词匹配后 `exit 0` 跳过了注入 | 将 additionalContext 注入移到 Layer 1 之前 |
|
|
94
94
|
|
|
95
95
|
### 关键设计决策
|
|
96
96
|
|
|
97
|
-
1. **`PROJECT_DIR`
|
|
97
|
+
1. **`PROJECT_DIR` 注入链最先执行**:env 优先(QODER/QODERCN_PROJECT_DIR)→ `tryResolveMagicDir` 物理推导——入口薄壳首行,因为治理库可能依赖 `${PROJECT_DIR}` 定位文件
|
|
98
98
|
2. **additionalContext 放在入口最前**:在任何 `exit` 分支之前,确保所有代码路径都能注入上下文
|
|
99
99
|
3. **Stop/PreToolUse 不用 JSON**:中断/阻断类输出走 stderr 纯文本,不走 stdout JSON
|
|
@@ -42,7 +42,7 @@ Notification ─────────────────→ ⑫ 开发
|
|
|
42
42
|
|
|
43
43
|
## 注入通道
|
|
44
44
|
|
|
45
|
-
Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导入 Claude Code Hook 配置,因此 `prompt-submit.
|
|
45
|
+
Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导入 Claude Code Hook 配置,因此 `prompt-submit.mjs` 和 `session-start.mjs` 的 stdout 输出方式与 Claude Code 端一致(2026-08-14 node 化实态,bash 待退役)。
|
|
46
46
|
|
|
47
47
|
| 注入场景 | 触发事件 | 注入内容 | 通道 |
|
|
48
48
|
|---|---|---|---|
|
|
@@ -55,7 +55,7 @@ Trae 的注入通道为 **stdout**(与 Claude Code 兼容)。Trae 支持导
|
|
|
55
55
|
|
|
56
56
|
| 维度 | Trae | Claude Code |
|
|
57
57
|
|---|---|---|
|
|
58
|
-
| 事件数 |
|
|
58
|
+
| 事件数 | 6 (原生) / 11 (导入 Claude) | 17 |
|
|
59
59
|
| 配置格式 | `hooks.json` | `.claude/settings.json` |
|
|
60
60
|
| Claude Hook 导入 | ✅ 原生支持 | — |
|
|
61
61
|
| SessionEnd | ❌ | ✅ |
|