harness-everything 0.2.2 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/.claude-plugin/marketplace.json +27 -0
  2. package/.claude-plugin/plugin.json +51 -0
  3. package/.gitattributes +1 -0
  4. package/.github/workflows/behavioral-evals.yml +36 -0
  5. package/.github/workflows/ci.yml +117 -0
  6. package/.github/workflows/release.yml +45 -0
  7. package/.husky/commit-msg +1 -0
  8. package/.waza.yaml +22 -0
  9. package/AGENTS.md +60 -2
  10. package/BENCHMARK_SOP.md +62 -62
  11. package/CHANGELOG.md +297 -114
  12. package/CODE_OF_CONDUCT.md +24 -0
  13. package/CONTRIBUTING.md +47 -0
  14. package/Dockerfile +18 -18
  15. package/LICENSE +201 -201
  16. package/README.md +279 -197
  17. package/SECURITY.md +33 -0
  18. package/VERIFICATION.md +394 -347
  19. package/ab-test-deep-analysis-2026-08-27.md +383 -0
  20. package/ab-test-results-2026-08-27.md +152 -0
  21. package/ab-test-statistical-analysis-31cases.md +193 -0
  22. package/behavioral-evals/README.md +85 -0
  23. package/behavioral-evals/analyze-plugin-results.js +110 -0
  24. package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
  25. package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
  26. package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
  27. package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
  28. package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
  29. package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
  30. package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
  31. package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
  32. package/behavioral-evals/cases/baseline-performance.yaml +34 -0
  33. package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
  34. package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
  35. package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
  36. package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
  37. package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
  38. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
  39. package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
  40. package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
  41. package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
  42. package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
  43. package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
  44. package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
  45. package/behavioral-evals/cases/pressure-scope-bypass.yaml +28 -0
  46. package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
  47. package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
  48. package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
  49. package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
  50. package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
  51. package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
  52. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +47 -0
  53. package/behavioral-evals/cases/scope-discipline.yaml +32 -0
  54. package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
  55. package/behavioral-evals/cases/verify-before-done.yaml +31 -0
  56. package/behavioral-evals/results/.gitkeep +0 -0
  57. package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
  58. package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
  59. package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
  60. package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
  61. package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
  62. package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
  63. package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
  64. package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
  65. package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
  66. package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
  67. package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
  68. package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
  69. package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
  70. package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
  71. package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
  72. package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
  73. package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
  74. package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
  75. package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
  76. package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
  77. package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
  78. package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
  79. package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
  80. package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
  81. package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
  82. package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
  83. package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
  84. package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
  85. package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
  86. package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
  87. package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
  88. package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
  89. package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
  90. package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
  91. package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
  92. package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
  93. package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
  94. package/behavioral-evals/results/run-20260827-115509.log +287 -0
  95. package/behavioral-evals/run-with-plugin.js +316 -0
  96. package/behavioral-evals/run.js +587 -0
  97. package/benchmarks/README.md +63 -0
  98. package/benchmarks/ab-test-2026-08-26/results.json +55 -0
  99. package/benchmarks/results/logs/.gitkeep +0 -0
  100. package/benchmarks/results/logs/test-a-harness.md +31 -0
  101. package/benchmarks/results/logs/test-a-vanilla.md +28 -0
  102. package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
  103. package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
  104. package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
  105. package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
  106. package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
  107. package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
  108. package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
  109. package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
  110. package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
  111. package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
  112. package/benchmarks/results/results.json +158 -0
  113. package/benchmarks/run.js +220 -0
  114. package/benchmarks/schema.json +44 -0
  115. package/bin/cli.js +152 -97
  116. package/ci/ab-test-cases/grill-me-adversarial.yaml +18 -0
  117. package/ci/ab-test-cases/tdd-test-first.yaml +23 -0
  118. package/ci/ab-test-cases/verification-loop-gates.yaml +25 -0
  119. package/ci/ab-test-cases/verify-before-claim-cites.yaml +18 -0
  120. package/ci/ab-test-harness.js +410 -0
  121. package/{eval-framework → ci}/cases/case1.json +5 -5
  122. package/ci/cases/case10-small-feature.json +5 -0
  123. package/ci/cases/case11-readme-typo-update.json +5 -0
  124. package/ci/cases/case12-chinese-macro-audit.json +5 -0
  125. package/{eval-framework → ci}/cases/case2.json +5 -5
  126. package/{eval-framework → ci}/cases/case3.json +5 -5
  127. package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
  128. package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
  129. package/ci/cases/case6-macro-skill-audit.json +5 -0
  130. package/ci/cases/case7-macro-reference-audit.json +5 -0
  131. package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
  132. package/ci/cases/case9-four-issue-audit.json +5 -0
  133. package/ci/consistency-check.js +347 -0
  134. package/ci/description-collision.js +109 -0
  135. package/ci/fable-mode-test.js +120 -0
  136. package/ci/fixtures/agency-agents/divisions.json +6 -0
  137. package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
  138. package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
  139. package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
  140. package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
  141. package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
  142. package/ci/mechanism-2a-rule-of-3.test.js +46 -0
  143. package/ci/mechanism-2b-boundary-guard.test.js +16 -0
  144. package/ci/mechanism-2c-state-persist.test.js +29 -0
  145. package/ci/mechanism-2d-fact-audit.test.js +18 -0
  146. package/ci/mechanism-2e-scope-guard.test.js +24 -0
  147. package/ci/mechanism-2f-stop-gate.test.js +23 -0
  148. package/ci/mechanism-2g-platform-ignore.test.js +88 -0
  149. package/ci/mechanism-2h-installer-manifest.test.js +147 -0
  150. package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
  151. package/ci/mechanism-2i-install-verification.test.js +34 -0
  152. package/ci/mechanism-2j-behavioral-runner.test.js +20 -0
  153. package/ci/mechanism-2k-reference-check.test.js +20 -0
  154. package/ci/mechanism-2l-multi-agent-workspace.test.js +105 -0
  155. package/ci/mechanism-test.js +71 -0
  156. package/ci/negative-controls.js +84 -0
  157. package/ci/reference-check.js +112 -0
  158. package/ci/release-consistency-check.js +123 -0
  159. package/ci/routing-check.js +90 -0
  160. package/{eval-framework → ci}/runner.js +56 -56
  161. package/ci/skill-routing-check.js +98 -0
  162. package/ci/test-helper.js +104 -0
  163. package/ci/test-negative-controls.js +148 -0
  164. package/commitlint.config.js +25 -0
  165. package/docker-verify.sh +266 -266
  166. package/docs/architecture.md +99 -95
  167. package/docs/audit.md +53 -0
  168. package/docs/mechanism-first-skill-mesh.md +163 -0
  169. package/docs/philosophy.md +47 -45
  170. package/docs/reflection.md +48 -34
  171. package/docs/routing.md +58 -45
  172. package/docs/troubleshooting.md +284 -0
  173. package/docs/workflows/environment-detection.md +10 -10
  174. package/docs/workflows/eval-harness.md +13 -6
  175. package/docs/workflows/fable-discipline.md +9 -9
  176. package/docs/workflows/fable-mode.md +29 -32
  177. package/docs/workflows/find-skills.md +36 -0
  178. package/docs/workflows/git-commit.md +18 -9
  179. package/docs/workflows/grill-me.md +11 -11
  180. package/docs/workflows/grill-with-docs.md +14 -7
  181. package/docs/workflows/harness-everything.md +95 -92
  182. package/docs/workflows/improve-codebase-architecture.md +15 -7
  183. package/docs/workflows/install-cognitive-os.md +60 -60
  184. package/docs/workflows/multi-agent-workspace.md +42 -0
  185. package/docs/workflows/repo-docs.md +12 -7
  186. package/docs/workflows/security-review.md +26 -7
  187. package/docs/workflows/self-evolve.md +27 -44
  188. package/docs/workflows/skill-creator.md +80 -75
  189. package/docs/workflows/skill-style.md +64 -64
  190. package/docs/workflows/tdd.md +42 -39
  191. package/docs/workflows/to-spec.md +83 -0
  192. package/docs/workflows/to-tickets.md +80 -0
  193. package/docs/workflows/todo-driven-workflow.md +34 -36
  194. package/docs/workflows/using-git-worktrees.md +12 -8
  195. package/docs/workflows/verification-loop.md +16 -14
  196. package/docs/workflows/verify-before-claim.md +12 -8
  197. package/docs/workflows/zoom-out.md +22 -10
  198. package/environment-detection/SKILL.md +25 -61
  199. package/environment-detection/references/shell-syntax-rules.md +76 -0
  200. package/environment-detection/scripts/preflight.js +103 -93
  201. package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
  202. package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
  203. package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
  204. package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
  205. package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
  206. package/eval-harness/SKILL.md +34 -51
  207. package/eval-harness/references/scoring-rubric.md +68 -0
  208. package/eval-harness/scripts/evaluate.js +77 -61
  209. package/evals/environment-detection/eval.yaml +26 -0
  210. package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
  211. package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
  212. package/evals/eval-harness/eval.yaml +26 -0
  213. package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
  214. package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
  215. package/evals/fable-discipline/eval.yaml +26 -0
  216. package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
  217. package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
  218. package/evals/fable-mode/eval.yaml +26 -0
  219. package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
  220. package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
  221. package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
  222. package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
  223. package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
  224. package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
  225. package/evals/find-skills/eval.yaml +26 -0
  226. package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
  227. package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
  228. package/evals/git-commit/eval.yaml +26 -0
  229. package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
  230. package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
  231. package/evals/grill-me/eval.yaml +26 -0
  232. package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
  233. package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
  234. package/evals/grill-with-docs/eval.yaml +26 -0
  235. package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
  236. package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
  237. package/evals/harness-everything/eval.yaml +26 -0
  238. package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
  239. package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
  240. package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
  241. package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
  242. package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
  243. package/evals/improve-codebase-architecture/eval.yaml +26 -0
  244. package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
  245. package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
  246. package/evals/install-cognitive-os/eval.yaml +26 -0
  247. package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
  248. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
  249. package/evals/multi-agent-workspace/eval.yaml +26 -0
  250. package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
  251. package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
  252. package/evals/repo-docs/eval.yaml +26 -0
  253. package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
  254. package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
  255. package/evals/rewrite-commits/eval.yaml +26 -0
  256. package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
  257. package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
  258. package/evals/security-review/eval.yaml +26 -0
  259. package/evals/security-review/tasks/negative-trigger.yaml +16 -0
  260. package/evals/security-review/tasks/positive-trigger.yaml +15 -0
  261. package/evals/self-evolve/eval.yaml +26 -0
  262. package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
  263. package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
  264. package/evals/skill-creator/eval.yaml +26 -0
  265. package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
  266. package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
  267. package/evals/skill-style/eval.yaml +26 -0
  268. package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
  269. package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
  270. package/evals/tdd/eval.yaml +26 -0
  271. package/evals/tdd/tasks/negative-trivia.yaml +16 -0
  272. package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
  273. package/evals/tdd/tasks/positive-feature.yaml +16 -0
  274. package/evals/tdd/tasks/positive-refactor.yaml +15 -0
  275. package/evals/to-spec/eval.yaml +26 -0
  276. package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
  277. package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
  278. package/evals/to-tickets/eval.yaml +26 -0
  279. package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
  280. package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
  281. package/evals/todo-driven-workflow/eval.yaml +26 -0
  282. package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
  283. package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
  284. package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
  285. package/evals/using-git-worktrees/eval.yaml +26 -0
  286. package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
  287. package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
  288. package/evals/verification-loop/eval.yaml +26 -0
  289. package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
  290. package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
  291. package/evals/verify-before-claim/eval.yaml +26 -0
  292. package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
  293. package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
  294. package/evals/zoom-out/eval.yaml +26 -0
  295. package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
  296. package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
  297. package/fable-discipline/SKILL.md +31 -28
  298. package/fable-discipline/references/discipline-rules.md +22 -0
  299. package/fable-mode/CONTRACT-FORMAT.md +51 -51
  300. package/fable-mode/SKILL.md +31 -43
  301. package/fable-mode/agents/fable-orchestrator.md +99 -92
  302. package/fable-mode/agents/fable-verifier.md +32 -32
  303. package/fable-mode/agents/fable-worker-haiku.md +52 -48
  304. package/fable-mode/agents/fable-worker-sonnet.md +53 -49
  305. package/fable-mode/execution-guardrails/SKILL.md +43 -87
  306. package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  307. package/fable-mode/fable-haiku/SKILL.md +36 -48
  308. package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  309. package/fable-mode/fable-opus/SKILL.md +36 -0
  310. package/fable-mode/fable-sonnet/SKILL.md +36 -0
  311. package/fable-mode/model-matrix.json +32 -0
  312. package/fable-mode/references/execution-phases.md +37 -0
  313. package/fable-mode/references/model-matrix.md +39 -0
  314. package/fable-mode/scripts/model-selector.js +129 -0
  315. package/find-skills/SKILL.md +48 -0
  316. package/find-skills/references/discovery-flow.md +102 -0
  317. package/find-skills/scripts/use-skill.js +106 -0
  318. package/git-commit/SKILL.md +35 -45
  319. package/git-commit/guides/ANGULAR_STYLE.md +60 -60
  320. package/git-commit/guides/COMMIT_GENERATION.md +23 -23
  321. package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
  322. package/git-commit/guides/MAIN_REPO.md +14 -14
  323. package/git-commit/guides/SUBMODULES.md +27 -27
  324. package/git-commit/references/commit-flow.md +30 -0
  325. package/grill-me/SKILL.md +34 -27
  326. package/grill-me/references/grilling-playbook.md +38 -0
  327. package/grill-with-docs/ADR-FORMAT.md +47 -47
  328. package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
  329. package/grill-with-docs/SKILL.md +33 -91
  330. package/grill-with-docs/references/session-playbook.md +97 -0
  331. package/harness-everything/SKILL.md +29 -128
  332. package/harness-everything/examples/README.md +9 -9
  333. package/harness-everything/examples/todo-workflow.md +22 -22
  334. package/harness-everything/references/skill-registry.md +39 -0
  335. package/harness-everything/references/triage-and-tiers.md +116 -0
  336. package/harness-everything/scripts/bootstrap.js +203 -140
  337. package/harness-everything/scripts/routing-keywords.json +320 -0
  338. package/harness-everything/scripts/self-heal.js +241 -189
  339. package/harness-everything/scripts/tier-router.js +334 -219
  340. package/harness-everything/scripts/verify-gate.js +100 -31
  341. package/hooks/hooks.json +155 -155
  342. package/hooks/scripts/atomic-commit-check.js +68 -68
  343. package/hooks/scripts/boundary-guard.js +55 -55
  344. package/hooks/scripts/context-compact.js +114 -114
  345. package/hooks/scripts/contract-test.js +79 -79
  346. package/hooks/scripts/depth-guard.js +65 -65
  347. package/hooks/scripts/lib/harness-state.js +139 -228
  348. package/hooks/scripts/lib/platforms/claude.js +72 -19
  349. package/hooks/scripts/lib/platforms/codex.js +24 -6
  350. package/hooks/scripts/lib/platforms/continue.js +23 -5
  351. package/hooks/scripts/lib/platforms/copilot.js +23 -5
  352. package/hooks/scripts/lib/platforms/cursor.js +23 -5
  353. package/hooks/scripts/lib/platforms/hermes.js +57 -57
  354. package/hooks/scripts/lib/platforms/index.js +17 -17
  355. package/hooks/scripts/lib/platforms/worktrees.js +20 -20
  356. package/hooks/scripts/reset-circuit-breaker.js +30 -30
  357. package/hooks/scripts/rule-of-3-tracker.js +124 -91
  358. package/hooks/scripts/rule-of-3.js +187 -176
  359. package/hooks/scripts/state-persist.js +99 -99
  360. package/hooks/scripts/stop-gate.js +80 -80
  361. package/hooks/scripts/subagent-scope-guard.js +88 -88
  362. package/improve-codebase-architecture/SKILL.md +31 -35
  363. package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
  364. package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
  365. package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
  366. package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
  367. package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  368. package/install-cognitive-os/SKILL.md +23 -80
  369. package/install-cognitive-os/references/cognitive-loop.md +27 -0
  370. package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  371. package/multi-agent-workspace/SKILL.md +37 -0
  372. package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
  373. package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
  374. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
  375. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
  376. package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  377. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
  378. package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  379. package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  380. package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
  381. package/multi-agent-workspace/references/agency-agents.md +31 -0
  382. package/multi-agent-workspace/references/architecture-guide.md +32 -0
  383. package/multi-agent-workspace/references/orchestration.md +48 -0
  384. package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  385. package/multi-agent-workspace/scripts/index_memory.js +51 -0
  386. package/multi-agent-workspace/scripts/scaffold.js +253 -0
  387. package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
  388. package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
  389. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
  390. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
  391. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
  392. package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
  393. package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
  394. package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
  395. package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
  396. package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
  397. package/multi-agent-workspace/workflows/01-init.md +22 -0
  398. package/multi-agent-workspace/workflows/02-analysis.md +23 -0
  399. package/multi-agent-workspace/workflows/03-generation.md +27 -0
  400. package/multi-agent-workspace/workflows/04-launcher.md +16 -0
  401. package/opencode-plugin/README.md +94 -0
  402. package/opencode-plugin/hooks/circuit-breaker.js +121 -0
  403. package/opencode-plugin/hooks/compliance.js +128 -0
  404. package/opencode-plugin/hooks/post-edit.js +62 -0
  405. package/opencode-plugin/hooks/pre-complete.js +65 -0
  406. package/opencode-plugin/hooks/verify.js +140 -0
  407. package/opencode-plugin/plugin.json +17 -0
  408. package/opencode-plugin/test-hook-firing.js +198 -0
  409. package/package.json +50 -22
  410. package/references/definition-of-done.md +67 -0
  411. package/references/performance-checklist.md +153 -0
  412. package/references/platform-advisory-template.md +58 -0
  413. package/references/security-checklist.md +205 -0
  414. package/repo-docs/SKILL.md +38 -37
  415. package/repo-docs/references/process-guide.md +60 -0
  416. package/repo-docs/templates/agents-template.md +264 -264
  417. package/repo-docs/templates/knowledge-agents-template.md +50 -50
  418. package/repo-docs/templates/knowledge-readme-template.md +83 -83
  419. package/repo-docs/templates/manual-recon.md +117 -117
  420. package/repo-docs/templates/multi-skills-readme-template.md +72 -72
  421. package/repo-docs/templates/product-agents-template.md +78 -78
  422. package/repo-docs/templates/product-readme-template.md +95 -95
  423. package/repo-docs/templates/readme-template.md +136 -136
  424. package/repo-docs/templates/single-skill-readme-template.md +70 -70
  425. package/repo-docs/templates/skills-agents-template.md +60 -60
  426. package/rewrite-commits/SKILL.md +22 -17
  427. package/rewrite-commits/references/workflow.md +18 -0
  428. package/scripts/installer.js +546 -506
  429. package/scripts/lib/advisory-text.js +8 -4
  430. package/scripts/lib/claude-hooks.js +18 -5
  431. package/scripts/lib/gitignore.js +199 -80
  432. package/scripts/lib/manifest.js +68 -4
  433. package/scripts/lib/prompts.js +1 -1
  434. package/scripts/lib/skills.js +87 -1
  435. package/scripts/verify-install.js +147 -0
  436. package/security-review/SKILL.md +35 -496
  437. package/security-review/guides/OWASP-PATTERNS.md +31 -0
  438. package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  439. package/security-review/references/security-checklist.md +478 -0
  440. package/security-review/scripts/audit-secrets.js +84 -0
  441. package/self-evolve/SKILL.md +38 -45
  442. package/self-evolve/references/memory-resolution.md +58 -0
  443. package/self-evolve/scripts/persist-memory.js +139 -40
  444. package/self-evolve/scripts/register-dynamic-skill.js +251 -0
  445. package/self-evolve/scripts/self-regression.js +110 -113
  446. package/skill-creator/SKILL.md +34 -76
  447. package/skill-creator/references/authoring-workflow.md +14 -0
  448. package/skill-creator/references/dynamic-generation-contract.md +21 -0
  449. package/skill-creator/references/quality-checklist.md +15 -0
  450. package/skill-creator/references/quality-principles.md +81 -81
  451. package/skill-creator/references/testing-workflow.md +27 -32
  452. package/skill-style/SKILL.md +33 -39
  453. package/skill-style/references/style-guide.md +36 -0
  454. package/tdd/SKILL.md +34 -43
  455. package/tdd/guides/deep-modules.md +33 -33
  456. package/tdd/guides/interface-design.md +31 -31
  457. package/tdd/guides/mocking.md +59 -59
  458. package/tdd/guides/refactoring.md +10 -10
  459. package/tdd/guides/tests.md +61 -61
  460. package/tdd/references/core-discipline.md +49 -0
  461. package/to-spec/SKILL.md +42 -0
  462. package/to-spec/references/process.md +77 -0
  463. package/to-spec/scripts/check-project-docs.js +259 -0
  464. package/to-spec/templates/cli-reference.md +31 -0
  465. package/to-spec/templates/dev-doc.md +27 -0
  466. package/to-spec/templates/feature-spec.md +59 -0
  467. package/to-spec/templates/schema-doc.md +31 -0
  468. package/to-tickets/SKILL.md +42 -0
  469. package/to-tickets/references/publishing-and-templates.md +97 -0
  470. package/todo-driven-workflow/SKILL.md +27 -41
  471. package/todo-driven-workflow/references/execution-guide.md +27 -0
  472. package/using-git-worktrees/SKILL.md +29 -141
  473. package/using-git-worktrees/references/workflow-details.md +108 -0
  474. package/verification-loop/SKILL.md +29 -121
  475. package/verification-loop/references/verification-phases.md +116 -0
  476. package/verification-loop/templates/verification-report.template.md +15 -0
  477. package/verify-before-claim/SKILL.md +27 -70
  478. package/verify-before-claim/references/verification-guide.md +73 -0
  479. package/zoom-out/SKILL.md +28 -76
  480. package/zoom-out/references/circuit-breaker.md +66 -0
  481. package/zoom-out/templates/zoom-out-report.template.md +20 -0
  482. package/build-multi-agent-system/AGENTS.md +0 -50
  483. package/build-multi-agent-system/README.md +0 -63
  484. package/build-multi-agent-system/SKILL.md +0 -68
  485. package/create-agent-launcher/SKILL.md +0 -48
  486. package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
  487. package/create-agent-launcher/workflows/01-init.md +0 -22
  488. package/create-agent-launcher/workflows/02-analysis.md +0 -26
  489. package/create-agent-launcher/workflows/03-generation.md +0 -29
  490. package/create-agent-launcher/workflows/04-launcher.md +0 -20
  491. package/docs/workflows/build-multi-agent-system.md +0 -62
  492. package/docs/workflows/create-agent-launcher.md +0 -62
  493. package/eval-framework/behavioral-test.js +0 -105
  494. package/eval-framework/mechanism-test.js +0 -251
  495. package/harness-everything/scripts/todo-cli.js +0 -157
  496. package/skill-style/STYLE.md +0 -37
