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,121 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Convention Tools
3
- // ============================================================================
4
- import { z } from "zod";
5
- import { getDb, now, getCurrentSessionId } from "../database.js";
6
- import { TOOL_PREFIX } from "../constants.js";
7
- export function registerConventionTools(server) {
8
- server.registerTool(`${TOOL_PREFIX}_add_convention`, {
9
- title: "Add Convention",
10
- description: `Record a project convention that the agent should always follow. Conventions are surfaced during start_session and serve as persistent rules.
11
-
12
- Args:
13
- - category: "naming" | "architecture" | "styling" | "testing" | "git" | "documentation" | "error_handling" | "performance" | "security" | "other"
14
- - rule (string): The convention rule in clear, actionable language
15
- - examples (array of strings, optional): Code or usage examples
16
-
17
- Returns:
18
- Convention ID and confirmation.`,
19
- inputSchema: {
20
- category: z.enum(["naming", "architecture", "styling", "testing", "git", "documentation", "error_handling", "performance", "security", "other"]),
21
- rule: z.string().min(5).describe("The convention rule"),
22
- examples: z.array(z.string()).optional().describe("Examples of the convention in use"),
23
- },
24
- annotations: {
25
- readOnlyHint: false,
26
- destructiveHint: false,
27
- idempotentHint: false,
28
- openWorldHint: false,
29
- },
30
- }, async ({ category, rule, examples }) => {
31
- const db = getDb();
32
- const timestamp = now();
33
- const sessionId = getCurrentSessionId();
34
- const result = db.prepare("INSERT INTO conventions (session_id, timestamp, category, rule, examples) VALUES (?, ?, ?, ?, ?)").run(sessionId, timestamp, category, rule, examples ? JSON.stringify(examples) : null);
35
- return {
36
- content: [{
37
- type: "text",
38
- text: JSON.stringify({
39
- convention_id: result.lastInsertRowid,
40
- message: `Convention #${result.lastInsertRowid} added to [${category}].`,
41
- rule,
42
- }, null, 2),
43
- }],
44
- };
45
- });
46
- server.registerTool(`${TOOL_PREFIX}_get_conventions`, {
47
- title: "Get Conventions",
48
- description: `Retrieve all active project conventions. Optionally filter by category.
49
-
50
- Args:
51
- - category (string, optional): Filter by convention category
52
- - include_disabled (boolean, optional): Include unenforced conventions (default: false)
53
-
54
- Returns:
55
- Array of conventions grouped by category.`,
56
- inputSchema: {
57
- category: z.enum(["naming", "architecture", "styling", "testing", "git", "documentation", "error_handling", "performance", "security", "other"]).optional(),
58
- include_disabled: z.boolean().default(false),
59
- },
60
- annotations: {
61
- readOnlyHint: true,
62
- destructiveHint: false,
63
- idempotentHint: true,
64
- openWorldHint: false,
65
- },
66
- }, async ({ category, include_disabled }) => {
67
- const db = getDb();
68
- let query = "SELECT * FROM conventions WHERE 1=1";
69
- const params = [];
70
- if (!include_disabled) {
71
- query += " AND enforced = 1";
72
- }
73
- if (category) {
74
- query += " AND category = ?";
75
- params.push(category);
76
- }
77
- query += " ORDER BY category, id";
78
- const conventions = db.prepare(query).all(...params);
79
- const grouped = {};
80
- for (const c of conventions) {
81
- if (!grouped[c.category])
82
- grouped[c.category] = [];
83
- grouped[c.category].push(c);
84
- }
85
- return {
86
- content: [{
87
- type: "text",
88
- text: JSON.stringify({ total: conventions.length, by_category: grouped }, null, 2),
89
- }],
90
- };
91
- });
92
- server.registerTool(`${TOOL_PREFIX}_toggle_convention`, {
93
- title: "Toggle Convention",
94
- description: `Enable or disable a convention. Disabled conventions are not surfaced during start_session.
95
-
96
- Args:
97
- - id (number): Convention ID
98
- - enforced (boolean): Whether the convention should be enforced
99
-
100
- Returns:
101
- Confirmation.`,
102
- inputSchema: {
103
- id: z.number().int().describe("Convention ID"),
104
- enforced: z.boolean().describe("Enable or disable"),
105
- },
106
- annotations: {
107
- readOnlyHint: false,
108
- destructiveHint: false,
109
- idempotentHint: true,
110
- openWorldHint: false,
111
- },
112
- }, async ({ id, enforced }) => {
113
- const db = getDb();
114
- const result = db.prepare("UPDATE conventions SET enforced = ? WHERE id = ?").run(enforced ? 1 : 0, id);
115
- if (result.changes === 0) {
116
- return { isError: true, content: [{ type: "text", text: `Convention #${id} not found.` }] };
117
- }
118
- return { content: [{ type: "text", text: `Convention #${id} ${enforced ? "enabled" : "disabled"}.` }] };
119
- });
120
- }
121
- //# sourceMappingURL=conventions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conventions.js","sourceRoot":"","sources":["../../../src/tools/conventions.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerDecisionTools(server: McpServer): void;
3
- //# sourceMappingURL=decisions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../../src/tools/decisions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsJ7D"}
@@ -1,136 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Architectural Decision Tools
3
- // ============================================================================
4
- import { z } from "zod";
5
- import { getDb, now, getCurrentSessionId } from "../database.js";
6
- import { TOOL_PREFIX } from "../constants.js";
7
- export function registerDecisionTools(server) {
8
- server.registerTool(`${TOOL_PREFIX}_record_decision`, {
9
- title: "Record Decision",
10
- description: `Record an architectural or design decision with its rationale. These persist across all future sessions and are surfaced during start_session. Use this for any choice that future agents or sessions need to respect.
11
-
12
- Args:
13
- - decision (string): The decision that was made
14
- - rationale (string, optional): Why this decision was made — context, tradeoffs, alternatives considered
15
- - affected_files (array of strings, optional): Files impacted by this decision
16
- - tags (array of strings, optional): Categorization tags (e.g., "architecture", "database", "ui", "api")
17
- - status: "active" | "experimental" (default: "active")
18
- - supersedes (number, optional): ID of a previous decision this replaces
19
-
20
- Returns:
21
- Decision ID and confirmation.`,
22
- inputSchema: {
23
- decision: z.string().min(5).describe("The decision that was made"),
24
- rationale: z.string().optional().describe("Why — context, tradeoffs, alternatives considered"),
25
- affected_files: z.array(z.string()).optional().describe("Files impacted by this decision"),
26
- tags: z.array(z.string()).optional().describe("Tags for categorization"),
27
- status: z.enum(["active", "experimental"]).default("active"),
28
- supersedes: z.number().int().optional().describe("ID of a previous decision this replaces"),
29
- },
30
- annotations: {
31
- readOnlyHint: false,
32
- destructiveHint: false,
33
- idempotentHint: false,
34
- openWorldHint: false,
35
- },
36
- }, async ({ decision, rationale, affected_files, tags, status, supersedes }) => {
37
- const db = getDb();
38
- const timestamp = now();
39
- const sessionId = getCurrentSessionId();
40
- const result = db.prepare("INSERT INTO decisions (session_id, timestamp, decision, rationale, affected_files, tags, status, superseded_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(sessionId, timestamp, decision, rationale || null, affected_files ? JSON.stringify(affected_files) : null, tags ? JSON.stringify(tags) : null, status, supersedes || null);
41
- const newDecisionId = result.lastInsertRowid;
42
- if (supersedes) {
43
- db.prepare("UPDATE decisions SET status = 'superseded', superseded_by = ? WHERE id = ?")
44
- .run(newDecisionId, supersedes);
45
- }
46
- return {
47
- content: [{
48
- type: "text",
49
- text: JSON.stringify({
50
- decision_id: newDecisionId,
51
- message: `Decision #${newDecisionId} recorded${supersedes ? ` (supersedes #${supersedes})` : ""}.`,
52
- decision,
53
- }, null, 2),
54
- }],
55
- };
56
- });
57
- server.registerTool(`${TOOL_PREFIX}_get_decisions`, {
58
- title: "Get Decisions",
59
- description: `Retrieve recorded architectural decisions. Filter by status, tags, or affected files.
60
-
61
- Args:
62
- - status (string, optional): Filter by status — "active", "superseded", "deprecated", "experimental"
63
- - tag (string, optional): Filter by tag
64
- - file_path (string, optional): Find decisions affecting a specific file
65
- - limit (number, optional): Max results (default 20)
66
-
67
- Returns:
68
- Array of decisions with rationale and metadata.`,
69
- inputSchema: {
70
- status: z.enum(["active", "superseded", "deprecated", "experimental"]).optional(),
71
- tag: z.string().optional().describe("Filter by tag"),
72
- file_path: z.string().optional().describe("Find decisions affecting this file"),
73
- limit: z.number().int().min(1).max(100).default(20),
74
- },
75
- annotations: {
76
- readOnlyHint: true,
77
- destructiveHint: false,
78
- idempotentHint: true,
79
- openWorldHint: false,
80
- },
81
- }, async ({ status, tag, file_path, limit }) => {
82
- const db = getDb();
83
- let query = "SELECT * FROM decisions WHERE 1=1";
84
- const params = [];
85
- if (status) {
86
- query += " AND status = ?";
87
- params.push(status);
88
- }
89
- if (tag) {
90
- query += " AND EXISTS (SELECT 1 FROM json_each(tags) WHERE value = ?)";
91
- params.push(tag);
92
- }
93
- if (file_path) {
94
- query += " AND EXISTS (SELECT 1 FROM json_each(affected_files) WHERE value = ?)";
95
- params.push(file_path);
96
- }
97
- query += " ORDER BY timestamp DESC LIMIT ?";
98
- params.push(limit);
99
- const decisions = db.prepare(query).all(...params);
100
- return {
101
- content: [{
102
- type: "text",
103
- text: JSON.stringify({ count: decisions.length, decisions }, null, 2),
104
- }],
105
- };
106
- });
107
- server.registerTool(`${TOOL_PREFIX}_update_decision`, {
108
- title: "Update Decision Status",
109
- description: `Update the status of an existing decision. Use to deprecate, supersede, or reactivate decisions.
110
-
111
- Args:
112
- - id (number): Decision ID to update
113
- - status: "active" | "superseded" | "deprecated" | "experimental"
114
-
115
- Returns:
116
- Confirmation.`,
117
- inputSchema: {
118
- id: z.number().int().describe("Decision ID"),
119
- status: z.enum(["active", "superseded", "deprecated", "experimental"]),
120
- },
121
- annotations: {
122
- readOnlyHint: false,
123
- destructiveHint: false,
124
- idempotentHint: true,
125
- openWorldHint: false,
126
- },
127
- }, async ({ id, status }) => {
128
- const db = getDb();
129
- const result = db.prepare("UPDATE decisions SET status = ? WHERE id = ?").run(status, id);
130
- if (result.changes === 0) {
131
- return { isError: true, content: [{ type: "text", text: `Decision #${id} not found.` }] };
132
- }
133
- return { content: [{ type: "text", text: `Decision #${id} status updated to "${status}".` }] };
134
- });
135
- }
136
- //# sourceMappingURL=decisions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../../src/tools/decisions.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerExportImportTools(server: McpServer): void;
3
- //# sourceMappingURL=export-import.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export-import.d.ts","sourceRoot":"","sources":["../../../src/tools/export-import.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+MjE"}
@@ -1,180 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — Export & Import Tools
3
- // ============================================================================
4
- import { z } from "zod";
5
- import * as fs from "fs";
6
- import * as path from "path";
7
- import { getDb, now, getProjectRoot } from "../database.js";
8
- import { TOOL_PREFIX, DB_DIR_NAME, SERVER_VERSION } from "../constants.js";
9
- export function registerExportImportTools(server) {
10
- // ─── EXPORT MEMORY ──────────────────────────────────────────────────
11
- server.registerTool(`${TOOL_PREFIX}_export`, {
12
- title: "Export Memory",
13
- description: `Export the entire memory database as a portable JSON file. Useful for backup, migration, or sharing project knowledge with teammates.
14
-
15
- Args:
16
- - output_path (string, optional): Where to save the export (default: .engram/export.json)
17
-
18
- Returns:
19
- Export file path and summary.`,
20
- inputSchema: {
21
- output_path: z.string().optional().describe("Export file path"),
22
- },
23
- annotations: {
24
- readOnlyHint: true,
25
- destructiveHint: false,
26
- idempotentHint: true,
27
- openWorldHint: true,
28
- },
29
- }, async ({ output_path }) => {
30
- const db = getDb();
31
- const projectRoot = getProjectRoot();
32
- const exportData = {
33
- engram_version: SERVER_VERSION,
34
- exported_at: now(),
35
- project_root: projectRoot,
36
- sessions: db.prepare("SELECT * FROM sessions ORDER BY id").all(),
37
- changes: db.prepare("SELECT * FROM changes ORDER BY id").all(),
38
- decisions: db.prepare("SELECT * FROM decisions ORDER BY id").all(),
39
- file_notes: db.prepare("SELECT * FROM file_notes ORDER BY file_path").all(),
40
- conventions: db.prepare("SELECT * FROM conventions ORDER BY id").all(),
41
- tasks: db.prepare("SELECT * FROM tasks ORDER BY id").all(),
42
- milestones: db.prepare("SELECT * FROM milestones ORDER BY id").all(),
43
- };
44
- const filePath = output_path || path.join(projectRoot, DB_DIR_NAME, "export.json");
45
- fs.writeFileSync(filePath, JSON.stringify(exportData, null, 2));
46
- return {
47
- content: [{
48
- type: "text",
49
- text: JSON.stringify({
50
- exported_to: filePath,
51
- counts: {
52
- sessions: exportData.sessions.length,
53
- changes: exportData.changes.length,
54
- decisions: exportData.decisions.length,
55
- file_notes: exportData.file_notes.length,
56
- conventions: exportData.conventions.length,
57
- tasks: exportData.tasks.length,
58
- milestones: exportData.milestones.length,
59
- },
60
- }, null, 2),
61
- }],
62
- };
63
- });
64
- // ─── IMPORT MEMORY ──────────────────────────────────────────────────
65
- server.registerTool(`${TOOL_PREFIX}_import`, {
66
- title: "Import Memory",
67
- description: `Import memory from a previously exported JSON file. Merges data into the existing database without duplicating existing records.
68
-
69
- Args:
70
- - input_path (string): Path to the export JSON file
71
- - dry_run (boolean, optional): Preview import without writing (default: true)
72
-
73
- Returns:
74
- Import summary with counts.`,
75
- inputSchema: {
76
- input_path: z.string().describe("Path to export JSON file"),
77
- dry_run: z.boolean().default(true).describe("Preview mode"),
78
- },
79
- annotations: {
80
- readOnlyHint: false,
81
- destructiveHint: false,
82
- idempotentHint: true,
83
- openWorldHint: true,
84
- },
85
- }, async ({ input_path, dry_run }) => {
86
- const projectRoot = getProjectRoot();
87
- const filePath = path.isAbsolute(input_path) ? input_path : path.join(projectRoot, input_path);
88
- if (!fs.existsSync(filePath)) {
89
- return { isError: true, content: [{ type: "text", text: `File not found: ${filePath}` }] };
90
- }
91
- let importData;
92
- try {
93
- importData = JSON.parse(fs.readFileSync(filePath, "utf-8"));
94
- }
95
- catch (e) {
96
- return { isError: true, content: [{ type: "text", text: `Invalid JSON: ${e}` }] };
97
- }
98
- const counts = {};
99
- for (const key of ["sessions", "changes", "decisions", "file_notes", "conventions", "tasks", "milestones"]) {
100
- counts[key] = Array.isArray(importData[key]) ? importData[key].length : 0;
101
- }
102
- if (dry_run) {
103
- return {
104
- content: [{
105
- type: "text",
106
- text: JSON.stringify({
107
- dry_run: true,
108
- would_import: counts,
109
- message: "Run with dry_run=false to execute the import.",
110
- }, null, 2),
111
- }],
112
- };
113
- }
114
- const db = getDb();
115
- const importTransaction = db.transaction(() => {
116
- const sessionIdMap = new Map();
117
- if (Array.isArray(importData.sessions)) {
118
- for (const s of importData.sessions) {
119
- const exists = db.prepare("SELECT id FROM sessions WHERE started_at = ? AND agent_name = ?").get(s.started_at, s.agent_name || "unknown");
120
- if (!exists) {
121
- const result = db.prepare("INSERT INTO sessions (started_at, ended_at, summary, agent_name, project_root, tags) VALUES (?, ?, ?, ?, ?, ?)").run(s.started_at, s.ended_at || null, s.summary || null, s.agent_name || "unknown", s.project_root || "", s.tags || null);
122
- sessionIdMap.set(s.id, result.lastInsertRowid);
123
- }
124
- else {
125
- sessionIdMap.set(s.id, exists.id);
126
- }
127
- }
128
- }
129
- if (Array.isArray(importData.changes)) {
130
- for (const c of importData.changes) {
131
- const exists = db.prepare("SELECT id FROM changes WHERE file_path = ? AND timestamp = ? AND description = ?").get(c.file_path, c.timestamp, c.description);
132
- if (!exists) {
133
- const mappedSessionId = c.session_id ? (sessionIdMap.get(c.session_id) ?? c.session_id) : null;
134
- db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, diff_summary, impact_scope) VALUES (?, ?, ?, ?, ?, ?, ?)").run(mappedSessionId, c.timestamp, c.file_path, c.change_type, c.description, c.diff_summary || null, c.impact_scope || "local");
135
- }
136
- }
137
- }
138
- if (Array.isArray(importData.conventions)) {
139
- for (const c of importData.conventions) {
140
- const exists = db.prepare("SELECT id FROM conventions WHERE rule = ?").get(c.rule);
141
- if (!exists) {
142
- db.prepare("INSERT INTO conventions (timestamp, category, rule, examples, enforced) VALUES (?, ?, ?, ?, ?)").run(c.timestamp || now(), c.category, c.rule, c.examples || null, c.enforced ?? 1);
143
- }
144
- }
145
- }
146
- if (Array.isArray(importData.decisions)) {
147
- for (const d of importData.decisions) {
148
- const exists = db.prepare("SELECT id FROM decisions WHERE decision = ?").get(d.decision);
149
- if (!exists) {
150
- db.prepare("INSERT INTO decisions (timestamp, decision, rationale, affected_files, tags, status) VALUES (?, ?, ?, ?, ?, ?)").run(d.timestamp || now(), d.decision, d.rationale || null, d.affected_files || null, d.tags || null, d.status || "active");
151
- }
152
- }
153
- }
154
- if (Array.isArray(importData.file_notes)) {
155
- for (const f of importData.file_notes) {
156
- db.prepare(`
157
- INSERT OR REPLACE INTO file_notes (file_path, purpose, dependencies, dependents, layer, last_reviewed, notes, complexity)
158
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
159
- `).run(f.file_path, f.purpose || null, f.dependencies || null, f.dependents || null, f.layer || null, f.last_reviewed || now(), f.notes || null, f.complexity || null);
160
- }
161
- }
162
- if (Array.isArray(importData.milestones)) {
163
- for (const m of importData.milestones) {
164
- const exists = db.prepare("SELECT id FROM milestones WHERE title = ? AND timestamp = ?").get(m.title, m.timestamp);
165
- if (!exists) {
166
- db.prepare("INSERT INTO milestones (timestamp, title, description, version, tags) VALUES (?, ?, ?, ?, ?)").run(m.timestamp || now(), m.title, m.description || null, m.version || null, m.tags || null);
167
- }
168
- }
169
- }
170
- });
171
- importTransaction();
172
- return {
173
- content: [{
174
- type: "text",
175
- text: JSON.stringify({ imported: counts, message: "Import complete. Duplicates were skipped." }, null, 2),
176
- }],
177
- };
178
- });
179
- }
180
- //# sourceMappingURL=export-import.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../../src/tools/export-import.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAG/E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3E,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACvD,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACf,GAAG,WAAW,SAAS,EACvB;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;gCAMO;QACpB,WAAW,EAAE;YACT,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SAClE;QACD,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QAErC,MAAM,UAAU,GAAG;YACf,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,GAAG,EAAE;YAClB,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE;YAChE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAE;YAC9D,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAE;YAClE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAAE;YAC3E,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAE;YACtE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAE;YAC1D,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAAE;SACvE,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACnF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,WAAW,EAAE,QAAQ;wBACrB,MAAM,EAAE;4BACJ,QAAQ,EAAG,UAAU,CAAC,QAAsB,CAAC,MAAM;4BACnD,OAAO,EAAG,UAAU,CAAC,OAAqB,CAAC,MAAM;4BACjD,SAAS,EAAG,UAAU,CAAC,SAAuB,CAAC,MAAM;4BACrD,UAAU,EAAG,UAAU,CAAC,UAAwB,CAAC,MAAM;4BACvD,WAAW,EAAG,UAAU,CAAC,WAAyB,CAAC,MAAM;4BACzD,KAAK,EAAG,UAAU,CAAC,KAAmB,CAAC,MAAM;4BAC7C,UAAU,EAAG,UAAU,CAAC,UAAwB,CAAC,MAAM;yBAC1D;qBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC,CACJ,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACf,GAAG,WAAW,SAAS,EACvB;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;;8BAOK;QAClB,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC3D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;SAC9D;QACD,WAAW,EAAE;YACT,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAE/F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/F,CAAC;QAED,IAAI,UAAqC,CAAC;QAC1C,IAAI,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtF,CAAC;QAED,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACzG,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACV,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,OAAO,EAAE,IAAI;4BACb,YAAY,EAAE,MAAM;4BACpB,OAAO,EAAE,+CAA+C;yBAC3D,EAAE,IAAI,EAAE,CAAC,CAAC;qBACd,CAAC;aACL,CAAC;QACN,CAAC;QAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,MAAM,iBAAiB,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,QAA0C,EAAE,CAAC;oBACpE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB,iEAAiE,CACpE,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS,CAA+B,CAAC;oBAC7E,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB,gHAAgH,CACnH,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;wBAC5H,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAY,EAAE,MAAM,CAAC,eAAyB,CAAC,CAAC;oBACvE,CAAC;yBAAM,CAAC;wBACJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChD,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAyC,EAAE,CAAC;oBACnE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACrB,kFAAkF,CACrF,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;oBAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,MAAM,eAAe,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,UAAoB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBACzG,EAAE,CAAC,OAAO,CACN,2IAA2I,CAC9I,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;oBACtI,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,WAA6C,EAAE,CAAC;oBACvE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnF,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,EAAE,CAAC,OAAO,CACN,gGAAgG,CACnG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;oBACzF,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,SAA2C,EAAE,CAAC;oBACrE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACzF,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,EAAE,CAAC,OAAO,CACN,gHAAgH,CACnH,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;oBACjI,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,UAA4C,EAAE,CAAC;oBACtE,EAAE,CAAC,OAAO,CAAC;;;aAGtB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;gBAC/J,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,UAA4C,EAAE,CAAC;oBACtE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;oBACnH,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,EAAE,CAAC,OAAO,CACN,8FAA8F,CACjG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;oBACnG,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,iBAAiB,EAAE,CAAC;QAEpB,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5G,CAAC;SACL,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerFileNoteTools(server: McpServer): void;
3
- //# sourceMappingURL=file-notes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-notes.d.ts","sourceRoot":"","sources":["../../../src/tools/file-notes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyH7D"}
@@ -1,104 +0,0 @@
1
- // ============================================================================
2
- // Engram MCP Server — File Notes Tools
3
- // ============================================================================
4
- import { z } from "zod";
5
- import { getDb, now, getCurrentSessionId } from "../database.js";
6
- import { TOOL_PREFIX } from "../constants.js";
7
- export function registerFileNoteTools(server) {
8
- server.registerTool(`${TOOL_PREFIX}_set_file_notes`, {
9
- title: "Set File Notes",
10
- description: `Store persistent notes about a file: its purpose, dependencies, architectural layer, complexity, and any important details. This creates a knowledge base that eliminates the need to re-read and re-analyze files across sessions.
11
-
12
- Args:
13
- - file_path (string): Relative path to the file
14
- - purpose (string, optional): What this file does — its responsibility
15
- - dependencies (array, optional): Files this file depends on
16
- - dependents (array, optional): Files that depend on this file
17
- - layer: "ui" | "viewmodel" | "domain" | "data" | "network" | "database" | "di" | "util" | "test" | "config" | "build" | "other"
18
- - complexity: "trivial" | "simple" | "moderate" | "complex" | "critical"
19
- - notes (string, optional): Any important context, gotchas, or warnings
20
-
21
- Returns:
22
- Confirmation.`,
23
- inputSchema: {
24
- file_path: z.string().describe("Relative path to the file"),
25
- purpose: z.string().optional().describe("What this file does"),
26
- dependencies: z.array(z.string()).optional().describe("Files this depends on"),
27
- dependents: z.array(z.string()).optional().describe("Files that depend on this"),
28
- layer: z.enum(["ui", "viewmodel", "domain", "data", "network", "database", "di", "util", "test", "config", "build", "other"]).optional(),
29
- complexity: z.enum(["trivial", "simple", "moderate", "complex", "critical"]).optional(),
30
- notes: z.string().optional().describe("Important context, gotchas, warnings"),
31
- },
32
- annotations: {
33
- readOnlyHint: false,
34
- destructiveHint: false,
35
- idempotentHint: true,
36
- openWorldHint: false,
37
- },
38
- }, async ({ file_path, purpose, dependencies, dependents, layer, complexity, notes }) => {
39
- const db = getDb();
40
- const timestamp = now();
41
- const sessionId = getCurrentSessionId();
42
- db.prepare(`
43
- INSERT INTO file_notes (file_path, purpose, dependencies, dependents, layer, last_reviewed, last_modified_session, notes, complexity)
44
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
45
- ON CONFLICT(file_path) DO UPDATE SET
46
- purpose = COALESCE(?, purpose),
47
- dependencies = COALESCE(?, dependencies),
48
- dependents = COALESCE(?, dependents),
49
- layer = COALESCE(?, layer),
50
- last_reviewed = ?,
51
- last_modified_session = COALESCE(?, last_modified_session),
52
- notes = COALESCE(?, notes),
53
- complexity = COALESCE(?, complexity)
54
- `).run(file_path, purpose || null, dependencies ? JSON.stringify(dependencies) : null, dependents ? JSON.stringify(dependents) : null, layer || null, timestamp, sessionId, notes || null, complexity || null,
55
- // Update values
56
- purpose || null, dependencies ? JSON.stringify(dependencies) : null, dependents ? JSON.stringify(dependents) : null, layer || null, timestamp, sessionId, notes || null, complexity || null);
57
- return {
58
- content: [{ type: "text", text: `File notes saved for ${file_path}.` }],
59
- };
60
- });
61
- server.registerTool(`${TOOL_PREFIX}_get_file_notes`, {
62
- title: "Get File Notes",
63
- description: `Retrieve stored notes for one or more files. Use to quickly understand a file's purpose and context without reading it.
64
-
65
- Args:
66
- - file_path (string, optional): Specific file to query
67
- - layer (string, optional): Filter by architectural layer
68
- - complexity (string, optional): Filter by complexity level
69
-
70
- Returns:
71
- File notes with purpose, dependencies, layer, and complexity.`,
72
- inputSchema: {
73
- file_path: z.string().optional().describe("Specific file to query"),
74
- layer: z.enum(["ui", "viewmodel", "domain", "data", "network", "database", "di", "util", "test", "config", "build", "other"]).optional(),
75
- complexity: z.enum(["trivial", "simple", "moderate", "complex", "critical"]).optional(),
76
- },
77
- annotations: {
78
- readOnlyHint: true,
79
- destructiveHint: false,
80
- idempotentHint: true,
81
- openWorldHint: false,
82
- },
83
- }, async ({ file_path, layer, complexity }) => {
84
- const db = getDb();
85
- if (file_path) {
86
- const note = db.prepare("SELECT * FROM file_notes WHERE file_path = ?").get(file_path);
87
- return { content: [{ type: "text", text: JSON.stringify(note || { message: "No notes found for this file." }, null, 2) }] };
88
- }
89
- let query = "SELECT * FROM file_notes WHERE 1=1";
90
- const params = [];
91
- if (layer) {
92
- query += " AND layer = ?";
93
- params.push(layer);
94
- }
95
- if (complexity) {
96
- query += " AND complexity = ?";
97
- params.push(complexity);
98
- }
99
- query += " ORDER BY file_path";
100
- const notes = db.prepare(query).all(...params);
101
- return { content: [{ type: "text", text: JSON.stringify({ count: notes.length, files: notes }, null, 2) }] };
102
- });
103
- }
104
- //# sourceMappingURL=file-notes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-notes.js","sourceRoot":"","sources":["../../../src/tools/file-notes.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerIntelligenceTools(server: McpServer): void;
3
- //# sourceMappingURL=intelligence.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../../src/tools/intelligence.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6ajE"}