metaharness 0.1.0

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 (383) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +73 -0
  3. package/dist/analyze-repo.d.ts +74 -0
  4. package/dist/analyze-repo.d.ts.map +1 -0
  5. package/dist/analyze-repo.js +329 -0
  6. package/dist/analyze-repo.js.map +1 -0
  7. package/dist/audit-cmd.d.ts +6 -0
  8. package/dist/audit-cmd.d.ts.map +1 -0
  9. package/dist/audit-cmd.js +139 -0
  10. package/dist/audit-cmd.js.map +1 -0
  11. package/dist/bin.d.ts +3 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +8 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/compare-cmd.d.ts +56 -0
  16. package/dist/compare-cmd.d.ts.map +1 -0
  17. package/dist/compare-cmd.js +173 -0
  18. package/dist/compare-cmd.js.map +1 -0
  19. package/dist/completions-cmd.d.ts +6 -0
  20. package/dist/completions-cmd.d.ts.map +1 -0
  21. package/dist/completions-cmd.js +171 -0
  22. package/dist/completions-cmd.js.map +1 -0
  23. package/dist/diag.d.ts +76 -0
  24. package/dist/diag.d.ts.map +1 -0
  25. package/dist/diag.js +349 -0
  26. package/dist/diag.js.map +1 -0
  27. package/dist/eject.d.ts +33 -0
  28. package/dist/eject.d.ts.map +1 -0
  29. package/dist/eject.js +147 -0
  30. package/dist/eject.js.map +1 -0
  31. package/dist/export-config.d.ts +25 -0
  32. package/dist/export-config.d.ts.map +1 -0
  33. package/dist/export-config.js +134 -0
  34. package/dist/export-config.js.map +1 -0
  35. package/dist/external-template.d.ts +19 -0
  36. package/dist/external-template.d.ts.map +1 -0
  37. package/dist/external-template.js +37 -0
  38. package/dist/external-template.js.map +1 -0
  39. package/dist/federate.d.ts +37 -0
  40. package/dist/federate.d.ts.map +1 -0
  41. package/dist/federate.js +167 -0
  42. package/dist/federate.js.map +1 -0
  43. package/dist/genome-scorers.d.ts +33 -0
  44. package/dist/genome-scorers.d.ts.map +1 -0
  45. package/dist/genome-scorers.js +115 -0
  46. package/dist/genome-scorers.js.map +1 -0
  47. package/dist/genome.d.ts +28 -0
  48. package/dist/genome.d.ts.map +1 -0
  49. package/dist/genome.js +219 -0
  50. package/dist/genome.js.map +1 -0
  51. package/dist/harness-bin.d.ts +3 -0
  52. package/dist/harness-bin.d.ts.map +1 -0
  53. package/dist/harness-bin.js +17 -0
  54. package/dist/harness-bin.js.map +1 -0
  55. package/dist/index.d.ts +79 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +409 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/manifest.d.ts +55 -0
  60. package/dist/manifest.d.ts.map +1 -0
  61. package/dist/manifest.js +62 -0
  62. package/dist/manifest.js.map +1 -0
  63. package/dist/mcp-cmd.d.ts +19 -0
  64. package/dist/mcp-cmd.d.ts.map +1 -0
  65. package/dist/mcp-cmd.js +179 -0
  66. package/dist/mcp-cmd.js.map +1 -0
  67. package/dist/mcp-scan.d.ts +25 -0
  68. package/dist/mcp-scan.d.ts.map +1 -0
  69. package/dist/mcp-scan.js +132 -0
  70. package/dist/mcp-scan.js.map +1 -0
  71. package/dist/oia-manifest.d.ts +97 -0
  72. package/dist/oia-manifest.d.ts.map +1 -0
  73. package/dist/oia-manifest.js +241 -0
  74. package/dist/oia-manifest.js.map +1 -0
  75. package/dist/publish-cmd.d.ts +9 -0
  76. package/dist/publish-cmd.d.ts.map +1 -0
  77. package/dist/publish-cmd.js +56 -0
  78. package/dist/publish-cmd.js.map +1 -0
  79. package/dist/publish.d.ts +55 -0
  80. package/dist/publish.d.ts.map +1 -0
  81. package/dist/publish.js +104 -0
  82. package/dist/publish.js.map +1 -0
  83. package/dist/registry.d.ts +60 -0
  84. package/dist/registry.d.ts.map +1 -0
  85. package/dist/registry.js +67 -0
  86. package/dist/registry.js.map +1 -0
  87. package/dist/rename.d.ts +26 -0
  88. package/dist/rename.d.ts.map +1 -0
  89. package/dist/rename.js +86 -0
  90. package/dist/rename.js.map +1 -0
  91. package/dist/renderer.d.ts +39 -0
  92. package/dist/renderer.d.ts.map +1 -0
  93. package/dist/renderer.js +75 -0
  94. package/dist/renderer.js.map +1 -0
  95. package/dist/sbom-cmd.d.ts +6 -0
  96. package/dist/sbom-cmd.d.ts.map +1 -0
  97. package/dist/sbom-cmd.js +125 -0
  98. package/dist/sbom-cmd.js.map +1 -0
  99. package/dist/score.d.ts +32 -0
  100. package/dist/score.d.ts.map +1 -0
  101. package/dist/score.js +381 -0
  102. package/dist/score.js.map +1 -0
  103. package/dist/secrets.d.ts +27 -0
  104. package/dist/secrets.d.ts.map +1 -0
  105. package/dist/secrets.js +228 -0
  106. package/dist/secrets.js.map +1 -0
  107. package/dist/subcommands.d.ts +32 -0
  108. package/dist/subcommands.d.ts.map +1 -0
  109. package/dist/subcommands.js +335 -0
  110. package/dist/subcommands.js.map +1 -0
  111. package/dist/tarball.d.ts +14 -0
  112. package/dist/tarball.d.ts.map +1 -0
  113. package/dist/tarball.js +121 -0
  114. package/dist/tarball.js.map +1 -0
  115. package/dist/threat-model.d.ts +32 -0
  116. package/dist/threat-model.d.ts.map +1 -0
  117. package/dist/threat-model.js +236 -0
  118. package/dist/threat-model.js.map +1 -0
  119. package/dist/upgrade-cmd.d.ts +9 -0
  120. package/dist/upgrade-cmd.d.ts.map +1 -0
  121. package/dist/upgrade-cmd.js +90 -0
  122. package/dist/upgrade-cmd.js.map +1 -0
  123. package/dist/upgrade.d.ts +37 -0
  124. package/dist/upgrade.d.ts.map +1 -0
  125. package/dist/upgrade.js +124 -0
  126. package/dist/upgrade.js.map +1 -0
  127. package/dist/validate.d.ts +7 -0
  128. package/dist/validate.d.ts.map +1 -0
  129. package/dist/validate.js +240 -0
  130. package/dist/validate.js.map +1 -0
  131. package/dist/walker.d.ts +24 -0
  132. package/dist/walker.d.ts.map +1 -0
  133. package/dist/walker.js +76 -0
  134. package/dist/walker.js.map +1 -0
  135. package/dist/witness-client.d.ts +40 -0
  136. package/dist/witness-client.d.ts.map +1 -0
  137. package/dist/witness-client.js +99 -0
  138. package/dist/witness-client.js.map +1 -0
  139. package/dist/wizard.d.ts +37 -0
  140. package/dist/wizard.d.ts.map +1 -0
  141. package/dist/wizard.js +137 -0
  142. package/dist/wizard.js.map +1 -0
  143. package/dist/writer.d.ts +13 -0
  144. package/dist/writer.d.ts.map +1 -0
  145. package/dist/writer.js +43 -0
  146. package/dist/writer.js.map +1 -0
  147. package/package.json +114 -0
  148. package/templates/catalog.def.mjs +542 -0
  149. package/templates/catalog.json +1274 -0
  150. package/templates/minimal/.claude/settings.json.tmpl +18 -0
  151. package/templates/minimal/CLAUDE.md.tmpl +23 -0
  152. package/templates/minimal/README.md.tmpl +20 -0
  153. package/templates/minimal/manifest.json +16 -0
  154. package/templates/minimal/package.json.tmpl +30 -0
  155. package/templates/minimal/src/init.ts.tmpl +21 -0
  156. package/templates/vertical_advertising/.claude/commands/doctor.md.tmpl +12 -0
  157. package/templates/vertical_advertising/.claude/settings.json.tmpl +33 -0
  158. package/templates/vertical_advertising/.claude/skills/media-plan/SKILL.md.tmpl +13 -0
  159. package/templates/vertical_advertising/CLAUDE.md.tmpl +30 -0
  160. package/templates/vertical_advertising/README.md.tmpl +29 -0
  161. package/templates/vertical_advertising/manifest.json +81 -0
  162. package/templates/vertical_advertising/package.json.tmpl +30 -0
  163. package/templates/vertical_advertising/src/agents/copywriter.ts.tmpl +7 -0
  164. package/templates/vertical_advertising/src/agents/media-planner.ts.tmpl +7 -0
  165. package/templates/vertical_advertising/src/agents/performance-analyst.ts.tmpl +7 -0
  166. package/templates/vertical_advertising/src/init.ts.tmpl +21 -0
  167. package/templates/vertical_agentics/.claude/commands/doctor.md.tmpl +12 -0
  168. package/templates/vertical_agentics/.claude/settings.json.tmpl +33 -0
  169. package/templates/vertical_agentics/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  170. package/templates/vertical_agentics/.claude/skills/run-swarm/SKILL.md.tmpl +14 -0
  171. package/templates/vertical_agentics/CLAUDE.md.tmpl +32 -0
  172. package/templates/vertical_agentics/README.md.tmpl +30 -0
  173. package/templates/vertical_agentics/manifest.json +91 -0
  174. package/templates/vertical_agentics/package.json.tmpl +30 -0
  175. package/templates/vertical_agentics/src/agents/critic.ts.tmpl +7 -0
  176. package/templates/vertical_agentics/src/agents/orchestrator.ts.tmpl +7 -0
  177. package/templates/vertical_agentics/src/agents/planner.ts.tmpl +7 -0
  178. package/templates/vertical_agentics/src/agents/worker.ts.tmpl +7 -0
  179. package/templates/vertical_agentics/src/init.ts.tmpl +21 -0
  180. package/templates/vertical_ai/.claude/commands/doctor.md.tmpl +12 -0
  181. package/templates/vertical_ai/.claude/settings.json.tmpl +35 -0
  182. package/templates/vertical_ai/.claude/skills/eval-report/SKILL.md.tmpl +13 -0
  183. package/templates/vertical_ai/CLAUDE.md.tmpl +31 -0
  184. package/templates/vertical_ai/README.md.tmpl +30 -0
  185. package/templates/vertical_ai/manifest.json +86 -0
  186. package/templates/vertical_ai/package.json.tmpl +30 -0
  187. package/templates/vertical_ai/src/agents/data-curator.ts.tmpl +7 -0
  188. package/templates/vertical_ai/src/agents/deployer.ts.tmpl +7 -0
  189. package/templates/vertical_ai/src/agents/evaluator.ts.tmpl +7 -0
  190. package/templates/vertical_ai/src/agents/trainer.ts.tmpl +7 -0
  191. package/templates/vertical_ai/src/init.ts.tmpl +21 -0
  192. package/templates/vertical_business/.claude/commands/doctor.md.tmpl +12 -0
  193. package/templates/vertical_business/.claude/settings.json.tmpl +33 -0
  194. package/templates/vertical_business/.claude/skills/quarterly-plan/SKILL.md.tmpl +13 -0
  195. package/templates/vertical_business/CLAUDE.md.tmpl +30 -0
  196. package/templates/vertical_business/README.md.tmpl +29 -0
  197. package/templates/vertical_business/manifest.json +81 -0
  198. package/templates/vertical_business/package.json.tmpl +30 -0
  199. package/templates/vertical_business/src/agents/analyst.ts.tmpl +7 -0
  200. package/templates/vertical_business/src/agents/ops-coordinator.ts.tmpl +7 -0
  201. package/templates/vertical_business/src/agents/strategist.ts.tmpl +7 -0
  202. package/templates/vertical_business/src/init.ts.tmpl +21 -0
  203. package/templates/vertical_coding/.claude/commands/doctor.md.tmpl +12 -0
  204. package/templates/vertical_coding/.claude/commands/review-diff.md.tmpl +10 -0
  205. package/templates/vertical_coding/.claude/settings.json.tmpl +40 -0
  206. package/templates/vertical_coding/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
  207. package/templates/vertical_coding/CLAUDE.md.tmpl +32 -0
  208. package/templates/vertical_coding/README.md.tmpl +30 -0
  209. package/templates/vertical_coding/manifest.json +91 -0
  210. package/templates/vertical_coding/package.json.tmpl +30 -0
  211. package/templates/vertical_coding/src/agents/architect.ts.tmpl +7 -0
  212. package/templates/vertical_coding/src/agents/implementer.ts.tmpl +7 -0
  213. package/templates/vertical_coding/src/agents/reviewer.ts.tmpl +7 -0
  214. package/templates/vertical_coding/src/agents/test-writer.ts.tmpl +7 -0
  215. package/templates/vertical_coding/src/init.ts.tmpl +21 -0
  216. package/templates/vertical_crm/.claude/commands/doctor.md.tmpl +12 -0
  217. package/templates/vertical_crm/.claude/settings.json.tmpl +33 -0
  218. package/templates/vertical_crm/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  219. package/templates/vertical_crm/CLAUDE.md.tmpl +30 -0
  220. package/templates/vertical_crm/README.md.tmpl +29 -0
  221. package/templates/vertical_crm/manifest.json +81 -0
  222. package/templates/vertical_crm/package.json.tmpl +30 -0
  223. package/templates/vertical_crm/src/agents/account-manager.ts.tmpl +7 -0
  224. package/templates/vertical_crm/src/agents/churn-watcher.ts.tmpl +7 -0
  225. package/templates/vertical_crm/src/agents/lead-qualifier.ts.tmpl +7 -0
  226. package/templates/vertical_crm/src/init.ts.tmpl +21 -0
  227. package/templates/vertical_devops/.claude/settings.json.tmpl +36 -0
  228. package/templates/vertical_devops/CLAUDE.md.tmpl +34 -0
  229. package/templates/vertical_devops/README.md.tmpl +27 -0
  230. package/templates/vertical_devops/manifest.json +22 -0
  231. package/templates/vertical_devops/package.json.tmpl +26 -0
  232. package/templates/vertical_devops/runbooks/README.md.tmpl +32 -0
  233. package/templates/vertical_devops/src/agents/escalator.ts.tmpl +19 -0
  234. package/templates/vertical_devops/src/agents/postmortem.ts.tmpl +23 -0
  235. package/templates/vertical_devops/src/agents/responder.ts.tmpl +14 -0
  236. package/templates/vertical_devops/src/agents/runbook-runner.ts.tmpl +17 -0
  237. package/templates/vertical_devops/src/init.ts.tmpl +23 -0
  238. package/templates/vertical_education/.claude/commands/doctor.md.tmpl +12 -0
  239. package/templates/vertical_education/.claude/commands/mastery-report.md.tmpl +12 -0
  240. package/templates/vertical_education/.claude/settings.json.tmpl +45 -0
  241. package/templates/vertical_education/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  242. package/templates/vertical_education/.claude/skills/teach-next/SKILL.md.tmpl +16 -0
  243. package/templates/vertical_education/CLAUDE.md.tmpl +33 -0
  244. package/templates/vertical_education/README.md.tmpl +30 -0
  245. package/templates/vertical_education/manifest.json +96 -0
  246. package/templates/vertical_education/package.json.tmpl +30 -0
  247. package/templates/vertical_education/src/agents/explainer.ts.tmpl +7 -0
  248. package/templates/vertical_education/src/agents/grader.ts.tmpl +7 -0
  249. package/templates/vertical_education/src/agents/quiz-master.ts.tmpl +7 -0
  250. package/templates/vertical_education/src/agents/tutor.ts.tmpl +7 -0
  251. package/templates/vertical_education/src/init.ts.tmpl +21 -0
  252. package/templates/vertical_exotic/.claude/commands/doctor.md.tmpl +12 -0
  253. package/templates/vertical_exotic/.claude/settings.json.tmpl +44 -0
  254. package/templates/vertical_exotic/.claude/skills/evolve/SKILL.md.tmpl +14 -0
  255. package/templates/vertical_exotic/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  256. package/templates/vertical_exotic/CLAUDE.md.tmpl +31 -0
  257. package/templates/vertical_exotic/README.md.tmpl +29 -0
  258. package/templates/vertical_exotic/manifest.json +86 -0
  259. package/templates/vertical_exotic/package.json.tmpl +30 -0
  260. package/templates/vertical_exotic/src/agents/experimenter.ts.tmpl +7 -0
  261. package/templates/vertical_exotic/src/agents/federator.ts.tmpl +7 -0
  262. package/templates/vertical_exotic/src/agents/hypothesizer.ts.tmpl +7 -0
  263. package/templates/vertical_exotic/src/init.ts.tmpl +21 -0
  264. package/templates/vertical_gaming/.claude/commands/design-doc-diff.md.tmpl +13 -0
  265. package/templates/vertical_gaming/.claude/commands/doctor.md.tmpl +12 -0
  266. package/templates/vertical_gaming/.claude/settings.json.tmpl +45 -0
  267. package/templates/vertical_gaming/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  268. package/templates/vertical_gaming/.claude/skills/playtest-recap/SKILL.md.tmpl +16 -0
  269. package/templates/vertical_gaming/CLAUDE.md.tmpl +33 -0
  270. package/templates/vertical_gaming/README.md.tmpl +30 -0
  271. package/templates/vertical_gaming/manifest.json +96 -0
  272. package/templates/vertical_gaming/package.json.tmpl +30 -0
  273. package/templates/vertical_gaming/src/agents/balance-critic.ts.tmpl +7 -0
  274. package/templates/vertical_gaming/src/agents/economy-modeler.ts.tmpl +7 -0
  275. package/templates/vertical_gaming/src/agents/narrative-keeper.ts.tmpl +7 -0
  276. package/templates/vertical_gaming/src/agents/playtest-reader.ts.tmpl +7 -0
  277. package/templates/vertical_gaming/src/init.ts.tmpl +21 -0
  278. package/templates/vertical_health/.claude/commands/doctor.md.tmpl +12 -0
  279. package/templates/vertical_health/.claude/settings.json.tmpl +33 -0
  280. package/templates/vertical_health/.claude/skills/wellness-intake/SKILL.md.tmpl +15 -0
  281. package/templates/vertical_health/CLAUDE.md.tmpl +30 -0
  282. package/templates/vertical_health/README.md.tmpl +29 -0
  283. package/templates/vertical_health/manifest.json +81 -0
  284. package/templates/vertical_health/package.json.tmpl +30 -0
  285. package/templates/vertical_health/src/agents/care-coordinator.ts.tmpl +7 -0
  286. package/templates/vertical_health/src/agents/intake.ts.tmpl +7 -0
  287. package/templates/vertical_health/src/agents/triage.ts.tmpl +7 -0
  288. package/templates/vertical_health/src/init.ts.tmpl +21 -0
  289. package/templates/vertical_legal/.claude/settings.json.tmpl +10 -0
  290. package/templates/vertical_legal/CLAUDE.md.tmpl +24 -0
  291. package/templates/vertical_legal/README.md.tmpl +21 -0
  292. package/templates/vertical_legal/manifest.json +20 -0
  293. package/templates/vertical_legal/package.json.tmpl +13 -0
  294. package/templates/vertical_legal/src/agents/citation-checker.ts.tmpl +7 -0
  295. package/templates/vertical_legal/src/agents/redline.ts.tmpl +7 -0
  296. package/templates/vertical_legal/src/agents/risk-rater.ts.tmpl +8 -0
  297. package/templates/vertical_legal/src/init.ts.tmpl +13 -0
  298. package/templates/vertical_marketing/.claude/commands/doctor.md.tmpl +12 -0
  299. package/templates/vertical_marketing/.claude/settings.json.tmpl +33 -0
  300. package/templates/vertical_marketing/.claude/skills/campaign-brief/SKILL.md.tmpl +13 -0
  301. package/templates/vertical_marketing/CLAUDE.md.tmpl +30 -0
  302. package/templates/vertical_marketing/README.md.tmpl +29 -0
  303. package/templates/vertical_marketing/manifest.json +81 -0
  304. package/templates/vertical_marketing/package.json.tmpl +30 -0
  305. package/templates/vertical_marketing/src/agents/content-creator.ts.tmpl +7 -0
  306. package/templates/vertical_marketing/src/agents/seo-analyst.ts.tmpl +7 -0
  307. package/templates/vertical_marketing/src/agents/strategist.ts.tmpl +7 -0
  308. package/templates/vertical_marketing/src/init.ts.tmpl +21 -0
  309. package/templates/vertical_repo-maintainer/.claude/commands/doctor.md.tmpl +12 -0
  310. package/templates/vertical_repo-maintainer/.claude/commands/release-check.md.tmpl +13 -0
  311. package/templates/vertical_repo-maintainer/.claude/commands/repo-triage.md.tmpl +16 -0
  312. package/templates/vertical_repo-maintainer/.claude/settings.json.tmpl +44 -0
  313. package/templates/vertical_repo-maintainer/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  314. package/templates/vertical_repo-maintainer/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
  315. package/templates/vertical_repo-maintainer/CLAUDE.md.tmpl +34 -0
  316. package/templates/vertical_repo-maintainer/README.md.tmpl +30 -0
  317. package/templates/vertical_repo-maintainer/manifest.json +101 -0
  318. package/templates/vertical_repo-maintainer/package.json.tmpl +30 -0
  319. package/templates/vertical_repo-maintainer/src/agents/benchmarker.ts.tmpl +7 -0
  320. package/templates/vertical_repo-maintainer/src/agents/maintainer.ts.tmpl +7 -0
  321. package/templates/vertical_repo-maintainer/src/agents/release.ts.tmpl +7 -0
  322. package/templates/vertical_repo-maintainer/src/agents/security.ts.tmpl +7 -0
  323. package/templates/vertical_repo-maintainer/src/init.ts.tmpl +21 -0
  324. package/templates/vertical_research/.claude/settings.json.tmpl +9 -0
  325. package/templates/vertical_research/CLAUDE.md.tmpl +33 -0
  326. package/templates/vertical_research/README.md.tmpl +17 -0
  327. package/templates/vertical_research/manifest.json +23 -0
  328. package/templates/vertical_research/package.json.tmpl +13 -0
  329. package/templates/vertical_research/src/agents/citer.ts.tmpl +8 -0
  330. package/templates/vertical_research/src/agents/fact-checker.ts.tmpl +8 -0
  331. package/templates/vertical_research/src/agents/scout.ts.tmpl +7 -0
  332. package/templates/vertical_research/src/agents/source-grader.ts.tmpl +10 -0
  333. package/templates/vertical_research/src/agents/synthesizer.ts.tmpl +8 -0
  334. package/templates/vertical_research/src/agents/web-searcher.ts.tmpl +6 -0
  335. package/templates/vertical_research/src/init.ts.tmpl +13 -0
  336. package/templates/vertical_ruview/.claude/commands/doctor.md.tmpl +12 -0
  337. package/templates/vertical_ruview/.claude/settings.json.tmpl +33 -0
  338. package/templates/vertical_ruview/.claude/skills/index-and-ask/SKILL.md.tmpl +15 -0
  339. package/templates/vertical_ruview/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  340. package/templates/vertical_ruview/CLAUDE.md.tmpl +31 -0
  341. package/templates/vertical_ruview/README.md.tmpl +29 -0
  342. package/templates/vertical_ruview/manifest.json +86 -0
  343. package/templates/vertical_ruview/package.json.tmpl +30 -0
  344. package/templates/vertical_ruview/src/agents/indexer.ts.tmpl +7 -0
  345. package/templates/vertical_ruview/src/agents/retriever.ts.tmpl +7 -0
  346. package/templates/vertical_ruview/src/agents/reviewer.ts.tmpl +7 -0
  347. package/templates/vertical_ruview/src/init.ts.tmpl +21 -0
  348. package/templates/vertical_sales/.claude/commands/doctor.md.tmpl +12 -0
  349. package/templates/vertical_sales/.claude/commands/pipeline-report.md.tmpl +13 -0
  350. package/templates/vertical_sales/.claude/settings.json.tmpl +45 -0
  351. package/templates/vertical_sales/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  352. package/templates/vertical_sales/.claude/skills/qualify-lead/SKILL.md.tmpl +15 -0
  353. package/templates/vertical_sales/CLAUDE.md.tmpl +33 -0
  354. package/templates/vertical_sales/README.md.tmpl +30 -0
  355. package/templates/vertical_sales/manifest.json +96 -0
  356. package/templates/vertical_sales/package.json.tmpl +30 -0
  357. package/templates/vertical_sales/src/agents/closer.ts.tmpl +7 -0
  358. package/templates/vertical_sales/src/agents/demo-coach.ts.tmpl +7 -0
  359. package/templates/vertical_sales/src/agents/prospector.ts.tmpl +7 -0
  360. package/templates/vertical_sales/src/agents/qualifier.ts.tmpl +7 -0
  361. package/templates/vertical_sales/src/init.ts.tmpl +21 -0
  362. package/templates/vertical_support/.claude/settings.json.tmpl +25 -0
  363. package/templates/vertical_support/CLAUDE.md.tmpl +34 -0
  364. package/templates/vertical_support/README.md.tmpl +16 -0
  365. package/templates/vertical_support/kb/README.md.tmpl +23 -0
  366. package/templates/vertical_support/manifest.json +22 -0
  367. package/templates/vertical_support/package.json.tmpl +24 -0
  368. package/templates/vertical_support/src/agents/escalator.ts.tmpl +6 -0
  369. package/templates/vertical_support/src/agents/kb-searcher.ts.tmpl +6 -0
  370. package/templates/vertical_support/src/agents/responder.ts.tmpl +7 -0
  371. package/templates/vertical_support/src/agents/triager.ts.tmpl +6 -0
  372. package/templates/vertical_support/src/init.ts.tmpl +16 -0
  373. package/templates/vertical_trading/.claude/settings.json.tmpl +20 -0
  374. package/templates/vertical_trading/CLAUDE.md.tmpl +24 -0
  375. package/templates/vertical_trading/README.md.tmpl +17 -0
  376. package/templates/vertical_trading/manifest.json +22 -0
  377. package/templates/vertical_trading/package.json.tmpl +13 -0
  378. package/templates/vertical_trading/src/agents/executor.ts.tmpl +8 -0
  379. package/templates/vertical_trading/src/agents/market-watcher.ts.tmpl +7 -0
  380. package/templates/vertical_trading/src/agents/postmortem.ts.tmpl +8 -0
  381. package/templates/vertical_trading/src/agents/risk-checker.ts.tmpl +11 -0
  382. package/templates/vertical_trading/src/agents/signal-gen.ts.tmpl +8 -0
  383. package/templates/vertical_trading/src/init.ts.tmpl +20 -0
