@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
@@ -11,9 +11,17 @@
11
11
  * shrk registrations preview <id> [--var key=value ...] [--json]
12
12
  */
13
13
  import * as nodePath from 'node:path';
14
- import { inspectSharkcraft, listRegistrationHints, listRegistrationHintIssues, getRegistrationHint, previewRegistrationHint, } from '@shrkcrft/inspector';
14
+ import { assetDoctorProposedExit, ContributionKind, inspectSharkcraft, listRegistrationHints, buildRegistrationHintDoctorReport, getRegistrationHint, previewRegistrationHint, settledUnitStates, } from '@shrkcrft/inspector';
15
+ import { formatCoverage } from '@shrkcrft/core';
16
+ import { PositionalMode } from "../dispatch/positional-mode.js";
17
+ import { ALLOW_EMPTY_FLAG, allowEmptyValve } from "../gates/allow-empty.js";
18
+ import { assetDoctorFailingUnits } from "../gates/asset-doctor-failing-units.js";
19
+ import { assetDoctorFailureLine } from "../gates/asset-doctor-failure-line.js";
20
+ import { settleVerdict } from "../gates/settle-verdict.js";
21
+ import { verdictLine } from "../gates/verdict-line.js";
15
22
  import { flagBool, flagString, flagVars, resolveCwd, } from "../command-registry.js";
16
23
  import { asJson, header } from "../output/format-output.js";
24
+ import { writeRejectedEntriesNote } from "../output/rejected-entries-note.js";
17
25
  import { savePlanToFile, signPlan } from '@shrkcrft/generator';
18
26
  const REGISTRATION_HINT_SYNTHETIC_TEMPLATE = '__registration-hint__';
