@shivaedev/quality 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +6 -2
  3. package/dist/baseline/compare.d.ts +2 -2
  4. package/dist/baseline/compare.d.ts.map +1 -1
  5. package/dist/baseline/compare.js +6 -4
  6. package/dist/baseline/compare.js.map +1 -1
  7. package/dist/baseline/format.d.ts +5 -5
  8. package/dist/baseline/format.d.ts.map +1 -1
  9. package/dist/baseline/format.js +23 -13
  10. package/dist/baseline/format.js.map +1 -1
  11. package/dist/baseline/legacy.d.ts +2 -2
  12. package/dist/baseline/legacy.d.ts.map +1 -1
  13. package/dist/baseline/legacy.js +4 -4
  14. package/dist/baseline/legacy.js.map +1 -1
  15. package/dist/baseline/rewrite.d.ts +1 -1
  16. package/dist/baseline/rewrite.d.ts.map +1 -1
  17. package/dist/baseline/rewrite.js +2 -2
  18. package/dist/baseline/rewrite.js.map +1 -1
  19. package/dist/baseline/update.d.ts +2 -2
  20. package/dist/baseline/update.d.ts.map +1 -1
  21. package/dist/baseline/update.js +27 -21
  22. package/dist/baseline/update.js.map +1 -1
  23. package/dist/cli/args.d.ts +2 -4
  24. package/dist/cli/args.d.ts.map +1 -1
  25. package/dist/cli/args.js +19 -18
  26. package/dist/cli/args.js.map +1 -1
  27. package/dist/cli/baseline.d.ts +1 -1
  28. package/dist/cli/baseline.d.ts.map +1 -1
  29. package/dist/cli/baseline.js +10 -6
  30. package/dist/cli/baseline.js.map +1 -1
  31. package/dist/cli/fix.d.ts +2 -2
  32. package/dist/cli/fix.d.ts.map +1 -1
  33. package/dist/cli/fix.js +35 -41
  34. package/dist/cli/fix.js.map +1 -1
  35. package/dist/cli/lint.d.ts +1 -2
  36. package/dist/cli/lint.d.ts.map +1 -1
  37. package/dist/cli/lint.js +1 -2
  38. package/dist/cli/lint.js.map +1 -1
  39. package/dist/cli/messages.d.ts +1 -1
  40. package/dist/cli/messages.d.ts.map +1 -1
  41. package/dist/cli/messages.js +2 -2
  42. package/dist/cli/migrate.d.ts.map +1 -1
  43. package/dist/cli/migrate.js +2 -2
  44. package/dist/cli/migrate.js.map +1 -1
  45. package/dist/cli/migrateExceptions.js +1 -1
  46. package/dist/cli/migrateExceptions.js.map +1 -1
  47. package/dist/cli/program.js +1 -1
  48. package/dist/cli/program.js.map +1 -1
  49. package/dist/cli/{run-main.d.ts → runMain.d.ts} +1 -1
  50. package/dist/cli/runMain.d.ts.map +1 -0
  51. package/dist/cli/{run-main.js → runMain.js} +3 -3
  52. package/dist/cli/runMain.js.map +1 -0
  53. package/dist/cli/shrink.d.ts +2 -2
  54. package/dist/cli/shrink.d.ts.map +1 -1
  55. package/dist/cli/shrink.js +9 -3
  56. package/dist/cli/shrink.js.map +1 -1
  57. package/dist/cli.js +1 -1
  58. package/dist/cli.js.map +1 -1
  59. package/dist/config/decode.d.ts +1 -1
  60. package/dist/config/decode.d.ts.map +1 -1
  61. package/dist/config/decode.js +13 -9
  62. package/dist/config/decode.js.map +1 -1
  63. package/dist/config/load.d.ts.map +1 -1
  64. package/dist/config/load.js +26 -20
  65. package/dist/config/load.js.map +1 -1
  66. package/dist/config/resolve.d.ts +23 -3
  67. package/dist/config/resolve.d.ts.map +1 -1
  68. package/dist/config/resolve.js +19 -11
  69. package/dist/config/resolve.js.map +1 -1
  70. package/dist/config.d.ts +3 -3
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +3 -1
  73. package/dist/config.js.map +1 -1
  74. package/dist/decoded.d.ts +3 -3
  75. package/dist/decoded.d.ts.map +1 -1
  76. package/dist/decoded.js +8 -6
  77. package/dist/decoded.js.map +1 -1
  78. package/dist/engine/{baseline-file.d.ts → baselineFile.d.ts} +2 -2
  79. package/dist/engine/baselineFile.d.ts.map +1 -0
  80. package/dist/engine/{baseline-file.js → baselineFile.js} +5 -3
  81. package/dist/engine/baselineFile.js.map +1 -0
  82. package/dist/engine/evaluate.d.ts +2 -3
  83. package/dist/engine/evaluate.d.ts.map +1 -1
  84. package/dist/engine/evaluate.js +6 -5
  85. package/dist/engine/evaluate.js.map +1 -1
  86. package/dist/engine/{run-rules.d.ts → runRules.d.ts} +2 -2
  87. package/dist/engine/runRules.d.ts.map +1 -0
  88. package/dist/engine/runRules.js +44 -0
  89. package/dist/engine/runRules.js.map +1 -0
  90. package/dist/engine/session.d.ts +1 -1
  91. package/dist/engine/session.d.ts.map +1 -1
  92. package/dist/engine/session.js +10 -6
  93. package/dist/engine/session.js.map +1 -1
  94. package/dist/engine/violation.d.ts +8 -8
  95. package/dist/engine/violation.d.ts.map +1 -1
  96. package/dist/engine/violation.js +23 -11
  97. package/dist/engine/violation.js.map +1 -1
  98. package/dist/exceptions/registry.d.ts +2 -2
  99. package/dist/exceptions/registry.d.ts.map +1 -1
  100. package/dist/exceptions/registry.js +10 -6
  101. package/dist/exceptions/registry.js.map +1 -1
  102. package/dist/git/base.d.ts +1 -2
  103. package/dist/git/base.d.ts.map +1 -1
  104. package/dist/git/base.js +22 -10
  105. package/dist/git/base.js.map +1 -1
  106. package/dist/git/command.d.ts +2 -2
  107. package/dist/git/command.d.ts.map +1 -1
  108. package/dist/git/command.js +13 -9
  109. package/dist/git/command.js.map +1 -1
  110. package/dist/git/history.d.ts +1 -1
  111. package/dist/git/history.d.ts.map +1 -1
  112. package/dist/git/history.js +5 -3
  113. package/dist/git/history.js.map +1 -1
  114. package/dist/hooks/preCommit.js +1 -1
  115. package/dist/hooks/preCommit.js.map +1 -1
  116. package/dist/imports/generated.js +1 -1
  117. package/dist/imports/generated.js.map +1 -1
  118. package/dist/imports/{pnpm-workspace.d.ts → pnpmWorkspacePatterns.d.ts} +1 -1
  119. package/dist/imports/pnpmWorkspacePatterns.d.ts.map +1 -0
  120. package/dist/imports/{pnpm-workspace.js → pnpmWorkspacePatterns.js} +1 -1
  121. package/dist/imports/pnpmWorkspacePatterns.js.map +1 -0
  122. package/dist/imports/resolve.js +1 -1
  123. package/dist/imports/resolve.js.map +1 -1
  124. package/dist/imports/workspace.js +1 -1
  125. package/dist/imports/workspace.js.map +1 -1
  126. package/dist/inventory/collect.d.ts +1 -1
  127. package/dist/inventory/collect.d.ts.map +1 -1
  128. package/dist/inventory/collect.js +8 -6
  129. package/dist/inventory/collect.js.map +1 -1
  130. package/dist/inventory/filesystem.d.ts +1 -1
  131. package/dist/inventory/filesystem.d.ts.map +1 -1
  132. package/dist/inventory/filesystem.js +11 -7
  133. package/dist/inventory/filesystem.js.map +1 -1
  134. package/dist/inventory/ignoreScope.d.ts +17 -0
  135. package/dist/inventory/ignoreScope.d.ts.map +1 -0
  136. package/dist/inventory/{ignore-scope.js → ignoreScope.js} +19 -10
  137. package/dist/inventory/ignoreScope.js.map +1 -0
  138. package/dist/inventory/walk.d.ts +1 -1
  139. package/dist/inventory/walk.d.ts.map +1 -1
  140. package/dist/inventory/walk.js +1 -1
  141. package/dist/inventory/walk.js.map +1 -1
  142. package/dist/manifests/sorted.d.ts +1 -1
  143. package/dist/manifests/sorted.d.ts.map +1 -1
  144. package/dist/manifests/sorted.js +15 -17
  145. package/dist/manifests/sorted.js.map +1 -1
  146. package/dist/report/plural.d.ts +1 -1
  147. package/dist/report/plural.d.ts.map +1 -1
  148. package/dist/report/plural.js +3 -1
  149. package/dist/report/plural.js.map +1 -1
  150. package/dist/report/render.d.ts +1 -3
  151. package/dist/report/render.d.ts.map +1 -1
  152. package/dist/report/render.js +30 -32
  153. package/dist/report/render.js.map +1 -1
  154. package/dist/report/stale.d.ts +1 -1
  155. package/dist/report/stale.d.ts.map +1 -1
  156. package/dist/report/stale.js +18 -8
  157. package/dist/report/stale.js.map +1 -1
  158. package/dist/rule.d.ts +14 -14
  159. package/dist/rule.d.ts.map +1 -1
  160. package/dist/rule.js +11 -9
  161. package/dist/rule.js.map +1 -1
  162. package/dist/rules/{built-in.d.ts → builtIn.d.ts} +3 -3
  163. package/dist/rules/builtIn.d.ts.map +1 -0
  164. package/dist/rules/{built-in.js → builtIn.js} +17 -13
  165. package/dist/rules/builtIn.js.map +1 -0
  166. package/dist/rules/comments/{pattern-rule.d.ts → definePattern.d.ts} +2 -2
  167. package/dist/rules/comments/definePattern.d.ts.map +1 -0
  168. package/dist/rules/comments/definePattern.js +18 -0
  169. package/dist/rules/comments/definePattern.js.map +1 -0
  170. package/dist/rules/comments/kinds.d.ts +4 -4
  171. package/dist/rules/comments/kinds.d.ts.map +1 -1
  172. package/dist/rules/comments/kinds.js +16 -8
  173. package/dist/rules/comments/kinds.js.map +1 -1
  174. package/dist/rules/comments/{max-per-file.d.ts → maxPerFile.d.ts} +1 -1
  175. package/dist/rules/comments/maxPerFile.d.ts.map +1 -0
  176. package/dist/rules/comments/{max-per-file.js → maxPerFile.js} +14 -10
  177. package/dist/rules/comments/maxPerFile.js.map +1 -0
  178. package/dist/rules/comments/{no-banner.d.ts → noBanner.d.ts} +1 -1
  179. package/dist/rules/comments/noBanner.d.ts.map +1 -0
  180. package/dist/rules/comments/{no-banner.js → noBanner.js} +2 -2
  181. package/dist/rules/comments/noBanner.js.map +1 -0
  182. package/dist/rules/comments/{no-environment-pragma.d.ts → noEnvironmentPragma.d.ts} +1 -1
  183. package/dist/rules/comments/noEnvironmentPragma.d.ts.map +1 -0
  184. package/dist/rules/comments/{no-environment-pragma.js → noEnvironmentPragma.js} +2 -2
  185. package/dist/rules/comments/noEnvironmentPragma.js.map +1 -0
  186. package/dist/rules/comments/{no-jsdoc.d.ts → noJsdoc.d.ts} +1 -1
  187. package/dist/rules/comments/noJsdoc.d.ts.map +1 -0
  188. package/dist/rules/comments/{no-jsdoc.js → noJsdoc.js} +1 -1
  189. package/dist/rules/comments/noJsdoc.js.map +1 -0
  190. package/dist/rules/comments/{no-line-reference.d.ts → noLineReference.d.ts} +1 -1
  191. package/dist/rules/comments/noLineReference.d.ts.map +1 -0
  192. package/dist/rules/comments/{no-line-reference.js → noLineReference.js} +2 -2
  193. package/dist/rules/comments/noLineReference.js.map +1 -0
  194. package/dist/rules/comments/{no-pr-reference.d.ts → noPrReference.d.ts} +1 -1
  195. package/dist/rules/comments/noPrReference.d.ts.map +1 -0
  196. package/dist/rules/comments/{no-pr-reference.js → noPrReference.js} +2 -2
  197. package/dist/rules/comments/noPrReference.js.map +1 -0
  198. package/dist/rules/comments/{no-todo.d.ts → noTodo.d.ts} +1 -1
  199. package/dist/rules/comments/noTodo.d.ts.map +1 -0
  200. package/dist/rules/comments/{no-todo.js → noTodo.js} +2 -2
  201. package/dist/rules/comments/noTodo.js.map +1 -0
  202. package/dist/rules/comments/scan.d.ts +3 -3
  203. package/dist/rules/comments/scan.d.ts.map +1 -1
  204. package/dist/rules/comments/scan.js +23 -19
  205. package/dist/rules/comments/scan.js.map +1 -1
  206. package/dist/rules/{manifests-sorted.d.ts → manifestsSorted.d.ts} +1 -1
  207. package/dist/rules/manifestsSorted.d.ts.map +1 -0
  208. package/dist/rules/{manifests-sorted.js → manifestsSorted.js} +1 -1
  209. package/dist/rules/manifestsSorted.js.map +1 -0
  210. package/dist/rules/manifestsSourceFirst.d.ts +2 -0
  211. package/dist/rules/manifestsSourceFirst.d.ts.map +1 -0
  212. package/dist/rules/manifestsSourceFirst.js +43 -0
  213. package/dist/rules/manifestsSourceFirst.js.map +1 -0
  214. package/dist/rules/{max-lines.d.ts → maxLines.d.ts} +1 -1
  215. package/dist/rules/maxLines.d.ts.map +1 -0
  216. package/dist/rules/{max-lines.js → maxLines.js} +13 -11
  217. package/dist/rules/maxLines.js.map +1 -0
  218. package/dist/rules/stories/origins.d.ts +10 -0
  219. package/dist/rules/stories/origins.d.ts.map +1 -0
  220. package/dist/rules/stories/origins.js +129 -0
  221. package/dist/rules/stories/origins.js.map +1 -0
  222. package/dist/rules/stories/prerequisites.d.ts +4 -0
  223. package/dist/rules/stories/prerequisites.d.ts.map +1 -0
  224. package/dist/rules/stories/prerequisites.js +32 -0
  225. package/dist/rules/stories/prerequisites.js.map +1 -0
  226. package/dist/rules/stories/program.d.ts +5 -0
  227. package/dist/rules/stories/program.d.ts.map +1 -0
  228. package/dist/rules/stories/program.js +22 -0
  229. package/dist/rules/stories/program.js.map +1 -0
  230. package/dist/rules/stories/specs.d.ts +2 -0
  231. package/dist/rules/stories/specs.d.ts.map +1 -0
  232. package/dist/rules/stories/specs.js +80 -0
  233. package/dist/rules/stories/specs.js.map +1 -0
  234. package/dist/rules/suppressions/biome/configs.d.ts +1 -1
  235. package/dist/rules/suppressions/biome/configs.d.ts.map +1 -1
  236. package/dist/rules/suppressions/biome/configs.js +23 -17
  237. package/dist/rules/suppressions/biome/configs.js.map +1 -1
  238. package/dist/rules/suppressions/biome/declarations.d.ts +4 -4
  239. package/dist/rules/suppressions/biome/declarations.d.ts.map +1 -1
  240. package/dist/rules/suppressions/biome/declarations.js +15 -7
  241. package/dist/rules/suppressions/biome/declarations.js.map +1 -1
  242. package/dist/rules/suppressions/biome/json.d.ts +6 -6
  243. package/dist/rules/suppressions/biome/json.d.ts.map +1 -1
  244. package/dist/rules/suppressions/biome/json.js +27 -13
  245. package/dist/rules/suppressions/biome/json.js.map +1 -1
  246. package/dist/rules/suppressions/biome/resolve.d.ts +1 -1
  247. package/dist/rules/suppressions/biome/resolve.d.ts.map +1 -1
  248. package/dist/rules/suppressions/biome/resolve.js +23 -17
  249. package/dist/rules/suppressions/biome/resolve.js.map +1 -1
  250. package/dist/rules/suppressions/biome/weakenings.d.ts +1 -1
  251. package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -1
  252. package/dist/rules/suppressions/biome/weakenings.js +78 -52
  253. package/dist/rules/suppressions/biome/weakenings.js.map +1 -1
  254. package/dist/rules/suppressions/{biome-overrides.d.ts → biomeOverrides.d.ts} +1 -1
  255. package/dist/rules/suppressions/biomeOverrides.d.ts.map +1 -0
  256. package/dist/rules/suppressions/biomeOverrides.js +75 -0
  257. package/dist/rules/suppressions/biomeOverrides.js.map +1 -0
  258. package/dist/rules/suppressions/directives.d.ts +1 -1
  259. package/dist/rules/suppressions/directives.d.ts.map +1 -1
  260. package/dist/rules/suppressions/directives.js +5 -3
  261. package/dist/rules/suppressions/directives.js.map +1 -1
  262. package/dist/rules/suppressions/{no-double-cast.d.ts → noDoubleCast.d.ts} +1 -1
  263. package/dist/rules/suppressions/noDoubleCast.d.ts.map +1 -0
  264. package/dist/rules/suppressions/{no-double-cast.js → noDoubleCast.js} +15 -11
  265. package/dist/rules/suppressions/noDoubleCast.js.map +1 -0
  266. package/dist/rules/suppressions/noIgnoreDeprecations.js +1 -1
  267. package/dist/rules/suppressions/noIgnoreDeprecations.js.map +1 -1
  268. package/dist/rules/suppressions/{no-inline.d.ts → noInline.d.ts} +1 -1
  269. package/dist/rules/suppressions/noInline.d.ts.map +1 -0
  270. package/dist/rules/suppressions/{no-inline.js → noInline.js} +10 -8
  271. package/dist/rules/suppressions/noInline.js.map +1 -0
  272. package/dist/rules/suppressions/stylesheetComments.d.ts +4 -0
  273. package/dist/rules/suppressions/stylesheetComments.d.ts.map +1 -0
  274. package/dist/rules/suppressions/{stylesheet-comments.js → stylesheetComments.js} +12 -6
  275. package/dist/rules/suppressions/stylesheetComments.js.map +1 -0
  276. package/dist/rules/syntax.d.ts +1 -1
  277. package/dist/rules/syntax.d.ts.map +1 -1
  278. package/dist/rules/syntax.js +2 -2
  279. package/dist/rules/syntax.js.map +1 -1
  280. package/dist/{standard-schema.d.ts → standardSchema.d.ts} +7 -7
  281. package/dist/standardSchema.d.ts.map +1 -0
  282. package/dist/{standard-schema.js → standardSchema.js} +1 -1
  283. package/dist/standardSchema.js.map +1 -0
  284. package/docs/debt-and-hooks.md +2 -2
  285. package/docs/modules.md +27 -24
  286. package/docs/roadmap.md +1 -1
  287. package/docs/rules.md +2 -0
  288. package/package.json +2 -3
  289. package/src/baseline/compare.ts +6 -4
  290. package/src/baseline/format.ts +17 -10
  291. package/src/baseline/legacy.ts +4 -4
  292. package/src/baseline/rewrite.ts +2 -2
  293. package/src/baseline/update.ts +23 -19
  294. package/src/cli/args.ts +20 -21
  295. package/src/cli/baseline.ts +36 -35
  296. package/src/cli/fix.ts +40 -43
  297. package/src/cli/lint.ts +17 -21
  298. package/src/cli/messages.ts +2 -2
  299. package/src/cli/migrate.ts +21 -22
  300. package/src/cli/migrateExceptions.ts +1 -1
  301. package/src/cli/program.ts +1 -1
  302. package/src/cli/{run-main.ts → runMain.ts} +2 -2
  303. package/src/cli/shrink.ts +11 -8
  304. package/src/cli.ts +1 -1
  305. package/src/config/decode.ts +15 -10
  306. package/src/config/load.ts +44 -37
  307. package/src/config/resolve.ts +34 -29
  308. package/src/config.ts +5 -3
  309. package/src/decoded.ts +6 -5
  310. package/src/engine/baselineFile.ts +29 -0
  311. package/src/engine/evaluate.ts +7 -8
  312. package/src/engine/{run-rules.ts → runRules.ts} +22 -14
  313. package/src/engine/session.ts +34 -27
  314. package/src/engine/violation.ts +24 -13
  315. package/src/exceptions/registry.ts +10 -8
  316. package/src/git/base.ts +45 -37
  317. package/src/git/command.ts +6 -4
  318. package/src/git/history.ts +5 -4
  319. package/src/hooks/preCommit.ts +1 -1
  320. package/src/imports/generated.ts +1 -1
  321. package/src/imports/resolve.ts +1 -1
  322. package/src/imports/workspace.ts +1 -1
  323. package/src/inventory/collect.ts +40 -35
  324. package/src/inventory/filesystem.ts +38 -30
  325. package/src/inventory/{ignore-scope.ts → ignoreScope.ts} +20 -10
  326. package/src/inventory/walk.ts +1 -1
  327. package/src/manifests/sorted.ts +19 -19
  328. package/src/report/plural.ts +3 -1
  329. package/src/report/render.ts +24 -39
  330. package/src/report/stale.ts +33 -25
  331. package/src/rule.ts +26 -20
  332. package/src/rules/{built-in.ts → builtIn.ts} +16 -12
  333. package/src/rules/comments/{pattern-rule.ts → definePattern.ts} +5 -4
  334. package/src/rules/comments/kinds.ts +16 -9
  335. package/src/rules/comments/{max-per-file.ts → maxPerFile.ts} +15 -11
  336. package/src/rules/comments/{no-banner.ts → noBanner.ts} +1 -1
  337. package/src/rules/comments/{no-environment-pragma.ts → noEnvironmentPragma.ts} +1 -1
  338. package/src/rules/comments/{no-line-reference.ts → noLineReference.ts} +1 -1
  339. package/src/rules/comments/{no-pr-reference.ts → noPrReference.ts} +1 -1
  340. package/src/rules/comments/{no-todo.ts → noTodo.ts} +1 -1
  341. package/src/rules/comments/scan.ts +18 -15
  342. package/src/rules/manifestsSourceFirst.ts +48 -0
  343. package/src/rules/{max-lines.ts → maxLines.ts} +3 -2
  344. package/src/rules/stories/origins.ts +147 -0
  345. package/src/rules/stories/prerequisites.ts +37 -0
  346. package/src/rules/stories/program.ts +29 -0
  347. package/src/rules/stories/specs.ts +93 -0
  348. package/src/rules/suppressions/biome/configs.ts +23 -17
  349. package/src/rules/suppressions/biome/declarations.ts +15 -10
  350. package/src/rules/suppressions/biome/json.ts +25 -13
  351. package/src/rules/suppressions/biome/resolve.ts +23 -18
  352. package/src/rules/suppressions/biome/weakenings.ts +60 -41
  353. package/src/rules/suppressions/{biome-overrides.ts → biomeOverrides.ts} +32 -22
  354. package/src/rules/suppressions/directives.ts +5 -4
  355. package/src/rules/suppressions/{no-double-cast.ts → noDoubleCast.ts} +14 -10
  356. package/src/rules/suppressions/noIgnoreDeprecations.ts +1 -1
  357. package/src/rules/suppressions/{no-inline.ts → noInline.ts} +6 -5
  358. package/src/rules/suppressions/{stylesheet-comments.ts → stylesheetComments.ts} +11 -6
  359. package/src/rules/syntax.ts +2 -2
  360. package/src/{standard-schema.ts → standardSchema.ts} +4 -4
  361. package/dist/cli/run-main.d.ts.map +0 -1
  362. package/dist/cli/run-main.js.map +0 -1
  363. package/dist/engine/baseline-file.d.ts.map +0 -1
  364. package/dist/engine/baseline-file.js.map +0 -1
  365. package/dist/engine/run-rules.d.ts.map +0 -1
  366. package/dist/engine/run-rules.js +0 -34
  367. package/dist/engine/run-rules.js.map +0 -1
  368. package/dist/imports/pnpm-workspace.d.ts.map +0 -1
  369. package/dist/imports/pnpm-workspace.js.map +0 -1
  370. package/dist/inventory/ignore-scope.d.ts +0 -17
  371. package/dist/inventory/ignore-scope.d.ts.map +0 -1
  372. package/dist/inventory/ignore-scope.js.map +0 -1
  373. package/dist/rules/built-in.d.ts.map +0 -1
  374. package/dist/rules/built-in.js.map +0 -1
  375. package/dist/rules/comments/max-per-file.d.ts.map +0 -1
  376. package/dist/rules/comments/max-per-file.js.map +0 -1
  377. package/dist/rules/comments/no-banner.d.ts.map +0 -1
  378. package/dist/rules/comments/no-banner.js.map +0 -1
  379. package/dist/rules/comments/no-environment-pragma.d.ts.map +0 -1
  380. package/dist/rules/comments/no-environment-pragma.js.map +0 -1
  381. package/dist/rules/comments/no-jsdoc.d.ts.map +0 -1
  382. package/dist/rules/comments/no-jsdoc.js.map +0 -1
  383. package/dist/rules/comments/no-line-reference.d.ts.map +0 -1
  384. package/dist/rules/comments/no-line-reference.js.map +0 -1
  385. package/dist/rules/comments/no-pr-reference.d.ts.map +0 -1
  386. package/dist/rules/comments/no-pr-reference.js.map +0 -1
  387. package/dist/rules/comments/no-todo.d.ts.map +0 -1
  388. package/dist/rules/comments/no-todo.js.map +0 -1
  389. package/dist/rules/comments/pattern-rule.d.ts.map +0 -1
  390. package/dist/rules/comments/pattern-rule.js +0 -16
  391. package/dist/rules/comments/pattern-rule.js.map +0 -1
  392. package/dist/rules/manifests-sorted.d.ts.map +0 -1
  393. package/dist/rules/manifests-sorted.js.map +0 -1
  394. package/dist/rules/max-lines.d.ts.map +0 -1
  395. package/dist/rules/max-lines.js.map +0 -1
  396. package/dist/rules/suppressions/biome-overrides.d.ts.map +0 -1
  397. package/dist/rules/suppressions/biome-overrides.js +0 -63
  398. package/dist/rules/suppressions/biome-overrides.js.map +0 -1
  399. package/dist/rules/suppressions/no-double-cast.d.ts.map +0 -1
  400. package/dist/rules/suppressions/no-double-cast.js.map +0 -1
  401. package/dist/rules/suppressions/no-inline.d.ts.map +0 -1
  402. package/dist/rules/suppressions/no-inline.js.map +0 -1
  403. package/dist/rules/suppressions/stylesheet-comments.d.ts +0 -4
  404. package/dist/rules/suppressions/stylesheet-comments.d.ts.map +0 -1
  405. package/dist/rules/suppressions/stylesheet-comments.js.map +0 -1
  406. package/dist/standard-schema.d.ts.map +0 -1
  407. package/dist/standard-schema.js.map +0 -1
  408. package/src/engine/baseline-file.ts +0 -27
  409. /package/src/imports/{pnpm-workspace.ts → pnpmWorkspacePatterns.ts} +0 -0
  410. /package/src/rules/comments/{no-jsdoc.ts → noJsdoc.ts} +0 -0
  411. /package/src/rules/{manifests-sorted.ts → manifestsSorted.ts} +0 -0
