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.
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/analyze-repo.d.ts +74 -0
- package/dist/analyze-repo.d.ts.map +1 -0
- package/dist/analyze-repo.js +329 -0
- package/dist/analyze-repo.js.map +1 -0
- package/dist/audit-cmd.d.ts +6 -0
- package/dist/audit-cmd.d.ts.map +1 -0
- package/dist/audit-cmd.js +139 -0
- package/dist/audit-cmd.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +8 -0
- package/dist/bin.js.map +1 -0
- package/dist/compare-cmd.d.ts +56 -0
- package/dist/compare-cmd.d.ts.map +1 -0
- package/dist/compare-cmd.js +173 -0
- package/dist/compare-cmd.js.map +1 -0
- package/dist/completions-cmd.d.ts +6 -0
- package/dist/completions-cmd.d.ts.map +1 -0
- package/dist/completions-cmd.js +171 -0
- package/dist/completions-cmd.js.map +1 -0
- package/dist/diag.d.ts +76 -0
- package/dist/diag.d.ts.map +1 -0
- package/dist/diag.js +349 -0
- package/dist/diag.js.map +1 -0
- package/dist/eject.d.ts +33 -0
- package/dist/eject.d.ts.map +1 -0
- package/dist/eject.js +147 -0
- package/dist/eject.js.map +1 -0
- package/dist/export-config.d.ts +25 -0
- package/dist/export-config.d.ts.map +1 -0
- package/dist/export-config.js +134 -0
- package/dist/export-config.js.map +1 -0
- package/dist/external-template.d.ts +19 -0
- package/dist/external-template.d.ts.map +1 -0
- package/dist/external-template.js +37 -0
- package/dist/external-template.js.map +1 -0
- package/dist/federate.d.ts +37 -0
- package/dist/federate.d.ts.map +1 -0
- package/dist/federate.js +167 -0
- package/dist/federate.js.map +1 -0
- package/dist/genome-scorers.d.ts +33 -0
- package/dist/genome-scorers.d.ts.map +1 -0
- package/dist/genome-scorers.js +115 -0
- package/dist/genome-scorers.js.map +1 -0
- package/dist/genome.d.ts +28 -0
- package/dist/genome.d.ts.map +1 -0
- package/dist/genome.js +219 -0
- package/dist/genome.js.map +1 -0
- package/dist/harness-bin.d.ts +3 -0
- package/dist/harness-bin.d.ts.map +1 -0
- package/dist/harness-bin.js +17 -0
- package/dist/harness-bin.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +409 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +55 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +62 -0
- package/dist/manifest.js.map +1 -0
- package/dist/mcp-cmd.d.ts +19 -0
- package/dist/mcp-cmd.d.ts.map +1 -0
- package/dist/mcp-cmd.js +179 -0
- package/dist/mcp-cmd.js.map +1 -0
- package/dist/mcp-scan.d.ts +25 -0
- package/dist/mcp-scan.d.ts.map +1 -0
- package/dist/mcp-scan.js +132 -0
- package/dist/mcp-scan.js.map +1 -0
- package/dist/oia-manifest.d.ts +97 -0
- package/dist/oia-manifest.d.ts.map +1 -0
- package/dist/oia-manifest.js +241 -0
- package/dist/oia-manifest.js.map +1 -0
- package/dist/publish-cmd.d.ts +9 -0
- package/dist/publish-cmd.d.ts.map +1 -0
- package/dist/publish-cmd.js +56 -0
- package/dist/publish-cmd.js.map +1 -0
- package/dist/publish.d.ts +55 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +104 -0
- package/dist/publish.js.map +1 -0
- package/dist/registry.d.ts +60 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +67 -0
- package/dist/registry.js.map +1 -0
- package/dist/rename.d.ts +26 -0
- package/dist/rename.d.ts.map +1 -0
- package/dist/rename.js +86 -0
- package/dist/rename.js.map +1 -0
- package/dist/renderer.d.ts +39 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +75 -0
- package/dist/renderer.js.map +1 -0
- package/dist/sbom-cmd.d.ts +6 -0
- package/dist/sbom-cmd.d.ts.map +1 -0
- package/dist/sbom-cmd.js +125 -0
- package/dist/sbom-cmd.js.map +1 -0
- package/dist/score.d.ts +32 -0
- package/dist/score.d.ts.map +1 -0
- package/dist/score.js +381 -0
- package/dist/score.js.map +1 -0
- package/dist/secrets.d.ts +27 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +228 -0
- package/dist/secrets.js.map +1 -0
- package/dist/subcommands.d.ts +32 -0
- package/dist/subcommands.d.ts.map +1 -0
- package/dist/subcommands.js +335 -0
- package/dist/subcommands.js.map +1 -0
- package/dist/tarball.d.ts +14 -0
- package/dist/tarball.d.ts.map +1 -0
- package/dist/tarball.js +121 -0
- package/dist/tarball.js.map +1 -0
- package/dist/threat-model.d.ts +32 -0
- package/dist/threat-model.d.ts.map +1 -0
- package/dist/threat-model.js +236 -0
- package/dist/threat-model.js.map +1 -0
- package/dist/upgrade-cmd.d.ts +9 -0
- package/dist/upgrade-cmd.d.ts.map +1 -0
- package/dist/upgrade-cmd.js +90 -0
- package/dist/upgrade-cmd.js.map +1 -0
- package/dist/upgrade.d.ts +37 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +124 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/validate.d.ts +7 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +240 -0
- package/dist/validate.js.map +1 -0
- package/dist/walker.d.ts +24 -0
- package/dist/walker.d.ts.map +1 -0
- package/dist/walker.js +76 -0
- package/dist/walker.js.map +1 -0
- package/dist/witness-client.d.ts +40 -0
- package/dist/witness-client.d.ts.map +1 -0
- package/dist/witness-client.js +99 -0
- package/dist/witness-client.js.map +1 -0
- package/dist/wizard.d.ts +37 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +137 -0
- package/dist/wizard.js.map +1 -0
- package/dist/writer.d.ts +13 -0
- package/dist/writer.d.ts.map +1 -0
- package/dist/writer.js +43 -0
- package/dist/writer.js.map +1 -0
- package/package.json +114 -0
- package/templates/catalog.def.mjs +542 -0
- package/templates/catalog.json +1274 -0
- package/templates/minimal/.claude/settings.json.tmpl +18 -0
- package/templates/minimal/CLAUDE.md.tmpl +23 -0
- package/templates/minimal/README.md.tmpl +20 -0
- package/templates/minimal/manifest.json +16 -0
- package/templates/minimal/package.json.tmpl +30 -0
- package/templates/minimal/src/init.ts.tmpl +21 -0
- package/templates/vertical_advertising/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_advertising/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_advertising/.claude/skills/media-plan/SKILL.md.tmpl +13 -0
- package/templates/vertical_advertising/CLAUDE.md.tmpl +30 -0
- package/templates/vertical_advertising/README.md.tmpl +29 -0
- package/templates/vertical_advertising/manifest.json +81 -0
- package/templates/vertical_advertising/package.json.tmpl +30 -0
- package/templates/vertical_advertising/src/agents/copywriter.ts.tmpl +7 -0
- package/templates/vertical_advertising/src/agents/media-planner.ts.tmpl +7 -0
- package/templates/vertical_advertising/src/agents/performance-analyst.ts.tmpl +7 -0
- package/templates/vertical_advertising/src/init.ts.tmpl +21 -0
- package/templates/vertical_agentics/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_agentics/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_agentics/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_agentics/.claude/skills/run-swarm/SKILL.md.tmpl +14 -0
- package/templates/vertical_agentics/CLAUDE.md.tmpl +32 -0
- package/templates/vertical_agentics/README.md.tmpl +30 -0
- package/templates/vertical_agentics/manifest.json +91 -0
- package/templates/vertical_agentics/package.json.tmpl +30 -0
- package/templates/vertical_agentics/src/agents/critic.ts.tmpl +7 -0
- package/templates/vertical_agentics/src/agents/orchestrator.ts.tmpl +7 -0
- package/templates/vertical_agentics/src/agents/planner.ts.tmpl +7 -0
- package/templates/vertical_agentics/src/agents/worker.ts.tmpl +7 -0
- package/templates/vertical_agentics/src/init.ts.tmpl +21 -0
- package/templates/vertical_ai/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_ai/.claude/settings.json.tmpl +35 -0
- package/templates/vertical_ai/.claude/skills/eval-report/SKILL.md.tmpl +13 -0
- package/templates/vertical_ai/CLAUDE.md.tmpl +31 -0
- package/templates/vertical_ai/README.md.tmpl +30 -0
- package/templates/vertical_ai/manifest.json +86 -0
- package/templates/vertical_ai/package.json.tmpl +30 -0
- package/templates/vertical_ai/src/agents/data-curator.ts.tmpl +7 -0
- package/templates/vertical_ai/src/agents/deployer.ts.tmpl +7 -0
- package/templates/vertical_ai/src/agents/evaluator.ts.tmpl +7 -0
- package/templates/vertical_ai/src/agents/trainer.ts.tmpl +7 -0
- package/templates/vertical_ai/src/init.ts.tmpl +21 -0
- package/templates/vertical_business/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_business/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_business/.claude/skills/quarterly-plan/SKILL.md.tmpl +13 -0
- package/templates/vertical_business/CLAUDE.md.tmpl +30 -0
- package/templates/vertical_business/README.md.tmpl +29 -0
- package/templates/vertical_business/manifest.json +81 -0
- package/templates/vertical_business/package.json.tmpl +30 -0
- package/templates/vertical_business/src/agents/analyst.ts.tmpl +7 -0
- package/templates/vertical_business/src/agents/ops-coordinator.ts.tmpl +7 -0
- package/templates/vertical_business/src/agents/strategist.ts.tmpl +7 -0
- package/templates/vertical_business/src/init.ts.tmpl +21 -0
- package/templates/vertical_coding/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_coding/.claude/commands/review-diff.md.tmpl +10 -0
- package/templates/vertical_coding/.claude/settings.json.tmpl +40 -0
- package/templates/vertical_coding/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
- package/templates/vertical_coding/CLAUDE.md.tmpl +32 -0
- package/templates/vertical_coding/README.md.tmpl +30 -0
- package/templates/vertical_coding/manifest.json +91 -0
- package/templates/vertical_coding/package.json.tmpl +30 -0
- package/templates/vertical_coding/src/agents/architect.ts.tmpl +7 -0
- package/templates/vertical_coding/src/agents/implementer.ts.tmpl +7 -0
- package/templates/vertical_coding/src/agents/reviewer.ts.tmpl +7 -0
- package/templates/vertical_coding/src/agents/test-writer.ts.tmpl +7 -0
- package/templates/vertical_coding/src/init.ts.tmpl +21 -0
- package/templates/vertical_crm/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_crm/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_crm/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_crm/CLAUDE.md.tmpl +30 -0
- package/templates/vertical_crm/README.md.tmpl +29 -0
- package/templates/vertical_crm/manifest.json +81 -0
- package/templates/vertical_crm/package.json.tmpl +30 -0
- package/templates/vertical_crm/src/agents/account-manager.ts.tmpl +7 -0
- package/templates/vertical_crm/src/agents/churn-watcher.ts.tmpl +7 -0
- package/templates/vertical_crm/src/agents/lead-qualifier.ts.tmpl +7 -0
- package/templates/vertical_crm/src/init.ts.tmpl +21 -0
- package/templates/vertical_devops/.claude/settings.json.tmpl +36 -0
- package/templates/vertical_devops/CLAUDE.md.tmpl +34 -0
- package/templates/vertical_devops/README.md.tmpl +27 -0
- package/templates/vertical_devops/manifest.json +22 -0
- package/templates/vertical_devops/package.json.tmpl +26 -0
- package/templates/vertical_devops/runbooks/README.md.tmpl +32 -0
- package/templates/vertical_devops/src/agents/escalator.ts.tmpl +19 -0
- package/templates/vertical_devops/src/agents/postmortem.ts.tmpl +23 -0
- package/templates/vertical_devops/src/agents/responder.ts.tmpl +14 -0
- package/templates/vertical_devops/src/agents/runbook-runner.ts.tmpl +17 -0
- package/templates/vertical_devops/src/init.ts.tmpl +23 -0
- package/templates/vertical_education/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_education/.claude/commands/mastery-report.md.tmpl +12 -0
- package/templates/vertical_education/.claude/settings.json.tmpl +45 -0
- package/templates/vertical_education/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_education/.claude/skills/teach-next/SKILL.md.tmpl +16 -0
- package/templates/vertical_education/CLAUDE.md.tmpl +33 -0
- package/templates/vertical_education/README.md.tmpl +30 -0
- package/templates/vertical_education/manifest.json +96 -0
- package/templates/vertical_education/package.json.tmpl +30 -0
- package/templates/vertical_education/src/agents/explainer.ts.tmpl +7 -0
- package/templates/vertical_education/src/agents/grader.ts.tmpl +7 -0
- package/templates/vertical_education/src/agents/quiz-master.ts.tmpl +7 -0
- package/templates/vertical_education/src/agents/tutor.ts.tmpl +7 -0
- package/templates/vertical_education/src/init.ts.tmpl +21 -0
- package/templates/vertical_exotic/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_exotic/.claude/settings.json.tmpl +44 -0
- package/templates/vertical_exotic/.claude/skills/evolve/SKILL.md.tmpl +14 -0
- package/templates/vertical_exotic/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_exotic/CLAUDE.md.tmpl +31 -0
- package/templates/vertical_exotic/README.md.tmpl +29 -0
- package/templates/vertical_exotic/manifest.json +86 -0
- package/templates/vertical_exotic/package.json.tmpl +30 -0
- package/templates/vertical_exotic/src/agents/experimenter.ts.tmpl +7 -0
- package/templates/vertical_exotic/src/agents/federator.ts.tmpl +7 -0
- package/templates/vertical_exotic/src/agents/hypothesizer.ts.tmpl +7 -0
- package/templates/vertical_exotic/src/init.ts.tmpl +21 -0
- package/templates/vertical_gaming/.claude/commands/design-doc-diff.md.tmpl +13 -0
- package/templates/vertical_gaming/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_gaming/.claude/settings.json.tmpl +45 -0
- package/templates/vertical_gaming/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_gaming/.claude/skills/playtest-recap/SKILL.md.tmpl +16 -0
- package/templates/vertical_gaming/CLAUDE.md.tmpl +33 -0
- package/templates/vertical_gaming/README.md.tmpl +30 -0
- package/templates/vertical_gaming/manifest.json +96 -0
- package/templates/vertical_gaming/package.json.tmpl +30 -0
- package/templates/vertical_gaming/src/agents/balance-critic.ts.tmpl +7 -0
- package/templates/vertical_gaming/src/agents/economy-modeler.ts.tmpl +7 -0
- package/templates/vertical_gaming/src/agents/narrative-keeper.ts.tmpl +7 -0
- package/templates/vertical_gaming/src/agents/playtest-reader.ts.tmpl +7 -0
- package/templates/vertical_gaming/src/init.ts.tmpl +21 -0
- package/templates/vertical_health/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_health/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_health/.claude/skills/wellness-intake/SKILL.md.tmpl +15 -0
- package/templates/vertical_health/CLAUDE.md.tmpl +30 -0
- package/templates/vertical_health/README.md.tmpl +29 -0
- package/templates/vertical_health/manifest.json +81 -0
- package/templates/vertical_health/package.json.tmpl +30 -0
- package/templates/vertical_health/src/agents/care-coordinator.ts.tmpl +7 -0
- package/templates/vertical_health/src/agents/intake.ts.tmpl +7 -0
- package/templates/vertical_health/src/agents/triage.ts.tmpl +7 -0
- package/templates/vertical_health/src/init.ts.tmpl +21 -0
- package/templates/vertical_legal/.claude/settings.json.tmpl +10 -0
- package/templates/vertical_legal/CLAUDE.md.tmpl +24 -0
- package/templates/vertical_legal/README.md.tmpl +21 -0
- package/templates/vertical_legal/manifest.json +20 -0
- package/templates/vertical_legal/package.json.tmpl +13 -0
- package/templates/vertical_legal/src/agents/citation-checker.ts.tmpl +7 -0
- package/templates/vertical_legal/src/agents/redline.ts.tmpl +7 -0
- package/templates/vertical_legal/src/agents/risk-rater.ts.tmpl +8 -0
- package/templates/vertical_legal/src/init.ts.tmpl +13 -0
- package/templates/vertical_marketing/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_marketing/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_marketing/.claude/skills/campaign-brief/SKILL.md.tmpl +13 -0
- package/templates/vertical_marketing/CLAUDE.md.tmpl +30 -0
- package/templates/vertical_marketing/README.md.tmpl +29 -0
- package/templates/vertical_marketing/manifest.json +81 -0
- package/templates/vertical_marketing/package.json.tmpl +30 -0
- package/templates/vertical_marketing/src/agents/content-creator.ts.tmpl +7 -0
- package/templates/vertical_marketing/src/agents/seo-analyst.ts.tmpl +7 -0
- package/templates/vertical_marketing/src/agents/strategist.ts.tmpl +7 -0
- package/templates/vertical_marketing/src/init.ts.tmpl +21 -0
- package/templates/vertical_repo-maintainer/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_repo-maintainer/.claude/commands/release-check.md.tmpl +13 -0
- package/templates/vertical_repo-maintainer/.claude/commands/repo-triage.md.tmpl +16 -0
- package/templates/vertical_repo-maintainer/.claude/settings.json.tmpl +44 -0
- package/templates/vertical_repo-maintainer/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_repo-maintainer/.claude/skills/plan-change/SKILL.md.tmpl +15 -0
- package/templates/vertical_repo-maintainer/CLAUDE.md.tmpl +34 -0
- package/templates/vertical_repo-maintainer/README.md.tmpl +30 -0
- package/templates/vertical_repo-maintainer/manifest.json +101 -0
- package/templates/vertical_repo-maintainer/package.json.tmpl +30 -0
- package/templates/vertical_repo-maintainer/src/agents/benchmarker.ts.tmpl +7 -0
- package/templates/vertical_repo-maintainer/src/agents/maintainer.ts.tmpl +7 -0
- package/templates/vertical_repo-maintainer/src/agents/release.ts.tmpl +7 -0
- package/templates/vertical_repo-maintainer/src/agents/security.ts.tmpl +7 -0
- package/templates/vertical_repo-maintainer/src/init.ts.tmpl +21 -0
- package/templates/vertical_research/.claude/settings.json.tmpl +9 -0
- package/templates/vertical_research/CLAUDE.md.tmpl +33 -0
- package/templates/vertical_research/README.md.tmpl +17 -0
- package/templates/vertical_research/manifest.json +23 -0
- package/templates/vertical_research/package.json.tmpl +13 -0
- package/templates/vertical_research/src/agents/citer.ts.tmpl +8 -0
- package/templates/vertical_research/src/agents/fact-checker.ts.tmpl +8 -0
- package/templates/vertical_research/src/agents/scout.ts.tmpl +7 -0
- package/templates/vertical_research/src/agents/source-grader.ts.tmpl +10 -0
- package/templates/vertical_research/src/agents/synthesizer.ts.tmpl +8 -0
- package/templates/vertical_research/src/agents/web-searcher.ts.tmpl +6 -0
- package/templates/vertical_research/src/init.ts.tmpl +13 -0
- package/templates/vertical_ruview/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_ruview/.claude/settings.json.tmpl +33 -0
- package/templates/vertical_ruview/.claude/skills/index-and-ask/SKILL.md.tmpl +15 -0
- package/templates/vertical_ruview/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_ruview/CLAUDE.md.tmpl +31 -0
- package/templates/vertical_ruview/README.md.tmpl +29 -0
- package/templates/vertical_ruview/manifest.json +86 -0
- package/templates/vertical_ruview/package.json.tmpl +30 -0
- package/templates/vertical_ruview/src/agents/indexer.ts.tmpl +7 -0
- package/templates/vertical_ruview/src/agents/retriever.ts.tmpl +7 -0
- package/templates/vertical_ruview/src/agents/reviewer.ts.tmpl +7 -0
- package/templates/vertical_ruview/src/init.ts.tmpl +21 -0
- package/templates/vertical_sales/.claude/commands/doctor.md.tmpl +12 -0
- package/templates/vertical_sales/.claude/commands/pipeline-report.md.tmpl +13 -0
- package/templates/vertical_sales/.claude/settings.json.tmpl +45 -0
- package/templates/vertical_sales/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -0
- package/templates/vertical_sales/.claude/skills/qualify-lead/SKILL.md.tmpl +15 -0
- package/templates/vertical_sales/CLAUDE.md.tmpl +33 -0
- package/templates/vertical_sales/README.md.tmpl +30 -0
- package/templates/vertical_sales/manifest.json +96 -0
- package/templates/vertical_sales/package.json.tmpl +30 -0
- package/templates/vertical_sales/src/agents/closer.ts.tmpl +7 -0
- package/templates/vertical_sales/src/agents/demo-coach.ts.tmpl +7 -0
- package/templates/vertical_sales/src/agents/prospector.ts.tmpl +7 -0
- package/templates/vertical_sales/src/agents/qualifier.ts.tmpl +7 -0
- package/templates/vertical_sales/src/init.ts.tmpl +21 -0
- package/templates/vertical_support/.claude/settings.json.tmpl +25 -0
- package/templates/vertical_support/CLAUDE.md.tmpl +34 -0
- package/templates/vertical_support/README.md.tmpl +16 -0
- package/templates/vertical_support/kb/README.md.tmpl +23 -0
- package/templates/vertical_support/manifest.json +22 -0
- package/templates/vertical_support/package.json.tmpl +24 -0
- package/templates/vertical_support/src/agents/escalator.ts.tmpl +6 -0
- package/templates/vertical_support/src/agents/kb-searcher.ts.tmpl +6 -0
- package/templates/vertical_support/src/agents/responder.ts.tmpl +7 -0
- package/templates/vertical_support/src/agents/triager.ts.tmpl +6 -0
- package/templates/vertical_support/src/init.ts.tmpl +16 -0
- package/templates/vertical_trading/.claude/settings.json.tmpl +20 -0
- package/templates/vertical_trading/CLAUDE.md.tmpl +24 -0
- package/templates/vertical_trading/README.md.tmpl +17 -0
- package/templates/vertical_trading/manifest.json +22 -0
- package/templates/vertical_trading/package.json.tmpl +13 -0
- package/templates/vertical_trading/src/agents/executor.ts.tmpl +8 -0
- package/templates/vertical_trading/src/agents/market-watcher.ts.tmpl +7 -0
- package/templates/vertical_trading/src/agents/postmortem.ts.tmpl +8 -0
- package/templates/vertical_trading/src/agents/risk-checker.ts.tmpl +11 -0
- package/templates/vertical_trading/src/agents/signal-gen.ts.tmpl +8 -0
- 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
|
package/dist/diag.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag.js","sourceRoot":"","sources":["../src/diag.ts"],"names":[],"mappings":"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"}
|
package/dist/eject.d.ts
ADDED
|
@@ -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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"}
|