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,241 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness oia-manifest <path>` — 21st subcommand (iter 121).
4
+ //
5
+ // Implements ADR-034 — the Open Intelligence Architecture (OIA) cross-cutting
6
+ // manifest layer. Static, additive, kernel-free. Emits .harness/oia-manifest.json
7
+ // self-describing the harness's alignment with the OIA v0.1 9-layer model and
8
+ // horizontal spans.
9
+ //
10
+ // LAYER NAMES + SPAN KEYS — per ADR-034 §233, these are inferred from OIA v0.1
11
+ // narrative prose (no machine-readable schema published yet). They carry the
12
+ // `oiaVersion: "0.1"` forward-compatibility signal so parsers can switch on
13
+ // version when v1.0 ships an authoritative enumeration.
14
+ //
15
+ // Modes:
16
+ // - default: emit/overwrite .harness/oia-manifest.json
17
+ // - --check: read existing manifest, verify shape, exit 0 ok / 1 drift / 2 missing
18
+ // - --dry-run: print the manifest to stdout, don't write
19
+ // - --json: stdout the manifest (same as --dry-run + machine-friendly)
20
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
21
+ import { join, resolve } from 'node:path';
22
+ function readHarnessProfile(dir) {
23
+ const root = resolve(dir);
24
+ const safeReadJson = (p) => {
25
+ try {
26
+ return existsSync(p) ? JSON.parse(readFileSync(p, 'utf-8')) : null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ };
32
+ const pkg = safeReadJson(join(root, 'package.json')) ?? {};
33
+ const manifest = safeReadJson(join(root, '.harness', 'manifest.json')) ?? {};
34
+ const mcpPolicy = safeReadJson(join(root, '.harness', 'mcp-policy.json'));
35
+ const hasMcp = mcpPolicy != null || existsSync(join(root, '.mcp.json'));
36
+ // mcpMode inference: presence of mcp-policy with `mode: remote` → remote;
37
+ // policy present without remote signal → local; otherwise off.
38
+ let mcpMode = 'off';
39
+ if (hasMcp)
40
+ mcpMode = mcpPolicy?.mode === 'remote' ? 'remote' : 'local';
41
+ const mcpPolicyPath = mcpPolicy != null ? '.harness/mcp-policy.json' : null;
42
+ const hasWitness = existsSync(join(root, '.harness', 'witness.json'));
43
+ const hasAuditLog = mcpPolicy?.auditLog === true;
44
+ return {
45
+ name: pkg.name ?? manifest.name ?? 'unknown-harness',
46
+ version: pkg.version ?? '0.0.0',
47
+ hasMcp,
48
+ mcpMode,
49
+ mcpPolicyPath,
50
+ hasWitness,
51
+ hasAuditLog,
52
+ };
53
+ }
54
+ /**
55
+ * Build an OIA manifest from the harness profile. Pure: same profile + same
56
+ * generatedAt → byte-identical manifest, so the witness fingerprint (ADR-011)
57
+ * stays stable.
58
+ */
59
+ export function buildOiaManifest(profile, generatedAt = new Date().toISOString()) {
60
+ const mcpFull = profile.hasMcp && profile.mcpMode !== 'off';
61
+ return {
62
+ schema: 1,
63
+ oiaVersion: '0.1',
64
+ generatedAt,
65
+ harnessId: `${profile.name}@${profile.version}`,
66
+ layerAlignment: {
67
+ L1_physicalCompute: 'not-applicable',
68
+ L2_dataAndStorage: 'partial',
69
+ L3_models: 'full',
70
+ L4_toolsAndIntegrations: mcpFull ? 'full' : 'partial',
71
+ L5_agentOrchestration: 'full',
72
+ L6_workflowAndAutomation: 'partial',
73
+ L7_governanceAndPolicy: mcpFull ? 'full' : 'partial',
74
+ L8_observabilityAndAudit: profile.hasAuditLog ? 'full' : 'partial',
75
+ L9_humanAndBrowserInterface: 'partial',
76
+ },
77
+ horizontalSpans: {
78
+ security: {
79
+ status: mcpFull ? 'full' : 'partial',
80
+ implementation: mcpFull ? 'mcp-policy.json + ADR-022' : 'ADR-022 (MCP off)',
81
+ },
82
+ observability: {
83
+ status: profile.hasAuditLog ? 'full' : 'partial',
84
+ implementation: profile.hasAuditLog ? 'audit-log in src/mcp/audit.ts' : 'partial — audit-log not enabled',
85
+ },
86
+ identity: {
87
+ status: 'none',
88
+ implementation: null,
89
+ },
90
+ governance: {
91
+ status: profile.hasWitness ? 'full' : 'partial',
92
+ implementation: profile.hasWitness ? 'mcp-policy.json + witness ADR-011' : 'mcp-policy.json (witness missing)',
93
+ },
94
+ policyEnforcement: {
95
+ status: mcpFull ? 'full' : 'partial',
96
+ implementation: mcpFull ? 'policy.ts default-deny gate' : 'partial — MCP off',
97
+ },
98
+ interoperability: {
99
+ status: 'partial',
100
+ implementation: 'MCP (ADR-022); OIA manifest (ADR-034)',
101
+ },
102
+ },
103
+ adjacentStandards: {
104
+ mcp: { mode: profile.mcpMode, policyPath: profile.mcpPolicyPath },
105
+ a2a: { mode: 'off', note: 'not yet wired' },
106
+ acp: { mode: 'off', note: 'not yet wired' },
107
+ agentProtocol: { mode: 'off', note: 'not yet wired' },
108
+ },
109
+ discoveryEndpoint: null,
110
+ registryUrl: null,
111
+ };
112
+ }
113
+ const SCHEMA_KEYS = [
114
+ 'schema', 'oiaVersion', 'generatedAt', 'harnessId',
115
+ 'layerAlignment', 'horizontalSpans', 'adjacentStandards',
116
+ 'discoveryEndpoint', 'registryUrl',
117
+ ];
118
+ const LAYER_KEYS = [
119
+ 'L1_physicalCompute', 'L2_dataAndStorage', 'L3_models',
120
+ 'L4_toolsAndIntegrations', 'L5_agentOrchestration', 'L6_workflowAndAutomation',
121
+ 'L7_governanceAndPolicy', 'L8_observabilityAndAudit', 'L9_humanAndBrowserInterface',
122
+ ];
123
+ const SPAN_KEYS = [
124
+ 'security', 'observability', 'identity', 'governance', 'policyEnforcement', 'interoperability',
125
+ ];
126
+ /**
127
+ * Validate an OIA manifest against the v0.1 schema. Strict shape check;
128
+ * unknown keys are reported as warnings (not failures) so a v1.0 manifest
129
+ * can be linted against v0.1 with informational drift output.
130
+ */
131
+ export function checkOiaManifest(m) {
132
+ const reasons = [];
133
+ const ok = (cond, msg) => { if (!cond)
134
+ reasons.push(msg); };
135
+ if (typeof m !== 'object' || m == null) {
136
+ return { ok: false, reasons: ['manifest is not an object'] };
137
+ }
138
+ const obj = m;
139
+ ok(obj.schema === 1, `schema: expected 1, got ${JSON.stringify(obj.schema)}`);
140
+ ok(obj.oiaVersion === '0.1', `oiaVersion: expected "0.1", got ${JSON.stringify(obj.oiaVersion)}`);
141
+ ok(typeof obj.generatedAt === 'string', 'generatedAt: must be ISO 8601 string');
142
+ ok(typeof obj.harnessId === 'string', 'harnessId: must be string');
143
+ for (const k of SCHEMA_KEYS)
144
+ ok(k in obj, `missing top-level key: ${k}`);
145
+ if (typeof obj.layerAlignment === 'object' && obj.layerAlignment != null) {
146
+ const la = obj.layerAlignment;
147
+ for (const lk of LAYER_KEYS)
148
+ ok(lk in la, `layerAlignment: missing ${lk}`);
149
+ }
150
+ else {
151
+ reasons.push('layerAlignment: not an object');
152
+ }
153
+ if (typeof obj.horizontalSpans === 'object' && obj.horizontalSpans != null) {
154
+ const hs = obj.horizontalSpans;
155
+ for (const sk of SPAN_KEYS)
156
+ ok(sk in hs, `horizontalSpans: missing ${sk}`);
157
+ }
158
+ else {
159
+ reasons.push('horizontalSpans: not an object');
160
+ }
161
+ return { ok: reasons.length === 0, reasons };
162
+ }
163
+ function usage() {
164
+ return [
165
+ 'Usage: harness oia-manifest <path> [--check] [--dry-run] [--json]',
166
+ '',
167
+ ' Emits .harness/oia-manifest.json self-describing the harness alignment',
168
+ ' with the OIA v0.1 9-layer reference architecture (ADR-034).',
169
+ '',
170
+ ' --check Read existing manifest, verify shape (exit 0/1/2).',
171
+ ' --dry-run Print the manifest to stdout, do not write.',
172
+ ' --json Same as --dry-run; emit JSON to stdout.',
173
+ ];
174
+ }
175
+ export async function oiaManifestCmd(args) {
176
+ const check = args.includes('--check');
177
+ const dryRun = args.includes('--dry-run');
178
+ const json = args.includes('--json');
179
+ const positional = [];
180
+ for (const a of args) {
181
+ if (a === '--check' || a === '--dry-run' || a === '--json')
182
+ continue;
183
+ if (a === '--help' || a === '-h')
184
+ return { code: 0, lines: usage() };
185
+ if (a && !a.startsWith('--'))
186
+ positional.push(a);
187
+ else if (a)
188
+ return { code: 2, lines: [`Unknown flag: ${a}`] };
189
+ }
190
+ if (positional.length === 0)
191
+ return { code: 2, lines: usage() };
192
+ const dir = resolve(positional[0]);
193
+ if (!existsSync(dir) || !statSync(dir).isDirectory()) {
194
+ return { code: 2, lines: [`harness oia-manifest: not a directory: ${dir}`] };
195
+ }
196
+ const manifestPath = join(dir, '.harness', 'oia-manifest.json');
197
+ if (check) {
198
+ if (!existsSync(manifestPath)) {
199
+ return { code: 2, lines: [`FAIL no .harness/oia-manifest.json at ${dir}`] };
200
+ }
201
+ try {
202
+ const m = JSON.parse(readFileSync(manifestPath, 'utf-8'));
203
+ const r = checkOiaManifest(m);
204
+ if (r.ok)
205
+ return { code: 0, lines: [`PASS oia-manifest.json shape ok (oiaVersion=${m.oiaVersion ?? '?'})`] };
206
+ return { code: 1, lines: ['DRIFT oia-manifest.json shape mismatch:', ...r.reasons.map((s) => ` · ${s}`)] };
207
+ }
208
+ catch (e) {
209
+ return { code: 2, lines: [`FAIL oia-manifest.json parse error: ${String(e)}`] };
210
+ }
211
+ }
212
+ const profile = readHarnessProfile(dir);
213
+ const manifest = buildOiaManifest(profile);
214
+ const out = JSON.stringify(manifest, null, 2) + '\n';
215
+ if (json || dryRun) {
216
+ return { code: 0, lines: [out.trimEnd()] };
217
+ }
218
+ const harnessDir = join(dir, '.harness');
219
+ if (!existsSync(harnessDir)) {
220
+ try {
221
+ mkdirSync(harnessDir, { recursive: true });
222
+ }
223
+ catch (e) {
224
+ return { code: 2, lines: [`failed to create .harness/: ${String(e)}`] };
225
+ }
226
+ }
227
+ try {
228
+ writeFileSync(manifestPath, out, 'utf-8');
229
+ }
230
+ catch (e) {
231
+ return { code: 2, lines: [`failed to write oia-manifest.json: ${String(e)}`] };
232
+ }
233
+ return { code: 0, lines: [
234
+ `wrote .harness/oia-manifest.json`,
235
+ ` harnessId: ${manifest.harnessId}`,
236
+ ` oiaVersion: ${manifest.oiaVersion}`,
237
+ ` mcp mode: ${manifest.adjacentStandards.mcp.mode}`,
238
+ ` identity: ${manifest.horizontalSpans.identity.status} (OIA v0.1 has no identity primitive)`,
239
+ ] };
240
+ }
241
+ //# sourceMappingURL=oia-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oia-manifest.js","sourceRoot":"","sources":["../src/oia-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type SubcommandResult = {
2
+ code: number;
3
+ lines: string[];
4
+ };
5
+ /**
6
+ * `harness publish [path] [--confirm] [--name=<override>]`
7
+ */
8
+ export declare function publishCmd(args: string[]): Promise<SubcommandResult>;
9
+ //# sourceMappingURL=publish-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-cmd.d.ts","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C1E"}
@@ -0,0 +1,56 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness publish [path] [--confirm]` CLI subcommand.
4
+ //
5
+ // Wraps the iter-5 publishHarness() flow with a friendly CLI surface.
6
+ // Default is DRY-RUN — confirms the manifest exists, witness verifies
7
+ // (if present), and reports what WOULD be pinned. --confirm actually
8
+ // pins to IPFS via Pinata.
9
+ //
10
+ // Required env (in --confirm mode):
11
+ // PINATA_JWT — fetch via `harness secrets fetch PINATA_JWT`
12
+ // or your local .env
13
+ import { resolve } from 'node:path';
14
+ import { publishHarness } from './publish.js';
15
+ /**
16
+ * `harness publish [path] [--confirm] [--name=<override>]`
17
+ */
18
+ export async function publishCmd(args) {
19
+ const positional = args.filter(a => !a.startsWith('--'));
20
+ const dir = resolve(positional[0] ?? process.cwd());
21
+ const confirm = args.includes('--confirm');
22
+ const nameOverride = args.find(a => a.startsWith('--name='))?.slice('--name='.length);
23
+ const lines = [`harness publish — ${dir} ${confirm ? '(CONFIRMED)' : '(DRY-RUN)'}`];
24
+ if (confirm) {
25
+ const jwt = process.env.PINATA_JWT;
26
+ if (!jwt) {
27
+ lines.push(' PINATA_JWT env var not set.', ' Fetch with: harness secrets fetch PINATA_JWT', ' Or omit --confirm to dry-run.');
28
+ return { code: 1, lines };
29
+ }
30
+ }
31
+ try {
32
+ const r = await publishHarness({
33
+ harnessDir: dir,
34
+ pinata: {
35
+ jwt: process.env.PINATA_JWT ?? 'dry-run-no-jwt',
36
+ },
37
+ confirm,
38
+ name: nameOverride,
39
+ });
40
+ lines.push(` manifest CID: ${r.manifestCid}`);
41
+ lines.push(` size: ${r.manifestSize} bytes`);
42
+ lines.push(` confirmed: ${r.confirmed}`);
43
+ if (!r.confirmed) {
44
+ lines.push('', ` This was a DRY-RUN. Re-run with --confirm to actually pin.`);
45
+ }
46
+ else {
47
+ lines.push('', ` Pinned to IPFS. CID is permanent — distribute via your marketplace registry.`);
48
+ }
49
+ return { code: 0, lines };
50
+ }
51
+ catch (e) {
52
+ lines.push(` FAIL: ${e instanceof Error ? e.message : String(e)}`);
53
+ return { code: 1, lines };
54
+ }
55
+ }
56
+ //# sourceMappingURL=publish-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-cmd.js","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,uDAAuD;AACvD,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,qEAAqE;AACrE,2BAA2B;AAC3B,EAAE;AACF,oCAAoC;AACpC,8DAA8D;AAC9D,oCAAoC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,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,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAa,CAAC,qBAAqB,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE9F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CACR,+BAA+B,EAC/B,gDAAgD,EAChD,iCAAiC,CAClC,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC;YAC7B,UAAU,EAAE,GAAG;YACf,MAAM,EAAE;gBACN,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB;aAChD;YACD,OAAO;YACP,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8DAA8D,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gFAAgF,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface PinataConfig {
2
+ /** Bearer JWT for Pinata's API. Must come from env or GCP Secret Manager. */
3
+ jwt: string;
4
+ /** Pinata API host. Defaults to https://api.pinata.cloud. */
5
+ baseUrl?: string;
6
+ }
7
+ export interface PinResult {
8
+ /** IPFS CID returned by the pin service. */
9
+ cid: string;
10
+ /** Bytes uploaded. */
11
+ size: number;
12
+ /** ISO-8601 timestamp from Pinata. */
13
+ timestamp: string;
14
+ }
15
+ /**
16
+ * Pin a JSON blob to IPFS via Pinata. Returns the CID.
17
+ *
18
+ * This is the lower-level primitive — `publishHarness` below packages the
19
+ * harness manifest into a JSON blob first.
20
+ */
21
+ export declare function pinJson(config: PinataConfig, payload: unknown, metadata: {
22
+ name: string;
23
+ keyvalues?: Record<string, string>;
24
+ }): Promise<PinResult>;
25
+ export interface HarnessPublishOptions {
26
+ /** Path to the harness directory (must have .harness/manifest.json). */
27
+ harnessDir: string;
28
+ /** Pinata config. */
29
+ pinata: PinataConfig;
30
+ /** When true, signs and pins; when false, runs the dry-run path only. */
31
+ confirm: boolean;
32
+ /** Optional override of the harness's name (defaults to manifest.vars.name). */
33
+ name?: string;
34
+ }
35
+ export interface PublishResult {
36
+ /** IPFS CID of the pinned manifest. */
37
+ manifestCid: string;
38
+ /** Bytes pinned. */
39
+ manifestSize: number;
40
+ /** Whether this was a confirmed pin or a dry-run. */
41
+ confirmed: boolean;
42
+ }
43
+ /**
44
+ * Publish a generated harness:
45
+ * 1. Read .harness/manifest.json
46
+ * 2. Verify the witness signature (TODO: wire into kernel.witnessVerify)
47
+ * 3. Pin the manifest to IPFS via Pinata
48
+ * 4. Return the CID
49
+ *
50
+ * Dry-run mode (`confirm: false`) does steps 1-2 and returns a CID of
51
+ * `dry-run-no-pin` so smoke tests can assert the call shape without
52
+ * spending Pinata quota.
53
+ */
54
+ export declare function publishHarness(opts: HarnessPublishOptions): Promise<PublishResult>;
55
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7D,OAAO,CAAC,SAAS,CAAC,CAiCpB;AAED,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwCxF"}
@@ -0,0 +1,104 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness publish` — pin a generated harness to IPFS via Pinata, then
4
+ // (optionally) chain into `npm publish --provenance`.
5
+ //
6
+ // Per ADR-005 (Marketplace plugin design), the generated harness uploads
7
+ // its tarball to IPFS so the ruflo plugin marketplace can discover it
8
+ // by CID. Pinata is the default pin provider (matches ruflo's existing
9
+ // plugin registry); other providers can drop in via the same interface.
10
+ //
11
+ // Security:
12
+ // - PINATA_API_JWT MUST come from env (never from a file in the repo)
13
+ // - The CI publish workflow fetches it from GCP Secret Manager via WIF
14
+ // - Local-dev publishes are gated behind --confirm so a typo doesn't
15
+ // accidentally pin
16
+ import { readFile } from 'node:fs/promises';
17
+ import { existsSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { findWitness, readAndVerify } from './witness-client.js';
20
+ /**
21
+ * Pin a JSON blob to IPFS via Pinata. Returns the CID.
22
+ *
23
+ * This is the lower-level primitive — `publishHarness` below packages the
24
+ * harness manifest into a JSON blob first.
25
+ */
26
+ export async function pinJson(config, payload, metadata) {
27
+ if (!config.jwt) {
28
+ throw new Error('PINATA_API_JWT is required (set env or fetch from GCP Secret Manager)');
29
+ }
30
+ const baseUrl = config.baseUrl ?? 'https://api.pinata.cloud';
31
+ const url = `${baseUrl}/pinning/pinJSONToIPFS`;
32
+ const body = JSON.stringify({
33
+ pinataContent: payload,
34
+ pinataMetadata: metadata,
35
+ pinataOptions: { cidVersion: 1 },
36
+ });
37
+ const res = await fetch(url, {
38
+ method: 'POST',
39
+ headers: {
40
+ 'Authorization': `Bearer ${config.jwt}`,
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ body,
44
+ });
45
+ if (!res.ok) {
46
+ const txt = await res.text();
47
+ throw new Error(`Pinata pin failed: HTTP ${res.status} ${res.statusText} — ${txt}`);
48
+ }
49
+ const data = await res.json();
50
+ return {
51
+ cid: data.IpfsHash,
52
+ size: data.PinSize,
53
+ timestamp: data.Timestamp,
54
+ };
55
+ }
56
+ /**
57
+ * Publish a generated harness:
58
+ * 1. Read .harness/manifest.json
59
+ * 2. Verify the witness signature (TODO: wire into kernel.witnessVerify)
60
+ * 3. Pin the manifest to IPFS via Pinata
61
+ * 4. Return the CID
62
+ *
63
+ * Dry-run mode (`confirm: false`) does steps 1-2 and returns a CID of
64
+ * `dry-run-no-pin` so smoke tests can assert the call shape without
65
+ * spending Pinata quota.
66
+ */
67
+ export async function publishHarness(opts) {
68
+ const manifestPath = join(opts.harnessDir, '.harness', 'manifest.json');
69
+ if (!existsSync(manifestPath)) {
70
+ throw new Error(`no manifest at ${manifestPath} — is ${opts.harnessDir} a generated harness?`);
71
+ }
72
+ const raw = await readFile(manifestPath, 'utf-8');
73
+ const manifest = JSON.parse(raw);
74
+ // Iter-6 security gate: verify the witness signature before pinning.
75
+ // We accept missing witness.json (witness signing is iter-7+ end-to-end
76
+ // wired) but tampered manifests fail loudly.
77
+ const witnessPath = findWitness(opts.harnessDir);
78
+ if (witnessPath) {
79
+ const { result } = await readAndVerify(witnessPath);
80
+ if (!result.valid) {
81
+ throw new Error(`witness verification failed: ${result.reason ?? 'unknown'}`);
82
+ }
83
+ }
84
+ if (!opts.confirm) {
85
+ return {
86
+ manifestCid: 'dry-run-no-pin',
87
+ manifestSize: Buffer.byteLength(raw, 'utf-8'),
88
+ confirmed: false,
89
+ };
90
+ }
91
+ const result = await pinJson(opts.pinata, manifest, {
92
+ name: opts.name ?? manifest['vars']?.name ?? 'harness',
93
+ keyvalues: {
94
+ template: String(manifest['template'] ?? ''),
95
+ generator: String(manifest['generator'] ?? ''),
96
+ },
97
+ });
98
+ return {
99
+ manifestCid: result.cid,
100
+ manifestSize: result.size,
101
+ confirmed: true,
102
+ };
103
+ }
104
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { HarnessManifest } from './manifest.js';
2
+ export interface RegistryEntry {
3
+ id: string;
4
+ name: string;
5
+ displayName: string;
6
+ description: string;
7
+ version: string;
8
+ size: number;
9
+ checksum: string;
10
+ author: {
11
+ id: string;
12
+ displayName: string;
13
+ verified: boolean;
14
+ };
15
+ license: string;
16
+ categories: string[];
17
+ tags: string[];
18
+ downloads: number;
19
+ rating: number;
20
+ lastUpdated: string;
21
+ type: 'harness';
22
+ template: string;
23
+ hosts: string[];
24
+ permissions: string[];
25
+ exports: string[];
26
+ verified: boolean;
27
+ trustLevel: 'official' | 'community' | 'unverified';
28
+ ipfs: {
29
+ manifestCid: string;
30
+ tarballCid?: string;
31
+ };
32
+ witness: {
33
+ publicKey: string;
34
+ signedAt: string;
35
+ };
36
+ }
37
+ export interface RegistryEntryInput {
38
+ manifest: HarnessManifest;
39
+ description: string;
40
+ author: {
41
+ id: string;
42
+ displayName: string;
43
+ verified?: boolean;
44
+ };
45
+ manifestCid: string;
46
+ tarballCid?: string;
47
+ size: number;
48
+ checksum: string;
49
+ witnessPublicKey: string;
50
+ witnessSignedAt: string;
51
+ trustLevel?: 'official' | 'community' | 'unverified';
52
+ categories?: string[];
53
+ tags?: string[];
54
+ }
55
+ /**
56
+ * Build a marketplace-registry entry for a published harness.
57
+ * Mirrors the ruflo plugin registry shape so the same UI can browse it.
58
+ */
59
+ export declare function buildRegistryEntry(input: RegistryEntryInput): RegistryEntry;
60
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;IACpD,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAuD3E"}
@@ -0,0 +1,67 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // IPFS marketplace registry entry generator.
4
+ //
5
+ // Per ADR-005, a published harness gets a marketplace-registry entry that
6
+ // the ruflo plugin marketplace can discover by CID. The entry shape mirrors
7
+ // ruflo's existing plugin registry (see v3/@claude-flow/cli/src/plugins/
8
+ // store/discovery.ts) so the same browsing UI can list harnesses without
9
+ // modification.
10
+ /**
11
+ * Build a marketplace-registry entry for a published harness.
12
+ * Mirrors the ruflo plugin registry shape so the same UI can browse it.
13
+ */
14
+ export function buildRegistryEntry(input) {
15
+ const name = input.manifest.vars.name ?? 'unnamed-harness';
16
+ const template = input.manifest.template;
17
+ const hosts = input.manifest.hosts;
18
+ // Default categories derive from template id.
19
+ const templateCategory = template.startsWith('vertical:')
20
+ ? template.split(':')[1]
21
+ : 'general';
22
+ const categories = input.categories ?? ['harness', templateCategory];
23
+ // Default tags pulled from template + hosts + a few defaults.
24
+ const tags = input.tags ?? Array.from(new Set([
25
+ 'agent-harness',
26
+ 'openharness',
27
+ templateCategory,
28
+ ...hosts.map(h => `host:${h}`),
29
+ 'mcp',
30
+ ]));
31
+ return {
32
+ id: `harness/${name}`,
33
+ name,
34
+ displayName: name,
35
+ description: input.description,
36
+ version: '0.1.0',
37
+ size: input.size,
38
+ checksum: input.checksum,
39
+ author: {
40
+ id: input.author.id,
41
+ displayName: input.author.displayName,
42
+ verified: input.author.verified ?? false,
43
+ },
44
+ license: 'MIT',
45
+ categories,
46
+ tags,
47
+ downloads: 0,
48
+ rating: 5,
49
+ lastUpdated: new Date().toISOString(),
50
+ type: 'harness',
51
+ template,
52
+ hosts,
53
+ permissions: ['memory', 'filesystem'],
54
+ exports: ['init', 'mcp'],
55
+ verified: input.author.verified ?? false,
56
+ trustLevel: input.trustLevel ?? 'community',
57
+ ipfs: {
58
+ manifestCid: input.manifestCid,
59
+ tarballCid: input.tarballCid,
60
+ },
61
+ witness: {
62
+ publicKey: input.witnessPublicKey,
63
+ signedAt: input.witnessSignedAt,
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,gBAAgB;AA2DhB;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,MAAM,IAAI,GAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAA2B,IAAI,iBAAiB,CAAC;IACnF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAEnC,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QACvD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE;QACzB,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAErE,8DAA8D;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QAC5C,eAAe;QACf,aAAa;QACb,gBAAgB;QAChB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,KAAK;KACN,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,WAAW,IAAI,EAAE;QACrB,IAAI;QACJ,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE;YACN,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;YACrC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK;SACzC;QACD,OAAO,EAAE,KAAK;QACd,UAAU;QACV,IAAI;QACJ,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,KAAK;QACL,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;QACrC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QACxB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,WAAW;QAC3C,IAAI,EAAE;YACJ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;QACD,OAAO,EAAE;YACP,SAAS,EAAE,KAAK,CAAC,gBAAgB;YACjC,QAAQ,EAAE,KAAK,CAAC,eAAe;SAChC;KACF,CAAC;AACJ,CAAC"}