@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,97 @@
1
+ import pc from "picocolors";
2
+ import stringWidth from "string-width";
3
+ const TRUECOLOR_TEAL_OPEN = "\x1b[38;2;16;181;164m";
4
+ const ANSI_RESET = "\x1b[0m";
5
+ export function teal(s, opts) {
6
+ return opts.color ? TRUECOLOR_TEAL_OPEN + s + ANSI_RESET : s;
7
+ }
8
+ export function thresholdColor(score, opts) {
9
+ if (!opts.color || score === "N/A")
10
+ return (s) => s;
11
+ if (score >= 70)
12
+ return pc.green;
13
+ if (score >= 40)
14
+ return pc.yellow;
15
+ return pc.red;
16
+ }
17
+ export function severityColor(severity, opts) {
18
+ if (!opts.color)
19
+ return (s) => s;
20
+ if (severity === "error")
21
+ return pc.red;
22
+ if (severity === "warning")
23
+ return pc.yellow;
24
+ return pc.dim;
25
+ }
26
+ export function dim(s, opts) {
27
+ return opts.color ? pc.dim(s) : s;
28
+ }
29
+ export function bold(s, opts) {
30
+ return opts.color ? pc.bold(s) : s;
31
+ }
32
+ const FILL_UNI = "█"; // █
33
+ const EMPTY_UNI = "░"; // ░
34
+ const FILL_ASCII = "#";
35
+ const EMPTY_ASCII = "-";
36
+ export function bar(score, opts, cells = 20) {
37
+ const fillChar = opts.unicode ? FILL_UNI : FILL_ASCII;
38
+ const emptyChar = opts.unicode ? EMPTY_UNI : EMPTY_ASCII;
39
+ if (score === "N/A" || !Number.isFinite(score))
40
+ return emptyChar.repeat(cells);
41
+ const clamped = Math.max(0, Math.min(100, score));
42
+ const filled = Math.round((clamped / 100) * cells);
43
+ const empty = cells - filled;
44
+ const colorize = thresholdColor(clamped, opts);
45
+ return colorize(fillChar.repeat(filled)) + dim(emptyChar.repeat(empty), opts);
46
+ }
47
+ /**
48
+ * Pads `text` to `targetWidth` visible columns. Uses string-width to count
49
+ * visible characters, so it works correctly on ANSI-colored or OSC 8 strings.
50
+ * For widths smaller than the visible text, returns the text unchanged.
51
+ */
52
+ export function visiblePad(text, targetWidth, side = "right") {
53
+ const visible = stringWidth(text);
54
+ if (visible >= targetWidth)
55
+ return text;
56
+ const pad = " ".repeat(targetWidth - visible);
57
+ return side === "right" ? text + pad : pad + text;
58
+ }
59
+ /**
60
+ * Returns `text` if it fits within `maxWidth` visible columns. Otherwise
61
+ * truncates from the START (keeping the most meaningful tail — file leaf,
62
+ * line number) prefixed with `…`. Width-aware via string-width.
63
+ */
64
+ export function truncateStart(text, maxWidth) {
65
+ if (maxWidth < 2)
66
+ return text;
67
+ const visible = stringWidth(text);
68
+ if (visible <= maxWidth)
69
+ return text;
70
+ // Greedy from end: take chars while they fit (maxWidth - 1, leaving room for "…").
71
+ const target = maxWidth - 1;
72
+ let kept = "";
73
+ for (let i = text.length - 1; i >= 0; i--) {
74
+ const candidate = text.charAt(i) + kept;
75
+ if (stringWidth(candidate) > target)
76
+ break;
77
+ kept = candidate;
78
+ }
79
+ return "…" + kept;
80
+ }
81
+ const DOT_UNI = "●"; // ●
82
+ const DOT_ASCII = "*";
83
+ export function statusDot(score, opts) {
84
+ const glyph = opts.unicode ? DOT_UNI : DOT_ASCII;
85
+ if (score === "N/A")
86
+ return dim(glyph, opts);
87
+ return thresholdColor(score, opts)(glyph);
88
+ }
89
+ const OSC_OPEN = "\x1b]8;;";
90
+ const OSC_CLOSE = "\x07";
91
+ const OSC_END = "\x1b]8;;\x07";
92
+ export function link(text, url, opts) {
93
+ if (!opts.color || !opts.unicode)
94
+ return text;
95
+ return OSC_OPEN + url + OSC_CLOSE + text + OSC_END;
96
+ }
97
+ //# sourceMappingURL=terminal-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-format.js","sourceRoot":"","sources":["../../src/reporters/terminal-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuditResult } from "../types.js";
2
+ import { type TerminalOpts } from "./terminal-format.js";
3
+ export type { TerminalOpts } from "./terminal-format.js";
4
+ export declare function renderTerminal(result: AuditResult, opts: TerminalOpts): Promise<string>;
@@ -0,0 +1,201 @@
1
+ import { formatCoverageFooter } from "./coverage-footer.js";
2
+ import { readRecent, computeDelta } from "../history/ndjson-store.js";
3
+ import { teal, thresholdColor, severityColor, dim, bold, bar, statusDot, link, visiblePad, truncateStart, } from "./terminal-format.js";
4
+ const AXES_ORDER = ["tokens", "a11y", "components", "stories"];
5
+ const AXIS_NAME_WIDTH = 12;
6
+ const AXIS_SCORE_WIDTH = 5;
7
+ const AXIS_FINDINGS_WIDTH = 15;
8
+ const RULE_ID_WIDTH = 34;
9
+ const FINDING_NUM_WIDTH = 2;
10
+ function header(result, opts) {
11
+ const brand = teal("lyse", opts);
12
+ const version = dim(result.toolVersion, opts);
13
+ const files = dim(`${opts.fileCount} files`, opts);
14
+ const dur = dim(`${(opts.durationMs / 1000).toFixed(1)}s`, opts);
15
+ const sep = dim("·", opts);
16
+ return ` ${brand} ${version} ${sep} ${files} ${sep} ${dur}`;
17
+ }
18
+ function scoreLine(result, opts, deltaSuffix) {
19
+ const score = result.finalScore;
20
+ const dot = statusDot(score, opts);
21
+ const num = score === "N/A" ? "N/A" : `${score} / 100`;
22
+ const colored = score === "N/A" ? dim(num, opts) : bold(thresholdColor(score, opts)(num), opts);
23
+ const suffix = deltaSuffix ? ` ${dim(deltaSuffix, opts)}` : "";
24
+ return ` ${dot} ${colored}${suffix} ${dim("Health Score", opts)} · ${dim(result.scoringVersion, opts)}`;
25
+ }
26
+ function axisLine(a, opts) {
27
+ const name = visiblePad(a.axis, AXIS_NAME_WIDTH);
28
+ const barViz = bar(a.score, opts, 20);
29
+ const scoreText = visiblePad(a.score === "N/A" ? "N/A" : String(a.score), AXIS_SCORE_WIDTH, "left");
30
+ const findingsText = visiblePad(dim(`${a.findings} findings`, opts), AXIS_FINDINGS_WIDTH, "left");
31
+ return ` ${name} ${barViz} ${scoreText} ${findingsText}`;
32
+ }
33
+ function findingLines(f, index, opts) {
34
+ const num = visiblePad(dim(String(index), opts), FINDING_NUM_WIDTH, "left");
35
+ const ruleColored = severityColor(f.severity, opts)(f.ruleId);
36
+ const ruleLinked = link(ruleColored, `https://github.com/lyse-labs/lyse/blob/main/docs/rules/${f.ruleId}`, opts);
37
+ const rulePadded = visiblePad(ruleLinked, RULE_ID_WIDTH);
38
+ // Width-aware truncation of file:line. Available width = total width - the prefix columns.
39
+ // Prefix = 2 spaces + num (2) + 2 spaces + rule (34) + 2 spaces = ~42 chars.
40
+ const locMaxWidth = Math.max(20, opts.width - 42);
41
+ const locText = `${f.location.file}:${f.location.line}`;
42
+ const locTruncated = truncateStart(locText, locMaxWidth);
43
+ const locLinked = link(locTruncated, `file://${f.location.file}:${f.location.line}`, opts);
44
+ const arrow = teal("->", opts);
45
+ const detail = f.suggestion ? `${f.message} ${arrow} ${f.suggestion}` : f.message;
46
+ return [
47
+ ` ${num} ${rulePadded} ${dim(locLinked, opts)}`,
48
+ ` ${dim(detail, opts)}`,
49
+ "",
50
+ ];
51
+ }
52
+ function topFindings(findings, opts) {
53
+ if (findings.length === 0)
54
+ return [];
55
+ const explicit = opts.findingsLimit;
56
+ const limit = explicit === null
57
+ ? findings.length
58
+ : typeof explicit === "number"
59
+ ? explicit
60
+ : opts.mode === "verbose"
61
+ ? findings.length
62
+ : 5;
63
+ const shown = findings.slice(0, limit);
64
+ const lines = ["", bold(" Top findings", opts), ""];
65
+ shown.forEach((f, i) => lines.push(...findingLines(f, i + 1, opts)));
66
+ const remaining = findings.length - shown.length;
67
+ if (remaining > 0) {
68
+ const moreMsg = opts.outDir
69
+ ? `${remaining} more findings · full list in ${opts.outDir}/lyse.json`
70
+ : `${remaining} more findings · use --output <dir> for the full JSON report`;
71
+ lines.push(` ${dim(moreMsg, opts)}`);
72
+ lines.push("");
73
+ }
74
+ return lines;
75
+ }
76
+ function nextSteps(result, opts) {
77
+ const tips = [];
78
+ const axisBy = new Map(result.axes.map((a) => [a.axis, a]));
79
+ const tokens = axisBy.get("tokens");
80
+ const components = axisBy.get("components");
81
+ const stories = axisBy.get("stories");
82
+ const a11y = axisBy.get("a11y");
83
+ if (tokens !== undefined && tokens.score !== "N/A" && tokens.score < 70) {
84
+ tips.push(`Run \`lyse agents-md > AGENTS.md\` and commit it ${dim("·", opts)} give your AI agents your token namespaces`);
85
+ }
86
+ if (components !== undefined && components.score !== "N/A" && components.score < 70) {
87
+ tips.push(`Audit native <button>/<input>/<a> usage in your highest-traffic files`);
88
+ }
89
+ if (a11y !== undefined && a11y.score !== "N/A" && a11y.score < 70) {
90
+ tips.push(`Run \`eslint --fix\` with eslint-plugin-jsx-a11y to auto-fix trivial a11y warnings`);
91
+ }
92
+ if (stories !== undefined && stories.score !== "N/A" && stories.score < 70) {
93
+ const jsonPath = opts.outDir ? `${opts.outDir}/lyse.json` : "lyse.json (use --output <dir>)";
94
+ tips.push(`Add stories for orphan DS components listed in ${jsonPath}`);
95
+ }
96
+ if (tips.length === 0)
97
+ return [];
98
+ const arrow = teal("->", opts);
99
+ return ["", bold(" Next steps", opts), "", ...tips.map((t) => ` ${arrow} ${t}`), ""];
100
+ }
101
+ function footer(result, opts) {
102
+ const sep = dim("·", opts);
103
+ const meta = `github.com/lyse-labs/lyse/blob/main/docs/rules ${sep} scanned ${result.timestamp.slice(0, 16)}Z`;
104
+ if (opts.outDir) {
105
+ const paths = `${opts.outDir}/lyse.json`;
106
+ return `\n ${dim(paths, opts)}\n ${dim(meta, opts)}`;
107
+ }
108
+ return `\n ${dim(meta, opts)}`;
109
+ }
110
+ export async function renderTerminal(result, opts) {
111
+ const lines = [""];
112
+ lines.push(header(result, opts));
113
+ lines.push("", "");
114
+ // Compute delta for score line
115
+ let deltaSuffix;
116
+ try {
117
+ const recent = await readRecent(opts.cwd, 10);
118
+ const audits = recent.filter((e) => e.event_type === "audit");
119
+ if (audits.length >= 2) {
120
+ const prev = audits[audits.length - 2]; // previous audit (this audit may not be in file yet)
121
+ if (prev) {
122
+ const tokensScore = result.axes.find((a) => a.axis === "tokens")?.score;
123
+ const a11yScore = result.axes.find((a) => a.axis === "a11y")?.score;
124
+ const componentsScore = result.axes.find((a) => a.axis === "components")?.score;
125
+ const storiesScore = result.axes.find((a) => a.axis === "stories")?.score;
126
+ const delta = computeDelta({
127
+ score: typeof result.finalScore === "number" ? result.finalScore : 0,
128
+ axes: {
129
+ tokens: typeof tokensScore === "number" ? tokensScore : null,
130
+ a11y: typeof a11yScore === "number" ? a11yScore : null,
131
+ components: typeof componentsScore === "number" ? componentsScore : null,
132
+ stories: typeof storiesScore === "number" ? storiesScore : null,
133
+ },
134
+ findings_count: result.findings.length,
135
+ }, prev);
136
+ const arrow = delta.score > 0 ? "▲" : delta.score < 0 ? "▼" : "=";
137
+ deltaSuffix = `(${arrow} ${Math.abs(delta.score)} since ${delta.days}d ago)`;
138
+ }
139
+ }
140
+ }
141
+ catch {
142
+ // silently ignore history read errors
143
+ }
144
+ lines.push(scoreLine(result, opts, deltaSuffix));
145
+ // Layer 4 banners — shown immediately after the score line. In v0.1.0
146
+ // `llm/layer4-stage.ts` is a stub that only ever sets `staticOnly: true`,
147
+ // so the cacheHit / usdSpent / error branches below cannot fire from
148
+ // production input. They're gated behind `LYSE_LAYER4_ENABLED` so the
149
+ // renderer doesn't carry inert branches in the user-visible code path,
150
+ // but the rendering contract stays in tree for when Layer 4 lands.
151
+ const layer4 = result.meta?.layer4;
152
+ if (layer4) {
153
+ if (layer4.staticOnly) {
154
+ lines.push("");
155
+ lines.push(` ${opts.color ? "\x1b[33m" : ""}⚠ Static-only mode: every LLM path is off. Set ANTHROPIC_API_KEY or OPENAI_API_KEY and remove --static-only to enable optional LLM augmentation.${opts.color ? "\x1b[0m" : ""}`);
156
+ }
157
+ if (process.env["LYSE_LAYER4_ENABLED"]) {
158
+ if (layer4.cacheHit) {
159
+ lines.push("");
160
+ lines.push(` ${dim("(cached LLM augmentation — re-running on the same commit hits the cache)", opts)}`);
161
+ }
162
+ else if (!layer4.staticOnly && layer4.usdSpent !== undefined && layer4.modelUsed) {
163
+ lines.push("");
164
+ lines.push(` ${dim(`LLM augmentation: ${layer4.modelUsed}, $${layer4.usdSpent.toFixed(2)} (your account)`, opts)}`);
165
+ }
166
+ if (layer4.error) {
167
+ lines.push("");
168
+ lines.push(` ${opts.color ? "\x1b[31m" : ""}⚠ LLM unreachable — comprehensive score unavailable: ${layer4.error.message}${opts.color ? "\x1b[0m" : ""}`);
169
+ }
170
+ }
171
+ }
172
+ // Educational hint: no token registry means tokens + components axes fly blind
173
+ // (spec T28 dogfood fix). Shown only when hasTokenRegistry is absent/false,
174
+ // and only in human-readable mode (caller skips this for json/sarif by not
175
+ // calling renderTerminal at all).
176
+ if (!opts.hasTokenRegistry) {
177
+ lines.push("");
178
+ const hint = "ℹ No design token registry found (no .lyse.yaml or componentsModule).";
179
+ const detail = " Your score reflects a/y + Storybook coverage only.";
180
+ const action = " Run `lyse init` to detect your token system and unlock a calibrated score.";
181
+ lines.push(` ${dim(hint, opts)}`);
182
+ lines.push(` ${dim(detail, opts)}`);
183
+ lines.push(` ${dim(action, opts)}`);
184
+ }
185
+ lines.push("", "");
186
+ for (const axisName of AXES_ORDER) {
187
+ const a = result.axes.find((ax) => ax.axis === axisName);
188
+ if (a !== undefined)
189
+ lines.push(axisLine(a, opts));
190
+ }
191
+ if (opts.mode !== "quiet") {
192
+ lines.push(...topFindings(result.findings, opts));
193
+ lines.push(...nextSteps(result, opts));
194
+ }
195
+ if (result.meta?.coverage) {
196
+ lines.push("", ` ${dim(formatCoverageFooter(result.meta.coverage), opts)}`);
197
+ }
198
+ lines.push(footer(result, opts));
199
+ return lines.join("\n");
200
+ }
201
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Rule, RuleContext, ParsedFiles, Finding, AxisName, ParseError } from "./types.js";
2
+ export interface RunRulesResult {
3
+ findings: Finding[];
4
+ opportunitiesByAxis: Record<AxisName, number>;
5
+ findingsByAxis: Record<AxisName, number>;
6
+ parseErrors: ParseError[];
7
+ }
8
+ export declare function runRules(rules: Rule[], ctx: RuleContext, parsed: ParsedFiles): Promise<RunRulesResult>;
@@ -0,0 +1,22 @@
1
+ const ZERO = { tokens: 0, a11y: 0, components: 0, stories: 0, "ai-surface": 0 };
2
+ export async function runRules(rules, ctx, parsed) {
3
+ const findings = [];
4
+ const opportunitiesByAxis = { ...ZERO };
5
+ const findingsByAxis = { ...ZERO };
6
+ const parseErrors = [];
7
+ for (const rule of rules) {
8
+ const r = await rule.evaluate(ctx, parsed);
9
+ findings.push(...r.findings);
10
+ opportunitiesByAxis[rule.axis] += r.opportunities;
11
+ findingsByAxis[rule.axis] += r.findings.length;
12
+ if (r.parseErrors)
13
+ parseErrors.push(...r.parseErrors);
14
+ }
15
+ findings.sort((a, b) => {
16
+ const order = { error: 0, warning: 1, info: 2 };
17
+ return order[a.severity] - order[b.severity];
18
+ });
19
+ parseErrors.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : 0));
20
+ return { findings, opportunitiesByAxis, findingsByAxis, parseErrors };
21
+ }
22
+ //# sourceMappingURL=rule-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-runner.js","sourceRoot":"","sources":["../src/rule-runner.ts"],"names":[],"mappings":"AASA,MAAM,IAAI,GAA6B,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAE1G,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAgB,EAAE,MAAmB;IACjF,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,MAAM,cAAc,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,CAAC,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Adapter from the legacy CodemodResult shape (codemods/index.ts) to the
3
+ * new Rule.applyCodemod return shape (types.ts).
4
+ *
5
+ * Legacy shape: { patch, confidence (0-1), alternatives, rationale, rule_id, schema_version }
6
+ * New shape: { diff, importsAdded, confidence ("high"|"medium"|"low"), warnings? }
7
+ *
8
+ * This module is import-only — no runtime side effects.
9
+ */
10
+ import type { CodemodResult as NewCodemodResult } from "../types.js";
11
+ import type { CodemodResult as OldCodemodResult } from "../codemods/index.js";
12
+ /**
13
+ * Adapt an OldCodemodResult to the NewCodemodResult shape expected by
14
+ * Rule.applyCodemod consumers (e.g. the fix orchestrator in Task 12).
15
+ */
16
+ export declare function adaptOldCodemodResult(old: OldCodemodResult): NewCodemodResult;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Adapter from the legacy CodemodResult shape (codemods/index.ts) to the
3
+ * new Rule.applyCodemod return shape (types.ts).
4
+ *
5
+ * Legacy shape: { patch, confidence (0-1), alternatives, rationale, rule_id, schema_version }
6
+ * New shape: { diff, importsAdded, confidence ("high"|"medium"|"low"), warnings? }
7
+ *
8
+ * This module is import-only — no runtime side effects.
9
+ */
10
+ /**
11
+ * Convert a numeric confidence (0–1) to the Confidence union.
12
+ * >0.8 → "high", >0.5 → "medium", else → "low"
13
+ */
14
+ function toConfidence(numeric) {
15
+ if (numeric >= 0.8)
16
+ return "high";
17
+ if (numeric > 0.5)
18
+ return "medium";
19
+ return "low";
20
+ }
21
+ /**
22
+ * Extract import statements added by a patch.
23
+ * Looks for lines that start with `+import ` (unified diff add lines).
24
+ * Returns the import statement text (without the leading `+`).
25
+ */
26
+ function extractImportsFromPatch(patch) {
27
+ if (!patch)
28
+ return [];
29
+ return patch
30
+ .split("\n")
31
+ .filter((line) => /^\+import\s/.test(line))
32
+ .map((line) => line.slice(1).trim()); // strip leading '+'
33
+ }
34
+ /**
35
+ * Adapt an OldCodemodResult to the NewCodemodResult shape expected by
36
+ * Rule.applyCodemod consumers (e.g. the fix orchestrator in Task 12).
37
+ */
38
+ export function adaptOldCodemodResult(old) {
39
+ const diff = old.patch ?? "";
40
+ const importsAdded = extractImportsFromPatch(diff);
41
+ const confidence = toConfidence(old.confidence);
42
+ // Populate warnings when the rationale signals uncertainty or missing data.
43
+ // A null rationale on a successful patch means no warning needed.
44
+ if (old.rationale !== null) {
45
+ return { diff, importsAdded, confidence, warnings: [old.rationale] };
46
+ }
47
+ return { diff, importsAdded, confidence };
48
+ }
49
+ //# sourceMappingURL=_codemod-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_codemod-adapter.js","sourceRoot":"","sources":["../../src/rules/_codemod-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEhD,4EAA4E;IAC5E,kEAAkE;IAClE,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Returns true if the given file path matches any of the provided glob patterns.
3
+ * Used by rules to skip files that are in excluded directories.
4
+ *
5
+ * Patterns use minimatch glob syntax (same as components/no-native-shadows).
6
+ * Examples:
7
+ * isPathExcluded("examples/foo/bar.tsx", ["examples/**"]) → true
8
+ * isPathExcluded("apps/docs/pages/index.tsx", ["apps/docs/**"]) → true
9
+ * isPathExcluded("src/Button.tsx", ["examples/**"]) → false
10
+ */
11
+ export declare function isPathExcluded(filePath: string, excludePaths: string[]): boolean;
@@ -0,0 +1,17 @@
1
+ import { minimatch } from "minimatch";
2
+ /**
3
+ * Returns true if the given file path matches any of the provided glob patterns.
4
+ * Used by rules to skip files that are in excluded directories.
5
+ *
6
+ * Patterns use minimatch glob syntax (same as components/no-native-shadows).
7
+ * Examples:
8
+ * isPathExcluded("examples/foo/bar.tsx", ["examples/**"]) → true
9
+ * isPathExcluded("apps/docs/pages/index.tsx", ["apps/docs/**"]) → true
10
+ * isPathExcluded("src/Button.tsx", ["examples/**"]) → false
11
+ */
12
+ export function isPathExcluded(filePath, excludePaths) {
13
+ if (excludePaths.length === 0)
14
+ return false;
15
+ return excludePaths.some((pattern) => minimatch(filePath, pattern, { matchBase: false }));
16
+ }
17
+ //# sourceMappingURL=_exclude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_exclude.js","sourceRoot":"","sources":["../../src/rules/_exclude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,YAAsB;IACrE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Returns true if the function body slice contains at least one top-level
3
+ * call to a function named `use<Upper>…`. Filters out:
4
+ * - member-access calls (`obj.useThing(`)
5
+ * - calls nested inside an inner function/arrow declaration
6
+ *
7
+ * The body slice should start at the OPENING brace of the function body
8
+ * (or just after) so the nesting heuristic can attribute braces correctly.
9
+ */
10
+ export declare function bodyCallsHook(body: string): boolean;
11
+ /**
12
+ * Returns true if the body slice contains a JSX-returning expression.
13
+ *
14
+ * Handles:
15
+ * - `return <div>` → true (HTML tag)
16
+ * - `return <Suspense/>` → true (Component)
17
+ * - `return <>` → true (fragment)
18
+ * - `return ( <Foo /> )` → true (parenthesized)
19
+ * - `return useMemo<Foo>(...)` → false (generic at return)
20
+ * - body containing `Array<X>` or `dynamic<T>(…)` elsewhere → false (no return prefix)
21
+ */
22
+ export declare function bodyReturnsJsx(body: string): boolean;
23
+ /**
24
+ * Extracts the body of a function declaration starting at `declStart` via
25
+ * naive brace matching. Returns the slice from just AFTER the opening `{`
26
+ * up to (but not including) the matching closing `}`.
27
+ *
28
+ * Defensive fallbacks:
29
+ * - If no `{` is found at/after `declStart`, returns `source.slice(declStart)`
30
+ * (matches prior naive behavior for declaration-only forms).
31
+ * - If EOF is reached before depth returns to zero, returns everything from
32
+ * just after the opening `{` to end-of-source.
33
+ *
34
+ * Future improvement: braces inside string/template literals or comments are
35
+ * NOT tracked. Current heuristic is sufficient for the rule surface that
36
+ * consumes this helper (component/hook naming detection on real React
37
+ * sources). Switch to a TS-AST extraction if FP/FN evidence emerges.
38
+ */
39
+ export declare function extractFunctionBody(source: string, declStart: number): string;
40
+ /**
41
+ * Returns true if `source` at `declStart` declares an implicit-return arrow
42
+ * function whose body is a JSX expression: `export const X = (...) => <JSX>`.
43
+ *
44
+ * `declStart` should point at the start of the export declaration (the same
45
+ * index `EXPORT_FUNC_RE` reports). We walk past `export … = (` and the param
46
+ * list, expect `=>`, and then check that the first non-whitespace char opens
47
+ * JSX (via the shared `looksLikeJsxOpenAt` disambiguator).
48
+ *
49
+ * Returns false for:
50
+ * - block-body arrows (`=> {`) — caller should use `bodyReturnsJsx` instead
51
+ * - non-JSX implicit returns (`=> text.toUpperCase()`)
52
+ * - implicit returns whose JSX is inside a nested expression
53
+ * (`xs => xs.map(x => <li/>)`)
54
+ */
55
+ export declare function arrowImplicitReturnsJsx(source: string, declStart: number): boolean;
56
+ /**
57
+ * Filename / path evidence: a function is more likely to be a hook when it
58
+ * lives under `**\/hooks\/**` or in a file named `use-*.{ts,tsx,js,jsx}`.
59
+ */
60
+ export declare function fileIsInHooksDir(filePath: string): boolean;
61
+ /**
62
+ * Filename-as-evidence refinement (issue #166).
63
+ *
64
+ * Returns true ONLY when the file is named `use-<kebab>.{ts,tsx,js,jsx}` AND
65
+ * `funcName` is the camelCase form of `<kebab>` — i.e. the function name
66
+ * literally matches what the filename advertises as the hook target
67
+ * (minus the `use` prefix).
68
+ *
69
+ * Examples:
70
+ * use-toggle.ts + "toggle" → true
71
+ * use-combine-ref.ts + "combineRef" → true
72
+ * use-combine-ref.ts + "composeRefs" → false (co-located helper)
73
+ * use-toggle.ts + "useToggle" → false (already prefixed)
74
+ * hooks/index.ts + anything → false (no use-X filename)
75
+ * lib/helpers.ts + anything → false (not a use-X file)
76
+ *
77
+ * Used by `naming/hook-prefix` to gate path-evidence: a function in a
78
+ * `hooks/` directory is flagged via path alone only when its name matches
79
+ * the filename's advertised target. Unrelated co-located utilities are not
80
+ * flagged via path-evidence and must show body-call evidence to fire.
81
+ */
82
+ export declare function filenameMatchesFunction(filePath: string, funcName: string): boolean;