harness-everything 0.3.6 → 0.4.1

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 (580) 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/behavioral-evals.yml +3 -3
  5. package/.github/workflows/ci.yml +49 -28
  6. package/.github/workflows/release.yml +52 -27
  7. package/.nvmrc +1 -0
  8. package/.releaserc.json +113 -0
  9. package/AGENTS.md +44 -24
  10. package/BENCHMARK_SOP.md +38 -18
  11. package/CHANGELOG.md +196 -3
  12. package/CONTRIBUTING.md +37 -9
  13. package/Dockerfile +1 -1
  14. package/PRIVACY.md +25 -0
  15. package/README.md +126 -91
  16. package/RELEASING.md +93 -0
  17. package/SUPPORT.md +27 -0
  18. package/TERMS.md +21 -0
  19. package/VERIFICATION.md +192 -284
  20. package/behavioral-evals/README.md +21 -0
  21. package/behavioral-evals/case-validator.js +194 -0
  22. package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
  23. package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
  24. package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
  25. package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
  26. package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
  27. package/behavioral-evals/cases/baseline-git-commit.yaml +2 -2
  28. package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
  29. package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
  30. package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
  31. package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
  32. package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
  33. package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
  34. package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
  35. package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
  36. package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
  37. package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
  38. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +2 -2
  39. package/behavioral-evals/cases/pressure-complexity-skip.yaml +2 -2
  40. package/behavioral-evals/cases/pressure-scope-bypass.yaml +7 -2
  41. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +7 -4
  42. package/behavioral-evals/cases/scope-discipline.yaml +2 -1
  43. package/behavioral-evals/cases/verify-before-done.yaml +7 -5
  44. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
  45. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
  46. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
  47. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
  48. package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
  49. package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
  50. package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
  51. package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
  52. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
  53. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
  54. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
  55. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
  56. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
  57. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
  58. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
  59. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
  60. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
  61. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
  62. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
  63. package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
  64. package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
  65. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
  66. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
  67. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
  68. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
  69. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
  70. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
  71. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
  72. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
  73. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
  74. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
  75. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
  76. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
  77. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
  78. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
  79. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
  80. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
  81. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
  82. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
  83. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
  84. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
  85. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
  86. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
  87. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
  88. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
  89. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
  90. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
  91. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
  92. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
  93. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  94. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
  95. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
  96. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
  97. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  98. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
  99. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
  100. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
  101. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
  102. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
  103. package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
  104. package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
  105. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
  106. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
  107. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
  108. package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
  109. package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
  110. package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
  111. package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
  112. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
  113. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
  114. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
  115. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
  116. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
  117. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
  118. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
  119. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
  120. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
  121. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
  122. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
  123. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
  124. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
  125. package/behavioral-evals/evidence-tool.js +443 -0
  126. package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
  127. package/behavioral-evals/fixtures/claude-legacy.json +1 -0
  128. package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
  129. package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
  130. package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
  131. package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
  132. package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
  133. package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
  134. package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
  135. package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
  136. package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
  137. package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
  138. package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
  139. package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
  140. package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
  141. package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
  142. package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
  143. package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
  144. package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
  145. package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
  146. package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
  147. package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
  148. package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
  149. package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
  150. package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
  151. package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
  152. package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
  153. package/behavioral-evals/run-with-plugin.js +15 -31
  154. package/behavioral-evals/run.js +446 -105
  155. package/behavioral-evals/transcript-parser.js +591 -0
  156. package/bin/cli.js +24 -12
  157. package/ci/ab-test-cases/grill-me-adversarial.yaml +14 -4
  158. package/ci/ab-test-cases/tdd-test-first.yaml +13 -6
  159. package/ci/ab-test-cases/verification-loop-gates.yaml +20 -7
  160. package/ci/ab-test-cases/verify-before-claim-cites.yaml +7 -6
  161. package/ci/ab-test-harness.js +113 -38
  162. package/ci/action-gate-platform-doc.test.js +31 -0
  163. package/ci/action-gate.test.js +260 -0
  164. package/ci/cases/case2.json +2 -2
  165. package/ci/consistency-check.js +51 -5
  166. package/ci/description-collision.js +15 -6
  167. package/ci/disclosure-check.js +225 -0
  168. package/ci/doc-capability-consistency.test.js +180 -0
  169. package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
  170. package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
  171. package/ci/installer-roundtrip.test.js +159 -0
  172. package/ci/invariant-routing.test.js +74 -0
  173. package/ci/issue99-runtime.test.js +218 -0
  174. package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
  175. package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
  176. package/ci/mechanism-2j-behavioral-runner.test.js +43 -1
  177. package/ci/mechanism-2k-reference-check.test.js +57 -2
  178. package/ci/mechanism-2l-multi-agent-workspace.test.js +202 -6
  179. package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
  180. package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
  181. package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
  182. package/ci/mechanism-2p-installer-links.test.js +183 -0
  183. package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
  184. package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
  185. package/ci/mechanism-2s-tdd-quality.test.js +203 -0
  186. package/ci/mechanism-2t-disclosure.test.js +90 -0
  187. package/ci/mechanism-2t-evidence-triage.test.js +200 -0
  188. package/ci/mechanism-2t-issue-20.test.js +75 -0
  189. package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
  190. package/ci/mechanism-2t-transcript-parser.test.js +179 -0
  191. package/ci/mechanism-2t-workspace-identity.test.js +200 -0
  192. package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
  193. package/ci/mechanism-2u-issue-44.test.js +35 -0
  194. package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
  195. package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
  196. package/ci/mechanism-2x-release-automation.test.js +157 -0
  197. package/ci/mechanism-2x-release-commit-message.test.js +66 -0
  198. package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
  199. package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
  200. package/ci/mutation-check.js +53 -0
  201. package/ci/mutation-loader.js +57 -0
  202. package/ci/negative-controls.js +76 -46
  203. package/ci/openai-plugin-package.test.js +182 -0
  204. package/ci/openai-plugin-runtime.test.js +175 -0
  205. package/ci/openai-plugin-submission.test.js +101 -0
  206. package/ci/phase4-ensemble-memory.test.js +307 -0
  207. package/ci/reference-check.js +73 -25
  208. package/ci/release-consistency-check.js +24 -1
  209. package/ci/repository-contract.test.js +17 -0
  210. package/ci/router-phase2-safety.test.js +81 -0
  211. package/ci/router-workflow-plan.test.js +264 -0
  212. package/ci/routing-check.js +6 -5
  213. package/ci/runner.js +6 -5
  214. package/ci/skill-routing-check.js +48 -11
  215. package/ci/test-behavioral-case-validation.js +62 -0
  216. package/ci/test-helper.js +10 -0
  217. package/ci/workflow-plan-consumers-edge.test.js +72 -0
  218. package/ci/workflow-plan-consumers.test.js +276 -0
  219. package/docs/architecture.md +137 -57
  220. package/docs/audit.md +22 -20
  221. package/docs/codex-action-gate.md +90 -0
  222. package/docs/issue-20-rollup.md +47 -0
  223. package/docs/mechanism-first-skill-mesh.md +22 -20
  224. package/docs/openai-plugin.md +118 -0
  225. package/docs/philosophy.md +28 -17
  226. package/docs/platform-capabilities.md +73 -0
  227. package/docs/platform-compatibility.json +270 -0
  228. package/docs/reflection.md +37 -22
  229. package/docs/release-evidence.md +27 -0
  230. package/docs/repository-contract.md +27 -0
  231. package/docs/routing.md +157 -44
  232. package/docs/security-audit.md +38 -0
  233. package/docs/troubleshooting.md +94 -51
  234. package/docs/verifier-boundaries.md +45 -0
  235. package/docs/workflows/fable-mode.md +77 -21
  236. package/docs/workflows/find-skills.md +40 -0
  237. package/docs/workflows/grill-with-docs.md +2 -2
  238. package/docs/workflows/multi-agent-workspace.md +22 -10
  239. package/docs/workflows/self-evolve.md +33 -0
  240. package/docs/workflows/tdd.md +36 -0
  241. package/docs/workflows/todo-driven-workflow.md +33 -0
  242. package/environment-detection/SKILL.md +3 -3
  243. package/eval-harness/SKILL.md +7 -7
  244. package/eval-harness/scripts/evaluate.js +12 -10
  245. package/evals/evaluation-reports.md +14 -0
  246. package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
  247. package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
  248. package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
  249. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +1 -1
  250. package/fable-discipline/SKILL.md +2 -2
  251. package/fable-mode/CONTRACT-FORMAT.md +147 -33
  252. package/fable-mode/SKILL.md +3 -3
  253. package/fable-mode/agents/fable-orchestrator.md +95 -35
  254. package/fable-mode/execution-guardrails/SKILL.md +2 -2
  255. package/fable-mode/fable-haiku/SKILL.md +3 -3
  256. package/fable-mode/fable-opus/SKILL.md +3 -3
  257. package/fable-mode/fable-sonnet/SKILL.md +3 -3
  258. package/fable-mode/scripts/ensemble-review.js +371 -0
  259. package/fable-mode/scripts/model-selector.js +134 -3
  260. package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  261. package/find-skills/SKILL.md +5 -5
  262. package/find-skills/references/discovery-flow.md +1 -1
  263. package/find-skills/scripts/use-skill.js +7 -1
  264. package/git-commit/SKILL.md +4 -11
  265. package/grill-me/SKILL.md +5 -5
  266. package/grill-with-docs/SKILL.md +7 -7
  267. package/grill-with-docs/references/session-playbook.md +6 -4
  268. package/harness-everything/SKILL.md +23 -22
  269. package/harness-everything/references/router-workflow-plan.md +128 -0
  270. package/harness-everything/references/triage-and-tiers.md +173 -96
  271. package/harness-everything/schemas/router-task-shape.schema.json +126 -0
  272. package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  273. package/harness-everything/scripts/bootstrap.js +13 -4
  274. package/harness-everything/scripts/ensemble-policy.js +102 -0
  275. package/harness-everything/scripts/kernel-router.js +212 -0
  276. package/harness-everything/scripts/router-contract.js +612 -0
  277. package/harness-everything/scripts/self-heal.js +29 -20
  278. package/harness-everything/scripts/tier-router.js +346 -221
  279. package/hooks/hooks.json +60 -15
  280. package/hooks/scripts/action-gate-rules.json +77 -0
  281. package/hooks/scripts/action-gate.js +528 -0
  282. package/hooks/scripts/atomic-commit-check.js +5 -5
  283. package/hooks/scripts/codex-action-gate-post.js +46 -0
  284. package/hooks/scripts/codex-permission-request.js +140 -0
  285. package/hooks/scripts/context-compact.js +4 -3
  286. package/hooks/scripts/contract-test.js +118 -51
  287. package/hooks/scripts/lib/fable-contracts.js +121 -0
  288. package/hooks/scripts/lib/harness-state.js +164 -28
  289. package/hooks/scripts/lib/platforms/claude.js +45 -62
  290. package/hooks/scripts/lib/platforms/codex.js +35 -61
  291. package/hooks/scripts/lib/platforms/continue.js +7 -7
  292. package/hooks/scripts/lib/platforms/copilot.js +29 -53
  293. package/hooks/scripts/lib/platforms/hermes.js +71 -20
  294. package/hooks/scripts/openai-session-start.js +81 -0
  295. package/hooks/scripts/rule-of-3-tracker.js +9 -8
  296. package/hooks/scripts/rule-of-3.js +29 -21
  297. package/hooks/scripts/state-persist.js +5 -4
  298. package/hooks/scripts/stop-gate.js +2 -2
  299. package/hooks/scripts/subagent-scope-guard.js +144 -38
  300. package/hooks/scripts/subagent-start.js +19 -0
  301. package/hooks/scripts/subagent-stop.js +6 -0
  302. package/improve-codebase-architecture/SKILL.md +2 -4
  303. package/improve-codebase-architecture/references/README.md +16 -0
  304. package/install-cognitive-os/SKILL.md +28 -22
  305. package/multi-agent-workspace/SKILL.md +16 -15
  306. package/multi-agent-workspace/references/architecture-guide.md +13 -9
  307. package/multi-agent-workspace/references/orchestration.md +39 -22
  308. package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  309. package/multi-agent-workspace/scripts/index_memory.js +79 -26
  310. package/multi-agent-workspace/scripts/path-boundary.js +59 -0
  311. package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  312. package/multi-agent-workspace/scripts/scaffold.js +258 -103
  313. package/multi-agent-workspace/templates/AGENTS.md +20 -0
  314. package/multi-agent-workspace/workflows/03-generation.md +8 -10
  315. package/multi-agent-workspace/workflows/04-launcher.md +5 -5
  316. package/opencode-plugin/README.md +114 -71
  317. package/opencode-plugin/hooks/verify.js +62 -12
  318. package/opencode-plugin/index.mjs +547 -0
  319. package/opencode-plugin/plugin.json +4 -12
  320. package/package.json +20 -4
  321. package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
  322. package/plugins/harness-everything/hooks/hooks.json +197 -0
  323. package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
  324. package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
  325. package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
  326. package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
  327. package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
  328. package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
  329. package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
  330. package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
  331. package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
  332. package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
  333. package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
  334. package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
  335. package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
  336. package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
  337. package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
  338. package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
  339. package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
  340. package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
  341. package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
  342. package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
  343. package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
  344. package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
  345. package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
  346. package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
  347. package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
  348. package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
  349. package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
  350. package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
  351. package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
  352. package/plugins/harness-everything/hooks/session-start.js +81 -0
  353. package/plugins/harness-everything/plugin.json +43 -0
  354. package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
  355. package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
  356. package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
  357. package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
  358. package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
  359. package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
  360. package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
  361. package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
  362. package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
  363. package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
  364. package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
  365. package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
  366. package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
  367. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
  368. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
  369. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
  370. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  371. package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
  372. package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  373. package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
  374. package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
  375. package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
  376. package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
  377. package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
  378. package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
  379. package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
  380. package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  381. package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
  382. package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
  383. package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
  384. package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
  385. package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
  386. package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
  387. package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
  388. package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
  389. package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
  390. package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
  391. package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
  392. package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
  393. package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  394. package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
  395. package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
  396. package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
  397. package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
  398. package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
  399. package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
  400. package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
  401. package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
  402. package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
  403. package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
  404. package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  405. package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
  406. package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
  407. package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
  408. package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
  409. package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
  410. package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
  411. package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
  412. package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
  413. package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
  414. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
  415. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
  416. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
  417. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
  418. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  419. package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
  420. package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
  421. package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
  422. package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  423. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
  424. package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
  425. package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
  426. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
  427. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
  428. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  429. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
  430. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  431. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  432. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
  433. package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
  434. package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
  435. package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
  436. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  437. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  438. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
  439. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
  440. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  441. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
  442. package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
  443. package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
  444. package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
  445. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
  446. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
  447. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
  448. package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
  449. package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
  450. package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
  451. package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
  452. package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
  453. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
  454. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
  455. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
  456. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
  457. package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
  458. package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
  459. package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
  460. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
  461. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
  462. package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
  463. package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
  464. package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
  465. package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
  466. package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
  467. package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
  468. package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
  469. package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
  470. package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
  471. package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
  472. package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
  473. package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  474. package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
  475. package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
  476. package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
  477. package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
  478. package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
  479. package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
  480. package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
  481. package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
  482. package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
  483. package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
  484. package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
  485. package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
  486. package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
  487. package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
  488. package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
  489. package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
  490. package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
  491. package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
  492. package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
  493. package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
  494. package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
  495. package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
  496. package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
  497. package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
  498. package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
  499. package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
  500. package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
  501. package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
  502. package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
  503. package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
  504. package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
  505. package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
  506. package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
  507. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
  508. package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
  509. package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
  510. package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
  511. package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
  512. package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
  513. package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
  514. package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
  515. package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
  516. package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
  517. package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
  518. package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
  519. package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
  520. package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
  521. package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
  522. package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
  523. package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
  524. package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
  525. package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
  526. package/repo-docs/SKILL.md +3 -7
  527. package/rewrite-commits/SKILL.md +2 -2
  528. package/scripts/build-openai-submission.js +158 -0
  529. package/scripts/installer.js +86 -11
  530. package/scripts/lib/advisory-text.js +25 -18
  531. package/scripts/lib/execution-contract.js +70 -0
  532. package/scripts/lib/manifest.js +34 -38
  533. package/scripts/lib/path-boundary.js +90 -0
  534. package/scripts/lib/skills.js +124 -70
  535. package/scripts/lib/workspace.js +269 -7
  536. package/scripts/repository-contract.js +213 -0
  537. package/scripts/sync-current-docs.js +12 -0
  538. package/scripts/sync-openai-plugin.js +91 -0
  539. package/scripts/sync-release-version.js +212 -0
  540. package/security-review/SKILL.md +4 -7
  541. package/security-review/scripts/audit-secrets.js +9 -8
  542. package/self-evolve/SKILL.md +9 -11
  543. package/self-evolve/references/memory-resolution.md +4 -1
  544. package/self-evolve/scripts/persist-memory.js +221 -88
  545. package/self-evolve/scripts/register-dynamic-skill.js +12 -10
  546. package/self-evolve/scripts/self-regression.js +23 -8
  547. package/skill-creator/SKILL.md +12 -14
  548. package/skill-creator/references/quality-checklist.md +1 -0
  549. package/skill-style/SKILL.md +4 -4
  550. package/skill-style/references/style-guide.md +29 -3
  551. package/submission/openai/README.md +67 -0
  552. package/submission/openai/listing.json +31 -0
  553. package/submission/openai/test-cases.json +61 -0
  554. package/tdd/SKILL.md +20 -26
  555. package/tdd/fixtures/pass-evidence.json +100 -0
  556. package/tdd/fixtures/quality-scenarios.json +20 -0
  557. package/tdd/references/core-discipline.md +2 -0
  558. package/tdd/references/integration-testing.md +13 -0
  559. package/tdd/references/quality-model.md +68 -0
  560. package/tdd/references/unit-testing.md +15 -0
  561. package/tdd/schemas/quality-evidence.schema.json +211 -0
  562. package/tdd/schemas/quality-report.schema.json +110 -0
  563. package/tdd/scripts/quality-gate.js +475 -0
  564. package/to-spec/SKILL.md +3 -5
  565. package/to-spec/scripts/check-project-docs.js +42 -62
  566. package/to-spec/scripts/project-docs-resolver.js +111 -0
  567. package/to-tickets/SKILL.md +4 -4
  568. package/todo-driven-workflow/SKILL.md +6 -4
  569. package/using-git-worktrees/SKILL.md +3 -3
  570. package/verification-loop/SKILL.md +4 -4
  571. package/verify-before-claim/SKILL.md +2 -2
  572. package/zoom-out/SKILL.md +4 -4
  573. package/ab-test-deep-analysis-2026-08-27.md +0 -383
  574. package/ab-test-results-2026-08-27.md +0 -152
  575. package/ab-test-statistical-analysis-31cases.md +0 -193
  576. package/opencode-plugin/hooks/circuit-breaker.js +0 -121
  577. package/opencode-plugin/hooks/compliance.js +0 -128
  578. package/opencode-plugin/hooks/post-edit.js +0 -62
  579. package/opencode-plugin/hooks/pre-complete.js +0 -65
  580. package/opencode-plugin/test-hook-firing.js +0 -198
