@shrkcrft/cli 0.1.0-alpha.30 → 0.1.0-alpha.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/dist/asset-preview/apply-asset-preview.js +1 -1
  2. package/dist/authoring/authoring-kit.d.ts +9 -1
  3. package/dist/authoring/authoring-kit.d.ts.map +1 -1
  4. package/dist/authoring/authoring-kit.js +26 -13
  5. package/dist/bootstrap/unlinked-workspace-dependency.d.ts +11 -0
  6. package/dist/bootstrap/unlinked-workspace-dependency.d.ts.map +1 -0
  7. package/dist/bootstrap/unlinked-workspace-dependency.js +99 -0
  8. package/dist/command-registry.d.ts +100 -1
  9. package/dist/command-registry.d.ts.map +1 -1
  10. package/dist/command-registry.js +130 -3
  11. package/dist/commands/api-diff.command.d.ts.map +1 -1
  12. package/dist/commands/api-diff.command.js +12 -0
  13. package/dist/commands/apply.command.d.ts.map +1 -1
  14. package/dist/commands/apply.command.js +3 -0
  15. package/dist/commands/arch.command.d.ts.map +1 -1
  16. package/dist/commands/arch.command.js +26 -7
  17. package/dist/commands/architecture.command.d.ts.map +1 -1
  18. package/dist/commands/architecture.command.js +8 -2
  19. package/dist/commands/baseline.command.d.ts +54 -3
  20. package/dist/commands/baseline.command.d.ts.map +1 -1
  21. package/dist/commands/baseline.command.js +582 -74
  22. package/dist/commands/biome.command.d.ts.map +1 -1
  23. package/dist/commands/biome.command.js +20 -0
  24. package/dist/commands/boundaries.command.d.ts +9 -1
  25. package/dist/commands/boundaries.command.d.ts.map +1 -1
  26. package/dist/commands/boundaries.command.js +88 -20
  27. package/dist/commands/bundle.command.d.ts.map +1 -1
  28. package/dist/commands/bundle.command.js +57 -11
  29. package/dist/commands/cache-align.command.d.ts.map +1 -1
  30. package/dist/commands/cache-align.command.js +3 -1
  31. package/dist/commands/changelog-data.d.ts.map +1 -1
  32. package/dist/commands/changelog-data.js +138 -0
  33. package/dist/commands/changes.command.d.ts.map +1 -1
  34. package/dist/commands/changes.command.js +15 -0
  35. package/dist/commands/check.command.d.ts.map +1 -1
  36. package/dist/commands/check.command.js +1241 -322
  37. package/dist/commands/checks.command.d.ts.map +1 -1
  38. package/dist/commands/checks.command.js +188 -40
  39. package/dist/commands/ci.command.d.ts.map +1 -1
  40. package/dist/commands/ci.command.js +35 -2
  41. package/dist/commands/code-intel.command.d.ts.map +1 -1
  42. package/dist/commands/code-intel.command.js +3 -0
  43. package/dist/commands/command-catalog.d.ts +23 -1
  44. package/dist/commands/command-catalog.d.ts.map +1 -1
  45. package/dist/commands/command-catalog.js +152 -35
  46. package/dist/commands/commands.command.d.ts +21 -3
  47. package/dist/commands/commands.command.d.ts.map +1 -1
  48. package/dist/commands/commands.command.js +172 -27
  49. package/dist/commands/compress.command.d.ts.map +1 -1
  50. package/dist/commands/compress.command.js +4 -0
  51. package/dist/commands/constructs.command.d.ts.map +1 -1
  52. package/dist/commands/constructs.command.js +50 -12
  53. package/dist/commands/context.command.d.ts.map +1 -1
  54. package/dist/commands/context.command.js +40 -5
  55. package/dist/commands/contract-templates.command.d.ts.map +1 -1
  56. package/dist/commands/contract-templates.command.js +9 -1
  57. package/dist/commands/contract.command.d.ts.map +1 -1
  58. package/dist/commands/contract.command.js +35 -0
  59. package/dist/commands/conventions.command.d.ts.map +1 -1
  60. package/dist/commands/conventions.command.js +189 -29
  61. package/dist/commands/coverage.command.d.ts.map +1 -1
  62. package/dist/commands/coverage.command.js +9 -0
  63. package/dist/commands/daily.commands.d.ts +0 -1
  64. package/dist/commands/daily.commands.d.ts.map +1 -1
  65. package/dist/commands/daily.commands.js +12 -76
  66. package/dist/commands/dashboard.command.d.ts.map +1 -1
  67. package/dist/commands/dashboard.command.js +10 -0
  68. package/dist/commands/dev.command.d.ts.map +1 -1
  69. package/dist/commands/dev.command.js +45 -2
  70. package/dist/commands/diagnostics.command.d.ts +0 -2
  71. package/dist/commands/diagnostics.command.d.ts.map +1 -1
  72. package/dist/commands/diagnostics.command.js +5 -78
  73. package/dist/commands/diff-check.command.d.ts +6 -4
  74. package/dist/commands/diff-check.command.d.ts.map +1 -1
  75. package/dist/commands/diff-check.command.js +190 -103
  76. package/dist/commands/docs-references.command.d.ts +13 -0
  77. package/dist/commands/docs-references.command.d.ts.map +1 -1
  78. package/dist/commands/docs-references.command.js +269 -72
  79. package/dist/commands/doctor.command.d.ts.map +1 -1
  80. package/dist/commands/doctor.command.js +58 -4
  81. package/dist/commands/drift.command.d.ts.map +1 -1
  82. package/dist/commands/drift.command.js +17 -4
  83. package/dist/commands/eslint.command.d.ts.map +1 -1
  84. package/dist/commands/eslint.command.js +20 -0
  85. package/dist/commands/export.command.d.ts.map +1 -1
  86. package/dist/commands/export.command.js +23 -1
  87. package/dist/commands/feedback-dispatch.command.d.ts.map +1 -1
  88. package/dist/commands/feedback-dispatch.command.js +29 -0
  89. package/dist/commands/feedback.command.d.ts.map +1 -1
  90. package/dist/commands/feedback.command.js +6 -1
  91. package/dist/commands/finish.command.d.ts.map +1 -1
  92. package/dist/commands/finish.command.js +32 -8
  93. package/dist/commands/fix.command.d.ts.map +1 -1
  94. package/dist/commands/fix.command.js +19 -0
  95. package/dist/commands/gate.command.d.ts +6 -1
  96. package/dist/commands/gate.command.d.ts.map +1 -1
  97. package/dist/commands/gate.command.js +50 -124
  98. package/dist/commands/gates.command.d.ts +52 -0
  99. package/dist/commands/gates.command.d.ts.map +1 -1
  100. package/dist/commands/gates.command.js +811 -185
  101. package/dist/commands/gen.command.d.ts.map +1 -1
  102. package/dist/commands/gen.command.js +4 -0
  103. package/dist/commands/generated.command.d.ts +33 -3
  104. package/dist/commands/generated.command.d.ts.map +1 -1
  105. package/dist/commands/generated.command.js +499 -147
  106. package/dist/commands/graph-code-subverbs.d.ts +15 -0
  107. package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
  108. package/dist/commands/graph-code-subverbs.js +198 -24
  109. package/dist/commands/graph.command.d.ts.map +1 -1
  110. package/dist/commands/graph.command.js +79 -37
  111. package/dist/commands/help.command.d.ts +30 -6
  112. package/dist/commands/help.command.d.ts.map +1 -1
  113. package/dist/commands/help.command.js +323 -199
  114. package/dist/commands/helper.command.d.ts +1 -0
  115. package/dist/commands/helper.command.d.ts.map +1 -1
  116. package/dist/commands/helper.command.js +195 -56
  117. package/dist/commands/impact.command.d.ts.map +1 -1
  118. package/dist/commands/impact.command.js +115 -12
  119. package/dist/commands/infer.command.d.ts.map +1 -1
  120. package/dist/commands/infer.command.js +20 -45
  121. package/dist/commands/ingest.command.d.ts +0 -1
  122. package/dist/commands/ingest.command.d.ts.map +1 -1
  123. package/dist/commands/ingest.command.js +25 -41
  124. package/dist/commands/knowledge-author.command.d.ts +0 -3
  125. package/dist/commands/knowledge-author.command.d.ts.map +1 -1
  126. package/dist/commands/knowledge-author.command.js +10 -23
  127. package/dist/commands/knowledge.command.d.ts.map +1 -1
  128. package/dist/commands/knowledge.command.js +469 -129
  129. package/dist/commands/languages.command.d.ts.map +1 -1
  130. package/dist/commands/languages.command.js +27 -0
  131. package/dist/commands/lint.command.d.ts.map +1 -1
  132. package/dist/commands/lint.command.js +3 -0
  133. package/dist/commands/mcp.command.d.ts +18 -0
  134. package/dist/commands/mcp.command.d.ts.map +1 -1
  135. package/dist/commands/mcp.command.js +33 -8
  136. package/dist/commands/onboard.command.d.ts.map +1 -1
  137. package/dist/commands/onboard.command.js +20 -0
  138. package/dist/commands/owners.command.d.ts.map +1 -1
  139. package/dist/commands/owners.command.js +14 -2
  140. package/dist/commands/packs-new.d.ts +13 -1
  141. package/dist/commands/packs-new.d.ts.map +1 -1
  142. package/dist/commands/packs-new.js +500 -335
  143. package/dist/commands/packs.command.d.ts.map +1 -1
  144. package/dist/commands/packs.command.js +378 -36
  145. package/dist/commands/paths.command.d.ts.map +1 -1
  146. package/dist/commands/paths.command.js +9 -1
  147. package/dist/commands/pipelines.command.d.ts.map +1 -1
  148. package/dist/commands/pipelines.command.js +7 -1
  149. package/dist/commands/plan-check.command.d.ts.map +1 -1
  150. package/dist/commands/plan-check.command.js +3 -0
  151. package/dist/commands/plan.command.d.ts.map +1 -1
  152. package/dist/commands/plan.command.js +3 -0
  153. package/dist/commands/playbooks.command.d.ts.map +1 -1
  154. package/dist/commands/playbooks.command.js +7 -2
  155. package/dist/commands/policy-lint.command.d.ts +19 -2
  156. package/dist/commands/policy-lint.command.d.ts.map +1 -1
  157. package/dist/commands/policy-lint.command.js +224 -65
  158. package/dist/commands/policy.command.d.ts.map +1 -1
  159. package/dist/commands/policy.command.js +6 -1
  160. package/dist/commands/pr.command.d.ts.map +1 -1
  161. package/dist/commands/pr.command.js +14 -0
  162. package/dist/commands/presets.command.d.ts.map +1 -1
  163. package/dist/commands/presets.command.js +12 -27
  164. package/dist/commands/profiles.command.d.ts.map +1 -1
  165. package/dist/commands/profiles.command.js +94 -26
  166. package/dist/commands/provenance.command.js +1 -1
  167. package/dist/commands/quality.command.d.ts.map +1 -1
  168. package/dist/commands/quality.command.js +129 -33
  169. package/dist/commands/recommend.command.d.ts +20 -4
  170. package/dist/commands/recommend.command.d.ts.map +1 -1
  171. package/dist/commands/recommend.command.js +172 -278
  172. package/dist/commands/registrations.command.d.ts.map +1 -1
  173. package/dist/commands/registrations.command.js +138 -13
  174. package/dist/commands/registry-lifecycle-run.d.ts +14 -0
  175. package/dist/commands/registry-lifecycle-run.d.ts.map +1 -0
  176. package/dist/commands/registry-lifecycle-run.js +336 -0
  177. package/dist/commands/registry.command.d.ts.map +1 -1
  178. package/dist/commands/registry.command.js +235 -62
  179. package/dist/commands/release.command.d.ts.map +1 -1
  180. package/dist/commands/release.command.js +99 -20
  181. package/dist/commands/report.command.d.ts.map +1 -1
  182. package/dist/commands/report.command.js +38 -2
  183. package/dist/commands/reuse-coverage.command.d.ts +23 -0
  184. package/dist/commands/reuse-coverage.command.d.ts.map +1 -0
  185. package/dist/commands/reuse-coverage.command.js +536 -0
  186. package/dist/commands/reuse.command.d.ts +3 -18
  187. package/dist/commands/reuse.command.d.ts.map +1 -1
  188. package/dist/commands/reuse.command.js +395 -244
  189. package/dist/commands/review.command.d.ts.map +1 -1
  190. package/dist/commands/review.command.js +33 -1
  191. package/dist/commands/rounds.command.d.ts.map +1 -1
  192. package/dist/commands/rounds.command.js +5 -0
  193. package/dist/commands/safety.command.d.ts.map +1 -1
  194. package/dist/commands/safety.command.js +9 -0
  195. package/dist/commands/scaffolds.command.d.ts.map +1 -1
  196. package/dist/commands/scaffolds.command.js +97 -25
  197. package/dist/commands/search.command.d.ts +0 -8
  198. package/dist/commands/search.command.d.ts.map +1 -1
  199. package/dist/commands/search.command.js +136 -28
  200. package/dist/commands/self-config-xrefs.command.d.ts +24 -0
  201. package/dist/commands/self-config-xrefs.command.d.ts.map +1 -0
  202. package/dist/commands/self-config-xrefs.command.js +170 -0
  203. package/dist/commands/self-config.command.d.ts.map +1 -1
  204. package/dist/commands/self-config.command.js +261 -65
  205. package/dist/commands/smart-context.command.d.ts.map +1 -1
  206. package/dist/commands/smart-context.command.js +39 -3
  207. package/dist/commands/spec.command.d.ts.map +1 -1
  208. package/dist/commands/spec.command.js +3 -0
  209. package/dist/commands/stats.command.d.ts.map +1 -1
  210. package/dist/commands/stats.command.js +3 -0
  211. package/dist/commands/surface.command.d.ts +6 -1
  212. package/dist/commands/surface.command.d.ts.map +1 -1
  213. package/dist/commands/surface.command.js +256 -54
  214. package/dist/commands/task-context.command.js +1 -1
  215. package/dist/commands/task.command.d.ts.map +1 -1
  216. package/dist/commands/task.command.js +22 -1
  217. package/dist/commands/templates.command.d.ts +4 -0
  218. package/dist/commands/templates.command.d.ts.map +1 -1
  219. package/dist/commands/templates.command.js +109 -22
  220. package/dist/commands/test.command.d.ts.map +1 -1
  221. package/dist/commands/test.command.js +161 -33
  222. package/dist/commands/tests.command.d.ts.map +1 -1
  223. package/dist/commands/tests.command.js +29 -3
  224. package/dist/commands/trace.command.d.ts.map +1 -1
  225. package/dist/commands/trace.command.js +29 -4
  226. package/dist/commands/watch.command.d.ts.map +1 -1
  227. package/dist/commands/watch.command.js +3 -0
  228. package/dist/commands/why.command.d.ts.map +1 -1
  229. package/dist/commands/why.command.js +3 -0
  230. package/dist/commands/wiring.command.d.ts +18 -4
  231. package/dist/commands/wiring.command.d.ts.map +1 -1
  232. package/dist/commands/wiring.command.js +360 -73
  233. package/dist/dashboard/code-intelligence-data.js +4 -4
  234. package/dist/diff/deleted-orphan-coverage.d.ts +32 -0
  235. package/dist/diff/deleted-orphan-coverage.d.ts.map +1 -0
  236. package/dist/diff/deleted-orphan-coverage.js +107 -0
  237. package/dist/diff/deleted-orphan-scope-notes.d.ts +23 -0
  238. package/dist/diff/deleted-orphan-scope-notes.d.ts.map +1 -0
  239. package/dist/diff/deleted-orphan-scope-notes.js +49 -0
  240. package/dist/diff/deleted-orphans.d.ts +32 -0
  241. package/dist/diff/deleted-orphans.d.ts.map +1 -1
  242. package/dist/diff/deleted-orphans.js +42 -2
  243. package/dist/dispatch/closest-match.d.ts +15 -0
  244. package/dist/dispatch/closest-match.d.ts.map +1 -0
  245. package/dist/dispatch/closest-match.js +47 -0
  246. package/dist/dispatch/global-flags.d.ts +94 -0
  247. package/dist/dispatch/global-flags.d.ts.map +1 -0
  248. package/dist/dispatch/global-flags.js +123 -0
  249. package/dist/dispatch/guard-invocation-input.d.ts +24 -0
  250. package/dist/dispatch/guard-invocation-input.d.ts.map +1 -0
  251. package/dist/dispatch/guard-invocation-input.js +1 -0
  252. package/dist/dispatch/guard-invocation.d.ts +33 -0
  253. package/dist/dispatch/guard-invocation.d.ts.map +1 -0
  254. package/dist/dispatch/guard-invocation.js +183 -0
  255. package/dist/dispatch/help-intercept.d.ts +22 -0
  256. package/dist/dispatch/help-intercept.d.ts.map +1 -0
  257. package/dist/dispatch/help-intercept.js +42 -0
  258. package/dist/dispatch/i-declared-invocation.d.ts +17 -0
  259. package/dist/dispatch/i-declared-invocation.d.ts.map +1 -0
  260. package/dist/dispatch/i-declared-invocation.js +1 -0
  261. package/dist/dispatch/i-unknown-flag-refusal-input.d.ts +28 -0
  262. package/dist/dispatch/i-unknown-flag-refusal-input.d.ts.map +1 -0
  263. package/dist/dispatch/i-unknown-flag-refusal-input.js +1 -0
  264. package/dist/dispatch/invocation-rejection-kind.d.ts +15 -0
  265. package/dist/dispatch/invocation-rejection-kind.d.ts.map +1 -0
  266. package/dist/dispatch/invocation-rejection-kind.js +15 -0
  267. package/dist/dispatch/invocation-rejection.d.ts +18 -0
  268. package/dist/dispatch/invocation-rejection.d.ts.map +1 -0
  269. package/dist/dispatch/invocation-rejection.js +1 -0
  270. package/dist/dispatch/judge-invocation.d.ts +24 -0
  271. package/dist/dispatch/judge-invocation.d.ts.map +1 -0
  272. package/dist/dispatch/judge-invocation.js +50 -0
  273. package/dist/dispatch/positional-mode.d.ts +18 -0
  274. package/dist/dispatch/positional-mode.d.ts.map +1 -0
  275. package/dist/dispatch/positional-mode.js +18 -0
  276. package/dist/dispatch/read-tracking-map.d.ts +28 -0
  277. package/dist/dispatch/read-tracking-map.d.ts.map +1 -0
  278. package/dist/dispatch/read-tracking-map.js +58 -0
  279. package/dist/dispatch/refuse-sibling-valve-flags.d.ts +30 -0
  280. package/dist/dispatch/refuse-sibling-valve-flags.d.ts.map +1 -0
  281. package/dist/dispatch/refuse-sibling-valve-flags.js +65 -0
  282. package/dist/dispatch/subverb-spec.d.ts +26 -0
  283. package/dist/dispatch/subverb-spec.d.ts.map +1 -0
  284. package/dist/dispatch/subverb-spec.js +1 -0
  285. package/dist/dispatch/undocumented-flag-reads.d.ts +22 -0
  286. package/dist/dispatch/undocumented-flag-reads.d.ts.map +1 -0
  287. package/dist/dispatch/undocumented-flag-reads.js +283 -0
  288. package/dist/dispatch/unknown-flag-refusal-mode.d.ts +13 -0
  289. package/dist/dispatch/unknown-flag-refusal-mode.d.ts.map +1 -0
  290. package/dist/dispatch/unknown-flag-refusal-mode.js +13 -0
  291. package/dist/dispatch/unknown-flag-refusal.d.ts +22 -0
  292. package/dist/dispatch/unknown-flag-refusal.d.ts.map +1 -0
  293. package/dist/dispatch/unknown-flag-refusal.js +57 -0
  294. package/dist/dispatch/unread-flags.d.ts +152 -0
  295. package/dist/dispatch/unread-flags.d.ts.map +1 -0
  296. package/dist/dispatch/unread-flags.js +295 -0
  297. package/dist/dispatch/verdict-valve-flag.d.ts +21 -0
  298. package/dist/dispatch/verdict-valve-flag.d.ts.map +1 -0
  299. package/dist/dispatch/verdict-valve-flag.js +21 -0
  300. package/dist/dispatch/walk-declared-subverbs.d.ts +14 -0
  301. package/dist/dispatch/walk-declared-subverbs.d.ts.map +1 -0
  302. package/dist/dispatch/walk-declared-subverbs.js +28 -0
  303. package/dist/exit-codes.d.ts +41 -3
  304. package/dist/exit-codes.d.ts.map +1 -1
  305. package/dist/exit-codes.js +153 -14
  306. package/dist/finish/run-finish.d.ts +72 -5
  307. package/dist/finish/run-finish.d.ts.map +1 -1
  308. package/dist/finish/run-finish.js +453 -104
  309. package/dist/gates/accepted-empty-note.d.ts +10 -0
  310. package/dist/gates/accepted-empty-note.d.ts.map +1 -0
  311. package/dist/gates/accepted-empty-note.js +11 -0
  312. package/dist/gates/allow-empty.d.ts +25 -0
  313. package/dist/gates/allow-empty.d.ts.map +1 -0
  314. package/dist/gates/allow-empty.js +27 -0
  315. package/dist/gates/asset-doctor-failing-units.d.ts +16 -0
  316. package/dist/gates/asset-doctor-failing-units.d.ts.map +1 -0
  317. package/dist/gates/asset-doctor-failing-units.js +14 -0
  318. package/dist/gates/asset-doctor-failure-line.d.ts +16 -0
  319. package/dist/gates/asset-doctor-failure-line.d.ts.map +1 -0
  320. package/dist/gates/asset-doctor-failure-line.js +28 -0
  321. package/dist/gates/empty-rule-advice-lines.d.ts +15 -0
  322. package/dist/gates/empty-rule-advice-lines.d.ts.map +1 -0
  323. package/dist/gates/empty-rule-advice-lines.js +20 -0
  324. package/dist/gates/gate-envelope.d.ts +85 -8
  325. package/dist/gates/gate-envelope.d.ts.map +1 -1
  326. package/dist/gates/gate-envelope.js +56 -7
  327. package/dist/gates/gate-rule-globs.d.ts +37 -3
  328. package/dist/gates/gate-rule-globs.d.ts.map +1 -1
  329. package/dist/gates/gate-rule-globs.js +78 -40
  330. package/dist/gates/gate-rule-view.d.ts +17 -4
  331. package/dist/gates/gate-rule-view.d.ts.map +1 -1
  332. package/dist/gates/gate-rule-view.js +105 -90
  333. package/dist/gates/i-coverage-dead-glob.d.ts +19 -0
  334. package/dist/gates/i-coverage-dead-glob.d.ts.map +1 -0
  335. package/dist/gates/i-coverage-dead-glob.js +1 -0
  336. package/dist/gates/i-coverage-negation.d.ts +13 -0
  337. package/dist/gates/i-coverage-negation.d.ts.map +1 -0
  338. package/dist/gates/i-coverage-negation.js +1 -0
  339. package/dist/gates/i-registration-query-settle-input.d.ts +18 -0
  340. package/dist/gates/i-registration-query-settle-input.d.ts.map +1 -0
  341. package/dist/gates/i-registration-query-settle-input.js +1 -0
  342. package/dist/gates/i-unit-state-note-row.d.ts +16 -0
  343. package/dist/gates/i-unit-state-note-row.d.ts.map +1 -0
  344. package/dist/gates/i-unit-state-note-row.js +1 -0
  345. package/dist/gates/i-unit-state-notes.d.ts +32 -0
  346. package/dist/gates/i-unit-state-notes.d.ts.map +1 -0
  347. package/dist/gates/i-unit-state-notes.js +1 -0
  348. package/dist/gates/incomplete-registry-inventory.d.ts +19 -0
  349. package/dist/gates/incomplete-registry-inventory.d.ts.map +1 -0
  350. package/dist/gates/incomplete-registry-inventory.js +63 -0
  351. package/dist/gates/measure-registration-roles.d.ts +10 -0
  352. package/dist/gates/measure-registration-roles.d.ts.map +1 -0
  353. package/dist/gates/measure-registration-roles.js +9 -0
  354. package/dist/gates/plane-verdict.d.ts +14 -0
  355. package/dist/gates/plane-verdict.d.ts.map +1 -0
  356. package/dist/gates/plane-verdict.js +22 -0
  357. package/dist/gates/qualify-clean-for-units.d.ts +12 -0
  358. package/dist/gates/qualify-clean-for-units.d.ts.map +1 -0
  359. package/dist/gates/qualify-clean-for-units.js +18 -0
  360. package/dist/gates/registration-graph-verdict.d.ts +34 -0
  361. package/dist/gates/registration-graph-verdict.d.ts.map +1 -0
  362. package/dist/gates/registration-graph-verdict.js +70 -0
  363. package/dist/gates/registration-roles.d.ts +9 -0
  364. package/dist/gates/registration-roles.d.ts.map +1 -0
  365. package/dist/gates/registration-roles.js +1 -0
  366. package/dist/gates/registry-liveness.d.ts +11 -0
  367. package/dist/gates/registry-liveness.d.ts.map +1 -0
  368. package/dist/gates/registry-liveness.js +13 -0
  369. package/dist/gates/rule-coverage.d.ts +187 -4
  370. package/dist/gates/rule-coverage.d.ts.map +1 -1
  371. package/dist/gates/rule-coverage.js +501 -49
  372. package/dist/gates/run-gate-planes.d.ts +14 -0
  373. package/dist/gates/run-gate-planes.d.ts.map +1 -1
  374. package/dist/gates/run-gate-planes.js +172 -30
  375. package/dist/gates/scaffold-selftest.d.ts +56 -0
  376. package/dist/gates/scaffold-selftest.d.ts.map +1 -0
  377. package/dist/gates/scaffold-selftest.js +119 -0
  378. package/dist/gates/seam-rejected-rules.d.ts +28 -0
  379. package/dist/gates/seam-rejected-rules.d.ts.map +1 -0
  380. package/dist/gates/seam-rejected-rules.js +95 -0
  381. package/dist/gates/self-test-check.d.ts +29 -0
  382. package/dist/gates/self-test-check.d.ts.map +1 -0
  383. package/dist/gates/self-test-check.js +1 -0
  384. package/dist/gates/self-test-subject.d.ts +28 -0
  385. package/dist/gates/self-test-subject.d.ts.map +1 -0
  386. package/dist/gates/self-test-subject.js +1 -0
  387. package/dist/gates/self-test.d.ts +20 -0
  388. package/dist/gates/self-test.d.ts.map +1 -0
  389. package/dist/gates/self-test.js +82 -0
  390. package/dist/gates/settle-verdict.d.ts +14 -0
  391. package/dist/gates/settle-verdict.d.ts.map +1 -0
  392. package/dist/gates/settle-verdict.js +13 -0
  393. package/dist/gates/settled-verdict.d.ts +8 -0
  394. package/dist/gates/settled-verdict.d.ts.map +1 -0
  395. package/dist/gates/settled-verdict.js +1 -0
  396. package/dist/gates/template-registry-coverage.d.ts +18 -0
  397. package/dist/gates/template-registry-coverage.d.ts.map +1 -0
  398. package/dist/gates/template-registry-coverage.js +24 -0
  399. package/dist/gates/unit-state-notes.d.ts +40 -0
  400. package/dist/gates/unit-state-notes.d.ts.map +1 -0
  401. package/dist/gates/unit-state-notes.js +71 -0
  402. package/dist/gates/verdict-line.d.ts +18 -0
  403. package/dist/gates/verdict-line.d.ts.map +1 -0
  404. package/dist/gates/verdict-line.js +40 -0
  405. package/dist/graph/graph-reuse-lookup.d.ts +10 -0
  406. package/dist/graph/graph-reuse-lookup.d.ts.map +1 -0
  407. package/dist/graph/graph-reuse-lookup.js +41 -0
  408. package/dist/graph/index-behind-hint.d.ts +11 -0
  409. package/dist/graph/index-behind-hint.d.ts.map +1 -0
  410. package/dist/graph/index-behind-hint.js +27 -0
  411. package/dist/knowledge/knowledge-stale-gate-flags.d.ts +3 -0
  412. package/dist/knowledge/knowledge-stale-gate-flags.d.ts.map +1 -0
  413. package/dist/knowledge/knowledge-stale-gate-flags.js +1 -0
  414. package/dist/knowledge/knowledge-stale-gate-input.d.ts +3 -0
  415. package/dist/knowledge/knowledge-stale-gate-input.d.ts.map +1 -0
  416. package/dist/knowledge/knowledge-stale-gate-input.js +1 -0
  417. package/dist/knowledge/knowledge-stale-gate-result.d.ts +3 -0
  418. package/dist/knowledge/knowledge-stale-gate-result.d.ts.map +1 -0
  419. package/dist/knowledge/knowledge-stale-gate-result.js +1 -0
  420. package/dist/knowledge/knowledge-stale-gate.d.ts +10 -0
  421. package/dist/knowledge/knowledge-stale-gate.d.ts.map +1 -0
  422. package/dist/knowledge/knowledge-stale-gate.js +9 -0
  423. package/dist/main.d.ts.map +1 -1
  424. package/dist/main.js +200 -83
  425. package/dist/output/failure-hints.d.ts.map +1 -1
  426. package/dist/output/failure-hints.js +11 -9
  427. package/dist/output/rejected-entries-note.d.ts +57 -0
  428. package/dist/output/rejected-entries-note.d.ts.map +1 -0
  429. package/dist/output/rejected-entries-note.js +103 -0
  430. package/dist/output/stdout-is-pipe.d.ts +13 -0
  431. package/dist/output/stdout-is-pipe.d.ts.map +1 -0
  432. package/dist/output/stdout-is-pipe.js +21 -0
  433. package/dist/packs/stale-build-warning.d.ts +11 -0
  434. package/dist/packs/stale-build-warning.d.ts.map +1 -0
  435. package/dist/packs/stale-build-warning.js +23 -0
  436. package/dist/quality/run-quality.d.ts +123 -0
  437. package/dist/quality/run-quality.d.ts.map +1 -0
  438. package/dist/quality/run-quality.js +442 -0
  439. package/dist/schemas/json-schemas.d.ts +184 -3
  440. package/dist/schemas/json-schemas.d.ts.map +1 -1
  441. package/dist/schemas/json-schemas.js +113 -2
  442. package/dist/shrk.d.ts +3 -0
  443. package/dist/shrk.d.ts.map +1 -0
  444. package/dist/shrk.js +30 -0
  445. package/dist/surface/audience-applicability.d.ts +26 -0
  446. package/dist/surface/audience-applicability.d.ts.map +1 -0
  447. package/dist/surface/audience-applicability.js +60 -0
  448. package/dist/surface/catalog-command-safety.d.ts +18 -0
  449. package/dist/surface/catalog-command-safety.d.ts.map +1 -0
  450. package/dist/surface/catalog-command-safety.js +62 -0
  451. package/dist/surface/cli-command-resolver.d.ts +21 -0
  452. package/dist/surface/cli-command-resolver.d.ts.map +1 -0
  453. package/dist/surface/cli-command-resolver.js +87 -0
  454. package/dist/surface/command-dispatch-kind.d.ts +20 -0
  455. package/dist/surface/command-dispatch-kind.d.ts.map +1 -0
  456. package/dist/surface/command-dispatch-kind.js +20 -0
  457. package/dist/surface/command-index-entry.d.ts +40 -0
  458. package/dist/surface/command-index-entry.d.ts.map +1 -0
  459. package/dist/surface/command-index-entry.js +1 -0
  460. package/dist/surface/command-index.d.ts +77 -0
  461. package/dist/surface/command-index.d.ts.map +1 -0
  462. package/dist/surface/command-index.js +323 -0
  463. package/dist/surface/i-command-index.d.ts +22 -0
  464. package/dist/surface/i-command-index.d.ts.map +1 -0
  465. package/dist/surface/i-command-index.js +1 -0
  466. package/dist/surface/i-command-string-context.d.ts +20 -0
  467. package/dist/surface/i-command-string-context.d.ts.map +1 -0
  468. package/dist/surface/i-command-string-context.js +1 -0
  469. package/dist/surface/i-surface-denial.d.ts +13 -0
  470. package/dist/surface/i-surface-denial.d.ts.map +1 -0
  471. package/dist/surface/i-surface-denial.js +1 -0
  472. package/dist/surface/load-surface-context.d.ts +17 -1
  473. package/dist/surface/load-surface-context.d.ts.map +1 -1
  474. package/dist/surface/load-surface-context.js +48 -10
  475. package/dist/surface/not-enabled-error.d.ts +38 -4
  476. package/dist/surface/not-enabled-error.d.ts.map +1 -1
  477. package/dist/surface/not-enabled-error.js +96 -6
  478. package/dist/surface/profiles.d.ts +7 -0
  479. package/dist/surface/profiles.d.ts.map +1 -1
  480. package/dist/surface/resolve-command-string.d.ts +10 -0
  481. package/dist/surface/resolve-command-string.d.ts.map +1 -0
  482. package/dist/surface/resolve-command-string.js +572 -0
  483. package/dist/surface/surface-config-writer.d.ts +7 -2
  484. package/dist/surface/surface-config-writer.d.ts.map +1 -1
  485. package/dist/surface/surface-config-writer.js +25 -6
  486. package/dist/surface/surface-layer.d.ts +11 -0
  487. package/dist/surface/surface-layer.d.ts.map +1 -0
  488. package/dist/surface/surface-layer.js +11 -0
  489. package/dist/surface/surface-refusal-reason.d.ts +16 -0
  490. package/dist/surface/surface-refusal-reason.d.ts.map +1 -0
  491. package/dist/surface/surface-refusal-reason.js +16 -0
  492. package/dist/surface/surface-selector.d.ts +26 -0
  493. package/dist/surface/surface-selector.d.ts.map +1 -0
  494. package/dist/surface/surface-selector.js +42 -0
  495. package/dist/surface/surface-summary.d.ts +61 -18
  496. package/dist/surface/surface-summary.d.ts.map +1 -1
  497. package/dist/surface/surface-summary.js +147 -60
  498. package/dist/surface/tier.d.ts +85 -22
  499. package/dist/surface/tier.d.ts.map +1 -1
  500. package/dist/surface/tier.js +132 -30
  501. package/dist/usage/usage-log.d.ts +6 -1
  502. package/dist/usage/usage-log.d.ts.map +1 -1
  503. package/dist/usage/usage-log.js +7 -2
  504. package/dist/validation/run-validation-loop.d.ts +9 -0
  505. package/dist/validation/run-validation-loop.d.ts.map +1 -1
  506. package/dist/validation/run-validation-loop.js +14 -11
  507. package/dist/validation/typecheck-emitted.d.ts +8 -9
  508. package/dist/validation/typecheck-emitted.d.ts.map +1 -1
  509. package/dist/validation/typecheck-emitted.js +17 -97
  510. package/package.json +34 -34
