@sudosandwich/limps-headless 0.1.3

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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/bin/limps-headless +2 -0
  4. package/dist/analysis/index.d.ts +6 -0
  5. package/dist/analysis/index.d.ts.map +1 -0
  6. package/dist/analysis/index.js +6 -0
  7. package/dist/analysis/index.js.map +1 -0
  8. package/dist/analysis/ir/build-ir.d.ts +10 -0
  9. package/dist/analysis/ir/build-ir.d.ts.map +1 -0
  10. package/dist/analysis/ir/build-ir.js +102 -0
  11. package/dist/analysis/ir/build-ir.js.map +1 -0
  12. package/dist/analysis/ir/types.d.ts +44 -0
  13. package/dist/analysis/ir/types.d.ts.map +1 -0
  14. package/dist/analysis/ir/types.js +2 -0
  15. package/dist/analysis/ir/types.js.map +1 -0
  16. package/dist/analysis/module-graph.d.ts +20 -0
  17. package/dist/analysis/module-graph.d.ts.map +1 -0
  18. package/dist/analysis/module-graph.js +104 -0
  19. package/dist/analysis/module-graph.js.map +1 -0
  20. package/dist/analysis/passes/behavior-evidence.d.ts +9 -0
  21. package/dist/analysis/passes/behavior-evidence.d.ts.map +1 -0
  22. package/dist/analysis/passes/behavior-evidence.js +80 -0
  23. package/dist/analysis/passes/behavior-evidence.js.map +1 -0
  24. package/dist/analysis/passes/import-evidence.d.ts +3 -0
  25. package/dist/analysis/passes/import-evidence.d.ts.map +1 -0
  26. package/dist/analysis/passes/import-evidence.js +58 -0
  27. package/dist/analysis/passes/import-evidence.js.map +1 -0
  28. package/dist/analysis/passes/index.d.ts +15 -0
  29. package/dist/analysis/passes/index.d.ts.map +1 -0
  30. package/dist/analysis/passes/index.js +21 -0
  31. package/dist/analysis/passes/index.js.map +1 -0
  32. package/dist/analysis/passes/jsx-evidence.d.ts +8 -0
  33. package/dist/analysis/passes/jsx-evidence.d.ts.map +1 -0
  34. package/dist/analysis/passes/jsx-evidence.js +149 -0
  35. package/dist/analysis/passes/jsx-evidence.js.map +1 -0
  36. package/dist/analysis/ts-program.d.ts +12 -0
  37. package/dist/analysis/ts-program.d.ts.map +1 -0
  38. package/dist/analysis/ts-program.js +59 -0
  39. package/dist/analysis/ts-program.js.map +1 -0
  40. package/dist/analyzer/disambiguator.d.ts +20 -0
  41. package/dist/analyzer/disambiguator.d.ts.map +1 -0
  42. package/dist/analyzer/disambiguator.js +83 -0
  43. package/dist/analyzer/disambiguator.js.map +1 -0
  44. package/dist/analyzer/index.d.ts +26 -0
  45. package/dist/analyzer/index.d.ts.map +1 -0
  46. package/dist/analyzer/index.js +68 -0
  47. package/dist/analyzer/index.js.map +1 -0
  48. package/dist/analyzer/parser.d.ts +23 -0
  49. package/dist/analyzer/parser.d.ts.map +1 -0
  50. package/dist/analyzer/parser.js +58 -0
  51. package/dist/analyzer/parser.js.map +1 -0
  52. package/dist/analyzer/patterns.d.ts +42 -0
  53. package/dist/analyzer/patterns.d.ts.map +1 -0
  54. package/dist/analyzer/patterns.js +206 -0
  55. package/dist/analyzer/patterns.js.map +1 -0
  56. package/dist/analyzer/props.d.ts +16 -0
  57. package/dist/analyzer/props.d.ts.map +1 -0
  58. package/dist/analyzer/props.js +235 -0
  59. package/dist/analyzer/props.js.map +1 -0
  60. package/dist/analyzer/rules/checkbox-switch-toggle.d.ts +10 -0
  61. package/dist/analyzer/rules/checkbox-switch-toggle.d.ts.map +1 -0
  62. package/dist/analyzer/rules/checkbox-switch-toggle.js +26 -0
  63. package/dist/analyzer/rules/checkbox-switch-toggle.js.map +1 -0
  64. package/dist/analyzer/rules/dialog-popover.d.ts +10 -0
  65. package/dist/analyzer/rules/dialog-popover.d.ts.map +1 -0
  66. package/dist/analyzer/rules/dialog-popover.js +25 -0
  67. package/dist/analyzer/rules/dialog-popover.js.map +1 -0
  68. package/dist/analyzer/rules/index.d.ts +24 -0
  69. package/dist/analyzer/rules/index.d.ts.map +1 -0
  70. package/dist/analyzer/rules/index.js +51 -0
  71. package/dist/analyzer/rules/index.js.map +1 -0
  72. package/dist/analyzer/rules/tooltip-hovercard.d.ts +10 -0
  73. package/dist/analyzer/rules/tooltip-hovercard.d.ts.map +1 -0
  74. package/dist/analyzer/rules/tooltip-hovercard.js +21 -0
  75. package/dist/analyzer/rules/tooltip-hovercard.js.map +1 -0
  76. package/dist/analyzer/scorer.d.ts +12 -0
  77. package/dist/analyzer/scorer.d.ts.map +1 -0
  78. package/dist/analyzer/scorer.js +171 -0
  79. package/dist/analyzer/scorer.js.map +1 -0
  80. package/dist/analyzer/weights.d.ts +28 -0
  81. package/dist/analyzer/weights.d.ts.map +1 -0
  82. package/dist/analyzer/weights.js +40 -0
  83. package/dist/analyzer/weights.js.map +1 -0
  84. package/dist/audit/analyses/migration.d.ts +42 -0
  85. package/dist/audit/analyses/migration.d.ts.map +1 -0
  86. package/dist/audit/analyses/migration.js +91 -0
  87. package/dist/audit/analyses/migration.js.map +1 -0
  88. package/dist/audit/discover-components.d.ts +7 -0
  89. package/dist/audit/discover-components.d.ts.map +1 -0
  90. package/dist/audit/discover-components.js +486 -0
  91. package/dist/audit/discover-components.js.map +1 -0
  92. package/dist/audit/generate-report.d.ts +28 -0
  93. package/dist/audit/generate-report.d.ts.map +1 -0
  94. package/dist/audit/generate-report.js +333 -0
  95. package/dist/audit/generate-report.js.map +1 -0
  96. package/dist/audit/index.d.ts +8 -0
  97. package/dist/audit/index.d.ts.map +1 -0
  98. package/dist/audit/index.js +8 -0
  99. package/dist/audit/index.js.map +1 -0
  100. package/dist/audit/run-audit.d.ts +33 -0
  101. package/dist/audit/run-audit.d.ts.map +1 -0
  102. package/dist/audit/run-audit.js +287 -0
  103. package/dist/audit/run-audit.js.map +1 -0
  104. package/dist/audit/types.d.ts +135 -0
  105. package/dist/audit/types.d.ts.map +1 -0
  106. package/dist/audit/types.js +5 -0
  107. package/dist/audit/types.js.map +1 -0
  108. package/dist/cache/index.d.ts +110 -0
  109. package/dist/cache/index.d.ts.map +1 -0
  110. package/dist/cache/index.js +176 -0
  111. package/dist/cache/index.js.map +1 -0
  112. package/dist/cache/storage.d.ts +73 -0
  113. package/dist/cache/storage.d.ts.map +1 -0
  114. package/dist/cache/storage.js +176 -0
  115. package/dist/cache/storage.js.map +1 -0
  116. package/dist/cache/ttl.d.ts +62 -0
  117. package/dist/cache/ttl.d.ts.map +1 -0
  118. package/dist/cache/ttl.js +96 -0
  119. package/dist/cache/ttl.js.map +1 -0
  120. package/dist/cli/commands/analyze.d.ts +6 -0
  121. package/dist/cli/commands/analyze.d.ts.map +1 -0
  122. package/dist/cli/commands/analyze.js +43 -0
  123. package/dist/cli/commands/analyze.js.map +1 -0
  124. package/dist/cli/commands/audit.d.ts +6 -0
  125. package/dist/cli/commands/audit.d.ts.map +1 -0
  126. package/dist/cli/commands/audit.js +73 -0
  127. package/dist/cli/commands/audit.js.map +1 -0
  128. package/dist/cli/commands/check-updates.d.ts +6 -0
  129. package/dist/cli/commands/check-updates.d.ts.map +1 -0
  130. package/dist/cli/commands/check-updates.js +34 -0
  131. package/dist/cli/commands/check-updates.js.map +1 -0
  132. package/dist/cli/commands/diff.d.ts +7 -0
  133. package/dist/cli/commands/diff.d.ts.map +1 -0
  134. package/dist/cli/commands/diff.js +48 -0
  135. package/dist/cli/commands/diff.js.map +1 -0
  136. package/dist/cli/commands/extract.d.ts +6 -0
  137. package/dist/cli/commands/extract.d.ts.map +1 -0
  138. package/dist/cli/commands/extract.js +42 -0
  139. package/dist/cli/commands/extract.js.map +1 -0
  140. package/dist/cli/commands/list.d.ts +6 -0
  141. package/dist/cli/commands/list.d.ts.map +1 -0
  142. package/dist/cli/commands/list.js +33 -0
  143. package/dist/cli/commands/list.js.map +1 -0
  144. package/dist/cli/flags.d.ts +9 -0
  145. package/dist/cli/flags.d.ts.map +1 -0
  146. package/dist/cli/flags.js +22 -0
  147. package/dist/cli/flags.js.map +1 -0
  148. package/dist/cli/index.d.ts +5 -0
  149. package/dist/cli/index.d.ts.map +1 -0
  150. package/dist/cli/index.js +40 -0
  151. package/dist/cli/index.js.map +1 -0
  152. package/dist/config.d.ts +19 -0
  153. package/dist/config.d.ts.map +1 -0
  154. package/dist/config.js +23 -0
  155. package/dist/config.js.map +1 -0
  156. package/dist/differ/hints.d.ts +21 -0
  157. package/dist/differ/hints.d.ts.map +1 -0
  158. package/dist/differ/hints.js +105 -0
  159. package/dist/differ/hints.js.map +1 -0
  160. package/dist/differ/index.d.ts +25 -0
  161. package/dist/differ/index.d.ts.map +1 -0
  162. package/dist/differ/index.js +115 -0
  163. package/dist/differ/index.js.map +1 -0
  164. package/dist/differ/props.d.ts +36 -0
  165. package/dist/differ/props.d.ts.map +1 -0
  166. package/dist/differ/props.js +210 -0
  167. package/dist/differ/props.js.map +1 -0
  168. package/dist/differ/severity.d.ts +31 -0
  169. package/dist/differ/severity.d.ts.map +1 -0
  170. package/dist/differ/severity.js +65 -0
  171. package/dist/differ/severity.js.map +1 -0
  172. package/dist/differ/types.d.ts +109 -0
  173. package/dist/differ/types.d.ts.map +1 -0
  174. package/dist/differ/types.js +5 -0
  175. package/dist/differ/types.js.map +1 -0
  176. package/dist/extractor/classifier.d.ts +30 -0
  177. package/dist/extractor/classifier.d.ts.map +1 -0
  178. package/dist/extractor/classifier.js +150 -0
  179. package/dist/extractor/classifier.js.map +1 -0
  180. package/dist/extractor/forward-ref.d.ts +28 -0
  181. package/dist/extractor/forward-ref.d.ts.map +1 -0
  182. package/dist/extractor/forward-ref.js +134 -0
  183. package/dist/extractor/forward-ref.js.map +1 -0
  184. package/dist/extractor/index.d.ts +25 -0
  185. package/dist/extractor/index.d.ts.map +1 -0
  186. package/dist/extractor/index.js +43 -0
  187. package/dist/extractor/index.js.map +1 -0
  188. package/dist/extractor/interface.d.ts +40 -0
  189. package/dist/extractor/interface.d.ts.map +1 -0
  190. package/dist/extractor/interface.js +233 -0
  191. package/dist/extractor/interface.js.map +1 -0
  192. package/dist/extractor/jsdoc.d.ts +24 -0
  193. package/dist/extractor/jsdoc.d.ts.map +1 -0
  194. package/dist/extractor/jsdoc.js +74 -0
  195. package/dist/extractor/jsdoc.js.map +1 -0
  196. package/dist/extractor/project.d.ts +17 -0
  197. package/dist/extractor/project.d.ts.map +1 -0
  198. package/dist/extractor/project.js +33 -0
  199. package/dist/extractor/project.js.map +1 -0
  200. package/dist/extractor/props.d.ts +24 -0
  201. package/dist/extractor/props.d.ts.map +1 -0
  202. package/dist/extractor/props.js +78 -0
  203. package/dist/extractor/props.js.map +1 -0
  204. package/dist/extractor/type-resolver.d.ts +32 -0
  205. package/dist/extractor/type-resolver.d.ts.map +1 -0
  206. package/dist/extractor/type-resolver.js +129 -0
  207. package/dist/extractor/type-resolver.js.map +1 -0
  208. package/dist/fetcher/index.d.ts +7 -0
  209. package/dist/fetcher/index.d.ts.map +1 -0
  210. package/dist/fetcher/index.js +7 -0
  211. package/dist/fetcher/index.js.map +1 -0
  212. package/dist/fetcher/npm-registry.d.ts +45 -0
  213. package/dist/fetcher/npm-registry.d.ts.map +1 -0
  214. package/dist/fetcher/npm-registry.js +217 -0
  215. package/dist/fetcher/npm-registry.js.map +1 -0
  216. package/dist/fetcher/unified-package.d.ts +27 -0
  217. package/dist/fetcher/unified-package.d.ts.map +1 -0
  218. package/dist/fetcher/unified-package.js +99 -0
  219. package/dist/fetcher/unified-package.js.map +1 -0
  220. package/dist/fetcher/unpkg.d.ts +20 -0
  221. package/dist/fetcher/unpkg.d.ts.map +1 -0
  222. package/dist/fetcher/unpkg.js +58 -0
  223. package/dist/fetcher/unpkg.js.map +1 -0
  224. package/dist/index.d.ts +18 -0
  225. package/dist/index.d.ts.map +1 -0
  226. package/dist/index.js +41 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/providers/base.d.ts +10 -0
  229. package/dist/providers/base.d.ts.map +1 -0
  230. package/dist/providers/base.js +80 -0
  231. package/dist/providers/base.js.map +1 -0
  232. package/dist/providers/index.d.ts +10 -0
  233. package/dist/providers/index.d.ts.map +1 -0
  234. package/dist/providers/index.js +10 -0
  235. package/dist/providers/index.js.map +1 -0
  236. package/dist/providers/interface.d.ts +56 -0
  237. package/dist/providers/interface.d.ts.map +1 -0
  238. package/dist/providers/interface.js +5 -0
  239. package/dist/providers/interface.js.map +1 -0
  240. package/dist/providers/radix-backend.d.ts +11 -0
  241. package/dist/providers/radix-backend.d.ts.map +1 -0
  242. package/dist/providers/radix-backend.js +107 -0
  243. package/dist/providers/radix-backend.js.map +1 -0
  244. package/dist/providers/radix.d.ts +6 -0
  245. package/dist/providers/radix.d.ts.map +1 -0
  246. package/dist/providers/radix.js +21 -0
  247. package/dist/providers/radix.js.map +1 -0
  248. package/dist/providers/registry.d.ts +17 -0
  249. package/dist/providers/registry.d.ts.map +1 -0
  250. package/dist/providers/registry.js +55 -0
  251. package/dist/providers/registry.js.map +1 -0
  252. package/dist/rules/engine.d.ts +4 -0
  253. package/dist/rules/engine.d.ts.map +1 -0
  254. package/dist/rules/engine.js +37 -0
  255. package/dist/rules/engine.js.map +1 -0
  256. package/dist/rules/index.d.ts +6 -0
  257. package/dist/rules/index.d.ts.map +1 -0
  258. package/dist/rules/index.js +6 -0
  259. package/dist/rules/index.js.map +1 -0
  260. package/dist/rules/predicates.d.ts +10 -0
  261. package/dist/rules/predicates.d.ts.map +1 -0
  262. package/dist/rules/predicates.js +93 -0
  263. package/dist/rules/predicates.js.map +1 -0
  264. package/dist/rules/rulesets/base-ui.d.ts +3 -0
  265. package/dist/rules/rulesets/base-ui.d.ts.map +1 -0
  266. package/dist/rules/rulesets/base-ui.js +65 -0
  267. package/dist/rules/rulesets/base-ui.js.map +1 -0
  268. package/dist/rules/rulesets/radix-legacy.d.ts +3 -0
  269. package/dist/rules/rulesets/radix-legacy.d.ts.map +1 -0
  270. package/dist/rules/rulesets/radix-legacy.js +38 -0
  271. package/dist/rules/rulesets/radix-legacy.js.map +1 -0
  272. package/dist/rules/types.d.ts +57 -0
  273. package/dist/rules/types.d.ts.map +1 -0
  274. package/dist/rules/types.js +2 -0
  275. package/dist/rules/types.js.map +1 -0
  276. package/dist/signatures/disambiguation.d.ts +30 -0
  277. package/dist/signatures/disambiguation.d.ts.map +1 -0
  278. package/dist/signatures/disambiguation.js +99 -0
  279. package/dist/signatures/disambiguation.js.map +1 -0
  280. package/dist/signatures/distinguishing.d.ts +29 -0
  281. package/dist/signatures/distinguishing.d.ts.map +1 -0
  282. package/dist/signatures/distinguishing.js +108 -0
  283. package/dist/signatures/distinguishing.js.map +1 -0
  284. package/dist/signatures/generator.d.ts +20 -0
  285. package/dist/signatures/generator.d.ts.map +1 -0
  286. package/dist/signatures/generator.js +147 -0
  287. package/dist/signatures/generator.js.map +1 -0
  288. package/dist/signatures/index.d.ts +10 -0
  289. package/dist/signatures/index.d.ts.map +1 -0
  290. package/dist/signatures/index.js +10 -0
  291. package/dist/signatures/index.js.map +1 -0
  292. package/dist/signatures/inference.d.ts +37 -0
  293. package/dist/signatures/inference.d.ts.map +1 -0
  294. package/dist/signatures/inference.js +132 -0
  295. package/dist/signatures/inference.js.map +1 -0
  296. package/dist/tools/analyze-component.d.ts +41 -0
  297. package/dist/tools/analyze-component.d.ts.map +1 -0
  298. package/dist/tools/analyze-component.js +274 -0
  299. package/dist/tools/analyze-component.js.map +1 -0
  300. package/dist/tools/check-updates.d.ts +33 -0
  301. package/dist/tools/check-updates.d.ts.map +1 -0
  302. package/dist/tools/check-updates.js +81 -0
  303. package/dist/tools/check-updates.js.map +1 -0
  304. package/dist/tools/diff-versions.d.ts +39 -0
  305. package/dist/tools/diff-versions.d.ts.map +1 -0
  306. package/dist/tools/diff-versions.js +78 -0
  307. package/dist/tools/diff-versions.js.map +1 -0
  308. package/dist/tools/extract-primitive.d.ts +50 -0
  309. package/dist/tools/extract-primitive.d.ts.map +1 -0
  310. package/dist/tools/extract-primitive.js +145 -0
  311. package/dist/tools/extract-primitive.js.map +1 -0
  312. package/dist/tools/generate-report.d.ts +29 -0
  313. package/dist/tools/generate-report.d.ts.map +1 -0
  314. package/dist/tools/generate-report.js +36 -0
  315. package/dist/tools/generate-report.js.map +1 -0
  316. package/dist/tools/index.d.ts +11 -0
  317. package/dist/tools/index.d.ts.map +1 -0
  318. package/dist/tools/index.js +11 -0
  319. package/dist/tools/index.js.map +1 -0
  320. package/dist/tools/list-primitives.d.ts +41 -0
  321. package/dist/tools/list-primitives.d.ts.map +1 -0
  322. package/dist/tools/list-primitives.js +74 -0
  323. package/dist/tools/list-primitives.js.map +1 -0
  324. package/dist/tools/run-audit.d.ts +43 -0
  325. package/dist/tools/run-audit.d.ts.map +1 -0
  326. package/dist/tools/run-audit.js +60 -0
  327. package/dist/tools/run-audit.js.map +1 -0
  328. package/dist/types/index.d.ts +143 -0
  329. package/dist/types/index.d.ts.map +1 -0
  330. package/dist/types/index.js +5 -0
  331. package/dist/types/index.js.map +1 -0
  332. package/docs/architecture.md +88 -0
  333. package/docs/providers.md +47 -0
  334. package/docs/tools.md +143 -0
  335. package/package.json +59 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Cache module for Radix primitive data.