@@ -0,0 +1,139 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness audit [path] [--level=high|critical|moderate]` CLI subcommand.
4
+ //
5
+ // Wraps `npm audit --omit=dev --audit-level=<level>` against a harness's
6
+ // package-lock.json + reports the per-severity advisory count. Like
7
+ // scripts/audit-deps.mjs but per-harness.
8
+ import { execFile as execFileCb } from 'node:child_process';
9
+ import { promisify } from 'node:util';
10
+ import { existsSync } from 'node:fs';
11
+ import { join, resolve } from 'node:path';
12
+ const execFile = promisify(execFileCb);
13
+ const LEVELS = ['info', 'low', 'moderate', 'high', 'critical'];
14
+ export async function auditCmd(args) {
15
+ const positional = args.filter(a => !a.startsWith('--'));
16
+ const dir = resolve(positional[0] ?? process.cwd());
17
+ const level = args.find(a => a.startsWith('--level='))?.slice('--level='.length) ?? 'high';
18
+ const includeDev = args.includes('--include-dev');
19
+ // iter 102: --bundle emits the full audit JSON (npm audit raw output +
20
+ // harness metadata) so users can paste it into a security review or
21
+ // attach to a GitHub issue. Same pattern as iter-90 diag --bundle.
22
+ const bundle = args.includes('--bundle');
23
+ const lines = [`harness audit — ${dir} (level=${level})`];
24
+ if (!LEVELS.includes(level)) {
25
+ if (bundle) {
26
+ return {
27
+ code: 2,
28
+ lines: [JSON.stringify({ schema: 1, error: 'unknown-level', level, validLevels: LEVELS }, null, 2)],
29
+ };
30
+ }
31
+ lines.push(` unknown --level=${level} (use one of ${LEVELS.join(', ')})`);
32
+ return { code: 2, lines };
33
+ }
34
+ const pkgPath = join(dir, 'package.json');
35
+ if (!existsSync(pkgPath)) {
36
+ if (bundle) {
37
+ return {
38
+ code: 1,
39
+ lines: [JSON.stringify({ schema: 1, error: 'no-package-json', dir }, null, 2)],
40
+ };
41
+ }
42
+ lines.push(` no package.json at ${dir}`);
43
+ return { code: 1, lines };
44
+ }
45
+ const lockPath = join(dir, 'package-lock.json');
46
+ if (!existsSync(lockPath)) {
47
+ if (bundle) {
48
+ return {
49
+ code: 1,
50
+ lines: [JSON.stringify({ schema: 1, error: 'no-lockfile', dir }, null, 2)],
51
+ };
52
+ }
53
+ lines.push(` no package-lock.json at ${dir} — run \`npm install --package-lock-only\` first`);
54
+ return { code: 1, lines };
55
+ }
56
+ const npmArgs = ['audit', '--json', `--audit-level=${level}`];
57
+ if (!includeDev)
58
+ npmArgs.push('--omit=dev');
59
+ const npmCmd = process.platform === 'win32' ? 'cmd.exe' : 'npm';
60
+ const finalArgs = process.platform === 'win32'
61
+ ? ['/d', '/s', '/c', 'npm', ...npmArgs]
62
+ : npmArgs;
63
+ let stdout = '', stderr = '', exitCode = 0;
64
+ try {
65
+ const r = await execFile(npmCmd, finalArgs, {
66
+ cwd: dir, maxBuffer: 1024 * 1024 * 16, windowsHide: true,
67
+ });
68
+ stdout = r.stdout;
69
+ stderr = r.stderr;
70
+ }
71
+ catch (e) {
72
+ stdout = e.stdout ?? '';
73
+ stderr = e.stderr ?? '';
74
+ exitCode = e.code ?? 1;
75
+ }
76
+ let parsed = null;
77
+ try {
78
+ parsed = JSON.parse(stdout);
79
+ }
80
+ catch { /* */ }
81
+ if (!parsed) {
82
+ if (exitCode === 0) {
83
+ if (bundle) {
84
+ return {
85
+ code: 0,
86
+ lines: [JSON.stringify({
87
+ schema: 1, generatedAt: new Date().toISOString(),
88
+ harnessDir: dir, level, total: 0, counts: {},
89
+ offenders: [], failCount: 0, exitCode: 0,
90
+ }, null, 2)],
91
+ };
92
+ }
93
+ lines.push(' no advisories at the configured level');
94
+ return { code: 0, lines };
95
+ }
96
+ if (bundle) {
97
+ return {
98
+ code: 1,
99
+ lines: [JSON.stringify({ schema: 1, error: 'non-json-audit-output', exitCode, stderr }, null, 2)],
100
+ };
101
+ }
102
+ lines.push(` npm audit produced non-JSON output (exit ${exitCode})`);
103
+ return { code: 1, lines };
104
+ }
105
+ const counts = parsed.metadata?.vulnerabilities ?? {};
106
+ const levelIdx = LEVELS.indexOf(level);
107
+ const failCount = LEVELS.slice(levelIdx).reduce((s, l) => s + (counts[l] ?? 0), 0);
108
+ const total = Object.values(counts).reduce((s, n) => s + (n ?? 0), 0);
109
+ const offenders = Object.entries(parsed.vulnerabilities ?? {})
110
+ .filter(([, v]) => LEVELS.indexOf(v.severity) >= levelIdx)
111
+ .map(([name, v]) => ({ name, severity: v.severity, advisory: v.via?.[0]?.title ?? null }));
112
+ const code = failCount === 0 ? 0 : 1;
113
+ if (bundle) {
114
+ return {
115
+ code,
116
+ lines: [JSON.stringify({
117
+ schema: 1,
118
+ generatedAt: new Date().toISOString(),
119
+ harnessDir: dir,
120
+ level,
121
+ total,
122
+ counts,
123
+ offenders,
124
+ failCount,
125
+ exitCode: code,
126
+ }, null, 2)],
127
+ };
128
+ }
129
+ lines.push(` total advisories: ${total}`);
130
+ lines.push(` per severity: ${LEVELS.map(l => `${l}=${counts[l] ?? 0}`).join(', ')}`);
131
+ if (failCount === 0) {
132
+ lines.push(` PASS: 0 advisories at ${level}+`);
133
+ return { code: 0, lines };
134
+ }
135
+ const offenderText = offenders.slice(0, 5).map(o => `${o.name}(${o.severity})`);
136
+ lines.push(` FAIL: ${failCount} advisories at ${level}+: ${offenderText.join(', ')}`);
137
+ return { code: 1, lines };
138
+ }
139
+ //# sourceMappingURL=audit-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-cmd.js","sourceRoot":"","sources":["../src/audit-cmd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,oEAAoE;AACpE,0CAA0C;AAE1C,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAIvC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAClD,uEAAuE;IACvE,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAa,CAAC,mBAAmB,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC;IAEpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAY,CAAC,EAAE,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aACpG,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aAC/E,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aAC3E,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,6BAA6B,GAAG,kDAAkD,CAAC,CAAC;QAC/F,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,KAAK,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5C,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC;IAEZ,IAAI,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE;YAC1C,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI;SACzD,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,MAAM,GAAQ,IAAI,CAAC;IACvB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;4BACrB,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAChD,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;4BAC5C,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;yBACzC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;iBACb,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aAClG,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,8CAA8C,QAAQ,GAAG,CAAC,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAY,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAS,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAM,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;SAChE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAE,CAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;SAClE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAG,CAAS,CAAC,QAAQ,EAAE,QAAQ,EAAG,CAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/G,MAAM,IAAI,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;oBACrB,MAAM,EAAE,CAAC;oBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACrC,UAAU,EAAE,GAAG;oBACf,KAAK;oBACL,KAAK;oBACL,MAAM;oBACN,SAAS;oBACT,SAAS;oBACT,QAAQ,EAAE,IAAI;iBACf,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;SACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,kBAAkB,KAAK,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: MIT
3
+ import { main } from './index.js';
4
+ main(process.argv.slice(2)).catch((err) => {
5
+ console.error(err instanceof Error ? err.message : String(err));
6
+ process.exit(1);
7
+ });
8
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,+BAA+B;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACjD,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ export type SubcommandResult = {
2
+ code: number;
3
+ lines: string[];
4
+ };
5
+ interface Manifest {
6
+ schema?: number;
7
+ generator?: string;
8
+ template?: string;
9
+ template_version?: string;
10
+ hosts?: string[];
11
+ files?: Record<string, string>;
12
+ meta?: {
13
+ surface?: string;
14
+ kernel_version?: string;
15
+ };
16
+ }
17
+ interface CompareReport {
18
+ schema: 1;
19
+ generatedAt: string;
20
+ a: {
21
+ dir: string;
22
+ manifest: Manifest | undefined;
23
+ };
24
+ b: {
25
+ dir: string;
26
+ manifest: Manifest | undefined;
27
+ };
28
+ meta: {
29
+ sameSurface: boolean;
30
+ sameKernel: boolean;
31
+ sameGenerator: boolean;
32
+ surfaceA: string | undefined;
33
+ surfaceB: string | undefined;
34
+ kernelA: string | undefined;
35
+ kernelB: string | undefined;
36
+ generatorA: string | undefined;
37
+ generatorB: string | undefined;
38
+ };
39
+ hosts: {
40
+ sameHosts: boolean;
41
+ addedInB: string[];
42
+ removedInB: string[];
43
+ };
44
+ files: {
45
+ sameFiles: boolean;
46
+ addedInB: string[];
47
+ removedInB: string[];
48
+ changed: string[];
49
+ };
50
+ identical: boolean;
51
+ exitCode: number;
52
+ }
53
+ export declare function buildCompareReport(dirA: string, dirB: string): Promise<CompareReport>;
54
+ export declare function compareCmd(args: string[]): Promise<SubcommandResult>;
55
+ export {};
56
+ //# sourceMappingURL=compare-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-cmd.d.ts","sourceRoot":"","sources":["../src/compare-cmd.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE,UAAU,QAAQ;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC;IACnD,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC;IACnD,IAAI,EAAE;QACJ,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;QACpB,aAAa,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;QAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqBD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAuD3F;AA0CD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsC1E"}
@@ -0,0 +1,173 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness compare <a> <b>` — diff two harness manifests + per-file
4
+ // fingerprints + meta blocks.
5
+ //
6
+ // Use case: "is my fork drifting from upstream?" or "does my prod copy
7
+ // match my staging copy?". The manifest already records per-file
8
+ // sha256 (iter 56 + earlier), so a comparison reduces to:
9
+ //
10
+ // 1. meta block diff (surface? kernel_version? generator?)
11
+ // 2. host list diff (does the fork target the same hosts?)
12
+ // 3. per-file fingerprint diff (added/removed/changed)
13
+ //
14
+ // Bundle-shaped output (--bundle) per ADR-031.
15
+ import { readFile } from 'node:fs/promises';
16
+ import { existsSync } from 'node:fs';
17
+ import { join, resolve } from 'node:path';
18
+ async function readManifest(dir) {
19
+ const path = join(dir, '.harness', 'manifest.json');
20
+ if (!existsSync(path))
21
+ return undefined;
22
+ try {
23
+ return JSON.parse(await readFile(path, 'utf-8'));
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ }
29
+ function diffSets(a, b) {
30
+ const aSet = new Set(a);
31
+ const bSet = new Set(b);
32
+ return {
33
+ addedInB: b.filter(x => !aSet.has(x)).sort(),
34
+ removedInB: a.filter(x => !bSet.has(x)).sort(),
35
+ };
36
+ }
37
+ export async function buildCompareReport(dirA, dirB) {
38
+ const mA = await readManifest(dirA);
39
+ const mB = await readManifest(dirB);
40
+ const surfaceA = mA?.meta?.surface;
41
+ const surfaceB = mB?.meta?.surface;
42
+ const kernelA = mA?.meta?.kernel_version;
43
+ const kernelB = mB?.meta?.kernel_version;
44
+ const generatorA = mA?.generator;
45
+ const generatorB = mB?.generator;
46
+ const hostsDiff = diffSets(mA?.hosts ?? [], mB?.hosts ?? []);
47
+ const filesA = mA?.files ?? {};
48
+ const filesB = mB?.files ?? {};
49
+ const filesDiff = diffSets(Object.keys(filesA), Object.keys(filesB));
50
+ const changed = Object.keys(filesA)
51
+ .filter(p => p in filesB && filesA[p] !== filesB[p])
52
+ .sort();
53
+ const identical = surfaceA === surfaceB &&
54
+ kernelA === kernelB &&
55
+ generatorA === generatorB &&
56
+ hostsDiff.addedInB.length === 0 &&
57
+ hostsDiff.removedInB.length === 0 &&
58
+ filesDiff.addedInB.length === 0 &&
59
+ filesDiff.removedInB.length === 0 &&
60
+ changed.length === 0;
61
+ return {
62
+ schema: 1,
63
+ generatedAt: new Date().toISOString(),
64
+ a: { dir: dirA, manifest: mA },
65
+ b: { dir: dirB, manifest: mB },
66
+ meta: {
67
+ sameSurface: surfaceA === surfaceB,
68
+ sameKernel: kernelA === kernelB,
69
+ sameGenerator: generatorA === generatorB,
70
+ surfaceA, surfaceB, kernelA, kernelB, generatorA, generatorB,
71
+ },
72
+ hosts: {
73
+ sameHosts: hostsDiff.addedInB.length === 0 && hostsDiff.removedInB.length === 0,
74
+ addedInB: hostsDiff.addedInB,
75
+ removedInB: hostsDiff.removedInB,
76
+ },
77
+ files: {
78
+ sameFiles: filesDiff.addedInB.length === 0 && filesDiff.removedInB.length === 0 && changed.length === 0,
79
+ addedInB: filesDiff.addedInB,
80
+ removedInB: filesDiff.removedInB,
81
+ changed,
82
+ },
83
+ identical,
84
+ exitCode: identical ? 0 : 1,
85
+ };
86
+ }
87
+ function formatReport(r) {
88
+ const lines = [];
89
+ lines.push(`harness compare`);
90
+ lines.push(` A: ${r.a.dir}`);
91
+ lines.push(` B: ${r.b.dir}`);
92
+ lines.push('');
93
+ if (!r.a.manifest || !r.b.manifest) {
94
+ if (!r.a.manifest)
95
+ lines.push(` FAIL no .harness/manifest.json at A (${r.a.dir})`);
96
+ if (!r.b.manifest)
97
+ lines.push(` FAIL no .harness/manifest.json at B (${r.b.dir})`);
98
+ return lines;
99
+ }
100
+ lines.push(' meta:');
101
+ lines.push(` surface: A=${r.meta.surfaceA ?? '(unset)'} B=${r.meta.surfaceB ?? '(unset)'} ${r.meta.sameSurface ? 'PASS' : 'FAIL'}`);
102
+ lines.push(` kernel_version: A=${r.meta.kernelA ?? '(unset)'} B=${r.meta.kernelB ?? '(unset)'} ${r.meta.sameKernel ? 'PASS' : 'FAIL'}`);
103
+ lines.push(` generator: A=${r.meta.generatorA ?? '(unset)'} B=${r.meta.generatorB ?? '(unset)'} ${r.meta.sameGenerator ? 'PASS' : 'FAIL'}`);
104
+ lines.push(' hosts:');
105
+ if (r.hosts.sameHosts) {
106
+ lines.push(' PASS host lists match');
107
+ }
108
+ else {
109
+ if (r.hosts.addedInB.length)
110
+ lines.push(` + added in B: ${r.hosts.addedInB.join(', ')}`);
111
+ if (r.hosts.removedInB.length)
112
+ lines.push(` - removed in B: ${r.hosts.removedInB.join(', ')}`);
113
+ }
114
+ lines.push(' files:');
115
+ if (r.files.sameFiles) {
116
+ lines.push(` PASS ${Object.keys(r.a.manifest.files ?? {}).length} files match`);
117
+ }
118
+ else {
119
+ if (r.files.addedInB.length)
120
+ lines.push(` + added in B: ${r.files.addedInB.length} file(s)`);
121
+ if (r.files.removedInB.length)
122
+ lines.push(` - removed in B: ${r.files.removedInB.length} file(s)`);
123
+ if (r.files.changed.length)
124
+ lines.push(` ~ changed: ${r.files.changed.length} file(s)`);
125
+ // Show the first 5 of each so the user can spot the obvious differences
126
+ const sample = (arr) => arr.slice(0, 5).map(p => ` ${p}`);
127
+ if (r.files.addedInB.length)
128
+ sample(r.files.addedInB).forEach(l => lines.push(l));
129
+ if (r.files.removedInB.length)
130
+ sample(r.files.removedInB).forEach(l => lines.push(l));
131
+ if (r.files.changed.length)
132
+ sample(r.files.changed).forEach(l => lines.push(l));
133
+ }
134
+ lines.push('');
135
+ lines.push(` Result: ${r.identical ? 'IDENTICAL' : 'DRIFT'}`);
136
+ return lines;
137
+ }
138
+ export async function compareCmd(args) {
139
+ const bundle = args.includes('--bundle');
140
+ const positional = args.filter(a => !a.startsWith('--'));
141
+ if (positional.length < 2) {
142
+ const lines = [
143
+ 'Usage: harness compare <a> <b> [--bundle]',
144
+ '',
145
+ 'Compare two scaffolded harnesses by manifest + per-file fingerprint.',
146
+ 'Exits 0 if identical, 1 if drift, 2 if either path lacks a manifest.',
147
+ ];
148
+ return { code: 2, lines };
149
+ }
150
+ const dirA = resolve(positional[0]);
151
+ const dirB = resolve(positional[1]);
152
+ const report = await buildCompareReport(dirA, dirB);
153
+ // ADR-031: missing manifest is an error path that's still bundle-formed.
154
+ if (!report.a.manifest || !report.b.manifest) {
155
+ if (bundle) {
156
+ return {
157
+ code: 2,
158
+ lines: [JSON.stringify({
159
+ schema: 1, generatedAt: report.generatedAt,
160
+ error: !report.a.manifest && !report.b.manifest ? 'no-manifest-in-either'
161
+ : !report.a.manifest ? 'no-manifest-in-a' : 'no-manifest-in-b',
162
+ dirA, dirB, exitCode: 2,
163
+ }, null, 2)],
164
+ };
165
+ }
166
+ return { code: 2, lines: formatReport(report) };
167
+ }
168
+ if (bundle) {
169
+ return { code: report.exitCode, lines: [JSON.stringify(report, null, 2)] };
170
+ }
171
+ return { code: report.exitCode, lines: formatReport(report) };
172
+ }
173
+ //# sourceMappingURL=compare-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-cmd.js","sourceRoot":"","sources":["../src/compare-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type SubcommandResult = {
2
+ code: number;
3
+ lines: string[];
4
+ };
5
+ export declare function completionsCmd(args: string[]): SubcommandResult;
6
+ //# sourceMappingURL=completions-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions-cmd.d.ts","sourceRoot":"","sources":["../src/completions-cmd.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAyIjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8B/D"}
@@ -0,0 +1,171 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness completions <bash|zsh|fish>` — emit shell completion
4
+ // scripts. Mirrors the standard CLI convention (gh, npm, etc.).
5
+ // Users source the output:
6
+ //
7
+ // harness completions bash >> ~/.bash_completion
8
+ // harness completions zsh > ~/.zsh/_harness
9
+ // harness completions fish > ~/.config/fish/completions/harness.fish
10
+ const SUBCOMMANDS = [
11
+ 'sign', 'verify', 'doctor',
12
+ 'federate', 'secrets', 'validate',
13
+ 'mcp', 'publish', 'upgrade',
14
+ 'completions', 'sbom', 'audit',
15
+ // iter 55 PR-#1 additions
16
+ 'mcp-scan', 'analyze-repo',
17
+ // iter 66 — kernel-version skew diagnostic
18
+ 'diag',
19
+ // iter 97 — export MCP + claims as single JSON
20
+ 'export-config',
21
+ // iter 105 — diff two harness manifests + per-file fingerprints
22
+ 'compare',
23
+ // iter 110 — 7-section readiness scorecard for a local repo
24
+ 'genome',
25
+ // iter 111 — 5-dimension harness scorecard with badges
26
+ 'score',
27
+ // iter 112 — MCP threat-model artifact for enterprise review
28
+ 'threat-model',
29
+ // iter 121 — OIA v0.1 cross-cutting manifest (ADR-034)
30
+ 'oia-manifest',
31
+ 'help',
32
+ ];
33
+ const SECRETS_SUBSUBS = ['check', 'fetch', 'validate-token', 'help'];
34
+ const MCP_SUBSUBS = ['ls', 'invoke', 'help'];
35
+ const FEDERATE_SUBSUBS = ['init', 'add', 'remove', 'list', 'status', 'help'];
36
+ function bashCompletion() {
37
+ return `# bash completion for harness
38
+ _harness_completion() {
39
+ local cur prev cmd
40
+ COMPREPLY=()
41
+ cur="\${COMP_WORDS[COMP_CWORD]}"
42
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
43
+ cmd="\${COMP_WORDS[1]:-}"
44
+
45
+ # Top-level subcommands
46
+ if [ $COMP_CWORD -eq 1 ]; then
47
+ COMPREPLY=( $(compgen -W "${SUBCOMMANDS.join(' ')}" -- "$cur") )
48
+ return 0
49
+ fi
50
+
51
+ case "$cmd" in
52
+ secrets)
53
+ [ $COMP_CWORD -eq 2 ] && COMPREPLY=( $(compgen -W "${SECRETS_SUBSUBS.join(' ')}" -- "$cur") )
54
+ ;;
55
+ mcp)
56
+ [ $COMP_CWORD -eq 2 ] && COMPREPLY=( $(compgen -W "${MCP_SUBSUBS.join(' ')}" -- "$cur") )
57
+ ;;
58
+ federate)
59
+ [ $COMP_CWORD -eq 2 ] && COMPREPLY=( $(compgen -W "${FEDERATE_SUBSUBS.join(' ')}" -- "$cur") )
60
+ ;;
61
+ completions)
62
+ [ $COMP_CWORD -eq 2 ] && COMPREPLY=( $(compgen -W "bash zsh fish" -- "$cur") )
63
+ ;;
64
+ esac
65
+ return 0
66
+ }
67
+ complete -F _harness_completion harness
68
+ `;
69
+ }
70
+ function zshCompletion() {
71
+ return `#compdef harness
72
+ # zsh completion for harness
73
+
74
+ _harness() {
75
+ local -a subcommands
76
+ subcommands=(
77
+ 'sign:produce or update the witness manifest'
78
+ 'verify:verify the witness manifest signature'
79
+ 'doctor:smoke-check a scaffolded harness'
80
+ 'federate:manage federation peers (init/add/remove/list/status)'
81
+ 'secrets:GCP Secret Manager: check / fetch / validate-token'
82
+ 'validate:umbrella: doctor + verify + path-guard + mcp + secrets'
83
+ 'mcp:list MCP servers / dispatch a tool through the claim check'
84
+ 'publish:pin the harness manifest to IPFS via Pinata (dry-run default)'
85
+ 'upgrade:re-render template + drift plan (--apply to apply)'
86
+ 'completions:emit shell completion scripts (bash/zsh/fish)'
87
+ 'sbom:emit SPDX-2.3 SBOM for the harness'
88
+ 'audit:npm audit per-harness with structured output'
89
+ 'mcp-scan:security-scan the harness MCP surface (policy + perms + deps)'
90
+ 'analyze-repo:recommend a harness from a local repo'
91
+ 'diag:kernel-version skew check (ADR-027 diagnostic)'
92
+ 'export-config:emit MCP servers + claims + permissions as a single JSON'
93
+ 'compare:diff two harnesses (manifest + per-file fingerprints, ADR-031 --bundle)'
94
+ 'genome:7-section readiness scorecard for a local repo (--json/--bundle, iter 110)'
95
+ 'score:5-dimension harness scorecard 0–100 with badges (--json/--bundle, iter 111)'
96
+ 'threat-model:MCP threat-model artifact for PR/compliance review (--json/--bundle, iter 112)'
97
+ 'oia-manifest:emit .harness/oia-manifest.json — OIA v0.1 layer alignment (ADR-034, iter 121)'
98
+ 'help:show help'
99
+ )
100
+
101
+ if (( CURRENT == 2 )); then
102
+ _describe -t commands 'harness command' subcommands
103
+ return
104
+ fi
105
+
106
+ case "$words[2]" in
107
+ secrets)
108
+ (( CURRENT == 3 )) && compadd ${SECRETS_SUBSUBS.join(' ')}
109
+ ;;
110
+ mcp)
111
+ (( CURRENT == 3 )) && compadd ${MCP_SUBSUBS.join(' ')}
112
+ ;;
113
+ federate)
114
+ (( CURRENT == 3 )) && compadd ${FEDERATE_SUBSUBS.join(' ')}
115
+ ;;
116
+ completions)
117
+ (( CURRENT == 3 )) && compadd bash zsh fish
118
+ ;;
119
+ esac
120
+ }
121
+
122
+ _harness "$@"
123
+ `;
124
+ }
125
+ function fishCompletion() {
126
+ const subs = SUBCOMMANDS.map(s => `complete -c harness -f -n '__fish_use_subcommand' -a ${s}`).join('\n');
127
+ return `# fish completion for harness
128
+ ${subs}
129
+
130
+ # secrets sub-subs
131
+ complete -c harness -f -n '__fish_seen_subcommand_from secrets' -a '${SECRETS_SUBSUBS.join(' ')}'
132
+ # mcp sub-subs
133
+ complete -c harness -f -n '__fish_seen_subcommand_from mcp' -a '${MCP_SUBSUBS.join(' ')}'
134
+ # federate sub-subs
135
+ complete -c harness -f -n '__fish_seen_subcommand_from federate' -a '${FEDERATE_SUBSUBS.join(' ')}'
136
+ # completions sub-subs
137
+ complete -c harness -f -n '__fish_seen_subcommand_from completions' -a 'bash zsh fish'
138
+ `;
139
+ }
140
+ export function completionsCmd(args) {
141
+ const shell = args[0];
142
+ switch (shell) {
143
+ case 'bash':
144
+ return { code: 0, lines: [bashCompletion()] };
145
+ case 'zsh':
146
+ return { code: 0, lines: [zshCompletion()] };
147
+ case 'fish':
148
+ return { code: 0, lines: [fishCompletion()] };
149
+ case undefined:
150
+ case 'help':
151
+ return {
152
+ code: 0,
153
+ lines: [
154
+ 'Usage: harness completions <bash|zsh|fish>',
155
+ '',
156
+ 'Emit a shell completion script for the given shell.',
157
+ '',
158
+ 'Examples:',
159
+ ' harness completions bash >> ~/.bash_completion',
160
+ ' harness completions zsh > ~/.zsh/_harness',
161
+ ' harness completions fish > ~/.config/fish/completions/harness.fish',
162
+ ],
163
+ };
164
+ default:
165
+ return {
166
+ code: 2,
167
+ lines: [`Unknown shell: ${shell} (expected bash, zsh, or fish)`],
168
+ };
169
+ }
170
+ }
171
+ //# sourceMappingURL=completions-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions-cmd.js","sourceRoot":"","sources":["../src/completions-cmd.ts"],"names":[],"mappings":"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"}