@@ -1,18 +1,46 @@
1
- import { buildRegistrationGraph, explainWiring, registrationChain, registrationGraphSignature, registrationOrphans, registrationUnprovided, } from '@shrkcrft/boundaries';
1
+ import { buildRegistrationGraph, explainWiring, measureIdiomRoleCoverage, planeScanExcludeDirs, registrationChain, registrationGraphSignature, registrationOrphansVerdict, registrationUnprovidedVerdict, } from '@shrkcrft/boundaries';
2
+ import { formatCoverage, formatEmptyRuleAdvice, ruleVerdictRecords, } from '@shrkcrft/core';
2
3
  import { refExists, resolveChangedFiles, resolveProjectConfig } from '@shrkcrft/inspector';
3
4
  import { createHash } from 'node:crypto';
4
5
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
5
6
  import * as nodePath from 'node:path';
6
7
  import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
8
+ import { PositionalMode } from "../dispatch/positional-mode.js";
7
9
  import { ExitCode } from "../exit-codes.js";
8
10
  import { asJson, header, kv } from "../output/format-output.js";
11
+ import { ALLOW_EMPTY_FLAG, allowEmptyValve } from "../gates/allow-empty.js";
12
+ import { buildGateEnvelope } from "../gates/gate-envelope.js";
13
+ import { scanNote } from "../gates/gate-rule-view.js";
14
+ import { planeVerdictForExit } from "../gates/plane-verdict.js";
15
+ import { settleVerdict } from "../gates/settle-verdict.js";
16
+ import { settleRegistrationGraph } from "../gates/registration-graph-verdict.js";
17
+ import { verdictLine } from "../gates/verdict-line.js";
18
+ import { unitStateNotes } from "../gates/unit-state-notes.js";
9
19
  const SITE_DISPLAY_CAP = 50;
