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,25 @@
1
+ export type SubcommandResult = {
2
+ code: number;
3
+ lines: string[];
4
+ };
5
+ export interface ExportedConfig {
6
+ schema: 1;
7
+ generatedAt: string;
8
+ harnessDir: string;
9
+ host: string | undefined;
10
+ mcpServers: unknown;
11
+ claudeSettings: {
12
+ allow?: string[];
13
+ deny?: string[];
14
+ mcp?: unknown;
15
+ } | undefined;
16
+ codexConfig: unknown | undefined;
17
+ manifestMeta: {
18
+ surface?: string;
19
+ kernel_version?: string;
20
+ } | undefined;
21
+ hosts: string[];
22
+ }
23
+ export declare function buildExportedConfig(harnessDir: string): Promise<ExportedConfig>;
24
+ export declare function exportConfigCmd(args: string[]): Promise<SubcommandResult>;
25
+ //# sourceMappingURL=export-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-config.d.ts","sourceRoot":"","sources":["../src/export-config.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAsBjE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IACjF,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwErF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsB/E"}
@@ -0,0 +1,134 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness export-config` — emit the harness's security-relevant config
4
+ // as a single JSON for sharing or auditing without zipping the whole
5
+ // repo.
6
+ //
7
+ // Use case: "is my MCP policy reasonable? what about my Bash allowlist?"
8
+ // Users paste the export-config output into a discussion / GitHub
9
+ // issue / security review without having to scrub the rest of their
10
+ // harness.
11
+ //
12
+ // Sanitisation is the same contract as iter-90's diag --bundle:
13
+ // object keys matching /^(secret|token|key|password|api[-_]?key)/i
14
+ // are replaced with "<redacted>".
15
+ import { existsSync } from 'node:fs';
16
+ import { readFile } from 'node:fs/promises';
17
+ import { join, resolve } from 'node:path';
18
+ // iter 97: deliberately less anchored than iter-90's bundle regex.
19
+ // Export-config is meant for security/audit sharing, where the cost of
20
+ // over-redacting is much lower than the cost of leaking. We match the
21
+ // pattern ANYWHERE in the key — `OPENAI_API_KEY`, `GITHUB_TOKEN`,
22
+ // `db_password`, and the iter-90-style `secret_token` all redact.
23
+ // False positive: a key named literally `notakey` redacts. Acceptable
24
+ // for an audit-share artefact.
25
+ const REDACT_KEY_RE = /(secret|token|key|password|passphrase)/i;
26
+ function redact(v) {
27
+ if (v === null || typeof v !== 'object')
28
+ return v;
29
+ if (Array.isArray(v))
30
+ return v.map(redact);
31
+ const out = {};
32
+ for (const [k, val] of Object.entries(v)) {
33
+ if (REDACT_KEY_RE.test(k))
34
+ out[k] = '<redacted>';
35
+ else
36
+ out[k] = redact(val);
37
+ }
38
+ return out;
39
+ }
40
+ export async function buildExportedConfig(harnessDir) {
41
+ // .mcp/servers.json — the user's MCP wiring
42
+ let mcpServers = undefined;
43
+ const mcpPath = join(harnessDir, '.mcp', 'servers.json');
44
+ if (existsSync(mcpPath)) {
45
+ try {
46
+ mcpServers = redact(JSON.parse(await readFile(mcpPath, 'utf-8')));
47
+ }
48
+ catch {
49
+ mcpServers = '<unreadable>';
50
+ }
51
+ }
52
+ // .claude/settings.json — host-specific allow/deny + MCP wiring
53
+ let claudeSettings = undefined;
54
+ const claudePath = join(harnessDir, '.claude', 'settings.json');
55
+ if (existsSync(claudePath)) {
56
+ try {
57
+ claudeSettings = redact(JSON.parse(await readFile(claudePath, 'utf-8')));
58
+ }
59
+ catch {
60
+ /* swallow */
61
+ }
62
+ }
63
+ // .codex/config.toml — present as a string (TOML doesn't need
64
+ // sanitisation; users put secrets in env vars referenced by the toml)
65
+ let codexConfig = undefined;
66
+ const codexPath = join(harnessDir, '.codex', 'config.toml');
67
+ if (existsSync(codexPath)) {
68
+ try {
69
+ // Emit the TOML as a string so the bundle stays single-JSON
70
+ const raw = await readFile(codexPath, 'utf-8');
71
+ // Strip obvious secret-looking lines: `<key> = "..."` where
72
+ // <key> matches the redaction regex
73
+ codexConfig = raw.split('\n').map(line => {
74
+ const m = line.match(/^\s*(\w+)\s*=\s*".*"\s*$/);
75
+ if (m && REDACT_KEY_RE.test(m[1])) {
76
+ return line.replace(/"[^"]*"/, '"<redacted>"');
77
+ }
78
+ return line;
79
+ }).join('\n');
80
+ }
81
+ catch {
82
+ /* swallow */
83
+ }
84
+ }
85
+ // Manifest meta (iter 56 + iter 58)
86
+ let manifestMeta = undefined;
87
+ let hosts = [];
88
+ let host;
89
+ const manifestPath = join(harnessDir, '.harness', 'manifest.json');
90
+ if (existsSync(manifestPath)) {
91
+ try {
92
+ const m = JSON.parse(await readFile(manifestPath, 'utf-8'));
93
+ manifestMeta = m.meta;
94
+ hosts = Array.isArray(m.hosts) ? m.hosts : [];
95
+ host = m.vars?.host ?? hosts[0];
96
+ }
97
+ catch {
98
+ /* swallow */
99
+ }
100
+ }
101
+ return {
102
+ schema: 1,
103
+ generatedAt: new Date().toISOString(),
104
+ harnessDir,
105
+ host,
106
+ mcpServers,
107
+ claudeSettings,
108
+ codexConfig,
109
+ manifestMeta,
110
+ hosts,
111
+ };
112
+ }
113
+ export async function exportConfigCmd(args) {
114
+ const positional = args.filter(a => !a.startsWith('--'));
115
+ const dir = resolve(positional[0] ?? process.cwd());
116
+ if (!existsSync(join(dir, '.harness', 'manifest.json'))) {
117
+ return {
118
+ code: 2,
119
+ lines: [
120
+ `harness export-config — checking ${dir}`,
121
+ '',
122
+ ` FAIL no .harness/manifest.json found at this path`,
123
+ ` (this directory is not a scaffolded harness — run`,
124
+ ` harness export-config from a harness root)`,
125
+ ],
126
+ };
127
+ }
128
+ const config = await buildExportedConfig(dir);
129
+ return {
130
+ code: 0,
131
+ lines: [JSON.stringify(config, null, 2)],
132
+ };
133
+ }
134
+ //# sourceMappingURL=export-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-config.js","sourceRoot":"","sources":["../src/export-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface ExternalTemplate {
2
+ manifest: {
3
+ id: string;
4
+ description: string;
5
+ };
6
+ templateRoot: string;
7
+ }
8
+ export interface PackModule {
9
+ load?(): Promise<ExternalTemplate>;
10
+ default?: {
11
+ load?(): Promise<ExternalTemplate>;
12
+ };
13
+ }
14
+ /**
15
+ * Resolve an external template package. Returns the loaded template or
16
+ * throws with a clear message.
17
+ */
18
+ export declare function loadExternalTemplate(packageName: string): Promise<ExternalTemplate>;
19
+ //# sourceMappingURL=external-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-template.d.ts","sourceRoot":"","sources":["../src/external-template.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2BzF"}
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // External template loader.
4
+ //
5
+ // `create-agent-harness` ships with bundled templates (templates/minimal,
6
+ // templates/vertical_*). When the user passes `--template-package
7
+ // @ruflo/vertical-trading`, this loader resolves the npm package, calls
8
+ // its `.load()`, and returns the on-disk template root for the existing
9
+ // walker to consume.
10
+ /**
11
+ * Resolve an external template package. Returns the loaded template or
12
+ * throws with a clear message.
13
+ */
14
+ export async function loadExternalTemplate(packageName) {
15
+ if (!packageName || typeof packageName !== 'string') {
16
+ throw new Error('loadExternalTemplate: packageName is required');
17
+ }
18
+ let mod;
19
+ try {
20
+ mod = await import(packageName);
21
+ }
22
+ catch (err) {
23
+ throw new Error(`Could not import external template package "${packageName}": ${err instanceof Error ? err.message : String(err)}\n` +
24
+ `Did you forget to install it? Try: npm install ${packageName}`);
25
+ }
26
+ const load = mod.load ?? mod.default?.load;
27
+ if (typeof load !== 'function') {
28
+ throw new Error(`"${packageName}" does not export a load() function. ` +
29
+ `External template packages must export either { load } or default { load }.`);
30
+ }
31
+ const result = await load();
32
+ if (!result || !result.manifest || !result.templateRoot) {
33
+ throw new Error(`"${packageName}" load() returned a malformed result. Expected { manifest, templateRoot }.`);
34
+ }
35
+ return result;
36
+ }
37
+ //# sourceMappingURL=external-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-template.js","sourceRoot":"","sources":["../src/external-template.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,4BAA4B;AAC5B,EAAE;AACF,0EAA0E;AAC1E,kEAAkE;AAClE,wEAAwE;AACxE,wEAAwE;AACxE,qBAAqB;AAYrB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,GAAe,CAAC;IACpB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAe,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;YACpH,kDAAkD,WAAW,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;IAC3C,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,IAAI,WAAW,uCAAuC;YACtD,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,IAAI,WAAW,4EAA4E,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface Peer {
2
+ id: string;
3
+ name: string;
4
+ endpoint: string;
5
+ trust: 'untrusted' | 'trusted' | 'self';
6
+ }
7
+ export interface FederationState {
8
+ /** This harness's own peer id. */
9
+ self_id: string;
10
+ /** Peer entries indexed by id. */
11
+ peers: Record<string, Peer>;
12
+ /** ISO-8601 last-updated timestamp. */
13
+ updated_at: string;
14
+ }
15
+ export declare function emptyState(selfId: string): FederationState;
16
+ export declare function loadState(harnessDir: string): Promise<FederationState | null>;
17
+ export declare function saveState(harnessDir: string, state: FederationState): Promise<void>;
18
+ export declare function addPeer(state: FederationState, peer: Peer): FederationState;
19
+ export declare function removePeer(state: FederationState, id: string): FederationState;
20
+ export declare function listPeers(state: FederationState, opts?: {
21
+ trusted?: boolean;
22
+ }): Peer[];
23
+ /**
24
+ * Dispatch the `federate` subcommand.
25
+ *
26
+ * Subactions:
27
+ * harness federate init <self-id> — create state
28
+ * harness federate add <id> <name> <endpoint> [trust]
29
+ * harness federate remove <id>
30
+ * harness federate list [--trusted]
31
+ * harness federate status — summary
32
+ */
33
+ export declare function federateDispatch(args: string[], cwd?: string): Promise<{
34
+ code: number;
35
+ lines: string[];
36
+ }>;
37
+ //# sourceMappingURL=federate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federate.d.ts","sourceRoot":"","sources":["../src/federate.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAE1D;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQnF;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,eAAe,CAO3E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAI9E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,EAAE,CAG1F;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsG5C"}
@@ -0,0 +1,167 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness federate` subcommand + TS federation client.
4
+ //
5
+ // The kernel owns the peer registry + message envelope shape; the TS side
6
+ // owns the wire transport (WebSocket by default). This split keeps the
7
+ // wasm bundle small — no transport code in wasm at all — and lets each
8
+ // host pick its preferred wire.
9
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
10
+ import { existsSync } from 'node:fs';
11
+ import { dirname, join } from 'node:path';
12
+ const STATE_PATH = '.harness/federation.json';
13
+ export function emptyState(selfId) {
14
+ return { self_id: selfId, peers: {}, updated_at: new Date().toISOString() };
15
+ }
16
+ export async function loadState(harnessDir) {
17
+ const p = join(harnessDir, STATE_PATH);
18
+ if (!existsSync(p))
19
+ return null;
20
+ try {
21
+ return JSON.parse(await readFile(p, 'utf-8'));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export async function saveState(harnessDir, state) {
28
+ const p = join(harnessDir, STATE_PATH);
29
+ await mkdir(dirname(p), { recursive: true });
30
+ state.updated_at = new Date().toISOString();
31
+ await writeFile(p, JSON.stringify(state, null, 2), 'utf-8');
32
+ }
33
+ export function addPeer(state, peer) {
34
+ if (!peer.id || !peer.name)
35
+ throw new Error('peer.id and peer.name are required');
36
+ return {
37
+ ...state,
38
+ peers: { ...state.peers, [peer.id]: peer },
39
+ updated_at: new Date().toISOString(),
40
+ };
41
+ }
42
+ export function removePeer(state, id) {
43
+ if (!(id in state.peers))
44
+ return state;
45
+ const { [id]: _drop, ...rest } = state.peers;
46
+ return { ...state, peers: rest, updated_at: new Date().toISOString() };
47
+ }
48
+ export function listPeers(state, opts = {}) {
49
+ const all = Object.values(state.peers);
50
+ return opts.trusted ? all.filter(p => p.trust !== 'untrusted') : all;
51
+ }
52
+ /**
53
+ * Dispatch the `federate` subcommand.
54
+ *
55
+ * Subactions:
56
+ * harness federate init <self-id> — create state
57
+ * harness federate add <id> <name> <endpoint> [trust]
58
+ * harness federate remove <id>
59
+ * harness federate list [--trusted]
60
+ * harness federate status — summary
61
+ */
62
+ export async function federateDispatch(args, cwd = process.cwd()) {
63
+ const lines = [];
64
+ const sub = args[0];
65
+ switch (sub) {
66
+ case 'init': {
67
+ const id = args[1];
68
+ if (!id) {
69
+ lines.push('Usage: harness federate init <self-id>');
70
+ return { code: 2, lines };
71
+ }
72
+ const state = emptyState(id);
73
+ await saveState(cwd, state);
74
+ lines.push(`Initialized federation state at ${join(cwd, STATE_PATH)}`);
75
+ lines.push(` self_id: ${id}`);
76
+ return { code: 0, lines };
77
+ }
78
+ case 'add': {
79
+ const [, id, name, endpoint, trustArg] = args;
80
+ if (!id || !name || !endpoint) {
81
+ lines.push('Usage: harness federate add <id> <name> <endpoint> [trusted|untrusted|self]');
82
+ return { code: 2, lines };
83
+ }
84
+ const trust = (trustArg ?? 'untrusted');
85
+ if (!['trusted', 'untrusted', 'self'].includes(trust)) {
86
+ lines.push(`Unknown trust tier: ${trust}`);
87
+ return { code: 2, lines };
88
+ }
89
+ let state = await loadState(cwd);
90
+ if (!state) {
91
+ lines.push('No federation state found. Run `harness federate init <self-id>` first.');
92
+ return { code: 1, lines };
93
+ }
94
+ state = addPeer(state, { id, name, endpoint, trust });
95
+ await saveState(cwd, state);
96
+ lines.push(`Added peer: ${id} (${name}) trust=${trust}`);
97
+ return { code: 0, lines };
98
+ }
99
+ case 'remove': {
100
+ const [, id] = args;
101
+ if (!id) {
102
+ lines.push('Usage: harness federate remove <id>');
103
+ return { code: 2, lines };
104
+ }
105
+ let state = await loadState(cwd);
106
+ if (!state) {
107
+ lines.push('No federation state found.');
108
+ return { code: 1, lines };
109
+ }
110
+ const before = Object.keys(state.peers).length;
111
+ state = removePeer(state, id);
112
+ await saveState(cwd, state);
113
+ const after = Object.keys(state.peers).length;
114
+ if (before === after) {
115
+ lines.push(`Peer ${id} not in registry (no-op).`);
116
+ }
117
+ else {
118
+ lines.push(`Removed peer ${id}`);
119
+ }
120
+ return { code: 0, lines };
121
+ }
122
+ case 'list': {
123
+ const state = await loadState(cwd);
124
+ if (!state) {
125
+ lines.push('No federation state found. Run `harness federate init <self-id>` first.');
126
+ return { code: 1, lines };
127
+ }
128
+ const trustedOnly = args.includes('--trusted');
129
+ const peers = listPeers(state, { trusted: trustedOnly });
130
+ if (peers.length === 0) {
131
+ lines.push('No peers.');
132
+ }
133
+ else {
134
+ for (const p of peers) {
135
+ lines.push(` ${p.id} ${p.name} ${p.endpoint} trust=${p.trust}`);
136
+ }
137
+ }
138
+ return { code: 0, lines };
139
+ }
140
+ case 'status': {
141
+ const state = await loadState(cwd);
142
+ if (!state) {
143
+ lines.push('No federation state. Run `harness federate init <self-id>` first.');
144
+ return { code: 1, lines };
145
+ }
146
+ lines.push(`Self: ${state.self_id}`);
147
+ lines.push(`Peers: ${Object.keys(state.peers).length}`);
148
+ lines.push(`Updated: ${state.updated_at}`);
149
+ return { code: 0, lines };
150
+ }
151
+ case 'help':
152
+ case undefined:
153
+ lines.push('Usage: harness federate <init|add|remove|list|status> [args]');
154
+ lines.push('');
155
+ lines.push('Subactions:');
156
+ lines.push(' init <self-id> — create state file');
157
+ lines.push(' add <id> <name> <endpoint> [trust] — register a peer');
158
+ lines.push(' remove <id> — drop a peer');
159
+ lines.push(' list [--trusted] — show peers');
160
+ lines.push(' status — summary');
161
+ return { code: 0, lines };
162
+ default:
163
+ lines.push(`Unknown federate subaction: ${sub}`);
164
+ return { code: 2, lines };
165
+ }
166
+ }
167
+ //# sourceMappingURL=federate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federate.js","sourceRoot":"","sources":["../src/federate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { RepoProfile, HarnessPlan } from './analyze-repo.js';
2
+ /**
3
+ * Composite classifier — joins the languages + structural signals into a
4
+ * single underscore-delimited tag. Deterministic; the same profile always
5
+ * produces the same tag (we sort the inputs).
6
+ */
7
+ export declare function classifyRepoType(p: RepoProfile): string;
8
+ /**
9
+ * Maps the analyze-repo plan + profile into the four canonical maintenance
10
+ * roles the user named in the roadmap. Always returns a stable, deduplicated
11
+ * subset of ["maintainer","tester","security","release"].
12
+ */
13
+ export declare function resolveAgentTopology(profile: RepoProfile, plan: HarnessPlan): string[];
14
+ export type McpSurface = 'local_default_deny' | 'local_permissive' | 'remote' | 'off';
15
+ export interface McpRisk {
16
+ surface: McpSurface;
17
+ numeric: number;
18
+ }
19
+ export declare function scoreMcpRisk(profile: RepoProfile, plan: HarnessPlan): McpRisk;
20
+ /**
21
+ * Test confidence is a soft heuristic — we can't actually run the tests
22
+ * (the analyze-repo invariant forbids code execution), so we score based on:
23
+ * - presence of declared test commands (the repo can run tests at all)
24
+ * - presence of CI (someone has wired the tests to run on push)
25
+ * - heuristic: more test commands = more diverse tests
26
+ */
27
+ export declare function scoreTestConfidence(profile: RepoProfile): number;
28
+ /**
29
+ * Publish readiness — how close is this repo to being npm-publishable as a
30
+ * package today? Conservative score; releases need everything.
31
+ */
32
+ export declare function scorePublishReadiness(profile: RepoProfile, plan: HarnessPlan): number;
33
+ //# sourceMappingURL=genome-scorers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genome-scorers.d.ts","sourceRoot":"","sources":["../src/genome-scorers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIlE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAcvD;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAWtF;AAID,MAAM,MAAM,UAAU,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAQ7E;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAMhE;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CASrF"}
@@ -0,0 +1,115 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // Pure scorers for `harness genome` (iter 110). Every function is deterministic
4
+ // and I/O-free — inputs are the RepoProfile / HarnessPlan from analyze-repo,
5
+ // outputs are numeric scores in [0, 1] and discrete classifications. Unit-
6
+ // testable without fixtures.
7
+ //
8
+ // The dimensions match the user's roadmap spec for the genome report:
9
+ // 1. classifyRepoType -> string (e.g. "rust_wasm_node_monorepo")
10
+ // 2. resolveAgentTopology -> string[] ("maintainer","tester","security","release")
11
+ // 3. scoreMcpRisk -> { surface, numeric }
12
+ // 4. scoreTestConfidence -> number [0..1]
13
+ // 5. scorePublishReadiness -> number [0..1]
14
+ // --- 1. repo type classifier ----------------------------------------------
15
+ /**
16
+ * Composite classifier — joins the languages + structural signals into a
17
+ * single underscore-delimited tag. Deterministic; the same profile always
18
+ * produces the same tag (we sort the inputs).
19
+ */
20
+ export function classifyRepoType(p) {
21
+ const parts = [];
22
+ const langs = [...p.languages].sort();
23
+ if (langs.includes('rust'))
24
+ parts.push('rust');
25
+ if (langs.includes('typescript'))
26
+ parts.push('node');
27
+ if (langs.includes('python'))
28
+ parts.push('python');
29
+ if (langs.includes('go'))
30
+ parts.push('go');
31
+ if (parts.length === 0)
32
+ parts.push('unknown');
33
+ if (p.hasMcp)
34
+ parts.push('mcp');
35
+ if (p.hasCi)
36
+ parts.push('ci');
37
+ // We can't tell monorepo-ness from inventory alone, but a Cargo+Node combo
38
+ // is a strong signal that we report as a flat tag.
39
+ if (langs.includes('rust') && langs.includes('typescript'))
40
+ parts.push('polyglot');
41
+ return parts.join('_');
42
+ }
43
+ // --- 2. agent topology resolver --------------------------------------------
44
+ /**
45
+ * Maps the analyze-repo plan + profile into the four canonical maintenance
46
+ * roles the user named in the roadmap. Always returns a stable, deduplicated
47
+ * subset of ["maintainer","tester","security","release"].
48
+ */
49
+ export function resolveAgentTopology(profile, plan) {
50
+ const out = new Set();
51
+ // Maintainer is the floor — every repo gets one.
52
+ out.add('maintainer');
53
+ // Tester if the repo has any test signal (commands or pre-existing CI).
54
+ if (profile.testCommands.length > 0 || profile.hasCi)
55
+ out.add('tester');
56
+ // Security if MCP is enabled or the plan picks a default-deny MCP mode.
57
+ if (profile.hasMcp || plan.mcp === 'local' || plan.mcp === 'remote')
58
+ out.add('security');
59
+ // Release if the repo has CI plumbing already (it can ship).
60
+ if (profile.hasCi)
61
+ out.add('release');
62
+ return Array.from(out);
63
+ }
64
+ export function scoreMcpRisk(profile, plan) {
65
+ if (plan.mcp === 'off')
66
+ return { surface: 'off', numeric: 0 };
67
+ if (plan.mcp === 'remote')
68
+ return { surface: 'remote', numeric: 0.6 };
69
+ // plan.mcp === 'local'
70
+ const p = plan.policy;
71
+ const permissive = p.allowShell || p.allowNetwork || p.allowFileWrite || !p.defaultDeny;
72
+ if (permissive)
73
+ return { surface: 'local_permissive', numeric: 0.45 };
74
+ return { surface: 'local_default_deny', numeric: 0.15 };
75
+ }
76
+ // --- 4. test confidence ----------------------------------------------------
77
+ /**
78
+ * Test confidence is a soft heuristic — we can't actually run the tests
79
+ * (the analyze-repo invariant forbids code execution), so we score based on:
80
+ * - presence of declared test commands (the repo can run tests at all)
81
+ * - presence of CI (someone has wired the tests to run on push)
82
+ * - heuristic: more test commands = more diverse tests
83
+ */
84
+ export function scoreTestConfidence(profile) {
85
+ let s = 0;
86
+ if (profile.testCommands.length > 0)
87
+ s += 0.5;
88
+ if (profile.testCommands.length >= 2)
89
+ s += 0.2;
90
+ if (profile.hasCi)
91
+ s += 0.3;
92
+ return Math.min(1, s);
93
+ }
94
+ // --- 5. publish readiness --------------------------------------------------
95
+ /**
96
+ * Publish readiness — how close is this repo to being npm-publishable as a
97
+ * package today? Conservative score; releases need everything.
98
+ */
99
+ export function scorePublishReadiness(profile, plan) {
100
+ let s = 0;
101
+ if (profile.languages.includes('typescript'))
102
+ s += 0.3; // has package.json
103
+ if (profile.languages.includes('rust'))
104
+ s += 0.15; // has Cargo.toml
105
+ if (profile.buildCommands.length > 0)
106
+ s += 0.2; // can build
107
+ if (profile.testCommands.length > 0)
108
+ s += 0.15; // can test
109
+ if (profile.hasCi)
110
+ s += 0.2; // ci will gate it
111
+ if (plan.policy.defaultDeny)
112
+ s += 0.05; // policy locked
113
+ return Math.min(1, s);
114
+ }
115
+ //# sourceMappingURL=genome-scorers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genome-scorers.js","sourceRoot":"","sources":["../src/genome-scorers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type RepoProfile, type HarnessPlan } from './analyze-repo.js';
2
+ import { type McpSurface } from './genome-scorers.js';
3
+ export type SubcommandResult = {
4
+ code: number;
5
+ lines: string[];
6
+ };
7
+ export interface Genome {
8
+ repo_type: string;
9
+ agent_topology: string[];
10
+ risk_score: number;
11
+ mcp_surface: McpSurface;
12
+ test_confidence: number;
13
+ publish_readiness: number;
14
+ }
15
+ export interface GenomeReport {
16
+ schema: 1;
17
+ generatedAt: string;
18
+ dir: string;
19
+ profile: RepoProfile;
20
+ plan: HarnessPlan;
21
+ genome: Genome;
22
+ verdict: 'ready' | 'needs-work' | 'blocked';
23
+ exitCode: 0 | 1 | 2;
24
+ }
25
+ export declare function buildGenomeReport(dir: string, generatedAt?: string): GenomeReport;
26
+ export declare function formatGenomeReport(r: GenomeReport): string[];
27
+ export declare function genomeCmd(args: string[]): Promise<SubcommandResult>;
28
+ //# sourceMappingURL=genome.d.ts.map