harness-everything 0.2.1 → 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 (494) 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 +63 -63
  174. package/docs/workflows/eval-harness.md +64 -57
  175. package/docs/workflows/fable-discipline.md +59 -59
  176. package/docs/workflows/fable-mode.md +12 -15
  177. package/docs/workflows/find-skills.md +36 -0
  178. package/docs/workflows/git-commit.md +71 -62
  179. package/docs/workflows/grill-me.md +62 -62
  180. package/docs/workflows/grill-with-docs.md +69 -62
  181. package/docs/workflows/harness-everything.md +95 -92
  182. package/docs/workflows/improve-codebase-architecture.md +68 -60
  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 +64 -59
  186. package/docs/workflows/rewrite-commits.md +60 -60
  187. package/docs/workflows/security-review.md +77 -58
  188. package/docs/workflows/self-evolve.md +42 -59
  189. package/docs/workflows/skill-creator.md +80 -75
  190. package/docs/workflows/skill-style.md +64 -64
  191. package/docs/workflows/tdd.md +7 -4
  192. package/docs/workflows/to-spec.md +83 -0
  193. package/docs/workflows/to-tickets.md +80 -0
  194. package/docs/workflows/todo-driven-workflow.md +28 -30
  195. package/docs/workflows/using-git-worktrees.md +67 -63
  196. package/docs/workflows/verification-loop.md +71 -69
  197. package/docs/workflows/verify-before-claim.md +64 -60
  198. package/docs/workflows/zoom-out.md +74 -62
  199. package/environment-detection/SKILL.md +41 -77
  200. package/environment-detection/references/shell-syntax-rules.md +76 -0
  201. package/environment-detection/scripts/preflight.js +103 -93
  202. package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
  203. package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
  204. package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
  205. package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
  206. package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
  207. package/eval-harness/SKILL.md +42 -59
  208. package/eval-harness/references/scoring-rubric.md +68 -0
  209. package/eval-harness/scripts/evaluate.js +77 -61
  210. package/evals/environment-detection/eval.yaml +26 -0
  211. package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
  212. package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
  213. package/evals/eval-harness/eval.yaml +26 -0
  214. package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
  215. package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
  216. package/evals/fable-discipline/eval.yaml +26 -0
  217. package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
  218. package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
  219. package/evals/fable-mode/eval.yaml +26 -0
  220. package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
  221. package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
  222. package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
  223. package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
  224. package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
  225. package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
  226. package/evals/find-skills/eval.yaml +26 -0
  227. package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
  228. package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
  229. package/evals/git-commit/eval.yaml +26 -0
  230. package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
  231. package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
  232. package/evals/grill-me/eval.yaml +26 -0
  233. package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
  234. package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
  235. package/evals/grill-with-docs/eval.yaml +26 -0
  236. package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
  237. package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
  238. package/evals/harness-everything/eval.yaml +26 -0
  239. package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
  240. package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
  241. package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
  242. package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
  243. package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
  244. package/evals/improve-codebase-architecture/eval.yaml +26 -0
  245. package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
  246. package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
  247. package/evals/install-cognitive-os/eval.yaml +26 -0
  248. package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
  249. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
  250. package/evals/multi-agent-workspace/eval.yaml +26 -0
  251. package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
  252. package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
  253. package/evals/repo-docs/eval.yaml +26 -0
  254. package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
  255. package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
  256. package/evals/rewrite-commits/eval.yaml +26 -0
  257. package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
  258. package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
  259. package/evals/security-review/eval.yaml +26 -0
  260. package/evals/security-review/tasks/negative-trigger.yaml +16 -0
  261. package/evals/security-review/tasks/positive-trigger.yaml +15 -0
  262. package/evals/self-evolve/eval.yaml +26 -0
  263. package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
  264. package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
  265. package/evals/skill-creator/eval.yaml +26 -0
  266. package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
  267. package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
  268. package/evals/skill-style/eval.yaml +26 -0
  269. package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
  270. package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
  271. package/evals/tdd/eval.yaml +26 -0
  272. package/evals/tdd/tasks/negative-trivia.yaml +16 -0
  273. package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
  274. package/evals/tdd/tasks/positive-feature.yaml +16 -0
  275. package/evals/tdd/tasks/positive-refactor.yaml +15 -0
  276. package/evals/to-spec/eval.yaml +26 -0
  277. package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
  278. package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
  279. package/evals/to-tickets/eval.yaml +26 -0
  280. package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
  281. package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
  282. package/evals/todo-driven-workflow/eval.yaml +26 -0
  283. package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
  284. package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
  285. package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
  286. package/evals/using-git-worktrees/eval.yaml +26 -0
  287. package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
  288. package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
  289. package/evals/verification-loop/eval.yaml +26 -0
  290. package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
  291. package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
  292. package/evals/verify-before-claim/eval.yaml +26 -0
  293. package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
  294. package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
  295. package/evals/zoom-out/eval.yaml +26 -0
  296. package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
  297. package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
  298. package/fable-discipline/SKILL.md +41 -38
  299. package/fable-discipline/references/discipline-rules.md +22 -0
  300. package/fable-mode/CONTRACT-FORMAT.md +51 -51
  301. package/fable-mode/SKILL.md +39 -51
  302. package/fable-mode/agents/fable-orchestrator.md +99 -92
  303. package/fable-mode/agents/fable-verifier.md +32 -32
  304. package/fable-mode/agents/fable-worker-haiku.md +52 -48
  305. package/fable-mode/agents/fable-worker-sonnet.md +53 -49
  306. package/fable-mode/execution-guardrails/SKILL.md +43 -87
  307. package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  308. package/fable-mode/fable-haiku/SKILL.md +36 -48
  309. package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  310. package/fable-mode/fable-opus/SKILL.md +36 -0
  311. package/fable-mode/fable-sonnet/SKILL.md +36 -0
  312. package/fable-mode/model-matrix.json +32 -0
  313. package/fable-mode/references/execution-phases.md +37 -0
  314. package/fable-mode/references/model-matrix.md +39 -0
  315. package/fable-mode/scripts/model-selector.js +129 -0
  316. package/find-skills/SKILL.md +48 -0
  317. package/find-skills/references/discovery-flow.md +102 -0
  318. package/find-skills/scripts/use-skill.js +106 -0
  319. package/git-commit/SKILL.md +45 -55
  320. package/git-commit/guides/ANGULAR_STYLE.md +60 -60
  321. package/git-commit/guides/COMMIT_GENERATION.md +23 -23
  322. package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
  323. package/git-commit/guides/MAIN_REPO.md +14 -14
  324. package/git-commit/guides/SUBMODULES.md +27 -27
  325. package/git-commit/references/commit-flow.md +30 -0
  326. package/grill-me/SKILL.md +43 -36
  327. package/grill-me/references/grilling-playbook.md +38 -0
  328. package/grill-with-docs/ADR-FORMAT.md +47 -47
  329. package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
  330. package/grill-with-docs/SKILL.md +41 -99
  331. package/grill-with-docs/references/session-playbook.md +97 -0
  332. package/harness-everything/SKILL.md +42 -141
  333. package/harness-everything/references/skill-registry.md +39 -0
  334. package/harness-everything/references/triage-and-tiers.md +116 -0
  335. package/harness-everything/scripts/bootstrap.js +203 -140
  336. package/harness-everything/scripts/routing-keywords.json +320 -0
  337. package/harness-everything/scripts/self-heal.js +241 -189
  338. package/harness-everything/scripts/tier-router.js +334 -219
  339. package/harness-everything/scripts/verify-gate.js +87 -18
  340. package/hooks/hooks.json +155 -155
  341. package/hooks/scripts/boundary-guard.js +55 -55
  342. package/hooks/scripts/contract-test.js +79 -79
  343. package/hooks/scripts/depth-guard.js +65 -65
  344. package/hooks/scripts/lib/harness-state.js +139 -228
  345. package/hooks/scripts/lib/platforms/claude.js +185 -42
  346. package/hooks/scripts/lib/platforms/codex.js +114 -46
  347. package/hooks/scripts/lib/platforms/continue.js +91 -41
  348. package/hooks/scripts/lib/platforms/copilot.js +109 -41
  349. package/hooks/scripts/lib/platforms/cursor.js +89 -41
  350. package/hooks/scripts/lib/platforms/hermes.js +57 -32
  351. package/hooks/scripts/lib/platforms/index.js +17 -17
  352. package/hooks/scripts/lib/platforms/worktrees.js +20 -20
  353. package/hooks/scripts/reset-circuit-breaker.js +30 -30
  354. package/hooks/scripts/rule-of-3-tracker.js +124 -91
  355. package/hooks/scripts/rule-of-3.js +14 -3
  356. package/hooks/scripts/state-persist.js +99 -99
  357. package/hooks/scripts/stop-gate.js +80 -80
  358. package/hooks/scripts/subagent-scope-guard.js +88 -88
  359. package/improve-codebase-architecture/SKILL.md +40 -44
  360. package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
  361. package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
  362. package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
  363. package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
  364. package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  365. package/install-cognitive-os/SKILL.md +38 -95
  366. package/install-cognitive-os/references/cognitive-loop.md +27 -0
  367. package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  368. package/multi-agent-workspace/SKILL.md +37 -0
  369. package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
  370. package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
  371. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
  372. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
  373. package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  374. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
  375. package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  376. package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  377. package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
  378. package/multi-agent-workspace/references/agency-agents.md +31 -0
  379. package/multi-agent-workspace/references/architecture-guide.md +32 -0
  380. package/multi-agent-workspace/references/orchestration.md +48 -0
  381. package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  382. package/multi-agent-workspace/scripts/index_memory.js +51 -0
  383. package/multi-agent-workspace/scripts/scaffold.js +253 -0
  384. package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
  385. package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
  386. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
  387. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
  388. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
  389. package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
  390. package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
  391. package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
  392. package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
  393. package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
  394. package/multi-agent-workspace/workflows/01-init.md +22 -0
  395. package/multi-agent-workspace/workflows/02-analysis.md +23 -0
  396. package/multi-agent-workspace/workflows/03-generation.md +27 -0
  397. package/multi-agent-workspace/workflows/04-launcher.md +16 -0
  398. package/opencode-plugin/README.md +94 -0
  399. package/opencode-plugin/hooks/circuit-breaker.js +121 -0
  400. package/opencode-plugin/hooks/compliance.js +128 -0
  401. package/opencode-plugin/hooks/post-edit.js +62 -0
  402. package/opencode-plugin/hooks/pre-complete.js +65 -0
  403. package/opencode-plugin/hooks/verify.js +140 -0
  404. package/opencode-plugin/plugin.json +17 -0
  405. package/opencode-plugin/test-hook-firing.js +198 -0
  406. package/package.json +50 -22
  407. package/references/definition-of-done.md +67 -0
  408. package/references/performance-checklist.md +153 -0
  409. package/references/platform-advisory-template.md +58 -0
  410. package/references/security-checklist.md +205 -0
  411. package/repo-docs/SKILL.md +46 -45
  412. package/repo-docs/references/process-guide.md +60 -0
  413. package/repo-docs/templates/agents-template.md +264 -264
  414. package/repo-docs/templates/knowledge-agents-template.md +50 -50
  415. package/repo-docs/templates/knowledge-readme-template.md +83 -83
  416. package/repo-docs/templates/manual-recon.md +117 -117
  417. package/repo-docs/templates/multi-skills-readme-template.md +72 -72
  418. package/repo-docs/templates/product-agents-template.md +78 -78
  419. package/repo-docs/templates/product-readme-template.md +95 -95
  420. package/repo-docs/templates/readme-template.md +136 -136
  421. package/repo-docs/templates/single-skill-readme-template.md +70 -70
  422. package/repo-docs/templates/skills-agents-template.md +60 -60
  423. package/rewrite-commits/SKILL.md +37 -32
  424. package/rewrite-commits/references/workflow.md +18 -0
  425. package/scripts/installer.js +546 -649
  426. package/scripts/lib/advisory-text.js +167 -163
  427. package/scripts/lib/claude-hooks.js +84 -71
  428. package/scripts/lib/gitignore.js +199 -80
  429. package/scripts/lib/manifest.js +146 -82
  430. package/scripts/lib/prompts.js +241 -241
  431. package/scripts/lib/skills.js +260 -172
  432. package/scripts/lib/workspace.js +28 -28
  433. package/scripts/verify-install.js +147 -0
  434. package/security-review/SKILL.md +50 -511
  435. package/security-review/guides/OWASP-PATTERNS.md +31 -0
  436. package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  437. package/security-review/references/security-checklist.md +478 -0
  438. package/security-review/scripts/audit-secrets.js +84 -0
  439. package/self-evolve/SKILL.md +47 -54
  440. package/self-evolve/references/memory-resolution.md +58 -0
  441. package/self-evolve/scripts/persist-memory.js +139 -40
  442. package/self-evolve/scripts/register-dynamic-skill.js +251 -0
  443. package/self-evolve/scripts/self-regression.js +110 -113
  444. package/skill-creator/SKILL.md +49 -91
  445. package/skill-creator/references/authoring-workflow.md +14 -0
  446. package/skill-creator/references/dynamic-generation-contract.md +21 -0
  447. package/skill-creator/references/quality-checklist.md +15 -0
  448. package/skill-creator/references/quality-principles.md +81 -81
  449. package/skill-creator/references/testing-workflow.md +20 -25
  450. package/skill-style/SKILL.md +42 -48
  451. package/skill-style/references/style-guide.md +36 -0
  452. package/tdd/SKILL.md +44 -53
  453. package/tdd/guides/deep-modules.md +33 -33
  454. package/tdd/guides/interface-design.md +31 -31
  455. package/tdd/guides/mocking.md +59 -59
  456. package/tdd/guides/refactoring.md +10 -10
  457. package/tdd/guides/tests.md +61 -61
  458. package/tdd/references/core-discipline.md +49 -0
  459. package/to-spec/SKILL.md +42 -0
  460. package/to-spec/references/process.md +77 -0
  461. package/to-spec/scripts/check-project-docs.js +259 -0
  462. package/to-spec/templates/cli-reference.md +31 -0
  463. package/to-spec/templates/dev-doc.md +27 -0
  464. package/to-spec/templates/feature-spec.md +59 -0
  465. package/to-spec/templates/schema-doc.md +31 -0
  466. package/to-tickets/SKILL.md +42 -0
  467. package/to-tickets/references/publishing-and-templates.md +97 -0
  468. package/todo-driven-workflow/SKILL.md +40 -54
  469. package/todo-driven-workflow/references/execution-guide.md +27 -0
  470. package/using-git-worktrees/SKILL.md +49 -161
  471. package/using-git-worktrees/references/workflow-details.md +108 -0
  472. package/verification-loop/SKILL.md +46 -138
  473. package/verification-loop/references/verification-phases.md +116 -0
  474. package/verification-loop/templates/verification-report.template.md +15 -0
  475. package/verify-before-claim/SKILL.md +43 -86
  476. package/verify-before-claim/references/verification-guide.md +73 -0
  477. package/zoom-out/SKILL.md +42 -90
  478. package/zoom-out/references/circuit-breaker.md +66 -0
  479. package/zoom-out/templates/zoom-out-report.template.md +20 -0
  480. package/build-multi-agent-system/AGENTS.md +0 -50
  481. package/build-multi-agent-system/README.md +0 -63
  482. package/build-multi-agent-system/SKILL.md +0 -68
  483. package/create-agent-launcher/SKILL.md +0 -48
  484. package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
  485. package/create-agent-launcher/workflows/01-init.md +0 -22
  486. package/create-agent-launcher/workflows/02-analysis.md +0 -26
  487. package/create-agent-launcher/workflows/03-generation.md +0 -29
  488. package/create-agent-launcher/workflows/04-launcher.md +0 -20
  489. package/docs/workflows/build-multi-agent-system.md +0 -62
  490. package/docs/workflows/create-agent-launcher.md +0 -62
  491. package/eval-framework/behavioral-test.js +0 -105
  492. package/eval-framework/mechanism-test.js +0 -251
  493. package/harness-everything/scripts/todo-cli.js +0 -157
  494. package/skill-style/STYLE.md +0 -37
