mcp-context-sync 1.0.11 → 1.0.12

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.
Files changed (49) hide show
  1. package/dist/cli.js +57 -49
  2. package/dist/cli.js.map +1 -1
  3. package/dist/db/connection.d.ts +10 -1
  4. package/dist/db/connection.js +59 -23
  5. package/dist/db/connection.js.map +1 -1
  6. package/dist/db/json-adapter.d.ts +47 -0
  7. package/dist/db/json-adapter.js +235 -0
  8. package/dist/db/json-adapter.js.map +1 -0
  9. package/dist/db/sqlite-adapter.d.ts +37 -0
  10. package/dist/db/sqlite-adapter.js +78 -0
  11. package/dist/db/sqlite-adapter.js.map +1 -0
  12. package/dist/db/storage.d.ts +41 -0
  13. package/dist/db/storage.js +9 -0
  14. package/dist/db/storage.js.map +1 -0
  15. package/dist/index.js +4 -4
  16. package/dist/index.js.map +1 -1
  17. package/dist/resources/project-decisions.d.ts +2 -2
  18. package/dist/resources/project-decisions.js +3 -4
  19. package/dist/resources/project-decisions.js.map +1 -1
  20. package/dist/resources/project-snapshot.d.ts +2 -2
  21. package/dist/resources/project-snapshot.js +3 -4
  22. package/dist/resources/project-snapshot.js.map +1 -1
  23. package/dist/resources/status.d.ts +2 -2
  24. package/dist/resources/status.js +1 -2
  25. package/dist/resources/status.js.map +1 -1
  26. package/dist/tools/amend-snapshot.d.ts +2 -2
  27. package/dist/tools/amend-snapshot.js +9 -10
  28. package/dist/tools/amend-snapshot.js.map +1 -1
  29. package/dist/tools/get-history.d.ts +2 -2
  30. package/dist/tools/get-history.js +3 -4
  31. package/dist/tools/get-history.js.map +1 -1
  32. package/dist/tools/list-projects.d.ts +2 -2
  33. package/dist/tools/list-projects.js +1 -2
  34. package/dist/tools/list-projects.js.map +1 -1
  35. package/dist/tools/log-decision.d.ts +2 -2
  36. package/dist/tools/log-decision.js +2 -3
  37. package/dist/tools/log-decision.js.map +1 -1
  38. package/dist/tools/resume.d.ts +2 -2
  39. package/dist/tools/resume.js +7 -8
  40. package/dist/tools/resume.js.map +1 -1
  41. package/dist/tools/search-snapshots.d.ts +2 -2
  42. package/dist/tools/search-snapshots.js +2 -3
  43. package/dist/tools/search-snapshots.js.map +1 -1
  44. package/dist/tools/sync.d.ts +2 -2
  45. package/dist/tools/sync.js +5 -6
  46. package/dist/tools/sync.js.map +1 -1
  47. package/package.json +4 -2
  48. package/scripts/postinstall.cjs +14 -34
  49. package/scripts/preinstall.cjs +13 -86