@@ -1,29 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
  // Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
3
- // counters, handoff/verification timestamps, etc). Lives under the active
4
- // platform's own harness-everything/ subfolder (see each module's
5
- // getStateDir() in hooks/scripts/lib/platforms/) - a sibling of that same
6
- // platform's install manifest, and (for Claude only) its skill copies.
3
+ // counters, handoff/verification timestamps, etc).
7
4
  //
8
- // For Claude Code that's `<repo root>/.claude/harness-everything/state/`,
9
- // keyed by session_id under `sessions/<id>/` so two sessions open on the same
10
- // repo never share (and stomp) each other's edit/verify timestamps or
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
11
21
  // breaker counts. Invocations with no session_id (manual terminal runs,
12
22
  // VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
13
23
  // rather than a random one, so manual testing stays predictable.
14
24
  const fs = require('fs');
15
25
  const path = require('path');
26
+ const { getWorkspaceRoot, getWorkspaceStateDir, resolveWorkspaceIdentity, getSessionId } = require('../../../scripts/lib/workspace');
16
27
 
17
28
  const CURRENT_SESSION_FILE = 'current-session';
18
29
  const DEFAULT_SESSION = 'default';
30
+ const MIGRATION_MARKER = '.migrated-from';
19
31
 
20
- function getWorkspaceRoot() {
21
- let dir = path.resolve(process.cwd());
22
- while (dir !== path.parse(dir).root) {
23
- if (fs.existsSync(path.join(dir, '.git'))) return dir;
24
- dir = path.dirname(dir);
25
- }
26
- return process.cwd();
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;
27
38
  }
