token-pilot 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/.claude-plugin/hooks/hooks.json +15 -0
  2. package/.claude-plugin/marketplace.json +15 -0
  3. package/.claude-plugin/plugin.json +9 -0
  4. package/.mcp.json +8 -0
  5. package/CHANGELOG.md +48 -0
  6. package/README.md +282 -0
  7. package/dist/ast-index/binary-manager.d.ts +15 -0
  8. package/dist/ast-index/binary-manager.d.ts.map +1 -0
  9. package/dist/ast-index/binary-manager.js +222 -0
  10. package/dist/ast-index/binary-manager.js.map +1 -0
  11. package/dist/ast-index/client.d.ts +48 -0
  12. package/dist/ast-index/client.d.ts.map +1 -0
  13. package/dist/ast-index/client.js +371 -0
  14. package/dist/ast-index/client.js.map +1 -0
  15. package/dist/ast-index/tar-extract.d.ts +6 -0
  16. package/dist/ast-index/tar-extract.d.ts.map +1 -0
  17. package/dist/ast-index/tar-extract.js +39 -0
  18. package/dist/ast-index/tar-extract.js.map +1 -0
  19. package/dist/ast-index/types.d.ts +78 -0
  20. package/dist/ast-index/types.d.ts.map +1 -0
  21. package/dist/ast-index/types.js +6 -0
  22. package/dist/ast-index/types.js.map +1 -0
  23. package/dist/config/defaults.d.ts +3 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +51 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/loader.d.ts +3 -0
  28. package/dist/config/loader.d.ts.map +1 -0
  29. package/dist/config/loader.js +31 -0
  30. package/dist/config/loader.js.map +1 -0
  31. package/dist/core/context-registry.d.ts +31 -0
  32. package/dist/core/context-registry.d.ts.map +1 -0
  33. package/dist/core/context-registry.js +133 -0
  34. package/dist/core/context-registry.js.map +1 -0
  35. package/dist/core/file-cache.d.ts +34 -0
  36. package/dist/core/file-cache.d.ts.map +1 -0
  37. package/dist/core/file-cache.js +120 -0
  38. package/dist/core/file-cache.js.map +1 -0
  39. package/dist/core/format-duration.d.ts +5 -0
  40. package/dist/core/format-duration.d.ts.map +1 -0
  41. package/dist/core/format-duration.js +13 -0
  42. package/dist/core/format-duration.js.map +1 -0
  43. package/dist/core/session-analytics.d.ts +26 -0
  44. package/dist/core/session-analytics.d.ts.map +1 -0
  45. package/dist/core/session-analytics.js +91 -0
  46. package/dist/core/session-analytics.js.map +1 -0
  47. package/dist/core/symbol-resolver.d.ts +21 -0
  48. package/dist/core/symbol-resolver.d.ts.map +1 -0
  49. package/dist/core/symbol-resolver.js +102 -0
  50. package/dist/core/symbol-resolver.js.map +1 -0
  51. package/dist/core/token-estimator.d.ts +10 -0
  52. package/dist/core/token-estimator.d.ts.map +1 -0
  53. package/dist/core/token-estimator.js +22 -0
  54. package/dist/core/token-estimator.js.map +1 -0
  55. package/dist/core/validation.d.ts +77 -0
  56. package/dist/core/validation.d.ts.map +1 -0
  57. package/dist/core/validation.js +208 -0
  58. package/dist/core/validation.js.map +1 -0
  59. package/dist/formatters/structure.d.ts +13 -0
  60. package/dist/formatters/structure.d.ts.map +1 -0
  61. package/dist/formatters/structure.js +90 -0
  62. package/dist/formatters/structure.js.map +1 -0
  63. package/dist/git/file-watcher.d.ts +17 -0
  64. package/dist/git/file-watcher.d.ts.map +1 -0
  65. package/dist/git/file-watcher.js +54 -0
  66. package/dist/git/file-watcher.js.map +1 -0
  67. package/dist/git/watcher.d.ts +25 -0
  68. package/dist/git/watcher.d.ts.map +1 -0
  69. package/dist/git/watcher.js +95 -0
  70. package/dist/git/watcher.js.map +1 -0
  71. package/dist/handlers/class-hierarchy.d.ts +11 -0
  72. package/dist/handlers/class-hierarchy.d.ts.map +1 -0
  73. package/dist/handlers/class-hierarchy.js +28 -0
  74. package/dist/handlers/class-hierarchy.js.map +1 -0
  75. package/dist/handlers/export-ast-index.d.ts +19 -0
  76. package/dist/handlers/export-ast-index.d.ts.map +1 -0
  77. package/dist/handlers/export-ast-index.js +107 -0
  78. package/dist/handlers/export-ast-index.js.map +1 -0
  79. package/dist/handlers/find-implementations.d.ts +11 -0
  80. package/dist/handlers/find-implementations.d.ts.map +1 -0
  81. package/dist/handlers/find-implementations.js +25 -0
  82. package/dist/handlers/find-implementations.js.map +1 -0
  83. package/dist/handlers/find-usages.d.ts +11 -0
  84. package/dist/handlers/find-usages.d.ts.map +1 -0
  85. package/dist/handlers/find-usages.js +23 -0
  86. package/dist/handlers/find-usages.js.map +1 -0
  87. package/dist/handlers/non-code.d.ts +25 -0
  88. package/dist/handlers/non-code.d.ts.map +1 -0
  89. package/dist/handlers/non-code.js +152 -0
  90. package/dist/handlers/non-code.js.map +1 -0
  91. package/dist/handlers/project-overview.d.ts +8 -0
  92. package/dist/handlers/project-overview.d.ts.map +1 -0
  93. package/dist/handlers/project-overview.js +84 -0
  94. package/dist/handlers/project-overview.js.map +1 -0
  95. package/dist/handlers/read-diff.d.ts +13 -0
  96. package/dist/handlers/read-diff.d.ts.map +1 -0
  97. package/dist/handlers/read-diff.js +174 -0
  98. package/dist/handlers/read-diff.js.map +1 -0
  99. package/dist/handlers/read-range.d.ts +14 -0
  100. package/dist/handlers/read-range.d.ts.map +1 -0
  101. package/dist/handlers/read-range.js +44 -0
  102. package/dist/handlers/read-range.js.map +1 -0
  103. package/dist/handlers/read-symbol.d.ts +16 -0
  104. package/dist/handlers/read-symbol.d.ts.map +1 -0
  105. package/dist/handlers/read-symbol.js +59 -0
  106. package/dist/handlers/read-symbol.js.map +1 -0
  107. package/dist/handlers/search-code.d.ts +14 -0
  108. package/dist/handlers/search-code.d.ts.map +1 -0
  109. package/dist/handlers/search-code.js +27 -0
  110. package/dist/handlers/search-code.js.map +1 -0
  111. package/dist/handlers/smart-read-many.d.ts +14 -0
  112. package/dist/handlers/smart-read-many.d.ts.map +1 -0
  113. package/dist/handlers/smart-read-many.js +32 -0
  114. package/dist/handlers/smart-read-many.js.map +1 -0
  115. package/dist/handlers/smart-read.d.ts +18 -0
  116. package/dist/handlers/smart-read.d.ts.map +1 -0
  117. package/dist/handlers/smart-read.js +86 -0
  118. package/dist/handlers/smart-read.js.map +1 -0
  119. package/dist/hooks/installer.d.ts +16 -0
  120. package/dist/hooks/installer.d.ts.map +1 -0
  121. package/dist/hooks/installer.js +89 -0
  122. package/dist/hooks/installer.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +120 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/integration/context-mode-detector.d.ts +16 -0
  128. package/dist/integration/context-mode-detector.d.ts.map +1 -0
  129. package/dist/integration/context-mode-detector.js +53 -0
  130. package/dist/integration/context-mode-detector.js.map +1 -0
  131. package/dist/server.d.ts +36 -0
  132. package/dist/server.d.ts.map +1 -0
  133. package/dist/server.js +375 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/types.d.ts +122 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +5 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +67 -0
  140. package/skills/install/SKILL.md +14 -0
  141. package/skills/stats/SKILL.md +8 -0
  142. package/start.sh +27 -0
