metaharness 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +73 -0
  3. package/dist/analyze-repo.d.ts +74 -0
  4. package/dist/analyze-repo.d.ts.map +1 -0
  5. package/dist/analyze-repo.js +329 -0
  6. package/dist/analyze-repo.js.map +1 -0
  7. package/dist/audit-cmd.d.ts +6 -0
  8. package/dist/audit-cmd.d.ts.map +1 -0
  9. package/dist/audit-cmd.js +139 -0
  10. package/dist/audit-cmd.js.map +1 -0
  11. package/dist/bin.d.ts +3 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +8 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/compare-cmd.d.ts +56 -0
  16. package/dist/compare-cmd.d.ts.map +1 -0
  17. package/dist/compare-cmd.js +173 -0
  18. package/dist/compare-cmd.js.map +1 -0
  19. package/dist/completions-cmd.d.ts +6 -0
  20. package/dist/completions-cmd.d.ts.map +1 -0
  21. package/dist/completions-cmd.js +171 -0
  22. package/dist/completions-cmd.js.map +1 -0
  23. package/dist/diag.d.ts +76 -0
  24. package/dist/diag.d.ts.map +1 -0
  25. package/dist/diag.js +349 -0
  26. package/dist/diag.js.map +1 -0
  27. package/dist/eject.d.ts +33 -0
  28. package/dist/eject.d.ts.map +1 -0
  29. package/dist/eject.js +147 -0
  30. package/dist/eject.js.map +1 -0
  31. package/dist/export-config.d.ts +25 -0
  32. package/dist/export-config.d.ts.map +1 -0
  33. package/dist/export-config.js +134 -0
  34. package/dist/export-config.js.map +1 -0
  35. package/dist/external-template.d.ts +19 -0
  36. package/dist/external-template.d.ts.map +1 -0
  37. package/dist/external-template.js +37 -0
  38. package/dist/external-template.js.map +1 -0
  39. package/dist/federate.d.ts +37 -0
  40. package/dist/federate.d.ts.map +1 -0
  41. package/dist/federate.js +167 -0
  42. package/dist/federate.js.map +1 -0
  43. package/dist/genome-scorers.d.ts +33 -0
  44. package/dist/genome-scorers.d.ts.map +1 -0
  45. package/dist/genome-scorers.js +115 -0
  46. package/dist/genome-scorers.js.map +1 -0
  47. package/dist/genome.d.ts +28 -0
  48. package/dist/genome.d.ts.map +1 -0
  49. package/dist/genome.js +219 -0
  50. package/dist/genome.js.map +1 -0
  51. package/dist/harness-bin.d.ts +3 -0
  52. package/dist/harness-bin.d.ts.map +1 -0
  53. package/dist/harness-bin.js +17 -0
  54. package/dist/harness-bin.js.map +1 -0
  55. package/dist/index.d.ts +79 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +409 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/manifest.d.ts +55 -0
  60. package/dist/manifest.d.ts.map +1 -0
  61. package/dist/manifest.js +62 -0
  62. package/dist/manifest.js.map +1 -0
  63. package/dist/mcp-cmd.d.ts +19 -0
  64. package/dist/mcp-cmd.d.ts.map +1 -0
  65. package/dist/mcp-cmd.js +179 -0
  66. package/dist/mcp-cmd.js.map +1 -0
  67. package/dist/mcp-scan.d.ts +25 -0
  68. package/dist/mcp-scan.d.ts.map +1 -0
  69. package/dist/mcp-scan.js +132 -0
  70. package/dist/mcp-scan.js.map +1 -0
  71. package/dist/oia-manifest.d.ts +97 -0
  72. package/dist/oia-manifest.d.ts.map +1 -0
  73. package/dist/oia-manifest.js +241 -0
  74. package/dist/oia-manifest.js.map +1 -0
  75. package/dist/publish-cmd.d.ts +9 -0
  76. package/dist/publish-cmd.d.ts.map +1 -0
  77. package/dist/publish-cmd.js +56 -0
  78. package/dist/publish-cmd.js.map +1 -0
  79. package/dist/publish.d.ts +55 -0
  80. package/dist/publish.d.ts.map +1 -0
  81. package/dist/publish.js +104 -0
  82. package/dist/publish.js.map +1 -0
  83. package/dist/registry.d.ts +60 -0
  84. package/dist/registry.d.ts.map +1 -0
  85. package/dist/registry.js +67 -0
  86. package/dist/registry.js.map +1 -0
  87. package/dist/rename.d.ts +26 -0
  88. package/dist/rename.d.ts.map +1 -0
  89. package/dist/rename.js +86 -0
  90. package/dist/rename.js.map +1 -0
  91. package/dist/renderer.d.ts +39 -0
  92. package/dist/renderer.d.ts.map +1 -0
  93. package/dist/renderer.js +75 -0
  94. package/dist/renderer.js.map +1 -0
  95. package/dist/sbom-cmd.d.ts +6 -0
  96. package/dist/sbom-cmd.d.ts.map +1 -0
  97. package/dist/sbom-cmd.js +125 -0
  98. package/dist/sbom-cmd.js.map +1 -0
  99. package/dist/score.d.ts +32 -0
  100. package/dist/score.d.ts.map +1 -0
  101. package/dist/score.js +381 -0
  102. package/dist/score.js.map +1 -0
  103. package/dist/secrets.d.ts +27 -0
  104. package/dist/secrets.d.ts.map +1 -0
  105. package/dist/secrets.js +228 -0
  106. package/dist/secrets.js.map +1 -0
  107. package/dist/subcommands.d.ts +32 -0
  108. package/dist/subcommands.d.ts.map +1 -0
  109. package/dist/subcommands.js +335 -0
  110. package/dist/subcommands.js.map +1 -0
  111. package/dist/tarball.d.ts +14 -0
  112. package/dist/tarball.d.ts.map +1 -0
  113. package/dist/tarball.js +121 -0
  114. package/dist/tarball.js.map +1 -0
  115. package/dist/threat-model.d.ts +32 -0
  116. package/dist/threat-model.d.ts.map +1 -0
  117. package/dist/threat-model.js +236 -0
  118. package/dist/threat-model.js.map +1 -0
  119. package/dist/upgrade-cmd.d.ts +9 -0
  120. package/dist/upgrade-cmd.d.ts.map +1 -0
  121. package/dist/upgrade-cmd.js +90 -0
  122. package/dist/upgrade-cmd.js.map +1 -0
  123. package/dist/upgrade.d.ts +37 -0
  124. package/dist/upgrade.d.ts.map +1 -0
  125. package/dist/upgrade.js +124 -0
  126. package/dist/upgrade.js.map +1 -0
  127. package/dist/validate.d.ts +7 -0
  128. package/dist/validate.d.ts.map +1 -0
  129. package/dist/validate.js +240 -0
  130. package/dist/validate.js.map +1 -0
  131. package/dist/walker.d.ts +24 -0
  132. package/dist/walker.d.ts.map +1 -0
  133. package/dist/walker.js +76 -0
  134. package/dist/walker.js.map +1 -0
  135. package/dist/witness-client.d.ts +40 -0
  136. package/dist/witness-client.d.ts.map +1 -0
  137. package/dist/witness-client.js +99 -0
  138. package/dist/witness-client.js.map +1 -0
  139. package/dist/wizard.d.ts +37 -0
  140. package/dist/wizard.d.ts.map +1 -0
  141. package/dist/wizard.js +137 -0
  142. package/dist/wizard.js.map +1 -0
  143. package/dist/writer.d.ts +13 -0
  144. package/dist/writer.d.ts.map +1 -0
  145. package/dist/writer.js +43 -0
  146. package/dist/writer.js.map +1 -0
  147. package/package.json +114 -0
  148. package/templates/catalog.def.mjs +542 -0
  149. package/templates/catalog.json +1274 -0
  150. package/templates/minimal/.claude/settings.json.tmpl +18 -0
  151. package/templates/minimal/CLAUDE.md.tmpl +23 -0
  152. package/templates/minimal/README.md.tmpl +20 -0
  153. package/templates/minimal/manifest.json +16 -0
  154. package/templates/minimal/package.json.tmpl +30 -0
  155. package/templates/minimal/src/init.ts.tmpl +21 -0
  156. package/templates/vertical_advertising/.claude/commands/doctor.md.tmpl +12 -0
  157. package/templates/vertical_advertising/.claude/settings.json.tmpl +33 -0
  158. package/templates/vertical_advertising/.claude/skills/media-plan/SKILL.md.tmpl +13 -0
  159. package/templates/vertical_advertising/CLAUDE.md.tmpl +30 -0
  160. package/templates/vertical_advertising/README.md.tmpl +29 -0
  161. package/templates/vertical_advertising/manifest.json +81 -0
  162. package/templates/vertical_advertising/package.json.tmpl +30 -0
  163. package/templates/vertical_advertising/src/agents/copywriter.ts.tmpl +7 -0
  164. package/templates/vertical_advertising/src/agents/media-planner.ts.tmpl +7 -0
  165. package/templates/vertical_advertising/src/agents/performance-analyst.ts.tmpl +7 -0
  166. package/templates/vertical_advertising/src/init.ts.tmpl +21 -0
  167. package/templates/vertical_agentics/.claude/commands/doctor.md.tmpl +12 -0
  168. package/templates/vertical_agentics/.claude/settings.json.tmpl +33 -0
  169. package/templates/vertical_agentics/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  170. package/templates/vertical_agentics/.claude/skills/run-swarm/SKILL.md.tmpl +14 -0
  171. package/templates/vertical_agentics/CLAUDE.md.tmpl +32 -0
  172. package/templates/vertical_agentics/README.md.tmpl +30 -0
  173. package/templates/vertical_agentics/manifest.json +91 -0
  174. package/templates/vertical_agentics/package.json.tmpl +30 -0
  175. package/templates/vertical_agentics/src/agents/critic.ts.tmpl +7 -0
  176. package/templates/vertical_agentics/src/agents/orchestrator.ts.tmpl +7 -0
  177. package/templates/vertical_agentics/src/agents/planner.ts.tmpl +7 -0
  178. package/templates/vertical_agentics/src/agents/worker.ts.tmpl +7 -0
  179. package/templates/vertical_agentics/src/init.ts.tmpl +21 -0
  180. package/templates/vertical_ai/.claude/commands/doctor.md.tmpl +12 -0
  181. package/templates/vertical_ai/.claude/settings.json.tmpl +35 -0
  182. package/templates/vertical_ai/.claude/skills/eval-report/SKILL.md.tmpl +13 -0
  183. package/templates/vertical_ai/CLAUDE.md.tmpl +31 -0
  184. package/templates/vertical_ai/README.md.tmpl +30 -0
  185. package/templates/vertical_ai/manifest.json +86 -0
  186. package/templates/vertical_ai/package.json.tmpl +30 -0
  187. package/templates/vertical_ai/src/agents/data-curator.ts.tmpl +7 -0
  188. package/templates/vertical_ai/src/agents/deployer.ts.tmpl +7 -0
  189. package/templates/vertical_ai/src/agents/evaluator.ts.tmpl +7 -0
  190. package/templates/vertical_ai/src/agents/trainer.ts.tmpl +7 -0
  191. package/templates/vertical_ai/src/init.ts.tmpl +21 -0
  192. package/templates/vertical_business/.claude/commands/doctor.md.tmpl +12 -0
  193. package/templates/vertical_business/.claude/settings.json.tmpl +33 -0
  194. package/templates/vertical_business/.claude/skills/quarterly-plan/SKILL.md.tmpl +13 -0
  195. package/templates/vertical_business/CLAUDE.md.tmpl +30 -0
  196. package/templates/vertical_business/README.md.tmpl +29 -0
  197. package/templates/vertical_business/manifest.json +81 -0
  198. package/templates/vertical_business/package.json.tmpl +30 -0
  199. package/templates/vertical_business/src/agents/analyst.ts.tmpl +7 -0
  200. package/templates/vertical_business/src/agents/ops-coordinator.ts.tmpl +7 -0
  201. package/templates/vertical_business/src/agents/strategist.ts.tmpl +7 -0
  202. package/templates/vertical_business/src/init.ts.tmpl +21 -0
  203. package/templates/vertical_coding/.claude/commands/doctor.md.tmpl +12 -0
  204. package/templates/vertical_coding/.claude/commands/review-diff.md.tmpl +10 -0
  205. package/templates/vertical_coding/.claude/settings.json.tmpl +40 -0
  206. package/templates/vertical_coding/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
  207. package/templates/vertical_coding/CLAUDE.md.tmpl +32 -0
  208. package/templates/vertical_coding/README.md.tmpl +30 -0
  209. package/templates/vertical_coding/manifest.json +91 -0
  210. package/templates/vertical_coding/package.json.tmpl +30 -0
  211. package/templates/vertical_coding/src/agents/architect.ts.tmpl +7 -0
  212. package/templates/vertical_coding/src/agents/implementer.ts.tmpl +7 -0
  213. package/templates/vertical_coding/src/agents/reviewer.ts.tmpl +7 -0
  214. package/templates/vertical_coding/src/agents/test-writer.ts.tmpl +7 -0
  215. package/templates/vertical_coding/src/init.ts.tmpl +21 -0
  216. package/templates/vertical_crm/.claude/commands/doctor.md.tmpl +12 -0
  217. package/templates/vertical_crm/.claude/settings.json.tmpl +33 -0
  218. package/templates/vertical_crm/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  219. package/templates/vertical_crm/CLAUDE.md.tmpl +30 -0
  220. package/templates/vertical_crm/README.md.tmpl +29 -0
  221. package/templates/vertical_crm/manifest.json +81 -0
  222. package/templates/vertical_crm/package.json.tmpl +30 -0
  223. package/templates/vertical_crm/src/agents/account-manager.ts.tmpl +7 -0
  224. package/templates/vertical_crm/src/agents/churn-watcher.ts.tmpl +7 -0
  225. package/templates/vertical_crm/src/agents/lead-qualifier.ts.tmpl +7 -0
  226. package/templates/vertical_crm/src/init.ts.tmpl +21 -0
  227. package/templates/vertical_devops/.claude/settings.json.tmpl +36 -0
  228. package/templates/vertical_devops/CLAUDE.md.tmpl +34 -0
  229. package/templates/vertical_devops/README.md.tmpl +27 -0
  230. package/templates/vertical_devops/manifest.json +22 -0
  231. package/templates/vertical_devops/package.json.tmpl +26 -0
  232. package/templates/vertical_devops/runbooks/README.md.tmpl +32 -0
  233. package/templates/vertical_devops/src/agents/escalator.ts.tmpl +19 -0
  234. package/templates/vertical_devops/src/agents/postmortem.ts.tmpl +23 -0
  235. package/templates/vertical_devops/src/agents/responder.ts.tmpl +14 -0
  236. package/templates/vertical_devops/src/agents/runbook-runner.ts.tmpl +17 -0
  237. package/templates/vertical_devops/src/init.ts.tmpl +23 -0
  238. package/templates/vertical_education/.claude/commands/doctor.md.tmpl +12 -0
  239. package/templates/vertical_education/.claude/commands/mastery-report.md.tmpl +12 -0
  240. package/templates/vertical_education/.claude/settings.json.tmpl +45 -0
  241. package/templates/vertical_education/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  242. package/templates/vertical_education/.claude/skills/teach-next/SKILL.md.tmpl +16 -0
  243. package/templates/vertical_education/CLAUDE.md.tmpl +33 -0
  244. package/templates/vertical_education/README.md.tmpl +30 -0
  245. package/templates/vertical_education/manifest.json +96 -0
  246. package/templates/vertical_education/package.json.tmpl +30 -0
  247. package/templates/vertical_education/src/agents/explainer.ts.tmpl +7 -0
  248. package/templates/vertical_education/src/agents/grader.ts.tmpl +7 -0
  249. package/templates/vertical_education/src/agents/quiz-master.ts.tmpl +7 -0
  250. package/templates/vertical_education/src/agents/tutor.ts.tmpl +7 -0
  251. package/templates/vertical_education/src/init.ts.tmpl +21 -0
  252. package/templates/vertical_exotic/.claude/commands/doctor.md.tmpl +12 -0
  253. package/templates/vertical_exotic/.claude/settings.json.tmpl +44 -0
  254. package/templates/vertical_exotic/.claude/skills/evolve/SKILL.md.tmpl +14 -0
  255. package/templates/vertical_exotic/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  256. package/templates/vertical_exotic/CLAUDE.md.tmpl +31 -0
  257. package/templates/vertical_exotic/README.md.tmpl +29 -0
  258. package/templates/vertical_exotic/manifest.json +86 -0
  259. package/templates/vertical_exotic/package.json.tmpl +30 -0
  260. package/templates/vertical_exotic/src/agents/experimenter.ts.tmpl +7 -0
  261. package/templates/vertical_exotic/src/agents/federator.ts.tmpl +7 -0
  262. package/templates/vertical_exotic/src/agents/hypothesizer.ts.tmpl +7 -0
  263. package/templates/vertical_exotic/src/init.ts.tmpl +21 -0
  264. package/templates/vertical_gaming/.claude/commands/design-doc-diff.md.tmpl +13 -0
  265. package/templates/vertical_gaming/.claude/commands/doctor.md.tmpl +12 -0
  266. package/templates/vertical_gaming/.claude/settings.json.tmpl +45 -0
  267. package/templates/vertical_gaming/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  268. package/templates/vertical_gaming/.claude/skills/playtest-recap/SKILL.md.tmpl +16 -0
  269. package/templates/vertical_gaming/CLAUDE.md.tmpl +33 -0
  270. package/templates/vertical_gaming/README.md.tmpl +30 -0
  271. package/templates/vertical_gaming/manifest.json +96 -0
  272. package/templates/vertical_gaming/package.json.tmpl +30 -0
  273. package/templates/vertical_gaming/src/agents/balance-critic.ts.tmpl +7 -0
  274. package/templates/vertical_gaming/src/agents/economy-modeler.ts.tmpl +7 -0
  275. package/templates/vertical_gaming/src/agents/narrative-keeper.ts.tmpl +7 -0
  276. package/templates/vertical_gaming/src/agents/playtest-reader.ts.tmpl +7 -0
  277. package/templates/vertical_gaming/src/init.ts.tmpl +21 -0
  278. package/templates/vertical_health/.claude/commands/doctor.md.tmpl +12 -0
  279. package/templates/vertical_health/.claude/settings.json.tmpl +33 -0
  280. package/templates/vertical_health/.claude/skills/wellness-intake/SKILL.md.tmpl +15 -0
  281. package/templates/vertical_health/CLAUDE.md.tmpl +30 -0
  282. package/templates/vertical_health/README.md.tmpl +29 -0
  283. package/templates/vertical_health/manifest.json +81 -0
  284. package/templates/vertical_health/package.json.tmpl +30 -0
  285. package/templates/vertical_health/src/agents/care-coordinator.ts.tmpl +7 -0
  286. package/templates/vertical_health/src/agents/intake.ts.tmpl +7 -0
  287. package/templates/vertical_health/src/agents/triage.ts.tmpl +7 -0
  288. package/templates/vertical_health/src/init.ts.tmpl +21 -0
  289. package/templates/vertical_legal/.claude/settings.json.tmpl +10 -0
  290. package/templates/vertical_legal/CLAUDE.md.tmpl +24 -0
  291. package/templates/vertical_legal/README.md.tmpl +21 -0
  292. package/templates/vertical_legal/manifest.json +20 -0
  293. package/templates/vertical_legal/package.json.tmpl +13 -0
  294. package/templates/vertical_legal/src/agents/citation-checker.ts.tmpl +7 -0
  295. package/templates/vertical_legal/src/agents/redline.ts.tmpl +7 -0
  296. package/templates/vertical_legal/src/agents/risk-rater.ts.tmpl +8 -0
  297. package/templates/vertical_legal/src/init.ts.tmpl +13 -0
  298. package/templates/vertical_marketing/.claude/commands/doctor.md.tmpl +12 -0
  299. package/templates/vertical_marketing/.claude/settings.json.tmpl +33 -0
  300. package/templates/vertical_marketing/.claude/skills/campaign-brief/SKILL.md.tmpl +13 -0
  301. package/templates/vertical_marketing/CLAUDE.md.tmpl +30 -0
  302. package/templates/vertical_marketing/README.md.tmpl +29 -0
  303. package/templates/vertical_marketing/manifest.json +81 -0
  304. package/templates/vertical_marketing/package.json.tmpl +30 -0
  305. package/templates/vertical_marketing/src/agents/content-creator.ts.tmpl +7 -0
  306. package/templates/vertical_marketing/src/agents/seo-analyst.ts.tmpl +7 -0
  307. package/templates/vertical_marketing/src/agents/strategist.ts.tmpl +7 -0
  308. package/templates/vertical_marketing/src/init.ts.tmpl +21 -0
  309. package/templates/vertical_repo-maintainer/.claude/commands/doctor.md.tmpl +12 -0
  310. package/templates/vertical_repo-maintainer/.claude/commands/release-check.md.tmpl +13 -0
  311. package/templates/vertical_repo-maintainer/.claude/commands/repo-triage.md.tmpl +16 -0
  312. package/templates/vertical_repo-maintainer/.claude/settings.json.tmpl +44 -0
  313. package/templates/vertical_repo-maintainer/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  314. package/templates/vertical_repo-maintainer/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
  315. package/templates/vertical_repo-maintainer/CLAUDE.md.tmpl +34 -0
  316. package/templates/vertical_repo-maintainer/README.md.tmpl +30 -0
  317. package/templates/vertical_repo-maintainer/manifest.json +101 -0
  318. package/templates/vertical_repo-maintainer/package.json.tmpl +30 -0
  319. package/templates/vertical_repo-maintainer/src/agents/benchmarker.ts.tmpl +7 -0
  320. package/templates/vertical_repo-maintainer/src/agents/maintainer.ts.tmpl +7 -0
  321. package/templates/vertical_repo-maintainer/src/agents/release.ts.tmpl +7 -0
  322. package/templates/vertical_repo-maintainer/src/agents/security.ts.tmpl +7 -0
  323. package/templates/vertical_repo-maintainer/src/init.ts.tmpl +21 -0
  324. package/templates/vertical_research/.claude/settings.json.tmpl +9 -0
  325. package/templates/vertical_research/CLAUDE.md.tmpl +33 -0
  326. package/templates/vertical_research/README.md.tmpl +17 -0
  327. package/templates/vertical_research/manifest.json +23 -0
  328. package/templates/vertical_research/package.json.tmpl +13 -0
  329. package/templates/vertical_research/src/agents/citer.ts.tmpl +8 -0
  330. package/templates/vertical_research/src/agents/fact-checker.ts.tmpl +8 -0
  331. package/templates/vertical_research/src/agents/scout.ts.tmpl +7 -0
  332. package/templates/vertical_research/src/agents/source-grader.ts.tmpl +10 -0
  333. package/templates/vertical_research/src/agents/synthesizer.ts.tmpl +8 -0
  334. package/templates/vertical_research/src/agents/web-searcher.ts.tmpl +6 -0
  335. package/templates/vertical_research/src/init.ts.tmpl +13 -0
  336. package/templates/vertical_ruview/.claude/commands/doctor.md.tmpl +12 -0
  337. package/templates/vertical_ruview/.claude/settings.json.tmpl +33 -0
  338. package/templates/vertical_ruview/.claude/skills/index-and-ask/SKILL.md.tmpl +15 -0
  339. package/templates/vertical_ruview/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  340. package/templates/vertical_ruview/CLAUDE.md.tmpl +31 -0
  341. package/templates/vertical_ruview/README.md.tmpl +29 -0
  342. package/templates/vertical_ruview/manifest.json +86 -0
  343. package/templates/vertical_ruview/package.json.tmpl +30 -0
  344. package/templates/vertical_ruview/src/agents/indexer.ts.tmpl +7 -0
  345. package/templates/vertical_ruview/src/agents/retriever.ts.tmpl +7 -0
  346. package/templates/vertical_ruview/src/agents/reviewer.ts.tmpl +7 -0
  347. package/templates/vertical_ruview/src/init.ts.tmpl +21 -0
  348. package/templates/vertical_sales/.claude/commands/doctor.md.tmpl +12 -0
  349. package/templates/vertical_sales/.claude/commands/pipeline-report.md.tmpl +13 -0
  350. package/templates/vertical_sales/.claude/settings.json.tmpl +45 -0
  351. package/templates/vertical_sales/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
  352. package/templates/vertical_sales/.claude/skills/qualify-lead/SKILL.md.tmpl +15 -0
  353. package/templates/vertical_sales/CLAUDE.md.tmpl +33 -0
  354. package/templates/vertical_sales/README.md.tmpl +30 -0
  355. package/templates/vertical_sales/manifest.json +96 -0
  356. package/templates/vertical_sales/package.json.tmpl +30 -0
  357. package/templates/vertical_sales/src/agents/closer.ts.tmpl +7 -0
  358. package/templates/vertical_sales/src/agents/demo-coach.ts.tmpl +7 -0
  359. package/templates/vertical_sales/src/agents/prospector.ts.tmpl +7 -0
  360. package/templates/vertical_sales/src/agents/qualifier.ts.tmpl +7 -0
  361. package/templates/vertical_sales/src/init.ts.tmpl +21 -0
  362. package/templates/vertical_support/.claude/settings.json.tmpl +25 -0
  363. package/templates/vertical_support/CLAUDE.md.tmpl +34 -0
  364. package/templates/vertical_support/README.md.tmpl +16 -0
  365. package/templates/vertical_support/kb/README.md.tmpl +23 -0
  366. package/templates/vertical_support/manifest.json +22 -0
  367. package/templates/vertical_support/package.json.tmpl +24 -0
  368. package/templates/vertical_support/src/agents/escalator.ts.tmpl +6 -0
  369. package/templates/vertical_support/src/agents/kb-searcher.ts.tmpl +6 -0
  370. package/templates/vertical_support/src/agents/responder.ts.tmpl +7 -0
  371. package/templates/vertical_support/src/agents/triager.ts.tmpl +6 -0
  372. package/templates/vertical_support/src/init.ts.tmpl +16 -0
  373. package/templates/vertical_trading/.claude/settings.json.tmpl +20 -0
  374. package/templates/vertical_trading/CLAUDE.md.tmpl +24 -0
  375. package/templates/vertical_trading/README.md.tmpl +17 -0
  376. package/templates/vertical_trading/manifest.json +22 -0
  377. package/templates/vertical_trading/package.json.tmpl +13 -0
  378. package/templates/vertical_trading/src/agents/executor.ts.tmpl +8 -0
  379. package/templates/vertical_trading/src/agents/market-watcher.ts.tmpl +7 -0
  380. package/templates/vertical_trading/src/agents/postmortem.ts.tmpl +8 -0
  381. package/templates/vertical_trading/src/agents/risk-checker.ts.tmpl +11 -0
  382. package/templates/vertical_trading/src/agents/signal-gen.ts.tmpl +8 -0
  383. package/templates/vertical_trading/src/init.ts.tmpl +20 -0
