add-coder 0.3.33 → 0.3.34

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 (71) hide show
  1. package/package.json +1 -1
  2. package/templates/.add-coder-src-hash.json +70 -70
  3. package/templates/adapters/claude/hooks/doc-format-guard.mjs +4 -0
  4. package/templates/adapters/claude/hooks/notification.mjs +4 -0
  5. package/templates/adapters/claude/hooks/permission-denied.mjs +4 -0
  6. package/templates/adapters/claude/hooks/permission-gate.mjs +4 -0
  7. package/templates/adapters/claude/hooks/post-tool-use.mjs +4 -0
  8. package/templates/adapters/claude/hooks/pre-compact.mjs +4 -0
  9. package/templates/adapters/claude/hooks/pre-tool-use.mjs +4 -0
  10. package/templates/adapters/claude/hooks/prompt-submit.mjs +4 -0
  11. package/templates/adapters/claude/hooks/session-end.mjs +4 -0
  12. package/templates/adapters/claude/hooks/session-start.mjs +4 -0
  13. package/templates/adapters/claude/hooks/stop-check.mjs +87 -6
  14. package/templates/adapters/claude/hooks/stop-failure.mjs +4 -0
  15. package/templates/adapters/claude/hooks/subagent-guard.mjs +4 -0
  16. package/templates/adapters/claude/hooks/subagent-stop.mjs +4 -0
  17. package/templates/adapters/codex/hooks/doc-format-guard.mjs +4 -0
  18. package/templates/adapters/codex/hooks/notification.mjs +4 -0
  19. package/templates/adapters/codex/hooks/permission-gate.mjs +4 -0
  20. package/templates/adapters/codex/hooks/post-tool-failure.mjs +4 -0
  21. package/templates/adapters/codex/hooks/post-tool-use.mjs +4 -0
  22. package/templates/adapters/codex/hooks/pre-compact.mjs +4 -0
  23. package/templates/adapters/codex/hooks/pre-tool-use.mjs +4 -0
  24. package/templates/adapters/codex/hooks/prompt-submit.mjs +4 -0
  25. package/templates/adapters/codex/hooks/session-end.mjs +4 -0
  26. package/templates/adapters/codex/hooks/session-start.mjs +4 -0
  27. package/templates/adapters/codex/hooks/stop-check.mjs +87 -6
  28. package/templates/adapters/codex/hooks/subagent-guard.mjs +4 -0
  29. package/templates/adapters/codex/hooks/subagent-stop.mjs +4 -0
  30. package/templates/adapters/qoder/hooks/doc-format-guard.mjs +4 -0
  31. package/templates/adapters/qoder/hooks/notification.mjs +4 -0
  32. package/templates/adapters/qoder/hooks/permission-gate.mjs +4 -0
  33. package/templates/adapters/qoder/hooks/post-tool-failure.mjs +4 -0
  34. package/templates/adapters/qoder/hooks/post-tool-use.mjs +4 -0
  35. package/templates/adapters/qoder/hooks/pre-compact.mjs +4 -0
  36. package/templates/adapters/qoder/hooks/pre-tool-use.mjs +4 -0
  37. package/templates/adapters/qoder/hooks/prompt-submit.mjs +4 -0
  38. package/templates/adapters/qoder/hooks/review-checklist.mjs +4 -0
  39. package/templates/adapters/qoder/hooks/session-end.mjs +4 -0
  40. package/templates/adapters/qoder/hooks/session-start.mjs +4 -0
  41. package/templates/adapters/qoder/hooks/stop-check.mjs +87 -6
  42. package/templates/adapters/qoder/hooks/subagent-guard.mjs +4 -0
  43. package/templates/adapters/qoder/hooks/subagent-stop.mjs +4 -0
  44. package/templates/adapters/trae/hooks/doc-format-guard.mjs +4 -0
  45. package/templates/adapters/trae/hooks/notification.mjs +4 -0
  46. package/templates/adapters/trae/hooks/permission-gate.mjs +4 -0
  47. package/templates/adapters/trae/hooks/post-tool-failure.mjs +4 -0
  48. package/templates/adapters/trae/hooks/post-tool-use.mjs +4 -0
  49. package/templates/adapters/trae/hooks/pre-compact.mjs +4 -0
  50. package/templates/adapters/trae/hooks/pre-tool-use.mjs +4 -0
  51. package/templates/adapters/trae/hooks/prompt-submit.mjs +4 -0
  52. package/templates/adapters/trae/hooks/session-end.mjs +4 -0
  53. package/templates/adapters/trae/hooks/session-start.mjs +4 -0
  54. package/templates/adapters/trae/hooks/stop-check.mjs +87 -6
  55. package/templates/adapters/trae/hooks/subagent-guard.mjs +4 -0
  56. package/templates/adapters/trae/hooks/subagent-stop.mjs +4 -0
  57. package/templates/adapters/vscode/hooks/doc-format-guard.mjs +4 -0
  58. package/templates/adapters/vscode/hooks/notification.mjs +4 -0
  59. package/templates/adapters/vscode/hooks/permission-gate.mjs +4 -0
  60. package/templates/adapters/vscode/hooks/post-tool-failure.mjs +4 -0
  61. package/templates/adapters/vscode/hooks/post-tool-use.mjs +4 -0
  62. package/templates/adapters/vscode/hooks/pre-compact.mjs +4 -0
  63. package/templates/adapters/vscode/hooks/pre-tool-use.mjs +4 -0
  64. package/templates/adapters/vscode/hooks/prompt-submit.mjs +4 -0
  65. package/templates/adapters/vscode/hooks/session-end.mjs +4 -0
  66. package/templates/adapters/vscode/hooks/session-start.mjs +4 -0
  67. package/templates/adapters/vscode/hooks/stop-check.mjs +87 -6
  68. package/templates/adapters/vscode/hooks/subagent-guard.mjs +4 -0
  69. package/templates/adapters/vscode/hooks/subagent-stop.mjs +4 -0
  70. package/templates/core/governance/rules.ts +4 -0
  71. package/templates/core/governance/stop-router.ts +101 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.3.33",
