add-coder 0.3.38 → 0.3.40

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 (78) hide show
  1. package/README.en.md +16 -3
  2. package/README.md +16 -3
  3. package/dist/index.js +421 -70
  4. package/package.json +3 -2
  5. package/templates/.add-coder-src-hash.json +74 -61
  6. package/templates/adapters/claude/hooks/post-tool-use.mjs +1 -1
  7. package/templates/adapters/claude/hooks/prompt-submit.mjs +1 -1
  8. package/templates/adapters/claude/hooks/session-start.mjs +25 -5
  9. package/templates/adapters/claude/hooks/stop-check.mjs +2 -2
  10. package/templates/adapters/codex/hooks/post-tool-use.mjs +1 -1
  11. package/templates/adapters/codex/hooks/prompt-submit.mjs +1 -1
  12. package/templates/adapters/codex/hooks/session-start.mjs +25 -5
  13. package/templates/adapters/codex/hooks/stop-check.mjs +2 -2
  14. package/templates/adapters/qoder/hooks/post-tool-use.mjs +1 -1
  15. package/templates/adapters/qoder/hooks/prompt-submit.mjs +1 -1
  16. package/templates/adapters/qoder/hooks/session-start.mjs +25 -5
  17. package/templates/adapters/qoder/hooks/stop-check.mjs +2 -2
  18. package/templates/adapters/trae/hooks/post-tool-use.mjs +1 -1
  19. package/templates/adapters/trae/hooks/prompt-submit.mjs +1 -1
  20. package/templates/adapters/trae/hooks/session-start.mjs +25 -5
  21. package/templates/adapters/trae/hooks/stop-check.mjs +2 -2
  22. package/templates/adapters/vscode/hooks/post-tool-use.mjs +1 -1
  23. package/templates/adapters/vscode/hooks/prompt-submit.mjs +1 -1
  24. package/templates/adapters/vscode/hooks/session-start.mjs +25 -5
  25. package/templates/adapters/vscode/hooks/stop-check.mjs +2 -2
  26. package/templates/core/AGENTS.md +46 -0
  27. package/templates/core/docs/ADD-governance-claude-code.md +52 -0
  28. package/templates/core/docs/ADD-governance-codex.md +62 -0
  29. package/templates/core/docs/ADD-governance-qoder-cn.md +30 -0
  30. package/templates/core/docs/ADD-governance-trae.md +42 -0
  31. package/templates/core/docs/ADD-governance-vscode-copilot.md +88 -0
  32. package/templates/core/governance/rules.ts +2 -2
  33. package/templates/core/governance/session-start-guard.ts +28 -4
  34. package/templates/core/prisma/add.prisma +4 -0
  35. package/templates/core/scripts/mcp-server/resources/hitl-approval-widget.ts +4 -2
  36. package/templates/core/scripts/mcp-server/resources/index.ts +2 -0
  37. package/templates/core/scripts/mcp-server/resources/widget-probe.ts +53 -0
  38. package/templates/core/scripts/mcp-server/shared/db-types.ts +5 -1
  39. package/templates/core/scripts/mcp-server/shared/dev-operation.ts +97 -0
  40. package/templates/core/scripts/mcp-server/shared/hitl-ui.ts +46 -1
  41. package/templates/core/scripts/mcp-server/shared/memory/jobs/snapshot.ts +9 -0
  42. package/templates/core/scripts/mcp-server/shared/memory/retrieval/cjk-segmenter.ts +140 -0
  43. package/templates/core/scripts/mcp-server/shared/memory/retrieval/cjk-tokenize.ts +62 -0
  44. package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/pg.ts +68 -16
  45. package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite-fts5.sql +3 -3
  46. package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite.ts +23 -6
  47. package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts-fingerprint.ts +116 -0
  48. package/templates/core/scripts/mcp-server/shared/memory/retrieval/query-terms.ts +9 -25
  49. package/templates/core/scripts/mcp-server/shared/memory/switches.ts +4 -2
  50. package/templates/core/scripts/mcp-server/shared/plan-lifecycle.ts +16 -3
  51. package/templates/core/scripts/mcp-server/shared/server-capabilities.ts +65 -0
  52. package/templates/core/scripts/mcp-server/tools/audit.ts +16 -34
  53. package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts +17 -4
  54. package/templates/core/scripts/mcp-server/tools/gateway/check_add_route_status.ts +34 -6
  55. package/templates/core/scripts/mcp-server/tools/gateway/check_dps.ts +15 -25
  56. package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +23 -26
  57. package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +56 -38
  58. package/templates/core/scripts/mcp-server/tools/gateway/plan-resolve.ts +270 -0
  59. package/templates/core/scripts/mcp-server/tools/hitl.ts +18 -8
  60. package/templates/core/scripts/mcp-server/tools/index.ts +7 -2
  61. package/templates/core/scripts/mcp-server/tools/memory.ts +235 -1
  62. package/templates/core/scripts/mcp-server/tools/plan-lifecycle.ts +219 -0
  63. package/templates/core/scripts/mcp-server/tools/plan.ts +2 -0
  64. package/templates/core/scripts/mcp-server/tools/widget-probe.ts +53 -0
  65. package/templates/core/scripts/mcp-server.ts +5 -1
  66. package/templates/core/scripts/memory/backfill-search-text.ts +132 -0
  67. package/templates/core/scripts/memory/memory-jobs.ts +124 -0
  68. package/templates/core/scripts/plan-close.ts +85 -0
  69. package/templates/core/skills/add-paradigm/SKILL.md +19 -4
  70. package/templates/core/skills/session-init/SKILL.md +27 -0
  71. package/templates/core/templates/add-route-template-heavyweight.md +2 -0
  72. package/templates/core/templates/add-route-template.md +4 -0
  73. package/templates/core/templates/checklist-template.md +2 -0
  74. package/templates/core/templates/handoff-multi-round-template.md +2 -0
  75. package/templates/core/templates/review-implementation-template.md +18 -0
  76. package/templates/core/templates/review-implementation-template.schema.json +7 -1
  77. package/templates/core/templates/simple-plan-template.md +4 -0
  78. package/templates/core/vocabulary/add-governance-vocabulary.md +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.3.38",
3
+ "version": "0.3.40",
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": {
@@ -98,7 +98,8 @@
98
98
  "vitest": "^4.1.10"
99
99
  },
100
100
  "optionalDependencies": {
101
- "@ariga/atlas": "^1.3.0"
101
+ "@ariga/atlas": "^1.3.0",
102
+ "@node-rs/jieba": "^2.0.3"
102
103
  },
