@ontrails/warden 1.0.0-beta.14 → 1.0.0-beta.16

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 (351) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/README.md +77 -34
  3. package/bin/warden.ts +22 -0
  4. package/package.json +26 -6
  5. package/src/ast.ts +28 -0
  6. package/src/cli.ts +1169 -116
  7. package/src/command.ts +927 -0
  8. package/src/config.ts +184 -0
  9. package/src/drift.ts +76 -34
  10. package/src/formatters.ts +54 -7
  11. package/src/guide.ts +234 -0
  12. package/src/index.ts +151 -38
  13. package/src/project-context.ts +163 -0
  14. package/src/resolve.ts +530 -0
  15. package/src/rules/activation-orphan.ts +97 -0
  16. package/src/rules/ast.ts +2884 -124
  17. package/src/rules/circular-refs.ts +154 -0
  18. package/src/rules/{context-no-trailhead-types.ts → context-no-surface-types.ts} +72 -12
  19. package/src/rules/contour-exists.ts +251 -0
  20. package/src/rules/contour-ids.ts +15 -0
  21. package/src/rules/cross-declarations.ts +277 -69
  22. package/src/rules/dead-internal-trail.ts +141 -0
  23. package/src/rules/draft-file-marking.ts +51 -3
  24. package/src/rules/draft-visible-debt.ts +40 -15
  25. package/src/rules/error-mapping-completeness.ts +288 -0
  26. package/src/rules/example-valid.ts +401 -0
  27. package/src/rules/fires-declarations.ts +758 -0
  28. package/src/rules/implementation-returns-result.ts +1042 -122
  29. package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
  30. package/src/rules/incomplete-crud.ts +580 -0
  31. package/src/rules/index.ts +156 -19
  32. package/src/rules/intent-propagation.ts +127 -0
  33. package/src/rules/layer-field-name-drift.ts +96 -0
  34. package/src/rules/metadata.ts +508 -0
  35. package/src/rules/missing-reconcile.ts +98 -0
  36. package/src/rules/missing-visibility.ts +110 -0
  37. package/src/rules/no-dev-permit-in-source.ts +99 -0
  38. package/src/rules/no-direct-implementation-call.ts +1 -1
  39. package/src/rules/no-legacy-layer-imports.ts +193 -0
  40. package/src/rules/no-native-error-result.ts +111 -0
  41. package/src/rules/no-sync-result-assumption.ts +1131 -96
  42. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  43. package/src/rules/no-throw-in-implementation.ts +6 -4
  44. package/src/rules/on-references-exist.ts +194 -0
  45. package/src/rules/orphaned-signal.ts +150 -0
  46. package/src/rules/owner-projection-parity.ts +146 -0
  47. package/src/rules/permit-governance.ts +25 -0
  48. package/src/rules/public-internal-deep-imports.ts +517 -0
  49. package/src/rules/public-output-schema.ts +29 -0
  50. package/src/rules/public-union-output-discriminants.ts +150 -0
  51. package/src/rules/read-intent-fires.ts +187 -0
  52. package/src/rules/reference-exists.ts +98 -0
  53. package/src/rules/registry-names.ts +113 -0
  54. package/src/rules/resolved-import-boundary.ts +146 -0
  55. package/src/rules/{provision-declarations.ts → resource-declarations.ts} +208 -138
  56. package/src/rules/{provision-exists.ts → resource-exists.ts} +46 -51
  57. package/src/rules/resource-id-grammar.ts +65 -0
  58. package/src/rules/scan.ts +0 -26
  59. package/src/rules/scheduled-destroy-intent.ts +44 -0
  60. package/src/rules/signal-graph-coaching.ts +191 -0
  61. package/src/rules/specs.ts +5 -1
  62. package/src/rules/static-resource-accessor-preference.ts +657 -0
  63. package/src/rules/types.ts +187 -7
  64. package/src/rules/unmaterialized-activation-source.ts +84 -0
  65. package/src/rules/unreachable-detour-shadowing.ts +344 -0
  66. package/src/rules/valid-describe-refs.ts +160 -32
  67. package/src/rules/valid-detour-contract.ts +78 -0
  68. package/src/rules/warden-export-symmetry.ts +533 -0
  69. package/src/rules/warden-rules-use-ast.ts +996 -0
  70. package/src/rules/webhook-route-collision.ts +243 -0
  71. package/src/trails/activation-orphan.trail.ts +81 -0
  72. package/src/trails/circular-refs.trail.ts +29 -0
  73. package/src/trails/{context-no-trailhead-types.trail.ts → context-no-surface-types.trail.ts} +4 -4
  74. package/src/trails/contour-exists.trail.ts +21 -0
  75. package/src/trails/dead-internal-trail.trail.ts +26 -0
  76. package/src/trails/draft-file-marking.trail.ts +16 -0
  77. package/src/trails/draft-visible-debt.trail.ts +16 -0
  78. package/src/trails/error-mapping-completeness.trail.ts +29 -0
  79. package/src/trails/example-valid.trail.ts +25 -0
  80. package/src/trails/fires-declarations.trail.ts +23 -0
  81. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  82. package/src/trails/incomplete-crud.trail.ts +39 -0
  83. package/src/trails/index.ts +56 -8
  84. package/src/trails/intent-propagation.trail.ts +30 -0
  85. package/src/trails/layer-field-name-drift.trail.ts +39 -0
  86. package/src/trails/missing-reconcile.trail.ts +33 -0
  87. package/src/trails/missing-visibility.trail.ts +22 -0
  88. package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
  89. package/src/trails/no-legacy-layer-imports.trail.ts +35 -0
  90. package/src/trails/no-native-error-result.trail.ts +18 -0
  91. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  92. package/src/trails/on-references-exist.trail.ts +21 -0
  93. package/src/trails/orphaned-signal.trail.ts +36 -0
  94. package/src/trails/owner-projection-parity.trail.ts +26 -0
  95. package/src/trails/permit-governance.trail.ts +51 -0
  96. package/src/trails/public-internal-deep-imports.trail.ts +94 -0
  97. package/src/trails/public-output-schema.trail.ts +55 -0
  98. package/src/trails/public-union-output-discriminants.trail.ts +33 -0
  99. package/src/trails/read-intent-fires.trail.ts +20 -0
  100. package/src/trails/reference-exists.trail.ts +25 -0
  101. package/src/trails/resolved-import-boundary.trail.ts +109 -0
  102. package/src/trails/{provision-declarations.trail.ts → resource-declarations.trail.ts} +6 -6
  103. package/src/trails/{provision-exists.trail.ts → resource-exists.trail.ts} +7 -7
  104. package/src/trails/resource-id-grammar.trail.ts +39 -0
  105. package/src/trails/run.ts +133 -24
  106. package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
  107. package/src/trails/schema.ts +122 -4
  108. package/src/trails/signal-graph-coaching.trail.ts +74 -0
  109. package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
  110. package/src/trails/unmaterialized-activation-source.trail.ts +69 -0
  111. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  112. package/src/trails/valid-detour-contract.trail.ts +71 -0
  113. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  114. package/src/trails/warden-rules-use-ast.trail.ts +45 -0
  115. package/src/trails/webhook-route-collision.trail.ts +50 -0
  116. package/src/trails/wrap-rule.ts +133 -14
  117. package/src/workspaces.ts +238 -0
  118. package/.turbo/turbo-build.log +0 -1
  119. package/.turbo/turbo-lint.log +0 -3
  120. package/.turbo/turbo-typecheck.log +0 -1
  121. package/dist/cli.d.ts +0 -46
  122. package/dist/cli.d.ts.map +0 -1
  123. package/dist/cli.js +0 -247
  124. package/dist/cli.js.map +0 -1
  125. package/dist/draft.d.ts +0 -5
  126. package/dist/draft.d.ts.map +0 -1
  127. package/dist/draft.js +0 -16
  128. package/dist/draft.js.map +0 -1
  129. package/dist/drift.d.ts +0 -29
  130. package/dist/drift.d.ts.map +0 -1
  131. package/dist/drift.js +0 -61
  132. package/dist/drift.js.map +0 -1
  133. package/dist/formatters.d.ts +0 -30
  134. package/dist/formatters.d.ts.map +0 -1
  135. package/dist/formatters.js +0 -98
  136. package/dist/formatters.js.map +0 -1
  137. package/dist/index.d.ts +0 -37
  138. package/dist/index.d.ts.map +0 -1
  139. package/dist/index.js +0 -38
  140. package/dist/index.js.map +0 -1
  141. package/dist/rules/ast.d.ts +0 -82
  142. package/dist/rules/ast.d.ts.map +0 -1
  143. package/dist/rules/ast.js +0 -363
  144. package/dist/rules/ast.js.map +0 -1
  145. package/dist/rules/context-no-surface-types.d.ts +0 -12
  146. package/dist/rules/context-no-surface-types.d.ts.map +0 -1
  147. package/dist/rules/context-no-surface-types.js +0 -96
  148. package/dist/rules/context-no-surface-types.js.map +0 -1
  149. package/dist/rules/context-no-trailhead-types.d.ts +0 -12
  150. package/dist/rules/context-no-trailhead-types.d.ts.map +0 -1
  151. package/dist/rules/context-no-trailhead-types.js +0 -96
  152. package/dist/rules/context-no-trailhead-types.js.map +0 -1
  153. package/dist/rules/cross-declarations.d.ts +0 -13
  154. package/dist/rules/cross-declarations.d.ts.map +0 -1
  155. package/dist/rules/cross-declarations.js +0 -264
  156. package/dist/rules/cross-declarations.js.map +0 -1
  157. package/dist/rules/draft-file-marking.d.ts +0 -6
  158. package/dist/rules/draft-file-marking.d.ts.map +0 -1
  159. package/dist/rules/draft-file-marking.js +0 -65
  160. package/dist/rules/draft-file-marking.js.map +0 -1
  161. package/dist/rules/draft-visible-debt.d.ts +0 -12
  162. package/dist/rules/draft-visible-debt.d.ts.map +0 -1
  163. package/dist/rules/draft-visible-debt.js +0 -45
  164. package/dist/rules/draft-visible-debt.js.map +0 -1
  165. package/dist/rules/follow-declarations.d.ts +0 -13
  166. package/dist/rules/follow-declarations.d.ts.map +0 -1
  167. package/dist/rules/follow-declarations.js +0 -264
  168. package/dist/rules/follow-declarations.js.map +0 -1
  169. package/dist/rules/implementation-returns-result.d.ts +0 -13
  170. package/dist/rules/implementation-returns-result.d.ts.map +0 -1
  171. package/dist/rules/implementation-returns-result.js +0 -277
  172. package/dist/rules/implementation-returns-result.js.map +0 -1
  173. package/dist/rules/index.d.ts +0 -20
  174. package/dist/rules/index.d.ts.map +0 -1
  175. package/dist/rules/index.js +0 -49
  176. package/dist/rules/index.js.map +0 -1
  177. package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
  178. package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
  179. package/dist/rules/no-direct-impl-in-route.js +0 -47
  180. package/dist/rules/no-direct-impl-in-route.js.map +0 -1
  181. package/dist/rules/no-direct-implementation-call.d.ts +0 -12
  182. package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
  183. package/dist/rules/no-direct-implementation-call.js +0 -39
  184. package/dist/rules/no-direct-implementation-call.js.map +0 -1
  185. package/dist/rules/no-sync-result-assumption.d.ts +0 -6
  186. package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
  187. package/dist/rules/no-sync-result-assumption.js +0 -98
  188. package/dist/rules/no-sync-result-assumption.js.map +0 -1
  189. package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
  190. package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
  191. package/dist/rules/no-throw-in-detour-target.js +0 -87
  192. package/dist/rules/no-throw-in-detour-target.js.map +0 -1
  193. package/dist/rules/no-throw-in-implementation.d.ts +0 -9
  194. package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
  195. package/dist/rules/no-throw-in-implementation.js +0 -34
  196. package/dist/rules/no-throw-in-implementation.js.map +0 -1
  197. package/dist/rules/prefer-schema-inference.d.ts +0 -7
  198. package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
  199. package/dist/rules/prefer-schema-inference.js +0 -86
  200. package/dist/rules/prefer-schema-inference.js.map +0 -1
  201. package/dist/rules/provision-declarations.d.ts +0 -14
  202. package/dist/rules/provision-declarations.d.ts.map +0 -1
  203. package/dist/rules/provision-declarations.js +0 -344
  204. package/dist/rules/provision-declarations.js.map +0 -1
  205. package/dist/rules/provision-exists.d.ts +0 -6
  206. package/dist/rules/provision-exists.d.ts.map +0 -1
  207. package/dist/rules/provision-exists.js +0 -90
  208. package/dist/rules/provision-exists.js.map +0 -1
  209. package/dist/rules/scan.d.ts +0 -8
  210. package/dist/rules/scan.d.ts.map +0 -1
  211. package/dist/rules/scan.js +0 -32
  212. package/dist/rules/scan.js.map +0 -1
  213. package/dist/rules/service-declarations.d.ts +0 -16
  214. package/dist/rules/service-declarations.d.ts.map +0 -1
  215. package/dist/rules/service-declarations.js +0 -346
  216. package/dist/rules/service-declarations.js.map +0 -1
  217. package/dist/rules/service-exists.d.ts +0 -8
  218. package/dist/rules/service-exists.d.ts.map +0 -1
  219. package/dist/rules/service-exists.js +0 -91
  220. package/dist/rules/service-exists.js.map +0 -1
  221. package/dist/rules/specs.d.ts +0 -29
  222. package/dist/rules/specs.d.ts.map +0 -1
  223. package/dist/rules/specs.js +0 -192
  224. package/dist/rules/specs.js.map +0 -1
  225. package/dist/rules/structure.d.ts +0 -13
  226. package/dist/rules/structure.d.ts.map +0 -1
  227. package/dist/rules/structure.js +0 -142
  228. package/dist/rules/structure.js.map +0 -1
  229. package/dist/rules/types.d.ts +0 -54
  230. package/dist/rules/types.d.ts.map +0 -1
  231. package/dist/rules/types.js +0 -2
  232. package/dist/rules/types.js.map +0 -1
  233. package/dist/rules/valid-describe-refs.d.ts +0 -7
  234. package/dist/rules/valid-describe-refs.d.ts.map +0 -1
  235. package/dist/rules/valid-describe-refs.js +0 -51
  236. package/dist/rules/valid-describe-refs.js.map +0 -1
  237. package/dist/rules/valid-detour-refs.d.ts +0 -6
  238. package/dist/rules/valid-detour-refs.d.ts.map +0 -1
  239. package/dist/rules/valid-detour-refs.js +0 -117
  240. package/dist/rules/valid-detour-refs.js.map +0 -1
  241. package/dist/trails/context-no-surface-types.trail.d.ts +0 -13
  242. package/dist/trails/context-no-surface-types.trail.d.ts.map +0 -1
  243. package/dist/trails/context-no-surface-types.trail.js +0 -21
  244. package/dist/trails/context-no-surface-types.trail.js.map +0 -1
  245. package/dist/trails/context-no-trailhead-types.trail.d.ts +0 -13
  246. package/dist/trails/context-no-trailhead-types.trail.d.ts.map +0 -1
  247. package/dist/trails/context-no-trailhead-types.trail.js +0 -21
  248. package/dist/trails/context-no-trailhead-types.trail.js.map +0 -1
  249. package/dist/trails/cross-declarations.trail.d.ts +0 -13
  250. package/dist/trails/cross-declarations.trail.d.ts.map +0 -1
  251. package/dist/trails/cross-declarations.trail.js +0 -22
  252. package/dist/trails/cross-declarations.trail.js.map +0 -1
  253. package/dist/trails/follow-declarations.trail.d.ts +0 -13
  254. package/dist/trails/follow-declarations.trail.d.ts.map +0 -1
  255. package/dist/trails/follow-declarations.trail.js +0 -22
  256. package/dist/trails/follow-declarations.trail.js.map +0 -1
  257. package/dist/trails/implementation-returns-result.trail.d.ts +0 -13
  258. package/dist/trails/implementation-returns-result.trail.d.ts.map +0 -1
  259. package/dist/trails/implementation-returns-result.trail.js +0 -20
  260. package/dist/trails/implementation-returns-result.trail.js.map +0 -1
  261. package/dist/trails/index.d.ts +0 -16
  262. package/dist/trails/index.d.ts.map +0 -1
  263. package/dist/trails/index.js +0 -15
  264. package/dist/trails/index.js.map +0 -1
  265. package/dist/trails/no-direct-impl-in-route.trail.d.ts +0 -13
  266. package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +0 -1
  267. package/dist/trails/no-direct-impl-in-route.trail.js +0 -22
  268. package/dist/trails/no-direct-impl-in-route.trail.js.map +0 -1
  269. package/dist/trails/no-direct-implementation-call.trail.d.ts +0 -13
  270. package/dist/trails/no-direct-implementation-call.trail.d.ts.map +0 -1
  271. package/dist/trails/no-direct-implementation-call.trail.js +0 -16
  272. package/dist/trails/no-direct-implementation-call.trail.js.map +0 -1
  273. package/dist/trails/no-sync-result-assumption.trail.d.ts +0 -13
  274. package/dist/trails/no-sync-result-assumption.trail.d.ts.map +0 -1
  275. package/dist/trails/no-sync-result-assumption.trail.js +0 -19
  276. package/dist/trails/no-sync-result-assumption.trail.js.map +0 -1
  277. package/dist/trails/no-throw-in-detour-target.trail.d.ts +0 -15
  278. package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +0 -1
  279. package/dist/trails/no-throw-in-detour-target.trail.js +0 -20
  280. package/dist/trails/no-throw-in-detour-target.trail.js.map +0 -1
  281. package/dist/trails/no-throw-in-implementation.trail.d.ts +0 -13
  282. package/dist/trails/no-throw-in-implementation.trail.d.ts.map +0 -1
  283. package/dist/trails/no-throw-in-implementation.trail.js +0 -20
  284. package/dist/trails/no-throw-in-implementation.trail.js.map +0 -1
  285. package/dist/trails/prefer-schema-inference.trail.d.ts +0 -13
  286. package/dist/trails/prefer-schema-inference.trail.d.ts.map +0 -1
  287. package/dist/trails/prefer-schema-inference.trail.js +0 -21
  288. package/dist/trails/prefer-schema-inference.trail.js.map +0 -1
  289. package/dist/trails/provision-declarations.trail.d.ts +0 -13
  290. package/dist/trails/provision-declarations.trail.d.ts.map +0 -1
  291. package/dist/trails/provision-declarations.trail.js +0 -25
  292. package/dist/trails/provision-declarations.trail.js.map +0 -1
  293. package/dist/trails/provision-exists.trail.d.ts +0 -15
  294. package/dist/trails/provision-exists.trail.d.ts.map +0 -1
  295. package/dist/trails/provision-exists.trail.js +0 -27
  296. package/dist/trails/provision-exists.trail.js.map +0 -1
  297. package/dist/trails/run.d.ts +0 -17
  298. package/dist/trails/run.d.ts.map +0 -1
  299. package/dist/trails/run.js +0 -39
  300. package/dist/trails/run.js.map +0 -1
  301. package/dist/trails/schema.d.ts +0 -53
  302. package/dist/trails/schema.d.ts.map +0 -1
  303. package/dist/trails/schema.js +0 -42
  304. package/dist/trails/schema.js.map +0 -1
  305. package/dist/trails/service-declarations.trail.d.ts +0 -26
  306. package/dist/trails/service-declarations.trail.d.ts.map +0 -1
  307. package/dist/trails/service-declarations.trail.js +0 -27
  308. package/dist/trails/service-declarations.trail.js.map +0 -1
  309. package/dist/trails/service-exists.trail.d.ts +0 -32
  310. package/dist/trails/service-exists.trail.d.ts.map +0 -1
  311. package/dist/trails/service-exists.trail.js +0 -29
  312. package/dist/trails/service-exists.trail.js.map +0 -1
  313. package/dist/trails/topo.d.ts +0 -3
  314. package/dist/trails/topo.d.ts.map +0 -1
  315. package/dist/trails/topo.js +0 -5
  316. package/dist/trails/topo.js.map +0 -1
  317. package/dist/trails/valid-describe-refs.trail.d.ts +0 -15
  318. package/dist/trails/valid-describe-refs.trail.d.ts.map +0 -1
  319. package/dist/trails/valid-describe-refs.trail.js +0 -18
  320. package/dist/trails/valid-describe-refs.trail.js.map +0 -1
  321. package/dist/trails/valid-detour-refs.trail.d.ts +0 -15
  322. package/dist/trails/valid-detour-refs.trail.d.ts.map +0 -1
  323. package/dist/trails/valid-detour-refs.trail.js +0 -24
  324. package/dist/trails/valid-detour-refs.trail.js.map +0 -1
  325. package/dist/trails/wrap-rule.d.ts +0 -29
  326. package/dist/trails/wrap-rule.d.ts.map +0 -1
  327. package/dist/trails/wrap-rule.js +0 -47
  328. package/dist/trails/wrap-rule.js.map +0 -1
  329. package/src/__tests__/cli.test.ts +0 -311
  330. package/src/__tests__/cross-declarations.test.ts +0 -303
  331. package/src/__tests__/drift.test.ts +0 -144
  332. package/src/__tests__/formatters.test.ts +0 -157
  333. package/src/__tests__/implementation-returns-result.test.ts +0 -129
  334. package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
  335. package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
  336. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  337. package/src/__tests__/prefer-schema-inference.test.ts +0 -84
  338. package/src/__tests__/provision-declarations.test.ts +0 -318
  339. package/src/__tests__/provision-exists.test.ts +0 -122
  340. package/src/__tests__/rules.test.ts +0 -227
  341. package/src/__tests__/trails.test.ts +0 -19
  342. package/src/__tests__/valid-describe-refs.test.ts +0 -60
  343. package/src/__tests__/wrap-rule.test.ts +0 -41
  344. package/src/rules/no-direct-impl-in-route.ts +0 -81
  345. package/src/rules/no-throw-in-detour-target.ts +0 -150
  346. package/src/rules/valid-detour-refs.ts +0 -189
  347. package/src/trails/no-direct-impl-in-route.trail.ts +0 -22
  348. package/src/trails/no-throw-in-detour-target.trail.ts +0 -20
  349. package/src/trails/valid-detour-refs.trail.ts +0 -24
  350. package/tsconfig.json +0 -9
  351. package/tsconfig.tsbuildinfo +0 -1
