@shrkcrft/cli 0.1.0-alpha.29 → 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 +76 -0
  20. package/dist/commands/baseline.command.d.ts.map +1 -1
  21. package/dist/commands/baseline.command.js +599 -75
  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 +164 -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 +1260 -324
  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 +8 -1
  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 +20 -0
  77. package/dist/commands/docs-references.command.d.ts.map +1 -0
  78. package/dist/commands/docs-references.command.js +520 -0
  79. package/dist/commands/doctor.command.d.ts.map +1 -1
  80. package/dist/commands/doctor.command.js +60 -5
  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 +54 -0
  99. package/dist/commands/gates.command.d.ts.map +1 -1
  100. package/dist/commands/gates.command.js +1314 -64
  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 +62 -0
  104. package/dist/commands/generated.command.d.ts.map +1 -1
  105. package/dist/commands/generated.command.js +639 -156
  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 +203 -25
  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 +362 -74
  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 +67 -0
  328. package/dist/gates/gate-rule-globs.d.ts.map +1 -0
  329. package/dist/gates/gate-rule-globs.js +139 -0
  330. package/dist/gates/gate-rule-view.d.ts +25 -6
  331. package/dist/gates/gate-rule-view.d.ts.map +1 -1
  332. package/dist/gates/gate-rule-view.js +105 -77
  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 +225 -4
  370. package/dist/gates/rule-coverage.d.ts.map +1 -1
  371. package/dist/gates/rule-coverage.js +610 -43
  372. package/dist/gates/run-gate-planes.d.ts +58 -0
  373. package/dist/gates/run-gate-planes.d.ts.map +1 -0
  374. package/dist/gates/run-gate-planes.js +403 -0
  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 +204 -83
  425. package/dist/output/failure-hints.d.ts.map +1 -1
  426. package/dist/output/failure-hints.js +11 -9
  427. package/dist/output/rejected-entries-note.d.ts +57 -0
  428. package/dist/output/rejected-entries-note.d.ts.map +1 -0
  429. package/dist/output/rejected-entries-note.js +103 -0
  430. package/dist/output/stdout-is-pipe.d.ts +13 -0
  431. package/dist/output/stdout-is-pipe.d.ts.map +1 -0
  432. package/dist/output/stdout-is-pipe.js +21 -0
  433. package/dist/packs/stale-build-warning.d.ts +11 -0
  434. package/dist/packs/stale-build-warning.d.ts.map +1 -0
  435. package/dist/packs/stale-build-warning.js +23 -0
  436. package/dist/quality/run-quality.d.ts +123 -0
  437. package/dist/quality/run-quality.d.ts.map +1 -0
  438. package/dist/quality/run-quality.js +442 -0
  439. package/dist/schemas/json-schemas.d.ts +184 -3
  440. package/dist/schemas/json-schemas.d.ts.map +1 -1
  441. package/dist/schemas/json-schemas.js +113 -2
  442. package/dist/shrk.d.ts +3 -0
  443. package/dist/shrk.d.ts.map +1 -0
  444. package/dist/shrk.js +30 -0
  445. package/dist/surface/audience-applicability.d.ts +26 -0
  446. package/dist/surface/audience-applicability.d.ts.map +1 -0
  447. package/dist/surface/audience-applicability.js +60 -0
  448. package/dist/surface/catalog-command-safety.d.ts +18 -0
  449. package/dist/surface/catalog-command-safety.d.ts.map +1 -0
  450. package/dist/surface/catalog-command-safety.js +62 -0
  451. package/dist/surface/cli-command-resolver.d.ts +21 -0
  452. package/dist/surface/cli-command-resolver.d.ts.map +1 -0
  453. package/dist/surface/cli-command-resolver.js +87 -0
  454. package/dist/surface/command-dispatch-kind.d.ts +20 -0
  455. package/dist/surface/command-dispatch-kind.d.ts.map +1 -0
  456. package/dist/surface/command-dispatch-kind.js +20 -0
  457. package/dist/surface/command-index-entry.d.ts +40 -0
  458. package/dist/surface/command-index-entry.d.ts.map +1 -0
  459. package/dist/surface/command-index-entry.js +1 -0
  460. package/dist/surface/command-index.d.ts +77 -0
  461. package/dist/surface/command-index.d.ts.map +1 -0
  462. package/dist/surface/command-index.js +323 -0
  463. package/dist/surface/i-command-index.d.ts +22 -0
  464. package/dist/surface/i-command-index.d.ts.map +1 -0
  465. package/dist/surface/i-command-index.js +1 -0
  466. package/dist/surface/i-command-string-context.d.ts +20 -0
  467. package/dist/surface/i-command-string-context.d.ts.map +1 -0
  468. package/dist/surface/i-command-string-context.js +1 -0
  469. package/dist/surface/i-surface-denial.d.ts +13 -0
  470. package/dist/surface/i-surface-denial.d.ts.map +1 -0
  471. package/dist/surface/i-surface-denial.js +1 -0
  472. package/dist/surface/load-surface-context.d.ts +17 -1
  473. package/dist/surface/load-surface-context.d.ts.map +1 -1
  474. package/dist/surface/load-surface-context.js +48 -10
  475. package/dist/surface/not-enabled-error.d.ts +38 -4
  476. package/dist/surface/not-enabled-error.d.ts.map +1 -1
  477. package/dist/surface/not-enabled-error.js +96 -6
  478. package/dist/surface/profiles.d.ts +7 -0
  479. package/dist/surface/profiles.d.ts.map +1 -1
  480. package/dist/surface/resolve-command-string.d.ts +10 -0
  481. package/dist/surface/resolve-command-string.d.ts.map +1 -0
  482. package/dist/surface/resolve-command-string.js +572 -0
  483. package/dist/surface/surface-config-writer.d.ts +7 -2
  484. package/dist/surface/surface-config-writer.d.ts.map +1 -1
  485. package/dist/surface/surface-config-writer.js +25 -6
  486. package/dist/surface/surface-layer.d.ts +11 -0
  487. package/dist/surface/surface-layer.d.ts.map +1 -0
  488. package/dist/surface/surface-layer.js +11 -0
  489. package/dist/surface/surface-refusal-reason.d.ts +16 -0
  490. package/dist/surface/surface-refusal-reason.d.ts.map +1 -0
  491. package/dist/surface/surface-refusal-reason.js +16 -0
  492. package/dist/surface/surface-selector.d.ts +26 -0
  493. package/dist/surface/surface-selector.d.ts.map +1 -0
  494. package/dist/surface/surface-selector.js +42 -0
  495. package/dist/surface/surface-summary.d.ts +61 -18
  496. package/dist/surface/surface-summary.d.ts.map +1 -1
  497. package/dist/surface/surface-summary.js +147 -60
  498. package/dist/surface/tier.d.ts +85 -22
  499. package/dist/surface/tier.d.ts.map +1 -1
  500. package/dist/surface/tier.js +132 -30
  501. package/dist/usage/usage-log.d.ts +6 -1
  502. package/dist/usage/usage-log.d.ts.map +1 -1
  503. package/dist/usage/usage-log.js +7 -2
  504. package/dist/validation/run-validation-loop.d.ts +9 -0
  505. package/dist/validation/run-validation-loop.d.ts.map +1 -1
  506. package/dist/validation/run-validation-loop.js +14 -11
  507. package/dist/validation/typecheck-emitted.d.ts +8 -9
  508. package/dist/validation/typecheck-emitted.d.ts.map +1 -1
  509. package/dist/validation/typecheck-emitted.js +17 -97
  510. package/package.json +34 -34
