@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
@@ -10,63 +10,42 @@
10
10
  * shrk registry <name> where <id> [--json] # declaration (+ consumer) sites
11
11
  * shrk registry <name> duplicates [--json] # ids declared in more than one place
12
12
  *
13
+ * An inventory that matched 0 ids answers NO query: `list` / `exists` / `where`
14
+ * / `duplicates` all exit 2 (not verified) — 1 when the registry sets
15
+ * `failOnEmpty` — whatever guard flag was passed.
16
+ *
13
17
  * `<name>` resolves a `registries[]` declaration in sharkcraft.config.ts — one
14
18
  * deterministic multi-root scan that answers "is this id taken / where is it"
15
19
  * without an agent re-running a fragile grep.
16
20
  */
17
- import { buildRegistryLifecycleReport, renderRegistryLifecycleReportText, resolveChangedFiles, resolveProjectConfig, } from '@shrkcrft/inspector';
18
- import { scanRegistry, registryDuplicates, registryExists, registryWhere, } from '@shrkcrft/boundaries';
19
- import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
21
+ import { resolveProjectConfig } from '@shrkcrft/inspector';
22
+ import { REGISTRY_LIFECYCLE_FLAGS_USAGE, runRegistryLifecycle } from "./registry-lifecycle-run.js";
23
+ import { ALLOW_EMPTY_FLAG } from "../gates/allow-empty.js";
24
+ import { planeScanExcludeDirs, scanRegistry, registryDuplicates, registryExists, registryWhere, } from '@shrkcrft/boundaries';
25
+ import { failsWhenEmpty, RuleEmptiness, settleRuleEmptiness, } from '@shrkcrft/core';
26
+ import { registryLiveness } from "../gates/registry-liveness.js";
27
+ import { flagBool, resolveCwd, } from "../command-registry.js";
28
+ import { PositionalMode } from "../dispatch/positional-mode.js";
20
29
  import { ExitCode } from "../exit-codes.js";
21
30
  import { asJson } from "../output/format-output.js";
31
+ import { settleVerdict } from "../gates/settle-verdict.js";
32
+ import { verdictLine } from "../gates/verdict-line.js";
33
+ import { qualifyCleanForUnits } from "../gates/qualify-clean-for-units.js";
34
+ import { unitStateNotes } from "../gates/unit-state-notes.js";
35
+ import { answerIncompleteInventory } from "../gates/incomplete-registry-inventory.js";
36
+ import { seamRejectedRules } from "../gates/seam-rejected-rules.js";
22
37
  import { resolveRegistryNoun } from "./registry-resolve.js";
23
38
  /** The inventory verbs, used to detect (and forgive) a verb-first invocation. */
24
39
  const INVENTORY_VERBS = new Set(['list', 'exists', 'where', 'duplicates']);