package/src/index.ts CHANGED
@@ -9,36 +9,86 @@
9
9
 
10
10
  // Rule types
11
11
  export type {
12
+ BuiltinWardenRuleName,
12
13
  ProjectAwareWardenRule,
13
14
  ProjectContext,
15
+ TopoAwareWardenRule,
14
16
  WardenDiagnostic,
17
+ WardenGuidance,
18
+ WardenGuidanceLink,
15
19
  WardenRule,
20
+ WardenRuleConcern,
21
+ WardenRuleLifecycle,
22
+ WardenRuleLifecycleState,
23
+ WardenRuleMetadata,
24
+ WardenRuleScope,
25
+ WardenRuleTier,
16
26
  WardenSeverity,
17
27
  } from './rules/index.js';
18
28
 
19
- // Individual rules
20
- export { noThrowInImplementation } from './rules/no-throw-in-implementation.js';
21
- export { contextNoTrailheadTypes } from './rules/context-no-trailhead-types.js';
22
- export { draftFileMarking } from './rules/draft-file-marking.js';
23
- export { draftVisibleDebt } from './rules/draft-visible-debt.js';
24
- export { validDetourRefs } from './rules/valid-detour-refs.js';
25
- export { noDirectImplInRoute } from './rules/no-direct-impl-in-route.js';
26
- export { noDirectImplementationCall } from './rules/no-direct-implementation-call.js';
27
- export { noSyncResultAssumption } from './rules/no-sync-result-assumption.js';
28
- export { implementationReturnsResult } from './rules/implementation-returns-result.js';
29
- export { noThrowInDetourTarget } from './rules/no-throw-in-detour-target.js';
30
- export { preferSchemaInference } from './rules/prefer-schema-inference.js';
31
- export { provisionDeclarations } from './rules/provision-declarations.js';
32
- export { provisionExists } from './rules/provision-exists.js';
33
- export { validDescribeRefs } from './rules/valid-describe-refs.js';
34
-
35
29
  // Rule registry