20
+ /**
21
+ * The explained rule's verdict, SETTLED — through the same `settleVerdict` the
22
+ * gate envelope uses, over the engine's own coverage for the rule. An `errors`
23
+ * verdict proposes 1; anything else proposes 0 and the coverage vetoes it to 2
24
+ * on a shortfall. `check wiring --explain` returns this exit (it runs under a
25
+ * verdict verb, so its `$?` and trailer must not read 0 over a partial rule);
26
+ * the renderer prints its final line from it.
27
+ */
28
+ export function settleWiringExplain(report) {
29
+ // The rule's `expectEmpty` acceptance joins its coverage through THE fold
30
+ // (`ruleVerdictRecords`), as `check wiring`'s envelope folds it (round 13):
31
+ // printed at exit 0, never silent; one record when they are the same claim.
32
+ return settleVerdict(report.verdict === 'errors' ? ExitCode.Failure : ExitCode.VerifiedPass, ruleVerdictRecords(report.coverage, report.unitAcceptance));
33
+ }
10
34
  /**
11
35
  * Render an {@link IWiringExplain} to stdout. Shared by `wiring explain`,
12
- * `wiring test`, and `check wiring --explain` so all three speak the same
13
- * dialect. JSON emits the full payload; text mirrors `search tuning explain`
14
- * (header → loaded sets → per-site detail → the set-difference → verdict).
15
- * Always returns 0 explain is informational, the verdict is in the output.
36
+ * `wiring test`, `gates explain` and `check wiring --explain` so all four speak
37
+ * the same dialect. JSON emits the full payload; text mirrors `search tuning
38
+ * explain` (header → loaded sets → per-site detail → the set-difference →
39
+ * verdict). The status, coverage and final line come from the settled rule
40
+ * (see {@link settleWiringExplain}), so explain can never read clean over a
41
+ * rule `gates check` reports partial.
42
+ * Always returns 0 — explain is informational; a verdict verb that wants the
43
+ * rule's exit reads {@link settleWiringExplain}.
16
44
  */