@@ -13,8 +13,8 @@ export interface Pruned {
13
13
  readonly removed: number;
14
14
  }
15
15
 
16
- const record = (violations: readonly Violation[]): readonly BaselineEntry[] =>
17
- [...groupBy(violations, (violation) => keyOf(violation.rule, violation.file)).values()].flatMap((group) => {
16
+ function record(violations: readonly Violation[]): readonly BaselineEntry[] {
17
+ return [...groupBy(violations, (violation) => keyOf(violation.rule, violation.file)).values()].flatMap((group) => {
18
18
  const first = group[0];
19
19
  if (first === undefined) {
20
20
  return [];
@@ -22,21 +22,22 @@ const record = (violations: readonly Violation[]): readonly BaselineEntry[] =>
22
22
  const count = countOf(group);
23
23
  return count > 0 ? [{ count, file: first.file, rule: first.rule }] : [];
24
24
  });
25
+ }
25
26
 
26
- const refusal = (id: string, index: RuleIndex): readonly string[] => {
27
+ function refusal(id: string, index: RuleIndex): readonly string[] {
27
28
  const level = levelOf(index, id);
28
29
  if (level === undefined) {
29
30
  return [`${id}: no built-in or local rule has this id.`];
30
31
  }
31
- return level === "error" ? [] : [`${id}: the rule is ${level}. Set it to error before baselining it.`];
32
- };
32
+ return [];
33
+ }
33
34
 
34
- export const adopt = (
35
+ export function adopt(
35
36
  existing: readonly BaselineEntry[] | undefined,
36
37
  rules: readonly string[],
37
38
  violations: readonly Violation[],
38
39
  index: RuleIndex,
39
- ): Adoption => {
40
+ ): Adoption {
40
41
  if (existing !== undefined && rules.length === 0) {
41
42
  return { _tag: "Refused", reasons: ["a baseline exists. Record a rule with --rule <id>, or drop fixed debt with prune."] };
42
43
  }
@@ -44,38 +45,41 @@ export const adopt = (
44
45
  if (reasons.length > 0) {
45
46
  return { _tag: "Refused", reasons };
46
47
  }
47
- const named = (rule: string): boolean => rules.some((name) => covers(name, rule));
48
+ function named(rule: string): boolean {
49
+ return rules.some((name) => covers(name, rule));
50
+ }
48
51
  const kept = (existing ?? []).filter((entry) => !named(entry.rule));
49
- const adopted = violations.filter((violation) => violation.level === "error" && (rules.length === 0 || named(violation.rule)));
52
+ const adopted = violations.filter((violation) => rules.length === 0 || named(violation.rule));
50
53
  const added = record(adopted);
51
54
  return { _tag: "Adopted", added: added.length, entries: [...kept, ...added], replaced: (existing ?? []).length - kept.length };
52
- };
55
+ }
53
56
 
54
57
  export interface Scope {
55
58
  readonly files?: ReadonlySet<string> | undefined;
56
59
  readonly moves: ReadonlyMap<string, string>;
57
60
  }
58
61
 
59
- const inScope = (entry: BaselineEntry, scope: Scope): boolean =>
60
- scope.files === undefined || scope.files.has(entry.file) || scope.moves.has(entry.file);
62
+ function inScope(entry: BaselineEntry, scope: Scope): boolean {
63
+ return scope.files === undefined || scope.files.has(entry.file) || scope.moves.has(entry.file);
64
+ }
61
65
 
62
- const destination = (
66
+ function destination(
63
67
  before: BaselineEntry,
64
68
  current: ReadonlyMap<string, BaselineEntry>,
65
69
  moves: ReadonlyMap<string, string>,
66
70
  taken: ReadonlySet<string>,
67
- ) => {
71
+ ) {
68
72
  const to = moves.get(before.file);
69
73
  const key = to === undefined ? undefined : keyOf(before.rule, to);
70
74
  return key === undefined || taken.has(key) ? undefined : current.get(key);
71
- };
75
+ }
72
76
 
73
- export const prune = (
77
+ export function prune(
74
78
  existing: readonly BaselineEntry[],
75
79
  violations: readonly Violation[],
76
80
  index: RuleIndex,
77
81
  scope: Scope = { moves: new Map() },
78
- ): Pruned => {
82
+ ): Pruned {
79
83
  const current = new Map(record(violations).map((entry) => [keyOf(entry.rule, entry.file), entry]));
80
84
  const taken = new Set(existing.map((entry) => keyOf(entry.rule, entry.file)));
81
85
  let moved = 0;
@@ -85,7 +89,7 @@ export const prune = (
85
89
  }
86
90
  const level = levelOf(index, before.rule);
87
91
  const now = current.get(keyOf(before.rule, before.file)) ?? destination(before, current, scope.moves, taken);
88
- if (now === undefined || level === undefined || level === "off") {
92
+ if (now === undefined || level === undefined) {
89
93
  return [];
90
94
  }
91
95
  moved += Number(now.file !== before.file);
@@ -97,4 +101,4 @@ export const prune = (
97
101
  moved,
98
102
  removed: existing.length - kept.length,
99
103
  };
100
- };
104
+ }
package/src/cli/args.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import { parseArgs } from "node:util";
2
2
  import { Result } from "effect";
3
- import type { WarningDetail } from "#report/render.ts";
4
3
  import { ADOPT_REMOVED, USAGE as COMMAND_USAGE } from "./messages.ts";
5
4
 
6
5
  export type Command =
7
- | { readonly _tag: "Lint"; readonly config: string | undefined; readonly warnings: WarningDetail }
6
+ | { readonly _tag: "Lint"; readonly config: string | undefined }
8
7
  | { readonly _tag: "ExceptionsMigrate"; readonly config: string | undefined; readonly from: string | undefined }
9
8
  | { readonly _tag: "Fix"; readonly config: string | undefined }
10
9
  | { readonly _tag: "BaselineWrite"; readonly config: string | undefined; readonly rules: readonly string[] }
@@ -28,10 +27,11 @@ const OPTIONS = {
28
27
  help: { short: "h", type: "boolean" },
29
28
  rule: { multiple: true, type: "string" },
30
29
  staged: { type: "boolean" },
31
- warnings: { type: "string" },
32
30
  } as const;
33
31
 
34
- const usage = (problem: string): Parsed => ({ _tag: "Usage", problem });
32
+ function usage(problem: string): Parsed {
33
+ return { _tag: "Usage", problem };
34
+ }
35
35
 
36
36
  const SUBCOMMANDS: Readonly<Record<string, string>> = {
37
37
  baseline: "baseline takes write, prune, tighten or migrate.",
@@ -39,13 +39,15 @@ const SUBCOMMANDS: Readonly<Record<string, string>> = {
39
39
  hooks: "hooks takes install, uninstall or pre-commit.",
40
40
  };
41
41
 
42
- const parsed = (command: Command): Parsed => ({ _tag: "Parsed", command });
42
+ function parsed(command: Command): Parsed {
43
+ return { _tag: "Parsed", command };
44
+ }
43
45
 
44
46
  type Values = ReturnType<typeof parseArgs<{ options: typeof OPTIONS; allowPositionals: true }>>["values"];
45
47
 
46
48
  type Option = Exclude<keyof Values, "config" | "help">;
47
49
 
48
- const COMMAND_OPTIONS: readonly Option[] = ["against", "force", "from", "rule", "staged", "warnings"];
50
+ const COMMAND_OPTIONS: readonly Option[] = ["against", "force", "from", "rule", "staged"];
49
51
 
50
52
  const ACCEPTS: Readonly<Record<string, readonly Option[]>> = {
51
53
  "baseline migrate": ["from"],
@@ -57,27 +59,24 @@ const ACCEPTS: Readonly<Record<string, readonly Option[]>> = {
57
59
  "hooks install": ["force"],
58
60
  "hooks pre-commit": [],
59
61
  "hooks uninstall": [],
60
- lint: ["warnings"],
62
+ lint: [],
61
63
  };
62
64
 
63
- const misplaced = (name: string, values: Values): string | undefined => {
65
+ function misplaced(name: string, values: Values): string | undefined {
64
66
  const option = COMMAND_OPTIONS.find((key) => values[key] !== undefined && !(ACCEPTS[name] ?? []).includes(key));
65
67
  const owners = Object.keys(ACCEPTS).filter((owner) => option !== undefined && (ACCEPTS[owner] ?? []).includes(option));
66
68
  return option === undefined ? undefined : `--${option} applies only to ${owners.join(" and ")}.`;
67
- };
69
+ }
68
70
 
69
- const ref = (against: string | undefined, command: Command): Parsed =>
70
- against?.startsWith("-") === true ? usage(`--against takes a git ref, not "${against}".`) : parsed(command);
71
+ function ref(against: string | undefined, command: Command): Parsed {
72
+ return against?.startsWith("-") === true ? usage(`--against takes a git ref, not "${against}".`) : parsed(command);
73
+ }
71
74
 
72
- const commandFor = (name: string, values: Values): Parsed => {
75
+ function commandFor(name: string, values: Values): Parsed {
73
76
  const config = values.config;
74
77
  switch (name) {
75
- case "lint": {
76
- const warnings = values.warnings ?? "summary";
77
- return warnings === "summary" || warnings === "all"
78
- ? parsed({ _tag: "Lint", config, warnings })
79
- : usage(`--warnings takes summary or all, not "${warnings}".`);
80
- }
78
+ case "lint":
79
+ return parsed({ _tag: "Lint", config });
81
80
  case "exceptions migrate":
82
81
  return parsed({ _tag: "ExceptionsMigrate", config, from: values.from });
83
82
  case "fix":
@@ -97,9 +96,9 @@ const commandFor = (name: string, values: Values): Parsed => {
97
96
  default:
98
97
  return parsed({ _tag: "BaselineMigrate", config, from: values.from });
99
98
  }
100
- };
99
+ }
101
100
 
102
- export const parseCommand = (args: readonly string[]): Parsed => {
101
+ export function parseCommand(args: readonly string[]): Parsed {
103
102
  const result = Result.try({
104
103
  catch: (error) => (error instanceof Error ? error.message : String(error)),
105
104
  try: () => parseArgs({ allowPositionals: true, args: [...args], options: OPTIONS, strict: true }),
@@ -122,4 +121,4 @@ export const parseCommand = (args: readonly string[]): Parsed => {
122
121
  }
123
122
  const problem = misplaced(name, values);
124
123
  return problem === undefined ? commandFor(name, values) : usage(problem);
125
- };
124
+ }
@@ -9,57 +9,58 @@ import { SetupFailure } from "#failure.ts";
9
9
  import { writeText } from "#inventory/filesystem.ts";
10
10
  import { plural } from "#report/plural.ts";
11
11
 
12
- const save = (session: Session, entries: readonly BaselineEntry[]): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> =>
13
- Effect.mapError(
12
+ function save(session: Session, entries: readonly BaselineEntry[]): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> {
13
+ return Effect.mapError(
14
14
  writeText(join(session.config.root, session.config.baseline), rewriteBaseline(session.baseline.raw, session.baseline.entries, entries)),
15
15
  (failure) => new SetupFailure({ message: failure.message }),
16
16
  );
17
+ }
17
18
 
18
- const unregistered = (session: Session) => applyRegistry(session.violations, session.registry, session.config).kept;
19
+ function unregistered(session: Session) {
20
+ return applyRegistry(session.violations, session.registry, session.config).kept;
21
+ }
19
22
 
20
- export const writeBaseline = (
23
+ export const writeBaseline = Effect.fn("Cli.writeBaseline")(function* (
21
24
  cwd: string,
22
25
  config: string | undefined,
23
26
  rules: readonly string[],
24
- ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> =>
25
- Effect.gen(function* () {
26
- const session = yield* openSession(cwd, config);
27
- const existing = session.baseline.raw === undefined ? undefined : session.baseline.entries;
28
- const adoption = adopt(existing, rules, unregistered(session), session.config);
29
- if (adoption._tag === "Refused") {
30
- return yield* new SetupFailure({ message: `baseline write refused:\n${adoption.reasons.map((reason) => ` - ${reason}`).join("\n")}` });
31
- }
32
- if (adoption.added === 0 && adoption.replaced === 0) {
33
- return yield* Console.log(`quality: no error-level violations to record; ${session.config.baseline} is unchanged.`);
34
- }
35
- yield* save(session, adoption.entries);
36
- const replaced = adoption.replaced > 0 ? `, replacing ${plural(adoption.replaced, "entry", "entries")}` : "";
37
- yield* Console.log(`quality: recorded ${plural(adoption.added, "entry", "entries")} in ${session.config.baseline}${replaced}.`);
38
- });
27
+ ): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
28
+ const session = yield* openSession(cwd, config);
29
+ const existing = session.baseline.raw === undefined ? undefined : session.baseline.entries;
30
+ const adoption = adopt(existing, rules, unregistered(session), session.config);
31
+ if (adoption._tag === "Refused") {
32
+ return yield* new SetupFailure({ message: `baseline write refused:\n${adoption.reasons.map((reason) => ` - ${reason}`).join("\n")}` });
33
+ }
34
+ if (adoption.added === 0 && adoption.replaced === 0) {
35
+ return yield* Console.log(`quality: no error-level violations to record; ${session.config.baseline} is unchanged.`);
36
+ }
37
+ yield* save(session, adoption.entries);
38
+ const replaced = adoption.replaced > 0 ? `, replacing ${plural(adoption.replaced, "entry", "entries")}` : "";
39
+ yield* Console.log(`quality: recorded ${plural(adoption.added, "entry", "entries")} in ${session.config.baseline}${replaced}.`);
40
+ });
39
41
 
40
- const changes = (pruned: Pruned): string => {
42
+ function changes(pruned: Pruned): string {
41
43
  const parts = [
42
44
  `removed ${plural(pruned.removed, "entry", "entries")}`,
43
45
  `lowered ${plural(pruned.lowered, "entry", "entries")}`,
44
46
  ...(pruned.moved > 0 ? [`carried ${plural(pruned.moved, "entry", "entries")} to moved files`] : []),
45
47
  ];
46
48
  return `${parts.slice(0, -1).join(", ")} and ${parts.at(-1)}`;
47
- };
49
+ }
48
50
 
49
- export const shrinkBaseline = <TRequirements>(
51
+ export const shrinkBaseline = Effect.fn("Cli.shrinkBaseline")(function* <TRequirements>(
50
52
  cwd: string,
51
53
  config: string | undefined,
52
54
  scopeOf: (session: Session) => Effect.Effect<Scope, SetupFailure, TRequirements>,
53
- ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | TRequirements> =>
54
- Effect.gen(function* () {
55
- const session = yield* openSession(cwd, config);
56
- if (session.baseline.raw === undefined) {
57
- return yield* Console.log(`quality: no baseline at ${session.config.baseline}; nothing to lower.`);
58
- }
59
- const pruned = prune(session.baseline.entries, unregistered(session), session.config, yield* scopeOf(session));
60
- if (pruned.removed === 0 && pruned.lowered === 0 && pruned.moved === 0) {
61
- return yield* Console.log(`quality: ${session.config.baseline} is current.`);
62
- }
63
- yield* save(session, pruned.entries);
64
- yield* Console.log(`quality: ${changes(pruned)} in ${session.config.baseline}.`);
65
- });
55
+ ): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem | TRequirements> {
56
+ const session = yield* openSession(cwd, config);
57
+ if (session.baseline.raw === undefined) {
58
+ return yield* Console.log(`quality: no baseline at ${session.config.baseline}; nothing to lower.`);
59
+ }
60
+ const pruned = prune(session.baseline.entries, unregistered(session), session.config, yield* scopeOf(session));
61
+ if (pruned.removed === 0 && pruned.lowered === 0 && pruned.moved === 0) {
62
+ return yield* Console.log(`quality: ${session.config.baseline} is current.`);
63
+ }
64
+ yield* save(session, pruned.entries);
65
+ yield* Console.log(`quality: ${changes(pruned)} in ${session.config.baseline}.`);
66
+ });
package/src/cli/fix.ts CHANGED
@@ -4,7 +4,7 @@ import { biomeReport, type Report } from "#biome/report.ts";
4
4
  import { loadConfig } from "#config/load.ts";
5
5
  import type { ExceptionDeclaration } from "#exceptions/declaration.ts";
6
6
  import { SetupFailure } from "#failure.ts";
7
- import { posix } from "#inventory/ignore-scope.ts";
7
+ import { posix } from "#inventory/ignoreScope.ts";
8
8
  import { walk } from "#inventory/walk.ts";
9
9
  import { sortManifests } from "#manifests/sorted.ts";
10
10
  import { plural } from "#report/plural.ts";
@@ -62,24 +62,22 @@ function biomePasses(root: string, exceptions: readonly ExceptionDeclaration[]):
62
62
  ];
63
63
  }
64
64
 
65
- function round<TFailure, TRequirements>(
65
+ const round = Effect.fn("Cli.round")(function* <TFailure, TRequirements>(
66
66
  passes: readonly Pass<TFailure, TRequirements>[],
67
67
  index: number,
68
68
  afterEachPass: Effect.Effect<void, TFailure, TRequirements>,
69
- ): Effect.Effect<number, TFailure, TRequirements> {
70
- return Effect.gen(function* () {
71
- let total = 0;
72
- const parts: string[] = [];
73
- for (const pass of passes) {
74
- const changed = yield* pass.run;
75
- total += changed;
76
- parts.push(`${plural(changed, "file")} ${pass.label}`);
77
- yield* afterEachPass;
78
- }
79
- yield* Console.log(`quality: Biome round ${index} rewrote ${parts.join(" and ")}.`);
80
- return total;
81
- });
82
- }
69
+ ): Effect.fn.Return<number, TFailure, TRequirements> {
70
+ let total = 0;
71
+ const parts: string[] = [];
72
+ for (const pass of passes) {
73
+ const changed = yield* pass.run;
74
+ total += changed;
75
+ parts.push(`${plural(changed, "file")} ${pass.label}`);
76
+ yield* afterEachPass;
77
+ }
78
+ yield* Console.log(`quality: Biome round ${index} rewrote ${parts.join(" and ")}.`);
79
+ return total;
80
+ });
83
81
 
84
82
  function changedBetween(before: ReadonlyMap<string, string>, after: ReadonlyMap<string, string>): readonly string[] {
85
83
  return [...new Set([...before.keys(), ...after.keys()])].filter((path) => before.get(path) !== after.get(path));
@@ -100,36 +98,35 @@ function unsettled(changed: ReadonlySet<string>): SetupFailure {
100
98
  });
101
99
  }
102
100
 
103
- export function settle<TFailure, TRequirements>({
101
+ export const settle = Effect.fn("Cli.settle")(function* <TFailure, TRequirements>({
104
102
  passes,
105
103
  snapshot,
106
- }: Settling<TFailure, TRequirements>): Effect.Effect<void, TFailure | SetupFailure, TRequirements> {
107
- return Effect.gen(function* () {
108
- for (let index = 1; index < MAX_FIX_ROUNDS; index += 1) {
109
- if ((yield* round(passes, index, Effect.void)) === 0) {
110
- return;
111
- }
112
- }
113
- const changed = new Set<string>();
114
- let previous = yield* snapshot;
115
- const record = Effect.map(snapshot, (current) => {
116
- for (const path of changedBetween(previous, current)) {
117
- changed.add(path);
118
- }
119
- previous = current;
120
- });
121
- if ((yield* round(passes, MAX_FIX_ROUNDS, record)) === 0) {
104
+ }: Settling<TFailure, TRequirements>): Effect.fn.Return<void, TFailure | SetupFailure, TRequirements> {
105
+ for (let index = 1; index < MAX_FIX_ROUNDS; index += 1) {
106
+ if ((yield* round(passes, index, Effect.void)) === 0) {
122
107
  return;
123
108
  }
124
- return yield* unsettled(changed);
109
+ }
110
+ const changed = new Set<string>();
111
+ let previous = yield* snapshot;
112
+ const record = Effect.map(snapshot, (current) => {
113
+ for (const path of changedBetween(previous, current)) {
114
+ changed.add(path);
115
+ }
116
+ previous = current;
125
117
  });
126
- }
118
+ if ((yield* round(passes, MAX_FIX_ROUNDS, record)) === 0) {
119
+ return;
120
+ }
121
+ return yield* unsettled(changed);
122
+ });
127
123
 
128
- export function fix(cwd: string, config: string | undefined): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> {
129
- return Effect.gen(function* () {
130
- const { root, exceptions } = yield* loadConfig(cwd, config);
131
- const sorted = yield* Effect.mapError(sortManifests(root), (failure) => new SetupFailure({ message: failure.message }));
132
- yield* Console.log(`quality: sort-package-json rewrote ${plural(sorted, "manifest")}.`);
133
- yield* settle({ passes: biomePasses(root, exceptions), snapshot: snapshotOf(root) });
134
- });
135
- }
124
+ export const fix = Effect.fn("Cli.fix")(function* (
125
+ cwd: string,
126
+ config: string | undefined,
127
+ ): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
128
+ const { root, exceptions } = yield* loadConfig(cwd, config);
129
+ const sorted = yield* Effect.mapError(sortManifests(root), (failure) => new SetupFailure({ message: failure.message }));
130
+ yield* Console.log(`quality: sort-package-json rewrote ${plural(sorted, "manifest")}.`);
131
+ yield* settle({ passes: biomePasses(root, exceptions), snapshot: snapshotOf(root) });
132
+ });
package/src/cli/lint.ts CHANGED
@@ -3,27 +3,23 @@ import { Console, Effect, type FileSystem } from "effect";
3
3
  import { evaluate, passes } from "#engine/evaluate.ts";
4
4
  import { openSession } from "#engine/session.ts";
5
5
  import { GateFailed, type SetupFailure } from "#failure.ts";
6
- import { render, type WarningDetail } from "#report/render.ts";
6
+ import { render } from "#report/render.ts";
7
7
 
8
- export const lint = (
8
+ export const lint = Effect.fn("Cli.lint")(function* (
9
9
  cwd: string,
10
10
  config: string | undefined,
11
- warnings: WarningDetail,
12
- ): Effect.Effect<void, SetupFailure | GateFailed, FileSystem.FileSystem> =>
13
- Effect.gen(function* () {
14
- const session = yield* openSession(cwd, config);
15
- const outcome = evaluate(session.violations, session.registry, session.baseline.entries, session.config);
16
- yield* Console.log(
17
- render(outcome, {
18
- baseline: session.config.baseline,
19
- checked: session.inventory.sources.length,
20
- descriptions: new Map(session.config.active.map((rule) => [rule.id, rule.description])),
21
- registry:
22
- session.config.exceptions.length === 0 ? session.config.registry : `${relative(session.config.root, session.config.file)} exceptions`,
23
- warnings,
24
- }),
25
- );
26
- if (!passes(outcome)) {
27
- return yield* new GateFailed();
28
- }
29
- });
11
+ ): Effect.fn.Return<void, SetupFailure | GateFailed, FileSystem.FileSystem> {
12
+ const session = yield* openSession(cwd, config);
13
+ const outcome = evaluate(session.violations, session.registry, session.baseline.entries, session.config);
14
+ yield* Console.log(
15
+ render(outcome, {
16
+ baseline: session.config.baseline,
17
+ checked: session.inventory.sources.length,
18
+ descriptions: new Map(session.config.active.map((rule) => [rule.id, rule.description])),
19
+ registry: session.config.exceptions.length === 0 ? session.config.registry : `${relative(session.config.root, session.config.file)} exceptions`,
20
+ }),
21
+ );
22
+ if (!passes(outcome)) {
23
+ return yield* new GateFailed();
24
+ }
25
+ });
@@ -1,5 +1,5 @@
1
1
  export const USAGE = `Usage:
2
- quality lint [--config <file>] [--warnings summary|all]
2
+ quality lint [--config <file>]
3
3
  quality fix [--config <file>]
4
4
  quality exceptions migrate [--config <file>] [--from <registry>]
5
5
  quality baseline write [--config <file>] [--rule <id>]...
@@ -11,7 +11,7 @@ export const USAGE = `Usage:
11
11
  quality hooks pre-commit [--config <file>]
12
12
 
13
13
  lint Run every rule. Exits 1 on an error-level violation, a file over its baseline, a stale registry entry
14
- or a baseline entry for a rule that is off or unknown.
14
+ or a baseline entry for an unknown rule.
15
15
  fix Sort every package.json, apply Biome's lint fixes, unsafe ones included, its assist actions and formatting, then format again.
16
16
  exceptions migrate Move legacy registry entries and Biome declarations into quality.config.ts exceptions and remove matching root overrides.
17
17
  baseline write Record current error-level violations. Creates the baseline, or records the named rules again, replacing their entries.
@@ -4,33 +4,32 @@ import { encodeBaseline } from "#baseline/format.ts";
4
4
  import { convertLegacy, decodeLegacyBaseline, LEGACY_BASELINE } from "#baseline/legacy.ts";
5
5
  import { loadConfig } from "#config/load.ts";
6
6
  import { validOrFail } from "#decoded.ts";
7
- import { readInput } from "#engine/baseline-file.ts";
7
+ import { readInput } from "#engine/baselineFile.ts";
8
8
  import { scan } from "#engine/session.ts";
9
9
  import { SetupFailure } from "#failure.ts";
10
10
  import { writeText } from "#inventory/filesystem.ts";
11
11
  import { plural } from "#report/plural.ts";
12
12
 
13
- export const migrateBaseline = (
13
+ export const migrateBaseline = Effect.fn("Cli.migrateBaseline")(function* (
14
14
  cwd: string,
15
15
  configPath: string | undefined,
16
16
  from: string | undefined,
17
- ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> =>
18
- Effect.gen(function* () {
19
- const config = yield* loadConfig(cwd, configPath);
20
- const source = from ?? LEGACY_BASELINE;
21
- if (source === config.baseline || (yield* readInput(config.root, config.baseline)) !== undefined) {
22
- return yield* new SetupFailure({ message: `${config.baseline} already exists. Migrate into a baseline file that does not exist yet.` });
23
- }
24
- const raw = yield* readInput(config.root, source);
25
- if (raw === undefined) {
26
- return yield* new SetupFailure({ message: `no baseline at ${source} to migrate. Name it with --from <file>.` });
27
- }
28
- const legacy = yield* validOrFail(source, yield* Effect.promise(() => decodeLegacyBaseline(raw)));
29
- const entries = convertLegacy(legacy, (yield* scan(config)).violations);
30
- const fs = yield* FileSystem.FileSystem;
31
- const written = Effect.andThen(writeText(join(config.root, config.baseline), encodeBaseline(entries)), fs.remove(join(config.root, source)));
32
- yield* Effect.mapError(written, (failure) => new SetupFailure({ message: failure.message }));
33
- const fixed = legacy.length - entries.length;
34
- const dropped = fixed > 0 ? `, dropping ${plural(fixed, "fixed entry", "fixed entries")}` : "";
35
- yield* Console.log(`quality: moved ${plural(entries.length, "entry", "entries")} from ${source} to ${config.baseline}${dropped}.`);
36
- });
17
+ ): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
18
+ const config = yield* loadConfig(cwd, configPath);
19
+ const source = from ?? LEGACY_BASELINE;
20
+ if (source === config.baseline || (yield* readInput(config.root, config.baseline)) !== undefined) {
21
+ return yield* new SetupFailure({ message: `${config.baseline} already exists. Migrate into a baseline file that does not exist yet.` });
22
+ }
23
+ const raw = yield* readInput(config.root, source);
24
+ if (raw === undefined) {
25
+ return yield* new SetupFailure({ message: `no baseline at ${source} to migrate. Name it with --from <file>.` });
26
+ }
27
+ const legacy = yield* validOrFail(source, yield* Effect.promise(() => decodeLegacyBaseline(raw)));
28
+ const entries = convertLegacy(legacy, (yield* scan(config)).violations);
29
+ const fs = yield* FileSystem.FileSystem;
30
+ const written = Effect.andThen(writeText(join(config.root, config.baseline), encodeBaseline(entries)), fs.remove(join(config.root, source)));
31
+ yield* Effect.mapError(written, (failure) => new SetupFailure({ message: failure.message }));
32
+ const fixed = legacy.length - entries.length;
33
+ const dropped = fixed > 0 ? `, dropping ${plural(fixed, "fixed entry", "fixed entries")}` : "";
34
+ yield* Console.log(`quality: moved ${plural(entries.length, "entry", "entries")} from ${source} to ${config.baseline}${dropped}.`);
35
+ });
@@ -2,7 +2,7 @@ import { join } from "node:path";
2
2
  import { Console, Effect, FileSystem } from "effect";
3
3
  import { loadConfig } from "#config/load.ts";
4
4
  import { validOrFail } from "#decoded.ts";
5
- import { readInput } from "#engine/baseline-file.ts";
5
+ import { readInput } from "#engine/baselineFile.ts";
6
6
  import { decodeExceptions, type ExceptionDeclaration } from "#exceptions/declaration.ts";
7
7
  import { migrateBiome } from "#exceptions/migrateBiome.ts";
8
8
  import { migrateConfig } from "#exceptions/migrateConfig.ts";
@@ -27,7 +27,7 @@ export const program = Effect.fn("Cli.program")(function* (args: readonly string
27
27
  case "Help":
28
28
  return yield* Console.log(USAGE);
29
29
  case "Lint":
30
- return yield* lint(cwd, command.config, command.warnings);
30
+ return yield* lint(cwd, command.config);
31
31
  case "Fix":
32
32
  return yield* fix(cwd, command.config);
33
33
  case "BaselineWrite":
@@ -30,9 +30,9 @@ export function exitCode(exit: Exit.Exit<unknown, unknown>): number {
30
30
  return Cause.hasInterruptsOnly(exit.cause) ? INTERRUPTED : exitCodeOf(Cause.squash(exit.cause));
31
31
  }
32
32
 
33
- const teardown: Runtime.Teardown = (exit, onExit) => {
33
+ function teardown(exit: Parameters<Runtime.Teardown>[0], onExit: Parameters<Runtime.Teardown>[1]): void {
34
34
  process.stdout.write("", () => process.stderr.write("", () => onExit(exitCode(exit))));
35
- };
35
+ }
36
36
 
37
37
  function isClosedPipe(error: unknown): boolean {
38
38
  return error instanceof Error && "code" in error && error.code === "EPIPE";
package/src/cli/shrink.ts CHANGED
@@ -6,8 +6,8 @@ import type { Git } from "#git/command.ts";
6
6
  import { changesSince } from "#git/history.ts";
7
7
  import { shrinkBaseline } from "./baseline.ts";
8
8
 
9
- const followedMoves = (root: string, against: string | undefined): Effect.Effect<Scope, SetupFailure, Git> =>
10
- resolveBase(root, against).pipe(
9
+ function followedMoves(root: string, against: string | undefined): Effect.Effect<Scope, SetupFailure, Git> {
10
+ return resolveBase(root, against).pipe(
11
11
  Effect.flatMap((base) => changesSince(root, [base.commit])),
12
12
  Effect.map((changes): Scope => ({ moves: changes.moves })),
13
13
  Effect.catchIf(
@@ -15,17 +15,20 @@ const followedMoves = (root: string, against: string | undefined): Effect.Effect
15
15
  (failure) => Effect.as(Console.error(`quality: moved files are not followed: ${failure.message}`), { moves: new Map() }),
16
16
  ),
17
17
  );
18
+ }
18
19
 
19
- export const pruneBaseline = (
20
+ export function pruneBaseline(
20
21
  cwd: string,
21
22
  config: string | undefined,
22
23
  against: string | undefined,
23
- ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> =>
24
- shrinkBaseline(cwd, config, (session) => followedMoves(session.config.root, against));
24
+ ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> {
25
+ return shrinkBaseline(cwd, config, (session) => followedMoves(session.config.root, against));
26
+ }
25
27
 
26
- export const tightenBaseline = (
28
+ export function tightenBaseline(
27
29
  cwd: string,
28
30
  config: string | undefined,
29
31
  staged: boolean,
30
- ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> =>
31
- shrinkBaseline(cwd, config, (session) => changesSince(session.config.root, staged ? ["--cached"] : ["HEAD"]));
32
+ ): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> {
33
+ return shrinkBaseline(cwd, config, (session) => changesSince(session.config.root, staged ? ["--cached"] : ["HEAD"]));
34
+ }
package/src/cli.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import process from "node:process";
3
3
  import { program } from "#cli/program.ts";
4
- import { runMain } from "#cli/run-main.ts";
4
+ import { runMain } from "#cli/runMain.ts";
5
5
 
6
6
  runMain(program(process.argv.slice(2), { cwd: process.cwd(), launch: { options: process.execArgv, script: process.argv[1] ?? "" } }));