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.
- package/.eslintrc.js +22 -0
- package/README.md +109 -0
- package/dist/agent-cli.d.ts +7 -0
- package/dist/agent-cli.d.ts.map +1 -0
- package/dist/agent-cli.js +364 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent.d.ts +115 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +340 -0
- package/dist/agent.js.map +1 -0
- package/dist/benchmark.d.ts +53 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +307 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cache.d.ts +97 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +284 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +238 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/GenericAdapter.d.ts +10 -0
- package/dist/languages/GenericAdapter.d.ts.map +1 -0
- package/dist/languages/GenericAdapter.js +41 -0
- package/dist/languages/GenericAdapter.js.map +1 -0
- package/dist/languages/LanguageAdapter.d.ts +14 -0
- package/dist/languages/LanguageAdapter.d.ts.map +1 -0
- package/dist/languages/LanguageAdapter.js +3 -0
- package/dist/languages/LanguageAdapter.js.map +1 -0
- package/dist/languages/PythonAdapter.d.ts +10 -0
- package/dist/languages/PythonAdapter.d.ts.map +1 -0
- package/dist/languages/PythonAdapter.js +98 -0
- package/dist/languages/PythonAdapter.js.map +1 -0
- package/dist/languages/TypeScriptAdapter.d.ts +17 -0
- package/dist/languages/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/TypeScriptAdapter.js +321 -0
- package/dist/languages/TypeScriptAdapter.js.map +1 -0
- package/dist/languages/registry.d.ts +4 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +86 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/mapper.d.ts +49 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +386 -0
- package/dist/mapper.js.map +1 -0
- package/dist/ranker-enhanced.d.ts +37 -0
- package/dist/ranker-enhanced.d.ts.map +1 -0
- package/dist/ranker-enhanced.js +395 -0
- package/dist/ranker-enhanced.js.map +1 -0
- package/dist/ranker.d.ts +14 -0
- package/dist/ranker.d.ts.map +1 -0
- package/dist/ranker.js +105 -0
- package/dist/ranker.js.map +1 -0
- package/dist/rocket-chat-scope.d.ts +7 -0
- package/dist/rocket-chat-scope.d.ts.map +1 -0
- package/dist/rocket-chat-scope.js +95 -0
- package/dist/rocket-chat-scope.js.map +1 -0
- package/dist/scanner.d.ts +16 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +228 -0
- package/dist/scanner.js.map +1 -0
- package/dist/skeletonizer.d.ts +5 -0
- package/dist/skeletonizer.d.ts.map +1 -0
- package/dist/skeletonizer.js +52 -0
- package/dist/skeletonizer.js.map +1 -0
- package/dist/tokenizer.d.ts +9 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +21 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/gemini-extension/GEMINI.md +26 -0
- package/gemini-extension/gemini-extension.json +12 -0
- package/gemini-extension/package.json +14 -0
- package/gemini-extension/src/server.ts +63 -0
- package/gemini-extension/tsconfig.json +14 -0
- package/jest.config.js +5 -0
- package/package.json +46 -0
- package/src/agent-cli.ts +383 -0
- package/src/agent.ts +344 -0
- package/src/benchmark.ts +389 -0
- package/src/cache.ts +317 -0
- package/src/cli.ts +223 -0
- package/src/config.ts +22 -0
- package/src/index.ts +215 -0
- package/src/languages/GenericAdapter.ts +44 -0
- package/src/languages/LanguageAdapter.ts +14 -0
- package/src/languages/PythonAdapter.ts +74 -0
- package/src/languages/TypeScriptAdapter.ts +338 -0
- package/src/languages/registry.ts +49 -0
- package/src/mapper.ts +448 -0
- package/src/ranker-enhanced.ts +460 -0
- package/src/ranker.ts +92 -0
- package/src/scanner.ts +201 -0
- package/src/skeletonizer.ts +16 -0
- package/src/tokenizer.ts +20 -0
- package/src/types.ts +71 -0
- package/tests/agent.tools.test.ts +81 -0
- package/tests/benchmark.test.ts +31 -0
- package/tests/fixtures/sample.py +17 -0
- package/tests/fixtures/sample.ts +13 -0
- package/tests/fixtures/src/api/routes.ts +1 -0
- package/tests/fixtures/src/auth/permission.ts +3 -0
- package/tests/ranker-enhanced.test.ts +68 -0
- package/tests/ranker.test.ts +75 -0
- package/tests/scanner.scope.test.ts +41 -0
- package/tests/setup-fixtures.js +29 -0
- package/tests/skeletonizer.test.ts +142 -0
- package/tsconfig.json +21 -0
- package/uca-landing/index.html +17 -0
- package/uca-landing/package.json +23 -0
- package/uca-landing/postcss.config.js +6 -0
- package/uca-landing/src/App.jsx +43 -0
- package/uca-landing/src/components/AgentMode.jsx +45 -0
- package/uca-landing/src/components/CliReference.jsx +49 -0
- package/uca-landing/src/components/Features.jsx +63 -0
- package/uca-landing/src/components/Footer.jsx +35 -0
- package/uca-landing/src/components/Hero.jsx +124 -0
- package/uca-landing/src/components/HowItWorks.jsx +60 -0
- package/uca-landing/src/components/Install.jsx +90 -0
- package/uca-landing/src/components/LanguageSupport.jsx +63 -0
- package/uca-landing/src/components/Navbar.jsx +86 -0
- package/uca-landing/src/components/Problem.jsx +51 -0
- package/uca-landing/src/components/Reveal.jsx +40 -0
- package/uca-landing/src/components/WorksWith.jsx +59 -0
- package/uca-landing/src/hooks/useScrollNav.js +13 -0
- package/uca-landing/src/hooks/useTypewriter.js +41 -0
- package/uca-landing/src/index.css +13 -0
- package/uca-landing/src/main.jsx +10 -0
- package/uca-landing/tailwind.config.js +68 -0
- package/uca-landing/vite.config.js +6 -0
package/dist/cache.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Caching system for code analysis results
|
|
4
|
+
* Uses hybrid approach: in-memory + disk cache with MD5 file validation
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.globalCacheManager = exports.CacheManager = exports.DEFAULT_CACHE_CONFIG = void 0;
|
|
41
|
+
exports.initializeCacheManager = initializeCacheManager;
|
|
42
|
+
exports.getCacheManager = getCacheManager;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const crypto = __importStar(require("crypto"));
|
|
46
|
+
/**
|
|
47
|
+
* Default cache configuration
|
|
48
|
+
*/
|
|
49
|
+
exports.DEFAULT_CACHE_CONFIG = {
|
|
50
|
+
enabled: true,
|
|
51
|
+
inMemory: true,
|
|
52
|
+
onDisk: true,
|
|
53
|
+
cacheDir: path.join(process.cwd(), '.code-analyzer-cache'),
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Cache manager for analysis results
|
|
57
|
+
*/
|
|
58
|
+
class CacheManager {
|
|
59
|
+
config;
|
|
60
|
+
memoryCache = new Map();
|
|
61
|
+
stats = {
|
|
62
|
+
hits: 0,
|
|
63
|
+
misses: 0,
|
|
64
|
+
invalidations: 0,
|
|
65
|
+
};
|
|
66
|
+
constructor(config = {}) {
|
|
67
|
+
this.config = { ...exports.DEFAULT_CACHE_CONFIG, ...config };
|
|
68
|
+
if (this.config.onDisk && !fs.existsSync(this.config.cacheDir)) {
|
|
69
|
+
fs.mkdirSync(this.config.cacheDir, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate cache key from analysis parameters
|
|
74
|
+
*/
|
|
75
|
+
generateKey(root, question, moduleKeys, enhancedRanking, limit) {
|
|
76
|
+
const input = `${root}|${question}|${(moduleKeys || []).join(',')}|${enhancedRanking}|${limit}`;
|
|
77
|
+
return crypto.createHash('md5').update(input).digest('hex');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Calculate MD5 hash of file contents
|
|
81
|
+
*/
|
|
82
|
+
hashFile(filePath) {
|
|
83
|
+
try {
|
|
84
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
85
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Hash all files in a directory (for change detection)
|
|
93
|
+
*/
|
|
94
|
+
hashFiles(fileList) {
|
|
95
|
+
const hashes = {};
|
|
96
|
+
for (const filePath of fileList) {
|
|
97
|
+
const hash = this.hashFile(filePath);
|
|
98
|
+
if (hash) {
|
|
99
|
+
hashes[filePath] = hash;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return hashes;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if cached entry is still valid (files haven't changed)
|
|
106
|
+
*/
|
|
107
|
+
isValidEntry(entry, fileList) {
|
|
108
|
+
// Check expiration (24 hours)
|
|
109
|
+
if (Date.now() > entry.expiresAt) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
// Check if any files have changed
|
|
113
|
+
for (const filePath of fileList) {
|
|
114
|
+
const currentHash = this.hashFile(filePath);
|
|
115
|
+
const cachedHash = entry.fileHashes[filePath];
|
|
116
|
+
if (!currentHash || currentHash !== cachedHash) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Check if files were added/removed
|
|
121
|
+
if (Object.keys(entry.fileHashes).length !== fileList.length) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get cached result
|
|
128
|
+
*/
|
|
129
|
+
get(root, question, analyzedFiles, moduleKeys, enhancedRanking, limit) {
|
|
130
|
+
if (!this.config.enabled) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const key = this.generateKey(root, question, moduleKeys, enhancedRanking, limit);
|
|
134
|
+
// Try memory cache first
|
|
135
|
+
if (this.config.inMemory) {
|
|
136
|
+
const memEntry = this.memoryCache.get(key);
|
|
137
|
+
if (memEntry && this.isValidEntry(memEntry, analyzedFiles)) {
|
|
138
|
+
this.stats.hits++;
|
|
139
|
+
return memEntry.result;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Try disk cache
|
|
143
|
+
if (this.config.onDisk) {
|
|
144
|
+
const diskEntry = this.loadFromDisk(key);
|
|
145
|
+
if (diskEntry && this.isValidEntry(diskEntry, analyzedFiles)) {
|
|
146
|
+
this.stats.hits++;
|
|
147
|
+
// Restore to memory cache
|
|
148
|
+
if (this.config.inMemory) {
|
|
149
|
+
this.memoryCache.set(key, diskEntry);
|
|
150
|
+
}
|
|
151
|
+
return diskEntry.result;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
this.stats.misses++;
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Save result to cache
|
|
159
|
+
*/
|
|
160
|
+
set(root, question, analyzedFiles, result, moduleKeys, enhancedRanking, limit) {
|
|
161
|
+
if (!this.config.enabled) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const key = this.generateKey(root, question, moduleKeys, enhancedRanking, limit);
|
|
165
|
+
const fileHashes = this.hashFiles(analyzedFiles);
|
|
166
|
+
const entry = {
|
|
167
|
+
result,
|
|
168
|
+
fileHashes,
|
|
169
|
+
createdAt: Date.now(),
|
|
170
|
+
expiresAt: Date.now() + 24 * 60 * 60 * 1000, // 24 hours
|
|
171
|
+
};
|
|
172
|
+
// Save to memory cache
|
|
173
|
+
if (this.config.inMemory) {
|
|
174
|
+
this.memoryCache.set(key, entry);
|
|
175
|
+
}
|
|
176
|
+
// Save to disk cache
|
|
177
|
+
if (this.config.onDisk) {
|
|
178
|
+
this.saveToDisk(key, entry);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Load cache entry from disk
|
|
183
|
+
*/
|
|
184
|
+
loadFromDisk(key) {
|
|
185
|
+
try {
|
|
186
|
+
const cacheFile = path.join(this.config.cacheDir, `${key}.json`);
|
|
187
|
+
if (!fs.existsSync(cacheFile)) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const content = fs.readFileSync(cacheFile, 'utf-8');
|
|
191
|
+
return JSON.parse(content);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Save cache entry to disk
|
|
199
|
+
*/
|
|
200
|
+
saveToDisk(key, entry) {
|
|
201
|
+
try {
|
|
202
|
+
const cacheFile = path.join(this.config.cacheDir, `${key}.json`);
|
|
203
|
+
fs.writeFileSync(cacheFile, JSON.stringify(entry, null, 2), 'utf-8');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.warn(`Failed to save cache to disk: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Clear all caches
|
|
211
|
+
*/
|
|
212
|
+
clear() {
|
|
213
|
+
// Clear memory cache
|
|
214
|
+
this.memoryCache.clear();
|
|
215
|
+
// Clear disk cache
|
|
216
|
+
if (this.config.onDisk && fs.existsSync(this.config.cacheDir)) {
|
|
217
|
+
try {
|
|
218
|
+
fs.rmSync(this.config.cacheDir, { recursive: true, force: true });
|
|
219
|
+
fs.mkdirSync(this.config.cacheDir, { recursive: true });
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.warn(`Failed to clear disk cache: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Reset stats
|
|
226
|
+
this.stats = { hits: 0, misses: 0, invalidations: 0 };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Clear memory cache only
|
|
230
|
+
*/
|
|
231
|
+
clearMemory() {
|
|
232
|
+
this.memoryCache.clear();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get cache statistics
|
|
236
|
+
*/
|
|
237
|
+
getStats() {
|
|
238
|
+
const total = this.stats.hits + this.stats.misses;
|
|
239
|
+
const hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;
|
|
240
|
+
let cacheSize = 0;
|
|
241
|
+
if (this.config.onDisk && fs.existsSync(this.config.cacheDir)) {
|
|
242
|
+
const files = fs.readdirSync(this.config.cacheDir);
|
|
243
|
+
for (const file of files) {
|
|
244
|
+
const stat = fs.statSync(path.join(this.config.cacheDir, file));
|
|
245
|
+
cacheSize += stat.size;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
hits: this.stats.hits,
|
|
250
|
+
misses: this.stats.misses,
|
|
251
|
+
invalidations: this.stats.invalidations,
|
|
252
|
+
hitRate: Math.round(hitRate * 100) / 100,
|
|
253
|
+
cacheSize,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get cache directory path
|
|
258
|
+
*/
|
|
259
|
+
getCacheDir() {
|
|
260
|
+
return this.config.cacheDir;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.CacheManager = CacheManager;
|
|
264
|
+
/**
|
|
265
|
+
* Global cache manager instance
|
|
266
|
+
*/
|
|
267
|
+
exports.globalCacheManager = null;
|
|
268
|
+
/**
|
|
269
|
+
* Initialize global cache manager
|
|
270
|
+
*/
|
|
271
|
+
function initializeCacheManager(config) {
|
|
272
|
+
exports.globalCacheManager = new CacheManager(config);
|
|
273
|
+
return exports.globalCacheManager;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get or create global cache manager
|
|
277
|
+
*/
|
|
278
|
+
function getCacheManager() {
|
|
279
|
+
if (!exports.globalCacheManager) {
|
|
280
|
+
exports.globalCacheManager = new CacheManager();
|
|
281
|
+
}
|
|
282
|
+
return exports.globalCacheManager;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CLI entry point for skannr
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const index_1 = require("./index");
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const config_1 = require("./config");
|
|
43
|
+
const scanner_1 = require("./scanner");
|
|
44
|
+
/**
|
|
45
|
+
* Parse command line arguments
|
|
46
|
+
*/
|
|
47
|
+
function parseArgs() {
|
|
48
|
+
const args = process.argv.slice(2);
|
|
49
|
+
let root = process.cwd();
|
|
50
|
+
let question = '';
|
|
51
|
+
let limit = 10;
|
|
52
|
+
let limitProvided = false;
|
|
53
|
+
let generateMapping = false;
|
|
54
|
+
let mappingOutputPath;
|
|
55
|
+
let moduleKeys;
|
|
56
|
+
let lang = 'auto';
|
|
57
|
+
let skipCache = false;
|
|
58
|
+
let cacheCommand;
|
|
59
|
+
for (let i = 0; i < args.length; i++) {
|
|
60
|
+
const arg = args[i];
|
|
61
|
+
if (arg === '--root' && i + 1 < args.length) {
|
|
62
|
+
root = args[i + 1];
|
|
63
|
+
i++;
|
|
64
|
+
}
|
|
65
|
+
else if (arg === '--question' && i + 1 < args.length) {
|
|
66
|
+
question = args[i + 1];
|
|
67
|
+
i++;
|
|
68
|
+
}
|
|
69
|
+
else if (arg === '--limit' && i + 1 < args.length) {
|
|
70
|
+
limit = parseInt(args[i + 1], 10);
|
|
71
|
+
if (isNaN(limit) || limit < 1) {
|
|
72
|
+
console.error('Error: --limit must be a positive number');
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
limitProvided = true;
|
|
76
|
+
i++;
|
|
77
|
+
}
|
|
78
|
+
else if (arg === '--with-mapping') {
|
|
79
|
+
generateMapping = true;
|
|
80
|
+
}
|
|
81
|
+
else if (arg === '--mapping-output' && i + 1 < args.length) {
|
|
82
|
+
mappingOutputPath = args[i + 1];
|
|
83
|
+
generateMapping = true; // Implies mapping generation
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
else if (arg === '--modules' && i + 1 < args.length) {
|
|
87
|
+
moduleKeys = args[i + 1].split(',').map(k => k.trim());
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
else if (arg === '--lang' && i + 1 < args.length) {
|
|
91
|
+
const langArg = args[i + 1].toLowerCase();
|
|
92
|
+
if (langArg !== 'typescript' && langArg !== 'javascript' && langArg !== 'python' && langArg !== 'auto') {
|
|
93
|
+
console.error('Error: --lang must be one of: typescript, javascript, python, auto');
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
lang = langArg;
|
|
97
|
+
i++;
|
|
98
|
+
}
|
|
99
|
+
else if (arg === '--skip-cache') {
|
|
100
|
+
skipCache = true;
|
|
101
|
+
}
|
|
102
|
+
else if (arg === '--cache-clear') {
|
|
103
|
+
cacheCommand = 'clear';
|
|
104
|
+
}
|
|
105
|
+
else if (arg === '--cache-stats') {
|
|
106
|
+
cacheCommand = 'stats';
|
|
107
|
+
}
|
|
108
|
+
else if (arg === '--help' || arg === '-h') {
|
|
109
|
+
printHelp();
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.error(`Unknown argument: ${arg}`);
|
|
114
|
+
printHelp();
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Handle cache commands
|
|
119
|
+
if (cacheCommand) {
|
|
120
|
+
return { root, question: '', limit, limitProvided, generateMapping, moduleKeys, lang, cacheCommand };
|
|
121
|
+
}
|
|
122
|
+
if (!question) {
|
|
123
|
+
console.error('Error: --question is required (or use --cache-* for cache management)\n');
|
|
124
|
+
printHelp();
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return { root, question, limit, limitProvided, generateMapping, mappingOutputPath, moduleKeys, lang, skipCache };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Print help message
|
|
131
|
+
*/
|
|
132
|
+
function printHelp() {
|
|
133
|
+
console.log(`
|
|
134
|
+
uca - Universal Code Analyzer
|
|
135
|
+
|
|
136
|
+
Usage:
|
|
137
|
+
uca --question "<text>" [options]
|
|
138
|
+
uca --cache-clear # Clear all caches
|
|
139
|
+
uca --cache-stats # Show cache statistics
|
|
140
|
+
|
|
141
|
+
Options:
|
|
142
|
+
--root <path> Project root directory (default: current directory)
|
|
143
|
+
--question "<text>" Natural language question about the codebase (required)
|
|
144
|
+
--limit <number> Number of top files to analyze (default: 10)
|
|
145
|
+
--with-mapping Generate symbol mapping for on-demand retrieval
|
|
146
|
+
--modules <keys> Comma-separated module keys (auto-discovered when omitted)
|
|
147
|
+
--lang <mode> typescript | javascript | python | auto (default: auto)
|
|
148
|
+
--mapping-output <path> Custom path for mapping file (implies --with-mapping)
|
|
149
|
+
--skip-cache Skip cache and force full analysis
|
|
150
|
+
--cache-clear Clear all cached analysis results
|
|
151
|
+
--cache-stats Show cache statistics (hits, misses, size)
|
|
152
|
+
--help, -h Show this help message
|
|
153
|
+
|
|
154
|
+
Example:
|
|
155
|
+
uca --question "authentication logic" --limit 5
|
|
156
|
+
uca --root ./my-project --question "database models"
|
|
157
|
+
uca --question "API endpoints" --with-mapping
|
|
158
|
+
uca --question "permissions" --modules auth,middleware --skip-cache
|
|
159
|
+
uca --question "class structure" --lang python
|
|
160
|
+
uca --cache-stats
|
|
161
|
+
uca --cache-clear
|
|
162
|
+
|
|
163
|
+
Output:
|
|
164
|
+
JSON object with ranked files and their code skeletons
|
|
165
|
+
`);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Main CLI function
|
|
169
|
+
*/
|
|
170
|
+
async function main() {
|
|
171
|
+
const args = parseArgs();
|
|
172
|
+
if (!args) {
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
// Handle cache commands
|
|
177
|
+
if (args.cacheCommand === 'clear') {
|
|
178
|
+
const cacheManager = (0, index_1.getCacheManager)();
|
|
179
|
+
cacheManager.clear();
|
|
180
|
+
console.log('✅ Cache cleared successfully');
|
|
181
|
+
process.exit(0);
|
|
182
|
+
}
|
|
183
|
+
if (args.cacheCommand === 'stats') {
|
|
184
|
+
const cacheManager = (0, index_1.getCacheManager)();
|
|
185
|
+
const stats = cacheManager.getStats();
|
|
186
|
+
console.log('\n📊 Cache Statistics:');
|
|
187
|
+
console.log(` Hits: ${stats.hits}`);
|
|
188
|
+
console.log(` Misses: ${stats.misses}`);
|
|
189
|
+
console.log(` Hit Rate: ${stats.hitRate}%`);
|
|
190
|
+
console.log(` Cache Size: ${(stats.cacheSize / 1024).toFixed(2)} KB`);
|
|
191
|
+
console.log(` Cache Dir: ${cacheManager.getCacheDir()}\n`);
|
|
192
|
+
process.exit(0);
|
|
193
|
+
}
|
|
194
|
+
const absoluteRoot = path.resolve(args.root);
|
|
195
|
+
const config = (0, config_1.loadConfig)(absoluteRoot);
|
|
196
|
+
const moduleKeys = args.moduleKeys
|
|
197
|
+
?? (config.modules ? Object.keys(config.modules) : (0, scanner_1.discoverModules)(absoluteRoot));
|
|
198
|
+
const resolvedLimit = args.limitProvided ? args.limit : (config.defaultLimit ?? args.limit);
|
|
199
|
+
const langExtensions = resolveExtensionsForLanguage(args.lang);
|
|
200
|
+
const extensions = langExtensions ?? config.extensions;
|
|
201
|
+
const result = await (0, index_1.analyzeProject)({
|
|
202
|
+
root: absoluteRoot,
|
|
203
|
+
question: args.question,
|
|
204
|
+
limit: resolvedLimit,
|
|
205
|
+
generateMapping: args.generateMapping,
|
|
206
|
+
mappingOutputPath: args.mappingOutputPath,
|
|
207
|
+
moduleKeys,
|
|
208
|
+
moduleDefinitions: config.modules,
|
|
209
|
+
lang: args.lang,
|
|
210
|
+
skipCache: args.skipCache,
|
|
211
|
+
exclude: config.exclude,
|
|
212
|
+
extensions,
|
|
213
|
+
});
|
|
214
|
+
console.log(JSON.stringify(result, null, 2));
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error('Error analyzing project:', error instanceof Error ? error.message : error);
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Run CLI
|
|
222
|
+
main().catch((error) => {
|
|
223
|
+
console.error('Unexpected error:', error);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
});
|
|
226
|
+
function resolveExtensionsForLanguage(lang) {
|
|
227
|
+
switch (lang) {
|
|
228
|
+
case 'typescript':
|
|
229
|
+
case 'javascript':
|
|
230
|
+
return ['.ts', '.tsx', '.js', '.jsx'];
|
|
231
|
+
case 'python':
|
|
232
|
+
return ['.py', '.pyi'];
|
|
233
|
+
case 'auto':
|
|
234
|
+
default:
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAWvD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.loadConfig = loadConfig;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
function loadConfig(root) {
|
|
40
|
+
const configPath = path.join(root, 'code-analyzer.config.json');
|
|
41
|
+
if (fs.existsSync(configPath)) {
|
|
42
|
+
try {
|
|
43
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
44
|
+
return JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.warn('[config] Failed to parse code-analyzer.config.json, using defaults');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,gCAWC;AArBD,uCAAyB;AACzB,2CAA6B;AAS7B,SAAgB,UAAU,CAAC,IAAY;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main library exports for skannr
|
|
3
|
+
*/
|
|
4
|
+
import { AnalyzeOptions, AnalysisResult } from './types';
|
|
5
|
+
import { type CacheConfig } from './cache';
|
|
6
|
+
export declare function analyzeProject(options?: AnalyzeOptions & {
|
|
7
|
+
skipCache?: boolean;
|
|
8
|
+
cacheConfig?: Partial<CacheConfig>;
|
|
9
|
+
}): Promise<AnalysisResult>;
|
|
10
|
+
export { rankFiles } from './ranker';
|
|
11
|
+
export { rankFilesEnhanced } from './ranker-enhanced';
|
|
12
|
+
export { buildSkeletonForFile } from './skeletonizer';
|
|
13
|
+
export { scanTypeScriptFiles, scanRocketChatFiles, scanFiles, discoverModules } from './scanner';
|
|
14
|
+
export { countTokens } from './tokenizer';
|
|
15
|
+
export { buildSkeletonWithMapping, getSymbolDetails, saveMappingToFile, loadMappingFromFile, type SymbolMapping, type SymbolLocation, } from './mapper';
|
|
16
|
+
export type { AnalyzeOptions, AnalysisResult, FileAnalysis, RankedFile, } from './types';
|
|
17
|
+
export { CacheManager, getCacheManager, initializeCacheManager, DEFAULT_CACHE_CONFIG, type CacheConfig, type CacheEntry, } from './cache';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EACL,cAAc,EACd,cAAc,EAEf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAG5D,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,cAAc,GAAG;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAmIzB;AA2BD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,SAAS,CAAC"}
|