@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.
Files changed (233) hide show
  1. package/README.md +233 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
  4. package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
  5. package/dist/src/analysis/__tests__/incremental.test.js +515 -0
  6. package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
  7. package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
  8. package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
  9. package/dist/src/analysis/__tests__/integration.test.js +1059 -0
  10. package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
  11. package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
  12. package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
  13. package/dist/src/analysis/__tests__/metrics.test.js +369 -0
  14. package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
  15. package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
  16. package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
  17. package/dist/src/analysis/__tests__/performance.test.js +402 -0
  18. package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
  19. package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
  20. package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
  21. package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
  22. package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
  23. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
  24. package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
  25. package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
  26. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
  27. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
  28. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
  29. package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
  30. package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
  31. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
  32. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
  33. package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
  34. package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
  35. package/dist/src/analysis/adapters/base.d.ts +83 -0
  36. package/dist/src/analysis/adapters/base.d.ts.map +1 -0
  37. package/dist/src/analysis/adapters/base.js +40 -0
  38. package/dist/src/analysis/adapters/base.js.map +1 -0
  39. package/dist/src/analysis/adapters/factory.d.ts +150 -0
  40. package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
  41. package/dist/src/analysis/adapters/factory.js +244 -0
  42. package/dist/src/analysis/adapters/factory.js.map +1 -0
  43. package/dist/src/analysis/adapters/go.d.ts +131 -0
  44. package/dist/src/analysis/adapters/go.d.ts.map +1 -0
  45. package/dist/src/analysis/adapters/go.js +414 -0
  46. package/dist/src/analysis/adapters/go.js.map +1 -0
  47. package/dist/src/analysis/adapters/index.d.ts +20 -0
  48. package/dist/src/analysis/adapters/index.d.ts.map +1 -0
  49. package/dist/src/analysis/adapters/index.js +23 -0
  50. package/dist/src/analysis/adapters/index.js.map +1 -0
  51. package/dist/src/analysis/adapters/java.d.ts +154 -0
  52. package/dist/src/analysis/adapters/java.d.ts.map +1 -0
  53. package/dist/src/analysis/adapters/java.js +407 -0
  54. package/dist/src/analysis/adapters/java.js.map +1 -0
  55. package/dist/src/analysis/adapters/python.d.ts +165 -0
  56. package/dist/src/analysis/adapters/python.d.ts.map +1 -0
  57. package/dist/src/analysis/adapters/python.js +475 -0
  58. package/dist/src/analysis/adapters/python.js.map +1 -0
  59. package/dist/src/analysis/adapters/rust.d.ts +116 -0
  60. package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
  61. package/dist/src/analysis/adapters/rust.js +476 -0
  62. package/dist/src/analysis/adapters/rust.js.map +1 -0
  63. package/dist/src/analysis/adapters/typescript.d.ts +68 -0
  64. package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
  65. package/dist/src/analysis/adapters/typescript.js +79 -0
  66. package/dist/src/analysis/adapters/typescript.js.map +1 -0
  67. package/dist/src/analysis/aggregator.d.ts +193 -0
  68. package/dist/src/analysis/aggregator.d.ts.map +1 -0
  69. package/dist/src/analysis/aggregator.js +283 -0
  70. package/dist/src/analysis/aggregator.js.map +1 -0
  71. package/dist/src/analysis/cache.d.ts +180 -0
  72. package/dist/src/analysis/cache.d.ts.map +1 -0
  73. package/dist/src/analysis/cache.js +279 -0
  74. package/dist/src/analysis/cache.js.map +1 -0
  75. package/dist/src/analysis/file-streamer.d.ts +136 -0
  76. package/dist/src/analysis/file-streamer.d.ts.map +1 -0
  77. package/dist/src/analysis/file-streamer.js +291 -0
  78. package/dist/src/analysis/file-streamer.js.map +1 -0
  79. package/dist/src/analysis/incremental-parser.d.ts +186 -0
  80. package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
  81. package/dist/src/analysis/incremental-parser.js +291 -0
  82. package/dist/src/analysis/incremental-parser.js.map +1 -0
  83. package/dist/src/analysis/incremental.d.ts +186 -0
  84. package/dist/src/analysis/incremental.d.ts.map +1 -0
  85. package/dist/src/analysis/incremental.js +247 -0
  86. package/dist/src/analysis/incremental.js.map +1 -0
  87. package/dist/src/analysis/index.d.ts +25 -3
  88. package/dist/src/analysis/index.d.ts.map +1 -1
  89. package/dist/src/analysis/index.js +45 -3
  90. package/dist/src/analysis/index.js.map +1 -1
  91. package/dist/src/analysis/language-detector.d.ts +92 -0
  92. package/dist/src/analysis/language-detector.d.ts.map +1 -0
  93. package/dist/src/analysis/language-detector.js +602 -0
  94. package/dist/src/analysis/language-detector.js.map +1 -0
  95. package/dist/src/analysis/memory-monitor.d.ts +199 -0
  96. package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
  97. package/dist/src/analysis/memory-monitor.js +271 -0
  98. package/dist/src/analysis/memory-monitor.js.map +1 -0
  99. package/dist/src/analysis/metrics.d.ts +300 -0
  100. package/dist/src/analysis/metrics.d.ts.map +1 -0
  101. package/dist/src/analysis/metrics.js +537 -0
  102. package/dist/src/analysis/metrics.js.map +1 -0
  103. package/dist/src/analysis/router.d.ts +264 -0
  104. package/dist/src/analysis/router.d.ts.map +1 -0
  105. package/dist/src/analysis/router.js +398 -0
  106. package/dist/src/analysis/router.js.map +1 -0
  107. package/dist/src/analysis/tree-cache.d.ts +208 -0
  108. package/dist/src/analysis/tree-cache.d.ts.map +1 -0
  109. package/dist/src/analysis/tree-cache.js +288 -0
  110. package/dist/src/analysis/tree-cache.js.map +1 -0
  111. package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
  112. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
  113. package/dist/src/analysis/tree-sitter/manager.js +239 -0
  114. package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
  115. package/dist/src/analysis/types.d.ts +69 -6
  116. package/dist/src/analysis/types.d.ts.map +1 -1
  117. package/dist/src/analysis/types.js +23 -2
  118. package/dist/src/analysis/types.js.map +1 -1
  119. package/dist/src/analysis/worker-pool.d.ts +141 -0
  120. package/dist/src/analysis/worker-pool.d.ts.map +1 -0
  121. package/dist/src/analysis/worker-pool.js +418 -0
  122. package/dist/src/analysis/worker-pool.js.map +1 -0
  123. package/dist/src/analytics/schema.d.ts +1 -1
  124. package/dist/src/analytics/schema.d.ts.map +1 -1
  125. package/dist/src/analytics/schema.js +72 -0
  126. package/dist/src/analytics/schema.js.map +1 -1
  127. package/dist/src/api/cache.d.ts +24 -1
  128. package/dist/src/api/cache.d.ts.map +1 -1
  129. package/dist/src/api/cache.js +50 -2
  130. package/dist/src/api/cache.js.map +1 -1
  131. package/dist/src/api/client.d.ts +132 -2
  132. package/dist/src/api/client.d.ts.map +1 -1
  133. package/dist/src/api/client.js +214 -18
  134. package/dist/src/api/client.js.map +1 -1
  135. package/dist/src/api/index.d.ts +2 -0
  136. package/dist/src/api/index.d.ts.map +1 -1
  137. package/dist/src/api/index.js +7 -0
  138. package/dist/src/api/index.js.map +1 -1
  139. package/dist/src/api/types.d.ts +251 -0
  140. package/dist/src/api/types.d.ts.map +1 -0
  141. package/dist/src/api/types.js +9 -0
  142. package/dist/src/api/types.js.map +1 -0
  143. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
  144. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
  145. package/dist/src/embeddings/index.d.ts.map +1 -1
  146. package/dist/src/embeddings/index.js.map +1 -1
  147. package/dist/src/errors.d.ts +1 -0
  148. package/dist/src/errors.d.ts.map +1 -1
  149. package/dist/src/errors.js +1 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/index.d.ts +3 -3
  152. package/dist/src/index.d.ts.map +1 -1
  153. package/dist/src/index.js +4 -4
  154. package/dist/src/index.js.map +1 -1
  155. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  156. package/dist/src/repositories/IndexerRepository.js +1 -0
  157. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  158. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  159. package/dist/src/repositories/SkillRepository.js +1 -0
  160. package/dist/src/repositories/SkillRepository.js.map +1 -1
  161. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  162. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  163. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
  164. package/dist/src/repositories/quarantine/query-builder.js +1 -1
  165. package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
  166. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
  167. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  168. package/dist/src/scripts/github-import/index.js.map +1 -1
  169. package/dist/src/scripts/import-github-skills.js +1 -1
  170. package/dist/src/scripts/import-github-skills.js.map +1 -1
  171. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  172. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  173. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  174. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  175. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  176. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  177. package/dist/src/scripts/validation/index.js +1 -2
  178. package/dist/src/scripts/validation/index.js.map +1 -1
  179. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
  180. package/dist/src/scripts/validation/pipeline.js.map +1 -1
  181. package/dist/src/scripts/validation/types.d.ts +2 -2
  182. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  183. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  184. package/dist/src/services/SearchService.d.ts.map +1 -1
  185. package/dist/src/services/SearchService.js +1 -0
  186. package/dist/src/services/SearchService.js.map +1 -1
  187. package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
  188. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  189. package/dist/src/session/SessionHealthMonitor.js +1 -1
  190. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  191. package/dist/src/telemetry/index.d.ts +1 -1
  192. package/dist/src/telemetry/index.d.ts.map +1 -1
  193. package/dist/src/telemetry/index.js +2 -2
  194. package/dist/src/telemetry/index.js.map +1 -1
  195. package/dist/src/telemetry/posthog.d.ts +27 -5
  196. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  197. package/dist/src/telemetry/posthog.js +20 -5
  198. package/dist/src/telemetry/posthog.js.map +1 -1
  199. package/dist/src/types/skill.d.ts +3 -0
  200. package/dist/src/types/skill.d.ts.map +1 -1
  201. package/dist/src/types.d.ts +2 -1
  202. package/dist/src/types.d.ts.map +1 -1
  203. package/dist/src/types.js +2 -2
  204. package/dist/src/types.js.map +1 -1
  205. package/dist/tests/adapters-factory.test.d.ts +13 -0
  206. package/dist/tests/adapters-factory.test.d.ts.map +1 -0
  207. package/dist/tests/adapters-factory.test.js +308 -0
  208. package/dist/tests/adapters-factory.test.js.map +1 -0
  209. package/dist/tests/adapters-java.test.d.ts +13 -0
  210. package/dist/tests/adapters-java.test.d.ts.map +1 -0
  211. package/dist/tests/adapters-java.test.js +925 -0
  212. package/dist/tests/adapters-java.test.js.map +1 -0
  213. package/dist/tests/api/client.validation.test.d.ts +7 -0
  214. package/dist/tests/api/client.validation.test.d.ts.map +1 -0
  215. package/dist/tests/api/client.validation.test.js +183 -0
  216. package/dist/tests/api/client.validation.test.js.map +1 -0
  217. package/dist/tests/language-detector.test.d.ts +13 -0
  218. package/dist/tests/language-detector.test.d.ts.map +1 -0
  219. package/dist/tests/language-detector.test.js +674 -0
  220. package/dist/tests/language-detector.test.js.map +1 -0
  221. package/dist/tests/telemetry/posthog.test.d.ts +13 -0
  222. package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
  223. package/dist/tests/telemetry/posthog.test.js +600 -0
  224. package/dist/tests/telemetry/posthog.test.js.map +1 -0
  225. package/package.json +5 -6
  226. package/dist/src/security/RateLimiter.d.ts +0 -337
  227. package/dist/src/security/RateLimiter.d.ts.map +0 -1
  228. package/dist/src/security/RateLimiter.js +0 -782
  229. package/dist/src/security/RateLimiter.js.map +0 -1
  230. package/dist/src/security/scanner.d.ts +0 -151
  231. package/dist/src/security/scanner.d.ts.map +0 -1
  232. package/dist/src/security/scanner.js +0 -599
  233. 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"}