package/dist/diag.d.ts ADDED
@@ -0,0 +1,76 @@
1
+ /** Mirror of subcommands.ts's exported shape — kept local to avoid a
2
+ * cyclic import (subcommands.ts imports from diag.ts via diagCmd). */
3
+ export type SubcommandResult = {
4
+ code: number;
5
+ lines: string[];
6
+ };
7
+ /** Compute the skew verdict between two semvers. */
8
+ export type SkewVerdict = 'match' | 'patch-diff' | 'minor-diff' | 'major-diff' | 'unparseable';
9
+ export declare function skewVerdict(manifestVer: string | undefined, localVer: string | undefined): SkewVerdict;
10
+ export interface DiagReport {
11
+ dir: string;
12
+ surface: string | undefined;
13
+ manifestKernelVersion: string | undefined;
14
+ localKernelVersion: string | undefined;
15
+ verdict: SkewVerdict;
16
+ actionable: string | undefined;
17
+ manifestGeneratorVersion: string | undefined;
18
+ localGeneratorVersion: string | undefined;
19
+ generatorVerdict: SkewVerdict;
20
+ }
21
+ export declare function buildDiagReport(harnessDir: string): Promise<DiagReport>;
22
+ /**
23
+ * Format a diag report for human reading. Returns the lines + an exit
24
+ * code suitable for the CLI: 0 on match/patch, 1 on minor/major, 2 if
25
+ * the manifest is missing entirely.
26
+ */
27
+ export declare function formatDiagReport(report: DiagReport): SubcommandResult;
28
+ /**
29
+ * Format a report as JSON for programmatic consumers. Includes the full
30
+ * report shape + the resolved exit code (delegated to formatDiagReport
31
+ * so the verdict-to-exit-code mapping has exactly ONE definition) so
32
+ * callers can gate on either the structured data or the exit code.
33
+ */
34
+ export declare function formatDiagReportJson(report: DiagReport): SubcommandResult;
35
+ /**
36
+ * iter 90 — support-bundle JSON. Single-command snapshot of every
37
+ * diagnostic surface a maintainer would need to triage an issue:
38
+ *
39
+ * - The diag report (skew verdict + versions)
40
+ * - The manifest contents (sanitised — vars stay since they're chosen
41
+ * by the user, but anything starting with `secret_`/`token_`/`key_`
42
+ * is replaced with "<redacted>" so users can paste this without
43
+ * leaking credentials they typed into prompts)
44
+ * - The harness's package.json name + version + @ruflo/* deps
45
+ * - Node version, platform, arch (for cross-OS bug repro)
46
+ * - Last 3 .harness/* file paths (presence/absence proves which
47
+ * lifecycle steps the user has run)
48
+ *
49
+ * Users run `harness diag --bundle` and paste the output into a GitHub
50
+ * issue. Maintainers get every load-bearing fact in one block.
51
+ */
52
+ export interface SupportBundle {
53
+ schema: 1;
54
+ generatedAt: string;
55
+ diag: DiagReport & {
56
+ exitCode: number;
57
+ };
58
+ harness: {
59
+ packageName: string | undefined;
60
+ packageVersion: string | undefined;
61
+ rufloDeps: Record<string, string>;
62
+ };
63
+ manifest: {
64
+ present: boolean;
65
+ content: unknown | undefined;
66
+ };
67
+ harnessFiles: string[];
68
+ env: {
69
+ nodeVersion: string;
70
+ platform: string;
71
+ arch: string;
72
+ };
73
+ }
74
+ export declare function buildSupportBundle(harnessDir: string): Promise<SupportBundle>;
75
+ export declare function diagCmd(args: string[]): Promise<SubcommandResult>;
76
+ //# sourceMappingURL=diag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diag.d.ts","sourceRoot":"","sources":["../src/diag.ts"],"names":[],"mappings":"AAuBA;uEACuE;AACvE,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAejE,oDAAoD;AACpD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAE/F,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAStG;AA8DD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAO/B,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,WAAW,CAAC;CAC/B;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2C7E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAgErE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAQzE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAC;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE;QACH,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAgBD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8DnF;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuBvE"}
package/dist/diag.js ADDED
@@ -0,0 +1,349 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `harness diag` — single-question diagnostic: is the LOCAL @ruflo/kernel
4
+ // compatible with the version this harness was scaffolded against?
5
+ //
6
+ // Surfaces:
7
+ // - manifest.meta.surface (iter 56) — which surface produced it (cli/web-ui)
8
+ // - manifest.meta.kernel_version (iter 58) — the version the scaffold was built against
9
+ // - the locally-installed @ruflo/kernel version (resolved at runtime)
10
+ // - drift verdict and actionable next step
11
+ //
12
+ // Why split this out of `harness doctor`?
13
+ // doctor is the generic smoke check (does .harness/ exist? is the
14
+ // manifest hash intact?). diag is the ONE cross-machine question
15
+ // that almost every "support ticket" turns out to be — and the
16
+ // answer needs to be loud, single-line, and copy-pasteable so users
17
+ // can act on it without reading every doctor line.
18
+ import { createRequire } from 'node:module';
19
+ import { readFile } from 'node:fs/promises';
20
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
21
+ import { dirname, join, resolve } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ const __dirname = dirname(fileURLToPath(import.meta.url));
24
+ /**
25
+ * Parse "X.Y.Z[-pre]" into a tuple. Returns null on unrecognised input
26
+ * (e.g. "git+ssh://..." or "*"). We only need the major/minor/patch ints
27
+ * for the skew verdict; pre-release suffixes are ignored.
28
+ */
29
+ function parseSemver(v) {
30
+ const m = /^(\d+)\.(\d+)\.(\d+)/.exec(v);
31
+ if (!m)
32
+ return null;
33
+ return { major: +m[1], minor: +m[2], patch: +m[3] };
34
+ }
35
+ export function skewVerdict(manifestVer, localVer) {
36
+ if (!manifestVer || !localVer)
37
+ return 'unparseable';
38
+ const m = parseSemver(manifestVer);
39
+ const l = parseSemver(localVer);
40
+ if (!m || !l)
41
+ return 'unparseable';
42
+ if (m.major !== l.major)
43
+ return 'major-diff';
44
+ if (m.minor !== l.minor)
45
+ return 'minor-diff';
46
+ if (m.patch !== l.patch)
47
+ return 'patch-diff';
48
+ return 'match';
49
+ }
50
+ /**
51
+ * Resolve the locally-installed @ruflo/kernel version. Uses createRequire
52
+ * so it follows real Node resolution from the harness's package.json. We
53
+ * never throw — a missing kernel is the WHOLE POINT of this diagnostic
54
+ * (it gets reported as such).
55
+ */
56
+ function resolveLocalKernelVersion(harnessDir) {
57
+ try {
58
+ const require = createRequire(join(harnessDir, 'package.json'));
59
+ const pkgPath = require.resolve('@ruflo/kernel/package.json');
60
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
61
+ return typeof pkg.version === 'string' ? pkg.version : undefined;
62
+ }
63
+ catch {
64
+ // Fall back to the workspace's kernel package if running uninstalled
65
+ // (e.g. dev work inside the monorepo before publish).
66
+ const wsPath = resolve(__dirname, '..', '..', 'kernel-js', 'package.json');
67
+ if (existsSync(wsPath)) {
68
+ try {
69
+ const pkg = JSON.parse(readFileSync(wsPath, 'utf-8'));
70
+ return typeof pkg.version === 'string' ? pkg.version : undefined;
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ }
76
+ return undefined;
77
+ }
78
+ }
79
+ /**
80
+ * iter 71: resolve the version of create-agent-harness this process is
81
+ * running from. Used to compare against `manifest.generator`. Falls
82
+ * through the same 3-path lookup as the kernel resolver: workspace
83
+ * checkout, installed sibling, top-level node_modules.
84
+ */
85
+ function resolveLocalGeneratorVersion() {
86
+ const candidates = [
87
+ // Workspace: packages/create-agent-harness/dist/ → ../package.json
88
+ resolve(__dirname, '..', 'package.json'),
89
+ // Installed: node_modules/openharness/package.json (post iter 108 rename)
90
+ resolve(__dirname, '..', '..', 'openharness', 'package.json'),
91
+ // Legacy: node_modules/create-agent-harness/package.json (pre-rename installs)
92
+ resolve(__dirname, '..', '..', 'create-agent-harness', 'package.json'),
93
+ ];
94
+ for (const p of candidates) {
95
+ try {
96
+ if (existsSync(p)) {
97
+ const pkg = JSON.parse(readFileSync(p, 'utf-8'));
98
+ // Accept either name — `create-agent-harness` is the legacy resolved-from-sibling
99
+ // case, `openharness` is the current publishable name (iter 108).
100
+ if ((pkg.name === 'openharness' || pkg.name === 'create-agent-harness') && typeof pkg.version === 'string') {
101
+ return pkg.version;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ /* try next */
107
+ }
108
+ }
109
+ return undefined;
110
+ }
111
+ export async function buildDiagReport(harnessDir) {
112
+ const manifestPath = join(harnessDir, '.harness', 'manifest.json');
113
+ let surface;
114
+ let manifestKernelVersion;
115
+ let manifestGeneratorVersion;
116
+ if (existsSync(manifestPath)) {
117
+ try {
118
+ const m = JSON.parse(await readFile(manifestPath, 'utf-8'));
119
+ surface = m.meta?.surface;
120
+ manifestKernelVersion = m.meta?.kernel_version;
121
+ // iter 71: manifest.generator is the top-level field stamped by
122
+ // emptyManifest() — predates the meta block, present in every
123
+ // scaffold from iter 4 onward.
124
+ manifestGeneratorVersion = typeof m.generator === 'string' ? m.generator : undefined;
125
+ }
126
+ catch {
127
+ /* leave both undefined */
128
+ }
129
+ }
130
+ const localKernelVersion = resolveLocalKernelVersion(harnessDir);
131
+ const verdict = skewVerdict(manifestKernelVersion, localKernelVersion);
132
+ const localGeneratorVersion = resolveLocalGeneratorVersion();
133
+ const generatorVerdict = skewVerdict(manifestGeneratorVersion, localGeneratorVersion);
134
+ let actionable;
135
+ if (verdict === 'major-diff') {
136
+ actionable = `Run: npm install @ruflo/kernel@${manifestKernelVersion} (major skew — APIs may break)`;
137
+ }
138
+ else if (verdict === 'minor-diff') {
139
+ actionable = `Run: npm install @ruflo/kernel@${manifestKernelVersion} (minor skew — new features may be missing)`;
140
+ }
141
+ else if (verdict === 'patch-diff') {
142
+ actionable = `Optional: npm install @ruflo/kernel@${manifestKernelVersion} (patch skew — usually safe)`;
143
+ }
144
+ else if (verdict === 'unparseable' && manifestKernelVersion && !localKernelVersion) {
145
+ actionable = `Run: npm install @ruflo/kernel@${manifestKernelVersion} (kernel not installed locally)`;
146
+ }
147
+ return {
148
+ dir: harnessDir,
149
+ surface,
150
+ manifestKernelVersion,
151
+ localKernelVersion,
152
+ verdict,
153
+ actionable,
154
+ manifestGeneratorVersion,
155
+ localGeneratorVersion,
156
+ generatorVerdict,
157
+ };
158
+ }
159
+ /**
160
+ * Format a diag report for human reading. Returns the lines + an exit
161
+ * code suitable for the CLI: 0 on match/patch, 1 on minor/major, 2 if
162
+ * the manifest is missing entirely.
163
+ */
164
+ export function formatDiagReport(report) {
165
+ const lines = [];
166
+ lines.push(`harness diag — checking ${report.dir}`);
167
+ lines.push('');
168
+ if (!report.manifestKernelVersion && !existsSync(join(report.dir, '.harness', 'manifest.json'))) {
169
+ lines.push(' FAIL no .harness/manifest.json found at this path');
170
+ lines.push(' (this directory is not a scaffolded harness — run harness diag from a harness root)');
171
+ return { code: 2, lines };
172
+ }
173
+ lines.push(` surface: ${report.surface ?? '(unknown — pre-iter-56 manifest)'}`);
174
+ lines.push(` manifest kernel: ${report.manifestKernelVersion ?? '(unset — pre-iter-58 manifest)'}`);
175
+ lines.push(` installed kernel: ${report.localKernelVersion ?? '(not installed)'}`);
176
+ lines.push(` manifest generator: ${report.manifestGeneratorVersion ?? '(unset)'}`);
177
+ lines.push(` installed generator: ${report.localGeneratorVersion ?? '(not installed)'}`);
178
+ lines.push('');
179
+ const tag = {
180
+ 'match': 'PASS',
181
+ 'patch-diff': 'WARN',
182
+ 'minor-diff': 'WARN',
183
+ 'major-diff': 'FAIL',
184
+ 'unparseable': 'WARN',
185
+ };
186
+ const blurb = {
187
+ 'match': 'kernel versions match exactly',
188
+ 'patch-diff': 'patch-level skew (usually safe; may include bugfixes)',
189
+ 'minor-diff': 'minor-level skew (new kernel features may be missing)',
190
+ 'major-diff': 'MAJOR skew — APIs may have changed; expect breakage',
191
+ 'unparseable': 'could not parse one or both kernel versions',
192
+ };
193
+ lines.push(` ${tag[report.verdict]} ${blurb[report.verdict]}`);
194
+ // iter 71: generator-skew is informational — never fails. The
195
+ // generator can change without the harness becoming incompatible
196
+ // (templates evolve, but the *generated* harness is self-contained).
197
+ // Surfacing it just lets `harness upgrade` users predict whether
198
+ // they'll see new template files after re-run.
199
+ const genBlurb = {
200
+ 'match': 'generator versions match exactly',
201
+ 'patch-diff': 'patch-level generator skew (template fixes since this scaffold)',
202
+ 'minor-diff': 'minor-level generator skew (new template features available)',
203
+ 'major-diff': 'MAJOR generator skew (template may have moved — re-run `harness upgrade` to preview drift)',
204
+ 'unparseable': 'generator version unknown',
205
+ };
206
+ const genTag = {
207
+ 'match': 'PASS',
208
+ 'patch-diff': 'INFO',
209
+ 'minor-diff': 'INFO',
210
+ 'major-diff': 'WARN',
211
+ 'unparseable': 'INFO',
212
+ };
213
+ lines.push(` ${genTag[report.generatorVerdict]} ${genBlurb[report.generatorVerdict]}`);
214
+ if (report.actionable) {
215
+ lines.push('');
216
+ lines.push(` → ${report.actionable}`);
217
+ }
218
+ // Exit codes:
219
+ // 0 — match (always)
220
+ // 0 — patch-diff (informational)
221
+ // 1 — minor-diff or major-diff (action needed)
222
+ // 1 — unparseable when manifest version is set but local isn't
223
+ // generatorVerdict NEVER fails — it's informational only.
224
+ let code = 0;
225
+ if (report.verdict === 'minor-diff' || report.verdict === 'major-diff')
226
+ code = 1;
227
+ if (report.verdict === 'unparseable' && report.manifestKernelVersion && !report.localKernelVersion)
228
+ code = 1;
229
+ return { code, lines };
230
+ }
231
+ /**
232
+ * Format a report as JSON for programmatic consumers. Includes the full
233
+ * report shape + the resolved exit code (delegated to formatDiagReport
234
+ * so the verdict-to-exit-code mapping has exactly ONE definition) so
235
+ * callers can gate on either the structured data or the exit code.
236
+ */
237
+ export function formatDiagReportJson(report) {
238
+ const human = formatDiagReport(report);
239
+ return {
240
+ code: human.code,
241
+ lines: [
242
+ JSON.stringify({ ...report, exitCode: human.code }, null, 2),
243
+ ],
244
+ };
245
+ }
246
+ const REDACT_KEY_RE = /^(secret|token|key|password|api[-_]?key)/i;
247
+ function sanitiseManifest(m) {
248
+ if (m === null || typeof m !== 'object')
249
+ return m;
250
+ if (Array.isArray(m))
251
+ return m.map(sanitiseManifest);
252
+ const out = {};
253
+ for (const [k, v] of Object.entries(m)) {
254
+ if (REDACT_KEY_RE.test(k))
255
+ out[k] = '<redacted>';
256
+ else if (typeof v === 'string' && REDACT_KEY_RE.test(k))
257
+ out[k] = '<redacted>';
258
+ else
259
+ out[k] = sanitiseManifest(v);
260
+ }
261
+ return out;
262
+ }
263
+ export async function buildSupportBundle(harnessDir) {
264
+ const report = await buildDiagReport(harnessDir);
265
+ const human = formatDiagReport(report);
266
+ const exitCode = human.code;
267
+ let packageName;
268
+ let packageVersion;
269
+ const rufloDeps = {};
270
+ const pkgPath = join(harnessDir, 'package.json');
271
+ if (existsSync(pkgPath)) {
272
+ try {
273
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
274
+ packageName = typeof pkg.name === 'string' ? pkg.name : undefined;
275
+ packageVersion = typeof pkg.version === 'string' ? pkg.version : undefined;
276
+ for (const block of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies]) {
277
+ if (block && typeof block === 'object') {
278
+ for (const [name, version] of Object.entries(block)) {
279
+ if (name.startsWith('@ruflo/') || name === 'create-agent-harness' || name === 'openharness') {
280
+ rufloDeps[name] = version;
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ catch {
287
+ /* unreadable package.json — harnessDir not a real harness */
288
+ }
289
+ }
290
+ const manifestPath = join(harnessDir, '.harness', 'manifest.json');
291
+ let manifestContent = undefined;
292
+ if (existsSync(manifestPath)) {
293
+ try {
294
+ manifestContent = sanitiseManifest(JSON.parse(readFileSync(manifestPath, 'utf-8')));
295
+ }
296
+ catch {
297
+ manifestContent = '<unreadable>';
298
+ }
299
+ }
300
+ const harnessFiles = [];
301
+ if (existsSync(join(harnessDir, '.harness'))) {
302
+ try {
303
+ for (const ent of readdirSync(join(harnessDir, '.harness'))) {
304
+ harnessFiles.push(`.harness/${ent}`);
305
+ }
306
+ }
307
+ catch {
308
+ /* swallow — read failure isn't fatal for the bundle */
309
+ }
310
+ }
311
+ return {
312
+ schema: 1,
313
+ generatedAt: new Date().toISOString(),
314
+ diag: { ...report, exitCode },
315
+ harness: { packageName, packageVersion, rufloDeps },
316
+ manifest: { present: !!manifestContent, content: manifestContent },
317
+ harnessFiles,
318
+ env: {
319
+ nodeVersion: process.version,
320
+ platform: process.platform,
321
+ arch: process.arch,
322
+ },
323
+ };
324
+ }
325
+ export async function diagCmd(args) {
326
+ // iter 73: --json emits machine-readable output. Useful for CI
327
+ // scripts that want to gate on the structured verdict rather than
328
+ // parsing the human text.
329
+ // iter 90: --bundle emits a complete support-bundle JSON with
330
+ // diag + manifest + ruflo deps + env. For "paste this into the
331
+ // issue" workflows.
332
+ const json = args.includes('--json');
333
+ const bundle = args.includes('--bundle');
334
+ const positional = args.filter(a => !a.startsWith('--'));
335
+ const dir = resolve(positional[0] ?? process.cwd());
336
+ if (bundle) {
337
+ const b = await buildSupportBundle(dir);
338
+ return {
339
+ // Exit code follows the diag verdict so CI scripts can still
340
+ // gate on the bundle output (you can `harness diag --bundle > b.json`
341
+ // and use `$?` to know whether to alert).
342
+ code: b.diag.exitCode,
343
+ lines: [JSON.stringify(b, null, 2)],
344
+ };
345
+ }
346
+ const report = await buildDiagReport(dir);
347
+ return json ? formatDiagReportJson(report) : formatDiagReport(report);
348
+ }
349
+ //# sourceMappingURL=diag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diag.js","sourceRoot":"","sources":["../src/diag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface EjectPlan {
2
+ /** Source ruflo project root. */
3
+ source: string;
4
+ /** New harness name (kebab-case). */
5
+ newName: string;
6
+ /** Files we'd copy + rewrite, relative to source. */
7
+ files: string[];
8
+ /** Files we'd skip on purpose (with reason). */
9
+ skipped: Array<{
10
+ path: string;
11
+ reason: string;
12
+ }>;
13
+ }
14
+ /**
15
+ * Plan an eject without performing the copy. Useful for previewing what
16
+ * would happen.
17
+ */
18
+ export declare function planEject(source: string, newName: string): Promise<EjectPlan>;
19
+ /**
20
+ * Rewrite content: every ruflo/claude-flow name reference becomes the new
21
+ * harness name. Skips ATTRIBUTION blocks (marked with HTML comments) so
22
+ * the user can keep "Powered by ruflo" if they want.
23
+ */
24
+ export declare function rewriteContent(content: string, newName: string): string;
25
+ /**
26
+ * Apply an eject plan. Copies each file with rewrite, then writes a
27
+ * .harness/manifest.json marking the harness as ejected from <source>.
28
+ */
29
+ export declare function applyEject(plan: EjectPlan, targetDir: string, generatorVersion: string): Promise<{
30
+ written: string[];
31
+ manifestPath: string;
32
+ }>;
33
+ //# sourceMappingURL=eject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eject.d.ts","sourceRoot":"","sources":["../src/eject.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gDAAgD;IAChD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAqBD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAyBnF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBvE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCtD"}
package/dist/eject.js ADDED
@@ -0,0 +1,147 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // `--from-existing` ruflo-eject pipeline.
4
+ //
5
+ // Lift an existing ruflo install (agents/skills/commands/CLAUDE.md/.claude/)
6
+ // into a new, renamed harness so the user owns the future without losing
7
+ // the customisations they've made.
8
+ //
9
+ // Eject rules (load-bearing — these define what "eject" MEANS):
10
+ // 1. agents/ — copied verbatim, every `claude-flow` / `ruflo` reference
11
+ // in YAML frontmatter and prose rewritten to <new-name>
12
+ // 2. skills/ — same treatment as agents/
13
+ // 3. commands/ — same treatment, plus the binary name in code fences
14
+ // (`npx claude-flow` -> `npx <new-name>`)
15
+ // 4. CLAUDE.md — the project's CLAUDE.md is copied. References to
16
+ // "ruflo" / "claude-flow" in prose are rewritten unless they appear
17
+ // inside ruflo-attribution sections the user explicitly marked
18
+ // (the "<!-- ruflo-attribution-block -->" comment markers).
19
+ // 5. .claude/settings.json — copied, but the `mcpServers.claude-flow`
20
+ // key is renamed to the harness's name; permissions are merged.
21
+ // 6. .claude-flow/ — NOT copied. This is ruflo's local state (memory,
22
+ // session logs). It's per-install; the user starts fresh.
23
+ // 7. .mcp.json — copied with rewrite.
24
+ //
25
+ // Per ADR-016 (Migration for ruflo users), the eject is one-way: the
26
+ // resulting harness is independent of ruflo and gets kernel updates via
27
+ // @ruflo/kernel npm peer, not via re-init.
28
+ import { existsSync } from 'node:fs';
29
+ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
30
+ import { dirname, join, posix, relative, sep } from 'node:path';
31
+ const RUFLO_NAMES = ['ruflo', 'claude-flow', '@claude-flow/cli', '@claude-flow'];
32
+ const COPY_DIRS = ['agents', 'skills', 'commands', '.claude'];
33
+ const COPY_FILES = ['CLAUDE.md', '.mcp.json'];
34
+ const SKIP_DIRS = ['.claude-flow', 'node_modules', '.git', 'dist', 'target', '.cache'];
35
+ function toPosix(p) {
36
+ return p.split(sep).join(posix.sep);
37
+ }
38
+ async function walkDir(root, current, into) {
39
+ if (SKIP_DIRS.some(s => current.endsWith(sep + s) || current === root + sep + s))
40
+ return;
41
+ const entries = await readdir(current, { withFileTypes: true });
42
+ for (const e of entries) {
43
+ if (SKIP_DIRS.includes(e.name))
44
+ continue;
45
+ const full = join(current, e.name);
46
+ if (e.isDirectory())
47
+ await walkDir(root, full, into);
48
+ else if (e.isFile())
49
+ into.push(toPosix(relative(root, full)));
50
+ }
51
+ }
52
+ /**
53
+ * Plan an eject without performing the copy. Useful for previewing what
54
+ * would happen.
55
+ */
56
+ export async function planEject(source, newName) {
57
+ if (!existsSync(source)) {
58
+ throw new Error(`source does not exist: ${source}`);
59
+ }
60
+ const files = [];
61
+ const skipped = [];
62
+ for (const d of COPY_DIRS) {
63
+ const dir = join(source, d);
64
+ if (existsSync(dir)) {
65
+ await walkDir(source, dir, files);
66
+ }
67
+ }
68
+ for (const f of COPY_FILES) {
69
+ if (existsSync(join(source, f)))
70
+ files.push(f);
71
+ }
72
+ // Honest reporting of what we left behind on purpose.
73
+ if (existsSync(join(source, '.claude-flow'))) {
74
+ skipped.push({ path: '.claude-flow/', reason: 'ruflo local state — eject starts fresh' });
75
+ }
76
+ if (existsSync(join(source, 'node_modules'))) {
77
+ skipped.push({ path: 'node_modules/', reason: 'will be reinstalled by the harness' });
78
+ }
79
+ return { source, newName, files, skipped };
80
+ }
81
+ /**
82
+ * Rewrite content: every ruflo/claude-flow name reference becomes the new
83
+ * harness name. Skips ATTRIBUTION blocks (marked with HTML comments) so
84
+ * the user can keep "Powered by ruflo" if they want.
85
+ */
86
+ export function rewriteContent(content, newName) {
87
+ // Skip content between attribution markers entirely.
88
+ const attributionRe = /<!--\s*ruflo-attribution-block\s*-->[\s\S]*?<!--\s*\/ruflo-attribution-block\s*-->/gi;
89
+ const placeholder = '\x00ATTR\x00';
90
+ const blocks = [];
91
+ const stashed = content.replace(attributionRe, m => {
92
+ blocks.push(m);
93
+ return placeholder;
94
+ });
95
+ let out = stashed;
96
+ for (const ruflo of RUFLO_NAMES) {
97
+ // Word-boundary-aware replace. \b doesn't recognise @, so we anchor with
98
+ // lookbehind on a non-word boundary or string start.
99
+ const escaped = ruflo.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
100
+ const re = new RegExp(`(?<![\\w@/-])${escaped}(?![\\w/-])`, 'g');
101
+ out = out.replace(re, newName);
102
+ }
103
+ // Restore attribution blocks unchanged.
104
+ let i = 0;
105
+ out = out.replace(new RegExp(placeholder, 'g'), () => blocks[i++] ?? '');
106
+ return out;
107
+ }
108
+ /**
109
+ * Apply an eject plan. Copies each file with rewrite, then writes a
110
+ * .harness/manifest.json marking the harness as ejected from <source>.
111
+ */
112
+ export async function applyEject(plan, targetDir, generatorVersion) {
113
+ if (existsSync(targetDir)) {
114
+ throw new Error(`target exists: ${targetDir} (pass --force or pick a new dir)`);
115
+ }
116
+ await mkdir(targetDir, { recursive: true });
117
+ const written = [];
118
+ for (const rel of plan.files) {
119
+ const src = join(plan.source, ...rel.split('/'));
120
+ const dst = join(targetDir, ...rel.split('/'));
121
+ await mkdir(dirname(dst), { recursive: true });
122
+ const raw = await readFile(src, 'utf-8');
123
+ const out = rewriteContent(raw, plan.newName);
124
+ await writeFile(dst, out, 'utf-8');
125
+ written.push(rel);
126
+ }
127
+ // Manifest marks the eject so future `harness upgrade` knows this is a
128
+ // one-way independent harness, not a generated-from-template install.
129
+ const manifest = {
130
+ schema: 1,
131
+ generator: generatorVersion,
132
+ template: 'eject-from-ruflo',
133
+ template_version: '0.0.0',
134
+ vars: { name: plan.newName },
135
+ hosts: ['claude-code'],
136
+ ejected_from: plan.source,
137
+ generated_at: new Date().toISOString(),
138
+ files: {},
139
+ skipped_on_eject: plan.skipped,
140
+ };
141
+ const manifestPath = join(targetDir, '.harness', 'manifest.json');
142
+ await mkdir(dirname(manifestPath), { recursive: true });
143
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
144
+ written.push('.harness/manifest.json');
145
+ return { written, manifestPath };
146
+ }
147
+ //# sourceMappingURL=eject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eject.js","sourceRoot":"","sources":["../src/eject.ts"],"names":[],"mappings":"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"}