19
27
  const registrationsListCommand = {
@@ -25,8 +33,11 @@ const registrationsListCommand = {
25
33
  const source = flagString(args, 'source');
26
34
  const all = await listRegistrationHints(inspection);
27
35
  const filtered = source ? all.filter((e) => e.source === source) : all;
36
+ // A hint its loader refused is named, never silently absent (round 12, 12.1).
37
+ const note = { ...(source ? { source } : {}), next: 'shrk registrations doctor' };
28
38
  if (flagBool(args, 'json')) {
29
39
  process.stdout.write(asJson(filtered) + '\n');
40
+ await writeRejectedEntriesNote(inspection, [ContributionKind.RegistrationHint], { ...note, json: true });
30
41
  return 0;
31
42
  }
32
43
  process.stdout.write(header(`Registration hints (${filtered.length})`));
@@ -36,6 +47,7 @@ const registrationsListCommand = {
36
47
  if (filtered.length === 0) {
37
48
  process.stdout.write(' (no registration hints contributed — packs add them via registrationHintFiles[])\n');
38
49
  }
50
+ await writeRejectedEntriesNote(inspection, [ContributionKind.RegistrationHint], note);
39
51
  return 0;
40
52
  },
41
53
  };
@@ -87,24 +99,99 @@ const registrationsGetCommand = {
87
99
  };
88
100
  const registrationsDoctorCommand = {
89
101
  name: 'doctor',
90
- description: 'Validate registration hint registries (local + pack).',
91
- usage: 'shrk registrations doctor [--json]',
102
+ description: 'Validate registration hints (local + pack): load issues, and every hint’s discovery against the live tree — verified / ambiguous / dead / unverified. Exit 0 pass · 1 errors · 2 a dead or capped discovery.',
103
+ usage: 'shrk registrations doctor [--json] [--strict] [--fail-on-dead-units] [--allow-empty]',
104
+ booleanFlags: new Set(['json', 'strict', 'fail-on-dead-units', ALLOW_EMPTY_FLAG]),
92
105
  async run(args) {
93
106
  const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
94
- const issues = await listRegistrationHintIssues(inspection);
107
+ // THE discovery authority — the same candidate set `preview` acts on.
108
+ const report = await buildRegistrationHintDoctorReport(inspection);
109
+ const errors = report.issues.filter((i) => i.severity === 'error').length;
110
+ const warnings = report.issues.filter((i) => i.severity === 'warning').length;
111
+ // THE asset-doctor proposal (round 13): errors, warnings under --strict, and
112
+ // every settled selector unit THE --fail-on-dead-units predicate fails (a
113
+ // dead one, or a stale LOCAL expectEmpty marker — a pack's is INFO).
114
+ const proposed = assetDoctorProposedExit({ errors, warnings, units: report.liveness.units }, { strict: flagBool(args, 'strict'), failOnDeadUnits: flagBool(args, 'fail-on-dead-units') });
115
+ // No hint declared examined nothing: NOT VERIFIED (2) — the answer the
116
+ // helper / checks / conventions / templates doctors give an empty input,
117
+ // never a 0 that reads as "every hint verified" — unless `--allow-empty`
118
+ // accepts it (printed). Added here, not in the inspector report, so the
119
+ // self-config doctor (which folds these findings) is not vetoed by a repo
120
+ // that simply declares no hints.
121
+ const coverage = report.totals.hints === 0
122
+ ? [
123
+ ...report.coverage,
124
+ {
125
+ unit: 'registration hints',
126
+ expected: 0,
127
+ examined: 0,
128
+ reason: 'no registration hints declared',
129
+ ...allowEmptyValve(args, 0),
130
+ },
131
+ ]
132
+ : report.coverage;
133
+ const settled = settleVerdict(proposed, coverage);
134
+ // THE units that fail this run (round 13 review) — printed and in --json,
135
+ // so a 1 from --fail-on-dead-units is never silent about why.
136
+ const failing = assetDoctorFailingUnits(report.liveness.units, {
137
+ failOnDeadUnits: flagBool(args, 'fail-on-dead-units'),
138
+ strict: flagBool(args, 'strict'),
139
+ });
95
140
  if (flagBool(args, 'json')) {
96
- process.stdout.write(asJson({ issues }) + '\n');
97
- return issues.some((i) => i.severity === 'error') ? 1 : 0;
141
+ process.stdout.write(asJson({
142
+ issues: report.issues,
143
+ failingUnits: failing.map((u) => ({ list: u.list, unit: u.unit, state: u.state, message: u.message })),
144
+ hints: report.hints,
145
+ totals: report.totals,
146
+ coverage,
147
+ deadUnits: report.deadUnits,
148
+ units: settledUnitStates([report.liveness]),
149
+ exitCode: settled.exit,
150
+ verdict: settled.verdict,
151
+ shortfalls: settled.shortfalls,
152
+ accepted: settled.accepted,
153
+ }) + '\n');
154
+ return settled.exit;
98
155
  }
99
- process.stdout.write(header(`Registration hint doctor (${issues.length} issue(s))`));
100
- if (issues.length === 0) {
101
- process.stdout.write(' OK\n');
102
- return 0;
156
+ const t = report.totals;
157
+ // Never "N issues" alone: 0 issues must not read as "N hints verified".
158
+ process.stdout.write(header(`Registration hint doctor — ${t.hints} hint(s): ${t.verified} verified · ${t.ambiguous} ambiguous · ${t.dead} dead · ${t.unverified} unverified${t.intendedEmpty > 0 ? ` · ${t.intendedEmpty} intended-empty` : ''}`));
159
+ // The status column fits every status the doctor prints — `intended-empty`
160
+ // (14 wide) overflowed the old 11-wide column into the id (round 13, K11).
161
+ const statusWidth = Math.max(11, ...report.hints.map((h) => h.status.length));
162
+ for (const h of report.hints) {
163
+ process.stdout.write(` ${h.status.padEnd(statusWidth)} ${h.id.padEnd(36)} ${h.discovery} (${h.candidates} candidate(s))\n`);
164
+ }
165
+ for (const c of report.coverage)
166
+ process.stdout.write(` coverage ${formatCoverage(c)}\n`);
167
+ if (report.issues.length > 0) {
168
+ process.stdout.write(`\nIssues (${report.issues.length}):\n`);
169
+ for (const i of report.issues) {
170
+ process.stdout.write(` ${i.severity.toUpperCase().padEnd(7)} ${i.code.padEnd(30)} ${i.message}\n`);
171
+ }
103
172
  }
104
- for (const i of issues) {
105
- process.stdout.write(` ${i.severity.toUpperCase().padEnd(7)} ${i.code.padEnd(28)} ${i.message}\n`);
173
+ // A stale LOCAL expectEmpty marker withholds the ✓ (a pack's is INFO: the
174
+ // consumer cannot edit it); an intended-empty one is accepted, printed below.
175
+ const staleLocal = report.liveness.wentLive.filter((u) => u.mark?.packageName === undefined).length;
176
+ const clean = t.hints === 0
177
+ ? 'No registration hints declared — nothing to verify.'
178
+ : warnings > 0
179
+ ? `No blocking registration-hint issues — ${warnings} warning(s) reported above.`
180
+ : staleLocal > 0
181
+ ? `No blocking registration-hint issues — ${staleLocal} expectEmpty marker(s) went live (listed above; remove the markers).`
182
+ : `Every hint's discovery resolves (${t.verified} verified, ${t.ambiguous} ambiguous${t.intendedEmpty > 0 ? `, ${t.intendedEmpty} intended empty` : ''}). ✓`;
183
+ const line = verdictLine(settled, clean);
184
+ if (line)
185
+ process.stdout.write('\n' + line + '\n');
186
+ // Round 13 review: a 1 from --fail-on-dead-units names its units — the
187
+ // doctor printed only INFO issue lines, and `verdictLine` prints nothing
188
+ // for a 1 without a shortfall.
189
+ if (settled.exit === 1) {
190
+ const failure = assetDoctorFailureLine('registration-hint doctor', failing);
191
+ if (failure)
192
+ process.stdout.write('\n' + failure + '\n');
106
193
  }
107
- return issues.some((i) => i.severity === 'error') ? 1 : 0;
194
+ return settled.exit;
108
195
  },
109
196
  };
110
197
  const registrationsPreviewCommand = {
@@ -281,6 +368,44 @@ export const registrationsCommand = {
281
368
  name: 'registrations',
282
369
  description: 'Inspect/preview/plan pack-contributed registration hints (downstream registration steps for generated constructs).',
283
370
  usage: 'shrk registrations <list|get|doctor|preview|plan> ...',
371
+ // Declared (round 11 review): the dispatcher guard refuses an unknown verb
372
+ // with the closest one, and the declared walk reaches `registrations doctor`
373
+ // — a verdict verb, so a bad flag there exits 3, labelled with its own path.
374
+ positionals: PositionalMode.None,
375
+ subverbs: [
376
+ {
377
+ name: registrationsListCommand.name,
378
+ description: registrationsListCommand.description,
379
+ usage: registrationsListCommand.usage,
380
+ positionals: PositionalMode.None,
381
+ },
382
+ {
383
+ name: registrationsGetCommand.name,
384
+ description: registrationsGetCommand.description,
385
+ usage: registrationsGetCommand.usage,
386
+ positionals: PositionalMode.Free,
387
+ },
388
+ {
389
+ name: registrationsDoctorCommand.name,
390
+ description: registrationsDoctorCommand.description,
391
+ usage: registrationsDoctorCommand.usage,
392
+ positionals: PositionalMode.None,
393
+ },
394
+ {
395
+ name: registrationsPreviewCommand.name,
396
+ description: registrationsPreviewCommand.description,
397
+ usage: registrationsPreviewCommand.usage,
398
+ positionals: PositionalMode.Free,
399
+ },
400
+ {
401
+ name: registrationsPlanCommand.name,
402
+ description: registrationsPlanCommand.description,
403
+ usage: registrationsPlanCommand.usage,
404
+ positionals: PositionalMode.Free,
405
+ },
406
+ ],
407
+ // The group parses every subverb's argv, so the subverbs' boolean flags live here too.
408
+ booleanFlags: new Set(['json', 'strict', 'fail-on-dead-units', ALLOW_EMPTY_FLAG]),
284
409
  async run(args) {
285
410
  const sub = args.positional[0];
286
411
  const rest = { ...args, positional: args.positional.slice(1) };
@@ -0,0 +1,14 @@
1
+ import { type ParsedArgs } from '../command-registry.js';
2
+ /** The two verbs this body answers for — the gate envelope's `verb`. */
3
+ type RegistryLifecycleVerb = 'check registry-lifecycle' | 'registry lifecycle';
4
+ /** The flag grammar both verbs share (one usage line, one allowlist). */
5
+ export declare const REGISTRY_LIFECYCLE_FLAGS_USAGE = "[--scope <dir>] [--changed-only] [--since <ref>] [--limit <n>] [--offset <n>] [--budget-ms <n>] [--allow-empty] [--json]";
6
+ /**
7
+ * Run a lifecycle scan for `verb`. `options.signal` is the in-process test seam
8
+ * for SIGTERM / SIGINT: aborting it prints the partial report and exits `2`.
9
+ */
10
+ export declare function runRegistryLifecycle(args: ParsedArgs, verb: RegistryLifecycleVerb, options?: {
11
+ readonly signal?: AbortSignal;
12
+ }): Promise<number>;
13
+ export {};
14
+ //# sourceMappingURL=registry-lifecycle-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-lifecycle-run.d.ts","sourceRoot":"","sources":["../../src/commands/registry-lifecycle-run.ts"],"names":[],"mappings":"AA0BA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAShC,wEAAwE;AACxE,KAAK,qBAAqB,GAAG,0BAA0B,GAAG,oBAAoB,CAAC;AAE/E,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,6HACiF,CAAC;AA6L7H;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC9C,OAAO,CAAC,MAAM,CAAC,CA6HjB"}
@@ -0,0 +1,336 @@
1
+ /**
2
+ * The ONE body behind `shrk check registry-lifecycle` and `shrk registry
3
+ * lifecycle`.
4
+ *
5
+ * The two verbs used to carry copy-pasted bodies with two copies of the exit
6
+ * ternary — both of which forgot the file cap, so a scan that examined 2000 of
7
+ * 2103 candidates printed `missing removers 0` and exited 0 while a real
8
+ * violation sat in the 103 it never read. Now both delegate here, the engine
9
+ * owns the coverage records, and the exit is settled through the gate envelope
10
+ * like every other verdict verb:
11
+ *
12
+ * - a missing remover → `1` (a violation in the examined scope is real);
13
+ * - a cap, an expired budget, a signal, an over-budget / unreadable file,
14
+ * nothing in scope, or no registrations → `2`, with the continuation
15
+ * (`--offset <n>`) that actually reaches the remainder;
16
+ * - otherwise `0`;
17
+ * - a malformed flag → `3` with the usage line.
18
+ */
19
+ import { renderRegistryLifecycleReportText, resolveChangedFiles, resolveProjectConfig, runRegistryLifecycleScan, } from '@shrkcrft/inspector';
20
+ import { ERROR_CODES } from '@shrkcrft/core';
21
+ import { firstUnknownFlag, flagBool, flagString, resolveCwd, spellFlagAsTyped, } from "../command-registry.js";
22
+ import { GLOBAL_FLAGS } from "../dispatch/global-flags.js";
23
+ import { ExitCode } from "../exit-codes.js";
24
+ import { asJson } from "../output/format-output.js";
25
+ import { buildGateEnvelope } from "../gates/gate-envelope.js";
26
+ import { ALLOW_EMPTY_FLAG, allowEmptyValve } from "../gates/allow-empty.js";
27
+ import { verdictLine } from "../gates/verdict-line.js";
28
+ import { planeVerdictForExit } from "../gates/plane-verdict.js";
29
+ /** The flag grammar both verbs share (one usage line, one allowlist). */
30
+ export const REGISTRY_LIFECYCLE_FLAGS_USAGE = '[--scope <dir>] [--changed-only] [--since <ref>] [--limit <n>] [--offset <n>] [--budget-ms <n>] [--allow-empty] [--json]';
31
+ /**
32
+ * Every flag the verbs honour, plus every dispatcher global (THE list in
33
+ * dispatch/global-flags.ts), which may reach the handler; anything else is a
34
+ * typo that would otherwise read as a satisfied request.
35
+ */
36
+ const KNOWN_FLAGS = new Set([
37
+ 'json',
38
+ 'scope',
39
+ 'changed-only',
40
+ 'since',
41
+ 'limit',
42
+ 'offset',
43
+ 'budget-ms',
44
+ ALLOW_EMPTY_FLAG,
45
+ ...GLOBAL_FLAGS,
46
+ ]);
47
+ function usage(verb) {
48
+ return `Usage: shrk ${verb} ${REGISTRY_LIFECYCLE_FLAGS_USAGE}`;
49
+ }
50
+ /**
51
+ * A non-negative integer flag. `undefined` when absent; an error string when
52
+ * present but not an integer ≥ 0 (a bare `--limit`, `--limit abc`, `--limit -1`).
53
+ */
54
+ function intFlag(args, name) {
55
+ if (!args.flags.has(name))
56
+ return undefined;
57
+ const raw = args.flags.get(name);
58
+ if (typeof raw !== 'string' || !/^\d+$/.test(raw.trim())) {
59
+ return { error: `--${name} needs a non-negative integer (got ${typeof raw === 'string' ? `"${raw}"` : 'no value'})` };
60
+ }
61
+ return Number(raw.trim());
62
+ }
63
+ /** One argument, shell-safe — a path with a space still pastes as one word. */
64
+ function shellArg(value) {
65
+ return /^[\w@%+=:,./-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
66
+ }
67
+ /** The command a continuation re-runs: this verb plus every scoping flag the user passed. */
68
+ function continuationCommand(verb, args) {
69
+ const parts = [`shrk ${verb}`];
70
+ // main.ts lifts a global `--cwd` into `args.globalCwd` before the handler
71
+ // runs (resolveCwd reads it there), so reading the flag alone dropped it —
72
+ // and a continuation pasted from another directory paged the wrong root.
73
+ const cwd = flagString(args, 'cwd') ?? args.globalCwd;
74
+ if (cwd)
75
+ parts.push(`--cwd ${shellArg(cwd)}`);
76
+ const scope = flagString(args, 'scope');
77
+ if (scope)
78
+ parts.push(`--scope ${shellArg(scope)}`);
79
+ if (flagBool(args, 'changed-only'))
80
+ parts.push('--changed-only');
81
+ const since = flagString(args, 'since');
82
+ if (since)
83
+ parts.push(`--since ${shellArg(since)}`);
84
+ const limit = flagString(args, 'limit');
85
+ if (limit)
86
+ parts.push(`--limit ${limit}`);
87
+ const budget = flagString(args, 'budget-ms');
88
+ if (budget)
89
+ parts.push(`--budget-ms ${budget}`);
90
+ return parts.join(' ');
91
+ }
92
+ /** The one rule result: the lifecycle rule, judged over the registrations it found. */
93
+ function lifecycleRule(report, coverage) {
94
+ return {
95
+ id: 'registry-lifecycle',
96
+ type: 'lifecycle',
97
+ status: report.missingRemovers.length > 0 ? 'failed' : 'passed',
98
+ severity: 'error',
99
+ counts: {
100
+ candidates: report.totalFiles,
101
+ filesScanned: report.filesScanned,
102
+ registersFound: report.registersFound,
103
+ matchedPairs: report.matchedPairs.length,
104
+ missingRemovers: report.missingRemovers.length,
105
+ oneShotBootstrap: report.oneShotBootstrap.length,
106
+ ignored: report.ignored.length,
107
+ overBudgetFiles: report.overBudgetFiles.length,
108
+ },
109
+ violations: report.missingRemovers.map((m) => ({
110
+ id: m.registerName,
111
+ file: m.file,
112
+ line: m.line,
113
+ message: `no ${m.expectedRemoverNames.slice(0, 3).join(' / ')}`,
114
+ hint: m.suggestion,
115
+ })),
116
+ coverage,
117
+ };
118
+ }
119
+ /**
120
+ * The config-load row. An EXISTING sharkcraft.config.ts that failed to load
121
+ * means the configured skip set was never applied: errored (never
122
+ * `evaluated`), and its engine-owned coverage — 1 config file expected, 0
123
+ * examined — settles a clean run to 2. `--allow-empty` cannot waive it
124
+ * (expected is 1, not 0).
125
+ */
126
+ function configRule(coverage) {
127
+ return {
128
+ id: 'config',
129
+ type: 'lifecycle',
130
+ status: 'error',
131
+ severity: 'error',
132
+ counts: {},
133
+ violations: [],
134
+ error: `sharkcraft.config.ts ${coverage.reason ?? 'failed to load'}`,
135
+ coverage,
136
+ };
137
+ }
138
+ /**
139
+ * Install SIGTERM / SIGINT handlers that abort the scan for the duration of the
140
+ * run. The JS thread yields between files, so a kill prints the partial report
141
+ * (and the `--offset` that continues it) instead of zero bytes.
142
+ */
143
+ function trapSignals(controller) {
144
+ const onSignal = () => controller.abort();
145
+ process.once('SIGTERM', onSignal);
146
+ process.once('SIGINT', onSignal);
147
+ return () => {
148
+ process.off('SIGTERM', onSignal);
149
+ process.off('SIGINT', onSignal);
150
+ };
151
+ }
152
+ /** Settle first, render second — one envelope for text and `--json`. */
153
+ function settle(verb, report, args) {
154
+ const proposed = report.missingRemovers.length > 0 ? ExitCode.Failure : ExitCode.VerifiedPass;
155
+ const rules = [
156
+ lifecycleRule(report, {
157
+ ...report.registrationCoverage,
158
+ ...allowEmptyValve(args, report.registrationCoverage.expected),
159
+ }),
160
+ ...(report.configCoverage ? [configRule(report.configCoverage)] : []),
161
+ ];
162
+ const run = { ...report.coverage, ...allowEmptyValve(args, report.coverage.expected) };
163
+ // Two literals, not one variable: the contract lock reads the literal FIRST
164
+ // argument of every envelope build and asserts it is a registered verdict verb.
165
+ return verb === 'registry lifecycle'
166
+ ? buildGateEnvelope('registry lifecycle', proposed, rules, run)
167
+ : buildGateEnvelope('check registry-lifecycle', proposed, rules, run);
168
+ }
169
+ /** The clean sentence — printed only through `verdictLine`, i.e. only at a settled 0. */
170
+ function cleanSentence(report) {
171
+ const window = report.offset > 0
172
+ ? ` (candidates ${report.offset + 1}–${report.totalFiles} of ${report.totalFiles}; earlier ones were not examined in this run)`
173
+ : '';
174
+ return (`No missing removers — ${report.registersFound} register* declaration(s) judged across ` +
175
+ `${report.filesScanned} file(s)${window}. ✓`);
176
+ }
177
+ /**
178
+ * The `--json` reason for the SETTLED verdict, derived from the envelope —
179
+ * never the engine's pre-settlement one, which paired `verdict: 'pass'` (an
180
+ * `--allow-empty` acceptance) with a not-verified reason.
181
+ *
182
+ * - exit 0: the acceptance lines, or nothing;
183
+ * - exit 1: the engine's failure reason, plus any `also not verified: …`;
184
+ * - exit 2: the shortfalls.
185
+ */
186
+ function settledReason(env, report) {
187
+ if (env.exit === ExitCode.VerifiedPass)
188
+ return env.accepted.length > 0 ? env.accepted.join('; ') : undefined;
189
+ if (env.exit === ExitCode.Failure) {
190
+ const parts = [
191
+ ...(report.verdict === 'fail' && report.verdictReason ? [report.verdictReason] : []),
192
+ ...(env.shortfalls.length > 0 ? [`also not verified: ${env.shortfalls.join('; ')}`] : []),
193
+ ];
194
+ return parts.length > 0 ? parts.join('; ') : undefined;
195
+ }
196
+ return env.shortfalls.length > 0 ? env.shortfalls.join('; ') : undefined;
197
+ }
198
+ /** True when every shortfall is an empty scope (so `--allow-empty` would clear it). */
199
+ function onlyEmptyShortfalls(report) {
200
+ // A config that failed to load is never an empty scope: --allow-empty cannot clear it.
201
+ if (report.configCoverage)
202
+ return false;
203
+ const c = report.coverage;
204
+ if (c.capped)
205
+ return false;
206
+ const filesEmptyOrFull = c.expected === 0 || c.examined >= c.expected;
207
+ return filesEmptyOrFull && (c.expected === 0 || report.registrationCoverage.expected === 0);
208
+ }
209
+ /**
210
+ * Run a lifecycle scan for `verb`. `options.signal` is the in-process test seam
211
+ * for SIGTERM / SIGINT: aborting it prints the partial report and exits `2`.
212
+ */
213
+ export async function runRegistryLifecycle(args, verb, options = {}) {
214
+ const json = flagBool(args, 'json');
215
+ const badFlag = (error) => {
216
+ process.stderr.write(`${error}\n${usage(verb)}\n`);
217
+ return ExitCode.UsageError;
218
+ };
219
+ // `--offset -1`: the parser reads `-1` as a flag of its own and leaves
220
+ // `--offset` valueless. Report the malformed VALUE — what `intFlag` promises —
221
+ // never an unknown `--1`.
222
+ for (const name of ['limit', 'offset', 'budget-ms']) {
223
+ const at = args.flags.get(name) === true ? (args.argv ?? []).indexOf(`--${name}`) : -1;
224
+ const next = at >= 0 ? args.argv?.[at + 1] : undefined;
225
+ if (next !== undefined && /^-\d/.test(next)) {
226
+ return badFlag(`--${name} needs a non-negative integer (got "${next}")`);
227
+ }
228
+ }
229
+ const unknown = firstUnknownFlag(args, KNOWN_FLAGS);
230
+ if (unknown !== undefined) {
231
+ process.stderr.write(`unknown option '${spellFlagAsTyped(unknown, args.argv)}'\n${usage(verb)}\n`);
232
+ return ExitCode.UsageError;
233
+ }
234
+ const limit = intFlag(args, 'limit');
235
+ if (typeof limit === 'object')
236
+ return badFlag(limit.error);
237
+ const offset = intFlag(args, 'offset');
238
+ if (typeof offset === 'object')
239
+ return badFlag(offset.error);
240
+ const budgetMs = intFlag(args, 'budget-ms');
241
+ if (typeof budgetMs === 'object')
242
+ return badFlag(budgetMs.error);
243
+ const cwd = resolveCwd(args);
244
+ const scope = flagString(args, 'scope');
245
+ const changedOnly = flagBool(args, 'changed-only');
246
+ const since = flagString(args, 'since');
247
+ // `--changed-only` scopes the scan to the diff (tracked + untracked), so it
248
+ // runs inline in seconds; the full-tree walk is bounded by the budget.
249
+ let files;
250
+ if (changedOnly || since) {
251
+ const changed = resolveChangedFiles({
252
+ projectRoot: cwd,
253
+ ...(since ? { since } : {}),
254
+ ...(changedOnly && !since ? { includeWorktree: true } : {}),
255
+ });
256
+ files = changed.files;
257
+ }
258
+ // The full-tree walk honours the project's skip-dir config (skipDirsAdd
259
+ // extends the defaults; skipDirs replaces them and is warned about).
260
+ let skipDirs;
261
+ let skipDirsAdd;
262
+ let configLoadError;
263
+ if (files === undefined) {
264
+ const loaded = await resolveProjectConfig(cwd);
265
+ if (loaded.ok) {
266
+ skipDirs = loaded.value.config.registryLifecycle?.skipDirs;
267
+ skipDirsAdd = loaded.value.config.registryLifecycle?.skipDirsAdd;
268
+ }
269
+ else if (loaded.error.code !== ERROR_CODES.SHARKCRAFT_FOLDER_NOT_FOUND) {
270
+ // A config that EXISTS but failed to load is not "no config": the
271
+ // configured skip set was never applied. The engine records it as a
272
+ // coverage shortfall, so the run can never settle to 0 over a scope the
273
+ // project did not ask for.
274
+ const fullPath = loaded.error.details?.['fullPath'];
275
+ configLoadError = { file: typeof fullPath === 'string' ? fullPath : null, message: loaded.error.message };
276
+ }
277
+ // Only the slow full-tree path needs the heartbeat (JSON keeps stdout clean).
278
+ if (!json) {
279
+ process.stderr.write('⏳ Scanning source for register*/remove* symmetry (bounded by a wall-clock budget)…\n');
280
+ }
281
+ }
282
+ const controller = new AbortController();
283
+ const forward = () => controller.abort();
284
+ if (options.signal?.aborted)
285
+ controller.abort();
286
+ else
287
+ options.signal?.addEventListener('abort', forward, { once: true });
288
+ const release = trapSignals(controller);
289
+ let report;
290
+ try {
291
+ report = await runRegistryLifecycleScan({
292
+ projectRoot: cwd,
293
+ ...(files !== undefined ? { files } : {}),
294
+ ...(scope ? { scope } : {}),
295
+ ...(skipDirs ? { skipDirs } : {}),
296
+ ...(skipDirsAdd ? { skipDirsAdd } : {}),
297
+ ...(limit !== undefined ? { limit } : {}),
298
+ ...(offset !== undefined ? { offset } : {}),
299
+ ...(budgetMs !== undefined ? { budgetMs } : {}),
300
+ ...(configLoadError ? { configLoadError } : {}),
301
+ }, { signal: controller.signal });
302
+ }
303
+ finally {
304
+ release();
305
+ options.signal?.removeEventListener('abort', forward);
306
+ }
307
+ // An offset past the last candidate is a typo'd continuation, not an empty
308
+ // scope: refusing it keeps `--allow-empty` from printing ✓ over "candidates
309
+ // 2103–2102 of 2102". Only once the walk completed — before that,
310
+ // `totalFiles` is a lower bound.
311
+ if (offset !== undefined && offset > 0 && report.walkComplete && offset >= report.totalFiles) {
312
+ return badFlag(`--offset ${offset} is past the last candidate (${report.totalFiles} candidate(s) in scope)`);
313
+ }
314
+ const env = settle(verb, report, args);
315
+ const exit = env.exit;
316
+ if (json) {
317
+ process.stdout.write(asJson({
318
+ ...report,
319
+ verdict: planeVerdictForExit(exit),
320
+ // The reason for the SETTLED verdict (omitted when there is none) —
321
+ // never the engine's pre-settlement one.
322
+ verdictReason: settledReason(env, report),
323
+ exitCode: exit,
324
+ gate: env,
325
+ }) + '\n');
326
+ return exit;
327
+ }
328
+ process.stdout.write(renderRegistryLifecycleReportText(report, { command: continuationCommand(verb, args) }));
329
+ const lead = exit === ExitCode.NotVerified && onlyEmptyShortfalls(report)
330
+ ? 'Nothing to judge in scope. Pass --allow-empty to accept an empty scope explicitly.'
331
+ : undefined;
332
+ const line = verdictLine(env, cleanSentence(report), lead);
333
+ if (line)
334
+ process.stdout.write(`\n${line}\n`);
335
+ return exit;
336
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.command.d.ts","sourceRoot":"","sources":["../../src/commands/registry.command.ts"],"names":[],"mappings":"AA8BA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAQhC,eAAO,MAAM,wBAAwB,EAAE,eA8CtC,CAAC;AAkMF,eAAO,MAAM,eAAe,EAAE,eA0C7B,CAAC"}
1
+ {"version":3,"file":"registry.command.d.ts","sourceRoot":"","sources":["../../src/commands/registry.command.ts"],"names":[],"mappings":"AAwCA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAgBhC,eAAO,MAAM,wBAAwB,EAAE,eAUtC,CAAC;AA+ZF,eAAO,MAAM,eAAe,EAAE,eA6D7B,CAAC"}