@@ -0,0 +1,235 @@
1
+ /**
2
+ * JsonAdapter — StorageAdapter backed by plain JSON files.
3
+ *
4
+ * Falls back to this when better-sqlite3 is unavailable (e.g. environments
5
+ * where native modules cannot be compiled).
6
+ *
7
+ * Data lives in the same directory as the SQLite DB:
8
+ * ~/.agents/context-sync/data/{projects,snapshots,decisions,handoffs}.json
9
+ */
10
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ // ─── Helpers ───────────────────────────────────────────────────────
13
+ function readJsonArray(filePath) {
14
+ if (!existsSync(filePath))
15
+ return [];
16
+ try {
17
+ const raw = readFileSync(filePath, 'utf-8');
18
+ const parsed = JSON.parse(raw);
19
+ return Array.isArray(parsed) ? parsed : [];
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ function flush(filePath, data) {
26
+ writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
27
+ }
28
+ // ─── Adapter ───────────────────────────────────────────────────────
29
+ export class JsonAdapter {
30
+ backend = 'json';
31
+ dataDir;
32
+ projectsPath;
33
+ snapshotsPath;
34
+ decisionsPath;
35
+ handoffsPath;
36
+ projects;
37
+ snapshots;
38
+ decisions;
39
+ handoffs;
40
+ constructor(dataDir) {
41
+ this.dataDir = dataDir;
42
+ mkdirSync(dataDir, { recursive: true });
43
+ this.projectsPath = join(dataDir, 'projects.json');
44
+ this.snapshotsPath = join(dataDir, 'snapshots.json');
45
+ this.decisionsPath = join(dataDir, 'decisions.json');
46
+ this.handoffsPath = join(dataDir, 'handoffs.json');
47
+ this.projects = readJsonArray(this.projectsPath);
48
+ this.snapshots = readJsonArray(this.snapshotsPath);
49
+ this.decisions = readJsonArray(this.decisionsPath);
50
+ this.handoffs = readJsonArray(this.handoffsPath);
51
+ }
52
+ // ─── Projects ──────────────────────────────────────────────────
53
+ upsertProject(id, normalizedPath, displayName) {
54
+ const existing = this.projects.find((p) => p.id === id);
55
+ if (existing) {
56
+ return existing;
57
+ }
58
+ const now = new Date().toISOString();
59
+ const row = {
60
+ id,
61
+ normalized_path: normalizedPath,
62
+ display_name: displayName,
63
+ created_at: now,
64
+ last_synced_at: null,
65
+ snapshot_count: 0,
66
+ handoff_count: 0,
67
+ };
68
+ this.projects.push(row);
69
+ flush(this.projectsPath, this.projects);
70
+ return row;
71
+ }
72
+ getProject(id) {
73
+ return this.projects.find((p) => p.id === id);
74
+ }
75
+ listProjects() {
76
+ return [...this.projects].sort((a, b) => {
77
+ const aTime = a.last_synced_at ?? '';
78
+ const bTime = b.last_synced_at ?? '';
79
+ return bTime.localeCompare(aTime);
80
+ });
81
+ }
82
+ updateProjectSyncStats(projectId) {
83
+ const project = this.projects.find((p) => p.id === projectId);
84
+ if (!project)
85
+ return;
86
+ const now = new Date().toISOString();
87
+ project.last_synced_at = now;
88
+ project.snapshot_count = this.snapshots.filter((s) => s.project_id === projectId).length;
89
+ project.handoff_count = this.handoffs.filter((h) => h.project_id === projectId).length;
90
+ flush(this.projectsPath, this.projects);
91
+ }
92
+ // ─── Snapshots ─────────────────────────────────────────────────
93
+ getNextSequenceNumber(projectId) {
94
+ const seqs = this.snapshots
95
+ .filter((s) => s.project_id === projectId)
96
+ .map((s) => s.sequence_number);
97
+ return seqs.length === 0 ? 1 : Math.max(...seqs) + 1;
98
+ }
99
+ insertSnapshot(snapshot) {
100
+ const row = {
101
+ ...snapshot,
102
+ amended_at: null,
103
+ amended_by: null,
104
+ };
105
+ this.snapshots.push(row);
106
+ flush(this.snapshotsPath, this.snapshots);
107
+ }
108
+ getLatestSnapshot(projectId) {
109
+ return [...this.snapshots]
110
+ .filter((s) => s.project_id === projectId)
111
+ .sort((a, b) => b.sequence_number - a.sequence_number)[0];
112
+ }
113
+ getSnapshotById(snapshotId) {
114
+ return this.snapshots.find((s) => s.id === snapshotId);
115
+ }
116
+ getSnapshotsByProject(projectId, limit) {
117
+ return [...this.snapshots]
118
+ .filter((s) => s.project_id === projectId)
119
+ .sort((a, b) => b.sequence_number - a.sequence_number)
120
+ .slice(0, limit);
121
+ }
122
+ updateSnapshot(snapshotId, fields) {
123
+ const snap = this.snapshots.find((s) => s.id === snapshotId);
124
+ if (!snap)
125
+ return;
126
+ for (const [key, value] of Object.entries(fields)) {
127
+ if (value !== undefined) {
128
+ snap[key] = value;
129
+ }
130
+ }
131
+ flush(this.snapshotsPath, this.snapshots);
132
+ }
133
+ searchSnapshots(query, projectId, agent, since, until, limit = 20) {
134
+ const q = query.toLowerCase();
135
+ const searchFields = [
136
+ 'summary',
137
+ 'tasks_completed',
138
+ 'tasks_remaining',
139
+ 'decisions',
140
+ 'next_steps',
141
+ 'tags',
142
+ ];
143
+ return this.snapshots
144
+ .filter((s) => {
145
+ // Text match across string fields
146
+ const matches = searchFields.some((field) => {
147
+ const val = s[field];
148
+ return typeof val === 'string' && val.toLowerCase().includes(q);
149
+ });
150
+ if (!matches)
151
+ return false;
152
+ // Filters
153
+ if (projectId && s.project_id !== projectId)
154
+ return false;
155
+ if (agent && s.agent !== agent)
156
+ return false;
157
+ if (since && s.created_at < since)
158
+ return false;
159
+ if (until && s.created_at > until)
160
+ return false;
161
+ return true;
162
+ })
163
+ .sort((a, b) => b.created_at.localeCompare(a.created_at))
164
+ .slice(0, limit);
165
+ }
166
+ // ─── Decisions ─────────────────────────────────────────────────
167
+ insertDecision(row) {
168
+ this.decisions.push(row);
169
+ flush(this.decisionsPath, this.decisions);
170
+ }
171
+ getDecisionsByProject(projectId, limit = 50) {
172
+ return [...this.decisions]
173
+ .filter((d) => d.project_id === projectId)
174
+ .sort((a, b) => b.created_at.localeCompare(a.created_at))
175
+ .slice(0, limit);
176
+ }
177
+ // ─── Handoffs ──────────────────────────────────────────────────
178
+ insertHandoff(row) {
179
+ this.handoffs.push(row);
180
+ flush(this.handoffsPath, this.handoffs);
181
+ }
182
+ getHandoffsByProject(projectId, limit = 20) {
183
+ return [...this.handoffs]
184
+ .filter((h) => h.project_id === projectId)
185
+ .sort((a, b) => b.created_at.localeCompare(a.created_at))
186
+ .slice(0, limit);
187
+ }
188
+ // ─── Stats ─────────────────────────────────────────────────────
189
+ getProjectAgents(projectId) {
190
+ const agents = new Set();
191
+ for (const s of this.snapshots) {
192
+ if (s.project_id === projectId) {
193
+ agents.add(s.agent);
194
+ }
195
+ }
196
+ return [...agents].sort();
197
+ }
198
+ getTotalCounts() {
199
+ return {
200
+ projects: this.projects.length,
201
+ snapshots: this.snapshots.length,
202
+ handoffs: this.handoffs.length,
203
+ };
204
+ }
205
+ // ─── Lifecycle ─────────────────────────────────────────────────
206
+ transaction(fn) {
207
+ return () => {
208
+ // Save shallow copies for rollback on error
209
+ const projectsBackup = [...this.projects];
210
+ const snapshotsBackup = [...this.snapshots];
211
+ const decisionsBackup = [...this.decisions];
212
+ const handoffsBackup = [...this.handoffs];
213
+ try {
214
+ return fn();
215
+ }
216
+ catch (err) {
217
+ // Restore from backup
218
+ this.projects = projectsBackup;
219
+ this.snapshots = snapshotsBackup;
220
+ this.decisions = decisionsBackup;
221
+ this.handoffs = handoffsBackup;
222
+ // Re-flush to disk to undo any partial writes
223
+ flush(this.projectsPath, this.projects);
224
+ flush(this.snapshotsPath, this.snapshots);
225
+ flush(this.decisionsPath, this.decisions);
226
+ flush(this.handoffsPath, this.handoffs);
227
+ throw err;
228
+ }
229
+ };
230
+ }
231
+ close() {
232
+ // No-op: data is already flushed on each write
233
+ }
234
+ }
235
+ //# sourceMappingURL=json-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-adapter.js","sourceRoot":"","sources":["../../src/db/json-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
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 type Database from 'better-sqlite3';
8
+ import type { StorageAdapter } from './storage.js';
9
+ import type { SnapshotRow, DecisionRow, HandoffRow, ProjectRow } from '../lib/types.js';
10
+ export declare class SqliteAdapter implements StorageAdapter {
11
+ readonly backend: "sqlite";
12
+ private readonly db;
13
+ constructor(db: Database.Database);
14
+ upsertProject(id: string, normalizedPath: string, displayName: string): ProjectRow;
15
+ getProject(id: string): ProjectRow | undefined;
16
+ listProjects(): ProjectRow[];
17
+ updateProjectSyncStats(projectId: string): void;
18
+ getNextSequenceNumber(projectId: string): number;
19
+ insertSnapshot(snapshot: Omit<SnapshotRow, 'amended_at' | 'amended_by'>): void;
20
+ getLatestSnapshot(projectId: string): SnapshotRow | undefined;
21
+ getSnapshotById(snapshotId: string): SnapshotRow | undefined;
22
+ getSnapshotsByProject(projectId: string, limit: number): SnapshotRow[];
23
+ updateSnapshot(snapshotId: string, fields: Partial<Pick<SnapshotRow, 'tasks_completed' | 'tasks_remaining' | 'decisions' | 'next_steps' | 'blockers' | 'tags' | 'amended_at' | 'amended_by'>>): void;
24
+ searchSnapshots(query: string, projectId?: string, agent?: string, since?: string, until?: string, limit?: number): SnapshotRow[];
25
+ insertDecision(row: DecisionRow): void;
26
+ getDecisionsByProject(projectId: string, limit?: number): DecisionRow[];
27
+ insertHandoff(row: HandoffRow): void;
28
+ getHandoffsByProject(projectId: string, limit?: number): HandoffRow[];
29
+ getProjectAgents(projectId: string): string[];
30
+ getTotalCounts(): {
31
+ projects: number;
32
+ snapshots: number;
33
+ handoffs: number;
34
+ };
35
+ transaction<T>(fn: () => T): () => T;
36
+ close(): void;
37
+ }
@@ -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 { getDatabase, closeDatabase } from './db/connection.js';
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 = getDatabase();
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
- closeDatabase();
38
+ closeStorage();
39
39
  process.exit(0);
40
40
  });
