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.
- package/README.md +282 -155
- package/dist/index.js +481 -209
- package/package.json +15 -4
- package/templates/.add-coder-src-hash.json +186 -185
- 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/config.toml.example +12 -0
- 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 +67 -1
- 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 +4 -4
- package/templates/core/docs/ADD-governance-codex.md +6 -6
- package/templates/core/docs/ADD-governance-qoder-cn.md +5 -5
- package/templates/core/docs/ADD-governance-trae.md +3 -3
- package/templates/core/docs/ADD-governance-vscode-copilot.md +22 -23
- 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/prisma/add.prisma +140 -82
- package/templates/core/rules/project_rules.md +27 -24
- package/templates/core/scripts/db-ensure.sh +8 -0
- package/templates/core/scripts/gen-plan-index.sh +4 -15
- package/templates/core/scripts/mcp-server/notifications/hitl.ts +9 -1
- package/templates/core/scripts/mcp-server/notifications/hook.ts +25 -9
- package/templates/core/scripts/mcp-server/resources/hitl-approval-widget.ts +34 -0
- package/templates/core/scripts/mcp-server/resources/hook-events-report.ts +14 -2
- package/templates/core/scripts/mcp-server/resources/index.ts +2 -0
- package/templates/core/scripts/mcp-server/sampling/review.ts +25 -10
- package/templates/core/scripts/mcp-server/shared/db-types.ts +33 -8
- package/templates/core/scripts/mcp-server/shared/dps-scoring.strategy.ts +1 -1
- package/templates/core/scripts/mcp-server/shared/env.ts +28 -8
- package/templates/core/scripts/mcp-server/shared/fs.ts +3 -0
- package/templates/core/scripts/mcp-server/shared/hitl-interaction.strategy.ts +2 -3
- package/templates/core/scripts/mcp-server/shared/hitl-lifecycle-mutation.ts +129 -0
- package/templates/core/scripts/mcp-server/shared/hitl-proposal-mutation.ts +98 -0
- package/templates/core/scripts/mcp-server/shared/hitl-ui.ts +3 -0
- package/templates/core/scripts/mcp-server/shared/plan-lifecycle-events.ts +62 -0
- package/templates/core/scripts/mcp-server/shared/plan-lifecycle-mutation.ts +78 -0
- package/templates/core/scripts/mcp-server/shared/plan-lifecycle-subscriber.ts +145 -0
- package/templates/core/scripts/mcp-server/shared/plan-lifecycle.ts +153 -0
- package/templates/core/scripts/mcp-server/shared/plan-round-events.ts +56 -0
- package/templates/core/scripts/mcp-server/shared/plan-round-mutation.ts +143 -0
- package/templates/core/scripts/mcp-server/shared/plan-round-store.ts +47 -0
- package/templates/core/scripts/mcp-server/shared/plan-round-subscriber.ts +99 -0
- package/templates/core/scripts/mcp-server/shared/plan-status-store.ts +37 -0
- package/templates/core/scripts/mcp-server/shared/plan-tracking-mutation.ts +71 -0
- package/templates/core/scripts/mcp-server/shared/prisma.ts +12 -6
- package/templates/core/scripts/mcp-server/shared/project-root-strategy.ts +1 -2
- package/templates/core/scripts/mcp-server/shared/quant-recheck.strategy.ts +16 -0
- package/templates/core/scripts/mcp-server/shared/redact.ts +28 -0
- package/templates/core/scripts/mcp-server/shared/response.ts +3 -2
- package/templates/core/scripts/mcp-server/shared/runtime-context.ts +77 -0
- package/templates/core/scripts/mcp-server/shared/schema-topology.ts +159 -0
- package/templates/core/scripts/mcp-server/tools/audit.ts +49 -7
- package/templates/core/scripts/mcp-server/tools/context.ts +117 -121
- package/templates/core/scripts/mcp-server/tools/contract.ts +34 -9
- package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_status.ts +50 -3
- package/templates/core/scripts/mcp-server/tools/gateway/check_doc_similarity.ts +218 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_dps.ts +22 -7
- package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +86 -4
- package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +19 -6
- package/templates/core/scripts/mcp-server/tools/gateway/index.ts +2 -0
- package/templates/core/scripts/mcp-server/tools/hitl.ts +160 -75
- package/templates/core/scripts/mcp-server/tools/hook-event-report.ts +9 -2
- package/templates/core/scripts/mcp-server/tools/index.ts +69 -3
- package/templates/core/scripts/mcp-server/tools/plan.ts +152 -17
- package/templates/core/scripts/mcp-server/tools/review.ts +44 -15
- package/templates/core/scripts/mcp-server.ts +60 -1
- package/templates/core/scripts/plan-status-bridge.ts +26 -0
- package/templates/core/skills/add-paradigm/SKILL.md +2 -2
- package/templates/core/templates/add-route-template.schema.json +24 -56
- package/templates/core/templates/collab-contract-template.md +1 -1
- package/templates/core/templates/handoff-multi-round-template.schema.json +48 -0
- package/templates/core/templates/handoff-single-round-template.schema.json +92 -0
- package/templates/core/templates/handoff-single-round.schema.json +1 -1
- package/templates/core/templates/hitl-approval-widget.html +222 -37
- package/templates/core/templates/spec-template.schema.json +9 -46
- package/templates/core/templates/standard-plan-template.schema.json +1 -1
- package/templates/core/templates/tasks-template.schema.json +13 -54
- package/templates/adapters/claude/hooks/doc-format-guard.sh +0 -202
- package/templates/adapters/claude/hooks/lib/common.sh +0 -261
- package/templates/adapters/claude/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/claude/hooks/lib/notify.sh +0 -34
- package/templates/adapters/claude/hooks/lib/preload-templates.sh +0 -187
- package/templates/adapters/claude/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/claude/hooks/lib/state-detect.sh +0 -117
- package/templates/adapters/claude/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/claude/hooks/lib/vocabulary.sh +0 -56
- 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 -45
- 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 -261
- package/templates/adapters/codex/hooks/lib/common.sh +0 -261
- package/templates/adapters/codex/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/codex/hooks/lib/notify.sh +0 -34
- package/templates/adapters/codex/hooks/lib/preload-templates.sh +0 -187
- package/templates/adapters/codex/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/codex/hooks/lib/state-detect.sh +0 -117
- package/templates/adapters/codex/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/codex/hooks/lib/vocabulary.sh +0 -56
- package/templates/adapters/codex/hooks/notification.sh +0 -45
- 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 -138
- package/templates/adapters/codex/hooks/pre-compact.sh +0 -37
- package/templates/adapters/codex/hooks/pre-tool-use.sh +0 -217
- package/templates/adapters/codex/hooks/prompt-submit.sh +0 -87
- 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 -53
- package/templates/adapters/codex/hooks/stop-check.sh +0 -45
- 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 -260
- package/templates/adapters/qoder/hooks/lib/common.sh +0 -261
- package/templates/adapters/qoder/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/qoder/hooks/lib/notify.sh +0 -34
- package/templates/adapters/qoder/hooks/lib/preload-templates.sh +0 -187
- package/templates/adapters/qoder/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/qoder/hooks/lib/state-detect.sh +0 -117
- package/templates/adapters/qoder/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/qoder/hooks/lib/vocabulary.sh +0 -56
- 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 -48
- 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 -261
- package/templates/adapters/trae/hooks/lib/common.sh +0 -261
- package/templates/adapters/trae/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/trae/hooks/lib/notify.sh +0 -34
- package/templates/adapters/trae/hooks/lib/preload-templates.sh +0 -187
- package/templates/adapters/trae/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/trae/hooks/lib/state-detect.sh +0 -117
- package/templates/adapters/trae/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/trae/hooks/lib/vocabulary.sh +0 -56
- 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 -217
- 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 -45
- 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 -201
- package/templates/adapters/vscode/hooks/lib/common.sh +0 -261
- package/templates/adapters/vscode/hooks/lib/context-inject.sh +0 -96
- package/templates/adapters/vscode/hooks/lib/notify.sh +0 -34
- package/templates/adapters/vscode/hooks/lib/preload-templates.sh +0 -187
- package/templates/adapters/vscode/hooks/lib/session-end.sh +0 -76
- package/templates/adapters/vscode/hooks/lib/state-detect.sh +0 -117
- package/templates/adapters/vscode/hooks/lib/subagent-stop.sh +0 -90
- package/templates/adapters/vscode/hooks/lib/vocabulary.sh +0 -56
- package/templates/adapters/vscode/hooks/notification.sh +0 -45
- 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 -53
- 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 -261
- package/templates/core/hooks/lib/common.sh +0 -261
- package/templates/core/hooks/lib/context-inject.sh +0 -96
- package/templates/core/hooks/lib/notify.sh +0 -34
- package/templates/core/hooks/lib/preload-templates.sh +0 -187
- package/templates/core/hooks/lib/session-end.sh +0 -76
- package/templates/core/hooks/lib/state-detect.sh +0 -117
- package/templates/core/hooks/lib/subagent-stop.sh +0 -90
- package/templates/core/hooks/lib/vocabulary.sh +0 -56
- 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 -217
- 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 -45
- 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,33 @@
|
|
|
1
|
+
// permission-denied.ts — Claude Code PermissionDenied 拒绝记录 + 替代方案(Claude 独有事件)
|
|
2
|
+
// 治理卡位 #14: 拒绝原因记录 + 替代方案注入
|
|
3
|
+
|
|
4
|
+
import { jsonGet, readHookInput } from "../../../core/governance/common.js"
|
|
5
|
+
|
|
6
|
+
const input = readHookInput()
|
|
7
|
+
let toolName = jsonGet(input, "tool_name")
|
|
8
|
+
if (toolName === "") {
|
|
9
|
+
toolName = input.match(/"tool_name"\s*:\s*"([^"]*)"/)?.[1] ?? "unknown"
|
|
10
|
+
}
|
|
11
|
+
let reason = jsonGet(input, "reason")
|
|
12
|
+
if (reason === "") {
|
|
13
|
+
reason = input.match(/"reason"\s*:\s*"([^"]*)"/)?.[1] ?? "权限被拒绝"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 记录拒绝
|
|
17
|
+
process.stderr.write(`[ADD PermissionDenied] ${toolName} 被拒绝: ${reason}\n`)
|
|
18
|
+
|
|
19
|
+
// 按工具类型提供替代建议
|
|
20
|
+
switch (toolName) {
|
|
21
|
+
case "Bash":
|
|
22
|
+
process.stderr.write("[ADD PermissionDenied] 建议: 使用安全的等价命令,或通过 permission-gate.sh 白名单放行\n")
|
|
23
|
+
break
|
|
24
|
+
case "Write":
|
|
25
|
+
case "Edit":
|
|
26
|
+
process.stderr.write("[ADD PermissionDenied] 建议: 检查目标路径是否在项目范围内,敏感文件(.env等)不可写入\n")
|
|
27
|
+
break
|
|
28
|
+
case "Read":
|
|
29
|
+
process.stderr.write("[ADD PermissionDenied] 建议: 该文件可能受读保护,尝试读取项目公有文件替代\n")
|
|
30
|
+
break
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
process.exit(0)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// permission-gate.ts — PermissionRequest 权限请求门禁(Claude 版,与 core 同构)
|
|
2
|
+
|
|
3
|
+
import { jsonGet, readHookInput } from "../../../core/governance/common.js"
|
|
4
|
+
|
|
5
|
+
const input = readHookInput()
|
|
6
|
+
const toolName = jsonGet(input, "tool_name")
|
|
7
|
+
|
|
8
|
+
// 高风险工具需要二次确认
|
|
9
|
+
if (toolName === "Bash" || toolName === "Write" || toolName === "Edit") {
|
|
10
|
+
process.stdout.write(`[ADD PermissionGate] 高风险工具: ${toolName},请确认操作。\n`)
|
|
11
|
+
}
|
|
12
|
+
process.exit(0)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// post-tool-use.ts — PostToolUse 入口薄壳(Claude 版,Task 4.1 能力对齐)
|
|
2
|
+
// 继承 core PostToolRouter 无 override——六端实态核验(2026-08-14):
|
|
3
|
+
// post-tool-use 六端均为纯文本 stderr(无协议形态差异),此前 claude 的
|
|
4
|
+
// 「无 §1 DPS / 无 §2b-d / 增量修订文本」为 bash 时代能力漂移——统一收敛 core 全段。
|
|
5
|
+
// 协议差异仅剩: PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(claude-env 注入链)
|
|
6
|
+
|
|
7
|
+
import { jsonGet, readHookInput } from "../../../core/governance/common.js"
|
|
8
|
+
import { PostToolRouter } from "../../../core/governance/post-tool-router.js"
|
|
9
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
10
|
+
|
|
11
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
12
|
+
|
|
13
|
+
const input = readHookInput()
|
|
14
|
+
const toolName = jsonGet(input, "tool_name")
|
|
15
|
+
if (toolName === "") process.exit(0)
|
|
16
|
+
|
|
17
|
+
process.exit(new PostToolRouter(process.env.PROJECT_DIR, process.env.MAGIC_DIR || ".claude").run(input, toolName))
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// pre-compact.ts — 上下文压缩前 ADD 状态保存(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 治理逻辑: core PreCompactGuard(状态保存 + tpl 标记清理,与 core 同构)
|
|
3
|
+
// 协议差异: PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(依赖注入)
|
|
4
|
+
|
|
5
|
+
import { PreCompactGuard } from "../../../core/governance/pre-compact-guard.js"
|
|
6
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
7
|
+
|
|
8
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
9
|
+
|
|
10
|
+
process.exit(new PreCompactGuard().run())
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// pre-tool-use.ts — PreToolUse 入口(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 继承 core PreToolUseGuard(模板方法固化治理流程);仅 override 协议差异:
|
|
3
|
+
// ① 检测链: 构造传 adapterName="claude" → 加载 [guard.adapter_detectors] 独立链
|
|
4
|
+
// ② onBlock: 纯 stderr(无 askJson / 无 logBlock)+ exit 2
|
|
5
|
+
// ③ onNoPlanAllow: 输出同 core 但 exit 2(bash 原文 L73 exit $EXIT_BLOCK)→ Task 9.4.2 修复对齐 exit 0
|
|
6
|
+
// ④ onSensitiveDeny: 纯 stderr(无 denyJson)+ 事件 + exit 2
|
|
7
|
+
// ⑤ onOtherTool: ③ Read matcher 模板提示(claude 特有)
|
|
8
|
+
|
|
9
|
+
import { detectActiveAdd, jsonGet, markDevAction, readHookInput, tryResolveMagicDir } from "../../../core/governance/common.js"
|
|
10
|
+
import { writeHookEvent } from "../../../core/governance/notify.js"
|
|
11
|
+
import { PreToolUseGuard } from "../../../core/governance/pre-tool-guard.js"
|
|
12
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
13
|
+
|
|
14
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
15
|
+
const PROJECT_DIR = process.env.PROJECT_DIR
|
|
16
|
+
|
|
17
|
+
const magicDir = tryResolveMagicDir()
|
|
18
|
+
if (magicDir && !process.env.MAGIC_DIR) {
|
|
19
|
+
process.env.MAGIC_DIR = magicDir
|
|
20
|
+
}
|
|
21
|
+
const MAGIC_DIR = process.env.MAGIC_DIR || ""
|
|
22
|
+
|
|
23
|
+
class ClaudePreToolUseGuard extends PreToolUseGuard {
|
|
24
|
+
constructor(projectDir: string, magicDir: string) {
|
|
25
|
+
super(projectDir, magicDir, "claude")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** ② §A 阻断: 纯 stderr({{cmd}} 模板替换)+ 事件 + exit 2(无 askJson / logBlock) */
|
|
29
|
+
protected override onBlock(blocked: { reason: string; stderr: string }, command: string): number {
|
|
30
|
+
process.stderr.write(blocked.stderr.replaceAll("{{cmd}}", command))
|
|
31
|
+
writeHookEvent("pre-tool-use", "deny", command, blocked.reason, this.planKeyword, this.planStatus)
|
|
32
|
+
return 2
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** §A 放行后处理: bash 原文 L56 mark_dev_action(core 无此行为) */
|
|
36
|
+
protected override onSectionAPass(_command: string): void {
|
|
37
|
+
markDevAction()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** ③ §B 无 Plan 放行: 输出同 core(提示 + allowJson + 事件)+ exit 0(Task 9.4.2 修复: bash 原文 exit 2 缺陷对齐 core) */
|
|
41
|
+
protected override onNoPlanAllow(toolName: string, filePath: string): number {
|
|
42
|
+
process.stderr.write("[ADD 提示] 正在写入 Plan/Spec/Review 文档但无活跃 ADD Plan——首次创建场景放行,建议先执行 add-paradigm 生成 Plan+add-route\n")
|
|
43
|
+
process.stdout.write('{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":"无活跃 ADD Plan 但为 Plan/Spec/Review 写入(首次创建场景),提示而非拦截"}}\n')
|
|
44
|
+
writeHookEvent("pre-tool-use", "info", filePath, "无活跃 ADD Plan 下写入 Plan/Spec/Review(首次创建放行)", this.planKeyword, this.planStatus)
|
|
45
|
+
return 0
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** ④ §B 敏感文件: 纯 stderr(无 denyJson)+ 事件 + exit 2 */
|
|
49
|
+
protected override onSensitiveDeny(filePath: string): number {
|
|
50
|
+
process.stderr.write(`⛔ 敏感文件受保护,禁止写入: ${filePath}\n`)
|
|
51
|
+
writeHookEvent("pre-tool-use", "deny", filePath, "敏感文件受保护", this.planKeyword, this.planStatus)
|
|
52
|
+
return 2
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** ⑤ ③ Read matcher: 模板路径兜底提示(claude 特有) */
|
|
56
|
+
protected override onOtherTool(input: string, toolName: string): number {
|
|
57
|
+
if (toolName === "Read") {
|
|
58
|
+
const filePath = jsonGet(input, "file_path")
|
|
59
|
+
if (filePath.includes("templates/")) {
|
|
60
|
+
process.stderr.write("[ADD PreToolUse] 提示: 模板文件已通过 hook 预读到上下文,可跳过重复读取\n")
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return 0
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const input = readHookInput()
|
|
68
|
+
let toolName = jsonGet(input, "tool_name")
|
|
69
|
+
if (toolName === "") {
|
|
70
|
+
toolName = input.match(/"tool_name"\s*:\s*"([^"]*)"/)?.[1] ?? ""
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const guard = new ClaudePreToolUseGuard(PROJECT_DIR, MAGIC_DIR)
|
|
74
|
+
|
|
75
|
+
if (toolName === "Bash") {
|
|
76
|
+
process.exit(guard.runSectionA(input))
|
|
77
|
+
} else if (toolName === "Write" || toolName === "Edit" || toolName === "SearchReplace") {
|
|
78
|
+
process.exit(guard.runSectionB(input, toolName))
|
|
79
|
+
} else {
|
|
80
|
+
process.exit(guard.runSectionC(input, toolName))
|
|
81
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// prompt-submit.ts — UserPromptSubmit 入口(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 继承 core PromptRouter(模板方法固化 L1/L2/L3 分流);仅 override 协议差异(bash 原文逐字对照):
|
|
3
|
+
// ① extractPrompt: grep 正则提取(无 jq)
|
|
4
|
+
// ② acceptedText: 验收 4 行(无 ★ 同步检查行)
|
|
5
|
+
// ③ onAccepted: 无 review-checklist 子进程(core 有)
|
|
6
|
+
// ④ onDevKwMatched: stderr "[ADD PromptSubmit] 检测到开发关键词"
|
|
7
|
+
// ⑤ layer2ToStderr: false(Layer2 提示输出 stdout)
|
|
8
|
+
// ⑥ layer3Text: 「[ADD 当前状态]」多行块
|
|
9
|
+
// ⑦ dailyWarnText: 「建议创建 Plan」(无"或检查 hooks 误报")
|
|
10
|
+
// ⑧ afterLayer3: 模板全文注入(--full --top 5,tpl-injected 去重)
|
|
11
|
+
// ⑨ shouldSkipDaily: MAGIC_DIR 未设置时跳过日报
|
|
12
|
+
|
|
13
|
+
import { readHookInput } from "../../../core/governance/common.js"
|
|
14
|
+
import { PreloadTemplates } from "../../../core/governance/preload-templates.js"
|
|
15
|
+
import { PromptRouter } from "../../../core/governance/prompt-router.js"
|
|
16
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
17
|
+
|
|
18
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
19
|
+
|
|
20
|
+
class ClaudePromptRouter extends PromptRouter {
|
|
21
|
+
/** ① prompt 提取(对齐 bash grep/sed,无 jq) */
|
|
22
|
+
protected override extractPrompt(input: string): string {
|
|
23
|
+
return input.match(/"prompt"\s*:\s*"([^"]*)"/)?.[1] ?? ""
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** ② 验收幂等文本(claude 4 行,无 ★ 同步检查) */
|
|
27
|
+
protected override acceptedText(): string {
|
|
28
|
+
return `[ADD 验收] ⚠️ 已验收。进入 Review 模式:
|
|
29
|
+
① 重新检查 checklist [T]/[R] 项
|
|
30
|
+
② 审查 audit 记录完整性
|
|
31
|
+
③ 如有差异 → Review 回流至 handoff(增量更新)
|
|
32
|
+
④ 无差异 → 记录 'Review 已确认,无新发现'
|
|
33
|
+
`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** ③ 验收后置(claude 无 review-checklist 子进程) */
|
|
37
|
+
protected override onAccepted(_handoff: string, _addRoute: string): void {
|
|
38
|
+
// claude 协议: 无子进程调用
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** ④ 开发关键词命中提示(stderr) */
|
|
42
|
+
protected override onDevKwMatched(): void {
|
|
43
|
+
process.stderr.write("[ADD PromptSubmit] 检测到开发关键词\n")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** ⑤ Layer 2 输出通道(claude: stdout) */
|
|
47
|
+
protected override layer2ToStderr(): boolean {
|
|
48
|
+
return false
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** ⑥ Layer 3 状态文本(多行块) */
|
|
52
|
+
protected override layer3Text(plan: string, rounds: string, step: string, handoff: string): string {
|
|
53
|
+
return `[ADD 当前状态]
|
|
54
|
+
Plan: ${plan}
|
|
55
|
+
轮次: ${rounds}
|
|
56
|
+
当前 Step: ${step}
|
|
57
|
+
handoff: ${handoff}
|
|
58
|
+
`
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** ⑦ 日报告警文本(无"或检查 hooks 误报") */
|
|
62
|
+
protected override dailyWarnText(noPlan: number, threshold: number): string {
|
|
63
|
+
return `[Hook ⚠️] 无 Plan 提示已达 ${noPlan} 次(≥${threshold}),建议创建 Plan\n`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** ⑧ Layer 3 附加注入: 模板全文(--full --top 5) */
|
|
67
|
+
protected override afterLayer3(): void {
|
|
68
|
+
try {
|
|
69
|
+
process.stdout.write(new PreloadTemplates().full(5))
|
|
70
|
+
} catch {
|
|
71
|
+
/* 模板目录缺失 fail-fast:不阻断 */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** ⑨ MAGIC_DIR 未设置时跳过日报(TS 修复: bash 空路径相对检查) */
|
|
76
|
+
protected override shouldSkipDaily(): boolean {
|
|
77
|
+
return !process.env.MAGIC_DIR
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const input = readHookInput()
|
|
82
|
+
process.exit(new ClaudePromptRouter(process.env.MAGIC_DIR || "").run(input))
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// session-end.ts — SessionEnd Claude 版(薄包装:source lib 并自动执行 main)
|
|
2
|
+
// 治理卡位 #2: 标记清理 + 会话审计结算 + Stop未触发兜底
|
|
3
|
+
// 薄包装语义: bash 版 source lib/session-end.sh 后 lib 的 main 自动执行(BASH_SOURCE 判定)。
|
|
4
|
+
// TS 版等价: 直接调用 SessionEndGuard.run()(lib 版行为)。
|
|
5
|
+
|
|
6
|
+
import { SessionEndGuard } from "../../../core/governance/session-end.js"
|
|
7
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
8
|
+
|
|
9
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
10
|
+
process.exit(new SessionEndGuard(process.env.PROJECT_DIR).run())
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// session-start.ts — SessionStart 入口(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 继承 core SessionStartGuard;仅 override 协议差异(bash 原文对照):
|
|
3
|
+
// ① PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(claude-env 注入链)
|
|
4
|
+
// ② 无 ③ 代办段、无 ④ HITL 待审批段(claude bash 版无此两段)
|
|
5
|
+
|
|
6
|
+
import { SessionStartGuard } from "../../../core/governance/session-start-guard.js"
|
|
7
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
8
|
+
|
|
9
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
10
|
+
const PROJECT_DIR = process.env.PROJECT_DIR
|
|
11
|
+
|
|
12
|
+
class ClaudeSessionStartGuard extends SessionStartGuard {
|
|
13
|
+
/** ② claude 版无代办段 */
|
|
14
|
+
protected override emitTodoReminder(_state: string | null): void {
|
|
15
|
+
// claude 协议: 无代办刷新段
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** ② claude 版无 HITL 待审批段 */
|
|
19
|
+
protected override emitHitlPending(): void {
|
|
20
|
+
// claude 协议: 无 HITL 检测段
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
process.exit(new ClaudeSessionStartGuard(PROJECT_DIR).run())
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// stop-check.ts — Stop 入口薄壳(Claude 版,Task 3.1 收敛)
|
|
2
|
+
// 治理逻辑: ../../../core/governance/stop-router.js(StopRouter Q0-Q4 分流)
|
|
3
|
+
// 协议差异: PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(claude-env 注入链)
|
|
4
|
+
|
|
5
|
+
import { tryResolveMagicDir } from "../../../core/governance/common.js"
|
|
6
|
+
import { StopRouter } from "../../../core/governance/stop-router.js"
|
|
7
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
8
|
+
|
|
9
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
10
|
+
const inferredMagicDir = tryResolveMagicDir()
|
|
11
|
+
if (inferredMagicDir && !process.env.MAGIC_DIR) {
|
|
12
|
+
process.env.MAGIC_DIR = inferredMagicDir
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
process.exit(new StopRouter().run())
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// stop-failure.ts — Claude Code StopFailure 紧急审计转储(Claude 独有事件)
|
|
2
|
+
// 治理卡位 #8: 紧急审计转储 + 异常标记
|
|
3
|
+
|
|
4
|
+
import { writeFileSync } from "node:fs"
|
|
5
|
+
import { detectActiveAdd, localIsoSeconds, projectHash } from "../../../core/governance/common.js"
|
|
6
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
7
|
+
|
|
8
|
+
const PROJECT_DIR = resolveClaudeProjectDir()
|
|
9
|
+
// 对齐 bash export PROJECT_DIR(后续 hash/路径均消费该值)
|
|
10
|
+
process.env.PROJECT_DIR = PROJECT_DIR
|
|
11
|
+
|
|
12
|
+
process.stderr.write(`[ADD StopFailure] ⚠️ Agent 异常退出 — ${localIsoSeconds()}\n`)
|
|
13
|
+
|
|
14
|
+
// 尝试 dump 当前 ADD 状态
|
|
15
|
+
const state = detectActiveAdd()
|
|
16
|
+
if (state !== null) {
|
|
17
|
+
const [plan, step, rounds, handoff, addRoute] = state.split("::")
|
|
18
|
+
process.stderr.write(`[ADD StopFailure] 异常退出时 ADD 状态:
|
|
19
|
+
Plan: ${plan}
|
|
20
|
+
Step: ${step}
|
|
21
|
+
轮次: ${rounds}
|
|
22
|
+
handoff: ${handoff}
|
|
23
|
+
add-route: ${addRoute}
|
|
24
|
+
`)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 标记异常终止(供 SessionEnd 兜底识别)
|
|
28
|
+
try {
|
|
29
|
+
writeFileSync(`/tmp/add_failure_${projectHash() || ""}`, "")
|
|
30
|
+
} catch {
|
|
31
|
+
/* ignore(对齐 touch || true) */
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
process.exit(0)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// subagent-guard.ts — SubagentStart 入口(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 继承 core SubagentGuardRouter(状态注入模板方法——能力对齐);仅 override 协议差异:
|
|
3
|
+
// ① 输出形态: 纯文本状态块(core/qoder 是 hookSpecificOutput JSON)
|
|
4
|
+
// ② PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(claude-env 注入链)
|
|
5
|
+
|
|
6
|
+
import { SubagentGuardRouter } from "../../../core/governance/subagent-guard-router.js"
|
|
7
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
8
|
+
|
|
9
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
10
|
+
|
|
11
|
+
class ClaudeSubagentGuardRouter extends SubagentGuardRouter {
|
|
12
|
+
/** ① 纯文本状态块(claude 协议) */
|
|
13
|
+
protected override emit(state: string): void {
|
|
14
|
+
const [plan, step, rounds, handoff] = state.split("::")
|
|
15
|
+
process.stdout.write(`[ADD SubagentStart] 子代理上下文注入:
|
|
16
|
+
Plan: ${plan}
|
|
17
|
+
Step: ${step}
|
|
18
|
+
轮次: ${rounds}
|
|
19
|
+
handoff: ${handoff}
|
|
20
|
+
遵循 ADD 规范,完成后请检查 checklist 对应项
|
|
21
|
+
`)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
process.exit(new ClaudeSubagentGuardRouter().run())
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// subagent-stop.ts — SubagentStop 入口薄壳(Claude 版,Task 3.1 继承体系)
|
|
2
|
+
// 治理逻辑: core SubagentStopRouter(边界校验 + 审计聚合,与 core 完全同构)
|
|
3
|
+
// 协议差异: PROJECT_DIR 来源 CLAUDE_PROJECT_DIR(依赖注入,无 override 需求)
|
|
4
|
+
|
|
5
|
+
import { readHookInput } from "../../../core/governance/common.js"
|
|
6
|
+
import { SubagentStopRouter } from "../../../core/governance/subagent-stop-router.js"
|
|
7
|
+
import { resolveClaudeProjectDir } from "./lib/claude-env.js"
|
|
8
|
+
|
|
9
|
+
process.env.PROJECT_DIR = resolveClaudeProjectDir()
|
|
10
|
+
|
|
11
|
+
const input = readHookInput()
|
|
12
|
+
process.exit(new SubagentStopRouter().run(input))
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"hooks": [
|
|
6
6
|
{
|
|
7
7
|
"type": "command",
|
|
8
|
-
"command": ".claude/hooks/session-start.
|
|
8
|
+
"command": "node .claude/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": ".claude/hooks/prompt-submit.
|
|
18
|
+
"command": "node .claude/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": ".claude/hooks/pre-tool-use.
|
|
29
|
+
"command": "node .claude/hooks/pre-tool-use.mjs"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"type": "command",
|
|
33
|
-
"command": ".claude/hooks/doc-format-guard.
|
|
33
|
+
"command": "node .claude/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": ".claude/hooks/post-tool-use.
|
|
44
|
+
"command": "node .claude/hooks/post-tool-use.mjs"
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
"type": "command",
|
|
48
|
-
"command": ".claude/hooks/doc-format-guard.
|
|
48
|
+
"command": "node .claude/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": ".claude/hooks/post-tool-failure.
|
|
58
|
+
"command": "node .claude/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": ".claude/hooks/stop-check.
|
|
68
|
+
"command": "node .claude/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": ".claude/hooks/subagent-guard.
|
|
78
|
+
"command": "node .claude/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": ".claude/hooks/subagent-guard.
|
|
88
|
+
"command": "node .claude/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": ".claude/hooks/pre-compact.
|
|
98
|
+
"command": "node .claude/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": ".claude/hooks/notification.
|
|
109
|
+
"command": "node .claude/hooks/notification.mjs"
|
|
110
110
|
}
|
|
111
111
|
]
|
|
112
112
|
}
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
"hooks": [
|
|
117
117
|
{
|
|
118
118
|
"type": "command",
|
|
119
|
-
"command": ".claude/hooks/permission-gate.
|
|
119
|
+
"command": "node .claude/hooks/permission-gate.mjs"
|
|
120
120
|
}
|
|
121
121
|
]
|
|
122
122
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Codex 项目级 MCP 配置模板(adapter 真源)
|
|
2
|
+
# add-coder init/sync --adapter codex 会把该 server table 合并到 .codex/config.toml。
|
|
3
|
+
# 只写项目配置;不会自动修改 ~/.codex/config.toml。
|
|
4
|
+
|
|
5
|
+
[mcp_servers.add_coder]
|
|
6
|
+
command = {{codexCommandToml}}
|
|
7
|
+
args = {{codexArgsToml}}
|
|
8
|
+
cwd = {{codexProjectRootToml}}
|
|
9
|
+
startup_timeout_sec = 30
|
|
10
|
+
|
|
11
|
+
[mcp_servers.add_coder.env]
|
|
12
|
+
PROJECT_ROOT = {{codexProjectRootToml}}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// doc-format-guard.ts — schema.json 驱动的 ADD 文档格式守卫(Codex 版,Task 7.1 继承体系)
|
|
2
|
+
// 继承 core DocFormatGuard,命名子类 CodexDocFormatGuard:
|
|
3
|
+
// ① 探测链与 core 数据驱动同语义(PLAN 元信息 → 一、Plan 概述 → 四、Handoff → simple-plan,
|
|
4
|
+
// 2026-08-14 实态核验 codex 独立类 L133-135 与 core 基线一致)→ 当前无 override
|
|
5
|
+
// (空子类承载端身份 + 未来演进位)
|
|
6
|
+
// 协议差异仅剩: MAGIC_DIR 兜底 = ".codex"(构造参数)
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from "node:fs"
|
|
9
|
+
import { DocFormatGuard } from "../../../core/governance/doc-format-guard.js"
|
|
10
|
+
|
|
11
|
+
class CodexDocFormatGuard extends DocFormatGuard {
|
|
12
|
+
/** 协议差异封装: MAGIC_DIR 兜底 = ".codex"(codex 端) */
|
|
13
|
+
constructor(projectDir: string, magicDir: string) {
|
|
14
|
+
super(projectDir, magicDir)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 当前无 override(探测链/算法段同 core);未来 codex 协议演进在此扩展,不改 core
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
|
|
21
|
+
const MAGIC_DIR = process.env.MAGIC_DIR || ".codex"
|
|
22
|
+
|
|
23
|
+
const guard = new CodexDocFormatGuard(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,26 @@
|
|
|
1
|
+
// notification.ts — Notification 入口(Codex 版,Task 7.1 继承体系)
|
|
2
|
+
// 继承 core NotificationRouter,命名子类 CodexNotificationRouter:
|
|
3
|
+
// ① resolveMagicDir override: 无探测循环(codex bash 原文硬编码 .codex;
|
|
4
|
+
// TS 用唯一解析链:注入优先 → 物理推导 → .codex 兜底,2026-08-14 轮次 7 治理契约落实)
|
|
5
|
+
// ② 提醒文本 = 基类默认(含 Plan 前缀,与 codex bash 原文一致)
|
|
6
|
+
// 协议差异仅剩: PROJECT_DIR = $PWD(codex 小文件无 git toplevel,bash 原文逐字)
|
|
7
|
+
|
|
8
|
+
import { readHookInput } from "../../../core/governance/common.js"
|
|
9
|
+
import { NotificationRouter } from "../../../core/governance/notification-router.js"
|
|
10
|
+
|
|
11
|
+
class CodexNotificationRouter extends NotificationRouter {
|
|
12
|
+
/** ① codex 无跨端探测循环(bash 原文硬编码 .codex;唯一解析链 + 兜底) */
|
|
13
|
+
protected override resolveMagicDir(): string {
|
|
14
|
+
return process.env.MAGIC_DIR ?? ".codex"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** 协议差异封装: fallbackMagicDir = ".codex" */
|
|
18
|
+
constructor(projectDir: string) {
|
|
19
|
+
super(projectDir, ".codex")
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const input = readHookInput()
|
|
24
|
+
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd()
|
|
25
|
+
|
|
26
|
+
process.exit(new CodexNotificationRouter(PROJECT_DIR).run(input))
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// permission-gate.ts — PermissionRequest 入口(Codex 版,Task 7.1 继承体系)
|
|
2
|
+
// 继承 core PermissionGateRouter,命名子类 CodexPermissionGateRouter:
|
|
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 CodexPermissionGateRouter extends PermissionGateRouter {
|
|
11
|
+
// 当前无 override(`// empty` 回退 + 高风险工具提示与 core 基线一致);命名子类承载端身份 + 未来演进位
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const input = readHookInput()
|
|
15
|
+
process.exit(new CodexPermissionGateRouter().run(input))
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// post-tool-failure.ts — PostToolUseFailure 入口(Codex 版,Task 7.1 继承体系)
|
|
2
|
+
// 继承 core PostToolFailureRouter,命名子类 CodexPostToolFailureRouter:
|
|
3
|
+
// ① emit = 基类默认(stdout 固定文本——bash 原文逐字,codex 为占位实现)
|
|
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 CodexPostToolFailureRouter extends PostToolFailureRouter {
|
|
10
|
+
// 当前无 override(stdout 固定提示与 core 基线一致);命名子类承载端身份 + 未来演进位
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const input = readHookInput()
|
|
14
|
+
process.exit(new CodexPostToolFailureRouter().run(input))
|