@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-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 { createHash } from 'crypto';
14
+ import { TreeCache } from './tree-cache.js';
15
+ import { findMinimalEdit, calculateEdit } from './incremental.js';
16
+ /**
17
+ * Incremental parsing coordinator
18
+ *
19
+ * Manages tree caching and content tracking to enable efficient
20
+ * incremental parsing when files change.
21
+ *
22
+ * Flow:
23
+ * 1. Check if content unchanged (return cached result)
24
+ * 2. Check if previous tree exists for incremental parse
25
+ * 3. Calculate edit between old and new content
26
+ * 4. Apply edit to tree and re-parse incrementally
27
+ * 5. Cache new tree for future updates
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const parser = new IncrementalParser({ maxTrees: 50 })
32
+ * const adapter = new TypeScriptAdapter()
33
+ *
34
+ * // First parse (full)
35
+ * const result1 = parser.parse('src/main.ts', content1, adapter)
36
+ * console.log(result1.wasIncremental) // false
37
+ *
38
+ * // Second parse with small change (incremental)
39
+ * const result2 = parser.parse('src/main.ts', content2, adapter)
40
+ * console.log(result2.wasIncremental) // true
41
+ * console.log(result2.durationMs) // < 100ms
42
+ *
43
+ * // Cleanup
44
+ * parser.dispose()
45
+ * ```
46
+ */
47
+ export class IncrementalParser {
48
+ treeCache;
49
+ contentCache;
50
+ cacheContent;
51
+ incrementalParses = 0;
52
+ fullParses = 0;
53
+ totalIncrementalTime = 0;
54
+ totalFullTime = 0;
55
+ constructor(options = {}) {
56
+ this.treeCache = new TreeCache({ maxTrees: options.maxTrees });
57
+ this.contentCache = new Map();
58
+ this.cacheContent = options.cacheContent ?? true;
59
+ }
60
+ /**
61
+ * Parse file, using incremental parsing if possible
62
+ *
63
+ * Automatically determines whether to use incremental or
64
+ * full parsing based on cached state.
65
+ *
66
+ * @param filePath - Path to the file
67
+ * @param content - Current file content
68
+ * @param adapter - Language adapter for parsing
69
+ * @returns Parse result with metadata
70
+ */
71
+ parse(filePath, content, adapter) {
72
+ const start = performance.now();
73
+ const contentHash = this.hashContent(content);
74
+ // Check if tree is still valid (content unchanged)
75
+ if (this.treeCache.isValid(filePath, contentHash)) {
76
+ // Content unchanged, use cached tree for extraction
77
+ const cachedTree = this.treeCache.get(filePath);
78
+ if (cachedTree) {
79
+ // Re-extract from cached tree (cheaper than full parse)
80
+ const result = adapter.parseFile(content, filePath);
81
+ const durationMs = performance.now() - start;
82
+ return {
83
+ result,
84
+ wasIncremental: true,
85
+ wasCached: true,
86
+ durationMs,
87
+ };
88
+ }
89
+ }
90
+ // Check if we can do incremental parse
91
+ const oldContent = this.contentCache.get(filePath);
92
+ const previousTree = this.treeCache.get(filePath);
93
+ if (oldContent && previousTree && this.cacheContent) {
94
+ // Try incremental parse
95
+ const edit = findMinimalEdit(oldContent, content);
96
+ if (edit) {
97
+ return this.doIncrementalParse(filePath, content, contentHash, adapter, previousTree, edit, start);
98
+ }
99
+ }
100
+ // Full parse required
101
+ return this.doFullParse(filePath, content, contentHash, adapter, start);
102
+ }
103
+ /**
104
+ * Parse file with explicit edit information
105
+ *
106
+ * Use this when edit information is already available
107
+ * (e.g., from an editor's change event).
108
+ *
109
+ * @param filePath - Path to the file
110
+ * @param content - Current file content
111
+ * @param adapter - Language adapter
112
+ * @param edit - Edit information
113
+ * @returns Parse result with metadata
114
+ */
115
+ parseWithEdit(filePath, content, adapter, edit) {
116
+ const start = performance.now();
117
+ const contentHash = this.hashContent(content);
118
+ const previousTree = this.treeCache.get(filePath);
119
+ if (previousTree) {
120
+ // Apply edit to previous tree
121
+ const result = adapter.parseIncremental(content, filePath, {
122
+ previousTree,
123
+ edit,
124
+ });
125
+ // Update caches
126
+ if (this.cacheContent) {
127
+ this.contentCache.set(filePath, content);
128
+ }
129
+ this.treeCache.set(filePath, null, contentHash); // Store hash for validation
130
+ const durationMs = performance.now() - start;
131
+ this.recordIncremental(durationMs);
132
+ return {
133
+ result,
134
+ wasIncremental: true,
135
+ wasCached: false,
136
+ durationMs,
137
+ };
138
+ }
139
+ // No previous tree, fall back to full parse
140
+ return this.doFullParse(filePath, content, contentHash, adapter, start);
141
+ }
142
+ /**
143
+ * Invalidate cache for file(s)
144
+ *
145
+ * Call this when files are deleted or externally modified.
146
+ *
147
+ * @param filePaths - Path or paths to invalidate
148
+ */
149
+ invalidate(filePaths) {
150
+ const paths = Array.isArray(filePaths) ? filePaths : [filePaths];
151
+ this.treeCache.invalidateMany(paths);
152
+ for (const path of paths) {
153
+ this.contentCache.delete(path);
154
+ }
155
+ }
156
+ /**
157
+ * Invalidate files matching a pattern
158
+ *
159
+ * @param pattern - Regex to match file paths
160
+ * @returns Number of entries invalidated
161
+ */
162
+ invalidatePattern(pattern) {
163
+ let count = this.treeCache.invalidatePattern(pattern);
164
+ for (const path of this.contentCache.keys()) {
165
+ if (pattern.test(path)) {
166
+ this.contentCache.delete(path);
167
+ count++;
168
+ }
169
+ }
170
+ return count;
171
+ }
172
+ /**
173
+ * Check if a file is cached
174
+ *
175
+ * @param filePath - Path to check
176
+ * @returns True if content and/or tree is cached
177
+ */
178
+ isCached(filePath) {
179
+ return this.treeCache.has(filePath) || this.contentCache.has(filePath);
180
+ }
181
+ /**
182
+ * Get cache statistics
183
+ */
184
+ getStats() {
185
+ return {
186
+ treeCache: this.treeCache.getStats(),
187
+ contentCacheSize: this.contentCache.size,
188
+ incrementalParses: this.incrementalParses,
189
+ fullParses: this.fullParses,
190
+ avgIncrementalTimeMs: this.incrementalParses > 0 ? this.totalIncrementalTime / this.incrementalParses : 0,
191
+ avgFullTimeMs: this.fullParses > 0 ? this.totalFullTime / this.fullParses : 0,
192
+ };
193
+ }
194
+ /**
195
+ * Reset statistics
196
+ */
197
+ resetStats() {
198
+ this.treeCache.resetStats();
199
+ this.incrementalParses = 0;
200
+ this.fullParses = 0;
201
+ this.totalIncrementalTime = 0;
202
+ this.totalFullTime = 0;
203
+ }
204
+ /**
205
+ * Clear all caches
206
+ */
207
+ clear() {
208
+ this.treeCache.clear();
209
+ this.contentCache.clear();
210
+ this.resetStats();
211
+ }
212
+ /**
213
+ * Dispose of all resources
214
+ *
215
+ * Call this when the parser is no longer needed.
216
+ */
217
+ dispose() {
218
+ this.treeCache.dispose();
219
+ this.contentCache.clear();
220
+ }
221
+ /**
222
+ * Get the underlying tree cache (for advanced use)
223
+ */
224
+ getTreeCache() {
225
+ return this.treeCache;
226
+ }
227
+ /**
228
+ * Perform incremental parse
229
+ */
230
+ doIncrementalParse(filePath, content, contentHash, adapter, previousTree, edit, startTime) {
231
+ const oldContent = this.contentCache.get(filePath);
232
+ const fileEdit = calculateEdit(oldContent, content, edit.changeStart, edit.changeEnd, edit.newText);
233
+ const result = adapter.parseIncremental(content, filePath, {
234
+ previousTree,
235
+ edit: fileEdit,
236
+ });
237
+ // Update caches
238
+ if (this.cacheContent) {
239
+ this.contentCache.set(filePath, content);
240
+ }
241
+ this.treeCache.set(filePath, null, contentHash); // Store hash for validation
242
+ const durationMs = performance.now() - startTime;
243
+ this.recordIncremental(durationMs);
244
+ return {
245
+ result,
246
+ wasIncremental: true,
247
+ wasCached: false,
248
+ durationMs,
249
+ };
250
+ }
251
+ /**
252
+ * Perform full parse
253
+ */
254
+ doFullParse(filePath, content, contentHash, adapter, startTime) {
255
+ const result = adapter.parseFile(content, filePath);
256
+ // Update caches
257
+ if (this.cacheContent) {
258
+ this.contentCache.set(filePath, content);
259
+ }
260
+ this.treeCache.set(filePath, null, contentHash); // Store hash for validation
261
+ const durationMs = performance.now() - startTime;
262
+ this.recordFull(durationMs);
263
+ return {
264
+ result,
265
+ wasIncremental: false,
266
+ wasCached: false,
267
+ durationMs,
268
+ };
269
+ }
270
+ /**
271
+ * Record incremental parse statistics
272
+ */
273
+ recordIncremental(durationMs) {
274
+ this.incrementalParses++;
275
+ this.totalIncrementalTime += durationMs;
276
+ }
277
+ /**
278
+ * Record full parse statistics
279
+ */
280
+ recordFull(durationMs) {
281
+ this.fullParses++;
282
+ this.totalFullTime += durationMs;
283
+ }
284
+ /**
285
+ * Hash content for cache validation
286
+ */
287
+ hashContent(content) {
288
+ return createHash('sha256').update(content).digest('hex').slice(0, 16);
289
+ }
290
+ }
291
+ //# sourceMappingURL=incremental-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-parser.js","sourceRoot":"","sources":["../../../src/analysis/incremental-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * SMI-1309: Incremental Parsing Support
3
+ *
4
+ * Edit tracking utilities for multi-language AST analysis.
5
+ * Enables efficient incremental parsing by detecting minimal
6
+ * edit regions between old and new content.
7
+ *
8
+ * @see docs/architecture/multi-language-analysis.md
9
+ * @module analysis/incremental
10
+ */
11
+ /**
12
+ * Position in source code (row/column)
13
+ *
14
+ * Matches tree-sitter Point interface for compatibility.
15
+ */
16
+ export interface Point {
17
+ /** Zero-based line number */
18
+ row: number;
19
+ /** Zero-based column offset (byte offset within line) */
20
+ column: number;
21
+ }
22
+ /**
23
+ * File edit information for incremental parsing
24
+ *
25
+ * Contains all information needed by tree-sitter's
26
+ * incremental parsing API to update an existing tree.
27
+ */
28
+ export interface FileEdit {
29
+ /** Byte offset where the edit starts */
30
+ startIndex: number;
31
+ /** Byte offset where the old content ends */
32
+ oldEndIndex: number;
33
+ /** Byte offset where the new content ends */
34
+ newEndIndex: number;
35
+ /** Position (row/column) where edit starts */
36
+ startPosition: Point;
37
+ /** Position where old content ended */
38
+ oldEndPosition: Point;
39
+ /** Position where new content ends */
40
+ newEndPosition: Point;
41
+ }
42
+ /**
43
+ * Simple edit diff result
44
+ *
45
+ * Represents the minimal change between two strings.
46
+ */
47
+ export interface EditDiff {
48
+ /** Index where the change starts */
49
+ changeStart: number;
50
+ /** Index where old content ends (exclusive) */
51
+ changeEnd: number;
52
+ /** New text that replaces [changeStart, changeEnd) */
53
+ newText: string;
54
+ }
55
+ /**
56
+ * Calculate file edit from content diff
57
+ *
58
+ * Converts a simple diff into the format required by
59
+ * tree-sitter's incremental parsing API.
60
+ *
61
+ * @param oldContent - Original file content
62
+ * @param newContent - Updated file content
63
+ * @param changeStart - Start index of the change
64
+ * @param changeEnd - End index in old content
65
+ * @param newText - Replacement text
66
+ * @returns FileEdit structure for tree-sitter
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const edit = calculateEdit(
71
+ * 'hello world',
72
+ * 'hello there world',
73
+ * 6, // after 'hello '
74
+ * 6, // no text removed
75
+ * 'there ' // inserted text
76
+ * )
77
+ * tree.edit(edit)
78
+ * ```
79
+ */
80
+ export declare function calculateEdit(oldContent: string, newContent: string, changeStart: number, changeEnd: number, newText: string): FileEdit;
81
+ /**
82
+ * Convert byte index to row/column position
83
+ *
84
+ * Scans through content counting newlines to determine
85
+ * the row and column for a given byte offset.
86
+ *
87
+ * @param content - File content to scan
88
+ * @param index - Byte offset to convert
89
+ * @returns Position with row and column (both zero-based)
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const pos = indexToPosition('hello\nworld', 8)
94
+ * // pos = { row: 1, column: 2 } (the 'r' in 'world')
95
+ * ```
96
+ */
97
+ export declare function indexToPosition(content: string, index: number): Point;
98
+ /**
99
+ * Convert row/column position to byte index
100
+ *
101
+ * Scans through content to find the byte offset for
102
+ * a given row and column position.
103
+ *
104
+ * @param content - File content to scan
105
+ * @param position - Position to convert
106
+ * @returns Byte offset, or content length if position is past end
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const index = positionToIndex('hello\nworld', { row: 1, column: 2 })
111
+ * // index = 8 (the 'r' in 'world')
112
+ * ```
113
+ */
114
+ export declare function positionToIndex(content: string, position: Point): number;
115
+ /**
116
+ * Find the minimal edit between two strings
117
+ *
118
+ * Uses a simple prefix/suffix matching algorithm to find
119
+ * the smallest region that changed between old and new content.
120
+ * Returns null if contents are identical.
121
+ *
122
+ * @param oldContent - Original string
123
+ * @param newContent - Modified string
124
+ * @returns EditDiff describing the change, or null if identical
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * const diff = findMinimalEdit('hello world', 'hello there world')
129
+ * // diff = { changeStart: 6, changeEnd: 6, newText: 'there ' }
130
+ *
131
+ * const same = findMinimalEdit('hello', 'hello')
132
+ * // same = null
133
+ * ```
134
+ */
135
+ export declare function findMinimalEdit(oldContent: string, newContent: string): EditDiff | null;
136
+ /**
137
+ * Merge multiple edits into a single encompassing edit
138
+ *
139
+ * Useful when multiple small edits occur and need to be
140
+ * applied as a single incremental update.
141
+ *
142
+ * Note: This is a simplistic merge that finds the bounding
143
+ * region. It may over-invalidate if edits are far apart.
144
+ *
145
+ * @param edits - Array of edits to merge
146
+ * @returns Single merged edit, or null if array is empty
147
+ *
148
+ * @example
149
+ * ```typescript
150
+ * const merged = batchEdits([
151
+ * { changeStart: 0, changeEnd: 5, newText: 'HELLO' },
152
+ * { changeStart: 10, changeEnd: 15, newText: 'WORLD' }
153
+ * ])
154
+ * // merged encompasses both edit regions
155
+ * ```
156
+ */
157
+ export declare function batchEdits(edits: EditDiff[]): EditDiff | null;
158
+ /**
159
+ * Check if an edit is a simple insertion (no deletion)
160
+ *
161
+ * @param edit - Edit to check
162
+ * @returns True if edit only inserts text
163
+ */
164
+ export declare function isInsertion(edit: EditDiff): boolean;
165
+ /**
166
+ * Check if an edit is a simple deletion (no insertion)
167
+ *
168
+ * @param edit - Edit to check
169
+ * @returns True if edit only deletes text
170
+ */
171
+ export declare function isDeletion(edit: EditDiff): boolean;
172
+ /**
173
+ * Check if an edit is a replacement (both deletion and insertion)
174
+ *
175
+ * @param edit - Edit to check
176
+ * @returns True if edit replaces text
177
+ */
178
+ export declare function isReplacement(edit: EditDiff): boolean;
179
+ /**
180
+ * Calculate the size delta of an edit
181
+ *
182
+ * @param edit - Edit to analyze
183
+ * @returns Positive for growth, negative for shrinkage, zero for same size
184
+ */
185
+ export declare function editSizeDelta(edit: EditDiff): number;
186
+ //# sourceMappingURL=incremental.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../../src/analysis/incremental.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,8CAA8C;IAC9C,aAAa,EAAE,KAAK,CAAA;IACpB,uCAAuC;IACvC,cAAc,EAAE,KAAK,CAAA;IACrB,sCAAsC;IACtC,cAAc,EAAE,KAAK,CAAA;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,CAaV;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAerE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,CAkBxE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA6BvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAoC7D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGpD"}