engram-mcp-server 1.2.8 → 1.2.9

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 (210) hide show
  1. package/README.md +12 -1
  2. package/dist/constants.d.ts +1 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +6 -1
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.js +7 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/installer/ide-detector.d.ts.map +1 -1
  9. package/dist/installer/ide-detector.js +10 -6
  10. package/dist/installer/ide-detector.js.map +1 -1
  11. package/dist/installer/index.d.ts.map +1 -1
  12. package/dist/installer/index.js +79 -15
  13. package/dist/installer/index.js.map +1 -1
  14. package/package.json +6 -3
  15. package/dist/installer.d.ts +0 -2
  16. package/dist/installer.d.ts.map +0 -1
  17. package/dist/installer.js +0 -315
  18. package/dist/installer.js.map +0 -1
  19. package/dist/src/constants.d.ts +0 -21
  20. package/dist/src/constants.d.ts.map +0 -1
  21. package/dist/src/constants.js +0 -81
  22. package/dist/src/constants.js.map +0 -1
  23. package/dist/src/database.d.ts +0 -32
  24. package/dist/src/database.d.ts.map +0 -1
  25. package/dist/src/database.js +0 -143
  26. package/dist/src/database.js.map +0 -1
  27. package/dist/src/errors.d.ts +0 -40
  28. package/dist/src/errors.d.ts.map +0 -1
  29. package/dist/src/errors.js +0 -63
  30. package/dist/src/errors.js.map +0 -1
  31. package/dist/src/index.d.ts +0 -3
  32. package/dist/src/index.d.ts.map +0 -1
  33. package/dist/src/index.js +0 -89
  34. package/dist/src/index.js.map +0 -1
  35. package/dist/src/installer/config-writer.d.ts +0 -25
  36. package/dist/src/installer/config-writer.d.ts.map +0 -1
  37. package/dist/src/installer/config-writer.js +0 -86
  38. package/dist/src/installer/config-writer.js.map +0 -1
  39. package/dist/src/installer/ide-configs.d.ts +0 -19
  40. package/dist/src/installer/ide-configs.d.ts.map +0 -1
  41. package/dist/src/installer/ide-configs.js +0 -131
  42. package/dist/src/installer/ide-configs.js.map +0 -1
  43. package/dist/src/installer/ide-detector.d.ts +0 -6
  44. package/dist/src/installer/ide-detector.d.ts.map +0 -1
  45. package/dist/src/installer/ide-detector.js +0 -45
  46. package/dist/src/installer/ide-detector.js.map +0 -1
  47. package/dist/src/installer/index.d.ts +0 -2
  48. package/dist/src/installer/index.d.ts.map +0 -1
  49. package/dist/src/installer/index.js +0 -229
  50. package/dist/src/installer/index.js.map +0 -1
  51. package/dist/src/logger.d.ts +0 -10
  52. package/dist/src/logger.d.ts.map +0 -1
  53. package/dist/src/logger.js +0 -51
  54. package/dist/src/logger.js.map +0 -1
  55. package/dist/src/migrations.d.ts +0 -4
  56. package/dist/src/migrations.d.ts.map +0 -1
  57. package/dist/src/migrations.js +0 -343
  58. package/dist/src/migrations.js.map +0 -1
  59. package/dist/src/repositories/changes.repo.d.ts +0 -35
  60. package/dist/src/repositories/changes.repo.d.ts.map +0 -1
  61. package/dist/src/repositories/changes.repo.js +0 -53
  62. package/dist/src/repositories/changes.repo.js.map +0 -1
  63. package/dist/src/repositories/config.repo.d.ts +0 -11
  64. package/dist/src/repositories/config.repo.d.ts.map +0 -1
  65. package/dist/src/repositories/config.repo.js +0 -38
  66. package/dist/src/repositories/config.repo.js.map +0 -1
  67. package/dist/src/repositories/conventions.repo.d.ts +0 -15
  68. package/dist/src/repositories/conventions.repo.d.ts.map +0 -1
  69. package/dist/src/repositories/conventions.repo.js +0 -39
  70. package/dist/src/repositories/conventions.repo.js.map +0 -1
  71. package/dist/src/repositories/decisions.repo.d.ts +0 -19
  72. package/dist/src/repositories/decisions.repo.d.ts.map +0 -1
  73. package/dist/src/repositories/decisions.repo.js +0 -48
  74. package/dist/src/repositories/decisions.repo.js.map +0 -1
  75. package/dist/src/repositories/events.repo.d.ts +0 -34
  76. package/dist/src/repositories/events.repo.d.ts.map +0 -1
  77. package/dist/src/repositories/events.repo.js +0 -71
  78. package/dist/src/repositories/events.repo.js.map +0 -1
  79. package/dist/src/repositories/file-notes.repo.d.ts +0 -26
  80. package/dist/src/repositories/file-notes.repo.d.ts.map +0 -1
  81. package/dist/src/repositories/file-notes.repo.js +0 -55
  82. package/dist/src/repositories/file-notes.repo.js.map +0 -1
  83. package/dist/src/repositories/index.d.ts +0 -38
  84. package/dist/src/repositories/index.d.ts.map +0 -1
  85. package/dist/src/repositories/index.js +0 -41
  86. package/dist/src/repositories/index.js.map +0 -1
  87. package/dist/src/repositories/milestones.repo.d.ts +0 -10
  88. package/dist/src/repositories/milestones.repo.d.ts.map +0 -1
  89. package/dist/src/repositories/milestones.repo.js +0 -20
  90. package/dist/src/repositories/milestones.repo.js.map +0 -1
  91. package/dist/src/repositories/sessions.repo.d.ts +0 -27
  92. package/dist/src/repositories/sessions.repo.d.ts.map +0 -1
  93. package/dist/src/repositories/sessions.repo.js +0 -61
  94. package/dist/src/repositories/sessions.repo.js.map +0 -1
  95. package/dist/src/repositories/snapshot.repo.d.ts +0 -11
  96. package/dist/src/repositories/snapshot.repo.d.ts.map +0 -1
  97. package/dist/src/repositories/snapshot.repo.js +0 -17
  98. package/dist/src/repositories/snapshot.repo.js.map +0 -1
  99. package/dist/src/repositories/tasks.repo.d.ts +0 -40
  100. package/dist/src/repositories/tasks.repo.d.ts.map +0 -1
  101. package/dist/src/repositories/tasks.repo.js +0 -90
  102. package/dist/src/repositories/tasks.repo.js.map +0 -1
  103. package/dist/src/response.d.ts +0 -28
  104. package/dist/src/response.d.ts.map +0 -1
  105. package/dist/src/response.js +0 -38
  106. package/dist/src/response.js.map +0 -1
  107. package/dist/src/scripts/install-hooks.d.ts +0 -3
  108. package/dist/src/scripts/install-hooks.d.ts.map +0 -1
  109. package/dist/src/scripts/install-hooks.js +0 -89
  110. package/dist/src/scripts/install-hooks.js.map +0 -1
  111. package/dist/src/services/compaction.service.d.ts +0 -27
  112. package/dist/src/services/compaction.service.d.ts.map +0 -1
  113. package/dist/src/services/compaction.service.js +0 -93
  114. package/dist/src/services/compaction.service.js.map +0 -1
  115. package/dist/src/services/event-trigger.service.d.ts +0 -24
  116. package/dist/src/services/event-trigger.service.d.ts.map +0 -1
  117. package/dist/src/services/event-trigger.service.js +0 -60
  118. package/dist/src/services/event-trigger.service.js.map +0 -1
  119. package/dist/src/services/git.service.d.ts +0 -20
  120. package/dist/src/services/git.service.d.ts.map +0 -1
  121. package/dist/src/services/git.service.js +0 -88
  122. package/dist/src/services/git.service.js.map +0 -1
  123. package/dist/src/services/index.d.ts +0 -5
  124. package/dist/src/services/index.d.ts.map +0 -1
  125. package/dist/src/services/index.js +0 -8
  126. package/dist/src/services/index.js.map +0 -1
  127. package/dist/src/services/project-scan.service.d.ts +0 -19
  128. package/dist/src/services/project-scan.service.d.ts.map +0 -1
  129. package/dist/src/services/project-scan.service.js +0 -66
  130. package/dist/src/services/project-scan.service.js.map +0 -1
  131. package/dist/src/tools/backup.d.ts +0 -3
  132. package/dist/src/tools/backup.d.ts.map +0 -1
  133. package/dist/src/tools/backup.js +0 -191
  134. package/dist/src/tools/backup.js.map +0 -1
  135. package/dist/src/tools/changes.d.ts +0 -3
  136. package/dist/src/tools/changes.d.ts.map +0 -1
  137. package/dist/src/tools/changes.js +0 -97
  138. package/dist/src/tools/changes.js.map +0 -1
  139. package/dist/src/tools/compaction.d.ts +0 -3
  140. package/dist/src/tools/compaction.d.ts.map +0 -1
  141. package/dist/src/tools/compaction.js +0 -151
  142. package/dist/src/tools/compaction.js.map +0 -1
  143. package/dist/src/tools/conventions.d.ts +0 -3
  144. package/dist/src/tools/conventions.d.ts.map +0 -1
  145. package/dist/src/tools/conventions.js +0 -121
  146. package/dist/src/tools/conventions.js.map +0 -1
  147. package/dist/src/tools/decisions.d.ts +0 -3
  148. package/dist/src/tools/decisions.d.ts.map +0 -1
  149. package/dist/src/tools/decisions.js +0 -136
  150. package/dist/src/tools/decisions.js.map +0 -1
  151. package/dist/src/tools/export-import.d.ts +0 -3
  152. package/dist/src/tools/export-import.d.ts.map +0 -1
  153. package/dist/src/tools/export-import.js +0 -180
  154. package/dist/src/tools/export-import.js.map +0 -1
  155. package/dist/src/tools/file-notes.d.ts +0 -3
  156. package/dist/src/tools/file-notes.d.ts.map +0 -1
  157. package/dist/src/tools/file-notes.js +0 -104
  158. package/dist/src/tools/file-notes.js.map +0 -1
  159. package/dist/src/tools/intelligence.d.ts +0 -3
  160. package/dist/src/tools/intelligence.d.ts.map +0 -1
  161. package/dist/src/tools/intelligence.js +0 -427
  162. package/dist/src/tools/intelligence.js.map +0 -1
  163. package/dist/src/tools/milestones.d.ts +0 -3
  164. package/dist/src/tools/milestones.d.ts.map +0 -1
  165. package/dist/src/tools/milestones.js +0 -71
  166. package/dist/src/tools/milestones.js.map +0 -1
  167. package/dist/src/tools/scheduler.d.ts +0 -3
  168. package/dist/src/tools/scheduler.d.ts.map +0 -1
  169. package/dist/src/tools/scheduler.js +0 -363
  170. package/dist/src/tools/scheduler.js.map +0 -1
  171. package/dist/src/tools/sessions.d.ts +0 -3
  172. package/dist/src/tools/sessions.d.ts.map +0 -1
  173. package/dist/src/tools/sessions.js +0 -356
  174. package/dist/src/tools/sessions.js.map +0 -1
  175. package/dist/src/tools/stats.d.ts +0 -3
  176. package/dist/src/tools/stats.d.ts.map +0 -1
  177. package/dist/src/tools/stats.js +0 -63
  178. package/dist/src/tools/stats.js.map +0 -1
  179. package/dist/src/tools/tasks.d.ts +0 -3
  180. package/dist/src/tools/tasks.d.ts.map +0 -1
  181. package/dist/src/tools/tasks.js +0 -206
  182. package/dist/src/tools/tasks.js.map +0 -1
  183. package/dist/src/types.d.ts +0 -170
  184. package/dist/src/types.d.ts.map +0 -1
  185. package/dist/src/types.js +0 -5
  186. package/dist/src/types.js.map +0 -1
  187. package/dist/src/utils.d.ts +0 -58
  188. package/dist/src/utils.d.ts.map +0 -1
  189. package/dist/src/utils.js +0 -190
  190. package/dist/src/utils.js.map +0 -1
  191. package/dist/tests/helpers/test-db.d.ts +0 -12
  192. package/dist/tests/helpers/test-db.d.ts.map +0 -1
  193. package/dist/tests/helpers/test-db.js +0 -149
  194. package/dist/tests/helpers/test-db.js.map +0 -1
  195. package/dist/tests/installer/installer.test.d.ts +0 -2
  196. package/dist/tests/installer/installer.test.d.ts.map +0 -1
  197. package/dist/tests/installer/installer.test.js +0 -160
  198. package/dist/tests/installer/installer.test.js.map +0 -1
  199. package/dist/tests/repositories/repos.test.d.ts +0 -2
  200. package/dist/tests/repositories/repos.test.d.ts.map +0 -1
  201. package/dist/tests/repositories/repos.test.js +0 -220
  202. package/dist/tests/repositories/repos.test.js.map +0 -1
  203. package/dist/tools/maintenance.d.ts +0 -3
  204. package/dist/tools/maintenance.d.ts.map +0 -1
  205. package/dist/tools/maintenance.js +0 -647
  206. package/dist/tools/maintenance.js.map +0 -1
  207. package/dist/tools/memory.d.ts +0 -3
  208. package/dist/tools/memory.d.ts.map +0 -1
  209. package/dist/tools/memory.js +0 -446
  210. package/dist/tools/memory.js.map +0 -1