17
45
  export function renderWiringExplain(report, wantJson) {
18
46
  if (wantJson) {
@@ -28,10 +56,13 @@ export function renderWiringExplain(report, wantJson) {
28
56
  process.stdout.write(kv('registeredMode', 'intersection (must be in EVERY sink)') + '\n');
29
57
  }
30
58
  process.stdout.write(kv('status', report.status) + '\n');
59
+ process.stdout.write(kv('coverage', formatCoverage(report.coverage)) + '\n');
31
60
  process.stdout.write(kv('declared', `${report.declared.distinctCount} distinct across ${report.declared.filesScanned} file(s)` +
32
- (report.declared.viaExtractor ? ` (via $use:${report.declared.viaExtractor})` : '')) + '\n');
61
+ (report.declared.viaExtractor ? ` (via $use:${report.declared.viaExtractor})` : '') +
62
+ scanNote(report.declared.scan, report.declared.blankedChars)) + '\n');
33
63
  process.stdout.write(kv('registered', `${report.registered.distinctCount} distinct across ${report.registered.filesScanned} file(s)` +
34
- (report.registered.viaExtractor ? ` (via $use:${report.registered.viaExtractor})` : '')) + '\n');
64
+ (report.registered.viaExtractor ? ` (via $use:${report.registered.viaExtractor})` : '') +
65
+ scanNote(report.registered.scan, report.registered.blankedChars)) + '\n');
35
66
  if (report.declared.error)
