ai-mind-map 1.1.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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +554 -0
  3. package/dist/change-tracker/change-log.d.ts +160 -0
  4. package/dist/change-tracker/change-log.d.ts.map +1 -0
  5. package/dist/change-tracker/change-log.js +507 -0
  6. package/dist/change-tracker/change-log.js.map +1 -0
  7. package/dist/change-tracker/diff-engine.d.ts +149 -0
  8. package/dist/change-tracker/diff-engine.d.ts.map +1 -0
  9. package/dist/change-tracker/diff-engine.js +530 -0
  10. package/dist/change-tracker/diff-engine.js.map +1 -0
  11. package/dist/change-tracker/watcher.d.ts +137 -0
  12. package/dist/change-tracker/watcher.d.ts.map +1 -0
  13. package/dist/change-tracker/watcher.js +300 -0
  14. package/dist/change-tracker/watcher.js.map +1 -0
  15. package/dist/cli.d.ts +20 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +937 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +38 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +222 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/context/compressor.d.ts +49 -0
  24. package/dist/context/compressor.d.ts.map +1 -0
  25. package/dist/context/compressor.js +769 -0
  26. package/dist/context/compressor.js.map +1 -0
  27. package/dist/context/progressive-disclosure.d.ts +71 -0
  28. package/dist/context/progressive-disclosure.d.ts.map +1 -0
  29. package/dist/context/progressive-disclosure.js +470 -0
  30. package/dist/context/progressive-disclosure.js.map +1 -0
  31. package/dist/context/token-budget.d.ts +121 -0
  32. package/dist/context/token-budget.d.ts.map +1 -0
  33. package/dist/context/token-budget.js +282 -0
  34. package/dist/context/token-budget.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +944 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/install.d.ts +66 -0
  40. package/dist/install.d.ts.map +1 -0
  41. package/dist/install.js +946 -0
  42. package/dist/install.js.map +1 -0
  43. package/dist/knowledge-graph/architecture.d.ts +213 -0
  44. package/dist/knowledge-graph/architecture.d.ts.map +1 -0
  45. package/dist/knowledge-graph/architecture.js +585 -0
  46. package/dist/knowledge-graph/architecture.js.map +1 -0
  47. package/dist/knowledge-graph/cypher.d.ts +113 -0
  48. package/dist/knowledge-graph/cypher.d.ts.map +1 -0
  49. package/dist/knowledge-graph/cypher.js +1051 -0
  50. package/dist/knowledge-graph/cypher.js.map +1 -0
  51. package/dist/knowledge-graph/dead-code.d.ts +121 -0
  52. package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
  53. package/dist/knowledge-graph/dead-code.js +331 -0
  54. package/dist/knowledge-graph/dead-code.js.map +1 -0
  55. package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
  56. package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
  57. package/dist/knowledge-graph/flow-analyzer.js +739 -0
  58. package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
  59. package/dist/knowledge-graph/graph.d.ts +291 -0
  60. package/dist/knowledge-graph/graph.d.ts.map +1 -0
  61. package/dist/knowledge-graph/graph.js +978 -0
  62. package/dist/knowledge-graph/graph.js.map +1 -0
  63. package/dist/knowledge-graph/index.d.ts +17 -0
  64. package/dist/knowledge-graph/index.d.ts.map +1 -0
  65. package/dist/knowledge-graph/index.js +14 -0
  66. package/dist/knowledge-graph/index.js.map +1 -0
  67. package/dist/knowledge-graph/indexer.d.ts +112 -0
  68. package/dist/knowledge-graph/indexer.d.ts.map +1 -0
  69. package/dist/knowledge-graph/indexer.js +506 -0
  70. package/dist/knowledge-graph/indexer.js.map +1 -0
  71. package/dist/knowledge-graph/pagerank.d.ts +141 -0
  72. package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
  73. package/dist/knowledge-graph/pagerank.js +493 -0
  74. package/dist/knowledge-graph/pagerank.js.map +1 -0
  75. package/dist/knowledge-graph/parser.d.ts +55 -0
  76. package/dist/knowledge-graph/parser.d.ts.map +1 -0
  77. package/dist/knowledge-graph/parser.js +1090 -0
  78. package/dist/knowledge-graph/parser.js.map +1 -0
  79. package/dist/knowledge-graph/snapshot.d.ts +107 -0
  80. package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
  81. package/dist/knowledge-graph/snapshot.js +435 -0
  82. package/dist/knowledge-graph/snapshot.js.map +1 -0
  83. package/dist/memory/decision-log.d.ts +151 -0
  84. package/dist/memory/decision-log.d.ts.map +1 -0
  85. package/dist/memory/decision-log.js +482 -0
  86. package/dist/memory/decision-log.js.map +1 -0
  87. package/dist/memory/persistent-memory.d.ts +182 -0
  88. package/dist/memory/persistent-memory.d.ts.map +1 -0
  89. package/dist/memory/persistent-memory.js +579 -0
  90. package/dist/memory/persistent-memory.js.map +1 -0
  91. package/dist/memory/session-memory.d.ts +165 -0
  92. package/dist/memory/session-memory.d.ts.map +1 -0
  93. package/dist/memory/session-memory.js +382 -0
  94. package/dist/memory/session-memory.js.map +1 -0
  95. package/dist/stress-test.d.ts +10 -0
  96. package/dist/stress-test.d.ts.map +1 -0
  97. package/dist/stress-test.js +258 -0
  98. package/dist/stress-test.js.map +1 -0
  99. package/dist/tools/advanced-tools.d.ts +32 -0
  100. package/dist/tools/advanced-tools.d.ts.map +1 -0
  101. package/dist/tools/advanced-tools.js +480 -0
  102. package/dist/tools/advanced-tools.js.map +1 -0
  103. package/dist/tools/change-tools.d.ts +76 -0
  104. package/dist/tools/change-tools.d.ts.map +1 -0
  105. package/dist/tools/change-tools.js +93 -0
  106. package/dist/tools/change-tools.js.map +1 -0
  107. package/dist/tools/context-tools.d.ts +68 -0
  108. package/dist/tools/context-tools.d.ts.map +1 -0
  109. package/dist/tools/context-tools.js +141 -0
  110. package/dist/tools/context-tools.js.map +1 -0
  111. package/dist/tools/debug-tools.d.ts +25 -0
  112. package/dist/tools/debug-tools.d.ts.map +1 -0
  113. package/dist/tools/debug-tools.js +286 -0
  114. package/dist/tools/debug-tools.js.map +1 -0
  115. package/dist/tools/evolving-tools.d.ts +23 -0
  116. package/dist/tools/evolving-tools.d.ts.map +1 -0
  117. package/dist/tools/evolving-tools.js +207 -0
  118. package/dist/tools/evolving-tools.js.map +1 -0
  119. package/dist/tools/flow-tools.d.ts +24 -0
  120. package/dist/tools/flow-tools.d.ts.map +1 -0
  121. package/dist/tools/flow-tools.js +265 -0
  122. package/dist/tools/flow-tools.js.map +1 -0
  123. package/dist/tools/graph-tools.d.ts +71 -0
  124. package/dist/tools/graph-tools.d.ts.map +1 -0
  125. package/dist/tools/graph-tools.js +165 -0
  126. package/dist/tools/graph-tools.js.map +1 -0
  127. package/dist/tools/memory-tools.d.ts +62 -0
  128. package/dist/tools/memory-tools.d.ts.map +1 -0
  129. package/dist/tools/memory-tools.js +195 -0
  130. package/dist/tools/memory-tools.js.map +1 -0
  131. package/dist/tools/smart-tools.d.ts +23 -0
  132. package/dist/tools/smart-tools.d.ts.map +1 -0
  133. package/dist/tools/smart-tools.js +482 -0
  134. package/dist/tools/smart-tools.js.map +1 -0
  135. package/dist/tools/snapshot-tools.d.ts +19 -0
  136. package/dist/tools/snapshot-tools.d.ts.map +1 -0
  137. package/dist/tools/snapshot-tools.js +149 -0
  138. package/dist/tools/snapshot-tools.js.map +1 -0
  139. package/dist/types.d.ts +181 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +45 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/utils/logger.d.ts +59 -0
  144. package/dist/utils/logger.d.ts.map +1 -0
  145. package/dist/utils/logger.js +142 -0
  146. package/dist/utils/logger.js.map +1 -0
  147. package/dist/utils/token-counter.d.ts +51 -0
  148. package/dist/utils/token-counter.d.ts.map +1 -0
  149. package/dist/utils/token-counter.js +181 -0
  150. package/dist/utils/token-counter.js.map +1 -0
  151. package/install.ps1 +321 -0
  152. package/install.sh +345 -0
  153. package/package.json +94 -0
  154. package/setup.bat +62 -0