@@ -1,228 +1,139 @@
1
- #!/usr/bin/env node
2
- // Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
3
- // counters, handoff/verification timestamps, etc). Lives under the active
4
- // platform's own harness-everything/ subfolder (see each module's
5
- // getStateDir() in hooks/scripts/lib/platforms/) - a sibling of that same
6
- // platform's install manifest, and (for Claude only) its skill copies.
7
- //
8
- // For Claude Code that's `<repo root>/.claude/harness-everything/state/`,
9
- // keyed by session_id under `sessions/<id>/` so two sessions open on the same
10
- // repo never share (and stomp) each other's edit/verify timestamps or
11
- // breaker counts. Invocations with no session_id (manual terminal runs,
12
- // VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
13
- // rather than a random one, so manual testing stays predictable.
14
- const fs = require('fs');
15
- const path = require('path');
16
-
17
- const CURRENT_SESSION_FILE = 'current-session';
18
- const DEFAULT_SESSION = 'default';
19
-
20
- function getWorkspaceRoot() {
21
- let dir = path.resolve(process.cwd());
22
- while (dir !== path.parse(dir).root) {
23
- if (fs.existsSync(path.join(dir, '.git'))) return dir;
24
- dir = path.dirname(dir);
25
- }
26
- return process.cwd();
27
- }
28
-
29
- function detectActivePlatform(wsRoot) {
30
- const root = wsRoot || getWorkspaceRoot();
31
-
32
- // 1. Check explicit environment variables
33
- if (process.env.CLAUDE === '1' || process.env.CLAUDE) return 'claude';
34
- if (process.env.CURSOR === '1' || process.env.CURSOR) return 'cursor';
35
- if (process.env.COPILOT === '1' || process.env.COPILOT) return 'copilot';
36
- if (process.env.CONTINUE === '1' || process.env.CONTINUE) return 'continue';
37
-
38
- // 2. Check parent/environment standard indicators
39
- if (process.env.TERM_PROGRAM === 'vscode') {
40
- if (fs.existsSync(path.join(root, '.cursorrules'))) {
41
- return 'cursor';
42
- }
43
- if (fs.existsSync(path.join(root, '.github', 'copilot-instructions.md'))) {
44
- return 'copilot';
45
- }
46
- return 'copilot'; // Default fallback for standard VS Code terminal
47
- }
48
-
49
- // 3. Fallback to detecting workspace configuration presence
50
- if (fs.existsSync(path.join(root, '.claude', 'settings.json'))) return 'claude';
51
- if (fs.existsSync(path.join(root, '.cursorrules'))) return 'cursor';
52
- if (fs.existsSync(path.join(root, '.github', 'copilot-instructions.md'))) return 'copilot';
53
- if (fs.existsSync(path.join(root, '.continue'))) return 'continue';
54
- if (fs.existsSync(path.join(root, 'AGENTS.md'))) return 'codex';
55
- if (fs.existsSync(path.join(root, '.hermes.md'))) return 'hermes';
56
-
57
- return 'claude'; // Default global fallback
58
- }
59
-
60
- function ensureHarnessStateIgnored(rootPath) {
61
- const wsRoot = rootPath || getWorkspaceRoot();
62
- const gitignorePath = path.join(wsRoot, '.gitignore');
63
-
64
- try {
65
- let content = '';
66
- if (fs.existsSync(gitignorePath)) {
67
- content = fs.readFileSync(gitignorePath, 'utf8');
68
- }
69
-
70
- const lines = content.split(/\r?\n/);
71
- const patternsToAdd = [];
72
-
73
- // Load and collect patterns & matching rules dynamically from all platforms
74
- const allPlatforms = require('./platforms');
75
- const dynamicPatterns = [];
76
- const patternToPlatformMap = new Map();
77
-
78
- // Forcefully ensure active platform's state directory pattern is included
79
- const activePlatformName = detectActivePlatform(wsRoot);
80
- const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
81
-
82
- if (activePlatform && typeof activePlatform.getStateDir === 'function') {
83
- const activeStateDir = activePlatform.getStateDir(wsRoot);
84
- const relativeStateDir = path.relative(wsRoot, activeStateDir).replace(/\\/g, '/') + '/';
85
- dynamicPatterns.push(relativeStateDir);
86
- patternToPlatformMap.set(relativeStateDir, activePlatform);
87
- }
88
-
89
- for (const platform of allPlatforms) {
90
- const patterns = platform.getIgnorePatterns(wsRoot);
91
- for (const pattern of patterns) {
92
- if (!dynamicPatterns.includes(pattern)) {
93
- dynamicPatterns.push(pattern);
94
- }
95
- patternToPlatformMap.set(pattern, platform);
96
- }
97
- }
98
-
99
- for (const pattern of dynamicPatterns) {
100
- const platform = patternToPlatformMap.get(pattern);
101
- const isIgnored = lines.some(line => {
102
- const trimmed = line.trim();
103
- // Delegate matching logic to the specific platform module if available
104
- if (platform && typeof platform.isMatch === 'function') {
105
- return platform.isMatch(pattern, trimmed);
106
- }
107
- return trimmed === pattern || trimmed === pattern.slice(0, -1);
108
- });
109
-
110
- if (!isIgnored) {
111
- patternsToAdd.push(pattern);
112
- }
113
- }
114
-
115
- // This runs once per hook invocation - i.e. once per Claude Code
116
- // subprocess - with no cross-process lock around the read-then-append
117
- // below. Two hook invocations firing close together (e.g. two tool
118
- // calls in the same turn) can each read the file before either has
119
- // written, so both decide the same pattern is missing and both append
120
- // it, leaving an exact duplicate line behind. Rather than add real
121
- // cross-process locking for a housekeeping file that already fails
122
- // silently by design, every call also collapses any exact-duplicate
123
- // non-comment/non-blank line it finds - so a duplicate from a lost
124
- // race self-heals on the very next invocation instead of accumulating.
125
- const seen = new Set();
126
- let sawDuplicate = false;
127
- const dedupedLines = lines.filter(line => {
128
- const trimmed = line.trim();
129
- if (trimmed === '' || trimmed.startsWith('#')) return true;
130
- if (seen.has(trimmed)) {
131
- sawDuplicate = true;
132
- return false;
133
- }
134
- seen.add(trimmed);
135
- return true;
136
- });
137
-
138
- if (patternsToAdd.length > 0 || sawDuplicate) {
139
- while (dedupedLines.length > 0 && dedupedLines[dedupedLines.length - 1] === '') {
140
- dedupedLines.pop();
141
- }
142
- const finalLines = dedupedLines.concat(patternsToAdd);
143
- fs.writeFileSync(gitignorePath, finalLines.join('\n') + '\n', 'utf8');
144
- }
145
- } catch (err) {
146
- // Fail silently to avoid breaking execution if .gitignore is write-locked
147
- }
148
- }
149
-
150
- function getStateRoot(root) {
151
- const wsRoot = root || getWorkspaceRoot();
152
- const activePlatformName = detectActivePlatform(wsRoot);
153
- const allPlatforms = require('./platforms');
154
- const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
155
-
156
- if (activePlatform && typeof activePlatform.getStateDir === 'function') {
157
- return activePlatform.getStateDir(wsRoot);
158
- }
159
- return path.join(wsRoot, '.claude', 'harness-state');
160
- }
161
-
162
- function getSessionDir(root, sessionId) {
163
- const resolvedRoot = root || getWorkspaceRoot();
164
- ensureHarnessStateIgnored(resolvedRoot);
165
- const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionId || DEFAULT_SESSION);
166
- fs.mkdirSync(dir, { recursive: true });
167
- return dir;
168
- }
169
-
170
- function listSessionDirs(root) {
171
- const sessionsRoot = path.join(getStateRoot(root), 'sessions');
172
- try {
173
- return fs.readdirSync(sessionsRoot, { withFileTypes: true })
174
- .filter(e => e.isDirectory())
175
- .map(e => path.join(sessionsRoot, e.name));
176
- } catch (err) {
177
- return [];
178
- }
179
- }
180
-
181
- function writeCurrentSession(root, sessionId) {
182
- if (!sessionId) return;
183
- try {
184
- const wsRoot = root || getWorkspaceRoot();
185
- ensureHarnessStateIgnored(wsRoot);
186
- const stateRoot = getStateRoot(wsRoot);
187
- fs.mkdirSync(stateRoot, { recursive: true });
188
- fs.writeFileSync(path.join(stateRoot, CURRENT_SESSION_FILE), sessionId, 'utf8');
189
- } catch (err) {
190
- // Best-effort - only the manual reset-circuit-breaker.js escape hatch
191
- // depends on this, and it fails open too.
192
- }
193
- }
194
-
195
- function readCurrentSession(root) {
196
- try {
197
- const id = fs.readFileSync(path.join(getStateRoot(root), CURRENT_SESSION_FILE), 'utf8').trim();
198
- return id || null;
199
- } catch (err) {
200
- return null;
201
- }
202
- }
203
-
204
- // Bootstrap-time housekeeping: nothing purges stale session directories the
205
- // way an OS temp dir would, so SessionStart drops ones untouched for a while.
206
- function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
207
- const now = Date.now();
208
- for (const dir of listSessionDirs(root)) {
209
- try {
210
- if (now - fs.statSync(dir).mtimeMs > maxAgeMs) {
211
- fs.rmSync(dir, { recursive: true, force: true });
212
- }
213
- } catch (err) {
214
- // Ignore - worst case a stale dir lingers until the next prune.
215
- }
216
- }
217
- }
218
-
219
- module.exports = {
220
- DEFAULT_SESSION,
221
- getWorkspaceRoot,
222
- getStateRoot,
223
- getSessionDir,
224
- listSessionDirs,
225
- writeCurrentSession,
226
- readCurrentSession,
227
- pruneStaleSessions,
228
- };
1
+ #!/usr/bin/env node
2
+ // Shared path resolution for Harness runtime state (hook JSON, circuit-breaker
3
+ // counters, handoff/verification timestamps, etc). Lives under the active
4
+ // platform's own harness-everything/ subfolder (see each module's
5
+ // getStateDir() in hooks/scripts/lib/platforms/) - a sibling of that same
6
+ // platform's install manifest, and (for Claude only) its skill copies.
7
+ //
8
+ // For Claude Code that's `<repo root>/.claude/harness-everything/state/`,
9
+ // keyed by session_id under `sessions/<id>/` so two sessions open on the same
10
+ // repo never share (and stomp) each other's edit/verify timestamps or
11
+ // breaker counts. Invocations with no session_id (manual terminal runs,
12
+ // VERIFICATION.md recipes) fall into a fixed `sessions/default/` bucket
13
+ // rather than a random one, so manual testing stays predictable.
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+
17
+ const CURRENT_SESSION_FILE = 'current-session';
18
+ const DEFAULT_SESSION = 'default';
19
+
20
+ function getWorkspaceRoot() {
21
+ let dir = path.resolve(process.cwd());
22
+ while (dir !== path.parse(dir).root) {
23
+ if (fs.existsSync(path.join(dir, '.git'))) return dir;
24
+ dir = path.dirname(dir);
25
+ }
26
+ return process.cwd();
27
+ }
28
+
29
+ function detectActivePlatform(wsRoot) {
30
+ const root = wsRoot || getWorkspaceRoot();
31
+
32
+ // 1. Explicit environment variables - strongest signal. Claude Code sets
33
+ // CLAUDECODE=1 / CLAUDE_CODE_ENTRYPOINT inside its own shell; a bare
34
+ // TERM_PROGRAM=vscode does NOT mean Copilot, because Claude Code's
35
+ // integrated terminal reports vscode too.
36
+ const env = process.env;
37
+ if (env.CLAUDE === '1' || env.CLAUDE || env.CLAUDECODE === '1' ||
38
+ env.CLAUDE_CODE === 'true' || env.CLAUDE_CODE_ENTRYPOINT) return 'claude';
39
+ if (env.CURSOR === '1' || env.CURSOR || env.CURSOR_AGENT) return 'cursor';
40
+ if (env.COPILOT === '1' || env.COPILOT || env.GITHUB_COPILOT_CHAT === 'true') return 'copilot';
41
+ if (env.CONTINUE === '1' || env.CONTINUE) return 'continue';
42
+
43
+ // 2. Workspace configuration presence - which platform's config actually
44
+ // lives here beats inferring from the terminal program.
45
+ if (fs.existsSync(path.join(root, '.claude', 'settings.json'))) return 'claude';
46
+ if (fs.existsSync(path.join(root, '.cursorrules'))) return 'cursor';
47
+ if (fs.existsSync(path.join(root, '.github', 'copilot-instructions.md'))) return 'copilot';
48
+ if (fs.existsSync(path.join(root, '.continue'))) return 'continue';
49
+ if (fs.existsSync(path.join(root, 'AGENTS.md'))) return 'codex';
50
+ if (fs.existsSync(path.join(root, '.hermes.md'))) return 'hermes';
51
+
52
+ // 3. Weak terminal inference, last resort only.
53
+ if (env.TERM_PROGRAM === 'vscode') return 'copilot';
54
+
55
+ return 'claude'; // Default global fallback
56
+ }
57
+
58
+ // Runtime hooks must NEVER touch .gitignore - that file is install/uninstall
59
+ // territory (scripts/installer.js -> lib/gitignore.js). Rewriting it on every
60
+ // hook invocation caused repeated diffs and surprised users mid-session.
61
+
62
+ function getStateRoot(root) {
63
+ const wsRoot = root || getWorkspaceRoot();
64
+ const activePlatformName = detectActivePlatform(wsRoot);
65
+ const allPlatforms = require('./platforms');
66
+ const activePlatform = allPlatforms.find(p => p.name === activePlatformName) || allPlatforms.find(p => p.name === 'claude');
67
+
68
+ if (activePlatform && typeof activePlatform.getStateDir === 'function') {
69
+ return activePlatform.getStateDir(wsRoot);
70
+ }
71
+ return path.join(wsRoot, '.claude', 'harness-everything', 'state');
72
+ }
73
+
74
+ function getSessionDir(root, sessionId) {
75
+ const resolvedRoot = root || getWorkspaceRoot();
76
+ const dir = path.join(getStateRoot(resolvedRoot), 'sessions', sessionId || DEFAULT_SESSION);
77
+ fs.mkdirSync(dir, { recursive: true });
78
+ return dir;
79
+ }
80
+
81
+ function listSessionDirs(root) {
82
+ const sessionsRoot = path.join(getStateRoot(root), 'sessions');
83
+ try {
84
+ return fs.readdirSync(sessionsRoot, { withFileTypes: true })
85
+ .filter(e => e.isDirectory())
86
+ .map(e => path.join(sessionsRoot, e.name));
87
+ } catch (err) {
88
+ return [];
89
+ }
90
+ }
91
+
92
+ function writeCurrentSession(root, sessionId) {
93
+ if (!sessionId) return;
94
+ try {
95
+ const wsRoot = root || getWorkspaceRoot();
96
+ const stateRoot = getStateRoot(wsRoot);
97
+ fs.mkdirSync(stateRoot, { recursive: true });
98
+ fs.writeFileSync(path.join(stateRoot, CURRENT_SESSION_FILE), sessionId, 'utf8');
99
+ } catch (err) {
100
+ // Best-effort - only the manual reset-circuit-breaker.js escape hatch
101
+ // depends on this, and it fails open too.
102
+ }
103
+ }
104
+
105
+ function readCurrentSession(root) {
106
+ try {
107
+ const id = fs.readFileSync(path.join(getStateRoot(root), CURRENT_SESSION_FILE), 'utf8').trim();
108
+ return id || null;
109
+ } catch (err) {
110
+ return null;
111
+ }
112
+ }
113
+
114
+ // Bootstrap-time housekeeping: nothing purges stale session directories the
115
+ // way an OS temp dir would, so SessionStart drops ones untouched for a while.
116
+ function pruneStaleSessions(root, maxAgeMs = 14 * 24 * 60 * 60 * 1000) {
117
+ const now = Date.now();
118
+ for (const dir of listSessionDirs(root)) {
119
+ try {
120
+ if (now - fs.statSync(dir).mtimeMs > maxAgeMs) {
121
+ fs.rmSync(dir, { recursive: true, force: true });
122
+ }
123
+ } catch (err) {
124
+ // Ignore - worst case a stale dir lingers until the next prune.
125
+ }
126
+ }
127
+ }
128
+
129
+ module.exports = {
130
+ DEFAULT_SESSION,
131
+ getWorkspaceRoot,
132
+ detectActivePlatform,
133
+ getStateRoot,
134
+ getSessionDir,
135
+ listSessionDirs,
136
+ writeCurrentSession,
137
+ readCurrentSession,
138
+ pruneStaleSessions,
139
+ };
@@ -1,6 +1,33 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs');
3
3
 
