@mcp-graph-workflow/mcp-graph 5.3.0 → 5.5.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.js +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/code-graph.js +2 -2
- package/dist/api/routes/code-graph.js.map +1 -1
- 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.js +2 -2
- package/dist/api/routes/folder.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 +139 -3
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +60 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/code/code-indexer.d.ts +2 -2
- package/dist/core/code/code-indexer.d.ts.map +1 -1
- package/dist/core/code/code-indexer.js +3 -3
- package/dist/core/code/code-indexer.js.map +1 -1
- package/dist/core/code/code-types.d.ts +1 -1
- package/dist/core/code/code-types.d.ts.map +1 -1
- package/dist/core/code/ts-analyzer.d.ts +7 -1
- package/dist/core/code/ts-analyzer.d.ts.map +1 -1
- package/dist/core/code/ts-analyzer.js +105 -72
- package/dist/core/code/ts-analyzer.js.map +1 -1
- package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
- package/dist/core/config/ai-memory-generator.js +78 -7
- package/dist/core/config/ai-memory-generator.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/importer/prd-to-graph.d.ts.map +1 -1
- package/dist/core/importer/prd-to-graph.js +49 -12
- package/dist/core/importer/prd-to-graph.js.map +1 -1
- package/dist/core/parser/classify.d.ts +1 -0
- package/dist/core/parser/classify.d.ts.map +1 -1
- package/dist/core/parser/classify.js +1 -0
- package/dist/core/parser/classify.js.map +1 -1
- package/dist/core/skills/built-in-skills.d.ts +1 -1
- package/dist/core/skills/built-in-skills.d.ts.map +1 -1
- package/dist/core/skills/built-in-skills.js +265 -1
- package/dist/core/skills/built-in-skills.js.map +1 -1
- 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/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +39 -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 +109 -40
- package/dist/core/store/sqlite-store.js.map +1 -1
- 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/init-project.d.ts +14 -0
- package/dist/mcp/init-project.d.ts.map +1 -1
- package/dist/mcp/init-project.js +140 -36
- package/dist/mcp/init-project.js.map +1 -1
- package/dist/mcp/lifecycle-wrapper.d.ts +2 -1
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
- package/dist/mcp/lifecycle-wrapper.js +20 -1
- package/dist/mcp/lifecycle-wrapper.js.map +1 -1
- package/dist/mcp/server.js +18 -16
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/add-node.d.ts +3 -0
- package/dist/mcp/tools/add-node.d.ts.map +1 -1
- package/dist/mcp/tools/add-node.js +7 -3
- package/dist/mcp/tools/add-node.js.map +1 -1
- package/dist/mcp/tools/delete-node.d.ts +3 -0
- package/dist/mcp/tools/delete-node.d.ts.map +1 -1
- package/dist/mcp/tools/delete-node.js +7 -3
- package/dist/mcp/tools/delete-node.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +21 -10
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list-skills.d.ts +1 -2
- package/dist/mcp/tools/list-skills.d.ts.map +1 -1
- package/dist/mcp/tools/list-skills.js +6 -4
- package/dist/mcp/tools/list-skills.js.map +1 -1
- 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 +202 -0
- package/dist/mcp/tools/manage-skill.js.map +1 -0
- package/dist/mcp/tools/node.d.ts +9 -0
- package/dist/mcp/tools/node.d.ts.map +1 -0
- package/dist/mcp/tools/node.js +195 -0
- package/dist/mcp/tools/node.js.map +1 -0
- package/dist/mcp/tools/update-node.d.ts +3 -0
- package/dist/mcp/tools/update-node.d.ts.map +1 -1
- package/dist/mcp/tools/update-node.js +7 -3
- package/dist/mcp/tools/update-node.js.map +1 -1
- package/dist/mcp/tools/validate-ac.d.ts +3 -0
- package/dist/mcp/tools/validate-ac.d.ts.map +1 -1
- package/dist/mcp/tools/validate-ac.js +6 -2
- package/dist/mcp/tools/validate-ac.js.map +1 -1
- package/dist/mcp/tools/validate-task.d.ts +3 -0
- package/dist/mcp/tools/validate-task.d.ts.map +1 -1
- package/dist/mcp/tools/validate-task.js +6 -1
- package/dist/mcp/tools/validate-task.js.map +1 -1
- package/dist/mcp/tools/validate.d.ts +9 -0
- package/dist/mcp/tools/validate.d.ts.map +1 -0
- package/dist/mcp/tools/validate.js +70 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- 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/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-B5Sr8Cah.js → benchmark-tab-BW4QxI49.js} +1 -1
- package/dist/web/dashboard/dist/assets/context-tab-C5RAlXNW.js +1 -0
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-DqmbSdzV.js → gitnexus-tab-BnxxYl2F.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-BKns5HdW.js → graph-tab-Cv_wQ6Az.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-BxUWNvsI.js → graph-utils-Ds1zJyD1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-CZOiKbTP.js → index-BAeZDWWy.js} +11 -11
- package/dist/web/dashboard/dist/assets/{index-Dd4vKyDX.js → index-Bic_URMs.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +1 -0
- package/dist/web/dashboard/dist/assets/{insights-tab-B1kPckBM.js → insights-tab-U_ATOqPu.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-BWfsrRlB.js → logs-tab-B8psCXuB.js} +1 -1
- package/dist/web/dashboard/dist/assets/{memories-tab-D3zm-1Sq.js → memories-tab-DcWok2by.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DXP4dFP-.js → prd-backlog-tab-CjftveTc.js} +1 -1
- package/dist/web/dashboard/dist/assets/skills-tab-Ddp1w4vS.js +1 -0
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/dashboard/dist/assets/index-xyMN-_UV.css +0 -1
- package/dist/web/dashboard/dist/assets/skills-tab-CAlVL80S.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-healing-listener.d.ts","sourceRoot":"","sources":["../../../src/core/skills/self-healing-listener.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAa3E;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAiDnF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-Healing Listener — creates auto-memories when errors are detected.
|
|
3
|
+
* Subscribes to "error:detected" events on the GraphEventBus.
|
|
4
|
+
* Deduplicates via error hash to prevent flood.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
/** Categorize an error message into a healing category. */
|
|
11
|
+
export function categorizeError(message) {
|
|
12
|
+
const lower = message.toLowerCase();
|
|
13
|
+
if (lower.includes("type") && (lower.includes("error") || lower.includes("mismatch")))
|
|
14
|
+
return "type-error";
|
|
15
|
+
if (lower.includes("validation") || lower.includes("invalid") || lower.includes("zod"))
|
|
16
|
+
return "validation-error";
|
|
17
|
+
if (lower.includes("build") || lower.includes("compile") || lower.includes("tsc"))
|
|
18
|
+
return "build-error";
|
|
19
|
+
if (lower.includes("test") && (lower.includes("fail") || lower.includes("assert")))
|
|
20
|
+
return "test-failure";
|
|
21
|
+
if (lower.includes("sqlite") || lower.includes("database") || lower.includes("migration"))
|
|
22
|
+
return "database-error";
|
|
23
|
+
if (lower.includes("import") || lower.includes("module") || lower.includes("require"))
|
|
24
|
+
return "module-error";
|
|
25
|
+
return "general-error";
|
|
26
|
+
}
|
|
27
|
+
/** Generate a short hash for deduplication of error patterns. */
|
|
28
|
+
export function generateErrorHash(category, message) {
|
|
29
|
+
// Normalize: strip dynamic parts like timestamps, line numbers, ids
|
|
30
|
+
const normalized = message
|
|
31
|
+
.replace(/\d{4}-\d{2}-\d{2}T[\d:.Z]+/g, "")
|
|
32
|
+
.replace(/\b[a-f0-9]{12,}\b/g, "")
|
|
33
|
+
.replace(/line \d+/gi, "line N")
|
|
34
|
+
.replace(/:\d+:\d+/g, ":N:N")
|
|
35
|
+
.trim();
|
|
36
|
+
return createHash("sha256")
|
|
37
|
+
.update(`${category}:${normalized}`)
|
|
38
|
+
.digest("hex")
|
|
39
|
+
.slice(0, 12);
|
|
40
|
+
}
|
|
41
|
+
/** Build the healing memory content. */
|
|
42
|
+
export function buildHealingMemory(category, errorMessage, toolName) {
|
|
43
|
+
const timestamp = new Date().toISOString();
|
|
44
|
+
return [
|
|
45
|
+
`# Self-Healing: ${category}`,
|
|
46
|
+
"",
|
|
47
|
+
"## Error Pattern",
|
|
48
|
+
errorMessage,
|
|
49
|
+
"",
|
|
50
|
+
"## Prevention Rule",
|
|
51
|
+
`When encountering similar ${category} issues, check the tool '${toolName}' inputs and outputs carefully.`,
|
|
52
|
+
"Apply validation at boundaries and verify types match expected schemas before proceeding.",
|
|
53
|
+
"",
|
|
54
|
+
"## Context",
|
|
55
|
+
`- Tool: ${toolName}`,
|
|
56
|
+
`- Category: ${category}`,
|
|
57
|
+
`- Date: ${timestamp}`,
|
|
58
|
+
].join("\n");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register the self-healing listener on the event bus.
|
|
62
|
+
* Returns an unsubscribe function.
|
|
63
|
+
*/
|
|
64
|
+
export function registerSelfHealingListener(options) {
|
|
65
|
+
const { memoriesDir, eventBus } = options;
|
|
66
|
+
// Ensure memories directory exists
|
|
67
|
+
if (!existsSync(memoriesDir)) {
|
|
68
|
+
mkdirSync(memoriesDir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
const handler = (event) => {
|
|
71
|
+
if (event.type !== "error:detected")
|
|
72
|
+
return;
|
|
73
|
+
const { toolName, errorMessage, errorCategory, errorHash } = event.payload;
|
|
74
|
+
const memoryName = `healing-${errorCategory}-${errorHash}`;
|
|
75
|
+
const memoryPath = path.join(memoriesDir, `${memoryName}.md`);
|
|
76
|
+
// Deduplication: skip if memory already exists
|
|
77
|
+
if (existsSync(memoryPath)) {
|
|
78
|
+
logger.debug("self-healing:skip-duplicate", { memoryName });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Create healing memory
|
|
82
|
+
const content = buildHealingMemory(errorCategory, errorMessage, toolName);
|
|
83
|
+
try {
|
|
84
|
+
writeFileSync(memoryPath, content, "utf-8");
|
|
85
|
+
logger.info("self-healing:memory-created", { memoryName, category: errorCategory });
|
|
86
|
+
// Emit healing event
|
|
87
|
+
eventBus.emitTyped("healing:memory_created", {
|
|
88
|
+
memoryName,
|
|
89
|
+
errorCategory,
|
|
90
|
+
errorHash,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
logger.error("self-healing:write-failed", { memoryName, error: String(err) });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
eventBus.on("error:detected", handler);
|
|
98
|
+
return () => {
|
|
99
|
+
eventBus.off("error:detected", handler);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=self-healing-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-healing-listener.js","sourceRoot":"","sources":["../../../src/core/skills/self-healing-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Store — persistence layer for skill preferences and custom skills.
|
|
3
|
+
* Uses SQLite tables created by migration v9.
|
|
4
|
+
*/
|
|
5
|
+
import type Database from "better-sqlite3";
|
|
6
|
+
import type { CustomSkill, CustomSkillInput } from "../../schemas/skill.schema.js";
|
|
7
|
+
export declare function setSkillEnabled(db: Database.Database, projectId: string, skillName: string, enabled: boolean): void;
|
|
8
|
+
export declare function getSkillPreferences(db: Database.Database, projectId: string): Map<string, boolean>;
|
|
9
|
+
export declare function createCustomSkill(db: Database.Database, projectId: string, data: CustomSkillInput): CustomSkill;
|
|
10
|
+
export declare function updateCustomSkill(db: Database.Database, projectId: string, id: string, data: Partial<CustomSkillInput>): CustomSkill;
|
|
11
|
+
export declare function deleteCustomSkill(db: Database.Database, projectId: string, id: string): void;
|
|
12
|
+
export declare function getCustomSkills(db: Database.Database, projectId: string): CustomSkill[];
|
|
13
|
+
export declare function getCustomSkillByName(db: Database.Database, projectId: string, name: string): CustomSkill | undefined;
|
|
14
|
+
//# sourceMappingURL=skill-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../../src/core/skills/skill-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAyCnF,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnH;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAUlG;AAID,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,WAAW,CAgC/G;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC9B,WAAW,CAkCb;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAS5F;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAMvF;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMpH"}
|
|
@@ -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":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAwBrD,wDAAwD;AAExD,SAAS,gBAAgB,CAAC,GAAmB;IAC3C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAA0B;QACvD,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,wDAAwD;AAExD,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,SAAiB,EAAE,SAAiB,EAAE,OAAgB;IAC3G,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,EAAE,CAAC,OAAO,CAAC;;;;GAIV,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,SAAiB;IAC1E,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,wEAAwE,CACzE,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC;IAEpC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wDAAwD;AAExD,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,SAAiB,EAAE,IAAsB;IAChG,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CACJ,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,EACtE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,eAAe,CAAC,iBAAiB,IAAI,CAAC,IAAI,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;QACL,EAAE;QACF,SAAS;QACT,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;QACpC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,SAAiB,EACjB,EAAU,EACV,IAA+B;IAE/B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,6DAA6D,CAC9D,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAA+B,CAAC;IAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;QAChC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;QACrD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;QAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;QACnE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;KACzD,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAErD,EAAE,CAAC,OAAO,CAAC;;;;GAIV,CAAC,CAAC,GAAG,CACJ,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EACnD,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,CAC/D,CAAC;IAEF,OAAO,gBAAgB,CAAC;QACtB,GAAG,QAAQ;QACX,GAAG,OAAO;QACV,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,SAAiB,EAAE,EAAU;IACpF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,2DAA2D,CAC5D,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAErB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,SAAiB;IACtE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sEAAsE,CACvE,CAAC,GAAG,CAAC,SAAS,CAAqB,CAAC;IAErC,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAqB,EAAE,SAAiB,EAAE,IAAY;IACzF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,+DAA+D,CAChE,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAA+B,CAAC;IAErD,OAAO,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC"}
|
|
@@ -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"}
|
|
@@ -293,6 +293,45 @@ const migrations = [
|
|
|
293
293
|
CREATE INDEX IF NOT EXISTS idx_ttu_called ON tool_token_usage(called_at);
|
|
294
294
|
`,
|
|
295
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
|
+
},
|
|
296
335
|
];
|
|
297
336
|
export function runMigrations(db) {
|
|
298
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;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;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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"}
|