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
package/self-evolve/SKILL.md
CHANGED
|
@@ -1,54 +1,47 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: self-evolve
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
description: "Extract root causes from resolved problems and persist them as defensive memory rules or dynamic skills; use after struggles, zoom-outs, or explicit request."
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: Miya Daniel
|
|
7
|
+
version: 0.3.6
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
# Self
|
|
10
|
+
# Self-evolve
|
|
11
|
+
|
|
12
|
+
Record reusable root causes from resolved work.
|
|
13
|
+
|
|
14
|
+
Boundary: the host agent supplies authorized evidence and a generalized root cause. This skill classifies and persists it; it does not scan host transcripts.
|
|
15
|
+
|
|
16
|
+
Load `references/memory-resolution.md` on demand for the decision matrix, fallback paths, lazy-loading rules, and dynamic-skill details.
|
|
9
17
|
|
|
10
18
|
## 📋 Skill Contract
|
|
11
19
|
|
|
12
20
|
| Component | Specification |
|
|
13
21
|
| :--- | :--- |
|
|
14
|
-
| **Trigger / Input** |
|
|
15
|
-
| **Expected Output** |
|
|
16
|
-
| **State Mutations** | Updates workspace memory
|
|
17
|
-
| **Enforcement Gate** |
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
##
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
### Step 3: Memory Persistence & Dynamic Skill Generation
|
|
42
|
-
- **MANDATORY**: Before persisting or committing any dynamically generated skills or memories, you MUST run the self-regression suite to ensure no behavioral regressions or syntax errors were introduced. Both scripts below live in the `scripts/` directory **inside this skill's own directory** — resolve paths from wherever this SKILL.md was loaded (do not guess a hard-coded location):
|
|
43
|
-
```bash
|
|
44
|
-
node "<this-skill-dir>/scripts/self-regression.js"
|
|
45
|
-
```
|
|
46
|
-
- **MANDATORY**: You MUST execute the persistence script instead of manually editing files or calling write tools:
|
|
47
|
-
```bash
|
|
48
|
-
node "<this-skill-dir>/scripts/persist-memory.js" "<Your extracted root cause and defensive rule here>"
|
|
49
|
-
```
|
|
50
|
-
- **Dynamic Skill Generation (Session Packaging)**: Through self-review, package the successful session summary (hard boundary) into a new, dynamic skill. **You MUST load `skill-creator/SKILL.md` and follow its §4 Dynamic Skill Generation Contract** before writing the file — it defines the required location (`.claude/harness-everything/skills/generated/<name>/SKILL.md`, not the repo root), the required lifecycle frontmatter (`metadata.type: dynamic`, `status: draft`), and the Quality Checklist gate this file must pass since it skips human PR review by design. Do not hand-write a `SKILL.md` inline here; that checklist is the only review a dynamically generated skill gets. These dynamically generated skills have a lifecycle — draft → active → deprecated, or promoted to a static skill once proven general — distinct from the system's foundational static skills.
|
|
51
|
-
- **Note**: Only record "Key Insights", keeping the memory document short and punchy. Avoid stuffing it with lengthy conversation logs or useless narratives.
|
|
52
|
-
|
|
53
|
-
## 3. Purpose
|
|
54
|
-
Through `self-evolve`, we transform "invalid trial-and-error", which might otherwise waste Tokens, into a valuable "moat" for the system. Even if the underlying model doesn't become inherently smarter, equipped with these memories, the system will automatically avoid known traps and break through its original reasoning ceiling.
|
|
22
|
+
| **Trigger / Input** | Resolved struggle, zoom-out recovery, or explicit request; caller supplies evidence and root cause. |
|
|
23
|
+
| **Expected Output** | Persisted rule in existing memory or registered dynamic skill. |
|
|
24
|
+
| **State Mutations** | Updates the selected workspace memory or generated-skill manifest. |
|
|
25
|
+
| **Enforcement Gate** | Deduplication, self-regression, and the 60-line routing rule pass before persistence. |
|
|
26
|
+
|
|
27
|
+
## Core Workflow
|
|
28
|
+
|
|
29
|
+
1. Prefer existing `MEMORY.md`/`RULES.md`/`CLAUDE.md`/`AGENTS.md`.
|
|
30
|
+
2. Route the lesson:
|
|
31
|
+
- Simple rule (constraint/tip) → `memories/repo/RULES.md`, else `.github/harness-everything/memories/RULES.md`; use `persist-memory.js`.
|
|
32
|
+
- Reusable procedure → follow `skill-creator/SKILL.md`, then register with `register-dynamic-skill.js` in every platform `manifest.json`.
|
|
33
|
+
3. Run `self-regression.js` before persisting. Never persist without it.
|
|
34
|
+
|
|
35
|
+
## USE FOR:
|
|
36
|
+
- Lesson after hard debugging recovery
|
|
37
|
+
- Defensive rule found mid-task
|
|
38
|
+
- Reusable pattern packaged as dynamic skill
|
|
39
|
+
- Post-zoom-out rule extraction
|
|
40
|
+
|
|
41
|
+
## DO NOT USE FOR:
|
|
42
|
+
- One-off notes that won't recur
|
|
43
|
+
- Lessons already captured
|
|
44
|
+
- Secrets in memory files
|
|
45
|
+
- Static repo skills (use `skill-creator`)
|
|
46
|
+
|
|
47
|
+
Deep dive: references/memory-resolution.md
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Self-Evolve — Memory Resolution & Execution Details
|
|
2
|
+
|
|
3
|
+
Details moved from SKILL.md. Read when you need the full decision matrix or the reasoning behind the cleanliness rules.
|
|
4
|
+
|
|
5
|
+
## Responsibility Boundary
|
|
6
|
+
|
|
7
|
+
The host agent owns access to the current session and any history explicitly exposed by the host. It selects authorized evidence and states a generalized root cause before invoking this skill. `self-evolve` classifies, deduplicates, validates, and persists that result. It MUST NOT scan global transcript stores, persist raw transcripts, or act as a transcript daemon.
|
|
8
|
+
|
|
9
|
+
## Triggers
|
|
10
|
+
|
|
11
|
+
- **Post-Circuit Breaker**: Following successful recovery after a `zoom-out` reflection.
|
|
12
|
+
- **Major Breakthrough**: Upon completing complex tasks that revealed non-obvious framework limits or architectural edge cases.
|
|
13
|
+
- **Explicit Request**: When the user asks to "remember this lesson" or "save this to memory".
|
|
14
|
+
|
|
15
|
+
## Execution Process & Memory Resolution Flow
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart TD
|
|
19
|
+
Start[Self-Evolve Triggered: Extract Lessons] --> CheckProjectMemory{1. Detect Workspace Memory Architecture?<br>e.g. MEMORY.md, RULES.md}
|
|
20
|
+
|
|
21
|
+
CheckProjectMemory -- Found MEMORY.md / RULES.md --> TargetFile[Set Target Memory File]
|
|
22
|
+
CheckProjectMemory -- Not Found --> CheckScript{2. Node.js & Script Executable?}
|
|
23
|
+
|
|
24
|
+
CheckScript -- Yes --> RunScript[Execute scripts/persist-memory.js / register-dynamic-skill.js]
|
|
25
|
+
CheckScript -- No --> PathPlatform[Create Platform State Memory<br>e.g. .github/harness-everything/memories/RULES.md] --> TargetFile
|
|
26
|
+
|
|
27
|
+
RunScript --> Done[Memory Persisted]
|
|
28
|
+
TargetFile --> CheckLineCount{3. Check Target File Line Count}
|
|
29
|
+
|
|
30
|
+
CheckLineCount -- < 60 Lines --> DirectAppend[Directly Append Rule to Target Memory File]
|
|
31
|
+
CheckLineCount -- ≥ 60 Lines --> ModularSplit[Categorize & Create Sub-memory File<br>e.g. memories/rules/topic.md]
|
|
32
|
+
|
|
33
|
+
ModularSplit --> LazyLoadIndex[Add 1-Line Index Pointer to Primary MEMORY.md<br>Enable Lazy Loading]
|
|
34
|
+
|
|
35
|
+
DirectAppend --> Done
|
|
36
|
+
LazyLoadIndex --> Done
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For a simple rule, persist only the generalized constraint or tip. For a reusable multi-step procedure, load `skill-creator/SKILL.md`, create the draft skill, and use `register-dynamic-skill.js` to update each platform's `manifest.json` `generated[]` registry. The host agent remains responsible for deciding which evidence is relevant; these scripts do not discover session history.
|
|
40
|
+
|
|
41
|
+
## Memory Resolution & Cleanliness Rules
|
|
42
|
+
|
|
43
|
+
1. **Workspace Memory Inspection First**:
|
|
44
|
+
Before creating new memory files or running scripts, check if the workspace already maintains a primary memory file (such as `MEMORY.md`, `memories/repo/RULES.md`, `CLAUDE.md`, or `AGENTS.md`). If found, prioritize updating the existing structure.
|
|
45
|
+
|
|
46
|
+
2. **The 60-Line Cleanliness & Lazy Loading Rule**:
|
|
47
|
+
To prevent Context Bloat and keep workspace memory organized:
|
|
48
|
+
- **Under 60 Lines**: Append the concise, generalized defensive rule directly to the primary memory file.
|
|
49
|
+
- **60 Lines or Greater**:
|
|
50
|
+
- **Modular Split**: Extract the rule into a dedicated topic file under a sub-folder (e.g. `memories/rules/db-migration.md` or `.github/harness-everything/memories/rules/<topic>.md`).
|
|
51
|
+
- **Index Pointer & Lazy Loading**: Add a single-line link/pointer in the primary `MEMORY.md` (e.g. `- [DB Migration Rules](memories/rules/db-migration.md)`). Future agent sessions will lazy-load the sub-memory file only when touching that specific domain.
|
|
52
|
+
|
|
53
|
+
3. **Script Tooling Fallback**:
|
|
54
|
+
If Node.js and `persist-memory.js` are executable, run `node "<this-skill-dir>/scripts/persist-memory.js" "<rule>"`. If script execution fails or is unavailable, use the agent's file tools or memory API directly.
|
|
55
|
+
|
|
56
|
+
## Purpose
|
|
57
|
+
|
|
58
|
+
Through `self-evolve`, we transform "invalid trial-and-error", which might otherwise waste Tokens, into a valuable "moat" for the system. Even if the underlying model doesn't become inherently smarter, equipped with these memories, the system will automatically avoid known traps and break through its original reasoning ceiling.
|
|
@@ -1,40 +1,139 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
const args = process.argv.slice(2);
|
|
6
|
-
const memoryText = args[0];
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
console.
|
|
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
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const memoryText = args[0];
|
|
7
|
+
|
|
8
|
+
if (memoryText === '--help' || memoryText === '-h') {
|
|
9
|
+
console.log(`Append a short defensive rule to memories/repo/RULES.md.
|
|
10
|
+
|
|
11
|
+
Usage: node persist-memory.js "<insight to remember>"
|
|
12
|
+
|
|
13
|
+
One positional argument - the extracted root cause / rule, written as a universal,
|
|
14
|
+
high-level statement (not a specific file, line number, or variable name). Wrap it
|
|
15
|
+
in quotes if it contains spaces. Appended under a dated heading; never overwrites
|
|
16
|
+
earlier entries.
|
|
17
|
+
|
|
18
|
+
Quality gates:
|
|
19
|
+
- Minimum score of 5/10 required for persistence
|
|
20
|
+
- Deduplication check against existing rules
|
|
21
|
+
- Specificity and actionability scoring`);
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!memoryText) {
|
|
26
|
+
console.error("Usage: node persist-memory.js \"<insight to remember>\"");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Rule quality scoring system
|
|
31
|
+
function scoreRuleQuality(ruleText, existingRules = []) {
|
|
32
|
+
let score = 0;
|
|
33
|
+
|
|
34
|
+
// Specificity: mentions specific files, errors, or patterns
|
|
35
|
+
if (/\.\w{2,4}/.test(ruleText)) score += 2; // File extensions
|
|
36
|
+
if (/Error|Exception|Warning|錯誤|異常|警告/.test(ruleText)) score += 2; // Error patterns
|
|
37
|
+
if (/\b(test|lint|build|verify|check|測試|檢查)\b/i.test(ruleText)) score += 1; // Verification terms
|
|
38
|
+
|
|
39
|
+
// Actionability: starts with verb, has clear instruction
|
|
40
|
+
if (/^(Always|Never|Check|Verify|Prefer|Avoid|Use|不要|總是|檢查|驗證|避免|使用)/i.test(ruleText)) score += 3;
|
|
41
|
+
if (/^(should|must|will|needs? to|ought|應該|必須|需要)/i.test(ruleText)) score += 2;
|
|
42
|
+
|
|
43
|
+
// Uniqueness: not already in RULES.md
|
|
44
|
+
const isDuplicate = existingRules.some(existing => {
|
|
45
|
+
const similarity = calculateSimilarity(ruleText, existing);
|
|
46
|
+
return similarity > 0.7; // 70% similarity threshold
|
|
47
|
+
});
|
|
48
|
+
if (!isDuplicate) score += 3;
|
|
49
|
+
|
|
50
|
+
// Length appropriateness (not too short, not too long)
|
|
51
|
+
if (ruleText.length > 20 && ruleText.length < 200) score += 1;
|
|
52
|
+
|
|
53
|
+
return Math.min(score, 10); // Cap at 10
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Simple text similarity calculation
|
|
57
|
+
function calculateSimilarity(text1, text2) {
|
|
58
|
+
const words1 = text1.toLowerCase().split(/\s+/);
|
|
59
|
+
const words2 = text2.toLowerCase().split(/\s+/);
|
|
60
|
+
|
|
61
|
+
const set1 = new Set(words1);
|
|
62
|
+
const set2 = new Set(words2);
|
|
63
|
+
|
|
64
|
+
let intersection = 0;
|
|
65
|
+
for (const word of set1) {
|
|
66
|
+
if (set2.has(word)) intersection++;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const union = set1.size + set2.size - intersection;
|
|
70
|
+
return union === 0 ? 0 : intersection / union;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Extract existing rules from RULES.md
|
|
74
|
+
function extractExistingRules(rulesFile) {
|
|
75
|
+
if (!fs.existsSync(rulesFile)) return [];
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const content = fs.readFileSync(rulesFile, 'utf8');
|
|
79
|
+
const ruleMatches = content.match(/^- .+$/gm) || [];
|
|
80
|
+
return ruleMatches.map(rule => rule.substring(2)); // Remove "- " prefix
|
|
81
|
+
} catch (err) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function getWorkspaceRoot() {
|
|
87
|
+
let dir = path.resolve(process.cwd());
|
|
88
|
+
while (dir !== path.parse(dir).root) {
|
|
89
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
90
|
+
dir = path.dirname(dir);
|
|
91
|
+
}
|
|
92
|
+
return process.cwd();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Ensure the memory is written to the project root's memories/repo/ directory
|
|
96
|
+
const currentDir = getWorkspaceRoot();
|
|
97
|
+
const memoryDir = path.join(currentDir, 'memories', 'repo');
|
|
98
|
+
const rulesFile = path.join(memoryDir, 'RULES.md');
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
if (!fs.existsSync(memoryDir)) {
|
|
102
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Extract existing rules for deduplication check
|
|
106
|
+
const existingRules = extractExistingRules(rulesFile);
|
|
107
|
+
|
|
108
|
+
// Score the rule quality
|
|
109
|
+
const qualityScore = scoreRuleQuality(memoryText, existingRules);
|
|
110
|
+
|
|
111
|
+
if (qualityScore < 5) {
|
|
112
|
+
console.error(`[Quality Gate] Rule rejected - score ${qualityScore}/10 (minimum 5 required)`);
|
|
113
|
+
console.error(`Suggestions to improve:`);
|
|
114
|
+
console.error(`- Be more specific (mention file types, error patterns)`);
|
|
115
|
+
console.error(`- Start with action verbs (Always, Never, Check, Verify)`);
|
|
116
|
+
console.error(`- Ensure the rule is actionable and not already captured`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Check for duplicates
|
|
121
|
+
const isDuplicate = existingRules.some(existing => {
|
|
122
|
+
const similarity = calculateSimilarity(memoryText, existing);
|
|
123
|
+
return similarity > 0.7;
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
if (isDuplicate) {
|
|
127
|
+
console.error(`[Quality Gate] Rule rejected - similar rule already exists`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
132
|
+
const formattedMemory = `\n## [${timestamp}] Self-Evolution Insight (Quality: ${qualityScore}/10)\n- ${memoryText}\n`;
|
|
133
|
+
|
|
134
|
+
fs.appendFileSync(rulesFile, formattedMemory, 'utf8');
|
|
135
|
+
console.log(`[Success] Memory persisted to ${rulesFile} (Quality: ${qualityScore}/10)`);
|
|
136
|
+
} catch (err) {
|
|
137
|
+
console.error(`[Error] Failed to write memory: ${err.message}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
function getWorkspaceRoot() {
|
|
6
|
+
let dir = path.resolve(process.cwd());
|
|
7
|
+
while (dir !== path.parse(dir).root) {
|
|
8
|
+
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
9
|
+
dir = path.dirname(dir);
|
|
10
|
+
}
|
|
11
|
+
return process.cwd();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function loadManifestHelper() {
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(__dirname, '../../scripts/lib/manifest'),
|
|
17
|
+
path.join(__dirname, '../scripts/lib/manifest'),
|
|
18
|
+
path.join(__dirname, '../../../scripts/lib/manifest'),
|
|
19
|
+
path.join(getWorkspaceRoot(), 'scripts/lib/manifest'),
|
|
20
|
+
path.join(getWorkspaceRoot(), 'harness-everything/scripts/lib/manifest'),
|
|
21
|
+
];
|
|
22
|
+
for (const cand of candidates) {
|
|
23
|
+
try {
|
|
24
|
+
if (fs.existsSync(cand + '.js') || fs.existsSync(cand)) {
|
|
25
|
+
return require(cand);
|
|
26
|
+
}
|
|
27
|
+
} catch (e) {}
|
|
28
|
+
}
|
|
29
|
+
throw new Error('[register-dynamic-skill] Failed to locate manifest helper module (scripts/lib/manifest)');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const { getManifestPath, readManifest, writeManifest, recordGeneratedSkill } = loadManifestHelper();
|
|
33
|
+
|
|
34
|
+
// Find user home folder
|
|
35
|
+
const userHome = process.env.HOME || process.env.USERPROFILE || '';
|
|
36
|
+
const workspaceRoot = getWorkspaceRoot();
|
|
37
|
+
|
|
38
|
+
// List of all possible manifest.json home paths
|
|
39
|
+
const manifestHomes = [
|
|
40
|
+
path.join(workspaceRoot, '.claude'),
|
|
41
|
+
path.join(workspaceRoot, '.cursor'),
|
|
42
|
+
path.join(workspaceRoot, '.github'),
|
|
43
|
+
path.join(workspaceRoot, '.codex'),
|
|
44
|
+
path.join(workspaceRoot, '.continue'),
|
|
45
|
+
path.join(userHome, '.agents'),
|
|
46
|
+
path.join(userHome, '.claude')
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
// Helper to parse simple YAML frontmatter without external dependencies
|
|
50
|
+
function parseFrontmatter(content) {
|
|
51
|
+
const lines = content.split(/\r?\n/);
|
|
52
|
+
const fm = {};
|
|
53
|
+
let inFM = false;
|
|
54
|
+
const fmLines = [];
|
|
55
|
+
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
if (line.trim() === '---') {
|
|
58
|
+
if (!inFM) {
|
|
59
|
+
inFM = true;
|
|
60
|
+
continue;
|
|
61
|
+
} else {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (inFM) {
|
|
66
|
+
fmLines.push(line);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let currentKey = null;
|
|
71
|
+
for (const line of fmLines) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
74
|
+
|
|
75
|
+
// Check if indent level is substantial (nested list or object)
|
|
76
|
+
const indent = line.search(/\S/);
|
|
77
|
+
|
|
78
|
+
if (indent === 0) {
|
|
79
|
+
const match = line.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
|
|
80
|
+
if (match) {
|
|
81
|
+
const key = match[1];
|
|
82
|
+
const val = match[2].trim();
|
|
83
|
+
|
|
84
|
+
let cleanVal = val;
|
|
85
|
+
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
86
|
+
cleanVal = val.slice(1, -1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (val.startsWith('[') && val.endsWith(']')) {
|
|
90
|
+
cleanVal = val.slice(1, -1).split(',').map(s => s.trim().replace(/^['"]|['"]$/g, ''));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fm[key] = cleanVal;
|
|
94
|
+
currentKey = key;
|
|
95
|
+
}
|
|
96
|
+
} else if (indent > 0 && currentKey) {
|
|
97
|
+
// Handle nested properties or array items
|
|
98
|
+
if (trimmed.startsWith('- ')) {
|
|
99
|
+
if (!Array.isArray(fm[currentKey])) {
|
|
100
|
+
fm[currentKey] = [];
|
|
101
|
+
}
|
|
102
|
+
fm[currentKey].push(trimmed.slice(2).trim().replace(/^['"]|['"]$/g, ''));
|
|
103
|
+
} else {
|
|
104
|
+
const childMatch = trimmed.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
|
|
105
|
+
if (childMatch) {
|
|
106
|
+
if (typeof fm[currentKey] !== 'object' || Array.isArray(fm[currentKey])) {
|
|
107
|
+
fm[currentKey] = {};
|
|
108
|
+
}
|
|
109
|
+
const childKey = childMatch[1];
|
|
110
|
+
const childVal = childMatch[2].trim().replace(/^['"]|['"]$/g, '');
|
|
111
|
+
fm[currentKey][childKey] = childVal;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return fm;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function processSkillDir(skillDirPath) {
|
|
120
|
+
const skillFile = path.join(skillDirPath, 'SKILL.md');
|
|
121
|
+
if (!fs.existsSync(skillFile)) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
126
|
+
const fm = parseFrontmatter(content);
|
|
127
|
+
|
|
128
|
+
const skillId = fm.name || path.basename(skillDirPath);
|
|
129
|
+
const description = fm.description || 'No description provided';
|
|
130
|
+
|
|
131
|
+
// Extract custom triggers/tags if defined, or infer them from keywords
|
|
132
|
+
let triggers = [];
|
|
133
|
+
if (fm.triggers) {
|
|
134
|
+
triggers = Array.isArray(fm.triggers) ? fm.triggers : [fm.triggers];
|
|
135
|
+
} else if (fm.metadata && fm.metadata.triggers) {
|
|
136
|
+
triggers = Array.isArray(fm.metadata.triggers) ? fm.metadata.triggers : [fm.metadata.triggers];
|
|
137
|
+
} else {
|
|
138
|
+
// Fallback only - explicit `triggers:` frontmatter (mandated by
|
|
139
|
+
// skill-creator/SKILL.md §4) should make this branch rare. Kept
|
|
140
|
+
// deliberately conservative: only the skill name plus the description's
|
|
141
|
+
// first sentence (not the whole prose block), a longer stopword list,
|
|
142
|
+
// and a length-5+ floor, so a generic skill description doesn't spam
|
|
143
|
+
// tier-router.js with broad words that fire on unrelated prompts.
|
|
144
|
+
const firstSentence = description.split(/[.!?]/)[0];
|
|
145
|
+
const STOPWORDS = new Set([
|
|
146
|
+
'with', 'from', 'this', 'that', 'your', 'about', 'some', 'than', 'then',
|
|
147
|
+
'prevent', 'resolved', 'skill', 'agent', 'using', 'which', 'these',
|
|
148
|
+
'those', 'their', 'there', 'where', 'when', 'while', 'after', 'before',
|
|
149
|
+
'again', 'other', 'every', 'being', 'would', 'could', 'should', 'still',
|
|
150
|
+
'first', 'never', 'always', 'ensure', 'provide', 'provided'
|
|
151
|
+
]);
|
|
152
|
+
const words = (skillId + ' ' + firstSentence)
|
|
153
|
+
.toLowerCase()
|
|
154
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
155
|
+
.split(/\s+/)
|
|
156
|
+
.filter(w => w.length >= 5 && !STOPWORDS.has(w));
|
|
157
|
+
triggers = [...new Set(words)].slice(0, 8);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
id: skillId,
|
|
162
|
+
dirPath: skillDirPath,
|
|
163
|
+
description,
|
|
164
|
+
triggers,
|
|
165
|
+
metadata: fm.metadata || {}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function register() {
|
|
170
|
+
const arg = process.argv[2];
|
|
171
|
+
|
|
172
|
+
if (arg === '--help' || arg === '-h') {
|
|
173
|
+
console.log(`Register self-evolve dynamic skills into every detected platform manifest.json.
|
|
174
|
+
|
|
175
|
+
Usage:
|
|
176
|
+
node register-dynamic-skill.js Scan .claude/harness-everything/skills/generated/ and register every skill found there.
|
|
177
|
+
node register-dynamic-skill.js <name> Register only the skill folder named <name> under skills/generated/.
|
|
178
|
+
node register-dynamic-skill.js <path> Register the skill folder at this literal path instead.
|
|
179
|
+
|
|
180
|
+
Each skill folder needs a SKILL.md with 'name' and 'description' frontmatter (plus
|
|
181
|
+
'triggers' - if omitted, triggers are inferred from the name and description, which
|
|
182
|
+
is a conservative fallback, not a substitute for setting them explicitly). Writes to
|
|
183
|
+
every already-bootstrapped platform's manifest.json (.claude/, .cursor/, .github/,
|
|
184
|
+
.codex/, .continue/, plus the user-home ~/.agents and ~/.claude homes).`);
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const generatedBaseDir = path.join(workspaceRoot, '.claude', 'harness-everything', 'skills', 'generated');
|
|
189
|
+
|
|
190
|
+
let skillsToRegister = [];
|
|
191
|
+
|
|
192
|
+
if (arg) {
|
|
193
|
+
// Scenario A: Register specific skill ID or path
|
|
194
|
+
let skillPath = arg;
|
|
195
|
+
if (!fs.existsSync(skillPath)) {
|
|
196
|
+
skillPath = path.join(generatedBaseDir, arg);
|
|
197
|
+
}
|
|
198
|
+
if (fs.existsSync(skillPath)) {
|
|
199
|
+
const info = processSkillDir(skillPath);
|
|
200
|
+
if (info) skillsToRegister.push(info);
|
|
201
|
+
} else {
|
|
202
|
+
console.error(`[Error] Dynamic skill folder not found: ${arg}`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
// Scenario B: Scan whole generated folder
|
|
207
|
+
if (fs.existsSync(generatedBaseDir)) {
|
|
208
|
+
const subdirs = fs.readdirSync(generatedBaseDir, { withFileTypes: true });
|
|
209
|
+
for (const entry of subdirs) {
|
|
210
|
+
if (entry.isDirectory()) {
|
|
211
|
+
const dirPath = path.join(generatedBaseDir, entry.name);
|
|
212
|
+
const info = processSkillDir(dirPath);
|
|
213
|
+
if (info) skillsToRegister.push(info);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (skillsToRegister.length === 0) {
|
|
220
|
+
console.log('[Info] No self-evolved dynamic skills found to register.');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Write to all detected manifests (auto-creating target directories if in workspace)
|
|
225
|
+
let count = 0;
|
|
226
|
+
for (const home of manifestHomes) {
|
|
227
|
+
const manifestPath = getManifestPath(home);
|
|
228
|
+
const parentDir = path.dirname(manifestPath);
|
|
229
|
+
const isRepoHome = home.startsWith(workspaceRoot);
|
|
230
|
+
if (fs.existsSync(parentDir) || isRepoHome) {
|
|
231
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
232
|
+
for (const skill of skillsToRegister) {
|
|
233
|
+
recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
|
|
234
|
+
}
|
|
235
|
+
console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to ${manifestPath}`);
|
|
236
|
+
count++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (count === 0) {
|
|
241
|
+
// Fallback: If no manifest path's directory existed, write to at least the standard home path
|
|
242
|
+
const fallbackHome = path.join(userHome, '.agents');
|
|
243
|
+
const manifestPath = getManifestPath(fallbackHome);
|
|
244
|
+
for (const skill of skillsToRegister) {
|
|
245
|
+
recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
|
|
246
|
+
}
|
|
247
|
+
console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to fallback manifest ${manifestPath}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
register();
|