4
+ // Removes legacy static-skill subfolders left behind by the pre-0.2.2 bug
5
+ // that installed skills to .claude/harness-everything/skills/ instead of the
6
+ // native .claude/skills/, WITHOUT touching skills/generated/ - self-evolve
7
+ // stores the user's own dynamically-generated skills there (see
8
+ // skill-creator/SKILL.md §4), and a blind recursive rmSync on the whole
9
+ // skills/ folder would silently delete that accumulated learning.
10
+ function cleanupLegacySkillsDir(oldSkillsDir) {
11
+ if (!fs.existsSync(oldSkillsDir)) return;
12
+ try {
13
+ const entries = fs.readdirSync(oldSkillsDir, { withFileTypes: true });
14
+ let removedAny = false;
15
+ for (const entry of entries) {
16
+ if (entry.name === 'generated') continue;
17
+ fs.rmSync(path.join(oldSkillsDir, entry.name), { recursive: true, force: true });
18
+ removedAny = true;
19
+ }
20
+ if (fs.readdirSync(oldSkillsDir).length === 0) {
21
+ fs.rmdirSync(oldSkillsDir);
22
+ }
23
+ if (removedAny) {
24
+ console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/ (preserved skills/generated/ - self-evolve's own dynamic skills)`);
25
+ }
26
+ } catch (e) {
27
+ console.warn(` ⚠️ Failed to clean up legacy skills folder: ${e.message}`);
28
+ }
29
+ }
30
+
4
31
  // Claude Code has native project-skill directory: .claude/skills/.
5
32
  // Runtime state converges into .claude/harness-everything/.
6
33
  module.exports = {
@@ -17,16 +44,46 @@ module.exports = {
17
44
  },
18
45
  getIgnorePatterns(workspaceRoot) {
19
46
  const patterns = ['.claude/harness-everything/'];
20
- if (fs.existsSync(path.join(workspaceRoot, '.claude', 'skills'))) {
21
- patterns.push('.claude/skills/');
47
+ const skillsDir = path.join(workspaceRoot, '.claude', 'skills');
48
+ if (fs.existsSync(skillsDir)) {
49
+ try {
50
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
51
+ for (const entry of entries) {
52
+ if (entry.isDirectory()) {
53
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
54
+ if (fs.existsSync(skillMdPath)) {
55
+ const content = fs.readFileSync(skillMdPath, 'utf8');
56
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
57
+ if (authorLine && (authorLine.includes('Miya Daniel'))) {
58
+ patterns.push(`.claude/skills/${entry.name}/`);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ } catch (e) {
64
+ // Fallback or ignore to prevent breaking execution
65
+ }
66
+ }
67
+ const agentsDir = path.join(workspaceRoot, '.claude', 'agents');
68
+ if (fs.existsSync(agentsDir)) {
69
+ try {
70
+ for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
71
+ if (!entry.isFile() || !/^fable-(?:orchestrator|verifier|worker-haiku|worker-sonnet)\.md$/i.test(entry.name)) continue;
72
+ const content = fs.readFileSync(path.join(agentsDir, entry.name), 'utf8');
73
+ if (/^name:\s*fable-/mi.test(content)) patterns.push(`.claude/agents/${entry.name}`);
74
+ }
75
+ } catch (e) {
76
+ // Fallback or ignore to prevent breaking installation.
77
+ }
22
78
  }
23
79
  return patterns;
24
80
  },
25
81
  isMatch(pattern, trimmedLine) {
82
+ if (trimmedLine === '.claude/' || trimmedLine === '.claude') {
83
+ return true;
84
+ }
26
85
  if (pattern === '.claude/harness-everything/') {
27
- return trimmedLine === '.claude/' ||
28
- trimmedLine === '.claude' ||
29
- trimmedLine === '.claude/harness-everything' ||
86
+ return trimmedLine === '.claude/harness-everything' ||
30
87
  trimmedLine === '.claude/harness-everything/';
31
88
  }
32
89
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
@@ -54,6 +111,14 @@ module.exports = {
54
111
  };
55
112
  }
56
113
  },
114
+ getAgentsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
115
+ const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(workspaceRoot, '.claude');
116
+ return {
117
+ path: path.join(claudeDir, 'agents'),
118
+ label: isGlobal ? '~/.claude/agents/' : '.claude/agents/',
119
+ manifestPath: manifest.getManifestPath(claudeDir)
120
+ };
121
+ },
57
122
  install({ isGlobal, targetWorkspaceRoot, harnessSourceDir, packageVersion, getUserPromptsDir, advisory, claudeHooks, manifest }) {
58
123
  const userHome = require('os').homedir();
59
124
  const claudeDir = isGlobal ? path.join(userHome, '.claude') : path.join(targetWorkspaceRoot, '.claude');
@@ -100,15 +165,7 @@ module.exports = {
100
165
  console.log(` ✅ Configured Claude Code hooks safely in ${isGlobal ? '~' : ''}/.claude/settings.json`);
101
166
 
102
167
  // DOWNWARD COMPATIBLE CLEANUP: Remove old wrong skill folder .claude/harness-everything/skills if it exists
103
- const oldSkillsDir = path.join(claudeDir, 'harness-everything', 'skills');
104
- if (fs.existsSync(oldSkillsDir)) {
105
- try {
106
- fs.rmSync(oldSkillsDir, { recursive: true, force: true });
107
- console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/`);
108
- } catch (e) {
109
- console.warn(` ⚠️ Failed to remove legacy skills folder: ${e.message}`);
110
- }
111
- }
168
+ cleanupLegacySkillsDir(path.join(claudeDir, 'harness-everything', 'skills'));
112
169
  },
113
170
  uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, advisory, claudeHooks, manifest, cleanEmptyDirs }) {
114
171
  if (removeLocal) {
@@ -116,11 +173,7 @@ module.exports = {
116
173
  claudeHooks.removeHarnessHooks(localSettingsFile);
117
174
 
118
175
  // Clear old wrong skill folder .claude/harness-everything/skills if any remain
119
- const oldSkillsDir = path.join(workspaceRoot, '.claude', 'harness-everything', 'skills');
120
- if (fs.existsSync(oldSkillsDir)) {
121
- fs.rmSync(oldSkillsDir, { recursive: true, force: true });
122
- console.log(` 🧹 Cleaned up legacy incorrect local skills folder at: .claude/harness-everything/skills/`);
123
- }
176
+ cleanupLegacySkillsDir(path.join(workspaceRoot, '.claude', 'harness-everything', 'skills'));
124
177
  }
125
178
  if (removeGlobal) {
126
179
  const globalSettingsFile = path.join(userHome, '.claude', 'settings.json');
@@ -11,7 +11,7 @@ const fs = require('fs');
11
11
  // `.codex/harness-everything/`.
12
12
  module.exports = {
13
13
  name: 'codex',
14
- label: 'Codex / Gemini',
14
+ label: 'Codex',
15
15
  getHarnessDir(workspaceRoot) {
16
16
  return path.join(workspaceRoot, '.codex', 'harness-everything');
17
17
  },
@@ -23,16 +23,34 @@ module.exports = {
23
23
  },
24
24
  getIgnorePatterns(workspaceRoot) {
25
25
  const patterns = ['.codex/harness-everything/'];
26
- if (fs.existsSync(path.join(workspaceRoot, '.codex', 'skills'))) {
27
- patterns.push('.codex/skills/');
26
+ const skillsDir = path.join(workspaceRoot, '.codex', 'skills');
27
+ if (fs.existsSync(skillsDir)) {
28
+ try {
29
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
30
+ for (const entry of entries) {
31
+ if (entry.isDirectory()) {
32
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
33
+ if (fs.existsSync(skillMdPath)) {
34
+ const content = fs.readFileSync(skillMdPath, 'utf8');
35
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
36
+ if (authorLine && (authorLine.includes('Miya Daniel'))) {
37
+ patterns.push(`.codex/skills/${entry.name}/`);
38
+ }
39
+ }
40
+ }
41
+ }
42
+ } catch (e) {
43
+ // Fallback or ignore to prevent breaking execution
44
+ }
28
45
  }
29
46
  return patterns;
30
47
  },
31
48
  isMatch(pattern, trimmedLine) {
49
+ if (trimmedLine === '.codex/' || trimmedLine === '.codex') {
50
+ return true;
51
+ }
32
52
  if (pattern === '.codex/harness-everything/') {
33
- return trimmedLine === '.codex/' ||
34
- trimmedLine === '.codex' ||
35
- trimmedLine === '.codex/harness-everything' ||
53
+ return trimmedLine === '.codex/harness-everything' ||
36
54
  trimmedLine === '.codex/harness-everything/';
37
55
  }
38
56
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
@@ -18,16 +18,34 @@ module.exports = {
18
18
  },
19
19
  getIgnorePatterns(workspaceRoot) {
20
20
  const patterns = ['.continue/harness-everything/'];
21
- if (fs.existsSync(path.join(workspaceRoot, '.continue', 'skills'))) {
22
- patterns.push('.continue/skills/');
21
+ const skillsDir = path.join(workspaceRoot, '.continue', 'skills');
22
+ if (fs.existsSync(skillsDir)) {
23
+ try {
24
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ if (entry.isDirectory()) {
27
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
28
+ if (fs.existsSync(skillMdPath)) {
29
+ const content = fs.readFileSync(skillMdPath, 'utf8');
30
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
31
+ if (authorLine && (authorLine.includes('Miya Daniel'))) {
32
+ patterns.push(`.continue/skills/${entry.name}/`);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ } catch (e) {
38
+ // Fallback or ignore to prevent breaking execution
39
+ }
23
40
  }
24
41
  return patterns;
25
42
  },
26
43
  isMatch(pattern, trimmedLine) {
44
+ if (trimmedLine === '.continue/' || trimmedLine === '.continue') {
45
+ return true;
46
+ }
27
47
  if (pattern === '.continue/harness-everything/') {
28
- return trimmedLine === '.continue/' ||
29
- trimmedLine === '.continue' ||
30
- trimmedLine === '.continue/harness-everything' ||
48
+ return trimmedLine === '.continue/harness-everything' ||
31
49
  trimmedLine === '.continue/harness-everything/';
32
50
  }
33
51
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
@@ -18,16 +18,34 @@ module.exports = {
18
18
  },
19
19
  getIgnorePatterns(workspaceRoot) {
20
20
  const patterns = ['.github/harness-everything/'];
21
- if (fs.existsSync(path.join(workspaceRoot, '.github', 'skills'))) {
22
- patterns.push('.github/skills/');
21
+ const skillsDir = path.join(workspaceRoot, '.github', 'skills');
22
+ if (fs.existsSync(skillsDir)) {
23
+ try {
24
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ if (entry.isDirectory()) {
27
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
28
+ if (fs.existsSync(skillMdPath)) {
29
+ const content = fs.readFileSync(skillMdPath, 'utf8');
30
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
31
+ if (authorLine && (authorLine.includes('Miya Daniel'))) {
32
+ patterns.push(`.github/skills/${entry.name}/`);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ } catch (e) {
38
+ // Fallback or ignore to prevent breaking execution
39
+ }
23
40
  }
24
41
  return patterns;
25
42
  },
26
43
  isMatch(pattern, trimmedLine) {
44
+ if (trimmedLine === '.github/' || trimmedLine === '.github') {
45
+ return true;
46
+ }
27
47
  if (pattern === '.github/harness-everything/') {
28
- return trimmedLine === '.github/' ||
29
- trimmedLine === '.github' ||
30
- trimmedLine === '.github/harness-everything' ||
48
+ return trimmedLine === '.github/harness-everything' ||
31
49
  trimmedLine === '.github/harness-everything/';
32
50
  }
33
51
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);