28
39
 
29
40
  function detectActivePlatform(wsRoot) {
@@ -59,27 +70,148 @@ function detectActivePlatform(wsRoot) {
59
70
  // territory (scripts/installer.js -> lib/gitignore.js). Rewriting it on every
60
71
  // hook invocation caused repeated diffs and surprised users mid-session.
61
72
 
62
- function getStateRoot(root) {
63
- const wsRoot = root || getWorkspaceRoot();
64
- const activePlatformName = detectActivePlatform(wsRoot);
65
- const allPlatforms = require('./platforms');
66
- const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
67
-
68
- if (activePlatform && typeof activePlatform.getStateDir === 'function') {
69
- return activePlatform.getStateDir(wsRoot);
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);
70
94
  }
71
- return path.join(wsRoot, '.claude', 'harness-everything', 'state');
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;
72
203
  }
73
204
 
74
- function getSessionDir(root, sessionId) {
75
- const resolvedRoot = root || getWorkspaceRoot();
76
- const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionId || DEFAULT_SESSION);
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));
77
209
  fs.mkdirSync(dir, { recursive: true });
78
210
  return dir;
79
211
  }
80
212
 
81
- function listSessionDirs(root) {
82
- const sessionsRoot = path.join(getStateRoot(root), 'sessions');
213
+ function listSessionDirs(root, context) {
214
+ const sessionsRoot = path.join(getStateRoot(root, context), 'sessions');
83
215
  try {
84
216
  return fs.readdirSync(sessionsRoot, { withFileTypes: true })
85
217
  .filter(e => e.isDirectory())
@@ -128,11 +260,15 @@ function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
128
260
 
129
261
  module.exports = {
130
262
  DEFAULT_SESSION,
263
+ sessionDirectoryName,
131
264
  getWorkspaceRoot,
265
+ getSessionId,
266
+ resolveWorkspaceIdentity,
132
267
  detectActivePlatform,
133
268
  getStateRoot,
134
269
  getSessionDir,
135
270
  listSessionDirs,
271
+ migrateLegacyState,
136
272
  writeCurrentSession,
137
273
  readCurrentSession,
138
274
  pruneStaleSessions,
@@ -1,6 +1,8 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs');
3
3
 
4
+ const CLAUDE_PLUGIN_ROOT_TOKEN = '${CLAUDE_PLUGIN_ROOT}';
5
+
4
6
  // Removes legacy static-skill subfolders left behind by the pre-0.2.2 bug
5
7
  // that installed skills to .claude/harness-everything/skills/ instead of the
6
8
  // native .claude/skills/, WITHOUT touching skills/generated/ - self-evolve
@@ -17,31 +19,36 @@ function cleanupLegacySkillsDir(oldSkillsDir) {
17
19
  fs.rmSync(path.join(oldSkillsDir, entry.name), { recursive: true, force: true });
18
20
  removedAny = true;
19
21
  }
20
- if (fs.readdirSync(oldSkillsDir).length === 0) {
21
- fs.rmdirSync(oldSkillsDir);
22
- }
23
- if (removedAny) {
24
- console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/ (preserved skills/generated/ - self-evolve's own dynamic skills)`);
25
- }
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)`);
26
24
  } catch (e) {
27
25
  console.warn(` ⚠️ Failed to clean up legacy skills folder: ${e.message}`);
28
26
  }
29
27
  }
30
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
+
31
44
  // Claude Code has native project-skill directory: .claude/skills/.
32
45
  // Runtime state converges into .claude/harness-everything/.
33
46
  module.exports = {
34
47
  name: 'claude',
35
48
  label: 'Claude Code',
36
- getHarnessDir(workspaceRoot) {
37
- return path.join(workspaceRoot, '.claude', 'harness-everything');
38
- },
39
- getStateDir(workspaceRoot) {
40
- return path.join(this.getHarnessDir(workspaceRoot), 'state');
41
- },
42
- getSkillsDir(workspaceRoot) {
43
- return path.join(workspaceRoot, '.claude', 'skills');
44
- },
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'); },
45
52
  getIgnorePatterns(workspaceRoot) {
46
53
  const patterns = ['.claude/harness-everything/'];
47
54
  const skillsDir = path.join(workspaceRoot, '.claude', 'skills');
@@ -49,16 +56,12 @@ module.exports = {
49
56
  try {
50
57
  const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
51
58
  for (const entry of entries) {
52
- if (entry.isDirectory()) {
53
- const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
54
- if (fs.existsSync(skillMdPath)) {
55
- const content = fs.readFileSync(skillMdPath, 'utf8');
56
- const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
57
- if (authorLine && (authorLine.includes('Miya Daniel'))) {
58
- patterns.push(`.claude/skills/${entry.name}/`);
59
- }
60
- }
61
- }
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}/`);
62
65
  }
63
66
  } catch (e) {
64
67
  // Fallback or ignore to prevent breaking execution
@@ -79,37 +82,22 @@ module.exports = {
79
82
  return patterns;
80
83
  },
81
84
  isMatch(pattern, trimmedLine) {
82
- if (trimmedLine === '.claude/' || trimmedLine === '.claude') {
83
- return true;
84
- }
85
+ if (trimmedLine === '.claude/' || trimmedLine === '.claude') return true;
85
86
  if (pattern === '.claude/harness-everything/') {
86
- return trimmedLine === '.claude/harness-everything' ||
87
- trimmedLine === '.claude/harness-everything/';
87
+ return trimmedLine === '.claude/harness-everything' || trimmedLine === '.claude/harness-everything/';
88
88
  }
89
89
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
90
90
  },
91
91
  isInstalled(workspaceRoot, userHome, isGlobal) {
92
- if (isGlobal) {
93
- return fs.existsSync(path.join(userHome, '.claude', 'settings.json'));
94
- }
95
- return fs.existsSync(path.join(workspaceRoot, '.claude', 'settings.json'));
92
+ return fs.existsSync(path.join(isGlobal ? userHome : workspaceRoot, '.claude', 'settings.json'));
96
93
  },
97
94
  getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
98
- if (isGlobal) {
99
- const claudeDir = path.join(userHome, '.claude');
100
- return {
101
- path: path.join(claudeDir, 'skills'),
102
- label: '~/.claude/skills/',
103
- manifestPath: manifest.getManifestPath(claudeDir)
104
- };
105
- } else {
106
- const claudeDir = path.join(workspaceRoot, '.claude');
107
- return {
108
- path: path.join(claudeDir, 'skills'),
109
- label: '.claude/skills/',
110
- manifestPath: manifest.getManifestPath(claudeDir)
111
- };
112
- }
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
+ };
113
101
  },
