@nielspeter/eess-ts 0.2.1 → 0.5.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 (467) hide show
  1. package/README.md +61 -35
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +75 -32
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +141 -55
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +385 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +182 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +177 -39
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +16 -19
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +243 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +109 -42
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +8 -3
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +111 -7
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +385 -47
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +47 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +101 -43
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +25 -32
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts +0 -8
  87. package/dist/cli/resolve-config.d.ts.map +1 -1
  88. package/dist/cli/resolve-config.js +25 -55
  89. package/dist/cli/resolve-config.js.map +1 -1
  90. package/dist/cli/rule-file-findings.d.ts +178 -0
  91. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  92. package/dist/cli/rule-file-findings.js +351 -0
  93. package/dist/cli/rule-file-findings.js.map +1 -0
  94. package/dist/cli/watch.d.ts +17 -34
  95. package/dist/cli/watch.d.ts.map +1 -1
  96. package/dist/cli/watch.js +14 -129
  97. package/dist/cli/watch.js.map +1 -1
  98. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  99. package/dist/conditions/body-analysis-function.js +16 -7
  100. package/dist/conditions/body-analysis-function.js.map +1 -1
  101. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  102. package/dist/conditions/body-analysis-module.js +14 -9
  103. package/dist/conditions/body-analysis-module.js.map +1 -1
  104. package/dist/conditions/body-analysis.d.ts.map +1 -1
  105. package/dist/conditions/body-analysis.js +16 -7
  106. package/dist/conditions/body-analysis.js.map +1 -1
  107. package/dist/conditions/call.d.ts.map +1 -1
  108. package/dist/conditions/call.js +41 -19
  109. package/dist/conditions/call.js.map +1 -1
  110. package/dist/conditions/catch-analysis.d.ts +2 -1
  111. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  112. package/dist/conditions/catch-analysis.js.map +1 -1
  113. package/dist/conditions/cross-layer.d.ts +2 -10
  114. package/dist/conditions/cross-layer.d.ts.map +1 -1
  115. package/dist/conditions/cross-layer.js +227 -23
  116. package/dist/conditions/cross-layer.js.map +1 -1
  117. package/dist/conditions/dependency.d.ts +35 -6
  118. package/dist/conditions/dependency.d.ts.map +1 -1
  119. package/dist/conditions/dependency.js +299 -45
  120. package/dist/conditions/dependency.js.map +1 -1
  121. package/dist/conditions/exports.d.ts.map +1 -1
  122. package/dist/conditions/exports.js +41 -37
  123. package/dist/conditions/exports.js.map +1 -1
  124. package/dist/conditions/function.d.ts.map +1 -1
  125. package/dist/conditions/function.js +19 -5
  126. package/dist/conditions/function.js.map +1 -1
  127. package/dist/conditions/helpers.d.ts +2 -1
  128. package/dist/conditions/helpers.d.ts.map +1 -1
  129. package/dist/conditions/helpers.js +4 -1
  130. package/dist/conditions/helpers.js.map +1 -1
  131. package/dist/conditions/jsx.d.ts.map +1 -1
  132. package/dist/conditions/jsx.js +7 -2
  133. package/dist/conditions/jsx.js.map +1 -1
  134. package/dist/conditions/match-identity.d.ts +43 -0
  135. package/dist/conditions/match-identity.d.ts.map +1 -0
  136. package/dist/conditions/match-identity.js +43 -0
  137. package/dist/conditions/match-identity.js.map +1 -0
  138. package/dist/conditions/members.d.ts.map +1 -1
  139. package/dist/conditions/members.js +20 -6
  140. package/dist/conditions/members.js.map +1 -1
  141. package/dist/conditions/reverse-dependency.d.ts +18 -5
  142. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  143. package/dist/conditions/reverse-dependency.js +155 -93
  144. package/dist/conditions/reverse-dependency.js.map +1 -1
  145. package/dist/conditions/slice.d.ts +86 -2
  146. package/dist/conditions/slice.d.ts.map +1 -1
  147. package/dist/conditions/slice.js +234 -53
  148. package/dist/conditions/slice.js.map +1 -1
  149. package/dist/conditions/structural.d.ts.map +1 -1
  150. package/dist/conditions/structural.js +16 -4
  151. package/dist/conditions/structural.js.map +1 -1
  152. package/dist/core/check-all.d.ts +19 -0
  153. package/dist/core/check-all.d.ts.map +1 -0
  154. package/dist/core/check-all.js +150 -0
  155. package/dist/core/check-all.js.map +1 -0
  156. package/dist/core/combinators.d.ts +48 -0
  157. package/dist/core/combinators.d.ts.map +1 -0
  158. package/dist/core/combinators.js +49 -0
  159. package/dist/core/combinators.js.map +1 -0
  160. package/dist/core/descendant-cache.d.ts +36 -0
  161. package/dist/core/descendant-cache.d.ts.map +1 -0
  162. package/dist/core/descendant-cache.js +117 -0
  163. package/dist/core/descendant-cache.js.map +1 -0
  164. package/dist/core/diagnose.d.ts +234 -0
  165. package/dist/core/diagnose.d.ts.map +1 -0
  166. package/dist/core/diagnose.js +390 -0
  167. package/dist/core/diagnose.js.map +1 -0
  168. package/dist/core/disk-set.d.ts +48 -0
  169. package/dist/core/disk-set.d.ts.map +1 -0
  170. package/dist/core/disk-set.js +218 -0
  171. package/dist/core/disk-set.js.map +1 -0
  172. package/dist/core/element-cache.d.ts +75 -0
  173. package/dist/core/element-cache.d.ts.map +1 -0
  174. package/dist/core/element-cache.js +32 -0
  175. package/dist/core/element-cache.js.map +1 -0
  176. package/dist/core/empty-project-advice.d.ts +75 -0
  177. package/dist/core/empty-project-advice.d.ts.map +1 -0
  178. package/dist/core/empty-project-advice.js +61 -0
  179. package/dist/core/empty-project-advice.js.map +1 -0
  180. package/dist/core/exclusion-comments.d.ts +19 -0
  181. package/dist/core/exclusion-comments.d.ts.map +1 -0
  182. package/dist/core/exclusion-comments.js +7 -0
  183. package/dist/core/exclusion-comments.js.map +1 -0
  184. package/dist/core/execute-rule.d.ts +158 -0
  185. package/dist/core/execute-rule.d.ts.map +1 -0
  186. package/dist/core/execute-rule.js +666 -0
  187. package/dist/core/execute-rule.js.map +1 -0
  188. package/dist/core/glob-diagnosis.d.ts +78 -0
  189. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  190. package/dist/core/glob-diagnosis.js +134 -0
  191. package/dist/core/glob-diagnosis.js.map +1 -0
  192. package/dist/core/glob-evaluator.d.ts +48 -0
  193. package/dist/core/glob-evaluator.d.ts.map +1 -0
  194. package/dist/core/glob-evaluator.js +89 -0
  195. package/dist/core/glob-evaluator.js.map +1 -0
  196. package/dist/core/import-candidates.d.ts +60 -0
  197. package/dist/core/import-candidates.d.ts.map +1 -0
  198. package/dist/core/import-candidates.js +93 -0
  199. package/dist/core/import-candidates.js.map +1 -0
  200. package/dist/core/import-options.d.ts +55 -2
  201. package/dist/core/import-options.d.ts.map +1 -1
  202. package/dist/core/import-options.js +64 -0
  203. package/dist/core/import-options.js.map +1 -1
  204. package/dist/core/invalidate-on-modify.d.ts +20 -0
  205. package/dist/core/invalidate-on-modify.d.ts.map +1 -0
  206. package/dist/core/invalidate-on-modify.js +26 -0
  207. package/dist/core/invalidate-on-modify.js.map +1 -0
  208. package/dist/core/line-index.d.ts +3 -0
  209. package/dist/core/line-index.d.ts.map +1 -0
  210. package/dist/core/line-index.js +227 -0
  211. package/dist/core/line-index.js.map +1 -0
  212. package/dist/core/metric-violation.d.ts +86 -0
  213. package/dist/core/metric-violation.d.ts.map +1 -0
  214. package/dist/core/metric-violation.js +132 -0
  215. package/dist/core/metric-violation.js.map +1 -0
  216. package/dist/core/module-edges.d.ts +361 -0
  217. package/dist/core/module-edges.d.ts.map +1 -0
  218. package/dist/core/module-edges.js +593 -0
  219. package/dist/core/module-edges.js.map +1 -0
  220. package/dist/core/object-literal-functions.d.ts +42 -0
  221. package/dist/core/object-literal-functions.d.ts.map +1 -0
  222. package/dist/core/object-literal-functions.js +75 -0
  223. package/dist/core/object-literal-functions.js.map +1 -0
  224. package/dist/core/orphan-exclusions.d.ts +44 -0
  225. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  226. package/dist/core/orphan-exclusions.js +224 -0
  227. package/dist/core/orphan-exclusions.js.map +1 -0
  228. package/dist/core/pair-condition.d.ts +32 -3
  229. package/dist/core/pair-condition.d.ts.map +1 -1
  230. package/dist/core/path-universe.d.ts +22 -0
  231. package/dist/core/path-universe.d.ts.map +1 -0
  232. package/dist/core/path-universe.js +45 -0
  233. package/dist/core/path-universe.js.map +1 -0
  234. package/dist/core/per-root-compiler-options.d.ts +20 -0
  235. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  236. package/dist/core/per-root-compiler-options.js +57 -0
  237. package/dist/core/per-root-compiler-options.js.map +1 -0
  238. package/dist/core/project-relative.d.ts +98 -0
  239. package/dist/core/project-relative.d.ts.map +1 -0
  240. package/dist/core/project-relative.js +185 -0
  241. package/dist/core/project-relative.js.map +1 -0
  242. package/dist/core/project.d.ts +7 -1
  243. package/dist/core/project.d.ts.map +1 -1
  244. package/dist/core/project.js +29 -4
  245. package/dist/core/project.js.map +1 -1
  246. package/dist/core/rule-builder.d.ts +303 -0
  247. package/dist/core/rule-builder.d.ts.map +1 -0
  248. package/dist/core/rule-builder.js +463 -0
  249. package/dist/core/rule-builder.js.map +1 -0
  250. package/dist/core/rule-declaration.d.ts +32 -0
  251. package/dist/core/rule-declaration.d.ts.map +1 -0
  252. package/dist/core/rule-declaration.js +88 -0
  253. package/dist/core/rule-declaration.js.map +1 -0
  254. package/dist/core/terminal-builder.d.ts +629 -0
  255. package/dist/core/terminal-builder.d.ts.map +1 -0
  256. package/dist/core/terminal-builder.js +807 -0
  257. package/dist/core/terminal-builder.js.map +1 -0
  258. package/dist/core/terminal-execution.d.ts +39 -0
  259. package/dist/core/terminal-execution.d.ts.map +1 -0
  260. package/dist/core/terminal-execution.js +103 -0
  261. package/dist/core/terminal-execution.js.map +1 -0
  262. package/dist/core/ts-comment-mask.d.ts +2 -0
  263. package/dist/core/ts-comment-mask.d.ts.map +1 -0
  264. package/dist/core/ts-comment-mask.js +102 -0
  265. package/dist/core/ts-comment-mask.js.map +1 -0
  266. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  267. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  268. package/dist/core/vacuity-diagnosis.js +415 -0
  269. package/dist/core/vacuity-diagnosis.js.map +1 -0
  270. package/dist/core/violation.d.ts +16 -11
  271. package/dist/core/violation.d.ts.map +1 -1
  272. package/dist/core/violation.js +33 -13
  273. package/dist/core/violation.js.map +1 -1
  274. package/dist/graphql/graphql-rule-builder.d.ts +95 -0
  275. package/dist/graphql/graphql-rule-builder.d.ts.map +1 -0
  276. package/dist/graphql/graphql-rule-builder.js +127 -0
  277. package/dist/graphql/graphql-rule-builder.js.map +1 -0
  278. package/dist/graphql/index.d.ts +1 -0
  279. package/dist/graphql/index.d.ts.map +1 -1
  280. package/dist/graphql/index.js +2 -1
  281. package/dist/graphql/index.js.map +1 -1
  282. package/dist/graphql/resolver-rule-builder.d.ts +44 -23
  283. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  284. package/dist/graphql/resolver-rule-builder.js +80 -72
  285. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  286. package/dist/graphql/schema-loader.d.ts +21 -0
  287. package/dist/graphql/schema-loader.d.ts.map +1 -1
  288. package/dist/graphql/schema-loader.js +82 -12
  289. package/dist/graphql/schema-loader.js.map +1 -1
  290. package/dist/graphql/schema-predicates.d.ts.map +1 -1
  291. package/dist/graphql/schema-predicates.js +17 -12
  292. package/dist/graphql/schema-predicates.js.map +1 -1
  293. package/dist/graphql/schema-rule-builder.d.ts +15 -24
  294. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  295. package/dist/graphql/schema-rule-builder.js +39 -77
  296. package/dist/graphql/schema-rule-builder.js.map +1 -1
  297. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  298. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  299. package/dist/helpers/baseline-diagnostics.js +168 -0
  300. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  301. package/dist/helpers/baseline-generator.d.ts +28 -0
  302. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  303. package/dist/helpers/baseline-generator.js +27 -0
  304. package/dist/helpers/baseline-generator.js.map +1 -0
  305. package/dist/helpers/baseline.d.ts +336 -0
  306. package/dist/helpers/baseline.d.ts.map +1 -0
  307. package/dist/helpers/baseline.js +664 -0
  308. package/dist/helpers/baseline.js.map +1 -0
  309. package/dist/helpers/body-traversal.d.ts +27 -2
  310. package/dist/helpers/body-traversal.d.ts.map +1 -1
  311. package/dist/helpers/body-traversal.js +135 -16
  312. package/dist/helpers/body-traversal.js.map +1 -1
  313. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  314. package/dist/helpers/callback-extractor.js +53 -84
  315. package/dist/helpers/callback-extractor.js.map +1 -1
  316. package/dist/helpers/complexity.d.ts +13 -5
  317. package/dist/helpers/complexity.d.ts.map +1 -1
  318. package/dist/helpers/complexity.js +15 -6
  319. package/dist/helpers/complexity.js.map +1 -1
  320. package/dist/helpers/diff-aware.d.ts +16 -0
  321. package/dist/helpers/diff-aware.d.ts.map +1 -0
  322. package/dist/helpers/diff-aware.js +16 -0
  323. package/dist/helpers/diff-aware.js.map +1 -0
  324. package/dist/helpers/matchers.d.ts +68 -7
  325. package/dist/helpers/matchers.d.ts.map +1 -1
  326. package/dist/helpers/matchers.js +164 -86
  327. package/dist/helpers/matchers.js.map +1 -1
  328. package/dist/helpers/slice-graph.d.ts +100 -8
  329. package/dist/helpers/slice-graph.d.ts.map +1 -1
  330. package/dist/helpers/slice-graph.js +126 -34
  331. package/dist/helpers/slice-graph.js.map +1 -1
  332. package/dist/helpers/tarjan.d.ts +0 -14
  333. package/dist/helpers/tarjan.d.ts.map +1 -1
  334. package/dist/helpers/tarjan.js +29 -16
  335. package/dist/helpers/tarjan.js.map +1 -1
  336. package/dist/index.d.ts +55 -19
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +67 -15
  339. package/dist/index.js.map +1 -1
  340. package/dist/models/arch-call.d.ts +3 -2
  341. package/dist/models/arch-call.d.ts.map +1 -1
  342. package/dist/models/arch-call.js.map +1 -1
  343. package/dist/models/arch-function.d.ts +54 -8
  344. package/dist/models/arch-function.d.ts.map +1 -1
  345. package/dist/models/arch-function.js +145 -8
  346. package/dist/models/arch-function.js.map +1 -1
  347. package/dist/models/arch-jsx-element.d.ts.map +1 -1
  348. package/dist/models/arch-jsx-element.js +18 -19
  349. package/dist/models/arch-jsx-element.js.map +1 -1
  350. package/dist/models/slice.d.ts +33 -9
  351. package/dist/models/slice.d.ts.map +1 -1
  352. package/dist/models/slice.js +129 -19
  353. package/dist/models/slice.js.map +1 -1
  354. package/dist/predicates/call.d.ts.map +1 -1
  355. package/dist/predicates/call.js +5 -0
  356. package/dist/predicates/call.js.map +1 -1
  357. package/dist/predicates/identity.d.ts +21 -0
  358. package/dist/predicates/identity.d.ts.map +1 -1
  359. package/dist/predicates/identity.js +75 -3
  360. package/dist/predicates/identity.js.map +1 -1
  361. package/dist/predicates/index.d.ts +1 -1
  362. package/dist/predicates/index.d.ts.map +1 -1
  363. package/dist/predicates/index.js +1 -1
  364. package/dist/predicates/index.js.map +1 -1
  365. package/dist/predicates/jsx.d.ts.map +1 -1
  366. package/dist/predicates/jsx.js +2 -1
  367. package/dist/predicates/jsx.js.map +1 -1
  368. package/dist/predicates/metrics.d.ts +4 -2
  369. package/dist/predicates/metrics.d.ts.map +1 -1
  370. package/dist/predicates/metrics.js +4 -2
  371. package/dist/predicates/metrics.js.map +1 -1
  372. package/dist/predicates/module.d.ts +4 -12
  373. package/dist/predicates/module.d.ts.map +1 -1
  374. package/dist/predicates/module.js +57 -37
  375. package/dist/predicates/module.js.map +1 -1
  376. package/dist/presets/agent-guardrails.d.ts +49 -16
  377. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  378. package/dist/presets/agent-guardrails.js +308 -19
  379. package/dist/presets/agent-guardrails.js.map +1 -1
  380. package/dist/presets/boundaries.d.ts +46 -3
  381. package/dist/presets/boundaries.d.ts.map +1 -1
  382. package/dist/presets/boundaries.js +132 -23
  383. package/dist/presets/boundaries.js.map +1 -1
  384. package/dist/presets/data-layer.d.ts +23 -3
  385. package/dist/presets/data-layer.d.ts.map +1 -1
  386. package/dist/presets/data-layer.js +58 -16
  387. package/dist/presets/data-layer.js.map +1 -1
  388. package/dist/presets/index.d.ts +10 -5
  389. package/dist/presets/index.d.ts.map +1 -1
  390. package/dist/presets/index.js +19 -3
  391. package/dist/presets/index.js.map +1 -1
  392. package/dist/presets/layered.d.ts +47 -3
  393. package/dist/presets/layered.d.ts.map +1 -1
  394. package/dist/presets/layered.js +66 -29
  395. package/dist/presets/layered.js.map +1 -1
  396. package/dist/presets/recommended.d.ts +81 -10
  397. package/dist/presets/recommended.d.ts.map +1 -1
  398. package/dist/presets/recommended.js +25 -23
  399. package/dist/presets/recommended.js.map +1 -1
  400. package/dist/presets/shared.d.ts +267 -2
  401. package/dist/presets/shared.d.ts.map +1 -1
  402. package/dist/presets/shared.js +367 -4
  403. package/dist/presets/shared.js.map +1 -1
  404. package/dist/rules/code-quality.d.ts.map +1 -1
  405. package/dist/rules/code-quality.js +15 -6
  406. package/dist/rules/code-quality.js.map +1 -1
  407. package/dist/rules/hygiene.d.ts +1 -1
  408. package/dist/rules/hygiene.js +1 -1
  409. package/dist/rules/metrics-function.d.ts +2 -1
  410. package/dist/rules/metrics-function.d.ts.map +1 -1
  411. package/dist/rules/metrics-function.js +63 -39
  412. package/dist/rules/metrics-function.js.map +1 -1
  413. package/dist/rules/metrics.d.ts +2 -1
  414. package/dist/rules/metrics.d.ts.map +1 -1
  415. package/dist/rules/metrics.js +80 -47
  416. package/dist/rules/metrics.js.map +1 -1
  417. package/dist/smells/clusters.d.ts +78 -0
  418. package/dist/smells/clusters.d.ts.map +1 -0
  419. package/dist/smells/clusters.js +124 -0
  420. package/dist/smells/clusters.js.map +1 -0
  421. package/dist/smells/duplicate-bodies.d.ts +92 -5
  422. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  423. package/dist/smells/duplicate-bodies.js +203 -73
  424. package/dist/smells/duplicate-bodies.js.map +1 -1
  425. package/dist/smells/duplicate-report.d.ts +90 -0
  426. package/dist/smells/duplicate-report.d.ts.map +1 -0
  427. package/dist/smells/duplicate-report.js +344 -0
  428. package/dist/smells/duplicate-report.js.map +1 -0
  429. package/dist/smells/fingerprint.d.ts +20 -1
  430. package/dist/smells/fingerprint.d.ts.map +1 -1
  431. package/dist/smells/fingerprint.js +27 -3
  432. package/dist/smells/fingerprint.js.map +1 -1
  433. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  434. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  435. package/dist/smells/inconsistent-siblings.js +288 -86
  436. package/dist/smells/inconsistent-siblings.js.map +1 -1
  437. package/dist/smells/sibling-files.d.ts +47 -0
  438. package/dist/smells/sibling-files.d.ts.map +1 -0
  439. package/dist/smells/sibling-files.js +104 -0
  440. package/dist/smells/sibling-files.js.map +1 -0
  441. package/dist/smells/similar-pairs.d.ts +28 -0
  442. package/dist/smells/similar-pairs.d.ts.map +1 -0
  443. package/dist/smells/similar-pairs.js +134 -0
  444. package/dist/smells/similar-pairs.js.map +1 -0
  445. package/dist/smells/smell-builder.d.ts +57 -12
  446. package/dist/smells/smell-builder.d.ts.map +1 -1
  447. package/dist/smells/smell-builder.js +112 -14
  448. package/dist/smells/smell-builder.js.map +1 -1
  449. package/dist/smells/variation.d.ts +47 -0
  450. package/dist/smells/variation.d.ts.map +1 -0
  451. package/dist/smells/variation.js +90 -0
  452. package/dist/smells/variation.js.map +1 -0
  453. package/dist/tsconfig/index.d.ts +19 -0
  454. package/dist/tsconfig/index.d.ts.map +1 -0
  455. package/dist/tsconfig/index.js +20 -0
  456. package/dist/tsconfig/index.js.map +1 -0
  457. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  458. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  459. package/dist/tsconfig/tsconfig-builder.js +65 -16
  460. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  461. package/package.json +4 -2
  462. package/dist/core/module-dependencies.d.ts +0 -28
  463. package/dist/core/module-dependencies.d.ts.map +0 -1
  464. package/dist/core/module-dependencies.js +0 -35
  465. package/dist/core/module-dependencies.js.map +0 -1
  466. package/dist/helpers/within.d.ts.map +0 -1
  467. package/dist/helpers/within.js.map +0 -1
