skannr 0.1.6 → 0.2.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 (115) hide show
  1. package/dist/cli.js +86 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/guard/call-context.d.ts +14 -0
  4. package/dist/guard/call-context.d.ts.map +1 -0
  5. package/dist/guard/call-context.js +120 -0
  6. package/dist/guard/call-context.js.map +1 -0
  7. package/dist/guard/fix-applier.d.ts +38 -0
  8. package/dist/guard/fix-applier.d.ts.map +1 -0
  9. package/dist/guard/fix-applier.js +181 -0
  10. package/dist/guard/fix-applier.js.map +1 -0
  11. package/dist/guard/hook-installer.d.ts +19 -0
  12. package/dist/guard/hook-installer.d.ts.map +1 -0
  13. package/dist/guard/hook-installer.js +119 -0
  14. package/dist/guard/hook-installer.js.map +1 -0
  15. package/dist/guard/index.d.ts +34 -0
  16. package/dist/guard/index.d.ts.map +1 -0
  17. package/dist/guard/index.js +152 -0
  18. package/dist/guard/index.js.map +1 -0
  19. package/dist/guard/provider.d.ts +12 -0
  20. package/dist/guard/provider.d.ts.map +1 -0
  21. package/dist/guard/provider.js +211 -0
  22. package/dist/guard/provider.js.map +1 -0
  23. package/dist/guard/review-runner.d.ts +21 -0
  24. package/dist/guard/review-runner.d.ts.map +1 -0
  25. package/dist/guard/review-runner.js +85 -0
  26. package/dist/guard/review-runner.js.map +1 -0
  27. package/dist/guard/rules-loader.d.ts +10 -0
  28. package/dist/guard/rules-loader.d.ts.map +1 -0
  29. package/dist/guard/rules-loader.js +121 -0
  30. package/dist/guard/rules-loader.js.map +1 -0
  31. package/dist/guard/schema.d.ts +182 -0
  32. package/dist/guard/schema.d.ts.map +1 -0
  33. package/dist/guard/schema.js +53 -0
  34. package/dist/guard/schema.js.map +1 -0
  35. package/dist/guard/symbol-diff.d.ts +18 -0
  36. package/dist/guard/symbol-diff.d.ts.map +1 -0
  37. package/dist/guard/symbol-diff.js +243 -0
  38. package/dist/guard/symbol-diff.js.map +1 -0
  39. package/dist/guard/types.d.ts +62 -0
  40. package/dist/guard/types.d.ts.map +1 -0
  41. package/dist/guard/types.js +6 -0
  42. package/dist/guard/types.js.map +1 -0
  43. package/dist/languages/TreeSitterAdapter.d.ts +30 -0
  44. package/dist/languages/TreeSitterAdapter.d.ts.map +1 -0
  45. package/dist/languages/TreeSitterAdapter.js +466 -0
  46. package/dist/languages/TreeSitterAdapter.js.map +1 -0
  47. package/dist/languages/grammars/tree-sitter-go.wasm +0 -0
  48. package/dist/languages/grammars/tree-sitter-java.wasm +0 -0
  49. package/dist/languages/grammars/tree-sitter-python.wasm +0 -0
  50. package/dist/languages/grammars/tree-sitter-rust.wasm +0 -0
  51. package/dist/languages/lang-config.d.ts +38 -0
  52. package/dist/languages/lang-config.d.ts.map +1 -0
  53. package/dist/languages/lang-config.js +85 -0
  54. package/dist/languages/lang-config.js.map +1 -0
  55. package/dist/languages/registry.d.ts +6 -0
  56. package/dist/languages/registry.d.ts.map +1 -1
  57. package/dist/languages/registry.js +18 -4
  58. package/dist/languages/registry.js.map +1 -1
  59. package/dist/mcp-server.d.ts.map +1 -1
  60. package/dist/mcp-server.js +44 -0
  61. package/dist/mcp-server.js.map +1 -1
  62. package/package.json +5 -7
  63. package/src/cli.ts +101 -0
  64. package/src/guard/call-context.ts +101 -0
  65. package/src/guard/fix-applier.ts +172 -0
  66. package/src/guard/hook-installer.ts +96 -0
  67. package/src/guard/index.ts +134 -0
  68. package/src/guard/provider.ts +209 -0
  69. package/src/guard/review-runner.ts +110 -0
  70. package/src/guard/rules-loader.ts +97 -0
  71. package/src/guard/schema.ts +59 -0
  72. package/src/guard/symbol-diff.ts +227 -0
  73. package/src/guard/types.ts +68 -0
  74. package/src/languages/TreeSitterAdapter.ts +431 -0
  75. package/src/languages/lang-config.ts +113 -0
  76. package/src/languages/registry.ts +65 -49
  77. package/src/mcp-server.ts +49 -0
  78. package/src/languages/PythonAdapter.ts +0 -302
  79. package/tests/agent.tools.test.ts +0 -81
  80. package/tests/benchmark.test.ts +0 -31
  81. package/tests/blast-radius.test.ts +0 -290
  82. package/tests/fixtures/sample.py +0 -17
  83. package/tests/fixtures/sample.ts +0 -13
  84. package/tests/fixtures/src/api/routes.ts +0 -1
  85. package/tests/fixtures/src/auth/permission.ts +0 -3
  86. package/tests/python-adapter.test.ts +0 -31
  87. package/tests/ranker-enhanced.test.ts +0 -70
  88. package/tests/ranker.test.ts +0 -79
  89. package/tests/scanner.scope.test.ts +0 -67
  90. package/tests/setup-fixtures.js +0 -29
  91. package/tests/skeletonizer.test.ts +0 -149
  92. package/uca-landing/index.html +0 -17
  93. package/uca-landing/package.json +0 -23
  94. package/uca-landing/postcss.config.js +0 -6
  95. package/uca-landing/src/App.jsx +0 -45
  96. package/uca-landing/src/components/AgentMode.jsx +0 -45
  97. package/uca-landing/src/components/CliReference.jsx +0 -89
  98. package/uca-landing/src/components/Features.jsx +0 -88
  99. package/uca-landing/src/components/Footer.jsx +0 -35
  100. package/uca-landing/src/components/Hero.jsx +0 -125
  101. package/uca-landing/src/components/HowItWorks.jsx +0 -65
  102. package/uca-landing/src/components/Install.jsx +0 -103
  103. package/uca-landing/src/components/LanguageSupport.jsx +0 -63
  104. package/uca-landing/src/components/Navbar.jsx +0 -86
  105. package/uca-landing/src/components/Problem.jsx +0 -51
  106. package/uca-landing/src/components/Reveal.jsx +0 -40
  107. package/uca-landing/src/components/TokenSavings.jsx +0 -126
  108. package/uca-landing/src/components/WorksWith.jsx +0 -59
  109. package/uca-landing/src/hooks/useScrollNav.js +0 -13
  110. package/uca-landing/src/hooks/useTypewriter.js +0 -41
  111. package/uca-landing/src/index.css +0 -13
  112. package/uca-landing/src/main.jsx +0 -10
  113. package/uca-landing/tailwind.config.js +0 -68
  114. package/uca-landing/vercel.json +0 -4
  115. package/uca-landing/vite.config.js +0 -6
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ /**
3
+ * Build symbol-level diff units from staged git changes.
4
+ * Uses Skannr's existing parser to identify which symbols changed,
5
+ * instead of working with raw file diffs.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.getStagedFiles = getStagedFiles;
42
+ exports.buildSymbolDiffs = buildSymbolDiffs;
43
+ exports.buildSymbolDiffsFromDiff = buildSymbolDiffsFromDiff;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs"));
46
+ const child_process_1 = require("child_process");
47
+ const registry_1 = require("../languages/registry");
48
+ const scanner_1 = require("../scanner");
49
+ /** Get the list of staged files (paths relative to root). */
50
+ function getStagedFiles(root) {
51
+ try {
52
+ const output = (0, child_process_1.execSync)('git diff --cached --name-only --diff-filter=ACMR', {
53
+ cwd: root,
54
+ encoding: 'utf-8',
55
+ });
56
+ return output.trim().split('\n').filter(Boolean);
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ /** Get the diff text for a specific staged file. */
63
+ function getStagedDiff(root, file) {
64
+ try {
65
+ return (0, child_process_1.execSync)(`git diff --cached -- "${file}"`, {
66
+ cwd: root,
67
+ encoding: 'utf-8',
68
+ maxBuffer: 5 * 1024 * 1024,
69
+ });
70
+ }
71
+ catch {
72
+ return '';
73
+ }
74
+ }
75
+ /** Get the old (HEAD) version of a file, or null if newly added. */
76
+ function getHeadContent(root, file) {
77
+ try {
78
+ return (0, child_process_1.execSync)(`git show HEAD:"${file}"`, {
79
+ cwd: root,
80
+ encoding: 'utf-8',
81
+ maxBuffer: 5 * 1024 * 1024,
82
+ });
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ /** Extract changed line numbers from a unified diff. */
89
+ function extractChangedLines(diff) {
90
+ const lines = new Set();
91
+ let currentLine = 0;
92
+ for (const line of diff.split('\n')) {
93
+ const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)/);
94
+ if (hunkMatch) {
95
+ currentLine = parseInt(hunkMatch[1], 10);
96
+ continue;
97
+ }
98
+ if (line.startsWith('+') && !line.startsWith('+++')) {
99
+ lines.add(currentLine);
100
+ currentLine++;
101
+ }
102
+ else if (line.startsWith('-') && !line.startsWith('---')) {
103
+ // Deleted lines don't advance the new-file line counter
104
+ }
105
+ else {
106
+ currentLine++;
107
+ }
108
+ }
109
+ return lines;
110
+ }
111
+ /**
112
+ * Determine which symbols in a file were affected by the staged changes.
113
+ * Matches symbols whose line range overlaps any changed line.
114
+ */
115
+ function findAffectedSymbols(symbols, changedLines, allSymbols) {
116
+ if (changedLines.size === 0)
117
+ return [];
118
+ // Build approximate end lines: each symbol extends until the next symbol starts
119
+ const sorted = [...allSymbols].sort((a, b) => a.line - b.line);
120
+ const affected = [];
121
+ for (let i = 0; i < sorted.length; i++) {
122
+ const sym = sorted[i];
123
+ const startLine = sym.line;
124
+ const endLine = i + 1 < sorted.length ? sorted[i + 1].line - 1 : startLine + 50;
125
+ for (let line = startLine; line <= endLine; line++) {
126
+ if (changedLines.has(line)) {
127
+ affected.push(sym);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ return affected;
133
+ }
134
+ /**
135
+ * Build symbol-level diff units for all staged files in the project.
136
+ * This is the primary input to the review runner.
137
+ */
138
+ function buildSymbolDiffs(root) {
139
+ const stagedFiles = getStagedFiles(root);
140
+ const units = [];
141
+ for (const relFile of stagedFiles) {
142
+ const absPath = path.join(root, relFile);
143
+ if (!fs.existsSync(absPath))
144
+ continue;
145
+ const adapter = (0, registry_1.getAdapter)(absPath);
146
+ const newContent = (0, scanner_1.readFileContent)(absPath);
147
+ if (!newContent)
148
+ continue;
149
+ const newSymbols = adapter.extractSymbols(newContent);
150
+ const oldContent = getHeadContent(root, relFile);
151
+ const oldSymbols = oldContent ? adapter.extractSymbols(oldContent) : [];
152
+ const diff = getStagedDiff(root, relFile);
153
+ const changedLines = extractChangedLines(diff);
154
+ // Find symbols that overlap changed lines in the new version
155
+ const affected = findAffectedSymbols(newSymbols, changedLines, newSymbols);
156
+ // Determine change type for each affected symbol
157
+ const oldSymbolNames = new Set(oldSymbols.map((s) => s.name));
158
+ for (const sym of affected) {
159
+ if (sym.kind === 'export')
160
+ continue; // skip synthetic export markers
161
+ const changeType = oldSymbolNames.has(sym.name) ? 'modified' : 'added';
162
+ const oldSym = oldSymbols.find((s) => s.name === sym.name);
163
+ units.push({
164
+ file: relFile,
165
+ symbol: sym.name,
166
+ changeType,
167
+ oldSignature: oldSym ? `${oldSym.kind} ${oldSym.name}` : undefined,
168
+ newSignature: `${sym.kind} ${sym.name}`,
169
+ callers: [], // populated by call-context module
170
+ callees: [], // populated by call-context module
171
+ diffText: diff,
172
+ });
173
+ }
174
+ // Handle deleted symbols (in old but not in new)
175
+ if (oldContent) {
176
+ const newSymbolNames = new Set(newSymbols.map((s) => s.name));
177
+ for (const oldSym of oldSymbols) {
178
+ if (oldSym.kind === 'export')
179
+ continue;
180
+ if (!newSymbolNames.has(oldSym.name)) {
181
+ units.push({
182
+ file: relFile,
183
+ symbol: oldSym.name,
184
+ changeType: 'deleted',
185
+ oldSignature: `${oldSym.kind} ${oldSym.name}`,
186
+ callers: [],
187
+ callees: [],
188
+ diffText: diff,
189
+ });
190
+ }
191
+ }
192
+ }
193
+ }
194
+ return units;
195
+ }
196
+ /**
197
+ * Build symbol diffs from a PR diff string (for --pr-mode).
198
+ */
199
+ function buildSymbolDiffsFromDiff(root, diffContent) {
200
+ const parseDiff = require('parse-diff');
201
+ const parsedFiles = parseDiff(diffContent);
202
+ const units = [];
203
+ for (const file of parsedFiles) {
204
+ const raw = file.to ?? file.from;
205
+ if (!raw || raw === '/dev/null')
206
+ continue;
207
+ const relFile = raw.replace(/^[ab]\//, '');
208
+ const absPath = path.join(root, relFile);
209
+ if (!fs.existsSync(absPath))
210
+ continue;
211
+ const adapter = (0, registry_1.getAdapter)(absPath);
212
+ const content = (0, scanner_1.readFileContent)(absPath);
213
+ if (!content)
214
+ continue;
215
+ const symbols = adapter.extractSymbols(content);
216
+ const changedLines = new Set();
217
+ for (const chunk of file.chunks) {
218
+ for (const change of chunk.changes) {
219
+ if (change.type === 'add' || change.type === 'del') {
220
+ const ln = change.ln;
221
+ if (typeof ln === 'number')
222
+ changedLines.add(ln);
223
+ }
224
+ }
225
+ }
226
+ const affected = findAffectedSymbols(symbols, changedLines, symbols);
227
+ for (const sym of affected) {
228
+ if (sym.kind === 'export')
229
+ continue;
230
+ units.push({
231
+ file: relFile,
232
+ symbol: sym.name,
233
+ changeType: 'modified',
234
+ newSignature: `${sym.kind} ${sym.name}`,
235
+ callers: [],
236
+ callees: [],
237
+ diffText: file.chunks.map((c) => c.content).join('\n'),
238
+ });
239
+ }
240
+ }
241
+ return units;
242
+ }
243
+ //# sourceMappingURL=symbol-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-diff.js","sourceRoot":"","sources":["../../src/guard/symbol-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Shared type definitions for the guard module.
3
+ */
4
+ /** Severity levels for rules and violations. */
5
+ export type Severity = 'low' | 'medium' | 'high' | 'critical';
6
+ /** A team-defined review rule. */
7
+ export interface GuardRule {
8
+ id: string;
9
+ description: string;
10
+ severity: Severity;
11
+ fixable: boolean;
12
+ category: string;
13
+ }
14
+ /** A single symbol-level diff unit sent to the LLM for review. */
15
+ export interface SymbolDiffUnit {
16
+ file: string;
17
+ symbol: string;
18
+ changeType: 'added' | 'modified' | 'deleted';
19
+ oldSignature?: string;
20
+ newSignature?: string;
21
+ callers: string[];
22
+ callees: string[];
23
+ diffText: string;
24
+ }
25
+ /** A violation found by the review. */
26
+ export interface Violation {
27
+ rule_id: string;
28
+ file: string;
29
+ symbol: string;
30
+ line_start: number;
31
+ line_end: number;
32
+ severity: Severity;
33
+ confidence: number;
34
+ fixable: boolean;
35
+ message: string;
36
+ suggested_fix?: string;
37
+ }
38
+ /** The structured response contract from the LLM. */
39
+ export interface ReviewResponse {
40
+ violations: Violation[];
41
+ status: 'pass' | 'fail';
42
+ summary: string;
43
+ }
44
+ /** Result of a full guard run. */
45
+ export interface GuardResult {
46
+ response: ReviewResponse;
47
+ rulesUsed: GuardRule[];
48
+ symbolsReviewed: number;
49
+ durationMs: number;
50
+ }
51
+ /** Guard configuration (provider, model, etc.). */
52
+ export interface GuardConfig {
53
+ /** LLM provider: 'gemini' | 'openai' */
54
+ provider: 'gemini' | 'openai';
55
+ /** Model name (e.g. 'gemini-2.0-flash-exp', 'gpt-4o'). */
56
+ model: string;
57
+ /** API key (resolved from env if not set). */
58
+ apiKey?: string;
59
+ /** OpenAI-compatible base URL (for openai provider). */
60
+ baseUrl?: string;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Shared type definitions for the guard module.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Universal tree-sitter adapter using web-tree-sitter (WASM).
3
+ * Handles Python, Go, Rust, Java, and any future language by loading
4
+ * the appropriate grammar at runtime. No native compilation required.
5
+ */
6
+ import { LanguageAdapter, SkeletonResult, Symbol } from './LanguageAdapter';
7
+ import { LangConfig } from './lang-config';
8
+ export declare class TreeSitterAdapter implements LanguageAdapter {
9
+ name: string;
10
+ extensions: string[];
11
+ private configs;
12
+ private _initDone;
13
+ constructor(configs: LangConfig[]);
14
+ canHandle(filePath: string): boolean;
15
+ /** Ensure WASM parser is initialized. Call at the start of each public method. */
16
+ private ensureReady;
17
+ /** Async initialization — must be called once before using the adapter. */
18
+ initialize(): Promise<void>;
19
+ /** Synchronous initialization attempt (for compat with existing sync API). */
20
+ initializeSync(): void;
21
+ generateSkeleton(content: string, filePath: string): SkeletonResult;
22
+ extractSymbols(content: string): Symbol[];
23
+ extractImports(content: string): string[];
24
+ /** Extract symbols with a file path hint for correct config selection. */
25
+ extractSymbolsForFile(content: string, filePath: string): Symbol[];
26
+ /** Extract imports with a file path hint for correct config selection. */
27
+ extractImportsForFile(content: string, filePath: string): string[];
28
+ private walkSymbols;
29
+ }
30
+ //# sourceMappingURL=TreeSitterAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeSitterAdapter.d.ts","sourceRoot":"","sources":["../../src/languages/TreeSitterAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAuB,MAAM,eAAe,CAAC;AAkLhE,qBAAa,iBAAkB,YAAW,eAAe;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,UAAU,EAAE;IAMjC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKpC,kFAAkF;IAClF,OAAO,CAAC,WAAW;IAOnB,2EAA2E;IACrE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,8EAA8E;IAC9E,cAAc,IAAI,IAAI;IAQtB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc;IA+CnE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAwBzC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IA4BzC,0EAA0E;IAC1E,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAuBlE,0EAA0E;IAC1E,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA2BlE,OAAO,CAAC,WAAW;CAgDpB"}