repomemory 0.1.0 → 0.2.1

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 (66) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/.mcp.json +8 -0
  3. package/README.md +151 -104
  4. package/dist/commands/analyze.d.ts +2 -0
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +162 -188
  7. package/dist/commands/analyze.js.map +1 -1
  8. package/dist/commands/dashboard.d.ts +5 -0
  9. package/dist/commands/dashboard.d.ts.map +1 -0
  10. package/dist/commands/dashboard.js +520 -0
  11. package/dist/commands/dashboard.js.map +1 -0
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +33 -34
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/serve.d.ts.map +1 -1
  16. package/dist/commands/serve.js +2 -1
  17. package/dist/commands/serve.js.map +1 -1
  18. package/dist/commands/setup.d.ts.map +1 -1
  19. package/dist/commands/setup.js +151 -35
  20. package/dist/commands/setup.js.map +1 -1
  21. package/dist/commands/status.d.ts +4 -0
  22. package/dist/commands/status.d.ts.map +1 -0
  23. package/dist/commands/status.js +87 -0
  24. package/dist/commands/status.js.map +1 -0
  25. package/dist/commands/sync.d.ts.map +1 -1
  26. package/dist/commands/sync.js +57 -27
  27. package/dist/commands/sync.js.map +1 -1
  28. package/dist/commands/wizard.d.ts +4 -0
  29. package/dist/commands/wizard.d.ts.map +1 -0
  30. package/dist/commands/wizard.js +184 -0
  31. package/dist/commands/wizard.js.map +1 -0
  32. package/dist/index.js +37 -42
  33. package/dist/index.js.map +1 -1
  34. package/dist/lib/ai-provider.d.ts +11 -0
  35. package/dist/lib/ai-provider.d.ts.map +1 -1
  36. package/dist/lib/ai-provider.js +139 -69
  37. package/dist/lib/ai-provider.js.map +1 -1
  38. package/dist/lib/config.d.ts +11 -15
  39. package/dist/lib/config.d.ts.map +1 -1
  40. package/dist/lib/config.js +34 -22
  41. package/dist/lib/config.js.map +1 -1
  42. package/dist/lib/context-store.d.ts +11 -0
  43. package/dist/lib/context-store.d.ts.map +1 -1
  44. package/dist/lib/context-store.js +51 -18
  45. package/dist/lib/context-store.js.map +1 -1
  46. package/dist/lib/git.d.ts +1 -0
  47. package/dist/lib/git.d.ts.map +1 -1
  48. package/dist/lib/git.js +34 -20
  49. package/dist/lib/git.js.map +1 -1
  50. package/dist/lib/json-repair.d.ts +24 -0
  51. package/dist/lib/json-repair.d.ts.map +1 -0
  52. package/dist/lib/json-repair.js +140 -0
  53. package/dist/lib/json-repair.js.map +1 -0
  54. package/dist/lib/repo-scanner.d.ts.map +1 -1
  55. package/dist/lib/repo-scanner.js +103 -26
  56. package/dist/lib/repo-scanner.js.map +1 -1
  57. package/dist/lib/search.d.ts +10 -4
  58. package/dist/lib/search.d.ts.map +1 -1
  59. package/dist/lib/search.js +136 -51
  60. package/dist/lib/search.js.map +1 -1
  61. package/dist/mcp/server.d.ts.map +1 -1
  62. package/dist/mcp/server.js +163 -54
  63. package/dist/mcp/server.js.map +1 -1
  64. package/package.json +25 -9
  65. package/server.json +46 -0
  66. package/skills/repomemory/SKILL.md +29 -0
@@ -3,14 +3,14 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
3
3
  import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
4
4
  import { ContextStore } from "../lib/context-store.js";
5
5
  import { SearchIndex } from "../lib/search.js";