@@ -1,75 +1,410 @@
1
- import { detectFormat, applyFixes } from '@nielspeter/eess';
2
- import { withBaseline } from '@nielspeter/eess';
3
- import { diffAware } from '@nielspeter/eess';
4
- import { ArchRuleError } from '@nielspeter/eess';
1
+ import { detectFormat } from '@nielspeter/eess';
2
+ import { applyFixes } from '@nielspeter/eess/internal';
3
+ import { withBaseline } from '../../helpers/baseline.js';
4
+ import { diffAware } from '../../helpers/diff-aware.js';
5
+ import { finishPreset, isArchRuleError } from '@nielspeter/eess';
6
+ import { isEmitterFinding } from '@nielspeter/eess/internal';
7
+ import { withCallerAggregating, violationsWritten, writeReport } from '../../core/execute-rule.js';
8
+ import { suppressionNotice } from '@nielspeter/eess/internal';
9
+ import { edgeCoverageNotice, resetEdgeCoverage, untestedRules } from '@nielspeter/eess/internal';
10
+ import { commentSuppressionNotice, resetCommentSuppression } from '@nielspeter/eess/internal';
11
+ import { writeStderr } from '@nielspeter/eess/internal';
5
12
  import { loadRuleFiles } from '../load-rules.js';
13
+ import { dedupeConfigFindings } from '@nielspeter/eess/internal';
14
+ import { attributeToRuleFile, baselineNotApplied, failureOrViolations, ruleFileContributedNoRules, ruleFileTruncated, } from '../rule-file-findings.js';
6
15
  /**
7
16
  * Run architecture rules from the specified rule files.
8
17
  *
9
- * Wraps existing programmatic APIs: withBaseline, diffAware, detectFormat.
18
+ * Unified pipeline (plan 0060): collect `.violations()` across every builder
19
+ * (each stamped with its severity), apply baseline/diff, report ONCE, and set
20
+ * the exit code from the error-severity count. Warns are reported but do not
21
+ * fail. A rule file that throws `ArchRuleError` on import (a bare self-executing
22
+ * preset call) is handled by a best-effort catch — error-severity only.
10
23
  */
