@hivehub/rulebook 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/.claude/commands/analysis.md +35 -35
  2. package/.claude/commands/continue.md +33 -33
  3. package/.claude/commands/rulebook-decision-create.md +55 -55
  4. package/.claude/commands/rulebook-decision-list.md +15 -15
  5. package/.claude/commands/rulebook-knowledge-add.md +41 -41
  6. package/.claude/commands/rulebook-knowledge-list.md +15 -15
  7. package/.claude/commands/rulebook-memory-save.md +48 -48
  8. package/.claude/commands/rulebook-memory-search.md +47 -47
  9. package/.claude/commands/rulebook-task-apply.md +67 -67
  10. package/.claude/commands/rulebook-task-archive.md +94 -94
  11. package/.claude/commands/rulebook-task-create.md +93 -93
  12. package/.claude/commands/rulebook-task-list.md +42 -42
  13. package/.claude/commands/rulebook-task-show.md +52 -52
  14. package/.claude/commands/rulebook-task-validate.md +53 -53
  15. package/.claude-plugin/marketplace.json +28 -28
  16. package/.claude-plugin/plugin.json +8 -8
  17. package/README.md +86 -0
  18. package/dist/cli/commands/claude.d.ts +17 -0
  19. package/dist/cli/commands/claude.d.ts.map +1 -0
  20. package/dist/cli/commands/claude.js +56 -0
  21. package/dist/cli/commands/claude.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts.map +1 -1
  23. package/dist/cli/commands/init.js +18 -2
  24. package/dist/cli/commands/init.js.map +1 -1
  25. package/dist/cli/commands/update.d.ts.map +1 -1
  26. package/dist/cli/commands/update.js +6 -1
  27. package/dist/cli/commands/update.js.map +1 -1
  28. package/dist/cli/prompts.d.ts +13 -0
  29. package/dist/cli/prompts.d.ts.map +1 -1
  30. package/dist/cli/prompts.js +106 -0
  31. package/dist/cli/prompts.js.map +1 -1
  32. package/dist/core/claude/claude-mcp.d.ts +9 -0
  33. package/dist/core/claude/claude-mcp.d.ts.map +1 -1
  34. package/dist/core/claude/claude-mcp.js +30 -0
  35. package/dist/core/claude/claude-mcp.js.map +1 -1
  36. package/dist/core/claude/claude-settings-manager.d.ts +12 -0
  37. package/dist/core/claude/claude-settings-manager.d.ts.map +1 -1
  38. package/dist/core/claude/claude-settings-manager.js +59 -3
  39. package/dist/core/claude/claude-settings-manager.js.map +1 -1
  40. package/dist/core/detect/detector.d.ts +8 -1
  41. package/dist/core/detect/detector.d.ts.map +1 -1
  42. package/dist/core/detect/detector.js +225 -0
  43. package/dist/core/detect/detector.js.map +1 -1
  44. package/dist/core/detect/library-registry.d.ts +40 -0
  45. package/dist/core/detect/library-registry.d.ts.map +1 -0
  46. package/dist/core/detect/library-registry.js +239 -0
  47. package/dist/core/detect/library-registry.js.map +1 -0
  48. package/dist/core/generators/generator.d.ts +1 -0
  49. package/dist/core/generators/generator.d.ts.map +1 -1
  50. package/dist/core/generators/generator.js +37 -0
  51. package/dist/core/generators/generator.js.map +1 -1
  52. package/dist/core/generators/rules-generator.d.ts +1 -5
  53. package/dist/core/generators/rules-generator.d.ts.map +1 -1
  54. package/dist/core/generators/rules-generator.js +40 -1
  55. package/dist/core/generators/rules-generator.js.map +1 -1
  56. package/dist/index.js +12 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/mcp/rulebook-server.js +0 -0
  59. package/dist/types.d.ts +13 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/package.json +23 -22
  62. package/templates/agents/accessibility-reviewer.md +43 -43
  63. package/templates/agents/api-designer.md +42 -42
  64. package/templates/agents/architect.md +51 -51
  65. package/templates/agents/build-engineer.md +36 -36
  66. package/templates/agents/code-reviewer.md +47 -47
  67. package/templates/agents/compiler/codegen-debugger.md +34 -34
  68. package/templates/agents/compiler/stdlib-engineer.md +28 -28
  69. package/templates/agents/compiler/test-coverage-guardian.md +31 -31
  70. package/templates/agents/database-architect.md +41 -41
  71. package/templates/agents/devops-engineer.md +42 -42
  72. package/templates/agents/docs-writer.md +38 -38
  73. package/templates/agents/game-engine/cpp-core-expert.md +35 -35
  74. package/templates/agents/game-engine/render-engineer.md +22 -22
  75. package/templates/agents/game-engine/shader-engineer.md +38 -38
  76. package/templates/agents/game-engine/systems-integration.md +43 -43
  77. package/templates/agents/generic/code-reviewer.md +41 -41
  78. package/templates/agents/generic/docs-writer.md +25 -25
  79. package/templates/agents/generic/project-manager.md +36 -36
  80. package/templates/agents/generic/researcher.md +34 -34
  81. package/templates/agents/generic/test-engineer.md +41 -41
  82. package/templates/agents/i18n-engineer.md +42 -42
  83. package/templates/agents/implementer.md +42 -42
  84. package/templates/agents/migration-engineer.md +42 -42
  85. package/templates/agents/mobile/platform-specialist.md +22 -22
  86. package/templates/agents/mobile/ui-engineer.md +22 -22
  87. package/templates/agents/performance-engineer.md +49 -49
  88. package/templates/agents/project-manager.md +215 -0
  89. package/templates/agents/quality-gatekeeper.md +205 -0
  90. package/templates/agents/refactoring-agent.md +41 -41
  91. package/templates/agents/researcher.md +38 -38
  92. package/templates/agents/security-reviewer.md +40 -40
  93. package/templates/agents/team-lead.md +37 -37
  94. package/templates/agents/tester.md +48 -48
  95. package/templates/agents/ux-reviewer.md +43 -43
  96. package/templates/agents/web-app/api-designer.md +22 -22
  97. package/templates/agents/web-app/backend-engineer.md +30 -30
  98. package/templates/agents/web-app/database-engineer.md +22 -22
  99. package/templates/agents/web-app/frontend-engineer.md +29 -29
  100. package/templates/agents/web-app/security-reviewer.md +32 -32
  101. package/templates/ci/rulebook-review.yml +26 -26
  102. package/templates/claude-workflows/bugfix.js +94 -0
  103. package/templates/claude-workflows/feature-pipeline.js +88 -0
  104. package/templates/claude-workflows/release-gate.js +64 -0
  105. package/templates/claude-workflows/review-fanout.js +118 -0
  106. package/templates/claude-workflows/rulebook-driver.js +343 -0
  107. package/templates/claude-workflows/spec-author.js +133 -0
  108. package/templates/cli/AIDER.md +49 -49
  109. package/templates/cli/AMAZON_Q.md +25 -25
  110. package/templates/cli/AUGGIE.md +32 -32
  111. package/templates/cli/CLAUDE.md +117 -117
  112. package/templates/cli/CLINE.md +99 -99
  113. package/templates/cli/CODEBUDDY.md +20 -20
  114. package/templates/cli/CODEIUM.md +20 -20
  115. package/templates/cli/CODEX.md +21 -21
  116. package/templates/cli/CONTINUE.md +34 -34
  117. package/templates/cli/CURSOR_CLI.md +62 -62
  118. package/templates/cli/FACTORY.md +18 -18
  119. package/templates/cli/GEMINI.md +35 -35
  120. package/templates/cli/KILOCODE.md +18 -18
  121. package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
  122. package/templates/commands/rulebook-decision-create.md +55 -55
  123. package/templates/commands/rulebook-decision-list.md +15 -15
  124. package/templates/commands/rulebook-knowledge-add.md +41 -41
  125. package/templates/commands/rulebook-knowledge-list.md +15 -15
  126. package/templates/commands/rulebook-memory-save.md +48 -48
  127. package/templates/commands/rulebook-memory-search.md +47 -47
  128. package/templates/commands/rulebook-task-apply.md +67 -67
  129. package/templates/commands/rulebook-task-archive.md +94 -94
  130. package/templates/commands/rulebook-task-create.md +93 -93
  131. package/templates/commands/rulebook-task-list.md +42 -42
  132. package/templates/commands/rulebook-task-show.md +52 -52
  133. package/templates/commands/rulebook-task-validate.md +53 -53
  134. package/templates/compact-context/_default.md +23 -23
  135. package/templates/compact-context/cpp.md +26 -26
  136. package/templates/compact-context/go.md +26 -26
  137. package/templates/compact-context/python.md +26 -26
  138. package/templates/compact-context/rust.md +28 -28
  139. package/templates/compact-context/typescript.md +29 -29
  140. package/templates/core/AGENTS_OVERRIDE.md +16 -16
  141. package/templates/core/AGENT_AUTOMATION.md +296 -296
  142. package/templates/core/CLAUDE_MD_v2.md +90 -90
  143. package/templates/core/DAG.md +304 -304
  144. package/templates/core/DECISIONS.md +38 -38
  145. package/templates/core/DOCUMENTATION_RULES.md +36 -36
  146. package/templates/core/KNOWLEDGE.md +49 -49
  147. package/templates/core/MULTI_AGENT.md +74 -74
  148. package/templates/core/PLANS.md +28 -28
  149. package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
  150. package/templates/core/RULEBOOK.md +1947 -1947
  151. package/templates/core/TIER1_PROHIBITIONS.md +154 -154
  152. package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
  153. package/templates/git/CI_CD_PATTERNS.md +661 -661
  154. package/templates/git/GITHUB_ACTIONS.md +728 -728
  155. package/templates/git/GITLAB_CI.md +730 -730
  156. package/templates/git/GIT_WORKFLOW.md +1192 -1192
  157. package/templates/git/SECRETS_MANAGEMENT.md +585 -585
  158. package/templates/hooks/COMMIT_MSG.md +530 -530
  159. package/templates/hooks/POST_CHECKOUT.md +546 -546
  160. package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
  161. package/templates/hooks/PRE_COMMIT.md +414 -414
  162. package/templates/hooks/PRE_PUSH.md +601 -601
  163. package/templates/hooks/check-context-and-handoff.sh +16 -6
  164. package/templates/hooks/update-check.ps1 +84 -0
  165. package/templates/hooks/update-check.sh +103 -0
  166. package/templates/ides/CONTINUE_RULES.md +16 -16
  167. package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
  168. package/templates/ides/GEMINI_RULES.md +17 -17
  169. package/templates/ides/WINDSURF_RULES.md +14 -14
  170. package/templates/languages/C.md +333 -333
  171. package/templates/languages/CPP.md +743 -743
  172. package/templates/languages/CSHARP.md +417 -417
  173. package/templates/languages/ELIXIR.md +454 -454
  174. package/templates/languages/ERLANG.md +361 -361
  175. package/templates/languages/GO.md +645 -645
  176. package/templates/languages/HASKELL.md +177 -177
  177. package/templates/languages/JAVA.md +607 -607
  178. package/templates/languages/JAVASCRIPT.md +631 -631
  179. package/templates/languages/JULIA.md +97 -97
  180. package/templates/languages/KOTLIN.md +511 -511
  181. package/templates/languages/LISP.md +100 -100
  182. package/templates/languages/LUA.md +74 -74
  183. package/templates/languages/OBJECTIVEC.md +90 -90
  184. package/templates/languages/PHP.md +416 -416
  185. package/templates/languages/PYTHON.md +682 -682
  186. package/templates/languages/RUBY.md +421 -421
  187. package/templates/languages/RUST.md +477 -477
  188. package/templates/languages/SAS.md +73 -73
  189. package/templates/languages/SCALA.md +348 -348
  190. package/templates/languages/SOLIDITY.md +580 -580
  191. package/templates/languages/SQL.md +137 -137
  192. package/templates/languages/SWIFT.md +466 -466
  193. package/templates/languages/TYPESCRIPT.md +591 -591
  194. package/templates/languages/ZIG.md +265 -265
  195. package/templates/libraries/go/ECHO.md +18 -0
  196. package/templates/libraries/go/GIN.md +18 -0
  197. package/templates/libraries/go/GORM.md +18 -0
  198. package/templates/libraries/python/DJANGO.md +18 -0
  199. package/templates/libraries/python/FASTAPI.md +18 -0
  200. package/templates/libraries/python/FLASK.md +17 -0
  201. package/templates/libraries/python/PYDANTIC.md +17 -0
  202. package/templates/libraries/python/PYTEST.md +17 -0
  203. package/templates/libraries/python/SQLALCHEMY.md +17 -0
  204. package/templates/libraries/rust/ACTIX.md +17 -0
  205. package/templates/libraries/rust/AXUM.md +18 -0
  206. package/templates/libraries/rust/SERDE.md +16 -0
  207. package/templates/libraries/rust/SQLX.md +17 -0
  208. package/templates/libraries/rust/TOKIO.md +16 -0
  209. package/templates/libraries/typescript/ANGULAR.md +17 -0
  210. package/templates/libraries/typescript/DRIZZLE.md +16 -0
  211. package/templates/libraries/typescript/EXPRESS.md +17 -0
  212. package/templates/libraries/typescript/HEROUI.md +16 -0
  213. package/templates/libraries/typescript/JEST.md +17 -0
  214. package/templates/libraries/typescript/NESTJS.md +17 -0
  215. package/templates/libraries/typescript/NEXT.md +18 -0
  216. package/templates/libraries/typescript/PRISMA.md +16 -0
  217. package/templates/libraries/typescript/RADIX.md +16 -0
  218. package/templates/libraries/typescript/REACT.md +18 -0
  219. package/templates/libraries/typescript/SHADCN.md +16 -0
  220. package/templates/libraries/typescript/SVELTE.md +16 -0
  221. package/templates/libraries/typescript/TAILWIND.md +16 -0
  222. package/templates/libraries/typescript/TRPC.md +16 -0
  223. package/templates/libraries/typescript/VITEST.md +17 -0
  224. package/templates/libraries/typescript/VUE.md +17 -0
  225. package/templates/libraries/typescript/ZOD.md +17 -0
  226. package/templates/modules/ATLASSIAN.md +255 -255
  227. package/templates/modules/CONTEXT7.md +54 -54
  228. package/templates/modules/FIGMA.md +267 -267
  229. package/templates/modules/GITHUB_MCP.md +64 -64
  230. package/templates/modules/GRAFANA.md +328 -328
  231. package/templates/modules/MEMORY.md +126 -126
  232. package/templates/modules/NOTION.md +247 -247
  233. package/templates/modules/PLAYWRIGHT.md +90 -90
  234. package/templates/modules/RULEBOOK_MCP.md +208 -208
  235. package/templates/modules/SERENA.md +337 -337
  236. package/templates/modules/SUPABASE.md +223 -223
  237. package/templates/modules/SYNAP.md +69 -69
  238. package/templates/modules/VECTORIZER.md +63 -63
  239. package/templates/modules/sequential-thinking.md +42 -42
  240. package/templates/rules/consult-analysis-before-implementing.md +23 -23
  241. package/templates/rules/cpp.md +46 -46
  242. package/templates/rules/csharp.md +44 -44
  243. package/templates/rules/diagnostic-first.md +39 -39
  244. package/templates/rules/fail-twice-escalate.md +46 -46
  245. package/templates/rules/follow-task-sequence.md +36 -36
  246. package/templates/rules/git-safety.md +29 -29
  247. package/templates/rules/go.md +40 -40
  248. package/templates/rules/incremental-implementation.md +56 -56
  249. package/templates/rules/incremental-tests.md +29 -29
  250. package/templates/rules/java.md +43 -43
  251. package/templates/rules/javascript.md +39 -39
  252. package/templates/rules/knowledge-base-usage.md +41 -41
  253. package/templates/rules/multi-agent-teams.md +75 -75
  254. package/templates/rules/no-deferred.md +31 -31
  255. package/templates/rules/no-shortcuts.md +30 -30
  256. package/templates/rules/python.md +43 -43
  257. package/templates/rules/research-first.md +30 -30
  258. package/templates/rules/respect-handoff-trigger.md +41 -41
  259. package/templates/rules/rust.md +40 -40
  260. package/templates/rules/sequential-editing.md +21 -21
  261. package/templates/rules/session-workflow.md +24 -24
  262. package/templates/rules/task-decomposition.md +32 -32
  263. package/templates/rules/typescript.md +40 -40
  264. package/templates/skills/cli/aider/SKILL.md +59 -59
  265. package/templates/skills/cli/amazon-q/SKILL.md +35 -35
  266. package/templates/skills/cli/auggie/SKILL.md +42 -42
  267. package/templates/skills/cli/claude/SKILL.md +42 -42
  268. package/templates/skills/cli/cline/SKILL.md +42 -42
  269. package/templates/skills/cli/codebuddy/SKILL.md +30 -30
  270. package/templates/skills/cli/codeium/SKILL.md +30 -30
  271. package/templates/skills/cli/codex/SKILL.md +31 -31
  272. package/templates/skills/cli/continue/SKILL.md +44 -44
  273. package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
  274. package/templates/skills/cli/factory/SKILL.md +28 -28
  275. package/templates/skills/cli/gemini/SKILL.md +45 -45
  276. package/templates/skills/cli/kilocode/SKILL.md +28 -28
  277. package/templates/skills/core/agent-automation/SKILL.md +194 -194
  278. package/templates/skills/core/dag/SKILL.md +314 -314
  279. package/templates/skills/core/documentation-rules/SKILL.md +46 -46
  280. package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
  281. package/templates/skills/core/rulebook/SKILL.md +176 -176
  282. package/templates/skills/core/rulebook-terse/SKILL.md +116 -116
  283. package/templates/skills/core/rulebook-terse-commit/SKILL.md +96 -96
  284. package/templates/skills/core/rulebook-terse-review/SKILL.md +112 -112
  285. package/templates/skills/dev/accessibility/SKILL.md +17 -17
  286. package/templates/skills/dev/analysis/SKILL.md +19 -19
  287. package/templates/skills/dev/api-design/SKILL.md +15 -15
  288. package/templates/skills/dev/architect/SKILL.md +17 -17
  289. package/templates/skills/dev/build-fix/SKILL.md +17 -17
  290. package/templates/skills/dev/db-design/SKILL.md +15 -15
  291. package/templates/skills/dev/debug/SKILL.md +16 -16
  292. package/templates/skills/dev/deploy/SKILL.md +17 -17
  293. package/templates/skills/dev/docs/SKILL.md +17 -17
  294. package/templates/skills/dev/handoff/SKILL.md +27 -27
  295. package/templates/skills/dev/migrate/SKILL.md +15 -15
  296. package/templates/skills/dev/perf/SKILL.md +17 -17
  297. package/templates/skills/dev/refactor/SKILL.md +17 -17
  298. package/templates/skills/dev/research/SKILL.md +14 -14
  299. package/templates/skills/dev/review/SKILL.md +18 -18
  300. package/templates/skills/dev/security-audit/SKILL.md +17 -17
  301. package/templates/skills/dev/spec/SKILL.md +65 -0
  302. package/templates/skills/ides/copilot/SKILL.md +47 -47
  303. package/templates/skills/ides/cursor/SKILL.md +53 -53
  304. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
  305. package/templates/skills/ides/replit/SKILL.md +46 -46
  306. package/templates/skills/ides/tabnine/SKILL.md +39 -39
  307. package/templates/skills/ides/vscode/SKILL.md +50 -50
  308. package/templates/skills/ides/windsurf/SKILL.md +46 -46
  309. package/templates/skills/ides/zed/SKILL.md +42 -42
  310. package/templates/skills/languages/c/SKILL.md +343 -343
  311. package/templates/skills/languages/cpp/SKILL.md +753 -753
  312. package/templates/skills/languages/csharp/SKILL.md +427 -427
  313. package/templates/skills/languages/elixir/SKILL.md +464 -464
  314. package/templates/skills/languages/erlang/SKILL.md +371 -371
  315. package/templates/skills/languages/go/SKILL.md +655 -655
  316. package/templates/skills/languages/haskell/SKILL.md +187 -187
  317. package/templates/skills/languages/java/SKILL.md +617 -617
  318. package/templates/skills/languages/javascript/SKILL.md +641 -641
  319. package/templates/skills/languages/julia/SKILL.md +107 -107
  320. package/templates/skills/languages/kotlin/SKILL.md +521 -521
  321. package/templates/skills/languages/lisp/SKILL.md +110 -110
  322. package/templates/skills/languages/lua/SKILL.md +84 -84
  323. package/templates/skills/languages/objectivec/SKILL.md +100 -100
  324. package/templates/skills/languages/php/SKILL.md +426 -426
  325. package/templates/skills/languages/python/SKILL.md +692 -692
  326. package/templates/skills/languages/ruby/SKILL.md +431 -431
  327. package/templates/skills/languages/rust/SKILL.md +487 -487
  328. package/templates/skills/languages/sas/SKILL.md +83 -83
  329. package/templates/skills/languages/scala/SKILL.md +358 -358
  330. package/templates/skills/languages/solidity/SKILL.md +590 -590
  331. package/templates/skills/languages/sql/SKILL.md +147 -147
  332. package/templates/skills/languages/swift/SKILL.md +476 -476
  333. package/templates/skills/languages/typescript/SKILL.md +302 -302
  334. package/templates/skills/languages/zig/SKILL.md +275 -275
  335. package/templates/skills/modules/atlassian/SKILL.md +265 -265
  336. package/templates/skills/modules/context7/SKILL.md +64 -64
  337. package/templates/skills/modules/figma/SKILL.md +277 -277
  338. package/templates/skills/modules/github-mcp/SKILL.md +74 -74
  339. package/templates/skills/modules/grafana/SKILL.md +338 -338
  340. package/templates/skills/modules/memory/SKILL.md +73 -73
  341. package/templates/skills/modules/notion/SKILL.md +257 -257
  342. package/templates/skills/modules/playwright/SKILL.md +100 -100
  343. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
  344. package/templates/skills/modules/serena/SKILL.md +347 -347
  345. package/templates/skills/modules/supabase/SKILL.md +233 -233
  346. package/templates/skills/modules/synap/SKILL.md +79 -79
  347. package/templates/skills/modules/vectorizer/SKILL.md +73 -73
  348. package/dist/agents/ralph-parser.d.ts +0 -91
  349. package/dist/agents/ralph-parser.d.ts.map +0 -1
  350. package/dist/agents/ralph-parser.js +0 -415
  351. package/dist/agents/ralph-parser.js.map +0 -1
  352. package/dist/cli/commands/analysis.d.ts +0 -8
  353. package/dist/cli/commands/analysis.d.ts.map +0 -1
  354. package/dist/cli/commands/analysis.js +0 -78
  355. package/dist/cli/commands/analysis.js.map +0 -1
  356. package/dist/cli/commands/compress.d.ts +0 -18
  357. package/dist/cli/commands/compress.d.ts.map +0 -1
  358. package/dist/cli/commands/compress.js +0 -100
  359. package/dist/cli/commands/compress.js.map +0 -1
  360. package/dist/cli/commands/ralph.d.ts +0 -45
  361. package/dist/cli/commands/ralph.d.ts.map +0 -1
  362. package/dist/cli/commands/ralph.js +0 -694
  363. package/dist/cli/commands/ralph.js.map +0 -1
  364. package/dist/cli/docs-prompts.d.ts +0 -3
  365. package/dist/cli/docs-prompts.d.ts.map +0 -1
  366. package/dist/cli/docs-prompts.js +0 -45
  367. package/dist/cli/docs-prompts.js.map +0 -1
  368. package/dist/core/agent-manager.d.ts +0 -69
  369. package/dist/core/agent-manager.d.ts.map +0 -1
  370. package/dist/core/agent-manager.js +0 -476
  371. package/dist/core/agent-manager.js.map +0 -1
  372. package/dist/core/agent-template-engine.d.ts +0 -51
  373. package/dist/core/agent-template-engine.d.ts.map +0 -1
  374. package/dist/core/agent-template-engine.js +0 -291
  375. package/dist/core/agent-template-engine.js.map +0 -1
  376. package/dist/core/analysis-manager.d.ts +0 -56
  377. package/dist/core/analysis-manager.d.ts.map +0 -1
  378. package/dist/core/analysis-manager.js +0 -218
  379. package/dist/core/analysis-manager.js.map +0 -1
  380. package/dist/core/auto-fixer.d.ts +0 -14
  381. package/dist/core/auto-fixer.d.ts.map +0 -1
  382. package/dist/core/auto-fixer.js +0 -207
  383. package/dist/core/auto-fixer.js.map +0 -1
  384. package/dist/core/changelog-generator.d.ts +0 -44
  385. package/dist/core/changelog-generator.d.ts.map +0 -1
  386. package/dist/core/changelog-generator.js +0 -222
  387. package/dist/core/changelog-generator.js.map +0 -1
  388. package/dist/core/claude-mcp.d.ts +0 -59
  389. package/dist/core/claude-mcp.d.ts.map +0 -1
  390. package/dist/core/claude-mcp.js +0 -220
  391. package/dist/core/claude-mcp.js.map +0 -1
  392. package/dist/core/claude-md-generator.d.ts +0 -52
  393. package/dist/core/claude-md-generator.d.ts.map +0 -1
  394. package/dist/core/claude-md-generator.js +0 -104
  395. package/dist/core/claude-md-generator.js.map +0 -1
  396. package/dist/core/claude-settings-manager.d.ts +0 -44
  397. package/dist/core/claude-settings-manager.d.ts.map +0 -1
  398. package/dist/core/claude-settings-manager.js +0 -191
  399. package/dist/core/claude-settings-manager.js.map +0 -1
  400. package/dist/core/cli-bridge.d.ts +0 -113
  401. package/dist/core/cli-bridge.d.ts.map +0 -1
  402. package/dist/core/cli-bridge.js +0 -1094
  403. package/dist/core/cli-bridge.js.map +0 -1
  404. package/dist/core/compact-context-manager.d.ts +0 -34
  405. package/dist/core/compact-context-manager.d.ts.map +0 -1
  406. package/dist/core/compact-context-manager.js +0 -60
  407. package/dist/core/compact-context-manager.js.map +0 -1
  408. package/dist/core/complexity-detector.d.ts +0 -36
  409. package/dist/core/complexity-detector.d.ts.map +0 -1
  410. package/dist/core/complexity-detector.js +0 -334
  411. package/dist/core/complexity-detector.js.map +0 -1
  412. package/dist/core/compress/compressor.d.ts +0 -60
  413. package/dist/core/compress/compressor.d.ts.map +0 -1
  414. package/dist/core/compress/compressor.js +0 -232
  415. package/dist/core/compress/compressor.js.map +0 -1
  416. package/dist/core/compress/discover.d.ts +0 -19
  417. package/dist/core/compress/discover.d.ts.map +0 -1
  418. package/dist/core/compress/discover.js +0 -100
  419. package/dist/core/compress/discover.js.map +0 -1
  420. package/dist/core/compress/validator.d.ts +0 -47
  421. package/dist/core/compress/validator.d.ts.map +0 -1
  422. package/dist/core/compress/validator.js +0 -131
  423. package/dist/core/compress/validator.js.map +0 -1
  424. package/dist/core/config-manager.d.ts +0 -86
  425. package/dist/core/config-manager.d.ts.map +0 -1
  426. package/dist/core/config-manager.js +0 -621
  427. package/dist/core/config-manager.js.map +0 -1
  428. package/dist/core/coverage-checker.d.ts +0 -14
  429. package/dist/core/coverage-checker.d.ts.map +0 -1
  430. package/dist/core/coverage-checker.js +0 -176
  431. package/dist/core/coverage-checker.js.map +0 -1
  432. package/dist/core/cursor-mdc-generator.d.ts +0 -30
  433. package/dist/core/cursor-mdc-generator.d.ts.map +0 -1
  434. package/dist/core/cursor-mdc-generator.js +0 -98
  435. package/dist/core/cursor-mdc-generator.js.map +0 -1
  436. package/dist/core/decision-manager.d.ts +0 -25
  437. package/dist/core/decision-manager.d.ts.map +0 -1
  438. package/dist/core/decision-manager.js +0 -183
  439. package/dist/core/decision-manager.js.map +0 -1
  440. package/dist/core/dependency-checker.d.ts +0 -21
  441. package/dist/core/dependency-checker.d.ts.map +0 -1
  442. package/dist/core/dependency-checker.js +0 -247
  443. package/dist/core/dependency-checker.js.map +0 -1
  444. package/dist/core/detector.d.ts +0 -27
  445. package/dist/core/detector.d.ts.map +0 -1
  446. package/dist/core/detector.js +0 -1763
  447. package/dist/core/detector.js.map +0 -1
  448. package/dist/core/docs-generator.d.ts +0 -9
  449. package/dist/core/docs-generator.d.ts.map +0 -1
  450. package/dist/core/docs-generator.js +0 -531
  451. package/dist/core/docs-generator.js.map +0 -1
  452. package/dist/core/doctor.d.ts +0 -19
  453. package/dist/core/doctor.d.ts.map +0 -1
  454. package/dist/core/doctor.js +0 -229
  455. package/dist/core/doctor.js.map +0 -1
  456. package/dist/core/generator.d.ts +0 -56
  457. package/dist/core/generator.d.ts.map +0 -1
  458. package/dist/core/generator.js +0 -1193
  459. package/dist/core/generator.js.map +0 -1
  460. package/dist/core/github-issues-importer.d.ts +0 -82
  461. package/dist/core/github-issues-importer.d.ts.map +0 -1
  462. package/dist/core/github-issues-importer.js +0 -161
  463. package/dist/core/github-issues-importer.js.map +0 -1
  464. package/dist/core/gitignore-generator.d.ts +0 -13
  465. package/dist/core/gitignore-generator.d.ts.map +0 -1
  466. package/dist/core/gitignore-generator.js +0 -307
  467. package/dist/core/gitignore-generator.js.map +0 -1
  468. package/dist/core/health-scorer.d.ts +0 -61
  469. package/dist/core/health-scorer.d.ts.map +0 -1
  470. package/dist/core/health-scorer.js +0 -638
  471. package/dist/core/health-scorer.js.map +0 -1
  472. package/dist/core/iteration-tracker.d.ts +0 -85
  473. package/dist/core/iteration-tracker.d.ts.map +0 -1
  474. package/dist/core/iteration-tracker.js +0 -295
  475. package/dist/core/iteration-tracker.js.map +0 -1
  476. package/dist/core/knowledge-manager.d.ts +0 -24
  477. package/dist/core/knowledge-manager.d.ts.map +0 -1
  478. package/dist/core/knowledge-manager.js +0 -173
  479. package/dist/core/knowledge-manager.js.map +0 -1
  480. package/dist/core/learn-manager.d.ts +0 -29
  481. package/dist/core/learn-manager.d.ts.map +0 -1
  482. package/dist/core/learn-manager.js +0 -159
  483. package/dist/core/learn-manager.js.map +0 -1
  484. package/dist/core/mcp-reference-generator.d.ts +0 -13
  485. package/dist/core/mcp-reference-generator.d.ts.map +0 -1
  486. package/dist/core/mcp-reference-generator.js +0 -66
  487. package/dist/core/mcp-reference-generator.js.map +0 -1
  488. package/dist/core/minimal-scaffolder.d.ts +0 -8
  489. package/dist/core/minimal-scaffolder.d.ts.map +0 -1
  490. package/dist/core/minimal-scaffolder.js +0 -51
  491. package/dist/core/minimal-scaffolder.js.map +0 -1
  492. package/dist/core/modern-console.d.ts +0 -98
  493. package/dist/core/modern-console.d.ts.map +0 -1
  494. package/dist/core/modern-console.js +0 -556
  495. package/dist/core/modern-console.js.map +0 -1
  496. package/dist/core/multi-tool-generator.d.ts +0 -59
  497. package/dist/core/multi-tool-generator.d.ts.map +0 -1
  498. package/dist/core/multi-tool-generator.js +0 -157
  499. package/dist/core/multi-tool-generator.js.map +0 -1
  500. package/dist/core/override-manager.d.ts +0 -23
  501. package/dist/core/override-manager.d.ts.map +0 -1
  502. package/dist/core/override-manager.js +0 -82
  503. package/dist/core/override-manager.js.map +0 -1
  504. package/dist/core/plans-manager.d.ts +0 -46
  505. package/dist/core/plans-manager.d.ts.map +0 -1
  506. package/dist/core/plans-manager.js +0 -158
  507. package/dist/core/plans-manager.js.map +0 -1
  508. package/dist/core/prd-generator.d.ts +0 -48
  509. package/dist/core/prd-generator.d.ts.map +0 -1
  510. package/dist/core/prd-generator.js +0 -233
  511. package/dist/core/prd-generator.js.map +0 -1
  512. package/dist/core/ralph-manager.d.ts +0 -163
  513. package/dist/core/ralph-manager.d.ts.map +0 -1
  514. package/dist/core/ralph-manager.js +0 -555
  515. package/dist/core/ralph-manager.js.map +0 -1
  516. package/dist/core/ralph-parallel.d.ts +0 -55
  517. package/dist/core/ralph-parallel.d.ts.map +0 -1
  518. package/dist/core/ralph-parallel.js +0 -201
  519. package/dist/core/ralph-parallel.js.map +0 -1
  520. package/dist/core/ralph-plan-checkpoint.d.ts +0 -58
  521. package/dist/core/ralph-plan-checkpoint.d.ts.map +0 -1
  522. package/dist/core/ralph-plan-checkpoint.js +0 -154
  523. package/dist/core/ralph-plan-checkpoint.js.map +0 -1
  524. package/dist/core/ralph-scripts.d.ts +0 -12
  525. package/dist/core/ralph-scripts.d.ts.map +0 -1
  526. package/dist/core/ralph-scripts.js +0 -50
  527. package/dist/core/ralph-scripts.js.map +0 -1
  528. package/dist/core/review-manager.d.ts +0 -74
  529. package/dist/core/review-manager.d.ts.map +0 -1
  530. package/dist/core/review-manager.js +0 -371
  531. package/dist/core/review-manager.js.map +0 -1
  532. package/dist/core/rules-generator.d.ts +0 -73
  533. package/dist/core/rules-generator.d.ts.map +0 -1
  534. package/dist/core/rules-generator.js +0 -202
  535. package/dist/core/rules-generator.js.map +0 -1
  536. package/dist/core/skills-manager.d.ts +0 -126
  537. package/dist/core/skills-manager.d.ts.map +0 -1
  538. package/dist/core/skills-manager.js +0 -654
  539. package/dist/core/skills-manager.js.map +0 -1
  540. package/dist/core/state-writer.d.ts +0 -35
  541. package/dist/core/state-writer.d.ts.map +0 -1
  542. package/dist/core/state-writer.js +0 -81
  543. package/dist/core/state-writer.js.map +0 -1
  544. package/dist/core/task-manager.d.ts +0 -127
  545. package/dist/core/task-manager.d.ts.map +0 -1
  546. package/dist/core/task-manager.js +0 -607
  547. package/dist/core/task-manager.js.map +0 -1
  548. package/dist/core/telemetry.d.ts +0 -29
  549. package/dist/core/telemetry.d.ts.map +0 -1
  550. package/dist/core/telemetry.js +0 -57
  551. package/dist/core/telemetry.js.map +0 -1
  552. package/dist/core/validator.d.ts +0 -21
  553. package/dist/core/validator.d.ts.map +0 -1
  554. package/dist/core/validator.js +0 -177
  555. package/dist/core/validator.js.map +0 -1
  556. package/dist/core/version-bumper.d.ts +0 -19
  557. package/dist/core/version-bumper.d.ts.map +0 -1
  558. package/dist/core/version-bumper.js +0 -180
  559. package/dist/core/version-bumper.js.map +0 -1
  560. package/dist/core/watcher.d.ts +0 -9
  561. package/dist/core/watcher.d.ts.map +0 -1
  562. package/dist/core/watcher.js +0 -22
  563. package/dist/core/watcher.js.map +0 -1
  564. package/dist/core/workflow-generator.d.ts +0 -15
  565. package/dist/core/workflow-generator.d.ts.map +0 -1
  566. package/dist/core/workflow-generator.js +0 -391
  567. package/dist/core/workflow-generator.js.map +0 -1
  568. package/dist/hooks/terse-activate.d.ts +0 -59
  569. package/dist/hooks/terse-activate.d.ts.map +0 -1
  570. package/dist/hooks/terse-activate.js +0 -149
  571. package/dist/hooks/terse-activate.js.map +0 -1
  572. package/dist/hooks/terse-config.d.ts +0 -51
  573. package/dist/hooks/terse-config.d.ts.map +0 -1
  574. package/dist/hooks/terse-config.js +0 -130
  575. package/dist/hooks/terse-config.js.map +0 -1
  576. package/dist/hooks/terse-mode-tracker.d.ts +0 -78
  577. package/dist/hooks/terse-mode-tracker.d.ts.map +0 -1
  578. package/dist/hooks/terse-mode-tracker.js +0 -213
  579. package/dist/hooks/terse-mode-tracker.js.map +0 -1
  580. package/dist/memory/hnsw-index.d.ts +0 -68
  581. package/dist/memory/hnsw-index.d.ts.map +0 -1
  582. package/dist/memory/hnsw-index.js +0 -544
  583. package/dist/memory/hnsw-index.js.map +0 -1
  584. package/dist/memory/memory-cache.d.ts +0 -33
  585. package/dist/memory/memory-cache.d.ts.map +0 -1
  586. package/dist/memory/memory-cache.js +0 -85
  587. package/dist/memory/memory-cache.js.map +0 -1
  588. package/dist/memory/memory-search.d.ts +0 -42
  589. package/dist/memory/memory-search.d.ts.map +0 -1
  590. package/dist/memory/memory-search.js +0 -180
  591. package/dist/memory/memory-search.js.map +0 -1
  592. package/dist/memory/memory-store.d.ts +0 -84
  593. package/dist/memory/memory-store.d.ts.map +0 -1
  594. package/dist/memory/memory-store.js +0 -566
  595. package/dist/memory/memory-store.js.map +0 -1
  596. package/dist/memory/memory-vectorizer.d.ts +0 -29
  597. package/dist/memory/memory-vectorizer.d.ts.map +0 -1
  598. package/dist/memory/memory-vectorizer.js +0 -199
  599. package/dist/memory/memory-vectorizer.js.map +0 -1