36
- export { wardenRules } from './rules/index.js';
30
+ export {
31
+ builtinWardenRuleMetadata,
32
+ getWardenRuleMetadata,
33
+ listWardenRuleMetadata,
34
+ wardenRuleConcerns,
35
+ wardenRuleLifecycleStates,
36
+ wardenRuleScopes,
37
+ wardenRuleTiers,
38
+ wardenRules,
39
+ wardenTopoRules,
40
+ } from './rules/index.js';
41
+
42
+ // Rule-scoped cache controls for long-lived consumers (watch mode, LSPs).
43
+ export { clearImplementationReturnsResultCache } from './rules/implementation-returns-result.js';
37
44
 
38
45
  // CLI runner
39
- export type { WardenOptions, WardenReport } from './cli.js';
46
+ export type {
47
+ WardenOptions,
48
+ WardenReport,
49
+ WardenRunOptions,
50
+ WardenTopoTarget,
51
+ } from './cli.js';
40
52
  export { formatWardenReport, runWarden } from './cli.js';
41
53
 
54
+ // CLI command surface
55
+ export type {
56
+ ParsedWardenCommand,
57
+ RunWardenCommandOptions,
58
+ WardenCommandResult,
59
+ } from './command.js';
60
+ export {
61
+ formatWardenCommandOutput,
62
+ loadWardenConfig,
63
+ parseWardenCommandArgs,
64
+ resolveWardenTopoTargets,
65
+ runWardenCommand,
66
+ } from './command.js';
67
+
68
+ // Config schema
69
+ export {
70
+ wardenConfigSchema,
71
+ wardenDepthValues,
72
+ wardenDraftsValues,
73
+ wardenFailOnValues,
74
+ wardenFormatValues,
75
+ wardenLockValues,
76
+ } from './config.js';
77
+ export type {
78
+ WardenConfig,
79
+ WardenConfigInput,
80
+ WardenDepth,
81
+ WardenDraftsMode,
82
+ WardenFailOn,
83
+ WardenFormat,
84
+ WardenLockMode,
85
+ EffectiveWardenConfig,
86
+ ResolveWardenConfigOptions,
87
+ WardenConfigLayer,
88
+ WardenConfigResolution,
89
+ } from './config.js';
90
+ export { resolveWardenConfig } from './config.js';
91
+
42
92
  // CI formatters
