@lyse-labs/lyse 0.1.0-alpha.2

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 (510) hide show
  1. package/LICENSE +45 -0
  2. package/PRIVACY.md +181 -0
  3. package/README.md +34 -0
  4. package/SECURITY.md +43 -0
  5. package/dist/bench/evidence-pack/anti-dummy.d.ts +11 -0
  6. package/dist/bench/evidence-pack/anti-dummy.js +20 -0
  7. package/dist/bench/evidence-pack/anti-dummy.js.map +1 -0
  8. package/dist/bench/evidence-pack/builder.d.ts +14 -0
  9. package/dist/bench/evidence-pack/builder.js +77 -0
  10. package/dist/bench/evidence-pack/builder.js.map +1 -0
  11. package/dist/bench/evidence-pack/histograms.d.ts +2 -0
  12. package/dist/bench/evidence-pack/histograms.js +131 -0
  13. package/dist/bench/evidence-pack/histograms.js.map +1 -0
  14. package/dist/bench/evidence-pack/manifest-detector.d.ts +2 -0
  15. package/dist/bench/evidence-pack/manifest-detector.js +65 -0
  16. package/dist/bench/evidence-pack/manifest-detector.js.map +1 -0
  17. package/dist/bench/evidence-pack/package-json-digest.d.ts +2 -0
  18. package/dist/bench/evidence-pack/package-json-digest.js +51 -0
  19. package/dist/bench/evidence-pack/package-json-digest.js.map +1 -0
  20. package/dist/bench/evidence-pack/sampler.d.ts +2 -0
  21. package/dist/bench/evidence-pack/sampler.js +140 -0
  22. package/dist/bench/evidence-pack/sampler.js.map +1 -0
  23. package/dist/bench/evidence-pack/types.d.ts +127 -0
  24. package/dist/bench/evidence-pack/types.js +2 -0
  25. package/dist/bench/evidence-pack/types.js.map +1 -0
  26. package/dist/bench/evidence-pack/verifier-corpus.d.ts +5 -0
  27. package/dist/bench/evidence-pack/verifier-corpus.js +13 -0
  28. package/dist/bench/evidence-pack/verifier-corpus.js.map +1 -0
  29. package/dist/bench/taxonomy-loader.d.ts +20 -0
  30. package/dist/bench/taxonomy-loader.js +28 -0
  31. package/dist/bench/taxonomy-loader.js.map +1 -0
  32. package/dist/bench/taxonomy.v3.json +20 -0
  33. package/dist/cli/__tests__/version-migration.test.d.ts +1 -0
  34. package/dist/cli/__tests__/version-migration.test.js +69 -0
  35. package/dist/cli/__tests__/version-migration.test.js.map +1 -0
  36. package/dist/cli/output/__tests__/eslint-style.test.d.ts +1 -0
  37. package/dist/cli/output/__tests__/eslint-style.test.js +205 -0
  38. package/dist/cli/output/__tests__/eslint-style.test.js.map +1 -0
  39. package/dist/cli/output/__tests__/limit.test.d.ts +1 -0
  40. package/dist/cli/output/__tests__/limit.test.js +65 -0
  41. package/dist/cli/output/__tests__/limit.test.js.map +1 -0
  42. package/dist/cli/output/eslint-style.d.ts +18 -0
  43. package/dist/cli/output/eslint-style.js +42 -0
  44. package/dist/cli/output/eslint-style.js.map +1 -0
  45. package/dist/cli/output/limit.d.ts +5 -0
  46. package/dist/cli/output/limit.js +32 -0
  47. package/dist/cli/output/limit.js.map +1 -0
  48. package/dist/cli/output/score-gauge.d.ts +4 -0
  49. package/dist/cli/output/score-gauge.js +15 -0
  50. package/dist/cli/output/score-gauge.js.map +1 -0
  51. package/dist/cli/version-migration.d.ts +18 -0
  52. package/dist/cli/version-migration.js +49 -0
  53. package/dist/cli/version-migration.js.map +1 -0
  54. package/dist/cli.d.ts +2 -0
  55. package/dist/cli.js +856 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/codemods/diff.d.ts +17 -0
  58. package/dist/codemods/diff.js +77 -0
  59. package/dist/codemods/diff.js.map +1 -0
  60. package/dist/codemods/git-helpers.d.ts +10 -0
  61. package/dist/codemods/git-helpers.js +75 -0
  62. package/dist/codemods/git-helpers.js.map +1 -0
  63. package/dist/codemods/index.d.ts +27 -0
  64. package/dist/codemods/index.js +40 -0
  65. package/dist/codemods/index.js.map +1 -0
  66. package/dist/codemods/naming-component-pascalcase.d.ts +13 -0
  67. package/dist/codemods/naming-component-pascalcase.js +106 -0
  68. package/dist/codemods/naming-component-pascalcase.js.map +1 -0
  69. package/dist/codemods/naming-hook-prefix.d.ts +13 -0
  70. package/dist/codemods/naming-hook-prefix.js +86 -0
  71. package/dist/codemods/naming-hook-prefix.js.map +1 -0
  72. package/dist/codemods/safety.d.ts +50 -0
  73. package/dist/codemods/safety.js +109 -0
  74. package/dist/codemods/safety.js.map +1 -0
  75. package/dist/codemods/safety.test.d.ts +1 -0
  76. package/dist/codemods/safety.test.js +154 -0
  77. package/dist/codemods/safety.test.js.map +1 -0
  78. package/dist/codemods/shadow-native.d.ts +2 -0
  79. package/dist/codemods/shadow-native.js +103 -0
  80. package/dist/codemods/shadow-native.js.map +1 -0
  81. package/dist/codemods/tokens-color.d.ts +2 -0
  82. package/dist/codemods/tokens-color.js +69 -0
  83. package/dist/codemods/tokens-color.js.map +1 -0
  84. package/dist/codemods/tokens-spacing.d.ts +2 -0
  85. package/dist/codemods/tokens-spacing.js +66 -0
  86. package/dist/codemods/tokens-spacing.js.map +1 -0
  87. package/dist/commands/__tests__/email-prompt.test.d.ts +1 -0
  88. package/dist/commands/__tests__/email-prompt.test.js +126 -0
  89. package/dist/commands/__tests__/email-prompt.test.js.map +1 -0
  90. package/dist/commands/__tests__/explain-score.test.d.ts +1 -0
  91. package/dist/commands/__tests__/explain-score.test.js +88 -0
  92. package/dist/commands/__tests__/explain-score.test.js.map +1 -0
  93. package/dist/commands/__tests__/feedback.test.d.ts +1 -0
  94. package/dist/commands/__tests__/feedback.test.js +186 -0
  95. package/dist/commands/__tests__/feedback.test.js.map +1 -0
  96. package/dist/commands/audit-flags.d.ts +49 -0
  97. package/dist/commands/audit-flags.js +17 -0
  98. package/dist/commands/audit-flags.js.map +1 -0
  99. package/dist/commands/audit-pipeline.d.ts +31 -0
  100. package/dist/commands/audit-pipeline.js +342 -0
  101. package/dist/commands/audit-pipeline.js.map +1 -0
  102. package/dist/commands/bench-pack.d.ts +5 -0
  103. package/dist/commands/bench-pack.js +61 -0
  104. package/dist/commands/bench-pack.js.map +1 -0
  105. package/dist/commands/ci-setup.d.ts +9 -0
  106. package/dist/commands/ci-setup.js +42 -0
  107. package/dist/commands/ci-setup.js.map +1 -0
  108. package/dist/commands/email-prompt.d.ts +36 -0
  109. package/dist/commands/email-prompt.js +160 -0
  110. package/dist/commands/email-prompt.js.map +1 -0
  111. package/dist/commands/explain-score.d.ts +35 -0
  112. package/dist/commands/explain-score.js +137 -0
  113. package/dist/commands/explain-score.js.map +1 -0
  114. package/dist/commands/explain.d.ts +6 -0
  115. package/dist/commands/explain.js +93 -0
  116. package/dist/commands/explain.js.map +1 -0
  117. package/dist/commands/feedback.d.ts +31 -0
  118. package/dist/commands/feedback.js +155 -0
  119. package/dist/commands/feedback.js.map +1 -0
  120. package/dist/commands/fix.d.ts +48 -0
  121. package/dist/commands/fix.js +191 -0
  122. package/dist/commands/fix.js.map +1 -0
  123. package/dist/commands/init-detect.d.ts +20 -0
  124. package/dist/commands/init-detect.js +124 -0
  125. package/dist/commands/init-detect.js.map +1 -0
  126. package/dist/commands/init-write-agents-md.d.ts +14 -0
  127. package/dist/commands/init-write-agents-md.js +71 -0
  128. package/dist/commands/init-write-agents-md.js.map +1 -0
  129. package/dist/commands/init-write-lyse-md.d.ts +14 -0
  130. package/dist/commands/init-write-lyse-md.js +253 -0
  131. package/dist/commands/init-write-lyse-md.js.map +1 -0
  132. package/dist/commands/init.d.ts +8 -0
  133. package/dist/commands/init.js +147 -0
  134. package/dist/commands/init.js.map +1 -0
  135. package/dist/commands/mcp-entry.d.ts +33 -0
  136. package/dist/commands/mcp-entry.js +47 -0
  137. package/dist/commands/mcp-entry.js.map +1 -0
  138. package/dist/commands/mcp-setup.d.ts +10 -0
  139. package/dist/commands/mcp-setup.js +74 -0
  140. package/dist/commands/mcp-setup.js.map +1 -0
  141. package/dist/commands/share.d.ts +4 -0
  142. package/dist/commands/share.js +60 -0
  143. package/dist/commands/share.js.map +1 -0
  144. package/dist/commands/telemetry.d.ts +4 -0
  145. package/dist/commands/telemetry.js +27 -0
  146. package/dist/commands/telemetry.js.map +1 -0
  147. package/dist/commands/templates/lyse-workflow.yml.template +30 -0
  148. package/dist/config/schema.d.ts +158 -0
  149. package/dist/config/schema.js +136 -0
  150. package/dist/config/schema.js.map +1 -0
  151. package/dist/credentials/keychain.d.ts +20 -0
  152. package/dist/credentials/keychain.js +35 -0
  153. package/dist/credentials/keychain.js.map +1 -0
  154. package/dist/credentials/keychain.test.d.ts +1 -0
  155. package/dist/credentials/keychain.test.js +32 -0
  156. package/dist/credentials/keychain.test.js.map +1 -0
  157. package/dist/credentials/paths.d.ts +1 -0
  158. package/dist/credentials/paths.js +6 -0
  159. package/dist/credentials/paths.js.map +1 -0
  160. package/dist/credentials/store.d.ts +17 -0
  161. package/dist/credentials/store.js +60 -0
  162. package/dist/credentials/store.js.map +1 -0
  163. package/dist/credentials/store.test.d.ts +1 -0
  164. package/dist/credentials/store.test.js +48 -0
  165. package/dist/credentials/store.test.js.map +1 -0
  166. package/dist/detection/from-filesystem.d.ts +2 -0
  167. package/dist/detection/from-filesystem.js +26 -0
  168. package/dist/detection/from-filesystem.js.map +1 -0
  169. package/dist/detection/from-git.d.ts +2 -0
  170. package/dist/detection/from-git.js +53 -0
  171. package/dist/detection/from-git.js.map +1 -0
  172. package/dist/detection/from-package-json.d.ts +2 -0
  173. package/dist/detection/from-package-json.js +194 -0
  174. package/dist/detection/from-package-json.js.map +1 -0
  175. package/dist/detection/pre-flight.d.ts +5 -0
  176. package/dist/detection/pre-flight.js +47 -0
  177. package/dist/detection/pre-flight.js.map +1 -0
  178. package/dist/detection/types.d.ts +27 -0
  179. package/dist/detection/types.js +2 -0
  180. package/dist/detection/types.js.map +1 -0
  181. package/dist/entitlement/check.d.ts +7 -0
  182. package/dist/entitlement/check.js +37 -0
  183. package/dist/entitlement/check.js.map +1 -0
  184. package/dist/entitlement/index.d.ts +1 -0
  185. package/dist/entitlement/index.js +2 -0
  186. package/dist/entitlement/index.js.map +1 -0
  187. package/dist/entitlement/keys.d.ts +10 -0
  188. package/dist/entitlement/keys.js +14 -0
  189. package/dist/entitlement/keys.js.map +1 -0
  190. package/dist/history/ndjson-store.d.ts +70 -0
  191. package/dist/history/ndjson-store.js +102 -0
  192. package/dist/history/ndjson-store.js.map +1 -0
  193. package/dist/identity/index.d.ts +1 -0
  194. package/dist/identity/index.js +2 -0
  195. package/dist/identity/index.js.map +1 -0
  196. package/dist/identity/repo-bucket.d.ts +22 -0
  197. package/dist/identity/repo-bucket.js +78 -0
  198. package/dist/identity/repo-bucket.js.map +1 -0
  199. package/dist/index.d.ts +1 -0
  200. package/dist/index.js +15 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/llm/layer4-stage.d.ts +18 -0
  203. package/dist/llm/layer4-stage.js +12 -0
  204. package/dist/llm/layer4-stage.js.map +1 -0
  205. package/dist/loaders/components.d.ts +26 -0
  206. package/dist/loaders/components.js +285 -0
  207. package/dist/loaders/components.js.map +1 -0
  208. package/dist/loaders/stories.d.ts +2 -0
  209. package/dist/loaders/stories.js +231 -0
  210. package/dist/loaders/stories.js.map +1 -0
  211. package/dist/loaders/token-graph.d.ts +39 -0
  212. package/dist/loaders/token-graph.js +146 -0
  213. package/dist/loaders/token-graph.js.map +1 -0
  214. package/dist/loaders/tokens.d.ts +2 -0
  215. package/dist/loaders/tokens.js +521 -0
  216. package/dist/loaders/tokens.js.map +1 -0
  217. package/dist/mcp/_find-root.d.ts +12 -0
  218. package/dist/mcp/_find-root.js +28 -0
  219. package/dist/mcp/_find-root.js.map +1 -0
  220. package/dist/mcp/server.d.ts +1 -0
  221. package/dist/mcp/server.js +42 -0
  222. package/dist/mcp/server.js.map +1 -0
  223. package/dist/mcp/tools/audit-file.d.ts +25 -0
  224. package/dist/mcp/tools/audit-file.js +147 -0
  225. package/dist/mcp/tools/audit-file.js.map +1 -0
  226. package/dist/mcp/tools/suggest-fix.d.ts +13 -0
  227. package/dist/mcp/tools/suggest-fix.js +100 -0
  228. package/dist/mcp/tools/suggest-fix.js.map +1 -0
  229. package/dist/menu/action-menu.d.ts +6 -0
  230. package/dist/menu/action-menu.js +15 -0
  231. package/dist/menu/action-menu.js.map +1 -0
  232. package/dist/menu/prompts.d.ts +7 -0
  233. package/dist/menu/prompts.js +30 -0
  234. package/dist/menu/prompts.js.map +1 -0
  235. package/dist/menu/repl.d.ts +17 -0
  236. package/dist/menu/repl.js +77 -0
  237. package/dist/menu/repl.js.map +1 -0
  238. package/dist/parsers/css-in-js.d.ts +2 -0
  239. package/dist/parsers/css-in-js.js +69 -0
  240. package/dist/parsers/css-in-js.js.map +1 -0
  241. package/dist/parsers/css.d.ts +2 -0
  242. package/dist/parsers/css.js +32 -0
  243. package/dist/parsers/css.js.map +1 -0
  244. package/dist/parsers/scss-transform.d.ts +25 -0
  245. package/dist/parsers/scss-transform.js +55 -0
  246. package/dist/parsers/scss-transform.js.map +1 -0
  247. package/dist/parsers/tailwind-v4.d.ts +8 -0
  248. package/dist/parsers/tailwind-v4.js +90 -0
  249. package/dist/parsers/tailwind-v4.js.map +1 -0
  250. package/dist/parsers/ts-morph-project.d.ts +16 -0
  251. package/dist/parsers/ts-morph-project.js +77 -0
  252. package/dist/parsers/ts-morph-project.js.map +1 -0
  253. package/dist/parsers/ts.d.ts +2 -0
  254. package/dist/parsers/ts.js +61 -0
  255. package/dist/parsers/ts.js.map +1 -0
  256. package/dist/reliability/__tests__/types.test.d.ts +1 -0
  257. package/dist/reliability/__tests__/types.test.js +14 -0
  258. package/dist/reliability/__tests__/types.test.js.map +1 -0
  259. package/dist/reliability/catalogue/__tests__/promotion.test.d.ts +1 -0
  260. package/dist/reliability/catalogue/__tests__/promotion.test.js +23 -0
  261. package/dist/reliability/catalogue/__tests__/promotion.test.js.map +1 -0
  262. package/dist/reliability/catalogue/__tests__/sub-axes.test.d.ts +1 -0
  263. package/dist/reliability/catalogue/__tests__/sub-axes.test.js +27 -0
  264. package/dist/reliability/catalogue/__tests__/sub-axes.test.js.map +1 -0
  265. package/dist/reliability/catalogue/promotion.d.ts +8 -0
  266. package/dist/reliability/catalogue/promotion.js +25 -0
  267. package/dist/reliability/catalogue/promotion.js.map +1 -0
  268. package/dist/reliability/catalogue/sub-axes.d.ts +3 -0
  269. package/dist/reliability/catalogue/sub-axes.js +18 -0
  270. package/dist/reliability/catalogue/sub-axes.js.map +1 -0
  271. package/dist/reliability/confidence/__tests__/manifest-loader.test.d.ts +1 -0
  272. package/dist/reliability/confidence/__tests__/manifest-loader.test.js +103 -0
  273. package/dist/reliability/confidence/__tests__/manifest-loader.test.js.map +1 -0
  274. package/dist/reliability/confidence/bundled-manifest.d.ts +2 -0
  275. package/dist/reliability/confidence/bundled-manifest.js +8 -0
  276. package/dist/reliability/confidence/bundled-manifest.js.map +1 -0
  277. package/dist/reliability/confidence/index.d.ts +3 -0
  278. package/dist/reliability/confidence/index.js +3 -0
  279. package/dist/reliability/confidence/index.js.map +1 -0
  280. package/dist/reliability/confidence/manifest-loader.d.ts +8 -0
  281. package/dist/reliability/confidence/manifest-loader.js +53 -0
  282. package/dist/reliability/confidence/manifest-loader.js.map +1 -0
  283. package/dist/reliability/feedback/__tests__/interactive.test.d.ts +1 -0
  284. package/dist/reliability/feedback/__tests__/interactive.test.js +85 -0
  285. package/dist/reliability/feedback/__tests__/interactive.test.js.map +1 -0
  286. package/dist/reliability/feedback/__tests__/repo-bucket.test.d.ts +1 -0
  287. package/dist/reliability/feedback/__tests__/repo-bucket.test.js +18 -0
  288. package/dist/reliability/feedback/__tests__/repo-bucket.test.js.map +1 -0
  289. package/dist/reliability/feedback/__tests__/sender.test.d.ts +1 -0
  290. package/dist/reliability/feedback/__tests__/sender.test.js +101 -0
  291. package/dist/reliability/feedback/__tests__/sender.test.js.map +1 -0
  292. package/dist/reliability/feedback/interactive.d.ts +20 -0
  293. package/dist/reliability/feedback/interactive.js +150 -0
  294. package/dist/reliability/feedback/interactive.js.map +1 -0
  295. package/dist/reliability/feedback/repo-bucket.d.ts +2 -0
  296. package/dist/reliability/feedback/repo-bucket.js +9 -0
  297. package/dist/reliability/feedback/repo-bucket.js.map +1 -0
  298. package/dist/reliability/feedback/sender.d.ts +16 -0
  299. package/dist/reliability/feedback/sender.js +28 -0
  300. package/dist/reliability/feedback/sender.js.map +1 -0
  301. package/dist/reliability/index.d.ts +1 -0
  302. package/dist/reliability/index.js +2 -0
  303. package/dist/reliability/index.js.map +1 -0
  304. package/dist/reliability/llm-eval/__tests__/budget.test.d.ts +1 -0
  305. package/dist/reliability/llm-eval/__tests__/budget.test.js +39 -0
  306. package/dist/reliability/llm-eval/__tests__/budget.test.js.map +1 -0
  307. package/dist/reliability/llm-eval/budget.d.ts +14 -0
  308. package/dist/reliability/llm-eval/budget.js +43 -0
  309. package/dist/reliability/llm-eval/budget.js.map +1 -0
  310. package/dist/reliability/score/__tests__/formula-v1.test.d.ts +1 -0
  311. package/dist/reliability/score/__tests__/formula-v1.test.js +29 -0
  312. package/dist/reliability/score/__tests__/formula-v1.test.js.map +1 -0
  313. package/dist/reliability/score/formula-v1.d.ts +13 -0
  314. package/dist/reliability/score/formula-v1.js +19 -0
  315. package/dist/reliability/score/formula-v1.js.map +1 -0
  316. package/dist/reliability/score/version-pin.d.ts +1 -0
  317. package/dist/reliability/score/version-pin.js +2 -0
  318. package/dist/reliability/score/version-pin.js.map +1 -0
  319. package/dist/reliability/score/weight.d.ts +1 -0
  320. package/dist/reliability/score/weight.js +5 -0
  321. package/dist/reliability/score/weight.js.map +1 -0
  322. package/dist/reliability/types.d.ts +39 -0
  323. package/dist/reliability/types.js +2 -0
  324. package/dist/reliability/types.js.map +1 -0
  325. package/dist/reporters/coverage-footer.d.ts +2 -0
  326. package/dist/reporters/coverage-footer.js +7 -0
  327. package/dist/reporters/coverage-footer.js.map +1 -0
  328. package/dist/reporters/json.d.ts +5 -0
  329. package/dist/reporters/json.js +51 -0
  330. package/dist/reporters/json.js.map +1 -0
  331. package/dist/reporters/markdown.d.ts +7 -0
  332. package/dist/reporters/markdown.js +35 -0
  333. package/dist/reporters/markdown.js.map +1 -0
  334. package/dist/reporters/sarif.d.ts +5 -0
  335. package/dist/reporters/sarif.js +109 -0
  336. package/dist/reporters/sarif.js.map +1 -0
  337. package/dist/reporters/terminal-format.d.ts +34 -0
  338. package/dist/reporters/terminal-format.js +97 -0
  339. package/dist/reporters/terminal-format.js.map +1 -0
  340. package/dist/reporters/terminal.d.ts +4 -0
  341. package/dist/reporters/terminal.js +201 -0
  342. package/dist/reporters/terminal.js.map +1 -0
  343. package/dist/rule-runner.d.ts +8 -0
  344. package/dist/rule-runner.js +22 -0
  345. package/dist/rule-runner.js.map +1 -0
  346. package/dist/rules/_codemod-adapter.d.ts +16 -0
  347. package/dist/rules/_codemod-adapter.js +49 -0
  348. package/dist/rules/_codemod-adapter.js.map +1 -0
  349. package/dist/rules/_exclude.d.ts +11 -0
  350. package/dist/rules/_exclude.js +17 -0
  351. package/dist/rules/_exclude.js.map +1 -0
  352. package/dist/rules/_function-body-analysis.d.ts +82 -0
  353. package/dist/rules/_function-body-analysis.js +379 -0
  354. package/dist/rules/_function-body-analysis.js.map +1 -0
  355. package/dist/rules/_rule-module.d.ts +31 -0
  356. package/dist/rules/_rule-module.js +32 -0
  357. package/dist/rules/_rule-module.js.map +1 -0
  358. package/dist/rules/_skip-context.d.ts +36 -0
  359. package/dist/rules/_skip-context.js +128 -0
  360. package/dist/rules/_skip-context.js.map +1 -0
  361. package/dist/rules/a11y-essentials.d.ts +1 -0
  362. package/dist/rules/a11y-essentials.js +140 -0
  363. package/dist/rules/a11y-essentials.js.map +1 -0
  364. package/dist/rules/ai-surface-agents-md-quality.d.ts +22 -0
  365. package/dist/rules/ai-surface-agents-md-quality.js +233 -0
  366. package/dist/rules/ai-surface-agents-md-quality.js.map +1 -0
  367. package/dist/rules/ai-surface-component-manifest-json.d.ts +19 -0
  368. package/dist/rules/ai-surface-component-manifest-json.js +232 -0
  369. package/dist/rules/ai-surface-component-manifest-json.js.map +1 -0
  370. package/dist/rules/ai-surface-ds-index-exported.d.ts +19 -0
  371. package/dist/rules/ai-surface-ds-index-exported.js +239 -0
  372. package/dist/rules/ai-surface-ds-index-exported.js.map +1 -0
  373. package/dist/rules/components-shadow-native.d.ts +2 -0
  374. package/dist/rules/components-shadow-native.js +118 -0
  375. package/dist/rules/components-shadow-native.js.map +1 -0
  376. package/dist/rules/manifest.d.ts +5 -0
  377. package/dist/rules/manifest.js +20 -0
  378. package/dist/rules/manifest.js.map +1 -0
  379. package/dist/rules/naming-component-pascalcase.d.ts +7 -0
  380. package/dist/rules/naming-component-pascalcase.js +197 -0
  381. package/dist/rules/naming-component-pascalcase.js.map +1 -0
  382. package/dist/rules/naming-hook-prefix.d.ts +6 -0
  383. package/dist/rules/naming-hook-prefix.js +185 -0
  384. package/dist/rules/naming-hook-prefix.js.map +1 -0
  385. package/dist/rules/pack-loader.d.ts +30 -0
  386. package/dist/rules/pack-loader.js +60 -0
  387. package/dist/rules/pack-loader.js.map +1 -0
  388. package/dist/rules/pack-validator.d.ts +8 -0
  389. package/dist/rules/pack-validator.js +97 -0
  390. package/dist/rules/pack-validator.js.map +1 -0
  391. package/dist/rules/registry.d.ts +3 -0
  392. package/dist/rules/registry.js +28 -0
  393. package/dist/rules/registry.js.map +1 -0
  394. package/dist/rules/storybook-coverage.d.ts +1 -0
  395. package/dist/rules/storybook-coverage.js +49 -0
  396. package/dist/rules/storybook-coverage.js.map +1 -0
  397. package/dist/rules/templates/_regex-utils.d.ts +5 -0
  398. package/dist/rules/templates/_regex-utils.js +8 -0
  399. package/dist/rules/templates/_regex-utils.js.map +1 -0
  400. package/dist/rules/templates/a11y-jsx-template.d.ts +15 -0
  401. package/dist/rules/templates/a11y-jsx-template.js +69 -0
  402. package/dist/rules/templates/a11y-jsx-template.js.map +1 -0
  403. package/dist/rules/templates/css-property-token-compliance.d.ts +18 -0
  404. package/dist/rules/templates/css-property-token-compliance.js +56 -0
  405. package/dist/rules/templates/css-property-token-compliance.js.map +1 -0
  406. package/dist/rules/templates/import-source-restriction.d.ts +18 -0
  407. package/dist/rules/templates/import-source-restriction.js +60 -0
  408. package/dist/rules/templates/import-source-restriction.js.map +1 -0
  409. package/dist/rules/templates/js-call-token-compliance.d.ts +18 -0
  410. package/dist/rules/templates/js-call-token-compliance.js +61 -0
  411. package/dist/rules/templates/js-call-token-compliance.js.map +1 -0
  412. package/dist/rules/templates/js-prop-token-compliance.d.ts +21 -0
  413. package/dist/rules/templates/js-prop-token-compliance.js +56 -0
  414. package/dist/rules/templates/js-prop-token-compliance.js.map +1 -0
  415. package/dist/rules/templates/naming-convention.d.ts +18 -0
  416. package/dist/rules/templates/naming-convention.js +76 -0
  417. package/dist/rules/templates/naming-convention.js.map +1 -0
  418. package/dist/rules/templates/registry.d.ts +5 -0
  419. package/dist/rules/templates/registry.js +30 -0
  420. package/dist/rules/templates/registry.js.map +1 -0
  421. package/dist/rules/templates/storybook-coverage-template.d.ts +15 -0
  422. package/dist/rules/templates/storybook-coverage-template.js +58 -0
  423. package/dist/rules/templates/storybook-coverage-template.js.map +1 -0
  424. package/dist/rules/templates/tailwind-utility-class-compliance.d.ts +15 -0
  425. package/dist/rules/templates/tailwind-utility-class-compliance.js +70 -0
  426. package/dist/rules/templates/tailwind-utility-class-compliance.js.map +1 -0
  427. package/dist/rules/templates/types.d.ts +16 -0
  428. package/dist/rules/templates/types.js +2 -0
  429. package/dist/rules/templates/types.js.map +1 -0
  430. package/dist/rules/tokens-description-coverage.d.ts +15 -0
  431. package/dist/rules/tokens-description-coverage.js +193 -0
  432. package/dist/rules/tokens-description-coverage.js.map +1 -0
  433. package/dist/rules/tokens-dtcg-conformance.d.ts +47 -0
  434. package/dist/rules/tokens-dtcg-conformance.js +363 -0
  435. package/dist/rules/tokens-dtcg-conformance.js.map +1 -0
  436. package/dist/rules/tokens-no-hardcoded-color.d.ts +18 -0
  437. package/dist/rules/tokens-no-hardcoded-color.js +436 -0
  438. package/dist/rules/tokens-no-hardcoded-color.js.map +1 -0
  439. package/dist/rules/tokens-no-hardcoded-spacing.d.ts +8 -0
  440. package/dist/rules/tokens-no-hardcoded-spacing.js +193 -0
  441. package/dist/rules/tokens-no-hardcoded-spacing.js.map +1 -0
  442. package/dist/scorer.d.ts +38 -0
  443. package/dist/scorer.js +126 -0
  444. package/dist/scorer.js.map +1 -0
  445. package/dist/share/clipboard.d.ts +26 -0
  446. package/dist/share/clipboard.js +76 -0
  447. package/dist/share/clipboard.js.map +1 -0
  448. package/dist/suppression/__tests__/inline.test.d.ts +1 -0
  449. package/dist/suppression/__tests__/inline.test.js +25 -0
  450. package/dist/suppression/__tests__/inline.test.js.map +1 -0
  451. package/dist/suppression/__tests__/lyseignore.test.d.ts +1 -0
  452. package/dist/suppression/__tests__/lyseignore.test.js +32 -0
  453. package/dist/suppression/__tests__/lyseignore.test.js.map +1 -0
  454. package/dist/suppression/defaults.d.ts +1 -0
  455. package/dist/suppression/defaults.js +14 -0
  456. package/dist/suppression/defaults.js.map +1 -0
  457. package/dist/suppression/inline.d.ts +7 -0
  458. package/dist/suppression/inline.js +32 -0
  459. package/dist/suppression/inline.js.map +1 -0
  460. package/dist/suppression/lyseignore.d.ts +2 -0
  461. package/dist/suppression/lyseignore.js +22 -0
  462. package/dist/suppression/lyseignore.js.map +1 -0
  463. package/dist/telemetry/consent.d.ts +48 -0
  464. package/dist/telemetry/consent.js +139 -0
  465. package/dist/telemetry/consent.js.map +1 -0
  466. package/dist/telemetry/index.d.ts +2 -0
  467. package/dist/telemetry/index.js +3 -0
  468. package/dist/telemetry/index.js.map +1 -0
  469. package/dist/telemetry/local-log.d.ts +64 -0
  470. package/dist/telemetry/local-log.js +123 -0
  471. package/dist/telemetry/local-log.js.map +1 -0
  472. package/dist/tokens/dtcg-model.d.ts +53 -0
  473. package/dist/tokens/dtcg-model.js +18 -0
  474. package/dist/tokens/dtcg-model.js.map +1 -0
  475. package/dist/tokens/normalizer.d.ts +17 -0
  476. package/dist/tokens/normalizer.js +360 -0
  477. package/dist/tokens/normalizer.js.map +1 -0
  478. package/dist/types.d.ts +300 -0
  479. package/dist/types.js +4 -0
  480. package/dist/types.js.map +1 -0
  481. package/dist/util/git.d.ts +6 -0
  482. package/dist/util/git.js +40 -0
  483. package/dist/util/git.js.map +1 -0
  484. package/dist/util/git.test.d.ts +5 -0
  485. package/dist/util/git.test.js +42 -0
  486. package/dist/util/git.test.js.map +1 -0
  487. package/dist/util/gitignore.d.ts +9 -0
  488. package/dist/util/gitignore.js +39 -0
  489. package/dist/util/gitignore.js.map +1 -0
  490. package/dist/util/hash-deps.d.ts +6 -0
  491. package/dist/util/hash-deps.js +24 -0
  492. package/dist/util/hash-deps.js.map +1 -0
  493. package/dist/util/spinner.d.ts +41 -0
  494. package/dist/util/spinner.js +126 -0
  495. package/dist/util/spinner.js.map +1 -0
  496. package/dist/util/with-spinner.d.ts +11 -0
  497. package/dist/util/with-spinner.js +19 -0
  498. package/dist/util/with-spinner.js.map +1 -0
  499. package/dist/walker.d.ts +14 -0
  500. package/dist/walker.js +91 -0
  501. package/dist/walker.js.map +1 -0
  502. package/package.json +83 -0
  503. package/rules-manifest.json +289 -0
  504. package/schemas/v1/lyse-config.json +82 -0
  505. package/schemas/v1/lyse-event.json +68 -0
  506. package/schemas/v1/lyse-license.json +19 -0
  507. package/schemas/v1/lyse-llm-payload.json +53 -0
  508. package/schemas/v1/lyse-llm-response.json +45 -0
  509. package/schemas/v1/lyse-result.json +98 -0
  510. package/schemas/v1/lyse-rules.json +42 -0