114
102
  getAgentsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
115
103
  const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(workspaceRoot, '.claude');
@@ -119,7 +107,7 @@ module.exports = {
119
107
  manifestPath: manifest.getManifestPath(claudeDir)
120
108
  };
121
109
  },
122
- install({ isGlobal, targetWorkspaceRoot, harnessSourceDir, packageVersion, getUserPromptsDir, advisory, claudeHooks, manifest }) {
110
+ install({ isGlobal, targetWorkspaceRoot, harnessSourceDir, packageVersion, claudeHooks, manifest }) {
123
111
  const userHome = require('os').homedir();
124
112
  const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(targetWorkspaceRoot, '.claude');
125
113
  if (!fs.existsSync(claudeDir)) {
@@ -132,7 +120,7 @@ module.exports = {
132
120
  try {
133
121
  claudeConfig = JSON.parse(fs.readFileSync(claudeSettingsFile, 'utf8'));
134
122
  } catch (e) {
135
- console.warn(` ⚠️ Existing ${isGlobal ? '~' : ''}/.claude/settings.json is malformed, creating fresh one.`);
123
+ throw new Error(`Refusing to modify malformed ${isGlobal ? '~/' : ''}.claude/settings.json: ${e.message}`);
136
124
  }
137
125
  }
138
126
 
@@ -146,10 +134,7 @@ module.exports = {
146
134
  if (cloned.hooks) {
147
135
  cloned.hooks = cloned.hooks.map(h => {
148
136
  if (h.type === 'command' && h.command) {
149
- h.command = h.command.replace(/^node\s+"?([^"\s]+)"?/, (m, scriptPath) => {
150
- const abs = path.isAbsolute(scriptPath) ? scriptPath : path.join(harnessSourceDir, scriptPath);
151
- return `node "${abs}"`;
152
- });
137
+ h.command = resolveClaudeHookCommand(h.command, harnessSourceDir);
153
138
  }
154
139
  return h;
155
140
  });
@@ -163,23 +148,21 @@ module.exports = {
163
148
 
164
149
  fs.writeFileSync(claudeSettingsFile, JSON.stringify(claudeConfig, null, 2), 'utf8');
165
150
  console.log(` ✅ Configured Claude Code hooks safely in ${isGlobal ? '~' : ''}/.claude/settings.json`);
166
-
167
- // DOWNWARD COMPATIBLE CLEANUP: Remove old wrong skill folder .claude/harness-everything/skills if it exists
168
151
  cleanupLegacySkillsDir(path.join(claudeDir, 'harness-everything', 'skills'));
169
152
  },
170
- uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, advisory, claudeHooks, manifest, cleanEmptyDirs }) {
153
+ uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, claudeHooks, cleanEmptyDirs }) {
171
154
  if (removeLocal) {
172
155
  const localSettingsFile = path.join(workspaceRoot, '.claude', 'settings.json');
173
156
  claudeHooks.removeHarnessHooks(localSettingsFile);
174
-
175
- // Clear old wrong skill folder .claude/harness-everything/skills if any remain
176
157
  cleanupLegacySkillsDir(path.join(workspaceRoot, '.claude', 'harness-everything', 'skills'));
177
158
  }
178
159
  if (removeGlobal) {
179
160
  const globalSettingsFile = path.join(userHome, '.claude', 'settings.json');
180
161
  claudeHooks.removeHarnessHooks(globalSettingsFile);
181
- const globalClaudeDir = path.join(userHome, '.claude');
182
- cleanEmptyDirs(globalClaudeDir, [userHome]);
162
+ cleanEmptyDirs(path.join(userHome, '.claude'), [userHome]);
183
163
  }
164
+ },
165
+ resolveHookCommand(command, harnessSourceDir) {
166
+ return resolveClaudeHookCommand(command, harnessSourceDir);
184
167
  }