@@ -1,80 +1,199 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- function ensureWorkspaceGitignorePatterns(wsRoot, patterns) {
5
- const gitignorePath = path.join(wsRoot, '.gitignore');
6
- try {
7
- let content = '';
8
- if (fs.existsSync(gitignorePath)) {
9
- content = fs.readFileSync(gitignorePath, 'utf8');
10
- }
11
-
12
- const lines = content.split(/\r?\n/);
13
- const addedPatterns = [];
14
-
15
- for (const pattern of patterns) {
16
- const isIgnored = lines.some(line => {
17
- const trimmed = line.trim();
18
- return trimmed === pattern ||
19
- trimmed === pattern.slice(0, -1) ||
20
- (pattern === '.claude/harness-state/' && (trimmed === '.claude/' || trimmed === '.claude'));
21
- });
22
-
23
- if (!isIgnored) {
24
- addedPatterns.push(pattern);
25
- }
26
- }
27
-
28
- // Same read-then-append shape as ensureHarnessStateIgnored() in
29
- // hooks/scripts/lib/harness-state.js, which runs once per hook
30
- // invocation and can race across concurrent processes to leave an
31
- // exact-duplicate line behind - see the comment there. Collapsing
32
- // duplicates here too keeps both writers self-healing the same file.
33
- const seen = new Set();
34
- let sawDuplicate = false;
35
- const dedupedLines = lines.filter(line => {
36
- const trimmed = line.trim();
37
- if (trimmed === '' || trimmed.startsWith('#')) return true;
38
- if (seen.has(trimmed)) {
39
- sawDuplicate = true;
40
- return false;
41
- }
42
- seen.add(trimmed);
43
- return true;
44
- });
45
-
46
- if (addedPatterns.length > 0 || sawDuplicate) {
47
- while (dedupedLines.length > 0 && dedupedLines[dedupedLines.length - 1] === '') {
48
- dedupedLines.pop();
49
- }
50
- const finalLines = dedupedLines.concat(addedPatterns);
51
- fs.writeFileSync(gitignorePath, finalLines.join('\n') + '\n', 'utf8');
52
- if (addedPatterns.length > 0) {
53
- console.log(` ✅ Added auto-generated directories to .gitignore: ${addedPatterns.join(', ')}`);
54
- }
55
- }
56
- } catch (err) {
57
- console.warn(` ⚠️ Failed to update .gitignore: ${err.message}`);
58
- }
59
- }
60
-
61
- // Only ever deletes a directory that is genuinely empty, and never recurses
62
- // past one of `stopDirs` (workspace root / user home / filesystem root) - so
63
- // this can only ever tidy up directories Harness itself just emptied out,
64
- // never reach into a parent that still holds unrelated content.
65
- function cleanEmptyDirs(dir, stopDirs) {
66
- if (!fs.existsSync(dir)) return;
67
- if ((stopDirs || []).includes(dir) || dir === path.parse(dir).root) return;
68
- try {
69
- const files = fs.readdirSync(dir);
70
- if (files.length === 0) {
71
- fs.rmdirSync(dir);
72
- console.log(` ✅ Cleaned up empty directory: ${dir}`);
73
- cleanEmptyDirs(path.dirname(dir), stopDirs);
74
- }
75
- } catch (e) {
76
- // ignore
77
- }
78
- }
79
-
80
- module.exports = { ensureWorkspaceGitignorePatterns, cleanEmptyDirs };
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ /**
5
+ * Checks if a target pattern is already covered by a line in an ignore file.
6
+ * Handles exact matches, trailing slash differences, and parent directory subsumption
7
+ * (e.g. `.claude/` or `.claude` subsumes `.claude/harness-everything/state/`).
8
+ */
9
+ function isPatternCoveredByLine(pattern, gitignoreLine) {
10
+ const normPattern = pattern.trim().replace(/\\/g, '/');
11
+ const normLine = gitignoreLine.trim().replace(/\\/g, '/');
12
+
13
+ if (!normLine || normLine.startsWith('#') || normLine.startsWith('!')) {
14
+ return false;
15
+ }
16
+
17
+ const cleanLine = normLine.endsWith('/') ? normLine.slice(0, -1) : normLine;
18
+ const cleanPattern = normPattern.endsWith('/') ? normPattern.slice(0, -1) : normPattern;
19
+
20
+ // Exact match or slash variant (e.g. '.claude' vs '.claude/')
21
+ if (cleanLine === cleanPattern) {
22
+ return true;
23
+ }
24
+
25
+ // Parent directory check: e.g. '.claude' covers '.claude/harness-everything/'
26
+ if (cleanPattern.startsWith(cleanLine + '/')) {
27
+ return true;
28
+ }
29
+
30
+ return false;
31
+ }
32
+
33
+ /**
34
+ * Resolves the real git directory for a workspace. `.git` is usually a
35
+ * directory, but in submodules and worktrees it is a FILE containing
36
+ * `gitdir: <path>` - resolve that pointer so info/exclude lands in the right
37
+ * place. Returns null when the workspace has no git repository.
38
+ */
39
+ function resolveGitDir(wsRoot) {
40
+ const dotGit = path.join(wsRoot, '.git');
41
+ if (!fs.existsSync(dotGit)) return null;
42
+ try {
43
+ if (fs.statSync(dotGit).isDirectory()) return dotGit;
44
+ const content = fs.readFileSync(dotGit, 'utf8');
45
+ const m = content.match(/gitdir:\s*(.+)/);
46
+ if (!m) return null;
47
+ let gitdir = m[1].trim();
48
+ if (!path.isAbsolute(gitdir)) gitdir = path.resolve(wsRoot, gitdir);
49
+ return fs.existsSync(gitdir) ? gitdir : null;
50
+ } catch (e) {
51
+ return null;
52
+ }
53
+ }
54
+
55
+ const EXCLUDE_BANNER_BEGIN = '# --- Harness OS state (auto-managed; local only) ---';
56
+ const EXCLUDE_BANNER_END = '# --- end Harness OS state ---';
57
+ // Legacy marker written by older installers straight into .gitignore.
58
+ const LEGACY_GITIGNORE_BANNER = '# Harness OS Auto-generated Ignore Rules';
59
+
60
+ function readExcludeLines(gitDir) {
61
+ try {
62
+ return fs.readFileSync(path.join(gitDir, 'info', 'exclude'), 'utf8').split(/\r?\n/);
63
+ } catch (e) {
64
+ return null; // no exclude file yet - treat as empty but writable
65
+ }
66
+ }
67
+
68
+ function writeExcludeSection(gitDir, patterns) {
69
+ const infoDir = path.join(gitDir, 'info');
70
+ fs.mkdirSync(infoDir, { recursive: true });
71
+ const excludePath = path.join(infoDir, 'exclude');
72
+ let lines = [];
73
+ try {
74
+ lines = fs.readFileSync(excludePath, 'utf8').split(/\r?\n/);
75
+ } catch (e) {}
76
+
77
+ // Drop our previous section (if any), then rebuild it from the requested
78
+ // patterns - so removals from getIgnorePatterns() propagate on reinstall.
79
+ const beginIdx = lines.indexOf(EXCLUDE_BANNER_BEGIN);
80
+ const endIdx = lines.indexOf(EXCLUDE_BANNER_END);
81
+ if (beginIdx !== -1 && endIdx !== -1) {
82
+ lines.splice(beginIdx, endIdx - beginIdx + 1);
83
+ }
84
+ while (lines.length > 0 && lines[lines.length - 1].trim() === '') lines.pop();
85
+
86
+ const section = ['', EXCLUDE_BANNER_BEGIN, ...patterns, EXCLUDE_BANNER_END, ''];
87
+ fs.writeFileSync(excludePath, lines.concat(section).join('\n'), 'utf8');
88
+ }
89
+
90
+ /**
91
+ * Idempotently records Harness state directories as LOCAL-ONLY ignores.
92
+ *
93
+ * Patterns go to `<gitdir>/info/exclude`, never the working tree's
94
+ * .gitignore - installing or self-healing must not produce a diff in the
95
+ * user's project. Also migrates away the legacy banner block that old
96
+ * versions appended to .gitignore.
97
+ */
98
+ function ensureWorkspaceGitignorePatterns(wsRoot, patterns) {
99
+ const wanted = (patterns || []).filter(Boolean);
100
+
101
+ // Migration: strip the legacy banner + its pattern lines from .gitignore.
102
+ const gitignorePath = path.join(wsRoot, '.gitignore');
103
+ try {
104
+ if (fs.existsSync(gitignorePath)) {
105
+ const content = fs.readFileSync(gitignorePath, 'utf8');
106
+ if (content.includes(LEGACY_GITIGNORE_BANNER)) {
107
+ const lines = content.split(/\r?\n/);
108
+ const start = lines.findIndex(l => l.trim() === LEGACY_GITIGNORE_BANNER);
109
+ let end = start;
110
+ // The legacy block ran until the first non-pattern line (blank/comment/other rule).
111
+ for (let i = start + 1; i < lines.length; i++) {
112
+ const t = lines[i].trim();
113
+ if (t === '' || t.startsWith('#')) break;
114
+ end = i;
115
+ }
116
+ lines.splice(start, end - start + 1);
117
+ while (lines.length > 0 && lines[lines.length - 1].trim() === '') lines.pop();
118
+ fs.writeFileSync(gitignorePath, lines.join('\n') + '\n', 'utf8');
119
+ }
120
+ }
121
+ } catch (err) {
122
+ console.warn(` ⚠️ Failed to migrate legacy .gitignore entries: ${err.message}`);
123
+ }
124
+
125
+ const gitDir = resolveGitDir(wsRoot);
126
+ if (!gitDir) {
127
+ // No git repo -> nothing local-only to write into. State dirs are gated
128
+ // elsewhere (bootstrap refuses unmanaged workspaces), so this is fine.
129
+ return;
130
+ }
131
+
132
+ try {
133
+ const existing = readExcludeLines(gitDir) || [];
134
+ // Skip the write entirely when every wanted pattern is already inside our
135
+ // managed section OR covered by any ignore line (user's own broader rule).
136
+ const outside = existing.filter(
137
+ l => l !== EXCLUDE_BANNER_BEGIN && l !== EXCLUDE_BANNER_END
138
+ );
139
+ const missing = wanted.filter(p => !outside.some(line => isPatternCoveredByLine(p, line)));
140
+ const currentSection =
141
+ beginEnd(existing).start === -1
142
+ ? []
143
+ : existing.slice(beginEnd(existing).start + 1, beginEnd(existing).end);
144
+ const sameSet =
145
+ currentSection.filter(l => l.trim() && !l.trim().startsWith('#')).join('\n') ===
146
+ wanted.join('\n');
147
+ if (missing.length === 0 && sameSet) return;
148
+
149
+ writeExcludeSection(gitDir, wanted);
150
+ console.log(` ✅ Recorded local-only ignore rules in .git/info/exclude: ${wanted.join(', ')}`);
151
+ } catch (err) {
152
+ console.warn(` ⚠️ Failed to update .git/info/exclude: ${err.message}`);
153
+ }
154
+ }
155
+
156
+ function beginEnd(lines) {
157
+ return { start: lines.indexOf(EXCLUDE_BANNER_BEGIN), end: lines.indexOf(EXCLUDE_BANNER_END) };
158
+ }
159
+
160
+ /**
161
+ * Removes Harness's section from .git/info/exclude (uninstall cleanup).
162
+ * Never touches user-authored exclude rules.
163
+ */
164
+ function removeWorkspaceExcludePatterns(wsRoot) {
165
+ const gitDir = resolveGitDir(wsRoot);
166
+ if (!gitDir) return;
167
+ try {
168
+ const excludePath = path.join(gitDir, 'info', 'exclude');
169
+ const lines = fs.readFileSync(excludePath, 'utf8').split(/\r?\n/);
170
+ const { start, end } = beginEnd(lines);
171
+ if (start === -1 || end === -1) return;
172
+ lines.splice(start, end - start + 1);
173
+ while (lines.length > 0 && lines[lines.length - 1].trim() === '') lines.pop();
174
+ fs.writeFileSync(excludePath, lines.join('\n') + '\n', 'utf8');
175
+ } catch (err) {
176
+ // Best-effort
177
+ }
178
+ }
179
+
180
+ // Only ever deletes a directory that is genuinely empty, and never recurses
181
+ // past one of `stopDirs` (workspace root / user home / filesystem root) - so
182
+ // this can only ever tidy up directories Harness itself just emptied out,
183
+ // never reach into a parent that still holds unrelated content.
184
+ function cleanEmptyDirs(dir, stopDirs) {
185
+ if (!fs.existsSync(dir)) return;
186
+ if ((stopDirs || []).includes(dir) || dir === path.parse(dir).root) return;
187
+ try {
188
+ const files = fs.readdirSync(dir);
189
+ if (files.length === 0) {
190
+ fs.rmdirSync(dir);
191
+ console.log(` ✅ Cleaned up empty directory: ${dir}`);
192
+ cleanEmptyDirs(path.dirname(dir), stopDirs);
193
+ }
194
+ } catch (e) {
195
+ // ignore
196
+ }
197
+ }
198
+
199
+ module.exports = { ensureWorkspaceGitignorePatterns, removeWorkspaceExcludePatterns, resolveGitDir, cleanEmptyDirs };
@@ -1,82 +1,146 @@
1
- // Tracks exactly what this package installed, so uninstall can remove
2
- // precisely those paths instead of sweeping shared directories that may also
3
- // hold content from other tools, the user's own manual additions, or
4
- // self-evolve's locally-generated skills.
5
- //
6
- // The manifest always lives at <platform-home>/harness-everything/manifest.json
7
- // - e.g. .claude/harness-everything/manifest.json, .cursor/harness-everything/
8
- // manifest.json, or (global scope) ~/.agents/harness-everything/manifest.json.
9
- // harness-everything/ is a subfolder this package exclusively owns inside a
10
- // directory that already belongs to that platform (or, for global scope, the
11
- // shared ~/.agents convention) - nothing else creates a directory literally
12
- // named "harness-everything" there, so nesting under it is what makes "the
13
- // manifest can only describe our own installs" actually true.
14
- const fs = require('fs');
15
- const path = require('path');
16
-
17
- const PACKAGE_NAME = 'harness-everything';
18
- const HARNESS_AUTHOR = 'Miya Daniel | Harness Core Team';
19
- const HARNESS_DIR_NAME = 'harness-everything';
20
-
21
- function getHarnessDir(homeDir) {
22
- return path.join(homeDir, HARNESS_DIR_NAME);
23
- }
24
-
25
- function getManifestPath(homeDir) {
26
- return path.join(getHarnessDir(homeDir), 'manifest.json');
27
- }
28
-
29
- function readManifest(manifestPath) {
30
- if (!fs.existsSync(manifestPath)) {
31
- return { package: PACKAGE_NAME, skills: [] };
32
- }
33
- try {
34
- const data = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
35
- if (!Array.isArray(data.skills)) data.skills = [];
36
- return data;
37
- } catch (e) {
38
- return { package: PACKAGE_NAME, skills: [] };
39
- }
40
- }
41
-
42
- function writeManifest(manifestPath, data) {
43
- fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
44
- fs.writeFileSync(manifestPath, JSON.stringify(data, null, 2), 'utf8');
45
- }
46
-
47
- function recordSkillInstall(manifestPath, packageVersion, skillId, dirPath) {
48
- const data = readManifest(manifestPath);
49
- data.package = PACKAGE_NAME;
50
- data.version = packageVersion;
51
- data.updatedAt = new Date().toISOString();
52
- const idx = data.skills.findIndex(s => s.dirPath === dirPath);
53
- const entry = { id: skillId, dirPath, installedAt: new Date().toISOString() };
54
- if (idx !== -1) data.skills[idx] = entry;
55
- else data.skills.push(entry);
56
- writeManifest(manifestPath, data);
57
- }
58
-
59
- // Removes one skill entry, and - once no skills remain in it - deletes the
60
- // manifest file itself rather than leaving an empty bookkeeping file behind.
61
- function removeSkillFromManifest(manifestPath, dirPath) {
62
- if (!fs.existsSync(manifestPath)) return;
63
- const data = readManifest(manifestPath);
64
- data.skills = data.skills.filter(s => s.dirPath !== dirPath);
65
- if (data.skills.length === 0) {
66
- fs.unlinkSync(manifestPath);
67
- } else {
68
- writeManifest(manifestPath, data);
69
- }
70
- }
71
-
72
- module.exports = {
73
- PACKAGE_NAME,
74
- HARNESS_AUTHOR,
75
- HARNESS_DIR_NAME,
76
- getHarnessDir,
77
- getManifestPath,
78
- readManifest,
79
- writeManifest,
80
- recordSkillInstall,
81
- removeSkillFromManifest,
82
- };
1
+ // Tracks exactly what this package installed, so uninstall can remove
2
+ // precisely those paths instead of sweeping shared directories that may also
3
+ // hold content from other tools, the user's own manual additions, or
4
+ // self-evolve's locally-generated skills.
5
+ //
6
+ // Deliberately does NOT track find-skills' third-party downloads the same
7
+ // way: generated[] works because Harness owns the full lifecycle (authored,
8
+ // quality-gated, and status-tracked by self-evolve/skill-creator). A skill
9
+ // fetched via `npx skills add` is unaudited content Harness doesn't own or
10
+ // control the lifecycle of - the `skills` CLI's own lock file is already the
11
+ // live record of what's installed, so find-skills queries that directly
12
+ // (`npx skills list`) instead of caching a second, driftable copy here.
13
+ //
14
+ // The manifest always lives at <platform-home>/harness-everything/manifest.json
15
+ // - e.g. .claude/harness-everything/manifest.json, .cursor/harness-everything/
16
+ // manifest.json, or (global scope) ~/.agents/harness-everything/manifest.json.
17
+ // harness-everything/ is a subfolder this package exclusively owns inside a
18
+ // directory that already belongs to that platform (or, for global scope, the
19
+ // shared ~/.agents convention) - nothing else creates a directory literally
20
+ // named "harness-everything" there, so nesting under it is what makes "the
21
+ // manifest can only describe our own installs" actually true.
22
+ const fs = require('fs');
23
+ const path = require('path');
24
+
25
+ const PACKAGE_NAME = 'harness-everything';
26
+ const HARNESS_AUTHOR = 'Miya Daniel';
27
+ const HARNESS_DIR_NAME = 'harness-everything';
28
+
29
+ function getHarnessDir(homeDir) {
30
+ return path.join(homeDir, HARNESS_DIR_NAME);
31
+ }
32
+
33
+ function getManifestPath(homeDir) {
34
+ return path.join(getHarnessDir(homeDir), 'manifest.json');
35
+ }
36
+
37
+ function readManifest(manifestPath) {
38
+ if (!fs.existsSync(manifestPath)) {
39
+ return { package: PACKAGE_NAME, skills: [], agents: [] };
40
+ }
41
+ try {
42
+ const data = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
43
+ if (!Array.isArray(data.skills)) data.skills = [];
44
+ if (!Array.isArray(data.agents)) data.agents = [];
45
+ return data;
46
+ } catch (e) {
47
+ return { package: PACKAGE_NAME, skills: [], agents: [] };
48
+ }
49
+ }
50
+
51
+ function writeManifest(manifestPath, data) {
52
+ fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
53
+ fs.writeFileSync(manifestPath, JSON.stringify(data, null, 2), 'utf8');
54
+ }
55
+
56
+ function recordSkillInstall(manifestPath, packageVersion, skillId, dirPath) {
57
+ const data = readManifest(manifestPath);
58
+ data.package = PACKAGE_NAME;
59
+ data.version = packageVersion;
60
+ data.updatedAt = new Date().toISOString();
61
+ const idx = data.skills.findIndex(s => s.dirPath === dirPath);
62
+ const entry = { id: skillId, dirPath, installedAt: new Date().toISOString() };
63
+ if (idx !== -1) data.skills[idx] = entry;
64
+ else data.skills.push(entry);
65
+ writeManifest(manifestPath, data);
66
+ }
67
+
68
+ function recordAgentInstall(manifestPath, packageVersion, agentId, filePath) {
69
+ const data = readManifest(manifestPath);
70
+ data.package = PACKAGE_NAME;
71
+ data.version = packageVersion;
72
+ data.updatedAt = new Date().toISOString();
73
+ const idx = data.agents.findIndex(agent => agent.filePath === filePath);
74
+ const entry = { id: agentId, filePath, installedAt: new Date().toISOString() };
75
+ if (idx !== -1) data.agents[idx] = entry;
76
+ else data.agents.push(entry);
77
+ writeManifest(manifestPath, data);
78
+ }
79
+
80
+ function recordGeneratedSkill(manifestPath, skillId, dirPath, description, triggers = []) {
81
+ const data = readManifest(manifestPath);
82
+ if (!Array.isArray(data.generated)) data.generated = [];
83
+
84
+ data.updatedAt = new Date().toISOString();
85
+ const idx = data.generated.findIndex(s => s.dirPath === dirPath || s.id === skillId);
86
+ const entry = {
87
+ id: skillId,
88
+ dirPath,
89
+ description,
90
+ triggers: Array.isArray(triggers) ? triggers : [],
91
+ generatedAt: new Date().toISOString()
92
+ };
93
+
94
+ if (idx !== -1) data.generated[idx] = { ...data.generated[idx], ...entry };
95
+ else data.generated.push(entry);
96
+
97
+ writeManifest(manifestPath, data);
98
+ }
99
+
100
+ function removeGeneratedSkill(manifestPath, dirPath) {
101
+ if (!fs.existsSync(manifestPath)) return;
102
+ const data = readManifest(manifestPath);
103
+ if (!Array.isArray(data.generated)) return;
104
+ data.generated = data.generated.filter(s => s.dirPath !== dirPath);
105
+ writeManifest(manifestPath, data);
106
+ }
107
+
108
+ // Removes one skill entry, and - once no skills remain in it - deletes the
109
+ // manifest file itself rather than leaving an empty bookkeeping file behind.
110
+ function removeSkillFromManifest(manifestPath, dirPath) {
111
+ if (!fs.existsSync(manifestPath)) return;
112
+ const data = readManifest(manifestPath);
113
+ data.skills = data.skills.filter(s => s.dirPath !== dirPath);
114
+ if (data.skills.length === 0 && (!data.generated || data.generated.length === 0) && (!data.agents || data.agents.length === 0)) {
115
+ fs.unlinkSync(manifestPath);
116
+ } else {
117
+ writeManifest(manifestPath, data);
118
+ }
119
+ }
120
+
121
+ function removeAgentFromManifest(manifestPath, filePath) {
122
+ if (!fs.existsSync(manifestPath)) return;
123
+ const data = readManifest(manifestPath);
124
+ data.agents = data.agents.filter(agent => agent.filePath !== filePath);
125
+ if (data.skills.length === 0 && (!data.generated || data.generated.length === 0) && data.agents.length === 0) {
126
+ fs.unlinkSync(manifestPath);
127
+ } else {
128
+ writeManifest(manifestPath, data);
129
+ }
130
+ }
131
+
132
+ module.exports = {
133
+ PACKAGE_NAME,
134
+ HARNESS_AUTHOR,
135
+ HARNESS_DIR_NAME,
136
+ getHarnessDir,
137
+ getManifestPath,
138
+ readManifest,
139
+ writeManifest,
140
+ recordSkillInstall,
141
+ recordAgentInstall,
142
+ recordGeneratedSkill,
143
+ removeGeneratedSkill,
144
+ removeSkillFromManifest,
145
+ removeAgentFromManifest,
146
+ };