harness-everything 0.3.6 → 0.4.1
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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +8 -7
- package/.github/workflows/behavioral-evals.yml +3 -3
- package/.github/workflows/ci.yml +49 -28
- package/.github/workflows/release.yml +52 -27
- package/.nvmrc +1 -0
- package/.releaserc.json +113 -0
- package/AGENTS.md +44 -24
- package/BENCHMARK_SOP.md +38 -18
- package/CHANGELOG.md +196 -3
- package/CONTRIBUTING.md +37 -9
- package/Dockerfile +1 -1
- package/PRIVACY.md +25 -0
- package/README.md +126 -91
- package/RELEASING.md +93 -0
- package/SUPPORT.md +27 -0
- package/TERMS.md +21 -0
- package/VERIFICATION.md +192 -284
- package/behavioral-evals/README.md +21 -0
- package/behavioral-evals/case-validator.js +194 -0
- package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
- package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
- package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
- package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
- package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
- package/behavioral-evals/cases/baseline-git-commit.yaml +2 -2
- package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
- package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
- package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
- package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
- package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
- package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
- package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
- package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
- package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
- package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
- package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +2 -2
- package/behavioral-evals/cases/pressure-complexity-skip.yaml +2 -2
- package/behavioral-evals/cases/pressure-scope-bypass.yaml +7 -2
- package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +7 -4
- package/behavioral-evals/cases/scope-discipline.yaml +2 -1
- package/behavioral-evals/cases/verify-before-done.yaml +7 -5
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
- package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
- package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
- package/behavioral-evals/evidence-tool.js +443 -0
- package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
- package/behavioral-evals/fixtures/claude-legacy.json +1 -0
- package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
- package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
- package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
- package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
- package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
- package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
- package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
- package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
- package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
- package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
- package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
- package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
- package/behavioral-evals/run-with-plugin.js +15 -31
- package/behavioral-evals/run.js +446 -105
- package/behavioral-evals/transcript-parser.js +591 -0
- package/bin/cli.js +24 -12
- package/ci/ab-test-cases/grill-me-adversarial.yaml +14 -4
- package/ci/ab-test-cases/tdd-test-first.yaml +13 -6
- package/ci/ab-test-cases/verification-loop-gates.yaml +20 -7
- package/ci/ab-test-cases/verify-before-claim-cites.yaml +7 -6
- package/ci/ab-test-harness.js +113 -38
- package/ci/action-gate-platform-doc.test.js +31 -0
- package/ci/action-gate.test.js +260 -0
- package/ci/cases/case2.json +2 -2
- package/ci/consistency-check.js +51 -5
- package/ci/description-collision.js +15 -6
- package/ci/disclosure-check.js +225 -0
- package/ci/doc-capability-consistency.test.js +180 -0
- package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
- package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
- package/ci/installer-roundtrip.test.js +159 -0
- package/ci/invariant-routing.test.js +74 -0
- package/ci/issue99-runtime.test.js +218 -0
- package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
- package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
- package/ci/mechanism-2j-behavioral-runner.test.js +43 -1
- package/ci/mechanism-2k-reference-check.test.js +57 -2
- package/ci/mechanism-2l-multi-agent-workspace.test.js +202 -6
- package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
- package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
- package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
- package/ci/mechanism-2p-installer-links.test.js +183 -0
- package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
- package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
- package/ci/mechanism-2s-tdd-quality.test.js +203 -0
- package/ci/mechanism-2t-disclosure.test.js +90 -0
- package/ci/mechanism-2t-evidence-triage.test.js +200 -0
- package/ci/mechanism-2t-issue-20.test.js +75 -0
- package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
- package/ci/mechanism-2t-transcript-parser.test.js +179 -0
- package/ci/mechanism-2t-workspace-identity.test.js +200 -0
- package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
- package/ci/mechanism-2u-issue-44.test.js +35 -0
- package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
- package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
- package/ci/mechanism-2x-release-automation.test.js +157 -0
- package/ci/mechanism-2x-release-commit-message.test.js +66 -0
- package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
- package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
- package/ci/mutation-check.js +53 -0
- package/ci/mutation-loader.js +57 -0
- package/ci/negative-controls.js +76 -46
- package/ci/openai-plugin-package.test.js +182 -0
- package/ci/openai-plugin-runtime.test.js +175 -0
- package/ci/openai-plugin-submission.test.js +101 -0
- package/ci/phase4-ensemble-memory.test.js +307 -0
- package/ci/reference-check.js +73 -25
- package/ci/release-consistency-check.js +24 -1
- package/ci/repository-contract.test.js +17 -0
- package/ci/router-phase2-safety.test.js +81 -0
- package/ci/router-workflow-plan.test.js +264 -0
- package/ci/routing-check.js +6 -5
- package/ci/runner.js +6 -5
- package/ci/skill-routing-check.js +48 -11
- package/ci/test-behavioral-case-validation.js +62 -0
- package/ci/test-helper.js +10 -0
- package/ci/workflow-plan-consumers-edge.test.js +72 -0
- package/ci/workflow-plan-consumers.test.js +276 -0
- package/docs/architecture.md +137 -57
- package/docs/audit.md +22 -20
- package/docs/codex-action-gate.md +90 -0
- package/docs/issue-20-rollup.md +47 -0
- package/docs/mechanism-first-skill-mesh.md +22 -20
- package/docs/openai-plugin.md +118 -0
- package/docs/philosophy.md +28 -17
- package/docs/platform-capabilities.md +73 -0
- package/docs/platform-compatibility.json +270 -0
- package/docs/reflection.md +37 -22
- package/docs/release-evidence.md +27 -0
- package/docs/repository-contract.md +27 -0
- package/docs/routing.md +157 -44
- package/docs/security-audit.md +38 -0
- package/docs/troubleshooting.md +94 -51
- package/docs/verifier-boundaries.md +45 -0
- package/docs/workflows/fable-mode.md +77 -21
- package/docs/workflows/find-skills.md +40 -0
- package/docs/workflows/grill-with-docs.md +2 -2
- package/docs/workflows/multi-agent-workspace.md +22 -10
- package/docs/workflows/self-evolve.md +33 -0
- package/docs/workflows/tdd.md +36 -0
- package/docs/workflows/todo-driven-workflow.md +33 -0
- package/environment-detection/SKILL.md +3 -3
- package/eval-harness/SKILL.md +7 -7
- package/eval-harness/scripts/evaluate.js +12 -10
- package/evals/evaluation-reports.md +14 -0
- package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
- package/evals/install-cognitive-os/tasks/positive-trigger.yaml +1 -1
- package/fable-discipline/SKILL.md +2 -2
- package/fable-mode/CONTRACT-FORMAT.md +147 -33
- package/fable-mode/SKILL.md +3 -3
- package/fable-mode/agents/fable-orchestrator.md +95 -35
- package/fable-mode/execution-guardrails/SKILL.md +2 -2
- package/fable-mode/fable-haiku/SKILL.md +3 -3
- package/fable-mode/fable-opus/SKILL.md +3 -3
- package/fable-mode/fable-sonnet/SKILL.md +3 -3
- package/fable-mode/scripts/ensemble-review.js +371 -0
- package/fable-mode/scripts/model-selector.js +134 -3
- package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
- package/find-skills/SKILL.md +5 -5
- package/find-skills/references/discovery-flow.md +1 -1
- package/find-skills/scripts/use-skill.js +7 -1
- package/git-commit/SKILL.md +4 -11
- package/grill-me/SKILL.md +5 -5
- package/grill-with-docs/SKILL.md +7 -7
- package/grill-with-docs/references/session-playbook.md +6 -4
- package/harness-everything/SKILL.md +23 -22
- package/harness-everything/references/router-workflow-plan.md +128 -0
- package/harness-everything/references/triage-and-tiers.md +173 -96
- package/harness-everything/schemas/router-task-shape.schema.json +126 -0
- package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
- package/harness-everything/scripts/bootstrap.js +13 -4
- package/harness-everything/scripts/ensemble-policy.js +102 -0
- package/harness-everything/scripts/kernel-router.js +212 -0
- package/harness-everything/scripts/router-contract.js +612 -0
- package/harness-everything/scripts/self-heal.js +29 -20
- package/harness-everything/scripts/tier-router.js +346 -221
- package/hooks/hooks.json +60 -15
- package/hooks/scripts/action-gate-rules.json +77 -0
- package/hooks/scripts/action-gate.js +528 -0
- package/hooks/scripts/atomic-commit-check.js +5 -5
- package/hooks/scripts/codex-action-gate-post.js +46 -0
- package/hooks/scripts/codex-permission-request.js +140 -0
- package/hooks/scripts/context-compact.js +4 -3
- package/hooks/scripts/contract-test.js +118 -51
- package/hooks/scripts/lib/fable-contracts.js +121 -0
- package/hooks/scripts/lib/harness-state.js +164 -28
- package/hooks/scripts/lib/platforms/claude.js +45 -62
- package/hooks/scripts/lib/platforms/codex.js +35 -61
- package/hooks/scripts/lib/platforms/continue.js +7 -7
- package/hooks/scripts/lib/platforms/copilot.js +29 -53
- package/hooks/scripts/lib/platforms/hermes.js +71 -20
- package/hooks/scripts/openai-session-start.js +81 -0
- package/hooks/scripts/rule-of-3-tracker.js +9 -8
- package/hooks/scripts/rule-of-3.js +29 -21
- package/hooks/scripts/state-persist.js +5 -4
- package/hooks/scripts/stop-gate.js +2 -2
- package/hooks/scripts/subagent-scope-guard.js +144 -38
- package/hooks/scripts/subagent-start.js +19 -0
- package/hooks/scripts/subagent-stop.js +6 -0
- package/improve-codebase-architecture/SKILL.md +2 -4
- package/improve-codebase-architecture/references/README.md +16 -0
- package/install-cognitive-os/SKILL.md +28 -22
- package/multi-agent-workspace/SKILL.md +16 -15
- package/multi-agent-workspace/references/architecture-guide.md +13 -9
- package/multi-agent-workspace/references/orchestration.md +39 -22
- package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
- package/multi-agent-workspace/scripts/index_memory.js +79 -26
- package/multi-agent-workspace/scripts/path-boundary.js +59 -0
- package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
- package/multi-agent-workspace/scripts/scaffold.js +258 -103
- package/multi-agent-workspace/templates/AGENTS.md +20 -0
- package/multi-agent-workspace/workflows/03-generation.md +8 -10
- package/multi-agent-workspace/workflows/04-launcher.md +5 -5
- package/opencode-plugin/README.md +114 -71
- package/opencode-plugin/hooks/verify.js +62 -12
- package/opencode-plugin/index.mjs +547 -0
- package/opencode-plugin/plugin.json +4 -12
- package/package.json +20 -4
- package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
- package/plugins/harness-everything/hooks/hooks.json +197 -0
- package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
- package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
- package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
- package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
- package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
- package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
- package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
- package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
- package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
- package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
- package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
- package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
- package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
- package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
- package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
- package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
- package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
- package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
- package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
- package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
- package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
- package/plugins/harness-everything/hooks/session-start.js +81 -0
- package/plugins/harness-everything/plugin.json +43 -0
- package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
- package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
- package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
- package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
- package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
- package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
- package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
- package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
- package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
- package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
- package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
- package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
- package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
- package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
- package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
- package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
- package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
- package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
- package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
- package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
- package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
- package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
- package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
- package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
- package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
- package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
- package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
- package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
- package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
- package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
- package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
- package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
- package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
- package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
- package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
- package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
- package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
- package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
- package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
- package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
- package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
- package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
- package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
- package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
- package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
- package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
- package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
- package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
- package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
- package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
- package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
- package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
- package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
- package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
- package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
- package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
- package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
- package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
- package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
- package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
- package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
- package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
- package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
- package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
- package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
- package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
- package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
- package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
- package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
- package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
- package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
- package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
- package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
- package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
- package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
- package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
- package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
- package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
- package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
- package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
- package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
- package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
- package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
- package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
- package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
- package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
- package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
- package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
- package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
- package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
- package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
- package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
- package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
- package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
- package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
- package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
- package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
- package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
- package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
- package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
- package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
- package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
- package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
- package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
- package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
- package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
- package/repo-docs/SKILL.md +3 -7
- package/rewrite-commits/SKILL.md +2 -2
- package/scripts/build-openai-submission.js +158 -0
- package/scripts/installer.js +86 -11
- package/scripts/lib/advisory-text.js +25 -18
- package/scripts/lib/execution-contract.js +70 -0
- package/scripts/lib/manifest.js +34 -38
- package/scripts/lib/path-boundary.js +90 -0
- package/scripts/lib/skills.js +124 -70
- package/scripts/lib/workspace.js +269 -7
- package/scripts/repository-contract.js +213 -0
- package/scripts/sync-current-docs.js +12 -0
- package/scripts/sync-openai-plugin.js +91 -0
- package/scripts/sync-release-version.js +212 -0
- package/security-review/SKILL.md +4 -7
- package/security-review/scripts/audit-secrets.js +9 -8
- package/self-evolve/SKILL.md +9 -11
- package/self-evolve/references/memory-resolution.md +4 -1
- package/self-evolve/scripts/persist-memory.js +221 -88
- package/self-evolve/scripts/register-dynamic-skill.js +12 -10
- package/self-evolve/scripts/self-regression.js +23 -8
- package/skill-creator/SKILL.md +12 -14
- package/skill-creator/references/quality-checklist.md +1 -0
- package/skill-style/SKILL.md +4 -4
- package/skill-style/references/style-guide.md +29 -3
- package/submission/openai/README.md +67 -0
- package/submission/openai/listing.json +31 -0
- package/submission/openai/test-cases.json +61 -0
- package/tdd/SKILL.md +20 -26
- package/tdd/fixtures/pass-evidence.json +100 -0
- package/tdd/fixtures/quality-scenarios.json +20 -0
- package/tdd/references/core-discipline.md +2 -0
- package/tdd/references/integration-testing.md +13 -0
- package/tdd/references/quality-model.md +68 -0
- package/tdd/references/unit-testing.md +15 -0
- package/tdd/schemas/quality-evidence.schema.json +211 -0
- package/tdd/schemas/quality-report.schema.json +110 -0
- package/tdd/scripts/quality-gate.js +475 -0
- package/to-spec/SKILL.md +3 -5
- package/to-spec/scripts/check-project-docs.js +42 -62
- package/to-spec/scripts/project-docs-resolver.js +111 -0
- package/to-tickets/SKILL.md +4 -4
- package/todo-driven-workflow/SKILL.md +6 -4
- package/using-git-worktrees/SKILL.md +3 -3
- package/verification-loop/SKILL.md +4 -4
- package/verify-before-claim/SKILL.md +2 -2
- package/zoom-out/SKILL.md +4 -4
- package/ab-test-deep-analysis-2026-08-27.md +0 -383
- package/ab-test-results-2026-08-27.md +0 -152
- package/ab-test-statistical-analysis-31cases.md +0 -193
- package/opencode-plugin/hooks/circuit-breaker.js +0 -121
- package/opencode-plugin/hooks/compliance.js +0 -128
- package/opencode-plugin/hooks/post-edit.js +0 -62
- package/opencode-plugin/hooks/pre-complete.js +0 -65
- package/opencode-plugin/test-hook-firing.js +0 -198
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { execFileSync } = require('child_process');
|
|
7
|
+
const {
|
|
8
|
+
ZONES: DOCUMENT_ZONES,
|
|
9
|
+
getWorkspaceRoot,
|
|
10
|
+
resolveProjectDocs,
|
|
11
|
+
ensureCommittableFallback
|
|
12
|
+
} = require('./project-docs-resolver');
|
|
13
|
+
const {
|
|
14
|
+
SUPPORTED_PLATFORMS,
|
|
15
|
+
readAgencyCatalog,
|
|
16
|
+
resolveSelection
|
|
17
|
+
} = require('./agency-catalog');
|
|
18
|
+
const { assertContainedPath } = require('./path-boundary');
|
|
19
|
+
|
|
20
|
+
const GENERATOR = 'harness-everything/multi-agent-workspace';
|
|
21
|
+
const RUNTIME_ZONES = Object.freeze(['state', 'logs', 'roles']);
|
|
22
|
+
const ALL_ZONES = Object.freeze(['state', 'logs', 'decisions', 'domain', 'architecture', 'roles']);
|
|
23
|
+
const ROUTER_TEMPLATE = path.join(__dirname, '..', 'templates', 'AGENTS.md');
|
|
24
|
+
|
|
25
|
+
function values(args, name) {
|
|
26
|
+
const result = [];
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
if (args[i] !== name) continue;
|
|
29
|
+
if (!args[i + 1] || args[i + 1].startsWith('--')) throw new Error(`${name} requires a value`);
|
|
30
|
+
result.push(args[++i]);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function commaValues(args, name) {
|
|
36
|
+
return values(args, name).flatMap(value => value.split(',')).map(value => value.trim()).filter(Boolean);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function parseArgs(args) {
|
|
40
|
+
if (args.includes('--help') || args.includes('-h')) return { help: true };
|
|
41
|
+
const explicitWorkspace = values(args, '--workspace')[0];
|
|
42
|
+
const workspace = explicitWorkspace || getWorkspaceRoot();
|
|
43
|
+
if (!workspace) {
|
|
44
|
+
throw new Error('cannot infer a workspace outside a git repository; pass --workspace <path> explicitly');
|
|
45
|
+
}
|
|
46
|
+
const sourceValues = values(args, '--agency-source');
|
|
47
|
+
const platform = values(args, '--platform')[0] || null;
|
|
48
|
+
if (platform && !SUPPORTED_PLATFORMS.includes(platform)) {
|
|
49
|
+
throw new Error(`unsupported platform "${platform}"; supported: ${SUPPORTED_PLATFORMS.join(', ')}`);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
workspace: path.resolve(workspace),
|
|
53
|
+
source: sourceValues[0] || process.env.AGENCY_AGENTS_SOURCE || null,
|
|
54
|
+
platform,
|
|
55
|
+
divisions: commaValues(args, '--division'),
|
|
56
|
+
agents: commaValues(args, '--agent'),
|
|
57
|
+
allAgents: args.includes('--all-agents'),
|
|
58
|
+
expectedRevision: values(args, '--expected-agency-revision')[0] || null,
|
|
59
|
+
allowSourceDrift: args.includes('--allow-source-drift'),
|
|
60
|
+
force: args.includes('--force')
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function json(value) {
|
|
65
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function readExistingManifest(runtimeRoot) {
|
|
69
|
+
const file = path.join(runtimeRoot, 'manifest.json');
|
|
70
|
+
if (!fs.existsSync(file)) return null;
|
|
71
|
+
try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
72
|
+
catch (error) { throw new Error(`existing runtime manifest is invalid: ${error.message}`); }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function detectStack(workspaceRoot) {
|
|
76
|
+
const names = new Set(fs.readdirSync(workspaceRoot, { withFileTypes: true })
|
|
77
|
+
.filter(entry => entry.isFile()).map(entry => entry.name));
|
|
78
|
+
if (names.has('package.json')) return 'node';
|
|
79
|
+
if (names.has('pyproject.toml') || names.has('requirements.txt')) return 'python';
|
|
80
|
+
if (names.has('Cargo.toml')) return 'rust';
|
|
81
|
+
if (names.has('go.mod')) return 'go';
|
|
82
|
+
return 'polyglot';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function gitRevision(root) {
|
|
86
|
+
if (!fs.existsSync(path.join(root, '.git'))) return null;
|
|
87
|
+
try { return execFileSync('git', ['-C', root, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); }
|
|
88
|
+
catch { return null; }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function renderRouter(manifest) {
|
|
92
|
+
const values = {
|
|
93
|
+
RUNTIME_ROOT: manifest.runtime.root,
|
|
94
|
+
RUNTIME_STATE: manifest.runtime.state,
|
|
95
|
+
RUNTIME_LOGS: manifest.runtime.logs,
|
|
96
|
+
LAUNCHER: path.join(manifest.runtime.root, 'launcher.md'),
|
|
97
|
+
DECISION_PATH: manifest.paths.decision.path,
|
|
98
|
+
DOMAIN_PATH: manifest.paths.domain.path,
|
|
99
|
+
ARCHITECTURE_PATH: manifest.paths.architecture.path
|
|
100
|
+
};
|
|
101
|
+
const template = fs.readFileSync(ROUTER_TEMPLATE, 'utf8');
|
|
102
|
+
return template.replace(/\{\{([A-Z_]+)\}\}/g, (match, name) => {
|
|
103
|
+
if (!(name in values)) throw new Error(`router template placeholder is unknown: ${name}`);
|
|
104
|
+
return values[name];
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function renderLauncher(manifest, selectedAgents) {
|
|
109
|
+
const lines = [
|
|
110
|
+
'# Multi-Agent Launcher', '',
|
|
111
|
+
`Generator: ${GENERATOR}`,
|
|
112
|
+
`Runtime: ${manifest.runtime.root}`,
|
|
113
|
+
`Workspace: ${manifest.workspace.root}`,
|
|
114
|
+
`Platform: ${manifest.workspace.platform || 'generic'}`,
|
|
115
|
+
`Stack: ${manifest.workspace.stack}`,
|
|
116
|
+
'',
|
|
117
|
+
'The installed multi-agent-workspace skill and indexer are immutable. Read',
|
|
118
|
+
'manifest.json and handoff.json from the runtime root before dispatching.',
|
|
119
|
+
'', '## Resolved document paths', ''
|
|
120
|
+
];
|
|
121
|
+
for (const zone of DOCUMENT_ZONES) {
|
|
122
|
+
const entry = manifest.paths[zone];
|
|
123
|
+
lines.push(`- ${zone}: ${entry.path} (${entry.source})`);
|
|
124
|
+
}
|
|
125
|
+
lines.push('', '## Selected Specialists', '');
|
|
126
|
+
if (!selectedAgents.length) {
|
|
127
|
+
lines.push('- None selected. Configure an agency source and rerun with --agent or --division.');
|
|
128
|
+
} else {
|
|
129
|
+
for (const agent of selectedAgents) {
|
|
130
|
+
lines.push(`- **${agent.name}** [${agent.division}] - ${agent.description}`);
|
|
131
|
+
lines.push(` - slug: \`${agent.slug}\`; source file: \`${agent.sourceFile}\``);
|
|
132
|
+
lines.push(' - boundary: only the files and deliverables named in the dispatch brief.');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
lines.push('', '## Handoff Schema', '', 'Return `status`, `changes`, `verification`, `risks`, and `nextAction`.', '');
|
|
136
|
+
return lines.join('\n');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function listFiles(root) {
|
|
140
|
+
const files = [];
|
|
141
|
+
if (!fs.existsSync(root)) return files;
|
|
142
|
+
for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
|
|
143
|
+
const full = path.join(root, entry.name);
|
|
144
|
+
if (entry.isDirectory()) files.push(...listFiles(full));
|
|
145
|
+
else if (entry.isFile()) files.push(full);
|
|
146
|
+
}
|
|
147
|
+
return files;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function sameFile(left, right) {
|
|
151
|
+
try { return fs.readFileSync(left).equals(fs.readFileSync(right)); }
|
|
152
|
+
catch { return false; }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function isSamePath(left, right) {
|
|
156
|
+
const a = path.resolve(left);
|
|
157
|
+
const b = path.resolve(right);
|
|
158
|
+
return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function migrationTargetKey(target) {
|
|
162
|
+
const resolved = path.normalize(path.resolve(target));
|
|
163
|
+
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function generatedLegacyArtifact(file, manifest) {
|
|
167
|
+
const name = path.basename(file);
|
|
168
|
+
if (name === 'manifest.json') {
|
|
169
|
+
// The pre-#43 manifest had no schema marker, but was still Harness-owned
|
|
170
|
+
// because it lived at the reserved legacy root.
|
|
171
|
+
return manifest && (manifest.generator === GENERATOR || Object.keys(manifest).length === 0);
|
|
172
|
+
}
|
|
173
|
+
if (name === 'handoff.json') return manifest && manifest.generator === GENERATOR;
|
|
174
|
+
if (name === 'AGENTS.md') return /^# Multi-Agent Workspace Router\b/m.test(fs.readFileSync(file, 'utf8'));
|
|
175
|
+
if (name === 'launcher.md') return /^# Multi-Agent Launcher\b/m.test(fs.readFileSync(file, 'utf8'));
|
|
176
|
+
if (name === 'index_memory.js') return /^#!\/usr\/bin\/env node\b/m.test(fs.readFileSync(file, 'utf8'));
|
|
177
|
+
if (name === 'memory-index.md') return /^# Multi-Agent Memory Index\b/m.test(fs.readFileSync(file, 'utf8'));
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function removeEmptyParents(start, stop) {
|
|
182
|
+
let current = start;
|
|
183
|
+
const boundary = path.resolve(stop);
|
|
184
|
+
while (path.resolve(current) !== boundary) {
|
|
185
|
+
const relative = path.relative(boundary, current);
|
|
186
|
+
if (relative.startsWith('..') || path.isAbsolute(relative)) break;
|
|
187
|
+
try {
|
|
188
|
+
if (fs.readdirSync(current).length) break;
|
|
189
|
+
fs.rmdirSync(current);
|
|
190
|
+
} catch { break; }
|
|
191
|
+
current = path.dirname(current);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Migrate authored records from the pre-#43 repository-local output only
|
|
196
|
+
// after every destination conflict has been checked. Generated router,
|
|
197
|
+
// launcher, indexer, and runtime files are intentionally not copied.
|
|
198
|
+
function migrateLegacyWorkspace(workspaceRoot, resolution) {
|
|
199
|
+
const legacyRoot = path.join(workspaceRoot, '.harness', 'multi-agent');
|
|
200
|
+
if (!fs.existsSync(legacyRoot)) return null;
|
|
201
|
+
// The legacy root is an input boundary, not an allowed link target. A
|
|
202
|
+
// junction here could make the migration read and delete authored files
|
|
203
|
+
// outside the workspace while every lexical path still looks local.
|
|
204
|
+
assertContainedPath(workspaceRoot, legacyRoot);
|
|
205
|
+
const legacyBoundary = path.resolve(legacyRoot);
|
|
206
|
+
const copies = [];
|
|
207
|
+
const plannedTargets = new Map();
|
|
208
|
+
for (const zone of DOCUMENT_ZONES) {
|
|
209
|
+
const legacyZone = path.join(legacyRoot, zone === 'decision' ? 'decisions' : zone);
|
|
210
|
+
const destination = resolution.paths[zone].path;
|
|
211
|
+
for (const source of listFiles(legacyZone)) {
|
|
212
|
+
if (path.basename(source) === '.gitkeep') continue;
|
|
213
|
+
const relative = path.relative(legacyZone, source);
|
|
214
|
+
const target = path.join(destination, relative);
|
|
215
|
+
const containedSource = assertContainedPath(legacyRoot, source).target;
|
|
216
|
+
const containedTarget = assertContainedPath(workspaceRoot, target).target;
|
|
217
|
+
if (isSamePath(containedSource, containedTarget)) continue;
|
|
218
|
+
const targetFromLegacy = path.relative(legacyBoundary, containedTarget);
|
|
219
|
+
if (!targetFromLegacy.startsWith('..') && !path.isAbsolute(targetFromLegacy)) {
|
|
220
|
+
throw new Error(`migration destination is inside legacy workspace: ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
|
|
221
|
+
}
|
|
222
|
+
const targetKey = migrationTargetKey(containedTarget);
|
|
223
|
+
if (plannedTargets.has(targetKey)) {
|
|
224
|
+
throw new Error(`migration conflict: multiple legacy records target ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
|
|
225
|
+
}
|
|
226
|
+
plannedTargets.set(targetKey, containedSource);
|
|
227
|
+
if (fs.existsSync(containedTarget) && !sameFile(containedSource, containedTarget)) {
|
|
228
|
+
throw new Error(`migration conflict: ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
|
|
229
|
+
}
|
|
230
|
+
copies.push({ source: containedSource, target: containedTarget });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
for (const copy of copies) {
|
|
235
|
+
fs.mkdirSync(path.dirname(copy.target), { recursive: true });
|
|
236
|
+
if (!fs.existsSync(copy.target)) fs.copyFileSync(copy.source, copy.target);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Remove known generated artifacts only once migration has fully succeeded.
|
|
240
|
+
let legacyManifest = null;
|
|
241
|
+
const manifestPath = path.join(legacyRoot, 'manifest.json');
|
|
242
|
+
if (fs.existsSync(manifestPath)) {
|
|
243
|
+
try { legacyManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); } catch { legacyManifest = null; }
|
|
244
|
+
}
|
|
245
|
+
const generated = ['manifest.json', 'AGENTS.md', 'launcher.md', 'index_memory.js', 'memory-index.md', 'handoff.json'];
|
|
246
|
+
for (const name of generated) {
|
|
247
|
+
const file = path.join(legacyRoot, name);
|
|
248
|
+
if (fs.existsSync(file) && generatedLegacyArtifact(file, legacyManifest)) fs.rmSync(file, { force: true });
|
|
249
|
+
}
|
|
250
|
+
for (const copy of copies) fs.rmSync(copy.source, { force: true });
|
|
251
|
+
for (const zone of ['roles', 'state', 'logs']) {
|
|
252
|
+
const runtimeZone = path.join(legacyRoot, zone);
|
|
253
|
+
if (fs.existsSync(runtimeZone)) fs.rmSync(runtimeZone, { recursive: true, force: true });
|
|
254
|
+
}
|
|
255
|
+
for (const zone of ['decisions', 'domain', 'architecture']) {
|
|
256
|
+
for (const marker of listFiles(path.join(legacyRoot, zone)).filter(file => path.basename(file) === '.gitkeep')) {
|
|
257
|
+
fs.rmSync(marker, { force: true });
|
|
258
|
+
}
|
|
259
|
+
removeEmptyParents(path.join(legacyRoot, zone), legacyRoot);
|
|
260
|
+
}
|
|
261
|
+
removeEmptyParents(legacyRoot, workspaceRoot);
|
|
262
|
+
return { from: legacyRoot, records: copies.length };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function writeRuntimeArtifacts(runtimeRoot, artifacts) {
|
|
266
|
+
for (const artifact of artifacts) {
|
|
267
|
+
fs.mkdirSync(path.dirname(artifact.path), { recursive: true });
|
|
268
|
+
fs.writeFileSync(artifact.path, artifact.content, 'utf8');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function runIndexer(workspaceRoot, runtimeRoot) {
|
|
273
|
+
const indexer = path.join(__dirname, 'index_memory.js');
|
|
274
|
+
const manifest = path.join(runtimeRoot, 'manifest.json');
|
|
275
|
+
const output = path.join(runtimeRoot, 'memory-index.md');
|
|
276
|
+
execFileSync(process.execPath, [indexer, '--workspace', workspaceRoot, '--manifest', manifest, '--output', output], { stdio: 'pipe' });
|
|
277
|
+
return output;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function scaffold(options) {
|
|
281
|
+
if (!fs.existsSync(options.workspace) || !fs.statSync(options.workspace).isDirectory()) {
|
|
282
|
+
throw new Error(`workspace not found: ${options.workspace}`);
|
|
283
|
+
}
|
|
284
|
+
const resolution = ensureCommittableFallback(resolveProjectDocs(options.workspace));
|
|
285
|
+
const runtimeRoot = resolution.runtimeRoot;
|
|
286
|
+
const existing = readExistingManifest(runtimeRoot);
|
|
287
|
+
if (existing && existing.generator !== GENERATOR) throw new Error('existing Harness runtime belongs to another generator');
|
|
288
|
+
|
|
289
|
+
const catalog = options.source ? readAgencyCatalog(options.source) : null;
|
|
290
|
+
if (options.expectedRevision && (!catalog || catalog.source.revision !== options.expectedRevision)) {
|
|
291
|
+
throw new Error(`agency source revision mismatch: expected ${options.expectedRevision}, got ${catalog && catalog.source.revision || '(unknown)'}`);
|
|
292
|
+
}
|
|
293
|
+
if (existing && existing.agency && existing.agency.sourceRevision &&
|
|
294
|
+
(!catalog || existing.agency.sourceRevision !== catalog.source.revision) && !options.allowSourceDrift) {
|
|
295
|
+
throw new Error(`agency source revision drift: existing ${existing.agency.sourceRevision}, current ${catalog && catalog.source.revision || '(unavailable)'}; pass --allow-source-drift to refresh`);
|
|
296
|
+
}
|
|
297
|
+
const selection = catalog
|
|
298
|
+
? resolveSelection(catalog, options.divisions, options.agents, options.allAgents)
|
|
299
|
+
: { divisionIds: [], agents: [] };
|
|
300
|
+
if (!catalog && (options.divisions.length || options.agents.length || options.allAgents)) {
|
|
301
|
+
throw new Error('cannot select agency agents without --agency-source or AGENCY_AGENTS_SOURCE');
|
|
302
|
+
}
|
|
303
|
+
const migration = migrateLegacyWorkspace(options.workspace, resolution);
|
|
304
|
+
for (const zone of DOCUMENT_ZONES) fs.mkdirSync(resolution.paths[zone].path, { recursive: true });
|
|
305
|
+
const agency = catalog
|
|
306
|
+
? { status: 'available', ...catalog.source, selectedCount: selection.agents.length, selectionRequired: selection.agents.length === 0 }
|
|
307
|
+
: { status: 'unavailable', reason: 'No agency source configured', requiredConfiguration: '--agency-source <path> or AGENCY_AGENTS_SOURCE', selectedCount: 0, selectionRequired: false };
|
|
308
|
+
const generatedAt = new Date().toISOString();
|
|
309
|
+
const manifest = {
|
|
310
|
+
schemaVersion: 2,
|
|
311
|
+
generator: GENERATOR,
|
|
312
|
+
workspace: {
|
|
313
|
+
root: resolution.workspaceRoot,
|
|
314
|
+
key: resolution.workspaceKey,
|
|
315
|
+
revision: gitRevision(options.workspace),
|
|
316
|
+
stack: detectStack(options.workspace),
|
|
317
|
+
platform: options.platform
|
|
318
|
+
},
|
|
319
|
+
runtime: {
|
|
320
|
+
root: runtimeRoot,
|
|
321
|
+
state: resolution.runtime.state,
|
|
322
|
+
logs: resolution.runtime.logs,
|
|
323
|
+
roles: resolution.runtime.roles,
|
|
324
|
+
manifest: path.join(runtimeRoot, 'manifest.json'),
|
|
325
|
+
handoff: path.join(runtimeRoot, 'handoff.json')
|
|
326
|
+
},
|
|
327
|
+
paths: resolution.paths,
|
|
328
|
+
zones: ALL_ZONES,
|
|
329
|
+
documentationZones: DOCUMENT_ZONES,
|
|
330
|
+
supportedPlatforms: SUPPORTED_PLATFORMS,
|
|
331
|
+
agency,
|
|
332
|
+
selectedDivisions: selection.divisionIds,
|
|
333
|
+
selectedAgents: selection.agents,
|
|
334
|
+
execution: { generatedAt, resolver: 'project-docs-resolver', migration },
|
|
335
|
+
artifactPaths: ['AGENTS.md', 'manifest.json', 'handoff.json', 'memory-index.md', 'launcher.md', 'roles/']
|
|
336
|
+
};
|
|
337
|
+
const catalogPayload = catalog
|
|
338
|
+
? { ...catalog, generatedBy: GENERATOR }
|
|
339
|
+
: { generatedBy: GENERATOR, status: 'unavailable', agents: [], divisions: [], reason: agency.reason };
|
|
340
|
+
const handoff = {
|
|
341
|
+
schemaVersion: 2,
|
|
342
|
+
status: selection.agents.length || agency.status !== 'available' ? 'ready' : 'selection-required',
|
|
343
|
+
generator: GENERATOR,
|
|
344
|
+
workspace: resolution.workspaceRoot,
|
|
345
|
+
runtimeRoot,
|
|
346
|
+
paths: resolution.paths,
|
|
347
|
+
selectedAgents: selection.agents.map(agent => agent.slug),
|
|
348
|
+
changes: [],
|
|
349
|
+
execution: { generatedAt, workspaceRevision: manifest.workspace.revision },
|
|
350
|
+
verification: { catalog: agency.status, indexer: 'pending' },
|
|
351
|
+
risks: [],
|
|
352
|
+
nextAction: selection.agents.length ? 'dispatch selected specialists with bounded briefs' : 'select specialists or configure AGENCY_AGENTS_SOURCE'
|
|
353
|
+
};
|
|
354
|
+
const artifacts = [
|
|
355
|
+
{ path: path.join(runtimeRoot, 'AGENTS.md'), content: renderRouter(manifest) },
|
|
356
|
+
{ path: path.join(runtimeRoot, 'manifest.json'), content: json(manifest) },
|
|
357
|
+
{ path: path.join(runtimeRoot, 'handoff.json'), content: json(handoff) },
|
|
358
|
+
{ path: path.join(runtimeRoot, 'launcher.md'), content: renderLauncher(manifest, selection.agents) },
|
|
359
|
+
{ path: path.join(runtimeRoot, 'roles', 'agency-catalog.json'), content: json(catalogPayload) },
|
|
360
|
+
{ path: path.join(runtimeRoot, 'roles', 'selected-agents.json'), content: json({ selected: selection.agents }) }
|
|
361
|
+
];
|
|
362
|
+
for (const zone of RUNTIME_ZONES) fs.mkdirSync(path.join(runtimeRoot, zone), { recursive: true });
|
|
363
|
+
writeRuntimeArtifacts(runtimeRoot, artifacts);
|
|
364
|
+
const memoryIndex = runIndexer(options.workspace, runtimeRoot);
|
|
365
|
+
handoff.verification.indexer = 'passed';
|
|
366
|
+
fs.writeFileSync(path.join(runtimeRoot, 'handoff.json'), json(handoff), 'utf8');
|
|
367
|
+
return { runtimeRoot, manifest, memoryIndex, resolution, migration };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function usage() {
|
|
371
|
+
return [
|
|
372
|
+
'Usage: node scripts/scaffold.js --workspace <path> [options]',
|
|
373
|
+
' --agency-source <path> Read divisions.json and agent frontmatter from this source',
|
|
374
|
+
' --division <id[,id]> Select every specialist in a division (repeatable)',
|
|
375
|
+
' --agent <slug[,name]> Select named specialists (repeatable)',
|
|
376
|
+
' --all-agents Explicitly select the complete metadata catalog',
|
|
377
|
+
' --platform <name> Validate a supported converter target',
|
|
378
|
+
' --allow-source-drift Accept a different source revision on refresh',
|
|
379
|
+
' --force Retained for compatibility; runtime files are Harness-owned'
|
|
380
|
+
].join('\n');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function main() {
|
|
384
|
+
try {
|
|
385
|
+
const options = parseArgs(process.argv.slice(2));
|
|
386
|
+
if (options.help) return console.log(usage());
|
|
387
|
+
const result = scaffold(options);
|
|
388
|
+
console.log(`Multi-agent runtime written to ${result.runtimeRoot}`);
|
|
389
|
+
console.log(` Documentation zones: ${result.manifest.documentationZones.length}`);
|
|
390
|
+
console.log(` Agency: ${result.manifest.agency.status}`);
|
|
391
|
+
console.log(` Selected agents: ${result.manifest.selectedAgents.length}`);
|
|
392
|
+
console.log(` Memory index: ${result.memoryIndex}`);
|
|
393
|
+
} catch (error) {
|
|
394
|
+
console.error(`ERROR: ${error.message}`);
|
|
395
|
+
process.exitCode = 1;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (require.main === module) main();
|
|
400
|
+
module.exports = {
|
|
401
|
+
GENERATOR,
|
|
402
|
+
ZONES: ALL_ZONES,
|
|
403
|
+
DOCUMENT_ZONES,
|
|
404
|
+
parseArgs,
|
|
405
|
+
migrateLegacyWorkspace,
|
|
406
|
+
scaffold,
|
|
407
|
+
usage
|
|
408
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Multi-Agent Workspace Router
|
|
2
|
+
|
|
3
|
+
This router is resolved from the installed `multi-agent-workspace` skill. Sub-agents MUST NOT modify it.
|
|
4
|
+
|
|
5
|
+
## Bootstrap Protocol
|
|
6
|
+
|
|
7
|
+
1. Read the task payload, then `{{RUNTIME_STATE}}`.
|
|
8
|
+
2. Read only the relevant document records:
|
|
9
|
+
- decision records at `{{DECISION_PATH}}`
|
|
10
|
+
- domain records at `{{DOMAIN_PATH}}`
|
|
11
|
+
- architecture records at `{{ARCHITECTURE_PATH}}`
|
|
12
|
+
3. Read `{{LAUNCHER}}` and the selected roles before delegating.
|
|
13
|
+
4. Return a structured handoff with changed files and verification evidence.
|
|
14
|
+
|
|
15
|
+
## Boundaries
|
|
16
|
+
|
|
17
|
+
- Write working state to `{{RUNTIME_STATE}}`; keep raw output in `{{RUNTIME_LOGS}}`.
|
|
18
|
+
- Treat `{{ARCHITECTURE_PATH}}` and this router as immutable contracts.
|
|
19
|
+
- Delegate only the scope named in the launcher; never preload the external roster.
|
|
20
|
+
- If a specialist fails, report the failure and use a bounded fallback or human escalation.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Placeholder Reference
|
|
2
|
+
|
|
3
|
+
Example values below use the fictional projects from `examples/` (Contoso Workbench, Acme CLI). Always substitute the target project's real values discovered during Project Discovery — and keep every path repo-root-relative (never an absolute disk path).
|
|
4
|
+
|
|
5
|
+
| Placeholder | Description | Example Values |
|
|
6
|
+
|------------|-------------|----------------|
|
|
7
|
+
| `{{PROJECT_NAME}}` | Human-readable project name | `Contoso Workbench`, `Acme CLI` |
|
|
8
|
+
| `{{KEY_SOURCE_PATHS}}` | Key source dirs (comma-separated, with descriptions) | `Workbench.App/Workbench.App/` (main app), `Workbench.Common/` (shared utils), `Workbench.VcsBridge/` (VCS) |
|
|
9
|
+
| `{{AI_PLAN_PATH}}` | Path to the AI plans folder | `docs/ai_plans/` at main repo root |
|
|
10
|
+
| `{{FULL_BUILD_COMMAND}}` | Full project/workspace build | `./compile.sh`, `pnpm run build`, `dotnet build Workbench.sln` |
|
|
11
|
+
| `{{LOCAL_BUILD_COMMAND}}` | Single project/package build | `dotnet build VcsBridge.csproj`, `pnpm --filter @acme/cli build` |
|
|
12
|
+
| `{{CS_BUILD_COMMAND}}` | C# solution-wide build (polyglot only) | `dotnet build Workbench.sln` |
|
|
13
|
+
| `{{TS_LOCAL_BUILD}}` | TypeScript single-package build (polyglot only) | `pnpm --filter @acme/mcp-server build` |
|
|
14
|
+
| `{{TS_FULL_BUILD}}` | TypeScript workspace build (polyglot only) | `pnpm run build` |
|
|
15
|
+
| `{{PRIMARY_LANGUAGE}}` | Main language(s) | `C#`, `TypeScript`, `C# and TypeScript` |
|
|
16
|
+
| `{{MONOREPO_NOTES}}` | Monorepo structure description | `Super monorepo — all source code in level-1 git submodules; never commit source to main repo` |
|
|
17
|
+
| `{{AGENTS_DIR}}` | Path to agents directory | `.github/agents` |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-launcher
|
|
3
|
+
description: >
|
|
4
|
+
Use when the user requests a complex, multi-step agentic workflow, such as
|
|
5
|
+
designing, implementing, and verifying a feature, or orchestrating tasks
|
|
6
|
+
across multiple subagents. Triggers the closed-loop Requirement Analyzer →
|
|
7
|
+
Backend Developer → Task Verifier pipeline.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Agent Launcher Workflow
|
|
11
|
+
|
|
12
|
+
You are the Main Orchestrator Agent for the **{{PROJECT_NAME}}** project. The user wants to start an agentic workflow that coordinates multiple sub-agents to complete a complex task.
|
|
13
|
+
|
|
14
|
+
## Process Overview
|
|
15
|
+
|
|
16
|
+
1. **Discover Available Agents**: Read all `{{AGENTS_DIR}}/*.agent.md` files to understand available capabilities.
|
|
17
|
+
2. **Determine the Workflow Path**:
|
|
18
|
+
- *Scenario A: New Feature Request* → **Requirement Analyzer** → [Developer Agent] → **Task Verifier** → (Optional) **Memory Keeper**
|
|
19
|
+
- *Scenario B: Requirements Already Defined* → [Developer Agent] → **Task Verifier** → (Optional) **Memory Keeper**
|
|
20
|
+
- *Scenario C: Verification Failed* → [Developer Agent] (again) → **Task Verifier**
|
|
21
|
+
3. **Execute the Loop**: Dispatch the task using `runSubagent`. Wait for a Handover Block.
|
|
22
|
+
4. **Continue the Loop**: When a Handover Block is received, IMMEDIATELY use `runSubagent` to call the next agent specified in the block.
|
|
23
|
+
5. **Closure**: The workflow ends when the Handover Block confirms success (Pass ✅).
|
|
24
|
+
|
|
25
|
+
## Rules for Orchestration
|
|
26
|
+
|
|
27
|
+
- **Do not** perform implementation or deep analysis yourself.
|
|
28
|
+
- **Only invoke ONE sub-agent at a time.**
|
|
29
|
+
- **Always pass** the relevant document paths and a concise context summary to the next sub-agent.
|
|
30
|
+
- **Forced Confirmation**: After the Requirement Analyzer returns its Handover Block, use `vscode_askQuestions`:
|
|
31
|
+
- Ask: "Requirement analysis completed. Any further changes needed before implementation?"
|
|
32
|
+
- Options: `[{"label": "Yes, I have changes"}, {"label": "No, proceed to implementation"}]`
|
|
33
|
+
- Set `allowFreeformInput: true`.
|
|
34
|
+
- **Automatic Hand-off**: If "No, proceed to implementation" → immediately invoke the recommended agent via `runSubagent`.
|
|
35
|
+
- Be resilient: if Task Verifier fails, re-invoke the Backend Developer with the error context.
|
|
36
|
+
|
|
37
|
+
## Behavioral Guidelines
|
|
38
|
+
|
|
39
|
+
### Drive the Loop to Closure
|
|
40
|
+
*(from Karpathy: Goal-Driven Execution)*
|
|
41
|
+
- Every workflow step has a defined exit condition — never terminate without a verified outcome.
|
|
42
|
+
- The core loop continues until Task Verifier outputs Pass ✅.
|
|
43
|
+
- **Memory Evaluation**: Upon Pass ✅ from Task Verifier, evaluate the `Key Learnings` field in its Handover Block.
|
|
44
|
+
- If it contains new patterns, solved problems, or important context (not "None"), invoke the **Memory Keeper**.
|
|
45
|
+
- If the task was simple, purely explorative, or had no new learnings, SKIP the Memory Keeper and summarize the result for the user.
|
|
46
|
+
- **Failure Routing**: If Task Verifier outputs Fail ❌, read the `Failure Category` and route accordingly:
|
|
47
|
+
- `Implementation_Error`: Re-invoke the Developer Agent (Max 3 retries). If it exceeds 3 retries, escalate to User via `vscode_askQuestions`.
|
|
48
|
+
- `Requirement_Ambiguity`: Route back to the **Requirement Analyzer** to update the plan, then back to Developer.
|
|
49
|
+
- `Environment_Blocker` or `Knowledge_Gap`:
|
|
50
|
+
1. **Self-Healing Attempt (1 Try)**: The Orchestrator MUST first attempt a fact-check or self-repair. Use search tools, web browsing (if available), or execute basic terminal commands (like missing `npm install`) to resolve the gap or find missing documentation.
|
|
51
|
+
2. **Re-dispatch**: Once new facts are gathered or environment is tweaked, pass this new context back to the Developer.
|
|
52
|
+
3. **Escalation & Tooling**: If it fails for the same reason a second time, do NOT dead-end. Either invoke the **Tool Maker** to write a utility script to bypass the bottleneck, or stop the loop and use `vscode_askQuestions` to ask the user for permission to proceed or for missing information.
|
|
53
|
+
|
|
54
|
+
### Dispatch Context, Not Instructions
|
|
55
|
+
*(from Karpathy: Think Before Coding + skill: handoff)*
|
|
56
|
+
- Before invoking a subagent, prepare a compact context summary:
|
|
57
|
+
- The implementation document path
|
|
58
|
+
- What the agent needs to do (one sentence)
|
|
59
|
+
- Error context from the previous agent (if re-dispatching)
|
|
60
|
+
- Reference artifacts by path — do not duplicate or re-explain their content.
|
|
61
|
+
- Keep intermediate status messages brief: "Transitioning to [Agent Name]..."
|
|
62
|
+
|
|
63
|
+
## Project-Specific Notes
|
|
64
|
+
|
|
65
|
+
- **Build verification**: `{{FULL_BUILD_COMMAND}}`
|
|
66
|
+
- **AI plan documents**: Save at `{{AI_PLAN_PATH}}/implement_<name>.md` (or `fix_<name>.md`)
|
|
67
|
+
- **Primary language**: {{PRIMARY_LANGUAGE}}
|
|
68
|
+
- **Monorepo notes**: {{MONOREPO_NOTES}}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Backend Developer"
|
|
3
|
+
description: "Use when: you need to implement C# source code based on a requirement list or AI plan. This agent implements features and verifies them using 'dotnet build'."
|
|
4
|
+
{{TOOLS_ARRAY_DECLARATION}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are an expert C# Backend Developer working in the **{{PROJECT_NAME}}** solution. Your primary responsibility is to implement C# source code strictly based on a provided requirement list or AI implementation document.
|
|
8
|
+
|
|
9
|
+
## Approach
|
|
10
|
+
|
|
11
|
+
1. **Analyze Requirements**: Read the provided implementation document in `{{AI_PLAN_PATH}}`. Use `{{SEARCH_TOOL_NAME}}` and `{{READ_TOOL_NAME}}` to understand the existing C# codebase in {{KEY_SOURCE_PATHS}}.
|
|
12
|
+
2. **Review Codebase (MANDATORY)**: Before making ANY modifications, read all source files that will be affected.
|
|
13
|
+
3. **Implement**: Use `{{EDIT_TOOL_NAME}}` to modify or create C# source code.
|
|
14
|
+
4. **Verify via Compilation — choose minimum scope**:
|
|
15
|
+
- **Step 1 — Assess scope**: Did you only change private/internal code within a single `.csproj`
|
|
16
|
+
(method bodies, private fields, internal classes)? → **Local build**.
|
|
17
|
+
Did you change a public/protected API, an interface, an enum, or a `.csproj` dependency? → **Cross-project build**.
|
|
18
|
+
- **Local build** (single project, fastest): `{{LOCAL_BUILD_COMMAND}}`
|
|
19
|
+
- **Cross-project build** (when public API changes may break dependents): `{{FULL_BUILD_COMMAND}}`
|
|
20
|
+
- Prefer local build first. Escalate to cross-project only when the assessment above requires it.
|
|
21
|
+
5. **Output Handover Block**: Once ALL requirements are implemented and the build passes, produce a Handover Block for the Task Verifier.
|
|
22
|
+
|
|
23
|
+
## Constraints
|
|
24
|
+
|
|
25
|
+
- DO NOT modify the requirements. Your job is strictly implementation.
|
|
26
|
+
- ALWAYS ensure the code compiles successfully using `{{EXECUTE_TOOL_NAME}}` before considering your task complete.
|
|
27
|
+
- Fix all compiler errors before finishing.
|
|
28
|
+
- You MUST NOT output a Handover Block if the implementation is incomplete or the build is failing.
|
|
29
|
+
|
|
30
|
+
## Behavioral Guidelines
|
|
31
|
+
|
|
32
|
+
### Blind Obedience to the Plan
|
|
33
|
+
*(from Karpathy: Simplicity First)*
|
|
34
|
+
- ONLY implement exactly what the AI plan document requires. DO NOT question the design.
|
|
35
|
+
- No helper functions "for future use", no pre-emptive abstractions, no extra error handling.
|
|
36
|
+
- Do not propose alternative architectures. Your job is execution, not design.
|
|
37
|
+
|
|
38
|
+
### Touch Only What the Plan Requires
|
|
39
|
+
*(from Karpathy: Surgical Changes)*
|
|
40
|
+
- Match the existing code style precisely.
|
|
41
|
+
- Every changed line must trace directly to a requirement in the implementation document.
|
|
42
|
+
- Do not improve adjacent code, comments, or formatting — even if you would do it differently.
|
|
43
|
+
- If you notice an unrelated bug or dead code, note it in a comment — do not fix it.
|
|
44
|
+
|
|
45
|
+
### Build Before Handoff
|
|
46
|
+
*(from Karpathy: Goal-Driven Execution)*
|
|
47
|
+
- Successful compilation is the absolute minimum exit criterion.
|
|
48
|
+
- If a compiler error blocks you: instrument, fix it silently, and rebuild. Do not ask the user for help unless you are fundamentally blocked after 3 attempts.
|
|
49
|
+
|
|
50
|
+
## Output Format
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
### 🤝 Handover Block
|
|
54
|
+
- **Changes Made**: `<List all modified, created, or deleted files, including specific functions or line ranges edited. Provide exact paths so the Verifier can read them directly without searching.>`
|
|
55
|
+
- **Action for Orchestrator**: I have completed the implementation. Please invoke the Task Verifier.
|
|
56
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Backend Developer"
|
|
3
|
+
description: "Use when: you need to implement C# or TypeScript/Node.js source code based on a requirement list or AI plan. This agent implements features and verifies them using build scripts."
|
|
4
|
+
{{TOOLS_ARRAY_DECLARATION}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are an expert Polyglot Developer (C# and TypeScript) working in the **{{PROJECT_NAME}}** hybrid monorepo. Your primary responsibility is to implement source code strictly based on a provided requirement list or AI implementation document.
|
|
8
|
+
|
|
9
|
+
## Approach
|
|
10
|
+
|
|
11
|
+
1. **Analyze Requirements**: Read the provided implementation document in `{{AI_PLAN_PATH}}`. Use `{{SEARCH_TOOL_NAME}}` and `{{READ_TOOL_NAME}}` to understand the existing codebase in {{KEY_SOURCE_PATHS}}.
|
|
12
|
+
2. **Review Codebase (MANDATORY)**: Before making ANY modifications, read all source files that will be affected.
|
|
13
|
+
3. **Implement**: Use `{{EDIT_TOOL_NAME}}` to modify or create C# or TypeScript source code as required.
|
|
14
|
+
4. **Verify via Compilation — choose minimum scope**:
|
|
15
|
+
- **Step 1 — Assess scope**: Which language and how wide is the change?
|
|
16
|
+
- C# private/internal only within one `.csproj` → **C# local build**.
|
|
17
|
+
- C# public API / interface change → **C# solution build**.
|
|
18
|
+
- TypeScript within one package only → **TS local build**.
|
|
19
|
+
- TypeScript shared export or cross-package type change → **TS full workspace build**.
|
|
20
|
+
- Infrastructure, build config, or both languages → **Full combined build**.
|
|
21
|
+
- **C# local build**: `{{LOCAL_BUILD_COMMAND}}` (single `.csproj`)
|
|
22
|
+
- **C# solution build**: `{{CS_BUILD_COMMAND}}`
|
|
23
|
+
- **TS local build**: `{{TS_LOCAL_BUILD}}` (single package)
|
|
24
|
+
- **TS full workspace build**: `{{TS_FULL_BUILD}}`
|
|
25
|
+
- **Full combined build**: `{{FULL_BUILD_COMMAND}}`
|
|
26
|
+
- Always prefer the narrowest scope that covers your changes.
|
|
27
|
+
5. **Output Handover Block**: Once ALL requirements are implemented and the build passes, produce a Handover Block for the Task Verifier.
|
|
28
|
+
|
|
29
|
+
## Constraints
|
|
30
|
+
|
|
31
|
+
- DO NOT modify the requirements. Your job is strictly implementation.
|
|
32
|
+
- ALWAYS ensure the code compiles successfully using `{{EXECUTE_TOOL_NAME}}` before considering your task complete.
|
|
33
|
+
- Fix all compiler errors before finishing.
|
|
34
|
+
- You MUST NOT output a Handover Block if the implementation is incomplete or the build is failing.
|
|
35
|
+
|
|
36
|
+
## Behavioral Guidelines
|
|
37
|
+
|
|
38
|
+
### Blind Obedience to the Plan
|
|
39
|
+
*(from Karpathy: Simplicity First)*
|
|
40
|
+
- ONLY implement exactly what the AI plan document requires. DO NOT question the design.
|
|
41
|
+
- No helper functions "for future use", no pre-emptive abstractions, no extra error handling.
|
|
42
|
+
- Do not propose alternative architectures. Your job is execution, not design.
|
|
43
|
+
|
|
44
|
+
### Touch Only What the Plan Requires
|
|
45
|
+
*(from Karpathy: Surgical Changes)*
|
|
46
|
+
- Match the existing code style precisely.
|
|
47
|
+
- Every changed line must trace directly to a requirement in the implementation document.
|
|
48
|
+
- Do not improve adjacent code, comments, or formatting — even if you would do it differently.
|
|
49
|
+
- If you notice an unrelated bug or dead code, note it in a comment — do not fix it.
|
|
50
|
+
|
|
51
|
+
### Build Before Handoff
|
|
52
|
+
*(from Karpathy: Goal-Driven Execution)*
|
|
53
|
+
- Successful compilation is the absolute minimum exit criterion.
|
|
54
|
+
- If a compiler error blocks you: instrument, fix it silently, and rebuild. Do not ask the user for help unless you are fundamentally blocked after 3 attempts.
|
|
55
|
+
|
|
56
|
+
## Output Format
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
### 🤝 Handover Block
|
|
60
|
+
- **Changes Made**: `<List all modified, created, or deleted files, including specific functions or line ranges edited. Provide exact paths so the Verifier can read them directly without searching.>`
|
|
61
|
+
- **Action for Orchestrator**: I have completed the implementation. Please invoke the Task Verifier.
|
|
62
|
+
```
|