@@ -1,8 +1,15 @@
1
1
  import { flagBool, resolveCwd, } from "../command-registry.js";
2
+ import { PositionalMode } from "../dispatch/positional-mode.js";
2
3
  import { asJson, header, kv, table } from "../output/format-output.js";
3
4
  import { loadSurfaceContext } from "../surface/load-surface-context.js";
4
5
  import { buildSurfaceSummary, findCommandInSummary, } from "../surface/surface-summary.js";
5
- import { CommandTier } from "./command-catalog.js";
6
+ import { CommandAudience, CommandTier } from "./command-catalog.js";
7
+ import { CommandDispatchKind } from "../surface/command-dispatch-kind.js";
8
+ import { isBootstrapFamily, TierSource } from "../surface/tier.js";
9
+ import { firstMatchingSelector, matchesSurfaceSelector } from "../surface/surface-selector.js";
10
+ import { surfaceRefusalFor } from "../surface/not-enabled-error.js";
11
+ import { SurfaceLayer } from "../surface/surface-layer.js";
12
+ import { SurfaceRefusalReason } from "../surface/surface-refusal-reason.js";
6
13
  import { applySurfaceEdit, defaultConfigFile, planSurfaceEdit, } from "../surface/surface-config-writer.js";
7
14
  /**
8
15
  * `shrk surface`. Top-level introspection + opt-in management
@@ -13,33 +20,64 @@ import { applySurfaceEdit, defaultConfigFile, planSurfaceEdit, } from "../surfac
13
20
  * - disable <command> undo a prior enable
14
21
  * - hide <command> hide an extended command from --help
15
22
  * - unhide <command> reverse hide
16
- * - reset clear surface.enabled + surface.hidden
23
+ * - deny <selector> disable a command or a group (`<group> *`)
24
+ * - allow <selector> reverse a deny
25
+ * - reset clear surface.enabled + hidden + disabled
17
26
  * - explain <command> why this command has its current tier
18
27
  * - profiles [get <id>] list surface profiles (or show one)
28
+ *
29
+ * Every mutation edits the project config's OWN `surface{}` block (never the
30
+ * profile-merged view) and preserves its `profile`.
19
31
  */
