@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,208 @@
1
+ /**
2
+ * SMI-1309: Tree Cache for Incremental Parsing
3
+ *
4
+ * LRU cache for parsed AST trees to enable fast incremental updates.
5
+ * Manages tree lifecycle independently from parse result caching.
6
+ *
7
+ * Tree-sitter trees hold native resources and must be explicitly
8
+ * deleted to free memory. This cache handles that lifecycle.
9
+ *
10
+ * @see docs/architecture/multi-language-analysis.md
11
+ * @module analysis/tree-cache
12
+ */
13
+ /**
14
+ * Cached tree entry with metadata
15
+ */
16
+ export interface CachedTree {
17
+ /** Tree-sitter Tree object (typed as unknown for flexibility) */
18
+ tree: unknown;
19
+ /** Version number for LRU tracking */
20
+ version: number;
21
+ /** SHA-256 hash prefix of content (for validation) */
22
+ contentHash: string;
23
+ /** Timestamp when entry was created */
24
+ createdAt: number;
25
+ }
26
+ /**
27
+ * Cache statistics for monitoring
28
+ */
29
+ export interface TreeCacheStats {
30
+ /** Current number of cached trees */
31
+ size: number;
32
+ /** Maximum trees allowed */
33
+ maxSize: number;
34
+ /** Hit rate (0-1) since last reset */
35
+ hitRate: number;
36
+ /** Oldest tree version in cache */
37
+ oldestVersion: number;
38
+ /** Newest tree version in cache */
39
+ newestVersion: number;
40
+ }
41
+ /**
42
+ * Options for TreeCache
43
+ */
44
+ export interface TreeCacheOptions {
45
+ /** Maximum number of trees to cache (default: 100) */
46
+ maxTrees?: number;
47
+ }
48
+ /**
49
+ * LRU cache for parsed AST trees
50
+ *
51
+ * Manages tree-sitter tree instances with proper lifecycle handling.
52
+ * Trees require explicit deletion to free native memory.
53
+ *
54
+ * Separate from ParseCache because:
55
+ * 1. Trees have native resources requiring explicit cleanup
56
+ * 2. Tree reuse enables incremental parsing
57
+ * 3. Different eviction strategies may be optimal
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const cache = new TreeCache({ maxTrees: 50 })
62
+ *
63
+ * // Store tree after initial parse
64
+ * const tree = parser.parse(content)
65
+ * cache.set('src/main.ts', tree, hashContent(content))
66
+ *
67
+ * // Later, check if tree is valid for incremental parse
68
+ * if (cache.isValid('src/main.ts', hashContent(newContent))) {
69
+ * // Use cached tree as base
70
+ * const oldTree = cache.get('src/main.ts')
71
+ * oldTree.edit(editInfo)
72
+ * const newTree = parser.parse(newContent, oldTree)
73
+ * }
74
+ *
75
+ * // Cleanup
76
+ * cache.dispose()
77
+ * ```
78
+ */
79
+ export declare class TreeCache {
80
+ private trees;
81
+ private readonly maxTrees;
82
+ private version;
83
+ private hits;
84
+ private misses;
85
+ constructor(options?: TreeCacheOptions);
86
+ /**
87
+ * Get cached tree for a file
88
+ *
89
+ * Returns null if no tree is cached for the path.
90
+ * Updates hit/miss statistics.
91
+ *
92
+ * @param filePath - Path to look up
93
+ * @returns Cached tree or null
94
+ */
95
+ get(filePath: string): unknown | null;
96
+ /**
97
+ * Get full cache entry with metadata
98
+ *
99
+ * @param filePath - Path to look up
100
+ * @returns Full cache entry or undefined
101
+ */
102
+ getEntry(filePath: string): CachedTree | undefined;
103
+ /**
104
+ * Check if cached tree is valid for content
105
+ *
106
+ * Compares content hash to detect if the cached tree
107
+ * can be used as a base for incremental parsing.
108
+ *
109
+ * @param filePath - Path to check
110
+ * @param contentHash - Hash of current content
111
+ * @returns True if tree matches content
112
+ */
113
+ isValid(filePath: string, contentHash: string): boolean;
114
+ /**
115
+ * Get version number for a cached tree
116
+ *
117
+ * @param filePath - Path to look up
118
+ * @returns Version number or null if not cached
119
+ */
120
+ getVersion(filePath: string): number | null;
121
+ /**
122
+ * Store a tree in cache
123
+ *
124
+ * Evicts oldest entry if at capacity.
125
+ * Properly deletes existing tree before replacement.
126
+ *
127
+ * @param filePath - File path as cache key
128
+ * @param tree - Tree-sitter tree to cache
129
+ * @param contentHash - Hash of content tree was parsed from
130
+ */
131
+ set(filePath: string, tree: unknown, contentHash: string): void;
132
+ /**
133
+ * Invalidate cached tree for a file
134
+ *
135
+ * Deletes tree to free native memory.
136
+ *
137
+ * @param filePath - Path to invalidate
138
+ */
139
+ invalidate(filePath: string): void;
140
+ /**
141
+ * Invalidate multiple files
142
+ *
143
+ * @param filePaths - Paths to invalidate
144
+ */
145
+ invalidateMany(filePaths: string[]): void;
146
+ /**
147
+ * Invalidate files matching a pattern
148
+ *
149
+ * @param pattern - Regex pattern to match file paths
150
+ * @returns Number of entries invalidated
151
+ */
152
+ invalidatePattern(pattern: RegExp): number;
153
+ /**
154
+ * Check if a file has a cached tree
155
+ *
156
+ * @param filePath - Path to check
157
+ * @returns True if tree is cached
158
+ */
159
+ has(filePath: string): boolean;
160
+ /**
161
+ * Get current cache size
162
+ */
163
+ get size(): number;
164
+ /**
165
+ * Get cache statistics
166
+ *
167
+ * @returns Current cache statistics
168
+ */
169
+ getStats(): TreeCacheStats;
170
+ /**
171
+ * Reset hit/miss counters
172
+ */
173
+ resetStats(): void;
174
+ /**
175
+ * Clear all cached trees
176
+ *
177
+ * Properly deletes all trees to free native resources.
178
+ */
179
+ clear(): void;
180
+ /**
181
+ * Dispose of cache and free all resources
182
+ *
183
+ * Call this when the cache is no longer needed.
184
+ */
185
+ dispose(): void;
186
+ /**
187
+ * Get list of all cached file paths
188
+ */
189
+ keys(): string[];
190
+ /**
191
+ * Hash content for cache validation
192
+ *
193
+ * @param content - Content to hash
194
+ * @returns SHA-256 hash prefix (16 chars)
195
+ */
196
+ static hashContent(content: string): string;
197
+ /**
198
+ * Evict the oldest entry from cache
199
+ */
200
+ private evictOldest;
201
+ /**
202
+ * Safely delete a tree object
203
+ *
204
+ * Handles trees that may or may not have a delete method.
205
+ */
206
+ private deleteTree;
207
+ }
208
+ //# sourceMappingURL=tree-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cache.d.ts","sourceRoot":"","sources":["../../../src/analysis/tree-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAA;IACb,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;gBAEN,OAAO,GAAE,gBAAqB;IAI1C;;;;;;;;OAQG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAUrC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIlD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAKvD;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI3C;;;;;;;;;OASG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAqB/D;;;;;;OAMG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQlC;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAMzC;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAW1C;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,QAAQ,IAAI,cAAc;IAmB1B;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IASb;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAYnB"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * SMI-1309: Tree Cache for Incremental Parsing
3
+ *
4
+ * LRU cache for parsed AST trees to enable fast incremental updates.
5
+ * Manages tree lifecycle independently from parse result caching.
6
+ *
7
+ * Tree-sitter trees hold native resources and must be explicitly
8
+ * deleted to free memory. This cache handles that lifecycle.
9
+ *
10
+ * @see docs/architecture/multi-language-analysis.md
11
+ * @module analysis/tree-cache
12
+ */
13
+ import { createHash } from 'crypto';
14
+ /**
15
+ * LRU cache for parsed AST trees
16
+ *
17
+ * Manages tree-sitter tree instances with proper lifecycle handling.
18
+ * Trees require explicit deletion to free native memory.
19
+ *
20
+ * Separate from ParseCache because:
21
+ * 1. Trees have native resources requiring explicit cleanup
22
+ * 2. Tree reuse enables incremental parsing
23
+ * 3. Different eviction strategies may be optimal
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const cache = new TreeCache({ maxTrees: 50 })
28
+ *
29
+ * // Store tree after initial parse
30
+ * const tree = parser.parse(content)
31
+ * cache.set('src/main.ts', tree, hashContent(content))
32
+ *
33
+ * // Later, check if tree is valid for incremental parse
34
+ * if (cache.isValid('src/main.ts', hashContent(newContent))) {
35
+ * // Use cached tree as base
36
+ * const oldTree = cache.get('src/main.ts')
37
+ * oldTree.edit(editInfo)
38
+ * const newTree = parser.parse(newContent, oldTree)
39
+ * }
40
+ *
41
+ * // Cleanup
42
+ * cache.dispose()
43
+ * ```
44
+ */
45
+ export class TreeCache {
46
+ trees = new Map();
47
+ maxTrees;
48
+ version = 0;
49
+ hits = 0;
50
+ misses = 0;
51
+ constructor(options = {}) {
52
+ this.maxTrees = options.maxTrees ?? 100;
53
+ }
54
+ /**
55
+ * Get cached tree for a file
56
+ *
57
+ * Returns null if no tree is cached for the path.
58
+ * Updates hit/miss statistics.
59
+ *
60
+ * @param filePath - Path to look up
61
+ * @returns Cached tree or null
62
+ */
63
+ get(filePath) {
64
+ const entry = this.trees.get(filePath);
65
+ if (entry) {
66
+ this.hits++;
67
+ return entry.tree;
68
+ }
69
+ this.misses++;
70
+ return null;
71
+ }
72
+ /**
73
+ * Get full cache entry with metadata
74
+ *
75
+ * @param filePath - Path to look up
76
+ * @returns Full cache entry or undefined
77
+ */
78
+ getEntry(filePath) {
79
+ return this.trees.get(filePath);
80
+ }
81
+ /**
82
+ * Check if cached tree is valid for content
83
+ *
84
+ * Compares content hash to detect if the cached tree
85
+ * can be used as a base for incremental parsing.
86
+ *
87
+ * @param filePath - Path to check
88
+ * @param contentHash - Hash of current content
89
+ * @returns True if tree matches content
90
+ */
91
+ isValid(filePath, contentHash) {
92
+ const entry = this.trees.get(filePath);
93
+ return entry?.contentHash === contentHash;
94
+ }
95
+ /**
96
+ * Get version number for a cached tree
97
+ *
98
+ * @param filePath - Path to look up
99
+ * @returns Version number or null if not cached
100
+ */
101
+ getVersion(filePath) {
102
+ return this.trees.get(filePath)?.version ?? null;
103
+ }
104
+ /**
105
+ * Store a tree in cache
106
+ *
107
+ * Evicts oldest entry if at capacity.
108
+ * Properly deletes existing tree before replacement.
109
+ *
110
+ * @param filePath - File path as cache key
111
+ * @param tree - Tree-sitter tree to cache
112
+ * @param contentHash - Hash of content tree was parsed from
113
+ */
114
+ set(filePath, tree, contentHash) {
115
+ // Evict oldest if at capacity and this is a new entry
116
+ if (this.trees.size >= this.maxTrees && !this.trees.has(filePath)) {
117
+ this.evictOldest();
118
+ }
119
+ // Delete existing tree to free native memory
120
+ const existing = this.trees.get(filePath);
121
+ if (existing) {
122
+ this.deleteTree(existing.tree);
123
+ }
124
+ this.version++;
125
+ this.trees.set(filePath, {
126
+ tree,
127
+ version: this.version,
128
+ contentHash,
129
+ createdAt: Date.now(),
130
+ });
131
+ }
132
+ /**
133
+ * Invalidate cached tree for a file
134
+ *
135
+ * Deletes tree to free native memory.
136
+ *
137
+ * @param filePath - Path to invalidate
138
+ */
139
+ invalidate(filePath) {
140
+ const entry = this.trees.get(filePath);
141
+ if (entry) {
142
+ this.deleteTree(entry.tree);
143
+ this.trees.delete(filePath);
144
+ }
145
+ }
146
+ /**
147
+ * Invalidate multiple files
148
+ *
149
+ * @param filePaths - Paths to invalidate
150
+ */
151
+ invalidateMany(filePaths) {
152
+ for (const filePath of filePaths) {
153
+ this.invalidate(filePath);
154
+ }
155
+ }
156
+ /**
157
+ * Invalidate files matching a pattern
158
+ *
159
+ * @param pattern - Regex pattern to match file paths
160
+ * @returns Number of entries invalidated
161
+ */
162
+ invalidatePattern(pattern) {
163
+ let count = 0;
164
+ for (const filePath of this.trees.keys()) {
165
+ if (pattern.test(filePath)) {
166
+ this.invalidate(filePath);
167
+ count++;
168
+ }
169
+ }
170
+ return count;
171
+ }
172
+ /**
173
+ * Check if a file has a cached tree
174
+ *
175
+ * @param filePath - Path to check
176
+ * @returns True if tree is cached
177
+ */
178
+ has(filePath) {
179
+ return this.trees.has(filePath);
180
+ }
181
+ /**
182
+ * Get current cache size
183
+ */
184
+ get size() {
185
+ return this.trees.size;
186
+ }
187
+ /**
188
+ * Get cache statistics
189
+ *
190
+ * @returns Current cache statistics
191
+ */
192
+ getStats() {
193
+ let oldestVersion = Infinity;
194
+ let newestVersion = 0;
195
+ for (const entry of this.trees.values()) {
196
+ if (entry.version < oldestVersion)
197
+ oldestVersion = entry.version;
198
+ if (entry.version > newestVersion)
199
+ newestVersion = entry.version;
200
+ }
201
+ const total = this.hits + this.misses;
202
+ return {
203
+ size: this.trees.size,
204
+ maxSize: this.maxTrees,
205
+ hitRate: total > 0 ? this.hits / total : 0,
206
+ oldestVersion: oldestVersion === Infinity ? 0 : oldestVersion,
207
+ newestVersion,
208
+ };
209
+ }
210
+ /**
211
+ * Reset hit/miss counters
212
+ */
213
+ resetStats() {
214
+ this.hits = 0;
215
+ this.misses = 0;
216
+ }
217
+ /**
218
+ * Clear all cached trees
219
+ *
220
+ * Properly deletes all trees to free native resources.
221
+ */
222
+ clear() {
223
+ for (const entry of this.trees.values()) {
224
+ this.deleteTree(entry.tree);
225
+ }
226
+ this.trees.clear();
227
+ this.hits = 0;
228
+ this.misses = 0;
229
+ }
230
+ /**
231
+ * Dispose of cache and free all resources
232
+ *
233
+ * Call this when the cache is no longer needed.
234
+ */
235
+ dispose() {
236
+ this.clear();
237
+ }
238
+ /**
239
+ * Get list of all cached file paths
240
+ */
241
+ keys() {
242
+ return Array.from(this.trees.keys());
243
+ }
244
+ /**
245
+ * Hash content for cache validation
246
+ *
247
+ * @param content - Content to hash
248
+ * @returns SHA-256 hash prefix (16 chars)
249
+ */
250
+ static hashContent(content) {
251
+ return createHash('sha256').update(content).digest('hex').slice(0, 16);
252
+ }
253
+ /**
254
+ * Evict the oldest entry from cache
255
+ */
256
+ evictOldest() {
257
+ let oldestPath = null;
258
+ let oldestVersion = Infinity;
259
+ for (const [path, entry] of this.trees) {
260
+ if (entry.version < oldestVersion) {
261
+ oldestVersion = entry.version;
262
+ oldestPath = path;
263
+ }
264
+ }
265
+ if (oldestPath) {
266
+ this.invalidate(oldestPath);
267
+ }
268
+ }
269
+ /**
270
+ * Safely delete a tree object
271
+ *
272
+ * Handles trees that may or may not have a delete method.
273
+ */
274
+ deleteTree(tree) {
275
+ if (tree && typeof tree === 'object') {
276
+ const maybeTree = tree;
277
+ if (typeof maybeTree.delete === 'function') {
278
+ try {
279
+ maybeTree.delete();
280
+ }
281
+ catch {
282
+ // Ignore errors during cleanup
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ //# sourceMappingURL=tree-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-cache.js","sourceRoot":"","sources":["../../../src/analysis/tree-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * SMI-1303: Tree-sitter Parser Manager
3
+ *
4
+ * Manages tree-sitter parser instances with lazy loading.
5
+ * Uses web-tree-sitter (WASM) to avoid native module conflicts.
6
+ *
7
+ * @see docs/architecture/multi-language-analysis.md
8
+ * @see ADR-002: Docker glibc Requirement
9
+ * @module analysis/tree-sitter/manager
10
+ */
11
+ import type { SupportedLanguage } from '../types.js';
12
+ /**
13
+ * Parser interface (matches web-tree-sitter API)
14
+ */
15
+ export interface TreeSitterParser {
16
+ parse(input: string, previousTree?: TreeSitterTree): TreeSitterTree;
17
+ setLanguage(language: TreeSitterLanguage): void;
18
+ delete(): void;
19
+ }
20
+ /**
21
+ * Tree interface (matches web-tree-sitter API)
22
+ */
23
+ export interface TreeSitterTree {
24
+ rootNode: TreeSitterNode;
25
+ delete(): void;
26
+ }
27
+ /**
28
+ * Node interface (matches web-tree-sitter API)
29
+ */
30
+ export interface TreeSitterNode {
31
+ type: string;
32
+ text: string;
33
+ startPosition: {
34
+ row: number;
35
+ column: number;
36
+ };
37
+ endPosition: {
38
+ row: number;
39
+ column: number;
40
+ };
41
+ children: TreeSitterNode[];
42
+ namedChildren: TreeSitterNode[];
43
+ childCount: number;
44
+ namedChildCount: number;
45
+ child(index: number): TreeSitterNode | null;
46
+ namedChild(index: number): TreeSitterNode | null;
47
+ childForFieldName(fieldName: string): TreeSitterNode | null;
48
+ descendantsOfType(types: string | string[]): TreeSitterNode[];
49
+ }
50
+ /**
51
+ * Language module interface
52
+ */
53
+ export interface TreeSitterLanguage {
54
+ }
55
+ /**
56
+ * Options for TreeSitterManager
57
+ */
58
+ export interface TreeSitterManagerOptions {
59
+ /** Maximum parsers to cache (default: 6, one per language) */
60
+ maxParsers?: number;
61
+ }
62
+ /**
63
+ * Manages tree-sitter parser instances with lazy loading
64
+ *
65
+ * Parsers are loaded on-demand and cached for reuse.
66
+ * Uses WASM-based web-tree-sitter to avoid native module issues.
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const manager = new TreeSitterManager()
71
+ * const parser = await manager.getParser('python')
72
+ * const tree = parser.parse('def main(): pass')
73
+ * manager.dispose()
74
+ * ```
75
+ */
76
+ export declare class TreeSitterManager {
77
+ private parsers;
78
+ private loading;
79
+ private readonly maxParsers;
80
+ private initialized;
81
+ private initPromise;
82
+ private ParserClass;
83
+ private accessOrder;
84
+ constructor(options?: TreeSitterManagerOptions);
85
+ /**
86
+ * SMI-1333: Update access order for LRU tracking
87
+ * Moves the accessed language to the end (most recently used)
88
+ */
89
+ private updateAccessOrder;
90
+ /**
91
+ * Initialize web-tree-sitter (must be called before first use)
92
+ *
93
+ * This initializes the WASM runtime. Called automatically by getParser().
94
+ */
95
+ initialize(): Promise<void>;
96
+ private doInitialize;
97
+ /**
98
+ * Get parser for a language, loading if necessary
99
+ *
100
+ * Parsers are cached for reuse. If the maximum number of
101
+ * parsers is reached, the least recently used is evicted.
102
+ *
103
+ * @param language - Language to get parser for
104
+ * @returns Configured parser instance
105
+ * @throws Error if language is not supported or tree-sitter unavailable
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const parser = await manager.getParser('python')
110
+ * const tree = parser.parse(pythonCode)
111
+ * ```
112
+ */
113
+ getParser(language: SupportedLanguage): Promise<TreeSitterParser>;
114
+ /**
115
+ * Load a parser for a specific language
116
+ */
117
+ private loadParser;
118
+ /**
119
+ * Load the language module for tree-sitter
120
+ */
121
+ private loadLanguageModule;
122
+ /**
123
+ * Check if a language is available
124
+ *
125
+ * @param language - Language to check
126
+ * @returns True if the language can be loaded
127
+ */
128
+ isLanguageAvailable(language: SupportedLanguage): Promise<boolean>;
129
+ /**
130
+ * Get list of currently loaded languages
131
+ */
132
+ getLoadedLanguages(): SupportedLanguage[];
133
+ /**
134
+ * Clean up all parser resources
135
+ *
136
+ * Call this when the manager is no longer needed
137
+ * to free memory and WASM resources.
138
+ */
139
+ dispose(): void;
140
+ }
141
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,cAAc,GAAG,cAAc,CAAA;IACnE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC/C,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAChD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;CAC9D;AAED;;GAEG;AAEH,MAAM,WAAW,kBAAkB;CAElC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA4C;IAE/D,OAAO,CAAC,WAAW,CAA0B;gBAEjC,OAAO,GAAE,wBAA6B;IAIlD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,YAAY;IAuB1B;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4CvE;;OAEG;YACW,UAAU;IAYxB;;OAEG;YACW,kBAAkB;IA0ChC;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IASxE;;OAEG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAIzC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAgBhB"}