11
24
  export async function runCheck(args) {
25
+ // Per run: the tally is module state (the `diff-disclosure` pattern), and a
26
+ // second `runCheck` in one process — the CLI's watch loop, or a test — must
27
+ // not inherit the first run's rules.
28
+ resetEdgeCoverage();
29
+ resetCommentSuppression();
12
30
  const started = Date.now();
13
31
  const format = args.format === 'auto' ? detectFormat() : args.format;
14
- const options = { format };
15
- if (args.baseline !== undefined) {
16
- options.baseline = withBaseline(args.baseline);
17
- }
18
- if (args.changed) {
19
- options.diff = diffAware(args.base);
20
- }
21
- const builders = await loadRuleFiles(args.ruleFiles, { fresh: args.fresh });
32
+ // `--fix` short-circuits the reporting pipeline: it renders what it changed
33
+ // (or would change) instead of the findings, and its exit code is the count
34
+ // of violations that have NO automatic fix — the real remaining failures.
35
+ // eess's own capability (plan 0066); upstream has no equivalent and plan
36
+ // 0165's engine copy dropped it. Restored in Phase 3.
22
37
  if (args.fix === true) {
23
- return runFix(builders, options, args.apply === true);
38
+ return await runFix(args.ruleFiles, { format }, args.apply === true, args.fresh);
24
39
  }
25
- let failures = 0;
26
- for (const builder of builders) {
40
+ // This command reports once, at the end, across every rule file. So a
41
+ // self-executing rule file's own terminals must not also write the findings that
42
+ // travel on their thrown error — see `withCallerAggregating`.
43
+ //
44
+ // A SCOPED extent, not a latch. It used to be a bare
45
+ // a bare flag-set that nothing ever reset, which was harmless
46
+ // while `executeCheck` was the only reader and stopped being harmless the moment
47
+ // presets and `checkAll()` read it too: a preset called directly after a
48
+ // `runCheck` in the same process went silent for the rest of that process.
49
+ return withCallerAggregating(async () => runCheckInner(args, format, started));
50
+ }
51
+ async function runCheckInner(args, format, started) {
52
+ const baseline = args.baseline !== undefined ? withBaseline(args.baseline) : undefined;
53
+ const diff = args.changed ? diffAware(args.base) : undefined;
54
+ let collected = [];
55
+ const total = args.ruleFiles.length;
56
+ // The denominator for the summary line below. Accumulated here rather than
57
+ // derived from `collected`, which counts violations and cannot distinguish
58
+ // "20 rules, none failing" from "no rules loaded" — the whole point of the line.
59
+ let ruleCount = 0;
60
+ let failedRules = 0;
61
+ for (const file of args.ruleFiles) {
62
+ // TWO catches, at the two boundaries that can fail independently. Loading is
63
+ // per file and can only be attributed to the file; evaluating is per builder,
64
+ // so a single malformed rule must not take its twenty siblings in the same
65
+ // file down with it — which one catch around the whole file would do
66
+ // (bug 0025).
67
+ let builders;
68
+ // Read before the module evaluates, so the delta below describes THIS file.
69
+ const writtenBefore = violationsWritten();
27
70
  try {
28
- builder.check(options);
71
+ builders = await loadRuleFiles([file], { fresh: args.fresh });
29
72
  }
30
73
  catch (error) {
31
- if (error instanceof ArchRuleError) {
32
- failures++;
74
+ // A user rule file that self-executes a throwing `.check()` at import
75
+ // surfaces its violations rather than crashing. (Presets no longer throw
76
+ // at import — they return builders.)
77
+ collected.push(...failureOrViolations(file, error, total));
78
+ // …and, for a thrown TERMINAL, say that the file stopped there — the part R3a
79
+ // specified and did not build (bug 0029). A throw during import aborts the
80
+ // module, so any rule declared after it never ran and its violations are not
81
+ // in this report, while the run is red for the thrown finding so nothing else
82
+ // reveals the gap.
83
+ //
84
+ // **Only for an `ArchRuleError`**, which is the signal that a terminal fired:
85
+ // rules before it DID run and report, rules after did not. For any other error
86
+ // — a syntax error, a missing dependency — nothing ran at all, and
87
+ // `ruleFileFailure` already says the file could not be evaluated. Adding
88
+ // "the rules after this never ran" there would imply some had, and point at a
89
+ // "finding above" that is an error rather than a finding. Three of bug 0025's
90
+ // own tests caught exactly that when this fired unconditionally.
91
+ //
92
+ // Only at THIS boundary either way. A throw from `builder.violations()` below
93
+ // happens after the module finished, so nothing was truncated, and the
94
+ // `export default [rule1, rule2]` shape never reaches here at all — an array
95
+ // export builds every rule before any of them runs.
96
+ if (isArchRuleError(error)) {
97
+ collected.push(ruleFileTruncated(file, total));
98
+ // Bug 0199 — the same boundary, the other consequence.
99
+ //
100
+ // `failureOrViolations` above DID collect this error's violations and
101
+ // `baseline.filterNew` below DOES filter them. What escaped is the rule
102
+ // file's OWN printing: `executeCheck` calls `writeReport` unconditionally
103
+ // one line before it throws (`core/execute-rule.ts`), so a `.check()`
104
+ // at module scope prints its findings before the CLI can filter anything.
105
+ // the aggregation flag does not stop it — that flag is read only by
106
+ // `executeWarn` (`:526`). Root cause is bug 0201.
107
+ //
108
+ // **Only when something was actually printed.** `executeWarn` throws the
109
+ // same error type, and when the CLI is aggregating it writes only the
110
+ // non-`bypassFilters` entries — for a configuration finding that is
111
+ // nothing at all. Firing on the bare `isArchRuleError` condition claimed a
112
+ // leak that did not happen, over a finding whose own text says a baseline
113
+ // can never suppress it: ADR-009 rule 2, a failure asserting a cause it
114
+ // cannot verify. Measured by review; `it('does not fire when the throw
115
+ // carried nothing the rule file could print')` holds it.
116
+ //
117
+ // **Only when output actually leaked**, measured rather than inferred.
118
+ //
119
+ // More than two paths reach this catch and they do not agree on whether
120
+ // they printed: a `.check()` (silent since bug 0201), a preset via the
121
+ // kernel's `reportViolations`, `checkAll()`, and a `.warn()` with a live
122
+ // selector. So the notice asks the only question it may assert — *did
123
+ // anything emit while this module was loading?* — by reading a delta over
124
+ // both emitters.
125
+ //
126
+ // **The first version inverted this and it was a measured defect.** It
127
+ // counted the writes `executeCheck` SUPPRESSED and read the absence of a
128
+ // suppression as "nothing leaked". A file that suppresses one terminal
129
+ // while leaking through another satisfies that and leaks: measured, a
130
+ // `report: 'warn'` preset beside a silenced `.check()` leaked 7 violation
131
+ // blocks in total silence. A silence built on a stale signal is worse than
132
+ // the false claim it replaced, because the run says nothing at all.
133
+ const leaked = violationsWritten() > writtenBefore;
134
+ const printedUnfiltered = error.violations.some((v) => v.bypassFilters !== true);
135
+ const filtering = args.baseline !== undefined || args.changed;
136
+ if (filtering && printedUnfiltered && leaked) {
137
+ collected.push(baselineNotApplied(file, { baseline: args.baseline, changed: args.changed }));
138
+ }
33
139
  }
34
- else {
35
- throw error;
140
+ failedRules++;
141
+ continue;
142
+ }
143
+ // A file that loaded cleanly and produced nothing is the alarm value the
144
+ // summary line exists to print — and `check` used to print `✓ … 0 rules` over
145
+ // it while `doctor` refused the same file. See `ruleFileContributedNoRules`.
146
+ if (builders.length === 0) {
147
+ collected.push(ruleFileContributedNoRules(file));
148
+ failedRules++;
149
+ }
150
+ ruleCount += builders.length;
151
+ for (const builder of builders) {
152
+ try {
153
+ // Attributed here, where the rule file is known. A builder cannot do it
154
+ // — the same builder is legal in a test file, where vitest supplies the
155
+ // frame instead (bug 0026).
156
+ // **The gate runs HERE, per builder, where the receipt and the rule file
157
+ // are both in hand.** Plan 0263 Phase 2, corrected after review.
158
+ //
159
+ // The first cut kept a parallel array of raw receipts, merged them after
160
+ // the loop and re-injected the emitter findings. Three defects followed
161
+ // from that one choice, all measured: the finding named no rule file
162
+ // (`file: ''`, at the one seam in this package that exists to attribute
163
+ // it — bug 0026); an `emitter/*` id arriving from INSIDE a member was
164
+ // reported twice, because the identity guard compared against
165
+ // `collected`, whose entries `attributeToRuleFile` had already copied;
166
+ // and `failedRules` was incremented twice for one builder, printing
167
+ // `2 of 1 rule failing`.
168
+ //
169
+ // Gating here is also strictly stronger than the run-wide merge, not
170
+ // weaker: `mergeCollectResults` reds once per run for the dead-member
171
+ // case, while this names every dead builder — three in one rule file are
172
+ // three findings, measured.
173
+ //
174
+ // **That last clause depends on the kernel and was false when written.**
175
+ // `dedupeConfigFindings` keys on `(file, id, element)`, and an emitter
176
+ // finding sets `element` to its own id and `file` to `''`, so all three
177
+ // collapsed into one whose note said they were "one edit". `keyFor` now
178
+ // returns no key for the emitter ids. If that guard goes, this sentence
179
+ // goes with it.
180
+ //
181
+ // It does not red an honest
182
+ // rule — one that examined zero already carries its own finding, so
183
+ // `withEvidenceGate` returns at its violations check, and a
184
+ // `.notExist()`-shaped rule over zero subjects is stamped
185
+ // `declaredEmpty`. Only a genuinely evidence-free builder is caught,
186
+ // which is the target.
187
+ //
188
+ // ADR-008: this command owns its reporting, so the gate runs under
189
+ // `report: 'return'`. Its findings carry `bypassFilters`, so the
190
+ // baseline and the diff filter keep them, and they are error-severity,
191
+ // so they set the exit code.
192
+ const found = attributeToRuleFile(finishPreset(builder.violations(), { report: 'return' }), file);
193
+ if (found.length > 0)
194
+ failedRules++;
195
+ collected.push(...found);
196
+ }
197
+ catch (error) {
198
+ failedRules++;
199
+ collected.push(...failureOrViolations(file, error, total));
36
200
  }
37
201
  }
38
202
  }
203
+ // One option, one finding (plan 0074) — after the per-file loop, because the
204
+ // key includes the rule file: two files with the same bad preset option are
205
+ // two edits and must both be reported.
206
+ collected = dedupeConfigFindings(collected);
207
+ let filtered = collected;
208
+ if (baseline)
209
+ filtered = baseline.filterNew(filtered);
210
+ // The one surface that can count. `filterToChanged` runs once here over every
211
+ // collected violation, so `before - after` is the whole run's suppression —
212
+ // unlike the per-rule terminals, which see one rule each (plan 0071,
213
+ // `core/diff-disclosure.ts`). Derived by subtraction rather than asked of the
214
+ // filter, so it holds for a caller-supplied `DiffFilterLike` too.
215
+ let notice;
216
+ if (diff) {
217
+ const before = filtered.length;
218
+ filtered = diff.filterToChanged(filtered);
219
+ notice = suppressionNotice(before - filtered.length, diff.size, diff.baseBranch);
220
+ if (notice !== undefined)
221
+ writeStderr(notice);
222
+ }
223
+ // writeReport handles empties: json always emits one document (so a clean run
224
+ // is still parseable), terminal/github emit nothing. The notice rides along as
225
+ // `summary.reason` so a `--format json` consumer reading only stdout still
226
+ // learns the report is partial — stderr and stdout are different streams, and
227
+ // an agent piping one of them would otherwise see `total: 0` and stop.
228
+ // `reason` is rendered as each violation's "Why:" line on the terminal path
229
+ // (`format.ts`: `v.because ?? reason`), so a RUN-level notice must not travel
230
+ // that way — it would appear as the justification for an unrelated finding.
231
+ // `summary.reason` in JSON is genuinely run-level, so it goes there, and
232
+ // stderr carries it for every other format. Found by sabotage: removing the
233
+ // `writeStderr` call left the tests green because the notice was reaching
234
+ // stderr through the "Why:" line instead.
235
+ writeReport(filtered, format, format === 'json' ? notice : undefined, untestedRules());
236
+ // Bug 0015, and it goes AFTER the report so it reads as a footnote rather than
237
+ // as part of the findings. JSON carries the same information structurally in
238
+ // `summary.untestedAllowlists`, so emitting the prose there too would duplicate
239
+ // it into a document a consumer parses.
240
+ if (format !== 'json') {
241
+ const coverage = edgeCoverageNotice();
242
+ if (coverage !== undefined)
243
+ writeStderr(`${coverage}\n`);
244
+ }
245
+ // Inline exclusion comments, same footnote position and the same reason. Kept
246
+ // out of the JSON prose for the same reason coverage is: a consumer parsing
247
+ // that document gets the identities structurally, not as a sentence to grep.
248
+ if (format !== 'json') {
249
+ const suppressed = commentSuppressionNotice();
250
+ if (suppressed !== undefined)
251
+ writeStderr(`${suppressed}\n`);
252
+ }
39
253
  // Report the denominator so a fast green is provably non-vacuous, not silence.
40
254
  // Terminal only — JSON/GitHub-annotation output on stdout stays machine-clean.
255
+ //
256
+ // Present on `main` and dropped by plan 0165's engine copy (`9489684`), which
257
+ // overwrote this file wholesale. Restored here rather than treated as the
258
+ // never-had-it gap bug 0174 filed it as: published `eess-ts@0.2.1` ships it,
259
+ // so its absence was a regression, and a green run that prints nothing cannot
260
+ // be told apart from a run that loaded no rules — the ADR-009/010 failure this
261
+ // package exists to prevent, arriving through its own CLI.
41
262
  if (format === 'terminal') {
42
263
  const ms = Date.now() - started;
43
- const time = ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(2)}s`;
44
- const rules = builders.length;
45
- const files = args.ruleFiles.length;
46
- const scope = `${rules} rule${rules === 1 ? '' : 's'} across ${files} file${files === 1 ? '' : 's'}`;
47
- process.stderr.write(failures === 0
48
- ? `\n✓ eess-ts — ${scope} · 0 failing (${time})\n`
49
- : `\n✗ eess-ts — ${failures} of ${scope} failing (${time})\n`);
50
- }
51
- return failures;
52
- }
53
- /** Collect a builder's violations without printing (prefers `.violations()`). */
54
- function collectViolations(builder, options) {
55
- if (typeof builder.violations === 'function')
56
- return builder.violations();
57
- try {
58
- builder.check(options);
59
- return [];
60
- }
61
- catch (error) {
62
- if (error instanceof ArchRuleError)
63
- return error.violations;
64
- throw error;
264
+ const time = ms < 1000 ? `${String(ms)}ms` : `${(ms / 1000).toFixed(2)}s`;
265
+ const scope = `${String(ruleCount)} rule${ruleCount === 1 ? '' : 's'} across ${String(total)} file${total === 1 ? '' : 's'}`;
266
+ // **The symbol is computed from exactly what the exit code is computed from**
267
+ // — the error-severity count after filtering. Two ways this line lied before,
268
+ // both measured on the documented on-ramp:
269
+ //
270
+ // - keyed on the RAW failure tally, a baseline that suppressed everything
271
+ // printed `✗ … · 0 violations` beside `exit 0`;
272
+ // - keyed on `filtered.length`, a warn-only run printed `✗` beside `exit 0`,
273
+ // because warnings are advisory and never fail (which the scaffold's own
274
+ // output tells the adopter).
275
+ //
276
+ // The symbol, the count and the exit code are three renderings of one fact.
277
+ // Warnings are disclosed alongside rather than folded in or dropped — a run
278
+ // with warnings is not failing, and is not the same as a silent one.
279
+ //
280
+ // `failedRules` is still counted because it answers a different question —
281
+ // how many RULES failed, versus how many violations there were — and a run
282
+ // where one rule produced forty is worth telling apart from forty rules
283
+ // producing one each.
284
+ const errors = filtered.filter((v) => (v.severity ?? 'error') === 'error').length;
285
+ const warns = filtered.length - errors;
286
+ const warnNote = warns === 0 ? '' : ` · ${String(warns)} warning${warns === 1 ? '' : 's'}`;
287
+ writeStderr(errors === 0
288
+ ? `\n✓ eess-ts — ${scope} · 0 failing${warnNote} (${time})\n`
289
+ : `\n✗ eess-ts — ${scope} · ${String(failedRules)} of ${String(ruleCount)} rule${ruleCount === 1 ? '' : 's'} failing · ${String(errors)} violation${errors === 1 ? '' : 's'}${warnNote} (${time})\n`);
65
290
  }
291
+ // Exit code = error-severity count; warns are reported but never fail.
292
+ return filtered.filter((v) => (v.severity ?? 'error') === 'error').length;
66
293
  }
67
294
  /**
68
295
  * Apply deterministic fixes (plan 0066). Dry-run unless `write`. Returns the
69
- * count of violations that have no automatic fix (the real remaining failures).
296
+ * count of violations that have no automatic fix.
297
+ *
298
+ * The remaining-count IS the exit code, deliberately: a run that fixed
299
+ * everything it could and still leaves real findings must not exit 0 just
300
+ * because it did some work. `applyFixes` skips overlapping edits rather than
301
+ * guessing, and says how many it skipped — a silently-dropped edit would leave
302
+ * the file half-repaired with a green run to match.
303
+ *
304
+ * **Clamped at 255, defensively.** `process.exitCode = 256` exits **0**
305
+ * (measured), so a count assigned straight to `process.exitCode` wraps. That
306
+ * cannot happen through today's wiring — `handleCheck` normalises this to `1`
307
+ * (`packages/ts/src/cli/index.ts`) and neither `runCheck` nor `runFix` is
308
+ * exported — so the clamp is defence for a future direct caller, not a hole
309
+ * being closed. An earlier version of this note claimed the fail-open was live
310
+ * at this door; two reviewers measured that it is not, and a comment that
311
+ * manufactures a fail-open is the mirror image of the sin this repo exists to
312
+ * catch.
313
+ *
314
+ * **Loads per rule file, like `runBaseline`** — plan 0263 Phase 2, third pass.
315
+ * It used to take a flat `RuleBuilderLike[]` that `runCheck` had already
316
+ * flattened, so the emitter finding printed as ` :0 …` with no path: bug
317
+ * 0026's seam, reopened at the one door the phase claimed had closed it. Six
318
+ * reviewers measured it independently. The file is in hand here for the same
319
+ * reason it is in `runCheck`, and for the same purpose.
70
320
  */
71
- function runFix(builders, options, write) {
72
- const all = builders.flatMap((b) => collectViolations(b, options));
321
+ async function runFix(ruleFiles, options, write, fresh) {
322
+ // **The gate runs here too** — plan 0263 Phase 2, after review. An earlier cut
323
+ // of this phase excused `--fix` from ADR-014's clause on the grounds that it
324
+ // "returns before any verdict". Measured, that was false: it calls
325
+ // `violations()` on every builder, so it reaches exactly the same verdict
326
+ // `runCheck` does, and a rule file exporting an evidence-free builder ran
327
+ // through `--fix` to `0 fix(es)` and exit 0.
328
+ // Three buckets, because they have three different consequences.
329
+ //
330
+ // `accepted` — violations from a builder whose receipt passed the gate. Their
331
+ // fixes are trustworthy and get applied.
332
+ // `refused` — emitter findings. The builder that produced them certified
333
+ // nothing, so every edit derived from THAT receipt is dropped.
334
+ // `noRules` — a rule file that loaded and contributed zero builders. There
335
+ // are no fixes to drop; it reds the run, as it already does under
336
+ // `check`.
337
+ const accepted = [];
338
+ const refused = [];
339
+ const noRules = [];
340
+ for (const file of ruleFiles) {
341
+ let builders;
342
+ try {
343
+ builders = await loadRuleFiles([file], { fresh });
344
+ }
345
+ catch (error) {
346
+ refused.push(...failureOrViolations(file, error, ruleFiles.length));
347
+ continue;
348
+ }
349
+ // Parity with `runCheckInner`, which has had this guard since bug 0025's
350
+ // sibling: a rule file that loads and exports `[]` enforces nothing.
351
+ // Measured before this was ported, `--fix` and `baseline` both exited 0 over
352
+ // exactly that file while `check` reddened — the "two commands in one CLI
353
+ // disagreeing about whether 'no rules' is an error" that
354
+ // `ruleFileContributedNoRules` exists to end, true again at two doors.
355
+ if (builders.length === 0) {
356
+ noRules.push(ruleFileContributedNoRules(file));
357
+ continue;
358
+ }
359
+ for (const builder of builders) {
360
+ try {
361
+ const gated = attributeToRuleFile(finishPreset(builder.violations(), { report: 'return' }), file);
362
+ // **Per builder, not per run.** ADR-014 §7's rule is that a door which
363
+ // can name the member never bundles, and this door loads per rule file
364
+ // precisely so it can. Refusing the whole run on one bad receipt bundles
365
+ // it back together: measured, a healthy rule's real fix was withheld
366
+ // because an unrelated rule in the same file had a dead glob.
367
+ //
368
+ // Scoped to the emitter's findings, not to `bypassFilters`. That flag
369
+ // marks every configuration finding — a dead selector, a stale
370
+ // exclusion — and those say the rule matched nothing, not that its
371
+ // verdict is unreadable. Refusing on them made `--fix --apply` a
372
+ // permanent no-op in any project with one mis-globbed preset option,
373
+ // which is a red that should be green shipped inside the change arguing
374
+ // fail-closed.
375
+ const emitterFindings = gated.filter((v) => isEmitterFinding(v));
376
+ if (emitterFindings.length > 0) {
377
+ refused.push(...emitterFindings);
378
+ continue;
379
+ }
380
+ accepted.push(...gated);
381
+ }
382
+ catch (error) {
383
+ refused.push(...failureOrViolations(file, error, ruleFiles.length));
384
+ }
385
+ }
386
+ }
387
+ // **Refuse BEFORE writing** — the whole point of gating this door. An earlier
388
+ // cut produced the finding and then let `applyFixes` run anyway: measured under
389
+ // `--apply`, a source file was rewritten while the same run printed
390
+ // `emitter/no-receipt` and exited 1. A fix is an edit derived from a verdict,
391
+ // so a refused verdict refuses the edits computed from it — the same principle
392
+ // `runBaseline` applies to a persisted one.
393
+ const blocked = [...refused, ...noRules];
394
+ if (blocked.length > 0) {
395
+ // Same wording as `runBaseline`'s header, and for the reason recorded there:
396
+ // "enforces nothing" is false of a builder that found real violations and
397
+ // merely handed back no evidence, and of a rule file that could not be
398
+ // evaluated at all.
399
+ writeStderr(`eess-ts check --fix: ${String(blocked.length)} finding(s) report a rule whose verdict ` +
400
+ `cannot be checked, so the fixes computed from it are not applied. Fix these first:\n`);
401
+ for (const v of blocked) {
402
+ const where = v.file === '' ? '' : `${v.file}: `;
403
+ writeStderr(` - ${where}${v.ruleId ?? v.rule}: ${v.message}\n`);
404
+ }
405
+ // The other builders' fixes still apply below — they were each verified.
406
+ }
407
+ const all = accepted;
73
408
  const fixable = all.filter((v) => v.fix !== undefined);
74
409
  const result = applyFixes(fixable, { write });
75
410
  const header = write
@@ -89,6 +424,9 @@ function runFix(builders, options, write) {
89
424
  for (const v of remaining)
90
425
  process.stdout.write(` ${v.file}:${v.line} ${v.message.split('\n')[0]}\n`);
91
426
  }
92
- return remaining.length;
427
+ // Blocked builders red the run whatever the fixable ones did.
428
+ if (blocked.length > 0)
429
+ return 1;
430
+ return Math.min(remaining.length, 255);
93
431
  }
94
432
  //# sourceMappingURL=check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ interface DoctorArgs {
2
+ ruleFiles: string[];
3
+ format: 'terminal' | 'json';
4
+ }
5
+ /**
6
+ * Report what each rule cannot enforce, without evaluating their conditions.
7
+ *
8
+ * It DOES materialize each rule's selection, as of plan 0096: "this rule examined
9
+ * nothing" is a fact about the selection, and the preview for 0098's floor has to
10
+ * read the same computation the floor will. The docstring used to say "without
11
+ * running any of them" and that stopped being true.
12
+ *
13
+ * **Supported and scoped** since plan 0077, which settled the keep-or-retire
14
+ * question 0069 left open. It diagnoses rule files the CLI can **load** — the
15
+ * `arch.rules.ts` shape `init` scaffolds, which `getting-started.md` calls the
16
+ * default path. Rules hosted in a vitest or jest file cannot be imported outside
17
+ * their runner; `diagnose()` is the answer there and reports the same findings.
18
+ *
19
+ * **Why the command earns its slot:** a **dead glob**. A rule whose selector can
20
+ * never match certifies nothing, and `check` never calls `diagnose()` — measured,
21
+ * `check` exits 0 with no output on such a rule while this reports it and exits
22
+ * 1. Until 0069's R3b turns that into a check-time failure, this and `diagnose()`
23
+ * are the only surfaces that see it.
24
+ *
25
+ * Not a build gate (0069): `check` is the gate.
26
+ */
27
+ export declare function runDoctor(args: DoctorArgs): Promise<number>;
28
+ export {};
29
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyIjE"}