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
package/dist/index.js ADDED
@@ -0,0 +1,409 @@
1
+ // SPDX-License-Identifier: MIT
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { walkTemplate, asFileMap } from './walker.js';
6
+ import { writeAtomic } from './writer.js';
7
+ import { emptyManifest, fingerprintFiles, sha256 } from './manifest.js';
8
+ import { validateHarnessName } from './renderer.js';
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ // Templates live at packages/create-agent-harness/templates/, one level above dist/.
11
+ const TEMPLATES_ROOT = resolve(__dirname, '..', 'templates');
12
+ /**
13
+ * Resolve `@ruflo/kernel`'s version at scaffold time so we can stamp it into
14
+ * `manifest.meta.kernel_version` (ADR-027 diagnostic). Falls through three
15
+ * lookup paths because the create-agent-harness package can run:
16
+ * - from a workspace checkout (`packages/kernel-js/package.json`)
17
+ * - from an installed npm tree (resolve `@ruflo/kernel/package.json`)
18
+ * - from the prebuilt dist with neither sibling (fall back to 'unknown')
19
+ *
20
+ * We never throw — a missing kernel version downgrades the meta block to
21
+ * `kernel_version: undefined`, which `harness doctor` already handles as
22
+ * a WARN line. The CLI must keep generating harnesses even if the local
23
+ * kernel install is broken.
24
+ */
25
+ function resolveKernelVersion() {
26
+ const candidates = [
27
+ // Workspace layout: packages/create-agent-harness/dist/ → ../../kernel-js/package.json
28
+ resolve(__dirname, '..', '..', 'kernel-js', 'package.json'),
29
+ // Installed layout: sibling node_modules/@ruflo/kernel/package.json
30
+ resolve(__dirname, '..', '..', '@ruflo', 'kernel', 'package.json'),
31
+ // Fallback: top-level node_modules
32
+ resolve(__dirname, '..', '..', '..', '@ruflo', 'kernel', 'package.json'),
33
+ ];
34
+ for (const p of candidates) {
35
+ try {
36
+ if (existsSync(p)) {
37
+ const pkg = JSON.parse(readFileSync(p, 'utf-8'));
38
+ if (typeof pkg.version === 'string' && pkg.version.length > 0) {
39
+ return pkg.version;
40
+ }
41
+ }
42
+ }
43
+ catch {
44
+ // Try next candidate
45
+ }
46
+ }
47
+ return undefined;
48
+ }
49
+ const KERNEL_VERSION = resolveKernelVersion();
50
+ export const HOSTS = ['claude-code', 'codex', 'pi-dev', 'hermes', 'openclaw', 'rvm'];
51
+ export const TEMPLATES = [
52
+ 'minimal',
53
+ 'vertical:devops',
54
+ 'vertical:support',
55
+ 'vertical:trading',
56
+ 'vertical:legal',
57
+ 'vertical:research',
58
+ 'vertical:coding',
59
+ 'vertical:business',
60
+ 'vertical:crm',
61
+ 'vertical:marketing',
62
+ 'vertical:advertising',
63
+ 'vertical:ai',
64
+ 'vertical:agentics',
65
+ 'vertical:ruview',
66
+ 'vertical:health',
67
+ 'vertical:education', // iter 80 (milestone)
68
+ 'vertical:sales', // iter 87
69
+ 'vertical:gaming', // iter 96
70
+ 'vertical:repo-maintainer', // iter 113 — best viral demo (user roadmap)
71
+ 'vertical:exotic',
72
+ ];
73
+ /** Read the canonical template catalog shipped at templates/catalog.json. */
74
+ export function loadCatalog() {
75
+ const p = join(TEMPLATES_ROOT, 'catalog.json');
76
+ if (!existsSync(p))
77
+ return [];
78
+ try {
79
+ const parsed = JSON.parse(readFileSync(p, 'utf-8'));
80
+ return parsed.templates ?? [];
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ }
86
+ /** Render the catalog as a human-readable table for `--list`. */
87
+ export function formatCatalog(entries) {
88
+ const lines = ['Available templates:', ''];
89
+ let category = '';
90
+ for (const e of entries) {
91
+ if (e.category !== category) {
92
+ category = e.category;
93
+ lines.push(` ${category}`);
94
+ }
95
+ const counts = `${e.agentCount}a/${e.skillCount}s/${e.commandCount}c`;
96
+ lines.push(` ${e.id.padEnd(22)} ${counts.padEnd(10)} ${e.quickStart}`);
97
+ }
98
+ lines.push('', `Scaffold with: openharness <name> --template <id>`);
99
+ return lines;
100
+ }
101
+ export function parseArgs(argv) {
102
+ const out = {};
103
+ for (let i = 0; i < argv.length; i++) {
104
+ const a = argv[i];
105
+ if (!a)
106
+ continue;
107
+ if (a === '--template' || a === '-t') {
108
+ out.template = argv[++i];
109
+ }
110
+ else if (a === '--template-package') {
111
+ out.templatePackage = argv[++i];
112
+ }
113
+ else if (a === '--host' || a === '-h') {
114
+ const v = argv[++i];
115
+ if (v)
116
+ (out.hosts ??= []).push(v);
117
+ }
118
+ else if (a === '--yes' || a === '-y') {
119
+ out.yes = true;
120
+ }
121
+ else if (a === '--force' || a === '-f') {
122
+ out.force = true;
123
+ }
124
+ else if (a === '--description' || a === '-d') {
125
+ out.description = argv[++i];
126
+ }
127
+ else if (a === '--from-existing') {
128
+ out.fromExisting = argv[++i] ?? process.cwd();
129
+ }
130
+ else if (a === '--list' || a === '--templates') {
131
+ out.list = true;
132
+ }
133
+ else if (a === '--wizard' || a === '-w') {
134
+ // iter 100: opt-in interactive flow. Off by default so CI scripts
135
+ // calling no-args keep getting the usage message instead of hanging.
136
+ out.wizard = true;
137
+ }
138
+ else if (!a.startsWith('-') && !out.name) {
139
+ out.name = a;
140
+ }
141
+ }
142
+ return out;
143
+ }
144
+ /**
145
+ * Resolve a template id to its on-disk directory. The "minimal" template
146
+ * lives at templates/minimal; vertical templates use ":" as the separator
147
+ * in their id and "_" as the on-disk separator (e.g. vertical:devops ->
148
+ * templates/vertical_devops).
149
+ */
150
+ export function templateDir(id) {
151
+ return join(TEMPLATES_ROOT, id.replace(':', '_'));
152
+ }
153
+ /**
154
+ * Run the full scaffold pipeline:
155
+ * 1. Validate the name
156
+ * 2. Walk the template dir + render
157
+ * 3. Compute fingerprints
158
+ * 4. Build .harness/manifest.json
159
+ * 5. Atomically write everything to targetDir
160
+ *
161
+ * Returns the list of paths written + the manifest path + any unresolved
162
+ * template variables (should be empty for a clean run).
163
+ */
164
+ export async function scaffold(opts) {
165
+ const nameCheck = validateHarnessName(opts.name);
166
+ if (!nameCheck.valid) {
167
+ throw new Error(`invalid harness name: ${nameCheck.reason}`);
168
+ }
169
+ const dir = templateDir(opts.template);
170
+ if (!existsSync(dir)) {
171
+ throw new Error(`unknown template: ${opts.template} (expected at ${dir})`);
172
+ }
173
+ const vars = {
174
+ name: opts.name,
175
+ description: opts.description ?? 'My AI agent harness',
176
+ host: opts.host,
177
+ };
178
+ const rendered = await walkTemplate(dir, vars, { strict: false });
179
+ const fileMap = asFileMap(rendered);
180
+ // iter 58: stamp kernel_version at scaffold time (ADR-027 diagnostic).
181
+ // surface defaults to 'cli' inside emptyManifest; we override only
182
+ // kernel_version here so the web-UI port can still set surface='web-ui'.
183
+ const manifest = emptyManifest(opts.template, opts.generatorVersion, {
184
+ meta: KERNEL_VERSION ? { kernel_version: KERNEL_VERSION } : {},
185
+ });
186
+ manifest.vars = vars;
187
+ manifest.hosts = [opts.host];
188
+ manifest.files = fingerprintFiles(fileMap);
189
+ // Self-hash the manifest itself so `harness upgrade` can detect a hand-
190
+ // edited manifest.
191
+ const manifestJson = JSON.stringify(manifest, null, 2);
192
+ rendered.push({
193
+ path: '.harness/manifest.json',
194
+ content: manifestJson,
195
+ rendered: false,
196
+ unresolved: [],
197
+ });
198
+ // Also record the manifest's own hash inside the manifest file's directory
199
+ // sibling (`.harness/manifest.sha256`) so a corrupt download is obvious.
200
+ rendered.push({
201
+ path: '.harness/manifest.sha256',
202
+ content: sha256(manifestJson) + '\n',
203
+ rendered: false,
204
+ unresolved: [],
205
+ });
206
+ const paths = await writeAtomic(opts.targetDir, rendered, { force: opts.force });
207
+ return {
208
+ paths,
209
+ manifestPath: join(opts.targetDir, '.harness', 'manifest.json'),
210
+ unresolved: rendered.flatMap(f => f.unresolved),
211
+ };
212
+ }
213
+ /** Try to detect an existing ruflo project at the given path. */
214
+ export function detectRufloProject(dir) {
215
+ const signals = [];
216
+ if (existsSync(join(dir, 'CLAUDE.md')))
217
+ signals.push('CLAUDE.md');
218
+ if (existsSync(join(dir, '.claude')))
219
+ signals.push('.claude/');
220
+ if (existsSync(join(dir, '.claude-flow')))
221
+ signals.push('.claude-flow/');
222
+ if (existsSync(join(dir, '.mcp.json')))
223
+ signals.push('.mcp.json');
224
+ return { found: signals.length >= 2, signals };
225
+ }
226
+ /**
227
+ * iter 117 — subcommand router. Per the user's directive:
228
+ *
229
+ * Before generation: `openharness`
230
+ * Inside generated harness: `harness`
231
+ *
232
+ * The factory side gains 4 explicit verbs (new / from-repo / analyze / genome)
233
+ * so the surface reads as a tool, not as "the thing that takes a name". The
234
+ * legacy bare-name form (`openharness my-bot`) still works as a back-compat
235
+ * shortcut for `openharness new my-bot`.
236
+ */
237
+ async function runOpenHarnessSubcommand(sub, rest) {
238
+ switch (sub) {
239
+ case 'new': {
240
+ // `openharness new <name> [--template <id>] [--host <id>]`
241
+ // Just an explicit alias for the bare-name form. Falls through to the
242
+ // legacy scaffold pipeline so semantics stay byte-identical.
243
+ return null; // signal "not handled — fall through to main()"
244
+ }
245
+ case 'from-repo': {
246
+ // `openharness from-repo <url> <name> [--template <id>] [--host <id>]`
247
+ // Clones a public GitHub repo to a tempdir, runs analyze-repo on it,
248
+ // and scaffolds the recommended harness as <name>. NO repository code
249
+ // is executed during analysis — same invariant as `analyze`.
250
+ const url = rest[0];
251
+ const name = rest[1];
252
+ if (!url || !name) {
253
+ console.error('Usage: npx openharness from-repo <repo-url> <harness-name> [--template <id>] [--host <id>]');
254
+ return 2;
255
+ }
256
+ const { spawnSync } = await import('node:child_process');
257
+ const { mkdtempSync } = await import('node:fs');
258
+ const { tmpdir } = await import('node:os');
259
+ const { join: pathJoin } = await import('node:path');
260
+ const tmp = mkdtempSync(pathJoin(tmpdir(), 'openharness-fromrepo-'));
261
+ console.log(`Cloning ${url} → ${tmp} (depth=1, code never executed)`);
262
+ const clone = spawnSync('git', ['clone', '--depth=1', '--quiet', url, tmp], { stdio: 'inherit' });
263
+ if (clone.status !== 0) {
264
+ console.error(`git clone failed (exit ${clone.status}). Is the URL public, is git installed?`);
265
+ return 2;
266
+ }
267
+ // Delegate to analyze-repo with --scaffold.
268
+ const { analyzeRepoCmd } = await import('./analyze-repo.js');
269
+ const remaining = rest.slice(2);
270
+ const analyzeArgs = [tmp, '--scaffold', name, ...remaining];
271
+ const r = await analyzeRepoCmd(analyzeArgs);
272
+ for (const line of r.lines)
273
+ console.log(line);
274
+ return r.code;
275
+ }
276
+ case 'analyze': {
277
+ // `openharness analyze <path> [--scaffold <name>] [--embed]`
278
+ // Alias for `harness analyze-repo`. Surface unification per the
279
+ // user's command-model directive.
280
+ const { analyzeRepoCmd } = await import('./analyze-repo.js');
281
+ const r = await analyzeRepoCmd(rest);
282
+ for (const line of r.lines)
283
+ console.log(line);
284
+ return r.code;
285
+ }
286
+ case 'genome': {
287
+ // `openharness genome <path>` — flagship feature per the user.
288
+ // Same code path as `harness genome`.
289
+ const { genomeCmd } = await import('./genome.js');
290
+ const r = await genomeCmd(rest);
291
+ for (const line of r.lines)
292
+ console.log(line);
293
+ return r.code;
294
+ }
295
+ default:
296
+ return null; // not a known subcommand
297
+ }
298
+ }
299
+ export async function main(argv) {
300
+ // iter 117 — subcommand router runs BEFORE flag parsing so positional
301
+ // verbs win over the legacy bare-name form. The router returns null when
302
+ // the first arg isn't a recognised subcommand, letting us fall through.
303
+ const first = argv[0];
304
+ if (first && !first.startsWith('-')) {
305
+ const subResult = await runOpenHarnessSubcommand(first, argv.slice(1));
306
+ if (subResult !== null)
307
+ return subResult;
308
+ // `new <name>` — strip the verb and fall through to the legacy scaffold.
309
+ if (first === 'new') {
310
+ argv = argv.slice(1);
311
+ }
312
+ }
313
+ const args = parseArgs(argv);
314
+ if (args.list) {
315
+ for (const line of formatCatalog(loadCatalog()))
316
+ console.log(line);
317
+ return 0;
318
+ }
319
+ if (args.wizard) {
320
+ // iter 100 (MILESTONE) — interactive wizard. Errors immediately
321
+ // on non-TTY environments (no point running the wizard in CI;
322
+ // arg-driven scaffold is what CI should use).
323
+ if (!process.stdin.isTTY) {
324
+ console.error('--wizard requires an interactive TTY. Use the arg-driven form in CI:');
325
+ console.error(' npx openharness <name> --template <id> --host <id>');
326
+ return 2;
327
+ }
328
+ const { runWizard, makeReadlineAsker, answersToInvocation } = await import('./wizard.js');
329
+ const catalogEntries = loadCatalog().map(t => ({ id: t.id, name: t.name, description: t.description }));
330
+ const wizardCatalog = { templates: catalogEntries, hosts: HOSTS };
331
+ const { ask, close } = makeReadlineAsker();
332
+ try {
333
+ const answers = await runWizard(wizardCatalog, ask);
334
+ // Fall through to the same scaffold path the arg-driven form
335
+ // uses — single source of truth for the scaffold semantics.
336
+ args.name = answers.name;
337
+ args.template = answers.template;
338
+ args.hosts = [answers.host];
339
+ args.description = answers.description;
340
+ // Print the equivalent CLI invocation so the user can re-run
341
+ // without the wizard next time.
342
+ process.stdout.write('\nNext time, you can skip the wizard with:\n');
343
+ process.stdout.write(` ${answersToInvocation(answers)}\n\n`);
344
+ }
345
+ finally {
346
+ close();
347
+ }
348
+ }
349
+ if (args.fromExisting !== undefined) {
350
+ const root = args.fromExisting || process.cwd();
351
+ const d = detectRufloProject(root);
352
+ if (d.found) {
353
+ console.log(`Detected ruflo project at ${root}`);
354
+ console.log(`Signals: ${d.signals.join(', ')}`);
355
+ console.log('Eject mode will lift agents/skills/commands into a renamed harness.');
356
+ console.log('(Full eject pipeline lands in iter 5.)');
357
+ return 0;
358
+ }
359
+ else {
360
+ console.log(`No ruflo project detected at ${root}`);
361
+ console.log(`Signals seen: ${d.signals.length === 0 ? 'none' : d.signals.join(', ')}`);
362
+ return 1;
363
+ }
364
+ }
365
+ if (!args.name) {
366
+ console.log('Usage: npx openharness <name> [--template <id>] [--host claude-code|codex|pi-dev|hermes] [--description "..."] [--force]');
367
+ console.log(' npx openharness --from-existing [./path]');
368
+ console.log(' npx openharness --wizard (iter 100 — interactive picker)');
369
+ console.log(' npx openharness --list (browse all templates)');
370
+ console.log('');
371
+ console.log(`Templates: ${TEMPLATES.join(', ')}`);
372
+ console.log(`Hosts: ${HOSTS.join(', ')}`);
373
+ return 2;
374
+ }
375
+ const host = (args.hosts?.[0] ?? 'claude-code');
376
+ if (!HOSTS.includes(host)) {
377
+ console.error(`Unknown host: ${host}. Choose from: ${HOSTS.join(', ')}`);
378
+ return 2;
379
+ }
380
+ const template = args.template ?? 'minimal';
381
+ const targetDir = resolve(process.cwd(), args.name);
382
+ try {
383
+ const result = await scaffold({
384
+ name: args.name,
385
+ template,
386
+ host,
387
+ description: args.description,
388
+ targetDir,
389
+ force: args.force,
390
+ generatorVersion: '0.1.0',
391
+ });
392
+ console.log(`Scaffolded ${args.name} into ${targetDir}`);
393
+ console.log(`Files: ${result.paths.length}`);
394
+ console.log(`Manifest: ${result.manifestPath}`);
395
+ if (result.unresolved.length > 0) {
396
+ console.log(`Warning: unresolved vars in template: ${result.unresolved.join(', ')}`);
397
+ }
398
+ return 0;
399
+ }
400
+ catch (err) {
401
+ console.error(err instanceof Error ? err.message : String(err));
402
+ return 1;
403
+ }
404
+ }
405
+ export { render, extractVarReferences, validateHarnessName } from './renderer.js';
406
+ export { walkTemplate, asFileMap } from './walker.js';
407
+ export { writeAtomic } from './writer.js';
408
+ export { emptyManifest, sha256, fingerprintFiles, diffFingerprints } from './manifest.js';
409
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { TemplateVars } from './renderer.js';
2
+ /** Diagnostic metadata per ADR-022 (CLI ↔ Web-UI integration). */
3
+ export interface HarnessMeta {
4
+ /** Which surface produced this harness — 'cli' or 'web-ui'. Lets the
5
+ * validate umbrella decide which parity test bucket the harness should
6
+ * pass, and tells operators which surface to debug when drift surfaces. */
7
+ surface?: 'cli' | 'web-ui';
8
+ /** `@ruflo/kernel` version the harness was scaffolded against. ADR-022
9
+ * identifies kernel version skew as the most common root cause of
10
+ * manifest-shape disagreement between CLI + Pages deployments. Recording
11
+ * it here turns "drift" into "v0.1.5 vs v0.1.6 mismatch". */
12
+ kernel_version?: string;
13
+ }
14
+ export interface HarnessManifest {
15
+ /** Manifest schema version. Bump only on breaking shape changes. */
16
+ schema: 1;
17
+ /** Generator package version that produced this harness. */
18
+ generator: string;
19
+ /** Template id (e.g. "minimal", "vertical:trading"). */
20
+ template: string;
21
+ /** Template package version (resolved at generation time). */
22
+ template_version: string;
23
+ /** Variables the user supplied. */
24
+ vars: TemplateVars;
25
+ /** Host adapters bundled. */
26
+ hosts: string[];
27
+ /** Per-rendered-file sha256, so `harness upgrade` can detect divergence. */
28
+ files: Record<string, string>;
29
+ /** ISO-8601 generation timestamp. */
30
+ generated_at: string;
31
+ /** ADR-022 diagnostic block. Optional for backwards-compat with pre-iter-56
32
+ * manifests; `harness validate doctor` warns (does NOT fail) when absent. */
33
+ meta?: HarnessMeta;
34
+ }
35
+ export declare function emptyManifest(template: string, generator: string, opts?: {
36
+ meta?: HarnessMeta;
37
+ }): HarnessManifest;
38
+ /** sha256-hex of a string. Used to fingerprint each rendered file. */
39
+ export declare function sha256(content: string): string;
40
+ /**
41
+ * Compute the per-file hash table for a rendered file map.
42
+ * Keys are file paths relative to the harness root.
43
+ */
44
+ export declare function fingerprintFiles(rendered: Record<string, string>): Record<string, string>;
45
+ /**
46
+ * Compare two manifests' file fingerprints, returning the set of paths
47
+ * that differ. Drives the `harness upgrade` regenerate-diff-merge flow
48
+ * per copier's update model (cited in ADR-008).
49
+ */
50
+ export declare function diffFingerprints(a: Record<string, string>, b: Record<string, string>): {
51
+ added: string[];
52
+ removed: string[];
53
+ changed: string[];
54
+ };
55
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B;;gFAE4E;IAC5E,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B;;;kEAG8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,MAAM,EAAE,CAAC,CAAC;IACV,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB;kFAC8E;IAC9E,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,GAChC,eAAe,CAkBjB;AAED,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMzF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAW3D"}
@@ -0,0 +1,62 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // .harness/manifest.json — the load-bearing artefact for drift detection
4
+ // (ADR-008) and eject/upgrade (ADR-012). Mirrors copier's `.copier-answers.yml`
5
+ // model: a single source of truth for what the user chose at generation
6
+ // time, used to re-apply template updates on `harness upgrade`.
7
+ import { createHash } from 'node:crypto';
8
+ export function emptyManifest(template, generator, opts = {}) {
9
+ return {
10
+ schema: 1,
11
+ generator,
12
+ template,
13
+ template_version: '0.0.0',
14
+ vars: {},
15
+ hosts: [],
16
+ files: {},
17
+ generated_at: new Date().toISOString(),
18
+ // ADR-022: surface is always 'cli' from this code path. The web-UI
19
+ // (PR #1) will populate 'web-ui' from its own emit path. opts.meta
20
+ // wins so callers can override (tests, future channels).
21
+ meta: {
22
+ surface: 'cli',
23
+ ...(opts.meta ?? {}),
24
+ },
25
+ };
26
+ }
27
+ /** sha256-hex of a string. Used to fingerprint each rendered file. */
28
+ export function sha256(content) {
29
+ return createHash('sha256').update(content, 'utf-8').digest('hex');
30
+ }
31
+ /**
32
+ * Compute the per-file hash table for a rendered file map.
33
+ * Keys are file paths relative to the harness root.
34
+ */
35
+ export function fingerprintFiles(rendered) {
36
+ const out = {};
37
+ for (const [path, content] of Object.entries(rendered)) {
38
+ out[path] = sha256(content);
39
+ }
40
+ return out;
41
+ }
42
+ /**
43
+ * Compare two manifests' file fingerprints, returning the set of paths
44
+ * that differ. Drives the `harness upgrade` regenerate-diff-merge flow
45
+ * per copier's update model (cited in ADR-008).
46
+ */
47
+ export function diffFingerprints(a, b) {
48
+ const added = [];
49
+ const removed = [];
50
+ const changed = [];
51
+ const allPaths = new Set([...Object.keys(a), ...Object.keys(b)]);
52
+ for (const p of Array.from(allPaths).sort()) {
53
+ if (!(p in a))
54
+ added.push(p);
55
+ else if (!(p in b))
56
+ removed.push(p);
57
+ else if (a[p] !== b[p])
58
+ changed.push(p);
59
+ }
60
+ return { added, removed, changed };
61
+ }
62
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,yEAAyE;AACzE,gFAAgF;AAChF,wEAAwE;AACxE,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsCzC,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,SAAiB,EACjB,OAA+B,EAAE;IAEjC,OAAO;QACL,MAAM,EAAE,CAAC;QACT,SAAS;QACT,QAAQ;QACR,gBAAgB,EAAE,OAAO;QACzB,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,mEAAmE;QACnE,mEAAmE;QACnE,yDAAyD;QACzD,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SACrB;KACF,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgC;IAC/D,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,CAAyB,EACzB,CAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type SubcommandResult = {
2
+ code: number;
3
+ lines: string[];
4
+ };
5
+ /** `harness mcp ls [path]` — list MCP servers + tools declared. */
6
+ export declare function mcpLs(args: string[]): Promise<SubcommandResult>;
7
+ /**
8
+ * `harness mcp invoke <server> <tool> --args=<json> [path]` — dispatch
9
+ * a tool through the kernel-style claim check and print the outcome.
10
+ *
11
+ * We re-use the TS ToolDispatcher here. For a real-world harness this
12
+ * would talk to the actual MCP server over stdio/HTTP; the CLI command
13
+ * is the same shape so users learn the dispatch model without bringing
14
+ * up infrastructure.
15
+ */
16
+ export declare function mcpInvoke(args: string[]): Promise<SubcommandResult>;
17
+ /** Top-level dispatcher for `harness mcp <subsub> ...`. */
18
+ export declare function mcpDispatch(args: string[]): Promise<SubcommandResult>;
19
+ //# sourceMappingURL=mcp-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-cmd.d.ts","sourceRoot":"","sources":["../src/mcp-cmd.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAmCjE,mEAAmE;AACnE,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6BrE;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6DzE;AAED,2DAA2D;AAC3D,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8B3E"}