@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,1179 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * GRD Autopilot/Pipeline -- Per-phase pipeline: spawn infrastructure,
5
+ * status markers, post-phase pipeline (simplify → PR → review → rebase/merge),
6
+ * knowledge mining, and refinement loop.
7
+ *
8
+ * Extracted from lib/autopilot.ts as part of the post-gsd-2 decomposition.
9
+ *
10
+ * Depends on: autopilot-waves (for atomicWriteFileSync), phase-complete,
11
+ * refinement, knowledge, worktree, and utils.
12
+ */
13
+
14
+ import type {
15
+ GrdConfig,
16
+ CritiqueBranch,
17
+ RefinementMetrics,
18
+ MetricSnapshot,
19
+ MinimaRegion,
20
+ ConvergenceConfig,
21
+ PhaseInfo,
22
+ MilestoneInfo,
23
+ PhaseCompleteResult,
24
+ } from './types';
25
+ import type { Scheduler } from './scheduler';
26
+
27
+ const fs = require('fs');
28
+ const path = require('path');
29
+ const childProcess = require('child_process') as typeof import('child_process');
30
+ const {
31
+ execGit,
32
+ getMilestoneInfo,
33
+ findPhaseInternal,
34
+ loadConfig,
35
+ resolveModelForAgent,
36
+ MODEL_PROFILES: _MODEL_PROFILES_FOR_REFINEMENT,
37
+ }: {
38
+ execGit: (
39
+ cwd: string,
40
+ args: string[],
41
+ opts?: { allowBlocked?: boolean }
42
+ ) => import('./types').ExecGitResult;
43
+ getMilestoneInfo: (cwd: string) => MilestoneInfo;
44
+ findPhaseInternal: (cwd: string, phase: string) => PhaseInfo | null;
45
+ loadConfig: (cwd: string) => GrdConfig;
46
+ resolveModelForAgent: (
47
+ config: GrdConfig,
48
+ agentType: string,
49
+ cwd?: string,
50
+ options?: { effectiveTierOverride?: 'opus' | 'sonnet' | 'haiku' }
51
+ ) => string;
52
+ MODEL_PROFILES: Record<string, Record<string, string>>;
53
+ } = require('./utils');
54
+ const {
55
+ getEffectiveTierForDispatch,
56
+ }: {
57
+ getEffectiveTierForDispatch: (opts: {
58
+ agentType: string;
59
+ prompt: string;
60
+ config: GrdConfig;
61
+ scheduler: unknown;
62
+ schedulerConfig?: GrdConfig['scheduler'];
63
+ superpowersConfig?: GrdConfig['superpowers'];
64
+ modelProfiles: Record<string, Record<string, string>>;
65
+ retry_attempt?: number;
66
+ }) => 'opus' | 'sonnet' | 'haiku';
67
+ } = require('./backend');
68
+ const {
69
+ pushAndCreatePR,
70
+ }: {
71
+ pushAndCreatePR: (
72
+ cwd: string,
73
+ wtPath: string,
74
+ options?: { title?: string; body?: string; base?: string }
75
+ ) =>
76
+ | { pr_url: string; branch: string; base: string }
77
+ | { error: string; push_succeeded?: boolean };
78
+ } = require('./worktree');
79
+ const { completePhaseAfterPostPipeline } = require('./phase-complete') as {
80
+ completePhaseAfterPostPipeline: (
81
+ cwd: string,
82
+ phaseNum: string,
83
+ scheduler?: Scheduler | null
84
+ ) => Promise<PhaseCompleteResult | null>;
85
+ };
86
+ const {
87
+ collectMetrics: _collectMetrics,
88
+ checkConvergence: _checkConvergence,
89
+ classifyBranch: _classifyBranch,
90
+ detectMinima: _detectMinima,
91
+ buildCritiquePrompt: _buildCritiquePromptFn,
92
+ }: {
93
+ collectMetrics: (testOutput: string, tscOutput: string, lintOutput: string) => RefinementMetrics;
94
+ checkConvergence: (
95
+ snapshots: MetricSnapshot[],
96
+ config: ConvergenceConfig
97
+ ) => { converged: boolean; reason: string };
98
+ classifyBranch: (current: RefinementMetrics, targets: RefinementMetrics) => CritiqueBranch;
99
+ detectMinima: (snapshots: MetricSnapshot[]) => MinimaRegion[];
100
+ buildCritiquePrompt: (
101
+ branch: CritiqueBranch,
102
+ metrics: RefinementMetrics,
103
+ targets: RefinementMetrics,
104
+ minimaRegions: MinimaRegion[]
105
+ ) => string;
106
+ } = require('./refinement');
107
+ const {
108
+ atomicWriteFileSync,
109
+ }: {
110
+ atomicWriteFileSync: (filePath: string, data: string) => void;
111
+ } = require('./autopilot-waves');
112
+
113
+ // ─── Domain Types ───────────────────────────────────────────────────────────
114
+
115
+ /** Shared options for spawnClaude/spawnClaudeAsync. */
116
+ interface SpawnOptions {
117
+ timeout?: number;
118
+ maxTurns?: number;
119
+ model?: string;
120
+ outputFormat?: string;
121
+ captureOutput?: boolean;
122
+ captureStderr?: boolean;
123
+ /** Agent type hint for complexity-based tier routing (M2). */
124
+ agentType?: string;
125
+ }
126
+
127
+ /** Result from subprocess execution. */
128
+ interface SpawnResult {
129
+ exitCode: number;
130
+ timedOut: boolean;
131
+ stdout?: string;
132
+ stderr?: string;
133
+ }
134
+
135
+ /** Normalize SchedulerSpawnResult to SpawnResult for drop-in compatibility. */
136
+ function toSpawnResult(sr: {
137
+ exitCode: number;
138
+ timedOut: boolean;
139
+ stdout?: string;
140
+ stderr?: string;
141
+ }): SpawnResult {
142
+ return { exitCode: sr.exitCode, timedOut: sr.timedOut, stdout: sr.stdout, stderr: sr.stderr };
143
+ }
144
+
145
+ /** Internal config from _buildSpawnConfig. */
146
+ interface SpawnConfig {
147
+ args: string[];
148
+ env: Record<string, string | undefined>;
149
+ }
150
+
151
+ /** Written to autopilot directory for tracking progress. */
152
+ interface StatusMarker {
153
+ phase: string;
154
+ step: string;
155
+ status: string;
156
+ timestamp: string;
157
+ }
158
+
159
+ /** Result from a post-phase pipeline run. */
160
+ interface PostPipelineResult {
161
+ status: 'completed' | 'failed';
162
+ failedStep?: string;
163
+ prUrl?: string;
164
+ reason?: string;
165
+ }
166
+
167
+ // ─── Status Markers ───────────────────────────────────────────────────────────
168
+
169
+ const AUTOPILOT_DIR = 'autopilot';
170
+
171
+ /**
172
+ * Write a status marker JSON file for tracking autopilot progress.
173
+ */
174
+ function writeStatusMarker(cwd: string, phaseNum: string, step: string, status: string): void {
175
+ const dir: string = path.join(cwd, '.planning', AUTOPILOT_DIR);
176
+ fs.mkdirSync(dir, { recursive: true });
177
+ const marker: StatusMarker = {
178
+ phase: phaseNum,
179
+ step,
180
+ status,
181
+ timestamp: new Date().toISOString(),
182
+ };
183
+ const filename: string = `phase-${phaseNum}-${step}.json`;
184
+ atomicWriteFileSync(path.join(dir, filename), JSON.stringify(marker, null, 2));
185
+ }
186
+
187
+ /**
188
+ * Update STATE.md current phase and status fields.
189
+ */
190
+ function updateStateProgress(cwd: string, phaseNum: string, step: string): void {
191
+ const statePath: string = path.join(cwd, '.planning', 'STATE.md');
192
+ if (!fs.existsSync(statePath)) return;
193
+
194
+ // Use synchronous file locking for safe concurrent access under parallel execution.
195
+ // Lock file prevents races when multiple phases update STATE.md concurrently.
196
+ const lockPath: string = `${statePath}.lock`;
197
+ const maxRetries = 50;
198
+ let lockAcquired = false;
199
+ for (let i = 0; i < maxRetries; i++) {
200
+ try {
201
+ const fd: number = fs.openSync(
202
+ lockPath,
203
+ fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY
204
+ );
205
+ fs.closeSync(fd);
206
+ lockAcquired = true;
207
+ break;
208
+ } catch (e) {
209
+ if ((e as NodeJS.ErrnoException).code === 'EEXIST') {
210
+ // Check for stale lock (older than 30 seconds)
211
+ try {
212
+ const stat = fs.statSync(lockPath);
213
+ if (Date.now() - stat.mtimeMs > 30000) {
214
+ fs.unlinkSync(lockPath);
215
+ continue;
216
+ }
217
+ } catch (statErr) {
218
+ if ((statErr as NodeJS.ErrnoException).code !== 'ENOENT') throw statErr;
219
+ // Lock file gone between check — retry
220
+ }
221
+ // Brief synchronous wait
222
+ const start = Date.now();
223
+ while (Date.now() - start < 10) {
224
+ /* spin */
225
+ }
226
+ continue;
227
+ }
228
+ throw e;
229
+ }
230
+ }
231
+
232
+ if (!lockAcquired) {
233
+ process.stderr.write(
234
+ `[autopilot] Warning: failed to acquire lock on ${statePath} after ${maxRetries} retries, skipping state update\n`
235
+ );
236
+ return;
237
+ }
238
+
239
+ try {
240
+ let content: string = fs.readFileSync(statePath, 'utf-8');
241
+
242
+ // Update Current Phase field
243
+ content = content.replace(
244
+ /(\*\*Current Phase:\*\*)\s*[^\n]*/,
245
+ `$1 Phase ${phaseNum} (autopilot: ${step})`
246
+ );
247
+
248
+ atomicWriteFileSync(statePath, content);
249
+ } finally {
250
+ try {
251
+ fs.unlinkSync(lockPath);
252
+ } catch (unlockErr) {
253
+ // Only ENOENT is expected (lock already removed); other errors indicate
254
+ // a real problem but we cannot throw from finally — log instead.
255
+ if ((unlockErr as NodeJS.ErrnoException).code !== 'ENOENT') {
256
+ process.stderr.write(
257
+ `[autopilot] Warning: failed to release lock ${lockPath}: ${(unlockErr as Error).message}\n`
258
+ );
259
+ }
260
+ }
261
+ }
262
+ }
263
+
264
+ // ─── Spawn Infrastructure ─────────────────────────────────────────────────────
265
+
266
+ /**
267
+ * Build the shared spawn configuration for `claude -p` invocations.
268
+ * Returns the args array and sanitized env object used by both the sync
269
+ * and async spawn helpers.
270
+ */
271
+ function _buildSpawnConfig(prompt: string, opts: SpawnOptions = {}): SpawnConfig {
272
+ const args: string[] = ['-p', prompt, '--verbose', '--dangerously-skip-permissions'];
273
+ if (opts.maxTurns) {
274
+ args.push('--max-turns', String(opts.maxTurns));
275
+ }
276
+ if (opts.model) {
277
+ args.push('--model', opts.model);
278
+ }
279
+ if (opts.outputFormat) {
280
+ args.push('--output-format', opts.outputFormat);
281
+ }
282
+
283
+ const env: Record<string, string | undefined> = { ...process.env };
284
+ // Strip ALL Claude Code env vars to prevent nested-session detection.
285
+ // Uses prefix match so future env vars are automatically handled.
286
+ for (const key of Object.keys(env)) {
287
+ if (key === 'CLAUDECODE' || key.startsWith('CLAUDE_CODE_') || key.startsWith('CLAUDECODE_')) {
288
+ delete env[key];
289
+ }
290
+ }
291
+
292
+ return { args, env };
293
+ }
294
+
295
+ /**
296
+ * Spawn a `claude -p` subprocess synchronously.
297
+ */
298
+ function spawnClaude(cwd: string, prompt: string, opts: SpawnOptions = {}): SpawnResult {
299
+ const { args, env } = _buildSpawnConfig(prompt, opts);
300
+ const timeout: number | undefined = opts.timeout;
301
+
302
+ const spawnOpts: {
303
+ cwd: string;
304
+ stdio: 'pipe';
305
+ env: Record<string, string | undefined>;
306
+ encoding: 'utf-8';
307
+ timeout?: number;
308
+ } = {
309
+ cwd,
310
+ stdio: 'pipe',
311
+ env,
312
+ encoding: 'utf-8',
313
+ };
314
+ if (timeout) {
315
+ spawnOpts.timeout = timeout;
316
+ }
317
+
318
+ const result = childProcess.spawnSync('claude', args, spawnOpts);
319
+
320
+ // Print subprocess output so callers (Claude Code TUI, terminal) can see it
321
+ if (result.stdout) process.stdout.write(result.stdout as string);
322
+ if (result.stderr) process.stderr.write(result.stderr as string);
323
+
324
+ const timedOut: boolean = !!(
325
+ result.error && (result.error as NodeJS.ErrnoException).code === 'ETIMEDOUT'
326
+ );
327
+ const exitCode: number = timedOut ? 124 : (result.status ?? 1);
328
+
329
+ return { exitCode, timedOut };
330
+ }
331
+
332
+ /**
333
+ * Spawn a `claude -p` subprocess asynchronously (non-blocking).
334
+ * Used for parallel planning where multiple processes run concurrently.
335
+ */
336
+ function spawnClaudeAsync(
337
+ cwd: string,
338
+ prompt: string,
339
+ opts: SpawnOptions = {}
340
+ ): Promise<SpawnResult> {
341
+ const { args, env } = _buildSpawnConfig(prompt, opts);
342
+ const timeout: number | undefined = opts.timeout;
343
+ const captureOutput: boolean = opts.captureOutput || false;
344
+ const captureStderr: boolean = opts.captureStderr || false;
345
+
346
+ return new Promise<SpawnResult>((resolve) => {
347
+ const child = childProcess.spawn('claude', args, {
348
+ cwd,
349
+ stdio: ['ignore', 'pipe', 'pipe'],
350
+ env,
351
+ });
352
+
353
+ let stdoutBuf: string = '';
354
+ let stderrBuf: string = '';
355
+
356
+ // Stream subprocess output to parent so it's visible in the terminal/TUI
357
+ if (child.stdout && typeof child.stdout.on === 'function') {
358
+ child.stdout.on('data', (chunk: Buffer) => {
359
+ if (captureOutput) {
360
+ stdoutBuf += chunk.toString();
361
+ } else {
362
+ process.stdout.write(chunk);
363
+ }
364
+ });
365
+ }
366
+ if (child.stderr && typeof child.stderr.on === 'function') {
367
+ child.stderr.on('data', (chunk: Buffer) => {
368
+ // Always forward to parent stderr for real-time visibility
369
+ process.stderr.write(chunk);
370
+ if (captureStderr) {
371
+ stderrBuf += chunk.toString();
372
+ }
373
+ });
374
+ }
375
+
376
+ let timedOut: boolean = false;
377
+ let timer: ReturnType<typeof setTimeout> | undefined;
378
+ let killTimer: ReturnType<typeof setTimeout> | undefined;
379
+ if (timeout) {
380
+ timer = setTimeout(() => {
381
+ timedOut = true;
382
+ child.kill('SIGTERM');
383
+ // Escalate to SIGKILL if process doesn't exit within 5 seconds
384
+ killTimer = setTimeout(() => {
385
+ try {
386
+ child.kill('SIGKILL');
387
+ } catch (_e) {
388
+ /* already dead */
389
+ }
390
+ }, 5000);
391
+ }, timeout);
392
+ }
393
+
394
+ child.on('close', (code: number | null) => {
395
+ if (timer) clearTimeout(timer);
396
+ if (killTimer) clearTimeout(killTimer);
397
+ const result: SpawnResult = {
398
+ exitCode: timedOut ? 124 : (code ?? 1),
399
+ timedOut,
400
+ };
401
+ if (captureOutput) {
402
+ result.stdout = stdoutBuf;
403
+ }
404
+ if (captureStderr) {
405
+ result.stderr = stderrBuf;
406
+ }
407
+ resolve(result);
408
+ });
409
+
410
+ child.on('error', () => {
411
+ if (timer) clearTimeout(timer);
412
+ if (killTimer) clearTimeout(killTimer);
413
+ const result: SpawnResult = { exitCode: 1, timedOut: false };
414
+ if (captureOutput) {
415
+ result.stdout = stdoutBuf;
416
+ }
417
+ if (captureStderr) {
418
+ result.stderr = stderrBuf;
419
+ }
420
+ resolve(result);
421
+ });
422
+ });
423
+ }
424
+
425
+ /**
426
+ * Spawn a claude -p subprocess, routing through the scheduler when available.
427
+ * Unifies the scheduler vs. direct spawn branching used across pipeline steps.
428
+ */
429
+ async function spawnStep(
430
+ prompt: string,
431
+ stepCwd: string,
432
+ workItemId: string,
433
+ scheduler: Scheduler | null,
434
+ opts: SpawnOptions,
435
+ reportCwd?: string
436
+ ): Promise<SpawnResult> {
437
+ if (scheduler) {
438
+ const schedResult = await scheduler.spawn(prompt, {
439
+ timeout: opts.timeout,
440
+ maxTurns: opts.maxTurns,
441
+ model: opts.model,
442
+ cwd: stepCwd,
443
+ workItemId,
444
+ agentType: opts.agentType,
445
+ });
446
+ // Codex r15 P2 / r16 P2: when the scheduler reports a spin, write
447
+ // the SPIN-REPORT into the canonical phase dir under the main cwd
448
+ // (reportCwd) rather than the temporary worktree (stepCwd) — the
449
+ // worktree gets cleaned up after the pipeline, deleting the
450
+ // report before the user can read it.
451
+ if (schedResult.spinEvent && schedResult.spinEvent.detected) {
452
+ try {
453
+ const { handleSpinEvent } = require('./autopilot') as {
454
+ handleSpinEvent: (
455
+ phaseDir: string,
456
+ spinEvent: { repeated_pattern: string; consecutive_count: number; max_similarity: number },
457
+ phaseName: string
458
+ ) => string | null;
459
+ };
460
+ const { findPhaseInternal } = require('./utils') as {
461
+ findPhaseInternal: (
462
+ cwd: string,
463
+ phase: string
464
+ ) => { found: boolean; directory: string } | null;
465
+ };
466
+ // Codex r16/r17 P2: 1) trim worktree path back to the project
467
+ // root so the report survives worktree cleanup; 2) derive the
468
+ // phase dir from workItemId (`phase-N-step`) and pass the
469
+ // ABSOLUTE phase dir to handleSpinEvent — which writes
470
+ // SPIN-REPORT.md directly under the path it receives.
471
+ let projectCwd = reportCwd ?? stepCwd;
472
+ const wtIdx = projectCwd.indexOf('/.worktrees/');
473
+ if (wtIdx > 0) projectCwd = projectCwd.slice(0, wtIdx);
474
+ const phaseMatch = workItemId.match(/phase-([\d.]+)/);
475
+ let targetDir = projectCwd;
476
+ if (phaseMatch) {
477
+ const info = findPhaseInternal(projectCwd, phaseMatch[1]);
478
+ if (info && info.found) {
479
+ const path = require('path') as typeof import('path');
480
+ targetDir = path.join(projectCwd, info.directory);
481
+ }
482
+ }
483
+ handleSpinEvent(targetDir, schedResult.spinEvent, workItemId);
484
+ } catch {
485
+ /* spin handling is best-effort; never block the step */
486
+ }
487
+ }
488
+ return toSpawnResult(schedResult);
489
+ }
490
+ return spawnClaudeAsync(stepCwd, prompt, opts);
491
+ }
492
+
493
+ // ─── Conflict Resolution ───────────────────────────────────────────────────────
494
+
495
+ /** Get list of conflicting files from a worktree mid-rebase. */
496
+ function getConflictingFiles(wtPath: string): string[] {
497
+ try {
498
+ const result = execGit(wtPath, ['diff', '--name-only', '--diff-filter=U']);
499
+ if (result.exitCode === 0 && result.stdout.trim()) {
500
+ return result.stdout.trim().split('\n').filter(Boolean);
501
+ }
502
+ } catch (_err) {
503
+ // no conflict info available
504
+ }
505
+ return [];
506
+ }
507
+
508
+ // ─── Prompt Builders ──────────────────────────────────────────────────────────
509
+
510
+ /** Simplify step: code quality review before PR creation. */
511
+ function buildSimplifyPrompt(phaseNum: string): string {
512
+ return `You are reviewing code changes from phase ${phaseNum}. Examine all changed files (use git diff main...HEAD). For each file, check for: duplicated logic that can be extracted, overly complex code that can be simplified, unused imports or dead code, inconsistent naming or style. Make targeted improvements while preserving all functionality. Do not add comments or documentation unless the logic is truly non-obvious.`;
513
+ }
514
+
515
+ /** Code review step: review PR diff and fix findings. */
516
+ function buildCodeReviewPrompt(prUrl: string): string {
517
+ return `You are a code reviewer. Review the PR at ${prUrl}. Use gh pr diff to see the changes. Focus on: correctness bugs, security vulnerabilities, performance issues, and style violations. For each issue found, classify as BLOCKER (must fix) or WARNING (should fix). After the review, fix all BLOCKER and WARNING issues directly in the code, then commit and push the fixes.`;
518
+ }
519
+
520
+ /** Rebase conflict resolution via LLM subprocess. */
521
+ function buildConflictResolvePrompt(phaseNum: string, cwd: string, wtPath: string): string {
522
+ // Gather phase context — all reads wrapped in try/catch for graceful fallback
523
+ let phaseGoal = `Phase ${phaseNum} implementation`;
524
+ let planSummary = `See phase plans for details`;
525
+
526
+ try {
527
+ const roadmapPath = path.join(cwd, '.planning', 'ROADMAP.md');
528
+ const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
529
+ const phaseSection = roadmapContent.split('\n');
530
+ let inPhaseSection = false;
531
+ for (const line of phaseSection) {
532
+ if (line.includes(`#### Phase ${phaseNum}:`) || line.includes(`| ${phaseNum} `)) {
533
+ inPhaseSection = true;
534
+ }
535
+ if (inPhaseSection && line.includes('**Goal**:')) {
536
+ const goalMatch = line.match(/\*\*Goal\*\*:\s*(.+)/);
537
+ if (goalMatch) {
538
+ phaseGoal = goalMatch[1].trim();
539
+ break;
540
+ }
541
+ }
542
+ if (inPhaseSection && line.startsWith('####') && !line.includes(`Phase ${phaseNum}:`)) {
543
+ break;
544
+ }
545
+ }
546
+ } catch (_err) {
547
+ // fallback already set
548
+ }
549
+
550
+ try {
551
+ const phaseInfo: PhaseInfo | null = findPhaseInternal(cwd, phaseNum);
552
+ if (phaseInfo && phaseInfo.plans.length > 0) {
553
+ const planPath = path.join(cwd, phaseInfo.directory, phaseInfo.plans[0]);
554
+ const firstPlan = fs.readFileSync(planPath, 'utf-8');
555
+ const objectiveMatch = firstPlan.match(/<objective>([\s\S]*?)<\/objective>/);
556
+ if (objectiveMatch) {
557
+ planSummary = objectiveMatch[1].trim();
558
+ }
559
+ }
560
+ } catch (_err) {
561
+ // fallback already set
562
+ }
563
+
564
+ const conflictingFiles = getConflictingFiles(wtPath);
565
+ let conflictDiffs = '';
566
+
567
+ for (const filePath of conflictingFiles.slice(0, 5)) {
568
+ try {
569
+ const diffResult = execGit(wtPath, ['diff', '--', filePath]);
570
+ conflictDiffs += `\n### ${filePath}\n\`\`\`\n${diffResult.stdout}\n\`\`\`\n`;
571
+ } catch (_err) {
572
+ conflictDiffs += `\n### ${filePath}\n(diff unavailable)\n`;
573
+ }
574
+ }
575
+
576
+ const fileList =
577
+ conflictingFiles.length > 0
578
+ ? conflictingFiles.map((f) => `- ${f}`).join('\n')
579
+ : '(unable to determine — check git status)';
580
+
581
+ return `You are resolving merge conflicts from rebasing phase ${phaseNum}'s branch onto main.
582
+
583
+ ## Phase Context
584
+
585
+ **Phase Goal:** ${phaseGoal}
586
+ **Plan Summary:** ${planSummary}
587
+
588
+ ## Conflicting Files
589
+
590
+ The following files have conflicts:
591
+ ${fileList}
592
+
593
+ ## Conflict Diffs
594
+ ${conflictDiffs || '\n(run `git diff` to see conflict details)\n'}
595
+ ## Instructions
596
+
597
+ For each conflicting file:
598
+ 1. Examine both the incoming changes (from phase ${phaseNum}'s branch) and the changes from main
599
+ 2. Resolve by PRESERVING CHANGES FROM BOTH VERSIONS — do not discard either side unless they are truly redundant
600
+ 3. The phase's intent was: ${phaseGoal} — ensure the resolution maintains this intent
601
+ 4. After resolving all conflicts, run \`git add\` on each resolved file
602
+ 5. Complete the rebase with \`git rebase --continue\`
603
+
604
+ If a conflict cannot be automatically resolved (e.g., fundamentally incompatible changes), exit with a non-zero status code.`;
605
+ }
606
+
607
+ /** Build the prompt string for the knowledge miner agent. */
608
+ function buildKnowledgeMiningPrompt(phaseNum: string): string {
609
+ return `You are the GRD knowledge miner agent for phase ${phaseNum}.
610
+
611
+ Your task:
612
+ 1. Read the SUMMARY.md file for phase ${phaseNum} (look in .planning/milestones/*/phases/*${phaseNum}*/).
613
+ 2. Analyze the code changes, decisions, and techniques described in the summary.
614
+ 3. Identify 2-5 reusable patterns or techniques that future phases could benefit from.
615
+ 4. For each pattern, produce a ---KNOWHOW-ENTRY--- block in this format:
616
+
617
+ ---KNOWHOW-ENTRY---
618
+ pattern_name: <descriptive name>
619
+ source: <file path or paper slug where pattern was used>
620
+ applicability: <when this pattern is useful>
621
+ code_snippet: <short representative code example>
622
+ phase_number: ${phaseNum}
623
+ created_at: <ISO timestamp>
624
+ ---END-KNOWHOW-ENTRY---
625
+
626
+ 5. Call appendKnowhowEntries (from lib/knowledge.ts) to write the entries to KNOWHOW.md at the project root.
627
+
628
+ Focus on patterns that are specific, reusable, and non-obvious — not general best practices.`;
629
+ }
630
+
631
+ /**
632
+ * Build the prompt string for the critique agent invocation.
633
+ *
634
+ * Wraps the refinement critique prompt (from lib/refinement.ts) in the standard
635
+ * agent invocation format, prepending agent role context and phase information.
636
+ *
637
+ * @param phaseNum - Phase number for file path context
638
+ * @param branch - The classified refinement branch to execute
639
+ * @param metrics - Current metric measurements
640
+ * @param targets - Target metric thresholds
641
+ * @param minimaRegions - Detected minima/maxima regions from metric history
642
+ * @returns Formatted prompt string for the grd-critique-agent
643
+ */
644
+ function buildCritiqueAgentPrompt(
645
+ phaseNum: string,
646
+ branch: CritiqueBranch,
647
+ metrics: RefinementMetrics,
648
+ targets: RefinementMetrics,
649
+ minimaRegions: MinimaRegion[],
650
+ agentDefPath?: string
651
+ ): string {
652
+ const critiquePrompt = _buildCritiquePromptFn(branch, metrics, targets, minimaRegions);
653
+
654
+ // Codex r44 P1 #1: embed the agent definition file content into the
655
+ // prompt. Previously the file's existence was checked but the
656
+ // markdown content (constraints, output schema, guardrails) was
657
+ // never sent to the subprocess — only a one-line "You are the
658
+ // grd-critique-agent" preamble was. `agentType` is just model/
659
+ // scheduler routing metadata, not a system-prompt loader.
660
+ let agentDefinition = '';
661
+ if (agentDefPath) {
662
+ try {
663
+ agentDefinition = fs.readFileSync(agentDefPath, 'utf-8') as string;
664
+ } catch {
665
+ /* fall through: prompt still works with just the preamble */
666
+ }
667
+ }
668
+
669
+ const definitionBlock = agentDefinition
670
+ ? `\n\n<agent-definition>\n${agentDefinition}\n</agent-definition>\n`
671
+ : '';
672
+
673
+ return `You are the grd-critique-agent. Your branch is ${branch}.
674
+
675
+ Phase: ${phaseNum}
676
+ Working directory: project root (all paths are relative to it)
677
+ ${definitionBlock}
678
+ ${critiquePrompt}
679
+
680
+ Apply the targeted fixes described above. Focus on the ${branch} branch instructions. Emit the CRITIQUE-RESULT block at the end of your response.`;
681
+ }
682
+
683
+ // ─── Knowledge Mining ─────────────────────────────────────────────────────────
684
+
685
+ /**
686
+ * Run the knowledge mining step for a phase.
687
+ * Checks for agent definition existence, spawns the miner, and marks status.
688
+ * Non-blocking — errors are caught and logged; pipeline always continues.
689
+ */
690
+ async function runKnowledgeMining(
691
+ cwd: string,
692
+ phaseNum: string,
693
+ options: { scheduler?: Scheduler | null; log: (msg: string) => void }
694
+ ): Promise<void> {
695
+ const { scheduler, log } = options;
696
+ const agentDefPath = path.resolve(cwd, 'agents', 'grd-knowledge-miner.md');
697
+
698
+ if (!fs.existsSync(agentDefPath)) {
699
+ log(`Phase ${phaseNum}: knowledge mining skipped — agent definition not found`);
700
+ writeStatusMarker(cwd, phaseNum, 'knowledge-mining', 'skipped');
701
+ return;
702
+ }
703
+
704
+ writeStatusMarker(cwd, phaseNum, 'knowledge-mining', 'started');
705
+ try {
706
+ await spawnStep(
707
+ buildKnowledgeMiningPrompt(phaseNum),
708
+ cwd,
709
+ `phase-${phaseNum}-knowledge-mining`,
710
+ scheduler ?? null,
711
+ { captureOutput: true, agentType: 'grd-knowledge-miner' }
712
+ );
713
+ writeStatusMarker(cwd, phaseNum, 'knowledge-mining', 'completed');
714
+ log(`Phase ${phaseNum}: knowledge mining completed`);
715
+ } catch (_err) {
716
+ log(`Phase ${phaseNum}: knowledge mining failed (non-blocking): ${String(_err)}`);
717
+ writeStatusMarker(cwd, phaseNum, 'knowledge-mining', 'failed');
718
+ }
719
+ }
720
+
721
+ // ─── Refinement Loop ──────────────────────────────────────────────────────────
722
+
723
+ /**
724
+ * Run the iterative metric-driven refinement loop for a phase.
725
+ *
726
+ * Implements the closed-loop: collect metrics -> classify branch -> spawn critique
727
+ * agent -> re-measure -> check convergence. Adapts NERFIFY's 3-branch refinement
728
+ * (Macro/Geometry/Generative) to GRD's domain.
729
+ *
730
+ * Non-blocking — the entire loop is wrapped in try/catch; failures are logged and
731
+ * the pipeline always continues.
732
+ *
733
+ * @param cwd - Absolute path to the project root directory
734
+ * @param phaseNum - Phase number (used in status markers and prompts)
735
+ * @param options - Configuration including scheduler, log function, and targets
736
+ */
737
+ /**
738
+ * Run the configured metric command via real shell execution (NOT
739
+ * `claude -p`). Captures stdout+stderr concatenated so jest's
740
+ * threshold-failure block and tsc's error output are both visible
741
+ * to `collectMetrics`.
742
+ *
743
+ * Codex r43 P1 #1: previously the refinement loop sent the strings
744
+ * "npm test", "tsc", "eslint" through `spawnStep` which routes to
745
+ * `claude -p`. The LLM then *described* what those commands might
746
+ * output, and `collectMetrics` regex-parsed that description.
747
+ */
748
+ function _measureMetrics(measureCwd: string, log: (msg: string) => void): {
749
+ testOutput: string;
750
+ tscOutput: string;
751
+ lintOutput: string;
752
+ } {
753
+ const { spawnSync } = require('child_process') as typeof import('child_process');
754
+ const runShell = (cmd: string, args: string[]): string => {
755
+ try {
756
+ const r = spawnSync(cmd, args, {
757
+ cwd: measureCwd,
758
+ encoding: 'utf-8',
759
+ env: { ...process.env, FORCE_COLOR: '0', CI: '1' },
760
+ maxBuffer: 64 * 1024 * 1024,
761
+ });
762
+ return (r.stdout ?? '') + '\n' + (r.stderr ?? '');
763
+ } catch (e) {
764
+ log(`Phase metric command failed (non-blocking): ${cmd} ${args.join(' ')}: ${String(e)}`);
765
+ return '';
766
+ }
767
+ };
768
+ return {
769
+ testOutput: runShell('npx', ['jest', '--coverage', '--silent', '--ci', '--passWithNoTests']),
770
+ tscOutput: runShell('npx', ['tsc', '--noEmit']),
771
+ lintOutput: runShell('npx', ['eslint', 'bin/', 'lib/']),
772
+ };
773
+ }
774
+
775
+ /**
776
+ * True iff the second snapshot regressed on any dimension. Coverage
777
+ * dropping or error counts rising counts as regression.
778
+ */
779
+ function _critiqueRegressed(before: RefinementMetrics, after: RefinementMetrics): {
780
+ regressed: boolean;
781
+ reasons: string[];
782
+ } {
783
+ const reasons: string[] = [];
784
+ if (after.test_coverage_pct < before.test_coverage_pct - 0.5) {
785
+ reasons.push(
786
+ `coverage ${before.test_coverage_pct.toFixed(1)}% → ${after.test_coverage_pct.toFixed(1)}%`
787
+ );
788
+ }
789
+ if (after.type_error_count > before.type_error_count) {
790
+ reasons.push(`type_errors ${before.type_error_count} → ${after.type_error_count}`);
791
+ }
792
+ if (after.lint_violation_count > before.lint_violation_count) {
793
+ reasons.push(`lint ${before.lint_violation_count} → ${after.lint_violation_count}`);
794
+ }
795
+ return { regressed: reasons.length > 0, reasons };
796
+ }
797
+
798
+ async function runRefinementLoop(
799
+ cwd: string,
800
+ phaseNum: string,
801
+ options: {
802
+ scheduler?: Scheduler | null;
803
+ log: (msg: string) => void;
804
+ maxIterations?: number;
805
+ targets?: RefinementMetrics;
806
+ workCwd?: string;
807
+ }
808
+ ): Promise<void> {
809
+ const { scheduler, log } = options;
810
+ // Codex r43 P1 #2: refinement must run in the same worktree the
811
+ // phase implementation ran in, so critique edits land on the
812
+ // phase branch the post-pipeline merges. Fall back to cwd only
813
+ // when no worktree was supplied (legacy callers + tests).
814
+ const workCwd = options.workCwd ?? cwd;
815
+
816
+ // Skip when not explicitly enabled via config (opt-in, same as citation_gate pattern)
817
+ if (loadConfig(cwd).refinement_loop !== true) {
818
+ log(`Phase ${phaseNum}: refinement loop skipped — refinement_loop config not enabled`);
819
+ // Codex r43 P2 #5: status marker even on config-skip so users
820
+ // inspecting .planning/autopilot can tell why no refinement ran.
821
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'skipped-disabled');
822
+ return;
823
+ }
824
+
825
+ const agentDefPath = path.resolve(cwd, 'agents', 'grd-critique-agent.md');
826
+
827
+ if (!fs.existsSync(agentDefPath)) {
828
+ log(`Phase ${phaseNum}: refinement loop skipped — grd-critique-agent.md not found`);
829
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'skipped-no-agent');
830
+ return;
831
+ }
832
+
833
+ const maxIterations = options.maxIterations ?? 3;
834
+ const convergenceConfig: ConvergenceConfig = {
835
+ epsilon_coverage: 0.5,
836
+ epsilon_type_errors: 0,
837
+ epsilon_lint: 1,
838
+ max_iterations: maxIterations,
839
+ };
840
+ const targets: RefinementMetrics = options.targets ?? {
841
+ test_coverage_pct: 80,
842
+ type_error_count: 0,
843
+ lint_violation_count: 0,
844
+ timestamp: new Date().toISOString(),
845
+ };
846
+
847
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'started');
848
+ log(`Phase ${phaseNum}: refinement loop started (maxIterations=${maxIterations}, cwd=${workCwd})`);
849
+
850
+ try {
851
+ const history: MetricSnapshot[] = [];
852
+
853
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
854
+ log(`Phase ${phaseNum}: refinement loop iteration ${iteration}/${maxIterations}`);
855
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', `iteration-${iteration}`);
856
+
857
+ // Step 1: REAL metric collection via child_process — not claude -p.
858
+ const { testOutput, tscOutput, lintOutput } = _measureMetrics(workCwd, log);
859
+
860
+ // Step 2: Parse metrics from captured tool outputs.
861
+ const currentMetrics = _collectMetrics(testOutput, tscOutput, lintOutput);
862
+
863
+ // Step 3: Push snapshot to history.
864
+ const snapshot: MetricSnapshot = {
865
+ metrics: currentMetrics,
866
+ phase: phaseNum,
867
+ plan: String(iteration),
868
+ };
869
+ history.push(snapshot);
870
+
871
+ log(
872
+ `Phase ${phaseNum}: metrics collected — coverage=${currentMetrics.test_coverage_pct.toFixed(1)}%, ` +
873
+ `type_errors=${currentMetrics.type_error_count}, lint=${currentMetrics.lint_violation_count}`
874
+ );
875
+
876
+ // Step 4: Check convergence (now returns false on all-zero
877
+ // sentinel — see lib/refinement.ts).
878
+ const convergenceResult = _checkConvergence(history, convergenceConfig);
879
+ if (convergenceResult.converged) {
880
+ log(`Phase ${phaseNum}: refinement loop converged — ${convergenceResult.reason}`);
881
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'converged');
882
+ return;
883
+ }
884
+
885
+ // Step 5: Classify branch and detect minima.
886
+ const branch = _classifyBranch(currentMetrics, targets);
887
+ const minimaRegions = _detectMinima(history);
888
+ log(`Phase ${phaseNum}: refinement loop classifying branch as '${branch}'`);
889
+
890
+ // Step 6: Snapshot worktree HEAD so we can revert a regressing
891
+ // critique. Codex r43 P1 #4.
892
+ const headBefore = (() => {
893
+ try {
894
+ return execGit(workCwd, ['rev-parse', 'HEAD']).stdout.trim();
895
+ } catch {
896
+ return null;
897
+ }
898
+ })();
899
+
900
+ // Step 7: Build critique prompt and spawn the critique agent.
901
+ // Codex r43 P2 #7: agentType is grd-critique-agent (not
902
+ // grd-verifier), so model + scheduler routing pick the right
903
+ // profile and the agent definition file is honored.
904
+ const critiquePrompt = buildCritiqueAgentPrompt(
905
+ phaseNum,
906
+ branch,
907
+ currentMetrics,
908
+ targets,
909
+ minimaRegions,
910
+ agentDefPath
911
+ );
912
+ const critiqueConfig = loadConfig(cwd);
913
+ const critiqueTier = getEffectiveTierForDispatch({
914
+ agentType: 'grd-critique-agent',
915
+ prompt: critiquePrompt,
916
+ config: critiqueConfig,
917
+ scheduler: scheduler ?? null,
918
+ schedulerConfig: critiqueConfig.scheduler,
919
+ superpowersConfig: critiqueConfig.superpowers,
920
+ modelProfiles: _MODEL_PROFILES_FOR_REFINEMENT,
921
+ retry_attempt: iteration - 1,
922
+ });
923
+ const critiqueModel = resolveModelForAgent(critiqueConfig, 'grd-critique-agent', cwd, {
924
+ effectiveTierOverride: critiqueTier,
925
+ });
926
+ const critiqueResult = await spawnStep(
927
+ critiquePrompt,
928
+ workCwd,
929
+ `phase-${phaseNum}-critique-${iteration}`,
930
+ scheduler ?? null,
931
+ {
932
+ captureOutput: true,
933
+ agentType: 'grd-critique-agent',
934
+ model: critiqueModel,
935
+ }
936
+ );
937
+ if (critiqueResult.exitCode !== 0) {
938
+ log(`Phase ${phaseNum}: critique exited ${critiqueResult.exitCode}; skipping regression check`);
939
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', `iteration-${iteration}-critique-failed`);
940
+ continue;
941
+ }
942
+
943
+ // Step 8: Re-measure and reject regressions. Codex r43 P1 #4.
944
+ const afterMeasure = _measureMetrics(workCwd, log);
945
+ const afterMetrics = _collectMetrics(afterMeasure.testOutput, afterMeasure.tscOutput, afterMeasure.lintOutput);
946
+ const regression = _critiqueRegressed(currentMetrics, afterMetrics);
947
+ if (regression.regressed) {
948
+ log(
949
+ `Phase ${phaseNum}: critique regressed metrics (${regression.reasons.join('; ')}) — rolling back`
950
+ );
951
+ if (headBefore) {
952
+ try {
953
+ execGit(workCwd, ['reset', '--hard', headBefore]);
954
+ } catch (e) {
955
+ log(`Phase ${phaseNum}: rollback failed (non-blocking): ${String(e)}`);
956
+ }
957
+ }
958
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', `iteration-${iteration}-rolled-back`);
959
+ continue;
960
+ }
961
+
962
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', `iteration-${iteration}-complete`);
963
+ }
964
+
965
+ // Reached max iterations without convergence
966
+ log(`Phase ${phaseNum}: refinement loop reached max iterations (${maxIterations})`);
967
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'max-iterations');
968
+ } catch (_err) {
969
+ log(`Phase ${phaseNum}: refinement loop failed (non-blocking): ${String(_err)}`);
970
+ writeStatusMarker(cwd, phaseNum, 'refinement-loop', 'failed');
971
+ }
972
+ }
973
+
974
+ // ─── Post-Phase Pipeline ──────────────────────────────────────────────────────
975
+
976
+ /**
977
+ * Run the post-phase pipeline: simplify -> create PR -> code review -> rebase & merge.
978
+ * Each step runs sequentially on the phase's worktree branch.
979
+ * Halts on any failure and returns the failed step.
980
+ */
981
+ async function runPostPhasePipeline(
982
+ cwd: string,
983
+ phaseNum: string,
984
+ wtPath: string,
985
+ opts: {
986
+ timeout?: number;
987
+ maxTurns?: number;
988
+ model?: string;
989
+ scheduler?: Scheduler | null;
990
+ log: (msg: string) => void;
991
+ mergeQueue?: { enqueue<T>(fn: () => Promise<T>): Promise<T> };
992
+ }
993
+ ): Promise<PostPipelineResult> {
994
+ const { timeout, maxTurns, model, scheduler, log, mergeQueue } = opts;
995
+ const timeoutMs: number | undefined = timeout ? timeout * 60 * 1000 : undefined;
996
+ const spawnOpts: SpawnOptions = { timeout: timeoutMs, maxTurns, model, captureOutput: true };
997
+
998
+ // Step 1: Simplify
999
+ log(`Phase ${phaseNum}: post-pipeline — simplify`);
1000
+ const simplifyResult = await spawnStep(
1001
+ buildSimplifyPrompt(phaseNum),
1002
+ wtPath,
1003
+ `phase-${phaseNum}-simplify`,
1004
+ scheduler ?? null,
1005
+ { ...spawnOpts, agentType: 'grd-integration-checker' }
1006
+ );
1007
+
1008
+ if (simplifyResult.exitCode !== 0) {
1009
+ return {
1010
+ status: 'failed',
1011
+ failedStep: 'simplify',
1012
+ reason: simplifyResult.timedOut ? 'timeout' : `exit code ${simplifyResult.exitCode}`,
1013
+ };
1014
+ }
1015
+
1016
+ // Step 2: Create PR
1017
+ log(`Phase ${phaseNum}: post-pipeline — create PR`);
1018
+ const milestoneInfo: MilestoneInfo = getMilestoneInfo(cwd);
1019
+ const prResult = pushAndCreatePR(cwd, wtPath, {
1020
+ title: `Phase ${phaseNum}: ${milestoneInfo.version}`,
1021
+ body: `Automated PR from autopilot phase ${phaseNum} execution.\n\nMilestone: ${milestoneInfo.version} (${milestoneInfo.name})`,
1022
+ });
1023
+
1024
+ if ('error' in prResult) {
1025
+ return { status: 'failed', failedStep: 'create-pr', reason: prResult.error };
1026
+ }
1027
+ const prUrl: string = prResult.pr_url;
1028
+ log(`Phase ${phaseNum}: PR created — ${prUrl}`);
1029
+
1030
+ // Step 3: Code review + fix
1031
+ log(`Phase ${phaseNum}: post-pipeline — code review`);
1032
+ const reviewResult = await spawnStep(
1033
+ buildCodeReviewPrompt(prUrl),
1034
+ wtPath,
1035
+ `phase-${phaseNum}-review`,
1036
+ scheduler ?? null,
1037
+ { ...spawnOpts, agentType: 'grd-code-reviewer' }
1038
+ );
1039
+
1040
+ if (reviewResult.exitCode !== 0) {
1041
+ return {
1042
+ status: 'failed',
1043
+ failedStep: 'code-review',
1044
+ prUrl,
1045
+ reason: reviewResult.timedOut ? 'timeout' : `exit code ${reviewResult.exitCode}`,
1046
+ };
1047
+ }
1048
+
1049
+ // Step 4: Rebase & merge (serialized through mergeQueue when provided)
1050
+ const runStep4 = async (): Promise<PostPipelineResult> => {
1051
+ log(`Phase ${phaseNum}: post-pipeline — rebase & merge`);
1052
+ const rebaseResult = execGit(wtPath, ['rebase', 'main']);
1053
+ if (rebaseResult.exitCode !== 0) {
1054
+ // Merge conflicts — spawn claude -p to resolve
1055
+ log(`Phase ${phaseNum}: rebase conflicts detected, attempting auto-resolution`);
1056
+ const conflictResult = await spawnStep(
1057
+ buildConflictResolvePrompt(phaseNum, cwd, wtPath),
1058
+ wtPath,
1059
+ `phase-${phaseNum}-conflicts`,
1060
+ scheduler ?? null,
1061
+ { ...spawnOpts, agentType: 'grd-integration-checker' }
1062
+ );
1063
+
1064
+ if (conflictResult.exitCode !== 0) {
1065
+ // Gather conflict info BEFORE aborting (abort clears conflict state)
1066
+ const conflictFiles = getConflictingFiles(wtPath);
1067
+ const branch = execGit(wtPath, ['rev-parse', '--abbrev-ref', 'HEAD']);
1068
+ const branchName = branch.exitCode === 0 ? branch.stdout.trim() : `phase-${phaseNum}`;
1069
+ execGit(wtPath, ['rebase', '--abort']);
1070
+ return {
1071
+ status: 'failed',
1072
+ failedStep: 'rebase',
1073
+ prUrl,
1074
+ reason: `conflict resolution failed for phase ${phaseNum} — conflicting files: ${conflictFiles.join(', ') || 'unknown'}. Manual steps: git checkout ${branchName}, git rebase main, resolve conflicts manually, git rebase --continue`,
1075
+ };
1076
+ }
1077
+ }
1078
+
1079
+ // Force-push the rebased branch and merge the PR
1080
+ const branch = execGit(wtPath, ['rev-parse', '--abbrev-ref', 'HEAD']);
1081
+ if (branch.exitCode !== 0) {
1082
+ return {
1083
+ status: 'failed',
1084
+ failedStep: 'push-rebased',
1085
+ prUrl,
1086
+ reason: 'failed to determine branch name',
1087
+ };
1088
+ }
1089
+ const pushResult = execGit(
1090
+ wtPath,
1091
+ ['push', '--force-with-lease', 'origin', branch.stdout.trim()],
1092
+ {
1093
+ allowBlocked: true,
1094
+ }
1095
+ );
1096
+ if (pushResult.exitCode !== 0) {
1097
+ return {
1098
+ status: 'failed',
1099
+ failedStep: 'push-rebased',
1100
+ prUrl,
1101
+ reason: `push failed: ${pushResult.stderr}`,
1102
+ };
1103
+ }
1104
+
1105
+ // Merge the PR via gh CLI
1106
+ try {
1107
+ childProcess.execFileSync('gh', ['pr', 'merge', prUrl, '--merge', '--delete-branch'], {
1108
+ cwd: wtPath,
1109
+ stdio: 'pipe',
1110
+ encoding: 'utf-8',
1111
+ });
1112
+ } catch (mergeErr) {
1113
+ return {
1114
+ status: 'failed',
1115
+ failedStep: 'merge',
1116
+ prUrl,
1117
+ reason: String((mergeErr as { stderr?: string }).stderr || mergeErr),
1118
+ };
1119
+ }
1120
+
1121
+ log(`Phase ${phaseNum}: post-pipeline complete — merged ${prUrl}`);
1122
+ return { status: 'completed', prUrl };
1123
+ };
1124
+
1125
+ return mergeQueue ? mergeQueue.enqueue(runStep4) : runStep4();
1126
+ }
1127
+
1128
+ // ─── Phase Finalize ───────────────────────────────────────────────────────────
1129
+
1130
+ /**
1131
+ * Finalize a phase after a successful post-pipeline run.
1132
+ * Calls completePhaseAfterPostPipeline and writes status markers.
1133
+ * Returns the PhaseCompleteResult or null on failure.
1134
+ */
1135
+ async function finalizePhaseAfterPipeline(
1136
+ cwd: string,
1137
+ phaseNum: string,
1138
+ scheduler: Scheduler | null,
1139
+ log: (msg: string) => void
1140
+ ): Promise<PhaseCompleteResult | null> {
1141
+ writeStatusMarker(cwd, phaseNum, 'phase-finalize', 'started');
1142
+ const finalizeResult: PhaseCompleteResult | null = await completePhaseAfterPostPipeline(
1143
+ cwd,
1144
+ phaseNum,
1145
+ scheduler
1146
+ );
1147
+ if (finalizeResult) {
1148
+ writeStatusMarker(cwd, phaseNum, 'phase-finalize', 'completed');
1149
+ log(
1150
+ `Phase ${phaseNum}: phase-finalize complete — ${finalizeResult.plans_executed} plans, ${finalizeResult.next_phase ? `next phase ${finalizeResult.next_phase}` : 'milestone complete'}`
1151
+ );
1152
+ } else {
1153
+ writeStatusMarker(cwd, phaseNum, 'phase-finalize', 'failed');
1154
+ log(
1155
+ `Phase ${phaseNum}: phase-finalize failed — run 'gd phase complete ${phaseNum}' manually to finalize`
1156
+ );
1157
+ }
1158
+ return finalizeResult;
1159
+ }
1160
+
1161
+ module.exports = {
1162
+ toSpawnResult,
1163
+ spawnClaude,
1164
+ spawnClaudeAsync,
1165
+ spawnStep,
1166
+ _buildSpawnConfig,
1167
+ writeStatusMarker,
1168
+ updateStateProgress,
1169
+ getConflictingFiles,
1170
+ buildSimplifyPrompt,
1171
+ buildCodeReviewPrompt,
1172
+ buildConflictResolvePrompt,
1173
+ buildKnowledgeMiningPrompt,
1174
+ buildCritiqueAgentPrompt,
1175
+ runKnowledgeMining,
1176
+ runRefinementLoop,
1177
+ runPostPhasePipeline,
1178
+ finalizePhaseAfterPipeline,
1179
+ };