memgrid 0.5.0

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 (96) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +251 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/learn/index.d.ts +44 -0
  9. package/dist/learn/index.d.ts.map +1 -0
  10. package/dist/learn/index.js +234 -0
  11. package/dist/learn/index.js.map +1 -0
  12. package/dist/memgrid.d.ts +50 -0
  13. package/dist/memgrid.d.ts.map +1 -0
  14. package/dist/memgrid.js +175 -0
  15. package/dist/memgrid.js.map +1 -0
  16. package/dist/retrieve/index.d.ts +27 -0
  17. package/dist/retrieve/index.d.ts.map +1 -0
  18. package/dist/retrieve/index.js +209 -0
  19. package/dist/retrieve/index.js.map +1 -0
  20. package/dist/retrieve/semantic.d.ts +67 -0
  21. package/dist/retrieve/semantic.d.ts.map +1 -0
  22. package/dist/retrieve/semantic.js +240 -0
  23. package/dist/retrieve/semantic.js.map +1 -0
  24. package/dist/scanner/composite.d.ts +27 -0
  25. package/dist/scanner/composite.d.ts.map +1 -0
  26. package/dist/scanner/composite.js +58 -0
  27. package/dist/scanner/composite.js.map +1 -0
  28. package/dist/scanner/config.d.ts +15 -0
  29. package/dist/scanner/config.d.ts.map +1 -0
  30. package/dist/scanner/config.js +167 -0
  31. package/dist/scanner/config.js.map +1 -0
  32. package/dist/scanner/golang.d.ts +19 -0
  33. package/dist/scanner/golang.d.ts.map +1 -0
  34. package/dist/scanner/golang.js +190 -0
  35. package/dist/scanner/golang.js.map +1 -0
  36. package/dist/scanner/index.d.ts +11 -0
  37. package/dist/scanner/index.d.ts.map +1 -0
  38. package/dist/scanner/index.js +10 -0
  39. package/dist/scanner/index.js.map +1 -0
  40. package/dist/scanner/javascript.d.ts +20 -0
  41. package/dist/scanner/javascript.d.ts.map +1 -0
  42. package/dist/scanner/javascript.js +167 -0
  43. package/dist/scanner/javascript.js.map +1 -0
  44. package/dist/scanner/markdown.d.ts +17 -0
  45. package/dist/scanner/markdown.d.ts.map +1 -0
  46. package/dist/scanner/markdown.js +106 -0
  47. package/dist/scanner/markdown.js.map +1 -0
  48. package/dist/scanner/python.d.ts +19 -0
  49. package/dist/scanner/python.d.ts.map +1 -0
  50. package/dist/scanner/python.js +177 -0
  51. package/dist/scanner/python.js.map +1 -0
  52. package/dist/scanner/rules.d.ts +15 -0
  53. package/dist/scanner/rules.d.ts.map +1 -0
  54. package/dist/scanner/rules.js +86 -0
  55. package/dist/scanner/rules.js.map +1 -0
  56. package/dist/scanner/rust.d.ts +18 -0
  57. package/dist/scanner/rust.d.ts.map +1 -0
  58. package/dist/scanner/rust.js +178 -0
  59. package/dist/scanner/rust.js.map +1 -0
  60. package/dist/scanner/scanner.d.ts +33 -0
  61. package/dist/scanner/scanner.d.ts.map +1 -0
  62. package/dist/scanner/scanner.js +2 -0
  63. package/dist/scanner/scanner.js.map +1 -0
  64. package/dist/scanner/typescript.d.ts +28 -0
  65. package/dist/scanner/typescript.d.ts.map +1 -0
  66. package/dist/scanner/typescript.js +522 -0
  67. package/dist/scanner/typescript.js.map +1 -0
  68. package/dist/serve/cli.d.ts +3 -0
  69. package/dist/serve/cli.d.ts.map +1 -0
  70. package/dist/serve/cli.js +145 -0
  71. package/dist/serve/cli.js.map +1 -0
  72. package/dist/serve/mcp-server.d.ts +11 -0
  73. package/dist/serve/mcp-server.d.ts.map +1 -0
  74. package/dist/serve/mcp-server.js +276 -0
  75. package/dist/serve/mcp-server.js.map +1 -0
  76. package/dist/shared/constants.d.ts +2 -0
  77. package/dist/shared/constants.d.ts.map +1 -0
  78. package/dist/shared/constants.js +2 -0
  79. package/dist/shared/constants.js.map +1 -0
  80. package/dist/shared/types.d.ts +99 -0
  81. package/dist/shared/types.d.ts.map +1 -0
  82. package/dist/shared/types.js +3 -0
  83. package/dist/shared/types.js.map +1 -0
  84. package/dist/store/file-store.d.ts +62 -0
  85. package/dist/store/file-store.d.ts.map +1 -0
  86. package/dist/store/file-store.js +241 -0
  87. package/dist/store/file-store.js.map +1 -0
  88. package/dist/store/index.d.ts +3 -0
  89. package/dist/store/index.d.ts.map +1 -0
  90. package/dist/store/index.js +2 -0
  91. package/dist/store/index.js.map +1 -0
  92. package/dist/sync/index.d.ts +56 -0
  93. package/dist/sync/index.d.ts.map +1 -0
  94. package/dist/sync/index.js +580 -0
  95. package/dist/sync/index.js.map +1 -0
  96. package/package.json +51 -0
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { MemGrid } from '../memgrid.js';
4
+ import { TypeScriptScanner, JavaScriptScanner, PythonScanner, GoScanner, RustScanner, MarkdownScanner, RulesScanner, ConfigScanner, } from '../scanner/index.js';
5
+ import { startMCPServer } from './mcp-server.js';
6
+ const program = new Command();
7
+ program
8
+ .name('memgrid')
9
+ .description('Project-level semantic memory for AI coding agents')
10
+ .version('0.5.0');
11
+ program
12
+ .command('init')
13
+ .description('Scan project and generate initial memory grid')
14
+ .option('-f, --force', 'Force re-scan even if grid exists')
15
+ .option('--no-rules', 'Skip scanning .claude/rules/')
16
+ .option('--no-examples', 'Skip scanning .claude/examples/')
17
+ .action(async (options) => {
18
+ // Auto-detect applicable scanners
19
+ const root = process.cwd();
20
+ const languageScanners = [
21
+ { name: 'typescript', factory: () => new TypeScriptScanner(null, root) },
22
+ { name: 'javascript', factory: () => new JavaScriptScanner(null, root) },
23
+ { name: 'python', factory: () => new PythonScanner(null, root) },
24
+ { name: 'golang', factory: () => new GoScanner(null, root) },
25
+ { name: 'rust', factory: () => new RustScanner(null, root) },
26
+ ];
27
+ const detected = [];
28
+ for (const ls of languageScanners) {
29
+ if (ls.factory().detect(root))
30
+ detected.push(ls.name);
31
+ }
32
+ // Also detect universal scanners
33
+ if (new MarkdownScanner(root).detect(root))
34
+ detected.push('markdown');
35
+ if (options.rules !== false && new RulesScanner(root).detect(root))
36
+ detected.push('rules');
37
+ if (new ConfigScanner(root).detect(root))
38
+ detected.push('config');
39
+ const mg = new MemGrid(root);
40
+ console.log(`🔍 Scanning project (${detected.join(', ') || 'typescript'})...\n`);
41
+ const units = await mg.init({
42
+ projectRoot: process.cwd(),
43
+ includeRules: options.rules !== false,
44
+ includeExamples: options.examples !== false,
45
+ force: options.force || false,
46
+ });
47
+ const stats = await mg.stats();
48
+ console.log('📊 MemGrid initialized!\n');
49
+ console.log('Units generated:');
50
+ for (const [type, count] of Object.entries(stats.typeDistribution)) {
51
+ console.log(` ${type}: ${count}`);
52
+ }
53
+ console.log(`\nTotal: ${stats.totalUnits} units`);
54
+ console.log(`Storage: .claude/memory-grid/`);
55
+ });
56
+ program
57
+ .command('sync')
58
+ .description('Incremental sync — re-scan only changed files (fast, for CI/CD or post-git-pull)')
59
+ .option('--no-rules', 'Skip scanning .claude/rules/')
60
+ .option('--no-examples', 'Skip scanning .claude/examples/')
61
+ .option('-t, --threshold <number>', 'Fuzzy match threshold (0.0-1.0)', '0.45')
62
+ .action(async (options) => {
63
+ const mg = new MemGrid(process.cwd());
64
+ console.log('🔄 Syncing (incremental)...\n');
65
+ const result = await mg.sync({
66
+ projectRoot: process.cwd(),
67
+ includeRules: options.rules !== false,
68
+ includeExamples: options.examples !== false,
69
+ fuzzyThreshold: parseFloat(options.threshold),
70
+ });
71
+ if (result.changedFiles.length === 0 && result.removedFiles.length === 0) {
72
+ console.log('✅ No changes detected — grid is up to date');
73
+ return;
74
+ }
75
+ console.log(`📁 Changed files: ${result.changedFiles.length}`);
76
+ console.log(`🗑️ Removed files: ${result.removedFiles.length}`);
77
+ console.log(`📝 Updated units: ${result.updatedUnits}`);
78
+ console.log(`⚠️ Stale units: ${result.staleUnits}`);
79
+ console.log(`🔗 Repaired links: ${result.repairedAssociations}`);
80
+ console.log(`💔 Broken links: ${result.brokenAssociations}`);
81
+ console.log(`\n⏱️ Done in ${result.elapsedMs}ms`);
82
+ });
83
+ program
84
+ .command('search')
85
+ .description('Search memory grid for relevant units (hybrid: keyword + semantic)')
86
+ .argument('<query>', 'Search query')
87
+ .option('-n, --max <number>', 'Max results', '10')
88
+ .option('-H, --hops <number>', 'Max association hops', '2')
89
+ .option('-s, --semantic <number>', 'Semantic weight (0.0-1.0, default: 0.4)', '0.4')
90
+ .action(async (query, options) => {
91
+ const mg = new MemGrid(process.cwd());
92
+ const result = await mg.search(query, {
93
+ maxResults: parseInt(options.max),
94
+ maxHops: parseInt(options.hops),
95
+ semanticWeight: parseFloat(options.semantic),
96
+ });
97
+ console.log(mg.context(result));
98
+ });
99
+ program
100
+ .command('add')
101
+ .description('Add a memory unit manually')
102
+ .requiredOption('-t, --type <type>', 'Unit type')
103
+ .requiredOption('-s, --summary <summary>', 'One-line summary')
104
+ .requiredOption('-d, --description <desc>', 'Description')
105
+ .option('-f, --file <file>', 'Source file path')
106
+ .option('-l, --lines <lines>', 'Source line range')
107
+ .action(async (options) => {
108
+ const mg = new MemGrid(process.cwd());
109
+ const id = `${options.type}_manual_${Date.now()}`;
110
+ const unit = await mg.add({
111
+ id,
112
+ type: options.type,
113
+ summary: options.summary,
114
+ content: {
115
+ description: options.description,
116
+ },
117
+ source: options.file ? { file: options.file, lines: options.lines } : undefined,
118
+ });
119
+ console.log(`✅ Added: ${unit.id}`);
120
+ });
121
+ program
122
+ .command('stats')
123
+ .description('Show grid statistics')
124
+ .action(async () => {
125
+ const mg = new MemGrid(process.cwd());
126
+ const stats = await mg.stats();
127
+ console.log('📊 MemGrid Statistics\n');
128
+ console.log(` Total units: ${stats.totalUnits}`);
129
+ console.log(` Active: ${stats.activeUnits}`);
130
+ console.log(` Archived: ${stats.archivedUnits}`);
131
+ console.log(` Last scan: ${stats.lastScanAt || 'Never'}`);
132
+ console.log(`\n Type distribution:`);
133
+ for (const [type, count] of Object.entries(stats.typeDistribution)) {
134
+ console.log(` ${type}: ${count}`);
135
+ }
136
+ });
137
+ program
138
+ .command('serve')
139
+ .description('Start MCP Server (stdio transport)')
140
+ .action(async () => {
141
+ console.error('🚀 MemGrid MCP Server starting...');
142
+ await startMCPServer(process.cwd());
143
+ });
144
+ program.parse();
145
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/serve/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class MemGridServer {
2
+ private server;
3
+ private mg;
4
+ constructor(projectRoot: string);
5
+ private registerTools;
6
+ private registerHandlers;
7
+ start(): Promise<void>;
8
+ stop(): Promise<void>;
9
+ }
10
+ export declare function startMCPServer(projectRoot: string): Promise<void>;
11
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/serve/mcp-server.ts"],"names":[],"mappings":"AAgBA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAU;gBAER,WAAW,EAAE,MAAM;IAW/B,OAAO,CAAC,aAAa;IAuHrB,OAAO,CAAC,gBAAgB;IAgJlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAGD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,iBAcvD"}
@@ -0,0 +1,276 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { MemGrid } from '../memgrid.js';
5
+ const VALID_TYPES = [
6
+ 'method', 'component', 'pattern', 'config', 'error_solution',
7
+ 'decision', 'skill_trigger', 'mcp_trigger', 'rule_trigger',
8
+ 'style_preference', 'architecture_principle',
9
+ ];
10
+ export class MemGridServer {
11
+ server;
12
+ mg;
13
+ constructor(projectRoot) {
14
+ this.mg = new MemGrid(projectRoot);
15
+ this.server = new Server({ name: 'memgrid', version: '0.4.0' }, { capabilities: { tools: {} } });
16
+ this.registerTools();
17
+ this.registerHandlers();
18
+ }
19
+ registerTools() {
20
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
21
+ const tools = [
22
+ {
23
+ name: 'memgrid_search',
24
+ description: 'Search the project memory grid for relevant knowledge units. ' +
25
+ 'Returns method signatures, design patterns, coding style preferences, ' +
26
+ 'error solutions, and tooling triggers related to the query. ' +
27
+ 'Use this instead of reading every file to understand the project.',
28
+ inputSchema: {
29
+ type: 'object',
30
+ properties: {
31
+ query: {
32
+ type: 'string',
33
+ description: 'What are you trying to do? Describe the task in natural language.',
34
+ },
35
+ maxResults: {
36
+ type: 'number',
37
+ description: 'Maximum number of units to return (default: 10, max: 20)',
38
+ default: 10,
39
+ },
40
+ maxHops: {
41
+ type: 'number',
42
+ description: 'How many association hops to traverse (default: 2, max: 3)',
43
+ default: 2,
44
+ },
45
+ semanticWeight: {
46
+ type: 'number',
47
+ description: 'Hybrid search: 0.0 = keyword only, 1.0 = semantic only (default: 0.4)',
48
+ default: 0.4,
49
+ },
50
+ },
51
+ required: ['query'],
52
+ },
53
+ },
54
+ {
55
+ name: 'memgrid_add',
56
+ description: 'Add or update a memory unit in the grid. Use this after completing a task ' +
57
+ 'to record what you learned: new methods, mistakes fixed, design decisions, ' +
58
+ 'or style preferences discovered.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ type: {
63
+ type: 'string',
64
+ description: 'Unit type: method, pattern, config, error_solution, decision, ' +
65
+ 'skill_trigger, mcp_trigger, rule_trigger, style_preference, architecture_principle',
66
+ enum: VALID_TYPES,
67
+ },
68
+ summary: {
69
+ type: 'string',
70
+ description: 'One-line summary of what this unit represents',
71
+ },
72
+ description: {
73
+ type: 'string',
74
+ description: 'Detailed description of the unit content',
75
+ },
76
+ sourceFile: {
77
+ type: 'string',
78
+ description: 'Source file path (if applicable)',
79
+ },
80
+ codeSnippet: {
81
+ type: 'string',
82
+ description: 'Relevant code snippet (if applicable)',
83
+ },
84
+ styleNotes: {
85
+ type: 'string',
86
+ description: 'Style or usage notes',
87
+ },
88
+ associations: {
89
+ type: 'array',
90
+ description: 'Links to other unit IDs',
91
+ items: {
92
+ type: 'object',
93
+ properties: {
94
+ to: { type: 'string' },
95
+ relation: { type: 'string' },
96
+ weight: { type: 'number', default: 0.8 },
97
+ },
98
+ },
99
+ },
100
+ },
101
+ required: ['type', 'summary', 'description'],
102
+ },
103
+ },
104
+ {
105
+ name: 'memgrid_suggest',
106
+ description: 'After completing a coding task, ask MemGrid to suggest which memory units ' +
107
+ 'should be added, updated, or archived. MemGrid analyzes the task outcome ' +
108
+ 'and compares against existing grid knowledge.',
109
+ inputSchema: {
110
+ type: 'object',
111
+ properties: {
112
+ taskSummary: {
113
+ type: 'string',
114
+ description: 'Brief summary of what the task was about',
115
+ },
116
+ outcome: {
117
+ type: 'string',
118
+ description: 'What was the outcome? What was built, fixed, or changed?',
119
+ },
120
+ filesModified: {
121
+ type: 'array',
122
+ description: 'List of files that were modified or created',
123
+ items: { type: 'string' },
124
+ },
125
+ },
126
+ required: ['taskSummary', 'outcome'],
127
+ },
128
+ },
129
+ ];
130
+ return { tools };
131
+ });
132
+ }
133
+ registerHandlers() {
134
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
135
+ const { name, arguments: args } = request.params;
136
+ try {
137
+ switch (name) {
138
+ case 'memgrid_search': {
139
+ const query = args.query;
140
+ const maxResults = Math.min(args.maxResults || 10, 20);
141
+ const maxHops = Math.min(args.maxHops || 2, 3);
142
+ const semanticWeight = args.semanticWeight ?? 0.4;
143
+ const result = await this.mg.search(query, { maxResults, maxHops, semanticWeight });
144
+ const context = this.mg.context(result);
145
+ return {
146
+ content: [
147
+ {
148
+ type: 'text',
149
+ text: context,
150
+ },
151
+ ],
152
+ };
153
+ }
154
+ case 'memgrid_add': {
155
+ const { type, summary, description, sourceFile, codeSnippet, styleNotes, associations } = args;
156
+ if (!VALID_TYPES.includes(type)) {
157
+ return {
158
+ content: [{ type: 'text', text: `Invalid type: "${type}". Must be one of: ${VALID_TYPES.join(', ')}` }],
159
+ isError: true,
160
+ };
161
+ }
162
+ const id = `${type}_${Date.now()}`;
163
+ const unit = await this.mg.add({
164
+ id,
165
+ type: type,
166
+ summary,
167
+ content: {
168
+ description,
169
+ code_snippet: codeSnippet,
170
+ style_notes: styleNotes,
171
+ },
172
+ source: sourceFile ? { file: sourceFile } : undefined,
173
+ associations: (associations || []).map((a) => ({
174
+ to: a.to,
175
+ relation: a.relation,
176
+ weight: a.weight || 0.8,
177
+ })),
178
+ });
179
+ return {
180
+ content: [
181
+ {
182
+ type: 'text',
183
+ text: `✅ Memory unit added: ${unit.id}\nType: ${unit.type}\nSummary: ${unit.summary}\nConfidence: ${unit.meta.confidence}`,
184
+ },
185
+ ],
186
+ };
187
+ }
188
+ case 'memgrid_suggest': {
189
+ const { taskSummary, outcome, filesModified } = args;
190
+ // Search for existing units related to this task
191
+ const result = await this.mg.search(taskSummary, { maxResults: 5, maxHops: 1 });
192
+ const suggestions = [];
193
+ suggestions.push(`## 📋 MemGrid Suggestions for: "${taskSummary}"\n`);
194
+ // Suggest new method units for modified files
195
+ if (filesModified && filesModified.length > 0) {
196
+ const existingFiles = new Set(result.units
197
+ .filter((u) => u.source?.file)
198
+ .map((u) => u.source.file));
199
+ const newFiles = filesModified.filter((f) => !existingFiles.has(f));
200
+ if (newFiles.length > 0) {
201
+ suggestions.push(`### 💡 Suggested new method units (${newFiles.length} new files):`);
202
+ for (const file of newFiles) {
203
+ suggestions.push(`- Scan \`${file}\` with \`memgrid_init\` to extract methods`);
204
+ }
205
+ suggestions.push('');
206
+ }
207
+ }
208
+ // Suggest updates for existing relevant units
209
+ if (result.units.length > 0) {
210
+ suggestions.push(`### 🔄 Related existing units (${result.units.length} found):`);
211
+ for (const unit of result.units.slice(0, 5)) {
212
+ suggestions.push(`- \`${unit.id}\` — ${unit.summary}`);
213
+ }
214
+ suggestions.push('\nReview and update if the task changed their behavior.');
215
+ }
216
+ // Suggest error_solution if outcome mentions fixes
217
+ const fixKeywords = ['fix', 'bug', 'error', 'OOM', 'crash', '修复', '错误'];
218
+ if (fixKeywords.some((k) => taskSummary.toLowerCase().includes(k) || outcome.toLowerCase().includes(k))) {
219
+ suggestions.push('### 🐛 Suggested error_solution unit:');
220
+ suggestions.push(`- Record this fix: what was the error, and what was the solution?`);
221
+ suggestions.push(`- Use \`memgrid_add --type error_solution\` to add it.`);
222
+ suggestions.push('');
223
+ }
224
+ // Suggest decision unit if the task seems architectural
225
+ const decisionKeywords = ['refactor', 'architecture', 'pattern', 'design', '重构', '架构'];
226
+ if (decisionKeywords.some((k) => taskSummary.includes(k))) {
227
+ suggestions.push('### 🎯 Suggested decision unit:');
228
+ suggestions.push('- Record why this architectural decision was made.');
229
+ suggestions.push('- Use `memgrid_add --type decision` to capture the rationale.');
230
+ suggestions.push('');
231
+ }
232
+ if (suggestions.length <= 2) {
233
+ suggestions.push('No strong suggestions. The grid may not need updates for this task.');
234
+ }
235
+ return {
236
+ content: [{ type: 'text', text: suggestions.join('\n') }],
237
+ };
238
+ }
239
+ default:
240
+ return {
241
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
242
+ isError: true,
243
+ };
244
+ }
245
+ }
246
+ catch (error) {
247
+ return {
248
+ content: [{ type: 'text', text: `Error: ${error.message}` }],
249
+ isError: true,
250
+ };
251
+ }
252
+ });
253
+ }
254
+ async start() {
255
+ const transport = new StdioServerTransport();
256
+ await this.server.connect(transport);
257
+ }
258
+ async stop() {
259
+ await this.server.close();
260
+ }
261
+ }
262
+ // CLI entry point
263
+ export async function startMCPServer(projectRoot) {
264
+ const server = new MemGridServer(projectRoot);
265
+ // Handle graceful shutdown
266
+ process.on('SIGINT', async () => {
267
+ await server.stop();
268
+ process.exit(0);
269
+ });
270
+ process.on('SIGTERM', async () => {
271
+ await server.stop();
272
+ process.exit(0);
273
+ });
274
+ await server.start();
275
+ }
276
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/serve/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,99 @@
1
+ export type MemoryUnitType = 'method' | 'component' | 'pattern' | 'config' | 'error_solution' | 'decision' | 'skill_trigger' | 'mcp_trigger' | 'rule_trigger' | 'style_preference' | 'architecture_principle';
2
+ export type RelationType = 'calls' | 'used_by' | 'implements_pattern' | 'follows_rule' | 'similar_pattern' | 'similar_error' | 'paired_with' | 'embodies' | 'belongs_to_module' | 'triggers';
3
+ export interface Association {
4
+ to: string;
5
+ relation: RelationType;
6
+ weight: number;
7
+ }
8
+ export interface MemoryUnit {
9
+ id: string;
10
+ type: MemoryUnitType;
11
+ summary: string;
12
+ source?: {
13
+ file: string;
14
+ lines?: string;
15
+ };
16
+ signatures: string[];
17
+ content: {
18
+ description: string;
19
+ inputs?: string;
20
+ outputs?: string;
21
+ dependencies?: string[];
22
+ code_snippet?: string;
23
+ style_notes?: string;
24
+ trigger?: string;
25
+ action?: string;
26
+ };
27
+ associations: Association[];
28
+ meta: {
29
+ created: string;
30
+ updated: string;
31
+ confidence: number;
32
+ usage_count: number;
33
+ status: 'active' | 'stale' | 'archived';
34
+ };
35
+ }
36
+ /** SHA-256 hash of each scanned source file, keyed by relative path */
37
+ export type FileSnapshot = Record<string, string>;
38
+ export interface MemoryGrid {
39
+ version: string;
40
+ project: string;
41
+ lastScanAt: string;
42
+ stats: {
43
+ totalUnits: number;
44
+ activeUnits: number;
45
+ archivedUnits: number;
46
+ totalAssociations: number;
47
+ };
48
+ edgeIndex: Record<string, Association[]>;
49
+ fileSnapshot?: FileSnapshot;
50
+ }
51
+ /** Result of a sync operation */
52
+ export interface SyncResult {
53
+ /** Files that changed (has hash delta) */
54
+ changedFiles: string[];
55
+ /** Files that were removed entirely */
56
+ removedFiles: string[];
57
+ /** Units added or updated */
58
+ updatedUnits: number;
59
+ /** Units marked stale (method name/line changed beyond fuzzy match) */
60
+ staleUnits: number;
61
+ /** Associations repaired via fuzzy match */
62
+ repairedAssociations: number;
63
+ /** Broken associations that couldn't be repaired */
64
+ brokenAssociations: number;
65
+ /** Total time in ms */
66
+ elapsedMs: number;
67
+ }
68
+ /** Options for sync */
69
+ export interface SyncOptions {
70
+ projectRoot: string;
71
+ includeRules: boolean;
72
+ includeExamples: boolean;
73
+ /** Max fuzzy match distance (0.0 = exact, 1.0 = anything) */
74
+ fuzzyThreshold?: number;
75
+ }
76
+ export interface SearchResult {
77
+ query: string;
78
+ units: MemoryUnit[];
79
+ totalHops: number;
80
+ elapsedMs: number;
81
+ }
82
+ export interface ScanOptions {
83
+ projectRoot: string;
84
+ includeRules: boolean;
85
+ includeExamples: boolean;
86
+ force: boolean;
87
+ }
88
+ export interface SearchOptions {
89
+ maxResults?: number;
90
+ maxHops?: number;
91
+ semanticWeight?: number;
92
+ }
93
+ /** Single-file scan result from SyncEngine */
94
+ export interface FileScanResult {
95
+ file: string;
96
+ units: MemoryUnit[];
97
+ hash: string;
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,UAAU,GACV,eAAe,GACf,aAAa,GACb,cAAc,GACd,kBAAkB,GAClB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,SAAS,GACT,oBAAoB,GACpB,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,UAAU,GACV,mBAAmB,GACnB,UAAU,CAAC;AAEf,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;KACzC,CAAC;CACH;AAED,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uCAAuC;IACvC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,3 @@
1
+ // === Memory Unit Types ===
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,4BAA4B"}