36
67
  process.stdout.write(` ! declared side: ${report.declared.error}\n`);
37
68
  if (report.registered.error) {
@@ -49,13 +80,23 @@ export function renderWiringExplain(report, wantJson) {
49
80
  }
50
81
  }
51
82
  if (report.registeredNotDeclared.length > 0) {
52
- process.stdout.write(`\nRegistered but NOT declared (parity, ${report.registeredNotDeclared.length}):\n`);
83
+ // One set, two meanings: a parity rule FAILS on each token; a subset rule
84
+ // never examined them, so they are a coverage shortfall (`partial`, exit 2)
85
+ // unless `registeredExtras` accepts them.
86
+ const parity = report.mode === 'parity';
87
+ process.stdout.write(parity
88
+ ? `\nRegistered but NOT declared (parity, ${report.registeredNotDeclared.length}):\n`
89
+ : `\nRegistered with NO declared site (subset — never examined by this rule, ${report.registeredNotDeclared.length}):\n`);
53
90
  for (const s of report.registeredNotDeclared.slice(0, SITE_DISPLAY_CAP)) {
54
- process.stdout.write(` ✗ ${s.token} (${s.file}:${s.line})\n`);
91
+ process.stdout.write(` ${parity ? '' : '?'} ${s.token} (${s.file}:${s.line})\n`);
55
92
  }
56
93
  if (report.registeredNotDeclared.length > SITE_DISPLAY_CAP) {
57
94
  process.stdout.write(` … (${report.registeredNotDeclared.length - SITE_DISPLAY_CAP} more)\n`);
58
95
  }
96
+ if (!parity) {
97
+ process.stdout.write(' → the declared selector may be incomplete. List known extras in `registeredExtras`,\n' +
98
+ " or set `mode: 'parity'` if the two sets should be equal.\n");
99
+ }
59
100
  }
60
101
  if (report.overlap.length > 0) {
61
102
  process.stdout.write(`\nPresent on BOTH sides (disjoint, ${report.overlap.length}):\n`);
@@ -76,11 +117,32 @@ export function renderWiringExplain(report, wantJson) {
76
117
  // A rule that checked NOTHING must never read like a clean pass.
77
118
  if (report.skipReason) {
78
119
  process.stdout.write(`\n! SKIPPED — ${report.skipReason}. A rule that matches nothing is a bug in the rule,\n` +
79
- ' not a pass. Fix the selector, or set `failOnEmpty: true` to make this a hard failure.\n');
120
+ ` not a pass. ${formatEmptyRuleAdvice({ fails: report.verdict === 'errors' })}.\n`);
80
121
  }
81
122
  for (const d of report.diagnostics)
82
123
  process.stdout.write(` ! ${d}\n`);
124
+ // THE shared unit-state block (round 13 review): a LOCAL expectEmpty marker
125
+ // whose target appeared, a dead glob of a rule that still matched and a pack
126
+ // marker (INFO) — `check wiring --explain`, `wiring explain` and `gates
127
+ // explain` said `Verdict: pass` over a went-live marker with no line for it.
128
+ process.stdout.write(unitStateNotes([
129
+ {
130
+ id: report.ruleId,
131
+ ...(report.unitLiveness !== undefined ? { unitLiveness: report.unitLiveness } : {}),
132
+ reportedEmpty: report.skipReason !== undefined,
133
+ },
134
+ ],
135
+ // An explain view names every unit state — the intended-empty ones too
136
+ // (round 13, K6), as the registry / registration explain views do.
137
+ { intendedEmpty: true }).text);
83
138
  process.stdout.write(`\nVerdict: ${report.verdict}\n`);
139
+ // The shortfall (or the acceptance that waived it) comes from the SETTLED
140
+ // rule: `NOT VERIFIED: …` under a not-verified verdict, `(also not verified:
141
+ // …)` under errors, `accepted by …` under a clean one — never silent.
142
+ const settled = settleWiringExplain(report);
143
+ const line = verdictLine(settled, '');
144
+ if (line)
145
+ process.stdout.write(`${line}\n`);
84
146
  return 0;
85
147
  }
86
148
  function writeSites(label, sites) {
@@ -144,7 +206,8 @@ async function wiringExplain(args) {
144
206
  process.stderr.write(`No wiring rule "${ruleId}". Configured rules: ${ids.length > 0 ? ids.join(', ') : '(none)'}\n`);
145
207
  return 2;
146
208
  }
147
- return renderWiringExplain(explainWiring(cwd, rule), wantJson);
209
+ // THE plane scan scope, so `wiring explain` ≡ `check wiring --explain` ≡ `gates explain`.
210
+ return renderWiringExplain(explainWiring(cwd, rule, { excludeDirs: planeScanExcludeDirs(cwd, loaded.value.sharkcraftDir) }), wantJson);
148
211
  }
