harness-everything 0.2.2 → 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 (918) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +27 -0
  3. package/.claude-plugin/plugin.json +52 -0
  4. package/.gitattributes +1 -0
  5. package/.github/workflows/behavioral-evals.yml +36 -0
  6. package/.github/workflows/ci.yml +122 -0
  7. package/.github/workflows/release.yml +71 -0
  8. package/.husky/commit-msg +1 -0
  9. package/.releaserc.json +113 -0
  10. package/.waza.yaml +22 -0
  11. package/AGENTS.md +71 -2
  12. package/BENCHMARK_SOP.md +82 -62
  13. package/CHANGELOG.md +488 -114
  14. package/CODE_OF_CONDUCT.md +24 -0
  15. package/CONTRIBUTING.md +60 -0
  16. package/Dockerfile +18 -18
  17. package/LICENSE +201 -201
  18. package/PRIVACY.md +25 -0
  19. package/README.md +310 -197
  20. package/RELEASING.md +82 -0
  21. package/SECURITY.md +33 -0
  22. package/SUPPORT.md +27 -0
  23. package/TERMS.md +21 -0
  24. package/VERIFICATION.md +283 -347
  25. package/behavioral-evals/README.md +106 -0
  26. package/behavioral-evals/analyze-plugin-results.js +110 -0
  27. package/behavioral-evals/case-validator.js +194 -0
  28. package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
  29. package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
  30. package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
  31. package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
  32. package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
  33. package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
  34. package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
  35. package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
  36. package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
  37. package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
  38. package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
  39. package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
  40. package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
  41. package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
  42. package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
  43. package/behavioral-evals/cases/baseline-performance.yaml +34 -0
  44. package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
  45. package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
  46. package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
  47. package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
  48. package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
  49. package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
  50. package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
  51. package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
  52. package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
  53. package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
  54. package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
  55. package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
  56. package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
  57. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
  58. package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
  59. package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
  60. package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
  61. package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
  62. package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
  63. package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
  64. package/behavioral-evals/cases/pressure-scope-bypass.yaml +33 -0
  65. package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
  66. package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
  67. package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
  68. package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
  69. package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
  70. package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
  71. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +50 -0
  72. package/behavioral-evals/cases/scope-discipline.yaml +33 -0
  73. package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
  74. package/behavioral-evals/cases/verify-before-done.yaml +33 -0
  75. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
  76. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
  77. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
  78. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
  79. package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
  80. package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
  81. package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
  82. package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
  83. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
  84. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
  85. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
  86. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
  87. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
  88. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
  89. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
  90. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
  91. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
  92. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
  93. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
  94. package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
  95. package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
  96. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
  97. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
  98. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
  99. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
  100. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
  101. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
  102. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
  103. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
  104. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
  105. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
  106. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
  107. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
  108. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
  109. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
  110. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
  111. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
  112. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
  113. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
  114. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
  115. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
  116. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
  117. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
  118. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
  119. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
  120. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
  121. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
  122. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
  123. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
  124. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  125. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
  126. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
  127. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
  128. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  129. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
  130. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
  131. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
  132. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
  133. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
  134. package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
  135. package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
  136. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
  137. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
  138. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
  139. package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
  140. package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
  141. package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
  142. package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
  143. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
  144. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
  145. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
  146. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
  147. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
  148. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
  149. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
  150. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
  151. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
  152. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
  153. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
  154. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
  155. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
  156. package/behavioral-evals/evidence-tool.js +443 -0
  157. package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
  158. package/behavioral-evals/fixtures/claude-legacy.json +1 -0
  159. package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
  160. package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
  161. package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
  162. package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
  163. package/behavioral-evals/results/.gitkeep +0 -0
  164. package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
  165. package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
  166. package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
  167. package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
  168. package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
  169. package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
  170. package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
  171. package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
  172. package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
  173. package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
  174. package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
  175. package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
  176. package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
  177. package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
  178. package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
  179. package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
  180. package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
  181. package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
  182. package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
  183. package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
  184. package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
  185. package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
  186. package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
  187. package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
  188. package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
  189. package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
  190. package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
  191. package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
  192. package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
  193. package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
  194. package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
  195. package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
  196. package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
  197. package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
  198. package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
  199. package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
  200. package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
  201. package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
  202. package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
  203. package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
  204. package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
  205. package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
  206. package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
  207. package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
  208. package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
  209. package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
  210. package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
  211. package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
  212. package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
  213. package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
  214. package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
  215. package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
  216. package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
  217. package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
  218. package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
  219. package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
  220. package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
  221. package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
  222. package/behavioral-evals/results/run-20260827-115509.log +287 -0
  223. package/behavioral-evals/run-with-plugin.js +300 -0
  224. package/behavioral-evals/run.js +928 -0
  225. package/behavioral-evals/transcript-parser.js +591 -0
  226. package/benchmarks/README.md +63 -0
  227. package/benchmarks/ab-test-2026-08-26/results.json +55 -0
  228. package/benchmarks/results/logs/.gitkeep +0 -0
  229. package/benchmarks/results/logs/test-a-harness.md +31 -0
  230. package/benchmarks/results/logs/test-a-vanilla.md +28 -0
  231. package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
  232. package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
  233. package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
  234. package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
  235. package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
  236. package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
  237. package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
  238. package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
  239. package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
  240. package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
  241. package/benchmarks/results/results.json +158 -0
  242. package/benchmarks/run.js +220 -0
  243. package/benchmarks/schema.json +44 -0
  244. package/bin/cli.js +164 -97
  245. package/ci/ab-test-cases/grill-me-adversarial.yaml +28 -0
  246. package/ci/ab-test-cases/tdd-test-first.yaml +30 -0
  247. package/ci/ab-test-cases/verification-loop-gates.yaml +38 -0
  248. package/ci/ab-test-cases/verify-before-claim-cites.yaml +19 -0
  249. package/ci/ab-test-harness.js +485 -0
  250. package/ci/action-gate-platform-doc.test.js +31 -0
  251. package/ci/action-gate.test.js +260 -0
  252. package/{eval-framework → ci}/cases/case1.json +5 -5
  253. package/ci/cases/case10-small-feature.json +5 -0
  254. package/ci/cases/case11-readme-typo-update.json +5 -0
  255. package/ci/cases/case12-chinese-macro-audit.json +5 -0
  256. package/ci/cases/case2.json +5 -0
  257. package/{eval-framework → ci}/cases/case3.json +5 -5
  258. package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
  259. package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
  260. package/ci/cases/case6-macro-skill-audit.json +5 -0
  261. package/ci/cases/case7-macro-reference-audit.json +5 -0
  262. package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
  263. package/ci/cases/case9-four-issue-audit.json +5 -0
  264. package/ci/consistency-check.js +393 -0
  265. package/ci/description-collision.js +118 -0
  266. package/ci/disclosure-check.js +225 -0
  267. package/ci/doc-capability-consistency.test.js +180 -0
  268. package/ci/fable-mode-test.js +120 -0
  269. package/ci/fixtures/agency-agents/divisions.json +6 -0
  270. package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
  271. package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
  272. package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
  273. package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
  274. package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
  275. package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
  276. package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
  277. package/ci/installer-roundtrip.test.js +159 -0
  278. package/ci/invariant-routing.test.js +74 -0
  279. package/ci/issue99-runtime.test.js +218 -0
  280. package/ci/mechanism-2a-rule-of-3.test.js +46 -0
  281. package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
  282. package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
  283. package/ci/mechanism-2b-boundary-guard.test.js +16 -0
  284. package/ci/mechanism-2c-state-persist.test.js +29 -0
  285. package/ci/mechanism-2d-fact-audit.test.js +18 -0
  286. package/ci/mechanism-2e-scope-guard.test.js +24 -0
  287. package/ci/mechanism-2f-stop-gate.test.js +23 -0
  288. package/ci/mechanism-2g-platform-ignore.test.js +88 -0
  289. package/ci/mechanism-2h-installer-manifest.test.js +147 -0
  290. package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
  291. package/ci/mechanism-2i-install-verification.test.js +34 -0
  292. package/ci/mechanism-2j-behavioral-runner.test.js +62 -0
  293. package/ci/mechanism-2k-reference-check.test.js +75 -0
  294. package/ci/mechanism-2l-multi-agent-workspace.test.js +301 -0
  295. package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
  296. package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
  297. package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
  298. package/ci/mechanism-2p-installer-links.test.js +183 -0
  299. package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
  300. package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
  301. package/ci/mechanism-2s-tdd-quality.test.js +203 -0
  302. package/ci/mechanism-2t-disclosure.test.js +90 -0
  303. package/ci/mechanism-2t-evidence-triage.test.js +200 -0
  304. package/ci/mechanism-2t-issue-20.test.js +75 -0
  305. package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
  306. package/ci/mechanism-2t-transcript-parser.test.js +179 -0
  307. package/ci/mechanism-2t-workspace-identity.test.js +200 -0
  308. package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
  309. package/ci/mechanism-2u-issue-44.test.js +35 -0
  310. package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
  311. package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
  312. package/ci/mechanism-2x-release-automation.test.js +157 -0
  313. package/ci/mechanism-2x-release-commit-message.test.js +66 -0
  314. package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
  315. package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
  316. package/ci/mechanism-test.js +71 -0
  317. package/ci/mutation-check.js +53 -0
  318. package/ci/mutation-loader.js +57 -0
  319. package/ci/negative-controls.js +114 -0
  320. package/ci/openai-plugin-package.test.js +182 -0
  321. package/ci/openai-plugin-runtime.test.js +175 -0
  322. package/ci/openai-plugin-submission.test.js +101 -0
  323. package/ci/phase4-ensemble-memory.test.js +307 -0
  324. package/ci/reference-check.js +160 -0
  325. package/ci/release-consistency-check.js +146 -0
  326. package/ci/router-phase2-safety.test.js +81 -0
  327. package/ci/router-workflow-plan.test.js +264 -0
  328. package/ci/routing-check.js +91 -0
  329. package/{eval-framework → ci}/runner.js +57 -56
  330. package/ci/skill-routing-check.js +135 -0
  331. package/ci/test-behavioral-case-validation.js +62 -0
  332. package/ci/test-helper.js +114 -0
  333. package/ci/test-negative-controls.js +148 -0
  334. package/ci/workflow-plan-consumers-edge.test.js +72 -0
  335. package/ci/workflow-plan-consumers.test.js +276 -0
  336. package/commitlint.config.js +25 -0
  337. package/docker-verify.sh +266 -266
  338. package/docs/architecture.md +179 -95
  339. package/docs/audit.md +55 -0
  340. package/docs/codex-action-gate.md +90 -0
  341. package/docs/issue-20-rollup.md +47 -0
  342. package/docs/mechanism-first-skill-mesh.md +165 -0
  343. package/docs/openai-plugin.md +118 -0
  344. package/docs/philosophy.md +58 -45
  345. package/docs/platform-capabilities.md +73 -0
  346. package/docs/platform-compatibility.json +270 -0
  347. package/docs/reflection.md +63 -34
  348. package/docs/release-evidence.md +25 -0
  349. package/docs/routing.md +171 -45
  350. package/docs/security-audit.md +38 -0
  351. package/docs/troubleshooting.md +320 -0
  352. package/docs/verifier-boundaries.md +45 -0
  353. package/docs/workflows/environment-detection.md +10 -10
  354. package/docs/workflows/eval-harness.md +13 -6
  355. package/docs/workflows/fable-discipline.md +9 -9
  356. package/docs/workflows/fable-mode.md +85 -32
  357. package/docs/workflows/find-skills.md +76 -0
  358. package/docs/workflows/git-commit.md +18 -9
  359. package/docs/workflows/grill-me.md +11 -11
  360. package/docs/workflows/grill-with-docs.md +14 -7
  361. package/docs/workflows/harness-everything.md +95 -92
  362. package/docs/workflows/improve-codebase-architecture.md +15 -7
  363. package/docs/workflows/install-cognitive-os.md +60 -60
  364. package/docs/workflows/multi-agent-workspace.md +54 -0
  365. package/docs/workflows/repo-docs.md +12 -7
  366. package/docs/workflows/security-review.md +26 -7
  367. package/docs/workflows/self-evolve.md +53 -37
  368. package/docs/workflows/skill-creator.md +80 -75
  369. package/docs/workflows/skill-style.md +64 -64
  370. package/docs/workflows/tdd.md +78 -39
  371. package/docs/workflows/to-spec.md +83 -0
  372. package/docs/workflows/to-tickets.md +80 -0
  373. package/docs/workflows/todo-driven-workflow.md +67 -36
  374. package/docs/workflows/using-git-worktrees.md +12 -8
  375. package/docs/workflows/verification-loop.md +16 -14
  376. package/docs/workflows/verify-before-claim.md +12 -8
  377. package/docs/workflows/zoom-out.md +22 -10
  378. package/environment-detection/SKILL.md +25 -61
  379. package/environment-detection/references/shell-syntax-rules.md +76 -0
  380. package/environment-detection/scripts/preflight.js +103 -93
  381. package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
  382. package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
  383. package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
  384. package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
  385. package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
  386. package/eval-harness/SKILL.md +34 -51
  387. package/eval-harness/references/scoring-rubric.md +68 -0
  388. package/eval-harness/scripts/evaluate.js +79 -61
  389. package/evals/environment-detection/eval.yaml +26 -0
  390. package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
  391. package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
  392. package/evals/eval-harness/eval.yaml +26 -0
  393. package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
  394. package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
  395. package/evals/evaluation-reports.md +14 -0
  396. package/evals/fable-discipline/eval.yaml +26 -0
  397. package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
  398. package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
  399. package/evals/fable-mode/eval.yaml +26 -0
  400. package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
  401. package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
  402. package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
  403. package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
  404. package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
  405. package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
  406. package/evals/find-skills/eval.yaml +26 -0
  407. package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
  408. package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
  409. package/evals/git-commit/eval.yaml +26 -0
  410. package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
  411. package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
  412. package/evals/grill-me/eval.yaml +26 -0
  413. package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
  414. package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
  415. package/evals/grill-with-docs/eval.yaml +26 -0
  416. package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
  417. package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
  418. package/evals/harness-everything/eval.yaml +26 -0
  419. package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
  420. package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
  421. package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
  422. package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
  423. package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
  424. package/evals/improve-codebase-architecture/eval.yaml +26 -0
  425. package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
  426. package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
  427. package/evals/install-cognitive-os/eval.yaml +26 -0
  428. package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
  429. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
  430. package/evals/multi-agent-workspace/eval.yaml +26 -0
  431. package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
  432. package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
  433. package/evals/repo-docs/eval.yaml +26 -0
  434. package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
  435. package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
  436. package/evals/rewrite-commits/eval.yaml +26 -0
  437. package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
  438. package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
  439. package/evals/security-review/eval.yaml +26 -0
  440. package/evals/security-review/tasks/negative-trigger.yaml +16 -0
  441. package/evals/security-review/tasks/positive-trigger.yaml +15 -0
  442. package/evals/self-evolve/eval.yaml +26 -0
  443. package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
  444. package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
  445. package/evals/skill-creator/eval.yaml +26 -0
  446. package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
  447. package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
  448. package/evals/skill-style/eval.yaml +26 -0
  449. package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
  450. package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
  451. package/evals/tdd/eval.yaml +26 -0
  452. package/evals/tdd/tasks/negative-trivia.yaml +16 -0
  453. package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
  454. package/evals/tdd/tasks/positive-feature.yaml +16 -0
  455. package/evals/tdd/tasks/positive-refactor.yaml +15 -0
  456. package/evals/to-spec/eval.yaml +26 -0
  457. package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
  458. package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
  459. package/evals/to-tickets/eval.yaml +26 -0
  460. package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
  461. package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
  462. package/evals/todo-driven-workflow/eval.yaml +26 -0
  463. package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
  464. package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
  465. package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
  466. package/evals/using-git-worktrees/eval.yaml +26 -0
  467. package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
  468. package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
  469. package/evals/verification-loop/eval.yaml +26 -0
  470. package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
  471. package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
  472. package/evals/verify-before-claim/eval.yaml +26 -0
  473. package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
  474. package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
  475. package/evals/zoom-out/eval.yaml +26 -0
  476. package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
  477. package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
  478. package/fable-discipline/SKILL.md +31 -28
  479. package/fable-discipline/references/discipline-rules.md +22 -0
  480. package/fable-mode/CONTRACT-FORMAT.md +165 -51
  481. package/fable-mode/SKILL.md +31 -43
  482. package/fable-mode/agents/fable-orchestrator.md +159 -92
  483. package/fable-mode/agents/fable-verifier.md +32 -32
  484. package/fable-mode/agents/fable-worker-haiku.md +52 -48
  485. package/fable-mode/agents/fable-worker-sonnet.md +53 -49
  486. package/fable-mode/execution-guardrails/SKILL.md +43 -87
  487. package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  488. package/fable-mode/fable-haiku/SKILL.md +36 -48
  489. package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  490. package/fable-mode/fable-opus/SKILL.md +36 -0
  491. package/fable-mode/fable-sonnet/SKILL.md +36 -0
  492. package/fable-mode/model-matrix.json +32 -0
  493. package/fable-mode/references/execution-phases.md +37 -0
  494. package/fable-mode/references/model-matrix.md +39 -0
  495. package/fable-mode/scripts/ensemble-review.js +371 -0
  496. package/fable-mode/scripts/model-selector.js +260 -0
  497. package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  498. package/find-skills/SKILL.md +48 -0
  499. package/find-skills/references/discovery-flow.md +102 -0
  500. package/find-skills/scripts/use-skill.js +112 -0
  501. package/git-commit/SKILL.md +28 -45
  502. package/git-commit/guides/ANGULAR_STYLE.md +60 -60
  503. package/git-commit/guides/COMMIT_GENERATION.md +23 -23
  504. package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
  505. package/git-commit/guides/MAIN_REPO.md +14 -14
  506. package/git-commit/guides/SUBMODULES.md +27 -27
  507. package/git-commit/references/commit-flow.md +30 -0
  508. package/grill-me/SKILL.md +34 -27
  509. package/grill-me/references/grilling-playbook.md +38 -0
  510. package/grill-with-docs/ADR-FORMAT.md +47 -47
  511. package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
  512. package/grill-with-docs/SKILL.md +33 -91
  513. package/grill-with-docs/references/session-playbook.md +99 -0
  514. package/harness-everything/SKILL.md +27 -125
  515. package/harness-everything/examples/README.md +9 -9
  516. package/harness-everything/examples/todo-workflow.md +22 -22
  517. package/harness-everything/references/router-workflow-plan.md +128 -0
  518. package/harness-everything/references/skill-registry.md +39 -0
  519. package/harness-everything/references/triage-and-tiers.md +193 -0
  520. package/harness-everything/schemas/router-task-shape.schema.json +126 -0
  521. package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  522. package/harness-everything/scripts/bootstrap.js +212 -140
  523. package/harness-everything/scripts/ensemble-policy.js +102 -0
  524. package/harness-everything/scripts/kernel-router.js +212 -0
  525. package/harness-everything/scripts/router-contract.js +612 -0
  526. package/harness-everything/scripts/routing-keywords.json +320 -0
  527. package/harness-everything/scripts/self-heal.js +250 -189
  528. package/harness-everything/scripts/tier-router.js +459 -219
  529. package/harness-everything/scripts/verify-gate.js +100 -31
  530. package/hooks/hooks.json +200 -155
  531. package/hooks/scripts/action-gate-rules.json +77 -0
  532. package/hooks/scripts/action-gate.js +528 -0
  533. package/hooks/scripts/atomic-commit-check.js +68 -68
  534. package/hooks/scripts/boundary-guard.js +55 -55
  535. package/hooks/scripts/codex-action-gate-post.js +46 -0
  536. package/hooks/scripts/codex-permission-request.js +140 -0
  537. package/hooks/scripts/context-compact.js +115 -114
  538. package/hooks/scripts/contract-test.js +146 -79
  539. package/hooks/scripts/depth-guard.js +65 -65
  540. package/hooks/scripts/lib/fable-contracts.js +121 -0
  541. package/hooks/scripts/lib/harness-state.js +275 -228
  542. package/hooks/scripts/lib/platforms/claude.js +97 -61
  543. package/hooks/scripts/lib/platforms/codex.js +42 -50
  544. package/hooks/scripts/lib/platforms/continue.js +30 -12
  545. package/hooks/scripts/lib/platforms/copilot.js +36 -42
  546. package/hooks/scripts/lib/platforms/cursor.js +23 -5
  547. package/hooks/scripts/lib/platforms/hermes.js +108 -57
  548. package/hooks/scripts/lib/platforms/index.js +17 -17
  549. package/hooks/scripts/lib/platforms/worktrees.js +20 -20
  550. package/hooks/scripts/openai-session-start.js +81 -0
  551. package/hooks/scripts/reset-circuit-breaker.js +30 -30
  552. package/hooks/scripts/rule-of-3-tracker.js +125 -91
  553. package/hooks/scripts/rule-of-3.js +195 -176
  554. package/hooks/scripts/state-persist.js +100 -99
  555. package/hooks/scripts/stop-gate.js +80 -80
  556. package/hooks/scripts/subagent-scope-guard.js +194 -88
  557. package/hooks/scripts/subagent-start.js +19 -0
  558. package/hooks/scripts/subagent-stop.js +6 -0
  559. package/improve-codebase-architecture/SKILL.md +29 -35
  560. package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
  561. package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
  562. package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
  563. package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
  564. package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  565. package/improve-codebase-architecture/references/README.md +16 -0
  566. package/install-cognitive-os/SKILL.md +30 -81
  567. package/install-cognitive-os/references/cognitive-loop.md +27 -0
  568. package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  569. package/multi-agent-workspace/SKILL.md +38 -0
  570. package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
  571. package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
  572. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
  573. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
  574. package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  575. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
  576. package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  577. package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  578. package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
  579. package/multi-agent-workspace/references/agency-agents.md +31 -0
  580. package/multi-agent-workspace/references/architecture-guide.md +36 -0
  581. package/multi-agent-workspace/references/orchestration.md +65 -0
  582. package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  583. package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  584. package/multi-agent-workspace/scripts/index_memory.js +104 -0
  585. package/multi-agent-workspace/scripts/path-boundary.js +59 -0
  586. package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  587. package/multi-agent-workspace/scripts/scaffold.js +408 -0
  588. package/multi-agent-workspace/templates/AGENTS.md +20 -0
  589. package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
  590. package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
  591. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
  592. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
  593. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
  594. package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
  595. package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
  596. package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
  597. package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
  598. package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
  599. package/multi-agent-workspace/workflows/01-init.md +22 -0
  600. package/multi-agent-workspace/workflows/02-analysis.md +23 -0
  601. package/multi-agent-workspace/workflows/03-generation.md +25 -0
  602. package/multi-agent-workspace/workflows/04-launcher.md +16 -0
  603. package/opencode-plugin/README.md +137 -0
  604. package/opencode-plugin/hooks/verify.js +190 -0
  605. package/opencode-plugin/index.mjs +547 -0
  606. package/opencode-plugin/plugin.json +9 -0
  607. package/package.json +63 -22
  608. package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
  609. package/plugins/harness-everything/hooks/hooks.json +197 -0
  610. package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
  611. package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
  612. package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
  613. package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
  614. package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
  615. package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
  616. package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
  617. package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
  618. package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
  619. package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
  620. package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
  621. package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
  622. package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
  623. package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
  624. package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
  625. package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
  626. package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
  627. package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
  628. package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
  629. package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
  630. package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
  631. package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
  632. package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
  633. package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
  634. package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
  635. package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
  636. package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
  637. package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
  638. package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
  639. package/plugins/harness-everything/hooks/session-start.js +81 -0
  640. package/plugins/harness-everything/plugin.json +43 -0
  641. package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
  642. package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
  643. package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
  644. package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
  645. package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
  646. package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
  647. package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
  648. package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
  649. package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
  650. package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
  651. package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
  652. package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
  653. package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
  654. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
  655. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
  656. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
  657. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  658. package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
  659. package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  660. package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
  661. package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
  662. package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
  663. package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
  664. package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
  665. package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
  666. package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
  667. package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  668. package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
  669. package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
  670. package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
  671. package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
  672. package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
  673. package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
  674. package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
  675. package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
  676. package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
  677. package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
  678. package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
  679. package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
  680. package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  681. package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
  682. package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
  683. package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
  684. package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
  685. package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
  686. package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
  687. package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
  688. package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
  689. package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
  690. package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
  691. package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  692. package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
  693. package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
  694. package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
  695. package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
  696. package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
  697. package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
  698. package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
  699. package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
  700. package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
  701. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
  702. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
  703. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
  704. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
  705. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  706. package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
  707. package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
  708. package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
  709. package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  710. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
  711. package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
  712. package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
  713. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
  714. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
  715. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  716. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
  717. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  718. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  719. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
  720. package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
  721. package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
  722. package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
  723. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  724. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  725. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
  726. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
  727. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  728. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
  729. package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
  730. package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
  731. package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
  732. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
  733. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
  734. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
  735. package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
  736. package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
  737. package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
  738. package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
  739. package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
  740. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
  741. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
  742. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
  743. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
  744. package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
  745. package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
  746. package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
  747. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
  748. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
  749. package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
  750. package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
  751. package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
  752. package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
  753. package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
  754. package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
  755. package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
  756. package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
  757. package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
  758. package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
  759. package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
  760. package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  761. package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
  762. package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
  763. package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
  764. package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
  765. package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
  766. package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
  767. package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
  768. package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
  769. package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
  770. package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
  771. package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
  772. package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
  773. package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
  774. package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
  775. package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
  776. package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
  777. package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
  778. package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
  779. package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
  780. package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
  781. package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
  782. package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
  783. package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
  784. package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
  785. package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
  786. package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
  787. package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
  788. package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
  789. package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
  790. package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
  791. package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
  792. package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
  793. package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
  794. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
  795. package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
  796. package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
  797. package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
  798. package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
  799. package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
  800. package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
  801. package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
  802. package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
  803. package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
  804. package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
  805. package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
  806. package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
  807. package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
  808. package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
  809. package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
  810. package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
  811. package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
  812. package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
  813. package/references/definition-of-done.md +67 -0
  814. package/references/performance-checklist.md +153 -0
  815. package/references/platform-advisory-template.md +58 -0
  816. package/references/security-checklist.md +205 -0
  817. package/repo-docs/SKILL.md +34 -37
  818. package/repo-docs/references/process-guide.md +60 -0
  819. package/repo-docs/templates/agents-template.md +264 -264
  820. package/repo-docs/templates/knowledge-agents-template.md +50 -50
  821. package/repo-docs/templates/knowledge-readme-template.md +83 -83
  822. package/repo-docs/templates/manual-recon.md +117 -117
  823. package/repo-docs/templates/multi-skills-readme-template.md +72 -72
  824. package/repo-docs/templates/product-agents-template.md +78 -78
  825. package/repo-docs/templates/product-readme-template.md +95 -95
  826. package/repo-docs/templates/readme-template.md +136 -136
  827. package/repo-docs/templates/single-skill-readme-template.md +70 -70
  828. package/repo-docs/templates/skills-agents-template.md +60 -60
  829. package/rewrite-commits/SKILL.md +22 -17
  830. package/rewrite-commits/references/workflow.md +18 -0
  831. package/scripts/build-openai-submission.js +158 -0
  832. package/scripts/installer.js +621 -506
  833. package/scripts/lib/advisory-text.js +33 -22
  834. package/scripts/lib/claude-hooks.js +18 -5
  835. package/scripts/lib/execution-contract.js +70 -0
  836. package/scripts/lib/gitignore.js +199 -80
  837. package/scripts/lib/manifest.js +83 -23
  838. package/scripts/lib/path-boundary.js +90 -0
  839. package/scripts/lib/prompts.js +1 -1
  840. package/scripts/lib/skills.js +191 -51
  841. package/scripts/lib/workspace.js +269 -7
  842. package/scripts/sync-openai-plugin.js +91 -0
  843. package/scripts/sync-release-version.js +212 -0
  844. package/scripts/verify-install.js +147 -0
  845. package/security-review/SKILL.md +33 -497
  846. package/security-review/guides/OWASP-PATTERNS.md +31 -0
  847. package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  848. package/security-review/references/security-checklist.md +478 -0
  849. package/security-review/scripts/audit-secrets.js +85 -0
  850. package/self-evolve/SKILL.md +36 -45
  851. package/self-evolve/references/memory-resolution.md +61 -0
  852. package/self-evolve/scripts/persist-memory.js +272 -40
  853. package/self-evolve/scripts/register-dynamic-skill.js +253 -0
  854. package/self-evolve/scripts/self-regression.js +125 -113
  855. package/skill-creator/SKILL.md +33 -77
  856. package/skill-creator/references/authoring-workflow.md +14 -0
  857. package/skill-creator/references/dynamic-generation-contract.md +21 -0
  858. package/skill-creator/references/quality-checklist.md +16 -0
  859. package/skill-creator/references/quality-principles.md +81 -81
  860. package/skill-creator/references/testing-workflow.md +27 -32
  861. package/skill-style/SKILL.md +33 -39
  862. package/skill-style/references/style-guide.md +62 -0
  863. package/submission/openai/README.md +67 -0
  864. package/submission/openai/listing.json +31 -0
  865. package/submission/openai/test-cases.json +61 -0
  866. package/tdd/SKILL.md +30 -45
  867. package/tdd/fixtures/pass-evidence.json +100 -0
  868. package/tdd/fixtures/quality-scenarios.json +20 -0
  869. package/tdd/guides/deep-modules.md +33 -33
  870. package/tdd/guides/interface-design.md +31 -31
  871. package/tdd/guides/mocking.md +59 -59
  872. package/tdd/guides/refactoring.md +10 -10
  873. package/tdd/guides/tests.md +61 -61
  874. package/tdd/references/core-discipline.md +51 -0
  875. package/tdd/references/integration-testing.md +13 -0
  876. package/tdd/references/quality-model.md +68 -0
  877. package/tdd/references/unit-testing.md +15 -0
  878. package/tdd/schemas/quality-evidence.schema.json +211 -0
  879. package/tdd/schemas/quality-report.schema.json +110 -0
  880. package/tdd/scripts/quality-gate.js +475 -0
  881. package/to-spec/SKILL.md +40 -0
  882. package/to-spec/references/process.md +77 -0
  883. package/to-spec/scripts/check-project-docs.js +239 -0
  884. package/to-spec/scripts/project-docs-resolver.js +111 -0
  885. package/to-spec/templates/cli-reference.md +31 -0
  886. package/to-spec/templates/dev-doc.md +27 -0
  887. package/to-spec/templates/feature-spec.md +59 -0
  888. package/to-spec/templates/schema-doc.md +31 -0
  889. package/to-tickets/SKILL.md +42 -0
  890. package/to-tickets/references/publishing-and-templates.md +97 -0
  891. package/todo-driven-workflow/SKILL.md +28 -40
  892. package/todo-driven-workflow/references/execution-guide.md +27 -0
  893. package/using-git-worktrees/SKILL.md +29 -141
  894. package/using-git-worktrees/references/workflow-details.md +108 -0
  895. package/verification-loop/SKILL.md +29 -121
  896. package/verification-loop/references/verification-phases.md +116 -0
  897. package/verification-loop/templates/verification-report.template.md +15 -0
  898. package/verify-before-claim/SKILL.md +27 -70
  899. package/verify-before-claim/references/verification-guide.md +73 -0
  900. package/zoom-out/SKILL.md +28 -76
  901. package/zoom-out/references/circuit-breaker.md +66 -0
  902. package/zoom-out/templates/zoom-out-report.template.md +20 -0
  903. package/build-multi-agent-system/AGENTS.md +0 -50
  904. package/build-multi-agent-system/README.md +0 -63
  905. package/build-multi-agent-system/SKILL.md +0 -68
  906. package/create-agent-launcher/SKILL.md +0 -48
  907. package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
  908. package/create-agent-launcher/workflows/01-init.md +0 -22
  909. package/create-agent-launcher/workflows/02-analysis.md +0 -26
  910. package/create-agent-launcher/workflows/03-generation.md +0 -29
  911. package/create-agent-launcher/workflows/04-launcher.md +0 -20
  912. package/docs/workflows/build-multi-agent-system.md +0 -62
  913. package/docs/workflows/create-agent-launcher.md +0 -62
  914. package/eval-framework/behavioral-test.js +0 -105
  915. package/eval-framework/cases/case2.json +0 -5
  916. package/eval-framework/mechanism-test.js +0 -251
  917. package/harness-everything/scripts/todo-cli.js +0 -157
  918. package/skill-style/STYLE.md +0 -37
