@jokerized/getresearchdone 0.4.1

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 (711) hide show
  1. package/.claude-plugin/plugin.json +103 -0
  2. package/README.md +211 -0
  3. package/agents/grd-baseline-assessor.md +684 -0
  4. package/agents/grd-code-reviewer.md +300 -0
  5. package/agents/grd-codebase-mapper.md +355 -0
  6. package/agents/grd-critique-agent.md +119 -0
  7. package/agents/grd-debugger.md +519 -0
  8. package/agents/grd-deep-diver.md +737 -0
  9. package/agents/grd-eval-planner.md +913 -0
  10. package/agents/grd-eval-reporter.md +717 -0
  11. package/agents/grd-executor.md +683 -0
  12. package/agents/grd-feasibility-analyst.md +624 -0
  13. package/agents/grd-integration-checker.md +367 -0
  14. package/agents/grd-knowledge-miner.md +81 -0
  15. package/agents/grd-migrator.md +88 -0
  16. package/agents/grd-phase-researcher.md +697 -0
  17. package/agents/grd-plan-checker.md +443 -0
  18. package/agents/grd-planner.md +1532 -0
  19. package/agents/grd-product-owner.md +562 -0
  20. package/agents/grd-project-researcher.md +513 -0
  21. package/agents/grd-research-synthesizer.md +273 -0
  22. package/agents/grd-roadmapper.md +798 -0
  23. package/agents/grd-surveyor.md +566 -0
  24. package/agents/grd-verifier.md +893 -0
  25. package/bin/gd.js +4 -0
  26. package/bin/gd.ts +227 -0
  27. package/bin/grd-manifest.js +4 -0
  28. package/bin/grd-manifest.ts +286 -0
  29. package/bin/grd-mcp-server.js +4 -0
  30. package/bin/grd-mcp-server.ts +124 -0
  31. package/bin/grd-tools.js +4 -0
  32. package/bin/grd-tools.ts +2471 -0
  33. package/bin/postinstall.js +4 -0
  34. package/bin/postinstall.ts +80 -0
  35. package/commands/add-phase.md +123 -0
  36. package/commands/add-todo.md +87 -0
  37. package/commands/assess-baseline.md +289 -0
  38. package/commands/autopilot.md +100 -0
  39. package/commands/autoplan.md +55 -0
  40. package/commands/check-todos.md +87 -0
  41. package/commands/compare-methods.md +262 -0
  42. package/commands/complete-milestone.md +225 -0
  43. package/commands/debug.md +372 -0
  44. package/commands/deep-dive.md +288 -0
  45. package/commands/discover.md +281 -0
  46. package/commands/discuss-phase.md +188 -0
  47. package/commands/discuss.md +55 -0
  48. package/commands/eval-report.md +310 -0
  49. package/commands/evolve.md +79 -0
  50. package/commands/execute-phase.md +1017 -0
  51. package/commands/feasibility.md +292 -0
  52. package/commands/help.md +407 -0
  53. package/commands/init.md +1508 -0
  54. package/commands/insert-phase.md +113 -0
  55. package/commands/iterate.md +327 -0
  56. package/commands/list-phase-assumptions.md +217 -0
  57. package/commands/long-term-roadmap.md +202 -0
  58. package/commands/map-codebase.md +111 -0
  59. package/commands/migrate.md +159 -0
  60. package/commands/new-milestone.md +169 -0
  61. package/commands/pause-work.md +83 -0
  62. package/commands/plan-milestone-gaps.md +373 -0
  63. package/commands/plan-phase.md +655 -0
  64. package/commands/principles.md +328 -0
  65. package/commands/product-plan.md +319 -0
  66. package/commands/progress.md +481 -0
  67. package/commands/quick.md +167 -0
  68. package/commands/reapply-patches.md +154 -0
  69. package/commands/remove-phase.md +97 -0
  70. package/commands/requirement.md +96 -0
  71. package/commands/resume-project.md +113 -0
  72. package/commands/settings.md +1144 -0
  73. package/commands/survey.md +242 -0
  74. package/commands/sync.md +246 -0
  75. package/commands/tracker-setup.md +322 -0
  76. package/commands/update.md +202 -0
  77. package/commands/verify-phase.md +335 -0
  78. package/commands/verify-work.md +701 -0
  79. package/commands/wireup.md +29 -0
  80. package/dist/bin/gd.d.ts +3 -0
  81. package/dist/bin/gd.d.ts.map +1 -0
  82. package/dist/bin/gd.js +178 -0
  83. package/dist/bin/gd.js.map +1 -0
  84. package/dist/bin/grd-manifest.d.ts +3 -0
  85. package/dist/bin/grd-manifest.d.ts.map +1 -0
  86. package/dist/bin/grd-manifest.js +202 -0
  87. package/dist/bin/grd-manifest.js.map +1 -0
  88. package/dist/bin/grd-mcp-server.d.ts +3 -0
  89. package/dist/bin/grd-mcp-server.d.ts.map +1 -0
  90. package/dist/bin/grd-mcp-server.js +71 -0
  91. package/dist/bin/grd-mcp-server.js.map +1 -0
  92. package/dist/bin/grd-tools.d.ts +3 -0
  93. package/dist/bin/grd-tools.d.ts.map +1 -0
  94. package/dist/bin/grd-tools.js +1680 -0
  95. package/dist/bin/grd-tools.js.map +1 -0
  96. package/dist/bin/postinstall.d.ts +3 -0
  97. package/dist/bin/postinstall.d.ts.map +1 -0
  98. package/dist/bin/postinstall.js +61 -0
  99. package/dist/bin/postinstall.js.map +1 -0
  100. package/dist/lib/autopilot-milestone.d.ts +2 -0
  101. package/dist/lib/autopilot-milestone.d.ts.map +1 -0
  102. package/dist/lib/autopilot-milestone.js +94 -0
  103. package/dist/lib/autopilot-milestone.js.map +1 -0
  104. package/dist/lib/autopilot-pipeline.d.ts +2 -0
  105. package/dist/lib/autopilot-pipeline.d.ts.map +1 -0
  106. package/dist/lib/autopilot-pipeline.js +830 -0
  107. package/dist/lib/autopilot-pipeline.js.map +1 -0
  108. package/dist/lib/autopilot-waves.d.ts +2 -0
  109. package/dist/lib/autopilot-waves.d.ts.map +1 -0
  110. package/dist/lib/autopilot-waves.js +266 -0
  111. package/dist/lib/autopilot-waves.js.map +1 -0
  112. package/dist/lib/autopilot.d.ts +2 -0
  113. package/dist/lib/autopilot.d.ts.map +1 -0
  114. package/dist/lib/autopilot.js +1314 -0
  115. package/dist/lib/autopilot.js.map +1 -0
  116. package/dist/lib/autoplan.d.ts +2 -0
  117. package/dist/lib/autoplan.d.ts.map +1 -0
  118. package/dist/lib/autoplan.js +198 -0
  119. package/dist/lib/autoplan.js.map +1 -0
  120. package/dist/lib/autoresearch.d.ts +2 -0
  121. package/dist/lib/autoresearch.d.ts.map +1 -0
  122. package/dist/lib/autoresearch.js +626 -0
  123. package/dist/lib/autoresearch.js.map +1 -0
  124. package/dist/lib/backend.d.ts +2 -0
  125. package/dist/lib/backend.d.ts.map +1 -0
  126. package/dist/lib/backend.js +1036 -0
  127. package/dist/lib/backend.js.map +1 -0
  128. package/dist/lib/benchmark.d.ts +99 -0
  129. package/dist/lib/benchmark.d.ts.map +1 -0
  130. package/dist/lib/benchmark.js +278 -0
  131. package/dist/lib/benchmark.js.map +1 -0
  132. package/dist/lib/citations.d.ts +2 -0
  133. package/dist/lib/citations.d.ts.map +1 -0
  134. package/dist/lib/citations.js +642 -0
  135. package/dist/lib/citations.js.map +1 -0
  136. package/dist/lib/cleanup.d.ts +2 -0
  137. package/dist/lib/cleanup.d.ts.map +1 -0
  138. package/dist/lib/cleanup.js +1222 -0
  139. package/dist/lib/cleanup.js.map +1 -0
  140. package/dist/lib/cli/adapters.d.ts +10 -0
  141. package/dist/lib/cli/adapters.d.ts.map +1 -0
  142. package/dist/lib/cli/adapters.js +27 -0
  143. package/dist/lib/cli/adapters.js.map +1 -0
  144. package/dist/lib/cli/agent.d.ts +17 -0
  145. package/dist/lib/cli/agent.d.ts.map +1 -0
  146. package/dist/lib/cli/agent.js +53 -0
  147. package/dist/lib/cli/agent.js.map +1 -0
  148. package/dist/lib/cli/index.d.ts +21 -0
  149. package/dist/lib/cli/index.d.ts.map +1 -0
  150. package/dist/lib/cli/index.js +264 -0
  151. package/dist/lib/cli/index.js.map +1 -0
  152. package/dist/lib/cli/output.d.ts +20 -0
  153. package/dist/lib/cli/output.d.ts.map +1 -0
  154. package/dist/lib/cli/output.js +22 -0
  155. package/dist/lib/cli/output.js.map +1 -0
  156. package/dist/lib/cli/scan-dispatch.d.ts +9 -0
  157. package/dist/lib/cli/scan-dispatch.d.ts.map +1 -0
  158. package/dist/lib/cli/scan-dispatch.js +107 -0
  159. package/dist/lib/cli/scan-dispatch.js.map +1 -0
  160. package/dist/lib/cli/tools.d.ts +16 -0
  161. package/dist/lib/cli/tools.d.ts.map +1 -0
  162. package/dist/lib/cli/tools.js +168 -0
  163. package/dist/lib/cli/tools.js.map +1 -0
  164. package/dist/lib/commands/_dashboard-parsers.d.ts +2 -0
  165. package/dist/lib/commands/_dashboard-parsers.d.ts.map +1 -0
  166. package/dist/lib/commands/_dashboard-parsers.js +192 -0
  167. package/dist/lib/commands/_dashboard-parsers.js.map +1 -0
  168. package/dist/lib/commands/analysis.d.ts +2 -0
  169. package/dist/lib/commands/analysis.d.ts.map +1 -0
  170. package/dist/lib/commands/analysis.js +1418 -0
  171. package/dist/lib/commands/analysis.js.map +1 -0
  172. package/dist/lib/commands/assumptions.d.ts +2 -0
  173. package/dist/lib/commands/assumptions.d.ts.map +1 -0
  174. package/dist/lib/commands/assumptions.js +166 -0
  175. package/dist/lib/commands/assumptions.js.map +1 -0
  176. package/dist/lib/commands/blame.d.ts +2 -0
  177. package/dist/lib/commands/blame.d.ts.map +1 -0
  178. package/dist/lib/commands/blame.js +133 -0
  179. package/dist/lib/commands/blame.js.map +1 -0
  180. package/dist/lib/commands/budget.d.ts +2 -0
  181. package/dist/lib/commands/budget.d.ts.map +1 -0
  182. package/dist/lib/commands/budget.js +100 -0
  183. package/dist/lib/commands/budget.js.map +1 -0
  184. package/dist/lib/commands/check-plans.d.ts +2 -0
  185. package/dist/lib/commands/check-plans.d.ts.map +1 -0
  186. package/dist/lib/commands/check-plans.js +190 -0
  187. package/dist/lib/commands/check-plans.js.map +1 -0
  188. package/dist/lib/commands/config.d.ts +2 -0
  189. package/dist/lib/commands/config.d.ts.map +1 -0
  190. package/dist/lib/commands/config.js +188 -0
  191. package/dist/lib/commands/config.js.map +1 -0
  192. package/dist/lib/commands/dashboard.d.ts +2 -0
  193. package/dist/lib/commands/dashboard.d.ts.map +1 -0
  194. package/dist/lib/commands/dashboard.js +466 -0
  195. package/dist/lib/commands/dashboard.js.map +1 -0
  196. package/dist/lib/commands/estimate.d.ts +2 -0
  197. package/dist/lib/commands/estimate.d.ts.map +1 -0
  198. package/dist/lib/commands/estimate.js +148 -0
  199. package/dist/lib/commands/estimate.js.map +1 -0
  200. package/dist/lib/commands/eval-diff.d.ts +2 -0
  201. package/dist/lib/commands/eval-diff.d.ts.map +1 -0
  202. package/dist/lib/commands/eval-diff.js +213 -0
  203. package/dist/lib/commands/eval-diff.js.map +1 -0
  204. package/dist/lib/commands/freshness.d.ts +2 -0
  205. package/dist/lib/commands/freshness.d.ts.map +1 -0
  206. package/dist/lib/commands/freshness.js +163 -0
  207. package/dist/lib/commands/freshness.js.map +1 -0
  208. package/dist/lib/commands/health.d.ts +2 -0
  209. package/dist/lib/commands/health.d.ts.map +1 -0
  210. package/dist/lib/commands/health.js +435 -0
  211. package/dist/lib/commands/health.js.map +1 -0
  212. package/dist/lib/commands/index.d.ts +2 -0
  213. package/dist/lib/commands/index.d.ts.map +1 -0
  214. package/dist/lib/commands/index.js +128 -0
  215. package/dist/lib/commands/index.js.map +1 -0
  216. package/dist/lib/commands/install.d.ts +56 -0
  217. package/dist/lib/commands/install.d.ts.map +1 -0
  218. package/dist/lib/commands/install.js +214 -0
  219. package/dist/lib/commands/install.js.map +1 -0
  220. package/dist/lib/commands/knowhow-aggregator.d.ts +2 -0
  221. package/dist/lib/commands/knowhow-aggregator.d.ts.map +1 -0
  222. package/dist/lib/commands/knowhow-aggregator.js +279 -0
  223. package/dist/lib/commands/knowhow-aggregator.js.map +1 -0
  224. package/dist/lib/commands/knowledge-search.d.ts +2 -0
  225. package/dist/lib/commands/knowledge-search.d.ts.map +1 -0
  226. package/dist/lib/commands/knowledge-search.js +113 -0
  227. package/dist/lib/commands/knowledge-search.js.map +1 -0
  228. package/dist/lib/commands/long-term-roadmap.d.ts +2 -0
  229. package/dist/lib/commands/long-term-roadmap.d.ts.map +1 -0
  230. package/dist/lib/commands/long-term-roadmap.js +272 -0
  231. package/dist/lib/commands/long-term-roadmap.js.map +1 -0
  232. package/dist/lib/commands/patterns.d.ts +91 -0
  233. package/dist/lib/commands/patterns.d.ts.map +1 -0
  234. package/dist/lib/commands/patterns.js +391 -0
  235. package/dist/lib/commands/patterns.js.map +1 -0
  236. package/dist/lib/commands/phase-info.d.ts +2 -0
  237. package/dist/lib/commands/phase-info.d.ts.map +1 -0
  238. package/dist/lib/commands/phase-info.js +509 -0
  239. package/dist/lib/commands/phase-info.js.map +1 -0
  240. package/dist/lib/commands/plan-lint.d.ts +56 -0
  241. package/dist/lib/commands/plan-lint.d.ts.map +1 -0
  242. package/dist/lib/commands/plan-lint.js +481 -0
  243. package/dist/lib/commands/plan-lint.js.map +1 -0
  244. package/dist/lib/commands/plan-phase.d.ts +53 -0
  245. package/dist/lib/commands/plan-phase.d.ts.map +1 -0
  246. package/dist/lib/commands/plan-phase.js +288 -0
  247. package/dist/lib/commands/plan-phase.js.map +1 -0
  248. package/dist/lib/commands/progress.d.ts +2 -0
  249. package/dist/lib/commands/progress.d.ts.map +1 -0
  250. package/dist/lib/commands/progress.js +266 -0
  251. package/dist/lib/commands/progress.js.map +1 -0
  252. package/dist/lib/commands/quality.d.ts +2 -0
  253. package/dist/lib/commands/quality.d.ts.map +1 -0
  254. package/dist/lib/commands/quality.js +80 -0
  255. package/dist/lib/commands/quality.js.map +1 -0
  256. package/dist/lib/commands/rollback.d.ts +2 -0
  257. package/dist/lib/commands/rollback.d.ts.map +1 -0
  258. package/dist/lib/commands/rollback.js +145 -0
  259. package/dist/lib/commands/rollback.js.map +1 -0
  260. package/dist/lib/commands/scan.d.ts +25 -0
  261. package/dist/lib/commands/scan.d.ts.map +1 -0
  262. package/dist/lib/commands/scan.js +28 -0
  263. package/dist/lib/commands/scan.js.map +1 -0
  264. package/dist/lib/commands/search.d.ts +2 -0
  265. package/dist/lib/commands/search.d.ts.map +1 -0
  266. package/dist/lib/commands/search.js +212 -0
  267. package/dist/lib/commands/search.js.map +1 -0
  268. package/dist/lib/commands/select-candidate.d.ts +128 -0
  269. package/dist/lib/commands/select-candidate.d.ts.map +1 -0
  270. package/dist/lib/commands/select-candidate.js +518 -0
  271. package/dist/lib/commands/select-candidate.js.map +1 -0
  272. package/dist/lib/commands/singularity.d.ts +2 -0
  273. package/dist/lib/commands/singularity.d.ts.map +1 -0
  274. package/dist/lib/commands/singularity.js +185 -0
  275. package/dist/lib/commands/singularity.js.map +1 -0
  276. package/dist/lib/commands/slug-timestamp.d.ts +2 -0
  277. package/dist/lib/commands/slug-timestamp.d.ts.map +1 -0
  278. package/dist/lib/commands/slug-timestamp.js +54 -0
  279. package/dist/lib/commands/slug-timestamp.js.map +1 -0
  280. package/dist/lib/commands/tail.d.ts +2 -0
  281. package/dist/lib/commands/tail.d.ts.map +1 -0
  282. package/dist/lib/commands/tail.js +100 -0
  283. package/dist/lib/commands/tail.js.map +1 -0
  284. package/dist/lib/commands/todo.d.ts +2 -0
  285. package/dist/lib/commands/todo.d.ts.map +1 -0
  286. package/dist/lib/commands/todo.js +200 -0
  287. package/dist/lib/commands/todo.js.map +1 -0
  288. package/dist/lib/commands/watch.d.ts +2 -0
  289. package/dist/lib/commands/watch.d.ts.map +1 -0
  290. package/dist/lib/commands/watch.js +72 -0
  291. package/dist/lib/commands/watch.js.map +1 -0
  292. package/dist/lib/complexity.d.ts +55 -0
  293. package/dist/lib/complexity.d.ts.map +1 -0
  294. package/dist/lib/complexity.js +80 -0
  295. package/dist/lib/complexity.js.map +1 -0
  296. package/dist/lib/context/agents.d.ts +2 -0
  297. package/dist/lib/context/agents.d.ts.map +1 -0
  298. package/dist/lib/context/agents.js +344 -0
  299. package/dist/lib/context/agents.js.map +1 -0
  300. package/dist/lib/context/base.d.ts +2 -0
  301. package/dist/lib/context/base.d.ts.map +1 -0
  302. package/dist/lib/context/base.js +81 -0
  303. package/dist/lib/context/base.js.map +1 -0
  304. package/dist/lib/context/execute.d.ts +2 -0
  305. package/dist/lib/context/execute.d.ts.map +1 -0
  306. package/dist/lib/context/execute.js +753 -0
  307. package/dist/lib/context/execute.js.map +1 -0
  308. package/dist/lib/context/index.d.ts +2 -0
  309. package/dist/lib/context/index.d.ts.map +1 -0
  310. package/dist/lib/context/index.js +88 -0
  311. package/dist/lib/context/index.js.map +1 -0
  312. package/dist/lib/context/progress.d.ts +2 -0
  313. package/dist/lib/context/progress.d.ts.map +1 -0
  314. package/dist/lib/context/progress.js +178 -0
  315. package/dist/lib/context/progress.js.map +1 -0
  316. package/dist/lib/context/project.d.ts +2 -0
  317. package/dist/lib/context/project.d.ts.map +1 -0
  318. package/dist/lib/context/project.js +413 -0
  319. package/dist/lib/context/project.js.map +1 -0
  320. package/dist/lib/context/research.d.ts +2 -0
  321. package/dist/lib/context/research.d.ts.map +1 -0
  322. package/dist/lib/context/research.js +466 -0
  323. package/dist/lib/context/research.js.map +1 -0
  324. package/dist/lib/dead-ends.d.ts +28 -0
  325. package/dist/lib/dead-ends.d.ts.map +1 -0
  326. package/dist/lib/dead-ends.js +451 -0
  327. package/dist/lib/dead-ends.js.map +1 -0
  328. package/dist/lib/deps.d.ts +2 -0
  329. package/dist/lib/deps.d.ts.map +1 -0
  330. package/dist/lib/deps.js +630 -0
  331. package/dist/lib/deps.js.map +1 -0
  332. package/dist/lib/discussion.d.ts +2 -0
  333. package/dist/lib/discussion.d.ts.map +1 -0
  334. package/dist/lib/discussion.js +1041 -0
  335. package/dist/lib/discussion.js.map +1 -0
  336. package/dist/lib/drift.d.ts +36 -0
  337. package/dist/lib/drift.d.ts.map +1 -0
  338. package/dist/lib/drift.js +481 -0
  339. package/dist/lib/drift.js.map +1 -0
  340. package/dist/lib/evolve/_dimensions-features.d.ts +2 -0
  341. package/dist/lib/evolve/_dimensions-features.d.ts.map +1 -0
  342. package/dist/lib/evolve/_dimensions-features.js +369 -0
  343. package/dist/lib/evolve/_dimensions-features.js.map +1 -0
  344. package/dist/lib/evolve/_dimensions.d.ts +2 -0
  345. package/dist/lib/evolve/_dimensions.d.ts.map +1 -0
  346. package/dist/lib/evolve/_dimensions.js +358 -0
  347. package/dist/lib/evolve/_dimensions.js.map +1 -0
  348. package/dist/lib/evolve/_product-ideation.d.ts +2 -0
  349. package/dist/lib/evolve/_product-ideation.d.ts.map +1 -0
  350. package/dist/lib/evolve/_product-ideation.js +281 -0
  351. package/dist/lib/evolve/_product-ideation.js.map +1 -0
  352. package/dist/lib/evolve/_prompts.d.ts +2 -0
  353. package/dist/lib/evolve/_prompts.d.ts.map +1 -0
  354. package/dist/lib/evolve/_prompts.js +153 -0
  355. package/dist/lib/evolve/_prompts.js.map +1 -0
  356. package/dist/lib/evolve/cli.d.ts +2 -0
  357. package/dist/lib/evolve/cli.d.ts.map +1 -0
  358. package/dist/lib/evolve/cli.js +224 -0
  359. package/dist/lib/evolve/cli.js.map +1 -0
  360. package/dist/lib/evolve/discovery.d.ts +2 -0
  361. package/dist/lib/evolve/discovery.d.ts.map +1 -0
  362. package/dist/lib/evolve/discovery.js +391 -0
  363. package/dist/lib/evolve/discovery.js.map +1 -0
  364. package/dist/lib/evolve/index.d.ts +2 -0
  365. package/dist/lib/evolve/index.d.ts.map +1 -0
  366. package/dist/lib/evolve/index.js +88 -0
  367. package/dist/lib/evolve/index.js.map +1 -0
  368. package/dist/lib/evolve/orchestrator.d.ts +2 -0
  369. package/dist/lib/evolve/orchestrator.d.ts.map +1 -0
  370. package/dist/lib/evolve/orchestrator.js +851 -0
  371. package/dist/lib/evolve/orchestrator.js.map +1 -0
  372. package/dist/lib/evolve/scoring.d.ts +2 -0
  373. package/dist/lib/evolve/scoring.d.ts.map +1 -0
  374. package/dist/lib/evolve/scoring.js +118 -0
  375. package/dist/lib/evolve/scoring.js.map +1 -0
  376. package/dist/lib/evolve/state.d.ts +2 -0
  377. package/dist/lib/evolve/state.d.ts.map +1 -0
  378. package/dist/lib/evolve/state.js +264 -0
  379. package/dist/lib/evolve/state.js.map +1 -0
  380. package/dist/lib/evolve/types.d.ts +249 -0
  381. package/dist/lib/evolve/types.d.ts.map +1 -0
  382. package/dist/lib/evolve/types.js +3 -0
  383. package/dist/lib/evolve/types.js.map +1 -0
  384. package/dist/lib/frontmatter.d.ts +2 -0
  385. package/dist/lib/frontmatter.d.ts.map +1 -0
  386. package/dist/lib/frontmatter.js +513 -0
  387. package/dist/lib/frontmatter.js.map +1 -0
  388. package/dist/lib/gates.d.ts +2 -0
  389. package/dist/lib/gates.d.ts.map +1 -0
  390. package/dist/lib/gates.js +578 -0
  391. package/dist/lib/gates.js.map +1 -0
  392. package/dist/lib/genome.d.ts +10 -0
  393. package/dist/lib/genome.d.ts.map +1 -0
  394. package/dist/lib/genome.js +368 -0
  395. package/dist/lib/genome.js.map +1 -0
  396. package/dist/lib/got.d.ts +2 -0
  397. package/dist/lib/got.d.ts.map +1 -0
  398. package/dist/lib/got.js +280 -0
  399. package/dist/lib/got.js.map +1 -0
  400. package/dist/lib/invariants.d.ts +2 -0
  401. package/dist/lib/invariants.d.ts.map +1 -0
  402. package/dist/lib/invariants.js +298 -0
  403. package/dist/lib/invariants.js.map +1 -0
  404. package/dist/lib/knowledge.d.ts +2 -0
  405. package/dist/lib/knowledge.d.ts.map +1 -0
  406. package/dist/lib/knowledge.js +658 -0
  407. package/dist/lib/knowledge.js.map +1 -0
  408. package/dist/lib/long-term-roadmap.d.ts +2 -0
  409. package/dist/lib/long-term-roadmap.d.ts.map +1 -0
  410. package/dist/lib/long-term-roadmap.js +602 -0
  411. package/dist/lib/long-term-roadmap.js.map +1 -0
  412. package/dist/lib/markdown-split.d.ts +2 -0
  413. package/dist/lib/markdown-split.d.ts.map +1 -0
  414. package/dist/lib/markdown-split.js +199 -0
  415. package/dist/lib/markdown-split.js.map +1 -0
  416. package/dist/lib/mcp-server.d.ts +2 -0
  417. package/dist/lib/mcp-server.d.ts.map +1 -0
  418. package/dist/lib/mcp-server.js +2424 -0
  419. package/dist/lib/mcp-server.js.map +1 -0
  420. package/dist/lib/metrics.d.ts +16 -0
  421. package/dist/lib/metrics.d.ts.map +1 -0
  422. package/dist/lib/metrics.js +48 -0
  423. package/dist/lib/metrics.js.map +1 -0
  424. package/dist/lib/overstory.d.ts +2 -0
  425. package/dist/lib/overstory.d.ts.map +1 -0
  426. package/dist/lib/overstory.js +211 -0
  427. package/dist/lib/overstory.js.map +1 -0
  428. package/dist/lib/parallel.d.ts +2 -0
  429. package/dist/lib/parallel.d.ts.map +1 -0
  430. package/dist/lib/parallel.js +349 -0
  431. package/dist/lib/parallel.js.map +1 -0
  432. package/dist/lib/paths.d.ts +2 -0
  433. package/dist/lib/paths.d.ts.map +1 -0
  434. package/dist/lib/paths.js +254 -0
  435. package/dist/lib/paths.js.map +1 -0
  436. package/dist/lib/phase-complete-llm.d.ts +22 -0
  437. package/dist/lib/phase-complete-llm.d.ts.map +1 -0
  438. package/dist/lib/phase-complete-llm.js +331 -0
  439. package/dist/lib/phase-complete-llm.js.map +1 -0
  440. package/dist/lib/phase-complete.d.ts +46 -0
  441. package/dist/lib/phase-complete.d.ts.map +1 -0
  442. package/dist/lib/phase-complete.js +278 -0
  443. package/dist/lib/phase-complete.js.map +1 -0
  444. package/dist/lib/phase-io.d.ts +2 -0
  445. package/dist/lib/phase-io.d.ts.map +1 -0
  446. package/dist/lib/phase-io.js +126 -0
  447. package/dist/lib/phase-io.js.map +1 -0
  448. package/dist/lib/phase.d.ts +2 -0
  449. package/dist/lib/phase.d.ts.map +1 -0
  450. package/dist/lib/phase.js +1344 -0
  451. package/dist/lib/phase.js.map +1 -0
  452. package/dist/lib/plan-tournament.d.ts +63 -0
  453. package/dist/lib/plan-tournament.d.ts.map +1 -0
  454. package/dist/lib/plan-tournament.js +353 -0
  455. package/dist/lib/plan-tournament.js.map +1 -0
  456. package/dist/lib/refinement.d.ts +74 -0
  457. package/dist/lib/refinement.d.ts.map +1 -0
  458. package/dist/lib/refinement.js +283 -0
  459. package/dist/lib/refinement.js.map +1 -0
  460. package/dist/lib/requirements.d.ts +2 -0
  461. package/dist/lib/requirements.d.ts.map +1 -0
  462. package/dist/lib/requirements.js +355 -0
  463. package/dist/lib/requirements.js.map +1 -0
  464. package/dist/lib/research-bundle.d.ts +2 -0
  465. package/dist/lib/research-bundle.d.ts.map +1 -0
  466. package/dist/lib/research-bundle.js +246 -0
  467. package/dist/lib/research-bundle.js.map +1 -0
  468. package/dist/lib/roadmap.d.ts +2 -0
  469. package/dist/lib/roadmap.d.ts.map +1 -0
  470. package/dist/lib/roadmap.js +541 -0
  471. package/dist/lib/roadmap.js.map +1 -0
  472. package/dist/lib/sample.d.ts +16 -0
  473. package/dist/lib/sample.d.ts.map +1 -0
  474. package/dist/lib/sample.js +20 -0
  475. package/dist/lib/sample.js.map +1 -0
  476. package/dist/lib/scaffold.d.ts +2 -0
  477. package/dist/lib/scaffold.d.ts.map +1 -0
  478. package/dist/lib/scaffold.js +355 -0
  479. package/dist/lib/scaffold.js.map +1 -0
  480. package/dist/lib/scan/_utils.d.ts +11 -0
  481. package/dist/lib/scan/_utils.d.ts.map +1 -0
  482. package/dist/lib/scan/_utils.js +36 -0
  483. package/dist/lib/scan/_utils.js.map +1 -0
  484. package/dist/lib/scan/base64.d.ts +15 -0
  485. package/dist/lib/scan/base64.d.ts.map +1 -0
  486. package/dist/lib/scan/base64.js +66 -0
  487. package/dist/lib/scan/base64.js.map +1 -0
  488. package/dist/lib/scan/ignorefile.d.ts +30 -0
  489. package/dist/lib/scan/ignorefile.d.ts.map +1 -0
  490. package/dist/lib/scan/ignorefile.js +101 -0
  491. package/dist/lib/scan/ignorefile.js.map +1 -0
  492. package/dist/lib/scan/injection.d.ts +14 -0
  493. package/dist/lib/scan/injection.d.ts.map +1 -0
  494. package/dist/lib/scan/injection.js +39 -0
  495. package/dist/lib/scan/injection.js.map +1 -0
  496. package/dist/lib/scan/patterns.d.ts +17 -0
  497. package/dist/lib/scan/patterns.d.ts.map +1 -0
  498. package/dist/lib/scan/patterns.js +123 -0
  499. package/dist/lib/scan/patterns.js.map +1 -0
  500. package/dist/lib/scan/strip-markdown.d.ts +7 -0
  501. package/dist/lib/scan/strip-markdown.d.ts.map +1 -0
  502. package/dist/lib/scan/strip-markdown.js +38 -0
  503. package/dist/lib/scan/strip-markdown.js.map +1 -0
  504. package/dist/lib/scan/types.d.ts +23 -0
  505. package/dist/lib/scan/types.d.ts.map +1 -0
  506. package/dist/lib/scan/types.js +3 -0
  507. package/dist/lib/scan/types.js.map +1 -0
  508. package/dist/lib/scheduler-wait.d.ts +2 -0
  509. package/dist/lib/scheduler-wait.d.ts.map +1 -0
  510. package/dist/lib/scheduler-wait.js +59 -0
  511. package/dist/lib/scheduler-wait.js.map +1 -0
  512. package/dist/lib/scheduler.d.ts +254 -0
  513. package/dist/lib/scheduler.d.ts.map +1 -0
  514. package/dist/lib/scheduler.js +1147 -0
  515. package/dist/lib/scheduler.js.map +1 -0
  516. package/dist/lib/state.d.ts +2 -0
  517. package/dist/lib/state.d.ts.map +1 -0
  518. package/dist/lib/state.js +744 -0
  519. package/dist/lib/state.js.map +1 -0
  520. package/dist/lib/think.d.ts +18 -0
  521. package/dist/lib/think.d.ts.map +1 -0
  522. package/dist/lib/think.js +317 -0
  523. package/dist/lib/think.js.map +1 -0
  524. package/dist/lib/tracker.d.ts +2 -0
  525. package/dist/lib/tracker.d.ts.map +1 -0
  526. package/dist/lib/tracker.js +1121 -0
  527. package/dist/lib/tracker.js.map +1 -0
  528. package/dist/lib/types.d.ts +1514 -0
  529. package/dist/lib/types.d.ts.map +1 -0
  530. package/dist/lib/types.js +4 -0
  531. package/dist/lib/types.js.map +1 -0
  532. package/dist/lib/utils.d.ts +2 -0
  533. package/dist/lib/utils.d.ts.map +1 -0
  534. package/dist/lib/utils.js +1363 -0
  535. package/dist/lib/utils.js.map +1 -0
  536. package/dist/lib/verify.d.ts +2 -0
  537. package/dist/lib/verify.d.ts.map +1 -0
  538. package/dist/lib/verify.js +1153 -0
  539. package/dist/lib/verify.js.map +1 -0
  540. package/dist/lib/wireup/autofix.d.ts +2 -0
  541. package/dist/lib/wireup/autofix.d.ts.map +1 -0
  542. package/dist/lib/wireup/autofix.js +188 -0
  543. package/dist/lib/wireup/autofix.js.map +1 -0
  544. package/dist/lib/wireup/cli.d.ts +2 -0
  545. package/dist/lib/wireup/cli.d.ts.map +1 -0
  546. package/dist/lib/wireup/cli.js +194 -0
  547. package/dist/lib/wireup/cli.js.map +1 -0
  548. package/dist/lib/wireup/detection.d.ts +47 -0
  549. package/dist/lib/wireup/detection.d.ts.map +1 -0
  550. package/dist/lib/wireup/detection.js +410 -0
  551. package/dist/lib/wireup/detection.js.map +1 -0
  552. package/dist/lib/wireup/discovery.d.ts +2 -0
  553. package/dist/lib/wireup/discovery.d.ts.map +1 -0
  554. package/dist/lib/wireup/discovery.js +934 -0
  555. package/dist/lib/wireup/discovery.js.map +1 -0
  556. package/dist/lib/wireup/execution.d.ts +2 -0
  557. package/dist/lib/wireup/execution.d.ts.map +1 -0
  558. package/dist/lib/wireup/execution.js +573 -0
  559. package/dist/lib/wireup/execution.js.map +1 -0
  560. package/dist/lib/wireup/index.d.ts +2 -0
  561. package/dist/lib/wireup/index.d.ts.map +1 -0
  562. package/dist/lib/wireup/index.js +85 -0
  563. package/dist/lib/wireup/index.js.map +1 -0
  564. package/dist/lib/wireup/orchestrator.d.ts +2 -0
  565. package/dist/lib/wireup/orchestrator.d.ts.map +1 -0
  566. package/dist/lib/wireup/orchestrator.js +366 -0
  567. package/dist/lib/wireup/orchestrator.js.map +1 -0
  568. package/dist/lib/wireup/report.d.ts +47 -0
  569. package/dist/lib/wireup/report.d.ts.map +1 -0
  570. package/dist/lib/wireup/report.js +201 -0
  571. package/dist/lib/wireup/report.js.map +1 -0
  572. package/dist/lib/wireup/scenarios.d.ts +2 -0
  573. package/dist/lib/wireup/scenarios.d.ts.map +1 -0
  574. package/dist/lib/wireup/scenarios.js +516 -0
  575. package/dist/lib/wireup/scenarios.js.map +1 -0
  576. package/dist/lib/wireup/state.d.ts +2 -0
  577. package/dist/lib/wireup/state.d.ts.map +1 -0
  578. package/dist/lib/wireup/state.js +102 -0
  579. package/dist/lib/wireup/state.js.map +1 -0
  580. package/dist/lib/wireup/types.d.ts +376 -0
  581. package/dist/lib/wireup/types.d.ts.map +1 -0
  582. package/dist/lib/wireup/types.js +3 -0
  583. package/dist/lib/wireup/types.js.map +1 -0
  584. package/dist/lib/worktree.d.ts +2 -0
  585. package/dist/lib/worktree.d.ts.map +1 -0
  586. package/dist/lib/worktree.js +999 -0
  587. package/dist/lib/worktree.js.map +1 -0
  588. package/lib/autopilot-milestone.ts +136 -0
  589. package/lib/autopilot-pipeline.ts +1179 -0
  590. package/lib/autopilot-waves.ts +361 -0
  591. package/lib/autopilot.ts +1874 -0
  592. package/lib/autoplan.ts +280 -0
  593. package/lib/autoresearch.js +4 -0
  594. package/lib/autoresearch.ts +886 -0
  595. package/lib/backend.ts +1252 -0
  596. package/lib/benchmark.ts +341 -0
  597. package/lib/citations.ts +760 -0
  598. package/lib/cleanup.ts +1588 -0
  599. package/lib/cli/adapters.ts +41 -0
  600. package/lib/cli/agent.ts +83 -0
  601. package/lib/cli/index.ts +273 -0
  602. package/lib/cli/output.ts +33 -0
  603. package/lib/cli/scan-dispatch.ts +130 -0
  604. package/lib/cli/tools.ts +198 -0
  605. package/lib/commands/_dashboard-parsers.ts +275 -0
  606. package/lib/commands/analysis.ts +1851 -0
  607. package/lib/commands/assumptions.ts +232 -0
  608. package/lib/commands/blame.ts +174 -0
  609. package/lib/commands/budget.ts +148 -0
  610. package/lib/commands/check-plans.ts +233 -0
  611. package/lib/commands/config.ts +287 -0
  612. package/lib/commands/dashboard.ts +680 -0
  613. package/lib/commands/estimate.ts +204 -0
  614. package/lib/commands/eval-diff.ts +252 -0
  615. package/lib/commands/freshness.ts +213 -0
  616. package/lib/commands/health.ts +607 -0
  617. package/lib/commands/index.ts +266 -0
  618. package/lib/commands/install.ts +307 -0
  619. package/lib/commands/knowhow-aggregator.ts +345 -0
  620. package/lib/commands/knowledge-search.ts +153 -0
  621. package/lib/commands/long-term-roadmap.ts +390 -0
  622. package/lib/commands/patterns.ts +465 -0
  623. package/lib/commands/phase-info.ts +698 -0
  624. package/lib/commands/plan-lint.ts +546 -0
  625. package/lib/commands/plan-phase.ts +375 -0
  626. package/lib/commands/progress.ts +319 -0
  627. package/lib/commands/quality.ts +138 -0
  628. package/lib/commands/rollback.ts +195 -0
  629. package/lib/commands/scan.ts +72 -0
  630. package/lib/commands/search.ts +300 -0
  631. package/lib/commands/select-candidate.ts +687 -0
  632. package/lib/commands/singularity.ts +222 -0
  633. package/lib/commands/slug-timestamp.ts +74 -0
  634. package/lib/commands/tail.ts +129 -0
  635. package/lib/commands/todo.ts +273 -0
  636. package/lib/commands/watch.ts +80 -0
  637. package/lib/complexity.ts +117 -0
  638. package/lib/context/agents.ts +505 -0
  639. package/lib/context/base.ts +123 -0
  640. package/lib/context/execute.ts +977 -0
  641. package/lib/context/index.ts +110 -0
  642. package/lib/context/progress.ts +278 -0
  643. package/lib/context/project.ts +531 -0
  644. package/lib/context/research.ts +646 -0
  645. package/lib/dead-ends.ts +506 -0
  646. package/lib/deps.ts +773 -0
  647. package/lib/discussion.ts +1275 -0
  648. package/lib/drift.ts +519 -0
  649. package/lib/evolve/_dimensions-features.ts +525 -0
  650. package/lib/evolve/_dimensions.ts +511 -0
  651. package/lib/evolve/_product-ideation.ts +405 -0
  652. package/lib/evolve/_prompts.ts +178 -0
  653. package/lib/evolve/cli.ts +330 -0
  654. package/lib/evolve/discovery.ts +571 -0
  655. package/lib/evolve/index.ts +105 -0
  656. package/lib/evolve/orchestrator.ts +1139 -0
  657. package/lib/evolve/scoring.ts +167 -0
  658. package/lib/evolve/state.ts +330 -0
  659. package/lib/evolve/types.ts +290 -0
  660. package/lib/frontmatter.ts +615 -0
  661. package/lib/gates.ts +695 -0
  662. package/lib/genome.ts +402 -0
  663. package/lib/got.js +4 -0
  664. package/lib/got.ts +361 -0
  665. package/lib/invariants.ts +378 -0
  666. package/lib/knowledge.ts +768 -0
  667. package/lib/long-term-roadmap.ts +806 -0
  668. package/lib/markdown-split.ts +273 -0
  669. package/lib/mcp-server.ts +3292 -0
  670. package/lib/metrics.ts +49 -0
  671. package/lib/overstory.ts +270 -0
  672. package/lib/parallel.ts +570 -0
  673. package/lib/paths.ts +293 -0
  674. package/lib/phase-complete-llm.ts +376 -0
  675. package/lib/phase-complete.ts +366 -0
  676. package/lib/phase-io.ts +101 -0
  677. package/lib/phase.ts +1981 -0
  678. package/lib/plan-tournament.ts +426 -0
  679. package/lib/refinement.ts +349 -0
  680. package/lib/requirements.ts +469 -0
  681. package/lib/research-bundle.ts +300 -0
  682. package/lib/roadmap.ts +775 -0
  683. package/lib/scaffold.ts +480 -0
  684. package/lib/scan/_utils.ts +37 -0
  685. package/lib/scan/base64.ts +90 -0
  686. package/lib/scan/ignorefile.ts +109 -0
  687. package/lib/scan/injection.ts +67 -0
  688. package/lib/scan/patterns.ts +139 -0
  689. package/lib/scan/strip-markdown.ts +39 -0
  690. package/lib/scan/types.ts +28 -0
  691. package/lib/scheduler-wait.ts +58 -0
  692. package/lib/scheduler.ts +1370 -0
  693. package/lib/state.ts +1000 -0
  694. package/lib/think.ts +365 -0
  695. package/lib/tracker.ts +1591 -0
  696. package/lib/types.ts +1663 -0
  697. package/lib/utils.ts +1479 -0
  698. package/lib/verify.ts +1434 -0
  699. package/lib/wireup/autofix.ts +241 -0
  700. package/lib/wireup/cli.ts +278 -0
  701. package/lib/wireup/detection.ts +542 -0
  702. package/lib/wireup/discovery.ts +1063 -0
  703. package/lib/wireup/execution.ts +686 -0
  704. package/lib/wireup/index.ts +117 -0
  705. package/lib/wireup/orchestrator.ts +519 -0
  706. package/lib/wireup/report.ts +286 -0
  707. package/lib/wireup/scenarios.ts +616 -0
  708. package/lib/wireup/state.ts +139 -0
  709. package/lib/wireup/types.ts +436 -0
  710. package/lib/worktree.ts +1309 -0
  711. package/package.json +67 -0
