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,542 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // CANONICAL TEMPLATE CATALOG — single source of truth.
4
+ //
5
+ // This file defines every quick-start template the generator ships, with
6
+ // bespoke per-domain agents, skills, and commands. It is consumed by:
7
+ //
8
+ // - scripts/gen-templates.mjs -> writes templates/<id>/ (.tmpl + manifest)
9
+ // AND templates/catalog.json (canonical)
10
+ // AND apps/web-ui/src/generated/catalog.ts
11
+ // - the CLI -> reads templates/catalog.json for --list
12
+ // - crates/template-catalog -> include_str!("catalog.json") + serde
13
+ // - apps/web-ui -> Quick-Start gallery + in-browser scaffold
14
+ //
15
+ // To change a template, edit it HERE and run `npm run gen:templates`
16
+ // (from packages/create-agent-harness). Never hand-edit the generated dirs.
17
+ //
18
+ // Schema per entry:
19
+ // id "vertical:<slug>" (":" in id -> "_" on disk)
20
+ // category grouping label for the gallery
21
+ // name human title
22
+ // domain free-form domain tag (goes in manifest.json)
23
+ // description one-line template description (gallery + manifest)
24
+ // harnessDesc default `description` var when scaffolding
25
+ // quickStart short "what you get" blurb for the gallery card
26
+ // tags [string]
27
+ // generate true = the generator writes a template dir for it.
28
+ // false = metadata-only (minimal/devops are hand-authored).
29
+ // mcp [{ key, sub }] extra MCP servers beyond the kernel
30
+ // allow/deny extra permission entries for .claude/settings.json
31
+ // agents [{ id, name, tier, role, systemPrompt }]
32
+ // skills [{ id, name, description, body }]
33
+ // commands [{ id, name, description, body }]
34
+
35
+ /** @typedef {{ id:string,name:string,tier:'haiku'|'sonnet'|'opus',role:string,systemPrompt:string }} AgentDef */
36
+
37
+ // --- shared building blocks ------------------------------------------------
38
+
39
+ const memorySkill = {
40
+ id: 'memory-inspect',
41
+ name: 'memory-inspect',
42
+ description: 'Search and inspect the harness memory namespace (HNSW + emergent-time decay).',
43
+ body: 'Inspect what the harness has learned.\n\n- `search <query>` — semantic nearest-neighbour over the namespace\n- `list` — recent patterns with decay weight\n- `forget <id>` — evict a pattern\n\nUse this before planning so the harness reuses prior trajectories instead of starting cold.',
44
+ };
45
+
46
+ const doctorCommand = {
47
+ id: 'doctor',
48
+ name: 'doctor',
49
+ description: 'Health-check the harness: kernel load, MCP wiring, memory backend, host adapter.',
50
+ body: 'Run a full health check and print a PASS/FAIL table.\n\n1. Kernel loads and `kernelInfo().version` matches package.json.\n2. The MCP server starts and lists its tools.\n3. The memory backend is reachable.\n4. The configured host adapter is present.\n\nExit non-zero if any check fails.',
51
+ };
52
+
53
+ export const CATALOG = [
54
+ // ===== Hand-authored, metadata-only (not regenerated) ====================
55
+ {
56
+ id: 'minimal',
57
+ category: 'Starter',
58
+ name: 'Minimal',
59
+ domain: 'starter',
60
+ description: 'Kernel + one host adapter + an init entry point. The smallest publishable harness.',
61
+ harnessDesc: 'My AI agent harness',
62
+ quickStart: 'The bare scaffold — learn the system, then grow into a vertical.',
63
+ tags: ['starter', 'minimal'],
64
+ generate: false,
65
+ agents: [],
66
+ skills: [],
67
+ commands: [doctorCommand],
68
+ },
69
+ {
70
+ id: 'vertical:devops',
71
+ category: 'Operations',
72
+ name: 'DevOps / SRE',
73
+ domain: 'devops/incident-response',
74
+ description: 'Incident-response harness — responder, runbook-runner, escalator, postmortem agents.',
75
+ harnessDesc: 'Incident response with on-call workflows',
76
+ quickStart: '4 on-call agents + alerts & runbook-store MCP servers + guarded kubectl perms.',
77
+ tags: ['devops', 'sre', 'incident-response', 'on-call'],
78
+ generate: false,
79
+ agents: [
80
+ { id: 'responder', name: 'Responder', tier: 'haiku', role: 'Triages alerts, finds the runbook.', systemPrompt: 'You are the first-line incident responder. Classify the alert severity, pull the matching runbook from memory, and propose the smallest safe mitigation — never auto-apply destructive steps. Hand off to the escalator when severity warrants.' },
81
+ { id: 'runbook-runner', name: 'Runbook Runner', tier: 'sonnet', role: 'Executes runbooks with confirm gates.', systemPrompt: 'You execute named runbooks step by step, pausing at every step marked confirm, capturing each step output to memory, and aborting to escalation on the first non-recoverable error.' },
82
+ { id: 'escalator', name: 'Escalator', tier: 'sonnet', role: 'Pages humans on severity.', systemPrompt: 'You decide when and whom to page. Map the service to its on-call rotation, open an incident channel with the responder summary, and page progressively on ack timeout. Record every escalation decision for the postmortem.' },
83
+ { id: 'postmortem', name: 'Postmortem', tier: 'opus', role: 'Blameless postmortems.', systemPrompt: 'You write blameless postmortems from the incident timeline in memory: contributing factors rather than a single root cause, and concrete, owned, dated action items. Never attribute fault to individuals.' },
84
+ ],
85
+ skills: [],
86
+ commands: [doctorCommand],
87
+ },
88
+
89
+ // ===== Generated verticals ==============================================
90
+
91
+ // --- Advanced coding ----------------------------------------------------
92
+ {
93
+ id: 'vertical:coding',
94
+ category: 'Engineering',
95
+ name: 'Advanced Coding',
96
+ domain: 'software-engineering',
97
+ description: 'A senior engineering pod — architect, implementer, reviewer, and test-writer over a shared code memory.',
98
+ harnessDesc: 'Plan, implement, review, and test code changes',
99
+ quickStart: 'Architect → implement → review → test, with a code-index MCP and push-guarded git perms.',
100
+ tags: ['coding', 'engineering', 'tdd', 'code-review', 'refactor'],
101
+ mcp: [{ key: 'code_index', sub: 'index' }],
102
+ allow: ['Bash(npm test*)', 'Bash(npm run*)', 'Bash(git diff*)', 'Bash(git status*)', 'Bash(git log*)'],
103
+ deny: ['Bash(git push*)', 'Bash(rm -rf*)'],
104
+ agents: [
105
+ { id: 'architect', name: 'Architect', tier: 'opus', role: 'Designs the change before code is written.', systemPrompt: 'You are the architect. Before any code is written you produce the smallest design that satisfies the request: the files to touch, the interfaces to add, and the trade-offs. You never write the implementation — you hand a crisp plan to the implementer. Prefer reuse over new abstractions; call out any change that ripples beyond three files.' },
106
+ { id: 'implementer', name: 'Implementer', tier: 'sonnet', role: 'Writes code that matches the surrounding style.', systemPrompt: 'You implement the architect\'s plan. Match the existing code\'s naming, comment density, and idioms — your diff should read like the person who wrote the file kept writing. Make the minimal change; do not refactor unrelated code. Leave the tests to the test-writer unless asked.' },
107
+ { id: 'reviewer', name: 'Reviewer', tier: 'opus', role: 'Hunts correctness bugs in the diff.', systemPrompt: 'You review diffs for correctness, security, and reuse. Report only high-confidence findings, each with a file:line and a concrete fix. Distinguish a bug (will break) from a nit (style). Never approve a change that widens a permission, swallows an error, or ships a secret.' },
108
+ { id: 'test-writer', name: 'Test Writer', tier: 'sonnet', role: 'Adds the missing tests for the change.', systemPrompt: 'You write the tests the change needs: the happy path, the boundary, and the one failure mode most likely to regress. Mirror the project\'s existing test style and runner. A test that cannot fail is worse than no test — assert behaviour, not implementation.' },
109
+ ],
110
+ skills: [
111
+ { id: 'plan-change', name: 'plan-change', description: 'Turn a feature request into a minimal, file-level implementation plan before any code.', body: 'Produce an implementation plan for a requested change.\n\n1. Restate the goal in one sentence.\n2. List the files to touch and why.\n3. Name the smallest interface that satisfies it.\n4. Flag anything that ripples beyond three files or widens a permission.\n\nHand the plan to the implementer; do not write code in this step.' },
112
+ ],
113
+ commands: [
114
+ doctorCommand,
115
+ { id: 'review-diff', name: 'review-diff', description: 'Review the current working diff for correctness, security, and reuse.', body: 'Review the current git diff.\n\n1. `git diff` to read the change.\n2. Report only high-confidence findings as `file:line — issue — fix`.\n3. Separate bugs from nits.\n4. End with APPROVE or REQUEST-CHANGES and a one-line reason.' },
116
+ ],
117
+ },
118
+
119
+ // --- Research (hand-authored on disk; metadata only) -------------------
120
+ {
121
+ id: 'vertical:research',
122
+ category: 'Knowledge',
123
+ name: 'Research Dossiers',
124
+ domain: 'research/multi-source-dossier',
125
+ description: 'Research dossier harness — scout, web-searcher, source-grader, synthesizer, fact-checker, citer; evidence-graded multi-source synthesis.',
126
+ harnessDesc: 'Fan-out research and produce cited dossiers',
127
+ quickStart: 'Scout → search → grade → synthesize → fact-check → cite, with web-search & dossier MCPs.',
128
+ tags: ['research', 'rag', 'citations', 'synthesis', 'fact-checking'],
129
+ generate: false,
130
+ agents: [
131
+ { id: 'scout', name: 'Scout', tier: 'sonnet', role: 'Decomposes the question into sub-queries.', systemPrompt: 'You decompose a research question into independent, searchable sub-questions and set the stopping condition up front.' },
132
+ { id: 'web-searcher', name: 'Web Searcher', tier: 'sonnet', role: 'Fans out searches and collects sources.', systemPrompt: 'You run the sub-queries and collect primary sources, each recorded with its URL and the claim it supports.' },
133
+ { id: 'source-grader', name: 'Source Grader', tier: 'sonnet', role: 'Grades source quality and recency.', systemPrompt: 'You grade each source for authority, recency, and independence, and drop the weak ones before synthesis.' },
134
+ { id: 'synthesizer', name: 'Synthesizer', tier: 'opus', role: 'Writes the dossier from the evidence.', systemPrompt: 'You write the dossier strictly from graded evidence; every non-obvious claim carries a citation, and disagreements are shown rather than averaged.' },
135
+ { id: 'fact-checker', name: 'Fact Checker', tier: 'opus', role: 'Adversarially verifies each claim.', systemPrompt: 'You adversarially verify each load-bearing claim and label it SUPPORTED, WEAK, or UNSUPPORTED.' },
136
+ { id: 'citer', name: 'Citer', tier: 'haiku', role: 'Normalises and checks citations.', systemPrompt: 'You normalise every citation to a consistent format and confirm each resolves to the source it claims.' },
137
+ ],
138
+ skills: [],
139
+ commands: [doctorCommand],
140
+ },
141
+
142
+ // --- Trading (hand-authored on disk; metadata only) --------------------
143
+ {
144
+ id: 'vertical:trading',
145
+ category: 'Finance',
146
+ name: 'Trading Desk',
147
+ domain: 'trading/quantitative',
148
+ description: 'Trading harness — market-watcher, signal-gen, risk-checker, executor (paper by default), postmortem; circuit-breaker safety patterns.',
149
+ harnessDesc: 'Watch markets, generate signals, gate risk, execute (paper)',
150
+ quickStart: 'Watch → signal → risk-gate → execute (paper) → postmortem, with circuit-breaker safety.',
151
+ tags: ['trading', 'finance', 'risk', 'backtesting', 'quant'],
152
+ generate: false,
153
+ agents: [
154
+ { id: 'market-watcher', name: 'Market Watcher', tier: 'haiku', role: 'Streams and summarises market state.', systemPrompt: 'You watch the market feed and surface what matters — volatility, regime shifts, liquidity — to shared memory.' },
155
+ { id: 'signal-gen', name: 'Signal Generator', tier: 'sonnet', role: 'Emits directional signals with confidence.', systemPrompt: 'You generate trade signals from market features with a direction, a 0-1 confidence, and a one-line rationale. You never size positions.' },
156
+ { id: 'risk-checker', name: 'Risk Checker', tier: 'opus', role: 'The non-bypassable risk gate.', systemPrompt: 'You are the risk gate: enforce exposure, drawdown, and concentration limits, down-size or veto, and trip the circuit breaker on anomalies. Nothing reaches execution without you.' },
157
+ { id: 'executor', name: 'Executor', tier: 'sonnet', role: 'Routes approved orders (paper by default).', systemPrompt: 'You execute only risk-approved orders, paper-trading by default, and write fills and slippage back to memory.' },
158
+ { id: 'postmortem', name: 'Postmortem', tier: 'opus', role: 'Attributes wins and losses.', systemPrompt: 'You attribute each closed trade back to its signal and features so the desk learns what actually worked.' },
159
+ ],
160
+ skills: [],
161
+ commands: [doctorCommand],
162
+ },
163
+
164
+ // --- Customer support (hand-authored on disk; metadata only) -----------
165
+ {
166
+ id: 'vertical:support',
167
+ category: 'Customer',
168
+ name: 'Customer Support',
169
+ domain: 'customer-support',
170
+ description: 'Customer support harness — triager, kb-searcher, responder, escalator; KB-RAG MCP and escalation rules.',
171
+ harnessDesc: 'Triage tickets, answer with cited KB, escalate',
172
+ quickStart: 'Triage → KB-search → respond → escalate, with a KB-RAG MCP and abstain-not-hallucinate policy.',
173
+ tags: ['support', 'customer-service', 'ticketing', 'kb', 'escalation'],
174
+ generate: false,
175
+ agents: [
176
+ { id: 'triager', name: 'Triager', tier: 'haiku', role: 'Classifies and routes inbound tickets.', systemPrompt: 'You triage inbound tickets by intent, urgency, and product area, deduplicate against open tickets, and route with a suggested priority.' },
177
+ { id: 'kb-searcher', name: 'KB Searcher', tier: 'sonnet', role: 'Finds cited answers in the knowledge base.', systemPrompt: 'You retrieve KB answers via RAG and return cited passages, abstaining when there is no confident match.' },
178
+ { id: 'responder', name: 'Responder', tier: 'sonnet', role: 'Writes the customer-facing reply.', systemPrompt: 'You write the customer reply, leading with the answer and grounding it in the KB searcher cited passages.' },
179
+ { id: 'escalator', name: 'Escalator', tier: 'sonnet', role: 'Hands off to a human with context.', systemPrompt: 'You escalate to a human with a structured summary, the SLA clock, and a suggested priority and queue.' },
180
+ ],
181
+ skills: [],
182
+ commands: [doctorCommand],
183
+ },
184
+
185
+ // --- Legal (hand-authored on disk; metadata only) ----------------------
186
+ {
187
+ id: 'vertical:legal',
188
+ category: 'Professional',
189
+ name: 'Legal Redline',
190
+ domain: 'legal/contract-review',
191
+ description: 'Legal review harness — redline, citation-checker, risk-rater; citation-search MCP and a deliberation-first workflow. Drafts only; not legal advice.',
192
+ harnessDesc: 'Redline contracts, check citations, rate risk',
193
+ quickStart: 'Redline → citation-check → risk-rate, with a citation-search MCP. Always defers to a licensed human.',
194
+ tags: ['legal', 'contracts', 'redline', 'compliance'],
195
+ generate: false,
196
+ agents: [
197
+ { id: 'redline', name: 'Redliner', tier: 'opus', role: 'Proposes redlines against a playbook.', systemPrompt: 'You propose redlines against the user playbook: quote the risky clause, state the risk, and offer a fallback and walk-away. This is a draft, not legal advice.' },
198
+ { id: 'citation-checker', name: 'Citation Checker', tier: 'opus', role: 'Verifies every cited authority.', systemPrompt: 'You verify each cited authority via the citation-search MCP and flag any you cannot confirm. A hallucinated citation is the worst failure mode here.' },
199
+ { id: 'risk-rater', name: 'Risk Rater', tier: 'sonnet', role: 'Scores residual risk per clause.', systemPrompt: 'You rate the residual risk of each clause after redlines on a clear scale, with the single reason that drives the score.' },
200
+ ],
201
+ skills: [],
202
+ commands: [doctorCommand],
203
+ },
204
+
205
+ // --- Business & strategy ------------------------------------------------
206
+ {
207
+ id: 'vertical:business',
208
+ category: 'Business',
209
+ name: 'Business Operations',
210
+ domain: 'business/strategy',
211
+ description: 'A business pod — analyst, strategist, and ops-coordinator for plans, metrics, and execution.',
212
+ harnessDesc: 'Analyse, strategise, and coordinate execution',
213
+ quickStart: 'Analyst → strategist → ops-coordinator, with a metrics MCP for KPI grounding.',
214
+ tags: ['business', 'strategy', 'operations', 'kpi', 'planning'],
215
+ mcp: [{ key: 'metrics', sub: 'metrics' }],
216
+ allow: ['mcp__metrics__*'],
217
+ deny: [],
218
+ agents: [
219
+ { id: 'analyst', name: 'Analyst', tier: 'sonnet', role: 'Turns raw metrics into findings.', systemPrompt: 'You are the analyst. Pull the relevant KPIs from the metrics MCP and turn them into findings: what moved, by how much, and the most likely driver. Quantify everything; flag where the data is too thin to conclude. You report; you do not decide strategy.' },
220
+ { id: 'strategist', name: 'Strategist', tier: 'opus', role: 'Chooses the bet and the trade-offs.', systemPrompt: 'You set strategy from the analyst\'s findings. Frame two or three real options, name the trade-off each makes, and recommend one with the reasoning. Tie every recommendation to a metric it should move and a time horizon. Avoid generic advice — be specific to this business\'s numbers.' },
221
+ { id: 'ops-coordinator', name: 'Ops Coordinator', tier: 'sonnet', role: 'Turns the chosen bet into owned actions.', systemPrompt: 'You convert the chosen strategy into execution: concrete, owned, dated action items with a success metric each. You surface dependencies and the first thing that will go wrong. No action item ships without an owner and a date.' },
222
+ ],
223
+ skills: [
224
+ { id: 'quarterly-plan', name: 'quarterly-plan', description: 'Build a quarterly plan: findings → strategy → owned action items tied to KPIs.', body: 'Build a quarterly plan.\n\n1. Analyst pulls KPIs and reports what moved.\n2. Strategist frames options and recommends one, tied to a metric.\n3. Ops-coordinator breaks it into owned, dated action items.\n4. Output a one-page plan: goal, bet, metrics, owners, risks.' },
225
+ ],
226
+ commands: [doctorCommand],
227
+ },
228
+
229
+ // --- Customer management (CRM) ------------------------------------------
230
+ {
231
+ id: 'vertical:crm',
232
+ category: 'Customer',
233
+ name: 'Customer Management',
234
+ domain: 'crm/lifecycle',
235
+ description: 'A CRM pod — lead-qualifier, account-manager, and churn-watcher over the customer lifecycle.',
236
+ harnessDesc: 'Qualify leads, manage accounts, watch for churn',
237
+ quickStart: 'Qualify → manage → watch-churn, with a CRM-store MCP and lifecycle memory.',
238
+ tags: ['crm', 'sales', 'accounts', 'churn', 'lifecycle'],
239
+ mcp: [{ key: 'crm_store', sub: 'crm' }],
240
+ allow: ['mcp__crm_store__*'],
241
+ deny: ['Read(./.env)', 'Read(./.env.*)'],
242
+ agents: [
243
+ { id: 'lead-qualifier', name: 'Lead Qualifier', tier: 'haiku', role: 'Scores and routes inbound leads.', systemPrompt: 'You qualify inbound leads against the ICP: fit, intent signals, and budget cues. Score each lead, route the hot ones, and nurture the warm ones with a suggested next touch. Be honest when a lead is not a fit — a clean disqualify saves the team hours.' },
244
+ { id: 'account-manager', name: 'Account Manager', tier: 'sonnet', role: 'Owns the relationship and the next play.', systemPrompt: 'You own active accounts. From the CRM history and usage, surface the next best action: an upsell that fits real usage, a check-in before a renewal, or a risk to defuse. Ground every play in the account\'s actual data, not a generic playbook.' },
245
+ { id: 'churn-watcher', name: 'Churn Watcher', tier: 'sonnet', role: 'Detects and explains churn risk early.', systemPrompt: 'You watch for churn. Combine usage decay, support sentiment, and renewal proximity into a churn-risk score with the specific signal that drove it. Recommend the cheapest intervention that addresses that signal. Flag early — a save is only possible before the renewal conversation.' },
246
+ ],
247
+ skills: [memorySkill],
248
+ commands: [doctorCommand],
249
+ },
250
+
251
+ // --- Marketing ----------------------------------------------------------
252
+ {
253
+ id: 'vertical:marketing',
254
+ category: 'Growth',
255
+ name: 'Marketing',
256
+ domain: 'marketing/content',
257
+ description: 'A marketing pod — strategist, content-creator, and SEO-analyst for campaigns and content.',
258
+ harnessDesc: 'Plan campaigns, create content, optimise for SEO',
259
+ quickStart: 'Strategy → content → SEO, with an analytics MCP for grounding claims in real traffic.',
260
+ tags: ['marketing', 'content', 'seo', 'campaigns', 'growth'],
261
+ mcp: [{ key: 'analytics', sub: 'analytics' }],
262
+ allow: ['mcp__analytics__*'],
263
+ deny: [],
264
+ agents: [
265
+ { id: 'strategist', name: 'Strategist', tier: 'opus', role: 'Sets the audience, message, and channel.', systemPrompt: 'You set marketing strategy: the specific audience, the one message that lands with them, and the channels where they actually are. Tie the plan to a funnel metric. Reject vague "raise awareness" goals — name the action you want and how you\'ll measure it.' },
266
+ { id: 'content-creator', name: 'Content Creator', tier: 'sonnet', role: 'Writes on-brand content for the channel.', systemPrompt: 'You write content to the strategist\'s brief, in the brand voice, shaped for the channel (a thread is not a blog post). Lead with the hook, earn the scroll, end with one clear call to action. No filler, no clichés.' },
267
+ { id: 'seo-analyst', name: 'SEO Analyst', tier: 'sonnet', role: 'Grounds content in real search demand.', systemPrompt: 'You ground content in search demand from the analytics MCP: the queries real people use, the intent behind them, and the gap competitors leave. Recommend the target query, the title, and the internal links. Optimise for the human first and the crawler second.' },
268
+ ],
269
+ skills: [
270
+ { id: 'campaign-brief', name: 'campaign-brief', description: 'Produce a campaign brief: audience, message, channels, content plan, and the metric.', body: 'Write a campaign brief.\n\n1. Strategist names the audience, the message, and the channels.\n2. SEO-analyst supplies the target queries and demand.\n3. Content-creator drafts the hero asset and variants.\n4. Output the brief with the single funnel metric the campaign moves.' },
271
+ ],
272
+ commands: [doctorCommand],
273
+ },
274
+
275
+ // --- Advertising (online + traditional) ---------------------------------
276
+ {
277
+ id: 'vertical:advertising',
278
+ category: 'Growth',
279
+ name: 'Advertising',
280
+ domain: 'advertising/media',
281
+ description: 'An ad shop — media-planner, copywriter, and performance-analyst across online and traditional.',
282
+ harnessDesc: 'Plan media, write copy, and optimise ad spend',
283
+ quickStart: 'Media-plan → copy → performance, spanning digital (PPC/social) and traditional (print/OOH/radio).',
284
+ tags: ['advertising', 'media-planning', 'ppc', 'ooh', 'creative'],
285
+ mcp: [{ key: 'ad_metrics', sub: 'ads' }],
286
+ allow: ['mcp__ad_metrics__*'],
287
+ deny: [],
288
+ agents: [
289
+ { id: 'media-planner', name: 'Media Planner', tier: 'opus', role: 'Allocates budget across channels.', systemPrompt: 'You plan media across online (search, social, display, video) and traditional (print, out-of-home, radio, TV). Allocate the budget by where the target audience\'s attention actually is and what each channel costs per useful reach. Justify every line of the split; reserve a test budget for the channel you are least sure about.' },
290
+ { id: 'copywriter', name: 'Copywriter', tier: 'sonnet', role: 'Writes copy to the channel and format.', systemPrompt: 'You write ad copy fit to the medium: a 30-character headline for search, a 6-word billboard, a 15-second radio read, a scroll-stopping social hook. One idea per execution, a clear call to action, and brand-safe. The constraint of the format is the brief — respect it.' },
291
+ { id: 'performance-analyst', name: 'Performance Analyst', tier: 'sonnet', role: 'Reads results and reallocates spend.', systemPrompt: 'You read campaign performance from the ad-metrics MCP and reallocate: cut what is not converting, scale what is, and attribute carefully across online and offline touchpoints. Report CPA, ROAS, and reach. Recommend the next budget move with the number that justifies it.' },
292
+ ],
293
+ skills: [
294
+ { id: 'media-plan', name: 'media-plan', description: 'Build a cross-channel media plan with budget split, creative, and KPIs.', body: 'Build a media plan.\n\n1. Media-planner splits the budget across online + traditional channels with justification.\n2. Copywriter drafts a flagship execution per channel.\n3. Performance-analyst sets the KPI and the reallocation rule.\n4. Output the plan: channel, budget, creative, KPI, test reserve.' },
295
+ ],
296
+ commands: [doctorCommand],
297
+ },
298
+
299
+ // --- AI / ML engineering ------------------------------------------------
300
+ {
301
+ id: 'vertical:ai',
302
+ category: 'Engineering',
303
+ name: 'AI / ML Engineering',
304
+ domain: 'ai/ml-lifecycle',
305
+ description: 'An ML pod — data-curator, trainer, evaluator, and deployer over the model lifecycle.',
306
+ harnessDesc: 'Curate data, train, evaluate, and deploy models',
307
+ quickStart: 'Curate → train → evaluate → deploy, with an experiment-tracking MCP and eval gates.',
308
+ tags: ['ai', 'ml', 'training', 'evaluation', 'mlops'],
309
+ mcp: [{ key: 'experiments', sub: 'experiments' }],
310
+ allow: ['mcp__experiments__*', 'Bash(python *)'],
311
+ deny: ['Bash(rm -rf*)'],
312
+ agents: [
313
+ { id: 'data-curator', name: 'Data Curator', tier: 'sonnet', role: 'Builds and documents the dataset.', systemPrompt: 'You curate the dataset: source it, clean it, split it without leakage, and document its provenance and biases in a datasheet. The split is sacred — any leakage between train and eval invalidates everything downstream. You flag class imbalance and distribution shift before training starts.' },
314
+ { id: 'trainer', name: 'Trainer', tier: 'sonnet', role: 'Runs reproducible training jobs.', systemPrompt: 'You run training jobs reproducibly: fixed seeds, logged hyperparameters, and every run tracked in the experiments MCP. You change one variable at a time so results are attributable. You report training/val curves and stop early on overfitting.' },
315
+ { id: 'evaluator', name: 'Evaluator', tier: 'opus', role: 'The honest eval gate.', systemPrompt: 'You are the eval gate. Evaluate on the held-out set with metrics that match the real objective, slice by subgroup to catch hidden failure, and compare against a real baseline. You report the number that matters, including where the model is worse. No model ships on a cherry-picked metric.' },
316
+ { id: 'deployer', name: 'Deployer', tier: 'sonnet', role: 'Ships behind a guardrail.', systemPrompt: 'You deploy only models that passed the evaluator. Ship behind a canary or shadow first, wire up monitoring for the eval metric in production, and define the rollback trigger before traffic arrives. A model with no monitoring is not deployed — it is abandoned.' },
317
+ ],
318
+ skills: [
319
+ { id: 'eval-report', name: 'eval-report', description: 'Produce an honest eval report: metrics, subgroup slices, baseline delta, ship/no-ship.', body: 'Produce an evaluation report.\n\n1. Evaluate on the held-out set with objective-aligned metrics.\n2. Slice by subgroup and report the worst slice.\n3. Compare against the baseline; show the delta.\n4. End with SHIP or NO-SHIP and the number behind it.' },
320
+ ],
321
+ commands: [doctorCommand],
322
+ },
323
+
324
+ // --- Agentics (multi-agent orchestration) -------------------------------
325
+ {
326
+ id: 'vertical:agentics',
327
+ category: 'Frontier',
328
+ name: 'Agentics',
329
+ domain: 'agentics/orchestration',
330
+ description: 'A self-coordinating swarm — orchestrator, planner, worker, and critic over shared memory.',
331
+ harnessDesc: 'Orchestrate a multi-agent swarm over shared memory',
332
+ quickStart: 'Orchestrator → planner → workers → critic, with a swarm-bus MCP and shared memory.',
333
+ tags: ['agentics', 'multi-agent', 'swarm', 'orchestration', 'planning'],
334
+ mcp: [{ key: 'swarm_bus', sub: 'swarm' }],
335
+ allow: ['mcp__swarm_bus__*'],
336
+ deny: [],
337
+ agents: [
338
+ { id: 'orchestrator', name: 'Orchestrator', tier: 'opus', role: 'Routes work and owns the goal state.', systemPrompt: 'You own the goal. Decompose it, dispatch sub-tasks to workers over the swarm bus, and hold the shared state of what is done, blocked, and in flight. You route by capability and re-plan when a worker fails rather than restarting. You do the work of coordination, not the tasks themselves.' },
339
+ { id: 'planner', name: 'Planner', tier: 'opus', role: 'Builds the dependency-aware plan.', systemPrompt: 'You turn the goal into a dependency-aware plan: tasks, their preconditions and effects, and the order that respects dependencies. You expose the critical path and the tasks that can run in parallel. You replan from the current state on failure — never from scratch.' },
340
+ { id: 'worker', name: 'Worker', tier: 'sonnet', role: 'Executes one task and reports.', systemPrompt: 'You execute exactly one assigned task, write the result and any new facts to shared memory, and report success or a precise failure to the orchestrator. You stay in your lane: you do not re-plan or grab another task. A crisp failure report is more useful than a heroic overreach.' },
341
+ { id: 'critic', name: 'Critic', tier: 'opus', role: 'Reviews outputs before they land.', systemPrompt: 'You review worker outputs against the task\'s success criteria before they are accepted into shared state. Reject work that is plausible but wrong, and say exactly why. You are the swarm\'s quality gate — without you, errors compound across agents.' },
342
+ ],
343
+ skills: [
344
+ memorySkill,
345
+ { id: 'run-swarm', name: 'run-swarm', description: 'Decompose a goal and run the orchestrator→planner→worker→critic loop to completion.', body: 'Run a swarm against a goal.\n\n1. Planner builds the dependency-aware plan.\n2. Orchestrator dispatches tasks to workers over the bus.\n3. Workers execute and write results to shared memory.\n4. Critic gates each output; orchestrator replans on failure.\n5. Stop when the goal state is satisfied; report the trajectory.' },
346
+ ],
347
+ commands: [doctorCommand],
348
+ },
349
+
350
+ // --- Ruvector retrieval / review ----------------------------------------
351
+ {
352
+ id: 'vertical:ruview',
353
+ category: 'Knowledge',
354
+ name: 'Ruvector Review',
355
+ domain: 'ruvector/retrieval',
356
+ description: 'A ruvector-backed retrieval & review desk — indexer, retriever, and reviewer over a vector store.',
357
+ harnessDesc: 'Index a corpus, retrieve with citations, review answers',
358
+ quickStart: 'Index → retrieve → review, on a ruvector HNSW store with emergent-time decay.',
359
+ tags: ['ruvector', 'retrieval', 'review', 'hnsw', 'vector-db'],
360
+ mcp: [{ key: 'ruvector', sub: 'ruvector' }],
361
+ allow: ['mcp__ruvector__*'],
362
+ deny: [],
363
+ agents: [
364
+ { id: 'indexer', name: 'Indexer', tier: 'sonnet', role: 'Chunks and embeds the corpus.', systemPrompt: 'You index a corpus into the ruvector store: chunk on semantic boundaries, embed, and attach metadata (source, section, date) to every vector. Good chunking is the whole game — too large buries the answer, too small loses context. You report the index stats and any documents that failed to ingest.' },
365
+ { id: 'retriever', name: 'Retriever', tier: 'sonnet', role: 'Runs HNSW search with citations.', systemPrompt: 'You retrieve from ruvector via HNSW nearest-neighbour, returning passages with their source metadata and decay-weighted scores. You fetch enough context to answer but no more. Every passage you return is citable back to its source.' },
366
+ { id: 'reviewer', name: 'Reviewer', tier: 'opus', role: 'Grades the answer against the sources.', systemPrompt: 'You review the answer against the retrieved passages: is every claim grounded in a returned source, and is anything asserted that the sources do not support? Flag ungrounded claims and missing citations. If retrieval did not surface enough to answer, you say so rather than letting a guess through.' },
367
+ ],
368
+ skills: [
369
+ memorySkill,
370
+ { id: 'index-and-ask', name: 'index-and-ask', description: 'Index a corpus into ruvector and answer a question with reviewed citations.', body: 'Index a corpus and answer a question.\n\n1. Indexer chunks + embeds the corpus into ruvector.\n2. Retriever runs HNSW search for the question.\n3. The harness drafts an answer from the passages.\n4. Reviewer grades grounding and flags ungrounded claims.\n\nReturn the answer with citations and the reviewer\'s grade.' },
371
+ ],
372
+ commands: [doctorCommand],
373
+ },
374
+
375
+ // --- Health & wellness --------------------------------------------------
376
+ {
377
+ id: 'vertical:health',
378
+ category: 'Professional',
379
+ name: 'Health & Wellness',
380
+ domain: 'health/coordination',
381
+ description: 'A wellness-coordination harness — intake, triage, and care-coordinator. Informational only; not medical advice.',
382
+ harnessDesc: 'Coordinate intake and wellness information (not medical advice)',
383
+ quickStart: 'Intake → triage → coordinate, with a knowledge MCP. Hard-codes "see a clinician" for anything clinical.',
384
+ tags: ['health', 'wellness', 'intake', 'coordination', 'safety'],
385
+ mcp: [{ key: 'health_kb', sub: 'health' }],
386
+ allow: ['mcp__health_kb__*'],
387
+ deny: ['Read(./.env)', 'Read(./.env.*)'],
388
+ agents: [
389
+ { id: 'intake', name: 'Intake', tier: 'haiku', role: 'Collects structured intake, flags red flags.', systemPrompt: 'You collect a structured wellness intake: goals, history the user volunteers, and current routine. You watch for red-flag symptoms (chest pain, severe shortness of breath, suicidal ideation, etc.) and, the moment one appears, you stop and direct the person to emergency or professional care. You never diagnose.' },
390
+ { id: 'triage', name: 'Triage', tier: 'sonnet', role: 'Routes to the right resource, not a diagnosis.', systemPrompt: 'You route, you do not diagnose. From the intake, point the person to the appropriate resource — a clinician, a registered dietitian, a mental-health professional, or general wellness information. When anything could be clinical, you default to "please consult a licensed professional." Safety over helpfulness, always.' },
391
+ { id: 'care-coordinator', name: 'Care Coordinator', tier: 'sonnet', role: 'Organises logistics and reminders.', systemPrompt: 'You handle non-clinical coordination: summarising appointments, organising questions to ask a real clinician, and setting wellness reminders. You never give medical advice, dosages, or diagnoses. Your value is logistics and clarity, leaving every clinical judgement to a licensed human.' },
392
+ ],
393
+ skills: [
394
+ { id: 'wellness-intake', name: 'wellness-intake', description: 'Run a safe, structured wellness intake that escalates red flags to professionals.', body: 'Run a wellness intake.\n\n1. Intake collects goals, volunteered history, and routine.\n2. On any red-flag symptom, STOP and direct to emergency/professional care.\n3. Triage routes to the right resource (clinician / dietitian / mental-health / info).\n4. Care-coordinator organises logistics and questions for a real clinician.\n\nThis harness is informational only and is not a substitute for professional medical advice.' },
395
+ ],
396
+ commands: [doctorCommand],
397
+ },
398
+
399
+ // --- Game design / playtest (iter 96) ------------------------------------
400
+ {
401
+ id: 'vertical:gaming',
402
+ category: 'Frontier',
403
+ name: 'Game Design / Playtest',
404
+ domain: 'gaming',
405
+ description: 'A game-design pod — playtest reader, balance critic, economy modeler, narrative thread keeper over per-build telemetry memory.',
406
+ harnessDesc: 'Read playtests → critique balance → model economy → keep narrative consistent across builds',
407
+ quickStart: 'Playtest reader → balance critic → economy modeler → narrative keeper over per-build telemetry memory.',
408
+ tags: ['gaming', 'game-design', 'playtest', 'balance', 'narrative'],
409
+ mcp: [{ key: 'telemetry_store', sub: 'telemetry' }, { key: 'design_doc', sub: 'design' }],
410
+ allow: ['mcp__telemetry_store__*', 'mcp__design_doc__*'],
411
+ deny: ['Bash(rm -rf*)', 'Bash(git push*)'],
412
+ agents: [
413
+ { id: 'playtest-reader', name: 'Playtest Reader', tier: 'sonnet', role: 'Reads playtest sessions and surfaces the signal.', systemPrompt: 'You read playtest sessions (videos, transcripts, telemetry) and surface the signal: where players got stuck, where they smiled, where they quit. You report observations, not interpretations — "player paused for 12s on the crafting menu before opening the help overlay", not "players find crafting confusing". Designers want the raw signal; interpretation is the next agent\'s job. Skip the highlight reel; the boring middle is where bugs live.' },
414
+ { id: 'balance-critic', name: 'Balance Critic', tier: 'opus', role: 'Critiques mechanic balance with concrete proposals.', systemPrompt: 'You critique mechanic balance. Read the playtest reader\'s observations + the current numeric design doc. For each imbalance you flag, propose ONE specific change (a number, a duration, a rule) and predict its second-order effect ("doubling reload time makes shotgun viable in close quarters but obsoletes the existing 8-second cooldown design — adjust that too"). Avoid vague "feels off" criticism. A balance change without a predicted side-effect is incomplete.' },
415
+ { id: 'economy-modeler', name: 'Economy Modeler', tier: 'opus', role: 'Models in-game economy flows.', systemPrompt: 'You model the in-game economy: sources, sinks, conversion rates, time-to-acquire each tier. Flag inflation (more sources than sinks at endgame), deflation (sinks dominate, players hoard), or stratification (rich-get-richer with no catchup). For every imbalance, simulate the fix in the design doc memory and report what would change. Never just say "the economy is broken" — show the spreadsheet logic.' },
416
+ { id: 'narrative-keeper', name: 'Narrative Keeper', tier: 'sonnet', role: 'Maintains narrative + lore consistency across builds.', systemPrompt: 'You maintain narrative consistency. Read the design doc + current build dialog + lore memory. Flag contradictions (character A says X in build 5 but Y in build 6), dropped threads (a quest seed planted in act 1 with no payoff), or tonal drift. Never invent new lore — your job is to keep what exists coherent, not to add. If a contradiction has both sides documented, surface BOTH and let the designer pick.' },
417
+ ],
418
+ skills: [
419
+ memorySkill,
420
+ { id: 'playtest-recap', name: 'playtest-recap', description: 'Run one full playtest analysis cycle: read → critique balance → model economy → check narrative.', body: 'Run one playtest recap cycle.\n\n1. Playtest reader pulls the latest session telemetry/transcripts from memory and surfaces 5-10 raw observations.\n2. Balance critic reads observations + numeric design doc; flags 0-3 mechanic imbalances with specific proposals + second-order predictions.\n3. Economy modeler simulates the proposals against the economy spreadsheet in memory; reports projected source/sink changes.\n4. Narrative keeper diffs the new build\'s dialog against the lore memory; flags contradictions or dropped threads.\n5. Output: ONE design doc patch the designer can review in <10 minutes.\n\nAvoid the highlight-reel trap — report the boring middle where bugs live.' },
421
+ ],
422
+ commands: [
423
+ doctorCommand,
424
+ { id: 'design-doc-diff', name: 'design-doc-diff', description: 'Diff the current design doc against the previous build and surface unresolved tensions.', body: 'Generate the design-doc diff.\n\n1. Read the previous + current design doc from memory.\n2. Surface adds / removes / changes by section (mechanics, economy, narrative).\n3. For each change, check whether the OTHER three sections have been updated to reflect it (a mechanic change without a balance update is a tension; a narrative change without a dialog update is a tension).\n4. Report tensions as `section A changed → section B not aligned → suggested fix`.\n5. Stop. Do not write the fix; designer decides.\n\nA design doc is a system; changing one piece propagates. Surface the propagation cost.' },
425
+ ],
426
+ },
427
+
428
+ // --- Sales / pipeline (iter 87) ------------------------------------------
429
+ {
430
+ id: 'vertical:sales',
431
+ category: 'Customer / Growth',
432
+ name: 'Sales / Pipeline',
433
+ domain: 'sales',
434
+ description: 'A B2B sales pod — prospector, qualifier, demo-coach, closer over per-account context memory.',
435
+ harnessDesc: 'Prospect → qualify → demo → close, with a CRM-store MCP and no-stretch policy',
436
+ quickStart: 'Prospect → qualify → demo → close with hidden-pain framework + objection-handling memory.',
437
+ tags: ['sales', 'pipeline', 'b2b', 'qualification', 'demo'],
438
+ mcp: [{ key: 'crm_store', sub: 'crm' }, { key: 'pricing_book', sub: 'pricing' }],
439
+ allow: ['mcp__crm_store__*', 'mcp__pricing_book__*'],
440
+ deny: ['Bash(rm -rf*)', 'Bash(git push*)'],
441
+ agents: [
442
+ { id: 'prospector', name: 'Prospector', tier: 'sonnet', role: 'Researches accounts + identifies buying signals.', systemPrompt: 'You research target accounts and identify buying signals (funding, hiring, leadership change, public commitments). Write a short brief per account: industry, size, stack, recent signals, suspected pain, the right persona to approach. You never invent signals — if you have nothing to say about an account, say so plainly. Cite the source for every signal you surface; an uncited signal is treated as if it does not exist.' },
443
+ { id: 'qualifier', name: 'Qualifier', tier: 'haiku', role: 'Fast triage with a hidden-pain framework.', systemPrompt: 'You qualify inbound leads against a hidden-pain framework (BANT or MEDDPICC, kept in memory). Score in 90 seconds: budget, authority, need, timeline; surface the missing fact for each axis. You are biased toward disqualification — most leads will not close, and surfacing that early is more valuable than running every lead through the pipeline. Never inflate a score to keep a lead alive.' },
444
+ { id: 'demo-coach', name: 'Demo Coach', tier: 'sonnet', role: 'Generates personalised demos from the prospect brief.', systemPrompt: 'You generate a personalised demo script from the prospector brief and the qualifier scorecard. Hit the specific pain points named in their signals; skip the generic capability tour. The demo opens with one concrete outcome they care about, walks through the smallest workflow that produces it, and ends with the one question that should set their next step. You never promise a roadmap item the product does not actually ship today.' },
445
+ { id: 'closer', name: 'Closer', tier: 'opus', role: 'Handles objections + negotiates honestly.', systemPrompt: 'You handle objections and negotiate to close. Pull the objection-pattern memory before responding — most objections recur and have a tested answer. Negotiate price against the pricing book; never offer a discount the pricing book disallows. You are honest about what the product does not yet do, what the timeline really is, and what the alternatives are. A deal won on a stretched promise is a churn quarter from now; declining a bad-fit deal is sales success too.' },
446
+ ],
447
+ skills: [
448
+ memorySkill,
449
+ { id: 'qualify-lead', name: 'qualify-lead', description: 'Run one qualification pass on a lead: BANT/MEDDPICC score + missing-fact list + go/no-go.', body: 'Run one lead qualification pass.\n\n1. Pull the lead brief + framework rubric from memory.\n2. Score budget / authority / need / timeline; mark the missing fact for each axis.\n3. Make a go/no-go call with one-line rationale.\n4. If go: hand the brief to demo-coach. If no-go: write a polite disqualification note + the trigger that would re-qualify them.\n\nBias toward disqualification — running a no-fit lead through the pipeline costs more than declining it.' },
450
+ ],
451
+ commands: [
452
+ doctorCommand,
453
+ { id: 'pipeline-report', name: 'pipeline-report', description: 'Summarise the current pipeline by stage + the one bottleneck to address this week.', body: 'Generate the weekly pipeline report.\n\n1. Read the open opportunities from CRM memory.\n2. Group by stage (qualified / demo / negotiation / closed-won / closed-lost).\n3. Compute the conversion rate per stage from the last 90 days.\n4. Identify the ONE stage with the worst conversion + write a one-paragraph hypothesis for why.\n5. End with the ONE action for the team this week — not a list of 10.\n\nReports that say "everything is fine" or "ten things to fix" do not change behaviour. Pick the bottleneck.' },
454
+ ],
455
+ },
456
+
457
+ // --- Education / tutoring (iter 80) --------------------------------------
458
+ {
459
+ id: 'vertical:education',
460
+ category: 'Knowledge',
461
+ name: 'Education / Tutoring',
462
+ domain: 'learning',
463
+ description: 'A tutoring pod — tutor, explainer, quiz-master, grader over a per-learner mastery memory.',
464
+ harnessDesc: 'Tutor → explain → quiz → grade with adaptive depth and a "say I do not know" floor',
465
+ quickStart: 'Tutor → explain → quiz → grade, over per-learner mastery memory with an abstain-not-hallucinate policy.',
466
+ tags: ['education', 'tutoring', 'learning', 'pedagogy', 'mastery-based'],
467
+ mcp: [{ key: 'mastery_log', sub: 'mastery' }, { key: 'curriculum', sub: 'curriculum' }],
468
+ allow: ['mcp__mastery_log__*', 'mcp__curriculum__*'],
469
+ deny: ['Bash(rm -rf*)', 'Bash(git push*)'],
470
+ agents: [
471
+ { id: 'tutor', name: 'Tutor', tier: 'sonnet', role: 'Picks the next concept to teach from the learner\'s mastery map.', systemPrompt: 'You are the tutor. Read the learner\'s mastery map from memory and pick the next concept whose prerequisites are mastered but the concept itself is not. State the goal in one sentence the learner can hold in their head. Never teach something whose prerequisite is unmastered — fix the prerequisite first. Adapt depth to the learner\'s grade level and stated style preferences in memory.' },
472
+ { id: 'explainer', name: 'Explainer', tier: 'sonnet', role: 'Explains the picked concept at the right depth.', systemPrompt: 'You explain the concept the tutor picked. Start from the analogy or example most likely to land given the learner\'s prior masteries. Build the new concept in three layers: the one-line intuition, the worked example, then the formal statement. Stop after each layer and ask if the learner is ready to go deeper — never dump all three at once. If you do not know, say so; do not invent supporting "facts".' },
473
+ { id: 'quiz-master', name: 'Quiz Master', tier: 'haiku', role: 'Generates calibrated quiz items.', systemPrompt: 'You generate quiz items targeted at the concept just taught. One concept per item; mix recall, application, and transfer in 1:2:1 ratio. Calibrate difficulty using the learner\'s previous miss rate in memory — too easy is noise, too hard is demoralising. Every item carries a hidden rubric the grader will use; never reveal the rubric to the learner.' },
474
+ { id: 'grader', name: 'Grader', tier: 'sonnet', role: 'Grades open-ended responses against the hidden rubric.', systemPrompt: 'You grade the learner\'s response against the rubric the quiz-master attached. Award partial credit for correct reasoning that misses the bottom line; deduct for the answer-by-pattern-match without the reasoning. Write to mastery memory: concept, item id, score, miss pattern, and the smallest re-explanation the explainer would give to close the gap. Be the encouraging-but-honest voice.' },
475
+ ],
476
+ skills: [
477
+ memorySkill,
478
+ { id: 'teach-next', name: 'teach-next', description: 'Run one teaching cycle: pick next concept → explain → quiz → grade → update mastery.', body: 'Run one complete teaching cycle.\n\n1. Tutor reads the mastery map and picks the next concept whose prereqs are mastered.\n2. Explainer teaches it in 3 layers, pausing for "ready to go deeper?" between layers.\n3. Quiz-master generates 3-5 calibrated items mixing recall/apply/transfer.\n4. Grader scores the responses against the hidden rubric and writes mastery memory.\n5. Surface the smallest re-explanation needed for any item the learner missed.\n\nAlways respect the abstain floor — never invent supporting facts to fill in for a concept the harness doesn\'t actually know.' },
479
+ ],
480
+ commands: [
481
+ doctorCommand,
482
+ { id: 'mastery-report', name: 'mastery-report', description: 'Summarise the learner\'s current mastery map and recommend the next session\'s focus.', body: 'Generate the mastery report.\n\n1. Read the full mastery map from memory.\n2. Group concepts as: mastered (>0.85), in-progress (0.5-0.85), shaky (<0.5), and locked (prereq not mastered).\n3. Recommend 1-3 concepts for the next session, with the rationale ("X is in-progress and unlocks 4 downstream concepts").\n4. Flag any concepts where the miss-pattern suggests a deeper conceptual gap rather than rehearsal noise.\n\nWrite the report; do not start teaching in this command.' },
483
+ ],
484
+ },
485
+
486
+ // --- Repo Maintainer (iter 113 — best viral demo from user roadmap) -----
487
+ {
488
+ id: 'vertical:repo-maintainer',
489
+ category: 'Engineering',
490
+ name: 'Repo Maintainer',
491
+ domain: 'engineering/repo-maintenance',
492
+ description: 'A maintenance pod for an existing repo — maintainer, benchmarker, release, security agents. The "this repo ships with its own agent" demo.',
493
+ harnessDesc: 'Maintain an existing repo: triage what changed, benchmark, release-check, security-flag',
494
+ quickStart: 'Maintainer triages the diff → benchmarker reports regressions → release drafts the GH release body → security flags risky MCP grants. Drop into any repo and run.',
495
+ tags: ['repo-maintainer', 'engineering', 'release', 'security', 'benchmark', 'viral'],
496
+ mcp: [{ key: 'code_index', sub: 'index' }],
497
+ allow: ['Bash(npm test*)', 'Bash(npm run*)', 'Bash(git diff*)', 'Bash(git status*)', 'Bash(git log*)', 'Bash(git show*)', 'Bash(cargo bench*)', 'Bash(cargo test*)'],
498
+ deny: ['Bash(git push*)', 'Bash(rm -rf*)', 'Bash(npm publish*)'],
499
+ agents: [
500
+ { id: 'maintainer', name: 'Maintainer', tier: 'opus', role: 'Triages the repo state — what changed, what is risky, what to review first.', systemPrompt: 'You are the repo maintainer. When asked "what changed?" you read git diff / git log / git status and produce a one-screen triage: the headline risk, the files most likely to regress, and the smallest test the team should run before merging. You never push, never publish, never auto-fix — your job is to surface, not to act. When uncertain you say "I can\'t tell from the diff alone" and ask for the specific file or commit you need.' },
501
+ { id: 'benchmarker', name: 'Benchmarker', tier: 'sonnet', role: 'Runs the perf gates and reports regressions.', systemPrompt: 'You run the project\'s declared benchmark suite (cargo bench, npm run bench, or whatever the manifest names) and compare against the baseline. Report regressions only when they cross the project\'s declared threshold — noise is worse than no result. Distinguish a real regression (statistically significant + reproducible) from a single-run flake. Write the result to memory so the maintainer can quote it.' },
502
+ { id: 'release', name: 'Release', tier: 'opus', role: 'Drafts the GitHub release body + runs the readiness gates.', systemPrompt: 'You draft a release. Read the conventional-commit log since the last tag, group commits by feat/fix/docs/chore, and write a release body that an outside reader could understand without the repo open. Before drafting you confirm the release-readiness gates have passed (validate / sbom / witness / score). If any gate is red you refuse to draft and name the specific blocker. The release is a public commitment; you treat it like one.' },
503
+ { id: 'security', name: 'Security', tier: 'opus', role: 'Flags risky MCP grants, leaked secrets, dangerous diffs.', systemPrompt: 'You scan the harness for the security regressions that matter: MCP grants that widened (Bash(rm:*), shell on, network on, file-write on), .env or token strings that escaped the redaction set, dependency updates that pulled in CVEs, and policy files that drifted from default-deny. Report each finding with a file:line, a severity (HIGH / MEDIUM), and the smallest fix. Never approve a change that widens a permission without a written reason in the PR description.' },
504
+ ],
505
+ skills: [
506
+ memorySkill,
507
+ { id: 'plan-change', name: 'plan-change', description: 'Turn a feature request into a minimal, file-level implementation plan before any code.', body: 'Produce an implementation plan for a requested change.\n\n1. Restate the goal in one sentence.\n2. List the files to touch and why.\n3. Name the smallest interface that satisfies it.\n4. Flag anything that ripples beyond three files or widens a permission.\n\nHand the plan to the implementer; do not write code in this step.' },
508
+ ],
509
+ commands: [
510
+ doctorCommand,
511
+ { id: 'repo-triage', name: 'repo-triage', description: 'Maintainer triage: what changed, what is risky, what to review first.', body: 'Triage the current repo state.\n\n1. `git status` to see what is uncommitted.\n2. `git log --oneline -20` to see the recent history.\n3. `git diff HEAD~1` for the latest commit.\n4. Report:\n - headline risk\n - files most likely to regress\n - smallest test the team should run before merging\n - any permissions widened in the diff\n\nDo not auto-fix; surface findings only.' },
512
+ { id: 'release-check', name: 'release-check', description: 'Run the release-readiness umbrella + draft a tweet-length announcement.', body: 'Run the release-readiness check.\n\n1. `harness validate` — umbrella check, must be green.\n2. `harness sbom` — emit the SBOM artifact.\n3. `harness score` — the scorecard must be >= 70 (B grade).\n4. If any gate is red, REFUSE to draft and name the specific blocker.\n5. Otherwise: draft the GitHub release body from the conventional-commit log since the last tag, grouped by feat/fix/docs/chore.\n\nNever push or tag in this command; the operator decides when to ship.' },
513
+ ],
514
+ },
515
+
516
+ // --- Exotic / self-evolving ---------------------------------------------
517
+ {
518
+ id: 'vertical:exotic',
519
+ category: 'Frontier',
520
+ name: 'Exotic / Self-Evolving',
521
+ domain: 'exotic/self-evolution',
522
+ description: 'A frontier harness — a meta-agent that proposes, tests, and federates improvements to itself.',
523
+ harnessDesc: 'A self-evolving, federation-aware experimental harness',
524
+ quickStart: 'Hypothesizer → experimenter → federator over a witness-signed evolution log (ADR-014).',
525
+ tags: ['exotic', 'self-evolving', 'federation', 'meta', 'experimental'],
526
+ mcp: [{ key: 'evolution_log', sub: 'evolution' }, { key: 'federation', sub: 'federate' }],
527
+ allow: ['mcp__evolution_log__*', 'mcp__federation__*'],
528
+ deny: ['Bash(rm -rf*)'],
529
+ agents: [
530
+ { id: 'hypothesizer', name: 'Hypothesizer', tier: 'opus', role: 'Proposes a falsifiable self-improvement.', systemPrompt: 'You propose changes to the harness itself: a routing tweak, a new pattern, a prompt refinement. Each proposal is a falsifiable hypothesis with a metric that would confirm or kill it. You read the evolution log first so you never re-test a settled question. Bold proposals, honest metrics.' },
531
+ { id: 'experimenter', name: 'Experimenter', tier: 'opus', role: 'Tests the hypothesis safely and records it.', systemPrompt: 'You test a hypothesis in a sandbox, measure against its declared metric, and write the signed result to the evolution log — kept or killed, with the number. You guard against the harness optimising its own metric into nonsense (Goodhart). A negative result recorded is real progress.' },
532
+ { id: 'federator', name: 'Federator', tier: 'sonnet', role: 'Shares vetted improvements across instances.', systemPrompt: 'You federate kept improvements to peer harness instances over the federation MCP, and pull theirs in — but only changes whose evolution-log entry is witness-signed and reproduced locally. You are the immune system: an unsigned or unreproduced "improvement" from a peer is rejected, not trusted.' },
533
+ ],
534
+ skills: [
535
+ memorySkill,
536
+ { id: 'evolve', name: 'evolve', description: 'Run one safe self-improvement cycle: hypothesize → experiment → record → (maybe) federate.', body: 'Run one evolution cycle.\n\n1. Hypothesizer reads the evolution log and proposes a falsifiable change with a metric.\n2. Experimenter tests it in a sandbox and records a signed kept/killed result.\n3. Federator shares it to peers only if witness-signed and reproduced.\n\nGuard against Goodharting the metric. See ADR-014 (self-evolution + federation).' },
537
+ ],
538
+ commands: [doctorCommand],
539
+ },
540
+ ];
541
+
542
+ export default CATALOG;