harness-everything 0.2.2 → 0.3.6
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/.claude-plugin/marketplace.json +27 -0
- package/.claude-plugin/plugin.json +51 -0
- package/.gitattributes +1 -0
- package/.github/workflows/behavioral-evals.yml +36 -0
- package/.github/workflows/ci.yml +117 -0
- package/.github/workflows/release.yml +45 -0
- package/.husky/commit-msg +1 -0
- package/.waza.yaml +22 -0
- package/AGENTS.md +60 -2
- package/BENCHMARK_SOP.md +62 -62
- package/CHANGELOG.md +297 -114
- package/CODE_OF_CONDUCT.md +24 -0
- package/CONTRIBUTING.md +47 -0
- package/Dockerfile +18 -18
- package/LICENSE +201 -201
- package/README.md +279 -197
- package/SECURITY.md +33 -0
- package/VERIFICATION.md +394 -347
- package/ab-test-deep-analysis-2026-08-27.md +383 -0
- package/ab-test-results-2026-08-27.md +152 -0
- package/ab-test-statistical-analysis-31cases.md +193 -0
- package/behavioral-evals/README.md +85 -0
- package/behavioral-evals/analyze-plugin-results.js +110 -0
- package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
- package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
- package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
- package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
- package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
- package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
- package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
- package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
- package/behavioral-evals/cases/baseline-performance.yaml +34 -0
- package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
- package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
- package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
- package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
- package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
- package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
- package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
- package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
- package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
- package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
- package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
- package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
- package/behavioral-evals/cases/pressure-scope-bypass.yaml +28 -0
- package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
- package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
- package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
- package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
- package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
- package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
- package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +47 -0
- package/behavioral-evals/cases/scope-discipline.yaml +32 -0
- package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
- package/behavioral-evals/cases/verify-before-done.yaml +31 -0
- package/behavioral-evals/results/.gitkeep +0 -0
- package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
- package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
- package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
- package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
- package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
- package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
- package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
- package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
- package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
- package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
- package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
- package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
- package/behavioral-evals/results/run-20260827-115509.log +287 -0
- package/behavioral-evals/run-with-plugin.js +316 -0
- package/behavioral-evals/run.js +587 -0
- package/benchmarks/README.md +63 -0
- package/benchmarks/ab-test-2026-08-26/results.json +55 -0
- package/benchmarks/results/logs/.gitkeep +0 -0
- package/benchmarks/results/logs/test-a-harness.md +31 -0
- package/benchmarks/results/logs/test-a-vanilla.md +28 -0
- package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
- package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
- package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
- package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
- package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
- package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
- package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
- package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
- package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
- package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
- package/benchmarks/results/results.json +158 -0
- package/benchmarks/run.js +220 -0
- package/benchmarks/schema.json +44 -0
- package/bin/cli.js +152 -97
- package/ci/ab-test-cases/grill-me-adversarial.yaml +18 -0
- package/ci/ab-test-cases/tdd-test-first.yaml +23 -0
- package/ci/ab-test-cases/verification-loop-gates.yaml +25 -0
- package/ci/ab-test-cases/verify-before-claim-cites.yaml +18 -0
- package/ci/ab-test-harness.js +410 -0
- package/{eval-framework → ci}/cases/case1.json +5 -5
- package/ci/cases/case10-small-feature.json +5 -0
- package/ci/cases/case11-readme-typo-update.json +5 -0
- package/ci/cases/case12-chinese-macro-audit.json +5 -0
- package/{eval-framework → ci}/cases/case2.json +5 -5
- package/{eval-framework → ci}/cases/case3.json +5 -5
- package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
- package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
- package/ci/cases/case6-macro-skill-audit.json +5 -0
- package/ci/cases/case7-macro-reference-audit.json +5 -0
- package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
- package/ci/cases/case9-four-issue-audit.json +5 -0
- package/ci/consistency-check.js +347 -0
- package/ci/description-collision.js +109 -0
- package/ci/fable-mode-test.js +120 -0
- package/ci/fixtures/agency-agents/divisions.json +6 -0
- package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
- package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
- package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
- package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
- package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
- package/ci/mechanism-2a-rule-of-3.test.js +46 -0
- package/ci/mechanism-2b-boundary-guard.test.js +16 -0
- package/ci/mechanism-2c-state-persist.test.js +29 -0
- package/ci/mechanism-2d-fact-audit.test.js +18 -0
- package/ci/mechanism-2e-scope-guard.test.js +24 -0
- package/ci/mechanism-2f-stop-gate.test.js +23 -0
- package/ci/mechanism-2g-platform-ignore.test.js +88 -0
- package/ci/mechanism-2h-installer-manifest.test.js +147 -0
- package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
- package/ci/mechanism-2i-install-verification.test.js +34 -0
- package/ci/mechanism-2j-behavioral-runner.test.js +20 -0
- package/ci/mechanism-2k-reference-check.test.js +20 -0
- package/ci/mechanism-2l-multi-agent-workspace.test.js +105 -0
- package/ci/mechanism-test.js +71 -0
- package/ci/negative-controls.js +84 -0
- package/ci/reference-check.js +112 -0
- package/ci/release-consistency-check.js +123 -0
- package/ci/routing-check.js +90 -0
- package/{eval-framework → ci}/runner.js +56 -56
- package/ci/skill-routing-check.js +98 -0
- package/ci/test-helper.js +104 -0
- package/ci/test-negative-controls.js +148 -0
- package/commitlint.config.js +25 -0
- package/docker-verify.sh +266 -266
- package/docs/architecture.md +99 -95
- package/docs/audit.md +53 -0
- package/docs/mechanism-first-skill-mesh.md +163 -0
- package/docs/philosophy.md +47 -45
- package/docs/reflection.md +48 -34
- package/docs/routing.md +58 -45
- package/docs/troubleshooting.md +284 -0
- package/docs/workflows/environment-detection.md +10 -10
- package/docs/workflows/eval-harness.md +13 -6
- package/docs/workflows/fable-discipline.md +9 -9
- package/docs/workflows/fable-mode.md +29 -32
- package/docs/workflows/find-skills.md +36 -0
- package/docs/workflows/git-commit.md +18 -9
- package/docs/workflows/grill-me.md +11 -11
- package/docs/workflows/grill-with-docs.md +14 -7
- package/docs/workflows/harness-everything.md +95 -92
- package/docs/workflows/improve-codebase-architecture.md +15 -7
- package/docs/workflows/install-cognitive-os.md +60 -60
- package/docs/workflows/multi-agent-workspace.md +42 -0
- package/docs/workflows/repo-docs.md +12 -7
- package/docs/workflows/security-review.md +26 -7
- package/docs/workflows/self-evolve.md +27 -44
- package/docs/workflows/skill-creator.md +80 -75
- package/docs/workflows/skill-style.md +64 -64
- package/docs/workflows/tdd.md +42 -39
- package/docs/workflows/to-spec.md +83 -0
- package/docs/workflows/to-tickets.md +80 -0
- package/docs/workflows/todo-driven-workflow.md +34 -36
- package/docs/workflows/using-git-worktrees.md +12 -8
- package/docs/workflows/verification-loop.md +16 -14
- package/docs/workflows/verify-before-claim.md +12 -8
- package/docs/workflows/zoom-out.md +22 -10
- package/environment-detection/SKILL.md +25 -61
- package/environment-detection/references/shell-syntax-rules.md +76 -0
- package/environment-detection/scripts/preflight.js +103 -93
- package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
- package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
- package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
- package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
- package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
- package/eval-harness/SKILL.md +34 -51
- package/eval-harness/references/scoring-rubric.md +68 -0
- package/eval-harness/scripts/evaluate.js +77 -61
- package/evals/environment-detection/eval.yaml +26 -0
- package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
- package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
- package/evals/eval-harness/eval.yaml +26 -0
- package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
- package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
- package/evals/fable-discipline/eval.yaml +26 -0
- package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
- package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
- package/evals/fable-mode/eval.yaml +26 -0
- package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
- package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
- package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
- package/evals/find-skills/eval.yaml +26 -0
- package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
- package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
- package/evals/git-commit/eval.yaml +26 -0
- package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
- package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
- package/evals/grill-me/eval.yaml +26 -0
- package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
- package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
- package/evals/grill-with-docs/eval.yaml +26 -0
- package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
- package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
- package/evals/harness-everything/eval.yaml +26 -0
- package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
- package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
- package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
- package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
- package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
- package/evals/improve-codebase-architecture/eval.yaml +26 -0
- package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
- package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
- package/evals/install-cognitive-os/eval.yaml +26 -0
- package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
- package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
- package/evals/multi-agent-workspace/eval.yaml +26 -0
- package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
- package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
- package/evals/repo-docs/eval.yaml +26 -0
- package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
- package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
- package/evals/rewrite-commits/eval.yaml +26 -0
- package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
- package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
- package/evals/security-review/eval.yaml +26 -0
- package/evals/security-review/tasks/negative-trigger.yaml +16 -0
- package/evals/security-review/tasks/positive-trigger.yaml +15 -0
- package/evals/self-evolve/eval.yaml +26 -0
- package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
- package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
- package/evals/skill-creator/eval.yaml +26 -0
- package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
- package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
- package/evals/skill-style/eval.yaml +26 -0
- package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
- package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
- package/evals/tdd/eval.yaml +26 -0
- package/evals/tdd/tasks/negative-trivia.yaml +16 -0
- package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
- package/evals/tdd/tasks/positive-feature.yaml +16 -0
- package/evals/tdd/tasks/positive-refactor.yaml +15 -0
- package/evals/to-spec/eval.yaml +26 -0
- package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
- package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
- package/evals/to-tickets/eval.yaml +26 -0
- package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
- package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
- package/evals/todo-driven-workflow/eval.yaml +26 -0
- package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
- package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
- package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
- package/evals/using-git-worktrees/eval.yaml +26 -0
- package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
- package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
- package/evals/verification-loop/eval.yaml +26 -0
- package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
- package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
- package/evals/verify-before-claim/eval.yaml +26 -0
- package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
- package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
- package/evals/zoom-out/eval.yaml +26 -0
- package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
- package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
- package/fable-discipline/SKILL.md +31 -28
- package/fable-discipline/references/discipline-rules.md +22 -0
- package/fable-mode/CONTRACT-FORMAT.md +51 -51
- package/fable-mode/SKILL.md +31 -43
- package/fable-mode/agents/fable-orchestrator.md +99 -92
- package/fable-mode/agents/fable-verifier.md +32 -32
- package/fable-mode/agents/fable-worker-haiku.md +52 -48
- package/fable-mode/agents/fable-worker-sonnet.md +53 -49
- package/fable-mode/execution-guardrails/SKILL.md +43 -87
- package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
- package/fable-mode/fable-haiku/SKILL.md +36 -48
- package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
- package/fable-mode/fable-opus/SKILL.md +36 -0
- package/fable-mode/fable-sonnet/SKILL.md +36 -0
- package/fable-mode/model-matrix.json +32 -0
- package/fable-mode/references/execution-phases.md +37 -0
- package/fable-mode/references/model-matrix.md +39 -0
- package/fable-mode/scripts/model-selector.js +129 -0
- package/find-skills/SKILL.md +48 -0
- package/find-skills/references/discovery-flow.md +102 -0
- package/find-skills/scripts/use-skill.js +106 -0
- package/git-commit/SKILL.md +35 -45
- package/git-commit/guides/ANGULAR_STYLE.md +60 -60
- package/git-commit/guides/COMMIT_GENERATION.md +23 -23
- package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
- package/git-commit/guides/MAIN_REPO.md +14 -14
- package/git-commit/guides/SUBMODULES.md +27 -27
- package/git-commit/references/commit-flow.md +30 -0
- package/grill-me/SKILL.md +34 -27
- package/grill-me/references/grilling-playbook.md +38 -0
- package/grill-with-docs/ADR-FORMAT.md +47 -47
- package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
- package/grill-with-docs/SKILL.md +33 -91
- package/grill-with-docs/references/session-playbook.md +97 -0
- package/harness-everything/SKILL.md +29 -128
- package/harness-everything/examples/README.md +9 -9
- package/harness-everything/examples/todo-workflow.md +22 -22
- package/harness-everything/references/skill-registry.md +39 -0
- package/harness-everything/references/triage-and-tiers.md +116 -0
- package/harness-everything/scripts/bootstrap.js +203 -140
- package/harness-everything/scripts/routing-keywords.json +320 -0
- package/harness-everything/scripts/self-heal.js +241 -189
- package/harness-everything/scripts/tier-router.js +334 -219
- package/harness-everything/scripts/verify-gate.js +100 -31
- package/hooks/hooks.json +155 -155
- package/hooks/scripts/atomic-commit-check.js +68 -68
- package/hooks/scripts/boundary-guard.js +55 -55
- package/hooks/scripts/context-compact.js +114 -114
- package/hooks/scripts/contract-test.js +79 -79
- package/hooks/scripts/depth-guard.js +65 -65
- package/hooks/scripts/lib/harness-state.js +139 -228
- package/hooks/scripts/lib/platforms/claude.js +72 -19
- package/hooks/scripts/lib/platforms/codex.js +24 -6
- package/hooks/scripts/lib/platforms/continue.js +23 -5
- package/hooks/scripts/lib/platforms/copilot.js +23 -5
- package/hooks/scripts/lib/platforms/cursor.js +23 -5
- package/hooks/scripts/lib/platforms/hermes.js +57 -57
- package/hooks/scripts/lib/platforms/index.js +17 -17
- package/hooks/scripts/lib/platforms/worktrees.js +20 -20
- package/hooks/scripts/reset-circuit-breaker.js +30 -30
- package/hooks/scripts/rule-of-3-tracker.js +124 -91
- package/hooks/scripts/rule-of-3.js +187 -176
- package/hooks/scripts/state-persist.js +99 -99
- package/hooks/scripts/stop-gate.js +80 -80
- package/hooks/scripts/subagent-scope-guard.js +88 -88
- package/improve-codebase-architecture/SKILL.md +31 -35
- package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
- package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
- package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
- package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
- package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
- package/install-cognitive-os/SKILL.md +23 -80
- package/install-cognitive-os/references/cognitive-loop.md +27 -0
- package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
- package/multi-agent-workspace/SKILL.md +37 -0
- package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
- package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
- package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
- package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
- package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
- package/multi-agent-workspace/references/agency-agents.md +31 -0
- package/multi-agent-workspace/references/architecture-guide.md +32 -0
- package/multi-agent-workspace/references/orchestration.md +48 -0
- package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
- package/multi-agent-workspace/scripts/index_memory.js +51 -0
- package/multi-agent-workspace/scripts/scaffold.js +253 -0
- package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
- package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
- package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
- package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
- package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
- package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
- package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
- package/multi-agent-workspace/workflows/01-init.md +22 -0
- package/multi-agent-workspace/workflows/02-analysis.md +23 -0
- package/multi-agent-workspace/workflows/03-generation.md +27 -0
- package/multi-agent-workspace/workflows/04-launcher.md +16 -0
- package/opencode-plugin/README.md +94 -0
- package/opencode-plugin/hooks/circuit-breaker.js +121 -0
- package/opencode-plugin/hooks/compliance.js +128 -0
- package/opencode-plugin/hooks/post-edit.js +62 -0
- package/opencode-plugin/hooks/pre-complete.js +65 -0
- package/opencode-plugin/hooks/verify.js +140 -0
- package/opencode-plugin/plugin.json +17 -0
- package/opencode-plugin/test-hook-firing.js +198 -0
- package/package.json +50 -22
- package/references/definition-of-done.md +67 -0
- package/references/performance-checklist.md +153 -0
- package/references/platform-advisory-template.md +58 -0
- package/references/security-checklist.md +205 -0
- package/repo-docs/SKILL.md +38 -37
- package/repo-docs/references/process-guide.md +60 -0
- package/repo-docs/templates/agents-template.md +264 -264
- package/repo-docs/templates/knowledge-agents-template.md +50 -50
- package/repo-docs/templates/knowledge-readme-template.md +83 -83
- package/repo-docs/templates/manual-recon.md +117 -117
- package/repo-docs/templates/multi-skills-readme-template.md +72 -72
- package/repo-docs/templates/product-agents-template.md +78 -78
- package/repo-docs/templates/product-readme-template.md +95 -95
- package/repo-docs/templates/readme-template.md +136 -136
- package/repo-docs/templates/single-skill-readme-template.md +70 -70
- package/repo-docs/templates/skills-agents-template.md +60 -60
- package/rewrite-commits/SKILL.md +22 -17
- package/rewrite-commits/references/workflow.md +18 -0
- package/scripts/installer.js +546 -506
- package/scripts/lib/advisory-text.js +8 -4
- package/scripts/lib/claude-hooks.js +18 -5
- package/scripts/lib/gitignore.js +199 -80
- package/scripts/lib/manifest.js +68 -4
- package/scripts/lib/prompts.js +1 -1
- package/scripts/lib/skills.js +87 -1
- package/scripts/verify-install.js +147 -0
- package/security-review/SKILL.md +35 -496
- package/security-review/guides/OWASP-PATTERNS.md +31 -0
- package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
- package/security-review/references/security-checklist.md +478 -0
- package/security-review/scripts/audit-secrets.js +84 -0
- package/self-evolve/SKILL.md +38 -45
- package/self-evolve/references/memory-resolution.md +58 -0
- package/self-evolve/scripts/persist-memory.js +139 -40
- package/self-evolve/scripts/register-dynamic-skill.js +251 -0
- package/self-evolve/scripts/self-regression.js +110 -113
- package/skill-creator/SKILL.md +34 -76
- package/skill-creator/references/authoring-workflow.md +14 -0
- package/skill-creator/references/dynamic-generation-contract.md +21 -0
- package/skill-creator/references/quality-checklist.md +15 -0
- package/skill-creator/references/quality-principles.md +81 -81
- package/skill-creator/references/testing-workflow.md +27 -32
- package/skill-style/SKILL.md +33 -39
- package/skill-style/references/style-guide.md +36 -0
- package/tdd/SKILL.md +34 -43
- package/tdd/guides/deep-modules.md +33 -33
- package/tdd/guides/interface-design.md +31 -31
- package/tdd/guides/mocking.md +59 -59
- package/tdd/guides/refactoring.md +10 -10
- package/tdd/guides/tests.md +61 -61
- package/tdd/references/core-discipline.md +49 -0
- package/to-spec/SKILL.md +42 -0
- package/to-spec/references/process.md +77 -0
- package/to-spec/scripts/check-project-docs.js +259 -0
- package/to-spec/templates/cli-reference.md +31 -0
- package/to-spec/templates/dev-doc.md +27 -0
- package/to-spec/templates/feature-spec.md +59 -0
- package/to-spec/templates/schema-doc.md +31 -0
- package/to-tickets/SKILL.md +42 -0
- package/to-tickets/references/publishing-and-templates.md +97 -0
- package/todo-driven-workflow/SKILL.md +27 -41
- package/todo-driven-workflow/references/execution-guide.md +27 -0
- package/using-git-worktrees/SKILL.md +29 -141
- package/using-git-worktrees/references/workflow-details.md +108 -0
- package/verification-loop/SKILL.md +29 -121
- package/verification-loop/references/verification-phases.md +116 -0
- package/verification-loop/templates/verification-report.template.md +15 -0
- package/verify-before-claim/SKILL.md +27 -70
- package/verify-before-claim/references/verification-guide.md +73 -0
- package/zoom-out/SKILL.md +28 -76
- package/zoom-out/references/circuit-breaker.md +66 -0
- package/zoom-out/templates/zoom-out-report.template.md +20 -0
- package/build-multi-agent-system/AGENTS.md +0 -50
- package/build-multi-agent-system/README.md +0 -63
- package/build-multi-agent-system/SKILL.md +0 -68
- package/create-agent-launcher/SKILL.md +0 -48
- package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
- package/create-agent-launcher/workflows/01-init.md +0 -22
- package/create-agent-launcher/workflows/02-analysis.md +0 -26
- package/create-agent-launcher/workflows/03-generation.md +0 -29
- package/create-agent-launcher/workflows/04-launcher.md +0 -20
- package/docs/workflows/build-multi-agent-system.md +0 -62
- package/docs/workflows/create-agent-launcher.md +0 -62
- package/eval-framework/behavioral-test.js +0 -105
- package/eval-framework/mechanism-test.js +0 -251
- package/harness-everything/scripts/todo-cli.js +0 -157
- package/skill-style/STYLE.md +0 -37
|
@@ -1,228 +1,139 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
|
|
3
|
-
// counters, handoff/verification timestamps, etc). Lives under the active
|
|
4
|
-
// platform's own harness-everything/ subfolder (see each module's
|
|
5
|
-
// getStateDir() in hooks/scripts/lib/platforms/) - a sibling of that same
|
|
6
|
-
// platform's install manifest, and (for Claude only) its skill copies.
|
|
7
|
-
//
|
|
8
|
-
// For Claude Code that's `<repo root>/.claude/harness-everything/state/`,
|
|
9
|
-
// keyed by session_id under `sessions/<id>/` so two sessions open on the same
|
|
10
|
-
// repo never share (and stomp) each other's edit/verify timestamps or
|
|
11
|
-
// breaker counts. Invocations with no session_id (manual terminal runs,
|
|
12
|
-
// VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
|
|
13
|
-
// rather than a random one, so manual testing stays predictable.
|
|
14
|
-
const fs = require('fs');
|
|
15
|
-
const path = require('path');
|
|
16
|
-
|
|
17
|
-
const CURRENT_SESSION_FILE = 'current-session';
|
|
18
|
-
const DEFAULT_SESSION = 'default';
|
|
19
|
-
|
|
20
|
-
function getWorkspaceRoot() {
|
|
21
|
-
let dir = path.resolve(process.cwd());
|
|
22
|
-
while (dir !== path.parse(dir).root) {
|
|
23
|
-
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
24
|
-
dir = path.dirname(dir);
|
|
25
|
-
}
|
|
26
|
-
return process.cwd();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function detectActivePlatform(wsRoot) {
|
|
30
|
-
const root = wsRoot || getWorkspaceRoot();
|
|
31
|
-
|
|
32
|
-
// 1.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (fs.existsSync(path.join(root, '.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
dedupedLines.pop();
|
|
141
|
-
}
|
|
142
|
-
const finalLines = dedupedLines.concat(patternsToAdd);
|
|
143
|
-
fs.writeFileSync(gitignorePath, finalLines.join('\n') + '\n', 'utf8');
|
|
144
|
-
}
|
|
145
|
-
} catch (err) {
|
|
146
|
-
// Fail silently to avoid breaking execution if .gitignore is write-locked
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function getStateRoot(root) {
|
|
151
|
-
const wsRoot = root || getWorkspaceRoot();
|
|
152
|
-
const activePlatformName = detectActivePlatform(wsRoot);
|
|
153
|
-
const allPlatforms = require('./platforms');
|
|
154
|
-
const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
|
|
155
|
-
|
|
156
|
-
if (activePlatform && typeof activePlatform.getStateDir === 'function') {
|
|
157
|
-
return activePlatform.getStateDir(wsRoot);
|
|
158
|
-
}
|
|
159
|
-
return path.join(wsRoot, '.claude', 'harness-state');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function getSessionDir(root, sessionId) {
|
|
163
|
-
const resolvedRoot = root || getWorkspaceRoot();
|
|
164
|
-
ensureHarnessStateIgnored(resolvedRoot);
|
|
165
|
-
const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionId || DEFAULT_SESSION);
|
|
166
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
167
|
-
return dir;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function listSessionDirs(root) {
|
|
171
|
-
const sessionsRoot = path.join(getStateRoot(root), 'sessions');
|
|
172
|
-
try {
|
|
173
|
-
return fs.readdirSync(sessionsRoot, { withFileTypes: true })
|
|
174
|
-
.filter(e => e.isDirectory())
|
|
175
|
-
.map(e => path.join(sessionsRoot, e.name));
|
|
176
|
-
} catch (err) {
|
|
177
|
-
return [];
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function writeCurrentSession(root, sessionId) {
|
|
182
|
-
if (!sessionId) return;
|
|
183
|
-
try {
|
|
184
|
-
const wsRoot = root || getWorkspaceRoot();
|
|
185
|
-
ensureHarnessStateIgnored(wsRoot);
|
|
186
|
-
const stateRoot = getStateRoot(wsRoot);
|
|
187
|
-
fs.mkdirSync(stateRoot, { recursive: true });
|
|
188
|
-
fs.writeFileSync(path.join(stateRoot, CURRENT_SESSION_FILE), sessionId, 'utf8');
|
|
189
|
-
} catch (err) {
|
|
190
|
-
// Best-effort - only the manual reset-circuit-breaker.js escape hatch
|
|
191
|
-
// depends on this, and it fails open too.
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function readCurrentSession(root) {
|
|
196
|
-
try {
|
|
197
|
-
const id = fs.readFileSync(path.join(getStateRoot(root), CURRENT_SESSION_FILE), 'utf8').trim();
|
|
198
|
-
return id || null;
|
|
199
|
-
} catch (err) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Bootstrap-time housekeeping: nothing purges stale session directories the
|
|
205
|
-
// way an OS temp dir would, so SessionStart drops ones untouched for a while.
|
|
206
|
-
function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
|
|
207
|
-
const now = Date.now();
|
|
208
|
-
for (const dir of listSessionDirs(root)) {
|
|
209
|
-
try {
|
|
210
|
-
if (now - fs.statSync(dir).mtimeMs > maxAgeMs) {
|
|
211
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
212
|
-
}
|
|
213
|
-
} catch (err) {
|
|
214
|
-
// Ignore - worst case a stale dir lingers until the next prune.
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
module.exports = {
|
|
220
|
-
DEFAULT_SESSION,
|
|
221
|
-
getWorkspaceRoot,
|
|
222
|
-
getStateRoot,
|
|
223
|
-
getSessionDir,
|
|
224
|
-
listSessionDirs,
|
|
225
|
-
writeCurrentSession,
|
|
226
|
-
readCurrentSession,
|
|
227
|
-
pruneStaleSessions,
|
|
228
|
-
};
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
|
|
3
|
+
// counters, handoff/verification timestamps, etc). Lives under the active
|
|
4
|
+
// platform's own harness-everything/ subfolder (see each module's
|
|
5
|
+
// getStateDir() in hooks/scripts/lib/platforms/) - a sibling of that same
|
|
6
|
+
// platform's install manifest, and (for Claude only) its skill copies.
|
|
7
|
+
//
|
|
8
|
+
// For Claude Code that's `<repo root>/.claude/harness-everything/state/`,
|
|
9
|
+
// keyed by session_id under `sessions/<id>/` so two sessions open on the same
|
|
10
|
+
// repo never share (and stomp) each other's edit/verify timestamps or
|
|
11
|
+
// breaker counts. Invocations with no session_id (manual terminal runs,
|
|
12
|
+
// VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
|
|
13
|
+
// rather than a random one, so manual testing stays predictable.
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
|
|
17
|
+
const CURRENT_SESSION_FILE = 'current-session';
|
|
18
|
+
const DEFAULT_SESSION = 'default';
|
|
19
|
+
|
|
20
|
+
function getWorkspaceRoot() {
|
|
21
|
+
let dir = path.resolve(process.cwd());
|
|
22
|
+
while (dir !== path.parse(dir).root) {
|
|
23
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
24
|
+
dir = path.dirname(dir);
|
|
25
|
+
}
|
|
26
|
+
return process.cwd();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function detectActivePlatform(wsRoot) {
|
|
30
|
+
const root = wsRoot || getWorkspaceRoot();
|
|
31
|
+
|
|
32
|
+
// 1. Explicit environment variables - strongest signal. Claude Code sets
|
|
33
|
+
// CLAUDECODE=1 / CLAUDE_CODE_ENTRYPOINT inside its own shell; a bare
|
|
34
|
+
// TERM_PROGRAM=vscode does NOT mean Copilot, because Claude Code's
|
|
35
|
+
// integrated terminal reports vscode too.
|
|
36
|
+
const env = process.env;
|
|
37
|
+
if (env.CLAUDE === '1' || env.CLAUDE || env.CLAUDECODE === '1' ||
|
|
38
|
+
env.CLAUDE_CODE === 'true' || env.CLAUDE_CODE_ENTRYPOINT) return 'claude';
|
|
39
|
+
if (env.CURSOR === '1' || env.CURSOR || env.CURSOR_AGENT) return 'cursor';
|
|
40
|
+
if (env.COPILOT === '1' || env.COPILOT || env.GITHUB_COPILOT_CHAT === 'true') return 'copilot';
|
|
41
|
+
if (env.CONTINUE === '1' || env.CONTINUE) return 'continue';
|
|
42
|
+
|
|
43
|
+
// 2. Workspace configuration presence - which platform's config actually
|
|
44
|
+
// lives here beats inferring from the terminal program.
|
|
45
|
+
if (fs.existsSync(path.join(root, '.claude', 'settings.json'))) return 'claude';
|
|
46
|
+
if (fs.existsSync(path.join(root, '.cursorrules'))) return 'cursor';
|
|
47
|
+
if (fs.existsSync(path.join(root, '.github', 'copilot-instructions.md'))) return 'copilot';
|
|
48
|
+
if (fs.existsSync(path.join(root, '.continue'))) return 'continue';
|
|
49
|
+
if (fs.existsSync(path.join(root, 'AGENTS.md'))) return 'codex';
|
|
50
|
+
if (fs.existsSync(path.join(root, '.hermes.md'))) return 'hermes';
|
|
51
|
+
|
|
52
|
+
// 3. Weak terminal inference, last resort only.
|
|
53
|
+
if (env.TERM_PROGRAM === 'vscode') return 'copilot';
|
|
54
|
+
|
|
55
|
+
return 'claude'; // Default global fallback
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Runtime hooks must NEVER touch .gitignore - that file is install/uninstall
|
|
59
|
+
// territory (scripts/installer.js -> lib/gitignore.js). Rewriting it on every
|
|
60
|
+
// hook invocation caused repeated diffs and surprised users mid-session.
|
|
61
|
+
|
|
62
|
+
function getStateRoot(root) {
|
|
63
|
+
const wsRoot = root || getWorkspaceRoot();
|
|
64
|
+
const activePlatformName = detectActivePlatform(wsRoot);
|
|
65
|
+
const allPlatforms = require('./platforms');
|
|
66
|
+
const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
|
|
67
|
+
|
|
68
|
+
if (activePlatform && typeof activePlatform.getStateDir === 'function') {
|
|
69
|
+
return activePlatform.getStateDir(wsRoot);
|
|
70
|
+
}
|
|
71
|
+
return path.join(wsRoot, '.claude', 'harness-everything', 'state');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function getSessionDir(root, sessionId) {
|
|
75
|
+
const resolvedRoot = root || getWorkspaceRoot();
|
|
76
|
+
const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionId || DEFAULT_SESSION);
|
|
77
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
78
|
+
return dir;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function listSessionDirs(root) {
|
|
82
|
+
const sessionsRoot = path.join(getStateRoot(root), 'sessions');
|
|
83
|
+
try {
|
|
84
|
+
return fs.readdirSync(sessionsRoot, { withFileTypes: true })
|
|
85
|
+
.filter(e => e.isDirectory())
|
|
86
|
+
.map(e => path.join(sessionsRoot, e.name));
|
|
87
|
+
} catch (err) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function writeCurrentSession(root, sessionId) {
|
|
93
|
+
if (!sessionId) return;
|
|
94
|
+
try {
|
|
95
|
+
const wsRoot = root || getWorkspaceRoot();
|
|
96
|
+
const stateRoot = getStateRoot(wsRoot);
|
|
97
|
+
fs.mkdirSync(stateRoot, { recursive: true });
|
|
98
|
+
fs.writeFileSync(path.join(stateRoot, CURRENT_SESSION_FILE), sessionId, 'utf8');
|
|
99
|
+
} catch (err) {
|
|
100
|
+
// Best-effort - only the manual reset-circuit-breaker.js escape hatch
|
|
101
|
+
// depends on this, and it fails open too.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function readCurrentSession(root) {
|
|
106
|
+
try {
|
|
107
|
+
const id = fs.readFileSync(path.join(getStateRoot(root), CURRENT_SESSION_FILE), 'utf8').trim();
|
|
108
|
+
return id || null;
|
|
109
|
+
} catch (err) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Bootstrap-time housekeeping: nothing purges stale session directories the
|
|
115
|
+
// way an OS temp dir would, so SessionStart drops ones untouched for a while.
|
|
116
|
+
function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
for (const dir of listSessionDirs(root)) {
|
|
119
|
+
try {
|
|
120
|
+
if (now - fs.statSync(dir).mtimeMs > maxAgeMs) {
|
|
121
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
} catch (err) {
|
|
124
|
+
// Ignore - worst case a stale dir lingers until the next prune.
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
DEFAULT_SESSION,
|
|
131
|
+
getWorkspaceRoot,
|
|
132
|
+
detectActivePlatform,
|
|
133
|
+
getStateRoot,
|
|
134
|
+
getSessionDir,
|
|
135
|
+
listSessionDirs,
|
|
136
|
+
writeCurrentSession,
|
|
137
|
+
readCurrentSession,
|
|
138
|
+
pruneStaleSessions,
|
|
139
|
+
};
|
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const fs = require('fs');
|
|
3
3
|
|
|
4
|
+
// Removes legacy static-skill subfolders left behind by the pre-0.2.2 bug
|
|
5
|
+
// that installed skills to .claude/harness-everything/skills/ instead of the
|
|
6
|
+
// native .claude/skills/, WITHOUT touching skills/generated/ - self-evolve
|
|
7
|
+
// stores the user's own dynamically-generated skills there (see
|
|
8
|
+
// skill-creator/SKILL.md §4), and a blind recursive rmSync on the whole
|
|
9
|
+
// skills/ folder would silently delete that accumulated learning.
|
|
10
|
+
function cleanupLegacySkillsDir(oldSkillsDir) {
|
|
11
|
+
if (!fs.existsSync(oldSkillsDir)) return;
|
|
12
|
+
try {
|
|
13
|
+
const entries = fs.readdirSync(oldSkillsDir, { withFileTypes: true });
|
|
14
|
+
let removedAny = false;
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.name === 'generated') continue;
|
|
17
|
+
fs.rmSync(path.join(oldSkillsDir, entry.name), { recursive: true, force: true });
|
|
18
|
+
removedAny = true;
|
|
19
|
+
}
|
|
20
|
+
if (fs.readdirSync(oldSkillsDir).length === 0) {
|
|
21
|
+
fs.rmdirSync(oldSkillsDir);
|
|
22
|
+
}
|
|
23
|
+
if (removedAny) {
|
|
24
|
+
console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/ (preserved skills/generated/ - self-evolve's own dynamic skills)`);
|
|
25
|
+
}
|
|
26
|
+
} catch (e) {
|
|
27
|
+
console.warn(` ⚠️ Failed to clean up legacy skills folder: ${e.message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
4
31
|
// Claude Code has native project-skill directory: .claude/skills/.
|
|
5
32
|
// Runtime state converges into .claude/harness-everything/.
|
|
6
33
|
module.exports = {
|
|
@@ -17,16 +44,46 @@ module.exports = {
|
|
|
17
44
|
},
|
|
18
45
|
getIgnorePatterns(workspaceRoot) {
|
|
19
46
|
const patterns = ['.claude/harness-everything/'];
|
|
20
|
-
|
|
21
|
-
|
|
47
|
+
const skillsDir = path.join(workspaceRoot, '.claude', 'skills');
|
|
48
|
+
if (fs.existsSync(skillsDir)) {
|
|
49
|
+
try {
|
|
50
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
if (entry.isDirectory()) {
|
|
53
|
+
const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
54
|
+
if (fs.existsSync(skillMdPath)) {
|
|
55
|
+
const content = fs.readFileSync(skillMdPath, 'utf8');
|
|
56
|
+
const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
|
|
57
|
+
if (authorLine && (authorLine.includes('Miya Daniel'))) {
|
|
58
|
+
patterns.push(`.claude/skills/${entry.name}/`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} catch (e) {
|
|
64
|
+
// Fallback or ignore to prevent breaking execution
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const agentsDir = path.join(workspaceRoot, '.claude', 'agents');
|
|
68
|
+
if (fs.existsSync(agentsDir)) {
|
|
69
|
+
try {
|
|
70
|
+
for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
|
|
71
|
+
if (!entry.isFile() || !/^fable-(?:orchestrator|verifier|worker-haiku|worker-sonnet)\.md$/i.test(entry.name)) continue;
|
|
72
|
+
const content = fs.readFileSync(path.join(agentsDir, entry.name), 'utf8');
|
|
73
|
+
if (/^name:\s*fable-/mi.test(content)) patterns.push(`.claude/agents/${entry.name}`);
|
|
74
|
+
}
|
|
75
|
+
} catch (e) {
|
|
76
|
+
// Fallback or ignore to prevent breaking installation.
|
|
77
|
+
}
|
|
22
78
|
}
|
|
23
79
|
return patterns;
|
|
24
80
|
},
|
|
25
81
|
isMatch(pattern, trimmedLine) {
|
|
82
|
+
if (trimmedLine === '.claude/' || trimmedLine === '.claude') {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
26
85
|
if (pattern === '.claude/harness-everything/') {
|
|
27
|
-
return trimmedLine === '.claude/' ||
|
|
28
|
-
trimmedLine === '.claude' ||
|
|
29
|
-
trimmedLine === '.claude/harness-everything' ||
|
|
86
|
+
return trimmedLine === '.claude/harness-everything' ||
|
|
30
87
|
trimmedLine === '.claude/harness-everything/';
|
|
31
88
|
}
|
|
32
89
|
return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
|
|
@@ -54,6 +111,14 @@ module.exports = {
|
|
|
54
111
|
};
|
|
55
112
|
}
|
|
56
113
|
},
|
|
114
|
+
getAgentsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
|
|
115
|
+
const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(workspaceRoot, '.claude');
|
|
116
|
+
return {
|
|
117
|
+
path: path.join(claudeDir, 'agents'),
|
|
118
|
+
label: isGlobal ? '~/.claude/agents/' : '.claude/agents/',
|
|
119
|
+
manifestPath: manifest.getManifestPath(claudeDir)
|
|
120
|
+
};
|
|
121
|
+
},
|
|
57
122
|
install({ isGlobal, targetWorkspaceRoot, harnessSourceDir, packageVersion, getUserPromptsDir, advisory, claudeHooks, manifest }) {
|
|
58
123
|
const userHome = require('os').homedir();
|
|
59
124
|
const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(targetWorkspaceRoot, '.claude');
|
|
@@ -100,15 +165,7 @@ module.exports = {
|
|
|
100
165
|
console.log(` ✅ Configured Claude Code hooks safely in ${isGlobal ? '~' : ''}/.claude/settings.json`);
|
|
101
166
|
|
|
102
167
|
// DOWNWARD COMPATIBLE CLEANUP: Remove old wrong skill folder .claude/harness-everything/skills if it exists
|
|
103
|
-
|
|
104
|
-
if (fs.existsSync(oldSkillsDir)) {
|
|
105
|
-
try {
|
|
106
|
-
fs.rmSync(oldSkillsDir, { recursive: true, force: true });
|
|
107
|
-
console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/`);
|
|
108
|
-
} catch (e) {
|
|
109
|
-
console.warn(` ⚠️ Failed to remove legacy skills folder: ${e.message}`);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
168
|
+
cleanupLegacySkillsDir(path.join(claudeDir, 'harness-everything', 'skills'));
|
|
112
169
|
},
|
|
113
170
|
uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, advisory, claudeHooks, manifest, cleanEmptyDirs }) {
|
|
114
171
|
if (removeLocal) {
|
|
@@ -116,11 +173,7 @@ module.exports = {
|
|
|
116
173
|
claudeHooks.removeHarnessHooks(localSettingsFile);
|
|
117
174
|
|
|
118
175
|
// Clear old wrong skill folder .claude/harness-everything/skills if any remain
|
|
119
|
-
|
|
120
|
-
if (fs.existsSync(oldSkillsDir)) {
|
|
121
|
-
fs.rmSync(oldSkillsDir, { recursive: true, force: true });
|
|
122
|
-
console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/`);
|
|
123
|
-
}
|
|
176
|
+
cleanupLegacySkillsDir(path.join(workspaceRoot, '.claude', 'harness-everything', 'skills'));
|
|
124
177
|
}
|
|
125
178
|
if (removeGlobal) {
|
|
126
179
|
const globalSettingsFile = path.join(userHome, '.claude', 'settings.json');
|
|
@@ -11,7 +11,7 @@ const fs = require('fs');
|
|
|
11
11
|
// `.codex/harness-everything/`.
|
|
12
12
|
module.exports = {
|
|
13
13
|
name: 'codex',
|
|
14
|
-
label: 'Codex
|
|
14
|
+
label: 'Codex',
|
|
15
15
|
getHarnessDir(workspaceRoot) {
|
|
16
16
|
return path.join(workspaceRoot, '.codex', 'harness-everything');
|
|
17
17
|
},
|
|
@@ -23,16 +23,34 @@ module.exports = {
|
|
|
23
23
|
},
|
|
24
24
|
getIgnorePatterns(workspaceRoot) {
|
|
25
25
|
const patterns = ['.codex/harness-everything/'];
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const skillsDir = path.join(workspaceRoot, '.codex', 'skills');
|
|
27
|
+
if (fs.existsSync(skillsDir)) {
|
|
28
|
+
try {
|
|
29
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
33
|
+
if (fs.existsSync(skillMdPath)) {
|
|
34
|
+
const content = fs.readFileSync(skillMdPath, 'utf8');
|
|
35
|
+
const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
|
|
36
|
+
if (authorLine && (authorLine.includes('Miya Daniel'))) {
|
|
37
|
+
patterns.push(`.codex/skills/${entry.name}/`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
// Fallback or ignore to prevent breaking execution
|
|
44
|
+
}
|
|
28
45
|
}
|
|
29
46
|
return patterns;
|
|
30
47
|
},
|
|
31
48
|
isMatch(pattern, trimmedLine) {
|
|
49
|
+
if (trimmedLine === '.codex/' || trimmedLine === '.codex') {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
32
52
|
if (pattern === '.codex/harness-everything/') {
|
|
33
|
-
return trimmedLine === '.codex/' ||
|
|
34
|
-
trimmedLine === '.codex' ||
|
|
35
|
-
trimmedLine === '.codex/harness-everything' ||
|
|
53
|
+
return trimmedLine === '.codex/harness-everything' ||
|
|
36
54
|
trimmedLine === '.codex/harness-everything/';
|
|
37
55
|
}
|
|
38
56
|
return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
|
|
@@ -18,16 +18,34 @@ module.exports = {
|
|
|
18
18
|
},
|
|
19
19
|
getIgnorePatterns(workspaceRoot) {
|
|
20
20
|
const patterns = ['.continue/harness-everything/'];
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const skillsDir = path.join(workspaceRoot, '.continue', 'skills');
|
|
22
|
+
if (fs.existsSync(skillsDir)) {
|
|
23
|
+
try {
|
|
24
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
28
|
+
if (fs.existsSync(skillMdPath)) {
|
|
29
|
+
const content = fs.readFileSync(skillMdPath, 'utf8');
|
|
30
|
+
const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
|
|
31
|
+
if (authorLine && (authorLine.includes('Miya Daniel'))) {
|
|
32
|
+
patterns.push(`.continue/skills/${entry.name}/`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch (e) {
|
|
38
|
+
// Fallback or ignore to prevent breaking execution
|
|
39
|
+
}
|
|
23
40
|
}
|
|
24
41
|
return patterns;
|
|
25
42
|
},
|
|
26
43
|
isMatch(pattern, trimmedLine) {
|
|
44
|
+
if (trimmedLine === '.continue/' || trimmedLine === '.continue') {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
27
47
|
if (pattern === '.continue/harness-everything/') {
|
|
28
|
-
return trimmedLine === '.continue/' ||
|
|
29
|
-
trimmedLine === '.continue' ||
|
|
30
|
-
trimmedLine === '.continue/harness-everything' ||
|
|
48
|
+
return trimmedLine === '.continue/harness-everything' ||
|
|
31
49
|
trimmedLine === '.continue/harness-everything/';
|
|
32
50
|
}
|
|
33
51
|
return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
|
|
@@ -18,16 +18,34 @@ module.exports = {
|
|
|
18
18
|
},
|
|
19
19
|
getIgnorePatterns(workspaceRoot) {
|
|
20
20
|
const patterns = ['.github/harness-everything/'];
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const skillsDir = path.join(workspaceRoot, '.github', 'skills');
|
|
22
|
+
if (fs.existsSync(skillsDir)) {
|
|
23
|
+
try {
|
|
24
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
28
|
+
if (fs.existsSync(skillMdPath)) {
|
|
29
|
+
const content = fs.readFileSync(skillMdPath, 'utf8');
|
|
30
|
+
const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
|
|
31
|
+
if (authorLine && (authorLine.includes('Miya Daniel'))) {
|
|
32
|
+
patterns.push(`.github/skills/${entry.name}/`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch (e) {
|
|
38
|
+
// Fallback or ignore to prevent breaking execution
|
|
39
|
+
}
|
|
23
40
|
}
|
|
24
41
|
return patterns;
|
|
25
42
|
},
|
|
26
43
|
isMatch(pattern, trimmedLine) {
|
|
44
|
+
if (trimmedLine === '.github/' || trimmedLine === '.github') {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
27
47
|
if (pattern === '.github/harness-everything/') {
|
|
28
|
-
return trimmedLine === '.github/' ||
|
|
29
|
-
trimmedLine === '.github' ||
|
|
30
|
-
trimmedLine === '.github/harness-everything' ||
|
|
48
|
+
return trimmedLine === '.github/harness-everything' ||
|
|
31
49
|
trimmedLine === '.github/harness-everything/';
|
|
32
50
|
}
|
|
33
51
|
return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
|