@nielspeter/eess-ts 0.2.1 → 0.4.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 (433) 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 +73 -31
  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 +134 -30
  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 +393 -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 +181 -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 +173 -26
  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 +12 -3
  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 +242 -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 +105 -29
  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 +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  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 +241 -45
  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 +60 -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 +98 -33
  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 +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -24
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -1,40 +1,76 @@
1
1
  import picomatch from 'picomatch';
2
- import { getDependencyDecls, resolveDependencyPath, isTypeOnlyDependency, } from '../core/module-dependencies.js';
2
+ import { globAnyOf } from '@nielspeter/eess';
3
+ import { splitGlobArgs } from '../core/import-options.js';
4
+ import { candidatesFor } from '../core/import-candidates.js';
5
+ import { edgesOf, FORWARD_EDGE_KINDS } from '../core/module-edges.js';
6
+ import { rootOf } from '../core/project-relative.js';
3
7
  /**
4
- * Resolve the dependency paths for a source file — `import … from` plus
5
- * `export … from` re-exports (both are dependency edges) — optionally filtering
6
- * out type-only edges. Returns absolute paths for resolvable targets, raw
7
- * specifiers for external packages.
8
+ * Which edge kinds these predicates see.
9
+ *
10
+ * The **same set as the conditions** (`DEPENDENCY_KINDS` in
11
+ * `conditions/dependency.ts`), and it has to be: `notImportFrom` is one
12
+ * identifier with two definitions chosen by chain position, so a predicate that
13
+ * disagreed with its own condition about what an import is would be this plan's
14
+ * Problem statement inside one method name.
15
+ */
16
+ const PREDICATE_KINDS = FORWARD_EDGE_KINDS;
17
+ /**
18
+ * Every string a glob may be matched against, across every edge in the file.
19
+ *
20
+ * Flattened rather than grouped per edge: these predicates only ask "does ANY
21
+ * edge match", so which edge a candidate came from is not needed. See
22
+ * `candidatesFor` for why one edge can contribute two strings.
23
+ *
24
+ * **Two consumers, moving subjects in opposite directions** (plan 0071 §3), which
25
+ * is why widening this is in scope rather than an implementation detail:
26
+ *
27
+ * - `notImportFrom` is **anti-monotone** — a file with a matching re-export now
28
+ * fails the predicate and drops out of the selection, so rules select FEWER
29
+ * subjects and report FEWER findings. Losing findings is the one direction this
30
+ * release claims cannot happen, so it is asserted by identity.
31
+ * - `importFrom` is **monotone-increasing** — more files match, more subjects,
32
+ * more findings.
33
+ *
34
+ * The condition-layer measurement ("0 findings lost") cannot see either: this
35
+ * repo's own rules use `notImportFrom` in condition position 16 times and
36
+ * predicate position zero, so the corpus structurally cannot show the loss.
8
37
  */