3
+ "version": "0.3.34",
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": {
@@ -1,132 +1,132 @@
1
1
  {
2
- "_version": "0.3.33",
3
- "adapters/claude/hooks/doc-format-guard.mjs": "02fb1ed6",
2
+ "_version": "0.3.34",
3
+ "adapters/claude/hooks/doc-format-guard.mjs": "eff9d727",
4
4
  "adapters/claude/hooks/doc-format-guard.ts": "2abf8013",
5
5
  "adapters/claude/hooks/lib/claude-env.ts": "170b40ca",
6
- "adapters/claude/hooks/notification.mjs": "5921b914",
6
+ "adapters/claude/hooks/notification.mjs": "7c532eef",
7
7
  "adapters/claude/hooks/notification.ts": "f14ca7b6",
8
- "adapters/claude/hooks/permission-denied.mjs": "036b70d1",
8
+ "adapters/claude/hooks/permission-denied.mjs": "045481ba",
9
9
  "adapters/claude/hooks/permission-denied.ts": "8d773db9",
10
- "adapters/claude/hooks/permission-gate.mjs": "043851c3",
10
+ "adapters/claude/hooks/permission-gate.mjs": "896f4246",
11
11
  "adapters/claude/hooks/permission-gate.ts": "858f2dc6",
12
12
  "adapters/claude/hooks/post-tool-failure.mjs": "c1490184",
13
13
  "adapters/claude/hooks/post-tool-failure.ts": "8c53fdd4",
14
- "adapters/claude/hooks/post-tool-use.mjs": "c60eef27",
14
+ "adapters/claude/hooks/post-tool-use.mjs": "83d05985",
15
15
  "adapters/claude/hooks/post-tool-use.ts": "54c1840a",
16
- "adapters/claude/hooks/pre-compact.mjs": "83ae92d3",
16
+ "adapters/claude/hooks/pre-compact.mjs": "3eb17466",
17
17
  "adapters/claude/hooks/pre-compact.ts": "fdb49e54",
18
- "adapters/claude/hooks/pre-tool-use.mjs": "7c22b2d3",
18
+ "adapters/claude/hooks/pre-tool-use.mjs": "9301fbd9",
19
19
  "adapters/claude/hooks/pre-tool-use.ts": "c47cc5d5",
20
- "adapters/claude/hooks/prompt-submit.mjs": "ba18ef0f",
20
+ "adapters/claude/hooks/prompt-submit.mjs": "89895adb",
21
21
  "adapters/claude/hooks/prompt-submit.ts": "c3847e2a",
22
22
  "adapters/claude/hooks/review-checklist.mjs": "421384d5",
23
23
  "adapters/claude/hooks/review-checklist.ts": "94695330",
24
- "adapters/claude/hooks/session-end.mjs": "c0f71fd6",
24
+ "adapters/claude/hooks/session-end.mjs": "1cf8ea80",
25
25
  "adapters/claude/hooks/session-end.ts": "3c963eae",
26
- "adapters/claude/hooks/session-start.mjs": "897cc04a",
26
+ "adapters/claude/hooks/session-start.mjs": "9a526492",
27
27
  "adapters/claude/hooks/session-start.ts": "3f762d49",
28
- "adapters/claude/hooks/stop-check.mjs": "17d16a1d",
28
+ "adapters/claude/hooks/stop-check.mjs": "ad933373",
29
29
  "adapters/claude/hooks/stop-check.ts": "967fd318",
30
- "adapters/claude/hooks/stop-failure.mjs": "c7f522f2",
30
+ "adapters/claude/hooks/stop-failure.mjs": "57490bd2",
31
31
  "adapters/claude/hooks/stop-failure.ts": "b132759b",
32
- "adapters/claude/hooks/subagent-guard.mjs": "25202f15",
32
+ "adapters/claude/hooks/subagent-guard.mjs": "c7cd145e",
33
33
  "adapters/claude/hooks/subagent-guard.ts": "f33fc276",
34
- "adapters/claude/hooks/subagent-stop.mjs": "071d2daf",
34
+ "adapters/claude/hooks/subagent-stop.mjs": "3b05ecc7",
35
35
  "adapters/claude/hooks/subagent-stop.ts": "b016ebdf",
36
36
  "adapters/claude/mcp.json": "4ddc5120",
37
37
  "adapters/claude/settings.json": "9cf9603a",
38
38
  "adapters/codex/config.toml.example": "62c03d71",
39
- "adapters/codex/hooks/doc-format-guard.mjs": "ef1e8ac3",
39
+ "adapters/codex/hooks/doc-format-guard.mjs": "d68873ab",
40
40
  "adapters/codex/hooks/doc-format-guard.ts": "566b835f",
41
- "adapters/codex/hooks/notification.mjs": "9357c801",
41
+ "adapters/codex/hooks/notification.mjs": "bf95cd4c",
42
42
  "adapters/codex/hooks/notification.ts": "a4fd2749",
43
- "adapters/codex/hooks/permission-gate.mjs": "1a08ea4b",
43
+ "adapters/codex/hooks/permission-gate.mjs": "963774f7",
44
44
  "adapters/codex/hooks/permission-gate.ts": "15af671c",
45
- "adapters/codex/hooks/post-tool-failure.mjs": "7f49d8dd",
45
+ "adapters/codex/hooks/post-tool-failure.mjs": "a8e100b4",
46
46
  "adapters/codex/hooks/post-tool-failure.ts": "bddd1f4e",
47
- "adapters/codex/hooks/post-tool-use.mjs": "1bfa590d",
47
+ "adapters/codex/hooks/post-tool-use.mjs": "b73c1201",
48
48
  "adapters/codex/hooks/post-tool-use.ts": "a7a2fc6c",
49
- "adapters/codex/hooks/pre-compact.mjs": "658c8602",
49
+ "adapters/codex/hooks/pre-compact.mjs": "2c16761f",
50
50
  "adapters/codex/hooks/pre-compact.ts": "c0671f9b",
51
- "adapters/codex/hooks/pre-tool-use.mjs": "265f2a75",
51
+ "adapters/codex/hooks/pre-tool-use.mjs": "d7499d78",
52
52
  "adapters/codex/hooks/pre-tool-use.ts": "3750e60b",
53
- "adapters/codex/hooks/prompt-submit.mjs": "9bbf386d",
53
+ "adapters/codex/hooks/prompt-submit.mjs": "e2df7fbc",
54
54
  "adapters/codex/hooks/prompt-submit.ts": "625cdc5e",
55
55
  "adapters/codex/hooks/review-checklist.mjs": "f20c9bd7",
56
56
  "adapters/codex/hooks/review-checklist.ts": "9a664173",
57
- "adapters/codex/hooks/session-end.mjs": "f6518223",
57
+ "adapters/codex/hooks/session-end.mjs": "e876065c",
58
58
  "adapters/codex/hooks/session-end.ts": "7fcb6f86",
59
- "adapters/codex/hooks/session-start.mjs": "32d714e4",
59
+ "adapters/codex/hooks/session-start.mjs": "e528f769",
60
60
  "adapters/codex/hooks/session-start.ts": "4eacd44f",
61
- "adapters/codex/hooks/stop-check.mjs": "5ed61a37",
61
+ "adapters/codex/hooks/stop-check.mjs": "c8866935",
62
62
  "adapters/codex/hooks/stop-check.ts": "ee1801dd",
63
- "adapters/codex/hooks/subagent-guard.mjs": "ac2903c6",
63
+ "adapters/codex/hooks/subagent-guard.mjs": "187a94f7",
64
64
  "adapters/codex/hooks/subagent-guard.ts": "e5ccf88b",
65
- "adapters/codex/hooks/subagent-stop.mjs": "8146f2fe",
65
+ "adapters/codex/hooks/subagent-stop.mjs": "5fdffadf",
66
66
  "adapters/codex/hooks/subagent-stop.ts": "a27e6a9e",
67
67
  "adapters/codex/hooks.json": "3c78fb72",
68
68
  "adapters/codex/settings.json": "44136fa3",
69
- "adapters/qoder/hooks/doc-format-guard.mjs": "a357dcfa",
69
+ "adapters/qoder/hooks/doc-format-guard.mjs": "aface90b",
70
70
  "adapters/qoder/hooks/doc-format-guard.ts": "12e360db",
71
71
  "adapters/qoder/hooks/lib/context-inject.ts": "aaee941a",
72
72
  "adapters/qoder/hooks/lib/qoder-env.ts": "ec8c3243",
73
73
  "adapters/qoder/hooks/lib/review-checklist.ts": "23a06b37",
74
- "adapters/qoder/hooks/notification.mjs": "7e7c0a40",
74
+ "adapters/qoder/hooks/notification.mjs": "422ada5f",
75
75
  "adapters/qoder/hooks/notification.ts": "01a25a5b",
76
- "adapters/qoder/hooks/permission-gate.mjs": "b1516649",
76
+ "adapters/qoder/hooks/permission-gate.mjs": "e407b3d9",
77
77
  "adapters/qoder/hooks/permission-gate.ts": "8478e48e",
78
- "adapters/qoder/hooks/post-tool-failure.mjs": "41c2e733",
78
+ "adapters/qoder/hooks/post-tool-failure.mjs": "e8b486b6",
79
79
  "adapters/qoder/hooks/post-tool-failure.ts": "b9439d5c",
80
- "adapters/qoder/hooks/post-tool-use.mjs": "cb3d31c1",
80
+ "adapters/qoder/hooks/post-tool-use.mjs": "2af854fd",
81
81
  "adapters/qoder/hooks/post-tool-use.ts": "c7e9ce26",
82
- "adapters/qoder/hooks/pre-compact.mjs": "c185b105",
82
+ "adapters/qoder/hooks/pre-compact.mjs": "3f8a1fa7",
83
83
  "adapters/qoder/hooks/pre-compact.ts": "70a8e8f8",
84
- "adapters/qoder/hooks/pre-tool-use.mjs": "14721c44",
84
+ "adapters/qoder/hooks/pre-tool-use.mjs": "ab662bcf",
85
85
  "adapters/qoder/hooks/pre-tool-use.ts": "2f0cab18",
86
- "adapters/qoder/hooks/prompt-submit.mjs": "d42ecfac",
86
+ "adapters/qoder/hooks/prompt-submit.mjs": "c9eee559",
87
87
  "adapters/qoder/hooks/prompt-submit.ts": "9050e0cb",
88
- "adapters/qoder/hooks/review-checklist.mjs": "ced90c89",
88
+ "adapters/qoder/hooks/review-checklist.mjs": "04b300e4",
89
89
  "adapters/qoder/hooks/review-checklist.ts": "cf4ac191",
90
- "adapters/qoder/hooks/session-end.mjs": "69c0400b",
90
+ "adapters/qoder/hooks/session-end.mjs": "eee2e434",
91
91
  "adapters/qoder/hooks/session-end.ts": "e9bf7cd4",
92
- "adapters/qoder/hooks/session-start.mjs": "f19c83f6",
92
+ "adapters/qoder/hooks/session-start.mjs": "21b88d24",
93
93
  "adapters/qoder/hooks/session-start.ts": "eeb089e0",
94
- "adapters/qoder/hooks/stop-check.mjs": "d47fa96c",
94
+ "adapters/qoder/hooks/stop-check.mjs": "b010c028",
95
95
  "adapters/qoder/hooks/stop-check.ts": "53447287",
96
- "adapters/qoder/hooks/subagent-guard.mjs": "e8d356fd",
96
+ "adapters/qoder/hooks/subagent-guard.mjs": "ee1a1732",
97
97
  "adapters/qoder/hooks/subagent-guard.ts": "0c10171b",
98
- "adapters/qoder/hooks/subagent-stop.mjs": "100a1df7",
98
+ "adapters/qoder/hooks/subagent-stop.mjs": "8fe4dbd0",
99
99
  "adapters/qoder/hooks/subagent-stop.ts": "b41e08af",
100
100
  "adapters/qoder/mcp.json": "b2075957",
101
101
  "adapters/qoder/settings.json": "31799ee7",
102
102
  "adapters/qoder/sync-policy.json": "9cb6ff90",
103
- "adapters/trae/hooks/doc-format-guard.mjs": "98204517",
103
+ "adapters/trae/hooks/doc-format-guard.mjs": "f1cb0b3b",
104
104
  "adapters/trae/hooks/doc-format-guard.ts": "14968f12",
105
- "adapters/trae/hooks/notification.mjs": "0c2c2078",
105
+ "adapters/trae/hooks/notification.mjs": "495c8c2d",
106
106
  "adapters/trae/hooks/notification.ts": "f0b4b606",
107
- "adapters/trae/hooks/permission-gate.mjs": "fdf2a9ce",
107
+ "adapters/trae/hooks/permission-gate.mjs": "fd7e284b",
108
108
  "adapters/trae/hooks/permission-gate.ts": "c53aedc7",
109
- "adapters/trae/hooks/post-tool-failure.mjs": "e5eef9fc",
109
+ "adapters/trae/hooks/post-tool-failure.mjs": "834b0545",
110
110
  "adapters/trae/hooks/post-tool-failure.ts": "4cd97dac",
111
- "adapters/trae/hooks/post-tool-use.mjs": "56f8aca2",
111
+ "adapters/trae/hooks/post-tool-use.mjs": "631d84c8",
112
112
  "adapters/trae/hooks/post-tool-use.ts": "7b1e2f4f",
113
- "adapters/trae/hooks/pre-compact.mjs": "cd8a8bd8",
113
+ "adapters/trae/hooks/pre-compact.mjs": "6c0c3e68",
114
114
  "adapters/trae/hooks/pre-compact.ts": "5de3b0fe",
115
- "adapters/trae/hooks/pre-tool-use.mjs": "1d5849ea",
115
+ "adapters/trae/hooks/pre-tool-use.mjs": "8075f74e",
116
116
  "adapters/trae/hooks/pre-tool-use.ts": "a7486c97",
117
- "adapters/trae/hooks/prompt-submit.mjs": "cdb47fbb",
117
+ "adapters/trae/hooks/prompt-submit.mjs": "9e47de7e",
118
118
  "adapters/trae/hooks/prompt-submit.ts": "95ebd771",
119
119
  "adapters/trae/hooks/review-checklist.mjs": "491dd85e",
120
120
  "adapters/trae/hooks/review-checklist.ts": "343bd699",
121
- "adapters/trae/hooks/session-end.mjs": "bdf745f3",
121
+ "adapters/trae/hooks/session-end.mjs": "5d68ad3f",
122
122
  "adapters/trae/hooks/session-end.ts": "64ce383f",
123
- "adapters/trae/hooks/session-start.mjs": "73af1ef0",
123
+ "adapters/trae/hooks/session-start.mjs": "d582fe06",
124
124
  "adapters/trae/hooks/session-start.ts": "d6b4fdc7",
125
- "adapters/trae/hooks/stop-check.mjs": "b390da8e",
125
+ "adapters/trae/hooks/stop-check.mjs": "a4335a46",
126
126
  "adapters/trae/hooks/stop-check.ts": "b33ad5e4",
127
- "adapters/trae/hooks/subagent-guard.mjs": "7420cf93",
127
+ "adapters/trae/hooks/subagent-guard.mjs": "20f1d490",
128
128
  "adapters/trae/hooks/subagent-guard.ts": "eab8cbd9",
129
- "adapters/trae/hooks/subagent-stop.mjs": "1e6b9847",
129
+ "adapters/trae/hooks/subagent-stop.mjs": "5db57f6e",
130
130
  "adapters/trae/hooks/subagent-stop.ts": "5a9d53bb",
131
131
  "adapters/trae/hooks.json": "e9d9eae7",
132
132
  "adapters/trae/settings.json": "ca3d163b",
@@ -141,33 +141,33 @@
141
141
  "adapters/vscode/.github/hooks/subagent-stop.json": "47dbdd8d",
142
142
  "adapters/vscode/.github/hooks/user-prompt-submit.json": "3a608d62",
143
143
  "adapters/vscode/extensions.json": "0f4024c1",
144
- "adapters/vscode/hooks/doc-format-guard.mjs": "24113144",
144
+ "adapters/vscode/hooks/doc-format-guard.mjs": "f8882228",
145
145
  "adapters/vscode/hooks/doc-format-guard.ts": "38e71c50",
146
- "adapters/vscode/hooks/notification.mjs": "11f4c51c",
146
+ "adapters/vscode/hooks/notification.mjs": "96883766",
147
147
  "adapters/vscode/hooks/notification.ts": "5eed547d",
148
- "adapters/vscode/hooks/permission-gate.mjs": "02758d03",
148
+ "adapters/vscode/hooks/permission-gate.mjs": "2b839bef",
149
149
  "adapters/vscode/hooks/permission-gate.ts": "ad096bc1",
150
- "adapters/vscode/hooks/post-tool-failure.mjs": "eb629fe3",
150
+ "adapters/vscode/hooks/post-tool-failure.mjs": "14faa5a1",
151
151
  "adapters/vscode/hooks/post-tool-failure.ts": "f7bc81b3",
152
- "adapters/vscode/hooks/post-tool-use.mjs": "90444411",
152
+ "adapters/vscode/hooks/post-tool-use.mjs": "03cfdbee",
153
153
  "adapters/vscode/hooks/post-tool-use.ts": "42146851",
154
- "adapters/vscode/hooks/pre-compact.mjs": "50a50099",
154
+ "adapters/vscode/hooks/pre-compact.mjs": "494dfd18",
155
155
  "adapters/vscode/hooks/pre-compact.ts": "15e4a043",
156
- "adapters/vscode/hooks/pre-tool-use.mjs": "ab9081f7",
156
+ "adapters/vscode/hooks/pre-tool-use.mjs": "4887a38f",
157
157
  "adapters/vscode/hooks/pre-tool-use.ts": "8e8e588d",
158
- "adapters/vscode/hooks/prompt-submit.mjs": "27b1a944",
158
+ "adapters/vscode/hooks/prompt-submit.mjs": "4cbc9d27",
159
159
  "adapters/vscode/hooks/prompt-submit.ts": "767b13d2",
160
160
  "adapters/vscode/hooks/review-checklist.mjs": "6061e7fb",
161
161
  "adapters/vscode/hooks/review-checklist.ts": "f5fb4557",
162
- "adapters/vscode/hooks/session-end.mjs": "4b3f7a5d",
162
+ "adapters/vscode/hooks/session-end.mjs": "dc805cd7",
163
163
  "adapters/vscode/hooks/session-end.ts": "acdd9f42",
164
- "adapters/vscode/hooks/session-start.mjs": "8b8a4591",
164
+ "adapters/vscode/hooks/session-start.mjs": "a803d6e5",
165
165
  "adapters/vscode/hooks/session-start.ts": "54b262b0",
166
- "adapters/vscode/hooks/stop-check.mjs": "42b5f912",
166
+ "adapters/vscode/hooks/stop-check.mjs": "b7d81215",
167
167
  "adapters/vscode/hooks/stop-check.ts": "7a69b075",
168
- "adapters/vscode/hooks/subagent-guard.mjs": "edc09c3e",
168
+ "adapters/vscode/hooks/subagent-guard.mjs": "3b6b6905",
169
169
  "adapters/vscode/hooks/subagent-guard.ts": "773dc2c8",
170
- "adapters/vscode/hooks/subagent-stop.mjs": "ed0a731b",
170
+ "adapters/vscode/hooks/subagent-stop.mjs": "126adc68",
171
171
  "adapters/vscode/hooks/subagent-stop.ts": "a614b97d",
172
172
  "adapters/vscode/launch.json": "f2b79855",
173
173
  "adapters/vscode/settings.json": "7cabd00e",
@@ -192,11 +192,11 @@
192
192
  "core/governance/preload-templates.ts": "cfd6d3ca",
193
193
  "core/governance/prompt-router.ts": "15ca2987",
194
194
  "core/governance/review-checklist-guard.ts": "b24568b1",
195
- "core/governance/rules.ts": "ffd7b843",
195
+ "core/governance/rules.ts": "e6b261b7",
196
196
  "core/governance/session-end.ts": "108fc3f6",
197
197
  "core/governance/session-start-guard.ts": "96666e11",
198
198
  "core/governance/state-detect.ts": "55afc935",
199
- "core/governance/stop-router.ts": "b59fb651",
199
+ "core/governance/stop-router.ts": "af93ae1c",
200
200
  "core/governance/subagent-guard-router.ts": "398fb80e",
201
201
  "core/governance/subagent-stop-router.ts": "f331f59f",
202
202
  "core/governance/subagent-stop.ts": "56101604",
@@ -388,6 +388,10 @@ var protocol = {
388
388
  ".trae",
389
389
  ".codex"
390
390
  ]
391
+ },
392
+ "stop": {
393
+ "max_prompt_per_context": 3,
394
+ "window_minutes": 30
391
395
  }
