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,54 +1,47 @@
1
1
  ---
2
2
  name: self-evolve
3
- description: Extracts root causes from resolved difficult problems and persists them as new error boundaries in memory.
4
- author: Miya Daniel | Harness Core Team
5
- version: 0.2.0
3
+ description: "Extract root causes from resolved problems and persist them as defensive memory rules or dynamic skills; use after struggles, zoom-outs, or explicit request."
4
+ license: Apache-2.0
5
+ metadata:
6
+ author: Miya Daniel
7
+ version: 0.3.6
6
8
  ---
7
9
 
8
- # Self Evolve (Self Evolution & Memory Extraction)
10
+ # Self-evolve
11
+
12
+ Record reusable root causes from resolved work.
13
+
14
+ Boundary: the host agent supplies authorized evidence and a generalized root cause. This skill classifies and persists it; it does not scan host transcripts.
15
+
16
+ Load `references/memory-resolution.md` on demand for the decision matrix, fallback paths, lazy-loading rules, and dynamic-skill details.
9
17
 
10
18
  ## 📋 Skill Contract
11
19
 
12
20
  | Component | Specification |
13
21
  | :--- | :--- |
14
- | **Trigger / Input** | Task completion after a major struggle, or post-zoom-out recovery. Input: The root cause of the previous failure. |
15
- | **Expected Output** | Terminal execution of the persistence script. |
16
- | **State Mutations** | Updates workspace memory/rules files (e.g., `RULES.md` or `.claude/harness-state/memories.json`). |
17
- | **Enforcement Gate** | You MUST run `node <this-skill-dir>/scripts/self-regression.js`. You MUST run `node <this-skill-dir>/scripts/persist-memory.js "<rule>"`. |
18
-
19
- This skill is responsible for the long-term learning and error prevention of the system.
20
- It ensures that the entire Harness ecosystem becomes smarter and avoids repeating mistakes after solving difficult problems every time.
21
-
22
- ## 1. Triggers
23
- - **Post-Circuit Breaker**: When `zoom-out` was triggered, and the difficult problem was ultimately solved — via the reflection report's fresh diagnosis or with the human's hints.
24
- - **Major Breakthrough**: Completed an extremely complex Tier 3 task, and discovered some previously unknown framework limitations or architectural pitfalls during the process.
25
- - **Human Instruction**: The user explicitly requests "remember this lesson" or "add this to memory".
26
-
27
- ## 2. Execution Process (The Evolution Loop)
28
-
29
- ### Step 1: Deep Reflection & Root Cause Extraction
30
- - **Reflection is Core**: Reflection is the true focus of the memory system. Mere recording cannot improve accuracy; you must continuously reflect to self-evolve.
31
- - Analyze the problem just solved, discarding specific variable names or specific line numbers of code.
32
- - Extract the **high-level, universally applicable root cause**.
33
- - *Incorrect Extraction*: "Do not use `forEach` to call the database on line 45 of `auth.js`."
34
- - *Correct Extraction*: "When handling ORM relational writes in this project, you MUST use Transactions and batch writes. Sending Queries individually in a loop is PROHIBITED, otherwise it will cause connection pool exhaustion."
35
-
36
- ### Step 2: Define Error Boundaries
37
- - Transform the extracted root cause into a defensive rule for `install-cognitive-os` to reference in the future.
38
- - Explicitly define which domain this new rule applies to (e.g., Database, React Hooks, specific API integration).
39
- - **Anti-Focus Loss**: This rule must be able to directly guide future Agents to notice this landmine during the `[Discover]` phase, instead of finding out only after writing it wrong.
40
-
41
- ### Step 3: Memory Persistence & Dynamic Skill Generation
42
- - **MANDATORY**: Before persisting or committing any dynamically generated skills or memories, you MUST run the self-regression suite to ensure no behavioral regressions or syntax errors were introduced. Both scripts below live in the `scripts/` directory **inside this skill's own directory** — resolve paths from wherever this SKILL.md was loaded (do not guess a hard-coded location):
43
- ```bash
44
- node "<this-skill-dir>/scripts/self-regression.js"
45
- ```
46
- - **MANDATORY**: You MUST execute the persistence script instead of manually editing files or calling write tools:
47
- ```bash
48
- node "<this-skill-dir>/scripts/persist-memory.js" "<Your extracted root cause and defensive rule here>"
49
- ```
50
- - **Dynamic Skill Generation (Session Packaging)**: Through self-review, package the successful session summary (hard boundary) into a new, dynamic skill. **You MUST load `skill-creator/SKILL.md` and follow its §4 Dynamic Skill Generation Contract** before writing the file — it defines the required location (`.claude/harness-everything/skills/generated/<name>/SKILL.md`, not the repo root), the required lifecycle frontmatter (`metadata.type: dynamic`, `status: draft`), and the Quality Checklist gate this file must pass since it skips human PR review by design. Do not hand-write a `SKILL.md` inline here; that checklist is the only review a dynamically generated skill gets. These dynamically generated skills have a lifecycle — draft → active → deprecated, or promoted to a static skill once proven general — distinct from the system's foundational static skills.
51
- - **Note**: Only record "Key Insights", keeping the memory document short and punchy. Avoid stuffing it with lengthy conversation logs or useless narratives.
52
-
53
- ## 3. Purpose
54
- Through `self-evolve`, we transform "invalid trial-and-error", which might otherwise waste Tokens, into a valuable "moat" for the system. Even if the underlying model doesn't become inherently smarter, equipped with these memories, the system will automatically avoid known traps and break through its original reasoning ceiling.
22
+ | **Trigger / Input** | Resolved struggle, zoom-out recovery, or explicit request; caller supplies evidence and root cause. |
23
+ | **Expected Output** | Persisted rule in existing memory or registered dynamic skill. |
24
+ | **State Mutations** | Updates the selected workspace memory or generated-skill manifest. |
25
+ | **Enforcement Gate** | Deduplication, self-regression, and the 60-line routing rule pass before persistence. |
26
+
27
+ ## Core Workflow
28
+
29
+ 1. Prefer existing `MEMORY.md`/`RULES.md`/`CLAUDE.md`/`AGENTS.md`.
30
+ 2. Route the lesson:
31
+ - Simple rule (constraint/tip) → `memories/repo/RULES.md`, else `.github/harness-everything/memories/RULES.md`; use `persist-memory.js`.
32
+ - Reusable procedure → follow `skill-creator/SKILL.md`, then register with `register-dynamic-skill.js` in every platform `manifest.json`.
33
+ 3. Run `self-regression.js` before persisting. Never persist without it.
34
+
35
+ ## USE FOR:
36
+ - Lesson after hard debugging recovery
37
+ - Defensive rule found mid-task
38
+ - Reusable pattern packaged as dynamic skill
39
+ - Post-zoom-out rule extraction
40
+
41
+ ## DO NOT USE FOR:
42
+ - One-off notes that won't recur
43
+ - Lessons already captured
44
+ - Secrets in memory files
45
+ - Static repo skills (use `skill-creator`)
46
+
47
+ Deep dive: references/memory-resolution.md
@@ -0,0 +1,58 @@
1
+ # Self-Evolve — Memory Resolution & Execution Details
2
+
3
+ Details moved from SKILL.md. Read when you need the full decision matrix or the reasoning behind the cleanliness rules.
4
+
5
+ ## Responsibility Boundary
6
+
7
+ The host agent owns access to the current session and any history explicitly exposed by the host. It selects authorized evidence and states a generalized root cause before invoking this skill. `self-evolve` classifies, deduplicates, validates, and persists that result. It MUST NOT scan global transcript stores, persist raw transcripts, or act as a transcript daemon.
8
+
9
+ ## Triggers
10
+
11
+ - **Post-Circuit Breaker**: Following successful recovery after a `zoom-out` reflection.
12
+ - **Major Breakthrough**: Upon completing complex tasks that revealed non-obvious framework limits or architectural edge cases.
13
+ - **Explicit Request**: When the user asks to "remember this lesson" or "save this to memory".
14
+
15
+ ## Execution Process & Memory Resolution Flow
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ Start[Self-Evolve Triggered: Extract Lessons] --> CheckProjectMemory{1. Detect Workspace Memory Architecture?<br>e.g. MEMORY.md, RULES.md}
20
+
21
+ CheckProjectMemory -- Found MEMORY.md / RULES.md --> TargetFile[Set Target Memory File]
22
+ CheckProjectMemory -- Not Found --> CheckScript{2. Node.js & Script Executable?}
23
+
24
+ CheckScript -- Yes --> RunScript[Execute scripts/persist-memory.js / register-dynamic-skill.js]
25
+ CheckScript -- No --> PathPlatform[Create Platform State Memory<br>e.g. .github/harness-everything/memories/RULES.md] --> TargetFile
26
+
27
+ RunScript --> Done[Memory Persisted]
28
+ TargetFile --> CheckLineCount{3. Check Target File Line Count}
29
+
30
+ CheckLineCount -- < 60 Lines --> DirectAppend[Directly Append Rule to Target Memory File]
31
+ CheckLineCount -- ≥ 60 Lines --> ModularSplit[Categorize & Create Sub-memory File<br>e.g. memories/rules/topic.md]
32
+
33
+ ModularSplit --> LazyLoadIndex[Add 1-Line Index Pointer to Primary MEMORY.md<br>Enable Lazy Loading]
34
+
35
+ DirectAppend --> Done
36
+ LazyLoadIndex --> Done
37
+ ```
38
+
39
+ For a simple rule, persist only the generalized constraint or tip. For a reusable multi-step procedure, load `skill-creator/SKILL.md`, create the draft skill, and use `register-dynamic-skill.js` to update each platform's `manifest.json` `generated[]` registry. The host agent remains responsible for deciding which evidence is relevant; these scripts do not discover session history.
40
+
41
+ ## Memory Resolution & Cleanliness Rules
42
+
43
+ 1. **Workspace Memory Inspection First**:
44
+ Before creating new memory files or running scripts, check if the workspace already maintains a primary memory file (such as `MEMORY.md`, `memories/repo/RULES.md`, `CLAUDE.md`, or `AGENTS.md`). If found, prioritize updating the existing structure.
45
+
46
+ 2. **The 60-Line Cleanliness & Lazy Loading Rule**:
47
+ To prevent Context Bloat and keep workspace memory organized:
48
+ - **Under 60 Lines**: Append the concise, generalized defensive rule directly to the primary memory file.
49
+ - **60 Lines or Greater**:
50
+ - **Modular Split**: Extract the rule into a dedicated topic file under a sub-folder (e.g. `memories/rules/db-migration.md` or `.github/harness-everything/memories/rules/<topic>.md`).
51
+ - **Index Pointer & Lazy Loading**: Add a single-line link/pointer in the primary `MEMORY.md` (e.g. `- [DB Migration Rules](memories/rules/db-migration.md)`). Future agent sessions will lazy-load the sub-memory file only when touching that specific domain.
52
+
53
+ 3. **Script Tooling Fallback**:
54
+ If Node.js and `persist-memory.js` are executable, run `node "<this-skill-dir>/scripts/persist-memory.js" "<rule>"`. If script execution fails or is unavailable, use the agent's file tools or memory API directly.
55
+
56
+ ## Purpose
57
+
58
+ Through `self-evolve`, we transform "invalid trial-and-error", which might otherwise waste Tokens, into a valuable "moat" for the system. Even if the underlying model doesn't become inherently smarter, equipped with these memories, the system will automatically avoid known traps and break through its original reasoning ceiling.
@@ -1,40 +1,139 @@
1
- #!/usr/bin/env node
2
- const fs = require('fs');
3
- const path = require('path');
4
-
5
- const args = process.argv.slice(2);
6
- const memoryText = args[0];
7
-
8
- if (!memoryText) {
9
- console.error("Usage: node persist-memory.js \"<insight to remember>\"");
10
- process.exit(1);
11
- }
12
-
13
- function getWorkspaceRoot() {
14
- let dir = path.resolve(process.cwd());
15
- while (dir !== path.parse(dir).root) {
16
- if (fs.existsSync(path.join(dir, '.git'))) return dir;
17
- dir = path.dirname(dir);
18
- }
19
- return process.cwd();
20
- }
21
-
22
- // Ensure the memory is written to the project root's /memories/repo/ directory
23
- const currentDir = getWorkspaceRoot();
24
- const memoryDir = path.join(currentDir, 'memories', 'repo');
25
- const rulesFile = path.join(memoryDir, 'RULES.md');
26
-
27
- try {
28
- if (!fs.existsSync(memoryDir)) {
29
- fs.mkdirSync(memoryDir, { recursive: true });
30
- }
31
-
32
- const timestamp = new Date().toISOString().split('T')[0];
33
- const formattedMemory = `\n## [${timestamp}] Self-Evolution Insight\n- ${memoryText}\n`;
34
-
35
- fs.appendFileSync(rulesFile, formattedMemory, 'utf8');
36
- console.log(`[Success] Memory persisted to ${rulesFile}`);
37
- } catch (err) {
38
- console.error(`[Error] Failed to write memory: ${err.message}`);
39
- process.exit(1);
40
- }
1
+ #!/usr/bin/env node
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+
5
+ const args = process.argv.slice(2);
6
+ const memoryText = args[0];
7
+
8
+ if (memoryText === '--help' || memoryText === '-h') {
9
+ console.log(`Append a short defensive rule to memories/repo/RULES.md.
10
+
11
+ Usage: node persist-memory.js "<insight to remember>"
12
+
13
+ One positional argument - the extracted root cause / rule, written as a universal,
14
+ high-level statement (not a specific file, line number, or variable name). Wrap it
15
+ in quotes if it contains spaces. Appended under a dated heading; never overwrites
16
+ earlier entries.
17
+
18
+ Quality gates:
19
+ - Minimum score of 5/10 required for persistence
20
+ - Deduplication check against existing rules
21
+ - Specificity and actionability scoring`);
22
+ process.exit(0);
23
+ }
24
+
25
+ if (!memoryText) {
26
+ console.error("Usage: node persist-memory.js \"<insight to remember>\"");
27
+ process.exit(1);
28
+ }
29
+
30
+ // Rule quality scoring system
31
+ function scoreRuleQuality(ruleText, existingRules = []) {
32
+ let score = 0;
33
+
34
+ // Specificity: mentions specific files, errors, or patterns
35
+ if (/\.\w{2,4}/.test(ruleText)) score += 2; // File extensions
36
+ if (/Error|Exception|Warning|錯誤|異常|警告/.test(ruleText)) score += 2; // Error patterns
37
+ if (/\b(test|lint|build|verify|check|測試|檢查)\b/i.test(ruleText)) score += 1; // Verification terms
38
+
39
+ // Actionability: starts with verb, has clear instruction
40
+ if (/^(Always|Never|Check|Verify|Prefer|Avoid|Use|不要|總是|檢查|驗證|避免|使用)/i.test(ruleText)) score += 3;
41
+ if (/^(should|must|will|needs? to|ought|應該|必須|需要)/i.test(ruleText)) score += 2;
42
+
43
+ // Uniqueness: not already in RULES.md
44
+ const isDuplicate = existingRules.some(existing => {
45
+ const similarity = calculateSimilarity(ruleText, existing);
46
+ return similarity > 0.7; // 70% similarity threshold
47
+ });
48
+ if (!isDuplicate) score += 3;
49
+
50
+ // Length appropriateness (not too short, not too long)
51
+ if (ruleText.length > 20 && ruleText.length < 200) score += 1;
52
+
53
+ return Math.min(score, 10); // Cap at 10
54
+ }
55
+
56
+ // Simple text similarity calculation
57
+ function calculateSimilarity(text1, text2) {
58
+ const words1 = text1.toLowerCase().split(/\s+/);
59
+ const words2 = text2.toLowerCase().split(/\s+/);
60
+
61
+ const set1 = new Set(words1);
62
+ const set2 = new Set(words2);
63
+
64
+ let intersection = 0;
65
+ for (const word of set1) {
66
+ if (set2.has(word)) intersection++;
67
+ }
68
+
69
+ const union = set1.size + set2.size - intersection;
70
+ return union === 0 ? 0 : intersection / union;
71
+ }
72
+
73
+ // Extract existing rules from RULES.md
74
+ function extractExistingRules(rulesFile) {
75
+ if (!fs.existsSync(rulesFile)) return [];
76
+
77
+ try {
78
+ const content = fs.readFileSync(rulesFile, 'utf8');
79
+ const ruleMatches = content.match(/^- .+$/gm) || [];
80
+ return ruleMatches.map(rule => rule.substring(2)); // Remove "- " prefix
81
+ } catch (err) {
82
+ return [];
83
+ }
84
+ }
85
+
86
+ function getWorkspaceRoot() {
87
+ let dir = path.resolve(process.cwd());
88
+ while (dir !== path.parse(dir).root) {
89
+ if (fs.existsSync(path.join(dir, '.git'))) return dir;
90
+ dir = path.dirname(dir);
91
+ }
92
+ return process.cwd();
93
+ }
94
+
95
+ // Ensure the memory is written to the project root's memories/repo/ directory
96
+ const currentDir = getWorkspaceRoot();
97
+ const memoryDir = path.join(currentDir, 'memories', 'repo');
98
+ const rulesFile = path.join(memoryDir, 'RULES.md');
99
+
100
+ try {
101
+ if (!fs.existsSync(memoryDir)) {
102
+ fs.mkdirSync(memoryDir, { recursive: true });
103
+ }
104
+
105
+ // Extract existing rules for deduplication check
106
+ const existingRules = extractExistingRules(rulesFile);
107
+
108
+ // Score the rule quality
109
+ const qualityScore = scoreRuleQuality(memoryText, existingRules);
110
+
111
+ if (qualityScore < 5) {
112
+ console.error(`[Quality Gate] Rule rejected - score ${qualityScore}/10 (minimum 5 required)`);
113
+ console.error(`Suggestions to improve:`);
114
+ console.error(`- Be more specific (mention file types, error patterns)`);
115
+ console.error(`- Start with action verbs (Always, Never, Check, Verify)`);
116
+ console.error(`- Ensure the rule is actionable and not already captured`);
117
+ process.exit(1);
118
+ }
119
+
120
+ // Check for duplicates
121
+ const isDuplicate = existingRules.some(existing => {
122
+ const similarity = calculateSimilarity(memoryText, existing);
123
+ return similarity > 0.7;
124
+ });
125
+
126
+ if (isDuplicate) {
127
+ console.error(`[Quality Gate] Rule rejected - similar rule already exists`);
128
+ process.exit(1);
129
+ }
130
+
131
+ const timestamp = new Date().toISOString().split('T')[0];
132
+ const formattedMemory = `\n## [${timestamp}] Self-Evolution Insight (Quality: ${qualityScore}/10)\n- ${memoryText}\n`;
133
+
134
+ fs.appendFileSync(rulesFile, formattedMemory, 'utf8');
135
+ console.log(`[Success] Memory persisted to ${rulesFile} (Quality: ${qualityScore}/10)`);
136
+ } catch (err) {
137
+ console.error(`[Error] Failed to write memory: ${err.message}`);
138
+ process.exit(1);
139
+ }
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+
5
+ function getWorkspaceRoot() {
6
+ let dir = path.resolve(process.cwd());
7
+ while (dir !== path.parse(dir).root) {
8
+ if (fs.existsSync(path.join(dir, '.git'))) return dir;
9
+ dir = path.dirname(dir);
10
+ }
11
+ return process.cwd();
12
+ }
13
+
14
+ function loadManifestHelper() {
15
+ const candidates = [
16
+ path.join(__dirname, '../../scripts/lib/manifest'),
17
+ path.join(__dirname, '../scripts/lib/manifest'),
18
+ path.join(__dirname, '../../../scripts/lib/manifest'),
19
+ path.join(getWorkspaceRoot(), 'scripts/lib/manifest'),
20
+ path.join(getWorkspaceRoot(), 'harness-everything/scripts/lib/manifest'),
21
+ ];
22
+ for (const cand of candidates) {
23
+ try {
24
+ if (fs.existsSync(cand + '.js') || fs.existsSync(cand)) {
25
+ return require(cand);
26
+ }
27
+ } catch (e) {}
28
+ }
29
+ throw new Error('[register-dynamic-skill] Failed to locate manifest helper module (scripts/lib/manifest)');
30
+ }
31
+
32
+ const { getManifestPath, readManifest, writeManifest, recordGeneratedSkill } = loadManifestHelper();
33
+
34
+ // Find user home folder
35
+ const userHome = process.env.HOME || process.env.USERPROFILE || '';
36
+ const workspaceRoot = getWorkspaceRoot();
37
+
38
+ // List of all possible manifest.json home paths
39
+ const manifestHomes = [
40
+ path.join(workspaceRoot, '.claude'),
41
+ path.join(workspaceRoot, '.cursor'),
42
+ path.join(workspaceRoot, '.github'),
43
+ path.join(workspaceRoot, '.codex'),
44
+ path.join(workspaceRoot, '.continue'),
45
+ path.join(userHome, '.agents'),
46
+ path.join(userHome, '.claude')
47
+ ];
48
+
49
+ // Helper to parse simple YAML frontmatter without external dependencies
50
+ function parseFrontmatter(content) {
51
+ const lines = content.split(/\r?\n/);
52
+ const fm = {};
53
+ let inFM = false;
54
+ const fmLines = [];
55
+
56
+ for (const line of lines) {
57
+ if (line.trim() === '---') {
58
+ if (!inFM) {
59
+ inFM = true;
60
+ continue;
61
+ } else {
62
+ break;
63
+ }
64
+ }
65
+ if (inFM) {
66
+ fmLines.push(line);
67
+ }
68
+ }
69
+
70
+ let currentKey = null;
71
+ for (const line of fmLines) {
72
+ const trimmed = line.trim();
73
+ if (!trimmed || trimmed.startsWith('#')) continue;
74
+
75
+ // Check if indent level is substantial (nested list or object)
76
+ const indent = line.search(/\S/);
77
+
78
+ if (indent === 0) {
79
+ const match = line.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
80
+ if (match) {
81
+ const key = match[1];
82
+ const val = match[2].trim();
83
+
84
+ let cleanVal = val;
85
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
86
+ cleanVal = val.slice(1, -1);
87
+ }
88
+
89
+ if (val.startsWith('[') && val.endsWith(']')) {
90
+ cleanVal = val.slice(1, -1).split(',').map(s => s.trim().replace(/^['"]|['"]$/g, ''));
91
+ }
92
+
93
+ fm[key] = cleanVal;
94
+ currentKey = key;
95
+ }
96
+ } else if (indent > 0 && currentKey) {
97
+ // Handle nested properties or array items
98
+ if (trimmed.startsWith('- ')) {
99
+ if (!Array.isArray(fm[currentKey])) {
100
+ fm[currentKey] = [];
101
+ }
102
+ fm[currentKey].push(trimmed.slice(2).trim().replace(/^['"]|['"]$/g, ''));
103
+ } else {
104
+ const childMatch = trimmed.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
105
+ if (childMatch) {
106
+ if (typeof fm[currentKey] !== 'object' || Array.isArray(fm[currentKey])) {
107
+ fm[currentKey] = {};
108
+ }
109
+ const childKey = childMatch[1];
110
+ const childVal = childMatch[2].trim().replace(/^['"]|['"]$/g, '');
111
+ fm[currentKey][childKey] = childVal;
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return fm;
117
+ }
118
+
119
+ function processSkillDir(skillDirPath) {
120
+ const skillFile = path.join(skillDirPath, 'SKILL.md');
121
+ if (!fs.existsSync(skillFile)) {
122
+ return null;
123
+ }
124
+
125
+ const content = fs.readFileSync(skillFile, 'utf8');
126
+ const fm = parseFrontmatter(content);
127
+
128
+ const skillId = fm.name || path.basename(skillDirPath);
129
+ const description = fm.description || 'No description provided';
130
+
131
+ // Extract custom triggers/tags if defined, or infer them from keywords
132
+ let triggers = [];
133
+ if (fm.triggers) {
134
+ triggers = Array.isArray(fm.triggers) ? fm.triggers : [fm.triggers];
135
+ } else if (fm.metadata && fm.metadata.triggers) {
136
+ triggers = Array.isArray(fm.metadata.triggers) ? fm.metadata.triggers : [fm.metadata.triggers];
137
+ } else {
138
+ // Fallback only - explicit `triggers:` frontmatter (mandated by
139
+ // skill-creator/SKILL.md §4) should make this branch rare. Kept
140
+ // deliberately conservative: only the skill name plus the description's
141
+ // first sentence (not the whole prose block), a longer stopword list,
142
+ // and a length-5+ floor, so a generic skill description doesn't spam
143
+ // tier-router.js with broad words that fire on unrelated prompts.
144
+ const firstSentence = description.split(/[.!?]/)[0];
145
+ const STOPWORDS = new Set([
146
+ 'with', 'from', 'this', 'that', 'your', 'about', 'some', 'than', 'then',
147
+ 'prevent', 'resolved', 'skill', 'agent', 'using', 'which', 'these',
148
+ 'those', 'their', 'there', 'where', 'when', 'while', 'after', 'before',
149
+ 'again', 'other', 'every', 'being', 'would', 'could', 'should', 'still',
150
+ 'first', 'never', 'always', 'ensure', 'provide', 'provided'
151
+ ]);
152
+ const words = (skillId + ' ' + firstSentence)
153
+ .toLowerCase()
154
+ .replace(/[^\w\s-]/g, ' ')
155
+ .split(/\s+/)
156
+ .filter(w => w.length >= 5 && !STOPWORDS.has(w));
157
+ triggers = [...new Set(words)].slice(0, 8);
158
+ }
159
+
160
+ return {
161
+ id: skillId,
162
+ dirPath: skillDirPath,
163
+ description,
164
+ triggers,
165
+ metadata: fm.metadata || {}
166
+ };
167
+ }
168
+
169
+ function register() {
170
+ const arg = process.argv[2];
171
+
172
+ if (arg === '--help' || arg === '-h') {
173
+ console.log(`Register self-evolve dynamic skills into every detected platform manifest.json.
174
+
175
+ Usage:
176
+ node register-dynamic-skill.js Scan .claude/harness-everything/skills/generated/ and register every skill found there.
177
+ node register-dynamic-skill.js <name> Register only the skill folder named <name> under skills/generated/.
178
+ node register-dynamic-skill.js <path> Register the skill folder at this literal path instead.
179
+
180
+ Each skill folder needs a SKILL.md with 'name' and 'description' frontmatter (plus
181
+ 'triggers' - if omitted, triggers are inferred from the name and description, which
182
+ is a conservative fallback, not a substitute for setting them explicitly). Writes to
183
+ every already-bootstrapped platform's manifest.json (.claude/, .cursor/, .github/,
184
+ .codex/, .continue/, plus the user-home ~/.agents and ~/.claude homes).`);
185
+ process.exit(0);
186
+ }
187
+
188
+ const generatedBaseDir = path.join(workspaceRoot, '.claude', 'harness-everything', 'skills', 'generated');
189
+
190
+ let skillsToRegister = [];
191
+
192
+ if (arg) {
193
+ // Scenario A: Register specific skill ID or path
194
+ let skillPath = arg;
195
+ if (!fs.existsSync(skillPath)) {
196
+ skillPath = path.join(generatedBaseDir, arg);
197
+ }
198
+ if (fs.existsSync(skillPath)) {
199
+ const info = processSkillDir(skillPath);
200
+ if (info) skillsToRegister.push(info);
201
+ } else {
202
+ console.error(`[Error] Dynamic skill folder not found: ${arg}`);
203
+ process.exit(1);
204
+ }
205
+ } else {
206
+ // Scenario B: Scan whole generated folder
207
+ if (fs.existsSync(generatedBaseDir)) {
208
+ const subdirs = fs.readdirSync(generatedBaseDir, { withFileTypes: true });
209
+ for (const entry of subdirs) {
210
+ if (entry.isDirectory()) {
211
+ const dirPath = path.join(generatedBaseDir, entry.name);
212
+ const info = processSkillDir(dirPath);
213
+ if (info) skillsToRegister.push(info);
214
+ }
215
+ }
216
+ }
217
+ }
218
+
219
+ if (skillsToRegister.length === 0) {
220
+ console.log('[Info] No self-evolved dynamic skills found to register.');
221
+ return;
222
+ }
223
+
224
+ // Write to all detected manifests (auto-creating target directories if in workspace)
225
+ let count = 0;
226
+ for (const home of manifestHomes) {
227
+ const manifestPath = getManifestPath(home);
228
+ const parentDir = path.dirname(manifestPath);
229
+ const isRepoHome = home.startsWith(workspaceRoot);
230
+ if (fs.existsSync(parentDir) || isRepoHome) {
231
+ fs.mkdirSync(parentDir, { recursive: true });
232
+ for (const skill of skillsToRegister) {
233
+ recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
234
+ }
235
+ console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to ${manifestPath}`);
236
+ count++;
237
+ }
238
+ }
239
+
240
+ if (count === 0) {
241
+ // Fallback: If no manifest path's directory existed, write to at least the standard home path
242
+ const fallbackHome = path.join(userHome, '.agents');
243
+ const manifestPath = getManifestPath(fallbackHome);
244
+ for (const skill of skillsToRegister) {
245
+ recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
246
+ }
247
+ console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to fallback manifest ${manifestPath}`);
248
+ }
249
+ }
250
+
251
+ register();