6
+ const VALID_CATEGORIES = ["facts", "decisions", "regressions", "sessions", "changelog"];
6
7
  export async function startMcpServer(repoRoot, config) {
7
8
  const store = new ContextStore(repoRoot, config);
8
9
  let searchIndex = null;
9
- // Initialize search index if .context exists
10
10
  if (store.exists()) {
11
11
  try {
12
12
  searchIndex = new SearchIndex(store.path, store);
13
- searchIndex.rebuild();
13
+ await searchIndex.rebuild();
14
14
  }
15
15
  catch (e) {
16
16
  console.error("Warning: Could not initialize search index:", e);
@@ -18,7 +18,7 @@ export async function startMcpServer(repoRoot, config) {
18
18
  }
19
19
  const server = new Server({
20
20
  name: "repomemory",
21
- version: "0.1.0",
21
+ version: "0.2.0",
22
22
  }, {
23
23
  capabilities: {
24
24
  tools: {},
@@ -31,7 +31,7 @@ export async function startMcpServer(repoRoot, config) {
31
31
  tools: [
32
32
  {
33
33
  name: "context_search",
34
- description: "Search the repository's persistent knowledge base. Returns relevant facts, decisions, regressions, and session notes. Use this at the start of a task to find relevant context, or when you need to understand why something is the way it is.",
34
+ description: "Search the repository's persistent knowledge base. Returns relevant facts, decisions, regressions, and session notes. Use this FIRST at the start of every task to find relevant context, or when you need to understand why something is the way it is. This prevents re-discovering architecture and re-debating past decisions.",
35
35
  inputSchema: {
36
36
  type: "object",
37
37
  properties: {
@@ -41,7 +41,7 @@ export async function startMcpServer(repoRoot, config) {
41
41
  },
42
42
  category: {
43
43
  type: "string",
44
- enum: ["facts", "decisions", "regressions", "sessions", "changelog"],
44
+ enum: VALID_CATEGORIES,
45
45
  description: "Optional: filter results to a specific category. Omit to search all.",
46
46
  },
47
47
  limit: {
@@ -51,6 +51,13 @@ export async function startMcpServer(repoRoot, config) {
51
51
  },
52
52
  required: ["query"],
53
53
  },
54
+ annotations: {
55
+ title: "Search Context",
56
+ readOnlyHint: true,
57
+ destructiveHint: false,
58
+ idempotentHint: true,
59
+ openWorldHint: false,
60
+ },
54
61
  },
55
62
  {
56
63
  name: "context_write",
@@ -60,7 +67,7 @@ export async function startMcpServer(repoRoot, config) {
60
67
  properties: {
61
68
  category: {
62
69
  type: "string",
63
- enum: ["facts", "decisions", "regressions", "sessions", "changelog"],
70
+ enum: VALID_CATEGORIES,
64
71
  description: `Category for the knowledge:
65
72
  - facts: Architecture, patterns, how things work
66
73
  - decisions: Why something was chosen (include alternatives considered)
@@ -83,20 +90,60 @@ export async function startMcpServer(repoRoot, config) {
83
90
  },
84
91
  required: ["category", "filename", "content"],
85
92
  },
93
+ annotations: {
94
+ title: "Write Context",
95
+ readOnlyHint: false,
96
+ destructiveHint: false,
97
+ idempotentHint: false,
98
+ openWorldHint: false,
99
+ },
100
+ },
101
+ {
102
+ name: "context_delete",
103
+ description: "Delete a knowledge entry from the repository context. Use this to remove stale or incorrect information. Knowledge quality matters more than quantity — prune aggressively.",
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ category: {
108
+ type: "string",
109
+ enum: VALID_CATEGORIES,
110
+ description: "The category of the entry to delete.",
111
+ },
112
+ filename: {
113
+ type: "string",
114
+ description: "The filename to delete (with or without .md extension).",
115
+ },
116
+ },
117
+ required: ["category", "filename"],
118
+ },
119
+ annotations: {
120
+ title: "Delete Context",
121
+ readOnlyHint: false,
122
+ destructiveHint: true,
123
+ idempotentHint: true,
124
+ openWorldHint: false,
125
+ },
86
126
  },
87
127
  {
88
128
  name: "context_list",
89
- description: "List all knowledge entries in the repository context, optionally filtered by category. Returns filenames and titles for browsing.",
129
+ description: "List all knowledge entries in the repository context, optionally filtered by category. Returns filenames, titles, and age for browsing. Use this to understand what knowledge already exists before writing new entries.",
90
130
  inputSchema: {
91
131
  type: "object",
92
132
  properties: {
93
133
  category: {
94
134
  type: "string",
95
- enum: ["facts", "decisions", "regressions", "sessions", "changelog"],
135
+ enum: VALID_CATEGORIES,
96
136
  description: "Optional: filter to a specific category.",
97
137
  },
98
138
  },
99
139
  },
140
+ annotations: {
141
+ title: "List Context",
142
+ readOnlyHint: true,
143
+ destructiveHint: false,
144
+ idempotentHint: true,
145
+ openWorldHint: false,
146
+ },
100
147
  },
101
148
  {
102
149
  name: "context_read",
@@ -115,6 +162,13 @@ export async function startMcpServer(repoRoot, config) {
115
162
  },
116
163
  required: ["category", "filename"],
117
164
  },
165
+ annotations: {
166
+ title: "Read Context",
167
+ readOnlyHint: true,
168
+ destructiveHint: false,
169
+ idempotentHint: true,
170
+ openWorldHint: false,
171
+ },
118
172
  },
119
173
  ],
120
174
  };
@@ -124,22 +178,29 @@ export async function startMcpServer(repoRoot, config) {
124
178
  switch (name) {
125
179
  case "context_search": {
126
180
  const { query, category, limit = 5 } = args;
181
+ // Validate category if provided
182
+ if (category && !VALID_CATEGORIES.includes(category)) {
183
+ return {
184
+ content: [{
185
+ type: "text",
186
+ text: `Invalid category: ${category}. Valid categories: ${VALID_CATEGORIES.join(", ")}`,
187
+ }],
188
+ isError: true,
189
+ };
190
+ }
127
191
  if (!store.exists()) {
128
192
  return {
129
- content: [
130
- {
193
+ content: [{
131
194
  type: "text",
132
195
  text: "No .context/ directory found. Run `repomemory init && repomemory analyze` to set up.",
133
- },
134
- ],
196
+ }],
135
197
  };
136
198
  }
137
- // Rebuild index if needed
138
199
  if (!searchIndex) {
139
200
  searchIndex = new SearchIndex(store.path, store);
140
- searchIndex.rebuild();
201
+ await searchIndex.rebuild();
141
202
  }
142
- const results = searchIndex.search(query, category, limit);
203
+ const results = await searchIndex.search(query, category, limit);
143
204
  if (results.length === 0) {
144
205
  // Fallback to simple text search
145
206
  const entries = store.listEntries(category);
@@ -150,12 +211,10 @@ export async function startMcpServer(repoRoot, config) {
150
211
  .slice(0, limit);
151
212
  if (matched.length === 0) {
152
213
  return {
153
- content: [
154
- {
214
+ content: [{
155
215
  type: "text",
156
216
  text: `No results found for "${query}"${category ? ` in ${category}` : ""}. Try a different query or browse with context_list.`,
157
- },
158
- ],
217
+ }],
159
218
  };
160
219
  }
161
220
  const text = matched
@@ -170,6 +229,16 @@ export async function startMcpServer(repoRoot, config) {
170
229
  }
171
230
  case "context_write": {
172
231
  const { category, filename, content, append = false } = args;
232
+ // Validate category
233
+ if (!VALID_CATEGORIES.includes(category)) {
234
+ return {
235
+ content: [{
236
+ type: "text",
237
+ text: `Invalid category: ${category}. Valid categories: ${VALID_CATEGORIES.join(", ")}`,
238
+ }],
239
+ isError: true,
240
+ };
241
+ }
173
242
  if (!store.exists()) {
174
243
  store.scaffold();
175
244
  }
@@ -180,40 +249,79 @@ export async function startMcpServer(repoRoot, config) {
180
249
  else {
181
250
  relativePath = store.writeEntry(category, filename, content);
182
251
  }
183
- // Update search index
252
+ // Incremental index update (not full rebuild)
184
253
  if (searchIndex) {
185
- searchIndex.rebuild();
254
+ const entries = store.listEntries(category);
255
+ const entry = entries.find((e) => e.relativePath === relativePath || e.filename === filename + ".md");
256
+ if (entry) {
257
+ await searchIndex.indexEntry(entry);
258
+ }
186
259
  }
187
260
  return {
188
- content: [
189
- {
261
+ content: [{
190
262
  type: "text",
191
- text: `✓ Written to ${relativePath}${append ? " (appended)" : ""}. This knowledge will persist across sessions.`,
192
- },
193
- ],
263
+ text: `\u2713 Written to ${relativePath}${append ? " (appended)" : ""}. This knowledge will persist across sessions.`,
264
+ }],
265
+ };
266
+ }
267
+ case "context_delete": {
268
+ const { category, filename } = args;
269
+ if (!VALID_CATEGORIES.includes(category)) {
270
+ return {
271
+ content: [{
272
+ type: "text",
273
+ text: `Invalid category: ${category}. Valid categories: ${VALID_CATEGORIES.join(", ")}`,
274
+ }],
275
+ isError: true,
276
+ };
277
+ }
278
+ const fname = filename.endsWith(".md") ? filename : filename + ".md";
279
+ const deleted = store.deleteEntry(category, fname);
280
+ if (!deleted) {
281
+ return {
282
+ content: [{
283
+ type: "text",
284
+ text: `File not found: ${category}/${fname}. Use context_list to see available files.`,
285
+ }],
286
+ };
287
+ }
288
+ // Remove from search index
289
+ if (searchIndex) {
290
+ await searchIndex.removeEntry(category, fname);
291
+ }
292
+ return {
293
+ content: [{
294
+ type: "text",
295
+ text: `\u2713 Deleted ${category}/${fname}. Stale knowledge removed.`,
296
+ }],
194
297
  };
195
298
  }
196
299
  case "context_list": {
197
300
  const { category } = (args || {});
301
+ if (category && !VALID_CATEGORIES.includes(category)) {
302
+ return {
303
+ content: [{
304
+ type: "text",
305
+ text: `Invalid category: ${category}. Valid categories: ${VALID_CATEGORIES.join(", ")}`,
306
+ }],
307
+ isError: true,
308
+ };
309
+ }
198
310
  if (!store.exists()) {
199
311
  return {
200
- content: [
201
- {
312
+ content: [{
202
313
  type: "text",
203
314
  text: "No .context/ directory found. Run `repomemory init` first.",
204
- },
205
- ],
315
+ }],
206
316
  };
207
317
  }
208
318
  const entries = store.listEntries(category);
209
319
  if (entries.length === 0) {
210
320
  return {
211
- content: [
212
- {
321
+ content: [{
213
322
  type: "text",
214
323
  text: `No entries found${category ? ` in ${category}` : ""}. Run \`repomemory analyze\` to populate, or use context_write to add entries.`,
215
- },
216
- ],
324
+ }],
217
325
  };
218
326
  }
219
327
  const grouped = {};
@@ -228,7 +336,7 @@ export async function startMcpServer(repoRoot, config) {
228
336
  for (const entry of catEntries) {
229
337
  const sizeKb = (entry.sizeBytes / 1024).toFixed(1);
230
338
  const age = getRelativeTime(entry.lastModified);
231
- text += `- **${entry.filename}** ${entry.title} (${sizeKb}KB, ${age})\n`;
339
+ text += `- **${entry.filename}** \u2014 ${entry.title} (${sizeKb}KB, ${age})\n`;
232
340
  }
233
341
  text += "\n";
234
342
  }
@@ -240,36 +348,30 @@ export async function startMcpServer(repoRoot, config) {
240
348
  const content = store.readEntry(category, fname);
241
349
  if (!content) {
242
350
  return {
243
- content: [
244
- {
351
+ content: [{
245
352
  type: "text",
246
353
  text: `File not found: ${category}/${fname}. Use context_list to see available files.`,
247
- },
248
- ],
354
+ }],
249
355
  };
250
356
  }
251
357
  return {
252
- content: [
253
- {
358
+ content: [{
254
359
  type: "text",
255
360
  text: `# ${category}/${fname}\n\n${content}`,
256
- },
257
- ],
361
+ }],
258
362
  };
259
363
  }
260
364
  default:
261
365
  return {
262
- content: [
263
- {
366
+ content: [{
264
367
  type: "text",
265
368
  text: `Unknown tool: ${name}`,
266
- },
267
- ],
369
+ }],
268
370
  isError: true,
269
371
  };
270
372
  }
271
373
  });
272
- // --- Resources (expose .context/ files as MCP resources) ---
374
+ // --- Resources ---
273
375
  server.setRequestHandler(ListResourcesRequestSchema, async () => {
274
376
  if (!store.exists()) {
275
377
  return { resources: [] };
@@ -296,21 +398,28 @@ export async function startMcpServer(repoRoot, config) {
296
398
  throw new Error(`Resource not found: ${uri}`);
297
399
  }
298
400
  return {
299
- contents: [
300
- {
401
+ contents: [{
301
402
  uri,
302
403
  mimeType: "text/markdown",
303
404
  text: content,
304
- },
305
- ],
405
+ }],
306
406
  };
307
407
  });
308
- // Connect via stdio
408
+ // Graceful shutdown
409
+ const cleanup = () => {
410
+ if (searchIndex) {
411
+ searchIndex.close();
412
+ searchIndex = null;
413
+ }
414
+ process.exit(0);
415
+ };
416
+ process.on("SIGTERM", cleanup);
417
+ process.on("SIGINT", cleanup);
309
418
  const transport = new StdioServerTransport();
310
419
  await server.connect(transport);
311
420
  }
312
421
  function getRelativeTime(date) {
313
- const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
422
+ const seconds = Math.max(0, Math.floor((Date.now() - date.getTime()) / 1000));
314
423
  if (seconds < 60)
315
424
  return "just now";
316
425
  if (seconds < 3600)
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,21 @@
1
1
  {
2
2
  "name": "repomemory",
3
- "version": "0.1.0",
4
- "description": "Your repo remembers what every AI session learned. Persistent, structured memory for AI coding agents.",
3
+ "version": "0.2.1",
4
+ "description": "Your codebase never forgets. Persistent, structured memory for AI coding agents.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "repomemory": "dist/index.js"
8
8
  },
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./mcp": "./dist/mcp/server.js"
12
+ },
9
13
  "scripts": {
10
14
  "build": "node scripts/build.js",
11
15
  "dev": "tsx src/index.ts",
12
16
  "start": "node dist/index.js",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
13
19
  "prepublishOnly": "npm run build"
14
20
  },
15
21
  "repository": {
@@ -29,32 +35,38 @@
29
35
  "claude-code",
30
36
  "cursor",
31
37
  "copilot",
38
+ "windsurf",
39
+ "cline",
40
+ "aider",
32
41
  "mcp",
33
- "openclaw",
42
+ "mcp-server",
34
43
  "repository",
35
44
  "knowledge-base",
36
45
  "gemini",
37
46
  "grok",
38
- "context-engineering"
47
+ "context-engineering",
48
+ "ai-memory",
49
+ "codebase-context"
39
50
  ],
40
51
  "author": "DanielGuru",
41
52
  "license": "MIT",
42
53
  "dependencies": {
43
54
  "@anthropic-ai/sdk": "^0.74.0",
55
+ "@clack/prompts": "^1.0.1",
44
56
  "@google/generative-ai": "^0.24.1",
45
57
  "@modelcontextprotocol/sdk": "^1.26.0",
46
- "better-sqlite3": "^12.6.2",
47
58
  "chalk": "^5.6.2",
48
59
  "commander": "^14.0.3",
49
- "glob": "^13.0.5",
50
60
  "openai": "^6.22.0",
61
+ "ora": "^8.2.0",
62
+ "sql.js": "^1.12.0",
51
63
  "zod": "^4.3.6"
52
64
  },
53
65
  "devDependencies": {
54
- "@types/better-sqlite3": "^7.6.13",
55
66
  "@types/node": "^25.2.3",
56
67
  "tsx": "^4.21.0",
57
- "typescript": "^5.9.3"
68
+ "typescript": "^5.9.3",
69
+ "vitest": "^3.1.0"
58
70
  },
59
71
  "engines": {
60
72
  "node": ">=18.0.0"
@@ -62,6 +74,10 @@
62
74
  "files": [
63
75
  "dist",
64
76
  "README.md",
65
- "LICENSE"
77
+ "LICENSE",
78
+ ".claude-plugin",
79
+ ".mcp.json",
80
+ "skills",
81
+ "server.json"
66
82
  ]
67
83
  }
package/server.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "https://registry.modelcontextprotocol.io/schema/server.json",
3
+ "name": "io.github.DanielGuru/repomemory",
4
+ "description": "Persistent, structured memory for AI coding agents. Your codebase never forgets.",
5
+ "version": "0.2.1",
6
+ "packages": [
7
+ {
8
+ "registry": "npm",
9
+ "name": "repomemory",
10
+ "version": "0.2.1",
11
+ "runtime": "node",
12
+ "args": ["dist/mcp/server.js"]
13
+ }
14
+ ],
15
+ "repository": {
16
+ "url": "https://github.com/DanielGuru/repomemory"
17
+ },
18
+ "tools": [
19
+ {
20
+ "name": "context_search",
21
+ "description": "Search the repository's persistent knowledge base"
22
+ },
23
+ {
24
+ "name": "context_write",
25
+ "description": "Write knowledge to persistent memory"
26
+ },
27
+ {
28
+ "name": "context_delete",
29
+ "description": "Delete stale knowledge entries"
30
+ },
31
+ {
32
+ "name": "context_list",
33
+ "description": "List all knowledge entries"
34
+ },
35
+ {
36
+ "name": "context_read",
37
+ "description": "Read a specific context file"
38
+ }
39
+ ],
40
+ "_meta": {
41
+ "io.modelcontextprotocol.registry/publisher-provided": {
42
+ "categories": ["memory", "coding-agents", "knowledge-base"],
43
+ "tags": ["ai-memory", "context-engineering", "mcp", "claude-code", "cursor", "copilot"]
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: repomemory
3
+ description: Search and manage your repository's persistent knowledge base. Use this to find architecture docs, past decisions, known regressions, and session notes before starting work.
4
+ allowed-tools: Bash, Read, Grep
5
+ ---
6
+
7
+ # repomemory — Repository Memory
8
+
9
+ You have access to the repomemory MCP server which provides persistent knowledge for this codebase.
10
+
11
+ ## When invoked
12
+
13
+ If the user says `/repomemory` or `/repomemory <query>`:
14
+
15
+ 1. If a query is provided via $ARGUMENTS, search for it:
16
+ - Use the `context_search` MCP tool with the query
17
+ - Display the results clearly
18
+
19
+ 2. If no query is provided, show an overview:
20
+ - Use `context_list` to show all available knowledge
21
+ - Highlight any stale entries (>60 days old)
22
+ - Suggest searching for specific topics
23
+
24
+ ## Always
25
+
26
+ - Use `context_search` BEFORE starting any task to find relevant context
27
+ - Use `context_write` to record discoveries, decisions, and gotchas during your session
28
+ - Use `context_delete` to remove stale or incorrect knowledge
29
+ - Be specific when writing: include file paths, function names, and commands