9
- function getImportPaths(sourceFile, ignoreTypeImports = false) {
10
- return getDependencyDecls(sourceFile)
11
- .filter((decl) => (ignoreTypeImports ? !isTypeOnlyDependency(decl) : true))
12
- .map(resolveDependencyPath);
38
+ function importCandidatePaths(sourceFile, ignoreTypeImports = false) {
39
+ return (edgesOf(sourceFile)
40
+ .filter((edge) => {
41
+ if (!PREDICATE_KINDS[edge.kind])
42
+ return false;
43
+ if (!ignoreTypeImports)
44
+ return true;
45
+ return !edge.typeOnly;
46
+ })
47
+ // The importing file's root, so a project-relative import glob works here
48
+ // exactly as it does in the condition family (bugs 0037, 0036). Measured
49
+ // before this: `importFrom('src/domain/**')` selected 0 modules where the
50
+ // anchored spelling selected 5.
51
+ .flatMap((edge) => [...candidatesFor(edge.specifier, edge.resolvedPath, rootOf(sourceFile))]));
13
52
  }
14
53
  export function importFrom(...args) {
15
- // ADR-005: as casts required — TS cannot narrow tuple union rest params after Array.isArray
16
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — TS cannot narrow [string[], ImportOptions] | string[] to string[] from Array.isArray(args[0])
17
- const globs = Array.isArray(args[0]) ? args[0] : args;
18
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — args[1] is ImportOptions only in the [globs, options] overload
19
- const options = Array.isArray(args[0]) && args.length > 1 ? args[1] : undefined;
54
+ const { globs, options } = splitGlobArgs(args);
20
55
  const ignoreType = options?.ignoreTypeImports === true;
21
56
  const matchers = globs.map((g) => picomatch(g));
22
57
  return {
58
+ globs: globAnyOf(globs, 'import-target'),
23
59
  description: 'import from ' + globs.map((g) => `"${g}"`).join(', '),
24
- test: (sourceFile) => getImportPaths(sourceFile, ignoreType).some((p) => matchers.some((m) => m(p))),
60
+ test: (sourceFile) => importCandidatePaths(sourceFile, ignoreType).some((p) => matchers.some((m) => m(p))),
25
61
  };
26
62
  }
27
63
  export function notImportFrom(...args) {
28
- // ADR-005: as casts required — TS cannot narrow tuple union rest params after Array.isArray
29
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — TS cannot narrow [string[], ImportOptions] | string[] to string[] from Array.isArray(args[0])
30
- const globs = Array.isArray(args[0]) ? args[0] : args;
31
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — args[1] is ImportOptions only in the [globs, options] overload
32
- const options = Array.isArray(args[0]) && args.length > 1 ? args[1] : undefined;
64
+ const { globs, options } = splitGlobArgs(args);
33
65
  const ignoreType = options?.ignoreTypeImports === true;
34
66
  const matchers = globs.map((g) => picomatch(g));
35
67
  return {
68
+ // `import-target` is never checked against the path universe: an installed
69
+ // package resolves into node_modules, which is outside the project by
70
+ // construction, so checking it would fail every correct dependency rule.
71
+ globs: globAnyOf(globs, 'import-target'),
36
72
  description: 'not import from ' + globs.map((g) => `"${g}"`).join(', '),
37
- test: (sourceFile) => !getImportPaths(sourceFile, ignoreType).some((p) => matchers.some((m) => m(p))),
73
+ test: (sourceFile) => !importCandidatePaths(sourceFile, ignoreType).some((p) => matchers.some((m) => m(p))),
38
74
  };
39
75
  }
40
76
  /**
@@ -51,20 +87,4 @@ export function exportSymbolNamed(name) {
51
87
  test: (sourceFile) => sourceFile.getExportedDeclarations().has(name),
52
88
  };
53
89
  }
54
- /**
55
- * Matches modules whose file path matches the given glob.
56
- *
57
- * Similar to resideInFile but semantically clearer for modules —
58
- * "modules that have path matching" vs "elements that reside in file".
59
- *
60
- * @example
61
- * modules(p).that().havePathMatching('** /services/*.ts')
62
- */
63
- export function havePathMatching(glob) {
64
- const isMatch = picomatch(glob);
65
- return {
66
- description: `have path matching "${glob}"`,
67
- test: (sourceFile) => isMatch(sourceFile.getFilePath()),
68
- };
69
- }
70
90
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/predicates/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/predicates/module.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
1
2
  import type { ArchProject } from '../core/project.js';
2
- import type { ArchViolation } from '../core/violation.js';
3
+ import type { RuleBuilderLike } from '@nielspeter/eess';
3
4
  import type { PresetBaseOptions } from './shared.js';
4
- export interface AgentGuardrailsOptions extends PresetBaseOptions {
5
+ /**
6
+ * This preset's rule ids. The `no-inline-logic` arm is a **template literal**
7
+ * because those ids are built from the caller's own `noInlineLogic` entries, so
8
+ * the set is not closed. A typo in the API name is therefore still accepted by
9
+ * the type — the runtime finding is what covers that arm.
10
+ */
11
+ type AgentGuardrailsRuleId = `preset/agent/no-inline-logic/${string}` | 'preset/agent/no-generic-errors' | 'preset/agent/no-stubs' | 'preset/agent/no-empty-bodies' | 'preset/agent/no-copy-paste';
12
+ export interface AgentGuardrailsOptions extends PresetBaseOptions<AgentGuardrailsRuleId> {
5
13
  /** Glob for the source files the rules apply to. */
6
14
  src: string;
7
15
  /** Banned call names — one rule generated per entry (e.g. `['parseInt', 'eval']`). */
@@ -12,21 +20,20 @@ export interface AgentGuardrailsOptions extends PresetBaseOptions {
12
20
  noCopyPaste?: boolean;
13
21
  }
14
22
  /**
15
- * Preset targeting the mistakes AI coding agents make most often — inline
16
- * logic, generic errors, stub comments, empty bodies, copy-paste.
23
+ * `report` names a delivery mode; omitting it returns the un-executed builders.
17
24
  *
18
- * Returns `ArchViolation[]` (the eager ADR-008 form) and ends in `finishPreset`,
19
- * so an agent's rules file / harness can `agentGuardrails(p, { report: 'return',
20
- * format: 'json' })` and own emission of the error-severity violations. The
21
- * copy-paste rule defaults to **warn**: warns are reported to stderr but are
22
- * NOT aggregated into the returned array or the thrown error — override it to
23
- * `'error'` (`overrides: { 'preset/agent/no-copy-paste': 'error' }`) to include
24
- * it in the returned/JSON set. Each rule carries agent-facing `because` /
25
- * `suggestion` / `imperative` metadata so `explain --format agent` and the check
26
- * JSON give the agent an actionable fix.
25
+ * Overloaded so the common call keeps its exact type — a bare union would make
26
+ * every existing `.violations()` call site an error (26 test files, measured).
27
27
  *
28
- * Uses function-variant rules so standalone functions, arrow functions, and
29
- * class methods are all covered.
28
+ * **The reporting overload is declared FIRST, and that ordering is load-bearing.**
29
+ * `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
30
+ * type their options helper that way; with the builder overload last, that helper
31
+ * keeps the shape callers actually use. Overload resolution still picks the
32
+ * reporting one for a call that names `report`, because it is the first match.
30
33
  */
34
+ export declare function agentGuardrails(p: ArchProject, options: AgentGuardrailsOptions & {
35
+ report: 'builders';
36
+ }): RuleBuilderLike[];
31
37
  export declare function agentGuardrails(p: ArchProject, options: AgentGuardrailsOptions): ArchViolation[];
38
+ export {};
32
39
  //# sourceMappingURL=agent-guardrails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-guardrails.d.ts","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,aAAa,CAAA;AAGlE,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,GAAG,aAAa,EAAE,CA8EhG"}
1
+ {"version":3,"file":"agent-guardrails.d.ts","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AASrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD;;;;;GAKG;AACH,KAAK,qBAAqB,GACtB,gCAAgC,MAAM,EAAE,GACxC,gCAAgC,GAChC,uBAAuB,GACvB,8BAA8B,GAC9B,4BAA4B,CAAA;AAEhC,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB,CAAC,qBAAqB,CAAC;IACtF,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAwBD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,sBAAsB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACvD,eAAe,EAAE,CAAA;AACpB,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,GAAG,aAAa,EAAE,CAAA"}
@@ -3,32 +3,59 @@ import { call } from '../helpers/matchers.js';
3
3
  import { functionNoGenericErrors } from '../rules/errors.js';
4
4
  import { noStubComments, noEmptyBodies } from '../rules/hygiene.js';
5
5
  import { smells } from '../smells/index.js';
6
- import { dispatchRule, validateOverrides, finishPreset } from './shared.js';
6
+ import { overrideFindings, validateOverrides, declareEmptyIfListed, presetDeclarationSpelling, declaredEmptyFindings, assertEnabled, deliver, } from './shared.js';
7
7
  /**
8
8
  * Preset targeting the mistakes AI coding agents make most often — inline
9
9
  * logic, generic errors, stub comments, empty bodies, copy-paste.
10
10
  *
11
- * Returns `ArchViolation[]` (the eager ADR-008 form) and ends in `finishPreset`,
12
- * so an agent's rules file / harness can `agentGuardrails(p, { report: 'return',
13
- * format: 'json' })` and own emission of the error-severity violations. The
14
- * copy-paste rule defaults to **warn**: warns are reported to stderr but are
15
- * NOT aggregated into the returned array or the thrown error — override it to
16
- * `'error'` (`overrides: { 'preset/agent/no-copy-paste': 'error' }`) to include
17
- * it in the returned/JSON set. Each rule carries agent-facing `because` /
18
- * `suggestion` / `imperative` metadata so `explain --format agent` and the check
19
- * JSON give the agent an actionable fix.
11
+ * Returns severity-carrying builders (the returning form, plan 0060), so an
12
+ * agent's rules file does `export default [...agentGuardrails(p, { ... })]` and
13
+ * `eess-ts check --format json` surfaces every violation, including the
14
+ * copy-paste **warn**. Each rule carries agent-facing `because` / `suggestion` /
15
+ * `imperative` metadata so `explain --format agent` and the check JSON give the
16
+ * agent an actionable fix.
20
17
  *
21
18
  * Uses function-variant rules so standalone functions, arrow functions, and
22
19
  * class methods are all covered.
23
20
  */
21
+ // Presets collect object-literal functions unconditionally. `functions()`
22
+ // keeps it opt-in because widening a selector the USER wrote silently changes
23
+ // their rule; a preset's subject set is the preset's own, and this one already
24
+ // promises "standalone functions, arrow functions, and class methods are all
25
+ // covered". A handler map — the shape agents generate most — was none of the
26
+ // three, so `{ POST: () => {} }` slipped every guardrail (bug 0013).
27
+ const COLLECT_ALL = { includeObjectLiteralFunctions: true };
24
28
  export function agentGuardrails(p, options) {
25
- validateOverrides(options.overrides, collectRuleIds(options));
26
- const violations = [];
29
+ // Plan 0100's `attempted`: the ids the caller's OPTIONS ask for, before any
30
+ // override is consulted — every rule this preset can build sits behind an
31
+ // optional flag, so this can legitimately be `[]` (nothing was ever enabled).
32
+ // NOT what override validation uses below — see `knownOverrideIds`'s own doc.
33
+ const attempted = collectRuleIds(options);
34
+ const knownIds = knownOverrideIds(options);
35
+ validateOverrides(options.overrides, knownIds);
36
+ const overrideProblems = overrideFindings(options.overrides, knownIds);
37
+ const builders = [];
38
+ // Recorded HERE, at the one place a rule is actually built — the same argument
39
+ // `collectRule` makes for its `constructed` parameter ("the known-id list
40
+ // cannot answer this"). Deriving it instead from `collectRuleIds()` filtered by
41
+ // severity restates the construction conditionals a second time; the two agree
42
+ // today only because they are kept in step by hand, and the first rule added to
43
+ // one and not the other makes a declaration bind to a rule that was never built.
44
+ const constructed = [];
27
45
  const push = (builder, meta, def) => {
28
- violations.push(...dispatchRule(builder, meta, def, options.overrides));
46
+ const sev = lookup(options.overrides, meta.id) ?? def;
47
+ // Plan 0089's carrier, applied here as well as in `collectRule` — this
48
+ // preset builds through its own helper, and a carrier that reached only the
49
+ // shared path would cover the families someone remembered.
50
+ if (sev !== 'off') {
51
+ constructed.push(meta.id);
52
+ builders.push(declareEmptyIfListed(builder
53
+ .rule({ ...meta, declarationSpelling: presetDeclarationSpelling(meta.id) })
54
+ .asSeverity(sev), meta.id, options));
55
+ }
29
56
  };
30
57
  for (const api of options.noInlineLogic ?? []) {
31
- push(functions(p).that().resideInFile(options.src).should().notContain(call(api)), {
58
+ push(functions(p, COLLECT_ALL).that().resideInFile(options.src).should().notContain(call(api)), {
32
59
  id: `preset/agent/no-inline-logic/${api}`,
33
60
  because: `${api} inline in a function is logic that belongs behind a named helper`,
34
61
  suggestion: `extract the ${api} call into a named helper function`,
@@ -36,7 +63,11 @@ export function agentGuardrails(p, options) {
36
63
  }, 'error');
37
64
  }
38
65
  if (options.noGenericErrors) {
39
- push(functions(p).that().resideInFile(options.src).should().satisfy(functionNoGenericErrors()), {
66
+ push(functions(p, COLLECT_ALL)
67
+ .that()
68
+ .resideInFile(options.src)
69
+ .should()
70
+ .satisfy(functionNoGenericErrors()), {
40
71
  id: 'preset/agent/no-generic-errors',
41
72
  because: 'a generic Error loses the type/context callers need to handle it',
42
73
  suggestion: 'throw a domain-specific error (NotFoundError, ValidationError, …)',
@@ -44,7 +75,7 @@ export function agentGuardrails(p, options) {
44
75
  }, 'error');
45
76
  }
46
77
  if (options.noStubs) {
47
- push(functions(p).that().resideInFile(options.src).should().satisfy(noStubComments()), {
78
+ push(functions(p, COLLECT_ALL).that().resideInFile(options.src).should().satisfy(noStubComments()), {
48
79
  id: 'preset/agent/no-stubs',
49
80
  because: 'stub comments (TODO/FIXME/"not implemented") ship unfinished work',
50
81
  suggestion: 'implement the body or remove the stub before committing',
@@ -52,7 +83,7 @@ export function agentGuardrails(p, options) {
52
83
  }, 'error');
53
84
  }
54
85
  if (options.noEmptyBodies) {
55
- push(functions(p).that().resideInFile(options.src).should().satisfy(noEmptyBodies()), {
86
+ push(functions(p, COLLECT_ALL).that().resideInFile(options.src).should().satisfy(noEmptyBodies()), {
56
87
  id: 'preset/agent/no-empty-bodies',
57
88
  because: 'an empty function body is almost always an unfinished stub',
58
89
  suggestion: 'implement the body — every function must have at least one statement',
@@ -67,9 +98,83 @@ export function agentGuardrails(p, options) {
67
98
  imperative: 'Do NOT duplicate a function body — extract the shared logic',
68
99
  }, 'warn');
69
100
  }
70
- return finishPreset(violations, options);
101
+ // Unknown override keys FIRST: they say the configuration is wrong, which
102
+ // the reader needs before any finding produced under it (bug 0038).
103
+ // `constructed` is recorded at the `push` site above, not re-derived here.
104
+ const otherFindings = [
105
+ ...overrideProblems,
106
+ ...declaredEmptyFindings(options.expectEmpty, constructed),
107
+ ];
108
+ return deliver([
109
+ ...otherFindings,
110
+ // Plan 0100, LAST of the config-findings: only when nothing else above
111
+ // already explains the empty result (an unknown override key, an unbound
112
+ // `expectEmpty`) does "no rule was ever enabled" get to be the diagnosis.
113
+ ...assertEnabled(attempted, otherFindings, {
114
+ id: 'preset/agent/constructs-nothing',
115
+ presetName: 'agentGuardrails',
116
+ optionsHint: 'noInlineLogic, noGenericErrors, noStubs, noEmptyBodies, noCopyPaste',
117
+ }),
118
+ ...builders,
119
+ ], options);
71
120
  }
72
- /** All rule ids the given options would generate (for override validation). */
121
+ /**
122
+ * Widen the typed override map for a lookup by a runtime-built id.
123
+ *
124
+ * `no-inline-logic/${api}` ids are constructed from the caller's own options, so
125
+ * the key here is a `string` and the map is keyed by a literal union. The
126
+ * widening is confined to this one function rather than loosening the option
127
+ * type, which is what makes the typo a compile error for every other key.
128
+ */
129
+ function lookup(overrides, id) {
130
+ const widened = overrides;
131
+ return widened?.[id];
132
+ }
133
+ /**
134
+ * The four ids this preset can construct regardless of whether their flag is
135
+ * currently set — fixed, matching `AgentGuardrailsRuleId`'s own closed union
136
+ * members (everything but the open `no-inline-logic/${string}` arm).
137
+ */
138
+ const STATIC_RULE_IDS = [
139
+ 'preset/agent/no-generic-errors',
140
+ 'preset/agent/no-stubs',
141
+ 'preset/agent/no-empty-bodies',
142
+ 'preset/agent/no-copy-paste',
143
+ ];
144
+ /**
145
+ * Rule ids the given options WOULD generate if every flag were on — for
146
+ * override-key validation. Static ids are always known (a key for a rule not
147
+ * yet enabled is still a real rule, not a typo); `no-inline-logic/${api}` ids
148
+ * stay scoped to what `noInlineLogic` actually named, because that arm is open
149
+ * by construction and the only way to catch a typo in it is to compare against
150
+ * what the caller wrote.
151
+ *
152
+ * Deliberately NOT `attempted` below, which is flag-gated. Reusing `attempted`
153
+ * here was the bug plan 0100's review found: `overrides: { 'preset/agent/no-
154
+ * generic-errors': 'off' } }` with `noGenericErrors` unset reported "matches no
155
+ * rule in this preset" with an EMPTY enumeration — a real, correctly-spelled id
156
+ * misdiagnosed as unknown, and `otherFindings.length > 0` from that wrong
157
+ * finding then silently suppressed the correct `constructs-nothing` finding
158
+ * `assertEnabled` would otherwise have reported. `dataLayerIsolation` never had
159
+ * this bug: it already validates against the full static `RULE_IDS`, not its
160
+ * flag-gated `attempted`.
161
+ */
162
+ function knownOverrideIds(options) {
163
+ const ids = [...STATIC_RULE_IDS];
164
+ for (const api of options.noInlineLogic ?? [])
165
+ ids.push(`preset/agent/no-inline-logic/${api}`);
166
+ return ids;
167
+ }
168
+ /**
169
+ * Ids plan 0100's `attempted` needs: the ones the caller's OPTIONS actually
170
+ * ask for, flag-gated — `assertEnabled` fires when this is empty. NOT for
171
+ * override validation; see {@link knownOverrideIds}.
172
+ *
173
+ * Kept in step with the five `if (options.x)` blocks in `agentGuardrails`
174
+ * itself BY HAND — same shape of fragility this file already notes for
175
+ * `constructed` (review: nothing enforces the two stay copy-identical as
176
+ * flags are added).
177
+ */
73
178
  function collectRuleIds(options) {
74
179
  const ids = [];
75
180
  for (const api of options.noInlineLogic ?? [])
@@ -1 +1 @@
1
- {"version":3,"file":"agent-guardrails.js","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-guardrails.js","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
2
+ import type { ImportOptions } from '../core/import-options.js';
1
3
  import type { ArchProject } from '../core/project.js';
2
- import type { ArchViolation } from '../core/violation.js';
4
+ import type { RuleBuilderLike } from '@nielspeter/eess';
3
5
  import type { PresetBaseOptions } from './shared.js';
4
- export interface StrictBoundariesOptions extends PresetBaseOptions {
6
+ /** This preset's rule ids, derived from `RULE_IDS` so the two cannot drift. */
7
+ type StrictBoundariesRuleId = (typeof RULE_IDS)[number];
8
+ export interface StrictBoundariesOptions extends PresetBaseOptions<StrictBoundariesRuleId> {
5
9
  /** Glob pattern for boundary folders (e.g., 'src/features/*') */
6
10
  folders: string;
7
11
  /** Glob patterns for shared folders accessible by all boundaries */
@@ -10,10 +14,49 @@ export interface StrictBoundariesOptions extends PresetBaseOptions {
10
14
  isolateTests?: boolean;
11
15
  /** If true, warn on copy-pasted function bodies across boundaries */
12
16
  noCopyPaste?: boolean;
17
+ /**
18
+ * This project's answer to "is a type-only edge a dependency?", applied to
19
+ * every rule this preset constructs **whose condition takes one** — plan 0089:
20
+ * `no-cycles`, `no-cross-boundary`, `shared-isolation`, `test-isolation`.
21
+ * `no-duplicate-bodies` is excluded because it compares function bodies, not imports.
22
+ *
23
+ * The conditions disagree by default, deliberately: `beFreeOfCycles` ignores
24
+ * type-only imports because it asks whether the module is *evaluated*, and an
25
+ * erased import cannot contribute to an initialization cycle; the layer and
26
+ * boundary conditions count them because they ask whether the code is
27
+ * *coupled*. Holding a builder, that distinction is visible and you choose per
28
+ * condition. Through a preset it is invisible, and this option exists because
29
+ * a preset user could not align them even when their project wanted them
30
+ * aligned.
31
+ *
32
+ * So passing it moves exactly one side, and which side depends on the value:
33
+ * `{ ignoreTypeImports: true }` stops the layer rules counting type coupling
34
+ * (the cycle rule already ignored it); `{ ignoreTypeImports: false }` makes
35
+ * the cycle rule count type edges (the layer rules already did). `docs/presets.md`
36
+ * carries that table.
37
+ */
38
+ importOptions?: ImportOptions;
13
39
  }
40
+ declare const RULE_IDS: readonly ["preset/boundaries/shared-discovery", "preset/boundaries/no-cycles", "preset/boundaries/no-cross-boundary", "preset/boundaries/shared-isolation", "preset/boundaries/test-isolation", "preset/boundaries/no-duplicate-bodies"];
14
41
  /**
15
42
  * Enforce strict module boundaries: no cycles, no cross-boundary imports,
16
43
  * shared isolation, and optional copy-paste detection.
17
44
  */
45
+ /**
46
+ * `report` names a delivery mode; omitting it returns the un-executed builders.
47
+ *
48
+ * Overloaded so the common call keeps its exact type — a bare union would make
49
+ * every existing `.violations()` call site an error (26 test files, measured).
50
+ *
51
+ * **The reporting overload is declared FIRST, and that ordering is load-bearing.**
52
+ * `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
53
+ * type their options helper that way; with the builder overload last, that helper
54
+ * keeps the shape callers actually use. Overload resolution still picks the
55
+ * reporting one for a call that names `report`, because it is the first match.
56
+ */
57
+ export declare function strictBoundaries(p: ArchProject, options: StrictBoundariesOptions & {
58
+ report: 'builders';
59
+ }): RuleBuilderLike[];
18
60
  export declare function strictBoundaries(p: ArchProject, options: StrictBoundariesOptions): ArchViolation[];
61
+ export {};
19
62
  //# sourceMappingURL=boundaries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAgED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,uBAAuB,GAC/B,aAAa,EAAE,CA8EjB"}
1
+ {"version":3,"file":"boundaries.d.ts","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAWpD,+EAA+E;AAC/E,KAAK,sBAAsB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvD,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB,CAAC,sBAAsB,CAAC;IACxF,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,QAAA,MAAM,QAAQ,0OAOJ,CAAA;AAmFV;;;GAGG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,uBAAuB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACxD,eAAe,EAAE,CAAA;AACpB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,GAAG,aAAa,EAAE,CAAA"}