smart-claude-memory-mcp 2.1.0
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/.claude-plugin/plugin.json +38 -0
- package/CHANGELOG.md +52 -0
- package/LICENSE +21 -0
- package/README.md +790 -0
- package/dist/chunker.js +33 -0
- package/dist/chunker.js.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/curriculum/daemon.js +190 -0
- package/dist/curriculum/daemon.js.map +1 -0
- package/dist/curriculum/scanner.js +237 -0
- package/dist/curriculum/scanner.js.map +1 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/migrations.js +128 -0
- package/dist/lib/migrations.js.map +1 -0
- package/dist/ollama.js +59 -0
- package/dist/ollama.js.map +1 -0
- package/dist/project-detect.js +102 -0
- package/dist/project-detect.js.map +1 -0
- package/dist/project.js +26 -0
- package/dist/project.js.map +1 -0
- package/dist/sleep/daemon.js +215 -0
- package/dist/sleep/daemon.js.map +1 -0
- package/dist/sleep/miner.js +285 -0
- package/dist/sleep/miner.js.map +1 -0
- package/dist/supabase.js +405 -0
- package/dist/supabase.js.map +1 -0
- package/dist/telemetry/emit.js +19 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/dist/telemetry/pruner.js +141 -0
- package/dist/telemetry/pruner.js.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tools/backlog.js +599 -0
- package/dist/tools/backlog.js.map +1 -0
- package/dist/tools/batch-freeze-patterns.js +243 -0
- package/dist/tools/batch-freeze-patterns.js.map +1 -0
- package/dist/tools/bloat-audit.js +101 -0
- package/dist/tools/bloat-audit.js.map +1 -0
- package/dist/tools/checkpoint.js +259 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/compact.js +60 -0
- package/dist/tools/compact.js.map +1 -0
- package/dist/tools/conflict.js +102 -0
- package/dist/tools/conflict.js.map +1 -0
- package/dist/tools/curriculum.js +225 -0
- package/dist/tools/curriculum.js.map +1 -0
- package/dist/tools/frozen-cache.js +106 -0
- package/dist/tools/frozen-cache.js.map +1 -0
- package/dist/tools/health.js +368 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/hygiene.js +309 -0
- package/dist/tools/hygiene.js.map +1 -0
- package/dist/tools/image.js +107 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/list-global-patterns.js +101 -0
- package/dist/tools/list-global-patterns.js.map +1 -0
- package/dist/tools/orchestrator.js +113 -0
- package/dist/tools/orchestrator.js.map +1 -0
- package/dist/tools/policy.js +90 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/refactor.js +220 -0
- package/dist/tools/refactor.js.map +1 -0
- package/dist/tools/save.js +42 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/tools/search.js +189 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/setup.js +868 -0
- package/dist/tools/setup.js.map +1 -0
- package/dist/tools/shared-schemas.js +24 -0
- package/dist/tools/shared-schemas.js.map +1 -0
- package/dist/tools/skills.js +174 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/sleep.js +239 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/sovereign-constitution.js +319 -0
- package/dist/tools/sovereign-constitution.js.map +1 -0
- package/dist/tools/summarize.js +55 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/tools/sync.js +255 -0
- package/dist/tools/sync.js.map +1 -0
- package/dist/tools/system_dashboard.js +181 -0
- package/dist/tools/system_dashboard.js.map +1 -0
- package/dist/tools/update-rule.js +15 -0
- package/dist/tools/update-rule.js.map +1 -0
- package/dist/tools/verification.js +333 -0
- package/dist/tools/verification.js.map +1 -0
- package/dist/trajectory/daemon.js +270 -0
- package/dist/trajectory/daemon.js.map +1 -0
- package/dist/trajectory/stripper.js +124 -0
- package/dist/trajectory/stripper.js.map +1 -0
- package/dist/trajectory/summarizer.js +77 -0
- package/dist/trajectory/summarizer.js.map +1 -0
- package/dist/transactions/checkpoint.js +272 -0
- package/dist/transactions/checkpoint.js.map +1 -0
- package/dist/verification-gate.js +43 -0
- package/dist/verification-gate.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/hooks/README.md +54 -0
- package/hooks/md-policy.py +497 -0
- package/marketplace.json +13 -0
- package/package.json +66 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { resolve, join } from "node:path";
|
|
3
|
+
import { getPending } from "../verification-gate.js";
|
|
4
|
+
import { summarizeMemoryFile } from "./summarize.js";
|
|
5
|
+
import { addBacklog, listBacklog, updateBacklog, archiveDoneBacklog, listArchive, supabase, } from "../supabase.js";
|
|
6
|
+
import { currentProjectId, slugify, displayProjectName } from "../project.js";
|
|
7
|
+
import { basename } from "node:path";
|
|
8
|
+
import { auditBloat } from "./bloat-audit.js";
|
|
9
|
+
/** Lowest priority number wins (1 = highest). Ties broken by oldest-first. */
|
|
10
|
+
function pickNextTask(rows) {
|
|
11
|
+
if (rows.length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
return [...rows].sort((a, b) => a.priority - b.priority || Date.parse(a.created_at) - Date.parse(b.created_at))[0];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect the highest SESSION-N-REPORT.md in docs/session-reports/ and return
|
|
17
|
+
* N+1 for the next-session command block. Defaults to 1 if the directory is
|
|
18
|
+
* missing or empty. Implements the v2.1 Sovereign DNA "Dynamic Numbering" rule.
|
|
19
|
+
*/
|
|
20
|
+
async function nextSessionNumber(workspace) {
|
|
21
|
+
const reportsDir = join(workspace, "docs", "session-reports");
|
|
22
|
+
try {
|
|
23
|
+
const entries = await readdir(reportsDir);
|
|
24
|
+
let maxN = 0;
|
|
25
|
+
for (const name of entries) {
|
|
26
|
+
const m = name.match(/^SESSION-(\d+)-REPORT\.md$/i);
|
|
27
|
+
if (m) {
|
|
28
|
+
const n = parseInt(m[1], 10);
|
|
29
|
+
if (Number.isFinite(n) && n > maxN)
|
|
30
|
+
maxN = n;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return maxN + 1;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const PROGRESS_HEADER = "### 🚀 Recent Progress";
|
|
40
|
+
// ─── Living architecture sync ────────────────────────────────────────────
|
|
41
|
+
const ARCH_IGNORE = new Set([
|
|
42
|
+
"node_modules",
|
|
43
|
+
".git",
|
|
44
|
+
"dist",
|
|
45
|
+
"build",
|
|
46
|
+
"backups",
|
|
47
|
+
".next",
|
|
48
|
+
".nuxt",
|
|
49
|
+
".cache",
|
|
50
|
+
".turbo",
|
|
51
|
+
"coverage",
|
|
52
|
+
"__pycache__",
|
|
53
|
+
]);
|
|
54
|
+
const ARCH_HIDDEN_ALLOWLIST = new Set([
|
|
55
|
+
".env.example",
|
|
56
|
+
".gitignore",
|
|
57
|
+
".mcp.json",
|
|
58
|
+
".github",
|
|
59
|
+
".claude",
|
|
60
|
+
]);
|
|
61
|
+
const ARCH_MAX_DEPTH = 3;
|
|
62
|
+
const ARCH_MAX_CHILDREN = 25;
|
|
63
|
+
async function scanTree(dir, depth) {
|
|
64
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
65
|
+
const filtered = entries.filter((e) => {
|
|
66
|
+
if (ARCH_IGNORE.has(e.name))
|
|
67
|
+
return false;
|
|
68
|
+
if (e.name.startsWith(".") && !ARCH_HIDDEN_ALLOWLIST.has(e.name))
|
|
69
|
+
return false;
|
|
70
|
+
return true;
|
|
71
|
+
});
|
|
72
|
+
filtered.sort((a, b) => {
|
|
73
|
+
if (a.isDirectory() !== b.isDirectory())
|
|
74
|
+
return a.isDirectory() ? -1 : 1;
|
|
75
|
+
return a.name.localeCompare(b.name);
|
|
76
|
+
});
|
|
77
|
+
const head = filtered.slice(0, ARCH_MAX_CHILDREN);
|
|
78
|
+
const truncated = Math.max(0, filtered.length - ARCH_MAX_CHILDREN);
|
|
79
|
+
const children = [];
|
|
80
|
+
for (const e of head) {
|
|
81
|
+
if (e.isDirectory() && depth < ARCH_MAX_DEPTH) {
|
|
82
|
+
try {
|
|
83
|
+
children.push(await scanTree(join(dir, e.name), depth + 1));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
children.push({ name: e.name, type: "dir" });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
children.push({ name: e.name, type: e.isDirectory() ? "dir" : "file" });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
name: basename(dir),
|
|
95
|
+
type: "dir",
|
|
96
|
+
children,
|
|
97
|
+
truncated: truncated > 0 ? truncated : undefined,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function mermaidSafeLabel(s) {
|
|
101
|
+
return s.replace(/"/g, "'").replace(/[\[\]]/g, "");
|
|
102
|
+
}
|
|
103
|
+
function renderArchMermaid(root) {
|
|
104
|
+
const lines = ["flowchart TD"];
|
|
105
|
+
let counter = 0;
|
|
106
|
+
const nextId = () => `n${counter++}`;
|
|
107
|
+
function walk(node, parentId) {
|
|
108
|
+
const id = nextId();
|
|
109
|
+
const label = node.type === "dir" ? `${node.name}/` : node.name;
|
|
110
|
+
lines.push(` ${id}["${mermaidSafeLabel(label)}"]`);
|
|
111
|
+
if (parentId)
|
|
112
|
+
lines.push(` ${parentId} --> ${id}`);
|
|
113
|
+
if (node.children) {
|
|
114
|
+
for (const child of node.children)
|
|
115
|
+
walk(child, id);
|
|
116
|
+
if (node.truncated) {
|
|
117
|
+
const tId = nextId();
|
|
118
|
+
lines.push(` ${tId}["… (${node.truncated} more)"]`);
|
|
119
|
+
lines.push(` ${id} --> ${tId}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
walk(root, null);
|
|
124
|
+
return lines.join("\n");
|
|
125
|
+
}
|
|
126
|
+
const ARCH_MARKER_START = "<!-- MEMORY:ARCH:START -->";
|
|
127
|
+
const ARCH_MARKER_END = "<!-- MEMORY:ARCH:END -->";
|
|
128
|
+
export async function updateProjectArchitecture(projectId) {
|
|
129
|
+
const docPath = resolve(process.cwd(), "ARCHITECTURE.md");
|
|
130
|
+
try {
|
|
131
|
+
const cwdSlug = slugify(basename(process.cwd()) || "default");
|
|
132
|
+
if (cwdSlug !== projectId) {
|
|
133
|
+
return {
|
|
134
|
+
ok: true,
|
|
135
|
+
path: docPath,
|
|
136
|
+
updated: false,
|
|
137
|
+
warning: `Architecture sync skipped — cwd project '${cwdSlug}' does not match session_end project_id '${projectId}'.`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const tree = await scanTree(process.cwd(), 0);
|
|
141
|
+
const mermaid = renderArchMermaid(tree);
|
|
142
|
+
const innerBlock = "\n\n```mermaid\n" +
|
|
143
|
+
"%% Auto-generated. Do not edit between the MEMORY:ARCH markers.\n" +
|
|
144
|
+
mermaid +
|
|
145
|
+
"\n```\n\n";
|
|
146
|
+
let current = "";
|
|
147
|
+
try {
|
|
148
|
+
current = await readFile(docPath, "utf8");
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// file absent — we'll create it below
|
|
152
|
+
}
|
|
153
|
+
const startIdx = current.indexOf(ARCH_MARKER_START);
|
|
154
|
+
const endIdx = current.indexOf(ARCH_MARKER_END);
|
|
155
|
+
let updated;
|
|
156
|
+
if (startIdx >= 0 && endIdx > startIdx) {
|
|
157
|
+
// Replace only the content between the markers (exclusive of the marker lines).
|
|
158
|
+
const before = current.slice(0, startIdx + ARCH_MARKER_START.length);
|
|
159
|
+
const after = current.slice(endIdx);
|
|
160
|
+
updated = before + innerBlock + after;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// Markers not found — append a fresh auto-generated section at EOF.
|
|
164
|
+
const appended = "\n\n## File Architecture (auto-generated)\n\n" +
|
|
165
|
+
ARCH_MARKER_START +
|
|
166
|
+
innerBlock +
|
|
167
|
+
ARCH_MARKER_END +
|
|
168
|
+
"\n";
|
|
169
|
+
updated = current.trim() ? current.trimEnd() + appended : appended.trimStart();
|
|
170
|
+
}
|
|
171
|
+
await writeFile(docPath, updated, "utf8");
|
|
172
|
+
return { ok: true, path: docPath, updated: true };
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
return {
|
|
176
|
+
ok: false,
|
|
177
|
+
path: docPath,
|
|
178
|
+
warning: `Architecture sync failed: ${e.message}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Self-documenting session handover: rewrite or append the "Recent Progress"
|
|
184
|
+
* section of the project's local README.md with the last 5 archived tasks.
|
|
185
|
+
* Never throws — failures are returned as a warning so session_end still
|
|
186
|
+
* completes the archive.
|
|
187
|
+
*/
|
|
188
|
+
export async function updateLocalReadme(projectId) {
|
|
189
|
+
const readmePath = resolve(process.cwd(), "README.md");
|
|
190
|
+
try {
|
|
191
|
+
// Safety: skip when the MCP server's cwd doesn't match the session_end
|
|
192
|
+
// project — we'd otherwise overwrite the wrong repo's README.
|
|
193
|
+
const cwdSlug = slugify(basename(process.cwd()) || "default");
|
|
194
|
+
if (cwdSlug !== projectId) {
|
|
195
|
+
return {
|
|
196
|
+
ok: true,
|
|
197
|
+
path: readmePath,
|
|
198
|
+
updated: false,
|
|
199
|
+
warning: `README sync skipped — cwd project '${cwdSlug}' does not match session_end project_id '${projectId}'.`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const archived = await listArchive(projectId, { limit: 5 });
|
|
203
|
+
if (archived.length === 0) {
|
|
204
|
+
return {
|
|
205
|
+
ok: true,
|
|
206
|
+
path: readmePath,
|
|
207
|
+
updated: false,
|
|
208
|
+
warning: "No archived tasks yet; nothing to write.",
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const bullets = archived
|
|
212
|
+
.map((t) => `* [DONE] ${t.title} (archived at ${t.archived_at.slice(0, 10)}).`)
|
|
213
|
+
.join("\n");
|
|
214
|
+
const newSection = `${PROGRESS_HEADER}\n\n${bullets}`;
|
|
215
|
+
let current = "";
|
|
216
|
+
try {
|
|
217
|
+
current = await readFile(readmePath, "utf8");
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// README may not exist yet; we'll create one.
|
|
221
|
+
}
|
|
222
|
+
let updated;
|
|
223
|
+
const start = current.indexOf(PROGRESS_HEADER);
|
|
224
|
+
if (start >= 0) {
|
|
225
|
+
// Find the next markdown heading at level 1-3 after our section, or EOF.
|
|
226
|
+
const tail = current.slice(start + PROGRESS_HEADER.length);
|
|
227
|
+
const nextHeading = tail.match(/\n#{1,3}\s+\S/);
|
|
228
|
+
const sectionEnd = nextHeading && nextHeading.index !== undefined
|
|
229
|
+
? start + PROGRESS_HEADER.length + nextHeading.index
|
|
230
|
+
: current.length;
|
|
231
|
+
updated = current.slice(0, start) + newSection + current.slice(sectionEnd);
|
|
232
|
+
}
|
|
233
|
+
else if (current.trim()) {
|
|
234
|
+
updated = current.trimEnd() + "\n\n" + newSection + "\n";
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
updated = newSection + "\n";
|
|
238
|
+
}
|
|
239
|
+
// Inject or refresh the architecture Mermaid block in README too.
|
|
240
|
+
updated = await injectMermaidIntoReadme(updated, projectId);
|
|
241
|
+
await writeFile(readmePath, updated, "utf8");
|
|
242
|
+
return { ok: true, path: readmePath, updated: true };
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
return {
|
|
246
|
+
ok: false,
|
|
247
|
+
path: readmePath,
|
|
248
|
+
warning: `README sync failed: ${e.message}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const README_ARCH_HEADER = "### 🗺️ File Architecture";
|
|
253
|
+
/** Generate a fresh Mermaid flowchart for cwd and splice it into README. */
|
|
254
|
+
async function injectMermaidIntoReadme(readmeText, projectId) {
|
|
255
|
+
try {
|
|
256
|
+
const tree = await scanTree(process.cwd(), 0);
|
|
257
|
+
const mermaid = renderArchMermaid(tree);
|
|
258
|
+
const block = [
|
|
259
|
+
README_ARCH_HEADER,
|
|
260
|
+
"",
|
|
261
|
+
`_Auto-synced at ${new Date().toISOString()} for \`${displayProjectName(projectId)}\`._`,
|
|
262
|
+
"",
|
|
263
|
+
"```mermaid",
|
|
264
|
+
mermaid,
|
|
265
|
+
"```",
|
|
266
|
+
].join("\n");
|
|
267
|
+
const headerIdx = readmeText.indexOf(README_ARCH_HEADER);
|
|
268
|
+
if (headerIdx >= 0) {
|
|
269
|
+
// Replace from header until next ## / ### heading or EOF.
|
|
270
|
+
const tail = readmeText.slice(headerIdx + README_ARCH_HEADER.length);
|
|
271
|
+
const nextHeading = tail.match(/\n#{1,3}\s+\S/);
|
|
272
|
+
const end = nextHeading && nextHeading.index !== undefined
|
|
273
|
+
? headerIdx + README_ARCH_HEADER.length + nextHeading.index
|
|
274
|
+
: readmeText.length;
|
|
275
|
+
return readmeText.slice(0, headerIdx) + block + readmeText.slice(end);
|
|
276
|
+
}
|
|
277
|
+
// Append if not present.
|
|
278
|
+
return readmeText.trimEnd() + "\n\n" + block + "\n";
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Never let an arch-block failure break the README write.
|
|
282
|
+
return readmeText;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
286
|
+
export async function backfillArchiveChunkIds(projectId, dryRun) {
|
|
287
|
+
if (!projectId || typeof projectId !== "string") {
|
|
288
|
+
throw new Error("backfillArchiveChunkIds: projectId is required");
|
|
289
|
+
}
|
|
290
|
+
// 1. Scan archive_backlog rows missing chunk_id.
|
|
291
|
+
const { data: rows, error: scanErr } = await supabase
|
|
292
|
+
.from("archive_backlog")
|
|
293
|
+
.select("id, project_id, title, archived_at, metadata")
|
|
294
|
+
.eq("project_id", projectId)
|
|
295
|
+
.is("chunk_id", null)
|
|
296
|
+
.order("archived_at", { ascending: false });
|
|
297
|
+
if (scanErr) {
|
|
298
|
+
throw new Error(`[M4] backfillArchiveChunkIds: archive_backlog scan failed: ${scanErr.message}`);
|
|
299
|
+
}
|
|
300
|
+
const candidates = (rows ?? []);
|
|
301
|
+
let backfilled = 0;
|
|
302
|
+
let ambiguous = 0;
|
|
303
|
+
let skipped = 0;
|
|
304
|
+
for (const row of candidates) {
|
|
305
|
+
const metadata = row.metadata && typeof row.metadata === "object" && !Array.isArray(row.metadata)
|
|
306
|
+
? row.metadata
|
|
307
|
+
: null;
|
|
308
|
+
const checkpointRootRaw = metadata && typeof metadata.checkpoint_root_id !== "undefined"
|
|
309
|
+
? metadata.checkpoint_root_id
|
|
310
|
+
: null;
|
|
311
|
+
let resolvedChunkId = null;
|
|
312
|
+
// 2a. Primary path: metadata.checkpoint_root_id → terminal_committed_checkpoint.
|
|
313
|
+
if (checkpointRootRaw !== null) {
|
|
314
|
+
const rootId = typeof checkpointRootRaw === "number"
|
|
315
|
+
? checkpointRootRaw
|
|
316
|
+
: typeof checkpointRootRaw === "string" && /^\d+$/.test(checkpointRootRaw)
|
|
317
|
+
? Number.parseInt(checkpointRootRaw, 10)
|
|
318
|
+
: null;
|
|
319
|
+
if (rootId !== null && rootId > 0) {
|
|
320
|
+
const { data: rpcData, error: rpcErr } = await supabase.rpc("terminal_committed_checkpoint", {
|
|
321
|
+
p_project_id: projectId,
|
|
322
|
+
p_skill_id: null,
|
|
323
|
+
p_root_id: rootId,
|
|
324
|
+
});
|
|
325
|
+
if (rpcErr) {
|
|
326
|
+
// RPC missing (014 not applied) → skip this row, fall through to
|
|
327
|
+
// heuristic which will also fail and bump skipped.
|
|
328
|
+
console.log(`[M4] backfill: terminal_committed_checkpoint RPC failed for archive_backlog.id=${row.id}: ${rpcErr.message}`);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const scid = typeof rpcData === "number"
|
|
332
|
+
? rpcData
|
|
333
|
+
: Array.isArray(rpcData) && rpcData.length > 0 && typeof rpcData[0] === "number"
|
|
334
|
+
? rpcData[0]
|
|
335
|
+
: null;
|
|
336
|
+
if (scid !== null)
|
|
337
|
+
resolvedChunkId = scid;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// 2b. Heuristic fallback: search memory_chunks by title + ±1d window.
|
|
342
|
+
if (resolvedChunkId === null) {
|
|
343
|
+
const archivedAt = Date.parse(row.archived_at);
|
|
344
|
+
if (!Number.isFinite(archivedAt)) {
|
|
345
|
+
skipped++;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
const windowStart = new Date(archivedAt - ONE_DAY_MS).toISOString();
|
|
349
|
+
const windowEnd = new Date(archivedAt + ONE_DAY_MS).toISOString();
|
|
350
|
+
// Defensive title trim — long titles can blow the textSearch path.
|
|
351
|
+
const titleHint = row.title.slice(0, 120);
|
|
352
|
+
const { data: chunkMatches, error: chunkErr } = await supabase
|
|
353
|
+
.from("memory_chunks")
|
|
354
|
+
.select("id, created_at")
|
|
355
|
+
.eq("project_id", projectId)
|
|
356
|
+
.gte("created_at", windowStart)
|
|
357
|
+
.lte("created_at", windowEnd)
|
|
358
|
+
.ilike("content", `%${titleHint}%`)
|
|
359
|
+
.limit(3);
|
|
360
|
+
if (chunkErr) {
|
|
361
|
+
skipped++;
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
const matches = (chunkMatches ?? []);
|
|
365
|
+
if (matches.length === 0) {
|
|
366
|
+
skipped++;
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
if (matches.length > 1) {
|
|
370
|
+
ambiguous++;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
resolvedChunkId = matches[0].id;
|
|
374
|
+
}
|
|
375
|
+
if (resolvedChunkId === null) {
|
|
376
|
+
skipped++;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (dryRun) {
|
|
380
|
+
console.log(`[M4] backfill (dry_run): would set archive_backlog.id=${row.id}.chunk_id=${resolvedChunkId}`);
|
|
381
|
+
backfilled++;
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
const { error: updErr } = await supabase
|
|
385
|
+
.from("archive_backlog")
|
|
386
|
+
.update({ chunk_id: resolvedChunkId })
|
|
387
|
+
.eq("id", row.id)
|
|
388
|
+
.eq("project_id", projectId)
|
|
389
|
+
.is("chunk_id", null); // double-guard against races
|
|
390
|
+
if (updErr) {
|
|
391
|
+
console.log(`[M4] backfill: update failed for archive_backlog.id=${row.id}: ${updErr.message}`);
|
|
392
|
+
skipped++;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
console.log(`[M4] backfill: set archive_backlog.id=${row.id}.chunk_id=${resolvedChunkId}`);
|
|
396
|
+
backfilled++;
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
scanned: candidates.length,
|
|
400
|
+
backfilled,
|
|
401
|
+
ambiguous,
|
|
402
|
+
skipped,
|
|
403
|
+
dry_run: dryRun,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
export async function manageBacklog(args) {
|
|
407
|
+
const projectId = "project_id" in args && args.project_id ? args.project_id : currentProjectId;
|
|
408
|
+
switch (args.action) {
|
|
409
|
+
case "add": {
|
|
410
|
+
const row = await addBacklog(projectId, args.title, {
|
|
411
|
+
priority: args.priority,
|
|
412
|
+
notes: args.notes,
|
|
413
|
+
});
|
|
414
|
+
return { action: "add", project_id: projectId, task: row };
|
|
415
|
+
}
|
|
416
|
+
case "list": {
|
|
417
|
+
const rows = await listBacklog(projectId, { status: args.status });
|
|
418
|
+
return { action: "list", project_id: projectId, count: rows.length, tasks: rows };
|
|
419
|
+
}
|
|
420
|
+
case "update": {
|
|
421
|
+
const row = await updateBacklog(args.id, {
|
|
422
|
+
title: args.title,
|
|
423
|
+
status: args.status,
|
|
424
|
+
priority: args.priority,
|
|
425
|
+
notes: args.notes,
|
|
426
|
+
});
|
|
427
|
+
return { action: "update", task: row };
|
|
428
|
+
}
|
|
429
|
+
case "prune_done": {
|
|
430
|
+
const archived = await archiveDoneBacklog(projectId);
|
|
431
|
+
return { action: "prune_done", project_id: projectId, archived };
|
|
432
|
+
}
|
|
433
|
+
case "archive_list": {
|
|
434
|
+
const rows = await listArchive(projectId, { limit: args.limit ?? 50 });
|
|
435
|
+
return {
|
|
436
|
+
action: "archive_list",
|
|
437
|
+
project_id: projectId,
|
|
438
|
+
count: rows.length,
|
|
439
|
+
archived_tasks: rows,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
case "backfill_archive_chunks": {
|
|
443
|
+
// M4 Phase B: populate archive_backlog.chunk_id for legacy rows whose
|
|
444
|
+
// cloud_backlog carried metadata.checkpoint_root_id but predate the
|
|
445
|
+
// 014 archive_done_backlog patch. dry_run=true is a pure read.
|
|
446
|
+
const dryRun = args.dry_run ?? false;
|
|
447
|
+
const result = await backfillArchiveChunkIds(projectId, dryRun);
|
|
448
|
+
return {
|
|
449
|
+
action: "backfill_archive_chunks",
|
|
450
|
+
project_id: projectId,
|
|
451
|
+
...result,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
case "session_end": {
|
|
455
|
+
// BINDING GATE: refuse session_end when a manual-test verification is
|
|
456
|
+
// still pending. Handover artefacts should only be written after the
|
|
457
|
+
// user confirms the last edit is good.
|
|
458
|
+
const pendingGate = await getPending();
|
|
459
|
+
if (pendingGate) {
|
|
460
|
+
return {
|
|
461
|
+
action: "session_end",
|
|
462
|
+
refused: true,
|
|
463
|
+
reason: "Manual Test Gate is OPEN — session_end is blocked. Call confirm_verification({success:true}) after validating the last edit, then retry session_end.",
|
|
464
|
+
pending_gate: pendingGate,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
const [todo, inProg, blocked, done] = await Promise.all([
|
|
468
|
+
listBacklog(projectId, { status: "todo" }),
|
|
469
|
+
listBacklog(projectId, { status: "in_progress" }),
|
|
470
|
+
listBacklog(projectId, { status: "blocked" }),
|
|
471
|
+
listBacklog(projectId, { status: "done" }),
|
|
472
|
+
]);
|
|
473
|
+
const archived = await archiveDoneBacklog(projectId);
|
|
474
|
+
// Living Documentation: README progress log + Mermaid file-tree +
|
|
475
|
+
// optional MEMORY.md summarization. All run in parallel (different
|
|
476
|
+
// files) so total session_end latency stays close to the slowest one.
|
|
477
|
+
const [readmeSync, architectureSync, memorySummary] = await Promise.all([
|
|
478
|
+
updateLocalReadme(projectId),
|
|
479
|
+
updateProjectArchitecture(projectId),
|
|
480
|
+
maybeSummarizeMemoryFile(),
|
|
481
|
+
]);
|
|
482
|
+
const next = pickNextTask([...todo, ...inProg, ...blocked]);
|
|
483
|
+
const nextTitle = next?.title ?? "backlog is empty — pick a new task";
|
|
484
|
+
const resumePrompt = `search_memory({ query: "Active Backlog", project_id: "${projectId}" }) ` +
|
|
485
|
+
`-> Reviewing pending tasks. Next up: ${nextTitle}.`;
|
|
486
|
+
// v1.1.4 Architecture Guard / Automatic Session Handoff:
|
|
487
|
+
// Build a copy-paste-ready Markdown block the agent posts verbatim as
|
|
488
|
+
// its final message. Keep the body minimal (3 lines) so it survives a
|
|
489
|
+
// copy through any terminal. Triple-backticks inside the JSON string
|
|
490
|
+
// are emitted as-is; the agent's renderer interprets them when posted.
|
|
491
|
+
const nextN = await nextSessionNumber(process.cwd());
|
|
492
|
+
// Sovereign Purge audit — surface the recommendation BEFORE the
|
|
493
|
+
// copy-paste block so the next agent boot sees the warning first.
|
|
494
|
+
let bloatAuditResult = {
|
|
495
|
+
bloat_audit: {
|
|
496
|
+
threshold: 3000,
|
|
497
|
+
claude_md: { path: null, tokens: 0, bloated: false },
|
|
498
|
+
hidden_memory: { path: null, tokens: 0, bloated: false, found: false },
|
|
499
|
+
},
|
|
500
|
+
sovereign_purge_recommendation: null,
|
|
501
|
+
};
|
|
502
|
+
try {
|
|
503
|
+
bloatAuditResult = await auditBloat(process.cwd());
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
/* keep defaults */
|
|
507
|
+
}
|
|
508
|
+
const purgeWarning = bloatAuditResult.sovereign_purge_recommendation
|
|
509
|
+
? "> ⚠️ Sovereign Purge recommended at next boot — see init_project response.\n\n"
|
|
510
|
+
: "";
|
|
511
|
+
const nextSessionCommandMarkdown = purgeWarning + [
|
|
512
|
+
"## 🚀 NEXT SESSION START COMMAND (Copy-Paste)",
|
|
513
|
+
"",
|
|
514
|
+
"```text",
|
|
515
|
+
"init_project()",
|
|
516
|
+
"check_system_health()",
|
|
517
|
+
`search_memory({ query: "Active Backlog", project_id: "${projectId}", k: 10 })`,
|
|
518
|
+
`# Then read docs/NEXT-SESSION-PROMPT.md for the full Session ${nextN} plan.`,
|
|
519
|
+
"```",
|
|
520
|
+
].join("\n");
|
|
521
|
+
const humanSummary = [
|
|
522
|
+
`Session ended.`,
|
|
523
|
+
`${done.length} task${done.length === 1 ? "" : "s"} archived.`,
|
|
524
|
+
`Remaining: ${todo.length} todo · ${inProg.length} in-progress · ${blocked.length} blocked.`,
|
|
525
|
+
next ? `Next up: [P${next.priority}] ${next.title}` : `Backlog is empty.`,
|
|
526
|
+
].join(" ");
|
|
527
|
+
return {
|
|
528
|
+
action: "session_end",
|
|
529
|
+
project_id: projectId,
|
|
530
|
+
human_summary: humanSummary,
|
|
531
|
+
progress_report: {
|
|
532
|
+
completed_count: done.length,
|
|
533
|
+
completed_titles: done.map((t) => t.title),
|
|
534
|
+
remaining: {
|
|
535
|
+
todo: todo.length,
|
|
536
|
+
in_progress: inProg.length,
|
|
537
|
+
blocked: blocked.length,
|
|
538
|
+
},
|
|
539
|
+
},
|
|
540
|
+
archived,
|
|
541
|
+
next_task: next
|
|
542
|
+
? {
|
|
543
|
+
id: next.id,
|
|
544
|
+
title: next.title,
|
|
545
|
+
priority: next.priority,
|
|
546
|
+
status: next.status,
|
|
547
|
+
notes: next.notes,
|
|
548
|
+
}
|
|
549
|
+
: null,
|
|
550
|
+
resume_prompt: resumePrompt,
|
|
551
|
+
next_session_command_markdown: nextSessionCommandMarkdown,
|
|
552
|
+
readme_sync: readmeSync,
|
|
553
|
+
architecture_sync: architectureSync,
|
|
554
|
+
memory_summary: memorySummary,
|
|
555
|
+
bloat_audit: bloatAuditResult.bloat_audit,
|
|
556
|
+
sovereign_purge_recommendation: bloatAuditResult.sovereign_purge_recommendation,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
const BYTES_PER_TOKEN = 4;
|
|
562
|
+
const MEMORY_SOFT_LIMIT_TOKENS = 3000;
|
|
563
|
+
/** If MEMORY.md exists in cwd and exceeds the soft token limit, run the LLM
|
|
564
|
+
* summarizer on it so the next session starts with a lean context. Never
|
|
565
|
+
* throws — the session_end call path is resilient to this helper's failure. */
|
|
566
|
+
async function maybeSummarizeMemoryFile() {
|
|
567
|
+
const path = resolve(process.cwd(), "MEMORY.md");
|
|
568
|
+
try {
|
|
569
|
+
const st = await stat(path);
|
|
570
|
+
const estTokens = Math.ceil(st.size / BYTES_PER_TOKEN);
|
|
571
|
+
if (estTokens <= MEMORY_SOFT_LIMIT_TOKENS) {
|
|
572
|
+
return {
|
|
573
|
+
action: "skipped",
|
|
574
|
+
reason: `MEMORY.md is ${estTokens} tokens (under ${MEMORY_SOFT_LIMIT_TOKENS} limit).`,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
const r = await summarizeMemoryFile({
|
|
578
|
+
file_path: path,
|
|
579
|
+
target_tokens: MEMORY_SOFT_LIMIT_TOKENS,
|
|
580
|
+
});
|
|
581
|
+
if (r.action === "written") {
|
|
582
|
+
return {
|
|
583
|
+
action: "summarized",
|
|
584
|
+
original_tokens: r.original_tokens_estimated ?? 0,
|
|
585
|
+
compressed_tokens: r.compressed_tokens_estimated ?? 0,
|
|
586
|
+
reduction_pct: r.reduction_pct ?? 0,
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
return { action: "skipped", reason: `summarizer returned '${r.action}'` };
|
|
590
|
+
}
|
|
591
|
+
catch (e) {
|
|
592
|
+
// The common case here is "no MEMORY.md in cwd" — that's a skip, not an error.
|
|
593
|
+
if (e?.code === "ENOENT") {
|
|
594
|
+
return { action: "skipped", reason: "No MEMORY.md in current working directory." };
|
|
595
|
+
}
|
|
596
|
+
return { action: "error", error: e.message };
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
//# sourceMappingURL=backlog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../src/tools/backlog.ts"],"names":[],"mappings":"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"}
|