@@ -0,0 +1,25 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const auditFileTool: Tool;
3
+ interface AuditFileInput {
4
+ path?: unknown;
5
+ content?: unknown;
6
+ project_root?: unknown;
7
+ }
8
+ type SuggestionUnavailableReason = "no_token_registry" | "rule_not_auto_fixable" | "unsupported_stack" | "internal_error";
9
+ interface AuditFileResult {
10
+ schema_version: "1.0.0";
11
+ violations: Array<{
12
+ rule_id: string;
13
+ severity: "error" | "warning" | "info";
14
+ range: {
15
+ line: number;
16
+ column: number;
17
+ };
18
+ message: string;
19
+ suggestion_available: boolean;
20
+ suggestion?: string;
21
+ reason?: SuggestionUnavailableReason;
22
+ }>;
23
+ }
24
+ export declare function runAuditFile(input: AuditFileInput): Promise<AuditFileResult>;
25
+ export {};
@@ -0,0 +1,147 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { findProjectRoot } from "../_find-root.js";
4
+ import { parseTs } from "../../parsers/ts.js";
5
+ import { parseCss } from "../../parsers/css.js";
6
+ import { extractCssInJs } from "../../parsers/css-in-js.js";
7
+ import { loadTokens } from "../../loaders/tokens.js";
8
+ import { loadStories } from "../../loaders/stories.js";
9
+ import { rule as r1 } from "../../rules/tokens-no-hardcoded-color.js";
10
+ import { rule as r2 } from "../../rules/tokens-no-hardcoded-spacing.js";
11
+ import { rule as r3 } from "../../rules/components-shadow-native.js";
12
+ import { rule as r4 } from "../../rules/a11y-essentials.js";
13
+ import { rule as r5 } from "../../rules/storybook-coverage.js";
14
+ import { runRules } from "../../rule-runner.js";
15
+ export const auditFileTool = {
16
+ name: "audit_file",
17
+ description: "Audit a single file against the Lyse design system rules. Supports auditing UNSAVED buffers — pass the file's `content` and the agent's in-progress code is checked before it touches disk.",
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {
21
+ path: {
22
+ type: "string",
23
+ description: "Path to the file to audit (relative to project root or absolute).",
24
+ },
25
+ content: {
26
+ type: "string",
27
+ description: "Optional in-memory file content. If provided, the file at `path` is NOT read from disk — the audit runs against this string. Use this to check an unsaved buffer.",
28
+ },
29
+ project_root: {
30
+ type: "string",
31
+ description: "Optional project root for resolving config and tokens. Defaults to the directory containing `path` (walked up to find .lyse.yaml or .git).",
32
+ },
33
+ },
34
+ required: ["path"],
35
+ },
36
+ };
37
+ const AUTO_FIXABLE_RULES = new Set([
38
+ "tokens/no-hardcoded-color",
39
+ "tokens/no-hardcoded-spacing",
40
+ "components/no-native-shadows",
41
+ ]);
42
+ export async function runAuditFile(input) {
43
+ if (typeof input.path !== "string") {
44
+ return {
45
+ schema_version: "1.0.0",
46
+ violations: [
47
+ {
48
+ rule_id: "internal",
49
+ severity: "error",
50
+ range: { line: 0, column: 0 },
51
+ message: "`path` argument is required and must be a string",
52
+ suggestion_available: false,
53
+ reason: "internal_error",
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ const filePath = input.path;
59
+ const content = typeof input.content === "string" ? input.content : null;
60
+ const projectRoot = typeof input.project_root === "string" ? resolve(input.project_root) : findProjectRoot(filePath);
61
+ const source = content ?? (existsSync(filePath) ? readFileSync(filePath, "utf8") : null);
62
+ if (source === null) {
63
+ return {
64
+ schema_version: "1.0.0",
65
+ violations: [
66
+ {
67
+ rule_id: "internal",
68
+ severity: "error",
69
+ range: { line: 0, column: 0 },
70
+ message: `Could not read file: ${filePath}`,
71
+ suggestion_available: false,
72
+ reason: "internal_error",
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ // Build a minimal ParsedFiles for ONE file
78
+ const rel = filePath.startsWith(projectRoot + "/") ? filePath.slice(projectRoot.length + 1) : filePath;
79
+ const parsed = { ts: [], css: [], cssInJs: [] };
80
+ if (/\.(tsx?|jsx?|mjs|cjs)$/.test(filePath)) {
81
+ parsed.ts.push(await parseTs(rel, source));
82
+ parsed.cssInJs.push(...extractCssInJs(rel, source));
83
+ }
84
+ else if (/\.(s?css)$/.test(filePath)) {
85
+ parsed.css.push(await parseCss(rel, source));
86
+ }
87
+ else {
88
+ return {
89
+ schema_version: "1.0.0",
90
+ violations: [
91
+ {
92
+ rule_id: "internal",
93
+ severity: "info",
94
+ range: { line: 0, column: 0 },
95
+ message: `Unsupported file type: ${filePath} (Lyse audits .ts/.tsx/.js/.jsx/.mjs/.cjs/.css/.scss)`,
96
+ suggestion_available: false,
97
+ reason: "unsupported_stack",
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ // Load project context (tokens, stories, etc.) — same as full audit
103
+ const tokens = await loadTokens(projectRoot);
104
+ const storyIndex = await loadStories(projectRoot);
105
+ const ctx = {
106
+ repoRoot: projectRoot,
107
+ tokens,
108
+ componentsModule: null, // single-file mode: no inventory crosswalk
109
+ componentInventory: [],
110
+ storyIndex,
111
+ excludePaths: [],
112
+ };
113
+ const rules = [r1, r2, r3, r4, r5];
114
+ const runResult = await runRules(rules, ctx, parsed);
115
+ // `loadTokens()` returns `TokenMap | null`. A null return ===
116
+ // "no registry at all" (no .lyse.yaml, no Tailwind config, no DTCG
117
+ // file, no CSS vars). A populated TokenMap with an empty axis-specific
118
+ // map is a different signal — the rule had a registry to consult, it
119
+ // just found no matching target token. We do NOT label that case as
120
+ // `no_token_registry` (issue #88's enum doesn't have a separate value
121
+ // for it; defer to a follow-up if needed).
122
+ const tokenRegistryAbsent = tokens === null;
123
+ return {
124
+ schema_version: "1.0.0",
125
+ violations: runResult.findings.map((f) => {
126
+ const hasSuggestion = !!f.suggestion;
127
+ const base = {
128
+ rule_id: f.ruleId,
129
+ severity: f.severity,
130
+ range: { line: f.location.line, column: f.location.column },
131
+ message: f.message,
132
+ suggestion_available: hasSuggestion,
133
+ ...(f.suggestion ? { suggestion: f.suggestion } : {}),
134
+ };
135
+ if (hasSuggestion)
136
+ return base;
137
+ if (!AUTO_FIXABLE_RULES.has(f.ruleId)) {
138
+ return { ...base, reason: "rule_not_auto_fixable" };
139
+ }
140
+ if (tokenRegistryAbsent) {
141
+ return { ...base, reason: "no_token_registry" };
142
+ }
143
+ return base;
144
+ }),
145
+ };
146
+ }
147
+ //# sourceMappingURL=audit-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-file.js","sourceRoot":"","sources":["../../../src/mcp/tools/audit-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,yCAAyC,CAAC;AACrE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,6LAA6L;IAC/L,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mEAAmE;aACjF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mKAAmK;aACtK;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4IAA4I;aAC/I;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AA2BF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,2BAA2B;IAC3B,6BAA6B;IAC7B,8BAA8B;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB;IACtD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,cAAc,EAAE,OAAO;YACvB,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC7B,OAAO,EAAE,kDAAkD;oBAC3D,oBAAoB,EAAE,KAAK;oBAC3B,MAAM,EAAE,gBAAgB;iBACzB;aACF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,WAAW,GACf,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEnG,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,cAAc,EAAE,OAAO;YACvB,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC7B,OAAO,EAAE,wBAAwB,QAAQ,EAAE;oBAC3C,oBAAoB,EAAE,KAAK;oBAC3B,MAAM,EAAE,gBAAgB;iBACzB;aACF;SACF,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvG,MAAM,MAAM,GAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7D,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO;YACL,cAAc,EAAE,OAAO;YACvB,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAC7B,OAAO,EAAE,0BAA0B,QAAQ,uDAAuD;oBAClG,oBAAoB,EAAE,KAAK;oBAC3B,MAAM,EAAE,mBAAmB;iBAC5B;aACF;SACF,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,GAAG,GAAgB;QACvB,QAAQ,EAAE,WAAW;QACrB,MAAM;QACN,gBAAgB,EAAE,IAAI,EAAE,2CAA2C;QACnE,kBAAkB,EAAE,EAAE;QACtB,UAAU;QACV,YAAY,EAAE,EAAE;KACjB,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAErD,8DAA8D;IAC9D,mEAAmE;IACnE,uEAAuE;IACvE,qEAAqE;IACrE,oEAAoE;IACpE,sEAAsE;IACtE,2CAA2C;IAC3C,MAAM,mBAAmB,GAAG,MAAM,KAAK,IAAI,CAAC;IAE5C,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvC,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACrC,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,CAAC,CAAC,MAAM;gBACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC3D,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,oBAAoB,EAAE,aAAa;gBACnC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;YACF,IAAI,aAAa;gBAAE,OAAO,IAAI,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,uBAAgC,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,mBAA4B,EAAE,CAAC;YAC3D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { type CodemodResult } from "../../codemods/index.js";
3
+ export declare const suggestFixTool: Tool;
4
+ interface SuggestFixInput {
5
+ path?: unknown;
6
+ content?: unknown;
7
+ project_root?: unknown;
8
+ rule_id?: unknown;
9
+ line?: unknown;
10
+ column?: unknown;
11
+ }
12
+ export declare function runSuggestFix(input: SuggestFixInput): Promise<CodemodResult>;
13
+ export {};
@@ -0,0 +1,100 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { findProjectRoot } from "../_find-root.js";
4
+ import { loadTokens } from "../../loaders/tokens.js";
5
+ import { loadStories } from "../../loaders/stories.js";
6
+ import { loadConfig } from "../../config/schema.js";
7
+ import { applyCodemod } from "../../codemods/index.js";
8
+ export const suggestFixTool = {
9
+ name: "suggest_fix",
10
+ description: "For a given finding (rule_id + path + line), return a unified-diff patch that fixes it. " +
11
+ "**Only call when the corresponding `audit_file` finding has `suggestion_available: true`** — " +
12
+ "otherwise the patch will be `null` with a rationale. Auto-fixable rules: " +
13
+ "tokens/no-hardcoded-color, tokens/no-hardcoded-spacing, components/no-native-shadows.",
14
+ inputSchema: {
15
+ type: "object",
16
+ properties: {
17
+ path: { type: "string", description: "Path to the file." },
18
+ content: {
19
+ type: "string",
20
+ description: "Optional unsaved buffer content. If provided, the file is not read from disk.",
21
+ },
22
+ project_root: {
23
+ type: "string",
24
+ description: "Optional project root for resolving config and tokens.",
25
+ },
26
+ rule_id: { type: "string", description: "The rule id to fix." },
27
+ line: { type: "integer", description: "Line number of the finding (1-based)." },
28
+ column: { type: "integer", description: "Column of the finding (1-based)." },
29
+ },
30
+ required: ["path", "rule_id", "line"],
31
+ },
32
+ };
33
+ function synthesizeMessage(ruleId, source, line) {
34
+ // For shadow-native, the message format is parsed by the codemod to extract the tag name.
35
+ // Synthesize a finding-like message so the codemod can extract the tag.
36
+ if (ruleId === "components/no-native-shadows") {
37
+ const lineText = source.split("\n")[line - 1] ?? "";
38
+ const tagMatch = lineText.match(/<(button|a|input|select|textarea)\b/);
39
+ if (tagMatch) {
40
+ return `Native <${tagMatch[1]}> used where <DS-equivalent> from <module> is available`;
41
+ }
42
+ return "shadow-native";
43
+ }
44
+ return `${ruleId} at line ${line}`;
45
+ }
46
+ export async function runSuggestFix(input) {
47
+ if (typeof input.path !== "string" ||
48
+ typeof input.rule_id !== "string" ||
49
+ typeof input.line !== "number") {
50
+ return {
51
+ patch: null,
52
+ confidence: 0,
53
+ alternatives: [],
54
+ rationale: "Required args: path (string), rule_id (string), line (integer).",
55
+ rule_id: typeof input.rule_id === "string" ? input.rule_id : "internal",
56
+ schema_version: "1.0.0",
57
+ };
58
+ }
59
+ const filePath = input.path;
60
+ const content = typeof input.content === "string" ? input.content : null;
61
+ const projectRoot = typeof input.project_root === "string"
62
+ ? resolve(input.project_root)
63
+ : findProjectRoot(filePath);
64
+ const source = content ?? (existsSync(filePath) ? readFileSync(filePath, "utf8") : null);
65
+ if (source === null) {
66
+ return {
67
+ patch: null,
68
+ confidence: 0,
69
+ alternatives: [],
70
+ rationale: `Could not read file: ${filePath}`,
71
+ rule_id: input.rule_id,
72
+ schema_version: "1.0.0",
73
+ };
74
+ }
75
+ const config = loadConfig(projectRoot, { onError: "degrade" });
76
+ const componentsModule = config.designSystem?.componentsModule ?? null;
77
+ const tokens = await loadTokens(projectRoot);
78
+ const storyIndex = await loadStories(projectRoot);
79
+ const finding = {
80
+ ruleId: input.rule_id,
81
+ axis: "tokens", // any — codemod doesn't use this
82
+ severity: "warning",
83
+ location: {
84
+ file: filePath,
85
+ line: input.line,
86
+ column: typeof input.column === "number" ? input.column : 1,
87
+ },
88
+ message: synthesizeMessage(input.rule_id, source, input.line),
89
+ };
90
+ const ctx = {
91
+ repoRoot: projectRoot,
92
+ tokens,
93
+ componentsModule,
94
+ componentInventory: [],
95
+ storyIndex,
96
+ excludePaths: [],
97
+ };
98
+ return applyCodemod({ source, path: filePath, finding, ctx });
99
+ }
100
+ //# sourceMappingURL=suggest-fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-fix.js","sourceRoot":"","sources":["../../../src/mcp/tools/suggest-fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type MenuChoice = "fix" | "mcp-setup" | "exit";
2
+ export interface MenuContext {
3
+ autoFixableCount: number;
4
+ detectedIDE: boolean;
5
+ }
6
+ export declare function showActionMenu(ctx: MenuContext): Promise<MenuChoice>;
@@ -0,0 +1,15 @@
1
+ import { choice, isInteractive } from "./prompts.js";
2
+ export async function showActionMenu(ctx) {
3
+ if (!isInteractive())
4
+ return "exit";
5
+ const choices = [];
6
+ if (ctx.autoFixableCount > 0) {
7
+ choices.push({ title: `Auto-fix ${ctx.autoFixableCount} high-confidence findings`, value: "fix" });
8
+ }
9
+ if (ctx.detectedIDE) {
10
+ choices.push({ title: "Wire into Cursor / Claude Code", value: "mcp-setup" });
11
+ }
12
+ choices.push({ title: "Exit", value: "exit" });
13
+ return await choice("What now?", choices, ctx.autoFixableCount > 0 ? "fix" : "exit");
14
+ }
15
+ //# sourceMappingURL=action-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-menu.js","sourceRoot":"","sources":["../../src/menu/action-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AASrD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAgB;IACnD,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO,MAAM,CAAC;IAEpC,MAAM,OAAO,GAA2C,EAAE,CAAC;IAC3D,IAAI,GAAG,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,CAAC,gBAAgB,2BAA2B,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/C,OAAO,MAAM,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function confirm(message: string, defaultYes?: boolean): Promise<boolean>;
2
+ export declare function choice<T extends string>(message: string, choices: {
3
+ title: string;
4
+ value: T;
5
+ description?: string;
6
+ }[], defaultValue?: T): Promise<T>;
7
+ export declare function isInteractive(): boolean;
@@ -0,0 +1,30 @@
1
+ import prompts from "prompts";
2
+ export async function confirm(message, defaultYes = true) {
3
+ if (!isInteractive())
4
+ return defaultYes;
5
+ const r = await prompts({ type: "confirm", name: "v", message, initial: defaultYes });
6
+ return r.v;
7
+ }
8
+ export async function choice(message, choices, defaultValue) {
9
+ if (!isInteractive()) {
10
+ return defaultValue ?? choices[0].value;
11
+ }
12
+ const r = await prompts({
13
+ type: "select",
14
+ name: "v",
15
+ message,
16
+ choices: choices.map(c => ({ title: c.title, value: c.value, description: c.description })),
17
+ initial: defaultValue ? choices.findIndex(c => c.value === defaultValue) : 0,
18
+ });
19
+ return r.v;
20
+ }
21
+ export function isInteractive() {
22
+ if (process.env.LYSE_YES === "1")
23
+ return false;
24
+ if (process.env.LYSE_NO_PROMPT === "1")
25
+ return false;
26
+ if (process.env.CI === "true" || process.env.CI === "1")
27
+ return false;
28
+ return !!process.stdout.isTTY;
29
+ }
30
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/menu/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,aAAsB,IAAI;IACvE,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO,UAAU,CAAC;IACxC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,CAAC,CAAY,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAe,EACf,OAA4D,EAC5D,YAAgB;IAEhB,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,OAAO,YAAY,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;IAC3C,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC;QACtB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,GAAG;QACT,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3F,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7E,CAAC,CAAC;IACH,OAAO,CAAC,CAAC,CAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACtE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAChC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type ReplActionId = "audit" | "fix" | "mcp-setup" | "explain" | "bench-pack" | "telemetry" | "exit";
2
+ export interface ReplAction {
3
+ id: ReplActionId;
4
+ title: string;
5
+ description: string;
6
+ }
7
+ export declare const REPL_ACTIONS: readonly ReplAction[];
8
+ export interface ReplContext {
9
+ cwd: string;
10
+ quiet: boolean;
11
+ version: string;
12
+ }
13
+ export declare function renderReplBanner(ctx: ReplContext): string;
14
+ export declare function promptForAction(): Promise<ReplActionId>;
15
+ export type ReplDispatch = (action: ReplActionId, ctx: ReplContext) => Promise<void>;
16
+ export declare function runRepl(ctx: ReplContext, dispatch: ReplDispatch): Promise<void>;
17
+ export declare function withExitGuard<T>(fn: () => Promise<T>): Promise<T>;
@@ -0,0 +1,77 @@
1
+ import prompts from "prompts";
2
+ import { isInteractive } from "./prompts.js";
3
+ export const REPL_ACTIONS = [
4
+ { id: "audit", title: "Run audit", description: "Scan your design system" },
5
+ { id: "fix", title: "Apply auto-fixes", description: "Run high-confidence codemods" },
6
+ { id: "mcp-setup", title: "Set up MCP for AI", description: "Wire Lyse into Cursor / Claude Code" },
7
+ { id: "explain", title: "Explain a rule", description: "Show the rationale for a rule" },
8
+ { id: "bench-pack", title: "Bench-pack", description: "Emit a deterministic evidence pack" },
9
+ { id: "telemetry", title: "Telemetry settings", description: "View or change anonymous telemetry consent" },
10
+ { id: "exit", title: "Exit", description: "Quit Lyse" },
11
+ ];
12
+ export function renderReplBanner(ctx) {
13
+ return [
14
+ "",
15
+ ` lyse ${ctx.version} — interactive menu`,
16
+ ` cwd: ${ctx.cwd}`,
17
+ "",
18
+ " Tip: pass --no-menu (or set LYSE_NO_MENU=1) to skip the menu.",
19
+ " Or invoke a subcommand directly (lyse audit, lyse fix, …).",
20
+ "",
21
+ ].join("\n");
22
+ }
23
+ export async function promptForAction() {
24
+ const r = await prompts({
25
+ type: "select",
26
+ name: "v",
27
+ message: "What now?",
28
+ choices: REPL_ACTIONS.map((a) => ({ title: a.title, description: a.description, value: a.id })),
29
+ initial: 0,
30
+ });
31
+ if (r.v === undefined)
32
+ return "exit";
33
+ return r.v;
34
+ }
35
+ export async function runRepl(ctx, dispatch) {
36
+ if (!isInteractive())
37
+ return;
38
+ process.stdout.write(renderReplBanner(ctx));
39
+ while (true) {
40
+ const action = await promptForAction();
41
+ if (action === "exit")
42
+ return;
43
+ try {
44
+ await dispatch(action, ctx);
45
+ }
46
+ catch (e) {
47
+ const msg = e?.message ?? String(e);
48
+ const exitMatch = /^__LYSE_REPL_EXIT_(-?\d+)__$/.exec(msg);
49
+ if (exitMatch) {
50
+ const code = exitMatch[1];
51
+ if (code !== "0")
52
+ process.stderr.write(`(action exited with code ${code})\n`);
53
+ }
54
+ else {
55
+ process.stderr.write(`Error: ${msg}\n`);
56
+ }
57
+ }
58
+ process.stdout.write("\n");
59
+ }
60
+ }
61
+ // Some commands call process.exit() on entitlement / threshold failures. Inside
62
+ // the REPL we want those exits to abort just the current action — not kill the
63
+ // long-running menu loop. We replace process.exit with a sentinel throw for the
64
+ // duration of fn(), then restore it.
65
+ export async function withExitGuard(fn) {
66
+ const originalExit = process.exit;
67
+ process.exit = ((code) => {
68
+ throw new Error(`__LYSE_REPL_EXIT_${code ?? 0}__`);
69
+ });
70
+ try {
71
+ return await fn();
72
+ }
73
+ finally {
74
+ process.exit = originalExit;
75
+ }
76
+ }
77
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/menu/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExtractedCssInJsBlock } from "../types.js";
2
+ export declare function extractCssInJs(path: string, source: string): ExtractedCssInJsBlock[];
@@ -0,0 +1,69 @@
1
+ import { parse } from "@babel/parser";
2
+ import _traverse from "@babel/traverse";
3
+ // Babel CJS-vs-ESM interop: the callable lives at .default in some environments.
4
+ const traverse = (_traverse.default ??
5
+ _traverse);
6
+ const STYLED_PACKAGE = "styled-components";
7
+ export function extractCssInJs(path, source) {
8
+ const blocks = [];
9
+ let stylesImported = null;
10
+ let ast;
11
+ try {
12
+ ast = parse(source, {
13
+ sourceType: "module",
14
+ plugins: ["typescript", "jsx"],
15
+ errorRecovery: true,
16
+ });
17
+ }
18
+ catch {
19
+ return blocks;
20
+ }
21
+ try {
22
+ traverse(ast, {
23
+ ImportDeclaration(p) {
24
+ if (p.node.source.value === STYLED_PACKAGE) {
25
+ for (const spec of p.node.specifiers) {
26
+ if (spec.type === "ImportDefaultSpecifier") {
27
+ stylesImported = spec.local.name;
28
+ }
29
+ }
30
+ }
31
+ },
32
+ TaggedTemplateExpression(p) {
33
+ if (!stylesImported)
34
+ return;
35
+ const tag = p.node.tag;
36
+ const matches =
37
+ // styled.div`...`
38
+ (tag.type === "MemberExpression" &&
39
+ tag.object.type === "Identifier" &&
40
+ tag.object.name === stylesImported) ||
41
+ // styled(Component)`...`
42
+ (tag.type === "CallExpression" &&
43
+ tag.callee.type === "Identifier" &&
44
+ tag.callee.name === stylesImported);
45
+ if (!matches)
46
+ return;
47
+ const quasi = p.node.quasi;
48
+ const parts = [];
49
+ for (let i = 0; i < quasi.quasis.length; i++) {
50
+ // Loop bound guarantees quasi.quasis[i] exists; non-null assert is safe.
51
+ parts.push(quasi.quasis[i].value.raw);
52
+ if (i < quasi.expressions.length)
53
+ parts.push("__EXPR__");
54
+ }
55
+ const content = parts.join("");
56
+ const line = quasi.loc?.start.line ?? 0;
57
+ blocks.push({ path, line, content });
58
+ },
59
+ });
60
+ }
61
+ catch {
62
+ // Babel traverse can throw on pathological ASTs (e.g. duplicate declarations
63
+ // in Carbon's generated JS). Return whatever blocks we extracted so far.
64
+ process.stderr.write(`[lyse] Warning: babel traverse error in file, skipping: ${path}\n`);
65
+ return blocks;
66
+ }
67
+ return blocks;
68
+ }
69
+ //# sourceMappingURL=css-in-js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-in-js.js","sourceRoot":"","sources":["../../src/parsers/css-in-js.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedCssFile } from "../types.js";
2
+ export declare function parseCss(path: string, source: string): Promise<ParsedCssFile>;
@@ -0,0 +1,32 @@
1
+ import { transformScssToCss } from "./scss-transform.js";
2
+ /**
3
+ * `.scss` files are transformed to CSS-equivalent source via the local
4
+ * `transformScssToCss` pass. Downstream rules (tokens, hardcoded values)
5
+ * then consume the transformed source as if it were plain CSS.
6
+ *
7
+ * `.sass` (indented syntax) is still skipped — postcss-scss does not parse
8
+ * it natively and the marketplace share is small enough that v0.1.0 defers
9
+ * dedicated support. The audit pipeline counts skipped files so users see
10
+ * a clear warning.
11
+ *
12
+ * Plain CSS files are returned as-is. Lightning CSS (used in
13
+ * `loaders/tokens.ts`) parses CSS where it's actually needed; the rules
14
+ * engine only consumes the raw source via `ParsedCssFile.source`.
15
+ */
16
+ const SCSS_EXT = /\.scss$/i;
17
+ const SASS_EXT = /\.sass$/i;
18
+ export async function parseCss(path, source) {
19
+ if (SASS_EXT.test(path)) {
20
+ return { path, source, skipped: true };
21
+ }
22
+ if (SCSS_EXT.test(path)) {
23
+ try {
24
+ return { path, source: transformScssToCss(source) };
25
+ }
26
+ catch {
27
+ return { path, source, skipped: true };
28
+ }
29
+ }
30
+ return { path, source };
31
+ }
32
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/parsers/css.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc;IACzD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Transform a `.scss` source into CSS-equivalent text that the downstream
3
+ * Lyse pipeline (token extraction, hardcoded-value rules) can consume.
4
+ *
5
+ * The transform is deliberately lossy and minimal:
6
+ * - `$variable: value;` declarations are collected into a symbol table and
7
+ * then dropped from the output (not valid CSS).
8
+ * - `#{$variable}` interpolation is resolved against the symbol table. An
9
+ * unresolved interpolation is left as-is so the downstream rules can still
10
+ * surface "unknown token" findings rather than silently swallowing it.
11
+ * - SCSS-only at-rules (`@mixin`, `@include`, `@if`, `@for`, `@use`, etc.)
12
+ * are stripped entirely. `@import` is also stripped — Lyse's loaders walk
13
+ * the file system directly, they do not follow SCSS import graphs.
14
+ * - Nested rules are kept as-is. They yield technically invalid CSS but the
15
+ * downstream rule engine scans the raw source text, so hardcoded-value
16
+ * findings still surface on the nested declarations.
17
+ *
18
+ * Out of scope for v0.1:
19
+ * - `.sass` indented syntax (postcss-scss does not parse it; the caller keeps
20
+ * `.sass` flagged as `skipped`).
21
+ * - SCSS functions (`darken()`, `lighten()`, `map-get()`, etc.) — left
22
+ * unresolved in the output.
23
+ * - Selector nesting flattening (post-launch follow-up).
24
+ */
25
+ export declare function transformScssToCss(source: string): string;