harness-everything 0.3.6 → 0.4.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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +8 -7
- package/.github/workflows/ci.yml +23 -18
- package/.github/workflows/release.yml +53 -27
- package/.releaserc.json +113 -0
- package/AGENTS.md +34 -23
- package/BENCHMARK_SOP.md +38 -18
- package/CHANGELOG.md +194 -3
- package/CONTRIBUTING.md +17 -4
- package/PRIVACY.md +25 -0
- package/README.md +118 -87
- package/RELEASING.md +82 -0
- package/SUPPORT.md +27 -0
- package/TERMS.md +21 -0
- package/VERIFICATION.md +175 -286
- 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/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 +25 -0
- package/docs/routing.md +157 -44
- package/docs/security-audit.md +38 -0
- package/docs/troubleshooting.md +82 -46
- 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 +16 -3
- 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/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
|
@@ -4,18 +4,28 @@
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const { execFileSync } = require('child_process');
|
|
7
|
+
const {
|
|
8
|
+
ZONES: DOCUMENT_ZONES,
|
|
9
|
+
getWorkspaceRoot,
|
|
10
|
+
resolveProjectDocs,
|
|
11
|
+
ensureCommittableFallback
|
|
12
|
+
} = require('./project-docs-resolver');
|
|
7
13
|
const {
|
|
8
14
|
SUPPORTED_PLATFORMS,
|
|
9
15
|
readAgencyCatalog,
|
|
10
16
|
resolveSelection
|
|
11
17
|
} = require('./agency-catalog');
|
|
18
|
+
const { assertContainedPath } = require('./path-boundary');
|
|
12
19
|
|
|
13
20
|
const GENERATOR = 'harness-everything/multi-agent-workspace';
|
|
14
|
-
const
|
|
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');
|
|
15
24
|
|
|
16
25
|
function values(args, name) {
|
|
17
26
|
const result = [];
|
|
18
|
-
for (let i = 0; i < args.length; i++)
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
if (args[i] !== name) continue;
|
|
19
29
|
if (!args[i + 1] || args[i + 1].startsWith('--')) throw new Error(`${name} requires a value`);
|
|
20
30
|
result.push(args[++i]);
|
|
21
31
|
}
|
|
@@ -28,7 +38,11 @@ function commaValues(args, name) {
|
|
|
28
38
|
|
|
29
39
|
function parseArgs(args) {
|
|
30
40
|
if (args.includes('--help') || args.includes('-h')) return { help: true };
|
|
31
|
-
const
|
|
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
|
+
}
|
|
32
46
|
const sourceValues = values(args, '--agency-source');
|
|
33
47
|
const platform = values(args, '--platform')[0] || null;
|
|
34
48
|
if (platform && !SUPPORTED_PLATFORMS.includes(platform)) {
|
|
@@ -51,16 +65,16 @@ function json(value) {
|
|
|
51
65
|
return `${JSON.stringify(value, null, 2)}\n`;
|
|
52
66
|
}
|
|
53
67
|
|
|
54
|
-
function readExistingManifest(
|
|
55
|
-
const file = path.join(
|
|
68
|
+
function readExistingManifest(runtimeRoot) {
|
|
69
|
+
const file = path.join(runtimeRoot, 'manifest.json');
|
|
56
70
|
if (!fs.existsSync(file)) return null;
|
|
57
71
|
try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
58
|
-
catch (error) { throw new Error(`existing manifest is invalid: ${error.message}`); }
|
|
72
|
+
catch (error) { throw new Error(`existing runtime manifest is invalid: ${error.message}`); }
|
|
59
73
|
}
|
|
60
74
|
|
|
61
75
|
function detectStack(workspaceRoot) {
|
|
62
|
-
const
|
|
63
|
-
|
|
76
|
+
const names = new Set(fs.readdirSync(workspaceRoot, { withFileTypes: true })
|
|
77
|
+
.filter(entry => entry.isFile()).map(entry => entry.name));
|
|
64
78
|
if (names.has('package.json')) return 'node';
|
|
65
79
|
if (names.has('pyproject.toml') || names.has('requirements.txt')) return 'python';
|
|
66
80
|
if (names.has('Cargo.toml')) return 'rust';
|
|
@@ -70,55 +84,47 @@ function detectStack(workspaceRoot) {
|
|
|
70
84
|
|
|
71
85
|
function gitRevision(root) {
|
|
72
86
|
if (!fs.existsSync(path.join(root, '.git'))) return null;
|
|
73
|
-
try { return execFileSync('git', ['-C', root, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8' }).trim(); }
|
|
87
|
+
try { return execFileSync('git', ['-C', root, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); }
|
|
74
88
|
catch { return null; }
|
|
75
89
|
}
|
|
76
90
|
|
|
77
91
|
function renderRouter(manifest) {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- Write working state to \`.harness/multi-agent/state/\`; keep raw output in \`.harness/multi-agent/logs/\`.
|
|
93
|
-
- Treat \`.harness/multi-agent/architecture/\` and this router as immutable contracts.
|
|
94
|
-
- Delegate only the scope named in the launcher; never preload the external roster.
|
|
95
|
-
- If a specialist fails, report the failure and use a bounded fallback or human escalation.
|
|
96
|
-
|
|
97
|
-
## Catalog
|
|
98
|
-
${agencyLine}
|
|
99
|
-
`;
|
|
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
|
+
});
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
function renderLauncher(manifest, selectedAgents) {
|
|
103
109
|
const lines = [
|
|
104
|
-
'# Multi-Agent Launcher',
|
|
105
|
-
'',
|
|
110
|
+
'# Multi-Agent Launcher', '',
|
|
106
111
|
`Generator: ${GENERATOR}`,
|
|
107
|
-
`
|
|
108
|
-
`
|
|
109
|
-
''
|
|
110
|
-
|
|
112
|
+
`Runtime: ${manifest.runtime.root}`,
|
|
113
|
+
`Workspace: ${manifest.workspace.root}`,
|
|
114
|
+
`Platform: ${manifest.workspace.platform || 'generic'}`,
|
|
115
|
+
`Stack: ${manifest.workspace.stack}`,
|
|
111
116
|
'',
|
|
112
|
-
'The
|
|
113
|
-
'
|
|
114
|
-
'
|
|
115
|
-
`Converter targets: ${(manifest.agency.converterTargets || []).join(', ') || 'none configured'}.`,
|
|
116
|
-
'',
|
|
117
|
-
'## Selected Specialists',
|
|
118
|
-
''
|
|
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', ''
|
|
119
120
|
];
|
|
120
|
-
|
|
121
|
-
|
|
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.');
|
|
122
128
|
} else {
|
|
123
129
|
for (const agent of selectedAgents) {
|
|
124
130
|
lines.push(`- **${agent.name}** [${agent.division}] - ${agent.description}`);
|
|
@@ -126,53 +132,148 @@ function renderLauncher(manifest, selectedAgents) {
|
|
|
126
132
|
lines.push(' - boundary: only the files and deliverables named in the dispatch brief.');
|
|
127
133
|
}
|
|
128
134
|
}
|
|
129
|
-
lines.push('', '## Handoff Schema', '', 'Return `status`, `changes`, `verification`, `risks`, and `nextAction
|
|
135
|
+
lines.push('', '## Handoff Schema', '', 'Return `status`, `changes`, `verification`, `risks`, and `nextAction`.', '');
|
|
130
136
|
return lines.join('\n');
|
|
131
137
|
}
|
|
132
138
|
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
['roles/selected-agents.json', json({ selected: selectedAgents })],
|
|
143
|
-
['handoff.json', json({
|
|
144
|
-
schemaVersion: 1,
|
|
145
|
-
status: selectedAgents.length || manifest.agency.status !== 'available' ? 'ready' : 'selection-required',
|
|
146
|
-
generator: GENERATOR,
|
|
147
|
-
scope: { workspace: '.', root: '.harness/multi-agent', zones: ZONES },
|
|
148
|
-
selectedAgents: selectedAgents.map(agent => agent.slug),
|
|
149
|
-
verification: { catalog: manifest.agency.status, indexer: 'passed' },
|
|
150
|
-
nextAction: selectedAgents.length ? 'dispatch selected specialists with bounded briefs' : 'select specialists or configure AGENCY_AGENTS_SOURCE'
|
|
151
|
-
})],
|
|
152
|
-
['index_memory.js', fs.readFileSync(path.join(__dirname, 'index_memory.js'))]
|
|
153
|
-
];
|
|
154
|
-
for (const zone of ZONES) artifacts.push([`${zone}/.gitkeep`, '']);
|
|
155
|
-
return artifacts.map(([relative, content]) => ({ path: path.join(outputRoot, relative), content }));
|
|
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;
|
|
156
148
|
}
|
|
157
149
|
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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 });
|
|
164
231
|
}
|
|
165
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) {
|
|
166
266
|
for (const artifact of artifacts) {
|
|
167
267
|
fs.mkdirSync(path.dirname(artifact.path), { recursive: true });
|
|
168
|
-
fs.writeFileSync(artifact.path, artifact.content);
|
|
268
|
+
fs.writeFileSync(artifact.path, artifact.content, 'utf8');
|
|
169
269
|
}
|
|
170
270
|
}
|
|
171
271
|
|
|
172
|
-
function runIndexer(
|
|
173
|
-
const indexer = path.join(
|
|
174
|
-
const
|
|
175
|
-
|
|
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' });
|
|
176
277
|
return output;
|
|
177
278
|
}
|
|
178
279
|
|
|
@@ -180,44 +281,90 @@ function scaffold(options) {
|
|
|
180
281
|
if (!fs.existsSync(options.workspace) || !fs.statSync(options.workspace).isDirectory()) {
|
|
181
282
|
throw new Error(`workspace not found: ${options.workspace}`);
|
|
182
283
|
}
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
|
|
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
|
+
|
|
186
289
|
const catalog = options.source ? readAgencyCatalog(options.source) : null;
|
|
187
290
|
if (options.expectedRevision && (!catalog || catalog.source.revision !== options.expectedRevision)) {
|
|
188
291
|
throw new Error(`agency source revision mismatch: expected ${options.expectedRevision}, got ${catalog && catalog.source.revision || '(unknown)'}`);
|
|
189
292
|
}
|
|
190
|
-
if (existing && existing.agency && existing.agency.sourceRevision &&
|
|
293
|
+
if (existing && existing.agency && existing.agency.sourceRevision &&
|
|
294
|
+
(!catalog || existing.agency.sourceRevision !== catalog.source.revision) && !options.allowSourceDrift) {
|
|
191
295
|
throw new Error(`agency source revision drift: existing ${existing.agency.sourceRevision}, current ${catalog && catalog.source.revision || '(unavailable)'}; pass --allow-source-drift to refresh`);
|
|
192
296
|
}
|
|
193
|
-
const selection = catalog
|
|
297
|
+
const selection = catalog
|
|
298
|
+
? resolveSelection(catalog, options.divisions, options.agents, options.allAgents)
|
|
299
|
+
: { divisionIds: [], agents: [] };
|
|
194
300
|
if (!catalog && (options.divisions.length || options.agents.length || options.allAgents)) {
|
|
195
301
|
throw new Error('cannot select agency agents without --agency-source or AGENCY_AGENTS_SOURCE');
|
|
196
302
|
}
|
|
303
|
+
const migration = migrateLegacyWorkspace(options.workspace, resolution);
|
|
304
|
+
for (const zone of DOCUMENT_ZONES) fs.mkdirSync(resolution.paths[zone].path, { recursive: true });
|
|
197
305
|
const agency = catalog
|
|
198
306
|
? { status: 'available', ...catalog.source, selectedCount: selection.agents.length, selectionRequired: selection.agents.length === 0 }
|
|
199
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();
|
|
200
309
|
const manifest = {
|
|
201
|
-
schemaVersion:
|
|
310
|
+
schemaVersion: 2,
|
|
202
311
|
generator: GENERATOR,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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,
|
|
207
330
|
supportedPlatforms: SUPPORTED_PLATFORMS,
|
|
208
331
|
agency,
|
|
209
332
|
selectedDivisions: selection.divisionIds,
|
|
210
333
|
selectedAgents: selection.agents,
|
|
211
|
-
|
|
334
|
+
execution: { generatedAt, resolver: 'project-docs-resolver', migration },
|
|
335
|
+
artifactPaths: ['AGENTS.md', 'manifest.json', 'handoff.json', 'memory-index.md', 'launcher.md', 'roles/']
|
|
212
336
|
};
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
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);
|
|
218
365
|
handoff.verification.indexer = 'passed';
|
|
219
|
-
fs.writeFileSync(
|
|
220
|
-
return {
|
|
366
|
+
fs.writeFileSync(path.join(runtimeRoot, 'handoff.json'), json(handoff), 'utf8');
|
|
367
|
+
return { runtimeRoot, manifest, memoryIndex, resolution, migration };
|
|
221
368
|
}
|
|
222
369
|
|
|
223
370
|
function usage() {
|
|
@@ -229,7 +376,7 @@ function usage() {
|
|
|
229
376
|
' --all-agents Explicitly select the complete metadata catalog',
|
|
230
377
|
' --platform <name> Validate a supported converter target',
|
|
231
378
|
' --allow-source-drift Accept a different source revision on refresh',
|
|
232
|
-
' --force
|
|
379
|
+
' --force Retained for compatibility; runtime files are Harness-owned'
|
|
233
380
|
].join('\n');
|
|
234
381
|
}
|
|
235
382
|
|
|
@@ -238,8 +385,8 @@ function main() {
|
|
|
238
385
|
const options = parseArgs(process.argv.slice(2));
|
|
239
386
|
if (options.help) return console.log(usage());
|
|
240
387
|
const result = scaffold(options);
|
|
241
|
-
console.log(`Multi-agent
|
|
242
|
-
console.log(`
|
|
388
|
+
console.log(`Multi-agent runtime written to ${result.runtimeRoot}`);
|
|
389
|
+
console.log(` Documentation zones: ${result.manifest.documentationZones.length}`);
|
|
243
390
|
console.log(` Agency: ${result.manifest.agency.status}`);
|
|
244
391
|
console.log(` Selected agents: ${result.manifest.selectedAgents.length}`);
|
|
245
392
|
console.log(` Memory index: ${result.memoryIndex}`);
|
|
@@ -250,4 +397,12 @@ function main() {
|
|
|
250
397
|
}
|
|
251
398
|
|
|
252
399
|
if (require.main === module) main();
|
|
253
|
-
module.exports = {
|
|
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.
|
|
@@ -10,18 +10,16 @@
|
|
|
10
10
|
2. Semantic Integrity: For Smart Merge, align updates with logical consistency, memory management, and verification guardrails while preserving original YAML frontmatter.
|
|
11
11
|
|
|
12
12
|
## [Action Phase: Generation]
|
|
13
|
-
3.
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
- Save generated files to paths defined in `guidelines/platform-<platform>.md`.
|
|
20
|
-
4. Orchestrator Generation: Consult `guidelines/platform-<platform>.md` for Orchestrator requirements and update central prompts if necessary.
|
|
13
|
+
3. Run `node multi-agent-workspace/scripts/scaffold.js --workspace <root>` with the selected source, divisions, agents, and platform.
|
|
14
|
+
- Resolve document zones through the shared resolver; preserve the provenance of explicit, inferred, and fallback paths.
|
|
15
|
+
- Migrate authored decision, domain, and architecture records only after checking every destination conflict.
|
|
16
|
+
- Keep runtime metadata, roles, state, logs, and memory indexes under the global workspace-keyed state root.
|
|
17
|
+
- Resolve the router template and indexer from the installed skill directory; render the router into the global runtime, never into the repository.
|
|
18
|
+
4. If the source is unavailable, retain the explicit unavailable-catalog status and do not claim a complete roster.
|
|
21
19
|
|
|
22
20
|
## [Summarize & Verification Phase]
|
|
23
|
-
5. Integrity Check: Verify
|
|
21
|
+
5. Integrity Check: Verify the global manifest, handoff, launcher, selected roles, memory index, and resolved document paths before reporting completion.
|
|
24
22
|
|
|
25
23
|
## [Record: Exit]
|
|
26
24
|
6. Completion: Record successful subagent scaffolding.
|
|
27
|
-
7. Handoff: Load and execute `workflows/04-launcher.md`, passing the `Context Profile`, `Selected Agents`, and newly created file paths.
|
|
25
|
+
7. Handoff: Load and execute `workflows/04-launcher.md`, passing the `Context Profile`, `Selected Agents`, and newly created file paths.
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
- Verify inheritance of `Target Directory`, `Context Profile`, `Selected Agents`, and newly created file paths from Phase 3.
|
|
5
5
|
|
|
6
6
|
## [Action Phase: Entry Point Generation]
|
|
7
|
-
1. Entry Point Generation: Read
|
|
8
|
-
2. Handoff Integration:
|
|
9
|
-
3. Disk Write:
|
|
7
|
+
1. Entry Point Generation: Read the installed multi-agent-workspace skill and the runtime `manifest.json`/`handoff.json`.
|
|
8
|
+
2. Handoff Integration: Use the resolved decision, domain, and architecture paths plus the selected roles from the manifest when dispatching bounded briefs.
|
|
9
|
+
3. Disk Write: Update the global runtime launcher and resolved router generated by `scaffold.js`; repository-local router and executable copies are not created.
|
|
10
10
|
|
|
11
11
|
## [Summarize: Verification]
|
|
12
|
-
4. Check: Verify the
|
|
12
|
+
4. Check: Verify the runtime launcher, handoff schema, memory index, and selected-role metadata are readable from the global runtime root.
|
|
13
13
|
|
|
14
14
|
## [Record: Exit]
|
|
15
15
|
5. Completion: Present a clean summary table listing generated agent files and their configured roles.
|
|
16
|
-
6. UX Handoff: Provide the user with guidance on how to trigger or invoke their new agent scaffold.
|
|
16
|
+
6. UX Handoff: Provide the user with guidance on how to trigger or invoke their new agent scaffold.
|