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,219 +1,334 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const { execSync } = require('child_process');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
if (
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { execSync } = require('child_process');
|
|
3
|
+
|
|
4
|
+
// Keyword/guide tables live in the sibling routing-keywords.json, not inline
|
|
5
|
+
// here, so the Human Partner (or the LLM itself) can retune routing by
|
|
6
|
+
// editing data - no code changes, no re-install. It travels with this script
|
|
7
|
+
// on every install/update since it lives in the same skill folder. Fail open
|
|
8
|
+
// (empty tables) if it's missing or hand-edited into invalid JSON, so a bad
|
|
9
|
+
// edit degrades routing instead of breaking the hook.
|
|
10
|
+
function loadRoutingConfig() {
|
|
11
|
+
const fallback = { tiers: { tier3: [], tier2: [] }, guideGroups: [], factAudit: { externalClaim: [], estimate: [] } };
|
|
12
|
+
try {
|
|
13
|
+
const raw = require('fs').readFileSync(require('path').join(__dirname, 'routing-keywords.json'), 'utf8');
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
return {
|
|
16
|
+
tiers: parsed.tiers || fallback.tiers,
|
|
17
|
+
guideGroups: Array.isArray(parsed.guideGroups) ? parsed.guideGroups : fallback.guideGroups,
|
|
18
|
+
factAudit: parsed.factAudit || fallback.factAudit
|
|
19
|
+
};
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.log(`[Tier Routing Pre-check] routing-keywords.json missing/invalid - falling back to Tier 1 default, no guides. (${err.message})`);
|
|
22
|
+
return fallback;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function run(userPrompt) {
|
|
27
|
+
console.log(`[Tier Routing Pre-check]`);
|
|
28
|
+
|
|
29
|
+
const promptLower = userPrompt.toLowerCase();
|
|
30
|
+
const routingConfig = loadRoutingConfig();
|
|
31
|
+
|
|
32
|
+
// Basic keyword heuristic (bilingual - the Human Partner often prompts in
|
|
33
|
+
// Chinese, and an English-only net silently degrades to Tier 1 for them).
|
|
34
|
+
// Deliberately NOT driven by the diff stats above: those measure what is
|
|
35
|
+
// already sitting uncommitted in the tree - usually the PREVIOUS task's
|
|
36
|
+
// leftovers - not the complexity of the task being asked for now.
|
|
37
|
+
const TIER3_KEYWORDS = routingConfig.tiers.tier3 || [];
|
|
38
|
+
const TIER2_KEYWORDS = routingConfig.tiers.tier2 || [];
|
|
39
|
+
|
|
40
|
+
function matchKeyword(prompt, keyword) {
|
|
41
|
+
const k = keyword.toLowerCase().trim();
|
|
42
|
+
if (!k) return false;
|
|
43
|
+
const isChineseOrMultiword = /[\u4e00-\u9fa5]/.test(k) || k.includes(' ') || k.includes('-');
|
|
44
|
+
if (isChineseOrMultiword) {
|
|
45
|
+
return prompt.includes(k);
|
|
46
|
+
}
|
|
47
|
+
const escaped = k.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
48
|
+
return new RegExp(`\\b${escaped}\\b`, 'i').test(prompt);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function detectFableModel(prompt) {
|
|
52
|
+
const match = prompt.match(/\bfable(?:[- ]mode)?\s+(?:on|with)\s+(haiku|sonnet|sonnect|opus)\b|\bfable-(haiku|sonnet|opus)\b/i);
|
|
53
|
+
if (!match) return null;
|
|
54
|
+
const requested = (match[1] || match[2]).toLowerCase();
|
|
55
|
+
return requested === 'sonnect' ? 'sonnet' : requested;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let recommendedTier = "Tier 1 (Trivial)";
|
|
59
|
+
let rationale = "No structural/testing signals in the prompt.";
|
|
60
|
+
|
|
61
|
+
// Task-shape signals catch one-sentence audits and benchmarks that a flat
|
|
62
|
+
// keyword list cannot see. They are intentionally kept here, rather than
|
|
63
|
+
// mixed into the editable technology keyword table.
|
|
64
|
+
const macroSignals = [
|
|
65
|
+
/\b(?:every|each|all|entire|whole|full|complete)\s+(?:skill|skills|repo|repository|codebase|project|file|files|module|modules)/i,
|
|
66
|
+
/\b(?:evaluate|audit|benchmark|stress[- ]test|ab test|a\/b test|compare)\b/i,
|
|
67
|
+
/\b(?:repository[- ]wide|codebase[- ]wide|end[- ]to[- ]end)\b/i,
|
|
68
|
+
/\b(?:multiple|several|four|fourteen|dozens)\s+(?:issues|skills|files|modules)/i,
|
|
69
|
+
/(?:æ¯å|æ¯ä¸å|ææ|å
¨é¨|æ´å|å
¨åĨ|éä¸|å¤å|åå).*(?:skill|æčŊ|æĒæĄ|åéĄ|įæŦ|åēæē|æ¸ŦčŠĻ|čŠäŧ°|į¨Ŋæ ¸|æ¯čŧ|åŖå)/i,
|
|
70
|
+
/(?:čŠäŧ°|į¨Ŋæ ¸|åēæē|åŖåæ¸ŦčŠĻ|æ¯čŧ).*(?:æ¯å|ææ|å
¨é¨|æ´å|å
¨åĨ|æčŊ|skill|æĒæĄ|įæŦ)/i
|
|
71
|
+
];
|
|
72
|
+
const hasMacroSignal = macroSignals.some(signal => signal.test(userPrompt));
|
|
73
|
+
const isTrivialDocsEdit = /^(?:(?:please|help me)\s+)?(?:fix|update|correct|change)\b.*\b(?:readme|documentation|docs?)\b.*\b(?:typo|spelling|wording|one line|single line)\b/i.test(userPrompt.trim());
|
|
74
|
+
|
|
75
|
+
if (isTrivialDocsEdit) {
|
|
76
|
+
// "update" is a common Tier 2 verb, but a one-line documentation typo
|
|
77
|
+
// is still Tier 1. This override prevents a broad keyword from winning.
|
|
78
|
+
recommendedTier = "Tier 1 (Trivial)";
|
|
79
|
+
rationale = "Single documentation typo detected - direct edit, no checklist required.";
|
|
80
|
+
} else if (hasMacroSignal || TIER3_KEYWORDS.some(k => matchKeyword(promptLower, k))) {
|
|
81
|
+
recommendedTier = "Tier 3 (Macro Task)";
|
|
82
|
+
rationale = "Prompt implies repository-wide scope, audit/benchmark work, architectural refactoring, or multi-agent collaboration.";
|
|
83
|
+
} else if (TIER2_KEYWORDS.some(k => matchKeyword(promptLower, k))) {
|
|
84
|
+
recommendedTier = "Tier 2 (Standard Task)";
|
|
85
|
+
rationale = "Prompt implies development work needing TDD validation or multi-file coordination.";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Structural complexity signals (not just keywords)
|
|
89
|
+
// These help differentiate between simple and complex tasks within the same keyword tier
|
|
90
|
+
const sentenceCount = userPrompt.split(/[.!?ãīŧīŧ]+/).filter(s => s.trim()).length;
|
|
91
|
+
const hasMultipleTasks = /\b(and|also|then|additionally|plus|čä¸|éæ|įļåž|åĻå¤|äģĨå)\b/i.test(userPrompt);
|
|
92
|
+
const mentionsSpecificFile = /\b(file|script|module|class|function|component)\b.*\.\w+/i.test(userPrompt);
|
|
93
|
+
const hasQuestionMarks = /\?|īŧ/.test(userPrompt);
|
|
94
|
+
const hasMultipleSentences = sentenceCount > 2;
|
|
95
|
+
|
|
96
|
+
// Adjust tier based on structural signals
|
|
97
|
+
if (!hasMacroSignal && !isTrivialDocsEdit && hasMultipleTasks && hasMultipleSentences) {
|
|
98
|
+
// Multiple tasks with multiple sentences suggests complexity
|
|
99
|
+
if (recommendedTier.startsWith("Tier 1")) {
|
|
100
|
+
recommendedTier = "Tier 2 (Standard Task)";
|
|
101
|
+
rationale = "Multiple tasks detected with structural complexity - upgraded to Tier 2 for TDD validation.";
|
|
102
|
+
} else if (recommendedTier.startsWith("Tier 2")) {
|
|
103
|
+
// Keep at Tier 2 but note the complexity
|
|
104
|
+
rationale += " Multiple task structure detected.";
|
|
105
|
+
}
|
|
106
|
+
} else if (!hasMacroSignal && mentionsSpecificFile && !hasMultipleTasks) {
|
|
107
|
+
// Single file mention with no multiple tasks suggests simpler work
|
|
108
|
+
if (recommendedTier.startsWith("Tier 3")) {
|
|
109
|
+
recommendedTier = "Tier 2 (Standard Task)";
|
|
110
|
+
rationale = "Single file focus detected - downgraded from Tier 3 to Tier 2.";
|
|
111
|
+
}
|
|
112
|
+
} else if (!hasMacroSignal && hasQuestionMarks && !hasMultipleTasks) {
|
|
113
|
+
// Questions without multiple tasks are often advisory, not execution
|
|
114
|
+
if (recommendedTier.startsWith("Tier 3")) {
|
|
115
|
+
recommendedTier = "Tier 2 (Standard Task)";
|
|
116
|
+
rationale = "Question format detected - likely advisory rather than macro execution.";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
console.log(`\n=> RECOMMENDED TIER: ${recommendedTier}`);
|
|
121
|
+
console.log(`=> RATIONALE: ${rationale}`);
|
|
122
|
+
|
|
123
|
+
// Base execution loop: Tier 2/3 must run on the todo-driven-workflow
|
|
124
|
+
// checklist (Tier 1 is exempt to avoid checklist bloat on trivial edits).
|
|
125
|
+
if (!recommendedTier.startsWith("Tier 1")) {
|
|
126
|
+
console.log(`\n=> BASE EXECUTION LOOP: Load 'todo-driven-workflow' and initialize its checklist (3-7 verifiable sub-tasks) BEFORE editing any file.`);
|
|
127
|
+
console.log(` Track exactly ONE item in-progress at a time; verify with real evidence before marking completed.`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const requestedFableModel = detectFableModel(promptLower);
|
|
131
|
+
if (requestedFableModel) {
|
|
132
|
+
console.log(`\n=> REQUESTED FABLE MODEL MODE: ${requestedFableModel}`);
|
|
133
|
+
console.log(`=> ROUTE: fable-mode/fable-${requestedFableModel}/SKILL.md`);
|
|
134
|
+
console.log(` Resolve availability and record fallback status with fable-mode/scripts/model-selector.js.`);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Analyze and output relevant Knowledge Guides / Templates based on user prompt keywords.
|
|
138
|
+
// Each group comes from routing-keywords.json - matches via plain-substring
|
|
139
|
+
// 'keywords' OR a 'regex' source string (tested case-insensitively).
|
|
140
|
+
const recommendedGuides = [];
|
|
141
|
+
|
|
142
|
+
for (const group of routingConfig.guideGroups) {
|
|
143
|
+
let matched = false;
|
|
144
|
+
if (typeof group.regex === "string") {
|
|
145
|
+
matched = new RegExp(group.regex, "i").test(promptLower);
|
|
146
|
+
} else if (Array.isArray(group.keywords)) {
|
|
147
|
+
matched = group.keywords.some(k => promptLower.includes(k));
|
|
148
|
+
}
|
|
149
|
+
if (matched && Array.isArray(group.guides)) {
|
|
150
|
+
recommendedGuides.push(...group.guides);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (recommendedGuides.length > 0) {
|
|
155
|
+
console.log(`\n=> RECOMMENDED KNOWLEDGE GUIDES (Auto-loaded based on keywords):`);
|
|
156
|
+
recommendedGuides.forEach(guide => {
|
|
157
|
+
const match = guide.match(/^- ([^\s]+)/);
|
|
158
|
+
if (match) {
|
|
159
|
+
const guidePath = require('path').join(__dirname, '..', '..', match[1]);
|
|
160
|
+
if (!require('fs').existsSync(guidePath)) {
|
|
161
|
+
console.log(`${guide} [NOT INSTALLED - Ignore this recommendation]`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
console.log(guide);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ---------------------------------------------------------
|
|
170
|
+
// SELF-EVOLVED DYNAMIC SKILLS AUTO-DISCOVERY & PRECISE MATCHING
|
|
171
|
+
//
|
|
172
|
+
// Deliberately generated[] only, not find-skills' downloaded skills:
|
|
173
|
+
// generated[] is safe to cache-and-match here because Harness owns its
|
|
174
|
+
// whole lifecycle (self-evolve authors it, skill-creator quality-gates it,
|
|
175
|
+
// status is tracked draft/active/deprecated). A skill fetched via
|
|
176
|
+
// `npx skills add` has none of that - caching its triggers/description at
|
|
177
|
+
// download time would silently go stale the moment the upstream skill (or
|
|
178
|
+
// a later `npx skills update`/`remove`) changes it. find-skills queries
|
|
179
|
+
// `npx skills list` live instead of being folded into this cache.
|
|
180
|
+
// ---------------------------------------------------------
|
|
181
|
+
try {
|
|
182
|
+
const fs = require('fs');
|
|
183
|
+
const path = require('path');
|
|
184
|
+
const userHome = process.env.HOME || process.env.USERPROFILE || '';
|
|
185
|
+
|
|
186
|
+
// Skill installs land at varying depth per platform/scope (e.g.
|
|
187
|
+
// <root>/.claude/skills/harness-everything/scripts/, <root>/.cursor/skills/...,
|
|
188
|
+
// ~/.claude/skills/...), so a fixed __dirname offset can't reach the real
|
|
189
|
+
// workspace root. Walk up from the invoking cwd to the nearest .git instead
|
|
190
|
+
// - the same approach register-dynamic-skill.js already uses.
|
|
191
|
+
function getWorkspaceRoot() {
|
|
192
|
+
let dir = path.resolve(process.cwd());
|
|
193
|
+
while (dir !== path.parse(dir).root) {
|
|
194
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
195
|
+
dir = path.dirname(dir);
|
|
196
|
+
}
|
|
197
|
+
return process.cwd();
|
|
198
|
+
}
|
|
199
|
+
const workspaceRoot = getWorkspaceRoot();
|
|
200
|
+
|
|
201
|
+
const manifestPaths = [
|
|
202
|
+
path.join(workspaceRoot, '.claude', 'harness-everything', 'manifest.json'),
|
|
203
|
+
path.join(workspaceRoot, '.cursor', 'harness-everything', 'manifest.json'),
|
|
204
|
+
path.join(workspaceRoot, '.github', 'harness-everything', 'manifest.json'),
|
|
205
|
+
path.join(workspaceRoot, '.codex', 'harness-everything', 'manifest.json'),
|
|
206
|
+
path.join(workspaceRoot, '.continue', 'harness-everything', 'manifest.json'),
|
|
207
|
+
path.join(userHome, '.agents', 'harness-everything', 'manifest.json'),
|
|
208
|
+
path.join(userHome, '.claude', 'harness-everything', 'manifest.json')
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
const generatedSkills = new Map();
|
|
212
|
+
for (const mPath of manifestPaths) {
|
|
213
|
+
if (fs.existsSync(mPath)) {
|
|
214
|
+
try {
|
|
215
|
+
const manifestData = JSON.parse(fs.readFileSync(mPath, 'utf8'));
|
|
216
|
+
if (Array.isArray(manifestData.generated)) {
|
|
217
|
+
for (const s of manifestData.generated) {
|
|
218
|
+
generatedSkills.set(s.id, s);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
} catch (err) {
|
|
222
|
+
// ignore malformed manifests
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const allDynamicSkills = Array.from(generatedSkills.values());
|
|
228
|
+
const matchedDynamicSkills = [];
|
|
229
|
+
|
|
230
|
+
for (const skill of allDynamicSkills) {
|
|
231
|
+
let score = 0;
|
|
232
|
+
const triggers = skill.triggers || [];
|
|
233
|
+
|
|
234
|
+
for (const rawTrigger of triggers) {
|
|
235
|
+
const trigger = rawTrigger.toLowerCase().trim();
|
|
236
|
+
if (!trigger || trigger.length < 2) continue;
|
|
237
|
+
|
|
238
|
+
// Ignore generic words to prevent false positives
|
|
239
|
+
if (['the', 'and', 'for', 'with', 'your', 'this', 'that', 'some', 'from', 'prevent', 'resolved'].includes(trigger)) continue;
|
|
240
|
+
|
|
241
|
+
const isChinese = /[\u4e00-\u9fa5]/.test(trigger);
|
|
242
|
+
if (isChinese) {
|
|
243
|
+
if (promptLower.includes(trigger)) {
|
|
244
|
+
score += trigger.length * 2;
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
// English word-boundary matching to prevent substrings inside larger words
|
|
248
|
+
const escapedTrigger = trigger.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
249
|
+
const regex = new RegExp(`\\b${escapedTrigger}\\b`, 'i');
|
|
250
|
+
if (regex.test(promptLower)) {
|
|
251
|
+
score += trigger.length >= 4 ? 3 : 1.5;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (score >= 3) {
|
|
257
|
+
matchedDynamicSkills.push({ skill, score });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (matchedDynamicSkills.length > 0) {
|
|
262
|
+
matchedDynamicSkills.sort((a, b) => b.score - a.score);
|
|
263
|
+
console.log(`\n=> đ¯ HIGH-RELEVANCE SELF-EVOLVED SKILL(S) DETECTED:`);
|
|
264
|
+
matchedDynamicSkills.forEach(({ skill }) => {
|
|
265
|
+
// Compute path relative to workspace or keep absolute
|
|
266
|
+
let displayPath = skill.dirPath;
|
|
267
|
+
if (displayPath.startsWith(workspaceRoot)) {
|
|
268
|
+
displayPath = path.relative(workspaceRoot, displayPath);
|
|
269
|
+
}
|
|
270
|
+
console.log(`- ${displayPath}/SKILL.md (${skill.description} [DYNAMIC SKILL])`);
|
|
271
|
+
});
|
|
272
|
+
} else if (recommendedGuides.length === 0 && allDynamicSkills.length > 0) {
|
|
273
|
+
// Prompt has no match in standard skills, and no direct match in dynamic skills,
|
|
274
|
+
// but there are indeed dynamic skills in manifest.json. Suggest the LLM to inspect them!
|
|
275
|
+
console.log(`\n=> âšī¸ UNMATCHED PROMPT HINT:`);
|
|
276
|
+
console.log(`No standard or dynamic skills matched your prompt directly.`);
|
|
277
|
+
console.log(`However, you have ${allDynamicSkills.length} self-evolved dynamic skill(s) registered in your manifest.json.`);
|
|
278
|
+
console.log(`To ensure you don't miss past lessons, you should inspect the "generated" section of your manifest.json or check .claude/harness-everything/skills/generated/ to see if any apply to your current task.`);
|
|
279
|
+
console.log(`If genuinely nothing covers this - including nothing already fetched via find-skills - load find-skills/SKILL.md: it checks "npx skills list" for anything already installed, then searches skills.sh/npx skills if not, and always requires explicit approval before installing anything.`);
|
|
280
|
+
}
|
|
281
|
+
} catch (err) {
|
|
282
|
+
// Fail silently in router to prevent breaking the core execution loop
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Fact-audit nudge: broad, cheap keyword net for claims that risk being
|
|
286
|
+
// asserted from stale/wrong training memory instead of verified. False
|
|
287
|
+
// positives cost nothing here (it's a reminder, not a block) so recall
|
|
288
|
+
// matters more than precision.
|
|
289
|
+
const externalClaimTriggers = routingConfig.factAudit.externalClaim || [];
|
|
290
|
+
const estimateTriggers = routingConfig.factAudit.estimate || [];
|
|
291
|
+
const hitExternalClaim = externalClaimTriggers.some(kw => promptLower.includes(kw));
|
|
292
|
+
const hitEstimate = estimateTriggers.some(kw => promptLower.includes(kw));
|
|
293
|
+
|
|
294
|
+
if (hitExternalClaim || hitEstimate) {
|
|
295
|
+
console.log(`\n=> FACT-AUDIT REMINDER:`);
|
|
296
|
+
if (hitExternalClaim) {
|
|
297
|
+
console.log(`This looks like it may require a claim about an external framework/library/API/tool's current behavior.`);
|
|
298
|
+
console.log(`Verify via WebFetch/WebSearch against the authoritative source before asserting it - do not answer from training memory alone; it can be stale or confidently wrong (e.g. exit-code semantics, schema fields, defaults, pricing).`);
|
|
299
|
+
}
|
|
300
|
+
if (hitEstimate) {
|
|
301
|
+
console.log(`This looks like it may call for a performance/cost/timing number.`);
|
|
302
|
+
console.log(`Prefer an actual measurement over a reasoned estimate when the stakes justify it - an unmeasured number (including one you generate yourself) is a hypothesis, not a fact.`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Constraint strength must match judgment reliability: this routing is a
|
|
307
|
+
// keyword heuristic, so it is a default, not an order.
|
|
308
|
+
console.log(`\nTreat the tier above as the default route. If your own read of the task clearly disagrees, follow your read and say why in one line. An explicit instruction from the Human Partner always wins.`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
let userPrompt = process.argv[2] || '';
|
|
312
|
+
|
|
313
|
+
if (process.argv[2]) {
|
|
314
|
+
// If a command-line argument is passed, use it and execute immediately.
|
|
315
|
+
run(userPrompt);
|
|
316
|
+
} else if (process.stdin.isTTY) {
|
|
317
|
+
// Running interactively in a terminal without piped input, execute immediately.
|
|
318
|
+
run('');
|
|
319
|
+
} else {
|
|
320
|
+
// Piped input or non-TTY, read from standard input.
|
|
321
|
+
let inputData = '';
|
|
322
|
+
process.stdin.on('data', chunk => { inputData += chunk; });
|
|
323
|
+
process.stdin.on('end', () => {
|
|
324
|
+
try {
|
|
325
|
+
if (inputData.trim()) {
|
|
326
|
+
const payload = JSON.parse(inputData);
|
|
327
|
+
if (typeof payload.prompt === 'string') userPrompt = payload.prompt;
|
|
328
|
+
}
|
|
329
|
+
} catch (err) {
|
|
330
|
+
// Not valid JSON on stdin - fall back to argv (useful for direct/manual testing).
|
|
331
|
+
}
|
|
332
|
+
run(userPrompt);
|
|
333
|
+
});
|
|
334
|
+
}
|