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,219 +1,334 @@
1
- #!/usr/bin/env node
2
- const { execSync } = require('child_process');
3
-
4
- function run(userPrompt) {
5
- console.log(`[Tier Routing Pre-check]`);
6
-
7
- const promptLower = userPrompt.toLowerCase();
8
-
9
- // Basic keyword heuristic (bilingual - the Human Partner often prompts in
10
- // Chinese, and an English-only net silently degrades to Tier 1 for them).
11
- // Deliberately NOT driven by the diff stats above: those measure what is
12
- // already sitting uncommitted in the tree - usually the PREVIOUS task's
13
- // leftovers - not the complexity of the task being asked for now.
14
- const TIER3_KEYWORDS = ["architecture", "refactor", "rewrite the", "æžļ構", "重構", "重å¯Ģ"];
15
- const TIER2_KEYWORDS = ["test", "api", "integration", "endpoint", "æ¸ŦčŠĻ", "整合", "į̝éģž", "äģ‹éĸ"];
16
-
17
- let recommendedTier = "Tier 1 (Trivial)";
18
- let rationale = "No structural/testing signals in the prompt.";
19
-
20
- if (TIER3_KEYWORDS.some(k => promptLower.includes(k))) {
21
- recommendedTier = "Tier 3 (Macro Task)";
22
- rationale = "Prompt implies system-wide or architectural change.";
23
- } else if (TIER2_KEYWORDS.some(k => promptLower.includes(k))) {
24
- recommendedTier = "Tier 2 (Standard Task)";
25
- rationale = "Prompt implies development work needing TDD validation or multi-file coordination.";
26
- }
27
-
28
- console.log(`\n=> RECOMMENDED TIER: ${recommendedTier}`);
29
- console.log(`=> RATIONALE: ${rationale}`);
30
-
31
- // Base execution loop: Tier 2/3 must run on the todo-driven-workflow
32
- // checklist (Tier 1 is exempt to avoid checklist bloat on trivial edits).
33
- if (!recommendedTier.startsWith("Tier 1")) {
34
- console.log(`\n=> BASE EXECUTION LOOP: Load 'todo-driven-workflow' and initialize its checklist (3-7 verifiable sub-tasks) BEFORE editing any file.`);
35
- console.log(` Track exactly ONE item in-progress at a time; verify with real evidence before marking completed.`);
36
- }
37
-
38
- // Analyze and output relevant Knowledge Guides / Templates based on user prompt keywords
39
- const recommendedGuides = [];
40
-
41
- const TDD_TEST_KEYWORDS = [
42
- "tdd", "test", "mock", "stub", "api", "endpoint", "integration", "debugging", "bug", "error", "fix",
43
- "æ¸ŦčŠĻ", "å–Žæ¸Ŧ", "æ¨Ąįĩ„æ¸ŦčŠĻ", "į̝éģž", "äģ‹éĸ", "除錯", "錯čǤ", "äŋŽåžŠ"
44
- ];
45
- if (TDD_TEST_KEYWORDS.some(k => promptLower.includes(k))) {
46
- recommendedGuides.push(
47
- "- tdd/SKILL.md (Test-Driven Development Red-Green-Refactor loop)",
48
- "- tdd/guides/mocking.md (Mocking principles & isolation)",
49
- "- tdd/guides/interface-design.md (Interface and contract design)",
50
- "- tdd/guides/deep-modules.md (Testing deep nested modules)",
51
- "- tdd/guides/tests.md (General test architecture)",
52
- "- environment-detection/SKILL.md (Detect active shell/OS & preflight syntax before running commands)",
53
- "- verify-before-claim/SKILL.md (Fact-audit discipline: verify external claims and unmeasured estimates before asserting them)",
54
- "- verification-loop/SKILL.md (Pre-PR verification gate: build, types, lint, tests, security scan)"
55
- );
56
- }
57
-
58
- const GIT_COMMIT_KEYWORDS = [
59
- "commit", "git", "save", "submodule", "pr", "pull request", "release", "quality gate", "ready to ship",
60
- "提äē¤", "į‰ˆæŽ§", "合äŊĩ", "分支", "į™ŧ行"
61
- ];
62
- if (GIT_COMMIT_KEYWORDS.some(k => promptLower.includes(k))) {
63
- recommendedGuides.push(
64
- "- git-commit/SKILL.md (Angular-style commit convention generation)",
65
- "- git-commit/guides/ANGULAR_STYLE.md (Commit conventions reference)",
66
- "- git-commit/guides/COMMIT_GENERATION.md (Commit generation patterns)",
67
- "- git-commit/guides/LANGUAGE_DETECTION.md (Multi-language commits)",
68
- "- git-commit/guides/MAIN_REPO.md (Commits in main repositories)",
69
- "- git-commit/guides/SUBMODULES.md (Submodule commit handling)",
70
- "- rewrite-commits/SKILL.md (Rewrite commit history safely to Angular style)",
71
- "- using-git-worktrees/SKILL.md (Git Worktrees isolation for feature work, avoids workspace pollution)",
72
- "- verification-loop/SKILL.md (Pre-PR verification gate: build, types, lint, tests, security scan)"
73
- );
74
- }
75
-
76
- if (promptLower.includes("doc") || promptLower.includes("readme") || promptLower.includes("文äģļ") || promptLower.includes("čĒĒæ˜Žæ–‡äģļ")) {
77
- recommendedGuides.push(
78
- "- repo-docs/templates/readme-template.md (Standard README template)",
79
- "- repo-docs/templates/product-readme-template.md (Product README template)",
80
- "- repo-docs/templates/agents-template.md (Agent onboarding instructions template)"
81
- );
82
- }
83
-
84
- const AGENT_KEYWORDS = [
85
- "agent", "multi-agent", "launcher", "subagent", "sub-agent", "delegate", "orchestrate", "specialist",
86
- "workspace scaffolding", "scaffold workspace", "division of labor", "fable", "macro", "orchestrator",
87
- "äģŖį†", "多äģŖį†", "啟動器", "子äģŖį†", "委洞", "指洞", "分åˇĨ", "協čĒŋ", "äģģ務分配", "čĻåŠƒ"
88
- ];
89
- if (AGENT_KEYWORDS.some(k => promptLower.includes(k))) {
90
- recommendedGuides.push(
91
- "- fable-mode/SKILL.md (Macro task planning & execution orchestrator)",
92
- "- fable-discipline/SKILL.md (Shadow guard preventing context bloat and managing token limits)",
93
- "- build-multi-agent-system/SKILL.md (Universal Multi-Agent Workspace scaffolding & memory db)",
94
- "- create-agent-launcher/SKILL.md (Sub-agent generator for specialized task delegation)",
95
- "- repo-docs/templates/agents-template.md (Agent onboarding instructions template)",
96
- "- grill-with-docs/SKILL.md (Decision tracking, Glossary & ADR-driven design grilling)"
97
- );
98
- }
99
-
100
- const ARCH_REFACTOR_KEYWORDS = [
101
- "refactor", "architecture", "structure", "couple", "seam", "adr", "design plan", "decision", "grill",
102
- "重構", "æžļ構", "įĩæ§‹", "č§Ŗč€Ļ", "設計", "æąēį­–", "čž¯čĢ–", "čŗĒį–‘"
103
- ];
104
- if (ARCH_REFACTOR_KEYWORDS.some(k => promptLower.includes(k))) {
105
- recommendedGuides.push(
106
- "- improve-codebase-architecture/guides/DEEPENING.md (Deepening opportunities & depth rules)",
107
- "- improve-codebase-architecture/guides/INTERFACE-DESIGN.md (Interface design principles)",
108
- "- improve-codebase-architecture/guides/LANGUAGE.md (Language-specific patterns)",
109
- "- improve-codebase-architecture/guides/HTML-REPORT.md (Mermaid dependency report generation)",
110
- "- grill-with-docs/SKILL.md (Decision tracking, Glossary & ADR-driven design grilling)",
111
- "- grill-me/SKILL.md (Challenger interview to stress-test your architecture plan)",
112
- "- fable-mode/SKILL.md (Macro task planning & execution orchestrator)"
113
- );
114
- }
115
-
116
- const ENV_KEYWORDS = [
117
- "shell", "terminal", "powershell", "bash", "cmd", "env", "preflight", "command", "run",
118
- "įĩ‚įĢ¯æŠŸ", "å‘Ŋäģ¤", "į’°åĸƒ", "指äģ¤", "åŸˇčĄŒ"
119
- ];
120
- if (ENV_KEYWORDS.some(k => promptLower.includes(k))) {
121
- recommendedGuides.push(
122
- "- environment-detection/SKILL.md (Detect active shell/OS & preflight syntax before running commands)",
123
- "- using-git-worktrees/SKILL.md (Git Worktrees isolation for feature work, avoids workspace pollution)"
124
- );
125
- }
126
-
127
- const VERIFY_KEYWORDS = [
128
- "verify", "fact", "audit", "estimate", "benchmark", "performance", "speed", "scale",
129
- "驗證", "æŸĨ證", "核對", "效čƒŊ", "評æ¸Ŧ", "性čƒŊ", "äŧ°č¨ˆ"
130
- ];
131
- if (VERIFY_KEYWORDS.some(k => promptLower.includes(k))) {
132
- recommendedGuides.push(
133
- "- verify-before-claim/SKILL.md (Fact-audit discipline: verify external claims and unmeasured estimates before asserting them)",
134
- "- verification-loop/SKILL.md (Pre-PR verification gate: build, types, lint, tests, security scan)",
135
- "- eval-harness/SKILL.md (AI performance evaluation metrics & anti-loop metrics)"
136
- );
137
- }
138
-
139
- if (/\bskill\b|skill\.md|new skill|write a skill/.test(promptLower)) {
140
- recommendedGuides.push(
141
- "- skill-creator/SKILL.md (Authoring, auditing, and testing workflow for SKILL.md files, incl. dynamic skill generation)",
142
- "- skill-style/SKILL.md (Terse Skill Contract format spec that skill-creator builds on)"
143
- );
144
- }
145
-
146
- if (recommendedGuides.length > 0) {
147
- console.log(`\n=> RECOMMENDED KNOWLEDGE GUIDES (Auto-loaded based on keywords):`);
148
- recommendedGuides.forEach(guide => {
149
- const match = guide.match(/^- ([^\s]+)/);
150
- if (match) {
151
- const guidePath = require('path').join(__dirname, '..', '..', match[1]);
152
- if (!require('fs').existsSync(guidePath)) {
153
- console.log(`${guide} [NOT INSTALLED - Ignore this recommendation]`);
154
- return;
155
- }
156
- }
157
- console.log(guide);
158
- });
159
- }
160
-
161
- // Fact-audit nudge: broad, cheap keyword net for claims that risk being
162
- // asserted from stale/wrong training memory instead of verified. False
163
- // positives cost nothing here (it's a reminder, not a block) so recall
164
- // matters more than precision.
165
- const externalClaimTriggers = [
166
- "does it support", "does support", "how does", "what's the default", "what is the default",
167
- "exit code", "schema", "sdk", " api", "hook", "payload", "pricing", "rate limit",
168
- "latest version", "current version", "deprecated", "breaking change", "changelog",
169
- "spec", "documentation", "according to", "endpoint", "config option", "flag"
170
- ];
171
- const estimateTriggers = [
172
- "benchmark", "performance", "how fast", "how long will", "how much memory",
173
- "how many requests", "estimate", "roughly how", "big o", "complexity",
174
- "will this scale", "throughput", "latency"
175
- ];
176
- const hitExternalClaim = externalClaimTriggers.some(kw => promptLower.includes(kw));
177
- const hitEstimate = estimateTriggers.some(kw => promptLower.includes(kw));
178
-
179
- if (hitExternalClaim || hitEstimate) {
180
- console.log(`\n=> FACT-AUDIT REMINDER:`);
181
- if (hitExternalClaim) {
182
- console.log(`This looks like it may require a claim about an external framework/library/API/tool's current behavior.`);
183
- console.log(`Verify via WebFetch/WebSearch against the authoritative source before asserting it - do not answer from training memory alone; it can be stale or confidently wrong (e.g. exit-code semantics, schema fields, defaults, pricing).`);
184
- }
185
- if (hitEstimate) {
186
- console.log(`This looks like it may call for a performance/cost/timing number.`);
187
- console.log(`Prefer an actual measurement over a reasoned estimate when the stakes justify it - an unmeasured number (including one you generate yourself) is a hypothesis, not a fact.`);
188
- }
189
- }
190
-
191
- // Constraint strength must match judgment reliability: this routing is a
192
- // keyword heuristic, so it is a default, not an order.
193
- console.log(`\nTreat the tier above as the default route. If your own read of the task clearly disagrees, follow your read and say why in one line. An explicit instruction from the Human Partner always wins.`);
194
- }
195
-
196
- let userPrompt = process.argv[2] || '';
197
-
198
- if (process.argv[2]) {
199
- // If a command-line argument is passed, use it and execute immediately.
200
- run(userPrompt);
201
- } else if (process.stdin.isTTY) {
202
- // Running interactively in a terminal without piped input, execute immediately.
203
- run('');
204
- } else {
205
- // Piped input or non-TTY, read from standard input.
206
- let inputData = '';
207
- process.stdin.on('data', chunk => { inputData += chunk; });
208
- process.stdin.on('end', () => {
209
- try {
210
- if (inputData.trim()) {
211
- const payload = JSON.parse(inputData);
212
- if (typeof payload.prompt === 'string') userPrompt = payload.prompt;
213
- }
214
- } catch (err) {
215
- // Not valid JSON on stdin - fall back to argv (useful for direct/manual testing).
216
- }
217
- run(userPrompt);
218
- });
219
- }
1
+ #!/usr/bin/env node
2
+ const { execSync } = require('child_process');
3
+
4
+ // Keyword/guide tables live in the sibling routing-keywords.json, not inline
5
+ // here, so the Human Partner (or the LLM itself) can retune routing by
6
+ // editing data - no code changes, no re-install. It travels with this script
7
+ // on every install/update since it lives in the same skill folder. Fail open
8
+ // (empty tables) if it's missing or hand-edited into invalid JSON, so a bad
9
+ // edit degrades routing instead of breaking the hook.
10
+ function loadRoutingConfig() {
11
+ const fallback = { tiers: { tier3: [], tier2: [] }, guideGroups: [], factAudit: { externalClaim: [], estimate: [] } };
12
+ try {
13
+ const raw = require('fs').readFileSync(require('path').join(__dirname, 'routing-keywords.json'), 'utf8');
14
+ const parsed = JSON.parse(raw);
15
+ return {
16
+ tiers: parsed.tiers || fallback.tiers,
17
+ guideGroups: Array.isArray(parsed.guideGroups) ? parsed.guideGroups : fallback.guideGroups,
18
+ factAudit: parsed.factAudit || fallback.factAudit
19
+ };
20
+ } catch (err) {
21
+ console.log(`[Tier Routing Pre-check] routing-keywords.json missing/invalid - falling back to Tier 1 default, no guides. (${err.message})`);
22
+ return fallback;
23
+ }
24
+ }
25
+
26
+ function run(userPrompt) {
27
+ console.log(`[Tier Routing Pre-check]`);
28
+
29
+ const promptLower = userPrompt.toLowerCase();
30
+ const routingConfig = loadRoutingConfig();
31
+
32
+ // Basic keyword heuristic (bilingual - the Human Partner often prompts in
33
+ // Chinese, and an English-only net silently degrades to Tier 1 for them).
34
+ // Deliberately NOT driven by the diff stats above: those measure what is
35
+ // already sitting uncommitted in the tree - usually the PREVIOUS task's
36
+ // leftovers - not the complexity of the task being asked for now.
37
+ const TIER3_KEYWORDS = routingConfig.tiers.tier3 || [];
38
+ const TIER2_KEYWORDS = routingConfig.tiers.tier2 || [];
39
+
40
+ function matchKeyword(prompt, keyword) {
41
+ const k = keyword.toLowerCase().trim();
42
+ if (!k) return false;
43
+ const isChineseOrMultiword = /[\u4e00-\u9fa5]/.test(k) || k.includes(' ') || k.includes('-');
44
+ if (isChineseOrMultiword) {
45
+ return prompt.includes(k);
46
+ }
47
+ const escaped = k.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
48
+ return new RegExp(`\\b${escaped}\\b`, 'i').test(prompt);
49
+ }
50
+
51
+ function detectFableModel(prompt) {
52
+ const match = prompt.match(/\bfable(?:[- ]mode)?\s+(?:on|with)\s+(haiku|sonnet|sonnect|opus)\b|\bfable-(haiku|sonnet|opus)\b/i);
53
+ if (!match) return null;
54
+ const requested = (match[1] || match[2]).toLowerCase();
55
+ return requested === 'sonnect' ? 'sonnet' : requested;
56
+ }
57
+
58
+ let recommendedTier = "Tier 1 (Trivial)";
59
+ let rationale = "No structural/testing signals in the prompt.";
60
+
61
+ // Task-shape signals catch one-sentence audits and benchmarks that a flat
62
+ // keyword list cannot see. They are intentionally kept here, rather than
63
+ // mixed into the editable technology keyword table.
64
+ const macroSignals = [
65
+ /\b(?:every|each|all|entire|whole|full|complete)\s+(?:skill|skills|repo|repository|codebase|project|file|files|module|modules)/i,
66
+ /\b(?:evaluate|audit|benchmark|stress[- ]test|ab test|a\/b test|compare)\b/i,
67
+ /\b(?:repository[- ]wide|codebase[- ]wide|end[- ]to[- ]end)\b/i,
68
+ /\b(?:multiple|several|four|fourteen|dozens)\s+(?:issues|skills|files|modules)/i,
69
+ /(?:每個|每一個|所有|全部|整個|全åĨ—|逐一|多個|四個).*(?:skill|技čƒŊ|æĒ”æĄˆ|å•éĄŒ|į‰ˆæœŦ|åŸēæē–|æ¸ŦčŠĻ|評äŧ°|į¨Ŋæ ¸|比čŧƒ|åŖ“åŠ›)/i,
70
+ /(?:評äŧ°|į¨Ŋæ ¸|åŸēæē–|åŖ“åŠ›æ¸ŦčŠĻ|比čŧƒ).*(?:每個|所有|全部|整個|全åĨ—|技čƒŊ|skill|æĒ”æĄˆ|į‰ˆæœŦ)/i
71
+ ];
72
+ const hasMacroSignal = macroSignals.some(signal => signal.test(userPrompt));
73
+ const isTrivialDocsEdit = /^(?:(?:please|help me)\s+)?(?:fix|update|correct|change)\b.*\b(?:readme|documentation|docs?)\b.*\b(?:typo|spelling|wording|one line|single line)\b/i.test(userPrompt.trim());
74
+
75
+ if (isTrivialDocsEdit) {
76
+ // "update" is a common Tier 2 verb, but a one-line documentation typo
77
+ // is still Tier 1. This override prevents a broad keyword from winning.
78
+ recommendedTier = "Tier 1 (Trivial)";
79
+ rationale = "Single documentation typo detected - direct edit, no checklist required.";
80
+ } else if (hasMacroSignal || TIER3_KEYWORDS.some(k => matchKeyword(promptLower, k))) {
81
+ recommendedTier = "Tier 3 (Macro Task)";
82
+ rationale = "Prompt implies repository-wide scope, audit/benchmark work, architectural refactoring, or multi-agent collaboration.";
83
+ } else if (TIER2_KEYWORDS.some(k => matchKeyword(promptLower, k))) {
84
+ recommendedTier = "Tier 2 (Standard Task)";
85
+ rationale = "Prompt implies development work needing TDD validation or multi-file coordination.";
86
+ }
87
+
88
+ // Structural complexity signals (not just keywords)
89
+ // These help differentiate between simple and complex tasks within the same keyword tier
90
+ const sentenceCount = userPrompt.split(/[.!?。īŧīŧŸ]+/).filter(s => s.trim()).length;
91
+ const hasMultipleTasks = /\b(and|also|then|additionally|plus|而且|還有|į„ļ垌|åĻ外|äģĨ及)\b/i.test(userPrompt);
92
+ const mentionsSpecificFile = /\b(file|script|module|class|function|component)\b.*\.\w+/i.test(userPrompt);
93
+ const hasQuestionMarks = /\?|īŧŸ/.test(userPrompt);
94
+ const hasMultipleSentences = sentenceCount > 2;
95
+
96
+ // Adjust tier based on structural signals
97
+ if (!hasMacroSignal && !isTrivialDocsEdit && hasMultipleTasks && hasMultipleSentences) {
98
+ // Multiple tasks with multiple sentences suggests complexity
99
+ if (recommendedTier.startsWith("Tier 1")) {
100
+ recommendedTier = "Tier 2 (Standard Task)";
101
+ rationale = "Multiple tasks detected with structural complexity - upgraded to Tier 2 for TDD validation.";
102
+ } else if (recommendedTier.startsWith("Tier 2")) {
103
+ // Keep at Tier 2 but note the complexity
104
+ rationale += " Multiple task structure detected.";
105
+ }
106
+ } else if (!hasMacroSignal && mentionsSpecificFile && !hasMultipleTasks) {
107
+ // Single file mention with no multiple tasks suggests simpler work
108
+ if (recommendedTier.startsWith("Tier 3")) {
109
+ recommendedTier = "Tier 2 (Standard Task)";
110
+ rationale = "Single file focus detected - downgraded from Tier 3 to Tier 2.";
111
+ }
112
+ } else if (!hasMacroSignal && hasQuestionMarks && !hasMultipleTasks) {
113
+ // Questions without multiple tasks are often advisory, not execution
114
+ if (recommendedTier.startsWith("Tier 3")) {
115
+ recommendedTier = "Tier 2 (Standard Task)";
116
+ rationale = "Question format detected - likely advisory rather than macro execution.";
117
+ }
118
+ }
119
+
120
+ console.log(`\n=> RECOMMENDED TIER: ${recommendedTier}`);
121
+ console.log(`=> RATIONALE: ${rationale}`);
122
+
123
+ // Base execution loop: Tier 2/3 must run on the todo-driven-workflow
124
+ // checklist (Tier 1 is exempt to avoid checklist bloat on trivial edits).
125
+ if (!recommendedTier.startsWith("Tier 1")) {
126
+ console.log(`\n=> BASE EXECUTION LOOP: Load 'todo-driven-workflow' and initialize its checklist (3-7 verifiable sub-tasks) BEFORE editing any file.`);
127
+ console.log(` Track exactly ONE item in-progress at a time; verify with real evidence before marking completed.`);
128
+ }
129
+
130
+ const requestedFableModel = detectFableModel(promptLower);
131
+ if (requestedFableModel) {
132
+ console.log(`\n=> REQUESTED FABLE MODEL MODE: ${requestedFableModel}`);
133
+ console.log(`=> ROUTE: fable-mode/fable-${requestedFableModel}/SKILL.md`);
134
+ console.log(` Resolve availability and record fallback status with fable-mode/scripts/model-selector.js.`);
135
+ }
136
+
137
+ // Analyze and output relevant Knowledge Guides / Templates based on user prompt keywords.
138
+ // Each group comes from routing-keywords.json - matches via plain-substring
139
+ // 'keywords' OR a 'regex' source string (tested case-insensitively).
140
+ const recommendedGuides = [];
141
+
142
+ for (const group of routingConfig.guideGroups) {
143
+ let matched = false;
144
+ if (typeof group.regex === "string") {
145
+ matched = new RegExp(group.regex, "i").test(promptLower);
146
+ } else if (Array.isArray(group.keywords)) {
147
+ matched = group.keywords.some(k => promptLower.includes(k));
148
+ }
149
+ if (matched && Array.isArray(group.guides)) {
150
+ recommendedGuides.push(...group.guides);
151
+ }
152
+ }
153
+
154
+ if (recommendedGuides.length > 0) {
155
+ console.log(`\n=> RECOMMENDED KNOWLEDGE GUIDES (Auto-loaded based on keywords):`);
156
+ recommendedGuides.forEach(guide => {
157
+ const match = guide.match(/^- ([^\s]+)/);
158
+ if (match) {
159
+ const guidePath = require('path').join(__dirname, '..', '..', match[1]);
160
+ if (!require('fs').existsSync(guidePath)) {
161
+ console.log(`${guide} [NOT INSTALLED - Ignore this recommendation]`);
162
+ return;
163
+ }
164
+ }
165
+ console.log(guide);
166
+ });
167
+ }
168
+
169
+ // ---------------------------------------------------------
170
+ // SELF-EVOLVED DYNAMIC SKILLS AUTO-DISCOVERY & PRECISE MATCHING
171
+ //
172
+ // Deliberately generated[] only, not find-skills' downloaded skills:
173
+ // generated[] is safe to cache-and-match here because Harness owns its
174
+ // whole lifecycle (self-evolve authors it, skill-creator quality-gates it,
175
+ // status is tracked draft/active/deprecated). A skill fetched via
176
+ // `npx skills add` has none of that - caching its triggers/description at
177
+ // download time would silently go stale the moment the upstream skill (or
178
+ // a later `npx skills update`/`remove`) changes it. find-skills queries
179
+ // `npx skills list` live instead of being folded into this cache.
180
+ // ---------------------------------------------------------
181
+ try {
182
+ const fs = require('fs');
183
+ const path = require('path');
184
+ const userHome = process.env.HOME || process.env.USERPROFILE || '';
185
+
186
+ // Skill installs land at varying depth per platform/scope (e.g.
187
+ // <root>/.claude/skills/harness-everything/scripts/, <root>/.cursor/skills/...,
188
+ // ~/.claude/skills/...), so a fixed __dirname offset can't reach the real
189
+ // workspace root. Walk up from the invoking cwd to the nearest .git instead
190
+ // - the same approach register-dynamic-skill.js already uses.
191
+ function getWorkspaceRoot() {
192
+ let dir = path.resolve(process.cwd());
193
+ while (dir !== path.parse(dir).root) {
194
+ if (fs.existsSync(path.join(dir, '.git'))) return dir;
195
+ dir = path.dirname(dir);
196
+ }
197
+ return process.cwd();
198
+ }
199
+ const workspaceRoot = getWorkspaceRoot();
200
+
201
+ const manifestPaths = [
202
+ path.join(workspaceRoot, '.claude', 'harness-everything', 'manifest.json'),
203
+ path.join(workspaceRoot, '.cursor', 'harness-everything', 'manifest.json'),
204
+ path.join(workspaceRoot, '.github', 'harness-everything', 'manifest.json'),
205
+ path.join(workspaceRoot, '.codex', 'harness-everything', 'manifest.json'),
206
+ path.join(workspaceRoot, '.continue', 'harness-everything', 'manifest.json'),
207
+ path.join(userHome, '.agents', 'harness-everything', 'manifest.json'),
208
+ path.join(userHome, '.claude', 'harness-everything', 'manifest.json')
209
+ ];
210
+
211
+ const generatedSkills = new Map();
212
+ for (const mPath of manifestPaths) {
213
+ if (fs.existsSync(mPath)) {
214
+ try {
215
+ const manifestData = JSON.parse(fs.readFileSync(mPath, 'utf8'));
216
+ if (Array.isArray(manifestData.generated)) {
217
+ for (const s of manifestData.generated) {
218
+ generatedSkills.set(s.id, s);
219
+ }
220
+ }
221
+ } catch (err) {
222
+ // ignore malformed manifests
223
+ }
224
+ }
225
+ }
226
+
227
+ const allDynamicSkills = Array.from(generatedSkills.values());
228
+ const matchedDynamicSkills = [];
229
+
230
+ for (const skill of allDynamicSkills) {
231
+ let score = 0;
232
+ const triggers = skill.triggers || [];
233
+
234
+ for (const rawTrigger of triggers) {
235
+ const trigger = rawTrigger.toLowerCase().trim();
236
+ if (!trigger || trigger.length < 2) continue;
237
+
238
+ // Ignore generic words to prevent false positives
239
+ if (['the', 'and', 'for', 'with', 'your', 'this', 'that', 'some', 'from', 'prevent', 'resolved'].includes(trigger)) continue;
240
+
241
+ const isChinese = /[\u4e00-\u9fa5]/.test(trigger);
242
+ if (isChinese) {
243
+ if (promptLower.includes(trigger)) {
244
+ score += trigger.length * 2;
245
+ }
246
+ } else {
247
+ // English word-boundary matching to prevent substrings inside larger words
248
+ const escapedTrigger = trigger.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
249
+ const regex = new RegExp(`\\b${escapedTrigger}\\b`, 'i');
250
+ if (regex.test(promptLower)) {
251
+ score += trigger.length >= 4 ? 3 : 1.5;
252
+ }
253
+ }
254
+ }
255
+
256
+ if (score >= 3) {
257
+ matchedDynamicSkills.push({ skill, score });
258
+ }
259
+ }
260
+
261
+ if (matchedDynamicSkills.length > 0) {
262
+ matchedDynamicSkills.sort((a, b) => b.score - a.score);
263
+ console.log(`\n=> đŸŽ¯ HIGH-RELEVANCE SELF-EVOLVED SKILL(S) DETECTED:`);
264
+ matchedDynamicSkills.forEach(({ skill }) => {
265
+ // Compute path relative to workspace or keep absolute
266
+ let displayPath = skill.dirPath;
267
+ if (displayPath.startsWith(workspaceRoot)) {
268
+ displayPath = path.relative(workspaceRoot, displayPath);
269
+ }
270
+ console.log(`- ${displayPath}/SKILL.md (${skill.description} [DYNAMIC SKILL])`);
271
+ });
272
+ } else if (recommendedGuides.length === 0 && allDynamicSkills.length > 0) {
273
+ // Prompt has no match in standard skills, and no direct match in dynamic skills,
274
+ // but there are indeed dynamic skills in manifest.json. Suggest the LLM to inspect them!
275
+ console.log(`\n=> â„šī¸ UNMATCHED PROMPT HINT:`);
276
+ console.log(`No standard or dynamic skills matched your prompt directly.`);
277
+ console.log(`However, you have ${allDynamicSkills.length} self-evolved dynamic skill(s) registered in your manifest.json.`);
278
+ console.log(`To ensure you don't miss past lessons, you should inspect the "generated" section of your manifest.json or check .claude/harness-everything/skills/generated/ to see if any apply to your current task.`);
279
+ console.log(`If genuinely nothing covers this - including nothing already fetched via find-skills - load find-skills/SKILL.md: it checks "npx skills list" for anything already installed, then searches skills.sh/npx skills if not, and always requires explicit approval before installing anything.`);
280
+ }
281
+ } catch (err) {
282
+ // Fail silently in router to prevent breaking the core execution loop
283
+ }
284
+
285
+ // Fact-audit nudge: broad, cheap keyword net for claims that risk being
286
+ // asserted from stale/wrong training memory instead of verified. False
287
+ // positives cost nothing here (it's a reminder, not a block) so recall
288
+ // matters more than precision.
289
+ const externalClaimTriggers = routingConfig.factAudit.externalClaim || [];
290
+ const estimateTriggers = routingConfig.factAudit.estimate || [];
291
+ const hitExternalClaim = externalClaimTriggers.some(kw => promptLower.includes(kw));
292
+ const hitEstimate = estimateTriggers.some(kw => promptLower.includes(kw));
293
+
294
+ if (hitExternalClaim || hitEstimate) {
295
+ console.log(`\n=> FACT-AUDIT REMINDER:`);
296
+ if (hitExternalClaim) {
297
+ console.log(`This looks like it may require a claim about an external framework/library/API/tool's current behavior.`);
298
+ console.log(`Verify via WebFetch/WebSearch against the authoritative source before asserting it - do not answer from training memory alone; it can be stale or confidently wrong (e.g. exit-code semantics, schema fields, defaults, pricing).`);
299
+ }
300
+ if (hitEstimate) {
301
+ console.log(`This looks like it may call for a performance/cost/timing number.`);
302
+ console.log(`Prefer an actual measurement over a reasoned estimate when the stakes justify it - an unmeasured number (including one you generate yourself) is a hypothesis, not a fact.`);
303
+ }
304
+ }
305
+
306
+ // Constraint strength must match judgment reliability: this routing is a
307
+ // keyword heuristic, so it is a default, not an order.
308
+ console.log(`\nTreat the tier above as the default route. If your own read of the task clearly disagrees, follow your read and say why in one line. An explicit instruction from the Human Partner always wins.`);
309
+ }
310
+
311
+ let userPrompt = process.argv[2] || '';
312
+
313
+ if (process.argv[2]) {
314
+ // If a command-line argument is passed, use it and execute immediately.
315
+ run(userPrompt);
316
+ } else if (process.stdin.isTTY) {
317
+ // Running interactively in a terminal without piped input, execute immediately.
318
+ run('');
319
+ } else {
320
+ // Piped input or non-TTY, read from standard input.
321
+ let inputData = '';
322
+ process.stdin.on('data', chunk => { inputData += chunk; });
323
+ process.stdin.on('end', () => {
324
+ try {
325
+ if (inputData.trim()) {
326
+ const payload = JSON.parse(inputData);
327
+ if (typeof payload.prompt === 'string') userPrompt = payload.prompt;
328
+ }
329
+ } catch (err) {
330
+ // Not valid JSON on stdin - fall back to argv (useful for direct/manual testing).
331
+ }
332
+ run(userPrompt);
333
+ });
334
+ }