harness-everything 0.3.6 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +8 -7
  4. package/.github/workflows/ci.yml +23 -18
  5. package/.github/workflows/release.yml +53 -27
  6. package/.releaserc.json +113 -0
  7. package/AGENTS.md +34 -23
  8. package/BENCHMARK_SOP.md +38 -18
  9. package/CHANGELOG.md +194 -3
  10. package/CONTRIBUTING.md +17 -4
  11. package/PRIVACY.md +25 -0
  12. package/README.md +118 -87
  13. package/RELEASING.md +82 -0
  14. package/SUPPORT.md +27 -0
  15. package/TERMS.md +21 -0
  16. package/VERIFICATION.md +175 -286
  17. package/behavioral-evals/README.md +21 -0
  18. package/behavioral-evals/case-validator.js +194 -0
  19. package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
  20. package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
  21. package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
  22. package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
  23. package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
  24. package/behavioral-evals/cases/baseline-git-commit.yaml +2 -2
  25. package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
  26. package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
  27. package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
  28. package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
  29. package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
  30. package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
  31. package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
  32. package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
  33. package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
  34. package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
  35. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +2 -2
  36. package/behavioral-evals/cases/pressure-complexity-skip.yaml +2 -2
  37. package/behavioral-evals/cases/pressure-scope-bypass.yaml +7 -2
  38. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +7 -4
  39. package/behavioral-evals/cases/scope-discipline.yaml +2 -1
  40. package/behavioral-evals/cases/verify-before-done.yaml +7 -5
  41. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
  42. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
  43. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
  44. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
  45. package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
  46. package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
  47. package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
  48. package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
  49. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
  50. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
  51. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
  52. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
  53. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
  54. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
  55. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
  56. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
  57. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
  58. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
  59. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
  60. package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
  61. package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
  62. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
  63. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
  64. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
  65. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
  66. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
  67. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
  68. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
  69. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
  70. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
  71. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
  72. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
  73. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
  74. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
  75. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
  76. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
  77. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
  78. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
  79. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
  80. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
  81. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
  82. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
  83. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
  84. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
  85. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
  86. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
  87. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
  88. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
  89. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
  90. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  91. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
  92. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
  93. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
  94. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  95. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
  96. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
  97. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
  98. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
  99. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
  100. package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
  101. package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
  102. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
  103. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
  104. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
  105. package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
  106. package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
  107. package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
  108. package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
  109. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
  110. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
  111. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
  112. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
  113. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
  114. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
  115. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
  116. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
  117. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
  118. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
  119. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
  120. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
  121. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
  122. package/behavioral-evals/evidence-tool.js +443 -0
  123. package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
  124. package/behavioral-evals/fixtures/claude-legacy.json +1 -0
  125. package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
  126. package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
  127. package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
  128. package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
  129. package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
  130. package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
  131. package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
  132. package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
  133. package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
  134. package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
  135. package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
  136. package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
  137. package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
  138. package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
  139. package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
  140. package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
  141. package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
  142. package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
  143. package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
  144. package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
  145. package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
  146. package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
  147. package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
  148. package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
  149. package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
  150. package/behavioral-evals/run-with-plugin.js +15 -31
  151. package/behavioral-evals/run.js +446 -105
  152. package/behavioral-evals/transcript-parser.js +591 -0
  153. package/bin/cli.js +24 -12
  154. package/ci/ab-test-cases/grill-me-adversarial.yaml +14 -4
  155. package/ci/ab-test-cases/tdd-test-first.yaml +13 -6
  156. package/ci/ab-test-cases/verification-loop-gates.yaml +20 -7
  157. package/ci/ab-test-cases/verify-before-claim-cites.yaml +7 -6
  158. package/ci/ab-test-harness.js +113 -38
  159. package/ci/action-gate-platform-doc.test.js +31 -0
  160. package/ci/action-gate.test.js +260 -0
  161. package/ci/cases/case2.json +2 -2
  162. package/ci/consistency-check.js +51 -5
  163. package/ci/description-collision.js +15 -6
  164. package/ci/disclosure-check.js +225 -0
  165. package/ci/doc-capability-consistency.test.js +180 -0
  166. package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
  167. package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
  168. package/ci/installer-roundtrip.test.js +159 -0
  169. package/ci/invariant-routing.test.js +74 -0
  170. package/ci/issue99-runtime.test.js +218 -0
  171. package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
  172. package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
  173. package/ci/mechanism-2j-behavioral-runner.test.js +43 -1
  174. package/ci/mechanism-2k-reference-check.test.js +57 -2
  175. package/ci/mechanism-2l-multi-agent-workspace.test.js +202 -6
  176. package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
  177. package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
  178. package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
  179. package/ci/mechanism-2p-installer-links.test.js +183 -0
  180. package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
  181. package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
  182. package/ci/mechanism-2s-tdd-quality.test.js +203 -0
  183. package/ci/mechanism-2t-disclosure.test.js +90 -0
  184. package/ci/mechanism-2t-evidence-triage.test.js +200 -0
  185. package/ci/mechanism-2t-issue-20.test.js +75 -0
  186. package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
  187. package/ci/mechanism-2t-transcript-parser.test.js +179 -0
  188. package/ci/mechanism-2t-workspace-identity.test.js +200 -0
  189. package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
  190. package/ci/mechanism-2u-issue-44.test.js +35 -0
  191. package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
  192. package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
  193. package/ci/mechanism-2x-release-automation.test.js +157 -0
  194. package/ci/mechanism-2x-release-commit-message.test.js +66 -0
  195. package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
  196. package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
  197. package/ci/mutation-check.js +53 -0
  198. package/ci/mutation-loader.js +57 -0
  199. package/ci/negative-controls.js +76 -46
  200. package/ci/openai-plugin-package.test.js +182 -0
  201. package/ci/openai-plugin-runtime.test.js +175 -0
  202. package/ci/openai-plugin-submission.test.js +101 -0
  203. package/ci/phase4-ensemble-memory.test.js +307 -0
  204. package/ci/reference-check.js +73 -25
  205. package/ci/release-consistency-check.js +24 -1
  206. package/ci/router-phase2-safety.test.js +81 -0
  207. package/ci/router-workflow-plan.test.js +264 -0
  208. package/ci/routing-check.js +6 -5
  209. package/ci/runner.js +6 -5
  210. package/ci/skill-routing-check.js +48 -11
  211. package/ci/test-behavioral-case-validation.js +62 -0
  212. package/ci/test-helper.js +10 -0
  213. package/ci/workflow-plan-consumers-edge.test.js +72 -0
  214. package/ci/workflow-plan-consumers.test.js +276 -0
  215. package/docs/architecture.md +137 -57
  216. package/docs/audit.md +22 -20
  217. package/docs/codex-action-gate.md +90 -0
  218. package/docs/issue-20-rollup.md +47 -0
  219. package/docs/mechanism-first-skill-mesh.md +22 -20
  220. package/docs/openai-plugin.md +118 -0
  221. package/docs/philosophy.md +28 -17
  222. package/docs/platform-capabilities.md +73 -0
  223. package/docs/platform-compatibility.json +270 -0
  224. package/docs/reflection.md +37 -22
  225. package/docs/release-evidence.md +25 -0
  226. package/docs/routing.md +157 -44
  227. package/docs/security-audit.md +38 -0
  228. package/docs/troubleshooting.md +82 -46
  229. package/docs/verifier-boundaries.md +45 -0
  230. package/docs/workflows/fable-mode.md +77 -21
  231. package/docs/workflows/find-skills.md +40 -0
  232. package/docs/workflows/grill-with-docs.md +2 -2
  233. package/docs/workflows/multi-agent-workspace.md +22 -10
  234. package/docs/workflows/self-evolve.md +33 -0
  235. package/docs/workflows/tdd.md +36 -0
  236. package/docs/workflows/todo-driven-workflow.md +33 -0
  237. package/environment-detection/SKILL.md +3 -3
  238. package/eval-harness/SKILL.md +7 -7
  239. package/eval-harness/scripts/evaluate.js +12 -10
  240. package/evals/evaluation-reports.md +14 -0
  241. package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
  242. package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
  243. package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
  244. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +1 -1
  245. package/fable-discipline/SKILL.md +2 -2
  246. package/fable-mode/CONTRACT-FORMAT.md +147 -33
  247. package/fable-mode/SKILL.md +3 -3
  248. package/fable-mode/agents/fable-orchestrator.md +95 -35
  249. package/fable-mode/execution-guardrails/SKILL.md +2 -2
  250. package/fable-mode/fable-haiku/SKILL.md +3 -3
  251. package/fable-mode/fable-opus/SKILL.md +3 -3
  252. package/fable-mode/fable-sonnet/SKILL.md +3 -3
  253. package/fable-mode/scripts/ensemble-review.js +371 -0
  254. package/fable-mode/scripts/model-selector.js +134 -3
  255. package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  256. package/find-skills/SKILL.md +5 -5
  257. package/find-skills/references/discovery-flow.md +1 -1
  258. package/find-skills/scripts/use-skill.js +7 -1
  259. package/git-commit/SKILL.md +4 -11
  260. package/grill-me/SKILL.md +5 -5
  261. package/grill-with-docs/SKILL.md +7 -7
  262. package/grill-with-docs/references/session-playbook.md +6 -4
  263. package/harness-everything/SKILL.md +23 -22
  264. package/harness-everything/references/router-workflow-plan.md +128 -0
  265. package/harness-everything/references/triage-and-tiers.md +173 -96
  266. package/harness-everything/schemas/router-task-shape.schema.json +126 -0
  267. package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  268. package/harness-everything/scripts/bootstrap.js +13 -4
  269. package/harness-everything/scripts/ensemble-policy.js +102 -0
  270. package/harness-everything/scripts/kernel-router.js +212 -0
  271. package/harness-everything/scripts/router-contract.js +612 -0
  272. package/harness-everything/scripts/self-heal.js +29 -20
  273. package/harness-everything/scripts/tier-router.js +346 -221
  274. package/hooks/hooks.json +60 -15
  275. package/hooks/scripts/action-gate-rules.json +77 -0
  276. package/hooks/scripts/action-gate.js +528 -0
  277. package/hooks/scripts/atomic-commit-check.js +5 -5
  278. package/hooks/scripts/codex-action-gate-post.js +46 -0
  279. package/hooks/scripts/codex-permission-request.js +140 -0
  280. package/hooks/scripts/context-compact.js +4 -3
  281. package/hooks/scripts/contract-test.js +118 -51
  282. package/hooks/scripts/lib/fable-contracts.js +121 -0
  283. package/hooks/scripts/lib/harness-state.js +164 -28
  284. package/hooks/scripts/lib/platforms/claude.js +45 -62
  285. package/hooks/scripts/lib/platforms/codex.js +35 -61
  286. package/hooks/scripts/lib/platforms/continue.js +7 -7
  287. package/hooks/scripts/lib/platforms/copilot.js +29 -53
  288. package/hooks/scripts/lib/platforms/hermes.js +71 -20
  289. package/hooks/scripts/openai-session-start.js +81 -0
  290. package/hooks/scripts/rule-of-3-tracker.js +9 -8
  291. package/hooks/scripts/rule-of-3.js +29 -21
  292. package/hooks/scripts/state-persist.js +5 -4
  293. package/hooks/scripts/stop-gate.js +2 -2
  294. package/hooks/scripts/subagent-scope-guard.js +144 -38
  295. package/hooks/scripts/subagent-start.js +19 -0
  296. package/hooks/scripts/subagent-stop.js +6 -0
  297. package/improve-codebase-architecture/SKILL.md +2 -4
  298. package/improve-codebase-architecture/references/README.md +16 -0
  299. package/install-cognitive-os/SKILL.md +28 -22
  300. package/multi-agent-workspace/SKILL.md +16 -15
  301. package/multi-agent-workspace/references/architecture-guide.md +13 -9
  302. package/multi-agent-workspace/references/orchestration.md +39 -22
  303. package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  304. package/multi-agent-workspace/scripts/index_memory.js +79 -26
  305. package/multi-agent-workspace/scripts/path-boundary.js +59 -0
  306. package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  307. package/multi-agent-workspace/scripts/scaffold.js +258 -103
  308. package/multi-agent-workspace/templates/AGENTS.md +20 -0
  309. package/multi-agent-workspace/workflows/03-generation.md +8 -10
  310. package/multi-agent-workspace/workflows/04-launcher.md +5 -5
  311. package/opencode-plugin/README.md +114 -71
  312. package/opencode-plugin/hooks/verify.js +62 -12
  313. package/opencode-plugin/index.mjs +547 -0
  314. package/opencode-plugin/plugin.json +4 -12
  315. package/package.json +16 -3
  316. package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
  317. package/plugins/harness-everything/hooks/hooks.json +197 -0
  318. package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
  319. package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
  320. package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
  321. package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
  322. package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
  323. package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
  324. package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
  325. package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
  326. package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
  327. package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
  328. package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
  329. package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
  330. package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
  331. package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
  332. package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
  333. package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
  334. package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
  335. package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
  336. package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
  337. package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
  338. package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
  339. package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
  340. package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
  341. package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
  342. package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
  343. package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
  344. package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
  345. package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
  346. package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
  347. package/plugins/harness-everything/hooks/session-start.js +81 -0
  348. package/plugins/harness-everything/plugin.json +43 -0
  349. package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
  350. package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
  351. package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
  352. package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
  353. package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
  354. package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
  355. package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
  356. package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
  357. package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
  358. package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
  359. package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
  360. package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
  361. package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
  362. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
  363. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
  364. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
  365. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  366. package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
  367. package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  368. package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
  369. package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
  370. package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
  371. package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
  372. package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
  373. package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
  374. package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
  375. package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  376. package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
  377. package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
  378. package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
  379. package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
  380. package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
  381. package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
  382. package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
  383. package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
  384. package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
  385. package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
  386. package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
  387. package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
  388. package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  389. package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
  390. package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
  391. package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
  392. package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
  393. package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
  394. package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
  395. package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
  396. package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
  397. package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
  398. package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
  399. package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  400. package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
  401. package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
  402. package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
  403. package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
  404. package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
  405. package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
  406. package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
  407. package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
  408. package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
  409. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
  410. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
  411. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
  412. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
  413. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  414. package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
  415. package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
  416. package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
  417. package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  418. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
  419. package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
  420. package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
  421. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
  422. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
  423. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  424. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
  425. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  426. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  427. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
  428. package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
  429. package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
  430. package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
  431. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  432. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  433. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
  434. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
  435. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  436. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
  437. package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
  438. package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
  439. package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
  440. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
  441. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
  442. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
  443. package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
  444. package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
  445. package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
  446. package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
  447. package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
  448. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
  449. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
  450. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
  451. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
  452. package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
  453. package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
  454. package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
  455. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
  456. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
  457. package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
  458. package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
  459. package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
  460. package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
  461. package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
  462. package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
  463. package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
  464. package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
  465. package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
  466. package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
  467. package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
  468. package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  469. package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
  470. package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
  471. package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
  472. package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
  473. package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
  474. package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
  475. package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
  476. package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
  477. package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
  478. package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
  479. package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
  480. package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
  481. package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
  482. package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
  483. package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
  484. package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
  485. package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
  486. package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
  487. package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
  488. package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
  489. package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
  490. package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
  491. package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
  492. package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
  493. package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
  494. package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
  495. package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
  496. package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
  497. package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
  498. package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
  499. package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
  500. package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
  501. package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
  502. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
  503. package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
  504. package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
  505. package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
  506. package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
  507. package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
  508. package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
  509. package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
  510. package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
  511. package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
  512. package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
  513. package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
  514. package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
  515. package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
  516. package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
  517. package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
  518. package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
  519. package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
  520. package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
  521. package/repo-docs/SKILL.md +3 -7
  522. package/rewrite-commits/SKILL.md +2 -2
  523. package/scripts/build-openai-submission.js +158 -0
  524. package/scripts/installer.js +86 -11
  525. package/scripts/lib/advisory-text.js +25 -18
  526. package/scripts/lib/execution-contract.js +70 -0
  527. package/scripts/lib/manifest.js +34 -38
  528. package/scripts/lib/path-boundary.js +90 -0
  529. package/scripts/lib/skills.js +124 -70
  530. package/scripts/lib/workspace.js +269 -7
  531. package/scripts/sync-openai-plugin.js +91 -0
  532. package/scripts/sync-release-version.js +212 -0
  533. package/security-review/SKILL.md +4 -7
  534. package/security-review/scripts/audit-secrets.js +9 -8
  535. package/self-evolve/SKILL.md +9 -11
  536. package/self-evolve/references/memory-resolution.md +4 -1
  537. package/self-evolve/scripts/persist-memory.js +221 -88
  538. package/self-evolve/scripts/register-dynamic-skill.js +12 -10
  539. package/self-evolve/scripts/self-regression.js +23 -8
  540. package/skill-creator/SKILL.md +12 -14
  541. package/skill-creator/references/quality-checklist.md +1 -0
  542. package/skill-style/SKILL.md +4 -4
  543. package/skill-style/references/style-guide.md +29 -3
  544. package/submission/openai/README.md +67 -0
  545. package/submission/openai/listing.json +31 -0
  546. package/submission/openai/test-cases.json +61 -0
  547. package/tdd/SKILL.md +20 -26
  548. package/tdd/fixtures/pass-evidence.json +100 -0
  549. package/tdd/fixtures/quality-scenarios.json +20 -0
  550. package/tdd/references/core-discipline.md +2 -0
  551. package/tdd/references/integration-testing.md +13 -0
  552. package/tdd/references/quality-model.md +68 -0
  553. package/tdd/references/unit-testing.md +15 -0
  554. package/tdd/schemas/quality-evidence.schema.json +211 -0
  555. package/tdd/schemas/quality-report.schema.json +110 -0
  556. package/tdd/scripts/quality-gate.js +475 -0
  557. package/to-spec/SKILL.md +3 -5
  558. package/to-spec/scripts/check-project-docs.js +42 -62
  559. package/to-spec/scripts/project-docs-resolver.js +111 -0
  560. package/to-tickets/SKILL.md +4 -4
  561. package/todo-driven-workflow/SKILL.md +6 -4
  562. package/using-git-worktrees/SKILL.md +3 -3
  563. package/verification-loop/SKILL.md +4 -4
  564. package/verify-before-claim/SKILL.md +2 -2
  565. package/zoom-out/SKILL.md +4 -4
  566. package/ab-test-deep-analysis-2026-08-27.md +0 -383
  567. package/ab-test-results-2026-08-27.md +0 -152
  568. package/ab-test-statistical-analysis-31cases.md +0 -193
  569. package/opencode-plugin/hooks/circuit-breaker.js +0 -121
  570. package/opencode-plugin/hooks/compliance.js +0 -128
  571. package/opencode-plugin/hooks/post-edit.js +0 -62
  572. package/opencode-plugin/hooks/pre-complete.js +0 -65
  573. package/opencode-plugin/test-hook-firing.js +0 -198
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env node
2
+ // Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
3
+ // counters, handoff/verification timestamps, etc).
4
+ //
5
+ // Lives under a single user-global root - `getWorkspaceStateDir()` from
6
+ // scripts/lib/workspace.js, i.e. `~/.agents/harness-everything/workspaces/
7
+ // <slug-hash>/state/` - keyed by the workspace's real (symlink-resolved)
8
+ // path, NEVER by process.cwd() at invocation time. Earlier versions rooted
9
+ // state under `<workspace>/.claude/harness-everything/state/` (or the
10
+ // per-platform equivalent from hooks/scripts/lib/platforms/), which silently
11
+ // re-materialized in whatever directory a script happened to be invoked
12
+ // from - a test fixture, a worktree, a submodule - because the underlying
13
+ // workspace-root walk falls back to bare process.cwd() when no `.git`
14
+ // ancestor exists. Rooting at a fixed global location instead of a
15
+ // cwd-derived one closes that hole entirely (issue #42); migrateLegacyState()
16
+ // below moves any state a pre-fix install already scattered into a
17
+ // workspace, once, the first time that workspace is seen again.
18
+ //
19
+ // Session state keys under `sessions/<id>/` so two sessions open on the same
20
+ // workspace never share (and stomp) each other's edit/verify timestamps or
21
+ // breaker counts. Invocations with no session_id (manual terminal runs,
22
+ // VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
23
+ // rather than a random one, so manual testing stays predictable.
24
+ const fs = require('fs');
25
+ const path = require('path');
26
+ const { getWorkspaceRoot, getWorkspaceStateDir, resolveWorkspaceIdentity, getSessionId } = require('./workspace');
27
+
28
+ const CURRENT_SESSION_FILE = 'current-session';
29
+ const DEFAULT_SESSION = 'default';
30
+ const MIGRATION_MARKER = '.migrated-from';
31
+
32
+ function sessionDirectoryName(sessionId) {
33
+ const value = String(sessionId || DEFAULT_SESSION)
34
+ .replace(/[^A-Za-z0-9._-]+/g, '_')
35
+ .replace(/^\.+/, '')
36
+ .slice(0, 128);
37
+ return value || DEFAULT_SESSION;
38
+ }
39
+
40
+ function detectActivePlatform(wsRoot) {
41
+ const root = wsRoot || getWorkspaceRoot();
42
+
43
+ // 1. Explicit environment variables - strongest signal. Claude Code sets
44
+ // CLAUDECODE=1 / CLAUDE_CODE_ENTRYPOINT inside its own shell; a bare
45
+ // TERM_PROGRAM=vscode does NOT mean Copilot, because Claude Code's
46
+ // integrated terminal reports vscode too.
47
+ const env = process.env;
48
+ if (env.CLAUDE === '1' || env.CLAUDE || env.CLAUDECODE === '1' ||
49
+ env.CLAUDE_CODE === 'true' || env.CLAUDE_CODE_ENTRYPOINT) return 'claude';
50
+ if (env.CURSOR === '1' || env.CURSOR || env.CURSOR_AGENT) return 'cursor';
51
+ if (env.COPILOT === '1' || env.COPILOT || env.GITHUB_COPILOT_CHAT === 'true') return 'copilot';
52
+ if (env.CONTINUE === '1' || env.CONTINUE) return 'continue';
53
+
54
+ // 2. Workspace configuration presence - which platform's config actually
55
+ // lives here beats inferring from the terminal program.
56
+ if (fs.existsSync(path.join(root, '.claude', 'settings.json'))) return 'claude';
57
+ if (fs.existsSync(path.join(root, '.cursorrules'))) return 'cursor';
58
+ if (fs.existsSync(path.join(root, '.github', 'copilot-instructions.md'))) return 'copilot';
59
+ if (fs.existsSync(path.join(root, '.continue'))) return 'continue';
60
+ if (fs.existsSync(path.join(root, 'AGENTS.md'))) return 'codex';
61
+ if (fs.existsSync(path.join(root, '.hermes.md'))) return 'hermes';
62
+
63
+ // 3. Weak terminal inference, last resort only.
64
+ if (env.TERM_PROGRAM === 'vscode') return 'copilot';
65
+
66
+ return 'claude'; // Default global fallback
67
+ }
68
+
69
+ // Runtime hooks must NEVER touch .gitignore - that file is install/uninstall
70
+ // territory (scripts/installer.js -> lib/gitignore.js). Rewriting it on every
71
+ // hook invocation caused repeated diffs and surprised users mid-session.
72
+
73
+ // Move state a pre-#42 install left inside the workspace (under
74
+ // any platform's old `<workspaceRoot>/.<platform>/harness-everything/state/`
75
+ // - see hooks/scripts/lib/platforms/*.getStateDir()) into the new global
76
+ // location. Tries every platform's legacy dir, not just the currently
77
+ // detected one, since a workspace may have been used under a different
78
+ // platform (or misdetected) before this fix landed. The destination may
79
+ // already exist: migration merges every source into it without overwriting
80
+ // newer state. A source is removed only after its complete merge succeeds;
81
+ // failed/conflicting sources remain in place so a later invocation can retry.
82
+ function migrateLegacyState(wsRoot, newStateDir) {
83
+ const results = [];
84
+ if (!wsRoot) return results;
85
+ let allPlatforms;
86
+ try { allPlatforms = require('./platforms'); } catch (err) { allPlatforms = []; }
87
+ const legacySources = [path.join(wsRoot, '.harness', 'multi-agent')];
88
+ const seen = new Set();
89
+ for (const platform of allPlatforms) {
90
+ if (typeof platform.getStateDir !== 'function') continue;
91
+ let legacyDir;
92
+ try { legacyDir = platform.getStateDir(wsRoot); } catch (err) { continue; }
93
+ if (legacyDir) legacySources.push(legacyDir);
94
+ }
95
+ for (const legacyDir of legacySources) {
96
+ if (!legacyDir || path.resolve(legacyDir) === path.resolve(newStateDir)) continue;
97
+ const legacyKey = path.resolve(legacyDir).toLowerCase();
98
+ if (seen.has(legacyKey)) continue;
99
+ seen.add(legacyKey);
100
+ if (!fs.existsSync(legacyDir)) continue;
101
+ const target = path.basename(legacyDir) === 'multi-agent'
102
+ ? path.join(newStateDir, 'multi-agent')
103
+ : newStateDir;
104
+ try {
105
+ mergeLegacyTree(legacyDir, target);
106
+ fs.rmSync(legacyDir, { recursive: true, force: true });
107
+ try { appendMigrationMarker(newStateDir, legacyDir); } catch (markerError) {
108
+ // The source has already been removed; a missing breadcrumb must not
109
+ // be reported as a preserved source or make the migration retry.
110
+ }
111
+ results.push({ source: legacyDir, status: 'migrated' });
112
+ } catch (err) {
113
+ // Preserve the legacy source. A partial merge is safe to retry because
114
+ // identical destination files are skipped and conflicting files cause
115
+ // the source to remain available for manual recovery.
116
+ results.push({ source: legacyDir, status: 'preserved', error: err.message });
117
+ }
118
+ }
119
+ if (results.some(result => result.status === 'preserved')) {
120
+ writeMigrationReport(newStateDir, results);
121
+ }
122
+ return results;
123
+ }
124
+
125
+ function mergeLegacyTree(source, target) {
126
+ const sourceStat = fs.lstatSync(source);
127
+ if (!sourceStat.isDirectory()) throw new Error(`legacy state is not a directory: ${source}`);
128
+ fs.mkdirSync(target, { recursive: true });
129
+
130
+ for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
131
+ const from = path.join(source, entry.name);
132
+ const to = path.join(target, entry.name);
133
+ if (entry.isDirectory()) {
134
+ if (pathExists(to) && !fs.lstatSync(to).isDirectory()) {
135
+ throw new Error(`legacy state conflicts with a file: ${to}`);
136
+ }
137
+ mergeLegacyTree(from, to);
138
+ continue;
139
+ }
140
+ if (!entry.isFile()) {
141
+ throw new Error(`unsupported legacy state entry (preserved): ${from}`);
142
+ }
143
+ if (pathExists(to)) {
144
+ if (!fs.lstatSync(to).isFile() || !filesEqual(from, to)) {
145
+ throw new Error(`legacy state conflicts with existing state: ${to}`);
146
+ }
147
+ continue;
148
+ }
149
+ fs.mkdirSync(path.dirname(to), { recursive: true });
150
+ try {
151
+ fs.copyFileSync(from, to, fs.constants.COPYFILE_EXCL);
152
+ } catch (err) {
153
+ // A concurrent migration may have won the exclusive create. Accept it
154
+ // only when the resulting file is byte-for-byte identical; never let a
155
+ // race overwrite newer state.
156
+ if (err.code !== 'EEXIST' || !filesEqual(from, to)) throw err;
157
+ }
158
+ }
159
+ }
160
+
161
+ function pathExists(target) {
162
+ try { fs.lstatSync(target); return true; } catch (err) { return false; }
163
+ }
164
+
165
+ function filesEqual(left, right) {
166
+ try { return fs.readFileSync(left).equals(fs.readFileSync(right)); } catch (err) { return false; }
167
+ }
168
+
169
+ function appendMigrationMarker(newStateDir, legacyDir) {
170
+ fs.mkdirSync(newStateDir, { recursive: true });
171
+ const marker = path.join(newStateDir, MIGRATION_MARKER);
172
+ const prior = fs.existsSync(marker) ? fs.readFileSync(marker, 'utf8') : '';
173
+ const line = `${legacyDir}\t${new Date().toISOString()}\n`;
174
+ if (!prior.split('\n').some(existing => existing.startsWith(`${legacyDir}\t`))) {
175
+ fs.writeFileSync(marker, prior + line, 'utf8');
176
+ }
177
+ }
178
+
179
+ function writeMigrationReport(newStateDir, results) {
180
+ try {
181
+ const reportPath = path.join(path.dirname(newStateDir), 'migration-report.json');
182
+ let report = { version: 1, sources: [] };
183
+ if (fs.existsSync(reportPath)) {
184
+ try { report = JSON.parse(fs.readFileSync(reportPath, 'utf8')); } catch (err) { /* replace malformed report */ }
185
+ }
186
+ const bySource = new Map((report.sources || []).map(entry => [entry.source, entry]));
187
+ for (const result of results) bySource.set(result.source, { ...result, updatedAt: new Date().toISOString() });
188
+ report.sources = [...bySource.values()];
189
+ report.updatedAt = new Date().toISOString();
190
+ fs.mkdirSync(path.dirname(reportPath), { recursive: true });
191
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf8');
192
+ } catch (err) {
193
+ // The source directory remains the recovery record when the report itself
194
+ // cannot be written (for example, a read-only state home).
195
+ }
196
+ }
197
+
198
+ function getStateRoot(root, context) {
199
+ const wsRoot = root || getWorkspaceRoot(context);
200
+ const stateDir = path.join(getWorkspaceStateDir(wsRoot), 'state');
201
+ migrateLegacyState(wsRoot, stateDir);
202
+ return stateDir;
203
+ }
204
+
205
+ function getSessionDir(root, sessionId, context) {
206
+ const resolvedRoot = root || getWorkspaceRoot(context || (typeof sessionId === 'object' ? sessionId : undefined));
207
+ if (sessionId && typeof sessionId === 'object') sessionId = getSessionId(sessionId);
208
+ const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionDirectoryName(sessionId));
209
+ fs.mkdirSync(dir, { recursive: true });
210
+ return dir;
211
+ }
212
+
213
+ function listSessionDirs(root, context) {
214
+ const sessionsRoot = path.join(getStateRoot(root, context), 'sessions');
215
+ try {
216
+ return fs.readdirSync(sessionsRoot, { withFileTypes: true })
217
+ .filter(e => e.isDirectory())
218
+ .map(e => path.join(sessionsRoot, e.name));
219
+ } catch (err) {
220
+ return [];
221
+ }
222
+ }
223
+
224
+ function writeCurrentSession(root, sessionId) {
225
+ if (!sessionId) return;
226
+ try {
227
+ const wsRoot = root || getWorkspaceRoot();
228
+ const stateRoot = getStateRoot(wsRoot);
229
+ fs.mkdirSync(stateRoot, { recursive: true });
230
+ fs.writeFileSync(path.join(stateRoot, CURRENT_SESSION_FILE), sessionId, 'utf8');
231
+ } catch (err) {
232
+ // Best-effort - only the manual reset-circuit-breaker.js escape hatch
233
+ // depends on this, and it fails open too.
234
+ }
235
+ }
236
+
237
+ function readCurrentSession(root) {
238
+ try {
239
+ const id = fs.readFileSync(path.join(getStateRoot(root), CURRENT_SESSION_FILE), 'utf8').trim();
240
+ return id || null;
241
+ } catch (err) {
242
+ return null;
243
+ }
244
+ }
245
+
246
+ // Bootstrap-time housekeeping: nothing purges stale session directories the
247
+ // way an OS temp dir would, so SessionStart drops ones untouched for a while.
248
+ function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
249
+ const now = Date.now();
250
+ for (const dir of listSessionDirs(root)) {
251
+ try {
252
+ if (now - fs.statSync(dir).mtimeMs > maxAgeMs) {
253
+ fs.rmSync(dir, { recursive: true, force: true });
254
+ }
255
+ } catch (err) {
256
+ // Ignore - worst case a stale dir lingers until the next prune.
257
+ }
258
+ }
259
+ }
260
+
261
+ module.exports = {
262
+ DEFAULT_SESSION,
263
+ sessionDirectoryName,
264
+ getWorkspaceRoot,
265
+ getSessionId,
266
+ resolveWorkspaceIdentity,
267
+ detectActivePlatform,
268
+ getStateRoot,
269
+ getSessionDir,
270
+ listSessionDirs,
271
+ migrateLegacyState,
272
+ writeCurrentSession,
273
+ readCurrentSession,
274
+ pruneStaleSessions,
275
+ };
@@ -0,0 +1,168 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+
4
+ const CLAUDE_PLUGIN_ROOT_TOKEN = '${CLAUDE_PLUGIN_ROOT}';
5
+
6
+ // Removes legacy static-skill subfolders left behind by the pre-0.2.2 bug
7
+ // that installed skills to .claude/harness-everything/skills/ instead of the
8
+ // native .claude/skills/, WITHOUT touching skills/generated/ - self-evolve
9
+ // stores the user's own dynamically-generated skills there (see
10
+ // skill-creator/SKILL.md §4), and a blind recursive rmSync on the whole
11
+ // skills/ folder would silently delete that accumulated learning.
12
+ function cleanupLegacySkillsDir(oldSkillsDir) {
13
+ if (!fs.existsSync(oldSkillsDir)) return;
14
+ try {
15
+ const entries = fs.readdirSync(oldSkillsDir, { withFileTypes: true });
16
+ let removedAny = false;
17
+ for (const entry of entries) {
18
+ if (entry.name === 'generated') continue;
19
+ fs.rmSync(path.join(oldSkillsDir, entry.name), { recursive: true, force: true });
20
+ removedAny = true;
21
+ }
22
+ if (fs.readdirSync(oldSkillsDir).length === 0) fs.rmdirSync(oldSkillsDir);
23
+ if (removedAny) console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/ (preserved skills/generated/ - self-evolve's own dynamic skills)`);
24
+ } catch (e) {
25
+ console.warn(` ⚠️ Failed to clean up legacy skills folder: ${e.message}`);
26
+ }
27
+ }
28
+
29
+ function resolveClaudeHookCommand(command, harnessSourceDir) {
30
+ return command.replace(/^node\s+"?([^"\s]+)"?/, (match, scriptPath) => {
31
+ let abs;
32
+ if (scriptPath === CLAUDE_PLUGIN_ROOT_TOKEN || scriptPath.startsWith(`${CLAUDE_PLUGIN_ROOT_TOKEN}/`) || scriptPath.startsWith(`${CLAUDE_PLUGIN_ROOT_TOKEN}\\`)) {
33
+ const relative = scriptPath
34
+ .slice(CLAUDE_PLUGIN_ROOT_TOKEN.length)
35
+ .replace(/^[/\\]+/, '');
36
+ abs = path.join(harnessSourceDir, relative);
37
+ } else {
38
+ abs = path.isAbsolute(scriptPath) ? scriptPath : path.join(harnessSourceDir, scriptPath);
39
+ }
40
+ return `node "${abs}"`;
41
+ });
42
+ }
43
+
44
+ // Claude Code has native project-skill directory: .claude/skills/.
45
+ // Runtime state converges into .claude/harness-everything/.
46
+ module.exports = {
47
+ name: 'claude',
48
+ label: 'Claude Code',
49
+ getHarnessDir(workspaceRoot) { return path.join(workspaceRoot, '.claude', 'harness-everything'); },
50
+ getStateDir(workspaceRoot) { return path.join(this.getHarnessDir(workspaceRoot), 'state'); },
51
+ getSkillsDir(workspaceRoot) { return path.join(workspaceRoot, '.claude', 'skills'); },
52
+ getIgnorePatterns(workspaceRoot) {
53
+ const patterns = ['.claude/harness-everything/'];
54
+ const skillsDir = path.join(workspaceRoot, '.claude', 'skills');
55
+ if (fs.existsSync(skillsDir)) {
56
+ try {
57
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
58
+ for (const entry of entries) {
59
+ if (!entry.isDirectory()) continue;
60
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
61
+ if (!fs.existsSync(skillMdPath)) continue;
62
+ const content = fs.readFileSync(skillMdPath, 'utf8');
63
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
64
+ if (authorLine && authorLine.includes('Miya Daniel')) patterns.push(`.claude/skills/${entry.name}/`);
65
+ }
66
+ } catch (e) {
67
+ // Fallback or ignore to prevent breaking execution
68
+ }
69
+ }
70
+ const agentsDir = path.join(workspaceRoot, '.claude', 'agents');
71
+ if (fs.existsSync(agentsDir)) {
72
+ try {
73
+ for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
74
+ if (!entry.isFile() || !/^fable-(?:orchestrator|verifier|worker-haiku|worker-sonnet)\.md$/i.test(entry.name)) continue;
75
+ const content = fs.readFileSync(path.join(agentsDir, entry.name), 'utf8');
76
+ if (/^name:\s*fable-/mi.test(content)) patterns.push(`.claude/agents/${entry.name}`);
77
+ }
78
+ } catch (e) {
79
+ // Fallback or ignore to prevent breaking installation.
80
+ }
81
+ }
82
+ return patterns;
83
+ },
84
+ isMatch(pattern, trimmedLine) {
85
+ if (trimmedLine === '.claude/' || trimmedLine === '.claude') return true;
86
+ if (pattern === '.claude/harness-everything/') {
87
+ return trimmedLine === '.claude/harness-everything' || trimmedLine === '.claude/harness-everything/';
88
+ }
89
+ return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
90
+ },
91
+ isInstalled(workspaceRoot, userHome, isGlobal) {
92
+ return fs.existsSync(path.join(isGlobal ? userHome : workspaceRoot, '.claude', 'settings.json'));
93
+ },
94
+ getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
95
+ const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(workspaceRoot, '.claude');
96
+ return {
97
+ path: path.join(claudeDir, 'skills'),
98
+ label: isGlobal ? '~/.claude/skills/' : '.claude/skills/',
99
+ manifestPath: manifest.getManifestPath(claudeDir)
100
+ };
101
+ },
102
+ getAgentsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
103
+ const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(workspaceRoot, '.claude');
104
+ return {
105
+ path: path.join(claudeDir, 'agents'),
106
+ label: isGlobal ? '~/.claude/agents/' : '.claude/agents/',
107
+ manifestPath: manifest.getManifestPath(claudeDir)
108
+ };
109
+ },
110
+ install({ isGlobal, targetWorkspaceRoot, harnessSourceDir, packageVersion, claudeHooks, manifest }) {
111
+ const userHome = require('os').homedir();
112
+ const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(targetWorkspaceRoot, '.claude');
113
+ if (!fs.existsSync(claudeDir)) {
114
+ fs.mkdirSync(claudeDir, { recursive: true });
115
+ console.log(` Created ${isGlobal ? '~/.claude' : '.claude'} directory`);
116
+ }
117
+ const claudeSettingsFile = path.join(claudeDir, 'settings.json');
118
+ let claudeConfig = {};
119
+ if (fs.existsSync(claudeSettingsFile)) {
120
+ try {
121
+ claudeConfig = JSON.parse(fs.readFileSync(claudeSettingsFile, 'utf8'));
122
+ } catch (e) {
123
+ throw new Error(`Refusing to modify malformed ${isGlobal ? '~/' : ''}.claude/settings.json: ${e.message}`);
124
+ }
125
+ }
126
+
127
+ const sourceHooksFile = path.join(harnessSourceDir, 'hooks', 'hooks.json');
128
+ if (fs.existsSync(sourceHooksFile)) {
129
+ const sourceHooksObj = JSON.parse(fs.readFileSync(sourceHooksFile, 'utf8'));
130
+ const resolvedHooks = {};
131
+ for (const [hookType, hookList] of Object.entries(sourceHooksObj.hooks || {})) {
132
+ resolvedHooks[hookType] = hookList.map(hookItem => {
133
+ const cloned = JSON.parse(JSON.stringify(hookItem));
134
+ if (cloned.hooks) {
135
+ cloned.hooks = cloned.hooks.map(h => {
136
+ if (h.type === 'command' && h.command) {
137
+ h.command = resolveClaudeHookCommand(h.command, harnessSourceDir);
138
+ }
139
+ return h;
140
+ });
141
+ }
142
+ cloned.harness = { package: manifest.PACKAGE_NAME, version: packageVersion, author: manifest.HARNESS_AUTHOR };
143
+ return cloned;
144
+ });
145
+ }
146
+ claudeHooks.mergeHarnessHooks(claudeConfig, resolvedHooks);
147
+ }
148
+
149
+ fs.writeFileSync(claudeSettingsFile, JSON.stringify(claudeConfig, null, 2), 'utf8');
150
+ console.log(` ✅ Configured Claude Code hooks safely in ${isGlobal ? '~' : ''}/.claude/settings.json`);
151
+ cleanupLegacySkillsDir(path.join(claudeDir, 'harness-everything', 'skills'));
152
+ },
153
+ uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, claudeHooks, cleanEmptyDirs }) {
154
+ if (removeLocal) {
155
+ const localSettingsFile = path.join(workspaceRoot, '.claude', 'settings.json');
156
+ claudeHooks.removeHarnessHooks(localSettingsFile);
157
+ cleanupLegacySkillsDir(path.join(workspaceRoot, '.claude', 'harness-everything', 'skills'));
158
+ }
159
+ if (removeGlobal) {
160
+ const globalSettingsFile = path.join(userHome, '.claude', 'settings.json');
161
+ claudeHooks.removeHarnessHooks(globalSettingsFile);
162
+ cleanEmptyDirs(path.join(userHome, '.claude'), [userHome]);
163
+ }
164
+ },
165
+ resolveHookCommand(command, harnessSourceDir) {
166
+ return resolveClaudeHookCommand(command, harnessSourceDir);
167
+ }
168
+ };
@@ -0,0 +1,88 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+
4
+ // Codex discovers project Agent Skills from repo-scoped `.agents/skills/`
5
+ // (walking from cwd toward the repository root). Keep project skills at that
6
+ // native shared location so every installer mode, including `--copy`, remains
7
+ // discoverable. Codex-specific runtime/install bookkeeping still lives under
8
+ // `.codex/harness-everything/`.
9
+ module.exports = {
10
+ name: 'codex',
11
+ label: 'Codex',
12
+ getHarnessDir(workspaceRoot) { return path.join(workspaceRoot, '.codex', 'harness-everything'); },
13
+ getStateDir(workspaceRoot) { return path.join(this.getHarnessDir(workspaceRoot), 'state'); },
14
+ getSkillsDir(workspaceRoot) { return path.join(workspaceRoot, '.agents', 'skills'); },
15
+ getIgnorePatterns(workspaceRoot) {
16
+ const patterns = ['.codex/harness-everything/'];
17
+ const skillsDir = path.join(workspaceRoot, '.agents', 'skills');
18
+ if (fs.existsSync(skillsDir)) {
19
+ try {
20
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
21
+ if (!entry.isDirectory()) continue;
22
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
23
+ if (!fs.existsSync(skillMdPath)) continue;
24
+ const content = fs.readFileSync(skillMdPath, 'utf8');
25
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
26
+ if (authorLine && authorLine.includes('Miya Daniel')) patterns.push(`.agents/skills/${entry.name}/`);
27
+ }
28
+ } catch (e) {
29
+ // Fallback or ignore to prevent breaking execution
30
+ }
31
+ }
32
+ return patterns;
33
+ },
34
+ isMatch(pattern, trimmedLine) {
35
+ if (trimmedLine === '.codex/' || trimmedLine === '.codex') return pattern === '.codex/harness-everything/';
36
+ if (trimmedLine === '.agents/' || trimmedLine === '.agents') return pattern.startsWith('.agents/skills/');
37
+ if (pattern === '.codex/harness-everything/') {
38
+ return trimmedLine === '.codex/harness-everything' || trimmedLine === '.codex/harness-everything/';
39
+ }
40
+ return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
41
+ },
42
+ isInstalled(workspaceRoot, userHome, isGlobal) {
43
+ if (isGlobal) return false;
44
+ return fs.existsSync(path.join(workspaceRoot, 'AGENTS.md'));
45
+ },
46
+ getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
47
+ if (isGlobal) {
48
+ const globalAgentsDir = path.join(userHome, '.agents');
49
+ return {
50
+ path: path.join(globalAgentsDir, 'skills'),
51
+ label: '~/.agents/skills/',
52
+ manifestPath: manifest.getManifestPath(globalAgentsDir),
53
+ };
54
+ }
55
+ const codexDir = path.join(workspaceRoot, '.codex');
56
+ return {
57
+ path: path.join(workspaceRoot, '.agents', 'skills'),
58
+ label: '.agents/skills/',
59
+ manifestPath: manifest.getManifestPath(codexDir),
60
+ };
61
+ },
62
+ install({ isGlobal, targetWorkspaceRoot, getUserPromptsDir, advisory }) {
63
+ if (!isGlobal) {
64
+ const targetFile = path.join(targetWorkspaceRoot, 'AGENTS.md');
65
+ advisory.injectAdvisoryText(targetFile, '# AGENTS.md', 'AGENTS.md');
66
+ return;
67
+ }
68
+ const promptsDir = getUserPromptsDir();
69
+ if (!fs.existsSync(promptsDir)) fs.mkdirSync(promptsDir, { recursive: true });
70
+ const vscodeAgentFile = path.join(promptsDir, 'harness.agent.md');
71
+ advisory.assertHarnessOwnedOrAbsent(vscodeAgentFile, 'global Codex agent');
72
+ fs.writeFileSync(vscodeAgentFile, advisory.buildCodexGlobalContent(), 'utf8');
73
+ console.log(` ✅ Installed global Codex agent to VS Code: ${vscodeAgentFile}`);
74
+ },
75
+ uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, cleanEmptyDirs }) {
76
+ const advisory = require('../../../../scripts/lib/advisory-text');
77
+ if (removeLocal) advisory.removeAdvisoryText(path.join(workspaceRoot, 'AGENTS.md'));
78
+ if (removeGlobal) {
79
+ const promptsDir = getUserPromptsDir();
80
+ const vscodeAgentFile = path.join(promptsDir, 'harness.agent.md');
81
+ if (fs.existsSync(vscodeAgentFile) && advisory.hasHarnessMarker(fs.readFileSync(vscodeAgentFile, 'utf8'))) {
82
+ fs.unlinkSync(vscodeAgentFile);
83
+ console.log(` ✅ Removed global Codex agent: ${vscodeAgentFile}`);
84
+ }
85
+ cleanEmptyDirs(promptsDir, [userHome]);
86
+ }
87
+ }
88
+ };
@@ -0,0 +1,91 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+
4
+ // The reviewed official Continue documentation establishes `.continue/rules/`,
5
+ // not a native `SKILL.md` discovery contract. Keep these paths as explicit
6
+ // installer adapter targets without claiming that Continue will load them.
7
+ module.exports = {
8
+ name: 'continue',
9
+ label: 'Continue.dev',
10
+ getHarnessDir(workspaceRoot) {
11
+ return path.join(workspaceRoot, '.continue', 'harness-everything');
12
+ },
13
+ getStateDir(workspaceRoot) {
14
+ return path.join(this.getHarnessDir(workspaceRoot), 'state');
15
+ },
16
+ getSkillsDir(workspaceRoot) {
17
+ return path.join(workspaceRoot, '.continue', 'skills');
18
+ },
19
+ getIgnorePatterns(workspaceRoot) {
20
+ const patterns = ['.continue/harness-everything/'];
21
+ const skillsDir = path.join(workspaceRoot, '.continue', 'skills');
22
+ if (fs.existsSync(skillsDir)) {
23
+ try {
24
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ if (entry.isDirectory()) {
27
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
28
+ if (fs.existsSync(skillMdPath)) {
29
+ const content = fs.readFileSync(skillMdPath, 'utf8');
30
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
31
+ if (authorLine && (authorLine.includes('Miya Daniel'))) {
32
+ patterns.push(`.continue/skills/${entry.name}/`);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ } catch (e) {
38
+ // Fallback or ignore to prevent breaking execution
39
+ }
40
+ }
41
+ return patterns;
42
+ },
43
+ isMatch(pattern, trimmedLine) {
44
+ if (trimmedLine === '.continue/' || trimmedLine === '.continue') {
45
+ return true;
46
+ }
47
+ if (pattern === '.continue/harness-everything/') {
48
+ return trimmedLine === '.continue/harness-everything' ||
49
+ trimmedLine === '.continue/harness-everything/';
50
+ }
51
+ return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
52
+ },
53
+ isInstalled(workspaceRoot, userHome, isGlobal) {
54
+ if (isGlobal) {
55
+ return fs.existsSync(path.join(userHome, '.continue', 'rules', 'harness.md'));
56
+ }
57
+ return fs.existsSync(path.join(workspaceRoot, '.continue', 'rules', 'harness.md'));
58
+ },
59
+ getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
60
+ if (isGlobal) {
61
+ const continueDir = path.join(userHome, '.continue');
62
+ return {
63
+ path: path.join(continueDir, 'skills'),
64
+ label: '~/.continue/skills/',
65
+ manifestPath: manifest.getManifestPath(continueDir),
66
+ };
67
+ } else {
68
+ const continueDir = path.join(workspaceRoot, '.continue');
69
+ return {
70
+ path: path.join(continueDir, 'skills'),
71
+ label: '.continue/skills/',
72
+ manifestPath: manifest.getManifestPath(continueDir),
73
+ };
74
+ }
75
+ },
76
+ install({ isGlobal, targetWorkspaceRoot, userHome, advisory, workspaceRoot }) {
77
+ const targetFile = isGlobal ? path.join(userHome, '.continue', 'rules', 'harness.md') : path.join(targetWorkspaceRoot, '.continue', 'rules', 'harness.md');
78
+ advisory.installContinueRule(targetFile, isGlobal ? '~/.continue/rules/harness.md' : '.continue/rules/harness.md');
79
+ },
80
+ uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, cleanEmptyDirs }) {
81
+ const advisory = require('../../../../scripts/lib/advisory-text');
82
+ if (removeLocal) {
83
+ advisory.removeContinueRule(path.join(workspaceRoot, '.continue', 'rules', 'harness.md'));
84
+ cleanEmptyDirs(path.join(workspaceRoot, '.continue', 'rules'), [workspaceRoot, userHome]);
85
+ }
86
+ if (removeGlobal) {
87
+ advisory.removeContinueRule(path.join(userHome, '.continue', 'rules', 'harness.md'));
88
+ cleanEmptyDirs(path.join(userHome, '.continue', 'rules'), [userHome]);
89
+ }
90
+ }
91
+ };