@shrkcrft/cli 0.1.0-alpha.2

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 (450) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/asset-preview/apply-action-hint-stub.d.ts +28 -0
  4. package/dist/asset-preview/apply-action-hint-stub.d.ts.map +1 -0
  5. package/dist/asset-preview/apply-action-hint-stub.js +170 -0
  6. package/dist/asset-preview/apply-asset-preview.d.ts +31 -0
  7. package/dist/asset-preview/apply-asset-preview.d.ts.map +1 -0
  8. package/dist/asset-preview/apply-asset-preview.js +210 -0
  9. package/dist/asset-preview/apply-knowledge-stale-fix.d.ts +37 -0
  10. package/dist/asset-preview/apply-knowledge-stale-fix.d.ts.map +1 -0
  11. package/dist/asset-preview/apply-knowledge-stale-fix.js +344 -0
  12. package/dist/asset-preview/apply-missing-barrel.d.ts +15 -0
  13. package/dist/asset-preview/apply-missing-barrel.d.ts.map +1 -0
  14. package/dist/asset-preview/apply-missing-barrel.js +65 -0
  15. package/dist/asset-preview/apply-template-drift-fix.d.ts +21 -0
  16. package/dist/asset-preview/apply-template-drift-fix.d.ts.map +1 -0
  17. package/dist/asset-preview/apply-template-drift-fix.js +125 -0
  18. package/dist/asset-preview/apply-template-update.d.ts +43 -0
  19. package/dist/asset-preview/apply-template-update.d.ts.map +1 -0
  20. package/dist/asset-preview/apply-template-update.js +257 -0
  21. package/dist/asset-preview/entry-mutator.d.ts +106 -0
  22. package/dist/asset-preview/entry-mutator.d.ts.map +1 -0
  23. package/dist/asset-preview/entry-mutator.js +428 -0
  24. package/dist/authoring/authoring-kit.d.ts +36 -0
  25. package/dist/authoring/authoring-kit.d.ts.map +1 -0
  26. package/dist/authoring/authoring-kit.js +106 -0
  27. package/dist/command-registry.d.ts +158 -0
  28. package/dist/command-registry.d.ts.map +1 -0
  29. package/dist/command-registry.js +348 -0
  30. package/dist/commands/apply.command.d.ts +3 -0
  31. package/dist/commands/apply.command.d.ts.map +1 -0
  32. package/dist/commands/apply.command.js +879 -0
  33. package/dist/commands/architecture.command.d.ts +5 -0
  34. package/dist/commands/architecture.command.d.ts.map +1 -0
  35. package/dist/commands/architecture.command.js +141 -0
  36. package/dist/commands/ask.command.d.ts +3 -0
  37. package/dist/commands/ask.command.d.ts.map +1 -0
  38. package/dist/commands/ask.command.js +58 -0
  39. package/dist/commands/audit.command.d.ts +3 -0
  40. package/dist/commands/audit.command.d.ts.map +1 -0
  41. package/dist/commands/audit.command.js +141 -0
  42. package/dist/commands/biome.command.d.ts +7 -0
  43. package/dist/commands/biome.command.d.ts.map +1 -0
  44. package/dist/commands/biome.command.js +350 -0
  45. package/dist/commands/boundaries.command.d.ts +9 -0
  46. package/dist/commands/boundaries.command.d.ts.map +1 -0
  47. package/dist/commands/boundaries.command.js +314 -0
  48. package/dist/commands/brief.command.d.ts +3 -0
  49. package/dist/commands/brief.command.d.ts.map +1 -0
  50. package/dist/commands/brief.command.js +206 -0
  51. package/dist/commands/bundle.command.d.ts +3 -0
  52. package/dist/commands/bundle.command.d.ts.map +1 -0
  53. package/dist/commands/bundle.command.js +1183 -0
  54. package/dist/commands/changes.command.d.ts +3 -0
  55. package/dist/commands/changes.command.d.ts.map +1 -0
  56. package/dist/commands/changes.command.js +155 -0
  57. package/dist/commands/check.command.d.ts +3 -0
  58. package/dist/commands/check.command.d.ts.map +1 -0
  59. package/dist/commands/check.command.js +553 -0
  60. package/dist/commands/checks.command.d.ts +29 -0
  61. package/dist/commands/checks.command.d.ts.map +1 -0
  62. package/dist/commands/checks.command.js +521 -0
  63. package/dist/commands/ci.command.d.ts +3 -0
  64. package/dist/commands/ci.command.d.ts.map +1 -0
  65. package/dist/commands/ci.command.js +680 -0
  66. package/dist/commands/codemod.command.d.ts +3 -0
  67. package/dist/commands/codemod.command.d.ts.map +1 -0
  68. package/dist/commands/codemod.command.js +130 -0
  69. package/dist/commands/command-catalog.d.ts +265 -0
  70. package/dist/commands/command-catalog.d.ts.map +1 -0
  71. package/dist/commands/command-catalog.js +3242 -0
  72. package/dist/commands/commands.command.d.ts +92 -0
  73. package/dist/commands/commands.command.d.ts.map +1 -0
  74. package/dist/commands/commands.command.js +1208 -0
  75. package/dist/commands/constructs.command.d.ts +15 -0
  76. package/dist/commands/constructs.command.d.ts.map +1 -0
  77. package/dist/commands/constructs.command.js +669 -0
  78. package/dist/commands/context.command.d.ts +3 -0
  79. package/dist/commands/context.command.d.ts.map +1 -0
  80. package/dist/commands/context.command.js +120 -0
  81. package/dist/commands/contract-gate.command.d.ts +5 -0
  82. package/dist/commands/contract-gate.command.d.ts.map +1 -0
  83. package/dist/commands/contract-gate.command.js +208 -0
  84. package/dist/commands/contract-templates.command.d.ts +8 -0
  85. package/dist/commands/contract-templates.command.d.ts.map +1 -0
  86. package/dist/commands/contract-templates.command.js +151 -0
  87. package/dist/commands/contract.command.d.ts +3 -0
  88. package/dist/commands/contract.command.d.ts.map +1 -0
  89. package/dist/commands/contract.command.js +105 -0
  90. package/dist/commands/conventions.command.d.ts +8 -0
  91. package/dist/commands/conventions.command.d.ts.map +1 -0
  92. package/dist/commands/conventions.command.js +169 -0
  93. package/dist/commands/coverage.command.d.ts +3 -0
  94. package/dist/commands/coverage.command.d.ts.map +1 -0
  95. package/dist/commands/coverage.command.js +56 -0
  96. package/dist/commands/daily.commands.d.ts +5 -0
  97. package/dist/commands/daily.commands.d.ts.map +1 -0
  98. package/dist/commands/daily.commands.js +224 -0
  99. package/dist/commands/dashboard-export.command.d.ts +4 -0
  100. package/dist/commands/dashboard-export.command.d.ts.map +1 -0
  101. package/dist/commands/dashboard-export.command.js +86 -0
  102. package/dist/commands/dashboard.command.d.ts +3 -0
  103. package/dist/commands/dashboard.command.d.ts.map +1 -0
  104. package/dist/commands/dashboard.command.js +106 -0
  105. package/dist/commands/dev.command.d.ts +3 -0
  106. package/dist/commands/dev.command.d.ts.map +1 -0
  107. package/dist/commands/dev.command.js +1392 -0
  108. package/dist/commands/diagnostics.command.d.ts +5 -0
  109. package/dist/commands/diagnostics.command.d.ts.map +1 -0
  110. package/dist/commands/diagnostics.command.js +97 -0
  111. package/dist/commands/docs.command.d.ts +4 -0
  112. package/dist/commands/docs.command.d.ts.map +1 -0
  113. package/dist/commands/docs.command.js +34 -0
  114. package/dist/commands/doctor.command.d.ts +7 -0
  115. package/dist/commands/doctor.command.d.ts.map +1 -0
  116. package/dist/commands/doctor.command.js +681 -0
  117. package/dist/commands/drift.command.d.ts +3 -0
  118. package/dist/commands/drift.command.d.ts.map +1 -0
  119. package/dist/commands/drift.command.js +124 -0
  120. package/dist/commands/eslint.command.d.ts +7 -0
  121. package/dist/commands/eslint.command.d.ts.map +1 -0
  122. package/dist/commands/eslint.command.js +423 -0
  123. package/dist/commands/explore.command.d.ts +3 -0
  124. package/dist/commands/explore.command.d.ts.map +1 -0
  125. package/dist/commands/explore.command.js +65 -0
  126. package/dist/commands/export-bundle.command.d.ts +6 -0
  127. package/dist/commands/export-bundle.command.d.ts.map +1 -0
  128. package/dist/commands/export-bundle.command.js +96 -0
  129. package/dist/commands/export.command.d.ts +3 -0
  130. package/dist/commands/export.command.d.ts.map +1 -0
  131. package/dist/commands/export.command.js +83 -0
  132. package/dist/commands/feedback-dispatch.command.d.ts +12 -0
  133. package/dist/commands/feedback-dispatch.command.d.ts.map +1 -0
  134. package/dist/commands/feedback-dispatch.command.js +63 -0
  135. package/dist/commands/feedback.command.d.ts +11 -0
  136. package/dist/commands/feedback.command.d.ts.map +1 -0
  137. package/dist/commands/feedback.command.js +336 -0
  138. package/dist/commands/fix.command.d.ts +3 -0
  139. package/dist/commands/fix.command.d.ts.map +1 -0
  140. package/dist/commands/fix.command.js +776 -0
  141. package/dist/commands/gen.command.d.ts +3 -0
  142. package/dist/commands/gen.command.d.ts.map +1 -0
  143. package/dist/commands/gen.command.js +136 -0
  144. package/dist/commands/git.command.d.ts +6 -0
  145. package/dist/commands/git.command.d.ts.map +1 -0
  146. package/dist/commands/git.command.js +81 -0
  147. package/dist/commands/graph.command.d.ts +3 -0
  148. package/dist/commands/graph.command.d.ts.map +1 -0
  149. package/dist/commands/graph.command.js +287 -0
  150. package/dist/commands/grounding.command.d.ts +7 -0
  151. package/dist/commands/grounding.command.d.ts.map +1 -0
  152. package/dist/commands/grounding.command.js +54 -0
  153. package/dist/commands/help.command.d.ts +20 -0
  154. package/dist/commands/help.command.d.ts.map +1 -0
  155. package/dist/commands/help.command.js +127 -0
  156. package/dist/commands/helper.command.d.ts +6 -0
  157. package/dist/commands/helper.command.d.ts.map +1 -0
  158. package/dist/commands/helper.command.js +170 -0
  159. package/dist/commands/ide.command.d.ts +6 -0
  160. package/dist/commands/ide.command.d.ts.map +1 -0
  161. package/dist/commands/ide.command.js +340 -0
  162. package/dist/commands/impact.command.d.ts +3 -0
  163. package/dist/commands/impact.command.d.ts.map +1 -0
  164. package/dist/commands/impact.command.js +819 -0
  165. package/dist/commands/import.command.d.ts +3 -0
  166. package/dist/commands/import.command.d.ts.map +1 -0
  167. package/dist/commands/import.command.js +115 -0
  168. package/dist/commands/infer.command.d.ts +3 -0
  169. package/dist/commands/infer.command.d.ts.map +1 -0
  170. package/dist/commands/infer.command.js +227 -0
  171. package/dist/commands/ingest.command.d.ts +6 -0
  172. package/dist/commands/ingest.command.d.ts.map +1 -0
  173. package/dist/commands/ingest.command.js +532 -0
  174. package/dist/commands/init.command.d.ts +3 -0
  175. package/dist/commands/init.command.d.ts.map +1 -0
  176. package/dist/commands/init.command.js +301 -0
  177. package/dist/commands/inspect.command.d.ts +3 -0
  178. package/dist/commands/inspect.command.d.ts.map +1 -0
  179. package/dist/commands/inspect.command.js +122 -0
  180. package/dist/commands/knowledge-author.command.d.ts +22 -0
  181. package/dist/commands/knowledge-author.command.d.ts.map +1 -0
  182. package/dist/commands/knowledge-author.command.js +366 -0
  183. package/dist/commands/knowledge-propose.command.d.ts +3 -0
  184. package/dist/commands/knowledge-propose.command.d.ts.map +1 -0
  185. package/dist/commands/knowledge-propose.command.js +125 -0
  186. package/dist/commands/knowledge.command.d.ts +18 -0
  187. package/dist/commands/knowledge.command.d.ts.map +1 -0
  188. package/dist/commands/knowledge.command.js +538 -0
  189. package/dist/commands/languages.command.d.ts +3 -0
  190. package/dist/commands/languages.command.d.ts.map +1 -0
  191. package/dist/commands/languages.command.js +300 -0
  192. package/dist/commands/lint.command.d.ts +15 -0
  193. package/dist/commands/lint.command.d.ts.map +1 -0
  194. package/dist/commands/lint.command.js +194 -0
  195. package/dist/commands/mcp.command.d.ts +3 -0
  196. package/dist/commands/mcp.command.d.ts.map +1 -0
  197. package/dist/commands/mcp.command.js +74 -0
  198. package/dist/commands/memory.command.d.ts +11 -0
  199. package/dist/commands/memory.command.d.ts.map +1 -0
  200. package/dist/commands/memory.command.js +264 -0
  201. package/dist/commands/onboard.command.d.ts +3 -0
  202. package/dist/commands/onboard.command.d.ts.map +1 -0
  203. package/dist/commands/onboard.command.js +650 -0
  204. package/dist/commands/orchestrate.command.d.ts +3 -0
  205. package/dist/commands/orchestrate.command.d.ts.map +1 -0
  206. package/dist/commands/orchestrate.command.js +49 -0
  207. package/dist/commands/owners.command.d.ts +5 -0
  208. package/dist/commands/owners.command.d.ts.map +1 -0
  209. package/dist/commands/owners.command.js +113 -0
  210. package/dist/commands/ownership.command.d.ts +5 -0
  211. package/dist/commands/ownership.command.d.ts.map +1 -0
  212. package/dist/commands/ownership.command.js +117 -0
  213. package/dist/commands/pack-author.command.d.ts +30 -0
  214. package/dist/commands/pack-author.command.d.ts.map +1 -0
  215. package/dist/commands/pack-author.command.js +242 -0
  216. package/dist/commands/packs-new.d.ts +27 -0
  217. package/dist/commands/packs-new.d.ts.map +1 -0
  218. package/dist/commands/packs-new.js +805 -0
  219. package/dist/commands/packs.command.d.ts +15 -0
  220. package/dist/commands/packs.command.d.ts.map +1 -0
  221. package/dist/commands/packs.command.js +958 -0
  222. package/dist/commands/paths.command.d.ts +6 -0
  223. package/dist/commands/paths.command.d.ts.map +1 -0
  224. package/dist/commands/paths.command.js +97 -0
  225. package/dist/commands/pipelines.command.d.ts +9 -0
  226. package/dist/commands/pipelines.command.d.ts.map +1 -0
  227. package/dist/commands/pipelines.command.js +308 -0
  228. package/dist/commands/plan-check.command.d.ts +27 -0
  229. package/dist/commands/plan-check.command.d.ts.map +1 -0
  230. package/dist/commands/plan-check.command.js +150 -0
  231. package/dist/commands/plan-simulate.command.d.ts +3 -0
  232. package/dist/commands/plan-simulate.command.d.ts.map +1 -0
  233. package/dist/commands/plan-simulate.command.js +60 -0
  234. package/dist/commands/plan.command.d.ts +8 -0
  235. package/dist/commands/plan.command.d.ts.map +1 -0
  236. package/dist/commands/plan.command.js +139 -0
  237. package/dist/commands/playbooks.command.d.ts +10 -0
  238. package/dist/commands/playbooks.command.d.ts.map +1 -0
  239. package/dist/commands/playbooks.command.js +296 -0
  240. package/dist/commands/plugin.command.d.ts +11 -0
  241. package/dist/commands/plugin.command.d.ts.map +1 -0
  242. package/dist/commands/plugin.command.js +394 -0
  243. package/dist/commands/policy.command.d.ts +8 -0
  244. package/dist/commands/policy.command.d.ts.map +1 -0
  245. package/dist/commands/policy.command.js +451 -0
  246. package/dist/commands/pr.command.d.ts +3 -0
  247. package/dist/commands/pr.command.d.ts.map +1 -0
  248. package/dist/commands/pr.command.js +132 -0
  249. package/dist/commands/preflight.command.d.ts +3 -0
  250. package/dist/commands/preflight.command.d.ts.map +1 -0
  251. package/dist/commands/preflight.command.js +102 -0
  252. package/dist/commands/presets.command.d.ts +17 -0
  253. package/dist/commands/presets.command.d.ts.map +1 -0
  254. package/dist/commands/presets.command.js +647 -0
  255. package/dist/commands/profiles.command.d.ts +7 -0
  256. package/dist/commands/profiles.command.d.ts.map +1 -0
  257. package/dist/commands/profiles.command.js +151 -0
  258. package/dist/commands/provenance.command.d.ts +26 -0
  259. package/dist/commands/provenance.command.d.ts.map +1 -0
  260. package/dist/commands/provenance.command.js +237 -0
  261. package/dist/commands/quality.command.d.ts +5 -0
  262. package/dist/commands/quality.command.d.ts.map +1 -0
  263. package/dist/commands/quality.command.js +69 -0
  264. package/dist/commands/recommend.command.d.ts +4 -0
  265. package/dist/commands/recommend.command.d.ts.map +1 -0
  266. package/dist/commands/recommend.command.js +270 -0
  267. package/dist/commands/registrations.command.d.ts +3 -0
  268. package/dist/commands/registrations.command.d.ts.map +1 -0
  269. package/dist/commands/registrations.command.js +300 -0
  270. package/dist/commands/registry.command.d.ts +4 -0
  271. package/dist/commands/registry.command.d.ts.map +1 -0
  272. package/dist/commands/registry.command.js +37 -0
  273. package/dist/commands/release.command.d.ts +4 -0
  274. package/dist/commands/release.command.d.ts.map +1 -0
  275. package/dist/commands/release.command.js +639 -0
  276. package/dist/commands/repo.command.d.ts +3 -0
  277. package/dist/commands/repo.command.d.ts.map +1 -0
  278. package/dist/commands/repo.command.js +24 -0
  279. package/dist/commands/report.command.d.ts +3 -0
  280. package/dist/commands/report.command.d.ts.map +1 -0
  281. package/dist/commands/report.command.js +511 -0
  282. package/dist/commands/reposet.command.d.ts +6 -0
  283. package/dist/commands/reposet.command.d.ts.map +1 -0
  284. package/dist/commands/reposet.command.js +120 -0
  285. package/dist/commands/review.command.d.ts +3 -0
  286. package/dist/commands/review.command.d.ts.map +1 -0
  287. package/dist/commands/review.command.js +354 -0
  288. package/dist/commands/risk.command.d.ts +3 -0
  289. package/dist/commands/risk.command.d.ts.map +1 -0
  290. package/dist/commands/risk.command.js +56 -0
  291. package/dist/commands/rounds.command.d.ts +8 -0
  292. package/dist/commands/rounds.command.d.ts.map +1 -0
  293. package/dist/commands/rounds.command.js +180 -0
  294. package/dist/commands/rules.command.d.ts +49 -0
  295. package/dist/commands/rules.command.d.ts.map +1 -0
  296. package/dist/commands/rules.command.js +435 -0
  297. package/dist/commands/runtime.command.d.ts +3 -0
  298. package/dist/commands/runtime.command.d.ts.map +1 -0
  299. package/dist/commands/runtime.command.js +56 -0
  300. package/dist/commands/safety.command.d.ts +3 -0
  301. package/dist/commands/safety.command.d.ts.map +1 -0
  302. package/dist/commands/safety.command.js +117 -0
  303. package/dist/commands/scaffolds.command.d.ts +5 -0
  304. package/dist/commands/scaffolds.command.d.ts.map +1 -0
  305. package/dist/commands/scaffolds.command.js +122 -0
  306. package/dist/commands/schemas.command.d.ts +21 -0
  307. package/dist/commands/schemas.command.d.ts.map +1 -0
  308. package/dist/commands/schemas.command.js +296 -0
  309. package/dist/commands/search.command.d.ts +12 -0
  310. package/dist/commands/search.command.d.ts.map +1 -0
  311. package/dist/commands/search.command.js +275 -0
  312. package/dist/commands/self-config.command.d.ts +7 -0
  313. package/dist/commands/self-config.command.d.ts.map +1 -0
  314. package/dist/commands/self-config.command.js +156 -0
  315. package/dist/commands/self.command.d.ts +3 -0
  316. package/dist/commands/self.command.d.ts.map +1 -0
  317. package/dist/commands/self.command.js +117 -0
  318. package/dist/commands/simulate.command.d.ts +3 -0
  319. package/dist/commands/simulate.command.d.ts.map +1 -0
  320. package/dist/commands/simulate.command.js +54 -0
  321. package/dist/commands/spec.command.d.ts +29 -0
  322. package/dist/commands/spec.command.d.ts.map +1 -0
  323. package/dist/commands/spec.command.js +985 -0
  324. package/dist/commands/start-here.command.d.ts +3 -0
  325. package/dist/commands/start-here.command.d.ts.map +1 -0
  326. package/dist/commands/start-here.command.js +35 -0
  327. package/dist/commands/stats.command.d.ts +3 -0
  328. package/dist/commands/stats.command.d.ts.map +1 -0
  329. package/dist/commands/stats.command.js +88 -0
  330. package/dist/commands/surface.command.d.ts +15 -0
  331. package/dist/commands/surface.command.d.ts.map +1 -0
  332. package/dist/commands/surface.command.js +328 -0
  333. package/dist/commands/task-context.command.d.ts +7 -0
  334. package/dist/commands/task-context.command.d.ts.map +1 -0
  335. package/dist/commands/task-context.command.js +646 -0
  336. package/dist/commands/task.command.d.ts +3 -0
  337. package/dist/commands/task.command.d.ts.map +1 -0
  338. package/dist/commands/task.command.js +301 -0
  339. package/dist/commands/template-quality.command.d.ts +5 -0
  340. package/dist/commands/template-quality.command.d.ts.map +1 -0
  341. package/dist/commands/template-quality.command.js +128 -0
  342. package/dist/commands/templates.command.d.ts +26 -0
  343. package/dist/commands/templates.command.d.ts.map +1 -0
  344. package/dist/commands/templates.command.js +964 -0
  345. package/dist/commands/test.command.d.ts +3 -0
  346. package/dist/commands/test.command.d.ts.map +1 -0
  347. package/dist/commands/test.command.js +262 -0
  348. package/dist/commands/tests.command.d.ts +5 -0
  349. package/dist/commands/tests.command.d.ts.map +1 -0
  350. package/dist/commands/tests.command.js +97 -0
  351. package/dist/commands/trace.command.d.ts +3 -0
  352. package/dist/commands/trace.command.d.ts.map +1 -0
  353. package/dist/commands/trace.command.js +121 -0
  354. package/dist/commands/upgrade.command.d.ts +4 -0
  355. package/dist/commands/upgrade.command.d.ts.map +1 -0
  356. package/dist/commands/upgrade.command.js +43 -0
  357. package/dist/commands/version.command.d.ts +3 -0
  358. package/dist/commands/version.command.d.ts.map +1 -0
  359. package/dist/commands/version.command.js +10 -0
  360. package/dist/commands/why.command.d.ts +24 -0
  361. package/dist/commands/why.command.d.ts.map +1 -0
  362. package/dist/commands/why.command.js +119 -0
  363. package/dist/dashboard/dashboard-api-server.d.ts +21 -0
  364. package/dist/dashboard/dashboard-api-server.d.ts.map +1 -0
  365. package/dist/dashboard/dashboard-api-server.js +410 -0
  366. package/dist/dashboard/live-session-server.d.ts +18 -0
  367. package/dist/dashboard/live-session-server.d.ts.map +1 -0
  368. package/dist/dashboard/live-session-server.js +133 -0
  369. package/dist/diff/collect-changed-paths.d.ts +27 -0
  370. package/dist/diff/collect-changed-paths.d.ts.map +1 -0
  371. package/dist/diff/collect-changed-paths.js +68 -0
  372. package/dist/doctor/doctor-tags.d.ts +63 -0
  373. package/dist/doctor/doctor-tags.d.ts.map +1 -0
  374. package/dist/doctor/doctor-tags.js +146 -0
  375. package/dist/export/export-formats.d.ts +22 -0
  376. package/dist/export/export-formats.d.ts.map +1 -0
  377. package/dist/export/export-formats.js +135 -0
  378. package/dist/index.d.ts +22 -0
  379. package/dist/index.d.ts.map +1 -0
  380. package/dist/index.js +21 -0
  381. package/dist/init/detected-block.d.ts +57 -0
  382. package/dist/init/detected-block.d.ts.map +1 -0
  383. package/dist/init/detected-block.js +197 -0
  384. package/dist/init/gitignore.d.ts +30 -0
  385. package/dist/init/gitignore.d.ts.map +1 -0
  386. package/dist/init/gitignore.js +110 -0
  387. package/dist/init/init-templates.d.ts +6 -0
  388. package/dist/init/init-templates.d.ts.map +1 -0
  389. package/dist/init/init-templates.js +413 -0
  390. package/dist/main.d.ts +18 -0
  391. package/dist/main.d.ts.map +1 -0
  392. package/dist/main.js +699 -0
  393. package/dist/output/failure-hints.d.ts +55 -0
  394. package/dist/output/failure-hints.d.ts.map +1 -0
  395. package/dist/output/failure-hints.js +159 -0
  396. package/dist/output/format-output.d.ts +9 -0
  397. package/dist/output/format-output.d.ts.map +1 -0
  398. package/dist/output/format-output.js +26 -0
  399. package/dist/output/print-error.d.ts +3 -0
  400. package/dist/output/print-error.d.ts.map +1 -0
  401. package/dist/output/print-error.js +14 -0
  402. package/dist/output/watch-loop.d.ts +37 -0
  403. package/dist/output/watch-loop.d.ts.map +1 -0
  404. package/dist/output/watch-loop.js +115 -0
  405. package/dist/schemas/json-schemas.d.ts +1630 -0
  406. package/dist/schemas/json-schemas.d.ts.map +1 -0
  407. package/dist/schemas/json-schemas.js +811 -0
  408. package/dist/surface/about.d.ts +10 -0
  409. package/dist/surface/about.d.ts.map +1 -0
  410. package/dist/surface/about.js +53 -0
  411. package/dist/surface/load-surface-context.d.ts +34 -0
  412. package/dist/surface/load-surface-context.d.ts.map +1 -0
  413. package/dist/surface/load-surface-context.js +100 -0
  414. package/dist/surface/no-args-landing.d.ts +7 -0
  415. package/dist/surface/no-args-landing.d.ts.map +1 -0
  416. package/dist/surface/no-args-landing.js +36 -0
  417. package/dist/surface/not-enabled-error.d.ts +24 -0
  418. package/dist/surface/not-enabled-error.d.ts.map +1 -0
  419. package/dist/surface/not-enabled-error.js +36 -0
  420. package/dist/surface/profiles.d.ts +37 -0
  421. package/dist/surface/profiles.d.ts.map +1 -0
  422. package/dist/surface/profiles.js +151 -0
  423. package/dist/surface/shape-defaults.d.ts +21 -0
  424. package/dist/surface/shape-defaults.d.ts.map +1 -0
  425. package/dist/surface/shape-defaults.js +50 -0
  426. package/dist/surface/spine-extractor.d.ts +38 -0
  427. package/dist/surface/spine-extractor.d.ts.map +1 -0
  428. package/dist/surface/spine-extractor.js +100 -0
  429. package/dist/surface/surface-config-writer.d.ts +59 -0
  430. package/dist/surface/surface-config-writer.d.ts.map +1 -0
  431. package/dist/surface/surface-config-writer.js +135 -0
  432. package/dist/surface/surface-summary.d.ts +66 -0
  433. package/dist/surface/surface-summary.d.ts.map +1 -0
  434. package/dist/surface/surface-summary.js +162 -0
  435. package/dist/surface/tier.d.ts +100 -0
  436. package/dist/surface/tier.d.ts.map +1 -0
  437. package/dist/surface/tier.js +172 -0
  438. package/dist/task-next/apply-batch-runner.d.ts +42 -0
  439. package/dist/task-next/apply-batch-runner.d.ts.map +1 -0
  440. package/dist/task-next/apply-batch-runner.js +192 -0
  441. package/dist/task-next/task-next-ranker.d.ts +75 -0
  442. package/dist/task-next/task-next-ranker.d.ts.map +1 -0
  443. package/dist/task-next/task-next-ranker.js +179 -0
  444. package/dist/usage/usage-log.d.ts +54 -0
  445. package/dist/usage/usage-log.d.ts.map +1 -0
  446. package/dist/usage/usage-log.js +105 -0
  447. package/dist/validation/run-validation-loop.d.ts +38 -0
  448. package/dist/validation/run-validation-loop.d.ts.map +1 -0
  449. package/dist/validation/run-validation-loop.js +100 -0
  450. package/package.json +73 -0
