add-coder 0.3.39 → 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.
- package/README.en.md +16 -3
- package/README.md +16 -3
- package/dist/index.js +421 -70
- package/package.json +3 -2
- package/templates/.add-coder-src-hash.json +65 -53
- package/templates/adapters/claude/hooks/post-tool-use.mjs +1 -1
- package/templates/adapters/claude/hooks/prompt-submit.mjs +1 -1
- package/templates/adapters/claude/hooks/session-start.mjs +25 -5
- package/templates/adapters/claude/hooks/stop-check.mjs +2 -2
- package/templates/adapters/codex/hooks/post-tool-use.mjs +1 -1
- package/templates/adapters/codex/hooks/prompt-submit.mjs +1 -1
- package/templates/adapters/codex/hooks/session-start.mjs +25 -5
- package/templates/adapters/codex/hooks/stop-check.mjs +2 -2
- package/templates/adapters/qoder/hooks/post-tool-use.mjs +1 -1
- package/templates/adapters/qoder/hooks/prompt-submit.mjs +1 -1
- package/templates/adapters/qoder/hooks/session-start.mjs +25 -5
- package/templates/adapters/qoder/hooks/stop-check.mjs +2 -2
- package/templates/adapters/trae/hooks/post-tool-use.mjs +1 -1
- package/templates/adapters/trae/hooks/prompt-submit.mjs +1 -1
- package/templates/adapters/trae/hooks/session-start.mjs +25 -5
- package/templates/adapters/trae/hooks/stop-check.mjs +2 -2
- package/templates/adapters/vscode/hooks/post-tool-use.mjs +1 -1
- package/templates/adapters/vscode/hooks/prompt-submit.mjs +1 -1
- package/templates/adapters/vscode/hooks/session-start.mjs +25 -5
- package/templates/adapters/vscode/hooks/stop-check.mjs +2 -2
- package/templates/core/AGENTS.md +46 -0
- package/templates/core/docs/ADD-governance-claude-code.md +52 -0
- package/templates/core/docs/ADD-governance-codex.md +62 -0
- package/templates/core/docs/ADD-governance-qoder-cn.md +30 -0
- package/templates/core/docs/ADD-governance-trae.md +42 -0
- package/templates/core/docs/ADD-governance-vscode-copilot.md +88 -0
- package/templates/core/governance/rules.ts +2 -2
- package/templates/core/governance/session-start-guard.ts +28 -4
- package/templates/core/prisma/add.prisma +4 -0
- package/templates/core/scripts/mcp-server/resources/hitl-approval-widget.ts +4 -2
- package/templates/core/scripts/mcp-server/resources/index.ts +2 -0
- package/templates/core/scripts/mcp-server/resources/widget-probe.ts +53 -0
- package/templates/core/scripts/mcp-server/shared/db-types.ts +5 -1
- package/templates/core/scripts/mcp-server/shared/dev-operation.ts +97 -0
- package/templates/core/scripts/mcp-server/shared/hitl-ui.ts +46 -1
- package/templates/core/scripts/mcp-server/shared/memory/jobs/snapshot.ts +9 -0
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/cjk-segmenter.ts +140 -0
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/cjk-tokenize.ts +62 -0
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/pg.ts +68 -16
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite-fts5.sql +3 -3
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite.ts +23 -6
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/fts-fingerprint.ts +116 -0
- package/templates/core/scripts/mcp-server/shared/memory/retrieval/query-terms.ts +9 -25
- package/templates/core/scripts/mcp-server/shared/memory/switches.ts +4 -2
- package/templates/core/scripts/mcp-server/shared/plan-lifecycle.ts +16 -3
- package/templates/core/scripts/mcp-server/shared/server-capabilities.ts +65 -0
- package/templates/core/scripts/mcp-server/tools/audit.ts +16 -34
- package/templates/core/scripts/mcp-server/tools/hitl.ts +18 -8
- package/templates/core/scripts/mcp-server/tools/index.ts +7 -2
- package/templates/core/scripts/mcp-server/tools/memory.ts +235 -1
- package/templates/core/scripts/mcp-server/tools/plan-lifecycle.ts +219 -0
- package/templates/core/scripts/mcp-server/tools/plan.ts +2 -0
- package/templates/core/scripts/mcp-server/tools/widget-probe.ts +53 -0
- package/templates/core/scripts/mcp-server.ts +5 -1
- package/templates/core/scripts/memory/backfill-search-text.ts +132 -0
- package/templates/core/scripts/memory/memory-jobs.ts +124 -0
- package/templates/core/scripts/plan-close.ts +85 -0
- package/templates/core/skills/add-paradigm/SKILL.md +19 -4
- package/templates/core/skills/session-init/SKILL.md +27 -0
- package/templates/core/templates/add-route-template-heavyweight.md +2 -0
- package/templates/core/templates/add-route-template.md +4 -0
- package/templates/core/templates/handoff-multi-round-template.md +2 -0
- package/templates/core/templates/simple-plan-template.md +4 -0
- 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.
|
|
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.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
26
|
+
"adapters/claude/hooks/session-start.mjs": "d107baaf",
|
|
27
27
|
"adapters/claude/hooks/session-start.ts": "3f762d49",
|
|
28
|
-
"adapters/claude/hooks/stop-check.mjs": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
59
|
+
"adapters/codex/hooks/session-start.mjs": "10ab974c",
|
|
60
60
|
"adapters/codex/hooks/session-start.ts": "4eacd44f",
|
|
61
|
-
"adapters/codex/hooks/stop-check.mjs": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
92
|
+
"adapters/qoder/hooks/session-start.mjs": "a51a33cd",
|
|
93
93
|
"adapters/qoder/hooks/session-start.ts": "eeb089e0",
|
|
94
|
-
"adapters/qoder/hooks/stop-check.mjs": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
123
|
+
"adapters/trae/hooks/session-start.mjs": "059ace94",
|
|
124
124
|
"adapters/trae/hooks/session-start.ts": "d6b4fdc7",
|
|
125
|
-
"adapters/trae/hooks/stop-check.mjs": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
164
|
+
"adapters/vscode/hooks/session-start.mjs": "eab1d187",
|
|
165
165
|
"adapters/vscode/hooks/session-start.ts": "54b262b0",
|
|
166
|
-
"adapters/vscode/hooks/stop-check.mjs": "
|
|
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": "
|
|
177
|
-
"core/docs/ADD-governance-codex.md": "
|
|
178
|
-
"core/docs/ADD-governance-qoder-cn.md": "
|
|
179
|
-
"core/docs/ADD-governance-trae.md": "
|
|
180
|
-
"core/docs/ADD-governance-vscode-copilot.md": "
|
|
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": "
|
|
196
|
+
"core/governance/rules.ts": "4b03f432",
|
|
196
197
|
"core/governance/session-end.ts": "108fc3f6",
|
|
197
|
-
"core/governance/session-start-guard.ts": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
283
|
-
"core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite-fts5.sql": "
|
|
284
|
-
"core/scripts/mcp-server/shared/memory/retrieval/fts/sqlite.ts": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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,10 +318,11 @@
|
|
|
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": "
|
|
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",
|
|
@@ -329,28 +336,33 @@
|
|
|
329
336
|
"core/scripts/mcp-server/tools/gateway/index.ts": "cffe9783",
|
|
330
337
|
"core/scripts/mcp-server/tools/gateway/plan-resolve.ts": "5c742655",
|
|
331
338
|
"core/scripts/mcp-server/tools/gateway.backup": "65eae393",
|
|
332
|
-
"core/scripts/mcp-server/tools/hitl.ts": "
|
|
339
|
+
"core/scripts/mcp-server/tools/hitl.ts": "d811043d",
|
|
333
340
|
"core/scripts/mcp-server/tools/hook-event-report.ts": "1d825b3f",
|
|
334
|
-
"core/scripts/mcp-server/tools/index.ts": "
|
|
341
|
+
"core/scripts/mcp-server/tools/index.ts": "f0f8962b",
|
|
335
342
|
"core/scripts/mcp-server/tools/memory-compat.ts": "8812c5b7",
|
|
336
|
-
"core/scripts/mcp-server/tools/memory.ts": "
|
|
337
|
-
"core/scripts/mcp-server/tools/plan.ts": "
|
|
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",
|
|
338
346
|
"core/scripts/mcp-server/tools/quality.ts": "c4634453",
|
|
339
347
|
"core/scripts/mcp-server/tools/registrar.ts": "efd81b3a",
|
|
340
348
|
"core/scripts/mcp-server/tools/review.ts": "d114e522",
|
|
349
|
+
"core/scripts/mcp-server/tools/widget-probe.ts": "2091329b",
|
|
341
350
|
"core/scripts/mcp-server/types.ts": "6c5e60bc",
|
|
342
|
-
"core/scripts/mcp-server.ts": "
|
|
351
|
+
"core/scripts/mcp-server.ts": "223cda5e",
|
|
352
|
+
"core/scripts/memory/backfill-search-text.ts": "5e72575b",
|
|
353
|
+
"core/scripts/memory/memory-jobs.ts": "5b6dbf4e",
|
|
343
354
|
"core/scripts/package.json": "5a065fe7",
|
|
355
|
+
"core/scripts/plan-close.ts": "a755f7fa",
|
|
344
356
|
"core/scripts/plan-status-bridge.ts": "70c5d8b7",
|
|
345
|
-
"core/skills/add-paradigm/SKILL.md": "
|
|
346
|
-
"core/skills/session-init/SKILL.md": "
|
|
357
|
+
"core/skills/add-paradigm/SKILL.md": "736a0dd1",
|
|
358
|
+
"core/skills/session-init/SKILL.md": "3d3ab96e",
|
|
347
359
|
"core/specs/add-coder-npm-package/checklist.md": "ed92032c",
|
|
348
360
|
"core/specs/add-coder-npm-package/spec.md": "c7d0f235",
|
|
349
361
|
"core/specs/add-coder-npm-package/tasks.md": "c34301e5",
|
|
350
362
|
"core/templates/01-架构/《ADD开发工作路径与文档协同规范》.md": "c7e2ac6a",
|
|
351
363
|
"core/templates/TERMINOLOGY.md": "e9f4f781",
|
|
352
|
-
"core/templates/add-route-template-heavyweight.md": "
|
|
353
|
-
"core/templates/add-route-template.md": "
|
|
364
|
+
"core/templates/add-route-template-heavyweight.md": "6b6daa02",
|
|
365
|
+
"core/templates/add-route-template.md": "a8ad1560",
|
|
354
366
|
"core/templates/add-route-template.schema.json": "cca77a6e",
|
|
355
367
|
"core/templates/checklist-template.md": "8e3ddc28",
|
|
356
368
|
"core/templates/checklist-template.schema.json": "fb3a73e8",
|
|
@@ -358,7 +370,7 @@
|
|
|
358
370
|
"core/templates/collab-contract-template.schema.json": "ae0f482c",
|
|
359
371
|
"core/templates/fix-verification-template.md": "9c9ed175",
|
|
360
372
|
"core/templates/fix-verification-template.schema.json": "a18bc6a5",
|
|
361
|
-
"core/templates/handoff-multi-round-template.md": "
|
|
373
|
+
"core/templates/handoff-multi-round-template.md": "75886acc",
|
|
362
374
|
"core/templates/handoff-multi-round-template.schema.json": "c752a9dc",
|
|
363
375
|
"core/templates/handoff-multi-round.schema.json": "abed4220",
|
|
364
376
|
"core/templates/handoff-single-round-template.md": "dceb7c86",
|
|
@@ -383,7 +395,7 @@
|
|
|
383
395
|
"core/templates/review-template.schema.json": "abc2ece6",
|
|
384
396
|
"core/templates/runtime-report-template.md": "7b35208a",
|
|
385
397
|
"core/templates/runtime-report-template.schema.json": "6c1143e6",
|
|
386
|
-
"core/templates/simple-plan-template.md": "
|
|
398
|
+
"core/templates/simple-plan-template.md": "3c1478cf",
|
|
387
399
|
"core/templates/simple-plan-template.schema.json": "02718806",
|
|
388
400
|
"core/templates/spec-template.md": "619b01cc",
|
|
389
401
|
"core/templates/spec-template.schema.json": "9e5d530b",
|
|
@@ -407,5 +419,5 @@
|
|
|
407
419
|
"core/validation/validators/spec.ts": "a7ad1d24",
|
|
408
420
|
"core/validation/validators/tasks.ts": "cae46ddc",
|
|
409
421
|
"core/validation/validators/types.ts": "dafcdbdc",
|
|
410
|
-
"core/vocabulary/add-governance-vocabulary.md": "
|
|
422
|
+
"core/vocabulary/add-governance-vocabulary.md": "e87870b4"
|
|
411
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 ?? "
|
|
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 ?? "
|
|
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 ?? "
|
|
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))
|
|
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(
|
|
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
|
|
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
|
|
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 ?? "
|
|
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 ?? "
|
|
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 ?? "
|
|
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))
|
|
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(
|
|
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
|
|
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
|
|
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 ?? "
|
|
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 ?? "
|
|
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;
|