149
212
  async function wiringTest(args) {
150
213
  const cwd = resolveCwd(args);
@@ -209,17 +272,50 @@ async function loadRegistrationGraph(cwd) {
209
272
  const idioms = loaded.value.config.registrationGraph ?? [];
210
273
  if (idioms.length === 0)
211
274
  return { ok: true, idioms: [] };
212
- const cacheKey = registrationCacheKey(cwd, idioms);
275
+ // THE plane scan scope, so these queries walk the tree `gates check`'s
276
+ // registration plane and finish's unprovided sub-gate walk.
277
+ const scan = { excludeDirs: planeScanExcludeDirs(cwd, loaded.value.sharkcraftDir) };
278
+ const cacheKey = registrationCacheKey(cwd, idioms, scan);
213
279
  const cachePath = nodePath.join(cwd, '.sharkcraft', 'cache', 'registration-graph.json');
214
280
  if (cacheKey) {
215
281
  const cached = readRegistrationCache(cachePath, cacheKey);
216
282
  if (cached)
217
- return { ok: true, idioms, graph: cached };
283
+ return { ok: true, idioms, graph: cached, excludeDirs: scan.excludeDirs };
218
284
  }
219
- const graph = buildRegistrationGraph(cwd, idioms);
285
+ const graph = buildRegistrationGraph(cwd, idioms, scan);
220
286
  if (cacheKey)
221
287
  writeRegistrationCache(cachePath, cacheKey, graph);
222
- return { ok: true, idioms, graph };
288
+ return { ok: true, idioms, graph, excludeDirs: scan.excludeDirs };
289
+ }
290
+ /**
291
+ * The gate envelope of an absence query that examined nothing in its changed
292
+ * scope (no changed file, or a scope that could not be resolved): 2, never a
293
+ * pass — the same answer the verb returns, carried in `--json` as `gate`.
294
+ */
295
+ function unexaminedScopeEnvelope(verb, root, reason) {
296
+ return buildGateEnvelope(verb, ExitCode.VerifiedPass, [], {
297
+ unit: 'changed files',
298
+ expected: 0,
299
+ examined: 0,
300
+ root,
301
+ reason,
302
+ });
303
+ }
304
+ /**
305
+ * The `--json` keys EVERY registration-query answer carries (round 13 review):
306
+ * the empty-changed-scope and scoped-error answers carried only `gate`, against
307
+ * the documented "always carries `coverage`, `exitCode`, `verdict`,
308
+ * `shortfalls`, `accepted` and `gate`" — the idiom answer's keys.
309
+ */
310
+ function scopeEnvelopeJson(gate) {
311
+ return {
312
+ coverage: [gate.coverage],
313
+ exitCode: gate.exit,
314
+ verdict: planeVerdictForExit(gate.exit),
315
+ shortfalls: gate.shortfalls,
316
+ accepted: gate.accepted,
317
+ gate,
318
+ };
223
319
  }
224
320
  /**
225
321
  * `<file-signature>:<idiom-hash>` — keyed on the mtime/size signature of the
@@ -228,9 +324,9 @@ async function loadRegistrationGraph(cwd) {
228
324
  * run, so the persisted cache can never return a stale wiring verdict. Undefined
229
325
  * only if signing itself throws (then the query rebuilds every time).
230
326
  */
231
- function registrationCacheKey(cwd, idioms) {
327
+ function registrationCacheKey(cwd, idioms, scan) {
232
328
  try {
233
- const signature = registrationGraphSignature(cwd, idioms);
329
+ const signature = registrationGraphSignature(cwd, idioms, scan);
234
330
  const idiomHash = createHash('sha1').update(JSON.stringify(idioms)).digest('hex').slice(0, 16);
235
331
  return `${signature}:${idiomHash}`;
236
332
  }
@@ -258,16 +354,50 @@ function writeRegistrationCache(cachePath, key, graph) {
258
354
  // best-effort cache; a write failure never breaks the query.
259
355
  }
260
356
  }
261
- function noIdiomsHint(wantJson) {
357
+ /**
358
+ * No `registrationGraph[]` declared: the query examined nothing, so it is NOT
359
+ * VERIFIED (2) — never "no unprovided tokens" at 0 — unless `--allow-empty`
360
+ * accepts the empty graph explicitly (printed). `wiring unprovided|orphans|
361
+ * chain` are registered verdict verbs; `check wiring` / `gates check` settle
362
+ * the same empty request to 2, so the planes agree. Settled through the shared
363
+ * gate envelope, which `--json` carries as `gate` (round 13, P4).
364
+ */
365
+ function noIdiomsHint(args, wantJson, verb) {
366
+ const settled = buildGateEnvelope(verb, ExitCode.VerifiedPass, [], {
367
+ unit: 'registration idioms',
368
+ expected: 0,
369
+ examined: 0,
370
+ root: resolveCwd(args),
371
+ reason: 'no registrationGraph[] declared',
372
+ ...allowEmptyValve(args, 0),
373
+ });
262
374
  if (wantJson) {
263
- process.stdout.write(asJson({ schema: 'sharkcraft.registration-graph/v1', idioms: [], tokens: [] }) + '\n');
264
- return 0;
375
+ process.stdout.write(asJson({
376
+ schema: 'sharkcraft.registration-graph/v1',
377
+ idioms: [],
378
+ tokens: [],
379
+ // The same keys as the idiom answer (round 13 review): `coverage` was
380
+ // missing here, against the documented "always carries".
381
+ coverage: [settled.coverage],
382
+ exitCode: settled.exit,
383
+ verdict: planeVerdictForExit(settled.exit),
384
+ shortfalls: settled.shortfalls,
385
+ accepted: settled.accepted,
386
+ gate: settled,
387
+ }) + '\n');
388
+ return settled.exit;
265
389
  }
266
390
  process.stdout.write(header('Registration graph'));
267
391
  process.stdout.write(' No registration idioms configured. Declare `registrationGraph[]` in\n' +
268
392
  ' sharkcraft.config.ts (declared/provided/consumed shapes) to model your DI\n' +
269
393
  ' wiring as a queryable graph — see docs/wiring.md.\n');
270
- return 0;
394
+ const line = verdictLine(settled, 'No registration idioms configured — accepted.');
395
+ if (line)
396
+ process.stdout.write(`\n${line}\n`);
397
+ if (settled.exit === ExitCode.NotVerified) {
398
+ process.stdout.write(`Pass --${ALLOW_EMPTY_FLAG} to accept an empty registration graph explicitly.\n`);
399
+ }
400
+ return settled.exit;
271
401
  }
272
402
  function siteLine(s) {
273
403
  return `${s.file}:${s.line} [${s.idiom}]`;
@@ -309,14 +439,18 @@ async function wiringChain(args) {
309
439
  }
310
440
  const loaded = await loadRegistrationGraph(cwd);
311
441
  if (!loaded.ok) {
312
- if (wantJson)
313
- process.stdout.write(asJson({ ok: false, error: loaded.error }) + '\n');
314
- else
442
+ // The registration graph is declared in the config that did not load: the
443
+ // query never STARTED — a usage error (3), never a `1` finding.
444
+ if (wantJson) {
445
+ process.stdout.write(asJson({ ok: false, error: loaded.error, exitCode: ExitCode.UsageError }) + '\n');
446
+ }
447
+ else {
315
448
  process.stderr.write(`Could not load config: ${loaded.error}\n`);
316
- return 1;
449
+ }
450
+ return ExitCode.UsageError;
317
451
  }
318
452
  if (!loaded.graph)
319
- return noIdiomsHint(wantJson);
453
+ return noIdiomsHint(args, wantJson, 'wiring chain');
320
454
  const chain = registrationChain(loaded.graph, token);
321
455
  if (!chain) {
322
456
  if (wantJson) {
@@ -327,9 +461,39 @@ async function wiringChain(args) {
327
461
  process.stdout.write(' Token not found in the registration graph.\n');
328
462
  return 1;
329
463
  }
464
+ // Round 13 review: settled like `wiring unprovided|orphans` (P4) — every
465
+ // idiom the token's sites belong to folds its ROLE record and expectEmpty
466
+ // acceptance from THE role authority (`measureIdiomRoleCoverage`) through
467
+ // the shared envelope. A chain over a dead declared role printed "declared
468
+ // (0)" and then "✓ declared → provided → consumed." at exit 0 while its
469
+ // siblings said NOT VERIFIED; an acceptance was printed nowhere.
470
+ const involved = new Set([...chain.declared, ...chain.provided, ...chain.consumed].map((s) => s.idiom));
471
+ const matched = loaded.idioms.filter((i) => involved.has(i.name));
472
+ const idioms = matched.length > 0 ? matched : loaded.idioms;
473
+ const roles = measureIdiomRoleCoverage(cwd, idioms, loaded.excludeDirs ?? []);
474
+ const gate = buildGateEnvelope('wiring chain', ExitCode.VerifiedPass, roles.map((r) => ({
475
+ id: r.idiom,
476
+ type: 'registration',
477
+ status: 'passed',
478
+ severity: 'warning',
479
+ counts: {},
480
+ violations: [],
481
+ coverage: r.coverage,
482
+ ...(r.unitAcceptance !== undefined ? { unitAcceptance: r.unitAcceptance } : {}),
483
+ })), { unit: 'registration idioms', expected: idioms.length, examined: idioms.length });
484
+ const unprovided = !chain.isProvided && (chain.isDeclared || chain.isConsumed);
485
+ const orphan = chain.isProvided && !chain.isConsumed;
330
486
  if (wantJson) {
331
- process.stdout.write(asJson(chain) + '\n');
332
- return 0;
487
+ process.stdout.write(asJson({
488
+ ...chain,
489
+ coverage: roles.map((r) => r.coverage),
490
+ exitCode: gate.exit,
491
+ verdict: planeVerdictForExit(gate.exit),
492
+ shortfalls: gate.shortfalls,
493
+ accepted: gate.accepted,
494
+ gate,
495
+ }) + '\n');
496
+ return gate.exit;
333
497
  }
334
498
  process.stdout.write(header(`Wiring chain: ${token}`));
335
499
  const section = (label, sites) => {
@@ -342,34 +506,48 @@ async function wiringChain(args) {
342
506
  section('declared', chain.declared);
343
507
  section('provided', chain.provided);
344
508
  section('consumed', chain.consumed);
345
- if (!chain.isProvided && (chain.isDeclared || chain.isConsumed)) {
509
+ if (unprovided) {
346
510
  process.stdout.write('\n ⚠ UNPROVIDED — declared/injected but never provided (silent at runtime).\n');
347
511
  }
348
- else if (chain.isProvided && !chain.isConsumed) {
512
+ else if (orphan) {
349
513
  process.stdout.write('\n ⚠ ORPHAN — provided but nothing consumes it.\n');
350
514
  }
351
- else {
352
- process.stdout.write('\n ✓ declared provided consumed.\n');
353
- }
354
- return 0;
515
+ // The ✓ only from the SETTLED verdict — a dead role is NOT VERIFIED (2), an
516
+ // acceptance is printed under the clean line.
517
+ const line = verdictLine(gate, unprovided || orphan ? '' : ' ✓ declared → provided → consumed.');
518
+ if (line)
519
+ process.stdout.write(`\n${line}\n`);
520
+ return gate.exit;
355
521
  }
356
522
  async function wiringUnprovided(args) {
357
523
  const cwd = resolveCwd(args);
358
524
  const wantJson = flagBool(args, 'json');
359
525
  const loaded = await loadRegistrationGraph(cwd);
360
526
  if (!loaded.ok) {
361
- if (wantJson)
362
- process.stdout.write(asJson({ ok: false, error: loaded.error }) + '\n');
363
- else
527
+ // The registration graph is declared in the config that did not load: the
528
+ // query never STARTED — a usage error (3), never a `1` finding.
529
+ if (wantJson) {
530
+ process.stdout.write(asJson({ ok: false, error: loaded.error, exitCode: ExitCode.UsageError }) + '\n');
531
+ }
532
+ else {
364
533
  process.stderr.write(`Could not load config: ${loaded.error}\n`);
365
- return 1;
534
+ }
535
+ return ExitCode.UsageError;
366
536
  }
367
537
  if (!loaded.graph)
368
- return noIdiomsHint(wantJson);
538
+ return noIdiomsHint(args, wantJson, 'wiring unprovided');
369
539
  const scoped = changedScopeFor(args, cwd);
370
540
  if (scoped.error) {
371
541
  if (wantJson) {
372
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: true, error: scoped.error, verified: false }) + '\n');
542
+ const gate = unexaminedScopeEnvelope('wiring unprovided', cwd, scoped.error);
543
+ process.stdout.write(asJson({
544
+ schema: loaded.graph.schema,
545
+ scoped: true,
546
+ error: scoped.error,
547
+ verified: false,
548
+ // The documented keys every answer carries (round 13 review).
549
+ ...scopeEnvelopeJson(gate),
550
+ }) + '\n');
373
551
  }
374
552
  else {
375
553
  process.stderr.write(`error: ${scoped.error}\n`);
@@ -381,50 +559,95 @@ async function wiringUnprovided(args) {
381
559
  // a green `0` that reads as "no unprovided tokens" (a25 §1.1 exit contract).
382
560
  if (scope && scope.length === 0) {
383
561
  if (wantJson) {
384
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: true, total: 0, unprovided: [], verified: false }) + '\n');
562
+ const gate = unexaminedScopeEnvelope('wiring unprovided', cwd, 'no file in the changed scope');
563
+ process.stdout.write(asJson({
564
+ schema: loaded.graph.schema,
565
+ scoped: true,
566
+ total: 0,
567
+ unprovided: [],
568
+ verified: false,
569
+ ...scopeEnvelopeJson(gate),
570
+ }) + '\n');
385
571
  return ExitCode.NotVerified;
386
572
  }
387
573
  process.stdout.write(header('Unprovided tokens (declared/injected but never provided)'));
388
574
  process.stdout.write(' – No files in the changed scope — nothing to verify (not verified).\n');
389
575
  return ExitCode.NotVerified;
390
576
  }
391
- const unprovided = registrationUnprovided(loaded.graph, scope);
577
+ // Settled against what the graph READ and what every idiom's ROLES examined,
578
+ // through the one boundaries helper finish and MCP use. An idiom file over
579
+ // the read cap holds sites the graph never saw: a token whose provider could
580
+ // sit there is `unproven`, not a finding (the registry plane's rule: only a
581
+ // positive finding survives an incomplete read), and a clean answer over it
582
+ // is NOT VERIFIED (2). Round 13 (P4): so is a clean answer over a role whose
583
+ // globs matched no file — THE role authority `gates check` reads.
584
+ const roles = measureIdiomRoleCoverage(cwd, loaded.idioms, loaded.excludeDirs ?? []);
585
+ const verdict = registrationUnprovidedVerdict(loaded.graph, loaded.idioms, roles, scope);
586
+ const unprovided = verdict.findings;
587
+ const settled = settleRegistrationGraph({
588
+ verb: 'wiring unprovided',
589
+ verdict,
590
+ proposed: unprovided.length > 0 ? ExitCode.Failure : ExitCode.VerifiedPass,
591
+ clean: ` ✓ Every declared/injected token${scope ? ' in the changed scope' : ''} has a provider. ✓`,
592
+ subject: 'unprovided',
593
+ idioms: loaded.idioms.length,
594
+ });
392
595
  if (wantJson) {
393
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: scope !== undefined, total: unprovided.length, unprovided }) + '\n');
394
- return unprovided.length > 0 ? ExitCode.Failure : ExitCode.VerifiedPass;
596
+ process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: scope !== undefined, total: unprovided.length, unprovided, ...settled.json }) + '\n');
597
+ return settled.exit;
395
598
  }
396
599
  process.stdout.write(header('Unprovided tokens (declared/injected but never provided)'));
397
600
  if (scope)
398
601
  process.stdout.write(kv('scope', `changed-only (${scope.length} file(s))`) + '\n');
399
- if (unprovided.length === 0) {
400
- process.stdout.write(` ✓ Every declared/injected token${scope ? ' in the changed scope' : ''} has a provider. ✓\n`);
401
- return ExitCode.VerifiedPass;
602
+ if (unprovided.length > 0) {
603
+ process.stdout.write(` ${unprovided.length} token(s) resolve to nothing at runtime:\n`);
604
+ for (const u of unprovided) {
605
+ const site = u.declared[0] ?? u.consumed[0];
606
+ const where = site ? ` (${siteLine(site)})` : '';
607
+ process.stdout.write(` ✗ ${u.token}${where}\n`);
608
+ }
402
609
  }
403
- process.stdout.write(` ${unprovided.length} token(s) resolve to nothing at runtime:\n`);
404
- for (const u of unprovided) {
405
- const site = u.declared[0] ?? u.consumed[0];
406
- const where = site ? ` (${siteLine(site)})` : '';
407
- process.stdout.write(` ✗ ${u.token}${where}\n`);
610
+ if (verdict.unproven.length > 0) {
611
+ process.stdout.write(` ${verdict.unproven.length} token(s) have no provider among the files read — NOT VERIFIED ` +
612
+ '(a provider may sit in a file the reader did not read):\n');
613
+ for (const u of verdict.unproven) {
614
+ const site = u.declared[0] ?? u.consumed[0];
615
+ process.stdout.write(` ? ${u.token}${site ? ` (${siteLine(site)})` : ''}\n`);
616
+ }
408
617
  }
409
- return ExitCode.Failure;
618
+ if (settled.line)
619
+ process.stdout.write(`${settled.line}\n`);
620
+ return settled.exit;
410
621
  }
411
622
  async function wiringOrphans(args) {
412
623
  const cwd = resolveCwd(args);
413
624
  const wantJson = flagBool(args, 'json');
414
625
  const loaded = await loadRegistrationGraph(cwd);
415
626
  if (!loaded.ok) {
416
- if (wantJson)
417
- process.stdout.write(asJson({ ok: false, error: loaded.error }) + '\n');
418
- else
627
+ // The registration graph is declared in the config that did not load: the
628
+ // query never STARTED — a usage error (3), never a `1` finding.
629
+ if (wantJson) {
630
+ process.stdout.write(asJson({ ok: false, error: loaded.error, exitCode: ExitCode.UsageError }) + '\n');
631
+ }
632
+ else {
419
633
  process.stderr.write(`Could not load config: ${loaded.error}\n`);
420
- return 1;
634
+ }
635
+ return ExitCode.UsageError;
421
636
  }
422
637
  if (!loaded.graph)
423
- return noIdiomsHint(wantJson);
638
+ return noIdiomsHint(args, wantJson, 'wiring orphans');
424
639
  const scoped = changedScopeFor(args, cwd);
425
640
  if (scoped.error) {
426
641
  if (wantJson) {
427
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: true, error: scoped.error, verified: false }) + '\n');
642
+ const gate = unexaminedScopeEnvelope('wiring orphans', cwd, scoped.error);
643
+ process.stdout.write(asJson({
644
+ schema: loaded.graph.schema,
645
+ scoped: true,
646
+ error: scoped.error,
647
+ verified: false,
648
+ // The documented keys every answer carries (round 13 review).
649
+ ...scopeEnvelopeJson(gate),
650
+ }) + '\n');
428
651
  }
429
652
  else {
430
653
  process.stderr.write(`error: ${scoped.error}\n`);
@@ -434,38 +657,102 @@ async function wiringOrphans(args) {
434
657
  const scope = scoped.files;
435
658
  if (scope && scope.length === 0) {
436
659
  if (wantJson) {
437
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: true, total: 0, orphans: [], verified: false }) + '\n');
660
+ const gate = unexaminedScopeEnvelope('wiring orphans', cwd, 'no file in the changed scope');
661
+ process.stdout.write(asJson({
662
+ schema: loaded.graph.schema,
663
+ scoped: true,
664
+ total: 0,
665
+ orphans: [],
666
+ verified: false,
667
+ ...scopeEnvelopeJson(gate),
668
+ }) + '\n');
438
669
  return ExitCode.NotVerified;
439
670
  }
440
671
  process.stdout.write(header('Orphan registrations (provided but nothing consumes)'));
441
672
  process.stdout.write(' – No files in the changed scope — nothing to verify (not verified).\n');
442
673
  return ExitCode.NotVerified;
443
674
  }