3
+ *
4
+ * Provides version-aware caching with TTL for:
5
+ * - ExtractedPrimitive data
6
+ * - BehaviorSignature data
7
+ * - "Latest" version resolution
8
+ */
9
+ import { getCacheDir, getCachePath, readFromFile, writeToFile, deleteFile, deleteDir, listCachedVersions, listCachedPrimitives, } from './storage.js';
10
+ import { isVersionDataExpired, isSignatureExpired, TTL } from './ttl.js';
11
+ import * as path from 'node:path';
12
+ // Re-export storage and TTL utilities
13
+ export * from './storage.js';
14
+ export * from './ttl.js';
15
+ /**
16
+ * Get cached ExtractedPrimitive data.
17
+ * @param primitive - Primitive name (e.g., "Dialog")
18
+ * @param version - Version string
19
+ * @param options - Cache options
20
+ * @returns Cached data or null if not found or expired
21
+ */
22
+ export async function getFromCache(primitive, version, options = {}) {
23
+ const cachePath = getCachePath(primitive, version, 'data', options.baseDir);
24
+ const data = await readFromFile(cachePath);
25
+ if (!data) {
26
+ return null;
27
+ }
28
+ // Check expiration unless ignored
29
+ if (!options.ignoreExpired && isVersionDataExpired(data.extractedAt)) {
30
+ return null;
31
+ }
32
+ return data;
33
+ }
34
+ /**
35
+ * Save ExtractedPrimitive data to cache.
36
+ * @param primitive - Primitive name (e.g., "Dialog")
37
+ * @param version - Version string
38
+ * @param data - Data to cache
39
+ * @param options - Cache options
40
+ */
41
+ export async function saveToCache(primitive, version, data, options = {}) {
42
+ const cachePath = getCachePath(primitive, version, 'data', options.baseDir);
43
+ await writeToFile(cachePath, data);
44
+ }
45
+ /**
46
+ * Get cached BehaviorSignature data.
47
+ * @param primitive - Primitive name (e.g., "Dialog")
48
+ * @param version - Version string
49
+ * @param options - Cache options
50
+ * @returns Cached signature or null if not found or expired
51
+ */
52
+ export async function getSignatureFromCache(primitive, version, options = {}) {
53
+ const cachePath = getCachePath(primitive, version, 'sig', options.baseDir);
54
+ // BehaviorSignature doesn't have a timestamp, so we check the ExtractedPrimitive
55
+ const extractedPath = getCachePath(primitive, version, 'data', options.baseDir);
56
+ const extracted = await readFromFile(extractedPath);
57
+ // If no extracted data exists, signature is orphaned
58
+ if (!extracted && !options.ignoreExpired) {
59
+ return null;
60
+ }
61
+ // Check expiration based on extracted data timestamp
62
+ if (extracted && !options.ignoreExpired && isSignatureExpired(extracted.extractedAt)) {
63
+ return null;
64
+ }
65
+ return readFromFile(cachePath);
66
+ }
67
+ /**
68
+ * Save BehaviorSignature data to cache.
69
+ * @param primitive - Primitive name (e.g., "Dialog")
70
+ * @param version - Version string
71
+ * @param signature - Signature to cache
72
+ * @param options - Cache options
73
+ */
74
+ export async function saveSignatureToCache(primitive, version, signature, options = {}) {
75
+ const cachePath = getCachePath(primitive, version, 'sig', options.baseDir);
76
+ await writeToFile(cachePath, signature);
77
+ }
78
+ /**
79
+ * Get the "latest" version resolution for a primitive.
80
+ * @param primitive - Primitive name
81
+ * @param options - Cache options
82
+ * @returns Latest resolution or null if not found or expired
83
+ */
84
+ export async function getLatestResolution(primitive, options = {}) {
85
+ const cacheDir = getCacheDir(options.baseDir);
86
+ const latestPath = path.join(cacheDir, 'latest-resolved.json');
87
+ const cache = await readFromFile(latestPath);
88
+ if (!cache || !cache[primitive]) {
89
+ return null;
90
+ }
91
+ const resolution = cache[primitive];
92
+ // Check expiration
93
+ if (!options.ignoreExpired) {
94
+ const resolvedTime = new Date(resolution.resolvedAt).getTime();
95
+ const now = Date.now();
96
+ if (now - resolvedTime >= TTL.LATEST_RESOLUTION) {
97
+ return null;
98
+ }
99
+ }
100
+ return resolution;
101
+ }
102
+ /**
103
+ * Save a "latest" version resolution.
104
+ * @param primitive - Primitive name
105
+ * @param version - Resolved version string
106
+ * @param options - Cache options
107
+ */
108
+ export async function saveLatestResolution(primitive, version, options = {}) {
109
+ const cacheDir = getCacheDir(options.baseDir);
110
+ const latestPath = path.join(cacheDir, 'latest-resolved.json');
111
+ // Read existing cache
112
+ let cache = await readFromFile(latestPath);
113
+ if (!cache) {
114
+ cache = {};
115
+ }
116
+ // Update entry
117
+ cache[primitive] = {
118
+ version,
119
+ resolvedAt: new Date().toISOString(),
120
+ };
121
+ await writeToFile(latestPath, cache);
122
+ }
123
+ /**
124
+ * Clear cache for a specific primitive and version, or all cache.
125
+ * @param primitive - Optional primitive name (clears all if not provided)
126
+ * @param version - Optional version (clears all versions of primitive if not provided)
127
+ * @param options - Cache options
128
+ */
129
+ export async function clearCache(primitive, version, options = {}) {
130
+ const cacheDir = getCacheDir(options.baseDir);
131
+ // Clear everything
132
+ if (!primitive) {
133
+ await deleteDir(cacheDir);
134
+ return;
135
+ }
136
+ // Clear specific primitive in specific version
137
+ if (version) {
138
+ await deleteFile(getCachePath(primitive, version, 'data', options.baseDir));
139
+ await deleteFile(getCachePath(primitive, version, 'sig', options.baseDir));
140
+ return;
141
+ }
142
+ // Clear specific primitive in all versions
143
+ const versions = await listCachedVersions(options.baseDir);
144
+ for (const v of versions) {
145
+ await deleteFile(getCachePath(primitive, v, 'data', options.baseDir));
146
+ await deleteFile(getCachePath(primitive, v, 'sig', options.baseDir));
147
+ }
148
+ }
149
+ /**
150
+ * Get cache statistics.
151
+ * @param options - Cache options
152
+ * @returns Cache statistics
153
+ */
154
+ export async function getCacheStats(options = {}) {
155
+ const versions = await listCachedVersions(options.baseDir);
156
+ let primitiveCount = 0;
157
+ let signatureCount = 0;
158
+ for (const version of versions) {
159
+ const primitives = await listCachedPrimitives(version, options.baseDir);
160
+ primitiveCount += primitives.length;
161
+ // Count signatures (files ending in .sig.json)
162
+ for (const primitive of primitives) {
163
+ const sigPath = getCachePath(primitive, version, 'sig', options.baseDir);
164
+ const sig = await readFromFile(sigPath);
165
+ if (sig) {
166
+ signatureCount++;
167
+ }
168
+ }
169
+ }
170
+ return {
171
+ versions,
172
+ primitiveCount,
173
+ signatureCount,
174
+ };
175
+ }
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * File-based cache storage for Radix primitive data.
3
+ *
4
+ * Cache structure:
5
+ * ~/.limps-headless/
6
+ * cache/
7
+ * 1.0.5/
8
+ * dialog.json # ExtractedPrimitive
9
+ * dialog.sig.json # BehaviorSignature
10
+ * 1.1.0/
11
+ * ...
12
+ * latest-resolved.json # { primitive: { version: "1.1.2", resolvedAt: "..." } }
13
+ */
14
+ /**
15
+ * Get the cache directory path.
16
+ * @param baseDir - Optional base directory (defaults to home directory)
17
+ * @returns Absolute path to the cache directory
18
+ */
19
+ export declare function getCacheDir(baseDir?: string): string;
20
+ /**
21
+ * Get the versioned cache directory path.
22
+ * @param version - The Radix version
23
+ * @param baseDir - Optional base directory
24
+ * @returns Absolute path to the versioned cache directory
25
+ */
26
+ export declare function getVersionedCacheDir(version: string, baseDir?: string): string;
27
+ /**
28
+ * Get the path for a cached primitive file.
29
+ * @param primitive - Primitive name (e.g., "Dialog")
30
+ * @param version - Version string
31
+ * @param type - Type of cache ('data' for ExtractedPrimitive, 'sig' for BehaviorSignature)
32
+ * @param baseDir - Optional base directory
33
+ * @returns Absolute file path
34
+ */
35
+ export declare function getCachePath(primitive: string, version: string, type: 'data' | 'sig', baseDir?: string): string;
36
+ /**
37
+ * Read data from a cache file.
38
+ * @param cachePath - Full path to the cache file
39
+ * @returns Parsed JSON data or null if file doesn't exist or is invalid
40
+ */
41
+ export declare function readFromFile<T>(cachePath: string): Promise<T | null>;
42
+ /**
43
+ * Write data to a cache file.
44
+ * @param cachePath - Full path to the cache file
45
+ * @param data - Data to write
46
+ */
47
+ export declare function writeToFile<T>(cachePath: string, data: T): Promise<void>;
48
+ /**
49
+ * Delete a cache file.
50
+ * @param cachePath - Full path to the cache file
51
+ * @returns True if file was deleted, false if it didn't exist
52
+ */
53
+ export declare function deleteFile(cachePath: string): Promise<boolean>;
54
+ /**
55
+ * Delete a directory and all its contents.
56
+ * @param dirPath - Directory path to delete
57
+ * @returns True if directory was deleted, false if it didn't exist
58
+ */
59
+ export declare function deleteDir(dirPath: string): Promise<boolean>;
60
+ /**
61
+ * List all versioned cache directories.
62
+ * @param baseDir - Optional base directory
63
+ * @returns Array of version strings that have cached data
64
+ */
65
+ export declare function listCachedVersions(baseDir?: string): Promise<string[]>;
66
+ /**
67
+ * List all cached primitives for a version.
68
+ * @param version - Version string
69
+ * @param baseDir - Optional base directory
70
+ * @returns Array of primitive names that have cached data
71
+ */
72
+ export declare function listCachedPrimitives(version: string, baseDir?: string): Promise<string[]>;
73
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/cache/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,KAAK,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAOR;AAUD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAa1E;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUjE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc5E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * File-based cache storage for Radix primitive data.
3
+ *
4
+ * Cache structure:
5
+ * ~/.limps-headless/
6
+ * cache/
7
+ * 1.0.5/
8
+ * dialog.json # ExtractedPrimitive
9
+ * dialog.sig.json # BehaviorSignature
10
+ * 1.1.0/
11
+ * ...
12
+ * latest-resolved.json # { primitive: { version: "1.1.2", resolvedAt: "..." } }
13
+ */
14
+ import * as fs from 'node:fs/promises';
15
+ import * as path from 'node:path';
16
+ import * as os from 'node:os';
17
+ /**
18
+ * Default cache directory name.
19
+ */
20
+ const CACHE_DIR_NAME = '.limps-headless';
21
+ /**
22
+ * Sub-directory for versioned cache data.
23
+ */
24
+ const CACHE_SUBDIR = 'cache';
25
+ /**
26
+ * Get the cache directory path.
27
+ * @param baseDir - Optional base directory (defaults to home directory)
28
+ * @returns Absolute path to the cache directory
29
+ */
30
+ export function getCacheDir(baseDir) {
31
+ const base = baseDir || os.homedir();
32
+ return path.join(base, CACHE_DIR_NAME, CACHE_SUBDIR);
33
+ }
34
+ /**
35
+ * Get the versioned cache directory path.
36
+ * @param version - The Radix version
37
+ * @param baseDir - Optional base directory
38
+ * @returns Absolute path to the versioned cache directory
39
+ */
40
+ export function getVersionedCacheDir(version, baseDir) {
41
+ return path.join(getCacheDir(baseDir), version);
42
+ }
43
+ /**
44
+ * Get the path for a cached primitive file.
45
+ * @param primitive - Primitive name (e.g., "Dialog")
46
+ * @param version - Version string
47
+ * @param type - Type of cache ('data' for ExtractedPrimitive, 'sig' for BehaviorSignature)
48
+ * @param baseDir - Optional base directory
49
+ * @returns Absolute file path
50
+ */
51
+ export function getCachePath(primitive, version, type, baseDir) {
52
+ const dir = getVersionedCacheDir(version, baseDir);
53
+ const fileName = type === 'sig'
54
+ ? `${primitive.toLowerCase()}.sig.json`
55
+ : `${primitive.toLowerCase()}.json`;
56
+ return path.join(dir, fileName);
57
+ }
58
+ /**
59
+ * Ensure the cache directory exists.
60
+ * @param dirPath - Directory path to create
61
+ */
62
+ async function ensureDir(dirPath) {
63
+ await fs.mkdir(dirPath, { recursive: true });
64
+ }
65
+ /**
66
+ * Read data from a cache file.
67
+ * @param cachePath - Full path to the cache file
68
+ * @returns Parsed JSON data or null if file doesn't exist or is invalid
69
+ */
70
+ export async function readFromFile(cachePath) {
71
+ try {
72
+ const content = await fs.readFile(cachePath, 'utf-8');
73
+ return JSON.parse(content);
74
+ }
75
+ catch (error) {
76
+ // File doesn't exist or parse error
77
+ if (error.code === 'ENOENT') {
78
+ return null;
79
+ }
80
+ // Log parse errors but return null
81
+ console.warn(`Cache read error for ${cachePath}:`, error);
82
+ return null;
83
+ }
84
+ }
85
+ /**
86
+ * Write data to a cache file.
87
+ * @param cachePath - Full path to the cache file
88
+ * @param data - Data to write
89
+ */
90
+ export async function writeToFile(cachePath, data) {
91
+ const dir = path.dirname(cachePath);
92
+ await ensureDir(dir);
93
+ const content = JSON.stringify(data, null, 2);
94
+ await fs.writeFile(cachePath, content, 'utf-8');
95
+ }
96
+ /**
97
+ * Delete a cache file.
98
+ * @param cachePath - Full path to the cache file
99
+ * @returns True if file was deleted, false if it didn't exist
100
+ */
101
+ export async function deleteFile(cachePath) {
102
+ try {
103
+ await fs.unlink(cachePath);
104
+ return true;
105
+ }
106
+ catch (error) {
107
+ if (error.code === 'ENOENT') {
108
+ return false;
109
+ }
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Delete a directory and all its contents.
115
+ * @param dirPath - Directory path to delete
116
+ * @returns True if directory was deleted, false if it didn't exist
117
+ */
118
+ export async function deleteDir(dirPath) {
119
+ try {
120
+ await fs.rm(dirPath, { recursive: true, force: true });
121
+ return true;
122
+ }
123
+ catch (error) {
124
+ if (error.code === 'ENOENT') {
125
+ return false;
126
+ }
127
+ throw error;
128
+ }
129
+ }
130
+ /**
131
+ * List all versioned cache directories.
132
+ * @param baseDir - Optional base directory
133
+ * @returns Array of version strings that have cached data
134
+ */
135
+ export async function listCachedVersions(baseDir) {
136
+ const cacheDir = getCacheDir(baseDir);
137
+ try {
138
+ const entries = await fs.readdir(cacheDir, { withFileTypes: true });
139
+ return entries
140
+ .filter((entry) => entry.isDirectory())
141
+ .map((entry) => entry.name)
142
+ .filter((name) => /^\d+\.\d+\.\d+/.test(name)); // Only semver-like directories
143
+ }
144
+ catch (error) {
145
+ if (error.code === 'ENOENT') {
146
+ return [];
147
+ }
148
+ throw error;
149
+ }
150
+ }
151
+ /**
152
+ * List all cached primitives for a version.
153
+ * @param version - Version string
154
+ * @param baseDir - Optional base directory
155
+ * @returns Array of primitive names that have cached data
156
+ */
157
+ export async function listCachedPrimitives(version, baseDir) {
158
+ const versionDir = getVersionedCacheDir(version, baseDir);
159
+ try {
160
+ const entries = await fs.readdir(versionDir);
161
+ return entries
162
+ .filter((name) => name.endsWith('.json') && !name.endsWith('.sig.json'))
163
+ .map((name) => {
164
+ // Convert filename back to primitive name (capitalize first letter)
165
+ const baseName = name.replace('.json', '');
166
+ return baseName.charAt(0).toUpperCase() + baseName.slice(1);
167
+ });
168
+ }
169
+ catch (error) {
170
+ if (error.code === 'ENOENT') {
171
+ return [];
172
+ }
173
+ throw error;
174
+ }
175
+ }
176
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/cache/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * TTL (Time-To-Live) checking logic for cache expiration.
3
+ */
4
+ /**
5
+ * TTL constants in milliseconds.
6
+ */
7
+ export declare const TTL: {
8
+ /**
9
+ * TTL for versioned primitive data (7 days).
10
+ * Versioned data is stable and can be cached longer.
11
+ */
12
+ readonly VERSION_DATA: number;
13
+ /**
14
+ * TTL for "latest" version resolution (1 hour).
15
+ * Latest version can change frequently, so we check more often.
16
+ */
17
+ readonly LATEST_RESOLUTION: number;
18
+ /**
19
+ * TTL for signature data (same as version data).
20
+ * Signatures derived from versioned data inherit the same TTL.
21
+ */
22
+ readonly SIGNATURE_DATA: number;
23
+ };
24
+ /**
25
+ * Check if a timestamp has expired based on TTL.
26
+ * @param timestamp - ISO timestamp string
27
+ * @param ttlMs - Time-to-live in milliseconds
28
+ * @returns True if the data has expired
29
+ */
30
+ export declare function isExpired(timestamp: string, ttlMs: number): boolean;
31
+ /**
32
+ * Check if version data has expired.
33
+ * @param timestamp - ISO timestamp string (extractedAt)
34
+ * @returns True if the version data has expired
35
+ */
36
+ export declare function isVersionDataExpired(timestamp: string): boolean;
37
+ /**
38
+ * Check if "latest" resolution has expired.
39
+ * @param timestamp - ISO timestamp string (resolvedAt)
40
+ * @returns True if the latest resolution has expired
41
+ */
42
+ export declare function isLatestResolutionExpired(timestamp: string): boolean;
43
+ /**
44
+ * Check if signature data has expired.
45
+ * @param timestamp - ISO timestamp string
46
+ * @returns True if the signature data has expired
47
+ */
48
+ export declare function isSignatureExpired(timestamp: string): boolean;
49
+ /**
50
+ * Get the remaining TTL for cached data.
51
+ * @param timestamp - ISO timestamp string
52
+ * @param ttlMs - Time-to-live in milliseconds
53
+ * @returns Remaining time in milliseconds (negative if expired)
54
+ */
55
+ export declare function getRemainingTtl(timestamp: string, ttlMs: number): number;
56
+ /**
57
+ * Format remaining TTL as human-readable string.
58
+ * @param remainingMs - Remaining time in milliseconds
59
+ * @returns Human-readable string like "2 days", "3 hours", "expired"
60
+ */
61
+ export declare function formatRemainingTtl(remainingMs: number): string;
62
+ //# sourceMappingURL=ttl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttl.d.ts","sourceRoot":"","sources":["../../src/cache/ttl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,GAAG;IACd;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;CAEK,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoB9D"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * TTL (Time-To-Live) checking logic for cache expiration.
3
+ */
4
+ /**
5
+ * TTL constants in milliseconds.
6
+ */
7
+ export const TTL = {
8
+ /**
9
+ * TTL for versioned primitive data (7 days).
10
+ * Versioned data is stable and can be cached longer.
11
+ */
12
+ VERSION_DATA: 7 * 24 * 60 * 60 * 1000,
13
+ /**
14
+ * TTL for "latest" version resolution (1 hour).
15
+ * Latest version can change frequently, so we check more often.
16
+ */
17
+ LATEST_RESOLUTION: 60 * 60 * 1000,
18
+ /**
19
+ * TTL for signature data (same as version data).
20
+ * Signatures derived from versioned data inherit the same TTL.
21
+ */
22
+ SIGNATURE_DATA: 7 * 24 * 60 * 60 * 1000,
23
+ };
24
+ /**
25
+ * Check if a timestamp has expired based on TTL.
26
+ * @param timestamp - ISO timestamp string
27
+ * @param ttlMs - Time-to-live in milliseconds
28
+ * @returns True if the data has expired
29
+ */
30
+ export function isExpired(timestamp, ttlMs) {
31
+ const cachedTime = new Date(timestamp).getTime();
32
+ const now = Date.now();
33
+ const age = now - cachedTime;
34
+ return age >= ttlMs;
35
+ }
36
+ /**
37
+ * Check if version data has expired.
38
+ * @param timestamp - ISO timestamp string (extractedAt)
39
+ * @returns True if the version data has expired
40
+ */
41
+ export function isVersionDataExpired(timestamp) {
42
+ return isExpired(timestamp, TTL.VERSION_DATA);
43
+ }
44
+ /**
45
+ * Check if "latest" resolution has expired.
46
+ * @param timestamp - ISO timestamp string (resolvedAt)
47
+ * @returns True if the latest resolution has expired
48
+ */
49
+ export function isLatestResolutionExpired(timestamp) {
50
+ return isExpired(timestamp, TTL.LATEST_RESOLUTION);
51
+ }
52
+ /**
53
+ * Check if signature data has expired.
54
+ * @param timestamp - ISO timestamp string
55
+ * @returns True if the signature data has expired
56
+ */
57
+ export function isSignatureExpired(timestamp) {
58
+ return isExpired(timestamp, TTL.SIGNATURE_DATA);
59
+ }
60
+ /**
61
+ * Get the remaining TTL for cached data.
62
+ * @param timestamp - ISO timestamp string
63
+ * @param ttlMs - Time-to-live in milliseconds
64
+ * @returns Remaining time in milliseconds (negative if expired)
65
+ */
66
+ export function getRemainingTtl(timestamp, ttlMs) {
67
+ const cachedTime = new Date(timestamp).getTime();
68
+ const now = Date.now();
69
+ const age = now - cachedTime;
70
+ return ttlMs - age;
71
+ }
72
+ /**
73
+ * Format remaining TTL as human-readable string.
74
+ * @param remainingMs - Remaining time in milliseconds
75
+ * @returns Human-readable string like "2 days", "3 hours", "expired"
76
+ */
77
+ export function formatRemainingTtl(remainingMs) {
78
+ if (remainingMs <= 0) {
79
+ return 'expired';
80
+ }
81
+ const seconds = Math.floor(remainingMs / 1000);
82
+ const minutes = Math.floor(seconds / 60);
83
+ const hours = Math.floor(minutes / 60);
84
+ const days = Math.floor(hours / 24);
85
+ if (days > 0) {
86
+ return `${days} day${days === 1 ? '' : 's'}`;
87
+ }
88
+ if (hours > 0) {
89
+ return `${hours} hour${hours === 1 ? '' : 's'}`;
90
+ }
91
+ if (minutes > 0) {
92
+ return `${minutes} minute${minutes === 1 ? '' : 's'}`;
93
+ }
94
+ return `${seconds} second${seconds === 1 ? '' : 's'}`;
95
+ }
96
+ //# sourceMappingURL=ttl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttl.js","sourceRoot":"","sources":["../../src/cache/ttl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB;;;OAGG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAErC;;;OAGG;IACH,iBAAiB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAEjC;;;OAGG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAC/B,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAa;IACxD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC;IAC7B,OAAO,GAAG,IAAI,KAAK,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC;IAC7B,OAAO,KAAK,GAAG,GAAG,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAEpC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command for analyzing components.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerAnalyzeCommand(program: Command): void;
6
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B7D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * CLI command for analyzing components.
3
+ */
4
+ import { handleAnalyzeComponent } from '../../tools/analyze-component.js';
5
+ function printJson(text, json) {
6
+ if (json) {
7
+ console.log(text);
8
+ return;
9
+ }
10
+ const data = JSON.parse(text);
11
+ console.log(`${data.component} (${data.filePath})`);
12
+ console.log(`Action: ${data.recommendation.action}`);
13
+ console.log(`Confidence: ${data.recommendation.confidence}`);
14
+ console.log(`Reason: ${data.recommendation.reason}`);
15
+ if (data.isAmbiguous) {
16
+ console.log('Ambiguous: true');
17
+ }
18
+ }
19
+ export function registerAnalyzeCommand(program) {
20
+ program
21
+ .command('analyze')
22
+ .description('Analyze a React component for legacy Radix matches to inform Base UI migration (run from project dir; path is relative to cwd)')
23
+ .argument('<file>', 'Path to a .ts/.tsx component (relative to cwd)')
24
+ .option('-v, --version <version>', 'Radix version to compare against', 'latest')
25
+ .option('-t, --threshold <number>', 'Minimum confidence threshold', '40')
26
+ .option('-p, --provider <provider>', 'Component library provider', 'radix')
27
+ .option('--ruleset <ruleset>', 'Ruleset selection: base-ui, radix-legacy, or both', 'base-ui')
28
+ .option('--evidence <level>', 'Evidence verbosity: summary or verbose', 'summary')
29
+ .option('--json', 'Output raw JSON')
30
+ .action(async (filePath, options) => {
31
+ const response = await handleAnalyzeComponent({
32
+ filePath,
33
+ radixVersion: options.version,
34
+ threshold: Number(options.threshold),
35
+ provider: options.provider,
36
+ ruleset: options.ruleset,
37
+ evidence: options.evidence,
38
+ });
39
+ const text = response.content[0]?.text ?? '{}';
40
+ printJson(text, Boolean(options.json));
41
+ });
42
+ }
43
+ //# sourceMappingURL=analyze.js.map