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