185
168
  };
@@ -1,43 +1,29 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs');
3
3
 
4
- // Codex CLI's real project-scoped home is `.codex/` (it reads `.codex/skills/`
5
- // for project skills and `.codex/config.toml` for CLI/sandbox config, walking
6
- // up to the `.git` root exactly like AGENTS.md - see
7
- // https://developers.openai.com/codex/config-advanced and
8
- // https://www.agensi.io/learn/codex-cli-agents-md-complete-guide). Skills
9
- // stay at that native `.codex/skills/` location; only bookkeeping that never
10
- // had a home (runtime state, install manifest) converges into
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
11
8
  // `.codex/harness-everything/`.
12
9
  module.exports = {
13
10
  name: 'codex',
14
11
  label: 'Codex',
15
- getHarnessDir(workspaceRoot) {
16
- return path.join(workspaceRoot, '.codex', 'harness-everything');
17
- },
18
- getStateDir(workspaceRoot) {
19
- return path.join(this.getHarnessDir(workspaceRoot), 'state');
20
- },
21
- getSkillsDir(workspaceRoot) {
22
- return path.join(workspaceRoot, '.codex', 'skills');
23
- },
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'); },
24
15
  getIgnorePatterns(workspaceRoot) {
25
16
  const patterns = ['.codex/harness-everything/'];
26
- const skillsDir = path.join(workspaceRoot, '.codex', 'skills');
17
+ const skillsDir = path.join(workspaceRoot, '.agents', 'skills');
27
18
  if (fs.existsSync(skillsDir)) {
28
19
  try {
29
- const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
30
- for (const entry of entries) {
31
- if (entry.isDirectory()) {
32
- const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
33
- if (fs.existsSync(skillMdPath)) {
34
- const content = fs.readFileSync(skillMdPath, 'utf8');
35
- const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
36
- if (authorLine && (authorLine.includes('Miya Daniel'))) {
37
- patterns.push(`.codex/skills/${entry.name}/`);
38
- }
39
- }
40
- }
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}/`);
41
27
  }
42
28
  } catch (e) {
43
29
  // Fallback or ignore to prevent breaking execution
@@ -46,19 +32,15 @@ module.exports = {
46
32
  return patterns;
47
33
  },
48
34
  isMatch(pattern, trimmedLine) {
49
- if (trimmedLine === '.codex/' || trimmedLine === '.codex') {
50
- return true;
51
- }
35
+ if (trimmedLine === '.codex/' || trimmedLine === '.codex') return pattern === '.codex/harness-everything/';
36
+ if (trimmedLine === '.agents/' || trimmedLine === '.agents') return pattern.startsWith('.agents/skills/');
52
37
  if (pattern === '.codex/harness-everything/') {
53
- return trimmedLine === '.codex/harness-everything' ||
54
- trimmedLine === '.codex/harness-everything/';
38
+ return trimmedLine === '.codex/harness-everything' || trimmedLine === '.codex/harness-everything/';
55
39
  }
56
40
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
57
41
  },
58
42
  isInstalled(workspaceRoot, userHome, isGlobal) {
59
- if (isGlobal) {
60
- return false;
61
- }
43
+ if (isGlobal) return false;
62
44
  return fs.existsSync(path.join(workspaceRoot, 'AGENTS.md'));
63
45
  },
64
46
  getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
@@ -69,46 +51,38 @@ module.exports = {
69
51
  label: '~/.agents/skills/',
70
52
  manifestPath: manifest.getManifestPath(globalAgentsDir),
71
53
  };
72
- } else {
73
- const codexDir = path.join(workspaceRoot, '.codex');
74
- return {
75
- path: path.join(codexDir, 'skills'),
76
- label: '.codex/skills/',
77
- manifestPath: manifest.getManifestPath(codexDir),
78
- };
79
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
+ };
80
61
  },
81
62
  install({ isGlobal, targetWorkspaceRoot, getUserPromptsDir, advisory }) {
82
63
  if (!isGlobal) {
83
64
  const targetFile = path.join(targetWorkspaceRoot, 'AGENTS.md');
84
65
  advisory.injectAdvisoryText(targetFile, '# AGENTS.md', 'AGENTS.md');
85
- } else {
86
- try {
87
- const promptsDir = getUserPromptsDir();
88
- if (!fs.existsSync(promptsDir)) {
89
- fs.mkdirSync(promptsDir, { recursive: true });
90
- }
91
- const vscodeAgentFile = path.join(promptsDir, 'harness.agent.md');
92
- fs.writeFileSync(vscodeAgentFile, advisory.buildCodexGlobalContent(), 'utf8');
93
- console.log(` ✅ Installed global Codex agent to VS Code: ${vscodeAgentFile}`);
94
- } catch (err) {
95
- console.warn(` ⚠️ Failed to write VS Code user prompts folder: ${err.message}`);
96
- }
66
+ return;
97
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}`);
98
74
  },
99
75
  uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, cleanEmptyDirs }) {
100
76
  const advisory = require('../../../../scripts/lib/advisory-text');
101
- if (removeLocal) {
102
- advisory.removeAdvisoryText(path.join(workspaceRoot, 'AGENTS.md'));
103
- }
77
+ if (removeLocal) advisory.removeAdvisoryText(path.join(workspaceRoot, 'AGENTS.md'));
104
78
  if (removeGlobal) {
105
79
  const promptsDir = getUserPromptsDir();
106
80
  const vscodeAgentFile = path.join(promptsDir, 'harness.agent.md');
107
- if (fs.existsSync(vscodeAgentFile)) {
81
+ if (fs.existsSync(vscodeAgentFile) && advisory.hasHarnessMarker(fs.readFileSync(vscodeAgentFile, 'utf8'))) {
108
82
  fs.unlinkSync(vscodeAgentFile);
109
83
  console.log(` ✅ Removed global Codex agent: ${vscodeAgentFile}`);
110
84
  }
111
85
  cleanEmptyDirs(promptsDir, [userHome]);
112
86
  }
113
87
  }
114
- };
88
+ };
@@ -1,9 +1,9 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs');
3
3
 
4
- // Continue's own skills location (.continue/skills/) is unchanged - it
5
- // already has an established home. Only bookkeeping that never had a home
6
- // (runtime state, install manifest) converges into .continue/harness-everything/.
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
7
  module.exports = {
8
8
  name: 'continue',
9
9
  label: 'Continue.dev',
@@ -58,11 +58,11 @@ module.exports = {
58
58
  },
59
59
  getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
60
60
  if (isGlobal) {
61
- const globalAgentsDir = path.join(userHome, '.agents');
61
+ const continueDir = path.join(userHome, '.continue');
62
62
  return {
63
- path: path.join(globalAgentsDir, 'skills'),
64
- label: '~/.agents/skills/',
65
- manifestPath: manifest.getManifestPath(globalAgentsDir),
63
+ path: path.join(continueDir, 'skills'),
64
+ label: '~/.continue/skills/',
65
+ manifestPath: manifest.getManifestPath(continueDir),
66
66
  };
67
67
  } else {
68
68
  const continueDir = path.join(workspaceRoot, '.continue');