392
396
  };
393
397
 
@@ -116,6 +116,10 @@ var protocol = {
116
116
  ".trae",
117
117
  ".codex"
118
118
  ]
119
+ },
120
+ "stop": {
121
+ "max_prompt_per_context": 3,
122
+ "window_minutes": 30
119
123
  }
120
124
  };
121
125
 
@@ -114,6 +114,10 @@ var protocol = {
114
114
  ".trae",
115
115
  ".codex"
116
116
  ]
117
+ },
118
+ "stop": {
119
+ "max_prompt_per_context": 3,
120
+ "window_minutes": 30
117
121
  }
118
122
  };
119
123
 
@@ -114,6 +114,10 @@ var protocol = {
114
114
  ".trae",
115
115
  ".codex"
116
116
  ]
117
+ },
118
+ "stop": {
119
+ "max_prompt_per_context": 3,
120
+ "window_minutes": 30
117
121
  }
118
122
  };
119
123
 
@@ -142,6 +142,10 @@ var protocol = {
142
142
  ".trae",
143
143
  ".codex"
144
144
  ]
145
+ },
146
+ "stop": {
147
+ "max_prompt_per_context": 3,
148
+ "window_minutes": 30
145
149
  }
146
150
  };
147
151
 
@@ -119,6 +119,10 @@ var protocol = {
119
119
  ".trae",
120
120
  ".codex"
121
121
  ]
