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,251 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Harness Mechanism Test Suite (Claude Code hook contract)
|
|
4
|
-
* Automates VERIFICATION.md Section 2 (mechanism check) so it runs on every
|
|
5
|
-
* `npm test` instead of only when a human copy-pastes the recipes by hand.
|
|
6
|
-
* That manual gap is exactly what let three independent 2026-07-23 audit
|
|
7
|
-
* reports (see docs/reports/) misdiagnose working hooks as broken: they
|
|
8
|
-
* piped JSON via `echo '...' | node script.js` in a Windows Git Bash shell,
|
|
9
|
-
* which mangles stdin/TTY state and produced false negatives. This suite
|
|
10
|
-
* uses execSync's `input` option instead (the same technique already proven
|
|
11
|
-
* reliable in runner.js and behavioral-test.js) so it is a faithful,
|
|
12
|
-
* cross-platform re-run of the exact payloads VERIFICATION.md documents.
|
|
13
|
-
*
|
|
14
|
-
* Each hook resolves its state directory via detectActivePlatform(), which
|
|
15
|
-
* defaults to 'copilot' under a VS Code integrated terminal (TERM_PROGRAM=
|
|
16
|
-
* vscode) unless CLAUDE is set - so every child process below is spawned
|
|
17
|
-
* with CLAUDE=1 to force the Claude Code state path regardless of the host
|
|
18
|
-
* running this test.
|
|
19
|
-
*
|
|
20
|
-
* All state is written under a dedicated, never-real session id so this
|
|
21
|
-
* suite can never collide with or clobber an actual Claude Code session's
|
|
22
|
-
* breaker/handoff state. The session directory (and any repo-root temp
|
|
23
|
-
* files created along the way) is removed on exit, success or failure alike.
|
|
24
|
-
*/
|
|
25
|
-
const { execSync } = require('child_process');
|
|
26
|
-
const fs = require('fs');
|
|
27
|
-
const path = require('path');
|
|
28
|
-
|
|
29
|
-
process.env.CLAUDE = '1'; // so our own getSessionDir() calls resolve like the children's will
|
|
30
|
-
|
|
31
|
-
const { getWorkspaceRoot, getSessionDir } = require('../hooks/scripts/lib/harness-state');
|
|
32
|
-
|
|
33
|
-
const root = getWorkspaceRoot();
|
|
34
|
-
const hooksDir = path.join(root, 'hooks', 'scripts');
|
|
35
|
-
const SESSION_ID = '__mechanism_test__';
|
|
36
|
-
const sessionDir = getSessionDir(root, SESSION_ID);
|
|
37
|
-
|
|
38
|
-
console.log('=== 🔧 Harness Mechanism Test Suite (VERIFICATION.md §2) ===');
|
|
39
|
-
|
|
40
|
-
const tempFiles = [];
|
|
41
|
-
let failures = 0;
|
|
42
|
-
|
|
43
|
-
function check(name, condition, detail) {
|
|
44
|
-
if (condition) {
|
|
45
|
-
console.log(`✅ ${name}`);
|
|
46
|
-
} else {
|
|
47
|
-
console.error(`❌ ${name}`);
|
|
48
|
-
if (detail) console.error(` ${detail}`);
|
|
49
|
-
failures++;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function runHook(scriptName, payload, extraEnv) {
|
|
54
|
-
const scriptPath = path.join(hooksDir, scriptName);
|
|
55
|
-
try {
|
|
56
|
-
const stdout = execSync(`node "${scriptPath}"`, {
|
|
57
|
-
encoding: 'utf8',
|
|
58
|
-
input: payload === null ? '' : JSON.stringify(payload),
|
|
59
|
-
env: { ...process.env, ...extraEnv },
|
|
60
|
-
});
|
|
61
|
-
return { code: 0, stdout, stderr: '' };
|
|
62
|
-
} catch (err) {
|
|
63
|
-
return { code: err.status, stdout: err.stdout || '', stderr: err.stderr || '' };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function writeState(file, obj) {
|
|
68
|
-
fs.writeFileSync(path.join(sessionDir, file), JSON.stringify(obj, null, 2), 'utf8');
|
|
69
|
-
}
|
|
70
|
-
function readState(file) {
|
|
71
|
-
return JSON.parse(fs.readFileSync(path.join(sessionDir, file), 'utf8'));
|
|
72
|
-
}
|
|
73
|
-
function stateExists(file) {
|
|
74
|
-
return fs.existsSync(path.join(sessionDir, file));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Registers a repo-root temp file for guaranteed cleanup even if an
|
|
78
|
-
// assertion throws or the process is killed mid-suite.
|
|
79
|
-
function tempFile(name) {
|
|
80
|
-
const p = path.join(root, name);
|
|
81
|
-
tempFiles.push(p);
|
|
82
|
-
return p;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
process.on('exit', () => {
|
|
86
|
-
for (const f of tempFiles) {
|
|
87
|
-
try { if (fs.existsSync(f)) fs.unlinkSync(f); } catch (e) { /* best-effort */ }
|
|
88
|
-
}
|
|
89
|
-
try { fs.rmSync(sessionDir, { recursive: true, force: true }); } catch (e) { /* best-effort */ }
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// 2a. Rule of 3 circuit breaker trips, releases via zoom-out report, and
|
|
94
|
-
// hard-locks on a repeat trip of the same signature.
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
console.log('\n[2a] Rule of 3 circuit breaker...');
|
|
97
|
-
|
|
98
|
-
writeState('rule-of-3-state.json', { count: 3, lastHash: 'mech-test', zoomOutResolved: false });
|
|
99
|
-
const tripResult = runHook('rule-of-3.js', { session_id: SESSION_ID });
|
|
100
|
-
check(
|
|
101
|
-
'2a. Trips at count=3 (exit=2, CRITICAL banner)',
|
|
102
|
-
tripResult.code === 2 && tripResult.stderr.includes('RULE OF 3 CIRCUIT BREAKER TRIGGERED'),
|
|
103
|
-
`Got exit=${tripResult.code}, stderr="${tripResult.stderr.slice(0, 200)}"`
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
writeState('rule-of-3-state.json', {
|
|
107
|
-
count: 3, lastHash: 'mech-test', zoomOutResolved: false, lastFailureAt: 0, zoomOutCycles: 0,
|
|
108
|
-
});
|
|
109
|
-
fs.writeFileSync(
|
|
110
|
-
path.join(sessionDir, 'zoom-out-report.md'),
|
|
111
|
-
'## Goal\nx\n## Failed Attempts\nx\n## Verified Facts\nx\n## Diagnosis\nx\n## Decision\nRESUME: new approach\n',
|
|
112
|
-
'utf8'
|
|
113
|
-
);
|
|
114
|
-
const releaseResult = runHook('rule-of-3.js', { session_id: SESSION_ID });
|
|
115
|
-
const releasedState = readState('rule-of-3-state.json');
|
|
116
|
-
check(
|
|
117
|
-
'2a-bis. Valid zoom-out report releases the breaker (exit=0, count reset)',
|
|
118
|
-
releaseResult.code === 0 &&
|
|
119
|
-
releaseResult.stdout.includes('breaker released') &&
|
|
120
|
-
releasedState.count === 0 &&
|
|
121
|
-
releasedState.zoomOutResolved === true &&
|
|
122
|
-
releasedState.zoomOutCycles === 1,
|
|
123
|
-
`Got exit=${releaseResult.code}, state=${JSON.stringify(releasedState)}`
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
writeState('rule-of-3-state.json', {
|
|
127
|
-
count: 3, lastHash: 'mech-test', zoomOutResolved: false,
|
|
128
|
-
lastFailureAt: Date.now() + 60000, zoomOutCycles: 1,
|
|
129
|
-
});
|
|
130
|
-
const hardLockResult = runHook('rule-of-3.js', { session_id: SESSION_ID });
|
|
131
|
-
check(
|
|
132
|
-
'2a-ter. Second trip on same signature hard-locks (exit=2, repeat trip)',
|
|
133
|
-
hardLockResult.code === 2 && hardLockResult.stderr.includes('repeat trip - hard lock'),
|
|
134
|
-
`Got exit=${hardLockResult.code}, stderr="${hardLockResult.stderr.slice(0, 200)}"`
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
|
-
// 2b. Boundary guard blocks an oversized Read
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
console.log('\n[2b] Boundary guard...');
|
|
141
|
-
|
|
142
|
-
const bigFile = tempFile('.mechanism-test-big.tmp');
|
|
143
|
-
fs.writeFileSync(bigFile, 'x'.repeat(600 * 1024));
|
|
144
|
-
const boundaryResult = runHook('boundary-guard.js', { tool_name: 'Read', tool_input: { file_path: bigFile } });
|
|
145
|
-
check(
|
|
146
|
-
'2b. Blocks a 600KB Read without limit/offset (exit=2, BLOCKED)',
|
|
147
|
-
boundaryResult.code === 2 && boundaryResult.stderr.includes('[Boundary Guard] BLOCKED'),
|
|
148
|
-
`Got exit=${boundaryResult.code}, stderr="${boundaryResult.stderr.slice(0, 200)}"`
|
|
149
|
-
);
|
|
150
|
-
fs.unlinkSync(bigFile);
|
|
151
|
-
|
|
152
|
-
// ---------------------------------------------------------------------------
|
|
153
|
-
// 2c. State persistence (WAL) records a failure, then clears it on success
|
|
154
|
-
// ---------------------------------------------------------------------------
|
|
155
|
-
console.log('\n[2c] State persistence (WAL)...');
|
|
156
|
-
|
|
157
|
-
runHook('state-persist.js', {
|
|
158
|
-
session_id: SESSION_ID,
|
|
159
|
-
tool_name: 'Bash',
|
|
160
|
-
tool_response: { stdout: '', stderr: 'npm ERR! mech-test failure' },
|
|
161
|
-
});
|
|
162
|
-
const failedHandoff = readState('handoff-state.json');
|
|
163
|
-
check(
|
|
164
|
-
'2c. Failing Bash call is recorded as status=failed',
|
|
165
|
-
failedHandoff.status === 'failed' && failedHandoff.errorSummary.includes('mech-test failure'),
|
|
166
|
-
`Got ${JSON.stringify(failedHandoff)}`
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
runHook('state-persist.js', {
|
|
170
|
-
session_id: SESSION_ID,
|
|
171
|
-
tool_name: 'Bash',
|
|
172
|
-
tool_response: { stdout: 'ok', exitCode: 0 },
|
|
173
|
-
});
|
|
174
|
-
const resolvedHandoff = readState('handoff-state.json');
|
|
175
|
-
check(
|
|
176
|
-
'2c. A subsequent successful command clears status back to idle',
|
|
177
|
-
resolvedHandoff.status === 'idle' && !!resolvedHandoff.lastResolved,
|
|
178
|
-
`Got ${JSON.stringify(resolvedHandoff)}`
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
// ---------------------------------------------------------------------------
|
|
182
|
-
// 2d. Fact-audit reminder reaches the agent via tier-router.js stdin
|
|
183
|
-
// ---------------------------------------------------------------------------
|
|
184
|
-
console.log('\n[2d] Fact-audit reminder...');
|
|
185
|
-
|
|
186
|
-
const tierRouterPath = path.join(root, 'harness-everything', 'scripts', 'tier-router.js');
|
|
187
|
-
const factAuditOut = execSync(`node "${tierRouterPath}"`, {
|
|
188
|
-
encoding: 'utf8',
|
|
189
|
-
input: JSON.stringify({ prompt: 'what exit code does this hook use by default and is it documented' }),
|
|
190
|
-
});
|
|
191
|
-
check(
|
|
192
|
-
'2d. tier-router.js reads {"prompt":...} from stdin and emits FACT-AUDIT REMINDER',
|
|
193
|
-
factAuditOut.includes('FACT-AUDIT REMINDER'),
|
|
194
|
-
`Output was:\n${factAuditOut.slice(0, 300)}`
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
// 2e. Subagent scope guard catches an out-of-scope file change
|
|
199
|
-
// ---------------------------------------------------------------------------
|
|
200
|
-
console.log('\n[2e] Subagent scope guard...');
|
|
201
|
-
|
|
202
|
-
runHook('subagent-scope-guard.js', {
|
|
203
|
-
session_id: SESSION_ID, tool_name: 'Task', hook_event_name: 'PreToolUse', tool_input: {},
|
|
204
|
-
});
|
|
205
|
-
const scopeFile = tempFile('.mechanism-test-scope.tmp');
|
|
206
|
-
fs.writeFileSync(scopeFile, 'unexpected change');
|
|
207
|
-
const scopeResult = runHook('subagent-scope-guard.js', {
|
|
208
|
-
session_id: SESSION_ID, tool_name: 'Task', hook_event_name: 'PostToolUse', tool_input: {},
|
|
209
|
-
});
|
|
210
|
-
check(
|
|
211
|
-
'2e. Flags the newly-created file after a Task burst (exit=2, lists filename)',
|
|
212
|
-
scopeResult.code === 2 &&
|
|
213
|
-
scopeResult.stderr.includes('Subagent Scope Guard') &&
|
|
214
|
-
scopeResult.stderr.includes(path.basename(scopeFile)),
|
|
215
|
-
`Got exit=${scopeResult.code}, stderr="${scopeResult.stderr.slice(0, 300)}"`
|
|
216
|
-
);
|
|
217
|
-
fs.unlinkSync(scopeFile);
|
|
218
|
-
|
|
219
|
-
// ---------------------------------------------------------------------------
|
|
220
|
-
// 2f. Stop gate bounces an unverified-edit stop exactly once
|
|
221
|
-
// ---------------------------------------------------------------------------
|
|
222
|
-
console.log('\n[2f] Stop gate...');
|
|
223
|
-
|
|
224
|
-
writeState('handoff-state.json', { status: 'idle', lastEditAt: Date.now(), lastVerifyAt: 0 });
|
|
225
|
-
const dirtyFile = tempFile('.mechanism-test-dirty.tmp');
|
|
226
|
-
fs.writeFileSync(dirtyFile, 'dirty');
|
|
227
|
-
const firstStop = runHook('stop-gate.js', { session_id: SESSION_ID });
|
|
228
|
-
check(
|
|
229
|
-
'2f. First stop after an unverified edit bounces (exit=2)',
|
|
230
|
-
firstStop.code === 2 && firstStop.stderr.includes('[Stop Gate]'),
|
|
231
|
-
`Got exit=${firstStop.code}, stderr="${firstStop.stderr.slice(0, 200)}"`
|
|
232
|
-
);
|
|
233
|
-
const secondStop = runHook('stop-gate.js', { session_id: SESSION_ID });
|
|
234
|
-
check(
|
|
235
|
-
'2f. Same edit batch does not bounce twice (exit=0)',
|
|
236
|
-
secondStop.code === 0,
|
|
237
|
-
`Got exit=${secondStop.code}`
|
|
238
|
-
);
|
|
239
|
-
fs.unlinkSync(dirtyFile);
|
|
240
|
-
|
|
241
|
-
// ---------------------------------------------------------------------------
|
|
242
|
-
console.log('\n=================================================');
|
|
243
|
-
if (failures > 0) {
|
|
244
|
-
console.error(` ❌ ${failures} mechanism check(s) FAILED.`);
|
|
245
|
-
console.log('=================================================');
|
|
246
|
-
process.exit(1);
|
|
247
|
-
} else {
|
|
248
|
-
console.log(' 🎉 All VERIFICATION.md §2 mechanism checks passed.');
|
|
249
|
-
console.log('=================================================');
|
|
250
|
-
process.exit(0);
|
|
251
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Harness Todo CLI
|
|
4
|
-
* A strict state machine for task management.
|
|
5
|
-
* Designed to slap the LLM with Exit Code 1 if it violates the Todo-Driven Workflow.
|
|
6
|
-
*/
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const { getWorkspaceRoot, getStateRoot } = require('../../hooks/scripts/lib/harness-state');
|
|
10
|
-
|
|
11
|
-
// Shared across sessions (not scoped to one): todo-cli.js is invoked as a
|
|
12
|
-
// plain CLI command by the agent, not a hook, so it never receives a
|
|
13
|
-
// session_id to scope by.
|
|
14
|
-
const harnessDir = getStateRoot(getWorkspaceRoot());
|
|
15
|
-
const stateFile = path.join(harnessDir, 'todo-state.json');
|
|
16
|
-
|
|
17
|
-
if (!fs.existsSync(harnessDir)) {
|
|
18
|
-
fs.mkdirSync(harnessDir, { recursive: true });
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function loadState() {
|
|
22
|
-
if (fs.existsSync(stateFile)) {
|
|
23
|
-
return JSON.parse(fs.readFileSync(stateFile, 'utf8'));
|
|
24
|
-
}
|
|
25
|
-
return { tasks: [], activeId: null };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function saveState(state) {
|
|
29
|
-
// Atomic write (temp file + rename): todo-state.json is shared across the
|
|
30
|
-
// whole workspace, not scoped per session_id like the hook state files
|
|
31
|
-
// are, so parallel subagent Task bursts can genuinely call `todo-cli.js`
|
|
32
|
-
// around the same time. A plain writeFileSync lets a reader observe a
|
|
33
|
-
// truncated/partial JSON file if two writes interleave; rename is atomic
|
|
34
|
-
// at the filesystem level, so readers only ever see the old or the new
|
|
35
|
-
// file in full, never a half-written one. This doesn't resolve the
|
|
36
|
-
// separate lost-update race (last writer still wins) - that needs real
|
|
37
|
-
// cross-process locking, out of scope for what a CLI state file needs.
|
|
38
|
-
const tmpFile = `${stateFile}.tmp.${process.pid}`;
|
|
39
|
-
fs.writeFileSync(tmpFile, JSON.stringify(state, null, 2));
|
|
40
|
-
fs.renameSync(tmpFile, stateFile);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function printList(state) {
|
|
44
|
-
console.log('\n📋 Current Todo List:');
|
|
45
|
-
if (state.tasks.length === 0) {
|
|
46
|
-
console.log(' (Empty)');
|
|
47
|
-
}
|
|
48
|
-
state.tasks.forEach(t => {
|
|
49
|
-
const status = t.id === state.activeId ? '[IN-PROGRESS]' : (t.completed ? '[COMPLETED]' : '[NOT-STARTED]');
|
|
50
|
-
console.log(` ${t.id}. ${status} ${t.title}`);
|
|
51
|
-
});
|
|
52
|
-
console.log('');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const args = process.argv.slice(2);
|
|
56
|
-
const command = args[0];
|
|
57
|
-
|
|
58
|
-
if (!command) {
|
|
59
|
-
console.error("❌ Error: Missing command. Use 'init', 'add', 'start', 'complete', or 'status'.");
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const state = loadState();
|
|
64
|
-
|
|
65
|
-
switch (command) {
|
|
66
|
-
case 'init':
|
|
67
|
-
state.tasks = [];
|
|
68
|
-
state.activeId = null;
|
|
69
|
-
args.slice(1).forEach((title, idx) => {
|
|
70
|
-
state.tasks.push({ id: idx + 1, title, completed: false });
|
|
71
|
-
});
|
|
72
|
-
saveState(state);
|
|
73
|
-
console.log("✅ Todo list initialized.");
|
|
74
|
-
printList(state);
|
|
75
|
-
break;
|
|
76
|
-
|
|
77
|
-
case 'add':
|
|
78
|
-
const title = args.slice(1).join(' ');
|
|
79
|
-
if (!title) {
|
|
80
|
-
console.error("❌ Error: Missing task title.");
|
|
81
|
-
process.exit(1);
|
|
82
|
-
}
|
|
83
|
-
const nextId = state.tasks.length > 0 ? Math.max(...state.tasks.map(t => t.id)) + 1 : 1;
|
|
84
|
-
state.tasks.push({ id: nextId, title, completed: false });
|
|
85
|
-
saveState(state);
|
|
86
|
-
console.log(`✅ Added task ${nextId}.`);
|
|
87
|
-
printList(state);
|
|
88
|
-
break;
|
|
89
|
-
|
|
90
|
-
case 'start':
|
|
91
|
-
const startId = parseInt(args[1], 10);
|
|
92
|
-
if (!startId) {
|
|
93
|
-
console.error("❌ Error: Missing task ID. Usage: start <id>");
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
if (state.activeId !== null && state.activeId !== startId) {
|
|
97
|
-
console.error(`❌ [BLOCKED] Task ${state.activeId} is already IN-PROGRESS.`);
|
|
98
|
-
console.error(`You MUST complete or un-start task ${state.activeId} before starting a new one. No multitasking.`);
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
const taskToStart = state.tasks.find(t => t.id === startId);
|
|
102
|
-
if (!taskToStart) {
|
|
103
|
-
console.error(`❌ Error: Task ${startId} not found.`);
|
|
104
|
-
process.exit(1);
|
|
105
|
-
}
|
|
106
|
-
if (taskToStart.completed) {
|
|
107
|
-
console.error(`❌ Error: Task ${startId} is already completed.`);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
state.activeId = startId;
|
|
111
|
-
saveState(state);
|
|
112
|
-
console.log(`🚀 Started task ${startId}: ${taskToStart.title}`);
|
|
113
|
-
break;
|
|
114
|
-
|
|
115
|
-
case 'complete':
|
|
116
|
-
const compId = parseInt(args[1], 10);
|
|
117
|
-
if (!compId) {
|
|
118
|
-
console.error("❌ Error: Missing task ID. Usage: complete <id>");
|
|
119
|
-
process.exit(1);
|
|
120
|
-
}
|
|
121
|
-
if (state.activeId !== compId) {
|
|
122
|
-
console.error(`❌ [BLOCKED] Task ${compId} is NOT currently in-progress.`);
|
|
123
|
-
console.error(`You can only complete the active task. Active task is: ${state.activeId || 'None'}`);
|
|
124
|
-
process.exit(1);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// ACTIONABLE RECOMMENDATION #1: Enforce State Transitions Programmatically
|
|
128
|
-
// Do not rely on prompt obedience for running verify-gate.js. The CLI should block the complete command
|
|
129
|
-
console.log("=== 🛡️ Executing Pre-Completion Verification Gate ===");
|
|
130
|
-
try {
|
|
131
|
-
const verifyScript = path.join(__dirname, 'verify-gate.js');
|
|
132
|
-
if (fs.existsSync(verifyScript)) {
|
|
133
|
-
require('child_process').execSync(`node "${verifyScript}"`, { stdio: 'inherit' });
|
|
134
|
-
}
|
|
135
|
-
} catch (err) {
|
|
136
|
-
console.error(`\n❌ [BLOCKED] Verification Gate Failed (Exit Code 1).`);
|
|
137
|
-
console.error(`You CANNOT complete this task. The code is broken.`);
|
|
138
|
-
console.error(`Please fix the errors shown above and try again.`);
|
|
139
|
-
process.exit(1);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const taskToComp = state.tasks.find(t => t.id === compId);
|
|
143
|
-
taskToComp.completed = true;
|
|
144
|
-
state.activeId = null;
|
|
145
|
-
saveState(state);
|
|
146
|
-
console.log(`✅ Completed task ${compId}: ${taskToComp.title}`);
|
|
147
|
-
printList(state);
|
|
148
|
-
break;
|
|
149
|
-
|
|
150
|
-
case 'status':
|
|
151
|
-
printList(state);
|
|
152
|
-
break;
|
|
153
|
-
|
|
154
|
-
default:
|
|
155
|
-
console.error(`❌ Error: Unknown command '${command}'.`);
|
|
156
|
-
process.exit(1);
|
|
157
|
-
}
|
package/skill-style/STYLE.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# SKILL Document Writing Guidelines
|
|
2
|
-
|
|
3
|
-
> Target: Markdown files read and executed as Prompts during SKILL execution (excludes Template files).
|
|
4
|
-
|
|
5
|
-
## [Language & Syntax]
|
|
6
|
-
1. All content MUST be in English (All English).
|
|
7
|
-
2. MUST exclusively use task-based syntax (Imperative verbs, numbered lists).
|
|
8
|
-
3. Vague tone is strictly forbidden. MUST use uppercase `MUST` or `MUST NOT` to define behaviors. Words like `should` or `may` are forbidden.
|
|
9
|
-
4. The length of each rule MUST NOT exceed 150 characters.
|
|
10
|
-
|
|
11
|
-
## [Skill Architecture: OS vs Domain]
|
|
12
|
-
5. **OS Skills (Process Control)**: e.g., `install-cognitive-os`, `harness-everything`. These dictate *how* to work. They MUST be strictly linear and MUST NOT exceed 60 lines per file.
|
|
13
|
-
6. **Domain Skills (Expertise)**: e.g., `api-design`, `security-review`. These provide *what* to write. They are EXEMPT from the 60-line and linearity limits. They are encouraged to be comprehensive, containing rich anti-patterns, code examples, and deep domain guardrails.
|
|
14
|
-
|
|
15
|
-
## [Flow & Linearity (Applies to OS Skills)]
|
|
16
|
-
7. The SKILL entry point (SKILL.md) MUST be executed only once.
|
|
17
|
-
8. The flow from OS SKILL.md to the end MUST be a flattened straight line. Infinite loops or branching trees are forbidden.
|
|
18
|
-
9. All OS files MUST form a logical closed loop. If split, the current file MUST end with a unique pointer to maintain linearity.
|
|
19
|
-
|
|
20
|
-
## [Cognitive Loop & Execution]
|
|
21
|
-
9. Steps MUST be written sequentially. Every SKILL file MUST explicitly include this declaration:
|
|
22
|
-
```markdown
|
|
23
|
-
## Core Principles
|
|
24
|
-
- MUST operate using the cognitive loop: Think > Try > Summarize > Record.
|
|
25
|
-
- [Think] MUST build a holistic mental router map before starting. Use elimination to discard impossible approaches. Perform forward prediction to simplify actions.
|
|
26
|
-
- [Try] MUST verify current environment boundaries BEFORE taking action. Execute steps sequentially and NEVER combine commands, ensuring errors remain isolated and traceable.
|
|
27
|
-
- [Summarize] MUST verify actual outcomes against initial intent; hallucinating success is forbidden. If an attempt fails, diagnose, zoom out, and backtrack.
|
|
28
|
-
- [Record] MUST explicitly state variables and context to carry over.
|
|
29
|
-
- [Reflect & Re-Think] MUST actively feed the `[Record]` (especially past failures and state changes) back into the next `[Think]` cycle. Use historical context to refine forward predictions and strictly avoid repeating previously diagnosed errors.
|
|
30
|
-
|
|
31
|
-
## Cognitive Foundation (Why we do this)
|
|
32
|
-
- Recording is not the end; it is the absolute prerequisite for the next Think cycle.
|
|
33
|
-
- Trying validates the predicted steps.
|
|
34
|
-
- Summarizing confirms if the outcome aligns with the initial intent.
|
|
35
|
-
- The loop is continuous. Converging the chain of thought is the absolute priority; divergent thinking causes attention loss. This cycle (Think > Try > Summarize > Record > Re-Think) drives self-adaptation and evolution.
|
|
36
|
-
- Treat these rules as strict guardrails. Autonomous optimization within these boundaries is expected.
|
|
37
|
-
```
|