@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,805 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
10
+ import * as nodePath from 'node:path';
11
+ import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
12
+ import { asJson, header, kv } from "../output/format-output.js";
13
+ const VALID_KINDS = new Set([
14
+ 'generic',
15
+ 'framework',
16
+ 'architecture',
17
+ 'enterprise',
18
+ 'platform-adopter',
19
+ ]);
20
+ /** Pure: compute the file set to write. No IO. */
21
+ export function planPackScaffold(input) {
22
+ const fullName = input.scope ? `${input.scope}/${input.name}` : input.name;
23
+ const packageJson = {
24
+ name: fullName,
25
+ version: '0.0.1',
26
+ description: `SharkCraft pack scaffolded as ${input.kind}.`,
27
+ type: 'module',
28
+ main: 'dist/sharkcraft.plugin.js',
29
+ exports: {
30
+ '.': {
31
+ types: './dist/sharkcraft.plugin.d.ts',
32
+ default: './dist/sharkcraft.plugin.js',
33
+ },
34
+ },
35
+ sharkcraft: {
36
+ kind: input.kind,
37
+ ...(input.preset ? { preset: input.preset } : {}),
38
+ },
39
+ scripts: {
40
+ build: 'tsc -p tsconfig.json',
41
+ doctor: 'shrk pack doctor .',
42
+ test: 'shrk pack test .',
43
+ },
44
+ files: ['dist', 'src', 'README.md', 'SECURITY.md', 'package.json'],
45
+ };
46
+ const files = [];
47
+ files.push({
48
+ relativePath: 'package.json',
49
+ body: JSON.stringify(packageJson, null, 2) + '\n',
50
+ });
51
+ files.push({
52
+ relativePath: 'README.md',
53
+ body: renderReadme(input, fullName),
54
+ });
55
+ files.push({
56
+ relativePath: 'SECURITY.md',
57
+ body: renderSecurity(input),
58
+ });
59
+ files.push({
60
+ relativePath: 'tsconfig.json',
61
+ body: JSON.stringify({
62
+ compilerOptions: {
63
+ target: 'ES2022',
64
+ module: 'ES2022',
65
+ moduleResolution: 'bundler',
66
+ strict: true,
67
+ declaration: true,
68
+ outDir: 'dist',
69
+ },
70
+ include: ['src/**/*.ts'],
71
+ }, null, 2) + '\n',
72
+ });
73
+ files.push({
74
+ relativePath: 'src/sharkcraft.plugin.ts',
75
+ body: renderPluginEntry(input, fullName),
76
+ });
77
+ files.push({
78
+ relativePath: 'src/assets/knowledge.ts',
79
+ body: renderKnowledgeAsset(input),
80
+ });
81
+ files.push({
82
+ relativePath: 'src/assets/rules.ts',
83
+ body: renderRulesAsset(input),
84
+ });
85
+ files.push({
86
+ relativePath: 'src/assets/paths.ts',
87
+ body: renderPathsAsset(input),
88
+ });
89
+ files.push({
90
+ relativePath: 'src/assets/templates.ts',
91
+ body: renderTemplatesAsset(input),
92
+ });
93
+ files.push({
94
+ relativePath: 'src/assets/pipelines.ts',
95
+ body: renderPipelinesAsset(input),
96
+ });
97
+ files.push({
98
+ relativePath: 'src/assets/presets.ts',
99
+ body: renderPresetsAsset(input),
100
+ });
101
+ files.push({
102
+ relativePath: 'src/assets/docs/overview.md',
103
+ body: renderDocsOverview(input, fullName),
104
+ });
105
+ if (input.kind === 'architecture' || input.withExamples) {
106
+ files.push({
107
+ relativePath: 'src/assets/boundaries.ts',
108
+ body: renderBoundariesAsset(),
109
+ });
110
+ }
111
+ if (input.kind === 'platform-adopter' || input.withExamples) {
112
+ files.push({
113
+ relativePath: 'src/assets/contracts/plugin-contract.example.ts',
114
+ body: renderPluginContractExample(),
115
+ });
116
+ }
117
+ if (input.kind === 'enterprise') {
118
+ files.push({
119
+ relativePath: 'docs/review-workflow.md',
120
+ body: renderEnterpriseReviewDocs(),
121
+ });
122
+ files.push({
123
+ relativePath: 'docs/security-baseline.md',
124
+ body: renderEnterpriseSecurityDocs(),
125
+ });
126
+ }
127
+ return { files, packageJson, packRoot: input.outDir };
128
+ }
129
+ function renderReadme(input, fullName) {
130
+ return [
131
+ `# ${fullName}`,
132
+ '',
133
+ `> SharkCraft pack scaffolded as **${input.kind}**.`,
134
+ '',
135
+ 'This pack contributes structured knowledge to SharkCraft. The CLI is the',
136
+ 'only write path: MCP tools are read-only by design.',
137
+ '',
138
+ '## Layout',
139
+ '',
140
+ '```',
141
+ 'src/',
142
+ ' sharkcraft.plugin.ts # entry — registers all assets',
143
+ ' assets/',
144
+ ' knowledge.ts',
145
+ ' rules.ts',
146
+ ' paths.ts',
147
+ ' templates.ts',
148
+ ' pipelines.ts',
149
+ ' presets.ts',
150
+ ' docs/overview.md',
151
+ '```',
152
+ '',
153
+ '## Validate this pack',
154
+ '',
155
+ '```bash',
156
+ 'shrk pack doctor .',
157
+ 'shrk pack test .',
158
+ 'shrk pack sign . --secret "$SHARKCRAFT_PACK_SECRET"',
159
+ 'shrk pack verify .',
160
+ '```',
161
+ '',
162
+ '## Local development',
163
+ '',
164
+ 'Link this pack into a target project to dogfood:',
165
+ '',
166
+ '```bash',
167
+ 'cd <target-project>',
168
+ 'npm install --no-save ../path/to/this-pack',
169
+ 'shrk packs list',
170
+ '```',
171
+ '',
172
+ ].join('\n');
173
+ }
174
+ function renderSecurity(input) {
175
+ return [
176
+ `# Security`,
177
+ '',
178
+ 'This pack is read-only at runtime. SharkCraft never executes arbitrary',
179
+ 'commands shipped by a pack: pack-contributed verification commands are',
180
+ 'NOT auto-run by `shrk apply --validate`. Only the user-controlled',
181
+ '`sharkcraft.config.ts verificationCommands[]` array is trusted.',
182
+ '',
183
+ '## Signing',
184
+ '',
185
+ 'Packs can ship a signed manifest. Sign locally with:',
186
+ '',
187
+ '```bash',
188
+ 'shrk pack sign . --secret "$SHARKCRAFT_PACK_SECRET"',
189
+ '```',
190
+ '',
191
+ 'Adopting projects verify the signature via:',
192
+ '',
193
+ '```bash',
194
+ 'shrk packs doctor --require-signatures',
195
+ '```',
196
+ '',
197
+ '## Reporting issues',
198
+ '',
199
+ `Please file security issues privately to the maintainer of \`${input.name}\`.`,
200
+ '',
201
+ ].join('\n');
202
+ }
203
+ function renderPluginEntry(input, fullName) {
204
+ return [
205
+ `// SharkCraft plugin entry for ${fullName}.`,
206
+ `// Scaffolded as kind=${input.kind}. Review every asset before publishing.`,
207
+ `import knowledge from './assets/knowledge.ts';`,
208
+ `import rules from './assets/rules.ts';`,
209
+ `import paths from './assets/paths.ts';`,
210
+ `import templates from './assets/templates.ts';`,
211
+ `import pipelines from './assets/pipelines.ts';`,
212
+ `import presets from './assets/presets.ts';`,
213
+ `export default {`,
214
+ ` knowledge,`,
215
+ ` rules,`,
216
+ ` paths,`,
217
+ ` templates,`,
218
+ ` pipelines,`,
219
+ ` presets,`,
220
+ `};`,
221
+ ``,
222
+ ].join('\n');
223
+ }
224
+ function renderKnowledgeAsset(input) {
225
+ if (input.kind === 'enterprise') {
226
+ return knowledgeBody([
227
+ ['security.baseline', 'Security baseline', 'High', 'Document the security baseline this pack enforces.'],
228
+ ['review.workflow', 'Code review workflow', 'High', 'How code review gets done in this organisation.'],
229
+ ]);
230
+ }
231
+ if (input.kind === 'architecture') {
232
+ return knowledgeBody([
233
+ ['architecture.layering', 'Layering rules', 'High', 'Describe lower → higher layers that cannot be inverted.'],
234
+ ['architecture.coverage', 'Coverage targets', 'Medium', 'Coverage axes you care about.'],
235
+ ]);
236
+ }
237
+ if (input.kind === 'framework') {
238
+ return knowledgeBody([
239
+ ['framework.overview', 'Framework overview', 'High', 'What this framework is for.'],
240
+ ]);
241
+ }
242
+ if (input.kind === 'platform-adopter') {
243
+ return knowledgeBody([
244
+ ['platform.policy', 'Policy capability', 'Medium', 'Describe the policy/capability model your platform exposes.'],
245
+ ['platform.adapter', 'Adapter contract', 'Medium', 'Describe the adapter contract your platform expects.'],
246
+ ]);
247
+ }
248
+ return knowledgeBody([
249
+ ['pack.overview', 'Pack overview', 'Medium', 'Short overview of what this pack contributes.'],
250
+ ]);
251
+ }
252
+ function knowledgeBody(rows) {
253
+ const lines = [];
254
+ lines.push(`// Knowledge entries contributed by this pack.`);
255
+ lines.push(`export default [`);
256
+ for (const [id, title, priority, content] of rows) {
257
+ lines.push(` { id: '${id}', title: '${title}', type: 'knowledge', priority: '${priority}',`);
258
+ lines.push(` summary: '${content}', body: '${content}', tags: [], scope: [] },`);
259
+ }
260
+ lines.push(`];`);
261
+ lines.push('');
262
+ return lines.join('\n');
263
+ }
264
+ function renderRulesAsset(input) {
265
+ if (input.kind === 'enterprise') {
266
+ return rulesBody([
267
+ ['rule.review-required', 'All changes require code review', 'critical'],
268
+ ['rule.no-secrets-in-source', 'Secrets must never be committed', 'critical'],
269
+ ]);
270
+ }
271
+ if (input.kind === 'architecture') {
272
+ return rulesBody([
273
+ ['rule.boundary-enforcement', 'Respect layer boundaries', 'high'],
274
+ ]);
275
+ }
276
+ return rulesBody([
277
+ ['rule.example', 'Example rule for this pack', 'medium'],
278
+ ]);
279
+ }
280
+ function rulesBody(rows) {
281
+ const lines = [];
282
+ lines.push(`export default [`);
283
+ for (const [id, title, priority] of rows) {
284
+ lines.push(` { id: '${id}', title: '${title}', type: 'rule', priority: '${priority}',`);
285
+ lines.push(` summary: '${title}', body: '${title}', tags: [], scope: [] },`);
286
+ }
287
+ lines.push(`];`);
288
+ lines.push('');
289
+ return lines.join('\n');
290
+ }
291
+ function renderPathsAsset(_input) {
292
+ return [
293
+ `export default [`,
294
+ ` // Add path conventions: { id, title, type: 'path', patterns: ['src/**/*.ts'], ... }`,
295
+ `];`,
296
+ ``,
297
+ ].join('\n');
298
+ }
299
+ function renderTemplatesAsset(input) {
300
+ const examples = [];
301
+ if (input.kind === 'framework' || input.withExamples) {
302
+ examples.push(` {`, ` id: 'pack.example.service',`, ` name: 'Example service',`, ` description: 'Scaffold an example service for this pack.',`, ` tags: ['service'],`, ` scope: ['ts'],`, ` appliesWhen: ['create-service'],`, ` variables: [{ name: 'name', required: true }],`, ` targetPath: ({ name }) => 'src/services/' + name + '.service.ts',`, ` content: ({ name }) => 'export class ' + (name as string).replace(/-(\\w)/g, (_m, c) => c.toUpperCase()) + 'Service {}\\n',`, ` },`);
303
+ }
304
+ return [
305
+ `export default [`,
306
+ ...examples,
307
+ `];`,
308
+ ``,
309
+ ].join('\n');
310
+ }
311
+ function renderPipelinesAsset(input) {
312
+ if (input.kind === 'framework' || input.withExamples) {
313
+ return [
314
+ `export default [`,
315
+ ` {`,
316
+ ` id: 'pack.example.pipeline',`,
317
+ ` title: 'Example pipeline',`,
318
+ ` description: 'Reference pipeline for this pack.',`,
319
+ ` steps: ['plan', 'review', 'apply', 'verify'],`,
320
+ ` appliesWhen: ['create-service'],`,
321
+ ` },`,
322
+ `];`,
323
+ ``,
324
+ ].join('\n');
325
+ }
326
+ return ['export default [];', ''].join('\n');
327
+ }
328
+ function renderPresetsAsset(input) {
329
+ if (input.preset) {
330
+ return [
331
+ `export default [`,
332
+ ` {`,
333
+ ` id: '${input.preset}',`,
334
+ ` title: '${input.preset}',`,
335
+ ` description: 'Preset for this pack.',`,
336
+ ` appliesWhen: ['create-service'],`,
337
+ ` config: {},`,
338
+ ` },`,
339
+ `];`,
340
+ ``,
341
+ ].join('\n');
342
+ }
343
+ return ['export default [];', ''].join('\n');
344
+ }
345
+ function renderBoundariesAsset() {
346
+ return [
347
+ `export default [`,
348
+ ` // Example architecture boundary:`,
349
+ ` // {`,
350
+ ` // id: 'boundary.layer.example',`,
351
+ ` // title: 'Example layer boundary',`,
352
+ ` // severity: 'error',`,
353
+ ` // from: ['packages/lower/**/*.ts'],`,
354
+ ` // forbiddenImports: ['@my/higher'],`,
355
+ ` // },`,
356
+ `];`,
357
+ ``,
358
+ ].join('\n');
359
+ }
360
+ function renderPluginContractExample() {
361
+ return [
362
+ `// Example: an adapter-style plugin contract.`,
363
+ `// Replace with the actual interface your platform expects.`,
364
+ `export interface IPluginCapability {`,
365
+ ` id: string;`,
366
+ ` invoke(input: unknown): Promise<unknown>;`,
367
+ `}`,
368
+ ``,
369
+ ].join('\n');
370
+ }
371
+ function renderEnterpriseReviewDocs() {
372
+ return [
373
+ `# Review workflow`,
374
+ '',
375
+ 'Describe how PRs in your organisation get reviewed:',
376
+ '',
377
+ '- Number of approvals required',
378
+ '- Required automated checks',
379
+ '- Security/compliance signoff path',
380
+ '',
381
+ ].join('\n');
382
+ }
383
+ function renderEnterpriseSecurityDocs() {
384
+ return [
385
+ `# Security baseline`,
386
+ '',
387
+ '- All packs must be signed before adoption.',
388
+ '- Secrets must never be committed.',
389
+ '- Verification commands must be reviewed before adding to trusted list.',
390
+ '',
391
+ ].join('\n');
392
+ }
393
+ function renderDocsOverview(input, fullName) {
394
+ return [
395
+ `# ${fullName} — overview`,
396
+ '',
397
+ `Kind: \`${input.kind}\``,
398
+ input.preset ? `Preset: \`${input.preset}\`` : '',
399
+ '',
400
+ 'This pack ships:',
401
+ '',
402
+ '- knowledge entries',
403
+ '- rules',
404
+ '- path conventions',
405
+ '- templates',
406
+ '- pipelines',
407
+ '- presets',
408
+ '',
409
+ ]
410
+ .filter(Boolean)
411
+ .join('\n') + '\n';
412
+ }
413
+ // ─── CLI handler ─────────────────────────────────────────────────────────────
414
+ export const packsNewCommand = {
415
+ name: 'new',
416
+ description: 'Scaffold a new SharkCraft pack package (rules / paths / templates / pipelines / presets / boundaries). Dry-run by default — pass --write to materialize. No install, no publish, no overwrite without --force.',
417
+ usage: 'shrk [--cwd <dir>] packs new <name> [--scope @org] [--preset <id>] [--kind generic|framework|architecture|enterprise|platform-adopter] [--with-examples] [--write] [--force] [--json]',
418
+ async run(args) {
419
+ const name = args.positional[0];
420
+ if (!name) {
421
+ process.stderr.write('Usage: shrk packs new <name> [--scope @org] [--preset <id>] [--kind generic|framework|architecture|enterprise|platform-adopter] [--with-examples] [--write]\n');
422
+ return 2;
423
+ }
424
+ const cwd = resolveCwd(args);
425
+ const kindFlag = (flagString(args, 'kind') ?? 'generic');
426
+ if (!VALID_KINDS.has(kindFlag)) {
427
+ process.stderr.write(`Invalid --kind "${kindFlag}". Expected one of: ${[...VALID_KINDS].join(', ')}\n`);
428
+ return 2;
429
+ }
430
+ const scope = flagString(args, 'scope');
431
+ const preset = flagString(args, 'preset');
432
+ const withExamples = flagBool(args, 'with-examples');
433
+ const write = flagBool(args, 'write');
434
+ const force = flagBool(args, 'force');
435
+ const wantJson = flagBool(args, 'json');
436
+ const outDir = nodePath.resolve(cwd, name);
437
+ const result = planPackScaffold({
438
+ name,
439
+ outDir,
440
+ kind: kindFlag,
441
+ withExamples,
442
+ ...(scope ? { scope } : {}),
443
+ ...(preset ? { preset } : {}),
444
+ ...(force ? { force: true } : {}),
445
+ });
446
+ if (!write) {
447
+ if (wantJson) {
448
+ process.stdout.write(asJson({
449
+ mode: 'dry-run',
450
+ outDir,
451
+ files: result.files.map((f) => ({ relativePath: f.relativePath, bytes: f.body.length })),
452
+ }) + '\n');
453
+ return 0;
454
+ }
455
+ process.stdout.write(header(`Pack scaffold (dry-run): ${name}`));
456
+ process.stdout.write(kv('kind', kindFlag) + '\n');
457
+ process.stdout.write(kv('outDir', outDir) + '\n');
458
+ process.stdout.write('\nFiles that would be written:\n');
459
+ for (const f of result.files) {
460
+ process.stdout.write(` + ${f.relativePath} (${f.body.length} bytes)\n`);
461
+ }
462
+ process.stdout.write('\nRe-run with `--write` to materialize.\n');
463
+ return 0;
464
+ }
465
+ if (existsSync(outDir) && !force) {
466
+ process.stderr.write(`Refusing to scaffold into existing directory: ${outDir}. Pass --force to overwrite.\n`);
467
+ return 1;
468
+ }
469
+ for (const f of result.files) {
470
+ const full = nodePath.join(outDir, f.relativePath);
471
+ // Defense in depth: refuse anything that escapes outDir.
472
+ if (!full.startsWith(outDir + nodePath.sep) && full !== outDir) {
473
+ process.stderr.write(`Refusing to write outside packRoot: ${f.relativePath}\n`);
474
+ return 1;
475
+ }
476
+ mkdirSync(nodePath.dirname(full), { recursive: true });
477
+ if (existsSync(full) && !force) {
478
+ process.stderr.write(`Refusing to overwrite existing file: ${full} (use --force)\n`);
479
+ return 1;
480
+ }
481
+ writeFileSync(full, f.body, 'utf8');
482
+ }
483
+ if (wantJson) {
484
+ process.stdout.write(asJson({
485
+ mode: 'write',
486
+ outDir,
487
+ files: result.files.map((f) => ({ relativePath: f.relativePath, bytes: f.body.length })),
488
+ }) + '\n');
489
+ return 0;
490
+ }
491
+ process.stdout.write(header(`Pack scaffold written: ${name}`));
492
+ process.stdout.write(kv('kind', kindFlag) + '\n');
493
+ process.stdout.write(kv('outDir', outDir) + '\n');
494
+ for (const f of result.files) {
495
+ process.stdout.write(` + ${f.relativePath}\n`);
496
+ }
497
+ process.stdout.write('\nNext: `shrk pack doctor ' + outDir + '` | `shrk pack test ' + outDir + '`\n');
498
+ return 0;
499
+ },
500
+ };
501
+ export const packsTestCommand = {
502
+ name: 'test',
503
+ description: 'Validate a pack at the given path: manifest validation, asset references, signature optional. With --load, import contribution files. With --trusted-load, run template renderers. With --cases, run definePackTest test cases.',
504
+ usage: 'shrk [--cwd <dir>] packs test <path> [--load] [--trusted-load] [--require-signature] [--cases] [--case <id>] [--update-snapshots] [--json]',
505
+ async run(args) {
506
+ const target = args.positional[0];
507
+ if (!target) {
508
+ process.stderr.write('Usage: shrk packs test <path> [--load] [--trusted-load] [--require-signature] [--cases]\n');
509
+ return 2;
510
+ }
511
+ const cwd = resolveCwd(args);
512
+ const packRoot = nodePath.resolve(cwd, target);
513
+ if (!existsSync(packRoot)) {
514
+ process.stderr.write(`Pack path not found: ${packRoot}\n`);
515
+ return 1;
516
+ }
517
+ // Pack-test runner mode.
518
+ const wantsCases = flagBool(args, 'cases') || flagString(args, 'case');
519
+ if (wantsCases) {
520
+ const { runPackTests, renderPackTestReportText } = await import('@shrkcrft/inspector');
521
+ const caseId = flagString(args, 'case');
522
+ const updateSnapshots = flagBool(args, 'update-snapshots');
523
+ const report = await runPackTests({
524
+ packPath: packRoot,
525
+ ...(caseId ? { caseId } : {}),
526
+ ...(updateSnapshots ? { updateSnapshots: true } : {}),
527
+ });
528
+ if (flagBool(args, 'json')) {
529
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
530
+ return report.failed === 0 ? 0 : 1;
531
+ }
532
+ process.stdout.write(renderPackTestReportText(report));
533
+ return report.failed === 0 ? 0 : 1;
534
+ }
535
+ const pkgPath = nodePath.join(packRoot, 'package.json');
536
+ if (!existsSync(pkgPath)) {
537
+ process.stderr.write(`Pack is missing package.json: ${pkgPath}\n`);
538
+ return 1;
539
+ }
540
+ const fs = await import('node:fs');
541
+ let pkg = {};
542
+ try {
543
+ pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
544
+ }
545
+ catch (e) {
546
+ process.stderr.write(`Failed to read package.json: ${e.message}\n`);
547
+ return 1;
548
+ }
549
+ const issues = [];
550
+ if (typeof pkg.name !== 'string') {
551
+ issues.push({ code: 'missing-name', message: 'package.json: name is required', severity: 'error' });
552
+ }
553
+ if (typeof pkg.version !== 'string') {
554
+ issues.push({ code: 'missing-version', message: 'package.json: version is required', severity: 'error' });
555
+ }
556
+ const requiredAssets = [
557
+ 'src/sharkcraft.plugin.ts',
558
+ 'src/assets/rules.ts',
559
+ 'src/assets/paths.ts',
560
+ 'src/assets/templates.ts',
561
+ 'src/assets/pipelines.ts',
562
+ 'src/assets/presets.ts',
563
+ 'src/assets/knowledge.ts',
564
+ ];
565
+ for (const rel of requiredAssets) {
566
+ if (!existsSync(nodePath.join(packRoot, rel))) {
567
+ issues.push({
568
+ code: 'missing-asset',
569
+ message: `Pack is missing expected asset file: ${rel}`,
570
+ severity: 'warning',
571
+ });
572
+ }
573
+ }
574
+ if (flagBool(args, 'require-signature')) {
575
+ const distManifest = nodePath.join(packRoot, 'dist', 'manifest.json');
576
+ if (!existsSync(distManifest)) {
577
+ issues.push({
578
+ code: 'missing-signature',
579
+ message: 'Pack is missing dist/manifest.json — run `shrk pack sign` first',
580
+ severity: 'error',
581
+ });
582
+ }
583
+ }
584
+ const wantLoad = flagBool(args, 'load') || flagBool(args, 'trusted-load');
585
+ const trustedLoad = flagBool(args, 'trusted-load');
586
+ const loadResults = [];
587
+ if (wantLoad) {
588
+ const r = await runRuntimePackTest({ packRoot, trustedLoad });
589
+ issues.push(...r.issues);
590
+ loadResults.push(...r.modules);
591
+ }
592
+ const counts = {
593
+ assets: requiredAssets.filter((rel) => existsSync(nodePath.join(packRoot, rel))).length,
594
+ total: requiredAssets.length,
595
+ };
596
+ const errors = issues.filter((i) => i.severity === 'error');
597
+ if (flagBool(args, 'json')) {
598
+ process.stdout.write(asJson({
599
+ packRoot,
600
+ packageName: pkg.name,
601
+ counts,
602
+ issues,
603
+ loaded: wantLoad,
604
+ trustedLoad,
605
+ modules: loadResults,
606
+ passed: errors.length === 0,
607
+ }) + '\n');
608
+ return errors.length === 0 ? 0 : 1;
609
+ }
610
+ process.stdout.write(header(`Pack test: ${pkg.name ?? '(unknown)'}`));
611
+ process.stdout.write(kv('packRoot', packRoot) + '\n');
612
+ process.stdout.write(kv('assets', `${counts.assets}/${counts.total}`) + '\n');
613
+ if (wantLoad) {
614
+ process.stdout.write(kv('mode', trustedLoad ? 'load (trusted)' : 'load (read-only)') + '\n');
615
+ process.stdout.write(kv('modules', String(loadResults.length)) + '\n');
616
+ }
617
+ if (issues.length === 0) {
618
+ process.stdout.write('\nNo issues found.\n');
619
+ return 0;
620
+ }
621
+ for (const i of issues) {
622
+ process.stdout.write(` ${i.severity.toUpperCase().padEnd(8)} ${i.code.padEnd(28)} ${i.message}\n`);
623
+ }
624
+ process.stdout.write(`\nVerdict: ${errors.length === 0 ? 'OK ✓' : 'pack has issues'}\n`);
625
+ return errors.length === 0 ? 0 : 1;
626
+ },
627
+ };
628
+ async function runRuntimePackTest(input) {
629
+ const { packRoot, trustedLoad } = input;
630
+ const issues = [];
631
+ const modules = [];
632
+ const fs = await import('node:fs');
633
+ // We require Bun for TS module evaluation; document the limitation and bail
634
+ // gracefully when running under plain Node.
635
+ const isBun = typeof globalThis.Bun !== 'undefined';
636
+ if (!isBun) {
637
+ issues.push({
638
+ code: 'runtime-load-requires-bun',
639
+ message: 'pack test --load can only evaluate raw .ts assets under Bun. Run under Bun (`bun run shrk pack test ...`) or pre-build the pack to dist/.',
640
+ severity: 'warning',
641
+ });
642
+ }
643
+ // Plugin entry: import to ensure asset wiring resolves.
644
+ const entry = nodePath.join(packRoot, 'src', 'sharkcraft.plugin.ts');
645
+ if (existsSync(entry)) {
646
+ try {
647
+ const { pathToFileURL } = await import('node:url');
648
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(entry).href + `?bust=${Date.now()}`)));
649
+ const value = mod.default ?? mod;
650
+ const shape = describeShape(value);
651
+ modules.push({
652
+ relativePath: 'src/sharkcraft.plugin.ts',
653
+ kind: 'plugin-entry',
654
+ loaded: true,
655
+ exportShape: shape,
656
+ });
657
+ if (typeof value !== 'object' || value === null) {
658
+ issues.push({
659
+ code: 'plugin-entry-shape',
660
+ message: 'src/sharkcraft.plugin.ts default export must be an object',
661
+ severity: 'error',
662
+ });
663
+ }
664
+ }
665
+ catch (e) {
666
+ modules.push({
667
+ relativePath: 'src/sharkcraft.plugin.ts',
668
+ kind: 'plugin-entry',
669
+ loaded: false,
670
+ error: e.message,
671
+ });
672
+ issues.push({
673
+ code: 'plugin-entry-throw',
674
+ message: `failed to import plugin entry: ${e.message}`,
675
+ severity: 'error',
676
+ });
677
+ }
678
+ }
679
+ // Asset files: every required asset should export an array.
680
+ const assetRels = [
681
+ { rel: 'src/assets/knowledge.ts', kind: 'knowledge' },
682
+ { rel: 'src/assets/rules.ts', kind: 'rule' },
683
+ { rel: 'src/assets/paths.ts', kind: 'path' },
684
+ { rel: 'src/assets/templates.ts', kind: 'template' },
685
+ { rel: 'src/assets/pipelines.ts', kind: 'pipeline' },
686
+ { rel: 'src/assets/presets.ts', kind: 'preset' },
687
+ { rel: 'src/assets/boundaries.ts', kind: 'boundary' },
688
+ ];
689
+ for (const a of assetRels) {
690
+ const full = nodePath.join(packRoot, a.rel);
691
+ if (!existsSync(full))
692
+ continue;
693
+ try {
694
+ const { pathToFileURL } = await import('node:url');
695
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(full).href + `?bust=${Date.now()}`)));
696
+ const value = mod.default;
697
+ const arr = Array.isArray(value) ? value : null;
698
+ modules.push({
699
+ relativePath: a.rel,
700
+ kind: a.kind,
701
+ loaded: true,
702
+ ...(arr ? { arrayLength: arr.length } : {}),
703
+ exportShape: describeShape(value),
704
+ });
705
+ if (value === undefined) {
706
+ issues.push({
707
+ code: 'asset-no-default-export',
708
+ message: `${a.rel} has no default export`,
709
+ severity: 'error',
710
+ });
711
+ continue;
712
+ }
713
+ if (!arr) {
714
+ issues.push({
715
+ code: 'asset-not-array',
716
+ message: `${a.rel} default export must be an array, got ${describeShape(value)}`,
717
+ severity: 'error',
718
+ });
719
+ continue;
720
+ }
721
+ // Validate that each item has an `id` string.
722
+ for (let i = 0; i < arr.length; i += 1) {
723
+ const item = arr[i];
724
+ if (!item || typeof item !== 'object' || typeof item.id !== 'string') {
725
+ issues.push({
726
+ code: 'asset-item-missing-id',
727
+ message: `${a.rel}[${i}] is missing a string \`id\``,
728
+ severity: 'error',
729
+ });
730
+ break;
731
+ }
732
+ }
733
+ if (a.kind === 'template' && trustedLoad) {
734
+ // Best-effort: attempt to render each template's targetPath/content with
735
+ // its default/sample variables. Wrapped in try/catch — any throw is an
736
+ // error issue.
737
+ for (const t of arr) {
738
+ const id = String(t.id ?? '?');
739
+ const vars = {};
740
+ const declared = t.variables ?? [];
741
+ for (const v of declared) {
742
+ if (typeof v.name !== 'string')
743
+ continue;
744
+ vars[v.name] = v.default ?? defaultVar(v.name);
745
+ }
746
+ try {
747
+ const targetPath = t.targetPath;
748
+ if (typeof targetPath === 'function')
749
+ targetPath(vars);
750
+ const content = t.content;
751
+ if (typeof content === 'function')
752
+ content(vars);
753
+ }
754
+ catch (e) {
755
+ issues.push({
756
+ code: 'template-render-throw',
757
+ message: `template ${id} threw during render with default vars: ${e.message}`,
758
+ severity: 'error',
759
+ });
760
+ }
761
+ }
762
+ }
763
+ if (a.kind === 'pipeline') {
764
+ for (const p of arr) {
765
+ if (!Array.isArray(p.steps) || p.steps.length === 0) {
766
+ issues.push({
767
+ code: 'pipeline-no-steps',
768
+ message: `pipeline ${String(p.id ?? '?')} has no steps`,
769
+ severity: 'warning',
770
+ });
771
+ }
772
+ }
773
+ }
774
+ }
775
+ catch (e) {
776
+ modules.push({
777
+ relativePath: a.rel,
778
+ kind: a.kind,
779
+ loaded: false,
780
+ error: e.message,
781
+ });
782
+ issues.push({
783
+ code: 'asset-throw',
784
+ message: `failed to import ${a.rel}: ${e.message}`,
785
+ severity: 'error',
786
+ });
787
+ }
788
+ }
789
+ return { issues, modules };
790
+ }
791
+ function describeShape(v) {
792
+ if (v === null)
793
+ return 'null';
794
+ if (Array.isArray(v))
795
+ return `array(${v.length})`;
796
+ return typeof v;
797
+ }
798
+ function defaultVar(name) {
799
+ // Cheap defaults so renderers don't throw on undefined for common var names.
800
+ if (/class|service|feature|component/i.test(name))
801
+ return 'Sample';
802
+ if (/name|id|slug/i.test(name))
803
+ return 'sample';
804
+ return 'sample';
805
+ }