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
@@ -0,0 +1,102 @@
1
+ export class SymbolResolver {
2
+ astIndex;
3
+ constructor(astIndex) {
4
+ this.astIndex = astIndex;
5
+ }
6
+ /**
7
+ * Resolve a symbol by qualified name.
8
+ * First tries ast-index, falls back to searching cached structure.
9
+ */
10
+ async resolve(qualifiedName, structure) {
11
+ // Try ast-index first
12
+ const detail = await this.astIndex.symbol(qualifiedName);
13
+ if (detail) {
14
+ // ast-index only provides start_line; estimate end_line from structure
15
+ let endLine = detail.start_line + 10;
16
+ if (structure) {
17
+ const found = this.findInStructure(qualifiedName, structure.symbols);
18
+ if (found)
19
+ endLine = found.location.endLine;
20
+ }
21
+ return {
22
+ symbol: {
23
+ name: detail.name,
24
+ qualifiedName: qualifiedName,
25
+ kind: this.mapKind(detail.kind),
26
+ signature: detail.signature ?? detail.name,
27
+ location: {
28
+ startLine: detail.start_line,
29
+ endLine,
30
+ lineCount: endLine - detail.start_line + 1,
31
+ },
32
+ visibility: 'default',
33
+ async: false,
34
+ static: false,
35
+ decorators: [],
36
+ children: [],
37
+ doc: null,
38
+ references: [],
39
+ },
40
+ filePath: detail.file,
41
+ startLine: detail.start_line,
42
+ endLine,
43
+ };
44
+ }
45
+ // Fallback: search in provided structure
46
+ if (structure) {
47
+ const found = this.findInStructure(qualifiedName, structure.symbols);
48
+ if (found) {
49
+ return {
50
+ symbol: found,
51
+ filePath: structure.path,
52
+ startLine: found.location.startLine,
53
+ endLine: found.location.endLine,
54
+ };
55
+ }
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * Extract source code for a resolved symbol from file lines.
61
+ */
62
+ extractSource(resolved, lines, options = {}) {
63
+ const { contextBefore = 2, contextAfter = 0 } = options;
64
+ const start = Math.max(0, resolved.startLine - 1 - contextBefore);
65
+ const end = Math.min(lines.length, resolved.endLine + contextAfter);
66
+ const output = [];
67
+ for (let i = start; i < end; i++) {
68
+ const lineNum = String(i + 1).padStart(4);
69
+ output.push(`${lineNum} | ${lines[i]}`);
70
+ }
71
+ return output.join('\n');
72
+ }
73
+ mapKind(kind) {
74
+ const map = {
75
+ function: 'function', class: 'class', method: 'method',
76
+ property: 'property', variable: 'variable', type: 'type',
77
+ interface: 'interface', enum: 'enum', constant: 'constant',
78
+ namespace: 'namespace', struct: 'class', trait: 'interface',
79
+ impl: 'class', module: 'namespace',
80
+ };
81
+ return map[kind.toLowerCase()] ?? 'function';
82
+ }
83
+ findInStructure(qualifiedName, symbols) {
84
+ const parts = qualifiedName.split('.');
85
+ for (const sym of symbols) {
86
+ if (parts.length === 1 && sym.name === parts[0]) {
87
+ return sym;
88
+ }
89
+ if (parts.length === 2 && sym.name === parts[0]) {
90
+ const child = sym.children.find(c => c.name === parts[1]);
91
+ if (child)
92
+ return child;
93
+ }
94
+ // Recurse
95
+ const found = this.findInStructure(qualifiedName, sym.children);
96
+ if (found)
97
+ return found;
98
+ }
99
+ return null;
100
+ }
101
+ }
102
+ //# sourceMappingURL=symbol-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-resolver.js","sourceRoot":"","sources":["../../src/core/symbol-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Estimate token count for text content.
3
+ * Uses a simple heuristic calibrated against cl100k_base.
4
+ */
5
+ export declare function estimateTokens(text: string): number;
6
+ /**
7
+ * Format a token savings message.
8
+ */
9
+ export declare function formatSavings(actual: number, wouldBe: number): string;
10
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/core/token-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIrE"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Estimate token count for text content.
3
+ * Uses a simple heuristic calibrated against cl100k_base.
4
+ */
5
+ export function estimateTokens(text) {
6
+ if (text.length === 0)
7
+ return 0;
8
+ const charEstimate = Math.ceil(text.length / 4);
9
+ const whitespaceRatio = (text.match(/\s/g)?.length ?? 0) / text.length;
10
+ const adjustment = 1 - (whitespaceRatio * 0.3);
11
+ return Math.ceil(charEstimate * adjustment);
12
+ }
13
+ /**
14
+ * Format a token savings message.
15
+ */
16
+ export function formatSavings(actual, wouldBe) {
17
+ if (wouldBe <= 0)
18
+ return '';
19
+ const saved = Math.round((1 - actual / wouldBe) * 100);
20
+ return `TOKEN SAVINGS: ~${actual} tokens (structure) vs ~${wouldBe} tokens (full file) = ${saved}% saved`;
21
+ }
22
+ //# sourceMappingURL=token-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../src/core/token-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACvE,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IAC3D,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IACvD,OAAO,mBAAmB,MAAM,2BAA2B,OAAO,yBAAyB,KAAK,SAAS,CAAC;AAC5G,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Resolve a user-provided path and validate it stays within projectRoot.
3
+ * Prevents path traversal attacks (e.g. ../../etc/passwd).
4
+ */
5
+ export declare function resolveSafePath(projectRoot: string, userPath: string): string;
6
+ /**
7
+ * Validate smart_read arguments.
8
+ */
9
+ export declare function validateSmartReadArgs(args: unknown): {
10
+ path: string;
11
+ show_imports?: boolean;
12
+ show_docs?: boolean;
13
+ show_references?: boolean;
14
+ depth?: number;
15
+ };
16
+ /**
17
+ * Validate read_symbol arguments.
18
+ */
19
+ export declare function validateReadSymbolArgs(args: unknown): {
20
+ path: string;
21
+ symbol: string;
22
+ context_before?: number;
23
+ context_after?: number;
24
+ };
25
+ /**
26
+ * Validate read_range arguments.
27
+ */
28
+ export declare function validateReadRangeArgs(args: unknown): {
29
+ path: string;
30
+ start_line: number;
31
+ end_line: number;
32
+ };
33
+ /**
34
+ * Validate read_diff arguments.
35
+ */
36
+ export declare function validateReadDiffArgs(args: unknown): {
37
+ path: string;
38
+ context_lines?: number;
39
+ };
40
+ /**
41
+ * Validate search_code arguments.
42
+ */
43
+ export declare function validateSearchCodeArgs(args: unknown): {
44
+ query: string;
45
+ in_file?: string;
46
+ max_results?: number;
47
+ fuzzy?: boolean;
48
+ };
49
+ /**
50
+ * Validate find_usages arguments.
51
+ */
52
+ export declare function validateFindUsagesArgs(args: unknown): {
53
+ symbol: string;
54
+ };
55
+ /**
56
+ * Validate find_implementations arguments.
57
+ */
58
+ export declare function validateFindImplementationsArgs(args: unknown): {
59
+ name: string;
60
+ };
61
+ /**
62
+ * Validate class_hierarchy arguments.
63
+ */
64
+ export declare function validateClassHierarchyArgs(args: unknown): {
65
+ name: string;
66
+ };
67
+ /**
68
+ * Validate smart_read_many arguments.
69
+ */
70
+ export declare function validateSmartReadManyArgs(args: unknown): {
71
+ paths: string[];
72
+ };
73
+ export declare function validateExportAstIndexArgs(args: unknown): {
74
+ paths?: string[];
75
+ format?: 'markdown' | 'json';
76
+ };
77
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAeA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAiBA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAkBA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAYA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAcA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CASxE;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAS/E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAS1E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAc5E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG;IACzD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAC9B,CAqBA"}
@@ -0,0 +1,208 @@
1
+ import { resolve, relative } from 'node:path';
2
+ /**
3
+ * Resolve a user-provided path and validate it stays within projectRoot.
4
+ * Prevents path traversal attacks (e.g. ../../etc/passwd).
5
+ */
6
+ export function resolveSafePath(projectRoot, userPath) {
7
+ const absPath = resolve(projectRoot, userPath);
8
+ const rel = relative(projectRoot, absPath);
9
+ if (rel.startsWith('..') || resolve(projectRoot, rel) !== absPath) {
10
+ throw new Error(`Path "${userPath}" resolves outside project root.`);
11
+ }
12
+ return absPath;
13
+ }
14
+ /**
15
+ * Validate smart_read arguments.
16
+ */
17
+ export function validateSmartReadArgs(args) {
18
+ if (!args || typeof args !== 'object') {
19
+ throw new Error('Arguments must be an object.');
20
+ }
21
+ const a = args;
22
+ if (typeof a.path !== 'string' || a.path.length === 0) {
23
+ throw new Error('Required parameter "path" must be a non-empty string.');
24
+ }
25
+ return {
26
+ path: a.path,
27
+ show_imports: optionalBool(a.show_imports, 'show_imports'),
28
+ show_docs: optionalBool(a.show_docs, 'show_docs'),
29
+ show_references: optionalBool(a.show_references, 'show_references'),
30
+ depth: optionalNumber(a.depth, 'depth'),
31
+ };
32
+ }
33
+ /**
34
+ * Validate read_symbol arguments.
35
+ */
36
+ export function validateReadSymbolArgs(args) {
37
+ if (!args || typeof args !== 'object') {
38
+ throw new Error('Arguments must be an object.');
39
+ }
40
+ const a = args;
41
+ if (typeof a.path !== 'string' || a.path.length === 0) {
42
+ throw new Error('Required parameter "path" must be a non-empty string.');
43
+ }
44
+ if (typeof a.symbol !== 'string' || a.symbol.length === 0) {
45
+ throw new Error('Required parameter "symbol" must be a non-empty string.');
46
+ }
47
+ return {
48
+ path: a.path,
49
+ symbol: a.symbol,
50
+ context_before: optionalNumber(a.context_before, 'context_before'),
51
+ context_after: optionalNumber(a.context_after, 'context_after'),
52
+ };
53
+ }
54
+ /**
55
+ * Validate read_range arguments.
56
+ */
57
+ export function validateReadRangeArgs(args) {
58
+ if (!args || typeof args !== 'object') {
59
+ throw new Error('Arguments must be an object.');
60
+ }
61
+ const a = args;
62
+ if (typeof a.path !== 'string' || a.path.length === 0) {
63
+ throw new Error('Required parameter "path" must be a non-empty string.');
64
+ }
65
+ if (typeof a.start_line !== 'number' || !Number.isInteger(a.start_line) || a.start_line < 1) {
66
+ throw new Error('Required parameter "start_line" must be a positive integer.');
67
+ }
68
+ if (typeof a.end_line !== 'number' || !Number.isInteger(a.end_line) || a.end_line < 1) {
69
+ throw new Error('Required parameter "end_line" must be a positive integer.');
70
+ }
71
+ if (a.end_line < a.start_line) {
72
+ throw new Error('"end_line" must be >= "start_line".');
73
+ }
74
+ return { path: a.path, start_line: a.start_line, end_line: a.end_line };
75
+ }
76
+ /**
77
+ * Validate read_diff arguments.
78
+ */
79
+ export function validateReadDiffArgs(args) {
80
+ if (!args || typeof args !== 'object') {
81
+ throw new Error('Arguments must be an object.');
82
+ }
83
+ const a = args;
84
+ if (typeof a.path !== 'string' || a.path.length === 0) {
85
+ throw new Error('Required parameter "path" must be a non-empty string.');
86
+ }
87
+ return {
88
+ path: a.path,
89
+ context_lines: optionalNumber(a.context_lines, 'context_lines'),
90
+ };
91
+ }
92
+ /**
93
+ * Validate search_code arguments.
94
+ */
95
+ export function validateSearchCodeArgs(args) {
96
+ if (!args || typeof args !== 'object') {
97
+ throw new Error('Arguments must be an object.');
98
+ }
99
+ const a = args;
100
+ if (typeof a.query !== 'string' || a.query.length === 0) {
101
+ throw new Error('Required parameter "query" must be a non-empty string.');
102
+ }
103
+ return {
104
+ query: a.query,
105
+ in_file: optionalString(a.in_file, 'in_file'),
106
+ max_results: optionalNumber(a.max_results, 'max_results'),
107
+ fuzzy: optionalBool(a.fuzzy, 'fuzzy'),
108
+ };
109
+ }
110
+ /**
111
+ * Validate find_usages arguments.
112
+ */
113
+ export function validateFindUsagesArgs(args) {
114
+ if (!args || typeof args !== 'object') {
115
+ throw new Error('Arguments must be an object.');
116
+ }
117
+ const a = args;
118
+ if (typeof a.symbol !== 'string' || a.symbol.length === 0) {
119
+ throw new Error('Required parameter "symbol" must be a non-empty string.');
120
+ }
121
+ return { symbol: a.symbol };
122
+ }
123
+ /**
124
+ * Validate find_implementations arguments.
125
+ */
126
+ export function validateFindImplementationsArgs(args) {
127
+ if (!args || typeof args !== 'object') {
128
+ throw new Error('Arguments must be an object.');
129
+ }
130
+ const a = args;
131
+ if (typeof a.name !== 'string' || a.name.length === 0) {
132
+ throw new Error('Required parameter "name" must be a non-empty string.');
133
+ }
134
+ return { name: a.name };
135
+ }
136
+ /**
137
+ * Validate class_hierarchy arguments.
138
+ */
139
+ export function validateClassHierarchyArgs(args) {
140
+ if (!args || typeof args !== 'object') {
141
+ throw new Error('Arguments must be an object.');
142
+ }
143
+ const a = args;
144
+ if (typeof a.name !== 'string' || a.name.length === 0) {
145
+ throw new Error('Required parameter "name" must be a non-empty string.');
146
+ }
147
+ return { name: a.name };
148
+ }
149
+ /**
150
+ * Validate smart_read_many arguments.
151
+ */
152
+ export function validateSmartReadManyArgs(args) {
153
+ if (!args || typeof args !== 'object') {
154
+ throw new Error('Arguments must be an object.');
155
+ }
156
+ const a = args;
157
+ if (!Array.isArray(a.paths)) {
158
+ throw new Error('Required parameter "paths" must be an array of strings.');
159
+ }
160
+ for (const p of a.paths) {
161
+ if (typeof p !== 'string' || p.length === 0) {
162
+ throw new Error('Each path in "paths" must be a non-empty string.');
163
+ }
164
+ }
165
+ return { paths: a.paths };
166
+ }
167
+ export function validateExportAstIndexArgs(args) {
168
+ if (!args || typeof args !== 'object')
169
+ return {};
170
+ const a = args;
171
+ const result = {};
172
+ if (Array.isArray(a.paths)) {
173
+ for (const p of a.paths) {
174
+ if (typeof p !== 'string')
175
+ throw new Error('Each path must be a string.');
176
+ }
177
+ result.paths = a.paths;
178
+ }
179
+ if (a.format !== undefined) {
180
+ if (a.format !== 'markdown' && a.format !== 'json') {
181
+ throw new Error('"format" must be "markdown" or "json".');
182
+ }
183
+ result.format = a.format;
184
+ }
185
+ return result;
186
+ }
187
+ function optionalString(val, name) {
188
+ if (val === undefined || val === null)
189
+ return undefined;
190
+ if (typeof val !== 'string')
191
+ throw new Error(`"${name}" must be a string.`);
192
+ return val;
193
+ }
194
+ function optionalBool(val, name) {
195
+ if (val === undefined || val === null)
196
+ return undefined;
197
+ if (typeof val !== 'boolean')
198
+ throw new Error(`"${name}" must be a boolean.`);
199
+ return val;
200
+ }
201
+ function optionalNumber(val, name) {
202
+ if (val === undefined || val === null)
203
+ return undefined;
204
+ if (typeof val !== 'number')
205
+ throw new Error(`"${name}" must be a number.`);
206
+ return val;
207
+ }
208
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FileStructure } from '../types.js';
2
+ export interface FormatOptions {
3
+ showImports?: boolean;
4
+ showDocs?: boolean;
5
+ showDependencyHints?: boolean;
6
+ maxDepth?: number;
7
+ showTokenSavings?: boolean;
8
+ }
9
+ /**
10
+ * Format a FileStructure as token-optimized text for LLMs.
11
+ */
12
+ export declare function formatOutline(structure: FileStructure, options?: FormatOptions): string;
13
+ //# sourceMappingURL=structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/formatters/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAmD3F"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Format a FileStructure as token-optimized text for LLMs.
3
+ */
4
+ export function formatOutline(structure, options = {}) {
5
+ const { showImports = true, showDocs = true, showDependencyHints = true, maxDepth = 2, } = options;
6
+ const lines = [];
7
+ // Header
8
+ const sizeKB = (structure.meta.bytes / 1024).toFixed(1);
9
+ lines.push(`FILE: ${structure.path} (${structure.meta.lines} lines, ${sizeKB}KB)`);
10
+ lines.push(`LANGUAGE: ${structure.language}`);
11
+ lines.push('');
12
+ // Imports
13
+ if (showImports && structure.imports.length > 0) {
14
+ lines.push('IMPORTS:');
15
+ for (const imp of structure.imports) {
16
+ if (imp.isNamespace) {
17
+ lines.push(` * as ${imp.specifiers[0]} from '${imp.source}'`);
18
+ }
19
+ else if (imp.isDefault) {
20
+ lines.push(` ${imp.specifiers[0]} from '${imp.source}'`);
21
+ }
22
+ else {
23
+ lines.push(` { ${imp.specifiers.join(', ')} } from '${imp.source}'`);
24
+ }
25
+ }
26
+ lines.push('');
27
+ }
28
+ // Exports
29
+ if (structure.exports.length > 0) {
30
+ lines.push('EXPORTS:');
31
+ for (const exp of structure.exports) {
32
+ const defaultLabel = exp.isDefault ? ' (default)' : '';
33
+ lines.push(` ${exp.kind} ${exp.name}${defaultLabel}`);
34
+ }
35
+ lines.push('');
36
+ }
37
+ // Structure
38
+ lines.push('STRUCTURE:');
39
+ for (const sym of structure.symbols) {
40
+ formatSymbolTree(sym, lines, 1, maxDepth, showDocs, showDependencyHints);
41
+ }
42
+ lines.push('');
43
+ lines.push('HINT: Use read_symbol("<ClassName>.<method>") to load a specific symbol.');
44
+ return lines.join('\n');
45
+ }
46
+ function formatSymbolTree(sym, lines, depth, maxDepth, showDocs, showDeps) {
47
+ const indent = ' '.repeat(depth);
48
+ const asyncPrefix = sym.async ? 'async ' : '';
49
+ const staticPrefix = sym.static ? 'static ' : '';
50
+ const visPrefix = sym.visibility !== 'default' ? `${sym.visibility} ` : '';
51
+ // Decorators
52
+ for (const dec of sym.decorators) {
53
+ lines.push(`${indent}@${dec}`);
54
+ }
55
+ // Symbol line
56
+ const loc = `[L${sym.location.startLine}-${sym.location.endLine}]`;
57
+ const lineCount = `(${sym.location.lineCount} lines)`;
58
+ if (sym.kind === 'class' || sym.kind === 'interface' || sym.kind === 'enum') {
59
+ lines.push(`${indent}${sym.kind} ${sym.name}: ${loc} ${lineCount}`);
60
+ }
61
+ else {
62
+ lines.push(`${indent}- ${visPrefix}${staticPrefix}${asyncPrefix}${sym.signature} ${loc} ${lineCount}`);
63
+ }
64
+ // Dependency hints (references)
65
+ if (showDeps && sym.references.length > 0) {
66
+ lines.push(`${indent} calls: ${sym.references.join(', ')}`);
67
+ }
68
+ // Children
69
+ if (depth < maxDepth && sym.children.length > 0) {
70
+ // Group by visibility
71
+ const publicMethods = sym.children.filter(c => c.visibility === 'public' || c.visibility === 'default');
72
+ const privateMethods = sym.children.filter(c => c.visibility === 'private' || c.visibility === 'protected');
73
+ if (publicMethods.length > 0) {
74
+ lines.push(`${indent} Public Methods:`);
75
+ for (const child of publicMethods) {
76
+ formatSymbolTree(child, lines, depth + 2, maxDepth, showDocs, showDeps);
77
+ }
78
+ }
79
+ if (privateMethods.length > 0) {
80
+ lines.push(`${indent} Private Methods:`);
81
+ for (const child of privateMethods) {
82
+ formatSymbolTree(child, lines, depth + 2, maxDepth, showDocs, showDeps);
83
+ }
84
+ }
85
+ }
86
+ else if (sym.children.length > 0) {
87
+ lines.push(`${indent} (${sym.children.length} members — increase depth to see)`);
88
+ }
89
+ }
90
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/formatters/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FileCache } from '../core/file-cache.js';
2
+ import type { ContextRegistry } from '../core/context-registry.js';
3
+ /**
4
+ * Watches project files for changes and auto-invalidates cache.
5
+ * Only watches files that are currently cached to avoid unnecessary overhead.
6
+ */
7
+ export declare class FileWatcher {
8
+ private projectRoot;
9
+ private fileCache;
10
+ private contextRegistry;
11
+ private watcher;
12
+ private ignore;
13
+ constructor(projectRoot: string, fileCache: FileCache, contextRegistry: ContextRegistry, ignore: string[]);
14
+ start(): void;
15
+ stop(): void;
16
+ }
17
+ //# sourceMappingURL=file-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/git/file-watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAW;gBAGvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,MAAM,EAAE;IAQlB,KAAK,IAAI,IAAI;IAiCb,IAAI,IAAI,IAAI;CAIb"}
@@ -0,0 +1,54 @@
1
+ import { watch } from 'chokidar';
2
+ import { resolve } from 'node:path';
3
+ /**
4
+ * Watches project files for changes and auto-invalidates cache.
5
+ * Only watches files that are currently cached to avoid unnecessary overhead.
6
+ */
7
+ export class FileWatcher {
8
+ projectRoot;
9
+ fileCache;
10
+ contextRegistry;
11
+ watcher = null;
12
+ ignore;
13
+ constructor(projectRoot, fileCache, contextRegistry, ignore) {
14
+ this.projectRoot = projectRoot;
15
+ this.fileCache = fileCache;
16
+ this.contextRegistry = contextRegistry;
17
+ this.ignore = ignore;
18
+ }
19
+ start() {
20
+ this.watcher = watch(this.projectRoot, {
21
+ persistent: false,
22
+ ignoreInitial: true,
23
+ ignored: [
24
+ '**/node_modules/**',
25
+ '**/.git/**',
26
+ '**/dist/**',
27
+ '**/build/**',
28
+ '**/__pycache__/**',
29
+ '**/target/**', // Rust
30
+ ...this.ignore.map(p => resolve(this.projectRoot, p)),
31
+ ],
32
+ depth: 10,
33
+ });
34
+ this.watcher.on('change', (filePath) => {
35
+ // Invalidate only if this file is in cache
36
+ const absPath = resolve(filePath);
37
+ if (this.fileCache.get(absPath)) {
38
+ this.fileCache.invalidate(absPath);
39
+ // Don't invalidate context registry — the advisory reminder will
40
+ // detect staleness via content hash mismatch
41
+ }
42
+ });
43
+ this.watcher.on('unlink', (filePath) => {
44
+ const absPath = resolve(filePath);
45
+ this.fileCache.invalidate(absPath);
46
+ this.contextRegistry.forget(absPath);
47
+ });
48
+ }
49
+ stop() {
50
+ this.watcher?.close();
51
+ this.watcher = null;
52
+ }
53
+ }
54
+ //# sourceMappingURL=file-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/git/file-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,OAAO,EAAW,MAAM,WAAW,CAAC;AAI7C;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,WAAW,CAAS;IACpB,SAAS,CAAY;IACrB,eAAe,CAAkB;IACjC,OAAO,GAAoC,IAAI,CAAC;IAChD,MAAM,CAAW;IAEzB,YACE,WAAmB,EACnB,SAAoB,EACpB,eAAgC,EAChC,MAAgB;QAEhB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;YACrC,UAAU,EAAE,KAAK;YACjB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE;gBACP,oBAAoB;gBACpB,YAAY;gBACZ,YAAY;gBACZ,aAAa;gBACb,mBAAmB;gBACnB,cAAc,EAAE,OAAO;gBACvB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;aACtD;YACD,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;YAC7C,2CAA2C;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnC,iEAAiE;gBACjE,6CAA6C;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;YAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF"}