@@ -0,0 +1,851 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { loadConfig, MODEL_PROFILES, resolveModelForAgent, } = require('../utils');
6
+ const { createScheduler, } = require('../scheduler');
7
+ const { execGit, } = require('../utils');
8
+ const { spawnClaudeAsync, } = require('../autopilot');
9
+ const { createEvolveWorktree, removeEvolveWorktree, pushAndCreatePR, } = require('../worktree');
10
+ const { DEFAULT_PICK_PCT, readEvolveState, writeEvolveState, } = require('./state');
11
+ const { runGroupDiscovery, } = require('./discovery');
12
+ const { buildBatchExecutePrompt, buildBatchReviewPrompt, } = require('./_prompts');
13
+ const { runAutoplan, } = require('../autoplan');
14
+ const { runMultiMilestoneAutopilot, } = require('../autopilot');
15
+ const { runGenomeSnapshot, GenomeSplitIndexError, } = require('../genome');
16
+ const { getEffectiveTierForDispatch, } = require('../backend');
17
+ // ─── Evolve Loop Helpers ─────────────────────────────────────────────────────
18
+ /**
19
+ * Run a single iteration step: discover groups, set up worktree if needed,
20
+ * batch-execute, and batch-review.
21
+ */
22
+ async function _runIterationStep(iterCtx) {
23
+ const { state, effectivePickPct, dryRun, timeoutMs, maxTurns, cwd, log, scheduler } = iterCtx;
24
+ let { useWorktree, worktreeInfo, executionCwd } = iterCtx;
25
+ // 1. Discover and group (on executionCwd so we see evolved code)
26
+ const discovery = await runGroupDiscovery(executionCwd, state, effectivePickPct, { timeoutMs, scheduler });
27
+ log(`Discovered ${discovery.all_items_count} new + ${discovery.merged_items_count - discovery.all_items_count} carried-over = ${discovery.merged_items_count} total items, ${discovery.groups_count} groups, selected ${discovery.selected_groups.length}`);
28
+ if (dryRun) {
29
+ return {
30
+ discovery,
31
+ outcomes: [],
32
+ worktreeInfo,
33
+ executionCwd,
34
+ feedback: null,
35
+ useWorktree,
36
+ isDryRun: true,
37
+ };
38
+ }
39
+ if (discovery.selected_groups.length === 0) {
40
+ return {
41
+ discovery,
42
+ outcomes: null,
43
+ worktreeInfo,
44
+ executionCwd,
45
+ feedback: null,
46
+ useWorktree,
47
+ isDryRun: false,
48
+ };
49
+ }
50
+ // Create worktree on first non-dry-run iteration if enabled
51
+ if (useWorktree && !worktreeInfo) {
52
+ const wtResult = createEvolveWorktree(cwd);
53
+ if (wtResult.error) {
54
+ log(`Worktree creation failed: ${wtResult.error}. Continuing without isolation.`);
55
+ useWorktree = false;
56
+ }
57
+ else {
58
+ worktreeInfo = wtResult;
59
+ executionCwd = wtResult.path;
60
+ log(`Created worktree at ${wtResult.path} (branch: ${wtResult.branch})`);
61
+ }
62
+ }
63
+ // 2. All groups are executable — product-ideation items are real feature work
64
+ const outcomes = [];
65
+ const allGroups = discovery.selected_groups;
66
+ // Cap items per batch to keep subprocess focused (max 10 items for tight discover→execute cycles)
67
+ const MAX_BATCH_ITEMS = 10;
68
+ let cappedGroups = allGroups;
69
+ let totalItems = allGroups.reduce((sum, g) => sum + g.items.length, 0);
70
+ if (totalItems > MAX_BATCH_ITEMS) {
71
+ cappedGroups = [];
72
+ let runningTotal = 0;
73
+ for (const group of allGroups) {
74
+ if (runningTotal + group.items.length <= MAX_BATCH_ITEMS) {
75
+ cappedGroups.push(group);
76
+ runningTotal += group.items.length;
77
+ }
78
+ else if (runningTotal === 0) {
79
+ // Always include at least one group, but cap its items
80
+ const cappedItems = group.items.slice(0, MAX_BATCH_ITEMS);
81
+ cappedGroups.push({ ...group, items: cappedItems });
82
+ runningTotal += cappedItems.length;
83
+ break;
84
+ }
85
+ else {
86
+ break;
87
+ }
88
+ }
89
+ totalItems = runningTotal;
90
+ // Mark excluded groups as skipped so they don't vanish from tracking
91
+ const cappedIds = new Set(cappedGroups.map((g) => g.id));
92
+ for (const group of allGroups) {
93
+ if (!cappedIds.has(group.id)) {
94
+ outcomes.push({
95
+ group: group.id,
96
+ status: 'skip',
97
+ step: 'execute',
98
+ reason: 'batch item cap exceeded',
99
+ });
100
+ }
101
+ }
102
+ log(`Capped batch from ${allGroups.reduce((s, g) => s + g.items.length, 0)} to ${totalItems} items (max ${MAX_BATCH_ITEMS}), ${allGroups.length - cappedGroups.length} groups deferred`);
103
+ }
104
+ log(`Batch-executing ${cappedGroups.length} groups (${totalItems} items) in one subprocess`);
105
+ const { autoCommit, iterationNum } = iterCtx;
106
+ const executePrompt = buildBatchExecutePrompt(cappedGroups, iterationNum);
107
+ // Resolve the effective model for the executor dispatch. The Spec 4 chain
108
+ // (complexity → budget pressure → tier) picks the right model; SONNET_MODEL
109
+ // remains the baseline if no profile is configured.
110
+ const evolveConfig = loadConfig(cwd);
111
+ const executeTier = getEffectiveTierForDispatch({
112
+ agentType: 'grd-executor',
113
+ prompt: executePrompt,
114
+ config: evolveConfig,
115
+ scheduler,
116
+ schedulerConfig: evolveConfig.scheduler,
117
+ superpowersConfig: evolveConfig.superpowers,
118
+ modelProfiles: MODEL_PROFILES,
119
+ });
120
+ const executeModel = resolveModelForAgent(evolveConfig, 'grd-executor', cwd, {
121
+ effectiveTierOverride: executeTier,
122
+ });
123
+ const execResult = scheduler
124
+ ? await scheduler.spawn(executePrompt, {
125
+ model: executeModel,
126
+ timeout: timeoutMs,
127
+ maxTurns,
128
+ cwd: executionCwd,
129
+ workItemId: `evolve-iter-${iterationNum}-execute`,
130
+ agentType: 'grd-executor',
131
+ })
132
+ : await spawnClaudeAsync(executionCwd, executePrompt, {
133
+ model: executeModel,
134
+ timeout: timeoutMs,
135
+ maxTurns,
136
+ captureStderr: true,
137
+ });
138
+ let feedback = null;
139
+ if (execResult.exitCode !== 0) {
140
+ const reason = execResult.timedOut ? 'timeout' : `exit ${execResult.exitCode}`;
141
+ log(`Batch execute FAILED (${reason})`);
142
+ if (execResult.stderr) {
143
+ const stderrTail = execResult.stderr.trim().split('\n').slice(-10).join('\n');
144
+ log(`Subprocess stderr (last 10 lines):\n${stderrTail}`);
145
+ }
146
+ for (const group of cappedGroups) {
147
+ outcomes.push({ group: group.id, status: 'fail', step: 'execute', reason });
148
+ }
149
+ }
150
+ else {
151
+ // Read feedback JSON written by the subprocess
152
+ const feedbackPath = path.join(executionCwd, '.planning', `evolve-iteration-${iterationNum}.json`);
153
+ try {
154
+ const raw = fs.readFileSync(feedbackPath, 'utf-8');
155
+ feedback = JSON.parse(raw);
156
+ fs.unlinkSync(feedbackPath);
157
+ log(`Read iteration feedback: ${(feedback.decisions || []).length} decisions, ${(feedback.patterns || []).length} patterns, ${(feedback.takeaways || []).length} takeaways`);
158
+ }
159
+ catch {
160
+ log(`No iteration feedback file found (subprocess may not have written it)`);
161
+ }
162
+ // Check if the subprocess actually changed source code files (not just markdown/docs)
163
+ const CODE_DIFF_FILTER = [
164
+ '--',
165
+ '*.ts',
166
+ '*.js',
167
+ '*.tsx',
168
+ '*.jsx',
169
+ '*.py',
170
+ '*.rs',
171
+ '*.go',
172
+ '*.java',
173
+ '*.json',
174
+ ];
175
+ const diffCheck = execGit(executionCwd, ['diff', '--stat', 'HEAD', ...CODE_DIFF_FILTER]);
176
+ const hasStagedChanges = execGit(executionCwd, [
177
+ 'diff',
178
+ '--cached',
179
+ '--stat',
180
+ ...CODE_DIFF_FILTER,
181
+ ]);
182
+ const hasCodeChanges = (diffCheck.stdout || '').trim().length > 0 ||
183
+ (hasStagedChanges.stdout || '').trim().length > 0;
184
+ if (!hasCodeChanges) {
185
+ // Discard non-code changes (markdown stubs, todo files, etc.)
186
+ // Only revert .planning/ and docs/ — avoid wiping user's uncommitted work
187
+ execGit(executionCwd, ['checkout', '--', '.planning/', 'docs/']);
188
+ execGit(executionCwd, ['clean', '-fd', '--', '.planning/', 'docs/']);
189
+ log(`Batch execute completed but NO source code changes were made — discarding markdown-only changes and marking as skip`);
190
+ for (const group of cappedGroups) {
191
+ outcomes.push({
192
+ group: group.id,
193
+ status: 'skip',
194
+ step: 'execute',
195
+ reason: 'no source code changes',
196
+ });
197
+ }
198
+ }
199
+ else {
200
+ log(`Batch execute completed (code changes detected)`);
201
+ log(`Running single review for all ${cappedGroups.length} groups`);
202
+ const reviewPrompt = buildBatchReviewPrompt(cappedGroups);
203
+ // Resolve the effective model for the reviewer dispatch, reusing the
204
+ // already-loaded evolveConfig (Spec 4 chain mirrors the execute dispatch).
205
+ const reviewTier = getEffectiveTierForDispatch({
206
+ agentType: 'grd-verifier',
207
+ prompt: reviewPrompt,
208
+ config: evolveConfig,
209
+ scheduler,
210
+ schedulerConfig: evolveConfig.scheduler,
211
+ superpowersConfig: evolveConfig.superpowers,
212
+ modelProfiles: MODEL_PROFILES,
213
+ });
214
+ const reviewModel = resolveModelForAgent(evolveConfig, 'grd-verifier', cwd, {
215
+ effectiveTierOverride: reviewTier,
216
+ });
217
+ const reviewResult = scheduler
218
+ ? await scheduler.spawn(reviewPrompt, {
219
+ model: reviewModel,
220
+ timeout: timeoutMs,
221
+ maxTurns,
222
+ cwd: executionCwd,
223
+ workItemId: `evolve-iter-${iterationNum}-review`,
224
+ agentType: 'grd-verifier',
225
+ })
226
+ : await spawnClaudeAsync(executionCwd, reviewPrompt, {
227
+ model: reviewModel,
228
+ timeout: timeoutMs,
229
+ maxTurns,
230
+ });
231
+ if (reviewResult.exitCode !== 0) {
232
+ const reason = reviewResult.timedOut ? 'timeout' : `exit ${reviewResult.exitCode}`;
233
+ log(`Batch review FAILED (${reason}) — execution changes kept`);
234
+ }
235
+ else {
236
+ log(`Batch review completed`);
237
+ }
238
+ for (const group of cappedGroups) {
239
+ outcomes.push({ group: group.id, status: 'pass' });
240
+ }
241
+ // Auto-commit if enabled
242
+ if (autoCommit) {
243
+ const themes = cappedGroups.map((g) => g.theme || g.id).join(', ');
244
+ const commitMsg = `evolve(iteration-${iterationNum}): ${themes}`;
245
+ execGit(executionCwd, ['add', '-A']);
246
+ const commitResult = execGit(executionCwd, ['commit', '-m', commitMsg]);
247
+ if (commitResult.exitCode === 0) {
248
+ log(`Auto-committed: ${commitMsg}`);
249
+ }
250
+ else {
251
+ log(`Auto-commit failed: ${(commitResult.stderr || '').trim()}`);
252
+ }
253
+ }
254
+ }
255
+ }
256
+ return {
257
+ discovery,
258
+ outcomes,
259
+ worktreeInfo,
260
+ executionCwd,
261
+ useWorktree,
262
+ isDryRun: false,
263
+ feedback,
264
+ };
265
+ }
266
+ /**
267
+ * Process the result of a single iteration step.
268
+ */
269
+ function _handleIterationResult(stepResult, prevState, iterNum, effectivePickPct, cwd) {
270
+ const { discovery, outcomes, feedback } = stepResult;
271
+ // Write evolution notes (always to original cwd)
272
+ writeEvolutionNotes(cwd, {
273
+ iteration: iterNum,
274
+ items: discovery.selected_groups.flatMap((g) => g.items),
275
+ outcomes: (outcomes || []).flatMap((o) => {
276
+ const group = discovery.selected_groups.find((g) => g.id === o.group);
277
+ if (!group)
278
+ return [{ item: o.group, status: o.status, step: o.step, reason: o.reason }];
279
+ return group.items.map((it) => ({
280
+ item: it.title,
281
+ status: o.status,
282
+ step: o.step,
283
+ reason: o.reason,
284
+ }));
285
+ }),
286
+ decisions: feedback?.decisions || [],
287
+ patterns: feedback?.patterns || [],
288
+ takeaways: feedback?.takeaways || [],
289
+ });
290
+ // Compute completed and failed groups
291
+ const milestone = prevState ? prevState.milestone : '';
292
+ const newlyCompleted = (outcomes || [])
293
+ .filter((o) => o.status === 'pass')
294
+ .map((o) => discovery.selected_groups.find((g) => g.id === o.group))
295
+ .filter((g) => g !== undefined)
296
+ .map((g) => ({ ...g, status: 'completed' }));
297
+ // Accumulate completed groups across iterations (for dedup in future discoveries)
298
+ const prevCompleted = prevState?.completed_groups || [];
299
+ const completedIds = new Set(prevCompleted.map((g) => g.id));
300
+ const completedGroups = [
301
+ ...prevCompleted,
302
+ ...newlyCompleted.filter((g) => !completedIds.has(g.id)),
303
+ ];
304
+ const newlyFailed = (outcomes || [])
305
+ .filter((o) => o.status === 'fail')
306
+ .map((o) => discovery.selected_groups.find((g) => g.id === o.group))
307
+ .filter((g) => g !== undefined)
308
+ .map((g) => ({ ...g, status: 'failed' }));
309
+ // Accumulate failed groups across iterations (like completed_groups)
310
+ const prevFailed = prevState?.failed_groups || [];
311
+ const failedIds = new Set(prevFailed.map((g) => g.id));
312
+ const failedGroups = [
313
+ ...prevFailed,
314
+ ...newlyFailed.filter((g) => !failedIds.has(g.id)),
315
+ ];
316
+ // Build new state
317
+ const historyEntry = {
318
+ iteration: iterNum,
319
+ timestamp: new Date().toISOString(),
320
+ selected_count: discovery.selected_groups.length,
321
+ completed_count: newlyCompleted.length,
322
+ failed_count: newlyFailed.length,
323
+ };
324
+ const newState = {
325
+ iteration: iterNum,
326
+ timestamp: new Date().toISOString(),
327
+ milestone,
328
+ pick_pct: effectivePickPct,
329
+ selected_groups: discovery.selected_groups,
330
+ remaining_groups: discovery.remaining_groups,
331
+ completed_groups: completedGroups,
332
+ failed_groups: failedGroups,
333
+ all_items_count: discovery.all_items_count,
334
+ groups_count: discovery.groups_count,
335
+ history: prevState ? [...(prevState.history || []), historyEntry] : [historyEntry],
336
+ };
337
+ const iterResult = {
338
+ iteration: iterNum,
339
+ status: 'completed',
340
+ groups_attempted: (outcomes || []).length,
341
+ groups_passed: newlyCompleted.length,
342
+ groups_failed: newlyFailed.length,
343
+ remaining_groups: discovery.remaining_groups.length,
344
+ };
345
+ return { newState, iterResult };
346
+ }
347
+ // ─── Todos Integration ───────────────────────────────────────────────────────
348
+ /**
349
+ * Create or append evolution notes to .planning/EVOLUTION.md.
350
+ */
351
+ function writeEvolutionNotes(cwd, iterationData) {
352
+ const filePath = path.join(cwd, '.planning', 'EVOLUTION.md');
353
+ const { iteration, items, outcomes, decisions, patterns, takeaways } = iterationData;
354
+ // Create file with header if it doesn't exist
355
+ if (!fs.existsSync(filePath)) {
356
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
357
+ fs.writeFileSync(filePath, '# Evolution Notes\n\n');
358
+ }
359
+ const lines = [];
360
+ lines.push(`## Iteration ${iteration}`);
361
+ lines.push(`_${new Date().toISOString()}_\n`);
362
+ // Items Attempted
363
+ lines.push('### Items Attempted\n');
364
+ if (items.length === 0) {
365
+ lines.push('None\n');
366
+ }
367
+ else {
368
+ for (let i = 0; i < items.length; i++) {
369
+ const item = items[i];
370
+ process.stderr.write(`[evolve] Writing item ${i + 1}/${items.length}: ${item.title}\n`);
371
+ const outcome = outcomes.find((o) => o.item === item.title);
372
+ const status = outcome ? outcome.status : 'unknown';
373
+ lines.push(`- **${item.title}** — ${status}`);
374
+ }
375
+ lines.push('');
376
+ }
377
+ // Decisions Made
378
+ lines.push('### Decisions Made\n');
379
+ if (decisions.length === 0) {
380
+ lines.push('None\n');
381
+ }
382
+ else {
383
+ for (let i = 0; i < decisions.length; i++) {
384
+ process.stderr.write(`[evolve] Writing decision ${i + 1}/${decisions.length}\n`);
385
+ lines.push(`- ${decisions[i]}`);
386
+ }
387
+ lines.push('');
388
+ }
389
+ // Patterns Discovered
390
+ lines.push('### Patterns Discovered\n');
391
+ if (patterns.length === 0) {
392
+ lines.push('None\n');
393
+ }
394
+ else {
395
+ for (let i = 0; i < patterns.length; i++) {
396
+ process.stderr.write(`[evolve] Writing pattern ${i + 1}/${patterns.length}\n`);
397
+ lines.push(`- ${patterns[i]}`);
398
+ }
399
+ lines.push('');
400
+ }
401
+ // Takeaways
402
+ lines.push('### Takeaways\n');
403
+ if (takeaways.length === 0) {
404
+ lines.push('None\n');
405
+ }
406
+ else {
407
+ for (let i = 0; i < takeaways.length; i++) {
408
+ process.stderr.write(`[evolve] Writing takeaway ${i + 1}/${takeaways.length}\n`);
409
+ lines.push(`- ${takeaways[i]}`);
410
+ }
411
+ lines.push('');
412
+ }
413
+ lines.push('---\n');
414
+ fs.appendFileSync(filePath, lines.join('\n'));
415
+ }
416
+ // ─── Main Orchestrator ──────────────────────────────────────────────────────
417
+ /**
418
+ * Main evolve orchestration loop.
419
+ */
420
+ async function runEvolve(cwd, options = {}) {
421
+ const { iterations = 1, pickPct, timeout, maxTurns, dryRun = false, autoCommit = true, createPr = true, } = options;
422
+ const effectivePickPct = pickPct !== undefined ? pickPct : DEFAULT_PICK_PCT;
423
+ const DEFAULT_TIMEOUT_MINUTES = 180;
424
+ const timeoutMs = timeout ? timeout * 60 * 1000 : DEFAULT_TIMEOUT_MINUTES * 60 * 1000;
425
+ const unlimited = iterations === 0;
426
+ // Auto-detect worktree usage from config if not explicitly set
427
+ let useWorktree = options.useWorktree !== undefined ? options.useWorktree : false;
428
+ const evolveConfig = loadConfig(cwd);
429
+ if (options.useWorktree === undefined) {
430
+ useWorktree = evolveConfig.branching_strategy !== 'none';
431
+ }
432
+ const evolveScheduler = createScheduler(evolveConfig.scheduler);
433
+ if (evolveScheduler) {
434
+ evolveScheduler.loadPersistedState(path.join(cwd, '.planning'));
435
+ }
436
+ // Set up logging (same pattern as autopilot.js)
437
+ const logFile = path.join(cwd, '.planning', 'autopilot', 'evolve.log');
438
+ fs.mkdirSync(path.dirname(logFile), { recursive: true });
439
+ const log = (msg) => {
440
+ const line = `[${new Date().toISOString()}] ${msg}\n`;
441
+ process.stderr.write(`[evolve] ${msg}\n`);
442
+ fs.appendFileSync(logFile, line);
443
+ };
444
+ // Discovery runs on executionCwd so it sees evolved code after each iteration.
445
+ // On the first iteration (before worktree exists), this equals cwd.
446
+ let executionCwd = cwd;
447
+ let worktreeInfo = null;
448
+ const results = [];
449
+ let state = readEvolveState(cwd);
450
+ let iterCount = 0;
451
+ while (unlimited || iterCount < iterations) {
452
+ const iterNum = state ? state.iteration + 1 : 1;
453
+ log(`Starting iteration ${iterNum}`);
454
+ const stepResult = await _runIterationStep({
455
+ executionCwd,
456
+ state,
457
+ useWorktree,
458
+ worktreeInfo,
459
+ effectivePickPct,
460
+ dryRun,
461
+ timeoutMs,
462
+ maxTurns,
463
+ cwd,
464
+ log,
465
+ autoCommit,
466
+ iterationNum: iterNum,
467
+ scheduler: evolveScheduler,
468
+ });
469
+ // Propagate mutable worktree state back from the step
470
+ useWorktree = stepResult.useWorktree;
471
+ worktreeInfo = stepResult.worktreeInfo;
472
+ executionCwd = stepResult.executionCwd;
473
+ if (stepResult.isDryRun) {
474
+ const { discovery } = stepResult;
475
+ const groupsPerIter = discovery.selected_groups.length;
476
+ results.push({
477
+ iteration: iterNum,
478
+ status: 'dry-run',
479
+ groups: discovery.groups.map((g) => ({
480
+ id: g.id,
481
+ priority: g.priority,
482
+ item_count: g.items.length,
483
+ effort: g.effort,
484
+ })),
485
+ total_items: discovery.all_items_count,
486
+ total_groups: discovery.groups_count,
487
+ groups_per_iteration: groupsPerIter,
488
+ estimated_iterations: groupsPerIter > 0 ? Math.ceil(discovery.groups_count / groupsPerIter) : 0,
489
+ });
490
+ break; // dry-run always exits after one iteration
491
+ }
492
+ if (stepResult.outcomes === null) {
493
+ log('No groups to process. Done.');
494
+ break;
495
+ }
496
+ const { newState, iterResult } = _handleIterationResult(stepResult, state, iterNum, effectivePickPct, cwd);
497
+ state = newState;
498
+ writeEvolveState(cwd, state);
499
+ results.push(iterResult);
500
+ iterCount++;
501
+ }
502
+ // Post-loop: push + PR + cleanup if worktree was used
503
+ let prInfo = null;
504
+ if (worktreeInfo) {
505
+ // Check if there are any commits on the worktree branch
506
+ const logResult = execGit(worktreeInfo.path, [
507
+ 'log',
508
+ `${worktreeInfo.baseBranch}..HEAD`,
509
+ '--oneline',
510
+ ]);
511
+ const hasCommits = logResult.exitCode === 0 && logResult.stdout.trim().length > 0;
512
+ if (hasCommits && createPr) {
513
+ log(`Pushing worktree branch and creating PR...`);
514
+ prInfo = pushAndCreatePR(cwd, worktreeInfo.path, {
515
+ base: worktreeInfo.baseBranch,
516
+ });
517
+ if (prInfo.error) {
518
+ log(`PR creation failed: ${prInfo.error}`);
519
+ }
520
+ else {
521
+ log(`PR created: ${prInfo.pr_url}`);
522
+ }
523
+ }
524
+ else if (!hasCommits) {
525
+ log('No commits on worktree branch, skipping PR.');
526
+ }
527
+ else {
528
+ log('PR creation disabled via config.');
529
+ }
530
+ // Clean up worktree
531
+ const removeResult = removeEvolveWorktree(cwd, worktreeInfo.path);
532
+ log(`Worktree cleanup: ${removeResult.removed ? 'removed' : 'failed'}`);
533
+ }
534
+ log(`Done: ${results.length} iteration(s) completed`);
535
+ if (evolveScheduler) {
536
+ evolveScheduler.persistState(path.join(cwd, '.planning'));
537
+ }
538
+ const returnValue = {
539
+ iterations_completed: results.length,
540
+ results,
541
+ evolution_notes_path: path.join('.planning', 'EVOLUTION.md'),
542
+ };
543
+ if (worktreeInfo) {
544
+ returnValue.worktree = { path: worktreeInfo.path, branch: worktreeInfo.branch };
545
+ }
546
+ if (prInfo && !prInfo.error) {
547
+ returnValue.pr = prInfo;
548
+ }
549
+ return returnValue;
550
+ }
551
+ /**
552
+ * Write discovered groups as todo files into .planning/milestones/anonymous/todos/pending/.
553
+ */
554
+ function writeDiscoveriesToTodos(cwd, groups) {
555
+ if (!groups || groups.length === 0)
556
+ return 0;
557
+ const pendingDir = path.join(cwd, '.planning', 'milestones', 'anonymous', 'todos', 'pending');
558
+ fs.mkdirSync(pendingDir, { recursive: true });
559
+ // Get existing files to support idempotency
560
+ let existingFiles;
561
+ try {
562
+ existingFiles = new Set(fs.readdirSync(pendingDir));
563
+ }
564
+ catch {
565
+ existingFiles = new Set();
566
+ }
567
+ let created = 0;
568
+ const now = new Date().toISOString();
569
+ for (const group of groups) {
570
+ // Derive a stable filename from the group id (replace / with -)
571
+ const idSlug = group.id.replace(/\//g, '-').replace(/[^a-z0-9-]/gi, '-');
572
+ const filename = `evolve-${idSlug}.md`;
573
+ if (existingFiles.has(filename)) {
574
+ continue; // Already exists — skip
575
+ }
576
+ const itemCount = Array.isArray(group.items) ? group.items.length : 0;
577
+ const itemList = Array.isArray(group.items)
578
+ ? group.items.map((i) => `- **${i.title}**: ${i.description}`).join('\n')
579
+ : '';
580
+ const content = [
581
+ '---',
582
+ `title: "${group.theme || group.id}"`,
583
+ `created: "${now}"`,
584
+ `area: "${group.dimension || 'unknown'}"`,
585
+ `source: evolve-discovery`,
586
+ '---',
587
+ '',
588
+ `## ${group.theme || group.id}`,
589
+ '',
590
+ `**${itemCount} item${itemCount !== 1 ? 's' : ''}** discovered by evolve loop.`,
591
+ '',
592
+ itemList,
593
+ ].join('\n');
594
+ fs.writeFileSync(path.join(pendingDir, filename), content + '\n');
595
+ existingFiles.add(filename);
596
+ created++;
597
+ }
598
+ return created;
599
+ }
600
+ // ─── Infinite Evolve Loop ────────────────────────────────────────────────────
601
+ /**
602
+ * Run the infinite evolve loop: discover -> autoplan -> autopilot -> repeat.
603
+ *
604
+ * Each cycle:
605
+ * 1. Discover improvements via evolve's discovery engine
606
+ * 2. Create a milestone from discoveries via autoplan
607
+ * 3. Execute all phases in that milestone via autopilot
608
+ * 4. Repeat until maxCycles reached, time budget exhausted, or no discoveries remain
609
+ *
610
+ * Safety: maxCycles cap (default 10), optional timeBudget, dry-run preview.
611
+ */
612
+ async function runInfiniteEvolve(cwd, options = {}) {
613
+ const maxCycles = options.maxCycles ?? 10;
614
+ const timeBudget = options.timeBudget ?? 0; // 0 = unlimited
615
+ const effectivePickPct = options.pickPct ?? DEFAULT_PICK_PCT;
616
+ const dryRun = options.dryRun ?? false;
617
+ const maxTurns = options.maxTurns;
618
+ const model = options.model;
619
+ const maxMilestones = options.maxMilestones ?? 1;
620
+ // Set up logging
621
+ const logFile = path.join(cwd, '.planning', 'autopilot', 'infinite-evolve.log');
622
+ fs.mkdirSync(path.dirname(logFile), { recursive: true });
623
+ const log = (msg) => {
624
+ const line = `[${new Date().toISOString()}] ${msg}\n`;
625
+ process.stderr.write(`[infinite-evolve] ${msg}\n`);
626
+ fs.appendFileSync(logFile, line);
627
+ };
628
+ const startTime = Date.now();
629
+ const cycleResults = [];
630
+ let totalGroupsDiscovered = 0;
631
+ let totalItemsDiscovered = 0;
632
+ let stoppedAt = null;
633
+ // Cached once per evolve invocation; auto_genome_snapshot is opt-in
634
+ // and read inside the cycle loop below (Tier-2 #8 follow-up).
635
+ const evolveConfig = loadConfig(cwd);
636
+ log(`Starting infinite evolve loop: maxCycles=${maxCycles}, timeBudget=${timeBudget}min, pickPct=${effectivePickPct}, dryRun=${dryRun}`);
637
+ for (let cycle = 0; cycle < maxCycles; cycle++) {
638
+ // Check time budget
639
+ if (timeBudget > 0) {
640
+ const elapsedMs = Date.now() - startTime;
641
+ if (elapsedMs > timeBudget * 60 * 1000) {
642
+ stoppedAt = `Time budget exhausted (${Math.round(elapsedMs / 60000)}min of ${timeBudget}min)`;
643
+ log(stoppedAt);
644
+ break;
645
+ }
646
+ }
647
+ log(`=== Cycle ${cycle + 1}/${maxCycles} ===`);
648
+ // Step 1: Discovery
649
+ log('Step 1: Running discovery...');
650
+ const state = readEvolveState(cwd);
651
+ let discovery;
652
+ try {
653
+ const infiniteTimeoutMs = options.timeout
654
+ ? options.timeout * 60 * 1000
655
+ : undefined;
656
+ discovery = await runGroupDiscovery(cwd, state, effectivePickPct, {
657
+ timeoutMs: infiniteTimeoutMs,
658
+ });
659
+ }
660
+ catch (err) {
661
+ const reason = `Discovery failed: ${err.message}`;
662
+ log(reason);
663
+ cycleResults.push({
664
+ cycle: cycle + 1,
665
+ discovery_groups: 0,
666
+ discovery_items: 0,
667
+ autoplan_status: 'skipped',
668
+ autopilot_status: 'skipped',
669
+ reason,
670
+ });
671
+ stoppedAt = reason;
672
+ break;
673
+ }
674
+ const groupCount = discovery.selected_groups.length;
675
+ const itemCount = discovery.selected_groups.reduce((sum, g) => sum + g.items.length, 0);
676
+ totalGroupsDiscovered += groupCount;
677
+ totalItemsDiscovered += itemCount;
678
+ log(`Discovered ${groupCount} groups (${itemCount} items)`);
679
+ if (groupCount === 0) {
680
+ stoppedAt = 'No improvements discovered';
681
+ log(stoppedAt);
682
+ cycleResults.push({
683
+ cycle: cycle + 1,
684
+ discovery_groups: 0,
685
+ discovery_items: 0,
686
+ autoplan_status: 'skipped',
687
+ autopilot_status: 'skipped',
688
+ reason: stoppedAt,
689
+ });
690
+ break;
691
+ }
692
+ if (dryRun) {
693
+ log(`[DRY RUN] Would create milestone from ${groupCount} groups (${itemCount} items)`);
694
+ cycleResults.push({
695
+ cycle: cycle + 1,
696
+ discovery_groups: groupCount,
697
+ discovery_items: itemCount,
698
+ autoplan_status: 'dry-run',
699
+ autopilot_status: 'dry-run',
700
+ });
701
+ // Dry run exits after one cycle to show what would happen
702
+ break;
703
+ }
704
+ // Step 2: Autoplan -- create milestone from discoveries
705
+ log('Step 2: Running autoplan...');
706
+ const autoplanGroups = discovery.selected_groups.map((g) => ({
707
+ id: g.id,
708
+ theme: g.theme,
709
+ dimension: g.dimension,
710
+ items: g.items.map((item) => ({
711
+ title: item.title,
712
+ description: item.description,
713
+ effort: item.effort,
714
+ })),
715
+ priority: g.priority,
716
+ effort: g.effort,
717
+ }));
718
+ let autoplanResult;
719
+ try {
720
+ autoplanResult = await runAutoplan(cwd, {
721
+ groups: autoplanGroups,
722
+ dryRun: false,
723
+ timeout: options.timeout,
724
+ maxTurns,
725
+ model,
726
+ });
727
+ }
728
+ catch (err) {
729
+ const reason = `Autoplan failed: ${err.message}`;
730
+ log(reason);
731
+ cycleResults.push({
732
+ cycle: cycle + 1,
733
+ discovery_groups: groupCount,
734
+ discovery_items: itemCount,
735
+ autoplan_status: 'failed',
736
+ autopilot_status: 'skipped',
737
+ reason,
738
+ });
739
+ continue; // Try next cycle
740
+ }
741
+ if (autoplanResult.status === 'failed') {
742
+ const reason = `Autoplan failed: ${autoplanResult.reason || 'unknown'}`;
743
+ log(reason);
744
+ cycleResults.push({
745
+ cycle: cycle + 1,
746
+ discovery_groups: groupCount,
747
+ discovery_items: itemCount,
748
+ autoplan_status: 'failed',
749
+ autopilot_status: 'skipped',
750
+ reason,
751
+ });
752
+ continue; // Try next cycle
753
+ }
754
+ log(`Autoplan completed: milestone "${autoplanResult.milestone_name}" (${autoplanResult.groups_count} groups, ${autoplanResult.items_count} items)`);
755
+ // Step 3: Autopilot -- execute newly created milestone phases
756
+ log('Step 3: Running multi-milestone autopilot...');
757
+ let autopilotResult;
758
+ try {
759
+ autopilotResult = await runMultiMilestoneAutopilot(cwd, {
760
+ dryRun: false,
761
+ timeout: options.timeout,
762
+ maxTurns,
763
+ model,
764
+ maxMilestones,
765
+ });
766
+ }
767
+ catch (err) {
768
+ const reason = `Autopilot failed: ${err.message}`;
769
+ log(reason);
770
+ cycleResults.push({
771
+ cycle: cycle + 1,
772
+ discovery_groups: groupCount,
773
+ discovery_items: itemCount,
774
+ autoplan_status: 'completed',
775
+ autopilot_status: 'failed',
776
+ reason,
777
+ });
778
+ continue; // Try next cycle
779
+ }
780
+ // codex r4 P2 on PR #40 (Tier-3 #10): multi-milestone autopilot now
781
+ // exposes `converged_at` for graceful convergence. Map convergence
782
+ // to a distinct 'converged' status so evolve does not classify it
783
+ // as a failed run.
784
+ const autopilotStatus = autopilotResult.stopped_at
785
+ ? 'failed'
786
+ : autopilotResult.converged_at
787
+ ? 'converged'
788
+ : 'completed';
789
+ if (autopilotResult.stopped_at) {
790
+ log(`Autopilot stopped: ${autopilotResult.stopped_at} (${autopilotResult.milestones_completed}/${autopilotResult.milestones_attempted} milestones)`);
791
+ }
792
+ else if (autopilotResult.converged_at) {
793
+ log(`Autopilot converged early: ${autopilotResult.converged_at} (${autopilotResult.milestones_completed}/${autopilotResult.milestones_attempted} milestones)`);
794
+ }
795
+ else {
796
+ log(`Autopilot completed: ${autopilotResult.milestones_completed} milestones, ${autopilotResult.total_phases_completed} phases`);
797
+ }
798
+ cycleResults.push({
799
+ cycle: cycle + 1,
800
+ discovery_groups: groupCount,
801
+ discovery_items: itemCount,
802
+ autoplan_status: 'completed',
803
+ autopilot_status: autopilotStatus,
804
+ reason: autopilotResult.stopped_at ?? autopilotResult.converged_at ?? undefined,
805
+ });
806
+ // Tier-2 #8 auto-genome follow-up: append a deterministic snapshot
807
+ // to .planning/GENOME.md at the end of each successful cycle, if
808
+ // the user opted in via config.evolve.auto_genome_snapshot. Append-
809
+ // only; split-index files are surfaced via warning and skipped.
810
+ if (evolveConfig.evolve?.auto_genome_snapshot === true &&
811
+ (autopilotStatus === 'completed' || autopilotStatus === 'converged')) {
812
+ try {
813
+ const snap = runGenomeSnapshot(cwd);
814
+ log(`Genome snapshot ${snap.action} for cycle ${cycle + 1}: ${snap.path}`);
815
+ }
816
+ catch (err) {
817
+ if (err instanceof GenomeSplitIndexError) {
818
+ log(`Genome snapshot skipped (split-index): ${err.message}`);
819
+ }
820
+ else {
821
+ log(`Genome snapshot failed (non-blocking): ${String(err)}`);
822
+ }
823
+ }
824
+ }
825
+ }
826
+ // Summary — codex r5 P2 on PR #40: a graceful 'converged' cycle is
827
+ // SUCCESSFUL (the autopilot intentionally stopped early because the
828
+ // project's ontology stabilised). Count it toward cycles_completed
829
+ // alongside 'completed'. Failure / skipped / dry-run are still excluded.
830
+ const cyclesCompleted = cycleResults.filter((c) => c.autoplan_status === 'completed' &&
831
+ (c.autopilot_status === 'completed' || c.autopilot_status === 'converged')).length;
832
+ log(`Infinite evolve done: ${cyclesCompleted}/${cycleResults.length} cycles completed, ${totalGroupsDiscovered} groups, ${totalItemsDiscovered} items`);
833
+ return {
834
+ cycles_completed: cyclesCompleted,
835
+ cycles_attempted: cycleResults.length,
836
+ stopped_at: stoppedAt,
837
+ cycle_results: cycleResults,
838
+ total_groups_discovered: totalGroupsDiscovered,
839
+ total_items_discovered: totalItemsDiscovered,
840
+ };
841
+ }
842
+ // ─── Exports ────────────────────────────────────────────────────────────────
843
+ module.exports = {
844
+ _runIterationStep,
845
+ _handleIterationResult,
846
+ writeEvolutionNotes,
847
+ writeDiscoveriesToTodos,
848
+ runEvolve,
849
+ runInfiniteEvolve,
850
+ };
851
+ //# sourceMappingURL=orchestrator.js.map