add-coder 0.3.6-feature-hitl-enhance-v1.2 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +40 -4
  2. package/dist/index.js +49 -3
  3. package/package.json +10 -7
  4. package/templates/.add-coder-src-hash.json +37 -31
  5. package/templates/adapters/claude/hooks/pre-tool-use.sh +19 -0
  6. package/templates/adapters/codex/hooks/post-tool-use.sh +103 -0
  7. package/templates/adapters/codex/hooks/pre-tool-use.sh +19 -0
  8. package/templates/adapters/qoder/hooks/post-tool-use.sh +91 -0
  9. package/templates/adapters/qoder/hooks/pre-tool-use.sh +19 -0
  10. package/templates/adapters/trae/hooks/post-tool-use.sh +103 -0
  11. package/templates/adapters/trae/hooks/pre-tool-use.sh +19 -0
  12. package/templates/adapters/vscode/hooks/pre-tool-use.sh +19 -0
  13. package/templates/core/agents/add-flow-guardian.md +27 -25
  14. package/templates/core/hooks/post-tool-use.sh +103 -0
  15. package/templates/core/hooks/pre-tool-use.sh +19 -0
  16. package/templates/core/prisma/add.prisma +1 -0
  17. package/templates/core/rules/project_rules.md +3 -1
  18. package/templates/core/scripts/mcp-server/shared/dps-scoring.strategy.ts +3 -2
  19. package/templates/core/scripts/mcp-server/tools/audit.ts +2 -2
  20. package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts +93 -0
  21. package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_status.ts +235 -0
  22. package/templates/core/scripts/mcp-server/tools/gateway/check_dps.ts +555 -0
  23. package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +111 -0
  24. package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +114 -0
  25. package/templates/core/scripts/mcp-server/tools/gateway/helpers.ts +121 -0
  26. package/templates/core/scripts/mcp-server/tools/gateway/index.ts +16 -0
  27. package/templates/core/scripts/mcp-server/tools/gateway.backup +1143 -0
  28. package/templates/core/scripts/mcp-server/tools/index.ts +1 -1
  29. package/templates/core/scripts/mcp-server/tools/plan.ts +11 -3
  30. package/templates/core/skills/session-init/SKILL.md +21 -0
  31. package/templates/core/templates/add-route-template-heavyweight.md +7 -5
  32. package/templates/core/templates/add-route-template.md +3 -1
  33. package/templates/core/templates/add-route-template.schema.json +73 -0
  34. package/templates/core/templates/checklist-template.md +1 -0
  35. package/templates/core/templates/simple-plan-template.md +24 -0
  36. package/templates/core/templates/spec-template.md +54 -11
  37. package/templates/core/templates/spec-template.schema.json +31 -0
  38. package/templates/core/templates/standard-plan-template.md +16 -24
  39. package/templates/core/templates/tasks-template.md +35 -33
  40. package/templates/core/templates/tasks-template.schema.json +44 -0
  41. package/templates/core/agents/add-orchestrator.md +0 -217
  42. 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%
@@ -313,6 +339,7 @@ Tasks (实验性) 双向 ✅ 已实现 长任务持久化
313
339
  | Demo 仓库演示 | 提供完整示例仓库,展示 Policy-Update-Loop 与 Report 体系的端到端闭环实践 |--|
314
340
  | MCP 能力重构 | ✅ v0.2.9 MCP 工具链架构升级,提升审计与门禁工具的可扩展性和独立部署能力 | 2026-07/23/add-coder-mcp-restructure-plan-v1.md |
315
341
  | Hook 通知升级 | ✅ v0.2.9 Hook 拦截事件 jsonl → fs.watch → record_dev_operation 落库 + Notification + 治理信号 | 2026-07/24/add-coder-hook-notify-upgrade-plan-v1.md |
342
+ | ide插件 | 解耦ADD范式代码和被治理项目的代码 |在做了,大家拭目以待吧,让编程更有趣,我的目标其实不在于IDE,我的工作顺手的事情 |
316
343
  | 对话记忆增强 | 长期项目知识记忆和plan级别的稀疏记忆 |--|