43
93
  export {
44
94
  formatGitHubAnnotations,
@@ -50,6 +100,35 @@ export {
50
100
  export type { DriftResult } from './drift.js';
51
101
  export { checkDrift } from './drift.js';
52
102
 
103
+ // Guide projection
104
+ export type {
105
+ WardenGuideFormat,
106
+ WardenGuideManifest,
107
+ WardenRuleGuideEntry,
108
+ } from './guide.js';
109
+ export {
110
+ buildWardenAgentGuide,
111
+ buildWardenGuideManifest,
112
+ formatWardenGuide,
113
+ formatWardenGuideMarkdown,
114
+ wardenGuideFormatValues,
115
+ } from './guide.js';
116
+
117
+ // Resolver helpers
118
+ export {
119
+ collectImportResolutionsForFile,
120
+ collectImportSpecifiers,
121
+ createWardenResolver,
122
+ defaultWardenResolveOptions,
123
+ } from './resolve.js';
124
+ export type {
125
+ WardenImportResolution,
126
+ WardenImportResolutionErrorKind,
127
+ WardenImportSpecifier,
128
+ WardenProjectResolver,
129
+ WardenResolverOptions,
130
+ } from './resolve.js';
131
+
53
132
  // Draft helpers
54
133
  export {
55
134
  DRAFT_FILE_PREFIX,
@@ -58,36 +137,70 @@ export {
58
137
  stripDraftFileMarkers,
59
138
  } from './draft.js';
60
139
 
61
- // AST helpers for repo-local tooling
62
- export {
63
- findStringLiterals,
64
- getStringValue,
65
- isStringLiteral,
66
- offsetToLine,
67
- parse,
68
- walk,
69
- } from './rules/ast.js';
70
- export type { AstNode, StringLiteralMatch } from './rules/ast.js';
71
-
72
- // Trail gate
140
+ // Trail layer
73
141
  export { wardenTopo } from './trails/topo.js';
74
- export { runWardenTrails } from './trails/run.js';
142
+ export { runTopoAwareWardenTrails, runWardenTrails } from './trails/run.js';
75
143
  export {
76
- contextNoTrailheadTypesTrail,
144
+ activationOrphanTrail,
145
+ circularRefsTrail,
146
+ contourExistsTrail,
147
+ contextNoSurfaceTypesTrail,
77
148
  crossDeclarationsTrail,
149
+ deadInternalTrailTrail,
78
150
  diagnosticSchema,
151
+ draftFileMarkingTrail,
152
+ draftVisibleDebtTrail,
153
+ errorMappingCompletenessTrail,
154
+ exampleValidTrail,
155
+ firesDeclarationsTrail,
79
156
  implementationReturnsResultTrail,
80
- noDirectImplInRouteTrail,
157
+ incompleteAccessorForStandardOpTrail,
158
+ incompleteCrudTrail,
159
+ intentPropagationTrail,
160
+ layerFieldNameDriftTrail,
161
+ missingVisibilityTrail,
162
+ missingReconcileTrail,
163
+ noDevPermitInSourceTrail,
81
164
  noDirectImplementationCallTrail,
165
+ noLegacyLayerImportsTrail,
166
+ noNativeErrorResultTrail,
82
167
  noSyncResultAssumptionTrail,
83
- noThrowInDetourTargetTrail,
168
+ noThrowInDetourRecoverTrail,
84
169
  noThrowInImplementationTrail,
170
+ onReferencesExistTrail,
171
+ orphanedSignalTrail,
172
+ ownerProjectionParityTrail,
173
+ permitGovernanceTrail,
85
174
  preferSchemaInferenceTrail,
175
+ projectAwareRuleInput,
176
+ publicInternalDeepImportsTrail,
177
+ publicOutputSchemaTrail,
178
+ publicUnionOutputDiscriminantsTrail,
179
+ readIntentFiresTrail,
180
+ referenceExistsTrail,
181
+ resolvedImportBoundaryTrail,
86
182
  ruleInput,
87
183
  ruleOutput,
88
- provisionDeclarationsTrail,
89
- provisionExistsTrail,
184
+ resourceDeclarationsTrail,
185
+ resourceIdGrammarTrail,
186
+ resourceExistsTrail,
187
+ scheduledDestroyIntentTrail,
188
+ signalGraphCoachingTrail,
189
+ staticResourceAccessorPreferenceTrail,
190
+ unmaterializedActivationSourceTrail,
191
+ topoAwareRuleInput,
192
+ unreachableDetourShadowingTrail,
193
+ validDetourContractTrail,
90
194
  validDescribeRefsTrail,
91
- validDetourRefsTrail,
195
+ wardenExportSymmetryTrail,
196
+ wardenRulesUseAstTrail,
197
+ webhookRouteCollisionTrail,
198
+ wrapRule,
199
+ wrapTopoRule,
200
+ } from './trails/index.js';
201
+ export type {
202
+ ProjectAwareRuleInput,
203
+ RuleInput,
204
+ RuleOutput,
205
+ TopoAwareRuleInput,
92
206
  } from './trails/index.js';
93
- export type { RuleInput, RuleOutput } from './trails/index.js';
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Project-context helpers shared by the Warden runner and resolver-backed
3
+ * rules.
4
+ */
5
+
6
+ import { realpathSync } from 'node:fs';
7
+ import { resolve } from 'node:path';
8
+
9
+ import {
10
+ collectImportResolutionsForFile,
11
+ createWardenResolver,
12
+ normalizePath,
13
+ } from './resolve.js';
14
+ import type {
15
+ WardenImportResolution,
16
+ WardenResolverOptions,
17
+ } from './resolve.js';
18
+ import { offsetToLine } from './rules/ast.js';
19
+ import { collectPublicWorkspaces } from './workspaces.js';
20
+ import type { WardenPublicWorkspace } from './workspaces.js';
21
+
22
+ const ONTRAILS_DOCUMENTATION_SPECIFIER_PATTERN =
23
+ /@ontrails\/[a-z0-9-]+(?:\/[A-Za-z0-9._~-]+)+/g;
24
+
25
+ const normalizeRealPath = (path: string): string => {
26
+ try {
27
+ return normalizePath(realpathSync(path));
28
+ } catch {
29
+ return normalizePath(resolve(path));
30
+ }
31
+ };
32
+
33
+ const setResolutionsForFile = (
34
+ resolutionsByFile: Map<string, readonly WardenImportResolution[]>,
35
+ sourceFilePath: string,
36
+ resolutions: readonly WardenImportResolution[]
37
+ ): void => {
38
+ const normalizedFilePath =
39
+ resolutions[0]?.importerPath ?? normalizeRealPath(sourceFilePath);
40
+ resolutionsByFile.set(normalizedFilePath, resolutions);
41
+ if (normalizedFilePath !== sourceFilePath) {
42
+ resolutionsByFile.set(sourceFilePath, resolutions);
43
+ }
44
+ };
45
+
46
+ export interface WardenProjectContextSourceFile {
47
+ readonly filePath: string;
48
+ readonly kind: 'documentation' | 'text' | 'typescript';
49
+ readonly sourceCode: string;
50
+ }
51
+
52
+ const collectDocumentationImportSpecifiers = (
53
+ sourceCode: string
54
+ ): readonly { readonly importSource: string; readonly line: number }[] => {
55
+ const specifiers: { importSource: string; line: number }[] = [];
56
+ for (const match of sourceCode.matchAll(
57
+ ONTRAILS_DOCUMENTATION_SPECIFIER_PATTERN
58
+ )) {
59
+ if (match.index === undefined) {
60
+ continue;
61
+ }
62
+ specifiers.push({
63
+ importSource: match[0],
64
+ line: offsetToLine(sourceCode, match.index),
65
+ });
66
+ }
67
+ return specifiers;
68
+ };
69
+
70
+ const exportAliasesForWorkspaces = (
71
+ workspaces: ReadonlyMap<string, WardenPublicWorkspace>
72
+ ): Record<string, string[]> => {
73
+ const aliases: Record<string, string[]> = {};
74
+ for (const workspace of workspaces.values()) {
75
+ for (const [specifier, target] of Object.entries(
76
+ workspace.exportTargets ?? {}
77
+ )) {
78
+ aliases[`${specifier}$`] = [target];
79
+ }
80
+ }
81
+ return aliases;
82
+ };
83
+
84
+ export const collectProjectImportResolutions = ({
85
+ resolveOptions,
86
+ rootDir,
87
+ sourceFiles,
88
+ }: {
89
+ readonly resolveOptions?: WardenResolverOptions['resolveOptions'];
90
+ readonly rootDir: string;
91
+ readonly sourceFiles: readonly WardenProjectContextSourceFile[];
92
+ }): ReadonlyMap<string, readonly WardenImportResolution[]> => {
93
+ const resolver = createWardenResolver({ resolveOptions, rootDir });
94
+ const resolutionsByFile = new Map<
95
+ string,
96
+ readonly WardenImportResolution[]
97
+ >();
98
+
99
+ for (const sourceFile of sourceFiles) {
100
+ if (sourceFile.kind !== 'typescript') {
101
+ continue;
102
+ }
103
+ const resolutions = collectImportResolutionsForFile({
104
+ filePath: sourceFile.filePath,
105
+ resolver,
106
+ sourceCode: sourceFile.sourceCode,
107
+ });
108
+ if (resolutions.length > 0) {
109
+ setResolutionsForFile(
110
+ resolutionsByFile,
111
+ sourceFile.filePath,
112
+ resolutions
113
+ );
114
+ }
115
+ }
116
+
117
+ return resolutionsByFile;
118
+ };
119
+
120
+ export const collectProjectDocumentationImportResolutions = ({
121
+ rootDir,
122
+ sourceFiles,
123
+ }: {
124
+ readonly rootDir: string;
125
+ readonly sourceFiles: readonly WardenProjectContextSourceFile[];
126
+ }): ReadonlyMap<string, readonly WardenImportResolution[]> => {
127
+ const publicWorkspaces = collectPublicWorkspaces(rootDir);
128
+ const resolver = createWardenResolver({
129
+ resolveOptions: { alias: exportAliasesForWorkspaces(publicWorkspaces) },
130
+ rootDir,
131
+ });
132
+ const resolutionsByFile = new Map<
133
+ string,
134
+ readonly WardenImportResolution[]
135
+ >();
136
+
137
+ for (const sourceFile of sourceFiles) {
138
+ if (sourceFile.kind !== 'documentation') {
139
+ continue;
140
+ }
141
+ const resolutions = collectDocumentationImportSpecifiers(
142
+ sourceFile.sourceCode
143
+ ).map((specifier) =>
144
+ resolver.resolveImport(
145
+ sourceFile.filePath,
146
+ specifier.importSource,
147
+ specifier.line
148
+ )
149
+ );
150
+ if (resolutions.length > 0) {
151
+ setResolutionsForFile(
152
+ resolutionsByFile,
153
+ sourceFile.filePath,
154
+ resolutions
155
+ );
156
+ }
157
+ }
158
+
159
+ return resolutionsByFile;
160
+ };
161
+
162
+ export { collectPublicWorkspaces };
163
+ export type { WardenPublicWorkspace } from './workspaces.js';