add-coder 0.3.6-feature-hitl-enhance-v1.2 → 0.3.6
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 +34 -0
- package/package.json +10 -3
- package/templates/.add-coder-src-hash.json +37 -31
- package/templates/adapters/claude/hooks/pre-tool-use.sh +19 -0
- package/templates/adapters/codex/hooks/post-tool-use.sh +103 -0
- package/templates/adapters/codex/hooks/pre-tool-use.sh +19 -0
- package/templates/adapters/qoder/hooks/post-tool-use.sh +91 -0
- package/templates/adapters/qoder/hooks/pre-tool-use.sh +19 -0
- package/templates/adapters/trae/hooks/post-tool-use.sh +103 -0
- package/templates/adapters/trae/hooks/pre-tool-use.sh +19 -0
- package/templates/adapters/vscode/hooks/pre-tool-use.sh +19 -0
- package/templates/core/agents/add-flow-guardian.md +27 -25
- package/templates/core/hooks/post-tool-use.sh +103 -0
- package/templates/core/hooks/pre-tool-use.sh +19 -0
- package/templates/core/prisma/add.prisma +1 -0
- package/templates/core/rules/project_rules.md +3 -1
- package/templates/core/scripts/mcp-server/shared/dps-scoring.strategy.ts +3 -2
- package/templates/core/scripts/mcp-server/tools/audit.ts +2 -2
- package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts +93 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_status.ts +235 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_dps.ts +555 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +111 -0
- package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +114 -0
- package/templates/core/scripts/mcp-server/tools/gateway/helpers.ts +121 -0
- package/templates/core/scripts/mcp-server/tools/gateway/index.ts +16 -0
- package/templates/core/scripts/mcp-server/tools/gateway.backup +1143 -0
- package/templates/core/scripts/mcp-server/tools/index.ts +1 -1
- package/templates/core/scripts/mcp-server/tools/plan.ts +11 -3
- package/templates/core/skills/session-init/SKILL.md +21 -0
- package/templates/core/templates/add-route-template-heavyweight.md +7 -5
- package/templates/core/templates/add-route-template.md +3 -1
- package/templates/core/templates/add-route-template.schema.json +73 -0
- package/templates/core/templates/checklist-template.md +1 -0
- package/templates/core/templates/simple-plan-template.md +24 -0
- package/templates/core/templates/spec-template.md +54 -11
- package/templates/core/templates/spec-template.schema.json +31 -0
- package/templates/core/templates/standard-plan-template.md +16 -24
- package/templates/core/templates/tasks-template.md +35 -33
- package/templates/core/templates/tasks-template.schema.json +44 -0
- package/templates/core/agents/add-orchestrator.md +0 -217
- package/templates/core/scripts/mcp-server/tools/gateway.ts +0 -389
package/README.md
CHANGED
|
@@ -8,6 +8,28 @@ Make 0.75 into one.
|
|
|
8
8
|
<a href="https://www.npmcharts.com/compare/add-coder?interval=30" style="color:#c41a16;font-weight:700">📈 趋势</a>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
+
```bash
|
|
12
|
+
# 第一次过死亡谷耗时 19天
|
|
13
|
+
~ $ curl -s https://api.npmjs.org/downloads/point/last-month/add-coder {"downloads":5161,"start":"2026-06-29","end":"2026-07-28","package":"add-coder"}~ $ ~ $ npm info add-coder@0.1.0 add-coder@0.1.0 | MIT | deps: 3 | versions: 35 Initialize ADD paradigm workflow templates for Claude Code, Qoder, and VS Code. keywords: add, add-paradigm, claude, qoder, vscode, mcp, workflow, codein2027, 集中裁决层, caijuehub
|
|
14
|
+
bin: add-coder
|
|
15
|
+
dist
|
|
16
|
+
.tarball: https://registry.npmjs.org/add-coder/-/add-coder-0.1.0.tgz
|
|
17
|
+
.shasum: 3266ddb5304d303705694edec7c2f41efc24881d .integrity: sha512-MxFICLEoAgTVxnHaiIOli5eVyCXvB+xnSzpfmu0mrigEeM9NxzBOm2Auzjn1GKUTXSWelT0FecwwlYmsCf+TWQ==
|
|
18
|
+
.unpackedSize: 704.9 kB
|
|
19
|
+
|
|
20
|
+
dependencies:
|
|
21
|
+
zod: ^3.24.0, commander: ^13.1.0, smol-toml: ^1.7.0
|
|
22
|
+
|
|
23
|
+
maintainers:
|
|
24
|
+
- wujixmm <wujixmm@gmail.com>
|
|
25
|
+
|
|
26
|
+
dist-tags:
|
|
27
|
+
latest: 0.3.5
|
|
28
|
+
preview: 0.3.6-feature-hitl-enhance-v1.2
|
|
29
|
+
|
|
30
|
+
published 2 weeks ago by wujixmm <wujixmm@gmail.com>
|
|
31
|
+
|
|
32
|
+
```
|
|
11
33
|
> 🀄中文 | 🔤[English](#-english-readme)
|
|
12
34
|
|
|
13
35
|
**AI 代码治理的落地方案** — [codein2027](https://github.com/xiaomingming92/codein2027) 快速构建 ADD 编程范式的完整脚手架。以「审计即基础设施」为核心,彻底打破编程过程黑盒与跨轮失忆,让编程范式进化为可审计、可追溯、可收敛的新时代。 [NPM](https://www.npmjs.com/package/add-coder) · [GitHub](https://github.com/xiaomingming92/add-coder)
|
|
@@ -49,6 +71,10 @@ Caijuehub 是 add-coder 历史上第一个实现 **TOML 规则声明 → 自动
|
|
|
49
71
|
| HITL 审批 | `hitl-interaction-rules.toml` | `hitl.ts` | 每 IDE 独立声明交互模式 |
|
|
50
72
|
| DPS 评分 | `dps-scoring-rules.toml` | `gateway.ts` | 文档质量闸门:语义/熵/CPM/结构 四维权重+阈值,AI 调参不碰代码 |
|
|
51
73
|
|
|
74
|
+
> 📊 [sync-magic benchmark](./docs/sync-magic-benchmark-report.md):caijuehub 改造实测——4 组对比,TS vs bash,熵值 vs 速度的场景价值分析。
|
|
75
|
+
>
|
|
76
|
+
> 🧠 [什么是酷的软件](./docs/what-makes-software-cool.md):从 benchmark 出发抽象工程美学框架——标准符合度 × 熵值 × runtime 容忍区间。含 IT 运营 vs 个人认知双视角分析、达索案例。
|
|
77
|
+
|
|
52
78
|
**改规则不改代码**——产品经理读 TOML 即可理解软件行为,市场人员改 TOML 即可调整策略参数。AI Agent 大规模索引、检索、修改规则时,操作的是同一张决策表。认知负担从 O(N×M) 降为 O(1)。
|
|
53
79
|
|
|
54
80
|
### ③ Prompt Cache 原生友好 — 月费 ¥218,节省 98%
|
|
@@ -365,6 +391,10 @@ Caijuehub is add-coder's first implementation of **TOML declaration → auto-gen
|
|
|
365
391
|
| HITL Approval | `hitl-interaction-rules.toml` | `hitl.ts` | Per-IDE interaction mode declaration |
|
|
366
392
|
| DPS Scoring | `dps-scoring-rules.toml` | `gateway.ts` | Doc quality gateway: semantic/entropy/CPM/structure 4D weights+thresholds, AI self-tuning without touching code |
|
|
367
393
|
|
|
394
|
+
> 📊 [sync-magic benchmark](./docs/sync-magic-benchmark-report.md): Caijuehub refactoring measured — 4-group comparison, TS vs bash, scenario-value analysis of entropy vs speed.
|
|
395
|
+
>
|
|
396
|
+
> 🧠 [What Makes Software Cool](./docs/what-makes-software-cool.md): An engineering aesthetics framework derived from the benchmark — standards compliance × entropy × runtime tolerance. IT ops vs personal cognition perspectives, Dassault case study.
|
|
397
|
+
|
|
368
398
|
**Edit rules, not code** — product managers read TOML to understand software behavior, marketers modify TOML to adjust strategy parameters. When AI agents index, search, and modify rules at scale, they operate on the same decision table. Cognitive load drops from O(N×M) to O(1).
|
|
369
399
|
|
|
370
400
|
### ③ Prompt Cache Native — ¥218/mo, 98% Savings
|
|
@@ -625,3 +655,7 @@ npx add-coder init
|
|
|
625
655
|
| Memory Enhancement | Long-term project knowledge memory and plan-level sparse memory | 📋 |
|
|
626
656
|
|
|
627
657
|
---
|
|
658
|
+
|
|
659
|
+
My hometown
|
|
660
|
+
|
|
661
|
+
<img width="720" alt="hometown outside" src="https://github.com/user-attachments/assets/7aad93de-9cea-4194-b09d-cbd892d61cc2" />
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "add-coder",
|
|
3
|
-
"version": "0.3.6
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "[codein2027](https://github.com/xiaomingming92/codein2027) - A complete scaffolding for building the ADD programming paradigm, the implementation layer for AI code governance. Core principle: Audit as Infrastructure. Breaks the black-box programming process and cross-session amnesia, evolving programming paradigms into an auditable, traceable, and convergent new era. npx-ready.\n\n[codein2027](https://github.com/xiaomingming92/codein2027) 快速构建 ADD 编程范式的完整脚手架——AI 代码治理的落地方案。以「审计即基础设施」为核心,彻底打破编程过程黑盒与跨轮失忆,让编程范式进化为可审计、可追溯、可收敛的新时代。npx 即用,人人可体验。",
|
|
6
6
|
"repository": {
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"license": "AGPL-3.0-only",
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@modelcontextprotocol/server": "2.0.0",
|
|
44
|
+
"@xenova/transformers": "^2.17.2",
|
|
44
45
|
"commander": "^13.1.0",
|
|
45
46
|
"smol-toml": "^1.7.0",
|
|
46
47
|
"vector-cosine-similarity": "^1.8.0",
|
|
@@ -53,7 +54,8 @@
|
|
|
53
54
|
"dotenv": "*",
|
|
54
55
|
"prisma": "^7.0.0",
|
|
55
56
|
"tsx": ">=4",
|
|
56
|
-
"vector-cosine-similarity": "^1.8.0"
|
|
57
|
+
"vector-cosine-similarity": "^1.8.0",
|
|
58
|
+
"@xenova/transformers": "^2.17.2"
|
|
57
59
|
},
|
|
58
60
|
"peerDependenciesMeta": {
|
|
59
61
|
"@prisma/client": {
|
|
@@ -73,6 +75,9 @@
|
|
|
73
75
|
},
|
|
74
76
|
"@prisma/adapter-libsql": {
|
|
75
77
|
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"@xenova/transformers": {
|
|
80
|
+
"optional": true
|
|
76
81
|
}
|
|
77
82
|
},
|
|
78
83
|
"devDependencies": {
|
|
@@ -89,7 +94,9 @@
|
|
|
89
94
|
"predev": "npm run db:ensure",
|
|
90
95
|
"dev": "tsup --watch",
|
|
91
96
|
"db:ensure": "bash scripts/db-ensure.sh",
|
|
92
|
-
"sync": "
|
|
97
|
+
"sync": "tsx scripts/sync-magic.ts",
|
|
98
|
+
"sync:bash": "bash scripts/benchmark/sync-magic.sh",
|
|
99
|
+
"benchmark": "tsx scripts/benchmark/benchmark-sync.ts",
|
|
93
100
|
"lint": "eslint src/",
|
|
94
101
|
"lint:fix": "eslint src/ --fix",
|
|
95
102
|
"generate": "tsx src/caijuehub/transcribe.ts",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_version": "0.3.6
|
|
2
|
+
"_version": "0.3.6",
|
|
3
3
|
"adapters/claude/hooks/doc-format-guard.sh": "ec59ad3f",
|
|
4
4
|
"adapters/claude/hooks/lib/common.sh": "db321ef6",
|
|
5
5
|
"adapters/claude/hooks/lib/context-inject.sh": "4132f203",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"adapters/claude/hooks/post-tool-failure.sh": "669b1b65",
|
|
16
16
|
"adapters/claude/hooks/post-tool-use.sh": "f54dd009",
|
|
17
17
|
"adapters/claude/hooks/pre-compact.sh": "4248f84f",
|
|
18
|
-
"adapters/claude/hooks/pre-tool-use.sh": "
|
|
18
|
+
"adapters/claude/hooks/pre-tool-use.sh": "ecbdc628",
|
|
19
19
|
"adapters/claude/hooks/prompt-submit.sh": "680b41f4",
|
|
20
20
|
"adapters/claude/hooks/review-checklist.sh": "b383a983",
|
|
21
21
|
"adapters/claude/hooks/session-end.sh": "777ae808",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"adapters/codex/hooks/notification.sh": "f7aed25d",
|
|
39
39
|
"adapters/codex/hooks/permission-gate.sh": "bcca7732",
|
|
40
40
|
"adapters/codex/hooks/post-tool-failure.sh": "669b1b65",
|
|
41
|
-
"adapters/codex/hooks/post-tool-use.sh": "
|
|
41
|
+
"adapters/codex/hooks/post-tool-use.sh": "27123aee",
|
|
42
42
|
"adapters/codex/hooks/pre-compact.sh": "6164c007",
|
|
43
|
-
"adapters/codex/hooks/pre-tool-use.sh": "
|
|
43
|
+
"adapters/codex/hooks/pre-tool-use.sh": "ffa7936b",
|
|
44
44
|
"adapters/codex/hooks/prompt-submit.sh": "bea6f381",
|
|
45
45
|
"adapters/codex/hooks/review-checklist.sh": "b383a983",
|
|
46
46
|
"adapters/codex/hooks/session-end.sh": "3cc8c346",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"adapters/qoder/hooks/notification.sh": "7d4efea6",
|
|
63
63
|
"adapters/qoder/hooks/permission-gate.sh": "3bf27b1a",
|
|
64
64
|
"adapters/qoder/hooks/post-tool-failure.sh": "8bc7a0e4",
|
|
65
|
-
"adapters/qoder/hooks/post-tool-use.sh": "
|
|
65
|
+
"adapters/qoder/hooks/post-tool-use.sh": "051cb6ed",
|
|
66
66
|
"adapters/qoder/hooks/pre-compact.sh": "092fa6cf",
|
|
67
|
-
"adapters/qoder/hooks/pre-tool-use.sh": "
|
|
67
|
+
"adapters/qoder/hooks/pre-tool-use.sh": "5ba6d9ae",
|
|
68
68
|
"adapters/qoder/hooks/prompt-submit.sh": "f36e6ae8",
|
|
69
69
|
"adapters/qoder/hooks/review-checklist.sh": "666831c8",
|
|
70
70
|
"adapters/qoder/hooks/session-end.sh": "c50339df",
|
|
@@ -87,9 +87,9 @@
|
|
|
87
87
|
"adapters/trae/hooks/notification.sh": "f7aed25d",
|
|
88
88
|
"adapters/trae/hooks/permission-gate.sh": "bcca7732",
|
|
89
89
|
"adapters/trae/hooks/post-tool-failure.sh": "669b1b65",
|
|
90
|
-
"adapters/trae/hooks/post-tool-use.sh": "
|
|
90
|
+
"adapters/trae/hooks/post-tool-use.sh": "27123aee",
|
|
91
91
|
"adapters/trae/hooks/pre-compact.sh": "6164c007",
|
|
92
|
-
"adapters/trae/hooks/pre-tool-use.sh": "
|
|
92
|
+
"adapters/trae/hooks/pre-tool-use.sh": "8e57d1fa",
|
|
93
93
|
"adapters/trae/hooks/prompt-submit.sh": "bea6f381",
|
|
94
94
|
"adapters/trae/hooks/review-checklist.sh": "b383a983",
|
|
95
95
|
"adapters/trae/hooks/session-end.sh": "3cc8c346",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"adapters/vscode/hooks/post-tool-failure.sh": "355cfab1",
|
|
125
125
|
"adapters/vscode/hooks/post-tool-use.sh": "5f188718",
|
|
126
126
|
"adapters/vscode/hooks/pre-compact.sh": "a0908f0e",
|
|
127
|
-
"adapters/vscode/hooks/pre-tool-use.sh": "
|
|
127
|
+
"adapters/vscode/hooks/pre-tool-use.sh": "6232624b",
|
|
128
128
|
"adapters/vscode/hooks/prompt-submit.sh": "4529a394",
|
|
129
129
|
"adapters/vscode/hooks/review-checklist.sh": "b383a983",
|
|
130
130
|
"adapters/vscode/hooks/session-end.sh": "7b407b9f",
|
|
@@ -135,8 +135,7 @@
|
|
|
135
135
|
"adapters/vscode/launch.json": "f2b79855",
|
|
136
136
|
"adapters/vscode/settings.json": "7cabd00e",
|
|
137
137
|
"adapters/vscode/tasks.json": "654d7fbd",
|
|
138
|
-
"core/agents/add-flow-guardian.md": "
|
|
139
|
-
"core/agents/add-orchestrator.md": "0d555e99",
|
|
138
|
+
"core/agents/add-flow-guardian.md": "a23f50cf",
|
|
140
139
|
"core/docs/ADD-governance-claude-code.md": "0f582a7e",
|
|
141
140
|
"core/docs/ADD-governance-codex.md": "289e8b71",
|
|
142
141
|
"core/docs/ADD-governance-qoder-cn.md": "332a7253",
|
|
@@ -154,9 +153,9 @@
|
|
|
154
153
|
"core/hooks/notification.sh": "f7aed25d",
|
|
155
154
|
"core/hooks/permission-gate.sh": "bcca7732",
|
|
156
155
|
"core/hooks/post-tool-failure.sh": "669b1b65",
|
|
157
|
-
"core/hooks/post-tool-use.sh": "
|
|
156
|
+
"core/hooks/post-tool-use.sh": "27123aee",
|
|
158
157
|
"core/hooks/pre-compact.sh": "6164c007",
|
|
159
|
-
"core/hooks/pre-tool-use.sh": "
|
|
158
|
+
"core/hooks/pre-tool-use.sh": "fa73df98",
|
|
160
159
|
"core/hooks/prompt-submit.sh": "bea6f381",
|
|
161
160
|
"core/hooks/review-checklist.sh": "b383a983",
|
|
162
161
|
"core/hooks/session-end.sh": "3cc8c346",
|
|
@@ -167,7 +166,7 @@
|
|
|
167
166
|
"core/plans/2026-07/08/add-coder-npm-package-add-route-v1.md": "b05fce99",
|
|
168
167
|
"core/plans/2026-07/08/add-coder-npm-package-handoff-v1.md": "1bd40a4a",
|
|
169
168
|
"core/plans/2026-07/08/add-coder-npm-package-plan-v1.md": "a678d98e",
|
|
170
|
-
"core/prisma/add.prisma": "
|
|
169
|
+
"core/prisma/add.prisma": "3733af9f",
|
|
171
170
|
"core/reports/REPORT-WORKFLOW.md": "03d39b21",
|
|
172
171
|
"core/reports/boundary-runtime-report.md": "6fd8053f",
|
|
173
172
|
"core/reports/code-review-combined-report.md": "195d52aa",
|
|
@@ -176,7 +175,7 @@
|
|
|
176
175
|
"core/reports/index.md": "6348c374",
|
|
177
176
|
"core/reports/runtime-report/gateway.md": "a5751665",
|
|
178
177
|
"core/reviews/.gitkeep": "e3b0c442",
|
|
179
|
-
"core/rules/project_rules.md": "
|
|
178
|
+
"core/rules/project_rules.md": "b2680762",
|
|
180
179
|
"core/rules/theory-practice-map.toml": "b1db99fd",
|
|
181
180
|
"core/scripts/db-ensure.sh": "faeb6b92",
|
|
182
181
|
"core/scripts/gen-plan-index.sh": "bfc6ad3e",
|
|
@@ -193,7 +192,7 @@
|
|
|
193
192
|
"core/scripts/mcp-server/resources/round-task.ts": "104a0d74",
|
|
194
193
|
"core/scripts/mcp-server/sampling/index.ts": "7ee26d92",
|
|
195
194
|
"core/scripts/mcp-server/sampling/review.ts": "5db7a8df",
|
|
196
|
-
"core/scripts/mcp-server/shared/dps-scoring.strategy.ts": "
|
|
195
|
+
"core/scripts/mcp-server/shared/dps-scoring.strategy.ts": "f1c901dc",
|
|
197
196
|
"core/scripts/mcp-server/shared/env.ts": "57f4c2f2",
|
|
198
197
|
"core/scripts/mcp-server/shared/fs.ts": "97257db9",
|
|
199
198
|
"core/scripts/mcp-server/shared/hitl-interaction.strategy.ts": "7c5c26f5",
|
|
@@ -204,29 +203,36 @@
|
|
|
204
203
|
"core/scripts/mcp-server/tasks/index.ts": "c040eb75",
|
|
205
204
|
"core/scripts/mcp-server/tasks/runner.ts": "d84bd35d",
|
|
206
205
|
"core/scripts/mcp-server/tasks/store.ts": "2fce1a92",
|
|
207
|
-
"core/scripts/mcp-server/tools/audit.ts": "
|
|
206
|
+
"core/scripts/mcp-server/tools/audit.ts": "3c23458b",
|
|
208
207
|
"core/scripts/mcp-server/tools/context.ts": "463df4f4",
|
|
209
208
|
"core/scripts/mcp-server/tools/docs.ts": "a3937aec",
|
|
210
|
-
"core/scripts/mcp-server/tools/gateway.ts": "
|
|
209
|
+
"core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts": "c205989d",
|
|
210
|
+
"core/scripts/mcp-server/tools/gateway/check_add_route_status.ts": "3662b6dc",
|
|
211
|
+
"core/scripts/mcp-server/tools/gateway/check_dps.ts": "12f3b375",
|
|
212
|
+
"core/scripts/mcp-server/tools/gateway/check_rahs.ts": "dc7e2a20",
|
|
213
|
+
"core/scripts/mcp-server/tools/gateway/check_spec_sync.ts": "a683697f",
|
|
214
|
+
"core/scripts/mcp-server/tools/gateway/helpers.ts": "5ed11a3b",
|
|
215
|
+
"core/scripts/mcp-server/tools/gateway/index.ts": "5a9fd5ed",
|
|
216
|
+
"core/scripts/mcp-server/tools/gateway.backup": "65eae393",
|
|
211
217
|
"core/scripts/mcp-server/tools/hitl.ts": "80093743",
|
|
212
218
|
"core/scripts/mcp-server/tools/hook-event-report.ts": "3926005b",
|
|
213
|
-
"core/scripts/mcp-server/tools/index.ts": "
|
|
214
|
-
"core/scripts/mcp-server/tools/plan.ts": "
|
|
219
|
+
"core/scripts/mcp-server/tools/index.ts": "b15c6753",
|
|
220
|
+
"core/scripts/mcp-server/tools/plan.ts": "9ef4da1e",
|
|
215
221
|
"core/scripts/mcp-server/tools/quality.ts": "26ddf75d",
|
|
216
222
|
"core/scripts/mcp-server/tools/review.ts": "c2d464ed",
|
|
217
223
|
"core/scripts/mcp-server/types.ts": "6c5e60bc",
|
|
218
224
|
"core/scripts/mcp-server.ts": "99cc6833",
|
|
219
225
|
"core/skills/add-paradigm/SKILL.md": "b74ef053",
|
|
220
|
-
"core/skills/session-init/SKILL.md": "
|
|
226
|
+
"core/skills/session-init/SKILL.md": "bb1205b0",
|
|
221
227
|
"core/specs/add-coder-npm-package/checklist.md": "ed92032c",
|
|
222
228
|
"core/specs/add-coder-npm-package/spec.md": "c7d0f235",
|
|
223
229
|
"core/specs/add-coder-npm-package/tasks.md": "c34301e5",
|
|
224
230
|
"core/templates/01-架构/《ADD开发工作路径与文档协同规范》.md": "4a566775",
|
|
225
231
|
"core/templates/TERMINOLOGY.md": "e9f4f781",
|
|
226
|
-
"core/templates/add-route-template-heavyweight.md": "
|
|
227
|
-
"core/templates/add-route-template.md": "
|
|
228
|
-
"core/templates/add-route-template.schema.json": "
|
|
229
|
-
"core/templates/checklist-template.md": "
|
|
232
|
+
"core/templates/add-route-template-heavyweight.md": "0e107ac0",
|
|
233
|
+
"core/templates/add-route-template.md": "da7022df",
|
|
234
|
+
"core/templates/add-route-template.schema.json": "867a45c1",
|
|
235
|
+
"core/templates/checklist-template.md": "d6b73a5c",
|
|
230
236
|
"core/templates/checklist-template.schema.json": "fb3a73e8",
|
|
231
237
|
"core/templates/fix-verification-template.md": "9c9ed175",
|
|
232
238
|
"core/templates/fix-verification-template.schema.json": "a18bc6a5",
|
|
@@ -252,14 +258,14 @@
|
|
|
252
258
|
"core/templates/review-template.schema.json": "abc2ece6",
|
|
253
259
|
"core/templates/runtime-report-template.md": "7b35208a",
|
|
254
260
|
"core/templates/runtime-report-template.schema.json": "6c1143e6",
|
|
255
|
-
"core/templates/simple-plan-template.md": "
|
|
261
|
+
"core/templates/simple-plan-template.md": "db5c247f",
|
|
256
262
|
"core/templates/simple-plan-template.schema.json": "99d53cc1",
|
|
257
|
-
"core/templates/spec-template.md": "
|
|
258
|
-
"core/templates/spec-template.schema.json": "
|
|
259
|
-
"core/templates/standard-plan-template.md": "
|
|
263
|
+
"core/templates/spec-template.md": "619b01cc",
|
|
264
|
+
"core/templates/spec-template.schema.json": "051b6e5d",
|
|
265
|
+
"core/templates/standard-plan-template.md": "2129931c",
|
|
260
266
|
"core/templates/standard-plan-template.schema.json": "2b767928",
|
|
261
|
-
"core/templates/tasks-template.md": "
|
|
262
|
-
"core/templates/tasks-template.schema.json": "
|
|
267
|
+
"core/templates/tasks-template.md": "2b9d0d52",
|
|
268
|
+
"core/templates/tasks-template.schema.json": "fff6eb47",
|
|
263
269
|
"core/tools/README.md": "26a63460",
|
|
264
270
|
"core/vocabulary/add-governance-vocabulary.md": "0bd9f725",
|
|
265
271
|
"shared/hooks-lib/common.sh": "441eee52"
|
|
@@ -82,6 +82,25 @@ if [ "$tool_name" = "Write" ] || [ "$tool_name" = "Edit" ] || [ "$tool_name" = "
|
|
|
82
82
|
exit $EXIT_BLOCK
|
|
83
83
|
fi
|
|
84
84
|
|
|
85
|
+
# 模板类型前置注入 — plans/ 写入前提示应选模板
|
|
86
|
+
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|
|
87
|
+
fname=$(basename "$file_path")
|
|
88
|
+
if echo "$fname" | grep -qE 'plan-v[0-9]'; then
|
|
89
|
+
echo "💡 [ADD PreToolUse] 写入 Plan → 模板: standard-plan-template.md(标准)或 simple-plan-template.md(≤3文件)" >&2
|
|
90
|
+
elif echo "$fname" | grep -qE 'add-route'; then
|
|
91
|
+
echo "💡 [ADD PreToolUse] 写入 ADD Route → 模板: add-route-template.md" >&2
|
|
92
|
+
elif echo "$fname" | grep -qE 'handoff'; then
|
|
93
|
+
echo "💡 [ADD PreToolUse] 写入 Handoff → 模板: handoff-single-round-template.md(单轮)或 handoff-multi-round-template.md(多轮)" >&2
|
|
94
|
+
fi
|
|
95
|
+
# Write 大文件适配 — 已存在大文件建议用 SearchReplace 分块
|
|
96
|
+
if echo "$tool_name" | grep -qE 'Write' && [ -f "$file_path" ]; then
|
|
97
|
+
fsize=$(wc -c < "$file_path" 2>/dev/null || echo "0")
|
|
98
|
+
if [ "$fsize" -gt 2000 ] 2>/dev/null; then
|
|
99
|
+
echo "⚠️ [ADD PreToolUse] 文件已有 ${fsize} 字节,Write 全量覆盖可能触发工具 payload 限制。建议用 SearchReplace 分块追加。" >&2
|
|
100
|
+
fi
|
|
101
|
+
fi
|
|
102
|
+
fi
|
|
103
|
+
|
|
85
104
|
# §C: HITL tongyi 检查 — plans/ + PLAN_REVIEW reviews/ 写入前必须有 .hitl-tongyi-{planName} 哨兵
|
|
86
105
|
# implementation/runtime review 不需要 HITL,走 §B 活跃 Plan 检查
|
|
87
106
|
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|
|
@@ -1,4 +1,107 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
# post-tool-use.sh — PostToolUse:格式化 + 文档守卫 + 审计提醒 + DPS 自动化
|
|
3
|
+
# 治理卡位 #5: 格式化 + ADD文档守卫 + 审计落库 + 结果增强 + 哨兵自动化
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
HOOK_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
7
|
+
COMMON_LIB="$HOOK_DIR/lib/common.sh"
|
|
8
|
+
[ -f "$COMMON_LIB" ] && source "$COMMON_LIB"
|
|
9
|
+
|
|
10
|
+
input=$(parse_input)
|
|
11
|
+
tool_name=$(json_get "$input" "tool_name")
|
|
12
|
+
[ -z "$tool_name" ] && tool_name=$(echo "$input" | grep -o '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null | sed 's/.*: *"\([^"]*\)".*/\1/' || echo "")
|
|
13
|
+
|
|
14
|
+
# ═══════════════ §1: HITL DPS 自动化 — check_dps ≥ 80 → 自动建哨兵 ═══════════════
|
|
15
|
+
# 检测 MCP check_dps 调用结果,DPS ≥ 80 自动 touch .tongyi-{plan} 哨兵
|
|
16
|
+
if echo "$input" | grep -q '"check_dps"'; then
|
|
17
|
+
tool_output=$(echo "$input" | grep -o '"output"[[:space:]]*:[[:space:]]*"[^"]*"\|"content"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null || echo "")
|
|
18
|
+
dps_score=$(echo "$tool_output" | grep -oP 'DPS\s*=\s*\K\d+' 2>/dev/null || echo "")
|
|
19
|
+
plan_keyword=$(echo "$input" | grep -oP '"planKeyword"\s*:\s*"\K[^"]+' 2>/dev/null || echo "")
|
|
20
|
+
|
|
21
|
+
if [ -n "$dps_score" ] && [ -n "$plan_keyword" ]; then
|
|
22
|
+
if [ "$dps_score" -ge 80 ] 2>/dev/null; then
|
|
23
|
+
sentinel="${PROJECT_DIR:-$PWD}/${MAGIC_DIR:-.qoder}/hitl/.tongyi-${plan_keyword}"
|
|
24
|
+
if [ ! -f "$sentinel" ]; then
|
|
25
|
+
touch "$sentinel" 2>/dev/null && echo "[ADD PostToolUse] ✅ DPS=${dps_score} ≥80, HITL 自动通过 → ${sentinel}" >&2 || true
|
|
26
|
+
echo "[ADD PostToolUse] DPS=${dps_score} ≥80, 已自动建哨兵 ${sentinel}" >&2
|
|
27
|
+
else
|
|
28
|
+
echo "[ADD PostToolUse] DPS=${dps_score} ≥80, 哨兵已存在 → ${sentinel}" >&2
|
|
29
|
+
fi
|
|
30
|
+
else
|
|
31
|
+
echo "[ADD PostToolUse] ⚠️ DPS=${dps_score} <80, 需 Review 后手动建哨兵 .tongyi-${plan_keyword}" >&2
|
|
32
|
+
echo "[ADD PostToolUse] 修复文档后重新 check_dps,通过即自动放行。" >&2
|
|
33
|
+
fi
|
|
34
|
+
fi
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# ═══════════════ §2: Edit/Write matcher: 格式化 + 文档守卫 + 自动 plan_track ═══════════════
|
|
38
|
+
if [ "$tool_name" = "Edit" ] || [ "$tool_name" = "Write" ]; then
|
|
39
|
+
file_path=$(echo "$input" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null | sed 's/.*: *"\([^"]*\)".*/\1/' || echo "")
|
|
40
|
+
[ -z "$file_path" ] && exit 0
|
|
41
|
+
|
|
42
|
+
# §2a: ADD 文档结构守卫
|
|
43
|
+
if echo "$file_path" | grep -qE '\.(qoder|claude|add)/(plans|specs|reviews)/'; then
|
|
44
|
+
echo "[ADD PostToolUse] ADD 文档已写入: ${file_path}。请确保章节完整、双向链接齐全。" >&2
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# §2b: plan_track 自动触发 — specs/ 或 add-route 写入后自动落库
|
|
48
|
+
if echo "$file_path" | grep -qE '/(specs|plans)/.*add-route'; then
|
|
49
|
+
plan_name=$(basename "$file_path" | sed 's/-add-route.*//' | sed 's/-plan-v[0-9]*$//')
|
|
50
|
+
# 从路径提取完整 planName(含 -plan-vN 后缀)
|
|
51
|
+
if echo "$file_path" | grep -qE 'add-route'; then
|
|
52
|
+
# add-route 写入:从文件名反推 planName
|
|
53
|
+
plan_prefix=$(basename "$file_path" | sed 's/-add-route-v[0-9]*\.md$//')
|
|
54
|
+
plan_dir=$(dirname "$file_path")
|
|
55
|
+
if [ -d "$plan_dir" ]; then
|
|
56
|
+
plan_file=$(ls "$plan_dir"/*-plan-v*.md 2>/dev/null | head -1 || echo "")
|
|
57
|
+
if [ -n "$plan_file" ]; then
|
|
58
|
+
plan_name=$(basename "$plan_file" .md)
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
fi
|
|
62
|
+
if [ -n "$plan_name" ]; then
|
|
63
|
+
echo "[ADD PostToolUse] 📊 自动同步 PlanRecord: plan_track({ planName: \"${plan_name}\" }) — 请执行" >&2
|
|
64
|
+
fi
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# §2c: devlog 自动提醒 — add-route Step 8 全 [x] 时提醒
|
|
68
|
+
if echo "$file_path" | grep -qE 'add-route.*\.md$'; then
|
|
69
|
+
if [ -f "$file_path" ]; then
|
|
70
|
+
step8_content=$(sed -n '/## Step 8/,/^## /p' "$file_path" 2>/dev/null || echo "")
|
|
71
|
+
unchecked=$(echo "$step8_content" | grep -c '^\- \[ \]' 2>/dev/null || echo "0")
|
|
72
|
+
checked=$(echo "$step8_content" | grep -c '^\- \[x\]' 2>/dev/null || echo "0")
|
|
73
|
+
if [ "$unchecked" = "0" ] && [ "$checked" -gt 0 ]; then
|
|
74
|
+
echo "[ADD PostToolUse] ⚠️ Step 8 全部收敛完成!请写 devlog日志(走mcp) → 更新 handoff" >&2
|
|
75
|
+
fi
|
|
76
|
+
fi
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# §2d: schema.json 自动 regen — 模板 .md 修改后更新对应 schema
|
|
80
|
+
if echo "$file_path" | grep -qE 'templates/.*\.md$'; then
|
|
81
|
+
schema_file="${file_path%.md}.schema.json"
|
|
82
|
+
if [ -f "$schema_file" ]; then
|
|
83
|
+
# 扫描模板实际 ## 标题,更新 schema sections
|
|
84
|
+
headings=$(grep -oP '^## \K.+' "$file_path" 2>/dev/null | head -20 || echo "")
|
|
85
|
+
if [ -n "$headings" ]; then
|
|
86
|
+
echo "[ADD PostToolUse] 🔄 模板已修改,请检查 ${schema_file} 是否需更新(§ sections)" >&2
|
|
87
|
+
echo "[ADD PostToolUse] 模板标题: $(echo "$headings" | tr '\n' ' ')" >&2
|
|
88
|
+
fi
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# §2e: 审计提醒
|
|
93
|
+
echo "[ADD PostToolUse] 文件已写入: ${file_path}。请执行 record_dev_operation 落库审计(ADD-7)。" >&2
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# ═══════════════ §3: Bash matcher: 结果增强 ═══════════════
|
|
98
|
+
if [ "$tool_name" = "Bash" ]; then
|
|
99
|
+
echo "[ADD PostToolUse] 命令执行完成。如有 lint/tsc 错误请修复。" >&2
|
|
100
|
+
exit 0
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
exit 0
|
|
104
|
+
#!/bin/bash
|
|
2
105
|
# post-tool-use.sh — Claude Code PostToolUse:格式化 + 文档守卫 + 审计提醒
|
|
3
106
|
# 治理卡位 #5: 格式化 + ADD文档守卫 + 审计落库 + 结果增强
|
|
4
107
|
set -euo pipefail
|
|
@@ -154,6 +154,25 @@ if [ "$tool_name" = "Write" ] || [ "$tool_name" = "Edit" ] || [ "$tool_name" = "
|
|
|
154
154
|
exit 2
|
|
155
155
|
fi
|
|
156
156
|
|
|
157
|
+
# §C: 模板类型前置注入 — plans/ 写入前提示应选模板
|
|
158
|
+
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|
|
159
|
+
fname=$(basename "$file_path")
|
|
160
|
+
if echo "$fname" | grep -qE 'plan-v[0-9]'; then
|
|
161
|
+
echo "💡 [ADD PreToolUse] 写入 Plan → 模板: standard-plan-template.md(标准)或 simple-plan-template.md(≤3文件)" >&2
|
|
162
|
+
elif echo "$fname" | grep -qE 'add-route'; then
|
|
163
|
+
echo "💡 [ADD PreToolUse] 写入 ADD Route → 模板: add-route-template.md" >&2
|
|
164
|
+
elif echo "$fname" | grep -qE 'handoff'; then
|
|
165
|
+
echo "💡 [ADD PreToolUse] 写入 Handoff → 模板: handoff-single-round-template.md(单轮)或 handoff-multi-round-template.md(多轮)" >&2
|
|
166
|
+
fi
|
|
167
|
+
# Write 大文件适配 — 已存在大文件建议用 SearchReplace 分块
|
|
168
|
+
if echo "$tool_name" | grep -qE 'Write' && [ -f "$file_path" ]; then
|
|
169
|
+
fsize=$(wc -c < "$file_path" 2>/dev/null || echo "0")
|
|
170
|
+
if [ "$fsize" -gt 2000 ] 2>/dev/null; then
|
|
171
|
+
echo "⚠️ [ADD PreToolUse] 文件已有 ${fsize} 字节,Write 全量覆盖可能触发工具 payload 限制。建议用 SearchReplace 分块追加。" >&2
|
|
172
|
+
fi
|
|
173
|
+
fi
|
|
174
|
+
fi
|
|
175
|
+
|
|
157
176
|
# §C: HITL tongyi 检查 — plans/ + PLAN_REVIEW reviews/ 写入前必须有 .hitl-tongyi-{planName} 哨兵
|
|
158
177
|
# implementation/runtime review 不需要 HITL,走 §B 活跃 Plan 检查
|
|
159
178
|
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|
|
@@ -1,4 +1,95 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
# post-tool-use.sh — Qoder CN PostToolUse:格式化 + 文档守卫 + 审计提醒 + DPS 自动化
|
|
3
|
+
# 治理卡位 #5: 格式化 + ADD文档守卫 + 审计落库 + 结果增强 + 哨兵自动化
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
input=$(cat)
|
|
7
|
+
HOOK_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
8
|
+
export CURRENT_MAGIC=$(basename "$(dirname "$HOOK_DIR")")
|
|
9
|
+
export PROJECT_DIR="${QODER_PROJECT_DIR:-${QODERCN_PROJECT_DIR:-$PWD}}"
|
|
10
|
+
source "$HOOK_DIR/lib/common.sh" 2>/dev/null || true
|
|
11
|
+
MAGIC_DIR="$CURRENT_MAGIC"
|
|
12
|
+
|
|
13
|
+
tool_name=$(json_get "$input" "tool_name")
|
|
14
|
+
[ -z "$tool_name" ] && tool_name=$(echo "$input" | grep -o '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null | sed 's/.*: *"\([^"]*\)".*/\1/' || echo "")
|
|
15
|
+
|
|
16
|
+
# ═══════════════ §1: HITL DPS 自动化 — check_dps ≥ 80 → 自动建哨兵 ═══════════════
|
|
17
|
+
if echo "$input" | grep -q '"check_dps"'; then
|
|
18
|
+
dps_score=$(echo "$input" | grep -oP 'DPS\s*=\s*\K\d+' 2>/dev/null || echo "")
|
|
19
|
+
plan_keyword=$(echo "$input" | grep -oP '"planKeyword"\s*:\s*"\K[^"]+' 2>/dev/null || echo "")
|
|
20
|
+
|
|
21
|
+
if [ -n "$dps_score" ] && [ -n "$plan_keyword" ]; then
|
|
22
|
+
if [ "$dps_score" -ge 80 ] 2>/dev/null; then
|
|
23
|
+
sentinel="${PROJECT_DIR}/${MAGIC_DIR}/hitl/.tongyi-${plan_keyword}"
|
|
24
|
+
if [ ! -f "$sentinel" ]; then
|
|
25
|
+
touch "$sentinel" 2>/dev/null || true
|
|
26
|
+
echo "[ADD PostToolUse] ✅ DPS=${dps_score} ≥80, HITL 自动通过 → ${sentinel}" >&2
|
|
27
|
+
fi
|
|
28
|
+
else
|
|
29
|
+
echo "[ADD PostToolUse] ⚠️ DPS=${dps_score} <80, 需 Review 后手动建哨兵 .tongyi-${plan_keyword}" >&2
|
|
30
|
+
fi
|
|
31
|
+
fi
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# ═══════════════ §2: Edit/Write matcher ═══════════════
|
|
35
|
+
if [ "$tool_name" = "Edit" ] || [ "$tool_name" = "Write" ]; then
|
|
36
|
+
file_path=$(echo "$input" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' 2>/dev/null | sed 's/.*: *"\([^"]*\)".*/\1/' || echo "")
|
|
37
|
+
[ -z "$file_path" ] && exit 0
|
|
38
|
+
|
|
39
|
+
# §2a: ADD 文档结构守卫
|
|
40
|
+
if echo "$file_path" | grep -qE '\.(qoder|claude|add)/(plans|specs|reviews)/'; then
|
|
41
|
+
echo "[ADD PostToolUse] ADD 文档已写入: ${file_path}。请确保章节完整、双向链接齐全。" >&2
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# §2b: plan_track 自动触发 — specs/ 或 add-route 写入后提醒
|
|
45
|
+
if echo "$file_path" | grep -qE '/(specs|plans)/.*add-route'; then
|
|
46
|
+
plan_name=""
|
|
47
|
+
if echo "$file_path" | grep -qE 'add-route'; then
|
|
48
|
+
plan_prefix=$(basename "$file_path" | sed 's/-add-route-v[0-9]*\.md$//')
|
|
49
|
+
plan_dir=$(dirname "$file_path")
|
|
50
|
+
if [ -d "$plan_dir" ]; then
|
|
51
|
+
plan_file=$(ls "$plan_dir"/*-plan-v*.md 2>/dev/null | head -1 || echo "")
|
|
52
|
+
if [ -n "$plan_file" ]; then
|
|
53
|
+
plan_name=$(basename "$plan_file" .md)
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
fi
|
|
57
|
+
if [ -n "$plan_name" ]; then
|
|
58
|
+
echo "[ADD PostToolUse] 📊 请执行 plan_track({ planName: \"${plan_name}\" }) 落库同步" >&2
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# §2c: devlog 自动提醒 — add-route Step 8 全 [x] 时提醒
|
|
63
|
+
if echo "$file_path" | grep -qE 'add-route.*\.md$'; then
|
|
64
|
+
if [ -f "$file_path" ]; then
|
|
65
|
+
step8_unchecked=$(sed -n '/## Step 8/,/^## /p' "$file_path" 2>/dev/null | grep -c '^\- \[ \]' 2>/dev/null || echo "0")
|
|
66
|
+
step8_checked=$(sed -n '/## Step 8/,/^## /p' "$file_path" 2>/dev/null | grep -c '^\- \[x\]' 2>/dev/null || echo "0")
|
|
67
|
+
if [ "$step8_unchecked" = "0" ] && [ "$step8_checked" -gt 0 ]; then
|
|
68
|
+
echo "[ADD PostToolUse] ⚠️ Step 8 全部收敛完成!请写 devlog日志(走mcp) → 更新 handoff" >&2
|
|
69
|
+
fi
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# §2d: schema.json 自动 regen 提醒
|
|
74
|
+
if echo "$file_path" | grep -qE 'templates/.*\.md$'; then
|
|
75
|
+
schema_file="${file_path%.md}.schema.json"
|
|
76
|
+
if [ -f "$schema_file" ]; then
|
|
77
|
+
echo "[ADD PostToolUse] 🔄 模板已修改,请检查 ${schema_file} 是否需更新" >&2
|
|
78
|
+
fi
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
echo "[ADD PostToolUse] 文件已写入: ${file_path}。请执行 record_dev_operation 落库审计(ADD-7)。" >&2
|
|
82
|
+
exit 0
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# ═══════════════ §3: Bash matcher ═══════════════
|
|
86
|
+
if [ "$tool_name" = "Bash" ]; then
|
|
87
|
+
echo "[ADD PostToolUse] 命令执行完成。如有 lint/tsc 错误请修复。" >&2
|
|
88
|
+
exit 0
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
exit 0
|
|
92
|
+
#!/bin/bash
|
|
2
93
|
# post-tool-use.sh — Qoder CN PostToolUse:格式化 + 文档守卫 + 审计提醒
|
|
3
94
|
# 治理卡位 #5: 格式化 + ADD文档守卫 + 审计落库 + 结果增强
|
|
4
95
|
set -euo pipefail
|
|
@@ -83,6 +83,25 @@ if [ "$tool_name" = "Write" ] || [ "$tool_name" = "Edit" ] || [ "$tool_name" = "
|
|
|
83
83
|
exit 2
|
|
84
84
|
fi
|
|
85
85
|
|
|
86
|
+
# §B: 模板类型前置注入 — plans/ 写入前提示应选模板
|
|
87
|
+
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|
|
88
|
+
fname=$(basename "$file_path")
|
|
89
|
+
if echo "$fname" | grep -qE 'plan-v[0-9]'; then
|
|
90
|
+
echo "💡 [ADD PreToolUse] 写入 Plan → 模板: standard-plan-template.md(标准)或 simple-plan-template.md(≤3文件)" >&2
|
|
91
|
+
elif echo "$fname" | grep -qE 'add-route'; then
|
|
92
|
+
echo "💡 [ADD PreToolUse] 写入 ADD Route → 模板: add-route-template.md" >&2
|
|
93
|
+
elif echo "$fname" | grep -qE 'handoff'; then
|
|
94
|
+
echo "💡 [ADD PreToolUse] 写入 Handoff → 模板: handoff-single-round-template.md(单轮)或 handoff-multi-round-template.md(多轮)" >&2
|
|
95
|
+
fi
|
|
96
|
+
# Qoder Write 大文件适配 — 已存在大文件建议用 SearchReplace 分块
|
|
97
|
+
if echo "$tool_name" | grep -qE 'Write' && [ -f "$file_path" ]; then
|
|
98
|
+
fsize=$(wc -c < "$file_path" 2>/dev/null || echo "0")
|
|
99
|
+
if [ "$fsize" -gt 2000 ] 2>/dev/null; then
|
|
100
|
+
echo "⚠️ [ADD PreToolUse] 文件已有 ${fsize} 字节,Write 全量覆盖可能触发 Qoder 40500。建议用 SearchReplace 分块追加。" >&2
|
|
101
|
+
fi
|
|
102
|
+
fi
|
|
103
|
+
fi
|
|
104
|
+
|
|
86
105
|
# §C: HITL tongyi 检查 — plans/ + PLAN_REVIEW reviews/ 写入前必须有 .hitl-tongyi-{planName} 哨兵
|
|
87
106
|
# implementation/runtime review 不需要 HITL,走 §B 活跃 Plan 检查
|
|
88
107
|
if echo "$file_path" | grep -qE '\.(qoder|claude|add|vscode|trae)/(plans)/'; then
|