20
32
  export const surfaceCommand = {
21
33
  name: 'surface',
34
+ positionals: PositionalMode.None,
35
+ subverbs: [
36
+ { name: 'list', description: 'Every command grouped by tier (the default).', usage: 'shrk surface list [--json]' },
37
+ { name: 'explain', description: 'Why a command has its current tier.', usage: 'shrk surface explain <command> [--json]', positionals: PositionalMode.Free },
38
+ { name: 'enable', description: 'Promote an experimental (or gated tool-maintenance) command to callable.', usage: 'shrk surface enable <command> [--write] [--json]', positionals: PositionalMode.Free },
39
+ { name: 'disable', description: 'Undo a prior enable.', usage: 'shrk surface disable <command> [--write] [--json]', positionals: PositionalMode.Free },
40
+ { name: 'hide', description: 'Hide an extended command from --help.', usage: 'shrk surface hide <command> [--write] [--json]', positionals: PositionalMode.Free },
41
+ { name: 'unhide', description: 'Reverse a hide.', usage: 'shrk surface unhide <command> [--write] [--json]', positionals: PositionalMode.Free },
42
+ {
43
+ name: 'deny',
44
+ description: 'Disable a command or a group (`<group> *`) here: not callable (exit 78), absent from --help.',
45
+ usage: "shrk surface deny <command|'<group> *'> [--write] [--json]",
46
+ positionals: PositionalMode.Free,
47
+ },
48
+ {
49
+ name: 'allow',
50
+ description: 'Reverse a deny: remove the selector from surface.disabled.',
51
+ usage: "shrk surface allow <command|'<group> *'> [--write] [--json]",
52
+ positionals: PositionalMode.Free,
53
+ },
54
+ { name: 'reset', description: 'Clear surface.enabled + surface.hidden + surface.disabled.', usage: 'shrk surface reset [--write] [--json]' },
55
+ { name: 'profiles', description: 'List the surface profiles, or show one.', usage: 'shrk surface profiles [get <id>] [--json]', positionals: PositionalMode.Free },
56
+ ],
22
57
  description: 'Inspect or change the adaptive command surface (core / extended / experimental tiers).',
23
- usage: 'shrk surface <list|enable|disable|hide|unhide|reset|explain|profiles> [name] [--write] [--json]',
58
+ usage: 'shrk surface <list|enable|disable|hide|unhide|deny|allow|reset|explain|profiles> [name] [--write] [--json]',
24
59
  async run(args) {
25
60
  const [verb, ...rest] = args.positional;
26
61
  const json = flagBool(args, 'json');
27
62
  const write = flagBool(args, 'write');
28
63
  const cwd = resolveCwd(args);
64
+ // A multi-word path (`surface enable docs check`) names ONE command.
65
+ const target = rest.length > 0 ? rest.join(' ') : undefined;
29
66
  switch (verb) {
30
67
  case undefined:
31
68
  case 'list':
32
69
  return await runList({ cwd, json });
33
70
  case 'explain':
34
- return await runExplain({ cwd, json, target: rest[0] });
71
+ return await runExplain({ cwd, json, target });
35
72
  case 'enable':
36
- return await runMutate({ cwd, json, write, target: rest[0], op: 'enable' });
37
73
  case 'disable':
38
- return await runMutate({ cwd, json, write, target: rest[0], op: 'disable' });
39
74
  case 'hide':
40
- return await runMutate({ cwd, json, write, target: rest[0], op: 'hide' });
41
75
  case 'unhide':
42
- return await runMutate({ cwd, json, write, target: rest[0], op: 'unhide' });
76
+ return await runMutate({ cwd, json, write, target, op: verb });
77
+ case 'deny':
78
+ return await runDeny({ cwd, json, write, target });
79
+ case 'allow':
80
+ return await runAllow({ cwd, json, write, target });
43
81
  case 'reset':
44
82
  return await runReset({ cwd, json, write });
45
83
  case 'profiles':
@@ -50,10 +88,19 @@ export const surfaceCommand = {
50
88
  }
51
89
  },
52
90
  };
91
+ /** The project config's OWN `surface{}` block — what every mutation edits. */
92
+ function rawSurface(loaded) {
93
+ return loaded.inspection.config?.surface ?? undefined;
94
+ }
95
+ function configFileOf(loaded, cwd) {
96
+ return (loaded.inspection.configFile ??
97
+ defaultConfigFile(loaded.inspection.sharkcraftDir ?? `${cwd}/sharkcraft`));
98
+ }
99
+ function allViews(summary) {
100
+ return [...summary.tiers.core, ...summary.tiers.extended, ...summary.tiers.experimental];
101
+ }
53
102
  async function runProfiles(opts) {
54
- const { context, inspection, availableProfiles, activeProfile } = await loadSurfaceContext({ cwd: opts.cwd });
55
- void inspection;
56
- void context;
103
+ const { availableProfiles, activeProfile } = await loadSurfaceContext({ cwd: opts.cwd });
57
104
  if (!opts.sub || opts.sub === 'list') {
58
105
  if (opts.json) {
59
106
  process.stdout.write(asJson({
@@ -72,7 +119,8 @@ async function runProfiles(opts) {
72
119
  const src = p.source === 'pack' ? ` (pack: ${p.pack})` : ` (builtin)`;
73
120
  const hiddenCount = p.hidden?.length ?? 0;
74
121
  const enabledCount = p.enabled?.length ?? 0;
75
- process.stdout.write(` ${tag} ${p.id.padEnd(14)} ${src.padEnd(20)} hides=${hiddenCount}, enables=${enabledCount}\n`);
122
+ const disabledCount = p.disabled?.length ?? 0;
123
+ process.stdout.write(` ${tag} ${p.id.padEnd(14)} ${src.padEnd(20)} hides=${hiddenCount}, enables=${enabledCount}, disables=${disabledCount}\n`);
76
124
  process.stdout.write(` ${p.description}\n`);
77
125
  }
78
126
  return 0;
@@ -96,6 +144,7 @@ async function runProfiles(opts) {
96
144
  process.stdout.write(kv('source', found.source + (found.pack ? ` (${found.pack})` : '')) + '\n');
97
145
  process.stdout.write(kv('hidden', String(found.hidden?.length ?? 0)) + '\n');
98
146
  process.stdout.write(kv('enabled', String(found.enabled?.length ?? 0)) + '\n');
147
+ process.stdout.write(kv('disabled', String(found.disabled?.length ?? 0)) + '\n');
99
148
  if (found.hidden && found.hidden.length > 0) {
100
149
  process.stdout.write('\nHidden:\n');
101
150
  for (const h of found.hidden)
@@ -106,6 +155,11 @@ async function runProfiles(opts) {
106
155
  for (const e of found.enabled)
107
156
  process.stdout.write(` + ${e}\n`);
108
157
  }
158
+ if (found.disabled && found.disabled.length > 0) {
159
+ process.stdout.write('\nDisabled:\n');
160
+ for (const d of found.disabled)
161
+ process.stdout.write(` x ${d}\n`);
162
+ }
109
163
  return 0;
110
164
  }
111
165
  process.stderr.write(`Unknown subcommand: surface profiles ${opts.sub}\nUse: list, get <id>\n`);
@@ -115,22 +169,31 @@ async function runList({ cwd, json }) {
115
169
  const { context, activeProfile } = await loadSurfaceContext({ cwd });
116
170
  const summary = buildSurfaceSummary(context);
117
171
  if (json) {
118
- process.stdout.write(asJson({ ...summary, activeProfile: activeProfile?.id ?? null }) + '\n');
172
+ process.stdout.write(asJson({ ...summary, activeProfile: activeProfile?.id ?? null, isToolRepo: context.isToolRepo }) + '\n');
119
173
  return 0;
120
174
  }
121
- renderSurfaceText(summary, activeProfile?.id);
175
+ renderSurfaceText(summary, activeProfile?.id, context.isToolRepo);
122
176
  return 0;
123
177
  }
124
- function renderSurfaceText(summary, activeProfileId) {
178
+ function renderSurfaceText(summary, activeProfileId, isToolRepo) {
125
179
  process.stdout.write(header('Command surface'));
126
180
  process.stdout.write(kv('schema', summary.schema) + '\n');
127
181
  process.stdout.write(kv('hash', summary.hash) + '\n');
128
182
  process.stdout.write(kv('profile', activeProfileId ?? '(none — sharkcraft.config.ts surface.profile not set)') + '\n');
183
+ process.stdout.write(kv('host', isToolRepo
184
+ ? "SharkCraft's own repository (tool-maintenance commands callable)"
185
+ : 'not the SharkCraft repository (tool-maintenance commands gated)') + '\n');
129
186
  process.stdout.write(kv('core', String(summary.totals.core)) + '\n');
130
187
  process.stdout.write(kv('extended', String(summary.totals.extended)) + '\n');
131
188
  process.stdout.write(kv('experimental', String(summary.totals.experimental)) + '\n');
132
189
  process.stdout.write(kv('visible in --help', String(summary.totals.visible)) + '\n');
133
190
  process.stdout.write(kv('callable', String(summary.totals.callable)) + '\n');
191
+ process.stdout.write(kv('uncatalogued', String(summary.totals.uncatalogued)) + '\n');
192
+ if (!summary.registryBacked) {
193
+ // Only reachable from a direct engine call: never pass a partial listing
194
+ // off as the dispatch table.
195
+ process.stdout.write(kv('inventory', 'PARTIAL — catalog rows only (no command registry); run `shrk surface list`') + '\n');
196
+ }
134
197
  process.stdout.write('\n');
135
198
  printBucket('core', summary.tiers.core);
136
199
  printBucket('extended', summary.tiers.extended);
@@ -148,25 +211,46 @@ function printBucket(label, items) {
148
211
  process.stdout.write(' (empty)\n');
149
212
  return;
150
213
  }
214
+ // command | what it does | who it is for | flags. The tier `detail` stays in
215
+ // `surface explain` and `--json`: it used to be the only text column, and
216
+ // for every extended row it was the same placeholder sentence. The audience
217
+ // column answers "is this for me?" next to "does this exist?".
151
218
  const rows = items.map((c) => {
152
219
  const flags = [];
153
220
  if (c.hidden)
154
221
  flags.push('hidden');
155
222
  if (c.enabled)
156
223
  flags.push('enabled');
224
+ if (c.disabled)
225
+ flags.push('disabled');
157
226
  if (!c.callable)
158
227
  flags.push('gated');
228
+ if (!c.catalogued && c.dispatch !== CommandDispatchKind.Meta)
229
+ flags.push('uncatalogued');
230
+ if (c.audience.includes(CommandAudience.ToolMaintenance))
231
+ flags.push('tool-maintenance');
159
232
  if (c.pack)
160
233
  flags.push(`pack:${c.pack}`);
161
- return [
162
- ' ' + c.command,
163
- c.source,
164
- flags.join(','),
165
- c.detail ?? '',
166
- ];
234
+ return [' ' + c.command, oneLineDescription(c.description), c.audience.join(','), flags.join(',')];
167
235
  });
168
236
  process.stdout.write(table(rows) + '\n');
169
237
  }
238
+ /** First sentence of a description, at most 72 characters. */
239
+ function oneLineDescription(description) {
240
+ const flat = description.replace(/\s+/g, ' ').trim();
241
+ const dot = flat.search(/[.!?](\s|$)/);
242
+ const sentence = dot > 0 ? flat.slice(0, dot + 1) : flat;
243
+ return sentence.length > 72 ? sentence.slice(0, 71).trimEnd() + '…' : sentence;
244
+ }
245
+ /** Why a view has its tier, when the resolver attached no detail. */
246
+ function tierExplanation(view) {
247
+ if (view.detail)
248
+ return view.detail;
249
+ if (view.source === TierSource.Default) {
250
+ return `${view.tier} — default tier (not in a spine pipeline, not pack-contributed)`;
251
+ }
252
+ return undefined;
253
+ }
170
254
  async function runExplain({ cwd, json, target }) {
171
255
  if (!target) {
172
256
  process.stderr.write('Usage: shrk surface explain <command>\n');
@@ -185,27 +269,45 @@ async function runExplain({ cwd, json, target }) {
185
269
  process.stderr.write(`Unknown command: ${target}\n`);
186
270
  return 2;
187
271
  }
188
- // Attribute the hide/enable to a profile when one is active.
189
- const hiddenByProfile = !!activeProfile?.hidden?.includes(target);
190
- const enabledByProfile = !!activeProfile?.enabled?.includes(target);
272
+ // Attribute the hide/enable to a profile when one is active (the same
273
+ // selector matcher the resolver uses — `bundle *` names `bundle list`).
274
+ const hiddenByProfile = firstMatchingSelector(activeProfile?.hidden, [view.command]) !== undefined;
275
+ const enabledByProfile = firstMatchingSelector(activeProfile?.enabled, [view.command]) !== undefined;
276
+ const disabledByProfile = view.deniedBy?.origin === SurfaceLayer.Profile;
191
277
  if (json) {
192
278
  process.stdout.write(asJson({
193
279
  ...view,
194
280
  activeProfile: activeProfile?.id ?? null,
281
+ isToolRepo: context.isToolRepo,
195
282
  hiddenByProfile,
196
283
  enabledByProfile,
284
+ disabledByProfile,
197
285
  }) + '\n');
198
286
  return 0;
199
287
  }
200
- process.stdout.write(header(`Surface — ${target}`));
288
+ process.stdout.write(header(`Surface — ${view.command}`));
289
+ process.stdout.write(kv('description', view.description) + '\n');
290
+ if (view.usage)
291
+ process.stdout.write(kv('usage', view.usage) + '\n');
292
+ process.stdout.write(kv('dispatch', view.dispatch) + '\n');
293
+ process.stdout.write(kv('catalogued', view.catalogued
294
+ ? 'yes'
295
+ : context.isToolRepo
296
+ ? 'no — run `shrk commands doctor`'
297
+ : "no — missing from SharkCraft's command catalog (a SharkCraft catalog gap)") + '\n');
298
+ process.stdout.write(kv('audience', view.audience.join(', ')) + '\n');
299
+ if (view.variants.length > 0)
300
+ process.stdout.write(kv('variants', view.variants.join(' · ')) + '\n');
201
301
  process.stdout.write(kv('tier', view.tier) + '\n');
202
302
  process.stdout.write(kv('source', view.source) + '\n');
203
- if (view.detail)
204
- process.stdout.write(kv('detail', view.detail) + '\n');
303
+ const explanation = tierExplanation(view);
304
+ if (explanation)
305
+ process.stdout.write(kv('detail', explanation) + '\n');
205
306
  process.stdout.write(kv('callable', String(view.callable)) + '\n');
206
307
  process.stdout.write(kv('visible-in-help', String(view.visibleInHelp)) + '\n');
207
308
  process.stdout.write(kv('hidden-by-config', String(view.hidden)) + '\n');
208
309
  process.stdout.write(kv('enabled-by-config', String(view.enabled)) + '\n');
310
+ process.stdout.write(kv('disabled', String(view.disabled)) + '\n');
209
311
  if (view.pack)
210
312
  process.stdout.write(kv('pack', view.pack) + '\n');
211
313
  if (activeProfile) {
@@ -214,12 +316,22 @@ async function runExplain({ cwd, json, target }) {
214
316
  process.stdout.write(kv('hidden-by-profile', 'yes — profile hides this from --help') + '\n');
215
317
  if (enabledByProfile)
216
318
  process.stdout.write(kv('enabled-by-profile', 'yes — profile turns this on') + '\n');
319
+ if (disabledByProfile)
320
+ process.stdout.write(kv('disabled-by-profile', 'yes — profile disables this') + '\n');
217
321
  }
218
322
  if (view.tier === CommandTier.Experimental && !view.callable) {
323
+ const refusal = surfaceRefusalFor(view);
219
324
  process.stdout.write('\nWhy gated: ' + (view.detail ?? 'experimental — opt-in required.') + '\n');
220
- process.stdout.write('\nTo enable:\n');
221
- process.stdout.write(` $ shrk surface enable ${target} --write\n`);
222
- if (activeProfile) {
325
+ if (refusal.reasonCode === SurfaceRefusalReason.ToolMaintenance) {
326
+ process.stdout.write("It maintains SharkCraft itself (its docs set, examples, release artifacts or command catalog), so it does not apply to this repository. Invoking it exits 78 — this is not a check failure.\n");
327
+ }
328
+ const remedy = refusal.enableCommand.endsWith('--write') ? refusal.enableCommand : `${refusal.enableCommand} --write`;
329
+ const allowAgain = refusal.reasonCode === SurfaceRefusalReason.Disabled && view.deniedBy?.origin === SurfaceLayer.Config;
330
+ process.stdout.write(allowAgain ? '\nTo allow it again:\n' : '\nTo enable:\n');
331
+ process.stdout.write(` $ ${remedy}\n`);
332
+ // Another profile only helps when the profile is what gates it.
333
+ const profileGated = refusal.reasonCode === SurfaceRefusalReason.Experimental || view.deniedBy?.origin === SurfaceLayer.Profile;
334
+ if (activeProfile && profileGated) {
223
335
  process.stdout.write(`\nOr switch profile (current: ${activeProfile.id}):\n`);
224
336
  process.stdout.write(' $ shrk surface profiles list\n');
225
337
  }
@@ -238,8 +350,8 @@ async function runMutate({ cwd, json, write, target, op }) {
238
350
  process.stderr.write(`Usage: shrk surface ${op} <command> [--write]\n`);
239
351
  return 2;
240
352
  }
241
- const { context, inspection } = await loadSurfaceContext({ cwd });
242
- const summary = buildSurfaceSummary(context);
353
+ const loaded = await loadSurfaceContext({ cwd });
354
+ const summary = buildSurfaceSummary(loaded.context);
243
355
  const view = findCommandInSummary(summary, target);
244
356
  if (!view) {
245
357
  process.stderr.write(`Unknown command: ${target}\n`);
@@ -250,22 +362,10 @@ async function runMutate({ cwd, json, write, target, op }) {
250
362
  process.stderr.write(refusal + '\n');
251
363
  return 2;
252
364
  }
253
- const edit = toEdit(op, target);
254
- const configFile = inspection.configFile ?? defaultConfigFile(inspection.sharkcraftDir ?? `${cwd}/sharkcraft`);
255
- const diff = planSurfaceEdit(configFile, context.surfaceConfig, [edit]);
256
- if (json) {
257
- process.stdout.write(asJson({ diff, willWrite: write }) + '\n');
258
- }
259
- else {
260
- renderDiffText(diff, write);
261
- }
262
- if (!write)
263
- return 0;
264
- const result = applySurfaceEdit(diff);
265
- if (!json) {
266
- process.stdout.write(`\nWrote ${result.configFile} (${result.edits.length} edit${result.edits.length === 1 ? '' : 's'}).\n`);
267
- }
268
- return 0;
365
+ // The canonical path (never a flag variant, which no selector would match).
366
+ const edit = toEdit(op, view.command);
367
+ const diff = planSurfaceEdit(configFileOf(loaded, cwd), rawSurface(loaded), [edit]);
368
+ return await emitDiff(diff, { json, write });
269
369
  }
270
370
  function refuseIfInvalid(op, view) {
271
371
  if (view.tier === CommandTier.Core && (op === 'disable' || op === 'hide')) {
@@ -274,6 +374,10 @@ function refuseIfInvalid(op, view) {
274
374
  if (op === 'hide' && view.tier === CommandTier.Experimental) {
275
375
  return `Cannot hide an experimental command (${view.command}); use disable instead.`;
276
376
  }
377
+ if (op === 'enable' && view.deniedBy?.origin === SurfaceLayer.Config) {
378
+ return (`${view.command} is disabled by surface.disabled ('${view.deniedBy.selector}'), which wins over surface.enabled. ` +
379
+ `Run: shrk surface allow '${view.deniedBy.selector}' --write`);
380
+ }
277
381
  if (op === 'enable' && view.tier !== CommandTier.Experimental && !view.enabled) {
278
382
  return `Refusing no-op: ${view.command} is not experimental (tier=${view.tier}).`;
279
383
  }
@@ -297,17 +401,92 @@ function toEdit(op, command) {
297
401
  return { field: 'hidden', command, operation: 'remove' };
298
402
  }
299
403
  }
404
+ /** A command a deny can never reach: Core (bootstrap / spine / meta) or a bootstrap subverb. */
405
+ function isDenyProtected(view) {
406
+ return view.tier === CommandTier.Core || isBootstrapFamily(view.command);
407
+ }
408
+ /**
409
+ * `surface deny <selector>` — add an exact path or `<group> *` to
410
+ * `surface.disabled`. Refused (2) when the selector names no command, only
411
+ * core commands, or is already denied.
412
+ */
413
+ async function runDeny({ cwd, json, write, target }) {
414
+ if (!target) {
415
+ process.stderr.write("Usage: shrk surface deny <command|'<group> *'> [--write]\n");
416
+ return 2;
417
+ }
418
+ const loaded = await loadSurfaceContext({ cwd });
419
+ const summary = buildSurfaceSummary(loaded.context);
420
+ const matched = allViews(summary).filter((v) => matchesSurfaceSelector(target, v.command));
421
+ if (matched.length === 0) {
422
+ process.stderr.write(`'${target}' names no command. A group selector is '<group> *' (e.g. 'bundle *'); ` +
423
+ 'run `shrk surface list` for the paths.\n');
424
+ return 2;
425
+ }
426
+ const protectedViews = matched.filter(isDenyProtected);
427
+ const deniable = matched.filter((v) => !isDenyProtected(v));
428
+ if (deniable.length === 0) {
429
+ process.stderr.write(`Cannot disable a core command (${matched.map((v) => v.command).join(', ')}).\n`);
430
+ return 2;
431
+ }
432
+ const raw = rawSurface(loaded);
433
+ if ((raw?.disabled ?? []).includes(target)) {
434
+ process.stderr.write(`Refusing no-op: '${target}' is already in surface.disabled.\n`);
435
+ return 2;
436
+ }
437
+ const diff = planSurfaceEdit(configFileOf(loaded, cwd), raw, [
438
+ { field: 'disabled', command: target, operation: 'add' },
439
+ ]);
440
+ const notes = [`Denies ${deniable.length} command(s): ${previewList(deniable.map((v) => v.command))}`];
441
+ if (protectedViews.length > 0) {
442
+ notes.push(`Stays callable (core / bootstrap): ${previewList(protectedViews.map((v) => v.command))}`);
443
+ }
444
+ return await emitDiff(diff, {
445
+ json,
446
+ write,
447
+ notes,
448
+ extra: { denies: deniable.map((v) => v.command), protected: protectedViews.map((v) => v.command) },
449
+ });
450
+ }
451
+ /** `surface allow <selector>` — remove a selector from the config's `surface.disabled`. */
452
+ async function runAllow({ cwd, json, write, target }) {
453
+ if (!target) {
454
+ process.stderr.write("Usage: shrk surface allow <command|'<group> *'> [--write]\n");
455
+ return 2;
456
+ }
457
+ const loaded = await loadSurfaceContext({ cwd });
458
+ const raw = rawSurface(loaded);
459
+ const configDisabled = raw?.disabled ?? [];
460
+ if (!configDisabled.includes(target)) {
461
+ const profile = loaded.activeProfile;
462
+ if (profile?.disabled?.includes(target)) {
463
+ process.stderr.write(`'${target}' is disabled by the '${profile.id}' surface profile, not by surface.disabled. ` +
464
+ 'Override it for one command with `shrk surface enable "<command>" --write`, or choose another profile.\n');
465
+ return 2;
466
+ }
467
+ process.stderr.write(`Refusing no-op: '${target}' is not in surface.disabled` +
468
+ (configDisabled.length > 0 ? ` (entries: ${configDisabled.join(', ')}).\n` : '.\n'));
469
+ return 2;
470
+ }
471
+ const diff = planSurfaceEdit(configFileOf(loaded, cwd), raw, [
472
+ { field: 'disabled', command: target, operation: 'remove' },
473
+ ]);
474
+ return await emitDiff(diff, { json, write });
475
+ }
300
476
  async function runReset({ cwd, json, write }) {
301
- const { context, inspection } = await loadSurfaceContext({ cwd });
477
+ const loaded = await loadSurfaceContext({ cwd });
478
+ const raw = rawSurface(loaded);
302
479
  const edits = [];
303
- for (const name of context.surfaceConfig?.enabled ?? []) {
480
+ for (const name of raw?.enabled ?? []) {
304
481
  edits.push({ field: 'enabled', command: name, operation: 'remove' });
305
482
  }
306
- for (const name of context.surfaceConfig?.hidden ?? []) {
483
+ for (const name of raw?.hidden ?? []) {
307
484
  edits.push({ field: 'hidden', command: name, operation: 'remove' });
308
485
  }
309
- const configFile = inspection.configFile ?? defaultConfigFile(inspection.sharkcraftDir ?? `${cwd}/sharkcraft`);
310
- const diff = planSurfaceEdit(configFile, context.surfaceConfig, edits);
486
+ for (const name of raw?.disabled ?? []) {
487
+ edits.push({ field: 'disabled', command: name, operation: 'remove' });
488
+ }
489
+ const diff = planSurfaceEdit(configFileOf(loaded, cwd), raw, edits);
311
490
  if (json) {
312
491
  process.stdout.write(asJson({ diff, willWrite: write }) + '\n');
313
492
  }
@@ -321,7 +500,23 @@ async function runReset({ cwd, json, write }) {
321
500
  process.stdout.write(`\nWrote ${diff.configFile} (reset).\n`);
322
501
  return 0;
323
502
  }
324
- function renderDiffText(diff, willWrite) {
503
+ /** Print (text or JSON) a planned edit, and apply it under `--write`. */
504
+ async function emitDiff(diff, opts) {
505
+ if (opts.json) {
506
+ process.stdout.write(asJson({ diff, willWrite: opts.write, ...(opts.extra ?? {}) }) + '\n');
507
+ }
508
+ else {
509
+ renderDiffText(diff, opts.write, opts.notes ?? []);
510
+ }
511
+ if (!opts.write)
512
+ return 0;
513
+ const result = applySurfaceEdit(diff);
514
+ if (!opts.json) {
515
+ process.stdout.write(`\nWrote ${result.configFile} (${result.edits.length} edit${result.edits.length === 1 ? '' : 's'}).\n`);
516
+ }
517
+ return 0;
518
+ }
519
+ function renderDiffText(diff, willWrite, notes = []) {
325
520
  process.stdout.write(header('Surface config edit'));
326
521
  process.stdout.write(kv('configFile', diff.configFile) + '\n');
327
522
  process.stdout.write(kv('edits', String(diff.edits.length)) + '\n');
@@ -329,7 +524,14 @@ function renderDiffText(diff, willWrite) {
329
524
  const sign = edit.operation === 'add' ? '+' : '-';
330
525
  process.stdout.write(` ${sign} surface.${edit.field}: ${edit.command}\n`);
331
526
  }
527
+ for (const note of notes)
528
+ process.stdout.write(`${note}\n`);
332
529
  if (!willWrite) {
333
530
  process.stdout.write('\nDry run. Pass --write to apply.\n');
334
531
  }
335
532
  }
533
+ /** At most eight paths, then `(+N more)`. */
534
+ function previewList(paths) {
535
+ const head = paths.slice(0, 8).join(', ');
536
+ return paths.length > 8 ? `${head} (+${paths.length - 8} more)` : head;
537
+ }
@@ -455,7 +455,7 @@ async function collectLikelyFilesV2(input) {
455
455
  if (generatedFiles.length > 0)
456
456
  suggestedFirstCommands.push('shrk generated report');
457
457
  if (stabilityWarnings.length > 0)
458
- suggestedFirstCommands.push('shrk stability map');
458
+ suggestedFirstCommands.push('shrk ingest report');
459
459
  if (suggestedFirstCommands.length === 0)
460
460
  suggestedFirstCommands.push('shrk task "' + task + '"');
461
461
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"task.command.d.ts","sourceRoot":"","sources":["../../src/commands/task.command.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAkEhC,eAAO,MAAM,WAAW,EAAE,eAgRzB,CAAC"}
1
+ {"version":3,"file":"task.command.d.ts","sourceRoot":"","sources":["../../src/commands/task.command.ts"],"names":[],"mappings":"AAkBA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAqEhC,eAAO,MAAM,WAAW,EAAE,eA+RzB,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { buildKnowledgeStaleReport, buildScaffoldCoverageReport, buildSpecList, buildTaskPacket, buildTemplateDriftReport, buildUncertaintySummary, decomposeTask, entrypointBanner, inspectSharkcraft, lintKnowledge, renderScaffoldCoverageMarkdown, renderUncertaintyText, runDoctor, } from '@shrkcrft/inspector';
2
2
  import { SpecStatus } from '@shrkcrft/generator';
3
+ import { templateRemainderSummary } from '@shrkcrft/templates';
3
4
  import { flagBool, flagNumber, flagList, resolveCwd, } from "../command-registry.js";
5
+ import { PositionalMode } from "../dispatch/positional-mode.js";
4
6
  import { asJson, header, kv } from "../output/format-output.js";
5
7
  import { buildTaskNextReport } from "../task-next/task-next-ranker.js";
6
8
  /**
@@ -21,7 +23,8 @@ function compactTaskPacket(p) {
21
23
  })),
22
24
  relevantRules: p.relevantRules.map((r) => ({ id: r.id, title: r.title })),
23
25
  relevantPaths: p.relevantPaths.map((r) => ({ id: r.id, title: r.title })),
24
- relevantTemplates: p.relevantTemplates.map((t) => ({ id: t.id, name: t.name })),
26
+ // A template's declared remainder rides on its row (R11-GAP-7).
27
+ relevantTemplates: p.relevantTemplates.map((t) => ({ id: t.id, name: t.name, ...templateRemainderSummary(t) })),
25
28
  recommendedMcpTools: p.recommendedMcpTools,
26
29
  recommendedCliCommands: p.recommendedCliCommands,
27
30
  forbiddenActions: p.forbiddenActions,
@@ -56,6 +59,7 @@ function minimalTaskPacket(p) {
56
59
  id: t.id,
57
60
  name: t.name,
58
61
  ...(t.appliesWhen.length > 0 ? { appliesWhen: t.appliesWhen } : {}),
62
+ ...templateRemainderSummary(t),
59
63
  })),
60
64
  verificationCommands: p.verificationCommands,
61
65
  recommendedMcpTools: p.recommendedMcpTools,
@@ -64,6 +68,16 @@ function minimalTaskPacket(p) {
64
68
  }
65
69
  export const taskCommand = {
66
70
  name: 'task',
71
+ // The positionals are the free-form task (`task "add a thing"`).
72
+ positionals: PositionalMode.Free,
73
+ subverbs: [
74
+ {
75
+ name: 'decompose',
76
+ description: 'Decompose a task into ranked subtasks.',
77
+ usage: 'shrk task decompose "<task>" [--json]',
78
+ positionals: PositionalMode.Free,
79
+ },
80
+ ],
67
81
  description: 'Build an AI-ready task packet: relevant context, action hints, recommended pipeline, templates, paths, verification commands. Defaults to a compact packet (top-5 rules / top-3 templates / 5 hints per field) to keep agent token cost low. Pass `--full` to get the unrestricted packet, or `--next` to skip the packet and survey the workspace for the highest-leverage next action.',
68
82
  usage: 'shrk [--cwd <dir>] task "<task>" [--max-tokens 4000] [--scope x,y] [--explain-ranking] [--full] [--json] OR shrk task --next [--json]',
69
83
  async run(args) {
@@ -73,6 +87,8 @@ export const taskCommand = {
73
87
  // command. Pure ranker over existing JSON outputs.
74
88
  if (flagBool(args, 'next')) {
75
89
  const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
90
+ // Warm before the stale report resolves any id (CLAUDE.md "Warm before you resolve").
91
+ await (await import("../surface/cli-command-resolver.js")).warmCliReferenceRegistries(inspection);
76
92
  const [doctorRes, staleRes, driftRes] = await Promise.all([
77
93
  runDoctor(inspection),
78
94
  Promise.resolve(buildKnowledgeStaleReport(inspection)),
@@ -259,6 +275,11 @@ export const taskCommand = {
259
275
  process.stdout.write('\nRelevant templates:\n');
260
276
  for (const t of packet.relevantTemplates.slice(0, 6)) {
261
277
  process.stdout.write(` • ${t.id} ${t.name}\n`);
278
+ const remainder = templateRemainderSummary(t);
279
+ if (remainder.notScaffolded)
280
+ process.stdout.write(` not scaffolded: ${remainder.notScaffolded.join(', ')}\n`);
281
+ if (remainder.manualSteps)
282
+ process.stdout.write(` manual steps: ${remainder.manualSteps.length}\n`);
262
283
  }
263
284
  }
264
285
  if (packet.suggestedGen) {
@@ -19,6 +19,10 @@ export declare const templatesAddCommand: ICommandHandler;
19
19
  * Distinct from `templates lint` (which surfaces test-style findings)
20
20
  * and `templates drift` (which compares declared vs. rendered output)
21
21
  * by combining them with a clean/dirty verdict + per-template summary.
22
+ * Lint is READ, never re-derived: a template `templates lint` fails can
23
+ * never read "Clean" here. Settled against coverage — 0 templates, or a
24
+ * template whose `changes()` threw with sample variables (its operations
25
+ * were never checked), is NOT VERIFIED (2), never a pass.
22
26
  */
23
27
  export declare const templatesDoctorCommand: ICommandHandler;
24
28
  export declare const templatesUpdateCommand: ICommandHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.command.d.ts","sourceRoot":"","sources":["../../src/commands/templates.command.ts"],"names":[],"mappings":"AAyBA,OAAO,EAML,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,oBAAoB,EAAE,eA6DlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAmBlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eA+CjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAgBpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAiDrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAWnC,CAAC;AAgNF,eAAO,MAAM,2BAA2B,EAAE,eA+BzC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAOnC,CAAC;AA2GF,eAAO,MAAM,wBAAwB,EAAE,eA+FtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAKjC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAyCpC,CAAC;AAwHF,eAAO,MAAM,sBAAsB,EAAE,eAiKpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAkEpC,CAAC"}
1
+ {"version":3,"file":"templates.command.d.ts","sourceRoot":"","sources":["../../src/commands/templates.command.ts"],"names":[],"mappings":"AAiCA,OAAO,EAOL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,oBAAoB,EAAE,eA6DlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eA0BlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAoDjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAmBpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAmDrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAWnC,CAAC;AAmNF,eAAO,MAAM,2BAA2B,EAAE,eAgCzC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAOnC,CAAC;AA2GF,eAAO,MAAM,wBAAwB,EAAE,eA+FtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAKjC,CAAC;AAiBF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAoFpC,CAAC;AAwHF,eAAO,MAAM,sBAAsB,EAAE,eAiKpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAkEpC,CAAC"}