@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,435 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import * as nodePath from 'node:path';
3
+ import { AssetKind, AssetProvenanceOperation, AssetProvenanceSource, buildRuleScaffold, diagnoseRuleQuality, inspectSharkcraft, recordProvenance, renderRuleQualityText, RuleScaffoldKind, } from '@shrkcrft/inspector';
4
+ import { formatRuleCompact, formatRuleFull, formatRulesForAi } from '@shrkcrft/rules';
5
+ import { flagBool, flagNumber, flagString, flagList, resolveCwd, } from "../command-registry.js";
6
+ import { asJson, header } from "../output/format-output.js";
7
+ import { knowledgeAddCommand, knowledgeRemoveCommand, knowledgeUpdateCommand, } from "./knowledge-author.command.js";
8
+ export const rulesListCommand = {
9
+ name: 'list',
10
+ description: 'List all rules.',
11
+ usage: 'shrk rules list [--json]',
12
+ async run(args) {
13
+ const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
14
+ const rules = inspection.ruleService.list();
15
+ if (flagBool(args, 'json')) {
16
+ process.stdout.write(asJson(rules) + '\n');
17
+ return 0;
18
+ }
19
+ process.stdout.write(header(`Rules (${rules.length})`));
20
+ for (const r of rules)
21
+ process.stdout.write(formatRuleCompact(r) + '\n');
22
+ return 0;
23
+ },
24
+ };
25
+ export const rulesGetCommand = {
26
+ name: 'get',
27
+ description: 'Show full content of one rule.',
28
+ usage: 'shrk rules get <id> [--json]',
29
+ async run(args) {
30
+ const id = args.positional[0];
31
+ if (!id) {
32
+ process.stderr.write('Usage: shrk rules get <id>\n');
33
+ return 2;
34
+ }
35
+ const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
36
+ const rule = inspection.ruleService.get(id);
37
+ if (!rule) {
38
+ process.stderr.write(`No rule with id "${id}".\n`);
39
+ return 1;
40
+ }
41
+ if (flagBool(args, 'json')) {
42
+ process.stdout.write(asJson(rule) + '\n');
43
+ return 0;
44
+ }
45
+ process.stdout.write(formatRuleFull(rule) + '\n');
46
+ return 0;
47
+ },
48
+ };
49
+ export const rulesRelevantCommand = {
50
+ name: 'relevant',
51
+ description: 'Return rules relevant to a task.',
52
+ usage: 'shrk rules relevant --task "<task>" [--scope x,y] [--limit 10] [--ai] [--json]',
53
+ async run(args) {
54
+ const task = flagString(args, 'task');
55
+ if (!task) {
56
+ process.stderr.write('Missing --task\n');
57
+ return 2;
58
+ }
59
+ const scope = flagList(args, 'scope');
60
+ const tags = flagList(args, 'tag');
61
+ const appliesWhen = flagList(args, 'appliesWhen');
62
+ const limit = flagNumber(args, 'limit') ?? 10;
63
+ const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
64
+ const rules = inspection.ruleService.getRelevant(task, {
65
+ scope: scope.length ? scope : undefined,
66
+ tags: tags.length ? tags : undefined,
67
+ appliesWhen: appliesWhen.length ? appliesWhen : undefined,
68
+ limit,
69
+ });
70
+ if (flagBool(args, 'json')) {
71
+ process.stdout.write(asJson(rules) + '\n');
72
+ return 0;
73
+ }
74
+ if (flagBool(args, 'ai')) {
75
+ process.stdout.write(formatRulesForAi(rules) + '\n');
76
+ return 0;
77
+ }
78
+ process.stdout.write(header(`Relevant rules for: ${task}`));
79
+ for (const r of rules)
80
+ process.stdout.write(formatRuleCompact(r) + '\n');
81
+ return 0;
82
+ },
83
+ };
84
+ function parseRuleScaffoldKind(value) {
85
+ switch ((value ?? '').toLowerCase()) {
86
+ case 'safety':
87
+ return RuleScaffoldKind.Safety;
88
+ case 'architecture':
89
+ return RuleScaffoldKind.Architecture;
90
+ case 'style':
91
+ return RuleScaffoldKind.Style;
92
+ case 'governance':
93
+ return RuleScaffoldKind.Governance;
94
+ case 'migration':
95
+ return RuleScaffoldKind.Migration;
96
+ case 'testing':
97
+ return RuleScaffoldKind.Testing;
98
+ case 'advisory':
99
+ return RuleScaffoldKind.Advisory;
100
+ default:
101
+ return RuleScaffoldKind.Architecture;
102
+ }
103
+ }
104
+ export const rulesScaffoldCommand = {
105
+ name: 'scaffold',
106
+ description: 'Scaffold a new rule. Preview-only by default — writes nothing. Pass --write-preview to materialise the scaffold under .sharkcraft/fixes/.',
107
+ usage: 'shrk rules scaffold --id <id> [--kind architecture|safety|style|governance|migration|testing|advisory] [--title <t>] [--rationale <text>] [--owner <name>] [--good <code>] [--bad <code>] [--verification "<cmd>"] [--forbidden "<text>"] [--write-preview] [--json]',
108
+ async run(args) {
109
+ const id = flagString(args, 'id');
110
+ if (!id) {
111
+ process.stderr.write('Usage: shrk rules scaffold --id <id> [--kind <k>] [--write-preview]\n');
112
+ return 2;
113
+ }
114
+ const kind = parseRuleScaffoldKind(flagString(args, 'kind'));
115
+ const verification = flagList(args, 'verification');
116
+ const forbidden = flagList(args, 'forbidden');
117
+ const result = buildRuleScaffold({
118
+ id,
119
+ kind,
120
+ title: flagString(args, 'title') ?? undefined,
121
+ rationale: flagString(args, 'rationale') ?? undefined,
122
+ owner: flagString(args, 'owner') ?? undefined,
123
+ goodExample: flagString(args, 'good') ?? undefined,
124
+ badExample: flagString(args, 'bad') ?? undefined,
125
+ verificationCommands: verification.length > 0 ? verification : undefined,
126
+ forbiddenActions: forbidden.length > 0 ? forbidden : undefined,
127
+ });
128
+ if (flagBool(args, 'json')) {
129
+ process.stdout.write(asJson(result) + '\n');
130
+ // Continue to write-preview side effect even in json mode for parity.
131
+ }
132
+ else {
133
+ process.stdout.write(header(`Rule scaffold preview: ${id}`));
134
+ process.stdout.write(` kind: ${result.kind}\n`);
135
+ process.stdout.write(` generated: ${result.generatedAt}\n`);
136
+ process.stdout.write(` files:\n`);
137
+ process.stdout.write(` ${result.tsScaffold.path}\n`);
138
+ process.stdout.write(` ${result.jsonManifest.path}\n`);
139
+ process.stdout.write(` ${result.explainer.path}\n`);
140
+ if (result.warnings.length > 0) {
141
+ process.stdout.write('\n warnings:\n');
142
+ for (const w of result.warnings)
143
+ process.stdout.write(` • ${w}\n`);
144
+ }
145
+ process.stdout.write('\n--- TypeScript scaffold ---\n');
146
+ process.stdout.write(result.tsScaffold.body);
147
+ process.stdout.write('\n--- Next commands ---\n');
148
+ for (const c of result.nextCommands)
149
+ process.stdout.write(` $ ${c}\n`);
150
+ if (!flagBool(args, 'write-preview')) {
151
+ process.stdout.write('\n (preview only — pass --write-preview to materialise under .sharkcraft/fixes/)\n');
152
+ }
153
+ }
154
+ if (flagBool(args, 'write-preview')) {
155
+ const cwd = resolveCwd(args);
156
+ const dir = nodePath.join(cwd, '.sharkcraft', 'fixes');
157
+ if (!existsSync(dir))
158
+ mkdirSync(dir, { recursive: true });
159
+ for (const file of [result.tsScaffold, result.jsonManifest, result.explainer]) {
160
+ const abs = nodePath.join(cwd, file.path);
161
+ writeFileSync(abs, file.body, 'utf8');
162
+ }
163
+ process.stdout.write(`\nWrote 3 files under ${nodePath.join(cwd, '.sharkcraft', 'fixes')}\n`);
164
+ // Record provenance for the scaffold.
165
+ try {
166
+ const isAgent = Boolean(process.env['SHARKCRAFT_AGENT']) ||
167
+ Boolean(process.env['CLAUDE_CODE_SESSION']);
168
+ recordProvenance({
169
+ projectRoot: cwd,
170
+ entry: {
171
+ operation: AssetProvenanceOperation.Add,
172
+ assetKind: AssetKind.Rule,
173
+ assetId: id,
174
+ source: isAgent ? AssetProvenanceSource.Agent : AssetProvenanceSource.Cli,
175
+ previewPath: result.tsScaffold.path,
176
+ ...(flagString(args, 'reason') ? { reason: flagString(args, 'reason') } : {}),
177
+ },
178
+ });
179
+ }
180
+ catch {
181
+ // best-effort — failing to record provenance must not break the scaffold.
182
+ }
183
+ }
184
+ return 0;
185
+ },
186
+ };
187
+ /**
188
+ * Clone ParsedArgs with a flag override. Used by the rules add/
189
+ * remove wrappers to force `type='rule'` before delegating to the
190
+ * knowledge authoring path.
191
+ */
192
+ function withFlagOverride(args, key, value) {
193
+ const flags = new Map(args.flags);
194
+ flags.set(key, value);
195
+ return {
196
+ positional: [...args.positional],
197
+ flags,
198
+ multiFlags: args.multiFlags,
199
+ ...(args.globalCwd ? { globalCwd: args.globalCwd } : {}),
200
+ };
201
+ }
202
+ /**
203
+ * `shrk rules add`.
204
+ *
205
+ * Mirror of `shrk knowledge add` with `type='rule'` forced. Rules in
206
+ * SharkCraft are knowledge entries with `type='rule'`, so we reuse the
207
+ * canonical `knowledge add` flow (preview, draft path, provenance) and
208
+ * just enforce the type at the wrapper. Refuses if `--type` was passed
209
+ * with a non-rule value.
210
+ */
211
+ export const rulesAddCommand = {
212
+ name: 'add',
213
+ description: 'Preview adding a new rule. Mirror of `knowledge add` with `type=rule` forced. Preview-only — pass --write-preview to materialise under .sharkcraft/authoring/.',
214
+ usage: 'shrk rules add --id <id> [--title <t>] [--priority critical|high|medium|low] [--summary <s>] [--content <text>] [--scope x,y] [--tag x,y] [--applies-when x,y] [--related a,b] [--reference kind:value[:required]] [--reason <text>] [--allow-overwrite] [--write-preview] [--json]',
215
+ async run(args) {
216
+ const id = flagString(args, 'id') ?? args.positional[0];
217
+ if (!id) {
218
+ process.stderr.write('Usage: shrk rules add --id <id> [...]\n');
219
+ return 2;
220
+ }
221
+ const requestedType = flagString(args, 'type');
222
+ if (requestedType && requestedType !== 'rule') {
223
+ process.stderr.write(`Refused: \`shrk rules add\` forces type='rule'. Got --type ${requestedType}. Use \`shrk knowledge add\` for non-rule types.\n`);
224
+ return 2;
225
+ }
226
+ const next = withFlagOverride(args, 'type', 'rule');
227
+ return knowledgeAddCommand.run(next);
228
+ },
229
+ };
230
+ /**
231
+ * `shrk rules remove <id>`.
232
+ *
233
+ * Mirror of `shrk knowledge remove` that first asserts the target id is
234
+ * a rule (so an accidental `shrk rules remove some-knowledge-id` becomes
235
+ * a hard refusal instead of silently removing a documentation entry).
236
+ * Reference-checking is identical to `knowledge remove` — reverse
237
+ * references refuse the preview unless `--force-preview` is set.
238
+ */
239
+ export const rulesRemoveCommand = {
240
+ name: 'remove',
241
+ description: 'Preview removal of a rule. Asserts type=rule then delegates to `knowledge remove` — same reference-check, same preview path, same provenance.',
242
+ usage: 'shrk rules remove <id> [--force-preview] [--reason <text>] [--write-preview] [--json]',
243
+ async run(args) {
244
+ const id = args.positional[0] ?? flagString(args, 'id');
245
+ if (!id) {
246
+ process.stderr.write('Usage: shrk rules remove <id> [--force-preview]\n');
247
+ return 2;
248
+ }
249
+ const cwd = resolveCwd(args);
250
+ const inspection = await inspectSharkcraft({ cwd });
251
+ const entry = inspection.knowledgeEntries.find((e) => e.id === id);
252
+ if (!entry) {
253
+ process.stderr.write(`Unknown id: ${id}. Use \`shrk rules list\` or \`shrk knowledge list\` to find one.\n`);
254
+ return 1;
255
+ }
256
+ if (entry.type !== 'rule') {
257
+ process.stderr.write(`Entry "${id}" exists but type=${entry.type}, not "rule". Use \`shrk knowledge remove ${id}\` instead.\n`);
258
+ return 1;
259
+ }
260
+ return knowledgeRemoveCommand.run(args);
261
+ },
262
+ };
263
+ /**
264
+ * `shrk rules update <id>`.
265
+ *
266
+ * Rules in SharkCraft are stored as knowledge entries with `type='rule'`.
267
+ * The dedicated `rules update` verb exists so the authoring surface for
268
+ * rules feels first-class. It asserts the target id is a rule and then
269
+ * delegates to the knowledge-update flow — same flags, same preview
270
+ * location (`.sharkcraft/authoring/`), same provenance ledger.
271
+ *
272
+ * Provenance: written under `AssetKind.Knowledge` (the underlying data
273
+ * model). The dedicated `rules scaffold` flow writes under
274
+ * `AssetKind.Rule` for new rules; updates piggy-back on knowledge.
275
+ */
276
+ export const rulesUpdateCommand = {
277
+ name: 'update',
278
+ description: 'Preview an update to an existing rule. Thin wrapper over `knowledge update` (rules are knowledge entries with type="rule") — same flags, preview-first, provenance recorded.',
279
+ usage: 'shrk rules update <id> [--summary <s>] [--content <text>] [--priority critical|high|medium|low] [--add-related a,b] [--remove-related a,b] [--reference kind:value[:required]] [--remove-reference kind:value] [--mark-deprecated] [--unmark-deprecated] [--reason <text>] [--write-preview] [--json]',
280
+ async run(args) {
281
+ const id = args.positional[0] ?? flagString(args, 'id');
282
+ if (!id) {
283
+ process.stderr.write('Usage: shrk rules update <id> [...]\n');
284
+ return 2;
285
+ }
286
+ const cwd = resolveCwd(args);
287
+ const inspection = await inspectSharkcraft({ cwd });
288
+ const entry = inspection.knowledgeEntries.find((e) => e.id === id);
289
+ if (!entry) {
290
+ process.stderr.write(`Unknown id: ${id}. Use \`shrk rules list\` or \`shrk knowledge list\` to find one.\n`);
291
+ return 1;
292
+ }
293
+ if (entry.type !== 'rule') {
294
+ process.stderr.write(`Entry "${id}" exists but type=${entry.type}, not "rule". Use \`shrk knowledge update ${id}\` instead.\n`);
295
+ return 1;
296
+ }
297
+ return knowledgeUpdateCommand.run(args);
298
+ },
299
+ };
300
+ /**
301
+ * `shrk rules lint` is the lint-style alias of `rules doctor`. It
302
+ * defaults to strict (warnings + errors fail), supports `--fix-preview`
303
+ * which materialises a smallest-change patch under
304
+ * `.sharkcraft/fixes/rules-lint/<rule-id>.patch.md` per finding, and
305
+ * never mutates source.
306
+ */
307
+ export const rulesLintCommand = {
308
+ name: 'lint',
309
+ description: 'Lint rules — alias of `rules doctor` with lint-style defaults. `--fix-preview` materialises smallest-change patches under .sharkcraft/fixes/rules-lint/ (preview only).',
310
+ usage: 'shrk rules lint [--id <ruleId>] [--advisory <ruleId,...>] [--fix-preview] [--write-preview] [--json]',
311
+ async run(args) {
312
+ const cwd = resolveCwd(args);
313
+ const inspection = await inspectSharkcraft({ cwd });
314
+ const rules = inspection.ruleService.list();
315
+ const knownVerificationIds = new Set((inspection.config?.verificationCommands ?? []).map((c) => c.id));
316
+ const advisoryFlag = flagList(args, 'advisory');
317
+ const id = flagString(args, 'id');
318
+ const report = diagnoseRuleQuality(rules, {
319
+ ruleId: id ?? undefined,
320
+ advisoryRuleIds: advisoryFlag.length > 0 ? advisoryFlag : undefined,
321
+ }, { knownVerificationIds });
322
+ const wantJson = flagBool(args, 'json');
323
+ const wantFixPreview = flagBool(args, 'fix-preview');
324
+ const wantWritePreview = flagBool(args, 'write-preview');
325
+ const suggestions = [];
326
+ if (wantFixPreview) {
327
+ for (const f of report.findings) {
328
+ const ruleId = f.ruleId ?? 'unknown';
329
+ const suggestion = buildSmallestRuleFix(f);
330
+ if (suggestion) {
331
+ suggestions.push({ ruleId, finding: f.code, suggestion });
332
+ }
333
+ }
334
+ }
335
+ if (wantJson) {
336
+ process.stdout.write(asJson({ report, suggestions }) + '\n');
337
+ }
338
+ else {
339
+ process.stdout.write(header('Rules lint'));
340
+ process.stdout.write(renderRuleQualityText(report));
341
+ if (wantFixPreview) {
342
+ process.stdout.write('\n--- Fix-preview suggestions ---\n');
343
+ if (suggestions.length === 0) {
344
+ process.stdout.write(' (no automatable fixes — review findings manually)\n');
345
+ }
346
+ else {
347
+ for (const s of suggestions) {
348
+ process.stdout.write(`\n ${s.ruleId} — ${s.finding}\n`);
349
+ for (const line of s.suggestion.split('\n')) {
350
+ process.stdout.write(` ${line}\n`);
351
+ }
352
+ }
353
+ }
354
+ if (!wantWritePreview) {
355
+ process.stdout.write('\n (preview only — pass --write-preview to materialise under .sharkcraft/fixes/rules-lint/)\n');
356
+ }
357
+ }
358
+ }
359
+ if (wantFixPreview && wantWritePreview && suggestions.length > 0) {
360
+ const dir = nodePath.join(cwd, '.sharkcraft', 'fixes', 'rules-lint');
361
+ if (!existsSync(dir))
362
+ mkdirSync(dir, { recursive: true });
363
+ for (const s of suggestions) {
364
+ const safeId = s.ruleId.replace(/[^a-z0-9._-]/gi, '_');
365
+ const out = nodePath.join(dir, `${safeId}.${s.finding}.patch.md`);
366
+ const body = `# Rules-lint fix preview\n\n` +
367
+ `- rule: ${s.ruleId}\n` +
368
+ `- finding: ${s.finding}\n\n` +
369
+ `${s.suggestion}\n`;
370
+ writeFileSync(out, body, 'utf8');
371
+ }
372
+ process.stdout.write(`\nWrote ${suggestions.length} preview file(s) under ${nodePath.join(cwd, '.sharkcraft', 'fixes', 'rules-lint')}\n`);
373
+ }
374
+ // Lint defaults to strict — warnings and errors both fail.
375
+ return report.summary.errors + report.summary.warnings > 0 ? 1 : 0;
376
+ },
377
+ };
378
+ function buildSmallestRuleFix(finding) {
379
+ // Deterministic, opinionated smallest-change suggestions. We never invent
380
+ // semantic content — the agent fills it in. The preview shows the shape.
381
+ switch (finding.code) {
382
+ case 'missing-owner':
383
+ return `Add an \`owner\` to this rule:\n\n owner: 'team-name@example.com'`;
384
+ case 'missing-verification':
385
+ return `Add at least one verificationCommand id from sharkcraft.config.ts:\n\n actionHints: { verificationCommands: ['<id-from-config>'] }`;
386
+ case 'missing-hints':
387
+ case 'missing-action-hints':
388
+ return `Add an \`actionHints\` block:\n\n actionHints: {\n commands: [{ command: 'shrk <cmd>' }],\n verificationCommands: [],\n forbiddenActions: [],\n }`;
389
+ case 'missing-commands-or-mcp':
390
+ return `Add either \`actionHints.commands\` or \`actionHints.mcpTools\` so agents know which command to run.`;
391
+ case 'missing-forbidden-actions':
392
+ return `Add \`actionHints.forbiddenActions: ['<plain-language description>']\` so agents know what NOT to do.`;
393
+ case 'missing-write-policy':
394
+ return `Set \`actionHints.writePolicy\` to 'cli-only' | 'plan-first' | 'preview-only'.`;
395
+ case 'missing-examples':
396
+ return `Add a paired example to the rule's \`examples\` array:\n\n examples: [\n { kind: 'good', code: '<canonical correct sample>' },\n { kind: 'bad', code: '<typical mistake>' },\n ]`;
397
+ case 'vague-rule':
398
+ return `Rewrite the rationale as a single, falsifiable sentence ("X must Y because Z").`;
399
+ case 'advisory-not-marked':
400
+ return `Either set \`advisory: true\` on the rule, or remove it from the \`--advisory\` list passed to \`rules lint\`.`;
401
+ case 'advisory-has-unused-verification':
402
+ return `Advisory rules don't enforce — drop \`actionHints.verificationCommands\`, or unmark advisory if the verification really should run.`;
403
+ case 'verification-references-unknown-script':
404
+ return `Either declare this command in \`sharkcraft.config.ts > verificationCommands[]\`, or change the rule to reference an existing one.`;
405
+ default:
406
+ return null;
407
+ }
408
+ }
409
+ export const rulesDoctorCommand = {
410
+ name: 'doctor',
411
+ description: 'Rule quality doctor. Surfaces missing actionHints / verificationCommands / examples / owner, vague rules, advisory mismatch.',
412
+ usage: 'shrk rules doctor [--id <ruleId>] [--advisory <ruleId,...>] [--strict] [--json]',
413
+ async run(args) {
414
+ const cwd = resolveCwd(args);
415
+ const inspection = await inspectSharkcraft({ cwd });
416
+ const rules = inspection.ruleService.list();
417
+ const knownVerificationIds = new Set((inspection.config?.verificationCommands ?? []).map((c) => c.id));
418
+ const advisoryFlag = flagList(args, 'advisory');
419
+ const id = flagString(args, 'id');
420
+ const report = diagnoseRuleQuality(rules, {
421
+ ruleId: id ?? undefined,
422
+ advisoryRuleIds: advisoryFlag.length > 0 ? advisoryFlag : undefined,
423
+ }, { knownVerificationIds });
424
+ if (flagBool(args, 'json')) {
425
+ process.stdout.write(asJson(report) + '\n');
426
+ }
427
+ else {
428
+ process.stdout.write(renderRuleQualityText(report));
429
+ }
430
+ if (flagBool(args, 'strict')) {
431
+ return report.summary.errors + report.summary.warnings > 0 ? 1 : 0;
432
+ }
433
+ return report.summary.errors > 0 ? 1 : 0;
434
+ },
435
+ };
@@ -0,0 +1,3 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const runtimeDoctorCommand: ICommandHandler;
3
+ //# sourceMappingURL=runtime.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.command.d.ts","sourceRoot":"","sources":["../../src/commands/runtime.command.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAKhC,eAAO,MAAM,oBAAoB,EAAE,eAiDlC,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import * as nodePath from 'node:path';
3
+ import { flagBool, resolveCwd, } from "../command-registry.js";
4
+ import { asJson, header, kv } from "../output/format-output.js";
5
+ const REPORT_FILE = '.sharkcraft/reports/compat-node-report.json';
6
+ export const runtimeDoctorCommand = {
7
+ name: 'doctor',
8
+ description: 'Report runtime info + latest Node-compatibility audit. Read-only; no shell.',
9
+ usage: 'shrk runtime doctor [--json]',
10
+ run(args) {
11
+ const cwd = resolveCwd(args);
12
+ const reportPath = nodePath.join(cwd, REPORT_FILE);
13
+ const reportExists = existsSync(reportPath);
14
+ let report = null;
15
+ if (reportExists) {
16
+ try {
17
+ report = JSON.parse(readFileSync(reportPath, 'utf8'));
18
+ }
19
+ catch {
20
+ report = null;
21
+ }
22
+ }
23
+ // Avoid a direct `Bun.<x>` reference so the compat:node scanner stays
24
+ // green when this file ships to a pure-Node runtime; read via globalThis
25
+ // instead. The audit script flags `Bun.<id>` shaped tokens outside
26
+ // string literals.
27
+ const g = globalThis;
28
+ const runtime = {
29
+ bun: g.Bun?.version ?? null,
30
+ node: typeof process !== 'undefined' ? process.version : null,
31
+ platform: process.platform,
32
+ arch: process.arch,
33
+ };
34
+ if (flagBool(args, 'json')) {
35
+ process.stdout.write(asJson({ runtime, reportFile: reportExists ? reportPath : null, report }) + '\n');
36
+ return 0;
37
+ }
38
+ process.stdout.write(header('Runtime doctor'));
39
+ process.stdout.write(kv('bun', String(runtime['bun'] ?? '(node)')) + '\n');
40
+ process.stdout.write(kv('node', String(runtime['node'])) + '\n');
41
+ process.stdout.write(kv('platform', `${runtime['platform']}-${runtime['arch']}`) + '\n');
42
+ if (reportExists) {
43
+ const r = report;
44
+ process.stdout.write(kv('compat:node report', reportPath) + '\n');
45
+ if (r) {
46
+ process.stdout.write(kv(' passed', String(r.passed)) + '\n');
47
+ process.stdout.write(kv(' bun.* usages', String((r.bunUsage ?? []).length)) + '\n');
48
+ process.stdout.write(kv(' runtime probes', String((r.runtimeProbes ?? []).length)) + '\n');
49
+ }
50
+ }
51
+ else {
52
+ process.stdout.write('compat:node report: (none — run `bun run compat:node --runtime --build`)\n');
53
+ }
54
+ return 0;
55
+ },
56
+ };
@@ -0,0 +1,3 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const safetyCommand: ICommandHandler;
3
+ //# sourceMappingURL=safety.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.command.d.ts","sourceRoot":"","sources":["../../src/commands/safety.command.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAMhC,eAAO,MAAM,aAAa,EAAE,eAmE3B,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { buildSafetyAudit, buildSafetyAuditDeep, inspectSharkcraft, } from '@shrkcrft/inspector';
2
+ import { flagBool, resolveCwd, } from "../command-registry.js";
3
+ import { asJson, header, kv } from "../output/format-output.js";
4
+ import { COMMAND_CATALOG } from "./command-catalog.js";
5
+ const PLAN_SECRET_ENV = 'SHARKCRAFT_PLAN_SECRET';
6
+ export const safetyCommand = {
7
+ name: 'safety',
8
+ description: 'Audit the SharkCraft safety model: which commands write source, which run shell, MCP read-only invariant, pack signature status, plan-signing status. Read-only.',
9
+ usage: 'shrk safety audit [--json]',
10
+ async run(args) {
11
+ const sub = args.positional[0];
12
+ if (sub !== 'audit') {
13
+ process.stderr.write('Usage: shrk safety audit [--json]\n');
14
+ return 2;
15
+ }
16
+ const cwd = resolveCwd(args);
17
+ const inspection = await inspectSharkcraft({ cwd });
18
+ // Lazy-load the MCP tool list to avoid a static import dependency.
19
+ const mcpToolList = await listMcpTools();
20
+ const report = buildSafetyAudit({
21
+ inspection,
22
+ catalog: COMMAND_CATALOG,
23
+ mcpTools: mcpToolList,
24
+ planSecretEnv: PLAN_SECRET_ENV,
25
+ planSecretConfigured: typeof process.env[PLAN_SECRET_ENV] === 'string',
26
+ });
27
+ let deep = null;
28
+ if (flagBool(args, 'deep')) {
29
+ deep = await buildSafetyAuditDeep(inspection);
30
+ }
31
+ if (flagBool(args, 'json')) {
32
+ const merged = deep ? { ...report, deep } : report;
33
+ process.stdout.write(asJson(merged) + '\n');
34
+ const failed = report.mcp.anyWritable || (deep ? !deep.passed : false);
35
+ return failed ? 1 : 0;
36
+ }
37
+ printSafetyAudit(report);
38
+ if (deep) {
39
+ process.stdout.write('\n=== Deep audit ===\n');
40
+ process.stdout.write(` passed: ${deep.passed ? 'yes' : 'no'}\n`);
41
+ process.stdout.write(` info-only findings: ${deep.infoOnlyFindings}\n`);
42
+ process.stdout.write(` report-site external JS: ${deep.reportSiteExternalJs.length}\n`);
43
+ process.stdout.write(` demo destructive lines: ${deep.demoDestructiveLines.length}\n`);
44
+ process.stdout.write(` CI workflows scanned: ${deep.ciGeneratedWorkflowPermissions.length}\n`);
45
+ // Dev-signed packs surface as a top-level deep-audit line so it
46
+ // doesn't get lost in the per-check list.
47
+ if (deep.devSignedPacks && deep.devSignedPacks.length > 0) {
48
+ process.stdout.write(` dev-signed packs: ${deep.devSignedPacks.length}\n`);
49
+ for (const p of deep.devSignedPacks) {
50
+ process.stdout.write(` • ${p.packageName}@${p.packageVersion}${p.signedAt ? ` (signed-at ${p.signedAt})` : ''}\n`);
51
+ }
52
+ // Dev-signed pack findings are info-level by design. The
53
+ // deep-audit verdict ignores them; release readiness is enforced
54
+ // elsewhere. Spell that out so `passed: yes` next to a non-empty
55
+ // dev-signed list stops reading contradictory.
56
+ process.stdout.write('\n Dev-signed packs are info-level findings — the deep-audit verdict ignores them.\n' +
57
+ ' Release readiness is gated by `shrk packs signature-status --release-readiness`.\n');
58
+ }
59
+ if (deep.checks.length > 0) {
60
+ process.stdout.write(' checks:\n');
61
+ for (const c of deep.checks)
62
+ process.stdout.write(` [${c.severity}] ${c.id} — ${c.message}\n`);
63
+ }
64
+ }
65
+ const failed = report.mcp.anyWritable || (deep ? !deep.passed : false);
66
+ return failed ? 1 : 0;
67
+ },
68
+ };
69
+ async function listMcpTools() {
70
+ try {
71
+ const mod = (await import('@shrkcrft/mcp-server'));
72
+ return [...(mod.ALL_TOOLS ?? [])].map((t) => ({ name: t.name, description: t.description }));
73
+ }
74
+ catch {
75
+ return [];
76
+ }
77
+ }
78
+ function printSafetyAudit(r) {
79
+ process.stdout.write(header('SharkCraft safety audit'));
80
+ process.stdout.write(kv('MCP tools', String(r.mcp.tools.length)) + '\n');
81
+ process.stdout.write(kv('MCP writable', r.mcp.anyWritable ? 'YES — INVARIANT VIOLATED' : 'no (read-only ✓)') + '\n');
82
+ process.stdout.write(kv('packs', String(r.packs.discovered)) + '\n');
83
+ process.stdout.write(kv('pack signatures', `verified=${r.packs.signedAndVerified} not-checked=${r.packs.signedNotVerified} unsigned=${r.packs.unsigned} invalid=${r.packs.invalid}`) + '\n');
84
+ process.stdout.write(kv('plan signing', r.planSigning.secretConfigured
85
+ ? `${r.planSigning.secretEnv} configured`
86
+ : `${r.planSigning.secretEnv} not set`) + '\n');
87
+ process.stdout.write('\nCommand safety by level:\n');
88
+ process.stdout.write(` read-only: ${r.commands.readOnly.length}\n`);
89
+ process.stdout.write(` writes-session: ${r.commands.writesSession.length}\n`);
90
+ process.stdout.write(` writes-drafts: ${r.commands.writesDrafts.length}\n`);
91
+ process.stdout.write(` writes-source: ${r.commands.writesSource.length}\n`);
92
+ process.stdout.write(` runs-shell: ${r.commands.runsShell.length}\n`);
93
+ if (r.commands.writesSource.length > 0) {
94
+ process.stdout.write('\nCommands that write source (require human approval):\n');
95
+ for (const c of r.commands.writesSource) {
96
+ process.stdout.write(` • ${c.command.padEnd(34)} ${c.description}\n`);
97
+ }
98
+ }
99
+ if (r.verifications.untrusted.length > 0) {
100
+ process.stdout.write('\nLocal verification commands NOT marked trusted:\n');
101
+ for (const v of r.verifications.untrusted) {
102
+ process.stdout.write(` • ${v.id.padEnd(20)} ${v.command}\n`);
103
+ }
104
+ }
105
+ if (r.verifications.pack.length > 0) {
106
+ process.stdout.write('\nPack-contributed verification commands (NOT auto-run):\n');
107
+ for (const v of r.verifications.pack) {
108
+ process.stdout.write(` • ${v.id.padEnd(20)} (${v.packPackageName ?? '?'})\n`);
109
+ }
110
+ }
111
+ if (r.recommendations.length > 0) {
112
+ process.stdout.write('\nRecommendations:\n');
113
+ for (const rec of r.recommendations)
114
+ process.stdout.write(` • ${rec}\n`);
115
+ }
116
+ process.stdout.write(`\nVerdict: ${r.mcp.anyWritable ? 'MCP INVARIANT VIOLATED' : 'safety model intact ✓'}\n`);
117
+ }
@@ -0,0 +1,5 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const scaffoldsListCommand: ICommandHandler;
3
+ export declare const scaffoldsGetCommand: ICommandHandler;
4
+ export declare const scaffoldsDoctorCommand: ICommandHandler;
5
+ //# sourceMappingURL=scaffolds.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolds.command.d.ts","sourceRoot":"","sources":["../../src/commands/scaffolds.command.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAGhC,eAAO,MAAM,oBAAoB,EAAE,eA0ClC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAmCjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAwCpC,CAAC"}