@cleocode/core 2026.4.38 → 2026.4.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/dist/index.js +458 -47
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts +15 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/internal.d.ts +1 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/memory/brain-lifecycle.d.ts +2 -0
- package/dist/memory/brain-lifecycle.d.ts.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/init.ts +90 -59
- package/src/internal.ts +7 -0
- package/src/memory/__tests__/{graph-memory-bridge.test.ts → graph-memory-bridge-integration.test.ts} +20 -1
- package/src/memory/__tests__/observer-reflector.test.ts +10 -5
- package/src/memory/__tests__/sleep-consolidation.test.ts +5 -1
- package/src/memory/brain-lifecycle.ts +13 -0
- package/src/tasks/complete.ts +20 -0
- package/src/upgrade.ts +24 -1
package/dist/index.js
CHANGED
|
@@ -42360,6 +42360,390 @@ var init_brain_consolidator = __esm({
|
|
|
42360
42360
|
}
|
|
42361
42361
|
});
|
|
42362
42362
|
|
|
42363
|
+
// packages/core/src/memory/graph-memory-bridge.ts
|
|
42364
|
+
var graph_memory_bridge_exports = {};
|
|
42365
|
+
__export(graph_memory_bridge_exports, {
|
|
42366
|
+
autoLinkMemories: () => autoLinkMemories,
|
|
42367
|
+
linkMemoryToCode: () => linkMemoryToCode,
|
|
42368
|
+
listCodeLinks: () => listCodeLinks,
|
|
42369
|
+
queryCodeForMemory: () => queryCodeForMemory,
|
|
42370
|
+
queryMemoriesForCode: () => queryMemoriesForCode
|
|
42371
|
+
});
|
|
42372
|
+
function extractFilePaths(text3) {
|
|
42373
|
+
const paths = /* @__PURE__ */ new Set();
|
|
42374
|
+
for (const m of text3.matchAll(FILE_PATH_PATTERN)) {
|
|
42375
|
+
const p = m[1];
|
|
42376
|
+
if (p) paths.add(p);
|
|
42377
|
+
}
|
|
42378
|
+
return Array.from(paths);
|
|
42379
|
+
}
|
|
42380
|
+
function extractSymbolCandidates(text3) {
|
|
42381
|
+
const syms = /* @__PURE__ */ new Set();
|
|
42382
|
+
for (const m of text3.matchAll(SYMBOL_PATTERN)) {
|
|
42383
|
+
const s = m[1];
|
|
42384
|
+
if (s && s.length >= 4 && !SYMBOL_STOP_WORDS.has(s.toLowerCase())) {
|
|
42385
|
+
syms.add(s);
|
|
42386
|
+
}
|
|
42387
|
+
}
|
|
42388
|
+
return Array.from(syms);
|
|
42389
|
+
}
|
|
42390
|
+
function metadataText(metaJson) {
|
|
42391
|
+
if (!metaJson) return "";
|
|
42392
|
+
try {
|
|
42393
|
+
const obj = JSON.parse(metaJson);
|
|
42394
|
+
return Object.values(obj).filter((v) => typeof v === "string").join(" ");
|
|
42395
|
+
} catch {
|
|
42396
|
+
return "";
|
|
42397
|
+
}
|
|
42398
|
+
}
|
|
42399
|
+
async function linkMemoryToCode(projectRoot, memoryId, codeSymbol) {
|
|
42400
|
+
try {
|
|
42401
|
+
const brainDb = await getBrainDb(projectRoot);
|
|
42402
|
+
await getNexusDb();
|
|
42403
|
+
const nexusNative = getNexusNativeDb();
|
|
42404
|
+
if (!nexusNative) return false;
|
|
42405
|
+
const nexusNode = nexusNative.prepare("SELECT id, label, file_path, kind FROM nexus_nodes WHERE id = ? LIMIT 1").get(codeSymbol);
|
|
42406
|
+
if (!nexusNode) return false;
|
|
42407
|
+
const now = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
|
|
42408
|
+
const idParts = memoryId.split(":");
|
|
42409
|
+
const nodeType = idParts[0] ?? "observation";
|
|
42410
|
+
await brainDb.insert(brainPageNodes).values({
|
|
42411
|
+
id: memoryId,
|
|
42412
|
+
nodeType,
|
|
42413
|
+
label: memoryId,
|
|
42414
|
+
qualityScore: 0.5,
|
|
42415
|
+
contentHash: null,
|
|
42416
|
+
lastActivityAt: now,
|
|
42417
|
+
createdAt: now,
|
|
42418
|
+
updatedAt: now
|
|
42419
|
+
}).onConflictDoUpdate({
|
|
42420
|
+
target: brainPageNodes.id,
|
|
42421
|
+
set: { lastActivityAt: now, updatedAt: now }
|
|
42422
|
+
});
|
|
42423
|
+
await brainDb.insert(brainPageEdges).values({
|
|
42424
|
+
fromId: memoryId,
|
|
42425
|
+
toId: codeSymbol,
|
|
42426
|
+
edgeType: "code_reference",
|
|
42427
|
+
weight: 1,
|
|
42428
|
+
provenance: "manual",
|
|
42429
|
+
createdAt: now
|
|
42430
|
+
}).onConflictDoNothing();
|
|
42431
|
+
return true;
|
|
42432
|
+
} catch (err) {
|
|
42433
|
+
console.warn("[graph-memory-bridge] linkMemoryToCode failed:", err);
|
|
42434
|
+
return false;
|
|
42435
|
+
}
|
|
42436
|
+
}
|
|
42437
|
+
async function autoLinkMemories(projectRoot) {
|
|
42438
|
+
const result = { scanned: 0, linked: 0, alreadyLinked: 0, links: [] };
|
|
42439
|
+
try {
|
|
42440
|
+
await getBrainDb(projectRoot);
|
|
42441
|
+
const brainNative = getBrainNativeDb();
|
|
42442
|
+
await getNexusDb();
|
|
42443
|
+
const nexusNative = getNexusNativeDb();
|
|
42444
|
+
if (!brainNative || !nexusNative) return result;
|
|
42445
|
+
const brainNodes = typedAll(
|
|
42446
|
+
brainNative.prepare(`
|
|
42447
|
+
SELECT id, node_type, label, quality_score, metadata_json
|
|
42448
|
+
FROM brain_page_nodes
|
|
42449
|
+
WHERE node_type IN ('observation', 'decision', 'pattern', 'learning')
|
|
42450
|
+
AND quality_score >= 0.3
|
|
42451
|
+
ORDER BY quality_score DESC
|
|
42452
|
+
LIMIT 500
|
|
42453
|
+
`)
|
|
42454
|
+
);
|
|
42455
|
+
result.scanned = brainNodes.length;
|
|
42456
|
+
if (brainNodes.length === 0) return result;
|
|
42457
|
+
const nexusNodes2 = typedAll(
|
|
42458
|
+
nexusNative.prepare(`
|
|
42459
|
+
SELECT id, label, name, file_path, kind
|
|
42460
|
+
FROM nexus_nodes
|
|
42461
|
+
WHERE kind NOT IN ('community', 'process', 'folder')
|
|
42462
|
+
LIMIT 20000
|
|
42463
|
+
`)
|
|
42464
|
+
);
|
|
42465
|
+
if (nexusNodes2.length === 0) return result;
|
|
42466
|
+
const byFilePath = /* @__PURE__ */ new Map();
|
|
42467
|
+
const byNameExact = /* @__PURE__ */ new Map();
|
|
42468
|
+
const byNameLower = /* @__PURE__ */ new Map();
|
|
42469
|
+
for (const node of nexusNodes2) {
|
|
42470
|
+
if (node.file_path) {
|
|
42471
|
+
const fp = node.file_path.toLowerCase();
|
|
42472
|
+
const existing = byFilePath.get(fp) ?? [];
|
|
42473
|
+
existing.push(node);
|
|
42474
|
+
byFilePath.set(fp, existing);
|
|
42475
|
+
}
|
|
42476
|
+
if (node.name) {
|
|
42477
|
+
const exact = byNameExact.get(node.name) ?? [];
|
|
42478
|
+
exact.push(node);
|
|
42479
|
+
byNameExact.set(node.name, exact);
|
|
42480
|
+
const lower = node.name.toLowerCase();
|
|
42481
|
+
const fuzzy = byNameLower.get(lower) ?? [];
|
|
42482
|
+
fuzzy.push(node);
|
|
42483
|
+
byNameLower.set(lower, fuzzy);
|
|
42484
|
+
}
|
|
42485
|
+
}
|
|
42486
|
+
const now = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
|
|
42487
|
+
const existingEdges = /* @__PURE__ */ new Set();
|
|
42488
|
+
const rawEdges = typedAll(
|
|
42489
|
+
brainNative.prepare(`
|
|
42490
|
+
SELECT from_id, to_id FROM brain_page_edges WHERE edge_type = 'code_reference'
|
|
42491
|
+
`)
|
|
42492
|
+
);
|
|
42493
|
+
for (const e of rawEdges) {
|
|
42494
|
+
existingEdges.add(`${e.from_id}|${e.to_id}`);
|
|
42495
|
+
}
|
|
42496
|
+
for (const brainNode of brainNodes) {
|
|
42497
|
+
const corpus = `${brainNode.label} ${metadataText(brainNode.metadata_json)}`;
|
|
42498
|
+
const filePaths = extractFilePaths(corpus);
|
|
42499
|
+
const symbolCandidates = extractSymbolCandidates(corpus);
|
|
42500
|
+
const candidates = [];
|
|
42501
|
+
for (const fp of filePaths) {
|
|
42502
|
+
const matches = byFilePath.get(fp.toLowerCase());
|
|
42503
|
+
if (matches) {
|
|
42504
|
+
for (const n of matches) {
|
|
42505
|
+
candidates.push({ nexusNode: n, strategy: "exact-file", weight: 1 });
|
|
42506
|
+
}
|
|
42507
|
+
}
|
|
42508
|
+
}
|
|
42509
|
+
for (const sym of symbolCandidates) {
|
|
42510
|
+
const exactMatches = byNameExact.get(sym);
|
|
42511
|
+
if (exactMatches) {
|
|
42512
|
+
for (const n of exactMatches) {
|
|
42513
|
+
candidates.push({ nexusNode: n, strategy: "exact-symbol", weight: 1 });
|
|
42514
|
+
}
|
|
42515
|
+
}
|
|
42516
|
+
}
|
|
42517
|
+
const exactSymSet = new Set(
|
|
42518
|
+
symbolCandidates.flatMap((s) => byNameExact.get(s) ?? []).map((n) => n.id)
|
|
42519
|
+
);
|
|
42520
|
+
for (const sym of symbolCandidates) {
|
|
42521
|
+
if (sym.length < 5) continue;
|
|
42522
|
+
const lower = sym.toLowerCase();
|
|
42523
|
+
const fuzzyMatches = byNameLower.get(lower);
|
|
42524
|
+
if (fuzzyMatches) {
|
|
42525
|
+
for (const n of fuzzyMatches) {
|
|
42526
|
+
if (!exactSymSet.has(n.id)) {
|
|
42527
|
+
candidates.push({ nexusNode: n, strategy: "fuzzy-symbol", weight: 0.6 });
|
|
42528
|
+
}
|
|
42529
|
+
}
|
|
42530
|
+
}
|
|
42531
|
+
}
|
|
42532
|
+
const bestByNexusId = /* @__PURE__ */ new Map();
|
|
42533
|
+
for (const c of candidates) {
|
|
42534
|
+
const existing = bestByNexusId.get(c.nexusNode.id);
|
|
42535
|
+
if (!existing || c.weight > existing.weight) {
|
|
42536
|
+
bestByNexusId.set(c.nexusNode.id, c);
|
|
42537
|
+
}
|
|
42538
|
+
}
|
|
42539
|
+
const sortedCandidates = Array.from(bestByNexusId.values()).sort((a, b) => b.weight - a.weight).slice(0, 10);
|
|
42540
|
+
for (const { nexusNode, strategy, weight } of sortedCandidates) {
|
|
42541
|
+
const edgeKey = `${brainNode.id}|${nexusNode.id}`;
|
|
42542
|
+
if (existingEdges.has(edgeKey)) {
|
|
42543
|
+
result.alreadyLinked++;
|
|
42544
|
+
continue;
|
|
42545
|
+
}
|
|
42546
|
+
brainNative.prepare(`
|
|
42547
|
+
INSERT OR IGNORE INTO brain_page_nodes
|
|
42548
|
+
(id, node_type, label, quality_score, content_hash, metadata_json, last_activity_at, created_at, updated_at)
|
|
42549
|
+
VALUES (?, ?, ?, ?, NULL, NULL, ?, ?, ?)
|
|
42550
|
+
`).run(
|
|
42551
|
+
brainNode.id,
|
|
42552
|
+
brainNode.node_type,
|
|
42553
|
+
brainNode.label,
|
|
42554
|
+
brainNode.quality_score,
|
|
42555
|
+
now,
|
|
42556
|
+
now,
|
|
42557
|
+
now
|
|
42558
|
+
);
|
|
42559
|
+
try {
|
|
42560
|
+
brainNative.prepare(`
|
|
42561
|
+
INSERT OR IGNORE INTO brain_page_edges
|
|
42562
|
+
(from_id, to_id, edge_type, weight, provenance, created_at)
|
|
42563
|
+
VALUES (?, ?, 'code_reference', ?, ?, ?)
|
|
42564
|
+
`).run(brainNode.id, nexusNode.id, weight, `auto:${strategy}`, now);
|
|
42565
|
+
existingEdges.add(edgeKey);
|
|
42566
|
+
result.linked++;
|
|
42567
|
+
result.links.push({
|
|
42568
|
+
brainNodeId: brainNode.id,
|
|
42569
|
+
nexusNodeId: nexusNode.id,
|
|
42570
|
+
nexusLabel: nexusNode.label,
|
|
42571
|
+
matchStrategy: strategy,
|
|
42572
|
+
weight
|
|
42573
|
+
});
|
|
42574
|
+
} catch (edgeErr) {
|
|
42575
|
+
console.warn("[graph-memory-bridge] edge insert failed:", edgeErr);
|
|
42576
|
+
}
|
|
42577
|
+
}
|
|
42578
|
+
}
|
|
42579
|
+
} catch (err) {
|
|
42580
|
+
console.warn("[graph-memory-bridge] autoLinkMemories failed:", err);
|
|
42581
|
+
}
|
|
42582
|
+
return result;
|
|
42583
|
+
}
|
|
42584
|
+
async function queryMemoriesForCode(projectRoot, symbol2) {
|
|
42585
|
+
const result = { nexusNodeId: symbol2, memories: [] };
|
|
42586
|
+
try {
|
|
42587
|
+
await getBrainDb(projectRoot);
|
|
42588
|
+
const brainNative = getBrainNativeDb();
|
|
42589
|
+
if (!brainNative) return result;
|
|
42590
|
+
const rows = typedAll(
|
|
42591
|
+
brainNative.prepare(`
|
|
42592
|
+
SELECT n.id, n.node_type, n.label, n.quality_score,
|
|
42593
|
+
e.weight, e.provenance
|
|
42594
|
+
FROM brain_page_edges e
|
|
42595
|
+
JOIN brain_page_nodes n ON n.id = e.from_id
|
|
42596
|
+
WHERE e.to_id = ?
|
|
42597
|
+
AND e.edge_type = 'code_reference'
|
|
42598
|
+
ORDER BY e.weight DESC, n.quality_score DESC
|
|
42599
|
+
LIMIT 50
|
|
42600
|
+
`),
|
|
42601
|
+
symbol2
|
|
42602
|
+
);
|
|
42603
|
+
result.memories = rows.map((r) => ({
|
|
42604
|
+
nodeId: r.id,
|
|
42605
|
+
nodeType: r.node_type,
|
|
42606
|
+
label: r.label,
|
|
42607
|
+
qualityScore: r.quality_score,
|
|
42608
|
+
edgeWeight: r.weight,
|
|
42609
|
+
matchStrategy: r.provenance?.replace("auto:", "") ?? "manual"
|
|
42610
|
+
}));
|
|
42611
|
+
} catch (err) {
|
|
42612
|
+
console.warn("[graph-memory-bridge] queryMemoriesForCode failed:", err);
|
|
42613
|
+
}
|
|
42614
|
+
return result;
|
|
42615
|
+
}
|
|
42616
|
+
async function queryCodeForMemory(projectRoot, memoryId) {
|
|
42617
|
+
const result = { brainNodeId: memoryId, codeNodes: [] };
|
|
42618
|
+
try {
|
|
42619
|
+
await getBrainDb(projectRoot);
|
|
42620
|
+
const brainNative = getBrainNativeDb();
|
|
42621
|
+
await getNexusDb();
|
|
42622
|
+
const nexusNative = getNexusNativeDb();
|
|
42623
|
+
if (!brainNative || !nexusNative) return result;
|
|
42624
|
+
const brainEdges = typedAll(
|
|
42625
|
+
brainNative.prepare(`
|
|
42626
|
+
SELECT to_id, weight, provenance
|
|
42627
|
+
FROM brain_page_edges
|
|
42628
|
+
WHERE from_id = ?
|
|
42629
|
+
AND edge_type = 'code_reference'
|
|
42630
|
+
ORDER BY weight DESC
|
|
42631
|
+
LIMIT 50
|
|
42632
|
+
`),
|
|
42633
|
+
memoryId
|
|
42634
|
+
);
|
|
42635
|
+
if (brainEdges.length === 0) return result;
|
|
42636
|
+
for (const edge of brainEdges) {
|
|
42637
|
+
const nexusNode = nexusNative.prepare("SELECT id, label, file_path, kind FROM nexus_nodes WHERE id = ? LIMIT 1").get(edge.to_id);
|
|
42638
|
+
if (nexusNode) {
|
|
42639
|
+
result.codeNodes.push({
|
|
42640
|
+
nexusNodeId: nexusNode.id,
|
|
42641
|
+
label: nexusNode.label,
|
|
42642
|
+
filePath: nexusNode.file_path,
|
|
42643
|
+
kind: nexusNode.kind,
|
|
42644
|
+
edgeWeight: edge.weight,
|
|
42645
|
+
matchStrategy: edge.provenance?.replace("auto:", "") ?? "manual"
|
|
42646
|
+
});
|
|
42647
|
+
}
|
|
42648
|
+
}
|
|
42649
|
+
} catch (err) {
|
|
42650
|
+
console.warn("[graph-memory-bridge] queryCodeForMemory failed:", err);
|
|
42651
|
+
}
|
|
42652
|
+
return result;
|
|
42653
|
+
}
|
|
42654
|
+
async function listCodeLinks(projectRoot, limit = 100) {
|
|
42655
|
+
const entries = [];
|
|
42656
|
+
try {
|
|
42657
|
+
await getBrainDb(projectRoot);
|
|
42658
|
+
const brainNative = getBrainNativeDb();
|
|
42659
|
+
await getNexusDb();
|
|
42660
|
+
const nexusNative = getNexusNativeDb();
|
|
42661
|
+
if (!brainNative || !nexusNative) return entries;
|
|
42662
|
+
const rows = typedAll(
|
|
42663
|
+
brainNative.prepare(`
|
|
42664
|
+
SELECT e.from_id, e.to_id, e.weight, e.created_at,
|
|
42665
|
+
n.node_type, n.label
|
|
42666
|
+
FROM brain_page_edges e
|
|
42667
|
+
JOIN brain_page_nodes n ON n.id = e.from_id
|
|
42668
|
+
WHERE e.edge_type = 'code_reference'
|
|
42669
|
+
ORDER BY e.weight DESC, e.created_at DESC
|
|
42670
|
+
LIMIT ?
|
|
42671
|
+
`),
|
|
42672
|
+
limit
|
|
42673
|
+
);
|
|
42674
|
+
for (const row of rows) {
|
|
42675
|
+
const nexusNode = nexusNative.prepare("SELECT id, label, file_path, kind FROM nexus_nodes WHERE id = ? LIMIT 1").get(row.to_id);
|
|
42676
|
+
entries.push({
|
|
42677
|
+
brainNodeId: row.from_id,
|
|
42678
|
+
brainNodeType: row.node_type,
|
|
42679
|
+
brainNodeLabel: row.label,
|
|
42680
|
+
nexusNodeId: row.to_id,
|
|
42681
|
+
nexusNodeLabel: nexusNode?.label ?? row.to_id,
|
|
42682
|
+
filePath: nexusNode?.file_path ?? null,
|
|
42683
|
+
kind: nexusNode?.kind ?? "unknown",
|
|
42684
|
+
weight: row.weight,
|
|
42685
|
+
createdAt: row.created_at
|
|
42686
|
+
});
|
|
42687
|
+
}
|
|
42688
|
+
} catch (err) {
|
|
42689
|
+
console.warn("[graph-memory-bridge] listCodeLinks failed:", err);
|
|
42690
|
+
}
|
|
42691
|
+
return entries;
|
|
42692
|
+
}
|
|
42693
|
+
var FILE_PATH_PATTERN, SYMBOL_PATTERN, SYMBOL_STOP_WORDS;
|
|
42694
|
+
var init_graph_memory_bridge = __esm({
|
|
42695
|
+
"packages/core/src/memory/graph-memory-bridge.ts"() {
|
|
42696
|
+
"use strict";
|
|
42697
|
+
init_brain_schema();
|
|
42698
|
+
init_brain_sqlite();
|
|
42699
|
+
init_nexus_sqlite();
|
|
42700
|
+
init_typed_query();
|
|
42701
|
+
FILE_PATH_PATTERN = /(?:^|\s|['"`(])([a-zA-Z0-9_\-./]+\.(?:ts|tsx|js|jsx|rs|go|py|mjs|cjs))(?:$|\s|['"`)])/g;
|
|
42702
|
+
SYMBOL_PATTERN = /\b([a-zA-Z_][a-zA-Z0-9_]*(?:[A-Z][a-zA-Z0-9_]*)+|[a-zA-Z_]{4,}[a-zA-Z0-9_]*)\b/g;
|
|
42703
|
+
SYMBOL_STOP_WORDS = /* @__PURE__ */ new Set([
|
|
42704
|
+
"true",
|
|
42705
|
+
"false",
|
|
42706
|
+
"null",
|
|
42707
|
+
"undefined",
|
|
42708
|
+
"const",
|
|
42709
|
+
"async",
|
|
42710
|
+
"await",
|
|
42711
|
+
"return",
|
|
42712
|
+
"export",
|
|
42713
|
+
"import",
|
|
42714
|
+
"from",
|
|
42715
|
+
"type",
|
|
42716
|
+
"interface",
|
|
42717
|
+
"function",
|
|
42718
|
+
"class",
|
|
42719
|
+
"this",
|
|
42720
|
+
"super",
|
|
42721
|
+
"extends",
|
|
42722
|
+
"implements",
|
|
42723
|
+
"with",
|
|
42724
|
+
"that",
|
|
42725
|
+
"then",
|
|
42726
|
+
"when",
|
|
42727
|
+
"have",
|
|
42728
|
+
"been",
|
|
42729
|
+
"will",
|
|
42730
|
+
"should",
|
|
42731
|
+
"could",
|
|
42732
|
+
"would",
|
|
42733
|
+
"error",
|
|
42734
|
+
"result",
|
|
42735
|
+
"value",
|
|
42736
|
+
"data",
|
|
42737
|
+
"info",
|
|
42738
|
+
"note",
|
|
42739
|
+
"todo",
|
|
42740
|
+
"done",
|
|
42741
|
+
"fail",
|
|
42742
|
+
"pass"
|
|
42743
|
+
]);
|
|
42744
|
+
}
|
|
42745
|
+
});
|
|
42746
|
+
|
|
42363
42747
|
// packages/core/src/memory/brain-lifecycle.ts
|
|
42364
42748
|
var brain_lifecycle_exports = {};
|
|
42365
42749
|
__export(brain_lifecycle_exports, {
|
|
@@ -42659,6 +43043,13 @@ async function runConsolidation(projectRoot) {
|
|
|
42659
43043
|
} catch (err) {
|
|
42660
43044
|
console.warn("[consolidation] Step 7 summary generation failed:", err);
|
|
42661
43045
|
}
|
|
43046
|
+
try {
|
|
43047
|
+
const { autoLinkMemories: autoLinkMemories2 } = await Promise.resolve().then(() => (init_graph_memory_bridge(), graph_memory_bridge_exports));
|
|
43048
|
+
const bridgeResult = await autoLinkMemories2(projectRoot);
|
|
43049
|
+
result.graphLinksCreated = bridgeResult.linked;
|
|
43050
|
+
} catch (err) {
|
|
43051
|
+
console.warn("[consolidation] Step 8 graph memory bridge failed:", err);
|
|
43052
|
+
}
|
|
42662
43053
|
return result;
|
|
42663
43054
|
}
|
|
42664
43055
|
async function deduplicateByEmbedding(projectRoot) {
|
|
@@ -52171,6 +52562,19 @@ async function completeTask(options, cwd, accessor) {
|
|
|
52171
52562
|
})()
|
|
52172
52563
|
).catch(() => {
|
|
52173
52564
|
});
|
|
52565
|
+
try {
|
|
52566
|
+
const { hooks: hooks2 } = await Promise.resolve().then(() => (init_registry(), registry_exports));
|
|
52567
|
+
await hooks2.dispatch("PostToolUse", cwd ?? process.cwd(), {
|
|
52568
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
52569
|
+
taskId: options.taskId,
|
|
52570
|
+
taskTitle: task.title,
|
|
52571
|
+
previousStatus: before.status,
|
|
52572
|
+
newStatus: "done",
|
|
52573
|
+
unblockedCount: unblockedTasks.length
|
|
52574
|
+
}).catch(() => {
|
|
52575
|
+
});
|
|
52576
|
+
} catch {
|
|
52577
|
+
}
|
|
52174
52578
|
return {
|
|
52175
52579
|
task,
|
|
52176
52580
|
...autoCompleted.length > 0 && { autoCompleted },
|
|
@@ -53784,6 +54188,7 @@ var init_discovery2 = __esm({
|
|
|
53784
54188
|
// packages/core/src/init.ts
|
|
53785
54189
|
var init_exports = {};
|
|
53786
54190
|
__export(init_exports, {
|
|
54191
|
+
deployStarterBundle: () => deployStarterBundle,
|
|
53787
54192
|
ensureInitialized: () => ensureInitialized,
|
|
53788
54193
|
getVersion: () => getVersion2,
|
|
53789
54194
|
initAgentDefinition: () => initAgentDefinition,
|
|
@@ -54269,53 +54674,7 @@ async function initProject(opts = {}) {
|
|
|
54269
54674
|
);
|
|
54270
54675
|
}
|
|
54271
54676
|
try {
|
|
54272
|
-
|
|
54273
|
-
const cantAgentsDir = join104(cantDir, "agents");
|
|
54274
|
-
const hasCantFiles = existsSync105(cantDir) && readdirSync35(cantDir, { recursive: true }).some(
|
|
54275
|
-
(f) => typeof f === "string" && f.endsWith(".cant")
|
|
54276
|
-
);
|
|
54277
|
-
if (!hasCantFiles) {
|
|
54278
|
-
let starterBundleSrc = null;
|
|
54279
|
-
try {
|
|
54280
|
-
const { createRequire: createRequire10 } = await import("node:module");
|
|
54281
|
-
const req = createRequire10(import.meta.url);
|
|
54282
|
-
const cleoOsPkgMain = req.resolve("@cleocode/cleo-os/package.json");
|
|
54283
|
-
const cleoOsPkgRoot = dirname22(cleoOsPkgMain);
|
|
54284
|
-
const candidate = join104(cleoOsPkgRoot, "starter-bundle");
|
|
54285
|
-
if (existsSync105(candidate)) {
|
|
54286
|
-
starterBundleSrc = candidate;
|
|
54287
|
-
}
|
|
54288
|
-
} catch {
|
|
54289
|
-
}
|
|
54290
|
-
if (!starterBundleSrc) {
|
|
54291
|
-
const packageRoot = getPackageRoot();
|
|
54292
|
-
const fallbacks = [
|
|
54293
|
-
join104(packageRoot, "..", "cleo-os", "starter-bundle"),
|
|
54294
|
-
join104(packageRoot, "..", "..", "packages", "cleo-os", "starter-bundle")
|
|
54295
|
-
];
|
|
54296
|
-
starterBundleSrc = fallbacks.find((p) => existsSync105(p)) ?? null;
|
|
54297
|
-
}
|
|
54298
|
-
if (starterBundleSrc) {
|
|
54299
|
-
await mkdir16(cantDir, { recursive: true });
|
|
54300
|
-
await mkdir16(cantAgentsDir, { recursive: true });
|
|
54301
|
-
const teamSrc = join104(starterBundleSrc, "team.cant");
|
|
54302
|
-
const teamDst = join104(cantDir, "team.cant");
|
|
54303
|
-
if (existsSync105(teamSrc) && !existsSync105(teamDst)) {
|
|
54304
|
-
await copyFile4(teamSrc, teamDst);
|
|
54305
|
-
}
|
|
54306
|
-
const agentsSrc = join104(starterBundleSrc, "agents");
|
|
54307
|
-
if (existsSync105(agentsSrc)) {
|
|
54308
|
-
const agentFiles = readdirSync35(agentsSrc).filter((f) => f.endsWith(".cant"));
|
|
54309
|
-
for (const agentFile of agentFiles) {
|
|
54310
|
-
const dst = join104(cantAgentsDir, agentFile);
|
|
54311
|
-
if (!existsSync105(dst)) {
|
|
54312
|
-
await copyFile4(join104(agentsSrc, agentFile), dst);
|
|
54313
|
-
}
|
|
54314
|
-
}
|
|
54315
|
-
}
|
|
54316
|
-
created.push("starter-bundle: team + agent .cant files deployed to .cleo/cant/");
|
|
54317
|
-
}
|
|
54318
|
-
}
|
|
54677
|
+
await deployStarterBundle(cleoDir, created, warnings);
|
|
54319
54678
|
} catch (err) {
|
|
54320
54679
|
warnings.push(`Starter bundle deploy: ${err instanceof Error ? err.message : String(err)}`);
|
|
54321
54680
|
}
|
|
@@ -54443,6 +54802,58 @@ async function getVersion2(projectRoot) {
|
|
|
54443
54802
|
}
|
|
54444
54803
|
return { version: "0.0.0" };
|
|
54445
54804
|
}
|
|
54805
|
+
async function deployStarterBundle(cleoDir, created, warnings) {
|
|
54806
|
+
const cantDir = join104(cleoDir, "cant");
|
|
54807
|
+
const cantAgentsDir = join104(cantDir, "agents");
|
|
54808
|
+
const hasCantFiles = existsSync105(cantDir) && readdirSync35(cantDir, { recursive: true }).some(
|
|
54809
|
+
(f) => typeof f === "string" && f.endsWith(".cant")
|
|
54810
|
+
);
|
|
54811
|
+
if (hasCantFiles) return;
|
|
54812
|
+
let starterBundleSrc = null;
|
|
54813
|
+
try {
|
|
54814
|
+
const { createRequire: createRequire10 } = await import("node:module");
|
|
54815
|
+
const req = createRequire10(import.meta.url);
|
|
54816
|
+
const cleoOsPkgMain = req.resolve("@cleocode/cleo-os/package.json");
|
|
54817
|
+
const cleoOsPkgRoot = dirname22(cleoOsPkgMain);
|
|
54818
|
+
const candidate = join104(cleoOsPkgRoot, "starter-bundle");
|
|
54819
|
+
if (existsSync105(candidate)) {
|
|
54820
|
+
starterBundleSrc = candidate;
|
|
54821
|
+
}
|
|
54822
|
+
} catch {
|
|
54823
|
+
}
|
|
54824
|
+
if (!starterBundleSrc) {
|
|
54825
|
+
const packageRoot = getPackageRoot();
|
|
54826
|
+
const fallbacks = [
|
|
54827
|
+
join104(packageRoot, "..", "cleo-os", "starter-bundle"),
|
|
54828
|
+
join104(packageRoot, "..", "..", "packages", "cleo-os", "starter-bundle")
|
|
54829
|
+
];
|
|
54830
|
+
starterBundleSrc = fallbacks.find((p) => existsSync105(p)) ?? null;
|
|
54831
|
+
}
|
|
54832
|
+
if (!starterBundleSrc) {
|
|
54833
|
+
warnings.push(
|
|
54834
|
+
"Starter bundle not found \u2014 .cleo/cant/ will remain empty. Run cleo init in a project with @cleocode/cleo-os installed."
|
|
54835
|
+
);
|
|
54836
|
+
return;
|
|
54837
|
+
}
|
|
54838
|
+
await mkdir16(cantDir, { recursive: true });
|
|
54839
|
+
await mkdir16(cantAgentsDir, { recursive: true });
|
|
54840
|
+
const teamSrc = join104(starterBundleSrc, "team.cant");
|
|
54841
|
+
const teamDst = join104(cantDir, "team.cant");
|
|
54842
|
+
if (existsSync105(teamSrc) && !existsSync105(teamDst)) {
|
|
54843
|
+
await copyFile4(teamSrc, teamDst);
|
|
54844
|
+
}
|
|
54845
|
+
const agentsSrc = join104(starterBundleSrc, "agents");
|
|
54846
|
+
if (existsSync105(agentsSrc)) {
|
|
54847
|
+
const agentFiles = readdirSync35(agentsSrc).filter((f) => f.endsWith(".cant"));
|
|
54848
|
+
for (const agentFile of agentFiles) {
|
|
54849
|
+
const dst = join104(cantAgentsDir, agentFile);
|
|
54850
|
+
if (!existsSync105(dst)) {
|
|
54851
|
+
await copyFile4(join104(agentsSrc, agentFile), dst);
|
|
54852
|
+
}
|
|
54853
|
+
}
|
|
54854
|
+
}
|
|
54855
|
+
created.push("starter-bundle: team + agent .cant files deployed to .cleo/cant/");
|
|
54856
|
+
}
|
|
54446
54857
|
var DIR_SYMLINK_TYPE2;
|
|
54447
54858
|
var init_init = __esm({
|
|
54448
54859
|
"packages/core/src/init.ts"() {
|