444
- const orphans = registrationOrphans(loaded.graph, scope);
675
+ // Orphans never fail, but "every provider is consumed" over an idiom file
676
+ // the reader could not read is NOT VERIFIED (2), settled like `unprovided`
677
+ // through the same boundaries helper. A token whose consumer could sit in
678
+ // such a file is `unproven`, never listed as an orphan. Round 13 (P4): so is
679
+ // the answer over a role whose globs matched no file (THE role authority).
680
+ const roles = measureIdiomRoleCoverage(cwd, loaded.idioms, loaded.excludeDirs ?? []);
681
+ const verdict = registrationOrphansVerdict(loaded.graph, loaded.idioms, roles, scope);
682
+ const orphans = verdict.findings;
683
+ const settled = settleRegistrationGraph({
684
+ verb: 'wiring orphans',
685
+ verdict,
686
+ proposed: ExitCode.VerifiedPass,
687
+ clean: orphans.length === 0
688
+ ? ` ✓ Every provided token${scope ? ' in the changed scope' : ''} is consumed somewhere. ✓`
689
+ : '',
690
+ subject: 'orphans',
691
+ idioms: loaded.idioms.length,
692
+ });
445
693
  if (wantJson) {
446
- process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: scope !== undefined, total: orphans.length, orphans }) + '\n');
447
- return 0;
694
+ process.stdout.write(asJson({ schema: loaded.graph.schema, scoped: scope !== undefined, total: orphans.length, orphans, ...settled.json }) + '\n');
695
+ return settled.exit;
448
696
  }
