@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,819 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import * as nodePath from 'node:path';
3
+ import { analyzeImpact, analyzeTestImpact, findSymbolInProject, FuzzyImpactSourceKind, getChangedFiles, ImpactInputKind, inspectSharkcraft, QueryMatchKind, readFeatureBundle, renderImpactGraph, renderImpactHtml, renderImpactMarkdown, renderImpactText, resolveFuzzyImpact, warmConstructCache, } from '@shrkcrft/inspector';
4
+ import { flagBool, flagNumber, flagString, flagList, resolveCwd, } from "../command-registry.js";
5
+ import { asJson, header } from "../output/format-output.js";
6
+ function collectFiles(args, cwd) {
7
+ const diagnostics = [];
8
+ const explicitFiles = flagList(args, 'files');
9
+ const fileFlag = flagString(args, 'file');
10
+ const specifier = flagString(args, 'specifier');
11
+ const sinceRef = flagString(args, 'since');
12
+ const staged = flagBool(args, 'staged');
13
+ const planFile = flagString(args, 'plan');
14
+ const bundleId = flagString(args, 'bundle');
15
+ const files = [];
16
+ const planTargets = [];
17
+ const seenKinds = new Set();
18
+ if (fileFlag) {
19
+ files.push(fileFlag);
20
+ seenKinds.add(ImpactInputKind.File);
21
+ }
22
+ if (explicitFiles.length > 0) {
23
+ files.push(...explicitFiles);
24
+ seenKinds.add(ImpactInputKind.Files);
25
+ }
26
+ if (sinceRef) {
27
+ const changed = getChangedFiles(cwd, { since: sinceRef });
28
+ files.push(...changed);
29
+ if (changed.length === 0)
30
+ diagnostics.push(`no files changed since ${sinceRef}`);
31
+ seenKinds.add(ImpactInputKind.Since);
32
+ }
33
+ if (staged) {
34
+ const changed = getChangedFiles(cwd, { staged: true });
35
+ files.push(...changed);
36
+ if (changed.length === 0)
37
+ diagnostics.push('no staged changes');
38
+ seenKinds.add(ImpactInputKind.Staged);
39
+ }
40
+ if (planFile) {
41
+ const abs = nodePath.isAbsolute(planFile) ? planFile : nodePath.join(cwd, planFile);
42
+ if (!existsSync(abs)) {
43
+ diagnostics.push(`plan file not found: ${planFile}`);
44
+ }
45
+ else {
46
+ try {
47
+ const parsed = JSON.parse(readFileSync(abs, 'utf8'));
48
+ const changes = parsed.changes ?? parsed.plan?.changes ?? [];
49
+ for (const c of changes)
50
+ if (c.relativePath)
51
+ planTargets.push(c.relativePath);
52
+ seenKinds.add(ImpactInputKind.Plan);
53
+ }
54
+ catch (e) {
55
+ diagnostics.push(`failed to read plan: ${e.message}`);
56
+ }
57
+ }
58
+ }
59
+ if (bundleId) {
60
+ const bundle = readFeatureBundle(cwd, bundleId);
61
+ if (!bundle) {
62
+ diagnostics.push(`bundle "${bundleId}" not found`);
63
+ }
64
+ else {
65
+ for (const f of bundle.affectedFiles)
66
+ files.push(f);
67
+ for (const p of bundle.plans)
68
+ for (const t of p.expectedTargets)
69
+ planTargets.push(t);
70
+ seenKinds.add(ImpactInputKind.Bundle);
71
+ }
72
+ }
73
+ // Positional support: shrk impact <fileOrSpecifier>
74
+ if (args.positional.length > 0 &&
75
+ !specifier &&
76
+ !fileFlag &&
77
+ explicitFiles.length === 0 &&
78
+ !sinceRef &&
79
+ !staged &&
80
+ !planFile &&
81
+ !bundleId) {
82
+ const arg = args.positional[0];
83
+ if (arg.startsWith('@') || /^[a-z]+:/i.test(arg)) {
84
+ // Looks like an import specifier.
85
+ const out = {
86
+ files: [],
87
+ planTargets: [],
88
+ kind: ImpactInputKind.Specifier,
89
+ specifier: arg,
90
+ diagnostics,
91
+ };
92
+ return out;
93
+ }
94
+ files.push(arg);
95
+ seenKinds.add(ImpactInputKind.File);
96
+ }
97
+ let kind = ImpactInputKind.Empty;
98
+ if (specifier)
99
+ kind = ImpactInputKind.Specifier;
100
+ else if (seenKinds.size > 1)
101
+ kind = ImpactInputKind.Mixed;
102
+ else if (seenKinds.size === 1)
103
+ kind = [...seenKinds][0];
104
+ const out = {
105
+ files: [...new Set(files)],
106
+ planTargets: [...new Set(planTargets)],
107
+ kind,
108
+ diagnostics,
109
+ };
110
+ if (specifier)
111
+ out.specifier = specifier;
112
+ return out;
113
+ }
114
+ const VALID_PLAN_FORMATS = new Set(['codemod', 'ts-morph', 'jscodeshift']);
115
+ function tsMorphStarter(plan) {
116
+ return `// Codemod starter (ts-morph dialect). TODO bodies only — humans/external\n// tools fill the operations in. Affected files / symbols are pinned by\n// the impact analysis at generation time.\n//\n// Task: ${plan.task || '(unspecified)'}\n//\n// Usage:\n// bun add -d ts-morph\n// bun run codemod.ts\n\nimport { Project } from 'ts-morph';\n\nconst project = new Project({ tsConfigFilePath: 'tsconfig.base.json' });\n\nconst affectedFiles = ${JSON.stringify(plan.affectedFiles, null, 2)};\nconst symbols = ${JSON.stringify(plan.symbols, null, 2)};\n\nfor (const relPath of affectedFiles) {\n const sourceFile = project.getSourceFile(relPath);\n if (!sourceFile) continue;\n // TODO: apply operations for symbols ${plan.symbols.join(', ') || '(none)'}\n}\n\nproject.saveSync();\n`;
117
+ }
118
+ function jscodeshiftStarter(plan) {
119
+ return `// Codemod starter (jscodeshift dialect). TODO bodies only.\n//\n// Task: ${plan.task || '(unspecified)'}\n//\n// Usage:\n// bun add -d jscodeshift\n// bunx jscodeshift -t codemod.ts <files>\n\nimport type { Transform } from 'jscodeshift';\n\nconst affectedFiles = ${JSON.stringify(plan.affectedFiles, null, 2)};\nconst symbols = ${JSON.stringify(plan.symbols, null, 2)};\n\nconst transform: Transform = (file, api) => {\n const j = api.jscodeshift;\n const root = j(file.source);\n // TODO: apply operations for symbols ${plan.symbols.join(', ') || '(none)'}\n return root.toSource();\n};\n\nexport default transform;\n`;
120
+ }
121
+ function plainStarter(plan) {
122
+ return `// Codemod handoff (no specific dialect). This file is a checklist.\n//\n// Task: ${plan.task || '(unspecified)'}\n//\n// Affected files (${plan.affectedFiles.length}):\n${plan.affectedFiles.map((f) => `// - ${f}`).join('\n') || '// (none)'}\n//\n// Symbols of interest:\n${plan.symbols.map((s) => `// - ${s}`).join('\n') || '// (none)'}\n//\n// Operation categories: ${plan.suggestedOperationCategories.join(', ') || '(none)'}\n//\n// Safety notes:\n${plan.safeNotes.map((n) => `// - ${n}`).join('\n')}\n//\n// Pre-merge checks:\n${plan.testRecommendations.map((t) => `// - $ ${t}`).join('\n')}\n`;
123
+ }
124
+ async function emitCodemodPlan(opts) {
125
+ if (!VALID_PLAN_FORMATS.has(opts.format)) {
126
+ process.stderr.write(`Unknown --plan-format "${opts.format}". Use codemod | ts-morph | jscodeshift.\n`);
127
+ return 2;
128
+ }
129
+ const dialect = opts.format;
130
+ const collectFiles = (xs) => (xs ?? []).map((x) => x.relativePath).filter((s) => typeof s === 'string');
131
+ const affectedFiles = Array.from(new Set([
132
+ ...collectFiles(opts.analysis.targets),
133
+ ...collectFiles(opts.analysis.direct),
134
+ ...collectFiles(opts.analysis.transitive),
135
+ ]));
136
+ const riskGroupsMap = new Map();
137
+ for (const r of opts.analysis.risks ?? []) {
138
+ const arr = riskGroupsMap.get(r.severity) ?? [];
139
+ if (r.relativePath)
140
+ arr.push(r.relativePath);
141
+ riskGroupsMap.set(r.severity, arr);
142
+ }
143
+ const riskGroups = [...riskGroupsMap.entries()].map(([risk, files]) => ({
144
+ risk,
145
+ files,
146
+ }));
147
+ let starterPath = null;
148
+ let starterBody = null;
149
+ const plan = {
150
+ schema: 'sharkcraft.codemod-plan/v1',
151
+ generatedAt: new Date().toISOString(),
152
+ format: dialect,
153
+ task: opts.task ?? '',
154
+ affectedFiles,
155
+ symbols: [],
156
+ riskGroups,
157
+ suggestedOperationCategories: ['rename', 'inline', 'extract', 'move', 'replace'],
158
+ safeNotes: [
159
+ 'preserve formatting — codemods that emit prettier-incompatible output are rejected at review',
160
+ 'always run `bun test` after applying the codemod',
161
+ 'commit the codemod script alongside the changes for replay',
162
+ ],
163
+ unsafeNotes: affectedFiles.length > 50
164
+ ? [`large blast radius: ${affectedFiles.length} files — split the codemod into batches`]
165
+ : [],
166
+ testRecommendations: [
167
+ 'bun test',
168
+ 'bun x tsc -p tsconfig.base.json --noEmit',
169
+ 'shrk check boundaries --changed-only',
170
+ ],
171
+ codemodStarterMetadata: {
172
+ language: 'typescript',
173
+ dialect,
174
+ starterPath: null,
175
+ },
176
+ };
177
+ if (opts.writeStarter) {
178
+ const taskSlug = (opts.task ?? 'task').replace(/[^a-z0-9-]/gi, '-').toLowerCase() || 'codemod';
179
+ starterPath = nodePath.join(opts.cwd, '.sharkcraft', 'fixes', taskSlug, 'codemod.ts');
180
+ starterBody =
181
+ dialect === 'ts-morph'
182
+ ? tsMorphStarter(plan)
183
+ : dialect === 'jscodeshift'
184
+ ? jscodeshiftStarter(plan)
185
+ : plainStarter(plan);
186
+ mkdirSync(nodePath.dirname(starterPath), { recursive: true });
187
+ writeFileSync(starterPath, starterBody, 'utf8');
188
+ plan.codemodStarterMetadata.starterPath = nodePath.relative(opts.cwd, starterPath);
189
+ }
190
+ const body = asJson(plan);
191
+ if (opts.output) {
192
+ const abs = nodePath.isAbsolute(opts.output) ? opts.output : nodePath.resolve(opts.cwd, opts.output);
193
+ mkdirSync(nodePath.dirname(abs), { recursive: true });
194
+ writeFileSync(abs, body, 'utf8');
195
+ process.stdout.write(asJson({ wrote: abs, bytes: body.length, starterPath: plan.codemodStarterMetadata.starterPath }) + '\n');
196
+ }
197
+ else {
198
+ process.stdout.write(body + '\n');
199
+ }
200
+ return 0;
201
+ }
202
+ export const impactCommand = {
203
+ name: 'impact',
204
+ description: 'Architecture impact analysis: direct + transitive dependents, risk + suggested commands. Supports fuzzy <query> resolution. Read-only.',
205
+ usage: 'shrk impact <fileOrQuery> | --file <path> | --specifier <spec> | --since <ref> | --staged | --files a,b | --plan <plan.json> | --bundle <id> [--max-depth N] [--limit N] [--format text|markdown|html|json] [--output <path>] [--tree|--no-tree] [--json] [--html] [--resolve|--resolve-only|--explain-resolution|--no-resolve]',
206
+ async run(args) {
207
+ if (args.positional[0] === 'tests') {
208
+ return runImpactTests({ ...args, positional: args.positional.slice(1) });
209
+ }
210
+ if (args.positional[0] === 'graph') {
211
+ return runImpactGraph({ ...args, positional: args.positional.slice(1) });
212
+ }
213
+ const cwd = resolveCwd(args);
214
+ const inspection = await inspectSharkcraft({ cwd });
215
+ // Warm construct cache so fuzzy resolution can map plugin keys / events /
216
+ // tokens back to construct files. Safe no-op if no constructs are defined.
217
+ try {
218
+ await warmConstructCache(inspection);
219
+ }
220
+ catch {
221
+ // best-effort
222
+ }
223
+ // Direct symbol impact via --symbol <Name>
224
+ const symbolFlag = flagString(args, 'symbol');
225
+ if (symbolFlag) {
226
+ const language = (flagString(args, 'language') ?? 'auto');
227
+ const symReport = findSymbolInProject(cwd, symbolFlag, { language });
228
+ const wantJson = flagBool(args, 'json') || flagString(args, 'format') === 'json';
229
+ const exactCount = symReport.exactMatches.length;
230
+ if (exactCount === 0) {
231
+ if (wantJson) {
232
+ process.stdout.write(asJson(symReport) + '\n');
233
+ }
234
+ else {
235
+ process.stdout.write(header(`Symbol impact: ${symbolFlag}`));
236
+ process.stdout.write(` no exact-export or exact-local match found.\n`);
237
+ if (symReport.textMatches.length > 0) {
238
+ process.stdout.write(` text matches (likely usages): ${symReport.textMatches.length}\n`);
239
+ for (const t of symReport.textMatches.slice(0, 8)) {
240
+ process.stdout.write(` • ${t.relativePath}\n`);
241
+ }
242
+ }
243
+ process.stdout.write('\nNext commands:\n');
244
+ process.stdout.write(` shrk trace --symbol ${symbolFlag}\n`);
245
+ process.stdout.write(` shrk find "${symbolFlag}"\n`);
246
+ }
247
+ return 1;
248
+ }
249
+ if (exactCount > 1) {
250
+ if (wantJson) {
251
+ process.stdout.write(asJson(symReport) + '\n');
252
+ }
253
+ else {
254
+ process.stdout.write(header(`Symbol impact: ${symbolFlag} (${exactCount} matches)`));
255
+ process.stdout.write('Alternatives:\n');
256
+ for (const m of symReport.exactMatches) {
257
+ process.stdout.write(` • ${m.relativePath} (${m.resolution}) — ${m.message}\n`);
258
+ }
259
+ process.stdout.write('\nNext commands:\n');
260
+ process.stdout.write(` shrk impact <file>\n`);
261
+ process.stdout.write(` shrk trace --symbol ${symbolFlag}\n`);
262
+ }
263
+ return 1;
264
+ }
265
+ // Exactly one — push the file into the impact pipeline.
266
+ const primary = symReport.exactMatches[0];
267
+ if (primary.resolution !== 'exact-export') {
268
+ process.stderr.write(`[symbol] note: \`${symbolFlag}\` resolves to a non-exported (${primary.resolution}) declaration in ${primary.relativePath}.\n`);
269
+ }
270
+ const collected = {
271
+ files: [primary.relativePath],
272
+ planTargets: [],
273
+ kind: ImpactInputKind.File,
274
+ diagnostics: ['resolved via --symbol'],
275
+ };
276
+ const reportEarly = await analyzeImpact(inspection, {
277
+ files: collected.files,
278
+ planTargets: [],
279
+ ...(typeof flagNumber(args, 'max-depth') === 'number' ? { maxDepth: flagNumber(args, 'max-depth') } : {}),
280
+ ...(typeof flagNumber(args, 'limit') === 'number' ? { limit: flagNumber(args, 'limit') } : {}),
281
+ });
282
+ if (wantJson) {
283
+ process.stdout.write(asJson({ symbol: symReport, impact: reportEarly }) + '\n');
284
+ return 0;
285
+ }
286
+ process.stdout.write(header(`Symbol impact: ${symbolFlag}`));
287
+ process.stdout.write(`Resolved: ${primary.relativePath} (${primary.resolution})\n\n`);
288
+ process.stdout.write(renderImpactText(reportEarly));
289
+ return 0;
290
+ }
291
+ const collected = collectFiles(args, cwd);
292
+ const positionalRest = args.positional.slice(1).join(' ').trim();
293
+ const task = flagString(args, 'task') ?? (positionalRest.length > 0 ? positionalRest : undefined);
294
+ const maxDepth = flagNumber(args, 'max-depth');
295
+ const limit = flagNumber(args, 'limit');
296
+ // Fuzzy query resolution.
297
+ const wantJsonEarly = flagBool(args, 'json') || flagString(args, 'format') === 'json';
298
+ const explainResolution = flagBool(args, 'explain-resolution');
299
+ const resolveOnly = flagBool(args, 'resolve-only');
300
+ const forceResolve = flagBool(args, 'resolve');
301
+ const noResolve = flagBool(args, 'no-resolve');
302
+ // A "positional query" is the first positional with no other input source.
303
+ const onlyPositional = args.positional.length > 0 &&
304
+ !flagString(args, 'specifier') &&
305
+ !flagString(args, 'file') &&
306
+ flagList(args, 'files').length === 0 &&
307
+ !flagString(args, 'since') &&
308
+ !flagBool(args, 'staged') &&
309
+ !flagString(args, 'plan') &&
310
+ !flagString(args, 'bundle');
311
+ const rawQuery = onlyPositional ? args.positional[0] : null;
312
+ const positionalResolvesToFile = rawQuery
313
+ ? existsSync(nodePath.isAbsolute(rawQuery) ? rawQuery : nodePath.join(cwd, rawQuery))
314
+ : false;
315
+ const looksLikeSpecifier = rawQuery
316
+ ? rawQuery.startsWith('@') || /^[a-z]+:/i.test(rawQuery)
317
+ : false;
318
+ let fuzzyResolution;
319
+ const shouldFuzzy = rawQuery !== null &&
320
+ !noResolve &&
321
+ (forceResolve || resolveOnly || explainResolution || (!positionalResolvesToFile && !looksLikeSpecifier));
322
+ if (shouldFuzzy && rawQuery) {
323
+ fuzzyResolution = resolveFuzzyImpact(inspection, rawQuery, {
324
+ resolveOnly,
325
+ });
326
+ if (resolveOnly) {
327
+ const payload = {
328
+ schema: fuzzyResolution.schema,
329
+ query: fuzzyResolution.query,
330
+ confidence: fuzzyResolution.confidence,
331
+ source: fuzzyResolution.source,
332
+ resolvedId: fuzzyResolution.resolvedId,
333
+ resolvedLabel: fuzzyResolution.resolvedLabel,
334
+ files: fuzzyResolution.files,
335
+ alternatives: fuzzyResolution.alternatives,
336
+ shouldRunImpact: fuzzyResolution.shouldRunImpact,
337
+ followUpCommands: fuzzyResolution.followUpCommands,
338
+ diagnostics: fuzzyResolution.diagnostics,
339
+ };
340
+ if (wantJsonEarly) {
341
+ process.stdout.write(asJson(payload) + '\n');
342
+ }
343
+ else {
344
+ process.stdout.write(header(`Impact resolution: ${rawQuery}`));
345
+ process.stdout.write(`Source: ${fuzzyResolution.source}\n`);
346
+ process.stdout.write(`Confidence: ${fuzzyResolution.confidence}\n`);
347
+ if (fuzzyResolution.resolvedId)
348
+ process.stdout.write(`Resolved: ${fuzzyResolution.resolvedId}\n`);
349
+ if (fuzzyResolution.files.length > 0) {
350
+ process.stdout.write('Files:\n');
351
+ for (const f of fuzzyResolution.files)
352
+ process.stdout.write(` + ${f}\n`);
353
+ }
354
+ if (fuzzyResolution.alternatives.length > 0) {
355
+ process.stdout.write('Alternatives:\n');
356
+ for (const a of fuzzyResolution.alternatives) {
357
+ process.stdout.write(` • ${a.kind.padEnd(12)} ${a.id} [${a.score.toFixed(0)}]\n`);
358
+ }
359
+ }
360
+ if (fuzzyResolution.followUpCommands.length > 0) {
361
+ process.stdout.write('Follow-up commands:\n');
362
+ for (const c of fuzzyResolution.followUpCommands)
363
+ process.stdout.write(` $ ${c}\n`);
364
+ }
365
+ for (const d of fuzzyResolution.diagnostics)
366
+ process.stdout.write(` ! ${d}\n`);
367
+ }
368
+ return fuzzyResolution.resolvedId ? 0 : 1;
369
+ }
370
+ // Splice resolved files into the impact input when high-confidence.
371
+ if (fuzzyResolution.shouldRunImpact && fuzzyResolution.files.length > 0) {
372
+ for (const f of fuzzyResolution.files)
373
+ collected.files.push(f);
374
+ collected.files = [...new Set(collected.files)];
375
+ collected.kind = ImpactInputKind.File;
376
+ }
377
+ else if (!fuzzyResolution.shouldRunImpact && !explainResolution) {
378
+ // Ambiguous / low-confidence — surface alternatives + exit without auto-running.
379
+ if (wantJsonEarly) {
380
+ process.stdout.write(asJson(fuzzyResolution) + '\n');
381
+ }
382
+ else {
383
+ process.stdout.write(header(`Impact: ambiguous query "${rawQuery}"`));
384
+ process.stdout.write(`Confidence: ${fuzzyResolution.confidence}\n`);
385
+ if (fuzzyResolution.resolvedId) {
386
+ process.stdout.write(`Best: ${fuzzyResolution.matchKind ?? '?'} ${fuzzyResolution.resolvedId}\n`);
387
+ }
388
+ if (fuzzyResolution.alternatives.length > 0) {
389
+ process.stdout.write('Alternatives:\n');
390
+ for (const a of fuzzyResolution.alternatives) {
391
+ process.stdout.write(` • ${a.kind.padEnd(12)} ${a.id} [${a.score.toFixed(0)}]\n`);
392
+ }
393
+ }
394
+ if (fuzzyResolution.followUpCommands.length > 0) {
395
+ process.stdout.write('Try:\n');
396
+ for (const c of fuzzyResolution.followUpCommands)
397
+ process.stdout.write(` $ ${c}\n`);
398
+ }
399
+ for (const d of fuzzyResolution.diagnostics)
400
+ process.stdout.write(` ! ${d}\n`);
401
+ }
402
+ return 1;
403
+ }
404
+ }
405
+ const result = await analyzeImpact(inspection, {
406
+ ...(task ? { task } : {}),
407
+ files: collected.files,
408
+ planTargets: collected.planTargets,
409
+ ...(collected.specifier ? { specifier: collected.specifier } : {}),
410
+ inputKind: collected.kind,
411
+ ...(maxDepth ? { maxDepth } : {}),
412
+ ...(limit ? { limit } : {}),
413
+ });
414
+ // Surface the per-call diagnostics on top of the engine's own.
415
+ for (const d of collected.diagnostics) {
416
+ result.diagnostics.push(d);
417
+ }
418
+ // `--plan-format codemod|ts-morph|jscodeshift` emits a stable
419
+ // codemod-handoff plan instead of the usual impact render. SharkCraft
420
+ // is not a codemod engine; this plan is meant to be consumed by
421
+ // external codemod tools or by humans hand-writing the migration.
422
+ const planFormat = flagString(args, 'plan-format');
423
+ if (planFormat) {
424
+ return await emitCodemodPlan({
425
+ cwd,
426
+ analysis: result,
427
+ format: planFormat,
428
+ writeStarter: flagBool(args, 'write-starter'),
429
+ task,
430
+ output: flagString(args, 'output'),
431
+ });
432
+ }
433
+ const wantHtml = flagBool(args, 'html');
434
+ const format = flagString(args, 'format') ??
435
+ (wantHtml ? 'html' : flagBool(args, 'json') ? 'json' : 'text');
436
+ const treeArg = args.flags.get('tree');
437
+ const treeOption = treeArg === undefined ? undefined : treeArg !== '';
438
+ const noTree = flagBool(args, 'no-tree');
439
+ const useTree = noTree ? false : (treeOption ?? true);
440
+ const renderOpts = { tree: useTree };
441
+ // Polyglot mode — auto (default), off, only.
442
+ const polyglotModeRaw = (flagString(args, 'polyglot-mode') ?? '').toLowerCase();
443
+ const noPolyglot = flagBool(args, 'no-polyglot');
444
+ const polyglotOnly = flagBool(args, 'polyglot-only');
445
+ let polyglotMode = 'auto';
446
+ if (polyglotModeRaw === 'off' || noPolyglot)
447
+ polyglotMode = 'off';
448
+ else if (polyglotModeRaw === 'only' || polyglotOnly)
449
+ polyglotMode = 'only';
450
+ else if (polyglotModeRaw === 'auto' || polyglotModeRaw === '')
451
+ polyglotMode = 'auto';
452
+ // Build a small polyglot impact block for non-TS files.
453
+ const polyglotBlock = polyglotMode === 'off'
454
+ ? null
455
+ : await buildPolyglotImpactBlock(cwd, collected.files);
456
+ let body;
457
+ if (polyglotMode === 'only') {
458
+ if (format === 'json') {
459
+ body = asJson({ polyglot: polyglotBlock, resolution: fuzzyResolution }) + '\n';
460
+ }
461
+ else if (format === 'markdown') {
462
+ body = polyglotBlock ? renderPolyglotImpactMd(polyglotBlock) : '_(no polyglot impact)_\n';
463
+ }
464
+ else if (format === 'html') {
465
+ body = polyglotBlock ? '<pre>' + escapeHtml(renderPolyglotImpactText(polyglotBlock)) + '</pre>' : '<p>(no polyglot impact)</p>';
466
+ }
467
+ else {
468
+ body = polyglotBlock ? renderPolyglotImpactText(polyglotBlock) : '(no polyglot impact)\n';
469
+ }
470
+ }
471
+ else if (format === 'json') {
472
+ body = asJson({ ...result, polyglot: polyglotBlock, resolution: fuzzyResolution }) + '\n';
473
+ }
474
+ else if (format === 'markdown') {
475
+ body = renderImpactMarkdown(result, renderOpts) + (polyglotBlock ? '\n' + renderPolyglotImpactMd(polyglotBlock) : '');
476
+ if (fuzzyResolution && explainResolution)
477
+ body = renderResolutionMd(fuzzyResolution) + '\n\n' + body;
478
+ }
479
+ else if (format === 'html') {
480
+ body = renderImpactHtml(result, renderOpts) + (polyglotBlock ? '<pre>' + escapeHtml(renderPolyglotImpactText(polyglotBlock)) + '</pre>' : '');
481
+ if (fuzzyResolution && explainResolution)
482
+ body = '<pre>' + escapeHtml(renderResolutionText(fuzzyResolution)) + '</pre>\n' + body;
483
+ }
484
+ else {
485
+ body = renderImpactText(result, renderOpts) + (polyglotBlock ? '\n' + renderPolyglotImpactText(polyglotBlock) : '');
486
+ if (fuzzyResolution && (explainResolution || fuzzyResolution.source !== FuzzyImpactSourceKind.ExactFile)) {
487
+ body = renderResolutionText(fuzzyResolution) + '\n' + body;
488
+ }
489
+ }
490
+ const output = flagString(args, 'output');
491
+ if (output) {
492
+ const abs = nodePath.isAbsolute(output) ? output : nodePath.resolve(cwd, output);
493
+ mkdirSync(nodePath.dirname(abs), { recursive: true });
494
+ writeFileSync(abs, body, 'utf8');
495
+ if (format === 'json')
496
+ process.stdout.write(asJson({ wrote: abs, bytes: body.length }) + '\n');
497
+ else
498
+ process.stdout.write(`Wrote ${abs}\n`);
499
+ }
500
+ else {
501
+ process.stdout.write(body);
502
+ }
503
+ // Optional --graph-format / --graph-output side-output.
504
+ const graphFormat = flagString(args, 'graph-format');
505
+ const graphOutput = flagString(args, 'graph-output');
506
+ if (graphFormat) {
507
+ if (graphFormat !== 'mermaid' && graphFormat !== 'dot') {
508
+ process.stderr.write(`Unknown --graph-format "${graphFormat}". Use mermaid|dot.\n`);
509
+ return 2;
510
+ }
511
+ const graph = renderImpactGraph(result, graphFormat);
512
+ if (graphOutput) {
513
+ const abs = nodePath.isAbsolute(graphOutput) ? graphOutput : nodePath.resolve(cwd, graphOutput);
514
+ mkdirSync(nodePath.dirname(abs), { recursive: true });
515
+ writeFileSync(abs, graph, 'utf8');
516
+ process.stdout.write(`Wrote ${abs}\n`);
517
+ if (flagBool(args, 'render-svg')) {
518
+ const { renderImpactGraphSvg } = await import('@shrkcrft/inspector');
519
+ const svgPath = abs.replace(/\.(mmd|dot)$/, '') + '.svg';
520
+ const result = await renderImpactGraphSvg({
521
+ sourceFile: abs,
522
+ svgFile: svgPath,
523
+ format: graphFormat,
524
+ });
525
+ if (result.rendered) {
526
+ process.stdout.write(`Rendered SVG → ${result.svgFile} (via ${result.renderer})\n`);
527
+ }
528
+ else {
529
+ process.stdout.write(`SVG render skipped: ${result.reason ?? 'unknown'}. Source is at ${abs}.\n`);
530
+ }
531
+ }
532
+ }
533
+ else {
534
+ process.stdout.write(graph);
535
+ }
536
+ }
537
+ return 0;
538
+ },
539
+ };
540
+ async function runImpactGraph(args) {
541
+ const cwd = resolveCwd(args);
542
+ const file = args.positional[0];
543
+ if (!file) {
544
+ process.stderr.write('Usage: shrk impact graph <impact-report.json> [--format mermaid|dot] [--output <path>]\n');
545
+ return 2;
546
+ }
547
+ const abs = nodePath.isAbsolute(file) ? file : nodePath.resolve(cwd, file);
548
+ if (!existsSync(abs)) {
549
+ process.stderr.write(`Impact report not found: ${abs}\n`);
550
+ return 1;
551
+ }
552
+ let impact;
553
+ try {
554
+ impact = JSON.parse(readFileSync(abs, 'utf8'));
555
+ }
556
+ catch (e) {
557
+ process.stderr.write(`Failed to parse impact report: ${e.message}\n`);
558
+ return 1;
559
+ }
560
+ const fmt = (flagString(args, 'format') ?? 'mermaid');
561
+ if (fmt !== 'mermaid' && fmt !== 'dot') {
562
+ process.stderr.write(`Unknown --format "${fmt}". Use mermaid|dot.\n`);
563
+ return 2;
564
+ }
565
+ const body = renderImpactGraph(impact, fmt);
566
+ const output = flagString(args, 'output');
567
+ if (output) {
568
+ const outAbs = nodePath.isAbsolute(output) ? output : nodePath.resolve(cwd, output);
569
+ mkdirSync(nodePath.dirname(outAbs), { recursive: true });
570
+ writeFileSync(outAbs, body, 'utf8');
571
+ process.stdout.write(`Wrote ${outAbs}\n`);
572
+ if (flagBool(args, 'render-svg')) {
573
+ const { renderImpactGraphSvg } = await import('@shrkcrft/inspector');
574
+ const svgPath = outAbs.replace(/\.(mmd|dot)$/, '') + '.svg';
575
+ const result = await renderImpactGraphSvg({
576
+ sourceFile: outAbs,
577
+ svgFile: svgPath,
578
+ format: fmt,
579
+ });
580
+ if (result.rendered) {
581
+ process.stdout.write(`Rendered SVG → ${result.svgFile} (via ${result.renderer})\n`);
582
+ }
583
+ else {
584
+ process.stdout.write(`SVG render skipped: ${result.reason ?? 'unknown'}. Source is at ${outAbs}.\n`);
585
+ }
586
+ }
587
+ return 0;
588
+ }
589
+ process.stdout.write(body);
590
+ return 0;
591
+ }
592
+ async function runImpactTests(args) {
593
+ const cwd = resolveCwd(args);
594
+ const inspection = await inspectSharkcraft({ cwd });
595
+ const task = args.positional.join(' ').trim() || undefined;
596
+ const explicitFiles = flagList(args, 'files');
597
+ const since = flagString(args, 'since');
598
+ const staged = flagBool(args, 'staged');
599
+ const bundleId = flagString(args, 'bundle');
600
+ const files = [...explicitFiles];
601
+ if (since)
602
+ files.push(...getChangedFiles(cwd, { since }));
603
+ if (staged)
604
+ files.push(...getChangedFiles(cwd, { staged: true }));
605
+ if (bundleId) {
606
+ const b = readFeatureBundle(cwd, bundleId);
607
+ if (!b) {
608
+ process.stderr.write(`No bundle "${bundleId}"\n`);
609
+ return 1;
610
+ }
611
+ for (const f of b.affectedFiles)
612
+ files.push(f);
613
+ for (const p of b.plans)
614
+ for (const t of p.expectedTargets)
615
+ files.push(t);
616
+ }
617
+ const uniqueFiles = [...new Set(files)];
618
+ const result = analyzeTestImpact(inspection, {
619
+ ...(task ? { task } : {}),
620
+ files: uniqueFiles,
621
+ });
622
+ if (flagBool(args, 'json')) {
623
+ process.stdout.write(asJson(result) + '\n');
624
+ return 0;
625
+ }
626
+ process.stdout.write(header(`Test impact (${uniqueFiles.length} files)`));
627
+ process.stdout.write(`Likely tests: ${result.likelyTestFiles.length}\n`);
628
+ for (const f of result.likelyTestFiles.slice(0, 10))
629
+ process.stdout.write(` + ${f}\n`);
630
+ process.stdout.write(`Missing tests: ${result.missingTestFiles.length}\n`);
631
+ for (const f of result.missingTestFiles.slice(0, 10))
632
+ process.stdout.write(` - ${f}\n`);
633
+ process.stdout.write(`Confidence: ${result.confidence}%\n`);
634
+ process.stdout.write('Minimal commands:\n');
635
+ for (const c of result.minimalCommands)
636
+ process.stdout.write(` $ ${c}\n`);
637
+ process.stdout.write('Full commands:\n');
638
+ for (const c of result.fullCommands)
639
+ process.stdout.write(` $ ${c}\n`);
640
+ if (result.packageCommands.length > 0) {
641
+ process.stdout.write('Per-package:\n');
642
+ for (const pc of result.packageCommands) {
643
+ process.stdout.write(` ${pc.packageName}:\n`);
644
+ for (const c of pc.commands)
645
+ process.stdout.write(` $ ${c}\n`);
646
+ }
647
+ }
648
+ return 0;
649
+ }
650
+ const POLYGLOT_EXT_LANG = {
651
+ '.java': 'java',
652
+ '.cs': 'csharp',
653
+ '.py': 'python',
654
+ '.go': 'go',
655
+ '.rs': 'rust',
656
+ };
657
+ async function buildPolyglotImpactBlock(cwd, files) {
658
+ const polyglotFiles = files.filter((f) => {
659
+ const ext = nodePath.extname(f).toLowerCase();
660
+ return POLYGLOT_EXT_LANG[ext] !== undefined;
661
+ });
662
+ if (polyglotFiles.length === 0)
663
+ return null;
664
+ const { buildLanguageCommandReport, buildPolyglotBoundaryReport, computePolyglotTestImpact, detectLanguageProfiles, scanPolyglotDependencies, LanguageId, } = await import('@shrkcrft/inspector');
665
+ const profile = detectLanguageProfiles(cwd);
666
+ const commandReport = buildLanguageCommandReport(cwd, profile);
667
+ const wantedLangs = new Set();
668
+ for (const f of polyglotFiles) {
669
+ const ext = nodePath.extname(f).toLowerCase();
670
+ const lang = POLYGLOT_EXT_LANG[ext];
671
+ if (lang)
672
+ wantedLangs.add(lang);
673
+ }
674
+ const langList = Array.from(wantedLangs);
675
+ const langIds = langList.map((l) => l);
676
+ const depGraph = scanPolyglotDependencies(cwd, { languages: langIds });
677
+ const boundary = buildPolyglotBoundaryReport({ projectRoot: cwd, languages: langIds, cached: profile, graph: depGraph });
678
+ const testImpact = computePolyglotTestImpact(cwd, polyglotFiles);
679
+ const byLanguage = {};
680
+ for (const lang of langList) {
681
+ const langFiles = polyglotFiles.filter((f) => POLYGLOT_EXT_LANG[nodePath.extname(f).toLowerCase()] === lang);
682
+ const cmds = commandReport.profiles.find((c) => c.language === lang);
683
+ const commands = [];
684
+ if (cmds) {
685
+ if (cmds.test)
686
+ commands.push(cmds.test);
687
+ if (cmds.typecheck)
688
+ commands.push(cmds.typecheck);
689
+ if (cmds.lint)
690
+ commands.push(cmds.lint);
691
+ }
692
+ const tests = testImpact.impacted
693
+ .filter((i) => i.language === lang)
694
+ .flatMap((i) => i.predictedTests);
695
+ const concerns = boundary.violations
696
+ .filter((v) => v.language === lang && langFiles.includes(v.fromFile))
697
+ .map((v) => ({ ruleId: v.ruleId, severity: v.severity, from: v.fromFile }));
698
+ const externalDeps = depGraph.perLanguage
699
+ .find((p) => p.language === lang)?.externalDeps ?? [];
700
+ byLanguage[lang] = {
701
+ files: langFiles,
702
+ likelyTests: Array.from(new Set(tests)).slice(0, 12),
703
+ verificationCommands: commands,
704
+ boundaryConcerns: concerns,
705
+ externalDeps: externalDeps.slice(0, 12),
706
+ };
707
+ }
708
+ return { byLanguage };
709
+ }
710
+ function renderPolyglotImpactText(b) {
711
+ const out = [];
712
+ out.push('--- Polyglot impact ---');
713
+ for (const [lang, info] of Object.entries(b.byLanguage)) {
714
+ out.push(`[${lang}]`);
715
+ if (info.files.length)
716
+ out.push(` files: ${info.files.length}`);
717
+ if (info.likelyTests.length)
718
+ out.push(` likely tests: ${info.likelyTests.join(', ')}`);
719
+ if (info.verificationCommands.length) {
720
+ out.push(` verify:`);
721
+ for (const c of info.verificationCommands)
722
+ out.push(` $ ${c}`);
723
+ }
724
+ if (info.boundaryConcerns.length) {
725
+ out.push(` boundary concerns:`);
726
+ for (const c of info.boundaryConcerns.slice(0, 6))
727
+ out.push(` [${c.severity}] ${c.ruleId} on ${c.from}`);
728
+ }
729
+ if (info.externalDeps.length)
730
+ out.push(` external deps: ${info.externalDeps.join(', ')}`);
731
+ }
732
+ return out.join('\n');
733
+ }
734
+ function renderPolyglotImpactMd(b) {
735
+ const out = [];
736
+ out.push('## Polyglot impact');
737
+ for (const [lang, info] of Object.entries(b.byLanguage)) {
738
+ out.push(`### \`${lang}\``);
739
+ if (info.files.length)
740
+ out.push(`- Files: ${info.files.length}`);
741
+ if (info.likelyTests.length)
742
+ out.push(`- Likely tests: ${info.likelyTests.map((t) => '`' + t + '`').join(', ')}`);
743
+ if (info.verificationCommands.length) {
744
+ out.push('- Verify:');
745
+ for (const c of info.verificationCommands)
746
+ out.push(` - \`${c}\``);
747
+ }
748
+ if (info.boundaryConcerns.length) {
749
+ out.push('- Boundary concerns:');
750
+ for (const c of info.boundaryConcerns)
751
+ out.push(` - **${c.severity}** \`${c.ruleId}\` on \`${c.from}\``);
752
+ }
753
+ if (info.externalDeps.length)
754
+ out.push(`- External deps: ${info.externalDeps.map((d) => '`' + d + '`').join(', ')}`);
755
+ }
756
+ return out.join('\n');
757
+ }
758
+ function escapeHtml(s) {
759
+ return s.replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
760
+ }
761
+ function renderResolutionText(r) {
762
+ const out = [];
763
+ out.push(`=== Fuzzy impact resolution ===`);
764
+ out.push(`Query: ${r.query}`);
765
+ out.push(`Source: ${r.source}`);
766
+ out.push(`Confidence: ${r.confidence}`);
767
+ if (r.resolvedId)
768
+ out.push(`Resolved: ${r.matchKind ?? ''} ${r.resolvedId}`);
769
+ if (r.files.length > 0) {
770
+ out.push(`Files:`);
771
+ for (const f of r.files)
772
+ out.push(` + ${f}`);
773
+ }
774
+ if (r.alternatives.length > 0) {
775
+ out.push(`Alternatives:`);
776
+ for (const a of r.alternatives.slice(0, 5))
777
+ out.push(` • ${a.kind.padEnd(12)} ${a.id} [${a.score.toFixed(0)}]`);
778
+ }
779
+ if (r.followUpCommands.length > 0) {
780
+ out.push(`Follow-up:`);
781
+ for (const c of r.followUpCommands)
782
+ out.push(` $ ${c}`);
783
+ }
784
+ for (const d of r.diagnostics)
785
+ out.push(` ! ${d}`);
786
+ return out.join('\n') + '\n';
787
+ }
788
+ function renderResolutionMd(r) {
789
+ const out = [];
790
+ out.push(`## Fuzzy impact resolution`);
791
+ out.push(`- Query: \`${r.query}\``);
792
+ out.push(`- Source: \`${r.source}\``);
793
+ out.push(`- Confidence: \`${r.confidence}\``);
794
+ if (r.resolvedId)
795
+ out.push(`- Resolved: \`${r.matchKind ?? ''}\` \`${r.resolvedId}\``);
796
+ if (r.files.length > 0) {
797
+ out.push(`- Files:`);
798
+ for (const f of r.files)
799
+ out.push(` - \`${f}\``);
800
+ }
801
+ if (r.alternatives.length > 0) {
802
+ out.push(`- Alternatives:`);
803
+ for (const a of r.alternatives.slice(0, 5))
804
+ out.push(` - \`${a.kind}\` \`${a.id}\` (${a.score.toFixed(0)})`);
805
+ }
806
+ if (r.followUpCommands.length > 0) {
807
+ out.push(`- Follow-up commands:`);
808
+ for (const c of r.followUpCommands)
809
+ out.push(` - \`${c}\``);
810
+ }
811
+ if (r.diagnostics.length > 0) {
812
+ out.push(`- Diagnostics:`);
813
+ for (const d of r.diagnostics)
814
+ out.push(` - ${d}`);
815
+ }
816
+ return out.join('\n');
817
+ }
818
+ // Sentinel — keep `QueryMatchKind` import alive for tooling. Used inside fuzzy-impact.ts.
819
+ void QueryMatchKind;