@@ -1,343 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Schema Migration System
3
- // ============================================================================
4
- import { log } from "./logger.js";
5
- // ─── Migration Definitions ───────────────────────────────────────────
6
- const migrations = [
7
- // ─── V1: Baseline Schema ───────────────────────────────────────────
8
- {
9
- version: 1,
10
- description: "Baseline schema — sessions, changes, decisions, file_notes, conventions, tasks, milestones, snapshot_cache",
11
- up: (db) => {
12
- db.exec(`
13
- CREATE TABLE IF NOT EXISTS sessions (
14
- id INTEGER PRIMARY KEY AUTOINCREMENT,
15
- started_at TEXT NOT NULL,
16
- ended_at TEXT,
17
- summary TEXT,
18
- agent_name TEXT DEFAULT 'unknown',
19
- project_root TEXT NOT NULL,
20
- tags TEXT,
21
- parent_session_id INTEGER
22
- );
23
-
24
- CREATE TABLE IF NOT EXISTS changes (
25
- id INTEGER PRIMARY KEY AUTOINCREMENT,
26
- session_id INTEGER,
27
- timestamp TEXT NOT NULL,
28
- file_path TEXT NOT NULL,
29
- change_type TEXT NOT NULL,
30
- description TEXT NOT NULL,
31
- diff_summary TEXT,
32
- impact_scope TEXT DEFAULT 'local'
33
- );
34
- CREATE INDEX IF NOT EXISTS idx_changes_session ON changes(session_id);
35
- CREATE INDEX IF NOT EXISTS idx_changes_file ON changes(file_path);
36
- CREATE INDEX IF NOT EXISTS idx_changes_time ON changes(timestamp);
37
-
38
- CREATE TABLE IF NOT EXISTS decisions (
39
- id INTEGER PRIMARY KEY AUTOINCREMENT,
40
- session_id INTEGER,
41
- timestamp TEXT NOT NULL,
42
- decision TEXT NOT NULL,
43
- rationale TEXT,
44
- affected_files TEXT,
45
- tags TEXT,
46
- status TEXT DEFAULT 'active',
47
- superseded_by INTEGER
48
- );
49
- CREATE INDEX IF NOT EXISTS idx_decisions_status ON decisions(status);
50
-
51
- CREATE TABLE IF NOT EXISTS file_notes (
52
- file_path TEXT PRIMARY KEY,
53
- purpose TEXT,
54
- dependencies TEXT,
55
- dependents TEXT,
56
- layer TEXT,
57
- last_reviewed TEXT,
58
- last_modified_session INTEGER,
59
- notes TEXT,
60
- complexity TEXT
61
- );
62
-
63
- CREATE TABLE IF NOT EXISTS conventions (
64
- id INTEGER PRIMARY KEY AUTOINCREMENT,
65
- session_id INTEGER,
66
- timestamp TEXT NOT NULL,
67
- category TEXT NOT NULL,
68
- rule TEXT NOT NULL,
69
- examples TEXT,
70
- enforced INTEGER DEFAULT 1
71
- );
72
-
73
- CREATE TABLE IF NOT EXISTS tasks (
74
- id INTEGER PRIMARY KEY AUTOINCREMENT,
75
- session_id INTEGER,
76
- created_at TEXT NOT NULL,
77
- updated_at TEXT NOT NULL,
78
- title TEXT NOT NULL,
79
- description TEXT,
80
- status TEXT DEFAULT 'backlog',
81
- priority TEXT DEFAULT 'medium',
82
- assigned_files TEXT,
83
- tags TEXT,
84
- completed_at TEXT,
85
- blocked_by TEXT
86
- );
87
-
88
- CREATE TABLE IF NOT EXISTS milestones (
89
- id INTEGER PRIMARY KEY AUTOINCREMENT,
90
- session_id INTEGER,
91
- timestamp TEXT NOT NULL,
92
- title TEXT NOT NULL,
93
- description TEXT,
94
- version TEXT,
95
- tags TEXT
96
- );
97
-
98
- CREATE TABLE IF NOT EXISTS snapshot_cache (
99
- key TEXT PRIMARY KEY,
100
- value TEXT NOT NULL,
101
- updated_at TEXT NOT NULL,
102
- ttl_minutes INTEGER
103
- );
104
- `);
105
- },
106
- },
107
- // ─── V2: FTS5 Full-Text Search ─────────────────────────────────────
108
- {
109
- version: 2,
110
- description: "Add FTS5 virtual tables for high-performance full-text search",
111
- up: (db) => {
112
- db.exec(`
113
- -- FTS5 for session summaries
114
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_sessions USING fts5(
115
- summary,
116
- tags,
117
- content='sessions',
118
- content_rowid='id'
119
- );
120
-
121
- -- FTS5 for change descriptions
122
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_changes USING fts5(
123
- file_path,
124
- description,
125
- diff_summary,
126
- content='changes',
127
- content_rowid='id'
128
- );
129
-
130
- -- FTS5 for decisions
131
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_decisions USING fts5(
132
- decision,
133
- rationale,
134
- tags,
135
- content='decisions',
136
- content_rowid='id'
137
- );
138
-
139
- -- FTS5 for file notes
140
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_file_notes USING fts5(
141
- file_path,
142
- purpose,
143
- notes,
144
- content='file_notes'
145
- );
146
-
147
- -- FTS5 for conventions
148
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_conventions USING fts5(
149
- rule,
150
- examples,
151
- content='conventions',
152
- content_rowid='id'
153
- );
154
-
155
- -- FTS5 for tasks
156
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_tasks USING fts5(
157
- title,
158
- description,
159
- tags,
160
- content='tasks',
161
- content_rowid='id'
162
- );
163
-
164
- -- Triggers to keep FTS indexes in sync with main tables
165
-
166
- -- Sessions triggers
167
- CREATE TRIGGER IF NOT EXISTS trg_sessions_ai AFTER INSERT ON sessions BEGIN
168
- INSERT INTO fts_sessions(rowid, summary, tags) VALUES (new.id, new.summary, new.tags);
169
- END;
170
- CREATE TRIGGER IF NOT EXISTS trg_sessions_au AFTER UPDATE ON sessions BEGIN
171
- INSERT INTO fts_sessions(fts_sessions, rowid, summary, tags) VALUES('delete', old.id, old.summary, old.tags);
172
- INSERT INTO fts_sessions(rowid, summary, tags) VALUES (new.id, new.summary, new.tags);
173
- END;
174
- CREATE TRIGGER IF NOT EXISTS trg_sessions_ad AFTER DELETE ON sessions BEGIN
175
- INSERT INTO fts_sessions(fts_sessions, rowid, summary, tags) VALUES('delete', old.id, old.summary, old.tags);
176
- END;
177
-
178
- -- Changes triggers
179
- CREATE TRIGGER IF NOT EXISTS trg_changes_ai AFTER INSERT ON changes BEGIN
180
- INSERT INTO fts_changes(rowid, file_path, description, diff_summary) VALUES (new.id, new.file_path, new.description, new.diff_summary);
181
- END;
182
- CREATE TRIGGER IF NOT EXISTS trg_changes_au AFTER UPDATE ON changes BEGIN
183
- INSERT INTO fts_changes(fts_changes, rowid, file_path, description, diff_summary) VALUES('delete', old.id, old.file_path, old.description, old.diff_summary);
184
- INSERT INTO fts_changes(rowid, file_path, description, diff_summary) VALUES (new.id, new.file_path, new.description, new.diff_summary);
185
- END;
186
- CREATE TRIGGER IF NOT EXISTS trg_changes_ad AFTER DELETE ON changes BEGIN
187
- INSERT INTO fts_changes(fts_changes, rowid, file_path, description, diff_summary) VALUES('delete', old.id, old.file_path, old.description, old.diff_summary);
188
- END;
189
-
190
- -- Decisions triggers
191
- CREATE TRIGGER IF NOT EXISTS trg_decisions_ai AFTER INSERT ON decisions BEGIN
192
- INSERT INTO fts_decisions(rowid, decision, rationale, tags) VALUES (new.id, new.decision, new.rationale, new.tags);
193
- END;
194
- CREATE TRIGGER IF NOT EXISTS trg_decisions_au AFTER UPDATE ON decisions BEGIN
195
- INSERT INTO fts_decisions(fts_decisions, rowid, decision, rationale, tags) VALUES('delete', old.id, old.decision, old.rationale, old.tags);
196
- INSERT INTO fts_decisions(rowid, decision, rationale, tags) VALUES (new.id, new.decision, new.rationale, new.tags);
197
- END;
198
- CREATE TRIGGER IF NOT EXISTS trg_decisions_ad AFTER DELETE ON decisions BEGIN
199
- INSERT INTO fts_decisions(fts_decisions, rowid, decision, rationale, tags) VALUES('delete', old.id, old.decision, old.rationale, old.tags);
200
- END;
201
-
202
- -- Conventions triggers
203
- CREATE TRIGGER IF NOT EXISTS trg_conventions_ai AFTER INSERT ON conventions BEGIN
204
- INSERT INTO fts_conventions(rowid, rule, examples) VALUES (new.id, new.rule, new.examples);
205
- END;
206
- CREATE TRIGGER IF NOT EXISTS trg_conventions_au AFTER UPDATE ON conventions BEGIN
207
- INSERT INTO fts_conventions(fts_conventions, rowid, rule, examples) VALUES('delete', old.id, old.rule, old.examples);
208
- INSERT INTO fts_conventions(rowid, rule, examples) VALUES (new.id, new.rule, new.examples);
209
- END;
210
- CREATE TRIGGER IF NOT EXISTS trg_conventions_ad AFTER DELETE ON conventions BEGIN
211
- INSERT INTO fts_conventions(fts_conventions, rowid, rule, examples) VALUES('delete', old.id, old.rule, old.examples);
212
- END;
213
-
214
- -- Tasks triggers
215
- CREATE TRIGGER IF NOT EXISTS trg_tasks_ai AFTER INSERT ON tasks BEGIN
216
- INSERT INTO fts_tasks(rowid, title, description, tags) VALUES (new.id, new.title, new.description, new.tags);
217
- END;
218
- CREATE TRIGGER IF NOT EXISTS trg_tasks_au AFTER UPDATE ON tasks BEGIN
219
- INSERT INTO fts_tasks(fts_tasks, rowid, title, description, tags) VALUES('delete', old.id, old.title, old.description, old.tags);
220
- INSERT INTO fts_tasks(rowid, title, description, tags) VALUES (new.id, new.title, new.description, new.tags);
221
- END;
222
- CREATE TRIGGER IF NOT EXISTS trg_tasks_ad AFTER DELETE ON tasks BEGIN
223
- INSERT INTO fts_tasks(fts_tasks, rowid, title, description, tags) VALUES('delete', old.id, old.title, old.description, old.tags);
224
- END;
225
- `);
226
- // Populate FTS tables from existing data
227
- db.exec(`
228
- INSERT OR IGNORE INTO fts_sessions(rowid, summary, tags)
229
- SELECT id, summary, tags FROM sessions;
230
- INSERT OR IGNORE INTO fts_changes(rowid, file_path, description, diff_summary)
231
- SELECT id, file_path, description, diff_summary FROM changes;
232
- INSERT OR IGNORE INTO fts_decisions(rowid, decision, rationale, tags)
233
- SELECT id, decision, rationale, tags FROM decisions;
234
- INSERT OR IGNORE INTO fts_conventions(rowid, rule, examples)
235
- SELECT id, rule, examples FROM conventions;
236
- INSERT OR IGNORE INTO fts_tasks(rowid, title, description, tags)
237
- SELECT id, title, description, tags FROM tasks;
238
- `);
239
- },
240
- },
241
- // ─── V3: Config Table ──────────────────────────────────────────────
242
- {
243
- version: 3,
244
- description: "Add config table for user settings (retention, auto-compact, etc.)",
245
- up: (db) => {
246
- db.exec(`
247
- CREATE TABLE IF NOT EXISTS config (
248
- key TEXT PRIMARY KEY,
249
- value TEXT NOT NULL,
250
- updated_at TEXT NOT NULL
251
- );
252
-
253
- -- Default settings
254
- INSERT OR IGNORE INTO config (key, value, updated_at) VALUES ('auto_compact', 'true', datetime('now'));
255
- INSERT OR IGNORE INTO config (key, value, updated_at) VALUES ('compact_threshold', '50', datetime('now'));
256
- INSERT OR IGNORE INTO config (key, value, updated_at) VALUES ('retention_days', '90', datetime('now'));
257
- INSERT OR IGNORE INTO config (key, value, updated_at) VALUES ('max_backups', '10', datetime('now'));
258
-
259
- -- Additional composite indexes for better query performance
260
- CREATE INDEX IF NOT EXISTS idx_changes_file_time ON changes(file_path, timestamp);
261
- CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
262
- CREATE INDEX IF NOT EXISTS idx_conventions_enforced ON conventions(enforced);
263
- CREATE INDEX IF NOT EXISTS idx_sessions_ended ON sessions(ended_at);
264
- `);
265
- },
266
- },
267
- // ─── V4: Scheduled Events ─────────────────────────────────────────
268
- {
269
- version: 4,
270
- description: "Add scheduled_events table for deferred work and reminders",
271
- up: (db) => {
272
- db.exec(`
273
- CREATE TABLE IF NOT EXISTS scheduled_events (
274
- id INTEGER PRIMARY KEY AUTOINCREMENT,
275
- session_id INTEGER,
276
- created_at TEXT NOT NULL,
277
- title TEXT NOT NULL,
278
- description TEXT,
279
- trigger_type TEXT NOT NULL DEFAULT 'next_session',
280
- trigger_value TEXT,
281
- status TEXT NOT NULL DEFAULT 'pending',
282
- triggered_at TEXT,
283
- acknowledged_at TEXT,
284
- requires_approval INTEGER DEFAULT 1,
285
- action_summary TEXT,
286
- action_data TEXT,
287
- priority TEXT DEFAULT 'medium',
288
- tags TEXT,
289
- recurrence TEXT
290
- );
291
-
292
- CREATE INDEX IF NOT EXISTS idx_events_status ON scheduled_events(status);
293
- CREATE INDEX IF NOT EXISTS idx_events_trigger ON scheduled_events(trigger_type, status);
294
-
295
- -- FTS5 for searching events
296
- CREATE VIRTUAL TABLE IF NOT EXISTS fts_events USING fts5(
297
- title, description, action_summary,
298
- content='scheduled_events', content_rowid='id'
299
- );
300
-
301
- -- Sync trigger
302
- CREATE TRIGGER IF NOT EXISTS fts_events_insert AFTER INSERT ON scheduled_events BEGIN
303
- INSERT INTO fts_events(rowid, title, description, action_summary)
304
- VALUES (new.id, new.title, new.description, new.action_summary);
305
- END;
306
- `);
307
- },
308
- },
309
- ];
310
- // ─── Migration Runner ────────────────────────────────────────────────
311
- export function runMigrations(db) {
312
- // Ensure schema_meta table exists
313
- db.exec(`CREATE TABLE IF NOT EXISTS schema_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL)`);
314
- // Get current version
315
- const row = db.prepare("SELECT value FROM schema_meta WHERE key = 'version'").get();
316
- const currentVersion = row ? parseInt(row.value, 10) : 0;
317
- // Filter migrations that need to run
318
- const pendingMigrations = migrations.filter(m => m.version > currentVersion);
319
- if (pendingMigrations.length === 0) {
320
- return; // Already up to date
321
- }
322
- log.info(`Running ${pendingMigrations.length} migration(s) from v${currentVersion} → v${pendingMigrations[pendingMigrations.length - 1].version}`);
323
- for (const migration of pendingMigrations) {
324
- log.info(` v${migration.version}: ${migration.description}`);
325
- // Run migration in a transaction for safety
326
- const runMigration = db.transaction(() => {
327
- migration.up(db);
328
- db.prepare("INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('version', ?)").run(String(migration.version));
329
- });
330
- runMigration();
331
- }
332
- log.info(`Migrations complete. Schema at v${pendingMigrations[pendingMigrations.length - 1].version}`);
333
- }
334
- export function getCurrentSchemaVersion(db) {
335
- try {
336
- const row = db.prepare("SELECT value FROM schema_meta WHERE key = 'version'").get();
337
- return row ? parseInt(row.value, 10) : 0;
338
- }
339
- catch {
340
- return 0;
341
- }
342
- }
343
- //# sourceMappingURL=migrations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import type { Database as DatabaseType } from "better-sqlite3";
2
- import type { ChangeRow } from "../types.js";
3
- export declare class ChangesRepo {
4
- private db;
5
- constructor(db: DatabaseType);
6
- recordBulk(changes: Array<{
7
- file_path: string;
8
- change_type: string;
9
- description: string;
10
- diff_summary?: string | null;
11
- impact_scope: string;
12
- }>, sessionId: number | null, timestamp: string): number;
13
- getByFile(filePath: string, limit: number): ChangeRow[];
14
- getSince(timestamp: string): ChangeRow[];
15
- getBySession(sessionId: number): Array<{
16
- change_type: string;
17
- file_path: string;
18
- description: string;
19
- }>;
20
- getBySessionFull(sessionId: number): Array<{
21
- change_type: string;
22
- file_path: string;
23
- description: string;
24
- }>;
25
- insertCompacted(sessionId: number, timestamp: string, summary: string): void;
26
- deleteNonCompacted(sessionId: number): void;
27
- getMostChanged(limit: number): Array<{
28
- file_path: string;
29
- change_count: number;
30
- }>;
31
- countAll(): number;
32
- countBySession(sessionId: number): number;
33
- countBeforeCutoff(cutoffId: number): number;
34
- }
35
- //# sourceMappingURL=changes.repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"changes.repo.d.ts","sourceRoot":"","sources":["../../../src/repositories/changes.repo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,WAAW;IACR,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,UAAU,CACN,OAAO,EAAE,KAAK,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC,EACF,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,GAClB,MAAM;IAqBT,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAMvD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAMxC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAMvG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3G,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM3C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAMjF,QAAQ,IAAI,MAAM;IAIlB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAMzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAK9C"}
@@ -1,53 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Changes Repository
3
- // ============================================================================
4
- export class ChangesRepo {
5
- db;
6
- constructor(db) {
7
- this.db = db;
8
- }
9
- recordBulk(changes, sessionId, timestamp) {
10
- const insert = this.db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, diff_summary, impact_scope) VALUES (?, ?, ?, ?, ?, ?, ?)");
11
- const tx = this.db.transaction(() => {
12
- for (const c of changes) {
13
- insert.run(sessionId, timestamp, c.file_path, c.change_type, c.description, c.diff_summary || null, c.impact_scope);
14
- if (sessionId) {
15
- this.db.prepare("UPDATE file_notes SET last_modified_session = ? WHERE file_path = ?").run(sessionId, c.file_path);
16
- }
17
- }
18
- });
19
- tx();
20
- return changes.length;
21
- }
22
- getByFile(filePath, limit) {
23
- return this.db.prepare("SELECT * FROM changes WHERE file_path = ? ORDER BY timestamp DESC LIMIT ?").all(filePath, limit);
24
- }
25
- getSince(timestamp) {
26
- return this.db.prepare("SELECT * FROM changes WHERE timestamp > ? ORDER BY timestamp").all(timestamp);
27
- }
28
- getBySession(sessionId) {
29
- return this.db.prepare("SELECT change_type, file_path, description FROM changes WHERE session_id = ? AND file_path != '(compacted)'").all(sessionId);
30
- }
31
- getBySessionFull(sessionId) {
32
- return this.db.prepare("SELECT change_type, file_path, description FROM changes WHERE session_id = ?").all(sessionId);
33
- }
34
- insertCompacted(sessionId, timestamp, summary) {
35
- this.db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, impact_scope) VALUES (?, ?, ?, ?, ?, ?)").run(sessionId, timestamp, "(compacted)", "modified", summary, "global");
36
- }
37
- deleteNonCompacted(sessionId) {
38
- this.db.prepare("DELETE FROM changes WHERE session_id = ? AND file_path != '(compacted)'").run(sessionId);
39
- }
40
- getMostChanged(limit) {
41
- return this.db.prepare("SELECT file_path, COUNT(*) as change_count FROM changes GROUP BY file_path ORDER BY change_count DESC LIMIT ?").all(limit);
42
- }
43
- countAll() {
44
- return this.db.prepare("SELECT COUNT(*) as c FROM changes").get().c;
45
- }
46
- countBySession(sessionId) {
47
- return this.db.prepare("SELECT COUNT(*) as c FROM changes WHERE session_id = ?").get(sessionId).c;
48
- }
49
- countBeforeCutoff(cutoffId) {
50
- return this.db.prepare("SELECT COUNT(*) as c FROM changes WHERE session_id <= ?").get(cutoffId).c;
51
- }
52
- }
53
- //# sourceMappingURL=changes.repo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"changes.repo.js","sourceRoot":"","sources":["../../../src/repositories/changes.repo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAK/E,MAAM,OAAO,WAAW;IACA;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAI,CAAC;IAEzC,UAAU,CACN,OAME,EACF,SAAwB,EACxB,SAAiB;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,2IAA2I,CAC9I,CAAC;QAEF,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;gBAEpH,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,qEAAqE,CACxE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,EAAE,CAAC;QACL,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,KAAa;QACrC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,2EAA2E,CAC9E,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAgB,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,8DAA8D,CACjE,CAAC,GAAG,CAAC,SAAS,CAAgB,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,6GAA6G,CAChH,CAAC,GAAG,CAAC,SAAS,CAA2E,CAAC;IAC/F,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,8EAA8E,CACjF,CAAC,GAAG,CAAC,SAAS,CAA2E,CAAC;IAC/F,CAAC;IAED,eAAe,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;QACjE,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,0HAA0H,CAC7H,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;IAED,kBAAkB,CAAC,SAAiB;QAChC,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,yEAAyE,CAC5E,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,+GAA+G,CAClH,CAAC,GAAG,CAAC,KAAK,CAAuD,CAAC;IACvE,CAAC;IAED,QAAQ;QACJ,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,cAAc,CAAC,SAAiB;QAC5B,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CACnB,wDAAwD,CAC3D,CAAC,GAAG,CAAC,SAAS,CAAmB,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,iBAAiB,CAAC,QAAgB;QAC9B,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CACnB,yDAAyD,CAC5D,CAAC,GAAG,CAAC,QAAQ,CAAmB,CAAC,CAAC,CAAC;IACxC,CAAC;CACJ"}
@@ -1,11 +0,0 @@
1
- import type { Database as DatabaseType } from "better-sqlite3";
2
- export declare class ConfigRepo {
3
- private db;
4
- constructor(db: DatabaseType);
5
- get(key: string): string | null;
6
- getOrDefault(key: string, defaultValue: string): string;
7
- getInt(key: string, defaultValue: number): number;
8
- getBool(key: string, defaultValue: boolean): boolean;
9
- set(key: string, value: string, timestamp: string): void;
10
- }
11
- //# sourceMappingURL=config.repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.repo.d.ts","sourceRoot":"","sources":["../../../src/repositories/config.repo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/D,qBAAa,UAAU;IACP,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAW/B,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAIvD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAOjD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IAMpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAK3D"}
@@ -1,38 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Config Repository
3
- // ============================================================================
4
- export class ConfigRepo {
5
- db;
6
- constructor(db) {
7
- this.db = db;
8
- }
9
- get(key) {
10
- try {
11
- const row = this.db.prepare("SELECT value FROM config WHERE key = ?").get(key);
12
- return row?.value ?? null;
13
- }
14
- catch {
15
- return null; // config table may not exist yet
16
- }
17
- }
18
- getOrDefault(key, defaultValue) {
19
- return this.get(key) ?? defaultValue;
20
- }
21
- getInt(key, defaultValue) {
22
- const val = this.get(key);
23
- if (val === null)
24
- return defaultValue;
25
- const parsed = parseInt(val, 10);
26
- return isNaN(parsed) ? defaultValue : parsed;
27
- }
28
- getBool(key, defaultValue) {
29
- const val = this.get(key);
30
- if (val === null)
31
- return defaultValue;
32
- return val === "true";
33
- }
34
- set(key, value, timestamp) {
35
- this.db.prepare("INSERT OR REPLACE INTO config (key, value, updated_at) VALUES (?, ?, ?)").run(key, value, timestamp);
36
- }
37
- }
38
- //# sourceMappingURL=config.repo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.repo.js","sourceRoot":"","sources":["../../../src/repositories/config.repo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAI/E,MAAM,OAAO,UAAU;IACC;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAI,CAAC;IAEzC,GAAG,CAAC,GAAW;QACX,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACvB,wCAAwC,CAC3C,CAAC,GAAG,CAAC,GAAG,CAAkC,CAAC;YAC5C,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC,CAAC,iCAAiC;QAClD,CAAC;IACL,CAAC;IAED,YAAY,CAAC,GAAW,EAAE,YAAoB;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,YAAoB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,YAAY,CAAC;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,YAAqB;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,YAAY,CAAC;QACtC,OAAO,GAAG,KAAK,MAAM,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,SAAiB;QAC7C,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,yEAAyE,CAC5E,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;CACJ"}
@@ -1,15 +0,0 @@
1
- import type { Database as DatabaseType } from "better-sqlite3";
2
- import type { ConventionRow } from "../types.js";
3
- export declare class ConventionsRepo {
4
- private db;
5
- constructor(db: DatabaseType);
6
- create(sessionId: number | null, timestamp: string, category: string, rule: string, examples?: string[] | null): number;
7
- getActive(limit?: number): ConventionRow[];
8
- getFiltered(filters: {
9
- category?: string;
10
- includeDisabled: boolean;
11
- }): ConventionRow[];
12
- toggle(id: number, enforced: boolean): number;
13
- countAll(): number;
14
- }
15
- //# sourceMappingURL=conventions.repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conventions.repo.d.ts","sourceRoot":"","sources":["../../../src/repositories/conventions.repo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,eAAe;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,MAAM,CACF,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,GAC3B,MAAM;IAOT,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAW1C,WAAW,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,GAAG,aAAa,EAAE;IAWtF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAM7C,QAAQ,IAAI,MAAM;CAGrB"}
@@ -1,39 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Conventions Repository
3
- // ============================================================================
4
- export class ConventionsRepo {
5
- db;
6
- constructor(db) {
7
- this.db = db;
8
- }
9
- create(sessionId, timestamp, category, rule, examples) {
10
- const result = this.db.prepare("INSERT INTO conventions (session_id, timestamp, category, rule, examples) VALUES (?, ?, ?, ?, ?)").run(sessionId, timestamp, category, rule, examples ? JSON.stringify(examples) : null);
11
- return result.lastInsertRowid;
12
- }
13
- getActive(limit) {
14
- if (limit) {
15
- return this.db.prepare("SELECT * FROM conventions WHERE enforced = 1 ORDER BY category, id LIMIT ?").all(limit);
16
- }
17
- return this.db.prepare("SELECT * FROM conventions WHERE enforced = 1 ORDER BY category, id").all();
18
- }
19
- getFiltered(filters) {
20
- let query = "SELECT * FROM conventions WHERE 1=1";
21
- const params = [];
22
- if (!filters.includeDisabled) {
23
- query += " AND enforced = 1";
24
- }
25
- if (filters.category) {
26
- query += " AND category = ?";
27
- params.push(filters.category);
28
- }
29
- query += " ORDER BY category, id";
30
- return this.db.prepare(query).all(...params);
31
- }
32
- toggle(id, enforced) {
33
- return this.db.prepare("UPDATE conventions SET enforced = ? WHERE id = ?").run(enforced ? 1 : 0, id).changes;
34
- }
35
- countAll() {
36
- return this.db.prepare("SELECT COUNT(*) as c FROM conventions").get().c;
37
- }
38
- }
39
- //# sourceMappingURL=conventions.repo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conventions.repo.js","sourceRoot":"","sources":["../../../src/repositories/conventions.repo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAK/E,MAAM,OAAO,eAAe;IACJ;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAI,CAAC;IAEzC,MAAM,CACF,SAAwB,EACxB,SAAiB,EACjB,QAAgB,EAChB,IAAY,EACZ,QAA0B;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,kGAAkG,CACrG,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC5C,CAAC;IAED,SAAS,CAAC,KAAc;QACpB,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,4EAA4E,CAC/E,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,oEAAoE,CACvE,CAAC,GAAG,EAAqB,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,OAAwD;QAChE,IAAI,KAAK,GAAG,qCAAqC,CAAC;QAClD,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAAC,KAAK,IAAI,mBAAmB,CAAC;QAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAAC,KAAK,IAAI,mBAAmB,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QACtF,KAAK,IAAI,wBAAwB,CAAC;QAElC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAoB,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,QAAiB;QAChC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,kDAAkD,CACrD,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;IACxC,CAAC;IAED,QAAQ;QACJ,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;IAC/F,CAAC;CACJ"}
@@ -1,19 +0,0 @@
1
- import type { Database as DatabaseType } from "better-sqlite3";
2
- import type { DecisionRow } from "../types.js";
3
- export declare class DecisionsRepo {
4
- private db;
5
- constructor(db: DatabaseType);
6
- create(sessionId: number | null, timestamp: string, decision: string, rationale?: string | null, affectedFiles?: string[] | null, tags?: string[] | null, status?: string, supersedes?: number | null): number;
7
- supersede(oldId: number, newId: number): void;
8
- updateStatus(id: number, status: string): number;
9
- getActive(limit?: number): DecisionRow[];
10
- getFiltered(filters: {
11
- status?: string;
12
- tag?: string;
13
- file_path?: string;
14
- limit: number;
15
- }): DecisionRow[];
16
- getByFile(filePath: string): DecisionRow[];
17
- countAll(): number;
18
- }
19
- //# sourceMappingURL=decisions.repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisions.repo.d.ts","sourceRoot":"","sources":["../../../src/repositories/decisions.repo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAa,aAAa;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,MAAM,CACF,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EACtB,MAAM,GAAE,MAAiB,EACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,MAAM;IAcT,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7C,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMhD,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,WAAW,EAAE;IAM5C,WAAW,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,EAAE;IAczG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAM1C,QAAQ,IAAI,MAAM;CAGrB"}
@@ -1,48 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Decisions Repository
3
- // ============================================================================
4
- export class DecisionsRepo {
5
- db;
6
- constructor(db) {
7
- this.db = db;
8
- }
9
- create(sessionId, timestamp, decision, rationale, affectedFiles, tags, status = "active", supersedes) {
10
- const result = this.db.prepare("INSERT INTO decisions (session_id, timestamp, decision, rationale, affected_files, tags, status, superseded_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(sessionId, timestamp, decision, rationale || null, affectedFiles ? JSON.stringify(affectedFiles) : null, tags ? JSON.stringify(tags) : null, status, supersedes || null);
11
- return result.lastInsertRowid;
12
- }
13
- supersede(oldId, newId) {
14
- this.db.prepare("UPDATE decisions SET status = 'superseded', superseded_by = ? WHERE id = ?").run(newId, oldId);
15
- }
16
- updateStatus(id, status) {
17
- return this.db.prepare("UPDATE decisions SET status = ? WHERE id = ?").run(status, id).changes;
18
- }
19
- getActive(limit = 20) {
20
- return this.db.prepare("SELECT * FROM decisions WHERE status = 'active' ORDER BY timestamp DESC LIMIT ?").all(limit);
21
- }
22
- getFiltered(filters) {
23
- let query = "SELECT * FROM decisions WHERE 1=1";
24
- const params = [];
25
- if (filters.status) {
26
- query += " AND status = ?";
27
- params.push(filters.status);
28
- }
29
- if (filters.tag) {
30
- query += " AND EXISTS (SELECT 1 FROM json_each(tags) WHERE value = ?)";
31
- params.push(filters.tag);
32
- }
33
- if (filters.file_path) {
34
- query += " AND EXISTS (SELECT 1 FROM json_each(affected_files) WHERE value = ?)";
35
- params.push(filters.file_path);
36
- }
37
- query += " ORDER BY timestamp DESC LIMIT ?";
38
- params.push(filters.limit);
39
- return this.db.prepare(query).all(...params);
40
- }
41
- getByFile(filePath) {
42
- return this.db.prepare("SELECT * FROM decisions WHERE affected_files LIKE ? AND status = 'active' ORDER BY timestamp DESC").all(`%${filePath}%`);
43
- }
44
- countAll() {
45
- return this.db.prepare("SELECT COUNT(*) as c FROM decisions").get().c;
46
- }
47
- }
48
- //# sourceMappingURL=decisions.repo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisions.repo.js","sourceRoot":"","sources":["../../../src/repositories/decisions.repo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2CAA2C;AAC3C,+EAA+E;AAK/E,MAAM,OAAO,aAAa;IACF;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAI,CAAC;IAEzC,MAAM,CACF,SAAwB,EACxB,SAAiB,EACjB,QAAgB,EAChB,SAAyB,EACzB,aAA+B,EAC/B,IAAsB,EACtB,SAAiB,QAAQ,EACzB,UAA0B;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,iJAAiJ,CACpJ,CAAC,GAAG,CACD,SAAS,EAAE,SAAS,EAAE,QAAQ,EAC9B,SAAS,IAAI,IAAI,EACjB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EACpD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAClC,MAAM,EACN,UAAU,IAAI,IAAI,CACrB,CAAC;QACF,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC5C,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,KAAa;QAClC,IAAI,CAAC,EAAE,CAAC,OAAO,CACX,4EAA4E,CAC/E,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,MAAc;QACnC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,8CAA8C,CACjD,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE;QACxB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,iFAAiF,CACpF,CAAC,GAAG,CAAC,KAAK,CAAkB,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,OAA6E;QACrF,IAAI,KAAK,GAAG,mCAAmC,CAAC;QAChD,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAAC,KAAK,IAAI,iBAAiB,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAChF,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAAC,KAAK,IAAI,6DAA6D,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QACtH,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAAC,KAAK,IAAI,uEAAuE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAE5I,KAAK,IAAI,kCAAkC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE3B,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAC;IAClE,CAAC;IAED,SAAS,CAAC,QAAgB;QACtB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAClB,mGAAmG,CACtG,CAAC,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAkB,CAAC;IAC5C,CAAC;IAED,QAAQ;QACJ,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;IAC7F,CAAC;CACJ"}