41
41
  process.on('SIGTERM', () => {
42
- closeDatabase();
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,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,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,WAAW,EAAE,CAAC;IAEzB,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,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,aAAa,EAAE,CAAC;QAChB,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
+ {"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 Database from 'better-sqlite3';
3
- export declare function registerProjectDecisionsResource(server: McpServer, db: Database.Database): void;
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(db);
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(db, pid);
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(db);
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":"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"}
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 Database from 'better-sqlite3';
3
- export declare function registerProjectSnapshotResource(server: McpServer, db: Database.Database): void;
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(db);
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(db, pid);
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(db);
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,EACL,YAAY,EACZ,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,UAAU,+BAA+B,CAC7C,MAAiB,EACjB,EAAqB;IAErB,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,IAAI,gBAAgB,CAAC,2CAA2C,EAAE;QAChE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAClC,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,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE5C,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,YAAY,CAAC,EAAE,CAAC,CAAC;QAClC,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
+ {"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 Database from 'better-sqlite3';
3
- export declare function registerStatusResource(server: McpServer, db: Database.Database): void;
2
+ import type { StorageAdapter } from '../db/storage.js';
3
+ export declare function registerStatusResource(server: McpServer, db: StorageAdapter): void;
@@ -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(db);
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":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,EAAqB;IAErB,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,cAAc,CAAC,EAAE,CAAC,CAAC;QAClC,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
+ {"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 Database from 'better-sqlite3';
3
- export declare function registerAmendSnapshotTool(server: McpServer, db: Database.Database): void;
2
+ import type { StorageAdapter } from '../db/storage.js';
3
+ export declare function registerAmendSnapshotTool(server: McpServer, db: StorageAdapter): void;