@@ -0,0 +1,482 @@
1
+ /**
2
+ * AI Mind Map — Smart MCP Tools
3
+ *
4
+ * The "never read files again" toolkit. These tools aggregate multiple
5
+ * data sources into single, rich responses so the AI never needs to
6
+ * chain tool calls or fall back to reading raw files.
7
+ *
8
+ * Tools:
9
+ * - mindmap_explain — Complete intelligence on any symbol in 1 call
10
+ * - mindmap_git_changes — Git-aware symbol-level change detection
11
+ * - mindmap_smart_search — Rich contextual search with full details
12
+ */
13
+ import { z } from 'zod';
14
+ import { execSync } from 'node:child_process';
15
+ import { readFileSync } from 'node:fs';
16
+ import { resolve, relative } from 'node:path';
17
+ import { FlowAnalyzer } from '../knowledge-graph/flow-analyzer.js';
18
+ const defaultEstimator = {
19
+ estimate: (text) => Math.ceil(text.length / 4),
20
+ };
21
+ // ============================================================
22
+ // Helpers
23
+ // ============================================================
24
+ function mcpText(result) {
25
+ return {
26
+ content: [{ type: 'text', text: JSON.stringify(result) }],
27
+ };
28
+ }
29
+ function ok(data, estimator) {
30
+ const serialised = JSON.stringify(data);
31
+ const tokens = estimator.estimate(serialised);
32
+ return { success: true, data, tokenCount: tokens, tokensSaved: 0 };
33
+ }
34
+ function okWithSavings(data, tokensSaved, estimator) {
35
+ const serialised = JSON.stringify(data);
36
+ const tokens = estimator.estimate(serialised);
37
+ return { success: true, data, tokenCount: tokens, tokensSaved };
38
+ }
39
+ function fail(message) {
40
+ return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
41
+ }
42
+ /**
43
+ * Safe git command execution. Returns stdout or null on failure.
44
+ */
45
+ function gitExec(cmd, cwd) {
46
+ try {
47
+ return execSync(cmd, { cwd, encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'] }).trim();
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ // ============================================================
54
+ // Registration
55
+ // ============================================================
56
+ /**
57
+ * Register Smart tools — the "never read files" toolkit.
58
+ */
59
+ export function registerSmartTools(server, graph, config, estimator = defaultEstimator) {
60
+ // ── mindmap_explain ──────────────────────────────────────────
61
+ server.tool('mindmap_explain', 'Get EVERYTHING about a symbol in one call: signature, doc, callers, callees, ' +
62
+ 'layer classification, blast radius, related symbols, and recent git changes. ' +
63
+ 'This replaces the need to call search → get_signature → trace_dependencies → read file.', {
64
+ symbol: z.string().describe('Symbol name to explain (function, class, method, etc.)'),
65
+ filePath: z.string().optional().describe('Optional file path to disambiguate'),
66
+ depth: z.number().int().min(1).max(5).default(2).describe('Depth for dependency tracing (default: 2)'),
67
+ }, async ({ symbol, filePath, depth }) => {
68
+ try {
69
+ // 1. Find the symbol
70
+ let candidates = graph.getNodesByName(symbol);
71
+ if (candidates.length === 0) {
72
+ const searchResults = graph.search(symbol, 10);
73
+ candidates = searchResults.filter(n => n.name === symbol ||
74
+ n.qualifiedName === symbol ||
75
+ n.qualifiedName.endsWith(`.${symbol}`) ||
76
+ n.name.toLowerCase() === symbol.toLowerCase());
77
+ if (candidates.length === 0) {
78
+ candidates = searchResults.slice(0, 3); // fallback to top search results
79
+ }
80
+ }
81
+ // Filter by file if specified
82
+ if (filePath && candidates.length > 1) {
83
+ const filtered = candidates.filter(n => n.filePath === filePath || n.filePath.endsWith(filePath));
84
+ if (filtered.length > 0)
85
+ candidates = filtered;
86
+ }
87
+ if (candidates.length === 0) {
88
+ return mcpText(fail(`Symbol not found: "${symbol}". Try mindmap_search for fuzzy matching.`));
89
+ }
90
+ const node = candidates[0];
91
+ const relPath = relative(config.projectRoot, node.filePath);
92
+ // 2. Get callers and callees
93
+ const callers = graph.findCallers(node.id).map(n => ({
94
+ name: n.name,
95
+ qualifiedName: n.qualifiedName,
96
+ type: n.type,
97
+ file: relative(config.projectRoot, n.filePath),
98
+ line: n.startLine,
99
+ signature: n.signature,
100
+ }));
101
+ const callees = graph.findCallees(node.id).map(n => ({
102
+ name: n.name,
103
+ qualifiedName: n.qualifiedName,
104
+ type: n.type,
105
+ file: relative(config.projectRoot, n.filePath),
106
+ line: n.startLine,
107
+ signature: n.signature,
108
+ }));
109
+ // 3. Classify layer with confidence
110
+ const flowAnalyzer = new FlowAnalyzer(graph, config.projectRoot);
111
+ const absPath = resolve(config.projectRoot, node.filePath);
112
+ const classification = flowAnalyzer.getFileClassification(absPath);
113
+ // 4. Blast radius
114
+ const blastNodes = graph.blastRadius(node.id, depth);
115
+ const blastRadius = {
116
+ directlyAffected: callers.length,
117
+ transitivelyAffected: blastNodes.length,
118
+ riskLevel: blastNodes.length > 20 ? 'critical'
119
+ : blastNodes.length > 10 ? 'high'
120
+ : blastNodes.length > 3 ? 'medium'
121
+ : 'low',
122
+ affectedFiles: [...new Set(blastNodes.map(n => relative(config.projectRoot, n.filePath)))].slice(0, 10),
123
+ };
124
+ // 5. Related symbols (same file, same class)
125
+ const sameFileSymbols = graph.getFileStructure(node.filePath)
126
+ .filter(n => n.type !== 'file' && n.id !== node.id)
127
+ .map(n => ({
128
+ name: n.name,
129
+ type: n.type,
130
+ signature: n.signature,
131
+ reason: 'same file',
132
+ }))
133
+ .slice(0, 10);
134
+ // 6. Git history for this symbol's file
135
+ let gitInfo = {};
136
+ try {
137
+ const absFilePath = resolve(config.projectRoot, node.filePath);
138
+ const lastLog = gitExec(`git log -1 --format="%ai|||%an|||%s" -- "${absFilePath}"`, config.projectRoot);
139
+ if (lastLog) {
140
+ const [date, author, message] = lastLog.split('|||');
141
+ gitInfo.lastModified = date;
142
+ gitInfo.lastAuthor = author;
143
+ const recentLogs = gitExec(`git log -5 --format="%h %s" -- "${absFilePath}"`, config.projectRoot);
144
+ if (recentLogs) {
145
+ gitInfo.recentCommits = recentLogs.split('\n').filter(Boolean);
146
+ }
147
+ }
148
+ }
149
+ catch {
150
+ // Not a git repo or git not available
151
+ }
152
+ // 7. Other matches (for disambiguation)
153
+ const otherMatches = candidates.length > 1
154
+ ? candidates.slice(1).map(n => ({
155
+ name: n.qualifiedName,
156
+ file: relative(config.projectRoot, n.filePath),
157
+ line: n.startLine,
158
+ type: n.type,
159
+ }))
160
+ : undefined;
161
+ // 8. Estimate tokens saved
162
+ let tokensSaved = 0;
163
+ try {
164
+ const fullFile = readFileSync(resolve(config.projectRoot, node.filePath), 'utf-8');
165
+ tokensSaved = estimator.estimate(fullFile) - 50; // reading the whole file vs this response
166
+ }
167
+ catch { }
168
+ const result = {
169
+ // Core identity
170
+ symbol: {
171
+ name: node.name,
172
+ qualifiedName: node.qualifiedName,
173
+ type: node.type,
174
+ file: relPath,
175
+ line: node.startLine,
176
+ endLine: node.endLine,
177
+ signature: node.signature,
178
+ docComment: node.docComment || undefined,
179
+ visibility: node.visibility,
180
+ isExported: node.isExported,
181
+ isAsync: node.isAsync,
182
+ parameters: node.parameters,
183
+ returnType: node.returnType,
184
+ },
185
+ // Architecture
186
+ layer: classification.layer,
187
+ layerConfidence: classification.confidence,
188
+ layerRunnerUp: classification.runnerUp,
189
+ // Dependencies
190
+ callers: callers.slice(0, 15),
191
+ callees: callees.slice(0, 15),
192
+ callerCount: callers.length,
193
+ calleeCount: callees.length,
194
+ // Impact
195
+ blastRadius,
196
+ // Related code
197
+ relatedSymbols: sameFileSymbols,
198
+ // Git
199
+ git: Object.keys(gitInfo).length > 0 ? gitInfo : undefined,
200
+ // Disambiguation
201
+ otherMatches,
202
+ };
203
+ return mcpText(okWithSavings(result, Math.max(0, tokensSaved), estimator));
204
+ }
205
+ catch (err) {
206
+ const msg = err instanceof Error ? err.message : String(err);
207
+ return mcpText(fail(`explain failed: ${msg}`));
208
+ }
209
+ });
210
+ // ── mindmap_git_changes ──────────────────────────────────────
211
+ server.tool('mindmap_git_changes', 'Git-aware change detection with SYMBOL-LEVEL diffs. Shows which functions/classes ' +
212
+ 'were added, modified, or deleted — not just file names. Also maps each changed ' +
213
+ 'symbol to its callers to show the impact of recent changes.', {
214
+ scope: z.enum([
215
+ 'uncommitted', // git diff (working tree vs HEAD)
216
+ 'staged', // git diff --cached
217
+ 'last_commit', // git diff HEAD~1..HEAD
218
+ 'last_3_commits', // git diff HEAD~3..HEAD
219
+ 'last_5_commits', // git diff HEAD~5..HEAD
220
+ 'branch', // git diff main..HEAD (or master)
221
+ ]).default('uncommitted').describe('What range of changes to analyze'),
222
+ }, async ({ scope }) => {
223
+ try {
224
+ // Build git diff command based on scope
225
+ let diffCmd;
226
+ let descr;
227
+ switch (scope) {
228
+ case 'uncommitted':
229
+ diffCmd = 'git diff --numstat HEAD';
230
+ descr = 'Uncommitted changes vs HEAD';
231
+ break;
232
+ case 'staged':
233
+ diffCmd = 'git diff --cached --numstat';
234
+ descr = 'Staged changes';
235
+ break;
236
+ case 'last_commit':
237
+ diffCmd = 'git diff --numstat HEAD~1..HEAD';
238
+ descr = 'Last commit';
239
+ break;
240
+ case 'last_3_commits':
241
+ diffCmd = 'git diff --numstat HEAD~3..HEAD';
242
+ descr = 'Last 3 commits';
243
+ break;
244
+ case 'last_5_commits':
245
+ diffCmd = 'git diff --numstat HEAD~5..HEAD';
246
+ descr = 'Last 5 commits';
247
+ break;
248
+ case 'branch': {
249
+ // Detect main/master branch
250
+ const defaultBranch = gitExec('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo refs/remotes/origin/main', config.projectRoot)?.replace('refs/remotes/origin/', '') || 'main';
251
+ diffCmd = `git diff --numstat ${defaultBranch}..HEAD`;
252
+ descr = `Branch changes vs ${defaultBranch}`;
253
+ break;
254
+ }
255
+ }
256
+ // Get file-level numstat
257
+ const numstat = gitExec(diffCmd, config.projectRoot);
258
+ if (!numstat) {
259
+ return mcpText(ok({
260
+ scope,
261
+ description: descr,
262
+ changedFiles: [],
263
+ changedSymbols: [],
264
+ impactedCallers: [],
265
+ summary: 'No changes found (or not a git repository)',
266
+ }, estimator));
267
+ }
268
+ // Parse numstat: "added\tremoved\tfile"
269
+ const changedFiles = [];
270
+ for (const line of numstat.split('\n')) {
271
+ if (!line.trim())
272
+ continue;
273
+ const [added, removed, file] = line.split('\t');
274
+ if (file) {
275
+ changedFiles.push({
276
+ file,
277
+ insertions: parseInt(added ?? '0', 10) || 0,
278
+ deletions: parseInt(removed ?? '0', 10) || 0,
279
+ });
280
+ }
281
+ }
282
+ // Map changed files to changed SYMBOLS
283
+ const changedSymbols = [];
284
+ const impactedCallers = [];
285
+ const seenCallers = new Set();
286
+ for (const cf of changedFiles) {
287
+ // Look up symbols in this file from our index
288
+ const fileNodes = graph.getFileStructure(cf.file);
289
+ if (fileNodes.length === 0) {
290
+ // Try with absolute path
291
+ const absPath = resolve(config.projectRoot, cf.file);
292
+ const nodes2 = graph.getFileStructure(absPath);
293
+ if (nodes2.length === 0)
294
+ continue;
295
+ }
296
+ const symbols = fileNodes.filter(n => n.type !== 'file');
297
+ for (const sym of symbols) {
298
+ changedSymbols.push({
299
+ name: sym.name,
300
+ qualifiedName: sym.qualifiedName,
301
+ type: sym.type,
302
+ file: cf.file,
303
+ line: sym.startLine,
304
+ changeType: 'in_modified_file',
305
+ });
306
+ // Find callers of changed symbols
307
+ const callers = graph.findCallers(sym.id);
308
+ for (const caller of callers) {
309
+ const callerRel = relative(config.projectRoot, caller.filePath);
310
+ const key = `${caller.name}@${callerRel}`;
311
+ if (!seenCallers.has(key)) {
312
+ seenCallers.add(key);
313
+ impactedCallers.push({
314
+ name: caller.name,
315
+ file: callerRel,
316
+ line: caller.startLine,
317
+ reason: `calls ${sym.name} (changed in ${cf.file})`,
318
+ });
319
+ }
320
+ }
321
+ }
322
+ }
323
+ // Get commit messages for context
324
+ let recentCommits = [];
325
+ if (scope !== 'uncommitted' && scope !== 'staged') {
326
+ const n = scope === 'last_commit' ? 1 : scope === 'last_3_commits' ? 3 : 5;
327
+ const logCmd = `git log -${n} --format="%h %an: %s" --no-merges`;
328
+ const log = gitExec(logCmd, config.projectRoot);
329
+ if (log) {
330
+ recentCommits = log.split('\n').filter(Boolean);
331
+ }
332
+ }
333
+ const result = {
334
+ scope,
335
+ description: descr,
336
+ changedFiles: changedFiles.slice(0, 50),
337
+ totalFilesChanged: changedFiles.length,
338
+ totalInsertions: changedFiles.reduce((s, f) => s + f.insertions, 0),
339
+ totalDeletions: changedFiles.reduce((s, f) => s + f.deletions, 0),
340
+ changedSymbols: changedSymbols.slice(0, 50),
341
+ totalChangedSymbols: changedSymbols.length,
342
+ impactedCallers: impactedCallers.slice(0, 30),
343
+ totalImpactedCallers: impactedCallers.length,
344
+ recentCommits: recentCommits.length > 0 ? recentCommits : undefined,
345
+ riskLevel: impactedCallers.length > 20 ? 'high'
346
+ : impactedCallers.length > 5 ? 'medium'
347
+ : 'low',
348
+ };
349
+ return mcpText(ok(result, estimator));
350
+ }
351
+ catch (err) {
352
+ const msg = err instanceof Error ? err.message : String(err);
353
+ return mcpText(fail(`git_changes failed: ${msg}`));
354
+ }
355
+ });
356
+ // ── mindmap_smart_search ─────────────────────────────────────
357
+ server.tool('mindmap_smart_search', 'Rich contextual search that returns EVERYTHING about each result so you ' +
358
+ 'NEVER need to read the file afterwards. Each result includes: signature, ' +
359
+ 'doc comment, callers, callees, layer classification, and file context. ' +
360
+ 'This replaces: search → get_signature → trace_dependencies → read file.', {
361
+ query: z.string().describe('Search query (name, keyword, or free text)'),
362
+ limit: z.number().int().min(1).max(20).default(5).describe('Max results (default 5, keep small for rich data)'),
363
+ include: z.array(z.enum([
364
+ 'signature', // function signature (always included)
365
+ 'doc', // doc comment
366
+ 'callers', // who calls this
367
+ 'callees', // what this calls
368
+ 'layer', // architecture layer + confidence
369
+ 'code', // actual source code lines
370
+ 'git', // git history
371
+ ])).default(['signature', 'doc', 'callers', 'layer']).describe('What to include in each result'),
372
+ }, async ({ query, limit, include }) => {
373
+ try {
374
+ const searchResults = graph.search(query, limit);
375
+ if (searchResults.length === 0) {
376
+ return mcpText(ok({
377
+ query,
378
+ results: [],
379
+ totalResults: 0,
380
+ message: 'No results found. Try a broader query.',
381
+ }, estimator));
382
+ }
383
+ const flowAnalyzer = new FlowAnalyzer(graph, config.projectRoot);
384
+ let totalTokensSaved = 0;
385
+ const results = searchResults.map(node => {
386
+ const relPath = relative(config.projectRoot, node.filePath);
387
+ // Base result — always included
388
+ const result = {
389
+ name: node.name,
390
+ qualifiedName: node.qualifiedName,
391
+ type: node.type,
392
+ file: relPath,
393
+ line: node.startLine,
394
+ endLine: node.endLine,
395
+ signature: node.signature,
396
+ visibility: node.visibility,
397
+ isExported: node.isExported,
398
+ };
399
+ // Optional: doc comment
400
+ if (include.includes('doc') && node.docComment) {
401
+ result.docComment = node.docComment;
402
+ }
403
+ // Optional: callers
404
+ if (include.includes('callers')) {
405
+ const callers = graph.findCallers(node.id);
406
+ result.callers = callers.slice(0, 8).map(c => ({
407
+ name: c.name,
408
+ file: relative(config.projectRoot, c.filePath),
409
+ line: c.startLine,
410
+ }));
411
+ result.callerCount = callers.length;
412
+ }
413
+ // Optional: callees
414
+ if (include.includes('callees')) {
415
+ const callees = graph.findCallees(node.id);
416
+ result.callees = callees.slice(0, 8).map(c => ({
417
+ name: c.name,
418
+ file: relative(config.projectRoot, c.filePath),
419
+ line: c.startLine,
420
+ }));
421
+ result.calleeCount = callees.length;
422
+ }
423
+ // Optional: layer classification
424
+ if (include.includes('layer')) {
425
+ try {
426
+ const absPath = resolve(config.projectRoot, node.filePath);
427
+ const cls = flowAnalyzer.getFileClassification(absPath);
428
+ result.layer = cls.layer;
429
+ result.layerConfidence = cls.confidence;
430
+ }
431
+ catch {
432
+ result.layer = 'unknown';
433
+ }
434
+ }
435
+ // Optional: source code
436
+ if (include.includes('code')) {
437
+ try {
438
+ const absPath = resolve(config.projectRoot, node.filePath);
439
+ const content = readFileSync(absPath, 'utf-8');
440
+ const lines = content.split('\n');
441
+ const start = Math.max(0, node.startLine - 1);
442
+ const end = Math.min(lines.length, node.endLine + 1);
443
+ const codeLines = lines.slice(start, end);
444
+ result.code = codeLines.map((l, i) => `${start + i + 1}: ${l}`).join('\n');
445
+ totalTokensSaved += estimator.estimate(content) - estimator.estimate(result.code);
446
+ }
447
+ catch {
448
+ // Can't read file
449
+ }
450
+ }
451
+ // Optional: git info
452
+ if (include.includes('git')) {
453
+ const absPath = resolve(config.projectRoot, node.filePath);
454
+ const lastLog = gitExec(`git log -1 --format="%ar by %an: %s" -- "${absPath}"`, config.projectRoot);
455
+ if (lastLog) {
456
+ result.gitLastChange = lastLog;
457
+ }
458
+ }
459
+ // Parameters and return type if available
460
+ if (node.parameters && node.parameters.length > 0) {
461
+ result.parameters = node.parameters;
462
+ }
463
+ if (node.returnType) {
464
+ result.returnType = node.returnType;
465
+ }
466
+ return result;
467
+ });
468
+ const response = {
469
+ query,
470
+ results,
471
+ totalResults: results.length,
472
+ includes: include,
473
+ };
474
+ return mcpText(okWithSavings(response, Math.max(0, totalTokensSaved), estimator));
475
+ }
476
+ catch (err) {
477
+ const msg = err instanceof Error ? err.message : String(err);
478
+ return mcpText(fail(`smart_search failed: ${msg}`));
479
+ }
480
+ });
481
+ }
482
+ //# sourceMappingURL=smart-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-tools.js","sourceRoot":"","sources":["../../src/tools/smart-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * AI Mind Map — Snapshot & Delta MCP Tools
3
+ *
4
+ * The most important tools in the entire system for token savings.
5
+ * These replace the need to read the full codebase at session start.
6
+ *
7
+ * mindmap_project_map → THE map. One call = entire project understood.
8
+ * mindmap_change_delta → Only what changed since last time.
9
+ * mindmap_session_start → Everything combined: map + delta + memories.
10
+ */
11
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ import type { MindMapConfig } from '../types.js';
13
+ import { KnowledgeGraph } from '../knowledge-graph/graph.js';
14
+ interface ITokenEstimator {
15
+ estimate(text: string): number;
16
+ }
17
+ export declare function registerSnapshotTools(server: McpServer, graph: KnowledgeGraph, config: MindMapConfig, estimator?: ITokenEstimator): void;
18
+ export {};
19
+ //# sourceMappingURL=snapshot-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-tools.d.ts","sourceRoot":"","sources":["../../src/tools/snapshot-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAO7D,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA0BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CA4GN"}