317
344
 
318
345
 
@@ -355,16 +382,20 @@ Traditional AI development: Chat → Generate code → Dig through chat history
355
382
  | Auditing relies on developer discipline | The **MCP audit toolchain** automatically records every operation; system gateways enforce checks |
356
383
  | No traceability | Audit events are naturally linked: Plan → Spec → Task → Step → Tool Call, forming a complete evidence chain |
357
384
 
358
- ### ② Caijuehub Rule Engine: From Sync to Three Domains
385
+ ### ② Caijuehub — The Centralized Adjudication Layer: From Sync to Three Domains
359
386
 
360
- Caijuehub is add-coder's first implementation of **TOML declaration → auto-generated strategy → business code consumption**. From the initial sync --patch experiment to today's three-domain coverage spanning HITL and DPS, the evolution proves the extensibility of centralized decision layers. Details: [docs/caijuehub.md](./docs/caijuehub.md).
387
+ Caijuehub is add-coder's first implementation of **TOML declaration → auto-generated strategy → business code consumption**. From the initial sync --patch experiment to today's three-domain coverage spanning HITL and DPS, the evolution proves the extensibility of the centralized adjudication layer. Details: [docs/caijuehub.md](./docs/caijuehub.md).
361
388
 
362
389
  | Domain | Rules File | Consumer | Description |
363
390
  |--------|---------|--------|------|
364
- | sync --patch | `sync-rules.toml` | `sync.ts` | **First centralized decision hot-update in npm history** (eating my own dog food: add-coder manages its own template sync via caijuehub) |
391
+ | sync --patch | `sync-rules.toml` | `sync.ts` | **First centralized adjudication hot-update in npm history** (eating my own dog food: add-coder manages its own template sync via caijuehub) |
365
392
  | HITL Approval | `hitl-interaction-rules.toml` | `hitl.ts` | Per-IDE interaction mode declaration |
366
393
  | 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
394
 