449
697
  process.stdout.write(header('Orphan registrations (provided but nothing consumes)'));
450
698
  if (scope)
451
699
  process.stdout.write(kv('scope', `changed-only (${scope.length} file(s))`) + '\n');
452
- if (orphans.length === 0) {
453
- process.stdout.write(` ✓ Every provided token${scope ? ' in the changed scope' : ''} is consumed somewhere. ✓\n`);
454
- return 0;
700
+ if (orphans.length > 0) {
701
+ process.stdout.write(` ${orphans.length} provided token(s) nothing injects:\n`);
702
+ for (const o of orphans) {
703
+ const site = o.provided[0];
704
+ process.stdout.write(` • ${o.token}${site ? ` (${siteLine(site)})` : ''}\n`);
705
+ }
455
706
  }
456
- process.stdout.write(` ${orphans.length} provided token(s) nothing injects:\n`);
457
- for (const o of orphans) {
458
- const site = o.provided[0];
459
- process.stdout.write(` • ${o.token}${site ? ` (${siteLine(site)})` : ''}\n`);
707
+ if (verdict.unproven.length > 0) {
708
+ process.stdout.write(` ${verdict.unproven.length} provided token(s) have no consumer among the files read — NOT VERIFIED ` +
709
+ '(a consumer may sit in a file the reader did not read):\n');
710
+ for (const o of verdict.unproven) {
711
+ const site = o.provided[0];
712
+ process.stdout.write(` ? ${o.token}${site ? ` (${siteLine(site)})` : ''}\n`);
713
+ }
460
714
  }
461
- return 0;
715
+ if (settled.line)
716
+ process.stdout.write(`${settled.line}\n`);
717
+ return settled.exit;
462
718
  }
463
- const WIRING_USAGE = 'shrk wiring explain <ruleId> | test <candidate.json|inline> | chain <token> | unprovided | orphans [--changed-only | --base <ref>] [--json]';
719
+ const WIRING_USAGE = 'shrk wiring explain <ruleId> | test <candidate.json|inline> | chain <token> | unprovided | orphans [--changed-only | --base <ref>] [--allow-empty] [--json]';
464
720
  export const wiringCommand = {
465
721
  name: 'wiring',
722
+ positionals: PositionalMode.None,
723
+ subverbs: [
724
+ {
725
+ name: 'explain',
726
+ description: 'Dry-run one wiring rule: the declared / registered sets it extracts.',
727
+ usage: 'shrk wiring explain <ruleId> [--json]',
728
+ positionals: PositionalMode.Free,
729
+ },
730
+ {
731
+ name: 'test',
732
+ description: 'Dry-run a candidate wiring rule (a file or inline JSON) without touching config.',
733
+ usage: 'shrk wiring test <candidate.json | inline-json> [--json]',
734
+ positionals: PositionalMode.Path,
735
+ },
736
+ {
737
+ name: 'chain',
738
+ description: 'Trace one token declared → provided → consumed through the registration graph.',
739
+ usage: 'shrk wiring chain <token> [--allow-empty] [--json]',
740
+ positionals: PositionalMode.Free,
741
+ },
742
+ {
743
+ name: 'unprovided',
744
+ description: 'Tokens consumed but never provided — the silent-at-runtime DI bug.',
745
+ usage: 'shrk wiring unprovided [--changed-only | --base <ref>] [--allow-empty] [--json]',
746
+ },
747
+ {
748
+ name: 'orphans',
749
+ description: 'Tokens provided that nothing injects.',
750
+ usage: 'shrk wiring orphans [--changed-only | --base <ref>] [--allow-empty] [--json]',
751
+ },
752
+ ],
466
753
  description: 'Author-loop + runtime-wiring queries (no config write): `explain <ruleId>` / `test <candidate>` show what a wiring rule extracts; `chain <token>` / `unprovided` / `orphans` query the DI/registration graph (declared→provided→consumed) for the silent-at-runtime bugs imports can\'t see. `unprovided` / `orphans` accept `--changed-only` (working tree) or `--base <ref>` to scope the verdict to the changeset.',
467
754
  usage: WIRING_USAGE,
468
- booleanFlags: new Set(['json', 'changed-only']),
755
+ booleanFlags: new Set(['json', 'changed-only', ALLOW_EMPTY_FLAG]),
469
756
  async run(args) {
470
757
  const sub = args.positional[0];
471
758
  if (sub === 'explain')
@@ -1,8 +1,8 @@
1
1
  import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
2
  import * as nodePath from 'node:path';
3
- import { runArchCheck } from '@shrkcrft/architecture-guard';
3
+ import { archStoreMissing, runArchCheck } from '@shrkcrft/architecture-guard';
4
4
  import { FrameworkQueryApi } from '@shrkcrft/framework-scanners';
5
- import { detectGraphFreshness, GraphQueryApi, GraphStore } from '@shrkcrft/graph';
5
+ import { detectGraphFreshness, GraphQueryApi, GraphStore, graphFreshnessBehind } from '@shrkcrft/graph';
6
6
  import { findResumePoint, } from '@shrkcrft/migrate';
7
7
  import { QualityGateReportStore, runQualityGates } from '@shrkcrft/quality-gates';
8
8
  import { BridgeStore } from '@shrkcrft/rule-graph';
@@ -114,7 +114,7 @@ function readGraphSection(store, projectRoot) {
114
114
  // `corrupt` (store self-integrity) outranks `stale` (disk drift): a digest
115
115
  // failure means the counts themselves can't be trusted.
116
116
  const fresh = detectGraphFreshness(projectRoot);
117
- const behind = fresh.modified.length + fresh.added.length + fresh.deleted.length;
117
+ const behind = graphFreshnessBehind(fresh);
118
118
  const verify = store.verifyDigest();
119
119
  const state = !verify.ok ? 'corrupt' : behind > 0 ? 'stale' : 'fresh';
120
120
  return {
@@ -165,7 +165,7 @@ function readArchSection(projectRoot) {
165
165
  void archPath;
166
166
  const report = runArchCheck({ projectRoot });
167
167
  return {
168
- available: report.diagnostics.length === 0 || !report.diagnostics.some((d) => d.includes('code-graph store missing')),
168
+ available: !archStoreMissing(report),
169
169
  errors: report.countsBySeverity.error,
170
170
  warnings: report.countsBySeverity.warning,
171
171
  violationsByKind: report.countsByKind,