122
+ },
123
+ "stop": {
124
+ "max_prompt_per_context": 3,
125
+ "window_minutes": 30
122
126
  }
123
127
  };
124
128
 
@@ -400,6 +400,10 @@ var protocol = {
400
400
  ".trae",
401
401
  ".codex"
402
402
  ]
403
+ },
404
+ "stop": {
405
+ "max_prompt_per_context": 3,
406
+ "window_minutes": 30
403
407
  }
404
408
  };
405
409
 
@@ -145,6 +145,10 @@ var protocol = {
145
145
  ".trae",
146
146
  ".codex"
147
147
  ]
148
+ },
149
+ "stop": {
150
+ "max_prompt_per_context": 3,
151
+ "window_minutes": 30
148
152
  }
149
153
  };
150
154
 
@@ -119,6 +119,10 @@ var protocol = {
119
119
  ".trae",
120
120
  ".codex"
121
121
  ]
122
+ },
123
+ "stop": {
124
+ "max_prompt_per_context": 3,
125
+ "window_minutes": 30
122
126
  }
123
127
  };
124
128
 
@@ -121,6 +121,10 @@ var protocol = {
121
121
  ".trae",
122
122
  ".codex"
123
123
  ]
124
+ },
125
+ "stop": {
126
+ "max_prompt_per_context": 3,
127
+ "window_minutes": 30
124
128
  }