25
40
  export const registryLifecycleCommand = {
26
41
  name: 'lifecycle',
27
42
  description: 'Scan the workspace for register/remove symmetry. Read-only.',
28
- usage: 'shrk registry lifecycle [--scope <dir>] [--changed-only] [--since <ref>] [--json]',
29
- async run(args) {
30
- const cwd = resolveCwd(args);
31
- const scope = flagString(args, 'scope');
32
- const changedOnly = flagBool(args, 'changed-only');
33
- const since = flagString(args, 'since');
34
- let files;
35
- if (changedOnly || since) {
36
- const changed = resolveChangedFiles({
37
- projectRoot: cwd,
38
- ...(since ? { since } : {}),
39
- ...(changedOnly && !since ? { includeWorktree: true } : {}),
40
- });
41
- files = changed.files;
42
- }
43
- // Full-tree walk honors the project's skipDirs override.
44
- let skipDirs;
45
- if (files === undefined) {
46
- const loaded = await resolveProjectConfig(cwd);
47
- if (loaded.ok)
48
- skipDirs = loaded.value.config.registryLifecycle?.skipDirs;
49
- }
50
- const report = buildRegistryLifecycleReport({
51
- projectRoot: cwd,
52
- ...(files !== undefined ? { files } : {}),
53
- ...(scope ? { scope } : {}),
54
- ...(skipDirs ? { skipDirs } : {}),
55
- });
56
- // Honest exit-code contract (a25 §1 / §2.5): a wedged/timed-out scan OR a
57
- // scope with zero registrations to check is NOT verified (`2`), never a
58
- // green `0` an agent's `&& next` would march past.
59
- const exit = report.timedOut || report.registersFound === 0
60
- ? ExitCode.NotVerified
61
- : report.missingRemovers.length === 0
62
- ? ExitCode.VerifiedPass
63
- : ExitCode.Failure;
64
- if (flagBool(args, 'json')) {
65
- process.stdout.write(asJson(report) + '\n');
66
- return exit;
67
- }
68
- process.stdout.write(renderRegistryLifecycleReportText(report));
69
- return exit;
43
+ usage: `shrk registry lifecycle ${REGISTRY_LIFECYCLE_FLAGS_USAGE}`,
44
+ booleanFlags: new Set(['json', 'changed-only', ALLOW_EMPTY_FLAG]),
45
+ // The same body as `check registry-lifecycle` (registry-lifecycle-run.ts):
46
+ // one settled verdict, not a second copy of the exit derivation.
47
+ run(args) {
48
+ return runRegistryLifecycle(args, 'registry lifecycle');
70
49
  },
71
50
  };
72
51
  async function loadRegistries(cwd) {
@@ -77,11 +56,100 @@ async function loadRegistries(cwd) {
77
56
  ok: true,
78
57
  registries: loaded.value.config.registries ?? [],
79
58
  planeDiagnostics: loaded.value.planeDiagnostics,
59
+ excludeDirs: planeScanExcludeDirs(cwd, loaded.value.sharkcraftDir),
60
+ rejected: seamRejectedRules(loaded.value, ['registry']),
80
61
  };
81
62
  }
82
63
  function findRegistry(registries, name) {
83
64
  return registries.find((r) => r.name === name);
84
65
  }
66
+ /** Why an empty inventory proves nothing, in the words every inventory verb prints. */
67
+ const EMPTY_INVENTORY_REASON = 'the source selector matched nothing — it is probably stale (see `shrk gates coverage`)';
68
+ /**
69
+ * THE rule-emptiness settle of an inventory that matched 0 ids (round 13,
70
+ * `settleRuleEmptiness`), over the registry's glob liveness
71
+ * (`registryLiveness`, the one `gates check` reads) and THE failOnEmpty
72
+ * authority (`failsWhenEmpty`; a registry is warning-severity, so an explicit
73
+ * `failOnEmpty: true` is what makes it block). Every source inclusion glob
74
+ * marked `expectEmpty` and no source file matched → an inventory over a
75
+ * planned directory: INTENDED-empty, so a membership question has a real
76
+ * answer (nothing is registered yet) and the acceptance is printed.
77
+ */
78
+ function settleInventoryEmptiness(decl, inventory, liveness) {
79
+ return settleRuleEmptiness({
80
+ subject: decl.name,
81
+ unitLabel: 'ids',
82
+ filesMatched: inventory.readScope.read,
83
+ unitsMatched: inventory.entries.length,
84
+ unread: false,
85
+ liveness,
86
+ primaryLists: ['source.files'],
87
+ failOnEmpty: failsWhenEmpty({
88
+ ...(decl.failOnEmpty !== undefined ? { failOnEmpty: decl.failOnEmpty } : {}),
89
+ severity: 'warning',
90
+ }),
91
+ noFilesReason: EMPTY_INVENTORY_REASON,
92
+ noUnitsReason: EMPTY_INVENTORY_REASON,
93
+ });
94
+ }
95
+ /**
96
+ * The printed `expectEmpty` acceptance of the registry's glob units — settle
97
+ * record B of THE settle `gates check` reads (`registryLiveness`), from the
98
+ * settled verdict, never hand-built. It rides on every exit-0 answer (round 13
99
+ * review): an inventory over a planned directory (where it IS the inventory's
100
+ * emptiness record), AND a live inventory with a planned sibling glob — which
101
+ * `gates check` accepted in print while every registry verb was silent.
102
+ */
103
+ function acceptedUnitLines(liveness) {
104
+ if (liveness?.acceptance === undefined)
105
+ return [];
106
+ return settleVerdict(ExitCode.VerifiedPass, [liveness.acceptance]).accepted;
107
+ }
108
+ /**
109
+ * Answer a query over an inventory that matched NOTHING.
110
+ *
111
+ * An empty inventory cannot answer a membership question: `exists X` would say
112
+ * "no" (1) for an id that IS declared — only the glob went stale — and `exists
113
+ * X --fail-if-taken` would say "free" (0), so the documented duplicate guard
114
+ * `exists X --fail-if-taken && <author>` marched on over a scan that saw
115
+ * nothing. Every inventory verb therefore answers the empty inventory itself,
116
+ * whatever guard flag was passed: not verified (2), or a failure (1) when the
117
+ * registry sets `failOnEmpty`. Settled through the one coverage guard, so the
118
+ * exit and the printed verdict cannot disagree.
119
+ */
120
+ function answerEmptyInventory(inventory, emptiness, json, payload, diagnostics = []) {
121
+ const failOnEmpty = emptiness.fails;
122
+ const settled = settleVerdict(failOnEmpty ? ExitCode.Failure : ExitCode.VerifiedPass, [
123
+ {
124
+ unit: 'ids',
125
+ expected: 0,
126
+ examined: 0,
127
+ subject: `registry "${inventory.name}"`,
128
+ reason: emptiness.skipReason ?? EMPTY_INVENTORY_REASON,
129
+ },
130
+ ]);
131
+ if (json) {
132
+ process.stdout.write(asJson({
133
+ ...payload,
134
+ verified: false,
135
+ exitCode: settled.exit,
136
+ verdict: settled.verdict,
137
+ shortfalls: settled.shortfalls,
138
+ }) + '\n');
139
+ return settled.exit;
140
+ }
141
+ process.stdout.write(`Registry "${inventory.name}" matched 0 ids — nothing was checked. This is NOT a pass;\n` +
142
+ ' the source selector is probably stale (see `shrk gates coverage`).\n');
143
+ for (const d of diagnostics)
144
+ process.stdout.write(` ! ${d}\n`);
145
+ if (failOnEmpty) {
146
+ process.stdout.write(' The registry sets `failOnEmpty: true`, so an empty inventory is a failure.\n');
147
+ }
148
+ const line = verdictLine(settled, '');
149
+ if (line)
150
+ process.stdout.write(`${line}\n`);
151
+ return settled.exit;
152
+ }
85
153
  /** Run a `list | exists | where` query against a declared registry. */
86
154
  async function runRegistryInventory(args, name) {
87
155
  const cwd = resolveCwd(args);
@@ -90,13 +158,32 @@ async function runRegistryInventory(args, name) {
90
158
  const id = args.positional[2];
91
159
  const loaded = await loadRegistries(cwd);
92
160
  if (!loaded.ok) {
93
- if (json)
94
- process.stdout.write(asJson({ error: loaded.message }) + '\n');
95
- else
161
+ // The registry is declared in the config that did not load: the query never
162
+ // STARTED — a usage error (3), never the `1` that reads "missing" / "taken".
163
+ if (json) {
164
+ process.stdout.write(asJson({ error: loaded.message, exitCode: ExitCode.UsageError, verdict: 'usage-error' }) + '\n');
165
+ }
166
+ else {
96
167
  process.stderr.write(`Could not load config: ${loaded.message}\n Run \`shrk doctor\` for details.\n`);
97
- return 1;
168
+ }
169
+ return ExitCode.UsageError;
98
170
  }
99
171
  const decl = findRegistry(loaded.registries, name);
172
+ const rejectedDecl = decl ? undefined : loaded.rejected.find((r) => r.id === name);
173
+ if (rejectedDecl) {
174
+ // Declared by a pack, refused by the merge seam: the inventory was never
175
+ // scanned, so no query over it can be answered — a failure (1), never the
176
+ // "unknown registry" usage error (round 12 review, R12-X1).
177
+ const message = rejectedDecl.error ?? 'failed validation';
178
+ if (json) {
179
+ process.stdout.write(asJson({ name, rejected: true, error: message, exitCode: ExitCode.Failure, verdict: 'fail' }) + '\n');
180
+ }
181
+ else {
182
+ process.stdout.write(`Registry "${name}" was contributed by a pack and REJECTED — nothing was scanned, and that is a failure:\n` +
183
+ ` ${message}\n \`shrk packs contributions\` names every rejected entry.\n`);
184
+ }
185
+ return ExitCode.Failure;
186
+ }
100
187
  if (!decl) {
101
188
  const names = loaded.registries.map((r) => r.name);
102
189
  const avail = names.length > 0 ? `Declared registries: ${names.join(', ')}.` : 'No registries declared in sharkcraft.config.ts `registries[]`.';
@@ -115,13 +202,49 @@ async function runRegistryInventory(args, name) {
115
202
  }
116
203
  return ExitCode.UsageError;
117
204
  }
118
- const inventory = scanRegistry(cwd, decl);
205
+ const inventory = scanRegistry(cwd, decl, { excludeDirs: loaded.excludeDirs });
206
+ // A source file the reader could not read (over the read cap): only a
207
+ // positive finding is verified; any other answer settles NOT VERIFIED (2).
208
+ const incomplete = answerIncompleteInventory(inventory, decl, action, id, json);
209
+ if (incomplete !== undefined)
210
+ return incomplete;
211
+ // An inventory that matched 0 ids is decided by THE rule-emptiness settle
212
+ // (round 13). STALE (a dead or unmarked selector): no query over it can be
213
+ // answered — 2, or 1 under failOnEmpty. INTENDED-empty (every source glob
214
+ // marked `expectEmpty`, no source file matched): nothing is registered yet,
215
+ // so every verb answers as over any inventory, and prints the acceptance.
216
+ //
217
+ // The registry's glob units are settled with their `expectEmpty` markers —
218
+ // THE settle `gates check` reads (`registryLiveness`) — when a unit is marked
219
+ // (its acceptance rides on every exit-0 answer, round 13 review) or the
220
+ // inventory is empty (what the empty inventory is decided from).
221
+ const marked = [decl.source, decl.consumer].some((s) => (s?.expectEmptyUnits?.length ?? 0) > 0);
222
+ const liveness = marked || inventory.entries.length === 0 ? registryLiveness(cwd, decl, loaded.excludeDirs) : undefined;
223
+ const emptiness = inventory.entries.length === 0 && liveness !== undefined
224
+ ? settleInventoryEmptiness(decl, inventory, liveness)
225
+ : undefined;
226
+ const stale = emptiness !== undefined && emptiness.state !== RuleEmptiness.IntendedEmpty ? emptiness : undefined;
227
+ const accepted = acceptedUnitLines(liveness);
228
+ const acceptedField = accepted.length > 0 ? { accepted } : {};
229
+ const writeAccepted = () => {
230
+ for (const a of accepted)
231
+ process.stdout.write(` ${a}\n`);
232
+ };
119
233
  if (action === 'list' || action === undefined) {
120
234
  // Fold pack-plane merge notes (missing/invalid pack registry files, dropped
121
235
  // collisions) into the inventory's own scan diagnostics.
122
236
  const diagnostics = [...inventory.diagnostics, ...loaded.planeDiagnostics];
237
+ if (stale !== undefined) {
238
+ return answerEmptyInventory(inventory, stale, json, { name: inventory.name, count: 0, ids: [], diagnostics }, diagnostics);
239
+ }
123
240
  if (json) {
124
- process.stdout.write(asJson({ name: inventory.name, count: inventory.entries.length, ids: inventory.entries.map((e) => e.id), diagnostics }) + '\n');
241
+ process.stdout.write(asJson({
242
+ name: inventory.name,
243
+ count: inventory.entries.length,
244
+ ids: inventory.entries.map((e) => e.id),
245
+ diagnostics,
246
+ ...acceptedField,
247
+ }) + '\n');
125
248
  return 0;
126
249
  }
127
250
  process.stdout.write(`Registry "${inventory.name}"${inventory.description ? ' — ' + inventory.description : ''}\n`);
@@ -131,6 +254,12 @@ async function runRegistryInventory(args, name) {
131
254
  }
132
255
  for (const d of diagnostics)
133
256
  process.stdout.write(` ! ${d}\n`);
257
+ // THE shared unit-state block (round 13, K2): a LOCAL expectEmpty marker
258
+ // whose target appeared, or a dead source / consumer glob, is listed; a
259
+ // pack marker is INFO. (`registry` settles the globs the way `gates check`
260
+ // does — `registryLiveness`.)
261
+ process.stdout.write(unitStateNotes([{ id: inventory.name, unitLiveness: (liveness ?? registryLiveness(cwd, decl, loaded.excludeDirs)).units }]).text);
262
+ writeAccepted();
134
263
  return 0;
135
264
  }
136
265
  if (action === 'exists') {
@@ -144,6 +273,11 @@ async function runRegistryInventory(args, name) {
144
273
  process.stderr.write('Pass at most one of --fail-if-taken / --fail-if-missing.\n');
145
274
  return ExitCode.UsageError;
146
275
  }
276
+ // Neither "taken" nor "free" can be read off an inventory that saw nothing
277
+ // — unless it is intended-empty (round 13): then nothing is taken yet.
278
+ if (stale !== undefined) {
279
+ return answerEmptyInventory(inventory, stale, json, { name: inventory.name, id, exists: null });
280
+ }
147
281
  // `--resolve` maps a human noun to the canonical registered id before the
148
282
  // existence test — via the registry's declared `aliases` map AND generic
149
283
  // normalization (case-fold, singular/plural, suffix strip/append) — so a
@@ -162,6 +296,7 @@ async function runRegistryInventory(args, name) {
162
296
  // --fail-if-missing → non-zero when the id is NOT registered (the consume-side check).
163
297
  // neither → the historical query convention (taken → 0, free → 1).
164
298
  const code = failIfTaken ? (exists ? 1 : 0) : exists ? 0 : 1;
299
+ // The acceptance rides on a PASSING answer only (settleVerdict's rule).
165
300
  if (json) {
166
301
  process.stdout.write(asJson({
167
302
  name: inventory.name,
@@ -169,6 +304,7 @@ async function runRegistryInventory(args, name) {
169
304
  ...(resolved ? { resolvedId: canonical, resolvedVia: resolution?.via } : {}),
170
305
  exists,
171
306
  exitCode: code,
307
+ ...(code === 0 ? acceptedField : {}),
172
308
  }) + '\n');
173
309
  return code;
174
310
  }
@@ -176,6 +312,8 @@ async function runRegistryInventory(args, name) {
176
312
  process.stdout.write(`resolved "${id}" → "${canonical}" (${resolution?.via})\n`);
177
313
  }
178
314
  process.stdout.write(`${exists ? 'yes' : 'no'} — "${canonical}" is ${exists ? 'declared' : 'NOT declared'} in registry "${inventory.name}".\n`);
315
+ if (code === 0)
316
+ writeAccepted();
179
317
  return code;
180
318
  }
181
319
  if (action === 'duplicates') {
@@ -183,22 +321,30 @@ async function runRegistryInventory(args, name) {
183
321
  // at runtime is an accident of load order. Every site is printed so the
184
322
  // duplicate can be resolved, not merely detected.
185
323
  const dupes = registryDuplicates(inventory);
324
+ const diagnostics = [...inventory.diagnostics, ...loaded.planeDiagnostics];
325
+ if (stale !== undefined) {
326
+ return answerEmptyInventory(inventory, stale, json, { name: inventory.name, scanned: 0, duplicates: [], diagnostics }, diagnostics);
327
+ }
186
328
  if (json) {
187
329
  process.stdout.write(asJson({
188
330
  name: inventory.name,
189
331
  scanned: inventory.entries.length,
190
332
  duplicates: dupes,
191
- diagnostics: [...inventory.diagnostics, ...loaded.planeDiagnostics],
333
+ diagnostics,
334
+ ...acceptedField,
192
335
  }) + '\n');
193
- return inventory.entries.length === 0 ? 2 : dupes.length > 0 ? 1 : 0;
194
- }
195
- if (inventory.entries.length === 0) {
196
- process.stdout.write(`Registry "${inventory.name}" matched 0 ids — nothing was checked. This is NOT a pass;\n` +
197
- ' the source selector is probably stale (see `shrk gates coverage`).\n');
198
- return 2;
336
+ return dupes.length > 0 ? 1 : 0;
199
337
  }
200
338
  if (dupes.length === 0) {
201
- process.stdout.write(`No duplicate ids in registry "${inventory.name}" (${inventory.entries.length} scanned). ✓\n`);
339
+ // THE shared unit-state block (round 13, K2): a LOCAL expectEmpty marker
340
+ // whose target appeared (or a dead glob) is listed and withholds the ✓;
341
+ // a pack marker is INFO.
342
+ const unitNotes = unitStateNotes([
343
+ { id: inventory.name, unitLiveness: (liveness ?? registryLiveness(cwd, decl, loaded.excludeDirs)).units },
344
+ ]);
345
+ process.stdout.write(unitNotes.text);
346
+ process.stdout.write(`${qualifyCleanForUnits(`No duplicate ids in registry "${inventory.name}" (${inventory.entries.length} scanned). ✓`, unitNotes)}\n`);
347
+ writeAccepted();
202
348
  return 0;
203
349
  }
204
350
  process.stdout.write(`Duplicate ids in registry "${inventory.name}" (${dupes.length}):\n`);
@@ -214,9 +360,18 @@ async function runRegistryInventory(args, name) {
214
360
  process.stderr.write(`Usage: shrk registry ${name} where <id>\n`);
215
361
  return ExitCode.UsageError;
216
362
  }
363
+ if (stale !== undefined) {
364
+ return answerEmptyInventory(inventory, stale, json, { name: inventory.name, id, found: null, entry: null });
365
+ }
217
366
  const entry = registryWhere(inventory, id);
218
367
  if (json) {
219
- process.stdout.write(asJson({ name: inventory.name, id, found: entry !== undefined, entry: entry ?? null }) + '\n');
368
+ process.stdout.write(asJson({
369
+ name: inventory.name,
370
+ id,
371
+ found: entry !== undefined,
372
+ entry: entry ?? null,
373
+ ...(entry !== undefined ? acceptedField : {}),
374
+ }) + '\n');
220
375
  return entry ? 0 : 1;
221
376
  }
222
377
  if (!entry) {
@@ -228,6 +383,7 @@ async function runRegistryInventory(args, name) {
228
383
  process.stdout.write(` declared ${s.file}:${s.line}\n`);
229
384
  for (const s of entry.consumerSites ?? [])
230
385
  process.stdout.write(` consumed ${s.file}:${s.line}\n`);
386
+ writeAccepted();
231
387
  return 0;
232
388
  }
233
389
  process.stderr.write(`Unknown action "${action}". Usage: shrk registry ${name} list | exists <id> | where <id> | duplicates\n`);
@@ -235,12 +391,28 @@ async function runRegistryInventory(args, name) {
235
391
  }
236
392
  export const registryCommand = {
237
393
  name: 'registry',
394
+ // Free: positional[0] is a declared registry NAME (`registry <name> list`).
395
+ // The inventory verbs are also accepted verb-first (`registry list <name>`).
396
+ positionals: PositionalMode.Free,
397
+ subverbs: [
398
+ {
399
+ name: 'lifecycle',
400
+ description: 'Registry lifecycle symmetry (register ↔ unregister) across the tree.',
401
+ usage: 'shrk registry lifecycle [--scope <glob>] [--changed-only | --since <ref>] [--limit N] [--offset N] [--budget-ms N] [--allow-empty] [--json]',
402
+ },
403
+ ...[...INVENTORY_VERBS].map((verb) => ({
404
+ name: verb,
405
+ description: `The verb-first spelling of \`registry <name> ${verb}\`.`,
406
+ usage: `shrk registry ${verb} <name>${verb === 'exists' || verb === 'where' ? ' <id>' : ''} [--json]`,
407
+ positionals: PositionalMode.Free,
408
+ })),
409
+ ],
238
410
  description: 'Registry inspections: lifecycle symmetry + declared-registry inventory. Read-only.',
239
411
  usage: 'shrk registry lifecycle | <name> list | <name> exists <id> [--resolve] [--fail-if-taken|--fail-if-missing] | <name> where <id> | <name> duplicates',
240
412
  // Guard-mode + query flags take no value — declare them so `exists <id>
241
413
  // --fail-if-taken` (flag last) and `exists --resolve <id>` (flag first) both
242
414
  // keep the id as a positional instead of swallowing it.
243
- booleanFlags: new Set(['json', 'resolve', 'fail-if-taken', 'fail-if-missing']),
415
+ booleanFlags: new Set(['json', 'resolve', 'fail-if-taken', 'fail-if-missing', 'changed-only', ALLOW_EMPTY_FLAG]),
244
416
  async run(args) {
245
417
  const sub = args.positional[0];
246
418
  if (sub === 'lifecycle') {
@@ -255,7 +427,8 @@ export const registryCommand = {
255
427
  const second = args.positional[1];
256
428
  if (INVENTORY_VERBS.has(sub) && second !== undefined && second.length > 0) {
257
429
  const loaded = await loadRegistries(resolveCwd(args));
258
- const known = loaded.ok && findRegistry(loaded.registries, second) !== undefined;
430
+ const known = loaded.ok &&
431
+ (findRegistry(loaded.registries, second) !== undefined || loaded.rejected.some((r) => r.id === second));
259
432
  if (known) {
260
433
  // [verb, name, ...rest] → [name, verb, ...rest]
261
434
  args.positional = [second, sub, ...args.positional.slice(2)];
@@ -1 +1 @@
1
- {"version":3,"file":"release.command.d.ts","sourceRoot":"","sources":["../../src/commands/release.command.ts"],"names":[],"mappings":"AA2BA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AA2pBhC,eAAO,MAAM,cAAc,EAAE,eAY5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAKjC,CAAC"}
1
+ {"version":3,"file":"release.command.d.ts","sourceRoot":"","sources":["../../src/commands/release.command.ts"],"names":[],"mappings":"AA6BA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAotBhC,eAAO,MAAM,cAAc,EAAE,eAkC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAKjC,CAAC"}
@@ -2,8 +2,9 @@ import { spawnSync } from 'node:child_process';
2
2
  import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync, rmSync, readFileSync } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
4
  import * as nodePath from 'node:path';
5
- import { buildReleaseReadiness, inspectSharkcraft, ReleaseReadinessSeverity, renderReleaseReadinessHtml, pickScenarios, createFixtureRoot, collectFixtureFiles, assertSafeWrites, renderSmokeReport, evaluateSmokeAssertion, getInstallSmokePlan, } from '@shrkcrft/inspector';
5
+ import { buildReleaseReadiness, detectSharkcraftRepo, inspectSharkcraft, ReleaseReadinessSeverity, renderReleaseReadinessHtml, pickScenarios, createFixtureRoot, collectFixtureFiles, assertSafeWrites, renderSmokeReport, evaluateSmokeAssertion, getInstallSmokePlan, } from '@shrkcrft/inspector';
6
6
  import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
7
+ import { PositionalMode } from "../dispatch/positional-mode.js";
7
8
  import { asJson, header, kv } from "../output/format-output.js";
8
9
  const SMOKE_SCENARIO_IDS = [
9
10
  'unconfigured-repo',
@@ -446,8 +447,10 @@ async function runInstallSmoke(args) {
446
447
  return runInstallSmokeTarball(args);
447
448
  }
448
449
  const cwd = resolveCwd(args);
450
+ // `cliEntry` is only WHERE the in-repo CLI lives; whether this IS the tool
451
+ // repo is decided by the one host authority (round 11 §5.1).
449
452
  const cliEntry = nodePath.join(cwd, 'packages', 'cli', 'src', 'main.ts');
450
- const isRepo = existsSync(cliEntry);
453
+ const isRepo = detectSharkcraftRepo(cwd);
451
454
  const stepResults = [];
452
455
  for (const step of getInstallSmokePlan()) {
453
456
  const start = Date.now();
@@ -544,31 +547,88 @@ async function runReadiness(args) {
544
547
  }
545
548
  }
546
549
  // Knowledge stale-check.
547
- const cfgKnowledge = inspection.config
548
- ?.knowledgeCheck;
550
+ const cfgKnowledge = inspection.config?.knowledgeCheck;
549
551
  if (includeKnowledgeCheck || cfgKnowledge?.enabled) {
550
- const { buildKnowledgeStaleReport, ReferenceCheckOutcome } = await import('@shrkcrft/inspector');
552
+ const { buildKnowledgeStaleReport, describeInspectionDiscovery } = await import('@shrkcrft/inspector');
553
+ const { evaluateKnowledgeStaleGate, knowledgeStaleGateInput, settleKnowledgeStaleGate } = await import("../knowledge/knowledge-stale-gate.js");
554
+ // Warm (with the CLI command index) before resolving — the same warm the
555
+ // stale-check verb does, so readiness cannot read a correct playbook /
556
+ // policy / helper id as broken.
557
+ await (await import("../surface/cli-command-resolver.js")).warmCliReferenceRegistries(inspection);
551
558
  const staleReport = buildKnowledgeStaleReport(inspection);
552
- let requiredFailing = 0;
553
- for (const c of staleReport.referenceChecks) {
554
- const isRequired = c.reference.required === true;
555
- if (isRequired &&
556
- (c.outcome === ReferenceCheckOutcome.Stale || c.outcome === ReferenceCheckOutcome.Missing)) {
557
- requiredFailing++;
558
- }
559
- }
560
- const knowledgeStrict = cfgKnowledge?.strict ?? strict;
561
- const knowledgeReady = requiredFailing === 0 &&
562
- (!knowledgeStrict || staleReport.counts.stale === 0);
563
- report.knowledgeCheck = {
559
+ // THE stale-check verdict — the verb's own input builder, gate and settle.
560
+ // `knowledgeCheck.ready` is exactly `shrk knowledge stale-check` exiting 0:
561
+ // an unexamined corpus (unverifiable entries, a file that never loaded) is
562
+ // never ready, and a stale reference fails it as the verb does.
563
+ const gateInput = knowledgeStaleGateInput({
564
+ flags: {},
565
+ knowledgeCheck: cfgKnowledge,
566
+ discovery: describeInspectionDiscovery(inspection, cwd),
567
+ scoped: false,
568
+ });
569
+ const cov = staleReport.coverage;
570
+ const common = {
564
571
  enabled: true,
565
- strict: knowledgeStrict,
572
+ strict: cfgKnowledge?.strict === true,
573
+ failOn: [...gateInput.failOn],
566
574
  counts: staleReport.counts,
567
- requiredFailing,
568
- ready: knowledgeReady,
575
+ coverage: cov,
576
+ unverifiableIds: staleReport.unverifiableIds,
577
+ ...(gateInput.minReferenced ? { minReferenced: gateInput.minReferenced.ratio } : {}),
578
+ requireReferences: gateInput.requireReferences,
579
+ repro: 'shrk knowledge stale-check',
569
580
  };
581
+ let knowledgeReady;
582
+ let knowledgeMessage;
583
+ if (gateInput.usageProblem) {
584
+ knowledgeReady = false;
585
+ knowledgeMessage = gateInput.usageProblem;
586
+ report.knowledgeCheck = {
587
+ ...common,
588
+ exit: 3,
589
+ verdict: 'usage-error',
590
+ reasons: [gateInput.usageProblem],
591
+ shortfalls: [],
592
+ accepted: [],
593
+ ready: false,
594
+ };
595
+ }
596
+ else {
597
+ const gate = evaluateKnowledgeStaleGate(staleReport, gateInput);
598
+ const settled = settleKnowledgeStaleGate(gate);
599
+ knowledgeReady = settled.exit === 0;
600
+ knowledgeMessage =
601
+ gate.reasons.length > 0
602
+ ? gate.reasons.join('; ')
603
+ : settled.shortfalls.length > 0
604
+ ? `NOT VERIFIED — ${settled.shortfalls.slice(0, 3).join('; ')}`
605
+ : `${cov.verified} of ${cov.entriesInScope} knowledge entries verified`;
606
+ report.knowledgeCheck = {
607
+ ...common,
608
+ requiredFailing: gate.requiredStale + gate.requiredMissing,
609
+ reasons: gate.reasons,
610
+ exit: settled.exit,
611
+ verdict: settled.verdict,
612
+ shortfalls: settled.shortfalls,
613
+ accepted: settled.accepted,
614
+ ready: knowledgeReady,
615
+ };
616
+ }
570
617
  if (!knowledgeReady) {
571
618
  report.ready = false;
619
+ // Name the blocker: a NOT READY with no blocker listed sends the reader
620
+ // hunting for the cause.
621
+ report.blockers = [
622
+ ...report.blockers,
623
+ {
624
+ id: 'knowledge-check',
625
+ title: 'Knowledge stale-check',
626
+ status: 'fail',
627
+ severity: ReleaseReadinessSeverity.Error,
628
+ message: knowledgeMessage,
629
+ suggestion: 'shrk knowledge stale-check',
630
+ },
631
+ ];
572
632
  }
573
633
  }
574
634
  const wantHtml = flagBool(args, 'html');
@@ -619,6 +679,19 @@ async function runReadiness(args) {
619
679
  }
620
680
  export const releaseCommand = {
621
681
  name: 'release',
682
+ positionals: PositionalMode.None,
683
+ subverbs: [
684
+ {
685
+ name: 'readiness',
686
+ description: 'Release readiness aggregator — docs, changelog, examples, preflight.',
687
+ usage: 'shrk release readiness [--strict] [--preflight <file|dir|auto>] [--html] [--report] [--json] [--with-docs-check] [--with-examples-check]',
688
+ },
689
+ {
690
+ name: 'smoke',
691
+ description: 'Release smoke harness (writes only into temp fixtures).',
692
+ usage: 'shrk release smoke [--scenario all|<id>] [--temp-dir <path>] [--keep-temp] [--json] [--report] [--html]',
693
+ },
694
+ ],
622
695
  description: 'Release readiness aggregator + smoke harness. Read-only verdicts; smoke writes only into temp fixtures.',
623
696
  usage: 'shrk release readiness [--strict] [--preflight <file|dir|auto>] [--html] [--report] [--json] [--with-docs-check] [--with-examples-check]\n shrk release smoke [--scenario all|<id>] [--temp-dir <path>] [--keep-temp] [--json] [--report] [--html]',
624
697
  async run(args) {
@@ -628,6 +701,12 @@ export const releaseCommand = {
628
701
  if (sub === 'readiness')
629
702
  return runReadiness({ ...args, positional: args.positional.slice(1) });
630
703
  process.stderr.write('Usage: shrk release readiness | smoke\n');
704
+ // Both subverbs maintain SharkCraft itself (the surface gate refuses them
705
+ // with 78 elsewhere) — outside its repository say so, and name the gate that
706
+ // does apply, instead of a usage line listing only refused verbs.
707
+ if (!detectSharkcraftRepo(resolveCwd(args))) {
708
+ process.stderr.write(" Both maintain SharkCraft itself and do not apply to this repository (they exit 78 here). This repository's own gate: `shrk quality`.\n");
709
+ }
631
710
  return 2;
632
711
  },
633
712
  };
@@ -1 +1 @@
1
- {"version":3,"file":"report.command.d.ts","sourceRoot":"","sources":["../../src/commands/report.command.ts"],"names":[],"mappings":"AAgCA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,aAAa,EAAE,eAwC3B,CAAC"}
1
+ {"version":3,"file":"report.command.d.ts","sourceRoot":"","sources":["../../src/commands/report.command.ts"],"names":[],"mappings":"AAgCA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAehC,eAAO,MAAM,aAAa,EAAE,eA2E3B,CAAC"}