skannr 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/.eslintrc.js +22 -0
  2. package/README.md +109 -0
  3. package/dist/agent-cli.d.ts +7 -0
  4. package/dist/agent-cli.d.ts.map +1 -0
  5. package/dist/agent-cli.js +364 -0
  6. package/dist/agent-cli.js.map +1 -0
  7. package/dist/agent.d.ts +115 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +340 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/benchmark.d.ts +53 -0
  12. package/dist/benchmark.d.ts.map +1 -0
  13. package/dist/benchmark.js +307 -0
  14. package/dist/benchmark.js.map +1 -0
  15. package/dist/cache.d.ts +97 -0
  16. package/dist/cache.d.ts.map +1 -0
  17. package/dist/cache.js +284 -0
  18. package/dist/cache.js.map +1 -0
  19. package/dist/cli.d.ts +6 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +238 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config.d.ts +8 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +52 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/index.d.ts +18 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +176 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/languages/GenericAdapter.d.ts +10 -0
  32. package/dist/languages/GenericAdapter.d.ts.map +1 -0
  33. package/dist/languages/GenericAdapter.js +41 -0
  34. package/dist/languages/GenericAdapter.js.map +1 -0
  35. package/dist/languages/LanguageAdapter.d.ts +14 -0
  36. package/dist/languages/LanguageAdapter.d.ts.map +1 -0
  37. package/dist/languages/LanguageAdapter.js +3 -0
  38. package/dist/languages/LanguageAdapter.js.map +1 -0
  39. package/dist/languages/PythonAdapter.d.ts +10 -0
  40. package/dist/languages/PythonAdapter.d.ts.map +1 -0
  41. package/dist/languages/PythonAdapter.js +98 -0
  42. package/dist/languages/PythonAdapter.js.map +1 -0
  43. package/dist/languages/TypeScriptAdapter.d.ts +17 -0
  44. package/dist/languages/TypeScriptAdapter.d.ts.map +1 -0
  45. package/dist/languages/TypeScriptAdapter.js +321 -0
  46. package/dist/languages/TypeScriptAdapter.js.map +1 -0
  47. package/dist/languages/registry.d.ts +4 -0
  48. package/dist/languages/registry.d.ts.map +1 -0
  49. package/dist/languages/registry.js +86 -0
  50. package/dist/languages/registry.js.map +1 -0
  51. package/dist/mapper.d.ts +49 -0
  52. package/dist/mapper.d.ts.map +1 -0
  53. package/dist/mapper.js +386 -0
  54. package/dist/mapper.js.map +1 -0
  55. package/dist/ranker-enhanced.d.ts +37 -0
  56. package/dist/ranker-enhanced.d.ts.map +1 -0
  57. package/dist/ranker-enhanced.js +395 -0
  58. package/dist/ranker-enhanced.js.map +1 -0
  59. package/dist/ranker.d.ts +14 -0
  60. package/dist/ranker.d.ts.map +1 -0
  61. package/dist/ranker.js +105 -0
  62. package/dist/ranker.js.map +1 -0
  63. package/dist/rocket-chat-scope.d.ts +7 -0
  64. package/dist/rocket-chat-scope.d.ts.map +1 -0
  65. package/dist/rocket-chat-scope.js +95 -0
  66. package/dist/rocket-chat-scope.js.map +1 -0
  67. package/dist/scanner.d.ts +16 -0
  68. package/dist/scanner.d.ts.map +1 -0
  69. package/dist/scanner.js +228 -0
  70. package/dist/scanner.js.map +1 -0
  71. package/dist/skeletonizer.d.ts +5 -0
  72. package/dist/skeletonizer.d.ts.map +1 -0
  73. package/dist/skeletonizer.js +52 -0
  74. package/dist/skeletonizer.js.map +1 -0
  75. package/dist/tokenizer.d.ts +9 -0
  76. package/dist/tokenizer.d.ts.map +1 -0
  77. package/dist/tokenizer.js +21 -0
  78. package/dist/tokenizer.js.map +1 -0
  79. package/dist/types.d.ts +68 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +6 -0
  82. package/dist/types.js.map +1 -0
  83. package/gemini-extension/GEMINI.md +26 -0
  84. package/gemini-extension/gemini-extension.json +12 -0
  85. package/gemini-extension/package.json +14 -0
  86. package/gemini-extension/src/server.ts +63 -0
  87. package/gemini-extension/tsconfig.json +14 -0
  88. package/jest.config.js +5 -0
  89. package/package.json +46 -0
  90. package/src/agent-cli.ts +383 -0
  91. package/src/agent.ts +344 -0
  92. package/src/benchmark.ts +389 -0
  93. package/src/cache.ts +317 -0
  94. package/src/cli.ts +223 -0
  95. package/src/config.ts +22 -0
  96. package/src/index.ts +215 -0
  97. package/src/languages/GenericAdapter.ts +44 -0
  98. package/src/languages/LanguageAdapter.ts +14 -0
  99. package/src/languages/PythonAdapter.ts +74 -0
  100. package/src/languages/TypeScriptAdapter.ts +338 -0
  101. package/src/languages/registry.ts +49 -0
  102. package/src/mapper.ts +448 -0
  103. package/src/ranker-enhanced.ts +460 -0
  104. package/src/ranker.ts +92 -0
  105. package/src/scanner.ts +201 -0
  106. package/src/skeletonizer.ts +16 -0
  107. package/src/tokenizer.ts +20 -0
  108. package/src/types.ts +71 -0
  109. package/tests/agent.tools.test.ts +81 -0
  110. package/tests/benchmark.test.ts +31 -0
  111. package/tests/fixtures/sample.py +17 -0
  112. package/tests/fixtures/sample.ts +13 -0
  113. package/tests/fixtures/src/api/routes.ts +1 -0
  114. package/tests/fixtures/src/auth/permission.ts +3 -0
  115. package/tests/ranker-enhanced.test.ts +68 -0
  116. package/tests/ranker.test.ts +75 -0
  117. package/tests/scanner.scope.test.ts +41 -0
  118. package/tests/setup-fixtures.js +29 -0
  119. package/tests/skeletonizer.test.ts +142 -0
  120. package/tsconfig.json +21 -0
  121. package/uca-landing/index.html +17 -0
  122. package/uca-landing/package.json +23 -0
  123. package/uca-landing/postcss.config.js +6 -0
  124. package/uca-landing/src/App.jsx +43 -0
  125. package/uca-landing/src/components/AgentMode.jsx +45 -0
  126. package/uca-landing/src/components/CliReference.jsx +49 -0
  127. package/uca-landing/src/components/Features.jsx +63 -0
  128. package/uca-landing/src/components/Footer.jsx +35 -0
  129. package/uca-landing/src/components/Hero.jsx +124 -0
  130. package/uca-landing/src/components/HowItWorks.jsx +60 -0
  131. package/uca-landing/src/components/Install.jsx +90 -0
  132. package/uca-landing/src/components/LanguageSupport.jsx +63 -0
  133. package/uca-landing/src/components/Navbar.jsx +86 -0
  134. package/uca-landing/src/components/Problem.jsx +51 -0
  135. package/uca-landing/src/components/Reveal.jsx +40 -0
  136. package/uca-landing/src/components/WorksWith.jsx +59 -0
  137. package/uca-landing/src/hooks/useScrollNav.js +13 -0
  138. package/uca-landing/src/hooks/useTypewriter.js +41 -0
  139. package/uca-landing/src/index.css +13 -0
  140. package/uca-landing/src/main.jsx +10 -0
  141. package/uca-landing/tailwind.config.js +68 -0
  142. package/uca-landing/vite.config.js +6 -0
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ /**
3
+ * Benchmark script for code-analyzer
4
+ * Runs against a repository root to measure token reduction.
5
+ * Compares full-scan token cost vs skeletonized analysis across representative queries.
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.BENCHMARK_SCENARIOS = void 0;
42
+ exports.benchmarkProject = benchmarkProject;
43
+ exports.formatResults = formatResults;
44
+ exports.saveResults = saveResults;
45
+ const index_1 = require("./index");
46
+ const scanner_1 = require("./scanner");
47
+ const tokenizer_1 = require("./tokenizer");
48
+ const path = __importStar(require("path"));
49
+ const fs = __importStar(require("fs"));
50
+ function extractQueryTerms(query) {
51
+ return query
52
+ .toLowerCase()
53
+ .split(/[^a-z0-9]+/)
54
+ .filter(term => term.length > 2);
55
+ }
56
+ function computeKeywordCoverage(pathValue, skeleton, terms) {
57
+ if (terms.length === 0)
58
+ return 0;
59
+ const haystack = `${pathValue} ${skeleton}`.toLowerCase();
60
+ const hits = terms.filter(term => haystack.includes(term)).length;
61
+ return hits / terms.length;
62
+ }
63
+ function computeRankingQuality(files, query) {
64
+ if (files.length === 0) {
65
+ return {
66
+ top1KeywordCoverage: 0,
67
+ avgTopKKeywordCoverage: 0,
68
+ pathIntentMatchRate: 0,
69
+ directoryDiversity: 0,
70
+ };
71
+ }
72
+ const terms = extractQueryTerms(query);
73
+ const topK = files.slice(0, Math.min(5, files.length));
74
+ const coverages = topK.map(file => computeKeywordCoverage(file.path, file.skeleton, terms));
75
+ const top1KeywordCoverage = coverages[0] ?? 0;
76
+ const avgTopKKeywordCoverage = coverages.reduce((sum, value) => sum + value, 0) / topK.length;
77
+ const pathIntentMatches = topK.filter(file => terms.some(term => file.path.toLowerCase().includes(term))).length;
78
+ const pathIntentMatchRate = pathIntentMatches / topK.length;
79
+ const uniqueDirs = new Set(topK.map(file => path.dirname(file.path).toLowerCase()));
80
+ const directoryDiversity = uniqueDirs.size / topK.length;
81
+ return {
82
+ top1KeywordCoverage,
83
+ avgTopKKeywordCoverage,
84
+ pathIntentMatchRate,
85
+ directoryDiversity,
86
+ };
87
+ }
88
+ exports.BENCHMARK_SCENARIOS = [
89
+ { moduleKey: 'src', query: 'authentication flow and permission checks', limit: 10 },
90
+ { moduleKey: 'lib', query: 'database connection management', limit: 10 },
91
+ { moduleKey: 'packages', query: 'API endpoint and routing structure', limit: 10 },
92
+ ];
93
+ /**
94
+ * Quickly sum tokens across all .ts/.tsx files in a directory.
95
+ * Uses a capped sample to stay fast, then extrapolates.
96
+ */
97
+ function sampleDirectoryTokens(rootPath, maxFiles = 50) {
98
+ const allFiles = (0, scanner_1.scanTypeScriptFiles)(rootPath);
99
+ const isSampled = allFiles.length > maxFiles;
100
+ const filesToRead = isSampled ? allFiles.slice(0, maxFiles) : allFiles;
101
+ let totalTokens = 0;
102
+ for (const f of filesToRead) {
103
+ try {
104
+ const content = fs.readFileSync(f, 'utf-8');
105
+ totalTokens += (0, tokenizer_1.countTokens)(content);
106
+ }
107
+ catch {
108
+ // skip unreadable
109
+ }
110
+ }
111
+ const estimatedTotal = isSampled
112
+ ? Math.round((totalTokens / filesToRead.length) * allFiles.length)
113
+ : totalTokens;
114
+ return { fileCount: allFiles.length, totalTokens: estimatedTotal, isSampled };
115
+ }
116
+ /**
117
+ * Run a single benchmark scenario
118
+ */
119
+ async function benchmarkProject(appRoot, moduleKey, projectName, query, options = {}) {
120
+ const limit = options.limit ?? 10;
121
+ const moduleFullPath = fs.existsSync(path.join(appRoot, moduleKey))
122
+ ? path.join(appRoot, moduleKey)
123
+ : appRoot;
124
+ // Baseline: estimate full-module token cost (what we are comparing against)
125
+ const baseline = sampleDirectoryTokens(moduleFullPath, 200);
126
+ const start = Date.now();
127
+ const result = await (0, index_1.analyzeProject)({
128
+ root: appRoot,
129
+ question: query,
130
+ limit,
131
+ enhancedRanking: options.enhancedRanking ?? true,
132
+ moduleKeys: [moduleKey],
133
+ generateMapping: false,
134
+ });
135
+ const executionTimeMs = Date.now() - start;
136
+ let analyzedOriginal = 0;
137
+ let analyzedSkeleton = 0;
138
+ const topFiles = result.files.map(f => {
139
+ analyzedOriginal += f.originalTokenCount;
140
+ analyzedSkeleton += f.skeletonTokenCount;
141
+ return {
142
+ path: f.path,
143
+ score: f.score,
144
+ originalTokens: f.originalTokenCount,
145
+ skeletonTokens: f.skeletonTokenCount,
146
+ reductionPct: f.originalTokenCount > 0
147
+ ? ((f.originalTokenCount - f.skeletonTokenCount) / f.originalTokenCount) * 100
148
+ : 0,
149
+ };
150
+ });
151
+ const tokenReductionVsFullScan = baseline.totalTokens > 0
152
+ ? ((baseline.totalTokens - analyzedSkeleton) / baseline.totalTokens) * 100
153
+ : 0;
154
+ const tokenReductionVsTopN = analyzedOriginal > 0
155
+ ? ((analyzedOriginal - analyzedSkeleton) / analyzedOriginal) * 100
156
+ : 0;
157
+ const rankingQuality = computeRankingQuality(result.files.map(file => ({ path: file.path, skeleton: file.skeleton })), query);
158
+ return {
159
+ projectName,
160
+ projectRoot: moduleFullPath,
161
+ query,
162
+ allFilesCount: baseline.fileCount,
163
+ allFilesTotalTokens: baseline.totalTokens,
164
+ analyzedFileCount: result.files.length,
165
+ analyzedOriginalTokens: analyzedOriginal,
166
+ analyzedSkeletonTokens: analyzedSkeleton,
167
+ tokenReductionVsFullScan,
168
+ tokenReductionVsTopN,
169
+ top1KeywordCoverage: rankingQuality.top1KeywordCoverage,
170
+ avgTopKKeywordCoverage: rankingQuality.avgTopKKeywordCoverage,
171
+ pathIntentMatchRate: rankingQuality.pathIntentMatchRate,
172
+ directoryDiversity: rankingQuality.directoryDiversity,
173
+ enhancedRanking: options.enhancedRanking ?? true,
174
+ executionTimeMs,
175
+ topFiles,
176
+ };
177
+ }
178
+ /**
179
+ * Format results for console output
180
+ */
181
+ function formatResults(results) {
182
+ const lines = [];
183
+ lines.push('═══════════════════════════════════════════════════════════════════════');
184
+ lines.push(' CODE ANALYZER BENCHMARK — Generic Repository');
185
+ lines.push('═══════════════════════════════════════════════════════════════════════\n');
186
+ for (const r of results) {
187
+ lines.push(`\n📊 ${r.projectName}`);
188
+ lines.push(` Query: "${r.query}"`);
189
+ lines.push('');
190
+ lines.push(` 🗂 Repository Baseline (naive full-scan):`);
191
+ lines.push(` Total .ts/.tsx files : ${r.allFilesCount.toLocaleString()}`);
192
+ lines.push(` Estimated tokens : ${r.allFilesTotalTokens.toLocaleString()}`);
193
+ lines.push('');
194
+ lines.push(` ⚙️ Our Tool (top ${r.analyzedFileCount} files, enhanced ranking: ${r.enhancedRanking ? '✓' : '✗'}):`);
195
+ lines.push(` Original tokens sent : ${r.analyzedOriginalTokens.toLocaleString()}`);
196
+ lines.push(` Skeleton tokens sent : ${r.analyzedSkeletonTokens.toLocaleString()}`);
197
+ lines.push(` Reduction vs full scan : ${r.tokenReductionVsFullScan.toFixed(1)}% ⬇️`);
198
+ lines.push(` Reduction vs top-N raw : ${r.tokenReductionVsTopN.toFixed(1)}% ⬇️`);
199
+ lines.push(` Top-1 keyword coverage : ${(r.top1KeywordCoverage * 100).toFixed(1)}%`);
200
+ lines.push(` Avg top-K coverage : ${(r.avgTopKKeywordCoverage * 100).toFixed(1)}%`);
201
+ lines.push(` Path intent match rate : ${(r.pathIntentMatchRate * 100).toFixed(1)}%`);
202
+ lines.push(` Directory diversity : ${(r.directoryDiversity * 100).toFixed(1)}%`);
203
+ lines.push(` Execution time : ${r.executionTimeMs}ms`);
204
+ lines.push('');
205
+ lines.push(` 📁 Top Ranked Files:`);
206
+ for (let i = 0; i < Math.min(5, r.topFiles.length); i++) {
207
+ const f = r.topFiles[i];
208
+ lines.push(` ${i + 1}. ${f.path}`);
209
+ lines.push(` Score: ${f.score.toFixed(3)} | ${f.originalTokens} → ${f.skeletonTokens} tokens (${f.reductionPct.toFixed(1)}% ⬇️)`);
210
+ }
211
+ lines.push('');
212
+ lines.push('───────────────────────────────────────────────────────────────────────');
213
+ }
214
+ // Summary
215
+ const avgReductionFullScan = results.reduce((s, r) => s + r.tokenReductionVsFullScan, 0) / results.length;
216
+ const avgReductionTopN = results.reduce((s, r) => s + r.tokenReductionVsTopN, 0) / results.length;
217
+ const avgTop1Coverage = results.reduce((s, r) => s + r.top1KeywordCoverage, 0) / results.length;
218
+ const avgTopKCoverage = results.reduce((s, r) => s + r.avgTopKKeywordCoverage, 0) / results.length;
219
+ const avgPathIntentMatch = results.reduce((s, r) => s + r.pathIntentMatchRate, 0) / results.length;
220
+ const avgTime = results.reduce((s, r) => s + r.executionTimeMs, 0) / results.length;
221
+ lines.push('\n📊 SUMMARY');
222
+ lines.push('───────────────────────────────────────────────────────────────────────');
223
+ lines.push(` Benchmarks run : ${results.length}`);
224
+ lines.push(` Avg reduction vs full scan : ${avgReductionFullScan.toFixed(1)}%`);
225
+ lines.push(` Avg reduction vs top-N raw : ${avgReductionTopN.toFixed(1)}%`);
226
+ lines.push(` Avg top-1 coverage : ${(avgTop1Coverage * 100).toFixed(1)}%`);
227
+ lines.push(` Avg top-K coverage : ${(avgTopKCoverage * 100).toFixed(1)}%`);
228
+ lines.push(` Avg path intent match rate : ${(avgPathIntentMatch * 100).toFixed(1)}%`);
229
+ lines.push(` Avg execution time : ${avgTime.toFixed(0)}ms`);
230
+ lines.push('═══════════════════════════════════════════════════════════════════════\n');
231
+ return lines.join('\n');
232
+ }
233
+ /**
234
+ * Save benchmark output to JSON
235
+ */
236
+ function saveResults(results, outputPath) {
237
+ const out = {
238
+ generatedAt: new Date().toISOString(),
239
+ root: results[0]?.projectRoot ?? '',
240
+ summary: {
241
+ avgReductionVsFullScan: results.reduce((s, r) => s + r.tokenReductionVsFullScan, 0) / results.length,
242
+ avgReductionVsTopN: results.reduce((s, r) => s + r.tokenReductionVsTopN, 0) / results.length,
243
+ avgTop1KeywordCoverage: results.reduce((s, r) => s + r.top1KeywordCoverage, 0) / results.length,
244
+ avgTopKKeywordCoverage: results.reduce((s, r) => s + r.avgTopKKeywordCoverage, 0) / results.length,
245
+ avgPathIntentMatchRate: results.reduce((s, r) => s + r.pathIntentMatchRate, 0) / results.length,
246
+ avgExecutionTimeMs: results.reduce((s, r) => s + r.executionTimeMs, 0) / results.length,
247
+ },
248
+ benchmarks: results,
249
+ };
250
+ fs.writeFileSync(outputPath, JSON.stringify(out, null, 2), 'utf-8');
251
+ console.log(`\n✅ Results saved → ${outputPath}`);
252
+ }
253
+ /**
254
+ * Main entry point
255
+ */
256
+ async function runBenchmarks() {
257
+ const repoRoot = process.cwd();
258
+ // Verify repo exists
259
+ if (!fs.existsSync(repoRoot)) {
260
+ console.error(`❌ Repository not found at ${repoRoot}`);
261
+ process.exit(1);
262
+ }
263
+ const appRoot = repoRoot;
264
+ console.log('🚀 Code Analyzer — Generic Repository Benchmarks\n');
265
+ console.log(` Repo : ${repoRoot}`);
266
+ console.log(' Computing baseline (first 50 files sample)...');
267
+ const fullBaseline = sampleDirectoryTokens(appRoot, 50);
268
+ console.log(` Baseline → ${fullBaseline.fileCount} .ts files, ` +
269
+ `~${fullBaseline.totalTokens.toLocaleString()} tokens (${fullBaseline.isSampled ? 'extrapolated' : 'exact'})\n`);
270
+ const results = [];
271
+ let i = 1;
272
+ for (const scenario of exports.BENCHMARK_SCENARIOS) {
273
+ console.log(`▶ [${i}/${exports.BENCHMARK_SCENARIOS.length}] ${scenario.query} (${scenario.moduleKey})`);
274
+ results.push(await benchmarkProject(repoRoot, scenario.moduleKey, `Repo › ${scenario.moduleKey}`, scenario.query, { limit: scenario.limit, enhancedRanking: true }));
275
+ console.log(` ✓ ${results.at(-1).executionTimeMs}ms\n`);
276
+ i++;
277
+ }
278
+ // ── Output ────────────────────────────────────────────────────────────────────
279
+ console.log(formatResults(results));
280
+ // Append full-app baseline note to the formatted output
281
+ console.log(`ℹ️ Full app/ baseline (naive full-scan):`);
282
+ console.log(` ${fullBaseline.fileCount} files → ~${fullBaseline.totalTokens.toLocaleString()} tokens`);
283
+ console.log(` vs our tool avg skeleton: ~${Math.round(results.reduce((s, r) => s + r.analyzedSkeletonTokens, 0) / results.length).toLocaleString()} tokens per query\n`);
284
+ const outputPath = path.join(__dirname, '..', 'benchmark-results.json');
285
+ // Attach baseline to JSON output
286
+ const extendedResults = {
287
+ fullAppBaseline: {
288
+ root: appRoot,
289
+ fileCount: fullBaseline.fileCount,
290
+ estimatedTotalTokens: fullBaseline.totalTokens,
291
+ isSampled: fullBaseline.isSampled,
292
+ },
293
+ benchmarks: results,
294
+ };
295
+ fs.writeFileSync(outputPath, JSON.stringify(extendedResults, null, 2), 'utf-8');
296
+ console.log(`✅ Saved → ${outputPath}`);
297
+ }
298
+ // ── Run ───────────────────────────────────────────────────────────────────────
299
+ if (require.main === module) {
300
+ runBenchmarks()
301
+ .then(() => process.exit(0))
302
+ .catch(err => {
303
+ console.error('❌ Benchmark failed:', err);
304
+ process.exit(1);
305
+ });
306
+ }
307
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Caching system for code analysis results
3
+ * Uses hybrid approach: in-memory + disk cache with MD5 file validation
4
+ */
5
+ import { AnalysisResult } from './types';
6
+ export interface CacheConfig {
7
+ enabled: boolean;
8
+ inMemory: boolean;
9
+ onDisk: boolean;
10
+ cacheDir: string;
11
+ }
12
+ export interface CacheEntry {
13
+ result: AnalysisResult;
14
+ fileHashes: Record<string, string>;
15
+ createdAt: number;
16
+ expiresAt: number;
17
+ }
18
+ /**
19
+ * Default cache configuration
20
+ */
21
+ export declare const DEFAULT_CACHE_CONFIG: CacheConfig;
22
+ /**
23
+ * Cache manager for analysis results
24
+ */
25
+ export declare class CacheManager {
26
+ private config;
27
+ private memoryCache;
28
+ private stats;
29
+ constructor(config?: Partial<CacheConfig>);
30
+ /**
31
+ * Generate cache key from analysis parameters
32
+ */
33
+ private generateKey;
34
+ /**
35
+ * Calculate MD5 hash of file contents
36
+ */
37
+ private hashFile;
38
+ /**
39
+ * Hash all files in a directory (for change detection)
40
+ */
41
+ private hashFiles;
42
+ /**
43
+ * Check if cached entry is still valid (files haven't changed)
44
+ */
45
+ private isValidEntry;
46
+ /**
47
+ * Get cached result
48
+ */
49
+ get(root: string, question: string, analyzedFiles: string[], moduleKeys?: string[], enhancedRanking?: boolean, limit?: number): AnalysisResult | null;
50
+ /**
51
+ * Save result to cache
52
+ */
53
+ set(root: string, question: string, analyzedFiles: string[], result: AnalysisResult, moduleKeys?: string[], enhancedRanking?: boolean, limit?: number): void;
54
+ /**
55
+ * Load cache entry from disk
56
+ */
57
+ private loadFromDisk;
58
+ /**
59
+ * Save cache entry to disk
60
+ */
61
+ private saveToDisk;
62
+ /**
63
+ * Clear all caches
64
+ */
65
+ clear(): void;
66
+ /**
67
+ * Clear memory cache only
68
+ */
69
+ clearMemory(): void;
70
+ /**
71
+ * Get cache statistics
72
+ */
73
+ getStats(): {
74
+ hits: number;
75
+ misses: number;
76
+ invalidations: number;
77
+ hitRate: number;
78
+ cacheSize: number;
79
+ };
80
+ /**
81
+ * Get cache directory path
82
+ */
83
+ getCacheDir(): string;
84
+ }
85
+ /**
86
+ * Global cache manager instance
87
+ */
88
+ export declare let globalCacheManager: CacheManager | null;
89
+ /**
90
+ * Initialize global cache manager
91
+ */
92
+ export declare function initializeCacheManager(config?: Partial<CacheConfig>): CacheManager;
93
+ /**
94
+ * Get or create global cache manager
95
+ */
96
+ export declare function getCacheManager(): CacheManager;
97
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAKlC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,KAAK,CAIX;gBAEU,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAQ7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,EACvB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,eAAe,CAAC,EAAE,OAAO,EACzB,KAAK,CAAC,EAAE,MAAM,GACb,cAAc,GAAG,IAAI;IAmCxB;;OAEG;IACH,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,eAAe,CAAC,EAAE,OAAO,EACzB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI;IA0BP;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,UAAU;IASlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAkBb;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAsBvG;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB;AAED;;GAEG;AACH,eAAO,IAAI,kBAAkB,EAAE,YAAY,GAAG,IAAW,CAAC;AAE1D;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,YAAY,CAGlF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}