@@ -1,506 +1,621 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Lightweight, non-intrusive installer for Harness OS.
4
- * Detects the local project layout (Claude Code, Cursor, etc.)
5
- * and merges the Harness hook definitions safely without destroying user configs.
6
- *
7
- * Placement rule: a platform's own native file/folder (`.claude/settings.json`,
8
- * `.cursorrules`, `.cursor/skills/`, etc.) is never moved - it lives exactly
9
- * where that platform expects it. Anything Harness itself needs that has no
10
- * native home (install manifest, runtime hook state, and - only for Claude,
11
- * which has no native project-skill directory - the installed skill copies)
12
- * converges into one exclusively-owned subfolder per platform:
13
- * `<platform-dir>/harness-everything/`. Nothing else ever creates a directory
14
- * literally named "harness-everything", so it can be added or removed as a
15
- * unit without touching anything else in that platform's directory.
16
- *
17
- * This file only orchestrates the install/uninstall flow (CLI parsing,
18
- * interactive prompts, sequencing). Each concern it delegates to lives in
19
- * scripts/lib/: skill discovery & manifest-tracked install/removal
20
- * (lib/skills.js, lib/manifest.js), Claude Code hook merge/removal
21
- * (lib/claude-hooks.js), advisory-file injection for hookless platforms
22
- * (lib/advisory-text.js), .gitignore/empty-dir housekeeping (lib/gitignore.js),
23
- * and the terminal picker widgets (lib/prompts.js).
24
- */
25
-
26
- const fs = require('fs');
27
- const path = require('path');
28
-
29
- const { getWorkspaceRoot, getUserPromptsDir } = require('./lib/workspace');
30
- const { interactiveSelect, interactiveSingleSelect, askQuestion } = require('./lib/prompts');
31
- const advisory = require('./lib/advisory-text');
32
- const claudeHooks = require('./lib/claude-hooks');
33
- const manifest = require('./lib/manifest');
34
- const skills = require('./lib/skills');
35
- const { ensureWorkspaceGitignorePatterns, cleanEmptyDirs } = require('./lib/gitignore');
36
-
37
- const userHome = require('os').homedir();
38
- const workspaceRoot = getWorkspaceRoot();
39
- const harnessSourceDir = path.resolve(__dirname, '..');
40
- const packageVersion = require(path.join(harnessSourceDir, 'package.json')).version;
41
-
42
- let platformModules = [];
43
- try {
44
- platformModules = require(path.join(__dirname, '../hooks/scripts/lib/platforms'));
45
- } catch (e) {
46
- platformModules = []; // Best-effort - gitignore hints and state cleanup degrade gracefully without it.
47
- }
48
-
49
- async function main() {
50
- const args = process.argv;
51
- const command = args[2] || 'install'; // 'install', 'add', 'skills', etc.
52
-
53
- const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
54
- const hasClaudeFlag = args.includes('--claude');
55
- const hasCursorFlag = args.includes('--cursor');
56
- const hasCopilotFlag = args.includes('--copilot');
57
- const hasCodexFlag = args.includes('--codex');
58
- const hasContinueFlag = args.includes('--continue');
59
- const hasHermesFlag = args.includes('--hermes');
60
- const hasAllFlag = args.includes('--all');
61
- const hasGlobalFlag = args.includes('--global') || args.includes('-g');
62
- const hasYesFlag = args.includes('-y') || args.includes('--yes');
63
- const hasAnyPlatformFlag = hasClaudeFlag || hasCursorFlag || hasCopilotFlag || hasCodexFlag || hasContinueFlag || hasHermesFlag || hasAllFlag;
64
- const requestedSkills = ['add', 'skill', 'skills'].includes(command)
65
- ? args.slice(3).filter(arg => !arg.startsWith('-'))
66
- : [];
67
-
68
- const claudeExists = fs.existsSync(path.join(workspaceRoot, '.claude'));
69
- const cursorExists = fs.existsSync(path.join(workspaceRoot, '.cursorrules'));
70
- const copilotExists = fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md')) || fs.existsSync(path.join(workspaceRoot, '.github'));
71
- const codexExists = fs.existsSync(path.join(workspaceRoot, 'AGENTS.md'));
72
- const continueExists = fs.existsSync(path.join(workspaceRoot, '.continue'));
73
- const hermesExists = fs.existsSync(path.join(workspaceRoot, '.hermes.md'));
74
- const detectedAny = claudeExists || cursorExists || copilotExists || codexExists || continueExists || hermesExists;
75
-
76
- if (command === 'uninstall') {
77
- await runUninstall({ hasYesFlag, args, isInteractive });
78
- return;
79
- }
80
-
81
- let targets = {
82
- claude: false,
83
- cursor: false,
84
- copilot: false,
85
- codex: false,
86
- continue: false,
87
- hermes: false
88
- };
89
- let chosenSkills = [];
90
- let isGlobal = hasGlobalFlag;
91
-
92
- const runInteractively = isInteractive && !hasYesFlag && !hasAnyPlatformFlag && (['install', 'add', 'skill', 'skills'].includes(command) && requestedSkills.length === 0);
93
-
94
- if (runInteractively) {
95
- console.log("=================================================");
96
- console.log(` Harness OS - Interactive Setup `);
97
- console.log("=================================================");
98
-
99
- // Step 1: Choose platforms
100
- console.log("\n[Step 1/3] Select target platforms to configure:");
101
- const platformItems = [
102
- { id: 'claude', name: `Claude Code (hook-enforced) ${claudeExists ? '(Detected)' : ''}`, checked: claudeExists || !detectedAny },
103
- { id: 'cursor', name: `Cursor (.cursorrules) ${cursorExists ? '(Detected)' : ''}`, checked: cursorExists },
104
- { id: 'copilot', name: `Copilot (.github/copilot-...) ${copilotExists ? '(Detected)' : ''}`, checked: copilotExists },
105
- { id: 'codex', name: `Codex (AGENTS.md) ${codexExists ? '(Detected)' : ''}`, checked: codexExists },
106
- { id: 'continue', name: `Continue.dev (.continue/rules) ${continueExists ? '(Detected)' : ''}`, checked: continueExists },
107
- { id: 'hermes', name: `Hermes Agent (.hermes.md) ${hermesExists ? '(Detected)' : ''}`, checked: hermesExists }
108
- ];
109
- const selectedPlatforms = await interactiveSelect(platformItems);
110
- selectedPlatforms.forEach(p => {
111
- targets[p.id] = p.checked;
112
- });
113
-
114
- // Step 2: Choose skills
115
- const availableSkills = skills.getAvailableSkills(harnessSourceDir);
116
- console.log("\n[Step 2/3] Select skills to install:");
117
- const skillItems = availableSkills.map(s => {
118
- const info = skills.getSkillInfo(harnessSourceDir, s);
119
- // Pre-check essential skills
120
- const isEssential = ['tdd', 'git-commit', 'todo-driven-workflow', 'verification-loop'].includes(s);
121
- const isHarnessEverything = s === 'harness-everything';
122
- return {
123
- id: s,
124
- name: isHarnessEverything ? `${s} (Required)` : s,
125
- description: info ? info.description : '',
126
- checked: isEssential || isHarnessEverything
127
- };
128
- });
129
- const selectedSkills = await interactiveSelect(skillItems, 8);
130
- chosenSkills = selectedSkills.filter(s => s.checked).map(s => s.id);
131
-
132
- // Step 3: Choose global vs local location
133
- console.log("\n[Step 3/3] Select installation scope / location:");
134
- const locationItems = [
135
- { id: 'local', name: "Local Workspace (Install to current project directories)", checked: true },
136
- { id: 'global', name: "Global (~/.agents - applies across all projects)", checked: false }
137
- ];
138
- const chosenLocationId = await interactiveSingleSelect(locationItems);
139
- isGlobal = chosenLocationId === 'global';
140
- } else {
141
- // Non-interactive/bypass mode
142
- isGlobal = hasGlobalFlag;
143
-
144
- if (['add', 'skill', 'skills'].includes(command)) {
145
- if (requestedSkills.length > 0) {
146
- const availableSkills = skills.getAvailableSkills(harnessSourceDir);
147
- for (const skillName of requestedSkills) {
148
- if (availableSkills.includes(skillName)) {
149
- chosenSkills.push(skillName);
150
- } else {
151
- console.error(`⚠️ Skill "${skillName}" not found. Skipping.`);
152
- }
153
- }
154
- } else {
155
- chosenSkills = ['tdd', 'git-commit', 'todo-driven-workflow', 'verification-loop', 'zoom-out', 'install-cognitive-os'];
156
- }
157
-
158
- if (!isGlobal) {
159
- targets.claude = claudeExists;
160
- targets.cursor = cursorExists;
161
- targets.copilot = copilotExists;
162
- targets.codex = codexExists;
163
- targets.continue = continueExists;
164
- targets.hermes = hermesExists;
165
- if (!detectedAny) {
166
- targets.claude = true;
167
- }
168
- }
169
- } else {
170
- if (hasAnyPlatformFlag) {
171
- if (hasAllFlag) {
172
- targets.claude = true;
173
- targets.cursor = true;
174
- targets.copilot = true;
175
- targets.codex = true;
176
- targets.continue = true;
177
- targets.hermes = true;
178
- } else {
179
- targets.claude = hasClaudeFlag;
180
- targets.cursor = hasCursorFlag;
181
- targets.copilot = hasCopilotFlag;
182
- targets.codex = hasCodexFlag;
183
- targets.continue = hasContinueFlag;
184
- targets.hermes = hasHermesFlag;
185
- }
186
- } else {
187
- if (detectedAny) {
188
- targets.claude = claudeExists;
189
- targets.cursor = cursorExists;
190
- targets.copilot = copilotExists;
191
- targets.codex = codexExists;
192
- targets.continue = continueExists;
193
- targets.hermes = hermesExists;
194
- } else {
195
- targets.claude = true;
196
- }
197
- }
198
- chosenSkills = ['tdd', 'git-commit', 'todo-driven-workflow', 'verification-loop', 'zoom-out', 'install-cognitive-os'];
199
- }
200
- }
201
-
202
- // Ensure harness-everything is ALWAYS included in chosenSkills
203
- if (!chosenSkills.includes('harness-everything')) {
204
- chosenSkills.push('harness-everything');
205
- }
206
-
207
- // If no targets selected at all, exit
208
- if (!targets.claude && !targets.cursor && !targets.copilot && !targets.codex && !targets.continue && !targets.hermes && !isGlobal) {
209
- console.log("\n❌ No platforms selected. Exiting.");
210
- process.exit(0);
211
- }
212
-
213
- const targetWorkspaceRoot = isGlobal ? path.join(userHome, '.agents') : workspaceRoot;
214
-
215
- console.log("\n-------------------------------------------------");
216
- console.log(`Installing Harness OS to ${isGlobal ? 'Global Home' : 'Local Workspace'}`);
217
- console.log("-------------------------------------------------");
218
-
219
- for (const platform of platformModules) {
220
- if (targets[platform.name] && typeof platform.install === 'function') {
221
- platform.install({
222
- isGlobal,
223
- targetWorkspaceRoot,
224
- harnessSourceDir,
225
- packageVersion,
226
- getUserPromptsDir,
227
- advisory,
228
- claudeHooks,
229
- manifest,
230
- userHome,
231
- workspaceRoot
232
- });
233
- }
234
- }
235
-
236
- // Install chosen skills. Every platform's skills stay at that platform's
237
- // own native location (unchanged) EXCEPT Claude, which has its copy under
238
- // .claude/skills/. Each platform's manifest.json tracks its own.
239
- if (chosenSkills.length > 0) {
240
- const targetDirs = [];
241
- const addedPaths = new Set();
242
- for (const platform of platformModules) {
243
- // If it's a global install, gather all configured/selected platforms or defaults
244
- if (targets[platform.name] || (isGlobal && (targets.claude || targets.cursor || targets.copilot || targets.codex || targets.continue || targets.hermes))) {
245
- if (typeof platform.getSkillsTarget === 'function') {
246
- const tgt = platform.getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest });
247
- if (tgt && tgt.path && !addedPaths.has(tgt.path)) {
248
- targetDirs.push(tgt);
249
- addedPaths.add(tgt.path);
250
- }
251
- }
252
- }
253
- }
254
-
255
- console.log(`\nInstalling Harness skills:`);
256
- skills.installSkillsToTargets({ chosenSkills, targetDirs, harnessSourceDir, packageVersion });
257
- }
258
-
259
- if (!isGlobal) {
260
- const patternsToIgnore = [];
261
- for (const platform of platformModules) {
262
- if (targets[platform.name] && typeof platform.getIgnorePatterns === 'function') {
263
- for (const pattern of platform.getIgnorePatterns(workspaceRoot)) {
264
- if (!patternsToIgnore.includes(pattern)) {
265
- patternsToIgnore.push(pattern);
266
- }
267
- }
268
- }
269
- }
270
- if (patternsToIgnore.length === 0) {
271
- // Fallback if platform modules failed to load entirely.
272
- if (targets.claude) patternsToIgnore.push('.claude/harness-everything/');
273
- if (targets.cursor) patternsToIgnore.push('.cursor/harness-everything/', '.cursor/skills/');
274
- if (targets.copilot) patternsToIgnore.push('.github/harness-everything/', '.github/skills/');
275
- if (targets.codex) patternsToIgnore.push('.codex/harness-everything/', '.codex/skills/');
276
- if (targets.continue) patternsToIgnore.push('.continue/harness-everything/', '.continue/skills/');
277
- }
278
-
279
- ensureWorkspaceGitignorePatterns(workspaceRoot, patternsToIgnore);
280
- }
281
-
282
- console.log("\n🎉 INSTALL SUCCESS! Harness OS is now protecting this project.");
283
- console.log("Try your first AI interaction! The bootstrapped OS will auto-route your tier.");
284
- console.log("=================================================");
285
- }
286
-
287
- async function runUninstall({ hasYesFlag, args, isInteractive }) {
288
- const localHarnessDirs = platformModules
289
- .filter(p => typeof p.getHarnessDir === 'function')
290
- .map(p => p.getHarnessDir(workspaceRoot));
291
-
292
- const localInstalled = fs.existsSync(path.join(workspaceRoot, '.harness')) || // legacy pre-reorg root
293
- localHarnessDirs.some(d => fs.existsSync(d)) ||
294
- fs.existsSync(path.join(workspaceRoot, '.claude', 'settings.json')) ||
295
- fs.existsSync(path.join(workspaceRoot, '.cursorrules')) ||
296
- fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md')) ||
297
- fs.existsSync(path.join(workspaceRoot, 'AGENTS.md')) ||
298
- fs.existsSync(path.join(workspaceRoot, '.continue', 'rules', 'harness.md')) ||
299
- fs.existsSync(path.join(workspaceRoot, '.hermes.md'));
300
-
301
- const globalAgentsDir = path.join(userHome, '.agents');
302
- const globalHarnessDir = manifest.getHarnessDir(globalAgentsDir);
303
- const globalInstalled = fs.existsSync(globalHarnessDir) ||
304
- fs.existsSync(path.join(userHome, '.claude', 'settings.json')) ||
305
- fs.existsSync(path.join(userHome, '.cursorrules')) ||
306
- fs.existsSync(path.join(userHome, '.continue', 'rules', 'harness.md')) ||
307
- fs.existsSync(path.join(getUserPromptsDir(), 'harness.instructions.md')) ||
308
- fs.existsSync(path.join(getUserPromptsDir(), 'harness.agent.md'));
309
-
310
- const installedSkills = skills.getInstalledSkills(workspaceRoot, userHome);
311
-
312
- console.log("=================================================");
313
- console.log(` Harness OS - Uninstall Utility `);
314
- console.log("=================================================");
315
-
316
- let removeLocal = false;
317
- let removeGlobal = false;
318
- let removeSkills = false;
319
-
320
- const runInteractively = isInteractive && !hasYesFlag;
321
-
322
- if (runInteractively) {
323
- const choices = [];
324
- if (localInstalled) {
325
- choices.push({ id: 'local', name: 'Uninstall Harness OS from Local Workspace (Hooks & Advisory files)', checked: true });
326
- }
327
- if (globalInstalled) {
328
- choices.push({ id: 'global', name: 'Uninstall Harness OS from Global Home (~/.agents, VS Code Prompts, etc.)', checked: false });
329
- }
330
-
331
- if (choices.length > 0) {
332
- console.log("\nSelect installation scopes to uninstall:");
333
- const selectedScopes = await interactiveSelect(choices);
334
- removeLocal = selectedScopes.some(s => s.id === 'local' && s.checked);
335
- removeGlobal = selectedScopes.some(s => s.id === 'global' && s.checked);
336
- } else {
337
- console.log("\nNo Harness OS installation detected in local workspace or global home.");
338
- }
339
-
340
- if (installedSkills.length > 0) {
341
- console.log(`\nDetected ${installedSkills.length} installed skill(s):`);
342
- installedSkills.forEach(s => {
343
- console.log(` - ${s.id} (${s.scope})`);
344
- });
345
-
346
- console.log("\nWould you like to uninstall these skills?");
347
- const skillChoiceItems = [
348
- { id: 'all', name: 'Remove ALL detected skills', checked: true },
349
- { id: 'select', name: 'Select specific skills to remove', checked: false },
350
- { id: 'none', name: 'Keep all skills', checked: false }
351
- ];
352
- const skillAction = await interactiveSingleSelect(skillChoiceItems);
353
-
354
- if (skillAction === 'all') {
355
- removeSkills = true;
356
- } else if (skillAction === 'select') {
357
- const selectSkillItems = installedSkills.map(s => ({
358
- id: s.dirPath,
359
- name: `${s.id} (${s.scope})`,
360
- checked: true,
361
- _entry: s
362
- }));
363
- const chosenSkillsToRemove = await interactiveSelect(selectSkillItems);
364
- for (const item of chosenSkillsToRemove) {
365
- if (item.checked) {
366
- skills.removeSkill(item._entry);
367
- console.log(` ✅ Removed skill: ${item.name}`);
368
- cleanEmptyDirs(item._entry.parentPath, [workspaceRoot, userHome]);
369
- }
370
- }
371
- }
372
- }
373
- } else {
374
- const hasLocalFlag = args.includes('--local');
375
- const hasGlobalUninstallFlag = args.includes('--global') || args.includes('-g');
376
- const hasSkillsUninstallFlag = args.includes('--skills');
377
-
378
- if (hasYesFlag) {
379
- // -y auto-confirms local (cwd-scoped, obviously "this project") but
380
- // must NEVER auto-confirm global (~/.agents, ~/.claude, etc.) just
381
- // because something global happens to exist - home-directory state
382
- // isn't implied by "yes" to the workspace you're standing in, and a
383
- // bare `-y` run from any random project must not be able to wipe it.
384
- removeLocal = localInstalled;
385
- removeGlobal = globalInstalled && hasGlobalUninstallFlag;
386
- removeSkills = installedSkills.length > 0;
387
- } else {
388
- removeLocal = hasLocalFlag;
389
- removeGlobal = hasGlobalUninstallFlag;
390
- removeSkills = hasSkillsUninstallFlag;
391
- }
392
- }
393
-
394
- if (removeLocal) {
395
- console.log("\n-------------------------------------------------");
396
- console.log("Uninstalling Harness OS from Local Workspace...");
397
- console.log("-------------------------------------------------");
398
-
399
- for (const platform of platformModules) {
400
- if (typeof platform.uninstall === 'function') {
401
- platform.uninstall({
402
- removeLocal: true,
403
- removeGlobal: false,
404
- workspaceRoot,
405
- userHome,
406
- getUserPromptsDir,
407
- cleanEmptyDirs,
408
- claudeHooks
409
- });
410
- }
411
-
412
- if (typeof platform.getStateDir === 'function') {
413
- const stateDir = platform.getStateDir(workspaceRoot);
414
- if (fs.existsSync(stateDir)) {
415
- fs.rmSync(stateDir, { recursive: true, force: true });
416
- console.log(` ✅ Removed local ${path.relative(workspaceRoot, stateDir).replace(/\\/g, '/')}/ directory`);
417
- }
418
- }
419
- }
420
-
421
- // One-time migration cleanup: earlier versions used a self-invented
422
- // top-level .harness/ directory for Claude's manifest + skill copies.
423
- const legacyHarnessDir = path.join(workspaceRoot, '.harness');
424
- if (fs.existsSync(legacyHarnessDir)) {
425
- fs.rmSync(legacyHarnessDir, { recursive: true, force: true });
426
- console.log(` ✅ Removed legacy .harness/ directory (superseded by .claude/harness-everything/)`);
427
- }
428
- }
429
-
430
- if (removeGlobal) {
431
- console.log("\n-------------------------------------------------");
432
- console.log("Uninstalling Harness OS from Global Home...");
433
- console.log("-------------------------------------------------");
434
-
435
- for (const platform of platformModules) {
436
- if (typeof platform.uninstall === 'function') {
437
- platform.uninstall({
438
- removeLocal: false,
439
- removeGlobal: true,
440
- workspaceRoot,
441
- userHome,
442
- getUserPromptsDir,
443
- cleanEmptyDirs,
444
- claudeHooks
445
- });
446
- }
447
- }
448
-
449
- // ~/.agents is a shared directory - other tools or the user's own files
450
- // may live there. Never touch it directly; only clean up the
451
- // harness-everything/ subfolder (manifest bookkeeping) and the skills/
452
- // subfolder this package exclusively owns, and only once each is
453
- // actually empty (manifest.json is removed automatically by the
454
- // skills-removal step below once no skills remain in it).
455
- cleanEmptyDirs(path.join(globalAgentsDir, 'skills'), [userHome]);
456
- cleanEmptyDirs(globalHarnessDir, [userHome]);
457
- }
458
-
459
- if (removeSkills && installedSkills.length > 0) {
460
- // This block is only reached via a bulk "remove everything detected"
461
- // path (interactive "all", or the non-interactive -y/--skills bypass) -
462
- // never via the interactive per-item picker, which already removes
463
- // exactly what the user checked. A bulk sweep must not reach into the
464
- // real global home directory unless the user separately opted into
465
- // global scope (same rule as the config removal above). Every entry in
466
- // `installedSkills` is already manifest-tracked (or, for legacy
467
- // installs, author-marker-verified) - see lib/skills.js - so this never
468
- // touches a skill Harness didn't install.
469
- const skillsToRemove = installedSkills.filter(s => s.scope !== 'global' || removeGlobal);
470
- const skippedGlobalCount = installedSkills.length - skillsToRemove.length;
471
-
472
- console.log("\n-------------------------------------------------");
473
- console.log("Uninstalling all detected skills...");
474
- console.log("-------------------------------------------------");
475
- for (const skill of skillsToRemove) {
476
- if (fs.existsSync(skill.dirPath)) {
477
- skills.removeSkill(skill);
478
- console.log(` ✅ Removed skill: ${skill.id} (${skill.scope})`);
479
- cleanEmptyDirs(skill.parentPath, [workspaceRoot, userHome]);
480
- }
481
- }
482
- if (skippedGlobalCount > 0) {
483
- console.log(` ℹ️ Skipped ${skippedGlobalCount} global-scoped skill(s) - pass --global (or select "Uninstall ... Global Home") to remove those too.`);
484
- }
485
- }
486
-
487
- // Final sweep: a platform's harness-everything/ dir (manifest + Claude's
488
- // skill copies) may have only just become empty above - either through the
489
- // bulk removeSkills block or the interactive per-item picker, both of
490
- // which clean up the skill's own parent dir but not necessarily this one.
491
- // Always safe to run unconditionally: cleanEmptyDirs only ever removes a
492
- // directory that's genuinely empty.
493
- for (const platform of platformModules) {
494
- if (typeof platform.getHarnessDir !== 'function') continue;
495
- cleanEmptyDirs(platform.getHarnessDir(workspaceRoot), [workspaceRoot, userHome]);
496
- }
497
- cleanEmptyDirs(path.join(workspaceRoot, '.claude'), [workspaceRoot, userHome]);
498
-
499
- console.log("\n🎉 UNINSTALL COMPLETE! Harness OS has been removed.");
500
- console.log("=================================================");
501
- }
502
-
503
- main().catch(err => {
504
- console.error(`\n❌ Install failed: ${err.message}`);
505
- process.exit(1);
506
- });
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Lightweight, non-intrusive installer for Harness OS.
4
+ * Detects the local project layout (Claude Code, Cursor, etc.)
5
+ * and merges the Harness hook definitions safely without destroying user configs.
6
+ *
7
+ * Placement rule: a platform's own native file/folder (`.claude/settings.json`,
8
+ * `.cursorrules`, `.cursor/skills/`, etc.) is never moved - it lives exactly
9
+ * where that platform expects it. Anything Harness itself needs that has no
10
+ * native home (install manifest, runtime hook state, and - only for Claude,
11
+ * which has no native project-skill directory - the installed skill copies)
12
+ * converges into one exclusively-owned subfolder per platform:
13
+ * `<platform-dir>/harness-everything/`. Nothing else ever creates a directory
14
+ * literally named "harness-everything", so it can be added or removed as a
15
+ * unit without touching anything else in that platform's directory.
16
+ *
17
+ * This file only orchestrates the install/uninstall flow (CLI parsing,
18
+ * interactive prompts, sequencing). Each concern it delegates to lives in
19
+ * scripts/lib/: skill discovery & manifest-tracked install/removal
20
+ * (lib/skills.js, lib/manifest.js), Claude Code hook merge/removal
21
+ * (lib/claude-hooks.js), advisory-file injection for hookless platforms
22
+ * (lib/advisory-text.js), .gitignore/empty-dir housekeeping (lib/gitignore.js),
23
+ * and the terminal picker widgets (lib/prompts.js).
24
+ */
25
+
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ const { getWorkspaceRoot, getWorkspaceStateDir, getUserPromptsDir } = require('./lib/workspace');
30
+ const { interactiveSelect, interactiveSingleSelect, askQuestion } = require('./lib/prompts');
31
+ const advisory = require('./lib/advisory-text');
32
+ const claudeHooks = require('./lib/claude-hooks');
33
+ const manifest = require('./lib/manifest');
34
+ const skills = require('./lib/skills');
35
+ const { ensureWorkspaceGitignorePatterns, removeWorkspaceExcludePatterns, cleanEmptyDirs } = require('./lib/gitignore');
36
+
37
+ const userHome = require('os').homedir();
38
+ const detectedWorkspaceRoot = getWorkspaceRoot();
39
+ // Global installs are valid outside a repository, but the module still needs
40
+ // a non-null path while it evaluates local-detection helpers. Keep this
41
+ // fallback private to global mode; main() rejects non-global work from a
42
+ // directory whose workspace identity cannot be resolved.
43
+ const workspaceRoot = detectedWorkspaceRoot || path.resolve(process.cwd());
44
+ const harnessSourceDir = path.resolve(__dirname, '..');
45
+ const packageVersion = require(path.join(harnessSourceDir, 'package.json')).version;
46
+
47
+ let platformModules = [];
48
+ try {
49
+ platformModules = require(path.join(__dirname, '../hooks/scripts/lib/platforms'));
50
+ } catch (e) {
51
+ platformModules = []; // Best-effort - gitignore hints and state cleanup degrade gracefully without it.
52
+ }
53
+
54
+ async function main() {
55
+ const args = process.argv;
56
+ const command = args[2] || 'install'; // 'install', 'add', 'skills', etc.
57
+
58
+ const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
59
+ const hasClaudeFlag = args.includes('--claude');
60
+ const hasCursorFlag = args.includes('--cursor');
61
+ const hasCopilotFlag = args.includes('--copilot');
62
+ const hasCodexFlag = args.includes('--codex');
63
+ const hasContinueFlag = args.includes('--continue');
64
+ const hasHermesFlag = args.includes('--hermes');
65
+ const hasAllFlag = args.includes('--all');
66
+ const hasGlobalFlag = args.includes('--global') || args.includes('-g');
67
+ const hasYesFlag = args.includes('-y') || args.includes('--yes');
68
+ // Self-heal repair mode: configure the platform touchpoints (advisory text,
69
+ // hooks settings, gitignore patterns) WITHOUT copying any skills into the
70
+ // workspace - skill installation is an explicit user choice, never a
71
+ // side effect of a background repair.
72
+ const hasNoSkillsFlag = args.includes('--no-skills');
73
+ if (!detectedWorkspaceRoot && !hasGlobalFlag) {
74
+ throw new Error('cannot install locally outside a git workspace; pass --global for a user-wide install');
75
+ }
76
+ const hasAnyPlatformFlag = hasClaudeFlag || hasCursorFlag || hasCopilotFlag || hasCodexFlag || hasContinueFlag || hasHermesFlag || hasAllFlag;
77
+ // #49: default 'auto' tries a junction (Windows) / symlink (elsewhere) into
78
+ // one canonical per-scope copy and silently falls back to an independent
79
+ // physical copy per target if that fails. --copy/--symlink override the
80
+ // auto-detection explicitly - --symlink surfaces a link failure as an
81
+ // error instead of silently falling back, since the user asked for it.
82
+ const linkMode = args.includes('--copy') ? 'copy' : args.includes('--symlink') ? 'symlink' : 'auto';
83
+
84
+ let requestedSkills = ['add', 'skill', 'skills'].includes(command)
85
+ ? args.slice(3).filter(arg => !arg.startsWith('-'))
86
+ : [];
87
+
88
+ const skillFlagIdx = args.indexOf('--skill') !== -1 ? args.indexOf('--skill') : args.indexOf('--skills');
89
+ if (skillFlagIdx !== -1 && args[skillFlagIdx + 1] && !args[skillFlagIdx + 1].startsWith('-')) {
90
+ requestedSkills.push(args[skillFlagIdx + 1]);
91
+ }
92
+
93
+ const claudeExists = fs.existsSync(path.join(workspaceRoot, '.claude'));
94
+ const cursorExists = fs.existsSync(path.join(workspaceRoot, '.cursorrules'));
95
+ const copilotExists = fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md')) || fs.existsSync(path.join(workspaceRoot, '.github'));
96
+ const codexExists = fs.existsSync(path.join(workspaceRoot, 'AGENTS.md'));
97
+ const continueExists = fs.existsSync(path.join(workspaceRoot, '.continue'));
98
+ const hermesExists = fs.existsSync(path.join(workspaceRoot, '.hermes.md'));
99
+ const detectedAny = claudeExists || cursorExists || copilotExists || codexExists || continueExists || hermesExists;
100
+
101
+ if (command === 'uninstall') {
102
+ await runUninstall({ hasYesFlag, args, isInteractive });
103
+ return;
104
+ }
105
+
106
+ let targets = {
107
+ claude: false,
108
+ cursor: false,
109
+ copilot: false,
110
+ codex: false,
111
+ continue: false,
112
+ hermes: false
113
+ };
114
+ let chosenSkills = [];
115
+ let isGlobal = hasGlobalFlag;
116
+
117
+ const runInteractively = isInteractive && !hasYesFlag && !hasAnyPlatformFlag && (['install', 'add', 'skill', 'skills'].includes(command) && requestedSkills.length === 0);
118
+
119
+ if (runInteractively) {
120
+ console.log("=================================================");
121
+ console.log(` Harness OS - Interactive Setup `);
122
+ console.log("=================================================");
123
+
124
+ // Step 1: Choose platforms
125
+ console.log("\n[Step 1/3] Select target platforms to configure:");
126
+ const platformItems = [
127
+ { id: 'claude', name: `Claude Code (hook-enforced) ${claudeExists ? '(Detected)' : ''}`, checked: claudeExists || !detectedAny },
128
+ { id: 'cursor', name: `Cursor (.cursorrules) ${cursorExists ? '(Detected)' : ''}`, checked: cursorExists },
129
+ { id: 'copilot', name: `Copilot (.github/copilot-...) ${copilotExists ? '(Detected)' : ''}`, checked: copilotExists },
130
+ { id: 'codex', name: `Codex (AGENTS.md) ${codexExists ? '(Detected)' : ''}`, checked: codexExists },
131
+ { id: 'continue', name: `Continue.dev (.continue/rules) ${continueExists ? '(Detected)' : ''}`, checked: continueExists },
132
+ { id: 'hermes', name: `Hermes Agent (.hermes.md) ${hermesExists ? '(Detected)' : ''}`, checked: hermesExists }
133
+ ];
134
+ const selectedPlatforms = await interactiveSelect(platformItems);
135
+ selectedPlatforms.forEach(p => {
136
+ targets[p.id] = p.checked;
137
+ });
138
+
139
+ // Step 2: Choose skills
140
+ const availableSkills = skills.getAvailableSkills(harnessSourceDir);
141
+ console.log("\n[Step 2/3] Select skills to install:");
142
+ const skillItems = availableSkills.map(s => {
143
+ const info = skills.getSkillInfo(harnessSourceDir, s);
144
+ // Pre-check all skills (install all by default)
145
+ const isHarnessEverything = s === 'harness-everything';
146
+ return {
147
+ id: s,
148
+ name: isHarnessEverything ? `${s} (Required)` : s,
149
+ description: info ? info.description : '',
150
+ checked: true
151
+ };
152
+ });
153
+ const selectedSkills = await interactiveSelect(skillItems, 8);
154
+ chosenSkills = selectedSkills.filter(s => s.checked).map(s => s.id);
155
+
156
+ // Step 3: Choose global vs local location
157
+ console.log("\n[Step 3/3] Select installation scope / location:");
158
+ const locationItems = [
159
+ { id: 'local', name: "Local Workspace (Install to current project directories)", checked: true },
160
+ { id: 'global', name: "Global (~/.agents - applies across all projects)", checked: false }
161
+ ];
162
+ const chosenLocationId = await interactiveSingleSelect(locationItems);
163
+ isGlobal = chosenLocationId === 'global';
164
+ } else {
165
+ // Non-interactive/bypass mode
166
+ isGlobal = hasGlobalFlag;
167
+
168
+ if (['add', 'skill', 'skills'].includes(command)) {
169
+ if (requestedSkills.length > 0) {
170
+ const availableSkills = skills.getAvailableSkills(harnessSourceDir);
171
+ for (const skillName of requestedSkills) {
172
+ if (availableSkills.includes(skillName)) {
173
+ chosenSkills.push(skillName);
174
+ } else {
175
+ console.error(`⚠️ Skill "${skillName}" not found. Skipping.`);
176
+ }
177
+ }
178
+ } else {
179
+ chosenSkills = skills.getAvailableSkills(harnessSourceDir);
180
+ }
181
+
182
+ if (!isGlobal) {
183
+ targets.claude = claudeExists;
184
+ targets.cursor = cursorExists;
185
+ targets.copilot = copilotExists;
186
+ targets.codex = codexExists;
187
+ targets.continue = continueExists;
188
+ targets.hermes = hermesExists;
189
+ if (!detectedAny) {
190
+ targets.claude = true;
191
+ }
192
+ }
193
+ } else {
194
+ if (hasAnyPlatformFlag) {
195
+ if (hasAllFlag) {
196
+ targets.claude = true;
197
+ targets.cursor = true;
198
+ targets.copilot = true;
199
+ targets.codex = true;
200
+ targets.continue = true;
201
+ targets.hermes = true;
202
+ } else {
203
+ targets.claude = hasClaudeFlag;
204
+ targets.cursor = hasCursorFlag;
205
+ targets.copilot = hasCopilotFlag;
206
+ targets.codex = hasCodexFlag;
207
+ targets.continue = hasContinueFlag;
208
+ targets.hermes = hasHermesFlag;
209
+ }
210
+ } else {
211
+ if (detectedAny) {
212
+ targets.claude = claudeExists;
213
+ targets.cursor = cursorExists;
214
+ targets.copilot = copilotExists;
215
+ targets.codex = codexExists;
216
+ targets.continue = continueExists;
217
+ targets.hermes = hermesExists;
218
+ } else {
219
+ targets.claude = true;
220
+ }
221
+ }
222
+ chosenSkills = hasNoSkillsFlag ? [] : skills.getAvailableSkills(harnessSourceDir);
223
+ }
224
+ }
225
+
226
+ // Ensure harness-everything is ALWAYS included in chosenSkills
227
+ if (!hasNoSkillsFlag && !chosenSkills.includes('harness-everything')) {
228
+ chosenSkills.push('harness-everything');
229
+ }
230
+
231
+ // If no targets selected at all, exit
232
+ if (!targets.claude && !targets.cursor && !targets.copilot && !targets.codex && !targets.continue && !targets.hermes && !isGlobal) {
233
+ console.log("\n❌ No platforms selected. Exiting.");
234
+ process.exit(0);
235
+ }
236
+
237
+ const targetWorkspaceRoot = isGlobal ? path.join(userHome, '.agents') : workspaceRoot;
238
+
239
+ console.log("\n-------------------------------------------------");
240
+ console.log(`Installing Harness OS to ${isGlobal ? 'Global Home' : 'Local Workspace'}`);
241
+ console.log("-------------------------------------------------");
242
+
243
+ for (const platform of platformModules) {
244
+ if (targets[platform.name] && typeof platform.install === 'function') {
245
+ platform.install({
246
+ isGlobal,
247
+ targetWorkspaceRoot,
248
+ harnessSourceDir,
249
+ packageVersion,
250
+ getUserPromptsDir,
251
+ advisory,
252
+ claudeHooks,
253
+ manifest,
254
+ userHome,
255
+ workspaceRoot
256
+ });
257
+ }
258
+ }
259
+
260
+ // Install chosen skills. Every platform's skills stay at that platform's
261
+ // own native location (unchanged) EXCEPT Claude, which has its copy under
262
+ // .claude/skills/. Each platform's manifest.json tracks its own.
263
+ if (chosenSkills.length > 0) {
264
+ const targetDirs = [];
265
+ const addedPaths = new Set();
266
+ for (const platform of platformModules) {
267
+ // If it's a global install, gather all configured/selected platforms or defaults
268
+ if (targets[platform.name] || (isGlobal && (targets.claude || targets.cursor || targets.copilot || targets.codex || targets.continue || targets.hermes))) {
269
+ if (typeof platform.getSkillsTarget === 'function') {
270
+ const tgt = platform.getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest });
271
+ if (tgt && tgt.path && !addedPaths.has(tgt.path)) {
272
+ targetDirs.push(tgt);
273
+ addedPaths.add(tgt.path);
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ console.log(`\nInstalling Harness skills:`);
280
+ const canonicalDir = skills.getCanonicalSkillsDir({ isGlobal, workspaceRoot, userHome });
281
+ skills.installSkillsToTargets({ chosenSkills, targetDirs, harnessSourceDir, packageVersion, canonicalDir, linkMode });
282
+
283
+ // Claude Code discovers named agents from .claude/agents/, not from a
284
+ // nested skill directory. Keep the source copies in fable-mode for plugin
285
+ // distribution, and also install them into Claude's native agent folder.
286
+ if (chosenSkills.includes('fable-mode') && targets.claude) {
287
+ const claudePlatform = platformModules.find(platform => platform.name === 'claude');
288
+ if (claudePlatform && typeof claudePlatform.getAgentsTarget === 'function') {
289
+ const agentTarget = claudePlatform.getAgentsTarget({ workspaceRoot, userHome, isGlobal, manifest });
290
+ skills.installAgentsToTarget({ target: agentTarget, harnessSourceDir, packageVersion });
291
+ }
292
+ }
293
+ }
294
+
295
+ if (!isGlobal) {
296
+ const patternsToIgnore = [];
297
+ for (const platform of platformModules) {
298
+ if (targets[platform.name] && typeof platform.getIgnorePatterns === 'function') {
299
+ for (const pattern of platform.getIgnorePatterns(workspaceRoot)) {
300
+ if (!patternsToIgnore.includes(pattern)) {
301
+ patternsToIgnore.push(pattern);
302
+ }
303
+ }
304
+ }
305
+ }
306
+ if (patternsToIgnore.length === 0) {
307
+ // Fallback if platform modules failed to load entirely.
308
+ if (targets.claude) patternsToIgnore.push('.claude/harness-everything/');
309
+ if (targets.cursor) patternsToIgnore.push('.cursor/harness-everything/', '.cursor/skills/');
310
+ if (targets.copilot) patternsToIgnore.push('.github/harness-everything/', '.github/skills/');
311
+ if (targets.codex) patternsToIgnore.push('.codex/harness-everything/', '.codex/skills/');
312
+ if (targets.continue) patternsToIgnore.push('.continue/harness-everything/', '.continue/skills/');
313
+ }
314
+
315
+ // The local canonical skills store (#49) is new territory - .agents/
316
+ // wasn't previously a Harness-owned local directory - so it needs its
317
+ // own ignore pattern rather than relying on any platform's own list.
318
+ if (chosenSkills.length > 0 && linkMode !== 'copy') {
319
+ const canonicalDir = skills.getCanonicalSkillsDir({ isGlobal: false, workspaceRoot, userHome });
320
+ if (fs.existsSync(canonicalDir)) {
321
+ patternsToIgnore.push('.agents/skills/');
322
+ }
323
+ }
324
+
325
+ ensureWorkspaceGitignorePatterns(workspaceRoot, patternsToIgnore);
326
+ }
327
+
328
+ console.log("\n🎉 INSTALL SUCCESS! Harness OS is now protecting this project.");
329
+ console.log("Try your first AI interaction! The bootstrapped OS will auto-route your tier.");
330
+ console.log("=================================================");
331
+ }
332
+
333
+ async function runUninstall({ hasYesFlag, args, isInteractive }) {
334
+ const localHarnessDirs = platformModules
335
+ .filter(p => typeof p.getHarnessDir === 'function')
336
+ .map(p => p.getHarnessDir(workspaceRoot));
337
+
338
+ const localInstalled = fs.existsSync(path.join(workspaceRoot, '.harness')) || // legacy pre-reorg root
339
+ localHarnessDirs.some(d => fs.existsSync(d)) ||
340
+ fs.existsSync(path.join(workspaceRoot, '.claude', 'settings.json')) ||
341
+ fs.existsSync(path.join(workspaceRoot, '.cursorrules')) ||
342
+ fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md')) ||
343
+ fs.existsSync(path.join(workspaceRoot, 'AGENTS.md')) ||
344
+ fs.existsSync(path.join(workspaceRoot, '.continue', 'rules', 'harness.md')) ||
345
+ fs.existsSync(path.join(workspaceRoot, '.hermes.md'));
346
+
347
+ const globalAgentsDir = path.join(userHome, '.agents');
348
+ const globalHarnessDir = manifest.getHarnessDir(globalAgentsDir);
349
+ const globalInstalled = fs.existsSync(globalHarnessDir) ||
350
+ fs.existsSync(path.join(userHome, '.claude', 'settings.json')) ||
351
+ fs.existsSync(path.join(userHome, '.cursorrules')) ||
352
+ fs.existsSync(path.join(userHome, '.continue', 'rules', 'harness.md')) ||
353
+ fs.existsSync(path.join(getUserPromptsDir(), 'harness.instructions.md')) ||
354
+ fs.existsSync(path.join(getUserPromptsDir(), 'harness.agent.md'));
355
+
356
+ const installedSkills = skills.getInstalledSkills(workspaceRoot, userHome);
357
+ const installedAgents = skills.getInstalledAgents(workspaceRoot, userHome);
358
+
359
+ console.log("=================================================");
360
+ console.log(` Harness OS - Uninstall Utility `);
361
+ console.log("=================================================");
362
+
363
+ let removeLocal = false;
364
+ let removeGlobal = false;
365
+ let removeSkills = false;
366
+
367
+ const hasLocalFlag = args.includes('--local');
368
+ const hasGlobalUninstallFlag = args.includes('--global') || args.includes('-g');
369
+ const hasSkillsUninstallFlag = args.includes('--skills');
370
+ // #48: any explicit scope flag wins over the interactive menu, even with a
371
+ // TTY attached - so `uninstall --local --global --skills` actually does
372
+ // what it says instead of being silently swapped for the checkbox menu
373
+ // (where only -y previously had that effect). Only a truly bare `uninstall`
374
+ // (no flags at all) still goes interactive when a TTY is available.
375
+ const hasAnyScopeFlag = hasYesFlag || hasLocalFlag || hasGlobalUninstallFlag || hasSkillsUninstallFlag;
376
+ const runInteractively = isInteractive && !hasAnyScopeFlag;
377
+
378
+ if (!runInteractively && !hasAnyScopeFlag) {
379
+ // #48: no flags AND no interactive terminal to fall back on - this used
380
+ // to silently do nothing while still printing "UNINSTALL COMPLETE!".
381
+ // Fail loudly instead so a non-TTY invocation (npx in some shells/CI/
382
+ // piped input) never looks like a successful no-op.
383
+ console.error("\n❌ No scope specified and no interactive terminal detected.");
384
+ console.error(" Pass flags to say what to remove, e.g.:");
385
+ console.error(" uninstall --local --skills");
386
+ console.error(" uninstall --local --global --skills -y");
387
+ console.error(" ...or run this command in an interactive terminal to use the menu.");
388
+ process.exit(1);
389
+ }
390
+
391
+ if (runInteractively) {
392
+ const choices = [];
393
+ if (localInstalled) {
394
+ choices.push({ id: 'local', name: 'Uninstall Harness OS from Local Workspace (Hooks & Advisory files)', checked: true });
395
+ }
396
+ if (globalInstalled) {
397
+ choices.push({ id: 'global', name: 'Uninstall Harness OS from Global Home (~/.agents, VS Code Prompts, etc.)', checked: false });
398
+ }
399
+
400
+ if (choices.length > 0) {
401
+ console.log("\nSelect installation scopes to uninstall:");
402
+ const selectedScopes = await interactiveSelect(choices);
403
+ removeLocal = selectedScopes.some(s => s.id === 'local' && s.checked);
404
+ removeGlobal = selectedScopes.some(s => s.id === 'global' && s.checked);
405
+ } else {
406
+ console.log("\nNo Harness OS installation detected in local workspace or global home.");
407
+ }
408
+
409
+ if (installedSkills.length > 0) {
410
+ console.log(`\nDetected ${installedSkills.length} installed skill(s):`);
411
+ installedSkills.forEach(s => {
412
+ console.log(` - ${s.id} (${s.scope})`);
413
+ });
414
+
415
+ console.log("\nWould you like to uninstall these skills?");
416
+ const skillChoiceItems = [
417
+ { id: 'all', name: 'Remove ALL detected skills', checked: true },
418
+ { id: 'select', name: 'Select specific skills to remove', checked: false },
419
+ { id: 'none', name: 'Keep all skills', checked: false }
420
+ ];
421
+ const skillAction = await interactiveSingleSelect(skillChoiceItems);
422
+
423
+ if (skillAction === 'all') {
424
+ removeSkills = true;
425
+ } else if (skillAction === 'select') {
426
+ const selectSkillItems = installedSkills.map(s => ({
427
+ id: s.dirPath,
428
+ name: `${s.id} (${s.scope})`,
429
+ checked: true,
430
+ _entry: s
431
+ }));
432
+ const chosenSkillsToRemove = await interactiveSelect(selectSkillItems);
433
+ for (const item of chosenSkillsToRemove) {
434
+ if (item.checked) {
435
+ skills.removeSkill(item._entry, { workspaceRoot, userHome });
436
+ console.log(` ✅ Removed skill: ${item.name}`);
437
+ cleanEmptyDirs(item._entry.parentPath, [workspaceRoot, userHome]);
438
+ }
439
+ }
440
+ }
441
+ }
442
+ } else {
443
+ if (hasYesFlag) {
444
+ // -y auto-confirms local (cwd-scoped, obviously "this project") but
445
+ // must NEVER auto-confirm global (~/.agents, ~/.claude, etc.) just
446
+ // because something global happens to exist - home-directory state
447
+ // isn't implied by "yes" to the workspace you're standing in, and a
448
+ // bare `-y` run from any random project must not be able to wipe it.
449
+ removeLocal = localInstalled;
450
+ removeGlobal = globalInstalled && hasGlobalUninstallFlag;
451
+ removeSkills = installedSkills.length > 0;
452
+ } else {
453
+ removeLocal = hasLocalFlag;
454
+ removeGlobal = hasGlobalUninstallFlag;
455
+ removeSkills = hasSkillsUninstallFlag;
456
+ }
457
+ }
458
+
459
+ if (removeLocal) {
460
+ console.log("\n-------------------------------------------------");
461
+ console.log("Uninstalling Harness OS from Local Workspace...");
462
+ console.log("-------------------------------------------------");
463
+
464
+ for (const platform of platformModules) {
465
+ if (typeof platform.uninstall === 'function') {
466
+ platform.uninstall({
467
+ removeLocal: true,
468
+ removeGlobal: false,
469
+ workspaceRoot,
470
+ userHome,
471
+ getUserPromptsDir,
472
+ cleanEmptyDirs,
473
+ claudeHooks
474
+ });
475
+ }
476
+
477
+ if (typeof platform.getStateDir === 'function') {
478
+ // Legacy per-workspace state dir (pre-#42) - almost always already
479
+ // gone by the time uninstall runs, since the first hook invocation
480
+ // after the fix migrates it into the global home below. Kept as a
481
+ // no-op-in-the-common-case safety net for a workspace that was
482
+ // never actually used since upgrading.
483
+ const stateDir = platform.getStateDir(workspaceRoot);
484
+ if (fs.existsSync(stateDir)) {
485
+ fs.rmSync(stateDir, { recursive: true, force: true });
486
+ console.log(` ✅ Removed local ${path.relative(workspaceRoot, stateDir).replace(/\\/g, '/')}/ directory`);
487
+ }
488
+ }
489
+ }
490
+
491
+ // Runtime state for this workspace now lives outside it entirely, under
492
+ // ~/.agents/harness-everything/workspaces/<key>/ (issue #42) - remove
493
+ // this workspace's slice of it too, so uninstalling doesn't leave an
494
+ // orphaned global state dir behind.
495
+ const globalWorkspaceStateDir = getWorkspaceStateDir(workspaceRoot);
496
+ if (fs.existsSync(globalWorkspaceStateDir)) {
497
+ fs.rmSync(globalWorkspaceStateDir, { recursive: true, force: true });
498
+ console.log(` ✅ Removed global runtime state for this workspace (${globalWorkspaceStateDir})`);
499
+ }
500
+
501
+ // One-time migration cleanup: earlier versions used a self-invented
502
+ // top-level .harness/ directory for Claude's manifest + skill copies.
503
+ const legacyHarnessDir = path.join(workspaceRoot, '.harness');
504
+ if (fs.existsSync(legacyHarnessDir)) {
505
+ fs.rmSync(legacyHarnessDir, { recursive: true, force: true });
506
+ console.log(` ✅ Removed legacy .harness/ directory (superseded by .claude/harness-everything/)`);
507
+ }
508
+
509
+ // Remove Harness's local-only ignore section (.git/info/exclude) and any
510
+ // legacy banner block older installers appended to the working-tree
511
+ // .gitignore. Only ever touches Harness-owned lines.
512
+ removeWorkspaceExcludePatterns(workspaceRoot);
513
+
514
+ for (const agent of installedAgents.filter(entry => entry.scope.startsWith('local'))) {
515
+ skills.removeAgent(agent);
516
+ console.log(` ✅ Removed agent: ${agent.filePath}`);
517
+ }
518
+ cleanEmptyDirs(path.join(workspaceRoot, '.claude', 'agents'), [workspaceRoot, userHome]);
519
+ }
520
+
521
+ if (removeGlobal) {
522
+ console.log("\n-------------------------------------------------");
523
+ console.log("Uninstalling Harness OS from Global Home...");
524
+ console.log("-------------------------------------------------");
525
+
526
+ for (const platform of platformModules) {
527
+ if (typeof platform.uninstall === 'function') {
528
+ platform.uninstall({
529
+ removeLocal: false,
530
+ removeGlobal: true,
531
+ workspaceRoot,
532
+ userHome,
533
+ getUserPromptsDir,
534
+ cleanEmptyDirs,
535
+ claudeHooks
536
+ });
537
+ }
538
+ }
539
+
540
+ // ~/.agents is a shared directory - other tools or the user's own files
541
+ // may live there. Never touch it directly; only clean up the
542
+ // harness-everything/ subfolder (manifest bookkeeping) and the skills/
543
+ // subfolder this package exclusively owns, and only once each is
544
+ // actually empty (manifest.json is removed automatically by the
545
+ // skills-removal step below once no skills remain in it).
546
+ cleanEmptyDirs(path.join(globalAgentsDir, 'skills'), [userHome]);
547
+ cleanEmptyDirs(globalHarnessDir, [userHome]);
548
+
549
+ for (const agent of installedAgents.filter(entry => entry.scope.startsWith('global'))) {
550
+ skills.removeAgent(agent);
551
+ console.log(` ✅ Removed agent: ${agent.filePath}`);
552
+ }
553
+ cleanEmptyDirs(path.join(userHome, '.claude', 'agents'), [workspaceRoot, userHome]);
554
+ cleanEmptyDirs(globalHarnessDir, [userHome]);
555
+ }
556
+
557
+ if (removeSkills && installedSkills.length > 0) {
558
+ // This block is only reached via a bulk "remove everything detected"
559
+ // path (interactive "all", or the non-interactive -y/--skills bypass) -
560
+ // never via the interactive per-item picker, which already removes
561
+ // exactly what the user checked. A bulk sweep must not reach into the
562
+ // real global home directory unless the user separately opted into
563
+ // global scope (same rule as the config removal above). Every entry in
564
+ // `installedSkills` is already manifest-tracked (or, for legacy
565
+ // installs, author-marker-verified) - see lib/skills.js - so this never
566
+ // touches a skill Harness didn't install.
567
+ const skillsToRemove = installedSkills.filter(s => s.scope !== 'global' || removeGlobal);
568
+ const skippedGlobalCount = installedSkills.length - skillsToRemove.length;
569
+
570
+ console.log("\n-------------------------------------------------");
571
+ console.log("Uninstalling all detected skills...");
572
+ console.log("-------------------------------------------------");
573
+ for (const skill of skillsToRemove) {
574
+ // pathPresent (not bare existsSync) so a dangling link - its canonical
575
+ // target already gone - still gets its manifest row cleaned up instead
576
+ // of being silently skipped forever.
577
+ if (skills.pathPresent(skill.dirPath)) {
578
+ skills.removeSkill(skill, { workspaceRoot, userHome });
579
+ console.log(` ✅ Removed skill: ${skill.id} (${skill.scope})`);
580
+ cleanEmptyDirs(skill.parentPath, [workspaceRoot, userHome]);
581
+ }
582
+ }
583
+ if (skippedGlobalCount > 0) {
584
+ console.log(` ℹ️ Skipped ${skippedGlobalCount} global-scoped skill(s) - pass --global (or select "Uninstall ... Global Home") to remove those too.`);
585
+ }
586
+ }
587
+
588
+ // Final sweep: a platform's harness-everything/ dir (manifest + Claude's
589
+ // skill copies) may have only just become empty above - either through the
590
+ // bulk removeSkills block or the interactive per-item picker, both of
591
+ // which clean up the skill's own parent dir but not necessarily this one.
592
+ // Always safe to run unconditionally: cleanEmptyDirs only ever removes a
593
+ // directory that's genuinely empty.
594
+ for (const platform of platformModules) {
595
+ if (typeof platform.getHarnessDir !== 'function') continue;
596
+ cleanEmptyDirs(platform.getHarnessDir(workspaceRoot), [workspaceRoot, userHome]);
597
+ }
598
+ cleanEmptyDirs(path.join(workspaceRoot, '.claude'), [workspaceRoot, userHome]);
599
+
600
+ // Canonical skills store (#49) - removeSkill() above already deletes each
601
+ // now-unreferenced canonical copy as its last link goes; this just tidies
602
+ // up the now-empty .agents/skills/ (and .agents/ itself, if nothing else
603
+ // put anything there). Runs here rather than inside the removeLocal/
604
+ // removeGlobal blocks above because skill removal itself happens later,
605
+ // in the removeSkills block below those - running any earlier would find
606
+ // the directory still populated.
607
+ if (removeLocal) {
608
+ cleanEmptyDirs(skills.getCanonicalSkillsDir({ isGlobal: false, workspaceRoot, userHome }), [workspaceRoot, userHome]);
609
+ }
610
+ if (removeGlobal) {
611
+ cleanEmptyDirs(skills.getCanonicalSkillsDir({ isGlobal: true, workspaceRoot, userHome }), [userHome]);
612
+ }
613
+
614
+ console.log("\n🎉 UNINSTALL COMPLETE! Harness OS has been removed.");
615
+ console.log("=================================================");
616
+ }
617
+
618
+ main().catch(err => {
619
+ console.error(`\n❌ Install failed: ${err.message}`);
620
+ process.exit(1);
621
+ });