@@ -0,0 +1,118 @@
1
+ export const meta = {
2
+ name: 'review-fanout',
3
+ description:
4
+ 'Adversarial multi-dimension review of the current git diff (correctness, security, performance, tests). Each finding is independently verified before it survives, then synthesized into a prioritized report.',
5
+ phases: [{ title: 'Review' }, { title: 'Verify' }, { title: 'Synthesize', model: 'opus' }],
6
+ }
7
+
8
+ const FINDINGS_SCHEMA = {
9
+ type: 'object',
10
+ additionalProperties: false,
11
+ required: ['findings'],
12
+ properties: {
13
+ findings: {
14
+ type: 'array',
15
+ items: {
16
+ type: 'object',
17
+ additionalProperties: false,
18
+ required: ['title', 'file', 'severity', 'detail'],
19
+ properties: {
20
+ title: { type: 'string' },
21
+ file: { type: 'string', description: 'path:line of the issue' },
22
+ severity: { type: 'string', enum: ['blocker', 'major', 'minor', 'nit'] },
23
+ detail: { type: 'string', description: 'what is wrong and why it matters' },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ }
29
+
30
+ const VERDICT_SCHEMA = {
31
+ type: 'object',
32
+ additionalProperties: false,
33
+ required: ['real', 'reason'],
34
+ properties: {
35
+ real: { type: 'boolean', description: 'true only if the finding is a genuine, reproducible problem' },
36
+ reason: { type: 'string' },
37
+ },
38
+ }
39
+
40
+ const DIMENSIONS = [
41
+ {
42
+ key: 'correctness',
43
+ agentType: 'code-reviewer',
44
+ model: 'sonnet',
45
+ focus: 'logic errors, broken edge cases, incorrect error handling, and regressions',
46
+ },
47
+ {
48
+ key: 'security',
49
+ agentType: 'security-reviewer',
50
+ model: 'haiku',
51
+ focus: 'injection, secret leakage, unsafe deserialization, missing authz/validation, vulnerable patterns',
52
+ },
53
+ {
54
+ key: 'performance',
55
+ agentType: 'performance-engineer',
56
+ model: 'sonnet',
57
+ focus: 'N+1 patterns, accidental quadratic work, unnecessary allocations, blocking I/O on hot paths',
58
+ },
59
+ {
60
+ key: 'tests',
61
+ agentType: 'tester',
62
+ model: 'sonnet',
63
+ focus: 'missing test coverage for changed behavior, weak assertions, and untested edge cases',
64
+ },
65
+ ]
66
+
67
+ // Optional path-scoping: when invoked with args.paths, review ONLY those files (the
68
+ // caller's changeset) instead of the whole uncommitted diff. Avoids re-reviewing
69
+ // unrelated accumulated changes when there are no commits between units of work.
70
+ const scopePaths = args && Array.isArray(args.paths) && args.paths.length ? args.paths : null
71
+ const diffCmd = scopePaths
72
+ ? `git --no-pager diff -- ${scopePaths.join(' ')} ; git --no-pager diff --staged -- ${scopePaths.join(' ')}`
73
+ : 'git --no-pager diff ; git --no-pager diff --staged'
74
+ const scopeNote = scopePaths
75
+ ? `Review ONLY these files (the caller's changeset): ${scopePaths.join(', ')}. Ignore changes in any other file.`
76
+ : 'Review the full current diff.'
77
+
78
+ // Pipeline: each dimension's findings verify as soon as that dimension finishes —
79
+ // no barrier, so the fast haiku security pass is not blocked by the slower lenses.
80
+ const results = await pipeline(
81
+ DIMENSIONS,
82
+ (d) =>
83
+ agent(
84
+ `Review the current git diff for ${d.key} issues. Focus on: ${d.focus}.
85
+ ${scopeNote}
86
+ Run \`${diffCmd}\` to see the changes. Report only issues introduced or exposed by this diff — not pre-existing debt.`,
87
+ { label: `review:${d.key}`, phase: 'Review', agentType: d.agentType, model: d.model, schema: FINDINGS_SCHEMA }
88
+ ),
89
+ (review, d) =>
90
+ parallel(
91
+ (review.findings || []).map((f) => () =>
92
+ agent(
93
+ `Adversarially verify this ${d.key} finding. Try to REFUTE it. Read the relevant code at ${f.file}. Default to real=false if you cannot concretely confirm the problem.
94
+ Finding: ${f.title}
95
+ Detail: ${f.detail}`,
96
+ { label: `verify:${d.key}`, phase: 'Verify', model: 'haiku', schema: VERDICT_SCHEMA }
97
+ ).then((v) => ({ ...f, dimension: d.key, verdict: v }))
98
+ )
99
+ )
100
+ )
101
+
102
+ const confirmed = results
103
+ .flat()
104
+ .filter(Boolean)
105
+ .filter((f) => f.verdict && f.verdict.real)
106
+
107
+ // blocking = verified findings severe enough to fail a gate (blocker/major).
108
+ // Consumers (e.g. rulebook-driver) feed these back to the implementer.
109
+ const blocking = confirmed.filter((f) => /^(blocker|major)$/i.test(f.severity || ''))
110
+
111
+ phase('Synthesize')
112
+ const report = await agent(
113
+ `Synthesize a prioritized code-review report from these confirmed findings (already verified as real). Group by severity, give each a one-line fix recommendation, and lead with blockers.
114
+ ${JSON.stringify(confirmed, null, 2)}`,
115
+ { label: 'synthesize', phase: 'Synthesize', model: 'opus' }
116
+ )
117
+
118
+ return { confirmedCount: confirmed.length, confirmed, blocking, report }
@@ -0,0 +1,343 @@
1
+ export const meta = {
2
+ name: 'rulebook-driver',
3
+ description:
4
+ 'Drain the rulebook backlog in a loop: discover the next unchecked task item, implement it, gate it through an independent SDD+TDD opus reviewer (max 3 rounds), document it, then move to the next item — until none remain, a item fails review, the item cap is hit, or the token budget runs low.',
5
+ phases: [
6
+ { title: 'Discover', detail: 'find first unchecked item (lowest phase)', model: 'haiku' },
7
+ { title: 'Implement', detail: 'dev implements; independent opus reviewer gates; loop ≤3', model: 'sonnet' },
8
+ { title: 'Review', detail: 'independent full SDD+TDD review', model: 'opus' },
9
+ { title: 'Fanout', detail: 'review-fanout adversarial diff review per approved item' },
10
+ { title: 'Document', detail: 'docs-writer updates README/CHANGELOG', model: 'haiku' },
11
+ { title: 'Gate', detail: 'release-gate go/no-go once the backlog is drained' },
12
+ ],
13
+ }
14
+
15
+ // ---- Tunables (override via args) ------------------------------------------
16
+ // args: { once?: boolean, maxItems?: number, minBudget?: number, fanoutRounds?: number }
17
+ // once — process a single item then stop (legacy one-shot behavior)
18
+ // maxItems — hard cap on items processed in one run (default 25 safety stop)
19
+ // minBudget — stop before the next item if remaining tokens fall below this
20
+ // fanoutRounds — max review-fanout remediation rounds per completed task (default 2)
21
+ const opts = args && typeof args === 'object' ? args : {}
22
+ const ONCE = opts.once === true
23
+ const MAX_ITEMS = typeof opts.maxItems === 'number' ? opts.maxItems : 25
24
+ const MIN_BUDGET = typeof opts.minBudget === 'number' ? opts.minBudget : 60_000
25
+ const MAX_REVIEW_ROUNDS = 3
26
+ // Per-completed-task adversarial gate. Counted SEPARATELY from MAX_REVIEW_ROUNDS so a
27
+ // fanout finding never competes with the per-item SDD/TDD round budget.
28
+ const MAX_FANOUT_ROUNDS = typeof opts.fanoutRounds === 'number' ? opts.fanoutRounds : 2
29
+
30
+ // ---- Structured-output schemas --------------------------------------------
31
+
32
+ const TASK_SCHEMA = {
33
+ type: 'object',
34
+ additionalProperties: false,
35
+ required: ['found', 'taskId', 'phase', 'item', 'specPaths', 'summary'],
36
+ properties: {
37
+ found: { type: 'boolean', description: 'true if an unchecked checklist item was found' },
38
+ taskId: { type: 'string', description: 'task directory id; empty string if none' },
39
+ phase: { type: 'string', description: 'phase the item belongs to; empty if none' },
40
+ item: { type: 'string', description: 'exact text of the first unchecked "- [ ]" item' },
41
+ specPaths: {
42
+ type: 'array',
43
+ items: { type: 'string' },
44
+ description: 'paths to proposal.md, tasks.md and specs/**/spec.md for this task',
45
+ },
46
+ summary: { type: 'string', description: 'one-line description of what the item asks for' },
47
+ },
48
+ }
49
+
50
+ const VERDICT_SCHEMA = {
51
+ type: 'object',
52
+ additionalProperties: false,
53
+ required: ['pass', 'sddCompliant', 'tddCompliant', 'issues', 'summary'],
54
+ properties: {
55
+ pass: {
56
+ type: 'boolean',
57
+ description: 'true ONLY if correct, well-implemented, and both SDD and TDD are satisfied',
58
+ },
59
+ sddCompliant: {
60
+ type: 'boolean',
61
+ description: 'implementation satisfies every SHALL/MUST scenario in the spec, nothing unspecified added',
62
+ },
63
+ tddCompliant: {
64
+ type: 'boolean',
65
+ description: 'tests exist for the new behavior, were written for it, and actually run and pass',
66
+ },
67
+ issues: {
68
+ type: 'array',
69
+ items: { type: 'string' },
70
+ description: 'concrete, actionable blocking problems; empty array when pass=true',
71
+ },
72
+ summary: { type: 'string', description: 'one-paragraph verdict rationale' },
73
+ },
74
+ }
75
+
76
+ const FILES_SCHEMA = {
77
+ type: 'object',
78
+ additionalProperties: false,
79
+ required: ['files'],
80
+ properties: {
81
+ files: {
82
+ type: 'array',
83
+ items: { type: 'string' },
84
+ description: 'union of changed file paths from `git diff --name-only` and `--staged`',
85
+ },
86
+ },
87
+ }
88
+
89
+ // ---- Per-item pipeline ----------------------------------------------------
90
+
91
+ async function driveItem(task, itemIndex) {
92
+ let verdict = null
93
+ let lastIssues = []
94
+ let passedRound = 0
95
+
96
+ for (let round = 1; round <= MAX_REVIEW_ROUNDS; round++) {
97
+ const devPrompt =
98
+ round === 1
99
+ ? `Implement this rulebook task item with strict SDD and TDD discipline.
100
+
101
+ Task: ${task.taskId} / ${task.phase}
102
+ Item: ${task.item}
103
+ Specs to satisfy (READ THESE FIRST): ${task.specPaths.join(', ')}
104
+
105
+ TDD: write the failing test(s) first, then the minimum implementation that makes them pass.
106
+ SDD: every behavior you add must trace to a SHALL/MUST scenario in the spec. Do NOT add unspecified features.
107
+ Before finishing: run the type-checker, then the relevant tests. Both must be green.
108
+ Report exactly which files you created/changed and which tests you added.`
109
+ : `An independent reviewer REJECTED your previous attempt (round ${round - 1}). Fix ONLY these blocking issues; do not touch anything else:
110
+
111
+ ${lastIssues.map((i, n) => `${n + 1}. ${i}`).join('\n')}
112
+
113
+ Re-run the type-checker and tests (both must pass). Report which files you changed and which tests you added or updated.`
114
+
115
+ const dev = await agent(devPrompt, {
116
+ label: `dev:item${itemIndex}:r${round}`,
117
+ phase: 'Implement',
118
+ agentType: 'typescript-implementer',
119
+ model: 'sonnet',
120
+ })
121
+
122
+ // Independent reviewer — fresh subagent, NO conversation context, opus for a
123
+ // thorough complete review. Sees only the git diff + the spec.
124
+ verdict = await agent(
125
+ `You are an INDEPENDENT senior reviewer with NO prior context. This is the FINAL quality gate — be exhaustive, judge ONLY from hard evidence, never trust the developer's claims without checking.
126
+
127
+ Steps:
128
+ 1. Run \`git --no-pager diff\` and \`git --no-pager diff --staged\` to see exactly what changed.
129
+ 2. Read the spec files: ${task.specPaths.join(', ')}
130
+ 3. Judge on two axes:
131
+ - SDD: does the diff satisfy EVERY SHALL/MUST scenario in the spec, with nothing unspecified bolted on?
132
+ - TDD: are there tests covering the new behavior, and do they actually run and PASS? Run the test suite for the touched area to confirm.
133
+ 4. Also verify correctness, edge cases, error paths, and that the type-checker passes.
134
+
135
+ The developer reported the following (verify it, do not take it at face value):
136
+ """
137
+ ${dev}
138
+ """
139
+
140
+ Set pass=true ONLY when SDD and TDD are both fully satisfied and the code is correct. Otherwise return concrete, actionable blocking issues the developer can fix.`,
141
+ {
142
+ label: `review:item${itemIndex}:r${round}`,
143
+ phase: 'Review',
144
+ agentType: 'code-reviewer',
145
+ model: 'opus',
146
+ schema: VERDICT_SCHEMA,
147
+ }
148
+ )
149
+
150
+ if (verdict && verdict.pass) {
151
+ passedRound = round
152
+ break
153
+ }
154
+ lastIssues = (verdict && verdict.issues) || ['Reviewer returned no verdict']
155
+ log(`Item ${itemIndex} round ${round} rejected: ${lastIssues.length} issue(s).`)
156
+ }
157
+
158
+ if (!verdict || !verdict.pass) {
159
+ return { passed: false, issues: lastIssues, verdict: verdict && verdict.summary }
160
+ }
161
+
162
+ const docs = await agent(
163
+ `A rulebook task item was just implemented and passed independent SDD+TDD review.
164
+
165
+ Task: ${task.taskId} / ${task.phase}
166
+ Item: ${task.item}
167
+ Specs: ${task.specPaths.join(', ')}
168
+
169
+ Update the application documentation to reflect what shipped:
170
+ 1. Run \`git --no-pager diff\` to see exactly what changed.
171
+ 2. Update CHANGELOG.md with a conventional-commit-style entry under the unreleased section.
172
+ 3. Update README.md only if public/user-facing behavior changed.
173
+ Keep all docs in English. Do not document behavior that is not present in the diff.
174
+ Report which documentation files you updated.`,
175
+ { label: `document:item${itemIndex}`, phase: 'Document', agentType: 'docs-writer', model: 'haiku' }
176
+ )
177
+
178
+ return { passed: true, passedRound, review: verdict.summary, docs }
179
+ }
180
+
181
+ // Snapshot the set of changed files (via git). Used to scope each task's review-fanout
182
+ // to only that task's changeset, since the driver does not commit between items/tasks.
183
+ async function gitChangedFiles() {
184
+ const r = await agent(
185
+ 'Run `git --no-pager diff --name-only` and `git --no-pager diff --name-only --staged`. Return the de-duplicated union of file paths, one per entry. Return an empty list if there are no changes.',
186
+ { label: 'git-files', phase: 'Discover', agentType: 'researcher', model: 'haiku', schema: FILES_SCHEMA }
187
+ )
188
+ return (r && Array.isArray(r.files) ? r.files : []).filter(Boolean)
189
+ }
190
+
191
+ // ---- Per-task adversarial gate (review-fanout) -----------------------------
192
+ // Runs ONCE per completed task, not per item. Scoped (via paths) to that task's
193
+ // changeset. Blocking (blocker/major) findings are remediated by a dev agent and
194
+ // re-reviewed, up to MAX_FANOUT_ROUNDS. Returns { passed, rounds, blocking } —
195
+ // passed=false means the task could not be cleaned.
196
+ async function reviewFanoutGate(taskId, specPaths, paths) {
197
+ const scope = paths && paths.length ? { paths } : undefined
198
+ const scopeLabel = scope ? ` (scoped to ${paths.length} file(s))` : ''
199
+ for (let fround = 1; fround <= MAX_FANOUT_ROUNDS; fround++) {
200
+ phase('Fanout')
201
+ log(`Task ${taskId}: review-fanout round ${fround}/${MAX_FANOUT_ROUNDS}${scopeLabel}…`)
202
+ const fanout = await workflow('review-fanout', scope)
203
+ const blocking = (fanout && fanout.blocking) || []
204
+
205
+ if (blocking.length === 0) {
206
+ log(`Task ${taskId}: review-fanout clean (round ${fround}).`)
207
+ return { passed: true, rounds: fround, blocking: [] }
208
+ }
209
+
210
+ if (fround === MAX_FANOUT_ROUNDS) {
211
+ log(`Task ${taskId}: still ${blocking.length} blocking issue(s) after ${fround} fanout round(s) — escalating.`)
212
+ return { passed: false, rounds: fround, blocking }
213
+ }
214
+
215
+ const issues = blocking
216
+ .map((f) => `[${f.severity}] ${f.file || ''} — ${f.title}: ${f.detail || ''} (${f.dimension || 'review'})`)
217
+ .join('\n')
218
+ log(`Task ${taskId}: review-fanout flagged ${blocking.length} blocking issue(s); remediating.`)
219
+ await agent(
220
+ `An independent adversarial review of task ${taskId} found blocking issues in the current diff. Fix ONLY these; do not touch anything else, and do not weaken or delete tests to make them pass:
221
+
222
+ ${issues}
223
+
224
+ Specs that still must hold: ${(specPaths || []).join(', ') || '(see task directory)'}
225
+ Re-run the type-checker and the relevant tests (both must pass). Report which files you changed.`,
226
+ { label: `fanout-fix:${taskId}:r${fround}`, phase: 'Fanout', agentType: 'typescript-implementer', model: 'sonnet' }
227
+ )
228
+ }
229
+ return { passed: true, rounds: MAX_FANOUT_ROUNDS, blocking: [] }
230
+ }
231
+
232
+ // ---- Backlog loop ---------------------------------------------------------
233
+
234
+ const processed = []
235
+ const taskGates = []
236
+ let stopReason = 'backlog-drained'
237
+ let currentTaskId = null
238
+ let currentSpecPaths = []
239
+ let currentTaskBaseline = []
240
+ let halted = false
241
+
242
+ // Run the per-task review-fanout gate once, scoped to the task's changeset, and record it.
243
+ async function gateCompletedTask(taskId, specPaths, baseline) {
244
+ const now = await gitChangedFiles()
245
+ const baseSet = new Set(baseline || [])
246
+ const paths = now.filter((f) => !baseSet.has(f))
247
+ const gate = await reviewFanoutGate(taskId, specPaths, paths)
248
+ taskGates.push({
249
+ taskId,
250
+ passed: gate.passed,
251
+ rounds: gate.rounds,
252
+ blockingCount: gate.blocking.length,
253
+ scopedFiles: paths.length,
254
+ })
255
+ return gate
256
+ }
257
+
258
+ for (let i = 1; i <= MAX_ITEMS; i++) {
259
+ if (budget.total && budget.remaining() < MIN_BUDGET) {
260
+ stopReason = 'budget-low'
261
+ log(`Stopping: ${Math.round(budget.remaining() / 1000)}k tokens left (< ${Math.round(MIN_BUDGET / 1000)}k).`)
262
+ break
263
+ }
264
+
265
+ phase('Discover')
266
+ const task = await agent(
267
+ `You are discovering the NEXT rulebook task item to execute. Follow the project rule "follow-task-sequence": pick the FIRST unchecked "- [ ]" item from the LOWEST-numbered phase. Never reorder, never cherry-pick.
268
+
269
+ Steps:
270
+ 1. Read .rulebook/STATE.md to find the active task id.
271
+ 2. Open .rulebook/tasks/<active-task>/tasks.md (fall back to the lowest-numbered task directory if STATE.md is stale or the active task is fully checked).
272
+ 3. Find the first "- [ ]" item, top to bottom.
273
+ 4. Collect that task's spec material: proposal.md, tasks.md, and every specs/**/spec.md under the task directory.
274
+
275
+ Set found=false (and leave the other string fields empty) if every item in every task is already checked.`,
276
+ { label: `discover:${i}`, phase: 'Discover', agentType: 'researcher', model: 'haiku', schema: TASK_SCHEMA }
277
+ )
278
+
279
+ if (!task || !task.found) {
280
+ stopReason = processed.length ? 'backlog-drained' : 'no-pending-task'
281
+ break
282
+ }
283
+
284
+ // Task boundary: a new taskId means the previous task is fully checked → gate it once,
285
+ // then snapshot the new task's baseline file set so its gate is scoped to its own diff.
286
+ if (task.taskId !== currentTaskId) {
287
+ if (currentTaskId) {
288
+ const gate = await gateCompletedTask(currentTaskId, currentSpecPaths, currentTaskBaseline)
289
+ if (!gate.passed) {
290
+ stopReason = 'task-fanout-failed'
291
+ log(`Halting: task ${currentTaskId} failed the review-fanout gate.`)
292
+ halted = true
293
+ break
294
+ }
295
+ }
296
+ currentTaskId = task.taskId
297
+ currentSpecPaths = task.specPaths || []
298
+ currentTaskBaseline = await gitChangedFiles()
299
+ }
300
+
301
+ log(`[${i}/${MAX_ITEMS}] ${task.taskId} / ${task.phase}: ${task.item}`)
302
+ const result = await driveItem(task, i)
303
+ processed.push({ taskId: task.taskId, phase: task.phase, item: task.item, ...result })
304
+
305
+ if (!result.passed) {
306
+ stopReason = 'item-failed-review'
307
+ log(`Item ${i} failed after ${MAX_REVIEW_ROUNDS} rounds — halting loop (sequential tasks must not build on a broken item).`)
308
+ halted = true
309
+ break
310
+ }
311
+
312
+ if (ONCE) {
313
+ stopReason = 'once'
314
+ break
315
+ }
316
+ if (i === MAX_ITEMS) stopReason = 'max-items'
317
+ }
318
+
319
+ // Gate the final task only when the backlog drained cleanly (last task fully checked).
320
+ // Mid-task stops (once / max-items / budget-low) leave the task incomplete — skip the gate.
321
+ if (!halted && stopReason === 'backlog-drained' && currentTaskId) {
322
+ const gate = await gateCompletedTask(currentTaskId, currentSpecPaths, currentTaskBaseline)
323
+ if (!gate.passed) {
324
+ stopReason = 'task-fanout-failed'
325
+ halted = true
326
+ }
327
+ }
328
+
329
+ const passed = processed.filter((p) => p.passed).length
330
+
331
+ // FINAL: one release-gate pass over the work completed this run. Skipped when we halted on a
332
+ // failure (broken state) or when nothing passed.
333
+ let releaseGate = null
334
+ if (passed > 0 && !halted) {
335
+ phase('Gate')
336
+ log(`Running release-gate over ${passed} completed item(s)…`)
337
+ releaseGate = await workflow('release-gate')
338
+ log(`release-gate: ${releaseGate && releaseGate.go ? 'GO ✅' : 'NO-GO ⛔'}`)
339
+ }
340
+
341
+ log(`Done: ${passed}/${processed.length} item(s) passed. Stop reason: ${stopReason}.`)
342
+
343
+ return { stopReason, processedCount: processed.length, passedCount: passed, processed, taskGates, releaseGate }
@@ -0,0 +1,133 @@
1
+ export const meta = {
2
+ name: 'spec-author',
3
+ description:
4
+ 'Help the user write a rulebook task spec: research the codebase + existing specs, draft a proposal + SHALL/MUST spec with Given/When/Then scenarios, then run an opus gap-critic that returns ranked clarifying questions and detected gaps for the user to answer. Iterates when prior answers are supplied via args.answers.',
5
+ phases: [
6
+ { title: 'Research', model: 'haiku' },
7
+ { title: 'Draft', model: 'opus' },
8
+ { title: 'Critique', model: 'opus' },
9
+ ],
10
+ }
11
+
12
+ // args: { topic: string, answers?: Array<{ question: string, answer: string }> }
13
+ // NOTE: workflow subagents are non-interactive — this workflow cannot prompt the
14
+ // user mid-run. It RETURNS ranked questions/gaps; the main loop asks the user
15
+ // (e.g. via AskUserQuestion), then re-invokes this workflow with args.answers
16
+ // folded in. Repeat until `questions` comes back empty / `ready` is true.
17
+ const input = args && typeof args === 'object' ? args : {}
18
+ const topic = input.topic || (typeof args === 'string' ? args : null)
19
+ const priorAnswers = Array.isArray(input.answers) ? input.answers : []
20
+
21
+ if (!topic) {
22
+ log('No topic provided. Pass args: { topic: "...", answers?: [...] }.')
23
+ return { error: 'missing-topic' }
24
+ }
25
+
26
+ const answersBlock = priorAnswers.length
27
+ ? `\n\nThe user has already answered these clarifying questions — fold them into the draft as settled decisions:\n${priorAnswers
28
+ .map((a, i) => `${i + 1}. Q: ${a.question}\n A: ${a.answer}`)
29
+ .join('\n')}`
30
+ : ''
31
+
32
+ const CRITIQUE_SCHEMA = {
33
+ type: 'object',
34
+ additionalProperties: false,
35
+ required: ['ready', 'questions', 'gaps', 'missingScenarios'],
36
+ properties: {
37
+ ready: {
38
+ type: 'boolean',
39
+ description: 'true when the spec is complete enough to implement with no open questions',
40
+ },
41
+ questions: {
42
+ type: 'array',
43
+ description: 'ranked clarifying questions for the user; empty when ready=true',
44
+ items: {
45
+ type: 'object',
46
+ additionalProperties: false,
47
+ required: ['question', 'why', 'options'],
48
+ properties: {
49
+ question: { type: 'string' },
50
+ why: { type: 'string', description: 'what decision this unblocks / why it matters' },
51
+ options: {
52
+ type: 'array',
53
+ items: { type: 'string' },
54
+ description: 'plausible answers to offer the user (may be empty for free-form)',
55
+ },
56
+ },
57
+ },
58
+ },
59
+ gaps: {
60
+ type: 'array',
61
+ items: { type: 'string' },
62
+ description: 'requirements, edge cases, or constraints the draft omits',
63
+ },
64
+ missingScenarios: {
65
+ type: 'array',
66
+ items: { type: 'string' },
67
+ description: 'Given/When/Then scenarios that SHOULD exist but are absent',
68
+ },
69
+ },
70
+ }
71
+
72
+ phase('Research')
73
+ const research = await agent(
74
+ `Research context for authoring a rulebook task spec on: "${topic}".
75
+ Read-only. Gather:
76
+ 1. Existing specs under .rulebook/specs/ and any related task specs in .rulebook/tasks/*/specs/ that overlap this topic.
77
+ 2. The relevant source code, types, and conventions this spec will govern.
78
+ 3. The required rulebook spec format (read .rulebook/specs/RULEBOOK.md if present): ## ADDED/MODIFIED/REMOVED headers, "### Requirement: <name>" with SHALL/MUST, "#### Scenario:" with Given/When/Then.
79
+ Report a concise map: what already exists, what this spec must cover, conventions to follow, and obvious risks.`,
80
+ { label: 'research', phase: 'Research', agentType: 'researcher', model: 'haiku' }
81
+ )
82
+
83
+ phase('Draft')
84
+ const draft = await agent(
85
+ `Draft a complete rulebook task spec for: "${topic}".${answersBlock}
86
+
87
+ Ground every requirement in this codebase research:
88
+ """
89
+ ${research}
90
+ """
91
+
92
+ Produce two artifacts as markdown:
93
+ 1. proposal.md — a "## Why" section (≥20 chars, the motivation) and a "## What Changes" section.
94
+ 2. spec.md — using "## ADDED Requirements" (and MODIFIED/REMOVED if relevant), each as
95
+ "### Requirement: <Name>\\nThe system SHALL/MUST <...>" followed by one or more
96
+ "#### Scenario: <Name>" blocks with Given / When / Then lines (4 hashtags for scenarios).
97
+
98
+ Be specific and testable. Do NOT invent requirements the topic/research/answers don't support — mark anything uncertain so the critic can turn it into a question. Do NOT write production code.`,
99
+ { label: 'draft', phase: 'Draft', agentType: 'architect', model: 'opus' }
100
+ )
101
+
102
+ phase('Critique')
103
+ const critique = await agent(
104
+ `You are an exacting spec reviewer. Adversarially critique this draft spec for "${topic}" — your job is to find what is missing, ambiguous, or unverifiable so it does not reach implementation half-baked.
105
+
106
+ Draft:
107
+ """
108
+ ${draft}
109
+ """
110
+
111
+ Research context:
112
+ """
113
+ ${research}
114
+ """
115
+ ${answersBlock}
116
+
117
+ Identify:
118
+ - ranked clarifying QUESTIONS the user must answer (most decision-critical first); for each, say why it matters and offer plausible options.
119
+ - GAPS: requirements, constraints, error paths, or edge cases the draft omits.
120
+ - MISSING SCENARIOS: Given/When/Then cases that should exist but are absent.
121
+ Set ready=true ONLY if there are genuinely no open questions and the spec is implementation-ready.`,
122
+ { label: 'critique', phase: 'Critique', agentType: 'architect', model: 'opus', schema: CRITIQUE_SCHEMA }
123
+ )
124
+
125
+ return {
126
+ topic,
127
+ draft,
128
+ ready: !!(critique && critique.ready),
129
+ questions: (critique && critique.questions) || [],
130
+ gaps: (critique && critique.gaps) || [],
131
+ missingScenarios: (critique && critique.missingScenarios) || [],
132
+ answeredSoFar: priorAnswers.length,
133
+ }