125
129
  };
126
130
 
@@ -192,6 +192,10 @@ var protocol = {
192
192
  ".trae",
193
193
  ".codex"
194
194
  ]
195
+ },
196
+ "stop": {
197
+ "max_prompt_per_context": 3,
198
+ "window_minutes": 30
195
199
  }
196
200
  };
197
201
 
@@ -402,6 +406,10 @@ function buildStopContext(quadrant, info) {
402
406
  }
403
407
 
404
408
  // templates/core/governance/stop-router.ts
409
+ import { createHash as createHash2 } from "node:crypto";
410
+ import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "node:fs";
411
+ import { tmpdir } from "node:os";
412
+ import { join as join2 } from "node:path";
405
413
  var StopRouter = class {
406
414
  /** 主路由:返回 exit code(0 放行 / 2 阻断) */
407
415
  run() {
@@ -430,14 +438,20 @@ var StopRouter = class {
430
438
  }
431
439
  // ─────────────────────────── 扩展点 ───────────────────────────
432
440
  /**
433
- * Q4 验收决策(双维度组合——2026-08-14 Task 9.4.4④ 上提,回流: I2):
434
- * 维度 1(前置): DB 任务进度(step = done/total,数值且 done<total 未完成阻断提示)
435
- * 维度 2: checklist 质量(checkAddCompleteness 未闭环阻断)
436
- * 互补非替代——codex DB 进度分流语义上提 core,core checklist 质量语义保留。
437
- */
441
+ * Q4 验收决策(双维度组合——2026-08-14 Task 9.4.4④ 上提,回流: I2):
442
+ * 维度 0(新增,临时方案): 弹框频控——同项目同 Plan 窗口内达上限降级放行
443
+ * 维度 1(前置): DB 任务进度(step = done/total,数值且 done<total 未完成阻断提示)
444
+ * 维度 2: checklist 质量(checkAddCompleteness 未闭环 阻断)
445
+ * 互补非替代——codex 原 DB 进度分流语义上提 core,core checklist 质量语义保留。
446
+ */
438
447
  q4Check(plan, rounds, step, handoff, addRoute) {
439
- void plan;
440
448
  void rounds;
449
+ const limited = this.stopPromptLimited(plan);
450
+ if (limited) {
451
+ process.stderr.write(`[ADD Stop] \u5DF2\u8FBE\u672C Plan \u5F39\u6846\u4E0A\u9650(${this.stopPromptMax()})\uFF0C\u672C\u6B21\u653E\u884C\u3002\u8BF7\u5728\u540E\u7EED\u5B9E\u65BD\u4E2D\u5B8C\u6210\u9A8C\u6536\u95ED\u73AF\uFF08devlog + handoff\uFF09\u540E\u505C\u6B62\u3002
452
+ `);
453
+ return 0;
454
+ }
441
455
  const [donePart, totalPart] = step.split("/");
442
456
  if (/^\d+$/.test(donePart) && /^\d+$/.test(totalPart) && Number(donePart) < Number(totalPart)) {
443
457
  return this.emitQ4Unclosed(
@@ -454,6 +468,73 @@ var StopRouter = class {
454
468
  clearDevAction();
455
469
  return this.emitQ4Pass();
456
470
  }
471
+ // ── 弹框频控(临时方案,规则真源: hook-protocol-rules.toml [protocol.stop])──
472
+ // 计数隔离: 文件级 = PROJECT_DIR md5(跨项目不互扰);key 级 = planName(同项目跨 Plan 不互扰)
473
+ // 故障降级: 哨兵读/写异常 → fail-open 放行(不阻塞主流程)
474
+ /** 哨兵记录:同一项目同一 Plan 的弹框计数 */
475
+ stopPromptMax() {
476
+ const cfg = protocol.stop;
477
+ return cfg?.max_prompt_per_context ?? 3;
478
+ }
479
+ /** 哨兵窗口(毫秒) */
480
+ stopPromptWindowMs() {
481
+ const cfg = protocol.stop;
482
+ return (cfg?.window_minutes ?? 30) * 6e4;
483
+ }
484
+ /** 哨兵文件路径(项目隔离:PROJECT_DIR md5) */
485
+ stopSentinelPath() {
486
+ const projectDir = process.env.PROJECT_DIR || process.env.QODER_PROJECT_DIR || process.env.QODERCN_PROJECT_DIR || process.env.CLAUDE_PROJECT_DIR || process.cwd();
487
+ const md5 = createHash2("md5").update(projectDir).digest("hex").slice(0, 8);
488
+ return join2(tmpdir(), `add_stop_${md5}.json`);
489
+ }
490
+ /** 写哨兵(失败静默,fail-open) */
491
+ writeStopPromptSentinel(data) {
492
+ try {
493
+ writeFileSync2(this.stopSentinelPath(), JSON.stringify(data), "utf-8");
494
+ } catch {
495
+ }
496
+ }
497
+ /**
498
+ * 频控判定:返回 true = 已达上限应放行(不弹框)
499
+ * 生成态缺失 protocol.stop(TOML 未同步)→ 跳过频控保持既有行为(生成链幂等校验兜底)
500
+ */
501
+ stopPromptLimited(plan) {
502
+ try {
503
+ const stopCfg = protocol.stop;
504
+ if (!stopCfg) return false;
505
+ const max = this.stopPromptMax();
506
+ const windowMs = this.stopPromptWindowMs();
507
+ const path3 = this.stopSentinelPath();
508
+ let data = {};
509
+ if (existsSync2(path3)) {
510
+ try {
511
+ data = JSON.parse(readFileSync2(path3, "utf-8")) ?? {};
512
+ } catch {
513
+ return true;
514
+ }
515
+ }
516
+ const now = Date.now();
517
+ const entry = data[plan];
518
+ if (!entry) {
519
+ data[plan] = { count: 1, lastPromptAt: now };
520
+ this.writeStopPromptSentinel(data);
521
+ return false;
522
+ }
523
+ if (now - entry.lastPromptAt > windowMs) {
524
+ data[plan] = { count: 1, lastPromptAt: now };
525
+ this.writeStopPromptSentinel(data);
526
+ return false;
527
+ }
528
+ if (entry.count >= max) {
529
+ return true;
530
+ }
531
+ data[plan] = { count: entry.count + 1, lastPromptAt: now };
532
+ this.writeStopPromptSentinel(data);
533
+ return false;
534
+ } catch {
535
+ return true;
536
+ }
537
+ }
457
538
  /** Q0: DB 不可用(core: stderr + 2) */
458
539
  emitQ0(reason) {
459
540
  process.stderr.write(
@@ -119,6 +119,10 @@ var protocol = {
119
119
  ".trae",
120
120
  ".codex"
121
121
  ]
122
+ },
123
+ "stop": {
124
+ "max_prompt_per_context": 3,
125
+ "window_minutes": 30
122
126
  }
123
127
  };
124
128
 
@@ -116,6 +116,10 @@ var protocol = {
116
116
  ".trae",
117
117
  ".codex"
118
118
  ]
119
+ },
120
+ "stop": {
121
+ "max_prompt_per_context": 3,
122
+ "window_minutes": 30
119
123
  }
120
124
  };
121
125
 
@@ -116,6 +116,10 @@ var protocol = {
116
116
  ".trae",
117
117
  ".codex"
118
118
  ]
119
+ },
120
+ "stop": {
121
+ "max_prompt_per_context": 3,
122
+ "window_minutes": 30
119
123
  }
120
124
  };
121
125
 
@@ -388,6 +388,10 @@ var protocol = {
388
388
  ".trae",
389
389
  ".codex"
390
390
  ]
391
+ },
392
+ "stop": {
393
+ "max_prompt_per_context": 3,
394
+ "window_minutes": 30
391
395
  }
