@skillsmith/core 0.2.0 → 2.0.0
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/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1308: File Streamer
|
|
3
|
+
*
|
|
4
|
+
* Memory-efficient file reading with streaming support for large files.
|
|
5
|
+
* Provides generators for processing files without loading all into memory.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @module analysis/file-streamer
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'fs/promises';
|
|
11
|
+
import { createReadStream } from 'fs';
|
|
12
|
+
/**
|
|
13
|
+
* Stream files with memory-efficient chunking
|
|
14
|
+
*
|
|
15
|
+
* Uses async generators to process files one at a time,
|
|
16
|
+
* avoiding loading all file contents into memory.
|
|
17
|
+
*
|
|
18
|
+
* @param filePaths - Array of file paths to stream
|
|
19
|
+
* @param options - Streaming options
|
|
20
|
+
* @yields FileContent objects
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* for await (const file of streamFiles(paths, { maxBufferSize: 512 * 1024 })) {
|
|
25
|
+
* console.log(`${file.path}: ${file.lineCount} lines`)
|
|
26
|
+
* // Process file.content...
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export async function* streamFiles(filePaths, options = {}) {
|
|
31
|
+
const { maxBufferSize = 1024 * 1024, skipLargeFiles = true, includeBinary = false } = options;
|
|
32
|
+
for (const filePath of filePaths) {
|
|
33
|
+
try {
|
|
34
|
+
const stat = await fs.stat(filePath);
|
|
35
|
+
// Skip directories
|
|
36
|
+
if (stat.isDirectory()) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Handle large files
|
|
40
|
+
if (stat.size > maxBufferSize) {
|
|
41
|
+
if (skipLargeFiles) {
|
|
42
|
+
// Skip files larger than buffer (likely generated/minified)
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Stream large files (read only first chunk)
|
|
46
|
+
yield* streamLargeFile(filePath, maxBufferSize);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Read small files directly
|
|
50
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
51
|
+
// Skip binary files unless requested
|
|
52
|
+
if (!includeBinary && isBinaryContent(content)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
yield {
|
|
56
|
+
path: filePath,
|
|
57
|
+
content,
|
|
58
|
+
size: stat.size,
|
|
59
|
+
lineCount: countLines(content),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Skip files that can't be read (permissions, symlinks, etc.)
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stream a large file in chunks
|
|
70
|
+
*
|
|
71
|
+
* Reads only the first chunk of the file for analysis.
|
|
72
|
+
* Large files are often generated or minified, so we only
|
|
73
|
+
* need the beginning for pattern detection.
|
|
74
|
+
*
|
|
75
|
+
* @param filePath - Path to the large file
|
|
76
|
+
* @param maxBufferSize - Maximum bytes to read
|
|
77
|
+
* @yields Single FileContent with truncated content
|
|
78
|
+
*/
|
|
79
|
+
async function* streamLargeFile(filePath, maxBufferSize) {
|
|
80
|
+
const content = await new Promise((resolve, reject) => {
|
|
81
|
+
const chunks = [];
|
|
82
|
+
let totalSize = 0;
|
|
83
|
+
const stream = createReadStream(filePath, {
|
|
84
|
+
highWaterMark: Math.min(maxBufferSize, 64 * 1024), // 64KB chunks
|
|
85
|
+
});
|
|
86
|
+
stream.on('data', (chunk) => {
|
|
87
|
+
const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
88
|
+
if (totalSize < maxBufferSize) {
|
|
89
|
+
chunks.push(buffer);
|
|
90
|
+
totalSize += buffer.length;
|
|
91
|
+
}
|
|
92
|
+
if (totalSize >= maxBufferSize) {
|
|
93
|
+
stream.destroy();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
stream.on('end', () => {
|
|
97
|
+
resolve(Buffer.concat(chunks).toString('utf-8'));
|
|
98
|
+
});
|
|
99
|
+
stream.on('error', reject);
|
|
100
|
+
stream.on('close', () => {
|
|
101
|
+
resolve(Buffer.concat(chunks).toString('utf-8'));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const stat = await fs.stat(filePath);
|
|
105
|
+
const actualSize = Math.min(stat.size, maxBufferSize);
|
|
106
|
+
yield {
|
|
107
|
+
path: filePath,
|
|
108
|
+
content,
|
|
109
|
+
size: actualSize,
|
|
110
|
+
lineCount: countLines(content),
|
|
111
|
+
truncated: stat.size > maxBufferSize,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Batch file reading with concurrency control
|
|
116
|
+
*
|
|
117
|
+
* Reads multiple files concurrently with a configurable limit
|
|
118
|
+
* to balance speed and memory usage.
|
|
119
|
+
*
|
|
120
|
+
* @param filePaths - Array of file paths to read
|
|
121
|
+
* @param options - Batch reading options
|
|
122
|
+
* @returns Array of file contents
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const files = await batchReadFiles(paths, {
|
|
127
|
+
* concurrency: 20,
|
|
128
|
+
* maxFileSize: 512 * 1024
|
|
129
|
+
* })
|
|
130
|
+
*
|
|
131
|
+
* console.log(`Read ${files.length} files`)
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export async function batchReadFiles(filePaths, options = {}) {
|
|
135
|
+
const { concurrency = 10, maxFileSize = 1024 * 1024, skipErrors = true } = options;
|
|
136
|
+
const results = [];
|
|
137
|
+
// Process in batches
|
|
138
|
+
for (let i = 0; i < filePaths.length; i += concurrency) {
|
|
139
|
+
const batch = filePaths.slice(i, i + concurrency);
|
|
140
|
+
const batchResults = await Promise.all(batch.map(async (filePath) => {
|
|
141
|
+
try {
|
|
142
|
+
const stat = await fs.stat(filePath);
|
|
143
|
+
// Skip directories and large files
|
|
144
|
+
if (stat.isDirectory() || stat.size > maxFileSize) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
148
|
+
// Skip binary content
|
|
149
|
+
if (isBinaryContent(content)) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
path: filePath,
|
|
154
|
+
content,
|
|
155
|
+
size: stat.size,
|
|
156
|
+
lineCount: countLines(content),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (skipErrors) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
for (const result of batchResults) {
|
|
167
|
+
if (result) {
|
|
168
|
+
results.push(result);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return results;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Read files as a map for quick lookup
|
|
176
|
+
*
|
|
177
|
+
* @param filePaths - Array of file paths to read
|
|
178
|
+
* @param options - Batch reading options
|
|
179
|
+
* @returns Map of path to file content
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const fileMap = await readFilesAsMap(paths)
|
|
184
|
+
* const content = fileMap.get('src/index.ts')
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
export async function readFilesAsMap(filePaths, options = {}) {
|
|
188
|
+
const files = await batchReadFiles(filePaths, options);
|
|
189
|
+
const map = new Map();
|
|
190
|
+
for (const file of files) {
|
|
191
|
+
map.set(file.path, file);
|
|
192
|
+
}
|
|
193
|
+
return map;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Count lines in content
|
|
197
|
+
*
|
|
198
|
+
* @param content - File content
|
|
199
|
+
* @returns Number of lines
|
|
200
|
+
*/
|
|
201
|
+
function countLines(content) {
|
|
202
|
+
if (!content)
|
|
203
|
+
return 0;
|
|
204
|
+
let count = 1;
|
|
205
|
+
for (let i = 0; i < content.length; i++) {
|
|
206
|
+
if (content[i] === '\n') {
|
|
207
|
+
count++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return count;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if content appears to be binary
|
|
214
|
+
*
|
|
215
|
+
* Detects binary content by looking for null bytes
|
|
216
|
+
* in the first 8KB of the file.
|
|
217
|
+
*
|
|
218
|
+
* @param content - Content to check
|
|
219
|
+
* @returns True if content appears binary
|
|
220
|
+
*/
|
|
221
|
+
function isBinaryContent(content) {
|
|
222
|
+
// Check first 8KB for null bytes
|
|
223
|
+
const checkLength = Math.min(content.length, 8192);
|
|
224
|
+
for (let i = 0; i < checkLength; i++) {
|
|
225
|
+
if (content.charCodeAt(i) === 0) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get file extension
|
|
233
|
+
*
|
|
234
|
+
* @param filePath - File path
|
|
235
|
+
* @returns Extension including dot, or empty string
|
|
236
|
+
*/
|
|
237
|
+
export function getFileExtension(filePath) {
|
|
238
|
+
const lastDot = filePath.lastIndexOf('.');
|
|
239
|
+
const lastSep = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\'));
|
|
240
|
+
if (lastDot > lastSep && lastDot > 0) {
|
|
241
|
+
return filePath.slice(lastDot).toLowerCase();
|
|
242
|
+
}
|
|
243
|
+
return '';
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Filter paths by extension
|
|
247
|
+
*
|
|
248
|
+
* @param filePaths - Array of file paths
|
|
249
|
+
* @param extensions - Extensions to include (with dot)
|
|
250
|
+
* @returns Filtered paths
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const tsPaths = filterByExtension(allPaths, ['.ts', '.tsx'])
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
export function filterByExtension(filePaths, extensions) {
|
|
258
|
+
const extSet = new Set(extensions.map((e) => e.toLowerCase()));
|
|
259
|
+
return filePaths.filter((p) => extSet.has(getFileExtension(p)));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Estimate memory usage for files
|
|
263
|
+
*
|
|
264
|
+
* Provides rough estimate based on file sizes.
|
|
265
|
+
*
|
|
266
|
+
* @param filePaths - Array of file paths
|
|
267
|
+
* @returns Estimated memory usage in bytes
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* ```typescript
|
|
271
|
+
* const estimate = await estimateMemoryUsage(paths)
|
|
272
|
+
* console.log(`Estimated: ${MemoryMonitor.formatBytes(estimate)}`)
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
export async function estimateMemoryUsage(filePaths) {
|
|
276
|
+
let total = 0;
|
|
277
|
+
for (const filePath of filePaths) {
|
|
278
|
+
try {
|
|
279
|
+
const stat = await fs.stat(filePath);
|
|
280
|
+
if (stat.isFile()) {
|
|
281
|
+
// Rough estimate: content + metadata overhead
|
|
282
|
+
total += stat.size + 200;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// Skip files that can't be stat'd
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return total;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=file-streamer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-streamer.js","sourceRoot":"","sources":["../../../src/analysis/file-streamer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1309: Incremental Parser Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates incremental parsing across language adapters.
|
|
5
|
+
* Uses tree caching to enable fast re-parsing when only
|
|
6
|
+
* small portions of files change.
|
|
7
|
+
*
|
|
8
|
+
* Performance target: < 100ms for incremental parse
|
|
9
|
+
*
|
|
10
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
11
|
+
* @module analysis/incremental-parser
|
|
12
|
+
*/
|
|
13
|
+
import { TreeCache, type TreeCacheStats } from './tree-cache.js';
|
|
14
|
+
import { type FileEdit } from './incremental.js';
|
|
15
|
+
import type { ParseResult } from './types.js';
|
|
16
|
+
import type { LanguageAdapter } from './adapters/base.js';
|
|
17
|
+
/**
|
|
18
|
+
* Result of an incremental parse operation
|
|
19
|
+
*/
|
|
20
|
+
export interface IncrementalParseResult {
|
|
21
|
+
/** The parse result (imports, exports, functions) */
|
|
22
|
+
result: ParseResult;
|
|
23
|
+
/** True if incremental parsing was used */
|
|
24
|
+
wasIncremental: boolean;
|
|
25
|
+
/** Parse duration in milliseconds */
|
|
26
|
+
durationMs: number;
|
|
27
|
+
/** True if result came from cache */
|
|
28
|
+
wasCached: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options for IncrementalParser
|
|
32
|
+
*/
|
|
33
|
+
export interface IncrementalParserOptions {
|
|
34
|
+
/** Maximum trees to cache (default: 100) */
|
|
35
|
+
maxTrees?: number;
|
|
36
|
+
/** Enable content caching for unchanged files */
|
|
37
|
+
cacheContent?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Statistics for incremental parser
|
|
41
|
+
*/
|
|
42
|
+
export interface IncrementalParserStats {
|
|
43
|
+
/** Tree cache statistics */
|
|
44
|
+
treeCache: TreeCacheStats;
|
|
45
|
+
/** Number of files with cached content */
|
|
46
|
+
contentCacheSize: number;
|
|
47
|
+
/** Total incremental parses performed */
|
|
48
|
+
incrementalParses: number;
|
|
49
|
+
/** Total full parses performed */
|
|
50
|
+
fullParses: number;
|
|
51
|
+
/** Average incremental parse time in ms */
|
|
52
|
+
avgIncrementalTimeMs: number;
|
|
53
|
+
/** Average full parse time in ms */
|
|
54
|
+
avgFullTimeMs: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Incremental parsing coordinator
|
|
58
|
+
*
|
|
59
|
+
* Manages tree caching and content tracking to enable efficient
|
|
60
|
+
* incremental parsing when files change.
|
|
61
|
+
*
|
|
62
|
+
* Flow:
|
|
63
|
+
* 1. Check if content unchanged (return cached result)
|
|
64
|
+
* 2. Check if previous tree exists for incremental parse
|
|
65
|
+
* 3. Calculate edit between old and new content
|
|
66
|
+
* 4. Apply edit to tree and re-parse incrementally
|
|
67
|
+
* 5. Cache new tree for future updates
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const parser = new IncrementalParser({ maxTrees: 50 })
|
|
72
|
+
* const adapter = new TypeScriptAdapter()
|
|
73
|
+
*
|
|
74
|
+
* // First parse (full)
|
|
75
|
+
* const result1 = parser.parse('src/main.ts', content1, adapter)
|
|
76
|
+
* console.log(result1.wasIncremental) // false
|
|
77
|
+
*
|
|
78
|
+
* // Second parse with small change (incremental)
|
|
79
|
+
* const result2 = parser.parse('src/main.ts', content2, adapter)
|
|
80
|
+
* console.log(result2.wasIncremental) // true
|
|
81
|
+
* console.log(result2.durationMs) // < 100ms
|
|
82
|
+
*
|
|
83
|
+
* // Cleanup
|
|
84
|
+
* parser.dispose()
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare class IncrementalParser {
|
|
88
|
+
private readonly treeCache;
|
|
89
|
+
private readonly contentCache;
|
|
90
|
+
private readonly cacheContent;
|
|
91
|
+
private incrementalParses;
|
|
92
|
+
private fullParses;
|
|
93
|
+
private totalIncrementalTime;
|
|
94
|
+
private totalFullTime;
|
|
95
|
+
constructor(options?: IncrementalParserOptions);
|
|
96
|
+
/**
|
|
97
|
+
* Parse file, using incremental parsing if possible
|
|
98
|
+
*
|
|
99
|
+
* Automatically determines whether to use incremental or
|
|
100
|
+
* full parsing based on cached state.
|
|
101
|
+
*
|
|
102
|
+
* @param filePath - Path to the file
|
|
103
|
+
* @param content - Current file content
|
|
104
|
+
* @param adapter - Language adapter for parsing
|
|
105
|
+
* @returns Parse result with metadata
|
|
106
|
+
*/
|
|
107
|
+
parse(filePath: string, content: string, adapter: LanguageAdapter): IncrementalParseResult;
|
|
108
|
+
/**
|
|
109
|
+
* Parse file with explicit edit information
|
|
110
|
+
*
|
|
111
|
+
* Use this when edit information is already available
|
|
112
|
+
* (e.g., from an editor's change event).
|
|
113
|
+
*
|
|
114
|
+
* @param filePath - Path to the file
|
|
115
|
+
* @param content - Current file content
|
|
116
|
+
* @param adapter - Language adapter
|
|
117
|
+
* @param edit - Edit information
|
|
118
|
+
* @returns Parse result with metadata
|
|
119
|
+
*/
|
|
120
|
+
parseWithEdit(filePath: string, content: string, adapter: LanguageAdapter, edit: FileEdit): IncrementalParseResult;
|
|
121
|
+
/**
|
|
122
|
+
* Invalidate cache for file(s)
|
|
123
|
+
*
|
|
124
|
+
* Call this when files are deleted or externally modified.
|
|
125
|
+
*
|
|
126
|
+
* @param filePaths - Path or paths to invalidate
|
|
127
|
+
*/
|
|
128
|
+
invalidate(filePaths: string | string[]): void;
|
|
129
|
+
/**
|
|
130
|
+
* Invalidate files matching a pattern
|
|
131
|
+
*
|
|
132
|
+
* @param pattern - Regex to match file paths
|
|
133
|
+
* @returns Number of entries invalidated
|
|
134
|
+
*/
|
|
135
|
+
invalidatePattern(pattern: RegExp): number;
|
|
136
|
+
/**
|
|
137
|
+
* Check if a file is cached
|
|
138
|
+
*
|
|
139
|
+
* @param filePath - Path to check
|
|
140
|
+
* @returns True if content and/or tree is cached
|
|
141
|
+
*/
|
|
142
|
+
isCached(filePath: string): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Get cache statistics
|
|
145
|
+
*/
|
|
146
|
+
getStats(): IncrementalParserStats;
|
|
147
|
+
/**
|
|
148
|
+
* Reset statistics
|
|
149
|
+
*/
|
|
150
|
+
resetStats(): void;
|
|
151
|
+
/**
|
|
152
|
+
* Clear all caches
|
|
153
|
+
*/
|
|
154
|
+
clear(): void;
|
|
155
|
+
/**
|
|
156
|
+
* Dispose of all resources
|
|
157
|
+
*
|
|
158
|
+
* Call this when the parser is no longer needed.
|
|
159
|
+
*/
|
|
160
|
+
dispose(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Get the underlying tree cache (for advanced use)
|
|
163
|
+
*/
|
|
164
|
+
getTreeCache(): TreeCache;
|
|
165
|
+
/**
|
|
166
|
+
* Perform incremental parse
|
|
167
|
+
*/
|
|
168
|
+
private doIncrementalParse;
|
|
169
|
+
/**
|
|
170
|
+
* Perform full parse
|
|
171
|
+
*/
|
|
172
|
+
private doFullParse;
|
|
173
|
+
/**
|
|
174
|
+
* Record incremental parse statistics
|
|
175
|
+
*/
|
|
176
|
+
private recordIncremental;
|
|
177
|
+
/**
|
|
178
|
+
* Record full parse statistics
|
|
179
|
+
*/
|
|
180
|
+
private recordFull;
|
|
181
|
+
/**
|
|
182
|
+
* Hash content for cache validation
|
|
183
|
+
*/
|
|
184
|
+
private hashContent;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=incremental-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-parser.d.ts","sourceRoot":"","sources":["../../../src/analysis/incremental-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAkC,KAAK,QAAQ,EAAiB,MAAM,kBAAkB,CAAA;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,MAAM,EAAE,WAAW,CAAA;IACnB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAA;IACvB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,SAAS,EAAE,cAAc,CAAA;IACzB,0CAA0C;IAC1C,gBAAgB,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAA;IACzB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,oBAAoB,EAAE,MAAM,CAAA;IAC5B,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,aAAa,CAAI;gBAEb,OAAO,GAAE,wBAA6B;IAMlD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,sBAAsB;IA6C1F;;;;;;;;;;;OAWG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,QAAQ,GACb,sBAAsB;IAiCzB;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAQ9C;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAW1C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,QAAQ,IAAI,sBAAsB;IAYlC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"}
|