395
+ > 📊 [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.
396
+ >
397
+ > 🧠 [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.
398
+
368
399
  **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
400
 
370
401
  ### ③ Prompt Cache Native — ¥218/mo, 98% Savings
@@ -586,7 +617,8 @@ npx add-coder init
586
617
  ┌────────────┘
587
618
  ▼
588
619
  ┌─────────────────────────────────────┐
589
- │ Caijuehub Rule Engine │
620
+ │ Caijuehub — Centralized │
621
+ │ Adjudication Layer │
590
622
  │ TOML-Driven Policy System │
591
623
  │ Detect / Adapt / Prisma / Write — │
592
624
  │ Fully Configurable │
@@ -625,3 +657,7 @@ npx add-coder init
625
657
  | Memory Enhancement | Long-term project knowledge memory and plan-level sparse memory | 📋 |
626
658
 
627
659
  ---
660
+
661
+ My hometown
662
+
663
+ <img width="720" alt="hometown outside" src="https://github.com/user-attachments/assets/7aad93de-9cea-4194-b09d-cbd892d61cc2" />
package/dist/index.js CHANGED
@@ -305,7 +305,21 @@ var SYNC_PRISMA_CONFIG = {
305
305
  ON_FIELD_CONFLICT: "interactive",
306
306
  ON_MISSING_FIELD: "interactive",
307
307
  ON_EXTRA_FIELD: "ignore",
308
- PROMPT: "add-coder \u6807\u51C6 add.prisma \u4E0E\u6D88\u8D39\u65B9 schema \u5B58\u5728\u5DEE\u5F02\u3002"
308
+ PROMPT: "add-coder \u6807\u51C6 add.prisma \u4E0E\u6D88\u8D39\u65B9 schema \u5B58\u5728\u5DEE\u5F02\u3002",
309
+ POST_SYNC: {
310
+ HEADER: "\u4E0B\u4E00\u6B65\u6309\u4F60\u7684\u573A\u666F\u9009\u62E9\u8FC1\u79FB\u547D\u4EE4:",
311
+ FINAL: "npx prisma generate",
312
+ MANAGED_ACTIONS: [
313
+ { label: "\u5F00\u53D1\u73AF\u5883\uFF08\u751F\u6210\u65B0\u8FC1\u79FB+\u540C\u6B65\u672C\u5730\u5E93\uFF09", cmd: "npx prisma migrate dev" },
314
+ { label: "\u751F\u4EA7/CI\uFF08\u53EA\u5E94\u7528\u5DF2\u6709\u8FC1\u79FB\uFF09", cmd: "npx prisma migrate deploy" },
315
+ { label: "\u4E0D\u786E\u5B9A\uFF1F\u5148\u67E5\u72B6\u6001", cmd: "npx prisma migrate status" }
316
+ ],
317
+ P3005: { hint: "\u82E5\u62A5 P3005\uFF08\u5E93\u6709\u8868\u4F46\u65E0\u8FC1\u79FB\u8BB0\u5F55\uFF09= \u9700\u5148\u57FA\u7EBF\u5316:", cmd: "npx prisma migrate resolve --applied <\u8FC1\u79FB\u540D>\uFF0C\u518D\u6267\u884C deploy" },
318
+ UNMANAGED_ACTIONS: [
319
+ { label: "\u9996\u6B21\u63A5\u5165\u8FC1\u79FB\u7BA1\u7406\uFF08\u7A7A\u5E93\uFF09", cmd: "npx prisma migrate dev --name init" },
320
+ { label: "\u5E93\u5DF2\u6709\u8868\uFF08db push \u5EFA\u8FC7\uFF09", hint: "\u5148\u624B\u52A8\u57FA\u7EBF\u5316\uFF0C\u518D deploy:", steps: ["npx prisma migrate diff --from-empty --to-schema-datamodel <schema\u6587\u4EF6> --script", "\u5C06\u8F93\u51FA\u5199\u5165 prisma/migrations/<\u65F6\u95F4\u6233>_init/migration.sql", "npx prisma migrate resolve --applied <\u65F6\u95F4\u6233>_init"] }
321
+ ]
322
+ }
309
323
  };
310
324
 
311
325
  // src/cli/writer.ts
@@ -1294,6 +1308,28 @@ async function syncCommand(options = {}) {
1294
1308
  console.log(`\u540C\u6B65\u5B8C\u6210: \u65B0\u5EFA ${result.created}, \u8DF3\u8FC7 ${result.skipped}`);
1295
1309
  await checkPrismaDiff(projectRoot, options);
1296
1310
  }
1311
+ function printMigrateGuidance(targetPath, changed) {
1312
+ const g = SYNC_PRISMA_CONFIG.POST_SYNC;
1313
+ const isManaged = existsSync8(resolve6(dirname4(targetPath), "migrations"));
1314
+ const actions = isManaged ? g.MANAGED_ACTIONS : g.UNMANAGED_ACTIONS;
1315
+ console.log(` \u25B6 \u5DF2\u5199\u5165 ${changed} \u5904\u53D8\u66F4\uFF0C${g.HEADER}`);
1316
+ for (const a of actions) {
1317
+ if ("cmd" in a && "label" in a) {
1318
+ const prefix = isManaged ? "\u251C\u2500" : "\u251C\u2500";
1319
+ console.log(` ${prefix} ${a.label}: ${a.cmd}`);
1320
+ } else if ("steps" in a) {
1321
+ const item = a;
1322
+ console.log(` \u2514\u2500 ${item.label}:`);
1323
+ if (item.hint) console.log(` \u26A0\uFE0F ${item.hint}`);
1324
+ for (const s of item.steps) console.log(` ${s}`);
1325
+ }
1326
+ }
1327
+ if (isManaged) {
1328
+ console.log(` \u26A0\uFE0F ${g.P3005.hint}`);
1329
+ console.log(` ${g.P3005.cmd}`);
1330
+ }
1331
+ console.log(` \u26A0\uFE0F \u6240\u6709\u573A\u666F\u6536\u5C3E: ${g.FINAL}`);
1332
+ }
1297
1333
  async function checkPrismaDiff(projectRoot, options) {
1298
1334
  if (!options.patch) return;
1299
1335
  const basePath = resolve6(projectRoot, SYNC_PRISMA_CONFIG.BASE_SCHEMA);
@@ -1311,6 +1347,7 @@ async function checkPrismaDiff(projectRoot, options) {
1311
1347
  return;
1312
1348
  }
1313
1349
  const targetExists = existsSync8(targetPath);
1350
+ let modifiedCount = 0;
1314
1351
  console.log(`
1315
1352
  \u26A0\uFE0F Prisma schema \u5DEE\u5F02\u68C0\u6D4B:`);
1316
1353
  console.log(` \u57FA\u51C6: ${result.baseSchema} (add-coder \u6807\u51C6)`);
@@ -1342,6 +1379,7 @@ async function checkPrismaDiff(projectRoot, options) {
1342
1379
  },
1343
1380
  execute() {
1344
1381
  const n = injectMissingModels(result.targetPath, selected);
1382
+ modifiedCount += n;
1345
1383
  console.log(` \u2705 \u5DF2\u5C06 ${n} \u4E2A\u6A21\u578B/\u679A\u4E3E\u6CE8\u5165 ${result.targetPath}`);
1346
1384
  return Promise.resolve(n);
1347
1385
  }
@@ -1370,6 +1408,7 @@ async function checkPrismaDiff(projectRoot, options) {
1370
1408
  },
1371
1409
  execute() {
1372
1410
  const n = overwriteFieldLines(targetPath, basePath, d.name, d.conflicts);
1411
+ modifiedCount += n;
1373
1412
  console.log(` \u2705 \u5DF2\u8986\u76D6 ${n} \u4E2A\u51B2\u7A81\u5B57\u6BB5`);
1374
1413
  return Promise.resolve(n);
1375
1414
  }
@@ -1390,6 +1429,7 @@ async function checkPrismaDiff(projectRoot, options) {
1390
1429
  },
1391
1430
  execute() {
1392
1431
  const n = injectFieldLines(targetPath, basePath, d.name, d.missingFields);
1432
+ modifiedCount += n;
1393
1433
  console.log(` \u2705 \u5DF2\u8865\u5145 ${n} \u4E2A\u5B57\u6BB5`);
1394
1434
  return Promise.resolve(n);
1395
1435
  }
@@ -1417,7 +1457,11 @@ async function checkPrismaDiff(projectRoot, options) {
1417
1457
  if (targetExists) {
1418
1458
  console.log(`
1419
1459
  ${SYNC_PRISMA_CONFIG.PROMPT}`);
1420
- console.log(` \u25B6 \u8BF7\u8FD0\u884C: npx prisma migrate dev && npx prisma generate`);
1460
+ if (modifiedCount > 0) {
1461
+ printMigrateGuidance(targetPath, modifiedCount);
1462
+ } else {
1463
+ console.log(` \u25B6 \u76EE\u6807 schema \u5DF2\u662F\u6700\u65B0\uFF08\u672A\u9009\u62E9\u4EFB\u4F55\u53D8\u66F4\uFF09\uFF0C\u65E0\u9700\u8FC1\u79FB\u64CD\u4F5C`);
1464
+ }
1421
1465
  } else {
1422
1466
  console.log(`
1423
1467
  \u76EE\u6807 schema \u6587\u4EF6\u4E0D\u5B58\u5728: ${result.targetPath}`);
@@ -1425,7 +1469,9 @@ async function checkPrismaDiff(projectRoot, options) {
1425
1469
  writeFileSync4(targetPath, "// add.prisma \u2014 ADD \u6CBB\u7406\u6A21\u578B\n\n", "utf-8");
1426
1470
  const n = injectMissingModels(targetPath, result.missing);
1427
1471
  console.log(` \u2705 \u5DF2\u521B\u5EFA\u5E76\u6CE8\u5165 ${n} \u4E2A\u6A21\u578B/\u679A\u4E3E`);
1428
- console.log(` \u25B6 \u8BF7\u8FD0\u884C: npx prisma migrate dev && npx prisma generate`);
1472
+ if (n > 0) {
1473
+ printMigrateGuidance(targetPath, n);
1474
+ }
1429
1475
  }
1430
1476
  }
1431
1477
  async function handleDiffAction(action, ctx) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.3.6-feature-hitl-enhance-v1.2",
3
+ "version": "0.3.7",
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,19 +41,20 @@
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",
47
48
  "zod": "^4.4.3"
48
49
  },
49
50
  "peerDependencies": {
50
- "@prisma/adapter-libsql": "^7.0.0",
51
51
  "@prisma/adapter-pg": "^7.0.0",
52
52
  "@prisma/client": "^7.0.0",
53
53
  "dotenv": "*",
54
54
  "prisma": "^7.0.0",
55
55
  "tsx": ">=4",
56
- "vector-cosine-similarity": "^1.8.0"
56
+ "vector-cosine-similarity": "^1.8.0",
57
+ "@xenova/transformers": "^2.17.2"
57
58
  },
58
59
  "peerDependenciesMeta": {
59
60
  "@prisma/client": {
@@ -69,10 +70,10 @@
69
70
  "optional": false
70
71
  },
71
72
  "@prisma/adapter-pg": {
72
- "optional": true
73
+ "optional": false
73
74
  },
74
- "@prisma/adapter-libsql": {
75
- "optional": true
75
+ "@xenova/transformers": {
76
+ "optional": false
76
77
  }
77
78
  },
78
79
  "devDependencies": {
@@ -89,7 +90,9 @@
89
90
  "predev": "npm run db:ensure",
90
91
  "dev": "tsup --watch",
91
92
  "db:ensure": "bash scripts/db-ensure.sh",
92
- "sync": "bash scripts/sync-magic-dirs.sh",
93
+ "sync": "tsx scripts/sync-magic.ts",
94
+ "sync:bash": "bash scripts/benchmark/sync-magic.sh",
95
+ "benchmark": "tsx scripts/benchmark/benchmark-sync.ts",
93
96
  "lint": "eslint src/",
94
97
  "lint:fix": "eslint src/ --fix",
95
98
  "generate": "tsx src/caijuehub/transcribe.ts",
@@ -1,5 +1,5 @@
1
1
  {
2
- "_version": "0.3.6-feature-hitl-enhance-v1.2",
2
+ "_version": "0.3.7",
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": "8f151533",
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": "f54dd009",
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": "e3bf721d",
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": "47dd691c",
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": "32eaa754",
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": "f54dd009",
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": "190ce5cc",
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": "dbb5f75a",
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": "697d422f",
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": "f54dd009",
156
+ "core/hooks/post-tool-use.sh": "27123aee",
158
157
  "core/hooks/pre-compact.sh": "6164c007",
159
- "core/hooks/pre-tool-use.sh": "8642d052",
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": "eb397d48",
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": "76272603",
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": "ed889421",
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": "47ea912f",
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": "5d178f61",
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": "4735daf0",
214
- "core/scripts/mcp-server/tools/plan.ts": "bf146dca",
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": "0fbdc5cd",
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": "8b1eb7c2",
227
- "core/templates/add-route-template.md": "670f9ebe",
228
- "core/templates/add-route-template.schema.json": "c29a8f65",
229
- "core/templates/checklist-template.md": "f904e049",
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": "0bb1ebbe",
261
+ "core/templates/simple-plan-template.md": "db5c247f",
256
262
  "core/templates/simple-plan-template.schema.json": "99d53cc1",
257
- "core/templates/spec-template.md": "3fe8f818",
258
- "core/templates/spec-template.schema.json": "b13b3de8",
259
- "core/templates/standard-plan-template.md": "44d30a4e",
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": "3a0f318d",
262
- "core/templates/tasks-template.schema.json": "c046de41",
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