392
396
  };
393
397
 
@@ -116,6 +116,10 @@ var protocol = {
116
116
  ".trae",
117
117
  ".codex"
118
118
  ]
119
+ },
120
+ "stop": {
121
+ "max_prompt_per_context": 3,
122
+ "window_minutes": 30
119
123
  }
120
124
  };
121
125
 
@@ -114,6 +114,10 @@ var protocol = {
114
114
  ".trae",
115
115
  ".codex"
116
116
  ]
117
+ },
118
+ "stop": {
119
+ "max_prompt_per_context": 3,
120
+ "window_minutes": 30
117
121
  }
118
122
  };
119
123
 
@@ -114,6 +114,10 @@ var protocol = {
114
114
  ".trae",
115
115
  ".codex"
116
116
  ]
117
+ },
118
+ "stop": {
119
+ "max_prompt_per_context": 3,
120
+ "window_minutes": 30
117
121
  }
118
122
  };
119
123
 
@@ -147,6 +147,10 @@ var protocol = {
147
147
  ".trae",
148
148
  ".codex"
149
149
  ]
150
+ },
151
+ "stop": {
152
+ "max_prompt_per_context": 3,
153
+ "window_minutes": 30
150
154
  }
151
155
  };
152
156
 
@@ -117,6 +117,10 @@ var protocol = {
117
117
  ".trae",
118
118
  ".codex"
119
119
  ]
120
+ },
121
+ "stop": {
122
+ "max_prompt_per_context": 3,
123
+ "window_minutes": 30
120
124
  }
121
125
  };
122
126
 
@@ -403,6 +403,10 @@ var protocol = {
403
403
  ".trae",
404
404
  ".codex"
405
405
  ]
406
+ },
407
+ "stop": {
408
+ "max_prompt_per_context": 3,
409
+ "window_minutes": 30
406
410
  }
407
411
  };
408
412
 
@@ -148,6 +148,10 @@ var protocol = {
148
148
  ".trae",
149
149
  ".codex"
150
150
  ]
151
+ },
152
+ "stop": {
153
+ "max_prompt_per_context": 3,
154
+ "window_minutes": 30
151
155
  }
152
156
  };
153
157