@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,379 @@
1
+ // Shared body-analysis primitives for naming-* rules.
2
+ //
3
+ // These helpers replace the per-rule 2000-char body slices + ad-hoc regex
4
+ // matchers that produced both false negatives (long bodies truncated) and
5
+ // false positives (generics confused for JSX, utility `use*` calls confused
6
+ // for hook calls).
7
+ //
8
+ // Pure utility module — no rule-specific imports. Helpers are stateless and
9
+ // deterministic: same input → same output.
10
+ // Why a streaming scan instead of a capped slice: the previous rules sliced
11
+ // the function body to 2000 chars before scanning. Real codebases (e.g.
12
+ // Enobase) have legitimate hooks whose first hook call sits past that
13
+ // cutoff, producing false negatives. We instead match against the full body
14
+ // slice using lastIndex iteration — the regex engine streams the input and
15
+ // stops on the first match, so the cost is bounded by the position of the
16
+ // first hook call, not the length of the body.
17
+ // `use[A-Z]\w*\s*\(` finds candidate hook call sites anywhere in the body.
18
+ // We then filter for true positives (see `bodyCallsHook`).
19
+ const HOOK_CALL_RE = /\buse[A-Z][a-zA-Z0-9]*\s*\(/g;
20
+ // Identifier-like prefix that, when it precedes `use<Upper>`, suggests the
21
+ // call is NOT a top-level hook call — e.g. `obj.useThing(` or `this.useX(`.
22
+ // We deliberately keep this conservative: object-method dispatch on something
23
+ // named like a hook is rare and almost never a real hook.
24
+ function isMemberAccessAt(source, index) {
25
+ let i = index - 1;
26
+ while (i >= 0 && /\s/.test(source[i]))
27
+ i--;
28
+ return i >= 0 && source[i] === ".";
29
+ }
30
+ // Detects whether the call site sits inside a nested function declaration
31
+ // or method shorthand. A hook called inside an inner `function inner() {}`
32
+ // or `const cb = () => { useX() }` does NOT make the OUTER function a hook.
33
+ //
34
+ // Approach: scan backwards from the candidate index through the body and
35
+ // track brace depth. If we encounter `function` / `=>` whose body wraps the
36
+ // candidate, return true.
37
+ //
38
+ // This is a heuristic — we err on the side of accepting the call as
39
+ // top-level (preserves recall) unless we find clear evidence of nesting.
40
+ function isInsideNestedFunction(body, index) {
41
+ // Walk backwards counting braces; if we exit the outer body or hit a
42
+ // `function` / arrow before exiting, the call is nested.
43
+ let depth = 0;
44
+ for (let i = index - 1; i >= 0; i--) {
45
+ const c = body[i];
46
+ if (c === "}")
47
+ depth++;
48
+ else if (c === "{") {
49
+ if (depth === 0) {
50
+ // We are at the opening brace of the enclosing block. Inspect what
51
+ // precedes it: a `function ...(`, `() =>`, or `<id>(...)\s*` arrow
52
+ // body means this brace opens a nested function.
53
+ const head = body.slice(Math.max(0, i - 60), i);
54
+ if (/=>\s*$/.test(head))
55
+ return true;
56
+ if (/\bfunction\b[^{}]*$/.test(head)) {
57
+ // Could be the outer function's own opening brace — in that case
58
+ // there are no more closing braces between i and the start, which
59
+ // we already verified by depth==0. But the outer function's body
60
+ // IS what we are scanning, so its opening brace marks the start
61
+ // of the body, not a nested function. We assume the caller passes
62
+ // a body slice that starts AFTER the outer `{`, so any `function`
63
+ // we find here is necessarily nested.
64
+ return true;
65
+ }
66
+ return false;
67
+ }
68
+ depth--;
69
+ }
70
+ }
71
+ return false;
72
+ }
73
+ /**
74
+ * Returns true if the function body slice contains at least one top-level
75
+ * call to a function named `use<Upper>…`. Filters out:
76
+ * - member-access calls (`obj.useThing(`)
77
+ * - calls nested inside an inner function/arrow declaration
78
+ *
79
+ * The body slice should start at the OPENING brace of the function body
80
+ * (or just after) so the nesting heuristic can attribute braces correctly.
81
+ */
82
+ export function bodyCallsHook(body) {
83
+ HOOK_CALL_RE.lastIndex = 0;
84
+ let m;
85
+ while ((m = HOOK_CALL_RE.exec(body)) !== null) {
86
+ const idx = m.index;
87
+ if (isMemberAccessAt(body, idx))
88
+ continue;
89
+ if (isInsideNestedFunction(body, idx))
90
+ continue;
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ // JSX-return detection.
96
+ //
97
+ // Goal: distinguish `return <Tag …` (JSX) from TS type-position generics like
98
+ // `return useMemo<Foo>(…)` / `return Array<X>(…)` / `return dynamic<T>(loader)`.
99
+ //
100
+ // Strategy: find every `return` followed by an expression, then for the first
101
+ // `<` in that expression decide whether it opens a JSX element. JSX is
102
+ // disambiguated by what FOLLOWS the `<`:
103
+ // - `<` (fragment opener `<>`) → JSX
104
+ // - `<UpperIdent` → JSX (component) UNLESS the next non-name char is `,`
105
+ // or the construct is clearly a generic-arg list
106
+ // - `<lowerIdent` where the identifier matches a known HTML tag → JSX
107
+ // - `</` → JSX close (shouldn't appear at return start but cheap to accept)
108
+ // - anything else → not JSX
109
+ //
110
+ // We avoid full tokenization: a regex sweep over the body is enough because
111
+ // the false-positive cases all share the property that `<` is preceded by a
112
+ // JavaScript identifier or `)` (call/expression position), whereas a JSX `<`
113
+ // at return position is preceded only by `return`, `(`, or whitespace.
114
+ const RETURN_LT_RE = /\breturn\b\s*\(?\s*</g;
115
+ // Common lowercase HTML / SVG tag names. Extending this list is cheap; we
116
+ // only need enough coverage to avoid false negatives on hand-written
117
+ // components. JSX with custom lowercase tags (`<my-component>`) is rare and
118
+ // not idiomatic React.
119
+ const HTML_TAGS = new Set([
120
+ "a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi",
121
+ "bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code",
122
+ "col", "colgroup", "data", "datalist", "dd", "del", "details", "dfn", "dialog",
123
+ "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer",
124
+ "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html",
125
+ "i", "iframe", "img", "input", "ins", "kbd", "label", "legend", "li", "link", "main",
126
+ "map", "mark", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup",
127
+ "option", "output", "p", "param", "picture", "pre", "progress", "q", "rp", "rt",
128
+ "ruby", "s", "samp", "script", "section", "select", "slot", "small", "source",
129
+ "span", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td",
130
+ "template", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track",
131
+ "u", "ul", "var", "video", "wbr",
132
+ "svg", "circle", "ellipse", "g", "line", "path", "polygon", "polyline", "rect",
133
+ "text", "defs", "linearGradient", "radialGradient", "stop", "clipPath", "mask",
134
+ "use", "symbol", "pattern", "filter", "feGaussianBlur", "feOffset", "feMerge",
135
+ ]);
136
+ /**
137
+ * Returns true if the body slice contains a JSX-returning expression.
138
+ *
139
+ * Handles:
140
+ * - `return <div>` → true (HTML tag)
141
+ * - `return <Suspense/>` → true (Component)
142
+ * - `return <>` → true (fragment)
143
+ * - `return ( <Foo /> )` → true (parenthesized)
144
+ * - `return useMemo<Foo>(...)` → false (generic at return)
145
+ * - body containing `Array<X>` or `dynamic<T>(…)` elsewhere → false (no return prefix)
146
+ */
147
+ export function bodyReturnsJsx(body) {
148
+ const scan = blankReturnObjectLiterals(body);
149
+ RETURN_LT_RE.lastIndex = 0;
150
+ let m;
151
+ while ((m = RETURN_LT_RE.exec(scan)) !== null) {
152
+ // Symmetric with bodyCallsHook: a `return <Foo/>` inside a nested
153
+ // function/arrow does NOT make the OUTER function JSX-returning.
154
+ if (isInsideNestedFunction(scan, m.index))
155
+ continue;
156
+ // The `<` that the regex matched starts at m.index + m[0].length - 1.
157
+ const ltIndex = m.index + m[0].length - 1;
158
+ if (looksLikeJsxOpenAt(scan, ltIndex))
159
+ return true;
160
+ }
161
+ return false;
162
+ }
163
+ // Replace every `return { ... }` object literal's contents with spaces so
164
+ // JSX inside object values (factory pattern, e.g. `getMdxComponents`) is not
165
+ // counted as evidence the outer function returns JSX. Whitespace-preserving
166
+ // to keep indices stable for the subsequent regex scans.
167
+ function blankReturnObjectLiterals(body) {
168
+ const RETURN_OBJ_RE = /\breturn\s*\{/g;
169
+ let out = body;
170
+ let m;
171
+ RETURN_OBJ_RE.lastIndex = 0;
172
+ while ((m = RETURN_OBJ_RE.exec(out)) !== null) {
173
+ const openIdx = m.index + m[0].length - 1;
174
+ let depth = 1;
175
+ let i = openIdx + 1;
176
+ for (; i < out.length; i++) {
177
+ const c = out[i];
178
+ if (c === "{")
179
+ depth++;
180
+ else if (c === "}") {
181
+ depth--;
182
+ if (depth === 0)
183
+ break;
184
+ }
185
+ }
186
+ const endIdx = i;
187
+ const blanked = out.slice(openIdx + 1, endIdx).replace(/[^\n]/g, " ");
188
+ out = out.slice(0, openIdx + 1) + blanked + out.slice(endIdx);
189
+ RETURN_OBJ_RE.lastIndex = endIdx + 1;
190
+ }
191
+ return out;
192
+ }
193
+ function looksLikeJsxOpenAt(body, ltIndex) {
194
+ // Verify the char before `<` (skipping whitespace and one optional `(`)
195
+ // is `return` or `(`. RETURN_LT_RE guarantees this; this check is belt-
196
+ // and-suspenders against pathological matches.
197
+ const next = body[ltIndex + 1];
198
+ if (next === undefined)
199
+ return false;
200
+ // Fragment `<>` or close `</`
201
+ if (next === ">" || next === "/")
202
+ return true;
203
+ // Component `<UpperIdent`
204
+ if (/[A-Z]/.test(next)) {
205
+ // Read the identifier
206
+ let j = ltIndex + 1;
207
+ while (j < body.length && /[A-Za-z0-9_]/.test(body[j]))
208
+ j++;
209
+ const after = body[j];
210
+ // Reject `<UpperIdent,` (multi-param generic arrow / type-arg list:
211
+ // `<T,U>(x, y) => ...`).
212
+ if (after === ",")
213
+ return false;
214
+ // Reject bare generic arrow `<T>(x) => x`: shape is `<UpperIdent>` with
215
+ // `(` as the next non-whitespace char after `>`. Real JSX `<Foo>` is
216
+ // followed by children (text, `{`, `<`) or `</`, never by `(`.
217
+ if (after === ">") {
218
+ let k = j + 1;
219
+ while (k < body.length && /\s/.test(body[k]))
220
+ k++;
221
+ if (body[k] === "(")
222
+ return false;
223
+ }
224
+ return true;
225
+ }
226
+ // Lowercase identifier → HTML tag check
227
+ if (/[a-z]/.test(next)) {
228
+ let j = ltIndex + 1;
229
+ while (j < body.length && /[A-Za-z0-9-]/.test(body[j]))
230
+ j++;
231
+ const tag = body.slice(ltIndex + 1, j);
232
+ return HTML_TAGS.has(tag);
233
+ }
234
+ return false;
235
+ }
236
+ /**
237
+ * Extracts the body of a function declaration starting at `declStart` via
238
+ * naive brace matching. Returns the slice from just AFTER the opening `{`
239
+ * up to (but not including) the matching closing `}`.
240
+ *
241
+ * Defensive fallbacks:
242
+ * - If no `{` is found at/after `declStart`, returns `source.slice(declStart)`
243
+ * (matches prior naive behavior for declaration-only forms).
244
+ * - If EOF is reached before depth returns to zero, returns everything from
245
+ * just after the opening `{` to end-of-source.
246
+ *
247
+ * Future improvement: braces inside string/template literals or comments are
248
+ * NOT tracked. Current heuristic is sufficient for the rule surface that
249
+ * consumes this helper (component/hook naming detection on real React
250
+ * sources). Switch to a TS-AST extraction if FP/FN evidence emerges.
251
+ */
252
+ export function extractFunctionBody(source, declStart) {
253
+ const open = source.indexOf("{", declStart);
254
+ if (open < 0)
255
+ return source.slice(declStart);
256
+ let depth = 1;
257
+ for (let i = open + 1; i < source.length; i++) {
258
+ const c = source[i];
259
+ if (c === "{")
260
+ depth++;
261
+ else if (c === "}") {
262
+ depth--;
263
+ if (depth === 0)
264
+ return source.slice(open + 1, i);
265
+ }
266
+ }
267
+ return source.slice(open + 1);
268
+ }
269
+ /**
270
+ * Returns true if `source` at `declStart` declares an implicit-return arrow
271
+ * function whose body is a JSX expression: `export const X = (...) => <JSX>`.
272
+ *
273
+ * `declStart` should point at the start of the export declaration (the same
274
+ * index `EXPORT_FUNC_RE` reports). We walk past `export … = (` and the param
275
+ * list, expect `=>`, and then check that the first non-whitespace char opens
276
+ * JSX (via the shared `looksLikeJsxOpenAt` disambiguator).
277
+ *
278
+ * Returns false for:
279
+ * - block-body arrows (`=> {`) — caller should use `bodyReturnsJsx` instead
280
+ * - non-JSX implicit returns (`=> text.toUpperCase()`)
281
+ * - implicit returns whose JSX is inside a nested expression
282
+ * (`xs => xs.map(x => <li/>)`)
283
+ */
284
+ export function arrowImplicitReturnsJsx(source, declStart) {
285
+ const eq = source.indexOf("=", declStart);
286
+ if (eq < 0)
287
+ return false;
288
+ let i = eq + 1;
289
+ while (i < source.length && /\s/.test(source[i]))
290
+ i++;
291
+ if (source.slice(i, i + 5) === "async") {
292
+ i += 5;
293
+ while (i < source.length && /\s/.test(source[i]))
294
+ i++;
295
+ }
296
+ if (source[i] !== "(")
297
+ return false;
298
+ let depth = 1;
299
+ i++;
300
+ for (; i < source.length && depth > 0; i++) {
301
+ const c = source[i];
302
+ if (c === "(")
303
+ depth++;
304
+ else if (c === ")")
305
+ depth--;
306
+ }
307
+ if (depth !== 0)
308
+ return false;
309
+ while (i < source.length && /\s/.test(source[i]))
310
+ i++;
311
+ if (source[i] === ":") {
312
+ // Optional return-type annotation: skip until `=>`.
313
+ while (i < source.length && !(source[i] === "=" && source[i + 1] === ">"))
314
+ i++;
315
+ }
316
+ if (source[i] !== "=" || source[i + 1] !== ">")
317
+ return false;
318
+ i += 2;
319
+ while (i < source.length && /\s/.test(source[i]))
320
+ i++;
321
+ if (source[i] !== "<")
322
+ return false;
323
+ return looksLikeJsxOpenAt(source, i);
324
+ }
325
+ /**
326
+ * Filename / path evidence: a function is more likely to be a hook when it
327
+ * lives under `**\/hooks\/**` or in a file named `use-*.{ts,tsx,js,jsx}`.
328
+ */
329
+ export function fileIsInHooksDir(filePath) {
330
+ // Normalise backslashes for cross-platform determinism.
331
+ const p = filePath.replace(/\\/g, "/");
332
+ if (/(^|\/)hooks\//.test(p))
333
+ return true;
334
+ const base = p.slice(p.lastIndexOf("/") + 1);
335
+ if (/^use-[\w.-]+\.(tsx?|jsx?)$/.test(base))
336
+ return true;
337
+ return false;
338
+ }
339
+ /**
340
+ * Filename-as-evidence refinement (issue #166).
341
+ *
342
+ * Returns true ONLY when the file is named `use-<kebab>.{ts,tsx,js,jsx}` AND
343
+ * `funcName` is the camelCase form of `<kebab>` — i.e. the function name
344
+ * literally matches what the filename advertises as the hook target
345
+ * (minus the `use` prefix).
346
+ *
347
+ * Examples:
348
+ * use-toggle.ts + "toggle" → true
349
+ * use-combine-ref.ts + "combineRef" → true
350
+ * use-combine-ref.ts + "composeRefs" → false (co-located helper)
351
+ * use-toggle.ts + "useToggle" → false (already prefixed)
352
+ * hooks/index.ts + anything → false (no use-X filename)
353
+ * lib/helpers.ts + anything → false (not a use-X file)
354
+ *
355
+ * Used by `naming/hook-prefix` to gate path-evidence: a function in a
356
+ * `hooks/` directory is flagged via path alone only when its name matches
357
+ * the filename's advertised target. Unrelated co-located utilities are not
358
+ * flagged via path-evidence and must show body-call evidence to fire.
359
+ */
360
+ export function filenameMatchesFunction(filePath, funcName) {
361
+ const p = filePath.replace(/\\/g, "/");
362
+ const base = p.slice(p.lastIndexOf("/") + 1);
363
+ const m = base.match(/^use-([\w.-]+)\.(?:tsx?|jsx?)$/);
364
+ if (!m)
365
+ return false;
366
+ const kebab = m[1];
367
+ // Convert kebab to camelCase: split on `-`, lowercase first segment,
368
+ // capitalize the rest. `combine-ref` → `combineRef`.
369
+ const parts = kebab.split("-").filter((s) => s.length > 0);
370
+ if (parts.length === 0)
371
+ return false;
372
+ const camel = parts[0].toLowerCase() +
373
+ parts
374
+ .slice(1)
375
+ .map((s) => s[0].toUpperCase() + s.slice(1).toLowerCase())
376
+ .join("");
377
+ return funcName === camel;
378
+ }
379
+ //# sourceMappingURL=_function-body-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_function-body-analysis.js","sourceRoot":"","sources":["../../src/rules/_function-body-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RuleModule } from "@typescript-eslint/utils/ts-eslint";
2
+ import type { Rule, RuleContext, ParsedFiles, RuleEvalResult, AxisName, Severity, RuleMeta } from "../types.js";
3
+ export type { RuleModule };
4
+ export interface LyseRuleMeta {
5
+ axis: AxisName;
6
+ lyseRuleId: string;
7
+ defaultSeverity: Severity;
8
+ shortDescription: string;
9
+ fullDescription: string;
10
+ helpUri: string;
11
+ rationale: string;
12
+ examples: {
13
+ good: string;
14
+ bad: string;
15
+ }[];
16
+ allowlist: string[];
17
+ }
18
+ export type LyseEvaluator = (ctx: RuleContext, parsedFiles: ParsedFiles) => Promise<RuleEvalResult>;
19
+ export interface LyseRuleDefinition<Options extends readonly unknown[] = []> {
20
+ meta: LyseRuleMeta;
21
+ defaultOptions: Options;
22
+ create: () => {
23
+ evaluate: LyseEvaluator;
24
+ };
25
+ classifyConfidence?: Rule["classifyConfidence"];
26
+ applyCodemod?: Rule["applyCodemod"];
27
+ }
28
+ export declare function createLyseRule<Options extends readonly unknown[] = []>(def: LyseRuleDefinition<Options>): Rule;
29
+ export declare function getRegisteredRuleMeta(id: string): LyseRuleMeta | undefined;
30
+ export declare function listRegisteredRuleMetas(): LyseRuleMeta[];
31
+ export declare function toRuleMeta(m: LyseRuleMeta): RuleMeta;
@@ -0,0 +1,32 @@
1
+ const META_REGISTRY = new Map();
2
+ export function createLyseRule(def) {
3
+ META_REGISTRY.set(def.meta.lyseRuleId, def.meta);
4
+ const { evaluate } = def.create();
5
+ return {
6
+ id: def.meta.lyseRuleId,
7
+ axis: def.meta.axis,
8
+ evaluate,
9
+ ...(def.classifyConfidence ? { classifyConfidence: def.classifyConfidence } : {}),
10
+ ...(def.applyCodemod ? { applyCodemod: def.applyCodemod } : {}),
11
+ };
12
+ }
13
+ export function getRegisteredRuleMeta(id) {
14
+ return META_REGISTRY.get(id);
15
+ }
16
+ export function listRegisteredRuleMetas() {
17
+ return Array.from(META_REGISTRY.values());
18
+ }
19
+ export function toRuleMeta(m) {
20
+ return {
21
+ id: m.lyseRuleId,
22
+ axis: m.axis,
23
+ defaultSeverity: m.defaultSeverity,
24
+ shortDescription: m.shortDescription,
25
+ fullDescription: m.fullDescription,
26
+ helpUri: m.helpUri,
27
+ rationale: m.rationale,
28
+ examples: m.examples,
29
+ allowlist: m.allowlist,
30
+ };
31
+ }
32
+ //# sourceMappingURL=_rule-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_rule-module.js","sourceRoot":"","sources":["../../src/rules/_rule-module.ts"],"names":[],"mappings":"AAwCA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAE5B,GAAgC;IAChC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;QACnB,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,UAAU;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared skip-context helpers used by tokens/no-hardcoded-color and
3
+ * tokens/no-hardcoded-spacing to suppress intentional false positives.
4
+ *
5
+ * NOTE: All helpers are SAME-LINE heuristics only. Multi-line <code> / <pre>
6
+ * blocks, or JSX expressions like sizes={"..."}, would require AST traversal
7
+ * — that is V1 work.
8
+ */
9
+ /**
10
+ * Returns true if the byte offset `index` in `source` falls inside a
11
+ * `<code>...</code>` or `<pre>...</pre>` block that opens AND closes on the
12
+ * same line as the match. Useful for skipping display-only CSS examples
13
+ * rendered by shadcn theme customizers.
14
+ *
15
+ * Limitation: multi-line code blocks are NOT detected. V1 needs AST context.
16
+ */
17
+ export declare function isInsideCodeDisplay(source: string, index: number): boolean;
18
+ /**
19
+ * Returns true if `index` is inside the quoted value of a JSX attribute we
20
+ * intentionally skip (sizes, srcSet, media — responsive image markup).
21
+ */
22
+ export declare function isInsideSkippedJsxAttr(source: string, index: number): boolean;
23
+ /**
24
+ * Returns true if the byte offset `index` falls on the right-hand side of a
25
+ * CSS custom-property declaration — i.e. `--<name>:` followed by the value.
26
+ *
27
+ * Token *definitions* (`:root { --color: #fff }`, `@theme { --space: 16px }`)
28
+ * are the source of truth for the design system and must never be flagged
29
+ * as hardcoded drift. The guard is property-name-based so it works regardless
30
+ * of the enclosing selector (`:root`, `@theme`, `[data-theme=...]`, etc.).
31
+ *
32
+ * Walks back from `index` to the nearest declaration boundary (`;`, `{`, `}`,
33
+ * or buffer start) skipping whitespace, then checks whether the property name
34
+ * starts with `--`.
35
+ */
36
+ export declare function isCssCustomPropertyDeclaration(source: string, index: number): boolean;
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Shared skip-context helpers used by tokens/no-hardcoded-color and
3
+ * tokens/no-hardcoded-spacing to suppress intentional false positives.
4
+ *
5
+ * NOTE: All helpers are SAME-LINE heuristics only. Multi-line <code> / <pre>
6
+ * blocks, or JSX expressions like sizes={"..."}, would require AST traversal
7
+ * — that is V1 work.
8
+ */
9
+ /**
10
+ * Returns true if the byte offset `index` in `source` falls inside a
11
+ * `<code>...</code>` or `<pre>...</pre>` block that opens AND closes on the
12
+ * same line as the match. Useful for skipping display-only CSS examples
13
+ * rendered by shadcn theme customizers.
14
+ *
15
+ * Limitation: multi-line code blocks are NOT detected. V1 needs AST context.
16
+ */
17
+ export function isInsideCodeDisplay(source, index) {
18
+ const lineStart = source.lastIndexOf("\n", index - 1) + 1;
19
+ let lineEnd = source.indexOf("\n", index);
20
+ if (lineEnd === -1)
21
+ lineEnd = source.length;
22
+ const line = source.slice(lineStart, lineEnd);
23
+ const posInLine = index - lineStart;
24
+ for (const tag of ["code", "pre"]) {
25
+ const openTag = `<${tag}>`;
26
+ const closeTag = `</${tag}>`;
27
+ let openIdx = -1;
28
+ while ((openIdx = line.indexOf(openTag, openIdx + 1)) !== -1) {
29
+ const closeIdx = line.indexOf(closeTag, openIdx + openTag.length);
30
+ if (closeIdx !== -1 && openIdx < posInLine && posInLine < closeIdx) {
31
+ return true;
32
+ }
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ /**
38
+ * JSX attributes whose string values should be excluded from spacing checks.
39
+ * These carry responsive image / media-query breakpoint values (px, vw, etc.)
40
+ * that are NOT design tokens.
41
+ *
42
+ * NOTE: the `sizes={"..."}` JSX-expression form is NOT handled by this regex.
43
+ * V1 work — requires AST traversal to detect the expression boundary.
44
+ */
45
+ const SKIP_JSX_ATTRS = ["sizes", "srcSet", "srcset", "media"];
46
+ /**
47
+ * Returns true if `index` is inside the quoted value of a JSX attribute we
48
+ * intentionally skip (sizes, srcSet, media — responsive image markup).
49
+ */
50
+ export function isInsideSkippedJsxAttr(source, index) {
51
+ const lineStart = source.lastIndexOf("\n", index - 1) + 1;
52
+ let lineEnd = source.indexOf("\n", index);
53
+ if (lineEnd === -1)
54
+ lineEnd = source.length;
55
+ const line = source.slice(lineStart, lineEnd);
56
+ const posInLine = index - lineStart;
57
+ for (const attr of SKIP_JSX_ATTRS) {
58
+ // Matches: attr="..." or attr='...'
59
+ // The sizes={"..."} form requires AST — deferred to V1.
60
+ const re = new RegExp(`${attr}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`, "g");
61
+ let am;
62
+ while ((am = re.exec(line)) !== null) {
63
+ const value = am[1] ?? am[2] ?? "";
64
+ const quoteIdx = am.index + am[0].indexOf(value);
65
+ const valueStart = quoteIdx;
66
+ const valueEnd = quoteIdx + value.length;
67
+ if (posInLine >= valueStart && posInLine <= valueEnd)
68
+ return true;
69
+ }
70
+ }
71
+ return false;
72
+ }
73
+ /**
74
+ * Returns true if the byte offset `index` falls on the right-hand side of a
75
+ * CSS custom-property declaration — i.e. `--<name>:` followed by the value.
76
+ *
77
+ * Token *definitions* (`:root { --color: #fff }`, `@theme { --space: 16px }`)
78
+ * are the source of truth for the design system and must never be flagged
79
+ * as hardcoded drift. The guard is property-name-based so it works regardless
80
+ * of the enclosing selector (`:root`, `@theme`, `[data-theme=...]`, etc.).
81
+ *
82
+ * Walks back from `index` to the nearest declaration boundary (`;`, `{`, `}`,
83
+ * or buffer start) skipping whitespace, then checks whether the property name
84
+ * starts with `--`.
85
+ */
86
+ export function isCssCustomPropertyDeclaration(source, index) {
87
+ let colonIdx = -1;
88
+ let depth = 0;
89
+ for (let i = index - 1; i >= 0; i--) {
90
+ const c = source[i];
91
+ if (c === ")") {
92
+ depth++;
93
+ continue;
94
+ }
95
+ if (c === "(") {
96
+ if (depth > 0)
97
+ depth--;
98
+ continue;
99
+ }
100
+ if (depth > 0)
101
+ continue;
102
+ if (c === ";" || c === "{" || c === "}")
103
+ return false;
104
+ if (c === ":") {
105
+ colonIdx = i;
106
+ break;
107
+ }
108
+ }
109
+ if (colonIdx < 0)
110
+ return false;
111
+ let end = colonIdx;
112
+ while (end > 0) {
113
+ const c = source[end - 1] ?? "";
114
+ if (!/\s/.test(c))
115
+ break;
116
+ end--;
117
+ }
118
+ let start = end;
119
+ while (start > 0) {
120
+ const c = source[start - 1] ?? "";
121
+ if (!/[a-zA-Z0-9_-]/.test(c))
122
+ break;
123
+ start--;
124
+ }
125
+ const propName = source.slice(start, end);
126
+ return propName.startsWith("--");
127
+ }
128
+ //# sourceMappingURL=_skip-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_skip-context.js","sourceRoot":"","sources":["../../src/rules/_skip-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,KAAa;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC;QAC7B,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,SAAS,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,KAAa;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,oCAAoC;QACpC,wDAAwD;QACxD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,kCAAkC,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,EAA0B,CAAC;QAC/B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;YACzC,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,KAAa;IAC1E,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,KAAK,GAAG,CAAC;gBAAE,KAAK,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM;QACzB,GAAG,EAAE,CAAC;IACR,CAAC;IACD,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM;QACpC,KAAK,EAAE,CAAC;IACV,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const rule: import("../types.js").Rule;