@mcp-graph-workflow/mcp-graph 5.2.0 → 5.4.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/dist/api/router.d.ts +0 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +4 -5
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/benchmark.d.ts.map +1 -1
- package/dist/api/routes/benchmark.js +47 -2
- package/dist/api/routes/benchmark.js.map +1 -1
- package/dist/api/routes/code-graph.d.ts +12 -0
- package/dist/api/routes/code-graph.d.ts.map +1 -0
- package/dist/api/routes/code-graph.js +154 -0
- package/dist/api/routes/code-graph.js.map +1 -0
- package/dist/api/routes/context.d.ts.map +1 -1
- package/dist/api/routes/context.js +75 -0
- package/dist/api/routes/context.js.map +1 -1
- package/dist/api/routes/folder.d.ts +1 -4
- package/dist/api/routes/folder.d.ts.map +1 -1
- package/dist/api/routes/folder.js +19 -17
- package/dist/api/routes/folder.js.map +1 -1
- package/dist/api/routes/integrations.d.ts.map +1 -1
- package/dist/api/routes/integrations.js +60 -16
- package/dist/api/routes/integrations.js.map +1 -1
- package/dist/api/routes/knowledge.js +1 -1
- package/dist/api/routes/knowledge.js.map +1 -1
- package/dist/api/routes/skills.d.ts +2 -1
- package/dist/api/routes/skills.d.ts.map +1 -1
- package/dist/api/routes/skills.js +194 -4
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/cli/commands/index-cmd.js +5 -5
- package/dist/cli/commands/index-cmd.js.map +1 -1
- package/dist/core/code/code-indexer.d.ts +20 -0
- package/dist/core/code/code-indexer.d.ts.map +1 -0
- package/dist/core/code/code-indexer.js +161 -0
- package/dist/core/code/code-indexer.js.map +1 -0
- package/dist/core/code/code-search.d.ts +16 -0
- package/dist/core/code/code-search.d.ts.map +1 -0
- package/dist/core/code/code-search.js +77 -0
- package/dist/core/code/code-search.js.map +1 -0
- package/dist/core/code/code-store.d.ts +35 -0
- package/dist/core/code/code-store.d.ts.map +1 -0
- package/dist/core/code/code-store.js +228 -0
- package/dist/core/code/code-store.js.map +1 -0
- package/dist/core/code/code-types.d.ts +209 -0
- package/dist/core/code/code-types.d.ts.map +1 -0
- package/dist/core/code/code-types.js +94 -0
- package/dist/core/code/code-types.js.map +1 -0
- package/dist/core/code/graph-traversal.d.ts +27 -0
- package/dist/core/code/graph-traversal.d.ts.map +1 -0
- package/dist/core/code/graph-traversal.js +122 -0
- package/dist/core/code/graph-traversal.js.map +1 -0
- package/dist/core/code/process-detector.d.ts +11 -0
- package/dist/core/code/process-detector.d.ts.map +1 -0
- package/dist/core/code/process-detector.js +65 -0
- package/dist/core/code/process-detector.js.map +1 -0
- package/dist/core/code/ts-analyzer.d.ts +12 -0
- package/dist/core/code/ts-analyzer.d.ts.map +1 -0
- package/dist/core/code/ts-analyzer.js +331 -0
- package/dist/core/code/ts-analyzer.js.map +1 -0
- package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
- package/dist/core/config/ai-memory-generator.js +149 -61
- package/dist/core/config/ai-memory-generator.js.map +1 -1
- package/dist/core/config/config-loader.d.ts.map +1 -1
- package/dist/core/config/config-loader.js +2 -10
- package/dist/core/config/config-loader.js.map +1 -1
- package/dist/core/config/config-schema.d.ts +1 -2
- package/dist/core/config/config-schema.d.ts.map +1 -1
- package/dist/core/config/config-schema.js +2 -3
- package/dist/core/config/config-schema.js.map +1 -1
- package/dist/core/context/compact-context.d.ts +51 -0
- package/dist/core/context/compact-context.d.ts.map +1 -1
- package/dist/core/context/compact-context.js +292 -0
- package/dist/core/context/compact-context.js.map +1 -1
- package/dist/core/context/context-assembler.d.ts +1 -1
- package/dist/core/context/context-assembler.js +1 -1
- package/dist/core/doctor/doctor-checks.d.ts +1 -1
- package/dist/core/doctor/doctor-checks.js +21 -21
- package/dist/core/doctor/doctor-checks.js.map +1 -1
- package/dist/core/events/event-types.d.ts +18 -1
- package/dist/core/events/event-types.d.ts.map +1 -1
- package/dist/core/graph/graph-types.d.ts +1 -0
- package/dist/core/graph/graph-types.d.ts.map +1 -1
- package/dist/core/insights/bottleneck-detector.js +1 -1
- package/dist/core/insights/bottleneck-detector.js.map +1 -1
- package/dist/core/integrations/enriched-context.d.ts +10 -6
- package/dist/core/integrations/enriched-context.d.ts.map +1 -1
- package/dist/core/integrations/enriched-context.js +35 -35
- package/dist/core/integrations/enriched-context.js.map +1 -1
- package/dist/core/integrations/integration-orchestrator.js +2 -2
- package/dist/core/integrations/integration-orchestrator.js.map +1 -1
- package/dist/core/integrations/mcp-deps-installer.d.ts +1 -1
- package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -1
- package/dist/core/integrations/mcp-deps-installer.js +1 -60
- package/dist/core/integrations/mcp-deps-installer.js.map +1 -1
- package/dist/core/integrations/mcp-servers-config.d.ts +1 -1
- package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -1
- package/dist/core/integrations/mcp-servers-config.js +0 -17
- package/dist/core/integrations/mcp-servers-config.js.map +1 -1
- package/dist/core/integrations/tool-status.d.ts +8 -3
- package/dist/core/integrations/tool-status.d.ts.map +1 -1
- package/dist/core/integrations/tool-status.js +38 -48
- package/dist/core/integrations/tool-status.js.map +1 -1
- package/dist/core/memory/memory-migrator.d.ts +15 -0
- package/dist/core/memory/memory-migrator.d.ts.map +1 -0
- package/dist/core/memory/memory-migrator.js +64 -0
- package/dist/core/memory/memory-migrator.js.map +1 -0
- package/dist/core/memory/memory-reader.d.ts +30 -0
- package/dist/core/memory/memory-reader.d.ts.map +1 -0
- package/dist/core/memory/memory-reader.js +106 -0
- package/dist/core/memory/memory-reader.js.map +1 -0
- package/dist/core/planner/lifecycle-phase.d.ts +1 -0
- package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
- package/dist/core/planner/lifecycle-phase.js +11 -8
- package/dist/core/planner/lifecycle-phase.js.map +1 -1
- package/dist/core/rag/memory-indexer.d.ts +16 -0
- package/dist/core/rag/memory-indexer.d.ts.map +1 -0
- package/dist/core/rag/{serena-indexer.js → memory-indexer.js} +12 -12
- package/dist/core/rag/memory-indexer.js.map +1 -0
- package/dist/core/rag/{serena-rag-query.d.ts → memory-rag-query.d.ts} +11 -9
- package/dist/core/rag/memory-rag-query.d.ts.map +1 -0
- package/dist/core/rag/{serena-rag-query.js → memory-rag-query.js} +18 -15
- package/dist/core/rag/memory-rag-query.js.map +1 -0
- package/dist/core/rag/skill-indexer.d.ts +16 -0
- package/dist/core/rag/skill-indexer.d.ts.map +1 -0
- package/dist/core/rag/skill-indexer.js +98 -0
- package/dist/core/rag/skill-indexer.js.map +1 -0
- package/dist/core/skills/built-in-skills.d.ts +26 -0
- package/dist/core/skills/built-in-skills.d.ts.map +1 -0
- package/dist/core/skills/built-in-skills.js +467 -0
- package/dist/core/skills/built-in-skills.js.map +1 -0
- package/dist/core/skills/self-healing-listener.d.ts +22 -0
- package/dist/core/skills/self-healing-listener.d.ts.map +1 -0
- package/dist/core/skills/self-healing-listener.js +102 -0
- package/dist/core/skills/self-healing-listener.js.map +1 -0
- package/dist/core/skills/skill-store.d.ts +14 -0
- package/dist/core/skills/skill-store.d.ts.map +1 -0
- package/dist/core/skills/skill-store.js +109 -0
- package/dist/core/skills/skill-store.js.map +1 -0
- package/dist/core/store/knowledge-store.d.ts +1 -1
- package/dist/core/store/knowledge-store.js +1 -1
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +128 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/core/store/path-resolver.d.ts +38 -0
- package/dist/core/store/path-resolver.d.ts.map +1 -0
- package/dist/core/store/path-resolver.js +92 -0
- package/dist/core/store/path-resolver.js.map +1 -0
- package/dist/core/store/sqlite-store.d.ts +21 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -1
- package/dist/core/store/sqlite-store.js +81 -30
- package/dist/core/store/sqlite-store.js.map +1 -1
- package/dist/core/store/tool-token-store.d.ts +39 -0
- package/dist/core/store/tool-token-store.d.ts.map +1 -0
- package/dist/core/store/tool-token-store.js +79 -0
- package/dist/core/store/tool-token-store.js.map +1 -0
- package/dist/core/utils/constants.d.ts +10 -0
- package/dist/core/utils/constants.d.ts.map +1 -1
- package/dist/core/utils/constants.js +12 -0
- package/dist/core/utils/constants.js.map +1 -1
- package/dist/mcp/app-factory.d.ts +0 -1
- package/dist/mcp/app-factory.d.ts.map +1 -1
- package/dist/mcp/app-factory.js +2 -2
- package/dist/mcp/app-factory.js.map +1 -1
- package/dist/mcp/lifecycle-wrapper.d.ts +3 -1
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
- package/dist/mcp/lifecycle-wrapper.js +41 -1
- package/dist/mcp/lifecycle-wrapper.js.map +1 -1
- package/dist/mcp/server.js +19 -14
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +6 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list-skills.d.ts +7 -0
- package/dist/mcp/tools/list-skills.d.ts.map +1 -0
- package/dist/mcp/tools/list-skills.js +68 -0
- package/dist/mcp/tools/list-skills.js.map +1 -0
- package/dist/mcp/tools/manage-skill.d.ts +8 -0
- package/dist/mcp/tools/manage-skill.d.ts.map +1 -0
- package/dist/mcp/tools/manage-skill.js +149 -0
- package/dist/mcp/tools/manage-skill.js.map +1 -0
- package/dist/mcp/tools/memory.d.ts +8 -0
- package/dist/mcp/tools/memory.d.ts.map +1 -0
- package/dist/mcp/tools/memory.js +106 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.js +11 -7
- package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
- package/dist/schemas/graph.schema.d.ts +2 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -1
- package/dist/schemas/graph.schema.js +1 -0
- package/dist/schemas/graph.schema.js.map +1 -1
- package/dist/schemas/knowledge.schema.d.ts +4 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +1 -1
- package/dist/schemas/knowledge.schema.js.map +1 -1
- package/dist/schemas/skill.schema.d.ts +57 -0
- package/dist/schemas/skill.schema.d.ts.map +1 -0
- package/dist/schemas/skill.schema.js +24 -0
- package/dist/schemas/skill.schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-BW4QxI49.js +1 -0
- package/dist/web/dashboard/dist/assets/constants-kpH_c6vY.js +1 -0
- package/dist/web/dashboard/dist/assets/context-tab-C5RAlXNW.js +1 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-BnxxYl2F.js +430 -0
- package/dist/web/dashboard/dist/assets/graph-tab-Cv_wQ6Az.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-Ds1zJyD1.js +7 -0
- package/dist/web/dashboard/dist/assets/index-BAeZDWWy.js +53 -0
- package/dist/web/dashboard/dist/assets/index-Bic_URMs.js +17 -0
- package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-U_ATOqPu.js +52 -0
- package/dist/web/dashboard/dist/assets/{logs-tab-Cxpcv_ni.js → logs-tab-B8psCXuB.js} +1 -1
- package/dist/web/dashboard/dist/assets/memories-tab-DcWok2by.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CjftveTc.js +1 -0
- package/dist/web/dashboard/dist/assets/skills-tab-Ddp1w4vS.js +1 -0
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +2 -2
- package/dist/api/routes/gitnexus.d.ts +0 -12
- package/dist/api/routes/gitnexus.d.ts.map +0 -1
- package/dist/api/routes/gitnexus.js +0 -164
- package/dist/api/routes/gitnexus.js.map +0 -1
- package/dist/core/integrations/gitnexus-launcher.d.ts +0 -67
- package/dist/core/integrations/gitnexus-launcher.d.ts.map +0 -1
- package/dist/core/integrations/gitnexus-launcher.js +0 -268
- package/dist/core/integrations/gitnexus-launcher.js.map +0 -1
- package/dist/core/integrations/gitnexus-queries.d.ts +0 -55
- package/dist/core/integrations/gitnexus-queries.d.ts.map +0 -1
- package/dist/core/integrations/gitnexus-queries.js +0 -168
- package/dist/core/integrations/gitnexus-queries.js.map +0 -1
- package/dist/core/integrations/serena-reader.d.ts +0 -18
- package/dist/core/integrations/serena-reader.d.ts.map +0 -1
- package/dist/core/integrations/serena-reader.js +0 -68
- package/dist/core/integrations/serena-reader.js.map +0 -1
- package/dist/core/rag/serena-indexer.d.ts +0 -16
- package/dist/core/rag/serena-indexer.d.ts.map +0 -1
- package/dist/core/rag/serena-indexer.js.map +0 -1
- package/dist/core/rag/serena-rag-query.d.ts.map +0 -1
- package/dist/core/rag/serena-rag-query.js.map +0 -1
- package/dist/web/dashboard/dist/assets/benchmark-tab-DE6hAHVG.js +0 -1
- package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +0 -1
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DsBjJHx8.js +0 -312
- package/dist/web/dashboard/dist/assets/graph-tab-C09DzeZ_.js +0 -1
- package/dist/web/dashboard/dist/assets/graph-utils-D4LFspTf.js +0 -23
- package/dist/web/dashboard/dist/assets/index-B2fTJ4AS.js +0 -53
- package/dist/web/dashboard/dist/assets/index-CkqEqKiH.css +0 -1
- package/dist/web/dashboard/dist/assets/insights-tab-Bm7CDckb.js +0 -1
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-X84Rj-IB.js +0 -1
- package/dist/web/dashboard/dist/assets/serena-tab-BunULNvw.js +0 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Store — persistence layer for skill preferences and custom skills.
|
|
3
|
+
* Uses SQLite tables created by migration v9.
|
|
4
|
+
*/
|
|
5
|
+
import { generateId } from "../utils/id.js";
|
|
6
|
+
import { now } from "../utils/time.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
import { ValidationError } from "../utils/errors.js";
|
|
9
|
+
// ── Mapping helpers ──────────────────────────────────
|
|
10
|
+
function rowToCustomSkill(row) {
|
|
11
|
+
return {
|
|
12
|
+
id: row.id,
|
|
13
|
+
projectId: row.project_id,
|
|
14
|
+
name: row.name,
|
|
15
|
+
description: row.description,
|
|
16
|
+
category: row.category,
|
|
17
|
+
phases: JSON.parse(row.phases),
|
|
18
|
+
instructions: row.instructions,
|
|
19
|
+
createdAt: row.created_at,
|
|
20
|
+
updatedAt: row.updated_at,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// ── Preferences ──────────────────────────────────────
|
|
24
|
+
export function setSkillEnabled(db, projectId, skillName, enabled) {
|
|
25
|
+
logger.debug("skill-store:setEnabled", { projectId, skillName, enabled });
|
|
26
|
+
db.prepare(`
|
|
27
|
+
INSERT INTO skill_preferences (project_id, skill_name, enabled, updated_at)
|
|
28
|
+
VALUES (?, ?, ?, ?)
|
|
29
|
+
ON CONFLICT(project_id, skill_name) DO UPDATE SET enabled = excluded.enabled, updated_at = excluded.updated_at
|
|
30
|
+
`).run(projectId, skillName, enabled ? 1 : 0, now());
|
|
31
|
+
}
|
|
32
|
+
export function getSkillPreferences(db, projectId) {
|
|
33
|
+
const rows = db.prepare("SELECT skill_name, enabled FROM skill_preferences WHERE project_id = ?").all(projectId);
|
|
34
|
+
const map = new Map();
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
map.set(row.skill_name, row.enabled === 1);
|
|
37
|
+
}
|
|
38
|
+
return map;
|
|
39
|
+
}
|
|
40
|
+
// ── Custom Skills CRUD ───────────────────────────────
|
|
41
|
+
export function createCustomSkill(db, projectId, data) {
|
|
42
|
+
const id = generateId("skill");
|
|
43
|
+
const timestamp = now();
|
|
44
|
+
logger.info("skill-store:create", { projectId, name: data.name });
|
|
45
|
+
try {
|
|
46
|
+
db.prepare(`
|
|
47
|
+
INSERT INTO custom_skills (id, project_id, name, description, category, phases, instructions, created_at, updated_at)
|
|
48
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
49
|
+
`).run(id, projectId, data.name, data.description, data.category ?? "know-me", JSON.stringify(data.phases), data.instructions, timestamp, timestamp);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof Error && err.message.includes("UNIQUE constraint")) {
|
|
53
|
+
throw new ValidationError(`Custom skill '${data.name}' already exists in this project`, []);
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
id,
|
|
59
|
+
projectId,
|
|
60
|
+
name: data.name,
|
|
61
|
+
description: data.description,
|
|
62
|
+
category: data.category ?? "know-me",
|
|
63
|
+
phases: data.phases,
|
|
64
|
+
instructions: data.instructions,
|
|
65
|
+
createdAt: timestamp,
|
|
66
|
+
updatedAt: timestamp,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function updateCustomSkill(db, projectId, id, data) {
|
|
70
|
+
const existing = db.prepare("SELECT * FROM custom_skills WHERE id = ? AND project_id = ?").get(id, projectId);
|
|
71
|
+
if (!existing) {
|
|
72
|
+
throw new ValidationError(`Custom skill not found: ${id}`, []);
|
|
73
|
+
}
|
|
74
|
+
const timestamp = now();
|
|
75
|
+
const updated = {
|
|
76
|
+
name: data.name ?? existing.name,
|
|
77
|
+
description: data.description ?? existing.description,
|
|
78
|
+
category: data.category ?? existing.category,
|
|
79
|
+
phases: data.phases ? JSON.stringify(data.phases) : existing.phases,
|
|
80
|
+
instructions: data.instructions ?? existing.instructions,
|
|
81
|
+
};
|
|
82
|
+
logger.info("skill-store:update", { projectId, id });
|
|
83
|
+
db.prepare(`
|
|
84
|
+
UPDATE custom_skills
|
|
85
|
+
SET name = ?, description = ?, category = ?, phases = ?, instructions = ?, updated_at = ?
|
|
86
|
+
WHERE id = ? AND project_id = ?
|
|
87
|
+
`).run(updated.name, updated.description, updated.category, updated.phases, updated.instructions, timestamp, id, projectId);
|
|
88
|
+
return rowToCustomSkill({
|
|
89
|
+
...existing,
|
|
90
|
+
...updated,
|
|
91
|
+
updated_at: timestamp,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function deleteCustomSkill(db, projectId, id) {
|
|
95
|
+
logger.info("skill-store:delete", { projectId, id });
|
|
96
|
+
const result = db.prepare("DELETE FROM custom_skills WHERE id = ? AND project_id = ?").run(id, projectId);
|
|
97
|
+
if (result.changes === 0) {
|
|
98
|
+
throw new ValidationError(`Custom skill not found: ${id}`, []);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function getCustomSkills(db, projectId) {
|
|
102
|
+
const rows = db.prepare("SELECT * FROM custom_skills WHERE project_id = ? ORDER BY created_at").all(projectId);
|
|
103
|
+
return rows.map(rowToCustomSkill);
|
|
104
|
+
}
|
|
105
|
+
export function getCustomSkillByName(db, projectId, name) {
|
|
106
|
+
const row = db.prepare("SELECT * FROM custom_skills WHERE project_id = ? AND name = ?").get(projectId, name);
|
|
107
|
+
return row ? rowToCustomSkill(row) : undefined;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=skill-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.js","sourceRoot":"","sources":["../../../src/core/skills/skill-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Knowledge Store — CRUD, FTS search, and dedup for knowledge_documents.
|
|
3
|
-
* Follows DocsCacheStore pattern. All sources (upload,
|
|
3
|
+
* Follows DocsCacheStore pattern. All sources (upload, memory, code_context,
|
|
4
4
|
* docs, web_capture) stored in a single table with source_type discriminator.
|
|
5
5
|
*/
|
|
6
6
|
import type Database from "better-sqlite3";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Knowledge Store — CRUD, FTS search, and dedup for knowledge_documents.
|
|
3
|
-
* Follows DocsCacheStore pattern. All sources (upload,
|
|
3
|
+
* Follows DocsCacheStore pattern. All sources (upload, memory, code_context,
|
|
4
4
|
* docs, web_capture) stored in a single table with source_type discriminator.
|
|
5
5
|
*/
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAwV3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA6BzD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAGvD"}
|
|
@@ -204,6 +204,134 @@ const migrations = [
|
|
|
204
204
|
);
|
|
205
205
|
`,
|
|
206
206
|
},
|
|
207
|
+
{
|
|
208
|
+
version: 6,
|
|
209
|
+
description: "Code Intelligence — symbols, relations, FTS5 index, index metadata",
|
|
210
|
+
sql: `
|
|
211
|
+
CREATE TABLE IF NOT EXISTS code_symbols (
|
|
212
|
+
id TEXT PRIMARY KEY,
|
|
213
|
+
project_id TEXT NOT NULL,
|
|
214
|
+
name TEXT NOT NULL,
|
|
215
|
+
kind TEXT NOT NULL,
|
|
216
|
+
file TEXT NOT NULL,
|
|
217
|
+
start_line INTEGER NOT NULL,
|
|
218
|
+
end_line INTEGER NOT NULL,
|
|
219
|
+
exported INTEGER NOT NULL DEFAULT 0,
|
|
220
|
+
module_path TEXT,
|
|
221
|
+
signature TEXT,
|
|
222
|
+
metadata TEXT,
|
|
223
|
+
indexed_at TEXT NOT NULL
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
CREATE TABLE IF NOT EXISTS code_relations (
|
|
227
|
+
id TEXT PRIMARY KEY,
|
|
228
|
+
project_id TEXT NOT NULL,
|
|
229
|
+
from_symbol TEXT NOT NULL REFERENCES code_symbols(id),
|
|
230
|
+
to_symbol TEXT NOT NULL REFERENCES code_symbols(id),
|
|
231
|
+
type TEXT NOT NULL,
|
|
232
|
+
file TEXT,
|
|
233
|
+
line INTEGER,
|
|
234
|
+
metadata TEXT,
|
|
235
|
+
indexed_at TEXT NOT NULL
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS code_symbols_fts USING fts5(
|
|
239
|
+
name, file, signature,
|
|
240
|
+
content='code_symbols', content_rowid='rowid'
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
-- FTS5 sync triggers
|
|
244
|
+
CREATE TRIGGER IF NOT EXISTS code_fts_insert AFTER INSERT ON code_symbols BEGIN
|
|
245
|
+
INSERT INTO code_symbols_fts(rowid, name, file, signature)
|
|
246
|
+
VALUES (NEW.rowid, NEW.name, NEW.file, COALESCE(NEW.signature, ''));
|
|
247
|
+
END;
|
|
248
|
+
|
|
249
|
+
CREATE TRIGGER IF NOT EXISTS code_fts_delete AFTER DELETE ON code_symbols BEGIN
|
|
250
|
+
INSERT INTO code_symbols_fts(code_symbols_fts, rowid, name, file, signature)
|
|
251
|
+
VALUES ('delete', OLD.rowid, OLD.name, OLD.file, COALESCE(OLD.signature, ''));
|
|
252
|
+
END;
|
|
253
|
+
|
|
254
|
+
CREATE TRIGGER IF NOT EXISTS code_fts_update AFTER UPDATE ON code_symbols BEGIN
|
|
255
|
+
INSERT INTO code_symbols_fts(code_symbols_fts, rowid, name, file, signature)
|
|
256
|
+
VALUES ('delete', OLD.rowid, OLD.name, OLD.file, COALESCE(OLD.signature, ''));
|
|
257
|
+
INSERT INTO code_symbols_fts(rowid, name, file, signature)
|
|
258
|
+
VALUES (NEW.rowid, NEW.name, NEW.file, COALESCE(NEW.signature, ''));
|
|
259
|
+
END;
|
|
260
|
+
|
|
261
|
+
CREATE TABLE IF NOT EXISTS code_index_meta (
|
|
262
|
+
project_id TEXT PRIMARY KEY,
|
|
263
|
+
last_indexed TEXT NOT NULL,
|
|
264
|
+
file_count INTEGER DEFAULT 0,
|
|
265
|
+
symbol_count INTEGER DEFAULT 0,
|
|
266
|
+
relation_count INTEGER DEFAULT 0,
|
|
267
|
+
git_hash TEXT
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
CREATE INDEX IF NOT EXISTS idx_code_sym_project ON code_symbols(project_id);
|
|
271
|
+
CREATE INDEX IF NOT EXISTS idx_code_sym_name ON code_symbols(name);
|
|
272
|
+
CREATE INDEX IF NOT EXISTS idx_code_sym_file ON code_symbols(file);
|
|
273
|
+
CREATE INDEX IF NOT EXISTS idx_code_rel_from ON code_relations(from_symbol);
|
|
274
|
+
CREATE INDEX IF NOT EXISTS idx_code_rel_to ON code_relations(to_symbol);
|
|
275
|
+
CREATE INDEX IF NOT EXISTS idx_code_rel_type ON code_relations(type);
|
|
276
|
+
`,
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
version: 7,
|
|
280
|
+
description: "Tool token usage tracking for benchmark analytics",
|
|
281
|
+
sql: `
|
|
282
|
+
CREATE TABLE IF NOT EXISTS tool_token_usage (
|
|
283
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
284
|
+
project_id TEXT NOT NULL REFERENCES projects(id),
|
|
285
|
+
tool_name TEXT NOT NULL,
|
|
286
|
+
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
287
|
+
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
288
|
+
called_at TEXT NOT NULL
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
CREATE INDEX IF NOT EXISTS idx_ttu_project ON tool_token_usage(project_id);
|
|
292
|
+
CREATE INDEX IF NOT EXISTS idx_ttu_tool ON tool_token_usage(tool_name);
|
|
293
|
+
CREATE INDEX IF NOT EXISTS idx_ttu_called ON tool_token_usage(called_at);
|
|
294
|
+
`,
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
version: 8,
|
|
298
|
+
description: "Global mode — fs_path on projects, project_id on knowledge_documents",
|
|
299
|
+
sql: `
|
|
300
|
+
ALTER TABLE projects ADD COLUMN fs_path TEXT;
|
|
301
|
+
CREATE INDEX IF NOT EXISTS idx_projects_fs_path ON projects(fs_path);
|
|
302
|
+
|
|
303
|
+
ALTER TABLE knowledge_documents ADD COLUMN project_id TEXT;
|
|
304
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_project ON knowledge_documents(project_id);
|
|
305
|
+
`,
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
version: 9,
|
|
309
|
+
description: "Skill preferences and custom skills tables",
|
|
310
|
+
sql: `
|
|
311
|
+
CREATE TABLE IF NOT EXISTS skill_preferences (
|
|
312
|
+
project_id TEXT NOT NULL,
|
|
313
|
+
skill_name TEXT NOT NULL,
|
|
314
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
315
|
+
updated_at TEXT NOT NULL,
|
|
316
|
+
PRIMARY KEY (project_id, skill_name)
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
CREATE TABLE IF NOT EXISTS custom_skills (
|
|
320
|
+
id TEXT PRIMARY KEY,
|
|
321
|
+
project_id TEXT NOT NULL,
|
|
322
|
+
name TEXT NOT NULL,
|
|
323
|
+
description TEXT NOT NULL,
|
|
324
|
+
category TEXT NOT NULL DEFAULT 'know-me',
|
|
325
|
+
phases TEXT NOT NULL,
|
|
326
|
+
instructions TEXT NOT NULL,
|
|
327
|
+
created_at TEXT NOT NULL,
|
|
328
|
+
updated_at TEXT NOT NULL,
|
|
329
|
+
UNIQUE(project_id, name)
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
CREATE INDEX IF NOT EXISTS idx_custom_skills_project ON custom_skills(project_id);
|
|
333
|
+
`,
|
|
334
|
+
},
|
|
207
335
|
];
|
|
208
336
|
export function runMigrations(db) {
|
|
209
337
|
// Create migrations tracking table
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,MAAM,UAAU,GAAgB;IAC9B;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,oEAAoE;QACjF,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsEJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,sCAAsC;QACnD,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,uEAAuE;QACpF,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,0DAA0D;QACvE,GAAG,EAAE;;;;;;;;KAQJ;KACF;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,mCAAmC;IACnC,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,EAAE;SACC,OAAO,CAAC,iCAAiC,CAAC;SAC1C,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,GAA2B,CAAC,OAAO,CAAC,CACtD,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7C,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACjG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,OAAO,CACR,6EAA6E,CAC9E,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAqB;IAC/C,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C,MAAM,UAAU,GAAgB;IAC9B;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,oEAAoE;QACjF,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsEJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,sCAAsC;QACnD,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,6DAA6D;QAC1E,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,uEAAuE;QACpF,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,0DAA0D;QACvE,GAAG,EAAE;;;;;;;;KAQJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,oEAAoE;QACjF,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkEJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,mDAAmD;QAChE,GAAG,EAAE;;;;;;;;;;;;;KAaJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,sEAAsE;QACnF,GAAG,EAAE;;;;;;KAMJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,4CAA4C;QACzD,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;KAuBJ;KACF;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,mCAAmC;IACnC,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,EAAE;SACC,OAAO,CAAC,iCAAiC,CAAC;SAC1C,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,GAA2B,CAAC,OAAO,CAAC,CACtD,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7C,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACjG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,OAAO,CACR,6EAA6E,CAC9E,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAqB;IAC/C,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized store path resolution for global/local/explicit modes.
|
|
3
|
+
*
|
|
4
|
+
* Resolution precedence:
|
|
5
|
+
* 1. --db flag / MCP_GRAPH_DB env (explicit)
|
|
6
|
+
* 2. {cwd}/workflow-graph/graph.db (local — backward compat)
|
|
7
|
+
* 3. ~/.mcp-graph/graph.db (global — default)
|
|
8
|
+
*/
|
|
9
|
+
export type StoreMode = "local" | "global" | "explicit";
|
|
10
|
+
export interface ResolvedStore {
|
|
11
|
+
/** How the DB was resolved */
|
|
12
|
+
mode: StoreMode;
|
|
13
|
+
/** Absolute path to the graph.db file */
|
|
14
|
+
dbPath: string;
|
|
15
|
+
/** Project root directory (for code index, PRD, etc.) */
|
|
16
|
+
basePath: string;
|
|
17
|
+
/** Absolute path to memories directory */
|
|
18
|
+
memoriesPath: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolveOptions {
|
|
21
|
+
/** Explicit DB path override (--db flag or MCP_GRAPH_DB env) */
|
|
22
|
+
explicitDb?: string;
|
|
23
|
+
/** Current working directory (defaults to process.cwd()) */
|
|
24
|
+
cwd?: string;
|
|
25
|
+
/** Global store directory (defaults to ~/.mcp-graph/) — injectable for tests */
|
|
26
|
+
globalDir?: string;
|
|
27
|
+
/** Project ID for global memories scoping */
|
|
28
|
+
projectId?: string;
|
|
29
|
+
/** If true, creates global DB when no DB exists anywhere. Default: false */
|
|
30
|
+
createGlobal?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve which store DB to use based on precedence rules.
|
|
34
|
+
*
|
|
35
|
+
* @throws {Error} If no DB can be found and createGlobal is false.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveStorePath(options?: ResolveOptions): ResolvedStore;
|
|
38
|
+
//# sourceMappingURL=path-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/store/path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CA+DxE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized store path resolution for global/local/explicit modes.
|
|
3
|
+
*
|
|
4
|
+
* Resolution precedence:
|
|
5
|
+
* 1. --db flag / MCP_GRAPH_DB env (explicit)
|
|
6
|
+
* 2. {cwd}/workflow-graph/graph.db (local — backward compat)
|
|
7
|
+
* 3. ~/.mcp-graph/graph.db (global — default)
|
|
8
|
+
*/
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
11
|
+
import Database from "better-sqlite3";
|
|
12
|
+
import { STORE_DIR, DB_FILE, GLOBAL_DB_DIR } from "../utils/constants.js";
|
|
13
|
+
import { configureDb, runMigrations } from "./migrations.js";
|
|
14
|
+
import { logger } from "../utils/logger.js";
|
|
15
|
+
/**
|
|
16
|
+
* Resolve which store DB to use based on precedence rules.
|
|
17
|
+
*
|
|
18
|
+
* @throws {Error} If no DB can be found and createGlobal is false.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveStorePath(options) {
|
|
21
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
22
|
+
const globalDir = options?.globalDir ?? GLOBAL_DB_DIR;
|
|
23
|
+
const createGlobal = options?.createGlobal ?? false;
|
|
24
|
+
// 1. Explicit mode: --db flag or MCP_GRAPH_DB env
|
|
25
|
+
if (options?.explicitDb) {
|
|
26
|
+
logger.debug("path-resolver:explicit", { dbPath: options.explicitDb });
|
|
27
|
+
return {
|
|
28
|
+
mode: "explicit",
|
|
29
|
+
dbPath: options.explicitDb,
|
|
30
|
+
basePath: cwd,
|
|
31
|
+
memoriesPath: resolveMemoriesDir("explicit", cwd, globalDir, options.projectId),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// 2. Local mode: {cwd}/workflow-graph/graph.db
|
|
35
|
+
const localDbPath = path.join(cwd, STORE_DIR, DB_FILE);
|
|
36
|
+
if (existsSync(localDbPath)) {
|
|
37
|
+
logger.debug("path-resolver:local", { dbPath: localDbPath });
|
|
38
|
+
return {
|
|
39
|
+
mode: "local",
|
|
40
|
+
dbPath: localDbPath,
|
|
41
|
+
basePath: cwd,
|
|
42
|
+
memoriesPath: resolveMemoriesDir("local", cwd, globalDir, options?.projectId),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// 3. Global mode: ~/.mcp-graph/graph.db
|
|
46
|
+
const globalDbPath = path.join(globalDir, DB_FILE);
|
|
47
|
+
if (existsSync(globalDbPath)) {
|
|
48
|
+
logger.debug("path-resolver:global", { dbPath: globalDbPath });
|
|
49
|
+
return {
|
|
50
|
+
mode: "global",
|
|
51
|
+
dbPath: globalDbPath,
|
|
52
|
+
basePath: cwd,
|
|
53
|
+
memoriesPath: resolveMemoriesDir("global", cwd, globalDir, options?.projectId),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// 4. No DB found — create global if requested
|
|
57
|
+
if (createGlobal) {
|
|
58
|
+
logger.info("path-resolver:create-global", { globalDir });
|
|
59
|
+
mkdirSync(globalDir, { recursive: true });
|
|
60
|
+
const db = new Database(globalDbPath);
|
|
61
|
+
configureDb(db);
|
|
62
|
+
runMigrations(db);
|
|
63
|
+
db.close();
|
|
64
|
+
return {
|
|
65
|
+
mode: "global",
|
|
66
|
+
dbPath: globalDbPath,
|
|
67
|
+
basePath: cwd,
|
|
68
|
+
memoriesPath: resolveMemoriesDir("global", cwd, globalDir, options?.projectId),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`No graph database found. Checked:\n` +
|
|
72
|
+
` local: ${localDbPath}\n` +
|
|
73
|
+
` global: ${globalDbPath}\n` +
|
|
74
|
+
`Run 'mcp-graph init' to create a local store, or 'mcp-graph init --global' for a global one.`);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve the memories directory based on mode.
|
|
78
|
+
* - local: {cwd}/workflow-graph/memories/
|
|
79
|
+
* - global: {globalDir}/memories/{projectId}/
|
|
80
|
+
* - explicit: same as local (basePath)
|
|
81
|
+
*/
|
|
82
|
+
function resolveMemoriesDir(mode, basePath, globalDir, projectId) {
|
|
83
|
+
if (mode === "global" && projectId) {
|
|
84
|
+
return path.join(globalDir, "memories", projectId);
|
|
85
|
+
}
|
|
86
|
+
if (mode === "global") {
|
|
87
|
+
return path.join(globalDir, "memories");
|
|
88
|
+
}
|
|
89
|
+
// local or explicit
|
|
90
|
+
return path.join(basePath, STORE_DIR, "memories");
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../../src/core/store/path-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,12 @@ export declare class SqliteStore {
|
|
|
18
18
|
* - If neither → create `workflow-graph/`
|
|
19
19
|
*/
|
|
20
20
|
static open(basePath?: string): SqliteStore;
|
|
21
|
+
/**
|
|
22
|
+
* Open a store at an absolute DB file path.
|
|
23
|
+
* Creates the file and parent dirs if they don't exist.
|
|
24
|
+
* Useful for global mode where the DB is at ~/.mcp-graph/graph.db.
|
|
25
|
+
*/
|
|
26
|
+
static openDb(dbPath: string): SqliteStore;
|
|
21
27
|
/** Expose the raw database instance for extension modules (e.g. DocsCacheStore). */
|
|
22
28
|
getDb(): Database.Database;
|
|
23
29
|
close(): void;
|
|
@@ -29,6 +35,21 @@ export declare class SqliteStore {
|
|
|
29
35
|
listProjects(): GraphProject[];
|
|
30
36
|
/** Switch the active project. Throws if project ID does not exist. */
|
|
31
37
|
activateProject(projectId: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Find a project by its filesystem path.
|
|
40
|
+
* Returns null if no project is registered at that path.
|
|
41
|
+
*/
|
|
42
|
+
findProjectByPath(fsPath: string): GraphProject | null;
|
|
43
|
+
/**
|
|
44
|
+
* Register a project with a filesystem path.
|
|
45
|
+
* If a project already exists at that path, returns the existing one.
|
|
46
|
+
* Creates and activates a new project otherwise.
|
|
47
|
+
*/
|
|
48
|
+
registerProject(name: string, fsPath: string): GraphProject;
|
|
49
|
+
/**
|
|
50
|
+
* Set or update the filesystem path for a project.
|
|
51
|
+
*/
|
|
52
|
+
setProjectFsPath(projectId: string, fsPath: string): void;
|
|
32
53
|
private ensureProject;
|
|
33
54
|
insertNode(node: GraphNode): void;
|
|
34
55
|
getNodeById(id: string): GraphNode | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../src/core/store/sqlite-store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,UAAU,EAEX,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../src/core/store/sqlite-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,6 +107,18 @@ function rowToEdge(row) {
|
|
|
107
107
|
edge.metadata = JSON.parse(row.metadata);
|
|
108
108
|
return edge;
|
|
109
109
|
}
|
|
110
|
+
// ── Row → Domain mapping ─────────────────────────────────
|
|
111
|
+
function rowToProject(row) {
|
|
112
|
+
const project = {
|
|
113
|
+
id: row.id,
|
|
114
|
+
name: row.name,
|
|
115
|
+
createdAt: row.created_at,
|
|
116
|
+
updatedAt: row.updated_at,
|
|
117
|
+
};
|
|
118
|
+
if (row.fs_path)
|
|
119
|
+
project.fsPath = row.fs_path;
|
|
120
|
+
return project;
|
|
121
|
+
}
|
|
110
122
|
// ── SqliteStore ──────────────────────────────────────────
|
|
111
123
|
export class SqliteStore {
|
|
112
124
|
db;
|
|
@@ -166,6 +178,27 @@ export class SqliteStore {
|
|
|
166
178
|
logger.info(`Store opened${basePath === ":memory:" ? " (in-memory)" : ` at ${basePath}`}`);
|
|
167
179
|
return store;
|
|
168
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Open a store at an absolute DB file path.
|
|
183
|
+
* Creates the file and parent dirs if they don't exist.
|
|
184
|
+
* Useful for global mode where the DB is at ~/.mcp-graph/graph.db.
|
|
185
|
+
*/
|
|
186
|
+
static openDb(dbPath) {
|
|
187
|
+
const dir = path.dirname(dbPath);
|
|
188
|
+
mkdirSync(dir, { recursive: true });
|
|
189
|
+
const db = new Database(dbPath);
|
|
190
|
+
configureDb(db);
|
|
191
|
+
runMigrations(db);
|
|
192
|
+
const store = new SqliteStore(db);
|
|
193
|
+
// Auto-load project if one exists
|
|
194
|
+
const row = db
|
|
195
|
+
.prepare("SELECT id FROM projects LIMIT 1")
|
|
196
|
+
.get();
|
|
197
|
+
if (row)
|
|
198
|
+
store.projectId = row.id;
|
|
199
|
+
logger.info(`Store opened at ${dbPath}`);
|
|
200
|
+
return store;
|
|
201
|
+
}
|
|
169
202
|
/** Expose the raw database instance for extension modules (e.g. DocsCacheStore). */
|
|
170
203
|
getDb() {
|
|
171
204
|
return this.db;
|
|
@@ -192,12 +225,7 @@ export class SqliteStore {
|
|
|
192
225
|
if (existing) {
|
|
193
226
|
this.projectId = existing.id;
|
|
194
227
|
logger.info("Project activated by name", { name, projectId: existing.id });
|
|
195
|
-
return
|
|
196
|
-
id: existing.id,
|
|
197
|
-
name: existing.name,
|
|
198
|
-
createdAt: existing.created_at,
|
|
199
|
-
updatedAt: existing.updated_at,
|
|
200
|
-
};
|
|
228
|
+
return rowToProject(existing);
|
|
201
229
|
}
|
|
202
230
|
}
|
|
203
231
|
// No active project, or different name — check if project already exists by name
|
|
@@ -208,12 +236,7 @@ export class SqliteStore {
|
|
|
208
236
|
if (existing) {
|
|
209
237
|
this.projectId = existing.id;
|
|
210
238
|
logger.info("Project activated by name", { name: projectName, projectId: existing.id });
|
|
211
|
-
return
|
|
212
|
-
id: existing.id,
|
|
213
|
-
name: existing.name,
|
|
214
|
-
createdAt: existing.created_at,
|
|
215
|
-
updatedAt: existing.updated_at,
|
|
216
|
-
};
|
|
239
|
+
return rowToProject(existing);
|
|
217
240
|
}
|
|
218
241
|
// If no name provided but a project exists in DB, reuse it
|
|
219
242
|
if (!name) {
|
|
@@ -223,12 +246,7 @@ export class SqliteStore {
|
|
|
223
246
|
if (anyProject) {
|
|
224
247
|
this.projectId = anyProject.id;
|
|
225
248
|
logger.info("Project activated (existing)", { name: anyProject.name, projectId: anyProject.id });
|
|
226
|
-
return
|
|
227
|
-
id: anyProject.id,
|
|
228
|
-
name: anyProject.name,
|
|
229
|
-
createdAt: anyProject.created_at,
|
|
230
|
-
updatedAt: anyProject.updated_at,
|
|
231
|
-
};
|
|
249
|
+
return rowToProject(anyProject);
|
|
232
250
|
}
|
|
233
251
|
}
|
|
234
252
|
// Truly no project exists — create new
|
|
@@ -249,12 +267,7 @@ export class SqliteStore {
|
|
|
249
267
|
.get(this.projectId);
|
|
250
268
|
if (!row)
|
|
251
269
|
return null;
|
|
252
|
-
return
|
|
253
|
-
id: row.id,
|
|
254
|
-
name: row.name,
|
|
255
|
-
createdAt: row.created_at,
|
|
256
|
-
updatedAt: row.updated_at,
|
|
257
|
-
};
|
|
270
|
+
return rowToProject(row);
|
|
258
271
|
}
|
|
259
272
|
/** Alias for getProject — returns the currently active project. */
|
|
260
273
|
getActiveProject() {
|
|
@@ -265,12 +278,7 @@ export class SqliteStore {
|
|
|
265
278
|
const rows = this.db
|
|
266
279
|
.prepare("SELECT * FROM projects ORDER BY created_at")
|
|
267
280
|
.all();
|
|
268
|
-
return rows.map(
|
|
269
|
-
id: row.id,
|
|
270
|
-
name: row.name,
|
|
271
|
-
createdAt: row.created_at,
|
|
272
|
-
updatedAt: row.updated_at,
|
|
273
|
-
}));
|
|
281
|
+
return rows.map(rowToProject);
|
|
274
282
|
}
|
|
275
283
|
/** Switch the active project. Throws if project ID does not exist. */
|
|
276
284
|
activateProject(projectId) {
|
|
@@ -283,6 +291,49 @@ export class SqliteStore {
|
|
|
283
291
|
this.projectId = projectId;
|
|
284
292
|
logger.info("Project activated", { projectId });
|
|
285
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* Find a project by its filesystem path.
|
|
296
|
+
* Returns null if no project is registered at that path.
|
|
297
|
+
*/
|
|
298
|
+
findProjectByPath(fsPath) {
|
|
299
|
+
const row = this.db
|
|
300
|
+
.prepare("SELECT * FROM projects WHERE fs_path = ?")
|
|
301
|
+
.get(fsPath);
|
|
302
|
+
return row ? rowToProject(row) : null;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Register a project with a filesystem path.
|
|
306
|
+
* If a project already exists at that path, returns the existing one.
|
|
307
|
+
* Creates and activates a new project otherwise.
|
|
308
|
+
*/
|
|
309
|
+
registerProject(name, fsPath) {
|
|
310
|
+
// Check if project already exists at this path
|
|
311
|
+
const existing = this.findProjectByPath(fsPath);
|
|
312
|
+
if (existing) {
|
|
313
|
+
this.projectId = existing.id;
|
|
314
|
+
logger.info("Project found by path", { name: existing.name, fsPath, projectId: existing.id });
|
|
315
|
+
return existing;
|
|
316
|
+
}
|
|
317
|
+
// Create new project with fs_path
|
|
318
|
+
const id = generateId("proj");
|
|
319
|
+
const timestamp = now();
|
|
320
|
+
this.db
|
|
321
|
+
.prepare("INSERT INTO projects (id, name, fs_path, created_at, updated_at) VALUES (?, ?, ?, ?, ?)")
|
|
322
|
+
.run(id, name, fsPath, timestamp, timestamp);
|
|
323
|
+
this.projectId = id;
|
|
324
|
+
logger.info(`Project registered: ${name} at ${fsPath} (${id})`);
|
|
325
|
+
return { id, name, fsPath, createdAt: timestamp, updatedAt: timestamp };
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Set or update the filesystem path for a project.
|
|
329
|
+
*/
|
|
330
|
+
setProjectFsPath(projectId, fsPath) {
|
|
331
|
+
const timestamp = now();
|
|
332
|
+
this.db
|
|
333
|
+
.prepare("UPDATE projects SET fs_path = ?, updated_at = ? WHERE id = ?")
|
|
334
|
+
.run(fsPath, timestamp, projectId);
|
|
335
|
+
logger.info("Project fs_path updated", { projectId, fsPath });
|
|
336
|
+
}
|
|
286
337
|
ensureProject() {
|
|
287
338
|
if (!this.projectId) {
|
|
288
339
|
throw new GraphNotInitializedError();
|