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.
- package/LICENSE +21 -0
- package/README.md +554 -0
- package/dist/change-tracker/change-log.d.ts +160 -0
- package/dist/change-tracker/change-log.d.ts.map +1 -0
- package/dist/change-tracker/change-log.js +507 -0
- package/dist/change-tracker/change-log.js.map +1 -0
- package/dist/change-tracker/diff-engine.d.ts +149 -0
- package/dist/change-tracker/diff-engine.d.ts.map +1 -0
- package/dist/change-tracker/diff-engine.js +530 -0
- package/dist/change-tracker/diff-engine.js.map +1 -0
- package/dist/change-tracker/watcher.d.ts +137 -0
- package/dist/change-tracker/watcher.d.ts.map +1 -0
- package/dist/change-tracker/watcher.js +300 -0
- package/dist/change-tracker/watcher.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +937 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compressor.d.ts +49 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +769 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/progressive-disclosure.d.ts +71 -0
- package/dist/context/progressive-disclosure.d.ts.map +1 -0
- package/dist/context/progressive-disclosure.js +470 -0
- package/dist/context/progressive-disclosure.js.map +1 -0
- package/dist/context/token-budget.d.ts +121 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +282 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +66 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +946 -0
- package/dist/install.js.map +1 -0
- package/dist/knowledge-graph/architecture.d.ts +213 -0
- package/dist/knowledge-graph/architecture.d.ts.map +1 -0
- package/dist/knowledge-graph/architecture.js +585 -0
- package/dist/knowledge-graph/architecture.js.map +1 -0
- package/dist/knowledge-graph/cypher.d.ts +113 -0
- package/dist/knowledge-graph/cypher.d.ts.map +1 -0
- package/dist/knowledge-graph/cypher.js +1051 -0
- package/dist/knowledge-graph/cypher.js.map +1 -0
- package/dist/knowledge-graph/dead-code.d.ts +121 -0
- package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
- package/dist/knowledge-graph/dead-code.js +331 -0
- package/dist/knowledge-graph/dead-code.js.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.js +739 -0
- package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +291 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/knowledge-graph/graph.js +978 -0
- package/dist/knowledge-graph/graph.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +17 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +14 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/indexer.d.ts +112 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -0
- package/dist/knowledge-graph/indexer.js +506 -0
- package/dist/knowledge-graph/indexer.js.map +1 -0
- package/dist/knowledge-graph/pagerank.d.ts +141 -0
- package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
- package/dist/knowledge-graph/pagerank.js +493 -0
- package/dist/knowledge-graph/pagerank.js.map +1 -0
- package/dist/knowledge-graph/parser.d.ts +55 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -0
- package/dist/knowledge-graph/parser.js +1090 -0
- package/dist/knowledge-graph/parser.js.map +1 -0
- package/dist/knowledge-graph/snapshot.d.ts +107 -0
- package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
- package/dist/knowledge-graph/snapshot.js +435 -0
- package/dist/knowledge-graph/snapshot.js.map +1 -0
- package/dist/memory/decision-log.d.ts +151 -0
- package/dist/memory/decision-log.d.ts.map +1 -0
- package/dist/memory/decision-log.js +482 -0
- package/dist/memory/decision-log.js.map +1 -0
- package/dist/memory/persistent-memory.d.ts +182 -0
- package/dist/memory/persistent-memory.d.ts.map +1 -0
- package/dist/memory/persistent-memory.js +579 -0
- package/dist/memory/persistent-memory.js.map +1 -0
- package/dist/memory/session-memory.d.ts +165 -0
- package/dist/memory/session-memory.d.ts.map +1 -0
- package/dist/memory/session-memory.js +382 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/stress-test.d.ts +10 -0
- package/dist/stress-test.d.ts.map +1 -0
- package/dist/stress-test.js +258 -0
- package/dist/stress-test.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +32 -0
- package/dist/tools/advanced-tools.d.ts.map +1 -0
- package/dist/tools/advanced-tools.js +480 -0
- package/dist/tools/advanced-tools.js.map +1 -0
- package/dist/tools/change-tools.d.ts +76 -0
- package/dist/tools/change-tools.d.ts.map +1 -0
- package/dist/tools/change-tools.js +93 -0
- package/dist/tools/change-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +68 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +141 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/debug-tools.d.ts +25 -0
- package/dist/tools/debug-tools.d.ts.map +1 -0
- package/dist/tools/debug-tools.js +286 -0
- package/dist/tools/debug-tools.js.map +1 -0
- package/dist/tools/evolving-tools.d.ts +23 -0
- package/dist/tools/evolving-tools.d.ts.map +1 -0
- package/dist/tools/evolving-tools.js +207 -0
- package/dist/tools/evolving-tools.js.map +1 -0
- package/dist/tools/flow-tools.d.ts +24 -0
- package/dist/tools/flow-tools.d.ts.map +1 -0
- package/dist/tools/flow-tools.js +265 -0
- package/dist/tools/flow-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +71 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +165 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +195 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +23 -0
- package/dist/tools/smart-tools.d.ts.map +1 -0
- package/dist/tools/smart-tools.js +482 -0
- package/dist/tools/smart-tools.js.map +1 -0
- package/dist/tools/snapshot-tools.d.ts +19 -0
- package/dist/tools/snapshot-tools.d.ts.map +1 -0
- package/dist/tools/snapshot-tools.js +149 -0
- package/dist/tools/snapshot-tools.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +142 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +51 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +181 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/install.ps1 +321 -0
- package/install.sh +345 -0
- package/package.json +94 -0
- package/setup.bat +62 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Change Tracking MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers all change-tracking-related tools on the MCP server.
|
|
5
|
+
* Each tool returns structured JSON wrapped in the standard MCP
|
|
6
|
+
* text-content envelope.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
const defaultEstimator = {
|
|
10
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
11
|
+
};
|
|
12
|
+
// ============================================================
|
|
13
|
+
// Helpers
|
|
14
|
+
// ============================================================
|
|
15
|
+
function mcpText(result) {
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function ok(data, estimator) {
|
|
21
|
+
const serialised = JSON.stringify(data);
|
|
22
|
+
const tokens = estimator.estimate(serialised);
|
|
23
|
+
return { success: true, data, tokenCount: tokens, tokensSaved: 0 };
|
|
24
|
+
}
|
|
25
|
+
function fail(message) {
|
|
26
|
+
return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
|
|
27
|
+
}
|
|
28
|
+
// ============================================================
|
|
29
|
+
// Registration
|
|
30
|
+
// ============================================================
|
|
31
|
+
/**
|
|
32
|
+
* Register all Change Tracking tools on the given MCP server.
|
|
33
|
+
*
|
|
34
|
+
* @param server The MCP server instance.
|
|
35
|
+
* @param tracker Concrete change-tracker implementation.
|
|
36
|
+
* @param estimator Optional token estimator.
|
|
37
|
+
*/
|
|
38
|
+
export function registerChangeTools(server, tracker, estimator = defaultEstimator) {
|
|
39
|
+
// ── mindmap_what_changed ────────────────────────────────────
|
|
40
|
+
server.tool('mindmap_what_changed', 'Get a summary of recent codebase changes. Useful for understanding what happened while the AI was away.', {
|
|
41
|
+
since: z
|
|
42
|
+
.union([
|
|
43
|
+
z.enum(['last_session', 'today', 'this_week']),
|
|
44
|
+
z.string().datetime({ message: 'Must be an ISO-8601 timestamp' }),
|
|
45
|
+
])
|
|
46
|
+
.default('last_session')
|
|
47
|
+
.describe("Time reference: 'last_session', 'today', 'this_week', or an ISO-8601 timestamp"),
|
|
48
|
+
}, async ({ since }) => {
|
|
49
|
+
try {
|
|
50
|
+
const result = tracker.getChanges(since);
|
|
51
|
+
return mcpText(ok(result, estimator));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
+
return mcpText(fail(`what_changed failed: ${msg}`));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ── mindmap_session_diff ────────────────────────────────────
|
|
59
|
+
server.tool('mindmap_session_diff', `Get what changed since the last AI session ended. Returns a diff summary with affected symbols.`, {}, async () => {
|
|
60
|
+
try {
|
|
61
|
+
const result = tracker.getSessionDiff();
|
|
62
|
+
return mcpText(ok(result, estimator));
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
66
|
+
return mcpText(fail(`session_diff failed: ${msg}`));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// ── mindmap_impact_analysis ─────────────────────────────────
|
|
70
|
+
server.tool('mindmap_impact_analysis', 'Analyse the blast radius of changes to a file or symbol — what else is affected.', {
|
|
71
|
+
filePath: z
|
|
72
|
+
.string()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe('File path to analyse (provide filePath or symbolName, or both)'),
|
|
75
|
+
symbolName: z
|
|
76
|
+
.string()
|
|
77
|
+
.optional()
|
|
78
|
+
.describe('Symbol name to analyse (provide filePath or symbolName, or both)'),
|
|
79
|
+
}, async ({ filePath, symbolName }) => {
|
|
80
|
+
if (!filePath && !symbolName) {
|
|
81
|
+
return mcpText(fail('At least one of filePath or symbolName must be provided'));
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const result = tracker.analyseImpact({ filePath, symbolName });
|
|
85
|
+
return mcpText(ok(result, estimator));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
89
|
+
return mcpText(fail(`impact_analysis failed: ${msg}`));
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=change-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-tools.js","sourceRoot":"","sources":["../../src/tools/change-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Context Management MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers context-engine tools on the MCP server: smart context
|
|
5
|
+
* loading, content compression, re-indexing, and system status.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { ContextPackage, CompressionLevel, ContentType, MindMapStats } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Minimal interface expected of the Context Engine subsystem.
|
|
11
|
+
*/
|
|
12
|
+
export interface IContextEngine {
|
|
13
|
+
/**
|
|
14
|
+
* Build a smart context package for the given task description.
|
|
15
|
+
* Optionally includes relevant memories and recent changes.
|
|
16
|
+
*/
|
|
17
|
+
getContext(params: {
|
|
18
|
+
taskDescription: string;
|
|
19
|
+
includeMemories: boolean;
|
|
20
|
+
includeChanges: boolean;
|
|
21
|
+
}): ContextPackage;
|
|
22
|
+
/**
|
|
23
|
+
* Compress content to reduce token usage.
|
|
24
|
+
*
|
|
25
|
+
* @returns compressed text and statistics.
|
|
26
|
+
*/
|
|
27
|
+
compress(params: {
|
|
28
|
+
content: string;
|
|
29
|
+
contentType?: ContentType;
|
|
30
|
+
level: CompressionLevel;
|
|
31
|
+
}): {
|
|
32
|
+
original: string;
|
|
33
|
+
compressed: string;
|
|
34
|
+
originalTokens: number;
|
|
35
|
+
compressedTokens: number;
|
|
36
|
+
ratio: number;
|
|
37
|
+
contentType: ContentType;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Minimal interface for the Indexer subsystem.
|
|
42
|
+
*/
|
|
43
|
+
export interface IIndexer {
|
|
44
|
+
/** Force a full re-index of the codebase. Returns stats on completion. */
|
|
45
|
+
reindex(): Promise<{
|
|
46
|
+
filesScanned: number;
|
|
47
|
+
filesIndexed: number;
|
|
48
|
+
nodesCreated: number;
|
|
49
|
+
edgesCreated: number;
|
|
50
|
+
durationMs: number;
|
|
51
|
+
errors: string[];
|
|
52
|
+
}>;
|
|
53
|
+
/** Get current system statistics. */
|
|
54
|
+
getStats(): MindMapStats;
|
|
55
|
+
}
|
|
56
|
+
export interface ITokenEstimator {
|
|
57
|
+
estimate(text: string): number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Register all Context Management tools on the given MCP server.
|
|
61
|
+
*
|
|
62
|
+
* @param server The MCP server instance.
|
|
63
|
+
* @param context Concrete context-engine implementation.
|
|
64
|
+
* @param indexer Concrete indexer implementation.
|
|
65
|
+
* @param estimator Optional token estimator.
|
|
66
|
+
*/
|
|
67
|
+
export declare function registerContextTools(server: McpServer, context: IContextEngine, indexer: IIndexer, estimator?: ITokenEstimator): void;
|
|
68
|
+
//# sourceMappingURL=context-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tools.d.ts","sourceRoot":"","sources":["../../src/tools/context-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;KACzB,GAAG,cAAc,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,KAAK,EAAE,gBAAgB,CAAC;KACzB,GAAG;QACF,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,OAAO,IAAI,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IAEH,qCAAqC;IACrC,QAAQ,IAAI,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA8DD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,QAAQ,EACjB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CAyGN"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Context Management MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers context-engine tools on the MCP server: smart context
|
|
5
|
+
* loading, content compression, re-indexing, and system status.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const defaultEstimator = {
|
|
9
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
10
|
+
};
|
|
11
|
+
// ============================================================
|
|
12
|
+
// Content-type enum for Zod
|
|
13
|
+
// ============================================================
|
|
14
|
+
const CONTENT_TYPES = [
|
|
15
|
+
'source_code',
|
|
16
|
+
'build_log',
|
|
17
|
+
'test_output',
|
|
18
|
+
'stack_trace',
|
|
19
|
+
'json_data',
|
|
20
|
+
'markdown',
|
|
21
|
+
'plain_text',
|
|
22
|
+
'diff',
|
|
23
|
+
'config_file',
|
|
24
|
+
];
|
|
25
|
+
const COMPRESSION_LEVELS = [
|
|
26
|
+
'minimal',
|
|
27
|
+
'moderate',
|
|
28
|
+
'aggressive',
|
|
29
|
+
];
|
|
30
|
+
// ============================================================
|
|
31
|
+
// Helpers
|
|
32
|
+
// ============================================================
|
|
33
|
+
function mcpText(result) {
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function ok(data, estimator) {
|
|
39
|
+
const serialised = JSON.stringify(data);
|
|
40
|
+
const tokens = estimator.estimate(serialised);
|
|
41
|
+
return { success: true, data, tokenCount: tokens, tokensSaved: 0 };
|
|
42
|
+
}
|
|
43
|
+
function okWithSavings(data, tokensSaved, estimator) {
|
|
44
|
+
const serialised = JSON.stringify(data);
|
|
45
|
+
const tokens = estimator.estimate(serialised);
|
|
46
|
+
return { success: true, data, tokenCount: tokens, tokensSaved };
|
|
47
|
+
}
|
|
48
|
+
function fail(message) {
|
|
49
|
+
return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
|
|
50
|
+
}
|
|
51
|
+
// ============================================================
|
|
52
|
+
// Registration
|
|
53
|
+
// ============================================================
|
|
54
|
+
/**
|
|
55
|
+
* Register all Context Management tools on the given MCP server.
|
|
56
|
+
*
|
|
57
|
+
* @param server The MCP server instance.
|
|
58
|
+
* @param context Concrete context-engine implementation.
|
|
59
|
+
* @param indexer Concrete indexer implementation.
|
|
60
|
+
* @param estimator Optional token estimator.
|
|
61
|
+
*/
|
|
62
|
+
export function registerContextTools(server, context, indexer, estimator = defaultEstimator) {
|
|
63
|
+
// ── mindmap_get_context ─────────────────────────────────────
|
|
64
|
+
server.tool('mindmap_get_context', 'Smart context loading for the current task. Returns a tiered ContextPackage with project summary, relevant graph results, memories, and changes.', {
|
|
65
|
+
taskDescription: z
|
|
66
|
+
.string()
|
|
67
|
+
.min(1)
|
|
68
|
+
.describe('Describe the task you are working on'),
|
|
69
|
+
includeMemories: z
|
|
70
|
+
.boolean()
|
|
71
|
+
.default(true)
|
|
72
|
+
.describe('Include relevant stored memories'),
|
|
73
|
+
includeChanges: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.default(true)
|
|
76
|
+
.describe('Include recent change summaries'),
|
|
77
|
+
}, async ({ taskDescription, includeMemories, includeChanges }) => {
|
|
78
|
+
try {
|
|
79
|
+
const pkg = context.getContext({
|
|
80
|
+
taskDescription,
|
|
81
|
+
includeMemories,
|
|
82
|
+
includeChanges,
|
|
83
|
+
});
|
|
84
|
+
return mcpText(okWithSavings(pkg, pkg.tokensSaved, estimator));
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
88
|
+
return mcpText(fail(`get_context failed: ${msg}`));
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// ── mindmap_compress ────────────────────────────────────────
|
|
92
|
+
server.tool('mindmap_compress', 'Compress content to reduce token usage before adding to context. Auto-detects content type if not specified.', {
|
|
93
|
+
content: z.string().min(1).describe('The content to compress'),
|
|
94
|
+
contentType: z
|
|
95
|
+
.enum(CONTENT_TYPES)
|
|
96
|
+
.optional()
|
|
97
|
+
.describe('Content type (auto-detected if omitted)'),
|
|
98
|
+
level: z
|
|
99
|
+
.enum(COMPRESSION_LEVELS)
|
|
100
|
+
.default('moderate')
|
|
101
|
+
.describe('Compression level'),
|
|
102
|
+
}, async ({ content, contentType, level }) => {
|
|
103
|
+
try {
|
|
104
|
+
const result = context.compress({ content, contentType, level });
|
|
105
|
+
return mcpText(okWithSavings({
|
|
106
|
+
compressed: result.compressed,
|
|
107
|
+
originalTokens: result.originalTokens,
|
|
108
|
+
compressedTokens: result.compressedTokens,
|
|
109
|
+
ratio: result.ratio,
|
|
110
|
+
contentType: result.contentType,
|
|
111
|
+
}, result.originalTokens - result.compressedTokens, estimator));
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
115
|
+
return mcpText(fail(`compress failed: ${msg}`));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// ── mindmap_reindex ─────────────────────────────────────────
|
|
119
|
+
server.tool('mindmap_reindex', 'Force a full re-index of the codebase. Returns indexing statistics when complete.', {}, async () => {
|
|
120
|
+
try {
|
|
121
|
+
const result = await indexer.reindex();
|
|
122
|
+
return mcpText(ok(result, estimator));
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
return mcpText(fail(`reindex failed: ${msg}`));
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// ── mindmap_status ──────────────────────────────────────────
|
|
130
|
+
server.tool('mindmap_status', 'Show current Mind Map index statistics, memory usage, and token savings estimate.', {}, async () => {
|
|
131
|
+
try {
|
|
132
|
+
const stats = indexer.getStats();
|
|
133
|
+
return mcpText(ok(stats, estimator));
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
+
return mcpText(fail(`status failed: ${msg}`));
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=context-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tools.js","sourceRoot":"","sources":["../../src/tools/context-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Debug & History MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Purpose-built tools for the "something broke, what changed?" scenario.
|
|
5
|
+
*
|
|
6
|
+
* These tools give the AI agent the ability to:
|
|
7
|
+
* 1. See ACTUAL code diffs (not just "47 lines added")
|
|
8
|
+
* 2. View what a file looked like BEFORE a change
|
|
9
|
+
* 3. See the commit history of a specific file
|
|
10
|
+
* 4. Get a full crash-debugging context package
|
|
11
|
+
*
|
|
12
|
+
* This is the killer feature that codebase-memory-mcp lacks entirely.
|
|
13
|
+
*/
|
|
14
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
|
+
import type { MindMapConfig } from '../types.js';
|
|
16
|
+
import { KnowledgeGraph } from '../knowledge-graph/graph.js';
|
|
17
|
+
interface ITokenEstimator {
|
|
18
|
+
estimate(text: string): number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register all debug/history tools on the MCP server.
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerDebugTools(server: McpServer, graph: KnowledgeGraph, config: MindMapConfig, estimator?: ITokenEstimator): void;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=debug-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-tools.d.ts","sourceRoot":"","sources":["../../src/tools/debug-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA0BD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CA4ON"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Debug & History MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Purpose-built tools for the "something broke, what changed?" scenario.
|
|
5
|
+
*
|
|
6
|
+
* These tools give the AI agent the ability to:
|
|
7
|
+
* 1. See ACTUAL code diffs (not just "47 lines added")
|
|
8
|
+
* 2. View what a file looked like BEFORE a change
|
|
9
|
+
* 3. See the commit history of a specific file
|
|
10
|
+
* 4. Get a full crash-debugging context package
|
|
11
|
+
*
|
|
12
|
+
* This is the killer feature that codebase-memory-mcp lacks entirely.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { relative } from 'node:path';
|
|
17
|
+
import { DiffEngine } from '../change-tracker/diff-engine.js';
|
|
18
|
+
const defaultEstimator = {
|
|
19
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
20
|
+
};
|
|
21
|
+
function mcpText(result) {
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function ok(data, estimator, saved = 0) {
|
|
27
|
+
const serialised = JSON.stringify(data);
|
|
28
|
+
const tokens = estimator.estimate(serialised);
|
|
29
|
+
return { success: true, data, tokenCount: tokens, tokensSaved: saved };
|
|
30
|
+
}
|
|
31
|
+
function fail(message) {
|
|
32
|
+
return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
|
|
33
|
+
}
|
|
34
|
+
// ============================================================
|
|
35
|
+
// Registration
|
|
36
|
+
// ============================================================
|
|
37
|
+
/**
|
|
38
|
+
* Register all debug/history tools on the MCP server.
|
|
39
|
+
*/
|
|
40
|
+
export function registerDebugTools(server, graph, config, estimator = defaultEstimator) {
|
|
41
|
+
const diffEngine = new DiffEngine(config.projectRoot);
|
|
42
|
+
// ── mindmap_debug_changes ─────────────────────────────────
|
|
43
|
+
// THE crash debugging tool. When user says "X is broken, what happened?"
|
|
44
|
+
// this gives the AI everything it needs to diagnose the issue.
|
|
45
|
+
server.tool('mindmap_debug_changes', `🔍 CRASH DEBUGGER: When something broke, use this tool FIRST.
|
|
46
|
+
Returns: actual git diffs (real code changes, not just counts),
|
|
47
|
+
list of recently changed files, affected function signatures,
|
|
48
|
+
and blast radius analysis. This is the most powerful debugging tool available.
|
|
49
|
+
Use when: user reports a crash, bug, or unexpected behavior.`, {
|
|
50
|
+
filePath: z
|
|
51
|
+
.string()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Specific file to investigate (e.g. "src/notes.ts"). If omitted, shows ALL recent changes.'),
|
|
54
|
+
since: z
|
|
55
|
+
.union([
|
|
56
|
+
z.enum(['last_session', 'today', 'this_week', '1h', '3h', '6h', '12h', '24h']),
|
|
57
|
+
z.string().datetime({ message: 'Must be an ISO-8601 timestamp' }),
|
|
58
|
+
])
|
|
59
|
+
.default('last_session')
|
|
60
|
+
.describe('How far back to look: "last_session", "today", "1h", "3h", "6h", "12h", "24h", "this_week", or ISO timestamp'),
|
|
61
|
+
maxDiffLines: z
|
|
62
|
+
.number()
|
|
63
|
+
.int()
|
|
64
|
+
.min(50)
|
|
65
|
+
.max(2000)
|
|
66
|
+
.default(300)
|
|
67
|
+
.describe('Max lines of diff output to return (default 300, max 2000)'),
|
|
68
|
+
}, async ({ filePath, since, maxDiffLines }) => {
|
|
69
|
+
try {
|
|
70
|
+
// Resolve "since" to a timestamp
|
|
71
|
+
const sinceTimestamp = resolveTimestamp(since);
|
|
72
|
+
// 1. Get the ACTUAL diff (code changes, not just counts)
|
|
73
|
+
const actualDiff = await diffEngine.getActualDiff(sinceTimestamp, {
|
|
74
|
+
filePath,
|
|
75
|
+
maxLines: maxDiffLines,
|
|
76
|
+
});
|
|
77
|
+
// 2. Get structured change summary
|
|
78
|
+
const changeSummary = await diffEngine.getChangesSinceTimestamp(sinceTimestamp, 'debug-session');
|
|
79
|
+
// 3. For each changed file, find what symbols were affected
|
|
80
|
+
const affectedSymbols = [];
|
|
81
|
+
for (const change of changeSummary.changes) {
|
|
82
|
+
const nodes = graph.getFileStructure(change.filePath);
|
|
83
|
+
const functions = nodes
|
|
84
|
+
.filter((n) => n.type === 'function' || n.type === 'method')
|
|
85
|
+
.map((n) => `${n.name}(${(n.parameters ?? []).map((p) => p.name).join(', ')})`);
|
|
86
|
+
const classes = nodes
|
|
87
|
+
.filter((n) => n.type === 'class')
|
|
88
|
+
.map((n) => n.name);
|
|
89
|
+
if (functions.length > 0 || classes.length > 0) {
|
|
90
|
+
affectedSymbols.push({
|
|
91
|
+
file: change.filePath,
|
|
92
|
+
functions,
|
|
93
|
+
classes,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 4. For the target file (if specified), get blast radius
|
|
98
|
+
let blastRadius = null;
|
|
99
|
+
if (filePath) {
|
|
100
|
+
const fileNodes = graph.getFileStructure(filePath);
|
|
101
|
+
const dependents = [];
|
|
102
|
+
for (const node of fileNodes) {
|
|
103
|
+
const callers = graph.findCallers(node.id);
|
|
104
|
+
for (const caller of callers) {
|
|
105
|
+
if (caller.filePath !== filePath) {
|
|
106
|
+
dependents.push(`${caller.name} (${relative(config.projectRoot, caller.filePath)})`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
blastRadius = {
|
|
111
|
+
file: filePath,
|
|
112
|
+
symbolsInFile: fileNodes.length,
|
|
113
|
+
externalDependents: [...new Set(dependents)],
|
|
114
|
+
riskLevel: dependents.length > 10 ? 'high' : dependents.length > 3 ? 'medium' : 'low',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const result = {
|
|
118
|
+
title: filePath
|
|
119
|
+
? `🔍 Debug Report: ${filePath}`
|
|
120
|
+
: `🔍 Debug Report: All changes since ${since}`,
|
|
121
|
+
summary: {
|
|
122
|
+
filesChanged: changeSummary.filesAffected,
|
|
123
|
+
totalLinesAdded: changeSummary.totalLinesAdded,
|
|
124
|
+
totalLinesRemoved: changeSummary.totalLinesRemoved,
|
|
125
|
+
changedFiles: actualDiff.files,
|
|
126
|
+
},
|
|
127
|
+
actualDiff: {
|
|
128
|
+
content: actualDiff.diff,
|
|
129
|
+
truncated: actualDiff.truncated,
|
|
130
|
+
note: 'This is the ACTUAL git diff showing exactly what code changed.',
|
|
131
|
+
},
|
|
132
|
+
affectedSymbols,
|
|
133
|
+
blastRadius,
|
|
134
|
+
debugTip: filePath
|
|
135
|
+
? `Check the diff above for the exact changes to ${filePath}. Look for: missing null checks, changed function signatures, removed error handlers, new parameters not passed by callers.`
|
|
136
|
+
: `${actualDiff.files.length} files changed. Focus on the ones related to the reported issue. Use mindmap_debug_changes with a specific filePath to drill down.`,
|
|
137
|
+
};
|
|
138
|
+
return mcpText(ok(result, estimator));
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
return mcpText(fail(`debug_changes failed: ${msg}`));
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
// ── mindmap_file_before ───────────────────────────────────
|
|
146
|
+
// Show what a file looked like BEFORE the recent changes.
|
|
147
|
+
server.tool('mindmap_file_before', `Show what a file looked like BEFORE recent changes (git show).
|
|
148
|
+
Use when you need to compare current code with the previous version
|
|
149
|
+
to find what broke. Returns the full file content at a past revision.`, {
|
|
150
|
+
filePath: z
|
|
151
|
+
.string()
|
|
152
|
+
.describe('File path relative to project root (e.g. "src/notes.ts")'),
|
|
153
|
+
revision: z
|
|
154
|
+
.string()
|
|
155
|
+
.default('HEAD~1')
|
|
156
|
+
.describe('Git revision to show (default: HEAD~1 = last commit). Can be: HEAD~2, a commit hash, a branch name, a tag'),
|
|
157
|
+
}, async ({ filePath, revision }) => {
|
|
158
|
+
try {
|
|
159
|
+
const result = await diffEngine.getFileAtRevision(filePath, revision);
|
|
160
|
+
if (!result.found) {
|
|
161
|
+
return mcpText(fail(result.content));
|
|
162
|
+
}
|
|
163
|
+
// Also get current content for comparison
|
|
164
|
+
let currentContent = '';
|
|
165
|
+
try {
|
|
166
|
+
const fullPath = `${config.projectRoot}/${filePath}`;
|
|
167
|
+
currentContent = readFileSync(fullPath, 'utf-8');
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
currentContent = '[file not found on disk — may have been deleted]';
|
|
171
|
+
}
|
|
172
|
+
const currentLines = currentContent.split('\n').length;
|
|
173
|
+
const oldLines = result.content.split('\n').length;
|
|
174
|
+
const tokensSaved = estimator.estimate(currentContent) - estimator.estimate(result.content);
|
|
175
|
+
return mcpText(ok({
|
|
176
|
+
filePath,
|
|
177
|
+
revision: result.revision,
|
|
178
|
+
previousContent: result.content,
|
|
179
|
+
stats: {
|
|
180
|
+
previousLines: oldLines,
|
|
181
|
+
currentLines,
|
|
182
|
+
lineDelta: currentLines - oldLines,
|
|
183
|
+
},
|
|
184
|
+
hint: 'Compare this previous version with the current file to find what changed and what might have broken.',
|
|
185
|
+
}, estimator, Math.abs(tokensSaved)));
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
189
|
+
return mcpText(fail(`file_before failed: ${msg}`));
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
// ── mindmap_file_history ──────────────────────────────────
|
|
193
|
+
// Show the commit history for a specific file.
|
|
194
|
+
server.tool('mindmap_file_history', `Show the git commit history for a specific file — who changed it, when, and why.
|
|
195
|
+
Use when debugging to understand the timeline of changes to a file.`, {
|
|
196
|
+
filePath: z
|
|
197
|
+
.string()
|
|
198
|
+
.describe('File path relative to project root (e.g. "src/notes.ts")'),
|
|
199
|
+
maxCommits: z
|
|
200
|
+
.number()
|
|
201
|
+
.int()
|
|
202
|
+
.min(1)
|
|
203
|
+
.max(50)
|
|
204
|
+
.default(10)
|
|
205
|
+
.describe('Max number of commits to show (default 10)'),
|
|
206
|
+
}, async ({ filePath, maxCommits }) => {
|
|
207
|
+
try {
|
|
208
|
+
const history = await diffEngine.getFileHistory(filePath, maxCommits);
|
|
209
|
+
if (history.length === 0) {
|
|
210
|
+
return mcpText(fail(`No git history found for "${filePath}" — file may not be tracked or project is not a git repo.`));
|
|
211
|
+
}
|
|
212
|
+
// For the most recent commit, get the actual diff
|
|
213
|
+
const mostRecentDiff = await diffEngine.getActualDiff(new Date(history[0].date).getTime() - 1000, // 1s before the commit
|
|
214
|
+
{ filePath, maxLines: 100 });
|
|
215
|
+
return mcpText(ok({
|
|
216
|
+
filePath,
|
|
217
|
+
totalCommits: history.length,
|
|
218
|
+
history: history.map((h, i) => ({
|
|
219
|
+
...h,
|
|
220
|
+
isLatest: i === 0,
|
|
221
|
+
relativeTime: humanTimeDelta(new Date(h.date).getTime()),
|
|
222
|
+
})),
|
|
223
|
+
latestCommitDiff: mostRecentDiff.diff.length > 10
|
|
224
|
+
? mostRecentDiff.diff
|
|
225
|
+
: 'No diff available for latest commit.',
|
|
226
|
+
tip: `The most recent change was: "${history[0].message}" (${humanTimeDelta(new Date(history[0].date).getTime())} ago). Use mindmap_file_before to see the full file at any revision.`,
|
|
227
|
+
}, estimator));
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
231
|
+
return mcpText(fail(`file_history failed: ${msg}`));
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
// ============================================================
|
|
236
|
+
// Utilities
|
|
237
|
+
// ============================================================
|
|
238
|
+
/** Resolve a "since" reference to an epoch timestamp in ms. */
|
|
239
|
+
function resolveTimestamp(since) {
|
|
240
|
+
const now = Date.now();
|
|
241
|
+
switch (since) {
|
|
242
|
+
case 'last_session':
|
|
243
|
+
// Default to 4 hours ago if no session info
|
|
244
|
+
return now - 4 * 60 * 60 * 1000;
|
|
245
|
+
case 'today': {
|
|
246
|
+
const today = new Date();
|
|
247
|
+
today.setHours(0, 0, 0, 0);
|
|
248
|
+
return today.getTime();
|
|
249
|
+
}
|
|
250
|
+
case 'this_week': {
|
|
251
|
+
const week = new Date();
|
|
252
|
+
week.setDate(week.getDate() - week.getDay());
|
|
253
|
+
week.setHours(0, 0, 0, 0);
|
|
254
|
+
return week.getTime();
|
|
255
|
+
}
|
|
256
|
+
case '1h':
|
|
257
|
+
return now - 1 * 60 * 60 * 1000;
|
|
258
|
+
case '3h':
|
|
259
|
+
return now - 3 * 60 * 60 * 1000;
|
|
260
|
+
case '6h':
|
|
261
|
+
return now - 6 * 60 * 60 * 1000;
|
|
262
|
+
case '12h':
|
|
263
|
+
return now - 12 * 60 * 60 * 1000;
|
|
264
|
+
case '24h':
|
|
265
|
+
return now - 24 * 60 * 60 * 1000;
|
|
266
|
+
default:
|
|
267
|
+
// ISO-8601 timestamp
|
|
268
|
+
return new Date(since).getTime();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** Convert a past timestamp into a human-friendly delta like "2h ago". */
|
|
272
|
+
function humanTimeDelta(pastMs) {
|
|
273
|
+
const delta = Date.now() - pastMs;
|
|
274
|
+
const seconds = Math.floor(delta / 1000);
|
|
275
|
+
if (seconds < 60)
|
|
276
|
+
return `${seconds}s`;
|
|
277
|
+
const minutes = Math.floor(seconds / 60);
|
|
278
|
+
if (minutes < 60)
|
|
279
|
+
return `${minutes}m`;
|
|
280
|
+
const hours = Math.floor(minutes / 60);
|
|
281
|
+
if (hours < 24)
|
|
282
|
+
return `${hours}h`;
|
|
283
|
+
const days = Math.floor(hours / 24);
|
|
284
|
+
return `${days}d`;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=debug-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-tools.js","sourceRoot":"","sources":["../../src/tools/debug-tools.ts"],"names":[],"mappings":"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"}
|