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
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Project Docs Framework Check
|
|
4
|
+
*
|
|
5
|
+
* Mechanized gate for `to-spec` (and `to-tickets`, once installed): has this
|
|
6
|
+
* repo already pinned down where reference docs live, how issues are
|
|
7
|
+
* tracked, and what counts as a valid issue? Stored as a `projectDocs` entry
|
|
8
|
+
* inside the SAME harness-everything/manifest.json this package already
|
|
9
|
+
* owns (see scripts/lib/manifest.js and self-evolve's `generated` skill
|
|
10
|
+
* registry) - not a new docs/agents/ file convention, so there's one config
|
|
11
|
+
* surface, not two.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately repo-local only: unlike self-evolve's `generated` skills
|
|
14
|
+
* (intentionally reusable across projects), doc location / tracker / issue
|
|
15
|
+
* definition are PER-REPO facts. Reading or writing them through the global
|
|
16
|
+
* ~/.agents or ~/.claude manifest homes would leak one project's tracker
|
|
17
|
+
* into every other project sharing that global install, so this script
|
|
18
|
+
* scans only the workspace-relative platform homes, never the user-home ones.
|
|
19
|
+
*
|
|
20
|
+
* Exit 0 -> at least one detected platform's manifest.json (inside this
|
|
21
|
+
* repo) has a complete projectDocs entry. Read it, skip Step 0.
|
|
22
|
+
* Exit 1 -> missing or incomplete everywhere. Run the Step 0 interview in
|
|
23
|
+
* to-spec/SKILL.md for the flagged field(s), then persist with `init`.
|
|
24
|
+
*
|
|
25
|
+
* manifest.json is read on every single tier-router.js invocation (every
|
|
26
|
+
* prompt, not just to-spec runs) to scan for self-evolve's generated
|
|
27
|
+
* skills - so projectDocs MUST stay a short pointer, never a growing log.
|
|
28
|
+
* `init` enforces a length cap per field (see MAX_FIELD_LENGTH) precisely so
|
|
29
|
+
* this can't quietly bloat over time. If a real answer is genuinely long
|
|
30
|
+
* (a multi-context doc map, a full custom issue template), write that detail
|
|
31
|
+
* into its own file - a CONTEXT-MAP.md entry, a `.github/ISSUE_TEMPLATE/`
|
|
32
|
+
* file, a docs/ README - and pass just that path as the field's value.
|
|
33
|
+
* Anything to-spec might later want to log per-session or per-doc (e.g.
|
|
34
|
+
* "which doc got published for which conversation") belongs in a separate,
|
|
35
|
+
* session-scoped file under the state dir (see hooks/scripts/lib/harness-
|
|
36
|
+
* state.js's getSessionDir) - never appended into this manifest.
|
|
37
|
+
*/
|
|
38
|
+
const fs = require('fs');
|
|
39
|
+
const path = require('path');
|
|
40
|
+
// Keep project-doc path decisions in the resolver carried by the installed
|
|
41
|
+
// multi-agent-workspace skill. This script consumes the same contract.
|
|
42
|
+
const { getWorkspaceRoot, getRepoManifestHomes, detectProjectDocsConventions } =
|
|
43
|
+
require('./project-docs-resolver');
|
|
44
|
+
|
|
45
|
+
function loadManifestHelper() {
|
|
46
|
+
const candidates = [
|
|
47
|
+
path.join(__dirname, '../../scripts/lib/manifest'),
|
|
48
|
+
path.join(__dirname, '../scripts/lib/manifest'),
|
|
49
|
+
path.join(__dirname, '../../../scripts/lib/manifest'),
|
|
50
|
+
path.join(getWorkspaceRoot(), 'scripts/lib/manifest'),
|
|
51
|
+
path.join(getWorkspaceRoot(), 'harness-everything/scripts/lib/manifest'),
|
|
52
|
+
];
|
|
53
|
+
for (const cand of candidates) {
|
|
54
|
+
try {
|
|
55
|
+
if (fs.existsSync(cand + '.js') || fs.existsSync(cand)) {
|
|
56
|
+
return require(cand);
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {}
|
|
59
|
+
}
|
|
60
|
+
// A standalone installed skill may not carry the package helper. Keep its
|
|
61
|
+
// manifest format compatible with the package's tiny helper instead of
|
|
62
|
+
// making document resolution depend on the source checkout.
|
|
63
|
+
return {
|
|
64
|
+
getManifestPath: home => path.join(home, 'harness-everything', 'manifest.json'),
|
|
65
|
+
readManifest: file => {
|
|
66
|
+
try {
|
|
67
|
+
const data = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
68
|
+
if (!Array.isArray(data.skills)) data.skills = [];
|
|
69
|
+
if (!Array.isArray(data.agents)) data.agents = [];
|
|
70
|
+
return data;
|
|
71
|
+
} catch {
|
|
72
|
+
return { package: 'harness-everything', skills: [], agents: [] };
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
writeManifest: (file, data) => {
|
|
76
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
77
|
+
fs.writeFileSync(file, JSON.stringify(data, null, 2), 'utf8');
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const { getManifestPath, readManifest, writeManifest } = loadManifestHelper();
|
|
82
|
+
|
|
83
|
+
const REQUIRED_FIELDS = ['docLocation', 'tracker', 'issueDefinition'];
|
|
84
|
+
const FLAG_TO_FIELD = {
|
|
85
|
+
'doc-location': 'docLocation',
|
|
86
|
+
'tracker': 'tracker',
|
|
87
|
+
'issue-definition': 'issueDefinition',
|
|
88
|
+
};
|
|
89
|
+
// A pointer, not a payload: one short line each. Long enough for "GitHub
|
|
90
|
+
// Issues via gh, label ready-for-agent" or "docs/reference/, see
|
|
91
|
+
// CONTEXT-MAP.md for per-context layout", too short for embedding a full
|
|
92
|
+
// issue template or a multi-paragraph doc-location policy inline.
|
|
93
|
+
const MAX_FIELD_LENGTH = 200;
|
|
94
|
+
|
|
95
|
+
function missingFields(projectDocs) {
|
|
96
|
+
if (!projectDocs) return REQUIRED_FIELDS.slice();
|
|
97
|
+
return REQUIRED_FIELDS.filter(f => !String(projectDocs[f] || '').trim());
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function detectWorkspaceConventions(workspaceRoot) {
|
|
101
|
+
return detectProjectDocsConventions(workspaceRoot);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function runCheck(workspaceRoot) {
|
|
105
|
+
const existingPaths = getRepoManifestHomes(workspaceRoot)
|
|
106
|
+
.map(getManifestPath)
|
|
107
|
+
.filter(p => fs.existsSync(p));
|
|
108
|
+
|
|
109
|
+
// Check explicit projectDocs entries in manifest files
|
|
110
|
+
for (const manifestPath of existingPaths) {
|
|
111
|
+
const docs = readManifest(manifestPath).projectDocs;
|
|
112
|
+
if (docs && missingFields(docs).length === 0) {
|
|
113
|
+
console.log(`[Project Docs Check] OK: ${manifestPath} defines document location, issue tracker, and issue definition.`);
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fallback to heuristic workspace detection
|
|
119
|
+
const inferred = detectWorkspaceConventions(workspaceRoot);
|
|
120
|
+
const missingInferred = missingFields(inferred);
|
|
121
|
+
|
|
122
|
+
if (missingInferred.length === 0) {
|
|
123
|
+
console.log(`[Project Docs Check] OK (Inferred from workspace structure):`);
|
|
124
|
+
console.log(` - docLocation: ${inferred.docLocation}`);
|
|
125
|
+
console.log(` - tracker: ${inferred.tracker}`);
|
|
126
|
+
console.log(` - issueDefinition: ${inferred.issueDefinition}`);
|
|
127
|
+
process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
console.log(`[Project Docs Check] INCOMPLETE: no manifest.json or standard folder structure covers all fields. Missing: ${missingInferred.join(', ')}`);
|
|
131
|
+
console.log('=> Run the Step 0 framework interview for missing fields, or proceed using default workspace fallbacks.');
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function parseFlags(args) {
|
|
136
|
+
const values = {};
|
|
137
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
138
|
+
const flag = args[i];
|
|
139
|
+
const value = args[i + 1];
|
|
140
|
+
if (flag && flag.startsWith('--') && value !== undefined) {
|
|
141
|
+
values[flag.slice(2)] = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return values;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function runInit(workspaceRoot, args) {
|
|
148
|
+
const flags = parseFlags(args);
|
|
149
|
+
const missingFlags = Object.keys(FLAG_TO_FIELD).filter(f => !flags[f]);
|
|
150
|
+
if (missingFlags.length > 0) {
|
|
151
|
+
console.error(`[Project Docs Check] init requires --${missingFlags.join(', --')}`);
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const oversizedFlags = Object.keys(FLAG_TO_FIELD).filter(f => flags[f].length > MAX_FIELD_LENGTH);
|
|
156
|
+
if (oversizedFlags.length > 0) {
|
|
157
|
+
for (const f of oversizedFlags) {
|
|
158
|
+
console.error(`[Project Docs Check] --${f} is ${flags[f].length} chars - projectDocs fields must stay <= ${MAX_FIELD_LENGTH} chars (a pointer, not the content).`);
|
|
159
|
+
}
|
|
160
|
+
console.error('=> Write the detailed content to its own file instead (e.g. a CONTEXT-MAP.md entry, a .github/ISSUE_TEMPLATE/ file, a docs/ README), then pass just that path here.');
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const projectDocs = {
|
|
165
|
+
docLocation: flags['doc-location'],
|
|
166
|
+
tracker: flags['tracker'],
|
|
167
|
+
issueDefinition: flags['issue-definition'],
|
|
168
|
+
updatedAt: new Date().toISOString(),
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const homes = getRepoManifestHomes(workspaceRoot);
|
|
172
|
+
|
|
173
|
+
// Write to every platform home already bootstrapped with harness in THIS
|
|
174
|
+
// repo (their harness-everything/ subfolder already exists), so switching
|
|
175
|
+
// editors mid-project never loses this config.
|
|
176
|
+
let wrote = 0;
|
|
177
|
+
for (const home of homes) {
|
|
178
|
+
const manifestPath = getManifestPath(home);
|
|
179
|
+
if (!fs.existsSync(path.dirname(manifestPath))) continue;
|
|
180
|
+
const data = readManifest(manifestPath);
|
|
181
|
+
data.projectDocs = projectDocs;
|
|
182
|
+
writeManifest(manifestPath, data);
|
|
183
|
+
console.log(`[Project Docs Check] Wrote projectDocs to ${manifestPath}`);
|
|
184
|
+
wrote++;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// No repo-local platform bootstrapped yet: create the primary one
|
|
188
|
+
// (.claude/harness-everything/manifest.json) rather than falling back to
|
|
189
|
+
// any global/user-home manifest - this data must never leave the repo.
|
|
190
|
+
if (wrote === 0) {
|
|
191
|
+
const manifestPath = getManifestPath(homes[0]);
|
|
192
|
+
const data = readManifest(manifestPath);
|
|
193
|
+
data.projectDocs = projectDocs;
|
|
194
|
+
writeManifest(manifestPath, data);
|
|
195
|
+
console.log(`[Project Docs Check] No platform bootstrapped yet in this repo - wrote projectDocs to ${manifestPath}`);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
process.exit(0);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (process.argv[2] === '--help' || process.argv[2] === '-h') {
|
|
202
|
+
console.log(`Gate: has this repo already pinned doc location / issue tracker / issue definition?
|
|
203
|
+
|
|
204
|
+
Usage:
|
|
205
|
+
node check-project-docs.js [check] Exit 0 if a complete projectDocs entry already exists in this repo's manifest.json; exit 1 with the missing field(s) otherwise.
|
|
206
|
+
node check-project-docs.js init --doc-location "..." --tracker "..." --issue-definition "..."
|
|
207
|
+
Persist all three fields (each <= ${MAX_FIELD_LENGTH} chars - a pointer, not the content) to every already-bootstrapped platform manifest.json in this repo.
|
|
208
|
+
|
|
209
|
+
Repo-local only: writes only to workspace-relative manifest homes (.claude/, .cursor/,
|
|
210
|
+
.github/, .codex/, .continue/), never to the user-home manifests self-evolve uses.`);
|
|
211
|
+
process.exit(0);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const command = process.argv[2] || 'check';
|
|
215
|
+
const commandArgs = process.argv.slice(3);
|
|
216
|
+
const workspaceIndex = commandArgs.indexOf('--workspace');
|
|
217
|
+
// An explicit workspace is authoritative. Only the omitted flag walks up to
|
|
218
|
+
// the repository root; otherwise a nested target would silently resolve to
|
|
219
|
+
// its containing checkout and inspect the wrong project configuration.
|
|
220
|
+
if (workspaceIndex !== -1 && !commandArgs[workspaceIndex + 1]) {
|
|
221
|
+
console.error('[Project Docs Check] --workspace requires a path');
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
const workspaceRoot = workspaceIndex === -1
|
|
225
|
+
? getWorkspaceRoot()
|
|
226
|
+
: path.resolve(commandArgs[workspaceIndex + 1]);
|
|
227
|
+
if (!workspaceRoot) {
|
|
228
|
+
console.error('[to-spec/check-project-docs] Cannot inspect project docs without a resolved git workspace.');
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (command === 'check') {
|
|
233
|
+
runCheck(workspaceRoot);
|
|
234
|
+
} else if (command === 'init') {
|
|
235
|
+
runInit(workspaceRoot, commandArgs);
|
|
236
|
+
} else {
|
|
237
|
+
console.error(`[Project Docs Check] Unknown command "${command}". Use 'check' or 'init'.`);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// In the source tree this is the single shared resolver. A to-spec-only
|
|
5
|
+
// installation has no sibling multi-agent skill, so its fallback preserves
|
|
6
|
+
// the same explicit/inferred/fallback provenance contract locally.
|
|
7
|
+
try {
|
|
8
|
+
module.exports = require('../../multi-agent-workspace/scripts/project-docs-resolver');
|
|
9
|
+
} catch (error) {
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const os = require('os');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const crypto = require('crypto');
|
|
14
|
+
const PLATFORM_HOMES = Object.freeze(['.claude', '.cursor', '.github', '.codex', '.continue']);
|
|
15
|
+
function getWorkspaceRoot(start = process.cwd()) {
|
|
16
|
+
let dir = path.resolve(start);
|
|
17
|
+
while (dir !== path.parse(dir).root) {
|
|
18
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
19
|
+
dir = path.dirname(dir);
|
|
20
|
+
}
|
|
21
|
+
return path.resolve(start);
|
|
22
|
+
}
|
|
23
|
+
function getRepoManifestHomes(root) { return PLATFORM_HOMES.map(home => path.join(root, home)); }
|
|
24
|
+
function readProjectDocs(root) {
|
|
25
|
+
for (const home of getRepoManifestHomes(root)) {
|
|
26
|
+
const file = path.join(home, 'harness-everything', 'manifest.json');
|
|
27
|
+
try {
|
|
28
|
+
const data = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
29
|
+
if (data.projectDocs) return { file, projectDocs: data.projectDocs };
|
|
30
|
+
} catch { /* not bootstrapped or invalid; the check command reports it */ }
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function getWorkspaceKey(root) {
|
|
35
|
+
let real = path.resolve(root);
|
|
36
|
+
try { real = fs.realpathSync(real); } catch { /* best effort */ }
|
|
37
|
+
const slug = path.basename(real).toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'workspace';
|
|
38
|
+
return `${slug}-${crypto.createHash('sha1').update(real).digest('hex').slice(0, 12)}`;
|
|
39
|
+
}
|
|
40
|
+
function getStateHome() { return process.env.HARNESS_STATE_HOME || path.join(os.homedir(), '.agents', 'harness-everything'); }
|
|
41
|
+
function getRuntimeRoot(root) { return path.join(getStateHome(), 'workspaces', getWorkspaceKey(root), 'multi-agent'); }
|
|
42
|
+
function resolveProjectDocs(root) {
|
|
43
|
+
const workspaceRoot = path.resolve(root);
|
|
44
|
+
const manifest = readProjectDocs(workspaceRoot);
|
|
45
|
+
const docs = manifest ? manifest.projectDocs : {};
|
|
46
|
+
const fields = {
|
|
47
|
+
decision: ['decisionLocation', 'decisions', 'adrLocation', 'adr'],
|
|
48
|
+
domain: ['domainLocation', 'domains', 'contextLocation', 'contexts', 'domain'],
|
|
49
|
+
architecture: ['architectureLocation', 'architectures', 'architecture']
|
|
50
|
+
};
|
|
51
|
+
const conventional = {
|
|
52
|
+
decision: ['docs/adr', 'docs/decisions', 'adr', 'decisions'],
|
|
53
|
+
domain: ['docs/domain', 'docs/contexts', 'domain', 'contexts'],
|
|
54
|
+
architecture: ['docs/architecture', 'architecture']
|
|
55
|
+
};
|
|
56
|
+
const fallback = { decision: 'docs/adr', domain: 'docs/domain', architecture: 'docs/architecture' };
|
|
57
|
+
const paths = {};
|
|
58
|
+
for (const zone of Object.keys(fields)) {
|
|
59
|
+
let selected = null;
|
|
60
|
+
for (const field of fields[zone]) {
|
|
61
|
+
if (typeof docs[field] === 'string' && docs[field].trim()) {
|
|
62
|
+
selected = { path: path.resolve(workspaceRoot, docs[field]), source: 'projectDocs', resolution: 'explicit', field };
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!selected && docs.docLocation) {
|
|
67
|
+
const base = path.resolve(workspaceRoot, docs.docLocation);
|
|
68
|
+
const names = { decision: ['adr', 'decisions'], domain: ['domain', 'contexts'], architecture: ['architecture'] }[zone];
|
|
69
|
+
selected = { path: names.includes(path.basename(base).toLowerCase()) ? base : path.join(base, names[0]), source: 'projectDocs', resolution: 'inferred' };
|
|
70
|
+
}
|
|
71
|
+
if (!selected) {
|
|
72
|
+
const existing = conventional[zone].map(item => path.join(workspaceRoot, item)).find(item => {
|
|
73
|
+
try { return fs.statSync(item).isDirectory(); } catch { return false; }
|
|
74
|
+
});
|
|
75
|
+
if (existing) selected = { path: existing, source: 'inference', resolution: 'inferred' };
|
|
76
|
+
}
|
|
77
|
+
if (!selected) selected = { path: path.join(workspaceRoot, fallback[zone]), source: 'fallback', resolution: 'fallback' };
|
|
78
|
+
paths[zone] = { path: path.resolve(selected.path), relativePath: path.relative(workspaceRoot, selected.path).replace(/\\/g, '/'), source: selected.source, resolution: selected.resolution || selected.source, origin: selected.source, ...(selected.field ? { field: selected.field } : {}) };
|
|
79
|
+
}
|
|
80
|
+
const runtimeRoot = getRuntimeRoot(workspaceRoot);
|
|
81
|
+
return {
|
|
82
|
+
workspaceRoot,
|
|
83
|
+
workspaceKey: getWorkspaceKey(workspaceRoot),
|
|
84
|
+
stateHome: getStateHome(),
|
|
85
|
+
runtimeRoot,
|
|
86
|
+
runtime: { root: runtimeRoot, state: path.join(runtimeRoot, 'state'), logs: path.join(runtimeRoot, 'logs'), roles: path.join(runtimeRoot, 'roles') },
|
|
87
|
+
projectDocs: manifest ? { ...manifest.projectDocs, manifestPath: manifest.file } : null,
|
|
88
|
+
paths,
|
|
89
|
+
decisions: paths.decision,
|
|
90
|
+
domains: paths.domain,
|
|
91
|
+
architectures: paths.architecture
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function detectProjectDocsConventions(root) {
|
|
95
|
+
const workspaceRoot = path.resolve(root);
|
|
96
|
+
const configured = readProjectDocs(workspaceRoot);
|
|
97
|
+
const inferred = configured && configured.projectDocs && configured.projectDocs.docLocation
|
|
98
|
+
? { docLocation: configured.projectDocs.docLocation } : {};
|
|
99
|
+
if (!inferred.docLocation) {
|
|
100
|
+
for (const dir of ['docs/roadmaps', 'docs/reference', 'docs/specs', 'docs', 'doc']) {
|
|
101
|
+
if (fs.existsSync(path.join(workspaceRoot, dir))) { inferred.docLocation = `${dir}/`; break; }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (fs.existsSync(path.join(workspaceRoot, '.github', 'ISSUE_TEMPLATE'))) inferred.tracker = 'GitHub Issues via .github/ISSUE_TEMPLATE/';
|
|
105
|
+
else if (inferred.docLocation) inferred.tracker = `${inferred.docLocation}tickets/ local markdown tickets`;
|
|
106
|
+
if (inferred.tracker && inferred.tracker.includes('ISSUE_TEMPLATE')) inferred.issueDefinition = '.github/ISSUE_TEMPLATE/ template structure';
|
|
107
|
+
else if (inferred.tracker) inferred.issueDefinition = 'Title + acceptance criteria + Status: ready-for-agent';
|
|
108
|
+
return inferred;
|
|
109
|
+
}
|
|
110
|
+
module.exports = { PLATFORM_HOMES, getWorkspaceRoot, getStateHome, getRuntimeRoot, getWorkspaceKey, getRepoManifestHomes, readProjectDocs, resolveProjectDocs, detectProjectDocsConventions, ensureCommittableFallback: resolution => resolution };
|
|
111
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# CLI / API Reference Template
|
|
2
|
+
|
|
3
|
+
Use this shape when the artifact is documenting a new or changed command surface — a CLI command, flag set, or a single API endpoint. Lighter than `feature-spec.md`: no user stories, no seam-sketching. Fits Tier 2 work just as often as Tier 3.
|
|
4
|
+
|
|
5
|
+
<spec-template>
|
|
6
|
+
|
|
7
|
+
## Synopsis
|
|
8
|
+
|
|
9
|
+
One-line usage form, e.g. `harness todo add <task> [--priority <n>]` or `POST /api/orders/:id/cancel`.
|
|
10
|
+
|
|
11
|
+
## Description
|
|
12
|
+
|
|
13
|
+
What this command/endpoint does and when you'd reach for it, from the caller's perspective.
|
|
14
|
+
|
|
15
|
+
## Flags / Arguments / Parameters
|
|
16
|
+
|
|
17
|
+
Each flag, positional argument, or request field: name, type, required/optional, default, what it controls.
|
|
18
|
+
|
|
19
|
+
## Examples
|
|
20
|
+
|
|
21
|
+
2-3 concrete invocations covering the common case and at least one edge case.
|
|
22
|
+
|
|
23
|
+
## Exit Codes / Errors
|
|
24
|
+
|
|
25
|
+
Every distinct exit code or error response: what triggers it, what the caller should do about it.
|
|
26
|
+
|
|
27
|
+
## Related Commands / See Also
|
|
28
|
+
|
|
29
|
+
Other commands/endpoints this one is commonly paired with, supersedes, or is superseded by.
|
|
30
|
+
|
|
31
|
+
</spec-template>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Dev / Design Doc Template
|
|
2
|
+
|
|
3
|
+
Use this shape for a scoped technical decision that doesn't rise to a full ADR (see `grill-with-docs`'s three-criteria test) but is still worth writing down before implementing — the kind of thing a Tier 2 task produces when it makes a real design call along the way.
|
|
4
|
+
|
|
5
|
+
<spec-template>
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
What prompted this decision — the constraint, bug, or request behind it.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
What was decided, stated plainly.
|
|
14
|
+
|
|
15
|
+
## Alternatives Considered
|
|
16
|
+
|
|
17
|
+
Other options that were on the table and why they were passed over.
|
|
18
|
+
|
|
19
|
+
## Trade-offs
|
|
20
|
+
|
|
21
|
+
What this decision costs, even though it was the right call.
|
|
22
|
+
|
|
23
|
+
## Rollout / Rollback
|
|
24
|
+
|
|
25
|
+
How this ships (flag, gradual, all-at-once) and how to undo it if it's wrong.
|
|
26
|
+
|
|
27
|
+
</spec-template>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Feature Spec (PRD) Template
|
|
2
|
+
|
|
3
|
+
Use this shape when the artifact is a new feature, product surface, or anything with user-facing behavior and multiple implementation decisions to record. This is the heaviest template — reserve it for work that will get broken into tickets by `to-tickets` afterward.
|
|
4
|
+
|
|
5
|
+
<spec-template>
|
|
6
|
+
|
|
7
|
+
## Problem Statement
|
|
8
|
+
|
|
9
|
+
The problem that the user is facing, from the user's perspective.
|
|
10
|
+
|
|
11
|
+
## Solution
|
|
12
|
+
|
|
13
|
+
The solution to the problem, from the user's perspective.
|
|
14
|
+
|
|
15
|
+
## User Stories
|
|
16
|
+
|
|
17
|
+
A LONG, numbered list of user stories. Each user story should be in the format of:
|
|
18
|
+
|
|
19
|
+
1. As an <actor>, I want a <feature>, so that <benefit>
|
|
20
|
+
|
|
21
|
+
<user-story-example>
|
|
22
|
+
1. As a mobile bank customer, I want to see balance on my accounts, so that I can make better informed decisions about my spending
|
|
23
|
+
</user-story-example>
|
|
24
|
+
|
|
25
|
+
This list of user stories should be extremely extensive and cover all aspects of the feature.
|
|
26
|
+
|
|
27
|
+
## Implementation Decisions
|
|
28
|
+
|
|
29
|
+
A list of implementation decisions that were made. This can include:
|
|
30
|
+
|
|
31
|
+
- The modules that will be built/modified
|
|
32
|
+
- The interfaces of those modules that will be modified
|
|
33
|
+
- Technical clarifications from the developer
|
|
34
|
+
- Architectural decisions
|
|
35
|
+
- Schema changes
|
|
36
|
+
- API contracts
|
|
37
|
+
- Specific interactions
|
|
38
|
+
|
|
39
|
+
Do NOT include specific file paths or code snippets. They may end up being outdated very quickly.
|
|
40
|
+
|
|
41
|
+
Exception: if a prototype produced a snippet that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), inline it within the relevant decision and note briefly that it came from a prototype. Trim to the decision-rich parts — not a working demo, just the important bits.
|
|
42
|
+
|
|
43
|
+
## Testing Decisions
|
|
44
|
+
|
|
45
|
+
A list of testing decisions that were made. Include:
|
|
46
|
+
|
|
47
|
+
- A description of what makes a good test (only test external behavior, not implementation details)
|
|
48
|
+
- Which modules will be tested
|
|
49
|
+
- Prior art for the tests (i.e. similar types of tests in the codebase)
|
|
50
|
+
|
|
51
|
+
## Out of Scope
|
|
52
|
+
|
|
53
|
+
A description of the things that are out of scope for this spec.
|
|
54
|
+
|
|
55
|
+
## Further Notes
|
|
56
|
+
|
|
57
|
+
Any further notes about the feature.
|
|
58
|
+
|
|
59
|
+
</spec-template>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Schema / File Format Template
|
|
2
|
+
|
|
3
|
+
Use this shape when the artifact is documenting a data shape — a database schema change, a config file format, a wire payload, or an on-disk state file. Lighter than `feature-spec.md`: no user stories, no seam-sketching.
|
|
4
|
+
|
|
5
|
+
<spec-template>
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
What this schema represents and why it exists, in one or two sentences.
|
|
10
|
+
|
|
11
|
+
## Shape
|
|
12
|
+
|
|
13
|
+
Every field: name, type, required/optional, constraints (enum values, ranges, format). A snippet is appropriate here — schemas are exactly the case where inlining the shape beats describing it in prose.
|
|
14
|
+
|
|
15
|
+
## Versioning / Migration
|
|
16
|
+
|
|
17
|
+
How a previous version maps to this one, if this is a change rather than a new schema. Whether old readers/writers still work, and for how long.
|
|
18
|
+
|
|
19
|
+
## Validation Rules
|
|
20
|
+
|
|
21
|
+
Constraints that span multiple fields, or that a type system alone can't express (e.g. "end_date must be after start_date").
|
|
22
|
+
|
|
23
|
+
## Backward Compatibility
|
|
24
|
+
|
|
25
|
+
What breaks for existing consumers, if anything, and what the mitigation is (dual-write, expand-contract, feature flag).
|
|
26
|
+
|
|
27
|
+
## Example Payload
|
|
28
|
+
|
|
29
|
+
One realistic, complete example instance of the schema.
|
|
30
|
+
|
|
31
|
+
</spec-template>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: to-tickets
|
|
3
|
+
description: Break a to-spec feature-spec, a plan, or a conversation into tracer-bullet tickets with declared blocking edges — one file per ticket locally or issues on a real tracker via projectDocs. Use when an approved spec needs dependency-aware ordering.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: Miya Daniel
|
|
7
|
+
version: 0.4.0
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# To Tickets
|
|
11
|
+
|
|
12
|
+
Cuts a plan or spec into tracer-bullet vertical slices, each declaring its blockers.
|
|
13
|
+
|
|
14
|
+
## USE FOR:
|
|
15
|
+
- Break a spec or settled plan into tracer-bullet vertical slices
|
|
16
|
+
- Declaring blocking edges and dependency order
|
|
17
|
+
- Publishing tickets to local files or a tracker
|
|
18
|
+
|
|
19
|
+
## DO NOT USE FOR:
|
|
20
|
+
- Writing the feature spec itself — instead use `to-spec`
|
|
21
|
+
- Trivial single-edit tasks needing no breakdown
|
|
22
|
+
- Closing parent tracker issues
|
|
23
|
+
|
|
24
|
+
## Skill Contract
|
|
25
|
+
|
|
26
|
+
| Component | Specification |
|
|
27
|
+
| :--- | :--- |
|
|
28
|
+
| **Trigger / Input** | Explicit /to-tickets only; input: spec reference or plan in context. |
|
|
29
|
+
| **Expected Output** | Tickets with What-to-build, Blocked-by, criteria — per projectDocs/convention/fallback. |
|
|
30
|
+
| **State Mutations** | None to manifest.json (reads only); writes tickets at resolved location. |
|
|
31
|
+
| **Enforcement Gate** | Run `node "<skills-repo-root>/to-spec/scripts/check-project-docs.js" check` if available; never block on Exit 1; MUST get user approval before publishing. |
|
|
32
|
+
|
|
33
|
+
## Process
|
|
34
|
+
|
|
35
|
+
1. Resolve path: script check (Exit 0 = configured location) → workspace convention dirs → platform fallback (`.claude`/`.github`/`.cursor` + `/harness-everything/tickets/`).
|
|
36
|
+
2. Gather context: prefer a referenced to-spec spec — design-audit verification MANDATORY first, else refuse; no spec is fine.
|
|
37
|
+
3. Explore codebase (optional): evidence-cited findings only; prefactor first.
|
|
38
|
+
4. Draft vertical slices: complete path through every layer, demoable alone, one context window each; declare blocking edges.
|
|
39
|
+
5. Quiz the user on granularity and edges until approved (MANDATORY gate).
|
|
40
|
+
6. Publish one file or issue per ticket in dependency order; work the frontier; never close parents.
|
|
41
|
+
|
|
42
|
+
Deep dive: <this-skill-dir>/references/publishing-and-templates.md
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Storage Path Resolution & Publishing Detail (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
### 0. Resolve Storage Path & Framework (Gated Resolution Loop)
|
|
4
|
+
|
|
5
|
+
Follow the decision matrix below to determine where ticket artifacts must be published:
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
flowchart TD
|
|
9
|
+
Start[Receive /to-tickets Request] --> CheckScript{1. Node.js & Script Executable?}
|
|
10
|
+
|
|
11
|
+
CheckScript -- Yes --> RunCheck[Run check-project-docs.js check]
|
|
12
|
+
RunCheck -- Exit 0 (Configured) --> PathConfig[Use Project Configured Path<br>e.g. docs/roadmaps/, tracker, or .scratch/]
|
|
13
|
+
RunCheck -- Exit 1 (Unset) --> InspectRepo
|
|
14
|
+
|
|
15
|
+
CheckScript -- No / Fails --> InspectRepo{2. Inspect Existing Workspace Conventions}
|
|
16
|
+
|
|
17
|
+
InspectRepo -- Existing Folder Found --> PathRepo[Use Workspace Convention<br>e.g. docs/roadmaps/, docs/tickets/, tasks/tickets/]
|
|
18
|
+
InspectRepo -- No Conventional Folder --> CheckPlatform{3. Fallback to Active Platform Home}
|
|
19
|
+
|
|
20
|
+
CheckPlatform -- Claude Code --> PathClaude[Write to .claude/harness-everything/tickets/]
|
|
21
|
+
CheckPlatform -- GitHub Copilot / VS Code --> PathCopilot[Write to .github/harness-everything/tickets/]
|
|
22
|
+
CheckPlatform -- Cursor / Other --> PathCursor[Write to .cursor/harness-everything/tickets/]
|
|
23
|
+
|
|
24
|
+
PathConfig --> Draft
|
|
25
|
+
PathRepo --> Draft
|
|
26
|
+
PathClaude --> Draft
|
|
27
|
+
PathCopilot --> Draft
|
|
28
|
+
PathCursor --> Draft
|
|
29
|
+
Draft[Draft & Publish Tickets]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### Path Resolution Rules:
|
|
33
|
+
1. **Explicit Project Configuration (`projectDocs`)**: If `check-project-docs.js` returns `Exit 0`, use the configured `docLocation` or `tracker`.
|
|
34
|
+
2. **Workspace Convention Inspection**: If unconfigured or script unavailable, check if any of these directories exist in the workspace:
|
|
35
|
+
- `docs/roadmaps/`
|
|
36
|
+
- `docs/tickets/`
|
|
37
|
+
- `tasks/tickets/`
|
|
38
|
+
- `.scratch/issues/`
|
|
39
|
+
If found, save tickets in the matching directory.
|
|
40
|
+
3. **Platform Isolation Fallback**: If no directory convention exists, create and write ticket files inside the active IDE platform state folder:
|
|
41
|
+
- Claude Code: `.claude/harness-everything/tickets/<NN>-<slug>.md`
|
|
42
|
+
- GitHub Copilot: `.github/harness-everything/tickets/<NN>-<slug>.md`
|
|
43
|
+
- Cursor: `.cursor/harness-everything/tickets/<NN>-<slug>.md`
|
|
44
|
+
|
|
45
|
+
# Wide Refactors: Expand-Contract Exception
|
|
46
|
+
|
|
47
|
+
Give each ticket its **blocking edges** — the other tickets that must complete before it can start. A ticket with no blockers can start immediately.
|
|
48
|
+
|
|
49
|
+
**Wide refactors are the exception to vertical slicing.** A **wide refactor** is one mechanical change — rename a column, retype a shared symbol — whose **blast radius** fans across the whole codebase, so a single edit breaks thousands of call sites at once and no vertical slice can land green. Don't force it into a tracer bullet; sequence it as **expand–contract**. First expand: add the new form beside the old so nothing breaks. Then migrate the call sites over in batches sized by blast radius (per package, per directory), each batch its own ticket blocked by the expand, keeping CI green batch to batch because the old form still exists. Finally contract: delete the old form once no caller remains, in a ticket blocked by every migrate batch. When even the batches can't stay green alone, keep the sequence but let them share an integration branch that all block a final integrate-and-verify ticket — green is promised only there.
|
|
50
|
+
|
|
51
|
+
# Ticket Templates
|
|
52
|
+
|
|
53
|
+
<local-ticket-template>
|
|
54
|
+
|
|
55
|
+
# <NN> — <Ticket title>
|
|
56
|
+
|
|
57
|
+
**What to build:** the end-to-end behaviour this ticket makes work, from the user's perspective — not a layer-by-layer implementation list.
|
|
58
|
+
|
|
59
|
+
**Blocked by:** the numbers/titles of the tickets that gate this one, or "None — can start immediately".
|
|
60
|
+
|
|
61
|
+
**Status:** ready-for-agent
|
|
62
|
+
|
|
63
|
+
- [ ] Acceptance criterion 1
|
|
64
|
+
- [ ] Acceptance criterion 2
|
|
65
|
+
|
|
66
|
+
</local-ticket-template>
|
|
67
|
+
|
|
68
|
+
<issue-template>
|
|
69
|
+
|
|
70
|
+
## Parent
|
|
71
|
+
|
|
72
|
+
A reference to the parent issue/spec on the tracker (the `to-spec` feature spec this came from, if any — otherwise omit this section).
|
|
73
|
+
|
|
74
|
+
## What to build
|
|
75
|
+
|
|
76
|
+
The end-to-end behaviour this ticket makes work, from the user's perspective — not layer-by-layer implementation.
|
|
77
|
+
|
|
78
|
+
## Acceptance criteria
|
|
79
|
+
|
|
80
|
+
- [ ] Criterion 1
|
|
81
|
+
- [ ] Criterion 2
|
|
82
|
+
|
|
83
|
+
## Blocked by
|
|
84
|
+
|
|
85
|
+
- A reference to each blocking ticket, or "None — can start immediately".
|
|
86
|
+
|
|
87
|
+
</issue-template>
|
|
88
|
+
|
|
89
|
+
In either form, avoid specific file paths or code snippets — they go stale fast. Exception: if a prototype produced a snippet that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), inline it and note briefly that it came from a prototype. Trim to the decision-rich parts — not a working demo, just the important bits.
|
|
90
|
+
|
|
91
|
+
# Gather-Context Notes
|
|
92
|
+
|
|
93
|
+
If the referenced doc is a cli-reference, schema-doc, or dev-doc (a lighter to-spec shape, not a feature-spec), it is usually already ticket-sized on its own — confirm with the user whether it needs splitting before drafting.
|
|
94
|
+
|
|
95
|
+
# Evidence Format (Zero-Trust Exploration)
|
|
96
|
+
|
|
97
|
+
Every finding must cite explicit evidence: `Evidence: [File path & line number / Tool output] -> Finding: [What it means]`. Never guess codebase layout or dependencies.
|