103
104
  "scripts": {
104
105
  "build": "tsup",
@@ -1,5 +1,5 @@
1
1
  {
2
- "_version": "0.3.38",
2
+ "_version": "0.3.40",
3
3
  "adapters/claude/hooks/doc-format-guard.mjs": "b21350a0",
4
4
  "adapters/claude/hooks/doc-format-guard.ts": "2abf8013",
5
5
  "adapters/claude/hooks/lib/claude-env.ts": "170b40ca",
@@ -11,21 +11,21 @@
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": "bb8f197e",
14
+ "adapters/claude/hooks/post-tool-use.mjs": "c31728ef",
15
15
  "adapters/claude/hooks/post-tool-use.ts": "54c1840a",
16
16
  "adapters/claude/hooks/pre-compact.mjs": "3eb17466",
17
17
  "adapters/claude/hooks/pre-compact.ts": "fdb49e54",
18
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": "ab4994c4",
20
+ "adapters/claude/hooks/prompt-submit.mjs": "e8ea336b",
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
24
  "adapters/claude/hooks/session-end.mjs": "1cf8ea80",
25
25
  "adapters/claude/hooks/session-end.ts": "3c963eae",
26
- "adapters/claude/hooks/session-start.mjs": "37240cdf",
26
+ "adapters/claude/hooks/session-start.mjs": "d107baaf",
27
27
  "adapters/claude/hooks/session-start.ts": "3f762d49",
28
- "adapters/claude/hooks/stop-check.mjs": "ad933373",
28
+ "adapters/claude/hooks/stop-check.mjs": "0ea9cefa",
29
29
  "adapters/claude/hooks/stop-check.ts": "967fd318",
30
30
  "adapters/claude/hooks/stop-failure.mjs": "57490bd2",
31
31
  "adapters/claude/hooks/stop-failure.ts": "b132759b",
@@ -44,21 +44,21 @@
44
44
  "adapters/codex/hooks/permission-gate.ts": "15af671c",
45
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": "c9b92bad",
47
+ "adapters/codex/hooks/post-tool-use.mjs": "c4c93e41",
48
48
  "adapters/codex/hooks/post-tool-use.ts": "a7a2fc6c",
49
49
  "adapters/codex/hooks/pre-compact.mjs": "2c16761f",
50
50
  "adapters/codex/hooks/pre-compact.ts": "c0671f9b",
51
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": "71078015",
53
+ "adapters/codex/hooks/prompt-submit.mjs": "cd368e24",
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
57
  "adapters/codex/hooks/session-end.mjs": "e876065c",
58
58
  "adapters/codex/hooks/session-end.ts": "7fcb6f86",
59
- "adapters/codex/hooks/session-start.mjs": "7eccb61e",
59
+ "adapters/codex/hooks/session-start.mjs": "10ab974c",
60
60
  "adapters/codex/hooks/session-start.ts": "4eacd44f",
61
- "adapters/codex/hooks/stop-check.mjs": "c8866935",
61
+ "adapters/codex/hooks/stop-check.mjs": "a66d4873",
62
62
  "adapters/codex/hooks/stop-check.ts": "ee1801dd",
63
63
  "adapters/codex/hooks/subagent-guard.mjs": "187a94f7",
64
64
  "adapters/codex/hooks/subagent-guard.ts": "e5ccf88b",
@@ -77,21 +77,21 @@
77
77
  "adapters/qoder/hooks/permission-gate.ts": "8478e48e",
78
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": "42f88112",
80
+ "adapters/qoder/hooks/post-tool-use.mjs": "873adba1",
81
81
  "adapters/qoder/hooks/post-tool-use.ts": "c7e9ce26",
82
82
  "adapters/qoder/hooks/pre-compact.mjs": "3f8a1fa7",
83
83
  "adapters/qoder/hooks/pre-compact.ts": "70a8e8f8",
84
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": "8c6567f7",
86
+ "adapters/qoder/hooks/prompt-submit.mjs": "c4b1ab02",
87
87
  "adapters/qoder/hooks/prompt-submit.ts": "9050e0cb",
88
88
  "adapters/qoder/hooks/review-checklist.mjs": "04b300e4",
89
89
  "adapters/qoder/hooks/review-checklist.ts": "cf4ac191",
90
90
  "adapters/qoder/hooks/session-end.mjs": "eee2e434",
91
91
  "adapters/qoder/hooks/session-end.ts": "e9bf7cd4",
92
- "adapters/qoder/hooks/session-start.mjs": "8d4453db",
92
+ "adapters/qoder/hooks/session-start.mjs": "a51a33cd",
93
93
  "adapters/qoder/hooks/session-start.ts": "eeb089e0",
94
- "adapters/qoder/hooks/stop-check.mjs": "b010c028",
94
+ "adapters/qoder/hooks/stop-check.mjs": "10ece759",
95
95
  "adapters/qoder/hooks/stop-check.ts": "53447287",
96
96
  "adapters/qoder/hooks/subagent-guard.mjs": "ee1a1732",
97
97
  "adapters/qoder/hooks/subagent-guard.ts": "0c10171b",
@@ -108,21 +108,21 @@
108
108
  "adapters/trae/hooks/permission-gate.ts": "c53aedc7",
109
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": "e9d50cb9",
111
+ "adapters/trae/hooks/post-tool-use.mjs": "dfa4989c",
112
112
  "adapters/trae/hooks/post-tool-use.ts": "7b1e2f4f",
113
113
  "adapters/trae/hooks/pre-compact.mjs": "6c0c3e68",
114
114
  "adapters/trae/hooks/pre-compact.ts": "5de3b0fe",
115
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": "6385a3d2",
117
+ "adapters/trae/hooks/prompt-submit.mjs": "4e1a7304",
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
121
  "adapters/trae/hooks/session-end.mjs": "5d68ad3f",
122
122
  "adapters/trae/hooks/session-end.ts": "64ce383f",
123
- "adapters/trae/hooks/session-start.mjs": "59c49651",
123
+ "adapters/trae/hooks/session-start.mjs": "059ace94",
124
124
  "adapters/trae/hooks/session-start.ts": "d6b4fdc7",
125
- "adapters/trae/hooks/stop-check.mjs": "a4335a46",
125
+ "adapters/trae/hooks/stop-check.mjs": "2f2006d3",
126
126
  "adapters/trae/hooks/stop-check.ts": "b33ad5e4",
127
127
  "adapters/trae/hooks/subagent-guard.mjs": "20f1d490",
128
128
  "adapters/trae/hooks/subagent-guard.ts": "eab8cbd9",
@@ -149,21 +149,21 @@
149
149
  "adapters/vscode/hooks/permission-gate.ts": "ad096bc1",
150
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": "a083ed52",
152
+ "adapters/vscode/hooks/post-tool-use.mjs": "73ca98c0",
153
153
  "adapters/vscode/hooks/post-tool-use.ts": "42146851",
154
154
  "adapters/vscode/hooks/pre-compact.mjs": "494dfd18",
155
155
  "adapters/vscode/hooks/pre-compact.ts": "15e4a043",
156
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": "3618a565",
158
+ "adapters/vscode/hooks/prompt-submit.mjs": "f4521bcd",
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
162
  "adapters/vscode/hooks/session-end.mjs": "dc805cd7",
163
163
  "adapters/vscode/hooks/session-end.ts": "acdd9f42",
164
- "adapters/vscode/hooks/session-start.mjs": "7deea287",
164
+ "adapters/vscode/hooks/session-start.mjs": "eab1d187",
165
165
  "adapters/vscode/hooks/session-start.ts": "54b262b0",
166
- "adapters/vscode/hooks/stop-check.mjs": "b7d81215",
166
+ "adapters/vscode/hooks/stop-check.mjs": "7238eea4",
167
167
  "adapters/vscode/hooks/stop-check.ts": "7a69b075",
168
168
  "adapters/vscode/hooks/subagent-guard.mjs": "3b6b6905",
169
169
  "adapters/vscode/hooks/subagent-guard.ts": "773dc2c8",
@@ -172,12 +172,13 @@
172
172
  "adapters/vscode/launch.json": "f2b79855",
173
173
  "adapters/vscode/settings.json": "7cabd00e",
174
174
  "adapters/vscode/tasks.json": "654d7fbd",
175
+ "core/AGENTS.md": "a92f83ab",
175
176
  "core/agents/add-flow-guardian.md": "c3e650d2",
176
- "core/docs/ADD-governance-claude-code.md": "b11fabb9",
177
- "core/docs/ADD-governance-codex.md": "7ce9443d",
178
- "core/docs/ADD-governance-qoder-cn.md": "54d79441",
179
- "core/docs/ADD-governance-trae.md": "ec2976ae",
180
- "core/docs/ADD-governance-vscode-copilot.md": "ab7885a4",
177
+ "core/docs/ADD-governance-claude-code.md": "0b7eb78e",
178
+ "core/docs/ADD-governance-codex.md": "f1ad5b39",
179
+ "core/docs/ADD-governance-qoder-cn.md": "b12758a4",
180
+ "core/docs/ADD-governance-trae.md": "20d42417",
181
+ "core/docs/ADD-governance-vscode-copilot.md": "e560564b",
181
182
  "core/governance/audit-bridge.ts": "1a0d5ccd",
182
183
  "core/governance/common.ts": "37570397",
183
184
  "core/governance/context-inject.ts": "8ded8188",
@@ -192,9 +193,9 @@
192
193
  "core/governance/preload-templates.ts": "cfd6d3ca",
193
194
  "core/governance/prompt-router.ts": "4b2f55a3",
194
195
  "core/governance/review-checklist-guard.ts": "b24568b1",
195
- "core/governance/rules.ts": "e6b261b7",
196
+ "core/governance/rules.ts": "4b03f432",
196
197
  "core/governance/session-end.ts": "108fc3f6",
197
- "core/governance/session-start-guard.ts": "8a91218e",
198
+ "core/governance/session-start-guard.ts": "99f7955b",
198
199
  "core/governance/state-detect.ts": "55afc935",
199
200
  "core/governance/stop-router.ts": "af93ae1c",
200
201
  "core/governance/subagent-guard-router.ts": "398fb80e",
@@ -215,7 +216,7 @@
215
216
  "core/hooks/stop-check.ts": "0c3fc40a",
216
217
  "core/hooks/subagent-guard.ts": "37019300",
217
218
  "core/hooks/subagent-stop.ts": "9eebd61f",
218
- "core/prisma/add.prisma": "a3365acc",
219
+ "core/prisma/add.prisma": "c76b0d79",
219
220
  "core/reports/REPORT-WORKFLOW.md": "03d39b21",
220
221
  "core/reports/boundary-runtime-report.md": "6fd8053f",
221
222
  "core/reports/code-review-combined-report.md": "195d52aa",
@@ -239,14 +240,16 @@
239
240
  "core/scripts/mcp-server/notifications/index.ts": "b6615afa",
240
241
  "core/scripts/mcp-server/resources/add-coder-version.ts": "2384fa40",
241
242
  "core/scripts/mcp-server/resources/add-state.ts": "1c1cc3a2",
242
- "core/scripts/mcp-server/resources/hitl-approval-widget.ts": "f663610e",
243
+ "core/scripts/mcp-server/resources/hitl-approval-widget.ts": "4320f7d9",
243
244
  "core/scripts/mcp-server/resources/hook-events-report.ts": "9b62bacd",
244
- "core/scripts/mcp-server/resources/index.ts": "d2d723f3",
245
+ "core/scripts/mcp-server/resources/index.ts": "23aba4a6",
245
246
  "core/scripts/mcp-server/resources/round-task.ts": "104a0d74",
247
+ "core/scripts/mcp-server/resources/widget-probe.ts": "286f0264",
246
248
  "core/scripts/mcp-server/sampling/index.ts": "7ee26d92",
247
249
  "core/scripts/mcp-server/sampling/review.ts": "dd6e22ff",
248
250
  "core/scripts/mcp-server/shared/anchor.ts": "ab15ff22",
249
- "core/scripts/mcp-server/shared/db-types.ts": "2d54cc72",
251
+ "core/scripts/mcp-server/shared/db-types.ts": "7db431db",
252
+ "core/scripts/mcp-server/shared/dev-operation.ts": "4046f571",
250
253
  "core/scripts/mcp-server/shared/dps-scoring.strategy.ts": "92ecf32b",
251
254
  "core/scripts/mcp-server/shared/dps-spec-ref.ts": "c2257e3a",
252
255
  "core/scripts/mcp-server/shared/env.ts": "f79ab09c",
@@ -256,7 +259,7 @@
256
259
  "core/scripts/mcp-server/shared/hitl-lifecycle-mutation.ts": "06952c62",
257
260
  "core/scripts/mcp-server/shared/hitl-proposal-content.ts": "a7609204",
258
261
  "core/scripts/mcp-server/shared/hitl-proposal-mutation.ts": "87a7a372",
259
- "core/scripts/mcp-server/shared/hitl-ui.ts": "51d574f2",
262
+ "core/scripts/mcp-server/shared/hitl-ui.ts": "dfd52431",
260
263
  "core/scripts/mcp-server/shared/hitl-widget-instance.ts": "fa750c56",
261
264
  "core/scripts/mcp-server/shared/memory/calibration/batch-fit.ts": "d93af367",
262
265
  "core/scripts/mcp-server/shared/memory/calibration/feedback-stats.ts": "525d18cb",
@@ -274,28 +277,31 @@
274
277
  "core/scripts/mcp-server/shared/memory/embedding/openai-compatible.ts": "7a6a7429",
275
278
  "core/scripts/mcp-server/shared/memory/jobs/consolidation.ts": "d724ec0d",
276
279
  "core/scripts/mcp-server/shared/memory/jobs/evidence-collector.ts": "b44b4d62",
277
- "core/scripts/mcp-server/shared/memory/jobs/snapshot.ts": "7c7923eb",
280
+ "core/scripts/mcp-server/shared/memory/jobs/snapshot.ts": "7ceae2fd",
278
281
  "core/scripts/mcp-server/shared/memory/metrics/gate-recall.ts": "dc41a0fc",
279
282
  "core/scripts/mcp-server/shared/memory/metrics/gate-writer.ts": "47cd35b0",
280
283
  "core/scripts/mcp-server/shared/memory/metrics/stage-words.ts": "a81db64b",
284
+ "core/scripts/mcp-server/shared/memory/retrieval/cjk-segmenter.ts": "19d1c352",
285
+ "core/scripts/mcp-server/shared/memory/retrieval/cjk-tokenize.ts": "f06ed27b",
281
286
  "core/scripts/mcp-server/shared/memory/retrieval/context-builder.ts": "ea83c131",
282
- "core/scripts/mcp-server/shared/memory/retrieval/fts/pg.ts": "1275eef4",
283
- "core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite-fts5.sql": "1a439c1a",
284
- "core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite.ts": "09a6cf59",
287
+ "core/scripts/mcp-server/shared/memory/retrieval/fts/pg.ts": "2e711df9",
288
+ "core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite-fts5.sql": "666ca024",
289
+ "core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite.ts": "a0527045",
290
+ "core/scripts/mcp-server/shared/memory/retrieval/fts-fingerprint.ts": "712876d3",
285
291
  "core/scripts/mcp-server/shared/memory/retrieval/fusion.ts": "c3aa6a4f",
286
292
  "core/scripts/mcp-server/shared/memory/retrieval/pipeline.ts": "dbe4a472",
287
- "core/scripts/mcp-server/shared/memory/retrieval/query-terms.ts": "423a0054",
293
+ "core/scripts/mcp-server/shared/memory/retrieval/query-terms.ts": "ca6e7200",
288
294
  "core/scripts/mcp-server/shared/memory/retrieval/recall-writer.ts": "ed9cba51",
289
295
  "core/scripts/mcp-server/shared/memory/retrieval/reranker.ts": "659ed2e8",
290
296
  "core/scripts/mcp-server/shared/memory/retrieval/types.ts": "f9f9f8ad",
291
297
  "core/scripts/mcp-server/shared/memory/retrieval/vector/pgvector.ts": "732e70c1",
292
298
  "core/scripts/mcp-server/shared/memory/retrieval/vector/sqlite-vec.ts": "d6ad13ff",
293
- "core/scripts/mcp-server/shared/memory/switches.ts": "b1561bef",
299
+ "core/scripts/mcp-server/shared/memory/switches.ts": "8c631c04",
294
300
  "core/scripts/mcp-server/shared/package.json": "e3d5a4a2",
295
301
  "core/scripts/mcp-server/shared/plan-lifecycle-events.ts": "ae99b9a0",
296
302
  "core/scripts/mcp-server/shared/plan-lifecycle-mutation.ts": "303d9674",
297
303
  "core/scripts/mcp-server/shared/plan-lifecycle-subscriber.ts": "1b1c2b84",
298
- "core/scripts/mcp-server/shared/plan-lifecycle.ts": "6a49ff4d",
304
+ "core/scripts/mcp-server/shared/plan-lifecycle.ts": "1f9da436",
299
305
  "core/scripts/mcp-server/shared/plan-round-events.ts": "86b6ba3f",
300
306
  "core/scripts/mcp-server/shared/plan-round-mutation.ts": "c058e930",
301
307
  "core/scripts/mcp-server/shared/plan-round-store.ts": "bc28bd09",
@@ -312,52 +318,59 @@
312
318
  "core/scripts/mcp-server/shared/runtime-context.ts": "51d0b45f",
313
319
  "core/scripts/mcp-server/shared/runtime-freshness.ts": "de5f0fb9",
314
320
  "core/scripts/mcp-server/shared/schema-topology.ts": "a680b738",
321
+ "core/scripts/mcp-server/shared/server-capabilities.ts": "53194c42",
315
322
  "core/scripts/mcp-server/tasks/index.ts": "c040eb75",
316
323
  "core/scripts/mcp-server/tasks/runner.ts": "d84bd35d",
317
324
  "core/scripts/mcp-server/tasks/store.ts": "2fce1a92",
318
- "core/scripts/mcp-server/tools/audit.ts": "705292b3",
325
+ "core/scripts/mcp-server/tools/audit.ts": "bf3742c3",
319
326
  "core/scripts/mcp-server/tools/context.ts": "d7d4e546",
320
327
  "core/scripts/mcp-server/tools/contract.ts": "14b6ab8f",
321
328
  "core/scripts/mcp-server/tools/docs.ts": "034e473c",
322
- "core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts": "b58e76ee",
323
- "core/scripts/mcp-server/tools/gateway/check_add_route_status.ts": "4caf552c",
329
+ "core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts": "a888c711",
330
+ "core/scripts/mcp-server/tools/gateway/check_add_route_status.ts": "1b6884bc",
324
331
  "core/scripts/mcp-server/tools/gateway/check_doc_similarity.ts": "2cba51c5",
325
- "core/scripts/mcp-server/tools/gateway/check_dps.ts": "f52ef32c",
326
- "core/scripts/mcp-server/tools/gateway/check_rahs.ts": "a786744d",
327
- "core/scripts/mcp-server/tools/gateway/check_spec_sync.ts": "adad0b31",
332
+ "core/scripts/mcp-server/tools/gateway/check_dps.ts": "d4120356",
333
+ "core/scripts/mcp-server/tools/gateway/check_rahs.ts": "00a51678",
334
+ "core/scripts/mcp-server/tools/gateway/check_spec_sync.ts": "5dd01970",
328
335
  "core/scripts/mcp-server/tools/gateway/helpers.ts": "f8794a92",
329
336
  "core/scripts/mcp-server/tools/gateway/index.ts": "cffe9783",
337
+ "core/scripts/mcp-server/tools/gateway/plan-resolve.ts": "5c742655",
330
338
  "core/scripts/mcp-server/tools/gateway.backup": "65eae393",
331
- "core/scripts/mcp-server/tools/hitl.ts": "4488c338",
339
+ "core/scripts/mcp-server/tools/hitl.ts": "d811043d",
332
340
  "core/scripts/mcp-server/tools/hook-event-report.ts": "1d825b3f",
333
- "core/scripts/mcp-server/tools/index.ts": "fcebff02",
341
+ "core/scripts/mcp-server/tools/index.ts": "f0f8962b",
334
342
  "core/scripts/mcp-server/tools/memory-compat.ts": "8812c5b7",
335
- "core/scripts/mcp-server/tools/memory.ts": "cf6a576d",
336
- "core/scripts/mcp-server/tools/plan.ts": "edae2597",
343
+ "core/scripts/mcp-server/tools/memory.ts": "2c86ebfd",
344
+ "core/scripts/mcp-server/tools/plan-lifecycle.ts": "35867abf",
345
+ "core/scripts/mcp-server/tools/plan.ts": "9e0c847f",
337
346
  "core/scripts/mcp-server/tools/quality.ts": "c4634453",
338
347
  "core/scripts/mcp-server/tools/registrar.ts": "efd81b3a",
339
348
  "core/scripts/mcp-server/tools/review.ts": "d114e522",
349
+ "core/scripts/mcp-server/tools/widget-probe.ts": "2091329b",
340
350
  "core/scripts/mcp-server/types.ts": "6c5e60bc",
341
- "core/scripts/mcp-server.ts": "bcaead3c",
351
+ "core/scripts/mcp-server.ts": "223cda5e",
352
+ "core/scripts/memory/backfill-search-text.ts": "5e72575b",
353
+ "core/scripts/memory/memory-jobs.ts": "5b6dbf4e",
342
354
  "core/scripts/package.json": "5a065fe7",
355
+ "core/scripts/plan-close.ts": "a755f7fa",
343
356
  "core/scripts/plan-status-bridge.ts": "70c5d8b7",
344
- "core/skills/add-paradigm/SKILL.md": "55df369a",
345
- "core/skills/session-init/SKILL.md": "bb1205b0",
357
+ "core/skills/add-paradigm/SKILL.md": "736a0dd1",
358
+ "core/skills/session-init/SKILL.md": "3d3ab96e",
346
359
  "core/specs/add-coder-npm-package/checklist.md": "ed92032c",
347
360
  "core/specs/add-coder-npm-package/spec.md": "c7d0f235",
348
361
  "core/specs/add-coder-npm-package/tasks.md": "c34301e5",
349
362
  "core/templates/01-架构/《ADD开发工作路径与文档协同规范》.md": "c7e2ac6a",
350
363
  "core/templates/TERMINOLOGY.md": "e9f4f781",
351
- "core/templates/add-route-template-heavyweight.md": "0e107ac0",
352
- "core/templates/add-route-template.md": "da7022df",
364
+ "core/templates/add-route-template-heavyweight.md": "6b6daa02",
365
+ "core/templates/add-route-template.md": "a8ad1560",
353
366
  "core/templates/add-route-template.schema.json": "cca77a6e",
354
- "core/templates/checklist-template.md": "c1ea7aaf",
367
+ "core/templates/checklist-template.md": "8e3ddc28",
355
368
  "core/templates/checklist-template.schema.json": "fb3a73e8",
356
369
  "core/templates/collab-contract-template.md": "b8a52503",
357
370
  "core/templates/collab-contract-template.schema.json": "ae0f482c",
358
371
  "core/templates/fix-verification-template.md": "9c9ed175",
359
372
  "core/templates/fix-verification-template.schema.json": "a18bc6a5",
360
- "core/templates/handoff-multi-round-template.md": "d3a2375d",
373
+ "core/templates/handoff-multi-round-template.md": "75886acc",
361
374
  "core/templates/handoff-multi-round-template.schema.json": "c752a9dc",
362
375
  "core/templates/handoff-multi-round.schema.json": "abed4220",
363
376
  "core/templates/handoff-single-round-template.md": "dceb7c86",
@@ -374,15 +387,15 @@
374
387
  "core/templates/prd-standard-template.schema.json": "2b76a919",
375
388
  "core/templates/report-template.md": "bc4602ac",
376
389
  "core/templates/report-template.schema.json": "44dd2bd0",
377
- "core/templates/review-implementation-template.md": "6d7a46cb",
378
- "core/templates/review-implementation-template.schema.json": "d97b9eb6",
390
+ "core/templates/review-implementation-template.md": "bac5be0b",
391
+ "core/templates/review-implementation-template.schema.json": "aeb598de",
379
392
  "core/templates/review-runtime-template.md": "c5960af1",
380
393
  "core/templates/review-runtime-template.schema.json": "c346ea7d",
381
394
  "core/templates/review-template.md": "644d2772",
382
395
  "core/templates/review-template.schema.json": "abc2ece6",
383
396
  "core/templates/runtime-report-template.md": "7b35208a",
384
397
  "core/templates/runtime-report-template.schema.json": "6c1143e6",
385
- "core/templates/simple-plan-template.md": "5b2d8dd6",
398
+ "core/templates/simple-plan-template.md": "3c1478cf",
386
399
  "core/templates/simple-plan-template.schema.json": "02718806",
387
400
  "core/templates/spec-template.md": "619b01cc",
388
401
  "core/templates/spec-template.schema.json": "9e5d530b",
@@ -406,5 +419,5 @@
406
419
  "core/validation/validators/spec.ts": "a7ad1d24",
407
420
  "core/validation/validators/tasks.ts": "cae46ddc",
408
421
  "core/validation/validators/types.ts": "dafcdbdc",
409
- "core/vocabulary/add-governance-vocabulary.md": "37f2c301"
422
+ "core/vocabulary/add-governance-vocabulary.md": "e87870b4"
410
423
  }
@@ -240,7 +240,7 @@ var AuditBridge = class {
240
240
 
241
241
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
242
242
  function recallMode(env = process.env) {
243
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
243
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
244
244
  return v === "off" || v === "inject" ? v : "shadow";
245
245
  }
246
246
  function evidenceEnabled(env = process.env) {
@@ -637,7 +637,7 @@ function writeHookEvent(hook, decision, cmd, reason, plan = "unknown", status =
637
637
 
638
638
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
639
639
  function recallMode(env = process.env) {
640
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
640
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
641
641
  return v === "off" || v === "inject" ? v : "shadow";
642
642
  }
643
643
  var L1_SNAPSHOT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
@@ -484,7 +484,7 @@ var PreloadTemplates = class _PreloadTemplates {
484
484
 
485
485
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
486
486
  function recallMode(env = process.env) {
487
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
487
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
488
488
  return v === "off" || v === "inject" ? v : "shadow";
489
489
  }
490
490
  function memoryMaxTokens(env = process.env) {
@@ -580,19 +580,39 @@ var SessionStartGuard = class {
580
580
  * shadow → 仅提示快照存在(召回可执行并落审计,但不注入上下文)
581
581
  * inject → 读预计算快照注入(新鲜度 ≤7 天,token 预算截断,带来源边界标签)
582
582
  * 同步 Hook ≤200ms 约束:只读文件,任何异常 fail-open 静默跳过。
583
+ *
584
+ * [2026-09-21 接线修复] 三态必须**可区分**,且"未接线/已过期"不再静默:
585
+ * 原实现 `if (!existsSync(file)) return` 会让"没跑 job"与"没有已治理记忆"、
586
+ * 以及"档位没开"三种情况在会话里完全无痕,用户与模型都无从判断记忆是否接上。
583
587
  */
584
588
  emitMemoryL1() {
585
589
  try {
586
590
  const mode = recallMode();
587
591
  if (mode === "off" || !this.magicDir) return;
588
592
  const file = join3(this.projectDir, this.magicDir, MEMORY_DIR_NAME, L1_SNAPSHOT_FILE);
589
- if (!existsSync3(file)) return;
593
+ if (!existsSync3(file)) {
594
+ process.stdout.write(
595
+ `[Memory] \u26A0\uFE0F L1 \u5FEB\u7167\u672A\u63A5\u7EBF\uFF08${file} \u4E0D\u5B58\u5728\uFF09\u2014\u2014\u5F53\u524D\u6863\u4F4D ${mode}\u3002\u751F\u6210\u5FEB\u7167\uFF1A\u6267\u884C \`npx add-coder sync\`\u3001\u8C03\u7528 MCP \u5DE5\u5177 refresh_memory_snapshots\u3001\u6216\u8FD0\u884C \`${this.magicDir}/scripts/memory/memory-jobs.ts refresh-l1\`\uFF1B\u6CE8\u5165\u5F00\u5173\uFF1AADD_MEMORY_RECALL_MODE=inject\uFF08\u9ED8\u8BA4\uFF09\u3002\u8BE6\u89C1 ${this.magicDir}/docs/ADD-governance-codex.md
596
+ `
597
+ );
598
+ return;
599
+ }
590
600
  if (mode === "shadow") {
591
- process.stdout.write(`[Memory] L1 \u5FEB\u7167\u5DF2\u751F\u6210\uFF08shadow \u6A21\u5F0F\u672A\u6CE8\u5165\uFF09\u3002\u9700\u8981\u65F6\u8C03\u7528 recall_memory \u663E\u5F0F\u53EC\u56DE: ${file}
592
- `);
601
+ process.stdout.write(
602
+ `[Memory] \u5F53\u524D\u6863\u4F4D shadow\uFF1A\u53EC\u56DE\u53EF\u6267\u884C\u5E76\u843D\u5BA1\u8BA1\uFF0C\u4F46**\u4E0D\u6CE8\u5165**\u4E0A\u4E0B\u6587\uFF08\u5FEB\u7167\u5DF2\u751F\u6210: ${file}\uFF09\u3002\u9700\u8981\u6CE8\u5165\u65F6\u53BB\u6389 ADD_MEMORY_RECALL_MODE \u6216\u8BBE\u4E3A inject\uFF08\u9ED8\u8BA4\uFF09\uFF1B\u4E5F\u53EF\u76F4\u63A5\u8C03\u7528 recall_memory \u663E\u5F0F\u53EC\u56DE\u3002
603
+ `
604
+ );
605
+ return;
606
+ }
607
+ const ageMs = Date.now() - statSync(file).mtimeMs;
608
+ if (ageMs > L1_SNAPSHOT_TTL_MS) {
609
+ const days = Math.floor(ageMs / 864e5);
610
+ process.stdout.write(
611
+ `[Memory] \u26A0\uFE0F L1 \u5FEB\u7167\u5DF2\u8FC7\u671F\uFF08${days} \u5929 > TTL 7 \u5929\uFF0C\u672A\u6CE8\u5165\uFF09\uFF1A${file}\u2014\u2014\u5237\u65B0\uFF1A\u8C03\u7528 refresh_memory_snapshots \u6216\u8FD0\u884C \`${this.magicDir}/scripts/memory/memory-jobs.ts refresh-l1\`
612
+ `
613
+ );
593
614
  return;
594
615
  }
595
- if (Date.now() - statSync(file).mtimeMs > L1_SNAPSHOT_TTL_MS) return;
596
616
  const text = readFileSync3(file, "utf-8");
597
617
  const budget = memoryMaxTokens();
598
618
  if (estimateTokens(text) <= budget) {
@@ -36,7 +36,7 @@ var context = {
36
36
  {
37
37
  "id": "has_add_dev_unclosed",
38
38
  "consumed": true,
39
- "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 handoff \u540C\u76EE\u5F55 devlog-{plan}-v{n}.md\n \u683C\u5F0F: # Devlog: {plan}\\n \u65E5\u671F / Plan / \u8F6E\u6B21 / \u672C\u8F6E\u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 \u67E5\u540C\u76EE\u5F55 devlog-*.md \u2192 query_audit_logs\n"
39
+ "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 \u8C03\u7528 `record_dev_operation`\uFF08MCP\uFF09\u843D\u5E93\u5BA1\u8BA1\uFF1B\u5E76\u628A\u672C\u8F6E\u9A8C\u6536\u8BB0\u5F55\uFF08\u65E5\u671F / Plan / \u8F6E\u6B21 / \u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\uFF09\u5199\u8FDB handoff \u7684\u9A8C\u6536\u6BB5\u843D\u2014\u2014**\u4E0D\u65B0\u5EFA devlog \u6587\u4EF6**\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\uFF08\u771F\u5B9E cuid\uFF09\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 query_audit_logs({ planKeyword })\uFF08devlog \u5373 DevOperation \u8BB0\u5F55\uFF0C\u65E0\u72EC\u7ACB\u6587\u4EF6\uFF09\n"
40
40
  },
41
41
  {
42
42
  "id": "has_add_dev_closed",
@@ -48,7 +48,7 @@ var context = {
48
48
  {
49
49
  "adapter": "qoder",
50
50
  "id": "has_add_dev_unclosed",
51
- "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 handoff \u540C\u76EE\u5F55 devlog-{plan}-v{n}.md\n \u683C\u5F0F: # Devlog: {plan}\\n \u65E5\u671F / Plan / \u8F6E\u6B21 / \u672C\u8F6E\u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 \u67E5\u540C\u76EE\u5F55 devlog-*.md \u2192 query_audit_logs\n"
51
+ "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 \u8C03\u7528 `record_dev_operation`\uFF08MCP\uFF09\u843D\u5E93\u5BA1\u8BA1\uFF1B\u5E76\u628A\u672C\u8F6E\u9A8C\u6536\u8BB0\u5F55\uFF08\u65E5\u671F / Plan / \u8F6E\u6B21 / \u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\uFF09\u5199\u8FDB handoff \u7684\u9A8C\u6536\u6BB5\u843D\u2014\u2014**\u4E0D\u65B0\u5EFA devlog \u6587\u4EF6**\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\uFF08\u771F\u5B9E cuid\uFF09\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 query_audit_logs({ planKeyword })\uFF08devlog \u5373 DevOperation \u8BB0\u5F55\uFF0C\u65E0\u72EC\u7ACB\u6587\u4EF6\uFF09\n"
52
52
  }
53
53
  ],
54
54
  "templates": {
@@ -348,7 +348,7 @@ var AuditBridge = class {
348
348
 
349
349
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
350
350
  function recallMode(env = process.env) {
351
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
351
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
352
352
  return v === "off" || v === "inject" ? v : "shadow";
353
353
  }
354
354
  function evidenceEnabled(env = process.env) {
@@ -452,7 +452,7 @@ function writeHookEvent(hook, decision, cmd, reason, plan = "unknown", status =
452
452
 
453
453
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
454
454
  function recallMode(env = process.env) {
455
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
455
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
456
456
  return v === "off" || v === "inject" ? v : "shadow";
457
457
  }
458
458
  var L1_SNAPSHOT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
@@ -489,7 +489,7 @@ var PreloadTemplates = class _PreloadTemplates {
489
489
 
490
490
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
491
491
  function recallMode(env = process.env) {
492
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
492
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
493
493
  return v === "off" || v === "inject" ? v : "shadow";
494
494
  }
495
495
  function memoryMaxTokens(env = process.env) {
@@ -585,19 +585,39 @@ var SessionStartGuard = class {
585
585
  * shadow → 仅提示快照存在(召回可执行并落审计,但不注入上下文)
586
586
  * inject → 读预计算快照注入(新鲜度 ≤7 天,token 预算截断,带来源边界标签)
587
587
  * 同步 Hook ≤200ms 约束:只读文件,任何异常 fail-open 静默跳过。
588
+ *
589
+ * [2026-09-21 接线修复] 三态必须**可区分**,且"未接线/已过期"不再静默:
590
+ * 原实现 `if (!existsSync(file)) return` 会让"没跑 job"与"没有已治理记忆"、
591
+ * 以及"档位没开"三种情况在会话里完全无痕,用户与模型都无从判断记忆是否接上。
588
592
  */
589
593
  emitMemoryL1() {
590
594
  try {
591
595
  const mode = recallMode();
592
596
  if (mode === "off" || !this.magicDir) return;
593
597
  const file = join3(this.projectDir, this.magicDir, MEMORY_DIR_NAME, L1_SNAPSHOT_FILE);
594
- if (!existsSync3(file)) return;
598
+ if (!existsSync3(file)) {
599
+ process.stdout.write(
600
+ `[Memory] \u26A0\uFE0F L1 \u5FEB\u7167\u672A\u63A5\u7EBF\uFF08${file} \u4E0D\u5B58\u5728\uFF09\u2014\u2014\u5F53\u524D\u6863\u4F4D ${mode}\u3002\u751F\u6210\u5FEB\u7167\uFF1A\u6267\u884C \`npx add-coder sync\`\u3001\u8C03\u7528 MCP \u5DE5\u5177 refresh_memory_snapshots\u3001\u6216\u8FD0\u884C \`${this.magicDir}/scripts/memory/memory-jobs.ts refresh-l1\`\uFF1B\u6CE8\u5165\u5F00\u5173\uFF1AADD_MEMORY_RECALL_MODE=inject\uFF08\u9ED8\u8BA4\uFF09\u3002\u8BE6\u89C1 ${this.magicDir}/docs/ADD-governance-codex.md
601
+ `
602
+ );
603
+ return;
604
+ }
595
605
  if (mode === "shadow") {
596
- process.stdout.write(`[Memory] L1 \u5FEB\u7167\u5DF2\u751F\u6210\uFF08shadow \u6A21\u5F0F\u672A\u6CE8\u5165\uFF09\u3002\u9700\u8981\u65F6\u8C03\u7528 recall_memory \u663E\u5F0F\u53EC\u56DE: ${file}
597
- `);
606
+ process.stdout.write(
607
+ `[Memory] \u5F53\u524D\u6863\u4F4D shadow\uFF1A\u53EC\u56DE\u53EF\u6267\u884C\u5E76\u843D\u5BA1\u8BA1\uFF0C\u4F46**\u4E0D\u6CE8\u5165**\u4E0A\u4E0B\u6587\uFF08\u5FEB\u7167\u5DF2\u751F\u6210: ${file}\uFF09\u3002\u9700\u8981\u6CE8\u5165\u65F6\u53BB\u6389 ADD_MEMORY_RECALL_MODE \u6216\u8BBE\u4E3A inject\uFF08\u9ED8\u8BA4\uFF09\uFF1B\u4E5F\u53EF\u76F4\u63A5\u8C03\u7528 recall_memory \u663E\u5F0F\u53EC\u56DE\u3002
608
+ `
609
+ );
610
+ return;
611
+ }
612
+ const ageMs = Date.now() - statSync(file).mtimeMs;
613
+ if (ageMs > L1_SNAPSHOT_TTL_MS) {
614
+ const days = Math.floor(ageMs / 864e5);
615
+ process.stdout.write(
616
+ `[Memory] \u26A0\uFE0F L1 \u5FEB\u7167\u5DF2\u8FC7\u671F\uFF08${days} \u5929 > TTL 7 \u5929\uFF0C\u672A\u6CE8\u5165\uFF09\uFF1A${file}\u2014\u2014\u5237\u65B0\uFF1A\u8C03\u7528 refresh_memory_snapshots \u6216\u8FD0\u884C \`${this.magicDir}/scripts/memory/memory-jobs.ts refresh-l1\`
617
+ `
618
+ );
598
619
  return;
599
620
  }
600
- if (Date.now() - statSync(file).mtimeMs > L1_SNAPSHOT_TTL_MS) return;
601
621
  const text = readFileSync3(file, "utf-8");
602
622
  const budget = memoryMaxTokens();
603
623
  if (estimateTokens(text) <= budget) {
@@ -39,7 +39,7 @@ var context = {
39
39
  {
40
40
  "id": "has_add_dev_unclosed",
41
41
  "consumed": true,
42
- "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 handoff \u540C\u76EE\u5F55 devlog-{plan}-v{n}.md\n \u683C\u5F0F: # Devlog: {plan}\\n \u65E5\u671F / Plan / \u8F6E\u6B21 / \u672C\u8F6E\u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 \u67E5\u540C\u76EE\u5F55 devlog-*.md \u2192 query_audit_logs\n"
42
+ "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 \u8C03\u7528 `record_dev_operation`\uFF08MCP\uFF09\u843D\u5E93\u5BA1\u8BA1\uFF1B\u5E76\u628A\u672C\u8F6E\u9A8C\u6536\u8BB0\u5F55\uFF08\u65E5\u671F / Plan / \u8F6E\u6B21 / \u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\uFF09\u5199\u8FDB handoff \u7684\u9A8C\u6536\u6BB5\u843D\u2014\u2014**\u4E0D\u65B0\u5EFA devlog \u6587\u4EF6**\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\uFF08\u771F\u5B9E cuid\uFF09\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 query_audit_logs({ planKeyword })\uFF08devlog \u5373 DevOperation \u8BB0\u5F55\uFF0C\u65E0\u72EC\u7ACB\u6587\u4EF6\uFF09\n"
43
43
  },
44
44
  {
45
45
  "id": "has_add_dev_closed",
@@ -51,7 +51,7 @@ var context = {
51
51
  {
52
52
  "adapter": "qoder",
53
53
  "id": "has_add_dev_unclosed",
54
- "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 handoff \u540C\u76EE\u5F55 devlog-{plan}-v{n}.md\n \u683C\u5F0F: # Devlog: {plan}\\n \u65E5\u671F / Plan / \u8F6E\u6B21 / \u672C\u8F6E\u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 \u67E5\u540C\u76EE\u5F55 devlog-*.md \u2192 query_audit_logs\n"
54
+ "text": "[ADD Stop] \u26A0\uFE0F \u4EE3\u7801\u5DF2\u5B8C\u6210\u4F46\u9A8C\u6536\u672A\u95ED\u73AF:\n{{info}}\n\n\u8BF7\u4F9D\u6B21\u6267\u884C\uFF08\u4E0D\u8981\u7B49\u4E0B\u6B21\u4F1A\u8BDD\uFF09:\n \u2460 Write devlog \u2192 \u8C03\u7528 `record_dev_operation`\uFF08MCP\uFF09\u843D\u5E93\u5BA1\u8BA1\uFF1B\u5E76\u628A\u672C\u8F6E\u9A8C\u6536\u8BB0\u5F55\uFF08\u65E5\u671F / Plan / \u8F6E\u6B21 / \u6539\u4E86\u4EC0\u4E48 / \u9A8C\u6536\u7ED3\u679C / \u9057\u7559\u9879 / \u67B6\u6784\u56DE\u770B\uFF09\u5199\u8FDB handoff \u7684\u9A8C\u6536\u6BB5\u843D\u2014\u2014**\u4E0D\u65B0\u5EFA devlog \u6587\u4EF6**\n \u2461 Edit handoff \u2192 \u66F4\u65B0 \xA7\u9A8C\u8BC1\u6807\u51C6 \u5168\u90E8 [x] + \u8865\u5145\u5BA1\u8BA1 ID\uFF08\u771F\u5B9E cuid\uFF09\n \u2605 \u540C\u6B65: checklist \u6709\u65B0 cuid \u2192 handoff ADD-7 \u8868\u5FC5\u987B\u5BF9\u5E94\u65B0\u589E\u884C\n \u2605 Step 0 \u51C6\u5165: handoff + add-route + Specs \u4E09\u5143\u7EC4\u7F3A\u4E00\u4E0D\u53EF\uFF0C\u7F3A\u5219\u56DE\u9000 Step 0.5\n \u2462 Read docs/ \u2192 \u56DE\u770B\u67B6\u6784\u6587\u6863\u786E\u8BA4\u4E00\u81F4\u6027\n \u2463 Edit add-route \u2192 \u52FE\u9009\u5BF9\u5E94 Step [x]\n\n\u4EE5\u4E0A\u5168\u90E8\u5B8C\u6210\u540E Agent \u624D\u80FD\u505C\u6B62\u3002\n\n\u4E0B\u6B21\u6062\u590D: \u8BFB handoff \u2192 query_audit_logs({ planKeyword })\uFF08devlog \u5373 DevOperation \u8BB0\u5F55\uFF0C\u65E0\u72EC\u7ACB\u6587\u4EF6\uFF09\n"
55
55
  }
56
56
  ],
57
57
  "templates": {
@@ -345,7 +345,7 @@ var AuditBridge = class {
345
345
 
346
346
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
347
347
  function recallMode(env = process.env) {
348
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
348
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
349
349
  return v === "off" || v === "inject" ? v : "shadow";
350
350
  }
351
351
  function evidenceEnabled(env = process.env) {
@@ -449,7 +449,7 @@ function writeHookEvent(hook, decision, cmd, reason, plan = "unknown", status =
449
449
 
450
450
  // templates/core/scripts/mcp-server/shared/memory/switches.ts
451
451
  function recallMode(env = process.env) {
452
- const v = (env.ADD_MEMORY_RECALL_MODE ?? "shadow").toLowerCase();
452
+ const v = (env.ADD_MEMORY_RECALL_MODE ?? "inject").toLowerCase();
453
453
  return v === "off" || v === "inject" ? v : "shadow";
454
454
  }
455
455
  var L1_SNAPSHOT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;