@@ -0,0 +1,639 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync, rmSync, readFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import * as nodePath from 'node:path';
5
+ import { buildReleaseReadiness, inspectSharkcraft, ReleaseReadinessSeverity, renderReleaseReadinessHtml, pickScenarios, createFixtureRoot, collectFixtureFiles, assertSafeWrites, renderSmokeReport, evaluateSmokeAssertion, getInstallSmokePlan, } from '@shrkcrft/inspector';
6
+ import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
7
+ import { asJson, header, kv } from "../output/format-output.js";
8
+ const SMOKE_SCENARIO_IDS = [
9
+ 'unconfigured-repo',
10
+ 'dev-workflow',
11
+ 'pr-review',
12
+ 'governance',
13
+ 'pack-authoring',
14
+ ];
15
+ function tailLines(s, n = 12) {
16
+ const lines = s.split(/\r?\n/);
17
+ return lines.slice(-n).join('\n');
18
+ }
19
+ function copyDir(src, dest) {
20
+ mkdirSync(dest, { recursive: true });
21
+ if (!existsSync(src))
22
+ return;
23
+ for (const entry of readdirSync(src)) {
24
+ if (entry === 'node_modules' || entry === '.sharkcraft' || entry.startsWith('.git'))
25
+ continue;
26
+ const from = nodePath.join(src, entry);
27
+ const to = nodePath.join(dest, entry);
28
+ let stat;
29
+ try {
30
+ stat = statSync(from);
31
+ }
32
+ catch {
33
+ continue;
34
+ }
35
+ if (stat.isDirectory())
36
+ copyDir(from, to);
37
+ else
38
+ copyFileSync(from, to);
39
+ }
40
+ }
41
+ function prepareFixture(scenarioId, dest, cwd) {
42
+ if (scenarioId === 'unconfigured-repo') {
43
+ writeFileSync(nodePath.join(dest, 'package.json'), JSON.stringify({ name: 'smoke-fixture', version: '0.0.0', type: 'module' }, null, 2) + '\n', 'utf8');
44
+ return;
45
+ }
46
+ if (scenarioId === 'pack-authoring') {
47
+ writeFileSync(nodePath.join(dest, 'package.json'), JSON.stringify({ name: 'smoke-pack-root', version: '0.0.0', type: 'module' }, null, 2) + '\n', 'utf8');
48
+ return;
49
+ }
50
+ // dev-workflow / pr-review / governance: copy dogfood-target.
51
+ const dogfood = nodePath.join(cwd, 'examples', 'dogfood-target');
52
+ copyDir(dogfood, dest);
53
+ }
54
+ function runStep(step, fixtureRoot, cliEntry, cwd, options = { assertionsEnabled: true }) {
55
+ const startedAt = new Date().toISOString();
56
+ const startMs = Date.now();
57
+ const expectArtifacts = step.expectArtifacts ?? [];
58
+ const forbidArtifacts = step.forbidArtifacts ?? [];
59
+ let exitCode = null;
60
+ let stdoutTail = '';
61
+ let stderrTail = '';
62
+ let stdoutFull = '';
63
+ let stderrFull = '';
64
+ let status = 'pass';
65
+ if (step.command[0] === '__fixture__:init-unconfigured' || step.command[0] === '__fixture__:init-empty-pack-root' || step.command[0] === '__fixture__:copy-dogfood') {
66
+ // No-op (fixture preparation happens before steps run).
67
+ exitCode = 0;
68
+ }
69
+ else {
70
+ const bin = step.command[0] ?? '';
71
+ const rest = step.command.slice(1);
72
+ // The CLI is `bun packages/cli/src/main.ts` so rewrite `shrk …` → `bun <cliEntry> …`.
73
+ const args = bin === 'shrk' ? [cliEntry, ...rest] : [cliEntry, ...rest];
74
+ try {
75
+ const result = spawnSync('bun', args, {
76
+ cwd: fixtureRoot,
77
+ env: { ...process.env, NO_COLOR: '1' },
78
+ encoding: 'utf8',
79
+ timeout: 60_000,
80
+ stdio: 'pipe',
81
+ });
82
+ exitCode = result.status ?? null;
83
+ stdoutFull = result.stdout ?? '';
84
+ stderrFull = result.stderr ?? '';
85
+ stdoutTail = tailLines(stdoutFull);
86
+ stderrTail = tailLines(stderrFull);
87
+ const allowed = step.allowedExitCodes ?? [0];
88
+ if (exitCode == null || !allowed.includes(exitCode))
89
+ status = 'fail';
90
+ }
91
+ catch (e) {
92
+ stderrTail = e.message;
93
+ stderrFull = stderrTail;
94
+ status = 'fail';
95
+ exitCode = null;
96
+ }
97
+ }
98
+ const present = collectFixtureFiles(fixtureRoot);
99
+ const artifactsFound = [];
100
+ const artifactsMissing = [];
101
+ for (const rel of expectArtifacts) {
102
+ if (present.includes(rel) || existsSync(nodePath.join(fixtureRoot, rel))) {
103
+ artifactsFound.push(rel);
104
+ }
105
+ else {
106
+ artifactsMissing.push(rel);
107
+ if (status === 'pass')
108
+ status = 'fail';
109
+ }
110
+ }
111
+ const forbiddenArtifactsFound = [];
112
+ for (const rel of forbidArtifacts) {
113
+ if (existsSync(nodePath.join(fixtureRoot, rel))) {
114
+ forbiddenArtifactsFound.push(rel);
115
+ status = 'fail';
116
+ }
117
+ }
118
+ let assertionResults;
119
+ if (options.assertionsEnabled && step.assertions && step.assertions.length > 0) {
120
+ assertionResults = step.assertions.map((a) => evaluateSmokeAssertion({ assertion: a, stdout: stdoutFull, stderr: stderrFull, fixtureRoot }));
121
+ for (const r of assertionResults) {
122
+ if (r.status === 'fail')
123
+ status = 'fail';
124
+ }
125
+ }
126
+ return {
127
+ step,
128
+ startedAt,
129
+ finishedAt: new Date().toISOString(),
130
+ durationMs: Date.now() - startMs,
131
+ exitCode,
132
+ status,
133
+ stdoutTail,
134
+ stderrTail,
135
+ artifactsFound,
136
+ artifactsMissing,
137
+ forbiddenArtifactsFound,
138
+ ...(assertionResults ? { assertionResults } : {}),
139
+ };
140
+ }
141
+ async function runScenario(scenario, cwd, tempDir, keep, options = { assertionsEnabled: true }) {
142
+ const fixture = createFixtureRoot({
143
+ scenarioId: scenario.id,
144
+ baseDir: tempDir ?? undefined,
145
+ keep,
146
+ });
147
+ prepareFixture(scenario.id, fixture.fixtureRoot, options.cliEntryRoot ?? cwd);
148
+ const cliRoot = options.cliEntryRoot ?? cwd;
149
+ const cliEntry = nodePath.join(cliRoot, 'packages', 'cli', 'src', 'main.ts');
150
+ const startedAt = new Date().toISOString();
151
+ const startMs = Date.now();
152
+ const stepResults = [];
153
+ for (const step of scenario.setup) {
154
+ stepResults.push(runStep(step, fixture.fixtureRoot, cliEntry, cwd, options));
155
+ }
156
+ // Snapshot the fixture after setup so the safe-write audit only flags
157
+ // files added or modified *during* the smoke steps, not pre-existing source
158
+ // copied in for fixture preparation.
159
+ const afterSetupSet = new Set(collectFixtureFiles(fixture.fixtureRoot));
160
+ for (const step of scenario.steps) {
161
+ const r = runStep(step, fixture.fixtureRoot, cliEntry, cwd, options);
162
+ stepResults.push(r);
163
+ }
164
+ // Safety: assert no writes happened outside allowed prefixes (only newly-
165
+ // created files count).
166
+ const present = collectFixtureFiles(fixture.fixtureRoot);
167
+ const newlyCreated = present.filter((f) => !afterSetupSet.has(f));
168
+ const violations = assertSafeWrites(newlyCreated);
169
+ if (violations.length > 0) {
170
+ stepResults.push({
171
+ step: { title: 'Safe-write audit', command: ['__safety_audit__'] },
172
+ startedAt: new Date().toISOString(),
173
+ finishedAt: new Date().toISOString(),
174
+ durationMs: 0,
175
+ exitCode: 1,
176
+ status: 'fail',
177
+ stdoutTail: '',
178
+ stderrTail: `Files written outside allowed prefixes: ${violations.slice(0, 20).join(', ')}`,
179
+ artifactsFound: [],
180
+ artifactsMissing: [],
181
+ forbiddenArtifactsFound: violations,
182
+ });
183
+ }
184
+ const status = stepResults.some((s) => s.status === 'fail') ? 'fail' : 'pass';
185
+ if (!keep) {
186
+ try {
187
+ rmSync(fixture.fixtureRoot, { recursive: true, force: true });
188
+ }
189
+ catch {
190
+ /* best-effort */
191
+ }
192
+ }
193
+ return {
194
+ scenarioId: scenario.id,
195
+ fixtureRoot: fixture.fixtureRoot,
196
+ startedAt,
197
+ finishedAt: new Date().toISOString(),
198
+ durationMs: Date.now() - startMs,
199
+ status,
200
+ steps: stepResults,
201
+ };
202
+ }
203
+ function resolveSmokeFlags(args) {
204
+ const noAssertions = flagBool(args, 'no-assertions');
205
+ return { assertionsEnabled: !noAssertions };
206
+ }
207
+ // Generic adopter target replaces the previous hardcoded project target.
208
+ const BUILTIN_TARGET_IDS = ['sharkcraft', 'dogfood', 'synthetic', 'adopter'];
209
+ function resolveTargets(cwd, args, requested) {
210
+ const want = (id) => requested.length === 0 || requested.includes(id);
211
+ const out = [];
212
+ if (want('sharkcraft'))
213
+ out.push({ id: 'sharkcraft', cwd, label: 'sharkcraft monorepo' });
214
+ if (want('dogfood')) {
215
+ const p = nodePath.join(cwd, 'examples', 'dogfood-target');
216
+ if (existsSync(p))
217
+ out.push({ id: 'dogfood', cwd: p, label: 'examples/dogfood-target' });
218
+ else
219
+ out.push({ id: 'dogfood', cwd: p, label: 'examples/dogfood-target', warning: 'dogfood-target not present — skipped' });
220
+ }
221
+ if (want('synthetic')) {
222
+ const root = nodePath.join(tmpdir(), `sharkcraft-smoke-synth-${Date.now()}`);
223
+ mkdirSync(root, { recursive: true });
224
+ writeFileSync(nodePath.join(root, 'package.json'), JSON.stringify({ name: 'sharkcraft-synth', version: '0.0.0', type: 'module' }, null, 2), 'utf8');
225
+ out.push({ id: 'synthetic', cwd: root, label: 'synthetic-fixture' });
226
+ }
227
+ if (want('adopter')) {
228
+ const adopterRoot = flagString(args, 'adopter-root') ??
229
+ process.env['SHARKCRAFT_ADOPTER_ROOT'] ??
230
+ '';
231
+ if (adopterRoot && existsSync(adopterRoot)) {
232
+ out.push({ id: 'adopter', cwd: adopterRoot, label: `adopter:${adopterRoot}` });
233
+ }
234
+ else {
235
+ out.push({
236
+ id: 'adopter',
237
+ cwd: adopterRoot || '(unset)',
238
+ label: 'adopter target',
239
+ warning: 'Adopter root not set (pass --adopter-root or set SHARKCRAFT_ADOPTER_ROOT) — skipped.',
240
+ });
241
+ }
242
+ }
243
+ return out;
244
+ }
245
+ async function runReleaseSmoke(args) {
246
+ const cwd = resolveCwd(args);
247
+ const scopeRaw = (flagString(args, 'scenario') ?? 'all');
248
+ if (scopeRaw !== 'all' && !SMOKE_SCENARIO_IDS.includes(scopeRaw)) {
249
+ process.stderr.write(`Unknown --scenario "${scopeRaw}". Use all|${SMOKE_SCENARIO_IDS.join('|')}.\n`);
250
+ return 2;
251
+ }
252
+ const tempDir = flagString(args, 'temp-dir') ?? null;
253
+ const keep = flagBool(args, 'keep-temp');
254
+ const flags = resolveSmokeFlags(args);
255
+ const scenarios = pickScenarios(scopeRaw);
256
+ const startMs = Date.now();
257
+ // Matrix mode runs scenarios across multiple targets.
258
+ const isMatrix = flagBool(args, 'matrix');
259
+ const targetsRequested = (flagString(args, 'target') ?? '').split(',').filter(Boolean);
260
+ if (!isMatrix && targetsRequested.length === 0) {
261
+ const results = [];
262
+ for (const s of scenarios) {
263
+ const r = await runScenario(s, cwd, tempDir, keep, flags);
264
+ results.push(r);
265
+ }
266
+ return emitSmokeReport(args, cwd, results, startMs);
267
+ }
268
+ const targets = resolveTargets(cwd, args, targetsRequested);
269
+ const matrixResults = [];
270
+ for (const target of targets) {
271
+ if (target.warning) {
272
+ matrixResults.push({ target, results: [] });
273
+ continue;
274
+ }
275
+ const scenariosForTarget = scenarios.filter((s) => isScenarioApplicableTo(s.id, target));
276
+ const results = [];
277
+ for (const s of scenariosForTarget) {
278
+ // Always resolve the CLI entry from the SharkCraft monorepo (cwd),
279
+ // even when the target has its own working tree.
280
+ const r = await runScenario(s, target.cwd, tempDir, keep, { ...flags, cliEntryRoot: cwd });
281
+ results.push(r);
282
+ }
283
+ matrixResults.push({ target, results });
284
+ }
285
+ return emitMatrixSmokeReport(args, cwd, matrixResults, startMs);
286
+ }
287
+ /**
288
+ * Which smoke scenarios make sense for which target.
289
+ *
290
+ * - `sharkcraft` runs everything (it's the source of truth).
291
+ * - `dogfood` runs dev-workflow / pr-review / governance because those copy
292
+ * examples/dogfood-target as the fixture.
293
+ * - `synthetic` runs the scenarios that don't depend on a prepared source
294
+ * (unconfigured-repo + pack-authoring).
295
+ * - `adopter` runs the read-only scenarios that don't write outside the
296
+ * fixture (e.g. an external project that consumes a SharkCraft pack).
297
+ */
298
+ function isScenarioApplicableTo(scenario, target) {
299
+ if (target.id === 'sharkcraft')
300
+ return true;
301
+ if (target.id === 'synthetic') {
302
+ return scenario === 'unconfigured-repo' || scenario === 'pack-authoring';
303
+ }
304
+ if (target.id === 'dogfood') {
305
+ return scenario === 'dev-workflow' || scenario === 'pr-review' || scenario === 'governance';
306
+ }
307
+ if (target.id === 'adopter') {
308
+ return scenario === 'unconfigured-repo' || scenario === 'pack-authoring' || scenario === 'governance';
309
+ }
310
+ return true;
311
+ }
312
+ function emitSmokeReport(args, cwd, results, startMs) {
313
+ const passed = results.every((r) => r.status === 'pass');
314
+ const report = {
315
+ schema: 'sharkcraft.release-smoke/v1',
316
+ generatedAt: new Date().toISOString(),
317
+ scenarios: results,
318
+ totalDurationMs: Date.now() - startMs,
319
+ passed,
320
+ };
321
+ const wantJson = flagBool(args, 'json');
322
+ const wantReport = flagBool(args, 'report');
323
+ const wantHtml = flagBool(args, 'html');
324
+ const outputDir = nodePath.join(cwd, '.sharkcraft', 'reports');
325
+ if (wantReport || wantHtml)
326
+ mkdirSync(outputDir, { recursive: true });
327
+ if (wantReport) {
328
+ writeFileSync(nodePath.join(outputDir, 'release-smoke.json'), renderSmokeReport(report, 'json'), 'utf8');
329
+ writeFileSync(nodePath.join(outputDir, 'release-smoke.md'), renderSmokeReport(report, 'markdown'), 'utf8');
330
+ }
331
+ if (wantHtml) {
332
+ writeFileSync(nodePath.join(outputDir, 'release-smoke.html'), renderSmokeReport(report, 'html'), 'utf8');
333
+ }
334
+ if (wantJson) {
335
+ process.stdout.write(renderSmokeReport(report, 'json'));
336
+ }
337
+ else {
338
+ process.stdout.write(renderSmokeReport(report, 'text'));
339
+ }
340
+ return passed ? 0 : 1;
341
+ }
342
+ function emitMatrixSmokeReport(args, cwd, matrix, startMs) {
343
+ const targetReports = matrix.map((entry) => {
344
+ const passed = entry.results.length > 0 && entry.results.every((r) => r.status === 'pass');
345
+ return {
346
+ target: { id: entry.target.id, label: entry.target.label, cwd: entry.target.cwd, warning: entry.target.warning ?? null },
347
+ passed,
348
+ scenarios: entry.results.map((r) => ({
349
+ scenarioId: r.scenarioId,
350
+ status: r.status,
351
+ durationMs: r.durationMs,
352
+ })),
353
+ };
354
+ });
355
+ const overallPassed = targetReports
356
+ .filter((t) => !t.target.warning)
357
+ .every((t) => t.passed);
358
+ const totalDurationMs = Date.now() - startMs;
359
+ const payload = {
360
+ schema: 'sharkcraft.release-smoke-matrix/v1',
361
+ generatedAt: new Date().toISOString(),
362
+ totalDurationMs,
363
+ passed: overallPassed,
364
+ targets: targetReports,
365
+ };
366
+ const wantJson = flagBool(args, 'json');
367
+ const wantReport = flagBool(args, 'report');
368
+ const outputDir = nodePath.join(cwd, '.sharkcraft', 'reports');
369
+ if (wantReport) {
370
+ mkdirSync(outputDir, { recursive: true });
371
+ writeFileSync(nodePath.join(outputDir, 'release-smoke-matrix.json'), JSON.stringify(payload, null, 2) + '\n', 'utf8');
372
+ }
373
+ if (wantJson) {
374
+ process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
375
+ }
376
+ else {
377
+ process.stdout.write(`# Release smoke matrix — ${overallPassed ? 'PASS' : 'FAIL'}\n`);
378
+ for (const t of targetReports) {
379
+ if (t.target.warning) {
380
+ process.stdout.write(` ⚠ ${t.target.label}: ${t.target.warning}\n`);
381
+ continue;
382
+ }
383
+ process.stdout.write(` ${t.passed ? '✓' : '✗'} ${t.target.label}\n`);
384
+ for (const s of t.scenarios) {
385
+ process.stdout.write(` ${s.status === 'pass' ? '✓' : '✗'} ${s.scenarioId} (${s.durationMs}ms)\n`);
386
+ }
387
+ }
388
+ }
389
+ return overallPassed ? 0 : 1;
390
+ }
391
+ async function runInstallSmokeTarball(args) {
392
+ const cwd = resolveCwd(args);
393
+ const baseTemp = flagString(args, 'temp-dir') ?? tmpdir();
394
+ const tarballDir = nodePath.join(baseTemp, `sharkcraft-tarball-${Date.now()}`);
395
+ mkdirSync(tarballDir, { recursive: true });
396
+ const log = [];
397
+ const runStepSh = (bin, bargs, spawnOpts = { cwd: tarballDir }) => {
398
+ const result = spawnSync(bin, bargs, {
399
+ cwd: spawnOpts.cwd,
400
+ env: { ...process.env, NO_COLOR: '1', ...(spawnOpts.env ?? {}) },
401
+ encoding: 'utf8',
402
+ timeout: spawnOpts.timeout ?? 120_000,
403
+ stdio: 'pipe',
404
+ });
405
+ const exit = result.status ?? null;
406
+ return {
407
+ status: exit === 0 ? 'pass' : 'fail',
408
+ exitCode: exit,
409
+ stdout: result.stdout ?? '',
410
+ stderr: result.stderr ?? '',
411
+ };
412
+ };
413
+ // 1. Use the existing install-smoke-test script which already does this dance.
414
+ const t0 = Date.now();
415
+ const smoke = runStepSh('bun', ['run', 'release:smoke-test'], { cwd, timeout: 600_000 });
416
+ log.push({
417
+ step: 'release:smoke-test',
418
+ status: smoke.status,
419
+ exitCode: smoke.exitCode,
420
+ durationMs: Date.now() - t0,
421
+ detail: smoke.status === 'fail' ? smoke.stderr.split(/\r?\n/).slice(-8).join('\n') : undefined,
422
+ });
423
+ const ok = log.every((l) => l.status !== 'fail');
424
+ const payload = {
425
+ schema: 'sharkcraft.install-smoke-tarball/v1',
426
+ generatedAt: new Date().toISOString(),
427
+ tarballDir,
428
+ ok,
429
+ log,
430
+ note: 'Delegates to `bun run release:smoke-test` so the tarball install path stays canonical.',
431
+ };
432
+ if (flagBool(args, 'json')) {
433
+ process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
434
+ return ok ? 0 : 1;
435
+ }
436
+ process.stdout.write(`# Install smoke (tarball) — ${ok ? 'OK' : 'FAIL'}\n`);
437
+ for (const l of log) {
438
+ process.stdout.write(` ${l.status} ${l.step.padEnd(28)} exit=${l.exitCode ?? '?'} (${l.durationMs}ms)\n`);
439
+ if (l.detail)
440
+ process.stdout.write(` ↳ ${l.detail.replace(/\n/g, '\n ↳ ')}\n`);
441
+ }
442
+ return ok ? 0 : 1;
443
+ }
444
+ async function runInstallSmoke(args) {
445
+ if (flagBool(args, 'tarball')) {
446
+ return runInstallSmokeTarball(args);
447
+ }
448
+ const cwd = resolveCwd(args);
449
+ const cliEntry = nodePath.join(cwd, 'packages', 'cli', 'src', 'main.ts');
450
+ const isRepo = existsSync(cliEntry);
451
+ const stepResults = [];
452
+ for (const step of getInstallSmokePlan()) {
453
+ const start = Date.now();
454
+ if (step.requiresRepo && !isRepo) {
455
+ stepResults.push({
456
+ step,
457
+ status: 'skipped',
458
+ exitCode: null,
459
+ durationMs: 0,
460
+ stdoutTail: '',
461
+ stderrTail: '',
462
+ reason: 'not running inside the SharkCraft repo',
463
+ });
464
+ continue;
465
+ }
466
+ const bin = step.command[0] ?? '';
467
+ const rest = step.command.slice(1);
468
+ const cmdArgs = bin === 'shrk' && isRepo ? [cliEntry, ...rest] : rest;
469
+ const binToRun = bin === 'shrk' && isRepo ? 'bun' : bin;
470
+ try {
471
+ const result = spawnSync(binToRun, cmdArgs, {
472
+ cwd,
473
+ env: { ...process.env, NO_COLOR: '1' },
474
+ encoding: 'utf8',
475
+ timeout: 60_000,
476
+ stdio: 'pipe',
477
+ });
478
+ const exit = result.status ?? null;
479
+ const okExit = exit === 0;
480
+ stepResults.push({
481
+ step,
482
+ status: okExit ? 'pass' : step.optional ? 'pass' : 'fail',
483
+ exitCode: exit,
484
+ durationMs: Date.now() - start,
485
+ stdoutTail: tailLines(result.stdout ?? ''),
486
+ stderrTail: tailLines(result.stderr ?? ''),
487
+ ...(okExit ? {} : step.optional ? { reason: 'optional step failed; ignored' } : {}),
488
+ });
489
+ }
490
+ catch (e) {
491
+ stepResults.push({
492
+ step,
493
+ status: step.optional ? 'pass' : 'fail',
494
+ exitCode: null,
495
+ durationMs: Date.now() - start,
496
+ stdoutTail: '',
497
+ stderrTail: e.message,
498
+ ...(step.optional ? { reason: 'optional step errored; ignored' } : {}),
499
+ });
500
+ }
501
+ }
502
+ const ok = stepResults.every((r) => r.status !== 'fail');
503
+ const report = {
504
+ schema: 'sharkcraft.install-smoke/v1',
505
+ generatedAt: new Date().toISOString(),
506
+ projectRoot: cwd,
507
+ isSharkcraftRepo: isRepo,
508
+ steps: stepResults,
509
+ ok,
510
+ };
511
+ if (flagBool(args, 'json')) {
512
+ process.stdout.write(asJson(report) + '\n');
513
+ return ok ? 0 : 1;
514
+ }
515
+ process.stdout.write(header(`Install smoke — ${ok ? 'OK' : 'FAIL'}`));
516
+ for (const r of stepResults) {
517
+ process.stdout.write(` ${r.status.padEnd(8)} ${r.step.title.padEnd(30)} exit=${r.exitCode ?? '?'}${r.reason ? ' (' + r.reason + ')' : ''}\n`);
518
+ }
519
+ return ok ? 0 : 1;
520
+ }
521
+ async function runReadiness(args) {
522
+ const cwd = resolveCwd(args);
523
+ const inspection = await inspectSharkcraft({ cwd });
524
+ const strict = flagBool(args, 'strict');
525
+ const preflightRaw = flagString(args, 'preflight');
526
+ const includeDocsCheck = flagBool(args, 'with-docs-check') || flagBool(args, 'include-docs-check');
527
+ const includeExamplesCheck = flagBool(args, 'with-examples-check') || flagBool(args, 'include-examples-check');
528
+ const includeProductCheck = flagBool(args, 'with-product-check');
529
+ // Optional knowledge stale-check gate.
530
+ const includeKnowledgeCheck = flagBool(args, 'with-knowledge-check');
531
+ const report = await buildReleaseReadiness(inspection, {
532
+ strict,
533
+ ...(preflightRaw ? { preflightSummaryFile: preflightRaw } : {}),
534
+ includeDocsCheck,
535
+ includeExamplesCheck,
536
+ });
537
+ if (includeProductCheck) {
538
+ const { buildProductCoherenceReport } = await import('@shrkcrft/inspector');
539
+ const productReport = buildProductCoherenceReport(inspection, { strict });
540
+ // Fold a single advisory line into readiness output via JSON only.
541
+ report.productCheck = productReport;
542
+ if (!productReport.passed) {
543
+ report.ready = false;
544
+ }
545
+ }
546
+ // Knowledge stale-check.
547
+ const cfgKnowledge = inspection.config
548
+ ?.knowledgeCheck;
549
+ if (includeKnowledgeCheck || cfgKnowledge?.enabled) {
550
+ const { buildKnowledgeStaleReport, ReferenceCheckOutcome } = await import('@shrkcrft/inspector');
551
+ const staleReport = buildKnowledgeStaleReport(inspection);
552
+ let requiredFailing = 0;
553
+ for (const c of staleReport.referenceChecks) {
554
+ const isRequired = c.reference.required === true;
555
+ if (isRequired &&
556
+ (c.outcome === ReferenceCheckOutcome.Stale || c.outcome === ReferenceCheckOutcome.Missing)) {
557
+ requiredFailing++;
558
+ }
559
+ }
560
+ const knowledgeStrict = cfgKnowledge?.strict ?? strict;
561
+ const knowledgeReady = requiredFailing === 0 &&
562
+ (!knowledgeStrict || staleReport.counts.stale === 0);
563
+ report.knowledgeCheck = {
564
+ enabled: true,
565
+ strict: knowledgeStrict,
566
+ counts: staleReport.counts,
567
+ requiredFailing,
568
+ ready: knowledgeReady,
569
+ };
570
+ if (!knowledgeReady) {
571
+ report.ready = false;
572
+ }
573
+ }
574
+ const wantHtml = flagBool(args, 'html');
575
+ const wantReport = flagBool(args, 'report');
576
+ if (wantReport) {
577
+ const outDir = nodePath.join(cwd, '.sharkcraft', 'reports');
578
+ mkdirSync(outDir, { recursive: true });
579
+ writeFileSync(nodePath.join(outDir, 'release-readiness.json'), JSON.stringify(report, null, 2) + '\n', 'utf8');
580
+ if (wantHtml) {
581
+ writeFileSync(nodePath.join(outDir, 'release-readiness.html'), renderReleaseReadinessHtml(report), 'utf8');
582
+ }
583
+ }
584
+ if (flagBool(args, 'json')) {
585
+ process.stdout.write(asJson(report) + '\n');
586
+ return report.ready ? 0 : 1;
587
+ }
588
+ if (wantHtml && !wantReport) {
589
+ process.stdout.write(renderReleaseReadinessHtml(report));
590
+ return report.ready ? 0 : 1;
591
+ }
592
+ process.stdout.write(header(`Release readiness (${strict ? 'strict' : 'lenient'})`));
593
+ process.stdout.write(kv('ready', report.ready ? 'yes' : 'no') + '\n');
594
+ process.stdout.write(kv('blockers', String(report.blockers.length)) + '\n');
595
+ process.stdout.write(kv('warnings', String(report.warnings.length)) + '\n');
596
+ process.stdout.write(kv('passed', String(report.passed.length)) + '\n');
597
+ process.stdout.write(kv('skipped', String(report.skipped.length)) + '\n\n');
598
+ const order = [report.blockers, report.warnings, report.passed, report.skipped];
599
+ for (const group of order) {
600
+ for (const c of group) {
601
+ const tag = c.severity === ReleaseReadinessSeverity.Error
602
+ ? 'BLOCK'
603
+ : c.severity === ReleaseReadinessSeverity.Warning
604
+ ? 'WARN '
605
+ : c.status === 'skipped'
606
+ ? 'SKIP '
607
+ : 'OK ';
608
+ process.stdout.write(` ${tag} ${c.id.padEnd(22)} ${c.title.padEnd(32)} ${c.message}\n`);
609
+ if (c.suggestion)
610
+ process.stdout.write(` ↳ ${c.suggestion}\n`);
611
+ }
612
+ }
613
+ process.stdout.write('\nChecklist:\n');
614
+ for (const item of report.checklist)
615
+ process.stdout.write(` • ${item}\n`);
616
+ process.stdout.write(`\nVerdict: ${report.ready ? 'READY ✓' : 'NOT READY — see blockers above'}\n`);
617
+ void readFileSync;
618
+ return report.ready ? 0 : 1;
619
+ }
620
+ export const releaseCommand = {
621
+ name: 'release',
622
+ description: 'Release readiness aggregator + smoke harness. Read-only verdicts; smoke writes only into temp fixtures.',
623
+ usage: 'shrk release readiness [--strict] [--preflight <file|dir|auto>] [--html] [--report] [--json] [--with-docs-check] [--with-examples-check]\n shrk release smoke [--scenario all|<id>] [--temp-dir <path>] [--keep-temp] [--json] [--report] [--html]',
624
+ async run(args) {
625
+ const sub = args.positional[0];
626
+ if (sub === 'smoke')
627
+ return runReleaseSmoke({ ...args, positional: args.positional.slice(1) });
628
+ if (sub === 'readiness')
629
+ return runReadiness({ ...args, positional: args.positional.slice(1) });
630
+ process.stderr.write('Usage: shrk release readiness | smoke\n');
631
+ return 2;
632
+ },
633
+ };
634
+ export const installSmokeCommand = {
635
+ name: 'smoke',
636
+ description: 'Verify the installed CLI surface (read-only).',
637
+ usage: 'shrk install smoke [--json]',
638
+ run: runInstallSmoke,
639
+ };
@@ -0,0 +1,3 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const repoAreasCommand: ICommandHandler;
3
+ //# sourceMappingURL=repo.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.command.d.ts","sourceRoot":"","sources":["../../src/commands/repo.command.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAGhC,eAAO,MAAM,gBAAgB,EAAE,eAkB9B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { buildAreaMap, inspectSharkcraft, renderAreaMapMarkdown, renderAreaMapText } from '@shrkcrft/inspector';
2
+ import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
3
+ import { asJson } from "../output/format-output.js";
4
+ export const repoAreasCommand = {
5
+ name: 'areas',
6
+ description: 'Repository area map.',
7
+ usage: 'shrk repo areas [--json|--format text|json|markdown]',
8
+ async run(args) {
9
+ const cwd = resolveCwd(args);
10
+ const inspection = await inspectSharkcraft({ cwd });
11
+ const map = buildAreaMap(inspection);
12
+ const fmt = flagString(args, 'format') ?? (flagBool(args, 'json') ? 'json' : 'text');
13
+ if (fmt === 'json') {
14
+ process.stdout.write(asJson(map) + '\n');
15
+ }
16
+ else if (fmt === 'markdown') {
17
+ process.stdout.write(renderAreaMapMarkdown(map));
18
+ }
19
+ else {
20
+ process.stdout.write(renderAreaMapText(map) + '\n');
21
+ }
22
+ return 0;
23
+ },
24
+ };
@@ -0,0 +1,3 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const reportCommand: ICommandHandler;
3
+ //# sourceMappingURL=report.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.command.d.ts","sourceRoot":"","sources":["../../src/commands/report.command.ts"],"names":[],"mappings":"AAgCA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAUhC,eAAO,MAAM,aAAa,EAAE,eAwC3B,CAAC"}