package/dist/server.js ADDED
@@ -0,0 +1,375 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
3
+ import { AstIndexClient } from './ast-index/client.js';
4
+ import { FileCache } from './core/file-cache.js';
5
+ import { ContextRegistry } from './core/context-registry.js';
6
+ import { SymbolResolver } from './core/symbol-resolver.js';
7
+ import { SessionAnalytics } from './core/session-analytics.js';
8
+ import { formatDuration } from './core/format-duration.js';
9
+ import { loadConfig } from './config/loader.js';
10
+ import { readFileSync } from 'node:fs';
11
+ import { GitWatcher } from './git/watcher.js';
12
+ import { FileWatcher } from './git/file-watcher.js';
13
+ import { handleSmartRead } from './handlers/smart-read.js';
14
+ import { handleReadSymbol } from './handlers/read-symbol.js';
15
+ import { handleReadRange } from './handlers/read-range.js';
16
+ import { handleReadDiff } from './handlers/read-diff.js';
17
+ import { handleSearchCode } from './handlers/search-code.js';
18
+ import { handleFindUsages } from './handlers/find-usages.js';
19
+ import { handleFindImplementations } from './handlers/find-implementations.js';
20
+ import { handleClassHierarchy } from './handlers/class-hierarchy.js';
21
+ import { handleSmartReadMany } from './handlers/smart-read-many.js';
22
+ import { handleProjectOverview } from './handlers/project-overview.js';
23
+ import { handleNonCodeRead, isNonCodeStructured } from './handlers/non-code.js';
24
+ import { handleExportAstIndex } from './handlers/export-ast-index.js';
25
+ import { detectContextMode } from './integration/context-mode-detector.js';
26
+ import { estimateTokens } from './core/token-estimator.js';
27
+ import { validateSmartReadArgs, validateReadSymbolArgs, validateReadRangeArgs, validateReadDiffArgs, validateSearchCodeArgs, validateFindUsagesArgs, validateFindImplementationsArgs, validateClassHierarchyArgs, validateSmartReadManyArgs, validateExportAstIndexArgs, } from './core/validation.js';
28
+ export async function createServer(projectRoot) {
29
+ const config = await loadConfig(projectRoot);
30
+ const astIndex = new AstIndexClient(projectRoot, config.astIndex.timeout, {
31
+ binaryPath: config.astIndex.binaryPath,
32
+ autoInstall: true,
33
+ });
34
+ const fileCache = new FileCache(config.cache.maxSizeMB, config.smartRead.smallFileThreshold);
35
+ const contextRegistry = new ContextRegistry();
36
+ const symbolResolver = new SymbolResolver(astIndex);
37
+ // Try to init ast-index (non-fatal if not available)
38
+ try {
39
+ await astIndex.init();
40
+ if (config.astIndex.buildOnStart) {
41
+ await astIndex.ensureIndex();
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error(`[token-pilot] ast-index init warning: ${err instanceof Error ? err.message : err}`);
46
+ }
47
+ // Session analytics
48
+ const analytics = new SessionAnalytics();
49
+ // Detect context-mode companion
50
+ const cmEnabled = config.contextMode.enabled;
51
+ const contextModeStatus = await detectContextMode(projectRoot, cmEnabled === 'auto' ? undefined : cmEnabled);
52
+ if (contextModeStatus.detected) {
53
+ console.error(`[token-pilot] context-mode detected (source: ${contextModeStatus.source})`);
54
+ }
55
+ analytics.setContextModeStatus(contextModeStatus);
56
+ // Git watcher (selective cache invalidation on branch switch)
57
+ const gitWatcher = new GitWatcher(projectRoot, fileCache, contextRegistry, config.git.watchHead);
58
+ try {
59
+ await gitWatcher.start();
60
+ }
61
+ catch (err) {
62
+ console.error(`[token-pilot] git watcher warning: ${err instanceof Error ? err.message : err}`);
63
+ }
64
+ // File watcher (auto-invalidate cache on file changes)
65
+ let fileWatcher = null;
66
+ if (config.cache.watchFiles) {
67
+ fileWatcher = new FileWatcher(projectRoot, fileCache, contextRegistry, config.ignore);
68
+ fileWatcher.start();
69
+ }
70
+ // Read version from package.json
71
+ let pkgVersion = '0.1.1';
72
+ try {
73
+ const pkgPath = new URL('../package.json', import.meta.url).pathname;
74
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
75
+ pkgVersion = pkg.version;
76
+ }
77
+ catch { /* fallback to hardcoded */ }
78
+ const server = new Server({ name: 'token-pilot', version: pkgVersion }, { capabilities: { tools: {} } });
79
+ server.setRequestHandler(ListToolsRequestSchema, () => ({
80
+ tools: [
81
+ // --- Phase 1: Core reading tools ---
82
+ {
83
+ name: 'smart_read',
84
+ description: 'Read a file as a structural overview (AST-based). Returns classes, functions, methods with signatures and line ranges instead of full content. PREFERRED over Read for files > 80 lines — saves 80-95% tokens.',
85
+ inputSchema: {
86
+ type: 'object',
87
+ properties: {
88
+ path: { type: 'string', description: 'File path (absolute or relative to project root)' },
89
+ show_imports: { type: 'boolean', description: 'Include import details (default: true)' },
90
+ show_docs: { type: 'boolean', description: 'Include doc comments (default: true)' },
91
+ depth: { type: 'number', description: 'Max depth for nested symbols (default: 2)' },
92
+ },
93
+ required: ['path'],
94
+ },
95
+ },
96
+ {
97
+ name: 'read_symbol',
98
+ description: 'Read the source code of a specific symbol (function, method, class). Use after smart_read to load only the code you need.',
99
+ inputSchema: {
100
+ type: 'object',
101
+ properties: {
102
+ path: { type: 'string', description: 'File path' },
103
+ symbol: { type: 'string', description: 'Symbol name, e.g. "UserService.updateUser"' },
104
+ context_before: { type: 'number', description: 'Lines of context before (default: 2)' },
105
+ context_after: { type: 'number', description: 'Lines of context after (default: 0)' },
106
+ },
107
+ required: ['path', 'symbol'],
108
+ },
109
+ },
110
+ {
111
+ name: 'read_range',
112
+ description: 'Read a specific line range from a file.',
113
+ inputSchema: {
114
+ type: 'object',
115
+ properties: {
116
+ path: { type: 'string', description: 'File path' },
117
+ start_line: { type: 'number', description: 'Start line (1-indexed)' },
118
+ end_line: { type: 'number', description: 'End line (1-indexed, inclusive)' },
119
+ },
120
+ required: ['path', 'start_line', 'end_line'],
121
+ },
122
+ },
123
+ {
124
+ name: 'read_diff',
125
+ description: 'Show only what changed in a file since Token Pilot last served it. Saves 80-95% tokens on re-reads after edits.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ path: { type: 'string', description: 'File path' },
130
+ context_lines: { type: 'number', description: 'Lines of context around changes (default: 3)' },
131
+ },
132
+ required: ['path'],
133
+ },
134
+ },
135
+ {
136
+ name: 'smart_read_many',
137
+ description: 'Batch smart_read for multiple files. Returns structural overview for each file in one call. Max 20 files.',
138
+ inputSchema: {
139
+ type: 'object',
140
+ properties: {
141
+ paths: {
142
+ type: 'array',
143
+ items: { type: 'string' },
144
+ description: 'Array of file paths',
145
+ },
146
+ },
147
+ required: ['paths'],
148
+ },
149
+ },
150
+ // --- Phase 2: Search & navigation ---
151
+ {
152
+ name: 'search_code',
153
+ description: 'Indexed structural code search. Searches symbols and code using ast-index. Much faster and more accurate than grep for finding functions, classes, and variables.',
154
+ inputSchema: {
155
+ type: 'object',
156
+ properties: {
157
+ query: { type: 'string', description: 'Search query (symbol name, pattern)' },
158
+ in_file: { type: 'string', description: 'Filter results to a specific file path' },
159
+ max_results: { type: 'number', description: 'Max results (default: 20)' },
160
+ fuzzy: { type: 'boolean', description: 'Enable fuzzy matching (default: false)' },
161
+ },
162
+ required: ['query'],
163
+ },
164
+ },
165
+ {
166
+ name: 'find_usages',
167
+ description: 'Find all usages of a symbol across the project. Groups results by: definitions, calls, imports, references.',
168
+ inputSchema: {
169
+ type: 'object',
170
+ properties: {
171
+ symbol: { type: 'string', description: 'Symbol name to find usages of' },
172
+ },
173
+ required: ['symbol'],
174
+ },
175
+ },
176
+ {
177
+ name: 'find_implementations',
178
+ description: 'Find all implementations of an interface/abstract class/trait.',
179
+ inputSchema: {
180
+ type: 'object',
181
+ properties: {
182
+ name: { type: 'string', description: 'Interface/abstract class name' },
183
+ },
184
+ required: ['name'],
185
+ },
186
+ },
187
+ {
188
+ name: 'class_hierarchy',
189
+ description: 'Show class/interface inheritance hierarchy tree.',
190
+ inputSchema: {
191
+ type: 'object',
192
+ properties: {
193
+ name: { type: 'string', description: 'Class or interface name' },
194
+ },
195
+ required: ['name'],
196
+ },
197
+ },
198
+ {
199
+ name: 'project_overview',
200
+ description: 'Show a compact project overview: project info, type, and structure map.',
201
+ inputSchema: {
202
+ type: 'object',
203
+ properties: {},
204
+ },
205
+ },
206
+ // --- Integration ---
207
+ {
208
+ name: 'export_ast_index',
209
+ description: 'Export AST structural data for cross-tool indexing. Outputs markdown or JSON that can be passed to context-mode\'s index() for BM25-searchable code structure. Use after smart_read to make code structure available via context-mode search.',
210
+ inputSchema: {
211
+ type: 'object',
212
+ properties: {
213
+ paths: {
214
+ type: 'array',
215
+ items: { type: 'string' },
216
+ description: 'Specific file paths to export (default: all cached files)',
217
+ },
218
+ format: {
219
+ type: 'string',
220
+ enum: ['markdown', 'json'],
221
+ description: 'Output format: "markdown" (default, best for BM25) or "json"',
222
+ },
223
+ },
224
+ },
225
+ },
226
+ // --- Context management & analytics ---
227
+ {
228
+ name: 'session_analytics',
229
+ description: 'Show token savings report for this session: total tokens saved, per-tool breakdown, top files by savings.',
230
+ inputSchema: {
231
+ type: 'object',
232
+ properties: {},
233
+ },
234
+ },
235
+ {
236
+ name: 'context_status',
237
+ description: 'Show what files/symbols are currently tracked in context.',
238
+ inputSchema: {
239
+ type: 'object',
240
+ properties: {
241
+ path: { type: 'string', description: 'Show details for a specific file (optional)' },
242
+ },
243
+ },
244
+ },
245
+ {
246
+ name: 'forget',
247
+ description: 'Remove a file or symbol from context tracking.',
248
+ inputSchema: {
249
+ type: 'object',
250
+ properties: {
251
+ path: { type: 'string', description: 'File path to forget' },
252
+ symbol: { type: 'string', description: 'Specific symbol to forget' },
253
+ all: { type: 'boolean', description: 'Forget everything' },
254
+ },
255
+ },
256
+ },
257
+ ],
258
+ }));
259
+ // Handle tool calls with validated arguments
260
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
261
+ const { name, arguments: args } = request.params;
262
+ try {
263
+ switch (name) {
264
+ case 'smart_read': {
265
+ const validArgs = validateSmartReadArgs(args);
266
+ // Try non-code handler for JSON/YAML/MD etc.
267
+ if (isNonCodeStructured(validArgs.path)) {
268
+ const nonCodeResult = await handleNonCodeRead(validArgs.path, projectRoot, contextRegistry, {
269
+ contextModeStatus,
270
+ largeNonCodeThreshold: config.contextMode.largeNonCodeThreshold,
271
+ adviseDelegation: config.contextMode.adviseDelegation,
272
+ });
273
+ if (nonCodeResult) {
274
+ const text = nonCodeResult.content[0]?.text ?? '';
275
+ analytics.record({ tool: 'smart_read', path: validArgs.path, tokensReturned: estimateTokens(text), tokensWouldBe: estimateTokens(text), timestamp: Date.now() });
276
+ return nonCodeResult;
277
+ }
278
+ }
279
+ const result = await handleSmartRead(validArgs, projectRoot, astIndex, fileCache, contextRegistry, config);
280
+ let text = result.content[0]?.text ?? '';
281
+ // Cross-index hint when context-mode is active
282
+ if (contextModeStatus.detected && config.contextMode.adviseDelegation) {
283
+ text += '\nCROSS-INDEX: Use export_ast_index to make this structure searchable via context-mode.';
284
+ result.content[0] = { type: 'text', text };
285
+ }
286
+ analytics.record({ tool: 'smart_read', path: validArgs.path, tokensReturned: estimateTokens(text), tokensWouldBe: estimateTokens(text) * 5, timestamp: Date.now() });
287
+ return result;
288
+ }
289
+ case 'read_symbol':
290
+ return await handleReadSymbol(validateReadSymbolArgs(args), projectRoot, symbolResolver, fileCache, contextRegistry);
291
+ case 'read_range':
292
+ return await handleReadRange(validateReadRangeArgs(args), projectRoot, fileCache, contextRegistry);
293
+ case 'read_diff':
294
+ return await handleReadDiff(validateReadDiffArgs(args), projectRoot, fileCache, contextRegistry);
295
+ case 'smart_read_many':
296
+ return await handleSmartReadMany(validateSmartReadManyArgs(args), projectRoot, astIndex, fileCache, contextRegistry, config);
297
+ case 'search_code': {
298
+ const searchResult = await handleSearchCode(validateSearchCodeArgs(args), astIndex);
299
+ if (contextModeStatus.detected && config.contextMode.adviseDelegation) {
300
+ const searchText = searchResult.content[0]?.text ?? '';
301
+ searchResult.content[0] = {
302
+ type: 'text',
303
+ text: searchText + '\nCROSS-INDEX: Pass these results to context-mode index(source: "token-pilot-search") for persistent BM25 search.',
304
+ };
305
+ }
306
+ return searchResult;
307
+ }
308
+ case 'find_usages':
309
+ return await handleFindUsages(validateFindUsagesArgs(args), astIndex);
310
+ case 'find_implementations':
311
+ return await handleFindImplementations(validateFindImplementationsArgs(args), astIndex);
312
+ case 'class_hierarchy':
313
+ return await handleClassHierarchy(validateClassHierarchyArgs(args), astIndex);
314
+ case 'project_overview':
315
+ return await handleProjectOverview(projectRoot, astIndex);
316
+ case 'export_ast_index':
317
+ return await handleExportAstIndex(validateExportAstIndexArgs(args), astIndex, fileCache);
318
+ case 'session_analytics':
319
+ return { content: [{ type: 'text', text: analytics.report() }] };
320
+ case 'context_status':
321
+ return handleContextStatus(contextRegistry, args);
322
+ case 'forget':
323
+ return handleForget(contextRegistry, args);
324
+ default:
325
+ return {
326
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
327
+ isError: true,
328
+ };
329
+ }
330
+ }
331
+ catch (err) {
332
+ const message = err instanceof Error ? err.message : String(err);
333
+ return {
334
+ content: [{ type: 'text', text: `Error: ${message}` }],
335
+ isError: true,
336
+ };
337
+ }
338
+ });
339
+ return server;
340
+ }
341
+ function handleContextStatus(registry, args) {
342
+ const summary = registry.summary();
343
+ const lines = [
344
+ `CONTEXT STATUS (session: ${formatDuration(summary.sessionDuration)})`,
345
+ '',
346
+ `Files tracked: ${summary.files}`,
347
+ `Total tokens in context: ~${summary.totalTokens}`,
348
+ '',
349
+ ];
350
+ for (const entry of summary.entries) {
351
+ if (args?.path && !entry.path.includes(args.path))
352
+ continue;
353
+ lines.push(` ${entry.path}:`);
354
+ for (const region of entry.loaded) {
355
+ const label = region.symbolName ?? region.type;
356
+ const elapsed = formatDuration(Date.now() - entry.loadedAt);
357
+ lines.push(` - ${label} (${region.tokens} tokens) — loaded ${elapsed} ago`);
358
+ }
359
+ lines.push('');
360
+ }
361
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
362
+ }
363
+ function handleForget(registry, args) {
364
+ if (args?.all) {
365
+ registry.forgetAll();
366
+ return { content: [{ type: 'text', text: 'Forgot all tracked content.' }] };
367
+ }
368
+ if (args?.path) {
369
+ registry.forget(args.path, args.symbol);
370
+ const what = args.symbol ? `${args.symbol} from ${args.path}` : args.path;
371
+ return { content: [{ type: 'text', text: `Forgot: ${what}` }] };
372
+ }
373
+ return { content: [{ type: 'text', text: 'Specify path, symbol, or all=true.' }] };
374
+ }
375
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Core domain types for Token Pilot.
3
+ */
4
+ export type SymbolKind = 'function' | 'class' | 'method' | 'property' | 'variable' | 'type' | 'interface' | 'enum' | 'constant' | 'namespace';
5
+ export type Visibility = 'public' | 'private' | 'protected' | 'default';
6
+ export interface FileStructure {
7
+ path: string;
8
+ language: string;
9
+ meta: {
10
+ lines: number;
11
+ bytes: number;
12
+ lastModified: number;
13
+ contentHash: string;
14
+ };
15
+ imports: ImportDeclaration[];
16
+ exports: ExportDeclaration[];
17
+ symbols: SymbolInfo[];
18
+ }
19
+ export interface SymbolInfo {
20
+ name: string;
21
+ qualifiedName: string;
22
+ kind: SymbolKind;
23
+ signature: string;
24
+ location: {
25
+ startLine: number;
26
+ endLine: number;
27
+ lineCount: number;
28
+ };
29
+ visibility: Visibility;
30
+ async: boolean;
31
+ static: boolean;
32
+ decorators: string[];
33
+ children: SymbolInfo[];
34
+ doc: string | null;
35
+ references: string[];
36
+ }
37
+ export interface ImportDeclaration {
38
+ source: string;
39
+ specifiers: string[];
40
+ isDefault: boolean;
41
+ isNamespace: boolean;
42
+ line: number;
43
+ }
44
+ export interface ExportDeclaration {
45
+ name: string;
46
+ kind: SymbolKind;
47
+ isDefault: boolean;
48
+ line: number;
49
+ }
50
+ export interface ResolvedSymbol {
51
+ symbol: SymbolInfo;
52
+ filePath: string;
53
+ startLine: number;
54
+ endLine: number;
55
+ }
56
+ export interface ContextEntry {
57
+ path: string;
58
+ loaded: LoadedRegion[];
59
+ contentHash: string;
60
+ tokenEstimate: number;
61
+ loadedAt: number;
62
+ }
63
+ export interface LoadedRegion {
64
+ type: 'structure' | 'symbol' | 'range' | 'full';
65
+ symbolName?: string;
66
+ startLine: number;
67
+ endLine: number;
68
+ tokens: number;
69
+ }
70
+ export interface CacheEntry {
71
+ structure: FileStructure;
72
+ content: string;
73
+ lines: string[];
74
+ mtime: number;
75
+ hash: string;
76
+ lastAccess: number;
77
+ }
78
+ export interface TokenPilotConfig {
79
+ astIndex: {
80
+ binaryPath: string | null;
81
+ buildOnStart: boolean;
82
+ timeout: number;
83
+ };
84
+ cache: {
85
+ maxSizeMB: number;
86
+ ttlMinutes: number;
87
+ watchFiles: boolean;
88
+ };
89
+ smartRead: {
90
+ smallFileThreshold: number;
91
+ showDependencyHints: boolean;
92
+ advisoryReminders: boolean;
93
+ };
94
+ git: {
95
+ watchHead: boolean;
96
+ selectiveInvalidation: boolean;
97
+ };
98
+ hooks: {
99
+ enabled: boolean;
100
+ interceptRead: boolean;
101
+ autoInstall: boolean;
102
+ };
103
+ context: {
104
+ estimateTokens: boolean;
105
+ warnOnStale: boolean;
106
+ autoForgetMinutes: number;
107
+ };
108
+ display: {
109
+ showImports: boolean;
110
+ showDocs: boolean;
111
+ showReferences: boolean;
112
+ maxDepth: number;
113
+ showTokenSavings: boolean;
114
+ };
115
+ contextMode: {
116
+ enabled: boolean | 'auto';
117
+ adviseDelegation: boolean;
118
+ largeNonCodeThreshold: number;
119
+ };
120
+ ignore: string[];
121
+ }
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core domain types for Token Pilot.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "token-pilot",
3
+ "version": "0.1.1",
4
+ "description": "MCP server that reduces token consumption in AI coding assistants via AST-aware lazy file reading",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "token-pilot": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "start.sh",
13
+ ".claude-plugin/",
14
+ ".mcp.json",
15
+ "skills/",
16
+ "README.md",
17
+ "CHANGELOG.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "start": "node dist/index.js",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "lint": "tsc --noEmit",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "mcp",
30
+ "token",
31
+ "ast",
32
+ "claude",
33
+ "cursor",
34
+ "ai",
35
+ "coding-assistant",
36
+ "context-optimization"
37
+ ],
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/Digital-Threads/token-pilot.git"
41
+ },
42
+ "homepage": "https://github.com/Digital-Threads/token-pilot#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/Digital-Threads/token-pilot/issues"
45
+ },
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.12.0",
49
+ "chokidar": "^4.0.3"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^22.0.0",
53
+ "typescript": "^5.7.0",
54
+ "vitest": "^3.0.0"
55
+ },
56
+ "engines": {
57
+ "node": ">=18.0.0"
58
+ },
59
+ "peerDependencies": {
60
+ "ast-index": ">=0.1.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "ast-index": {
64
+ "optional": true
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: install
3
+ description: Install or check ast-index binary (auto-downloads if missing)
4
+ command: install
5
+ user_invocable: true
6
+ ---
7
+
8
+ Run the following command to install or verify the ast-index binary:
9
+
10
+ ```bash
11
+ node ${CLAUDE_PLUGIN_ROOT}/dist/index.js install-ast-index
12
+ ```
13
+
14
+ Show the output to the user. If ast-index is already installed, confirm the version. If it needs to be downloaded, show progress.
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: stats
3
+ description: Show Token Pilot session analytics — token savings, per-tool breakdown, top files
4
+ command: stats
5
+ user_invocable: true
6
+ ---
7
+
8
+ Call the `session_analytics` MCP tool from the token-pilot server to display the current session's token savings report. Show the output to the user as-is.
package/start.sh ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ # Token Pilot bootstrap script for Claude Code plugin system.
3
+ # Handles auto-install of dependencies and build on first run.
4
+
5
+ set -e
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
+ cd "$SCRIPT_DIR"
9
+
10
+ # 1. Install node_modules if missing
11
+ if [ ! -d "node_modules" ]; then
12
+ echo "[token-pilot] Installing dependencies..." >&2
13
+ npm install --production --no-audit --no-fund 2>&1 >&2
14
+ fi
15
+
16
+ # 2. Build if dist/ is missing
17
+ if [ ! -f "dist/index.js" ]; then
18
+ echo "[token-pilot] Building..." >&2
19
+ # Need devDependencies for build
20
+ npm install --no-audit --no-fund 2>&1 >&2
21
+ npm run build 2>&1 >&2
22
+ fi
23
+
24
+ # 3. Start the MCP server
25
+ # Pass CLAUDE_PROJECT_DIR as project root if available, otherwise cwd
26
+ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
27
+ exec node "$SCRIPT_DIR/dist/index.js" "$PROJECT_ROOT"