mcp-context-sync 1.0.11 → 1.0.13
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/cli.js +253 -49
- package/dist/cli.js.map +1 -1
- package/dist/db/connection.d.ts +10 -1
- package/dist/db/connection.js +59 -23
- package/dist/db/connection.js.map +1 -1
- package/dist/db/json-adapter.d.ts +47 -0
- package/dist/db/json-adapter.js +235 -0
- package/dist/db/json-adapter.js.map +1 -0
- package/dist/db/sqlite-adapter.d.ts +37 -0
- package/dist/db/sqlite-adapter.js +78 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/db/storage.d.ts +41 -0
- package/dist/db/storage.js +9 -0
- package/dist/db/storage.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/resources/project-decisions.d.ts +2 -2
- package/dist/resources/project-decisions.js +3 -4
- package/dist/resources/project-decisions.js.map +1 -1
- package/dist/resources/project-snapshot.d.ts +2 -2
- package/dist/resources/project-snapshot.js +3 -4
- package/dist/resources/project-snapshot.js.map +1 -1
- package/dist/resources/status.d.ts +2 -2
- package/dist/resources/status.js +1 -2
- package/dist/resources/status.js.map +1 -1
- package/dist/tools/amend-snapshot.d.ts +2 -2
- package/dist/tools/amend-snapshot.js +9 -10
- package/dist/tools/amend-snapshot.js.map +1 -1
- package/dist/tools/get-history.d.ts +2 -2
- package/dist/tools/get-history.js +3 -4
- package/dist/tools/get-history.js.map +1 -1
- package/dist/tools/list-projects.d.ts +2 -2
- package/dist/tools/list-projects.js +1 -2
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/log-decision.d.ts +2 -2
- package/dist/tools/log-decision.js +2 -3
- package/dist/tools/log-decision.js.map +1 -1
- package/dist/tools/resume.d.ts +2 -2
- package/dist/tools/resume.js +7 -8
- package/dist/tools/resume.js.map +1 -1
- package/dist/tools/search-snapshots.d.ts +2 -2
- package/dist/tools/search-snapshots.js +2 -3
- package/dist/tools/search-snapshots.js.map +1 -1
- package/dist/tools/sync.d.ts +2 -2
- package/dist/tools/sync.js +5 -6
- package/dist/tools/sync.js.map +1 -1
- package/package.json +4 -2
- package/scripts/postinstall.cjs +14 -34
- package/scripts/preinstall.cjs +13 -86
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteAdapter — StorageAdapter backed by better-sqlite3.
|
|
3
|
+
*
|
|
4
|
+
* Every method delegates to the corresponding function in queries.ts,
|
|
5
|
+
* passing the internal Database instance as the first argument.
|
|
6
|
+
*/
|
|
7
|
+
import { upsertProject, getProject, listProjects, updateProjectSyncStats, getNextSequenceNumber, insertSnapshot, getLatestSnapshot, getSnapshotById, getSnapshotsByProject, updateSnapshot, searchSnapshots, insertDecision, getDecisionsByProject, insertHandoff, getHandoffsByProject, getProjectAgents, getTotalCounts, } from './queries.js';
|
|
8
|
+
export class SqliteAdapter {
|
|
9
|
+
backend = 'sqlite';
|
|
10
|
+
db;
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
}
|
|
14
|
+
// ─── Projects ──────────────────────────────────────────────────
|
|
15
|
+
upsertProject(id, normalizedPath, displayName) {
|
|
16
|
+
return upsertProject(this.db, id, normalizedPath, displayName);
|
|
17
|
+
}
|
|
18
|
+
getProject(id) {
|
|
19
|
+
return getProject(this.db, id);
|
|
20
|
+
}
|
|
21
|
+
listProjects() {
|
|
22
|
+
return listProjects(this.db);
|
|
23
|
+
}
|
|
24
|
+
updateProjectSyncStats(projectId) {
|
|
25
|
+
updateProjectSyncStats(this.db, projectId);
|
|
26
|
+
}
|
|
27
|
+
// ─── Snapshots ─────────────────────────────────────────────────
|
|
28
|
+
getNextSequenceNumber(projectId) {
|
|
29
|
+
return getNextSequenceNumber(this.db, projectId);
|
|
30
|
+
}
|
|
31
|
+
insertSnapshot(snapshot) {
|
|
32
|
+
insertSnapshot(this.db, snapshot);
|
|
33
|
+
}
|
|
34
|
+
getLatestSnapshot(projectId) {
|
|
35
|
+
return getLatestSnapshot(this.db, projectId);
|
|
36
|
+
}
|
|
37
|
+
getSnapshotById(snapshotId) {
|
|
38
|
+
return getSnapshotById(this.db, snapshotId);
|
|
39
|
+
}
|
|
40
|
+
getSnapshotsByProject(projectId, limit) {
|
|
41
|
+
return getSnapshotsByProject(this.db, projectId, limit);
|
|
42
|
+
}
|
|
43
|
+
updateSnapshot(snapshotId, fields) {
|
|
44
|
+
updateSnapshot(this.db, snapshotId, fields);
|
|
45
|
+
}
|
|
46
|
+
searchSnapshots(query, projectId, agent, since, until, limit = 20) {
|
|
47
|
+
return searchSnapshots(this.db, query, projectId, agent, since, until, limit);
|
|
48
|
+
}
|
|
49
|
+
// ─── Decisions ─────────────────────────────────────────────────
|
|
50
|
+
insertDecision(row) {
|
|
51
|
+
insertDecision(this.db, row);
|
|
52
|
+
}
|
|
53
|
+
getDecisionsByProject(projectId, limit = 50) {
|
|
54
|
+
return getDecisionsByProject(this.db, projectId, limit);
|
|
55
|
+
}
|
|
56
|
+
// ─── Handoffs ──────────────────────────────────────────────────
|
|
57
|
+
insertHandoff(row) {
|
|
58
|
+
insertHandoff(this.db, row);
|
|
59
|
+
}
|
|
60
|
+
getHandoffsByProject(projectId, limit = 20) {
|
|
61
|
+
return getHandoffsByProject(this.db, projectId, limit);
|
|
62
|
+
}
|
|
63
|
+
// ─── Stats ─────────────────────────────────────────────────────
|
|
64
|
+
getProjectAgents(projectId) {
|
|
65
|
+
return getProjectAgents(this.db, projectId);
|
|
66
|
+
}
|
|
67
|
+
getTotalCounts() {
|
|
68
|
+
return getTotalCounts(this.db);
|
|
69
|
+
}
|
|
70
|
+
// ─── Lifecycle ─────────────────────────────────────────────────
|
|
71
|
+
transaction(fn) {
|
|
72
|
+
return this.db.transaction(fn);
|
|
73
|
+
}
|
|
74
|
+
close() {
|
|
75
|
+
this.db.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/db/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StorageAdapter — backend-agnostic interface for context-sync persistence.
|
|
3
|
+
*
|
|
4
|
+
* Every method mirrors an exported function from queries.ts but without the
|
|
5
|
+
* leading `db` parameter. Implementations: SqliteAdapter (better-sqlite3)
|
|
6
|
+
* and JsonAdapter (plain JSON files).
|
|
7
|
+
*/
|
|
8
|
+
export type { ProjectRow, SnapshotRow, DecisionRow, HandoffRow, } from '../lib/types.js';
|
|
9
|
+
import type { ProjectRow, SnapshotRow, DecisionRow, HandoffRow } from '../lib/types.js';
|
|
10
|
+
export interface StorageAdapter {
|
|
11
|
+
/** Identifies the backing store for doctor/diagnostics. */
|
|
12
|
+
readonly backend: 'sqlite' | 'json';
|
|
13
|
+
upsertProject(id: string, normalizedPath: string, displayName: string): ProjectRow;
|
|
14
|
+
getProject(id: string): ProjectRow | undefined;
|
|
15
|
+
listProjects(): ProjectRow[];
|
|
16
|
+
updateProjectSyncStats(projectId: string): void;
|
|
17
|
+
getNextSequenceNumber(projectId: string): number;
|
|
18
|
+
insertSnapshot(snapshot: Omit<SnapshotRow, 'amended_at' | 'amended_by'>): void;
|
|
19
|
+
getLatestSnapshot(projectId: string): SnapshotRow | undefined;
|
|
20
|
+
getSnapshotById(snapshotId: string): SnapshotRow | undefined;
|
|
21
|
+
getSnapshotsByProject(projectId: string, limit: number): SnapshotRow[];
|
|
22
|
+
updateSnapshot(snapshotId: string, fields: Partial<Pick<SnapshotRow, 'tasks_completed' | 'tasks_remaining' | 'decisions' | 'next_steps' | 'blockers' | 'tags' | 'amended_at' | 'amended_by'>>): void;
|
|
23
|
+
searchSnapshots(query: string, projectId?: string, agent?: string, since?: string, until?: string, limit?: number): SnapshotRow[];
|
|
24
|
+
insertDecision(row: DecisionRow): void;
|
|
25
|
+
getDecisionsByProject(projectId: string, limit?: number): DecisionRow[];
|
|
26
|
+
insertHandoff(row: HandoffRow): void;
|
|
27
|
+
getHandoffsByProject(projectId: string, limit?: number): HandoffRow[];
|
|
28
|
+
getProjectAgents(projectId: string): string[];
|
|
29
|
+
getTotalCounts(): {
|
|
30
|
+
projects: number;
|
|
31
|
+
snapshots: number;
|
|
32
|
+
handoffs: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Returns a callable that, when invoked, executes `fn` inside a
|
|
36
|
+
* transaction (matching better-sqlite3's `db.transaction(fn)` pattern).
|
|
37
|
+
*/
|
|
38
|
+
transaction<T>(fn: () => T): () => T;
|
|
39
|
+
/** Release any resources held by the adapter. */
|
|
40
|
+
close(): void;
|
|
41
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StorageAdapter — backend-agnostic interface for context-sync persistence.
|
|
3
|
+
*
|
|
4
|
+
* Every method mirrors an exported function from queries.ts but without the
|
|
5
|
+
* leading `db` parameter. Implementations: SqliteAdapter (better-sqlite3)
|
|
6
|
+
* and JsonAdapter (plain JSON files).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/db/storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getStorage, closeStorage } from './db/connection.js';
|
|
5
5
|
import { registerSyncTool } from './tools/sync.js';
|
|
6
6
|
import { registerResumeTool } from './tools/resume.js';
|
|
7
7
|
import { registerLogDecisionTool } from './tools/log-decision.js';
|
|
@@ -13,7 +13,7 @@ import { registerStatusResource } from './resources/status.js';
|
|
|
13
13
|
import { registerProjectSnapshotResource } from './resources/project-snapshot.js';
|
|
14
14
|
import { registerProjectDecisionsResource } from './resources/project-decisions.js';
|
|
15
15
|
async function main() {
|
|
16
|
-
const db =
|
|
16
|
+
const db = getStorage();
|
|
17
17
|
const server = new McpServer({
|
|
18
18
|
name: 'context-sync',
|
|
19
19
|
version: '1.0.0',
|
|
@@ -35,11 +35,11 @@ async function main() {
|
|
|
35
35
|
await server.connect(transport);
|
|
36
36
|
// Cleanup on exit
|
|
37
37
|
process.on('SIGINT', () => {
|
|
38
|
-
|
|
38
|
+
closeStorage();
|
|
39
39
|
process.exit(0);
|
|
40
40
|
});
|
|
41
41
|
process.on('SIGTERM', () => {
|
|
42
|
-
|
|
42
|
+
closeStorage();
|
|
43
43
|
process.exit(0);
|
|
44
44
|
});
|
|
45
45
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AAEpF,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,QAAQ;IACR,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/B,uBAAuB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtC,YAAY;IACZ,sBAAsB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,+BAA+B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,gCAAgC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7C,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerProjectDecisionsResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerProjectDecisionsResource(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { listProjects, getDecisionsByProject } from '../db/queries.js';
|
|
3
2
|
export function registerProjectDecisionsResource(server, db) {
|
|
4
3
|
server.registerResource('project-decisions', new ResourceTemplate('context-sync://project/{projectId}/decisions', {
|
|
5
4
|
list: async () => {
|
|
6
|
-
const projects = listProjects(
|
|
5
|
+
const projects = db.listProjects();
|
|
7
6
|
return {
|
|
8
7
|
resources: projects.map((p) => ({
|
|
9
8
|
uri: `context-sync://project/${p.id}/decisions`,
|
|
@@ -19,7 +18,7 @@ export function registerProjectDecisionsResource(server, db) {
|
|
|
19
18
|
mimeType: 'text/markdown',
|
|
20
19
|
}, async (uri, { projectId }) => {
|
|
21
20
|
const pid = projectId;
|
|
22
|
-
const decisions = getDecisionsByProject(
|
|
21
|
+
const decisions = db.getDecisionsByProject(pid);
|
|
23
22
|
if (decisions.length === 0) {
|
|
24
23
|
return {
|
|
25
24
|
contents: [
|
|
@@ -31,7 +30,7 @@ export function registerProjectDecisionsResource(server, db) {
|
|
|
31
30
|
],
|
|
32
31
|
};
|
|
33
32
|
}
|
|
34
|
-
const projects = listProjects(
|
|
33
|
+
const projects = db.listProjects();
|
|
35
34
|
const project = projects.find((p) => p.id === pid);
|
|
36
35
|
const displayName = project?.display_name ?? pid;
|
|
37
36
|
const lines = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-decisions.js","sourceRoot":"","sources":["../../src/resources/project-decisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-decisions.js","sourceRoot":"","sources":["../../src/resources/project-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerProjectSnapshotResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerProjectSnapshotResource(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { listProjects, getLatestSnapshot, } from '../db/queries.js';
|
|
3
2
|
import { renderSnapshotMarkdown } from '../lib/snapshot-renderer.js';
|
|
4
3
|
export function registerProjectSnapshotResource(server, db) {
|
|
5
4
|
server.registerResource('project-snapshot', new ResourceTemplate('context-sync://project/{projectId}/latest', {
|
|
6
5
|
list: async () => {
|
|
7
|
-
const projects = listProjects(
|
|
6
|
+
const projects = db.listProjects();
|
|
8
7
|
return {
|
|
9
8
|
resources: projects.map((p) => ({
|
|
10
9
|
uri: `context-sync://project/${p.id}/latest`,
|
|
@@ -20,7 +19,7 @@ export function registerProjectSnapshotResource(server, db) {
|
|
|
20
19
|
mimeType: 'text/markdown',
|
|
21
20
|
}, async (uri, { projectId }) => {
|
|
22
21
|
const pid = projectId;
|
|
23
|
-
const snapshot = getLatestSnapshot(
|
|
22
|
+
const snapshot = db.getLatestSnapshot(pid);
|
|
24
23
|
if (!snapshot) {
|
|
25
24
|
return {
|
|
26
25
|
contents: [
|
|
@@ -32,7 +31,7 @@ export function registerProjectSnapshotResource(server, db) {
|
|
|
32
31
|
],
|
|
33
32
|
};
|
|
34
33
|
}
|
|
35
|
-
const projects = listProjects(
|
|
34
|
+
const projects = db.listProjects();
|
|
36
35
|
const project = projects.find((p) => p.id === pid);
|
|
37
36
|
const displayName = project?.display_name ?? pid;
|
|
38
37
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-snapshot.js","sourceRoot":"","sources":["../../src/resources/project-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,
|
|
1
|
+
{"version":3,"file":"project-snapshot.js","sourceRoot":"","sources":["../../src/resources/project-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkB,MAAM,yCAAyC,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,UAAU,+BAA+B,CAC7C,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,IAAI,gBAAgB,CAAC,2CAA2C,EAAE;QAChE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YACnC,OAAO;gBACL,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,GAAG,EAAE,0BAA0B,CAAC,CAAC,EAAE,SAAS;oBAC5C,IAAI,EAAE,GAAG,CAAC,CAAC,YAAY,oBAAoB;oBAC3C,WAAW,EAAE,oCAAoC,CAAC,CAAC,YAAY,EAAE;oBACjE,QAAQ,EAAE,eAAwB;iBACnC,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,SAAmB,CAAC;QAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,sCAAsC;qBAC7C;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC;QAEjD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC;iBACpD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerStatusResource(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerStatusResource(server: McpServer, db: StorageAdapter): void;
|
package/dist/resources/status.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { getTotalCounts } from '../db/queries.js';
|
|
2
1
|
export function registerStatusResource(server, db) {
|
|
3
2
|
server.registerResource('server-status', 'context-sync://status', {
|
|
4
3
|
title: 'Context Sync Server Status',
|
|
5
4
|
description: 'Server version, total projects, snapshots, and handoffs',
|
|
6
5
|
mimeType: 'application/json',
|
|
7
6
|
}, async (uri) => {
|
|
8
|
-
const counts = getTotalCounts(
|
|
7
|
+
const counts = db.getTotalCounts();
|
|
9
8
|
return {
|
|
10
9
|
contents: [
|
|
11
10
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/resources/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/resources/status.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,uBAAuB,EACvB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,OAAO;wBAChB,aAAa,EAAE,MAAM,CAAC,QAAQ;wBAC9B,cAAc,EAAE,MAAM,CAAC,SAAS;wBAChC,aAAa,EAAE,MAAM,CAAC,QAAQ;qBAC/B,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerAmendSnapshotTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerAmendSnapshotTool(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AmendSnapshotInputSchema } from '../lib/types.js';
|
|
2
2
|
import { projectIdFromPath, displayNameFromPath, } from '../lib/project-id.js';
|
|
3
|
-
import { getLatestSnapshot, updateSnapshot, insertDecision } from '../db/queries.js';
|
|
4
3
|
import { generateId } from '../lib/uuid.js';
|
|
5
4
|
export function registerAmendSnapshotTool(server, db) {
|
|
6
5
|
server.registerTool('amend-snapshot', {
|
|
@@ -17,7 +16,7 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
17
16
|
}, async (input) => {
|
|
18
17
|
const projectId = projectIdFromPath(input.projectDir);
|
|
19
18
|
const displayName = displayNameFromPath(input.projectDir);
|
|
20
|
-
const snapshot = getLatestSnapshot(
|
|
19
|
+
const snapshot = db.getLatestSnapshot(projectId);
|
|
21
20
|
if (!snapshot) {
|
|
22
21
|
return {
|
|
23
22
|
content: [
|
|
@@ -34,7 +33,7 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
34
33
|
if (input.addTasksCompleted?.length) {
|
|
35
34
|
const current = JSON.parse(snapshot.tasks_completed);
|
|
36
35
|
current.push(...input.addTasksCompleted);
|
|
37
|
-
updateSnapshot(
|
|
36
|
+
db.updateSnapshot(snapshot.id, {
|
|
38
37
|
tasks_completed: JSON.stringify(current),
|
|
39
38
|
});
|
|
40
39
|
changes.push(`Added ${input.addTasksCompleted.length} completed tasks`);
|
|
@@ -51,7 +50,7 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
51
50
|
changes.push(`Added ${input.addTasksRemaining.length} remaining tasks`);
|
|
52
51
|
}
|
|
53
52
|
if (input.removeTasksRemaining?.length || input.addTasksRemaining?.length) {
|
|
54
|
-
updateSnapshot(
|
|
53
|
+
db.updateSnapshot(snapshot.id, {
|
|
55
54
|
tasks_remaining: JSON.stringify(remaining),
|
|
56
55
|
});
|
|
57
56
|
}
|
|
@@ -59,11 +58,11 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
59
58
|
if (input.addDecisions?.length) {
|
|
60
59
|
const current = JSON.parse(snapshot.decisions);
|
|
61
60
|
current.push(...input.addDecisions);
|
|
62
|
-
updateSnapshot(
|
|
61
|
+
db.updateSnapshot(snapshot.id, {
|
|
63
62
|
decisions: JSON.stringify(current),
|
|
64
63
|
});
|
|
65
64
|
for (const d of input.addDecisions) {
|
|
66
|
-
insertDecision(
|
|
65
|
+
db.insertDecision({
|
|
67
66
|
id: generateId(),
|
|
68
67
|
project_id: projectId,
|
|
69
68
|
snapshot_id: snapshot.id,
|
|
@@ -80,7 +79,7 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
80
79
|
}
|
|
81
80
|
// Next steps
|
|
82
81
|
if (input.updateNextSteps) {
|
|
83
|
-
updateSnapshot(
|
|
82
|
+
db.updateSnapshot(snapshot.id, {
|
|
84
83
|
next_steps: input.updateNextSteps,
|
|
85
84
|
});
|
|
86
85
|
changes.push('Updated next steps');
|
|
@@ -97,7 +96,7 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
97
96
|
changes.push(`Added ${input.addBlockers.length} blockers`);
|
|
98
97
|
}
|
|
99
98
|
if (input.removeBlockers?.length || input.addBlockers?.length) {
|
|
100
|
-
updateSnapshot(
|
|
99
|
+
db.updateSnapshot(snapshot.id, {
|
|
101
100
|
blockers: JSON.stringify(blockers),
|
|
102
101
|
});
|
|
103
102
|
}
|
|
@@ -105,11 +104,11 @@ export function registerAmendSnapshotTool(server, db) {
|
|
|
105
104
|
if (input.addTags?.length) {
|
|
106
105
|
const current = JSON.parse(snapshot.tags);
|
|
107
106
|
const unique = [...new Set([...current, ...input.addTags])];
|
|
108
|
-
updateSnapshot(
|
|
107
|
+
db.updateSnapshot(snapshot.id, { tags: JSON.stringify(unique) });
|
|
109
108
|
changes.push(`Added ${input.addTags.length} tags`);
|
|
110
109
|
}
|
|
111
110
|
// Mark as amended
|
|
112
|
-
updateSnapshot(
|
|
111
|
+
db.updateSnapshot(snapshot.id, {
|
|
113
112
|
amended_at: now,
|
|
114
113
|
amended_by: input.agent,
|
|
115
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amend-snapshot.js","sourceRoot":"","sources":["../../src/tools/amend-snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAiB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"amend-snapshot.js","sourceRoot":"","sources":["../../src/tools/amend-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerGetHistoryTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerGetHistoryTool(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { GetHistoryInputSchema } from '../lib/types.js';
|
|
2
2
|
import { projectIdFromPath, displayNameFromPath, } from '../lib/project-id.js';
|
|
3
|
-
import { getProject, getSnapshotsByProject, getHandoffsByProject, } from '../db/queries.js';
|
|
4
3
|
export function registerGetHistoryTool(server, db) {
|
|
5
4
|
server.registerTool('get-history', {
|
|
6
5
|
title: 'Get Project Handoff History',
|
|
@@ -15,7 +14,7 @@ export function registerGetHistoryTool(server, db) {
|
|
|
15
14
|
}, async (input) => {
|
|
16
15
|
const projectId = projectIdFromPath(input.projectDir);
|
|
17
16
|
const displayName = displayNameFromPath(input.projectDir);
|
|
18
|
-
const project = getProject(
|
|
17
|
+
const project = db.getProject(projectId);
|
|
19
18
|
if (!project) {
|
|
20
19
|
return {
|
|
21
20
|
content: [
|
|
@@ -26,11 +25,11 @@ export function registerGetHistoryTool(server, db) {
|
|
|
26
25
|
],
|
|
27
26
|
};
|
|
28
27
|
}
|
|
29
|
-
let snapshots = getSnapshotsByProject(
|
|
28
|
+
let snapshots = db.getSnapshotsByProject(projectId, input.limit);
|
|
30
29
|
if (input.agentFilter !== 'all') {
|
|
31
30
|
snapshots = snapshots.filter((s) => s.agent === input.agentFilter);
|
|
32
31
|
}
|
|
33
|
-
const handoffs = getHandoffsByProject(
|
|
32
|
+
const handoffs = db.getHandoffsByProject(projectId, 50);
|
|
34
33
|
const lines = [];
|
|
35
34
|
lines.push(`# Project Timeline: ${displayName}`);
|
|
36
35
|
lines.push(`Total: ${project.snapshot_count} snapshots, ${project.handoff_count} handoffs`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAiB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerListProjectsTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerListProjectsTool(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ListProjectsInputSchema } from '../lib/types.js';
|
|
2
|
-
import { listProjects } from '../db/queries.js';
|
|
3
2
|
export function registerListProjectsTool(server, db) {
|
|
4
3
|
server.registerTool('list-projects', {
|
|
5
4
|
title: 'List Synced Projects',
|
|
@@ -12,7 +11,7 @@ export function registerListProjectsTool(server, db) {
|
|
|
12
11
|
openWorldHint: false,
|
|
13
12
|
},
|
|
14
13
|
}, async () => {
|
|
15
|
-
const projects = listProjects(
|
|
14
|
+
const projects = db.listProjects();
|
|
16
15
|
if (projects.length === 0) {
|
|
17
16
|
return {
|
|
18
17
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,yEAAyE;QAC3E,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,sFAAsF;qBAC7F;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAa,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CACR,sBAAsB,CAAC,CAAC,cAAc,IAAI,OAAO,EAAE,CACpD,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC7D,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerLogDecisionTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerLogDecisionTool(server: McpServer, db: StorageAdapter): void;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { LogDecisionInputSchema } from '../lib/types.js';
|
|
2
2
|
import { projectIdFromPath, normalizePath, displayNameFromPath, } from '../lib/project-id.js';
|
|
3
3
|
import { generateId } from '../lib/uuid.js';
|
|
4
|
-
import { upsertProject, insertDecision } from '../db/queries.js';
|
|
5
4
|
export function registerLogDecisionTool(server, db) {
|
|
6
5
|
server.registerTool('log-decision', {
|
|
7
6
|
title: 'Log Decision',
|
|
@@ -20,8 +19,8 @@ export function registerLogDecisionTool(server, db) {
|
|
|
20
19
|
const displayName = displayNameFromPath(input.projectDir);
|
|
21
20
|
const now = new Date().toISOString();
|
|
22
21
|
const decisionId = generateId();
|
|
23
|
-
upsertProject(
|
|
24
|
-
insertDecision(
|
|
22
|
+
db.upsertProject(projectId, normalized, displayName);
|
|
23
|
+
db.insertDecision({
|
|
25
24
|
id: decisionId,
|
|
26
25
|
project_id: projectId,
|
|
27
26
|
snapshot_id: null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-decision.js","sourceRoot":"","sources":["../../src/tools/log-decision.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"log-decision.js","sourceRoot":"","sources":["../../src/tools/log-decision.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,EAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,sEAAsE;YACtE,mGAAmG;QACrG,WAAW,EAAE,sBAAsB;QACnC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;QAEhC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAErD,EAAE,CAAC,cAAc,CAAC;YAChB,EAAE,EAAE,UAAU;YACd,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;YACtD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YAChC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;YACvD,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wBAAwB,WAAW,WAAW,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,SAAS,WAAW,UAAU,EAAE;iBAChH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/resume.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function registerResumeTool(server: McpServer, db:
|
|
2
|
+
import type { StorageAdapter } from '../db/storage.js';
|
|
3
|
+
export declare function registerResumeTool(server: McpServer, db: StorageAdapter): void;
|
package/dist/tools/resume.js
CHANGED
|
@@ -2,7 +2,6 @@ import { ResumeInputSchema } from '../lib/types.js';
|
|
|
2
2
|
import { projectIdFromPath, displayNameFromPath, normalizePath, } from '../lib/project-id.js';
|
|
3
3
|
import { generateId } from '../lib/uuid.js';
|
|
4
4
|
import { renderSnapshotMarkdown } from '../lib/snapshot-renderer.js';
|
|
5
|
-
import { getProject, getLatestSnapshot, getSnapshotById, insertHandoff, updateProjectSyncStats, getProjectAgents, listProjects, } from '../db/queries.js';
|
|
6
5
|
export function registerResumeTool(server, db) {
|
|
7
6
|
server.registerTool('resume', {
|
|
8
7
|
title: 'Resume from Context Snapshot',
|
|
@@ -18,13 +17,13 @@ export function registerResumeTool(server, db) {
|
|
|
18
17
|
}, async (input) => {
|
|
19
18
|
const projectId = projectIdFromPath(input.projectDir);
|
|
20
19
|
const displayName = displayNameFromPath(input.projectDir);
|
|
21
|
-
const project = getProject(
|
|
20
|
+
const project = db.getProject(projectId);
|
|
22
21
|
if (!project) {
|
|
23
22
|
return { content: [{ type: 'text', text: buildNotFoundMessage(db, input.projectDir, displayName, projectId) }] };
|
|
24
23
|
}
|
|
25
24
|
const snapshot = input.snapshotId
|
|
26
|
-
? getSnapshotById(
|
|
27
|
-
: getLatestSnapshot(
|
|
25
|
+
? db.getSnapshotById(input.snapshotId)
|
|
26
|
+
: db.getLatestSnapshot(projectId);
|
|
28
27
|
if (!snapshot) {
|
|
29
28
|
return {
|
|
30
29
|
content: [{
|
|
@@ -36,7 +35,7 @@ export function registerResumeTool(server, db) {
|
|
|
36
35
|
// Register the handoff in a transaction
|
|
37
36
|
const now = new Date().toISOString();
|
|
38
37
|
const agents = db.transaction(() => {
|
|
39
|
-
insertHandoff(
|
|
38
|
+
db.insertHandoff({
|
|
40
39
|
id: generateId(),
|
|
41
40
|
project_id: projectId,
|
|
42
41
|
snapshot_id: snapshot.id,
|
|
@@ -46,8 +45,8 @@ export function registerResumeTool(server, db) {
|
|
|
46
45
|
to_timestamp: now,
|
|
47
46
|
created_at: now,
|
|
48
47
|
});
|
|
49
|
-
updateProjectSyncStats(
|
|
50
|
-
return getProjectAgents(
|
|
48
|
+
db.updateProjectSyncStats(projectId);
|
|
49
|
+
return db.getProjectAgents(projectId);
|
|
51
50
|
})();
|
|
52
51
|
const markdown = renderSnapshotMarkdown(snapshot, displayName, {
|
|
53
52
|
totalSnapshots: project.snapshot_count,
|
|
@@ -62,7 +61,7 @@ export function registerResumeTool(server, db) {
|
|
|
62
61
|
// ---------------------------------------------------------------------------
|
|
63
62
|
function buildNotFoundMessage(db, inputPath, displayName, projectId) {
|
|
64
63
|
const normalized = normalizePath(inputPath);
|
|
65
|
-
const allProjects = listProjects(
|
|
64
|
+
const allProjects = db.listProjects();
|
|
66
65
|
const lines = [
|
|
67
66
|
`No context-sync data found for project "${displayName}"`,
|
|
68
67
|
'',
|