@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,744 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { loadConfig, safeReadMarkdown, output, error } = require('./utils');
6
+ const { phasesDir: getPhasesDirPath } = require('./paths');
7
+ // ─── File I/O (delegated to phase-io for shared cache) ──────────────────────
8
+ // O2: Consolidated duplicate _stateFileCache into phase-io so that reads
9
+ // from state.ts and phase-complete.ts share the same cache and can be
10
+ // invalidated together via clearStateCache.
11
+ const { readStateFile, writeStateFile } = require('./phase-io');
12
+ // ─── Internal Helpers ────────────────────────────────────────────────────────
13
+ /**
14
+ * Extract a **Field:** value from STATE.md markdown content.
15
+ * @param content - STATE.md content
16
+ * @param fieldName - Field name to extract (matched case-insensitively)
17
+ * @returns Trimmed field value, or null if not found
18
+ */
19
+ function stateExtractField(content, fieldName) {
20
+ const pattern = new RegExp(`\\*\\*${fieldName}:\\*\\*\\s*(.+)`, 'i');
21
+ const match = content.match(pattern);
22
+ return match ? match[1].trim() : null;
23
+ }
24
+ /**
25
+ * Replace a **Field:** value in STATE.md markdown content.
26
+ * @param content - STATE.md content
27
+ * @param fieldName - Field name to replace (matched case-insensitively)
28
+ * @param newValue - New value to set for the field
29
+ * @returns Updated content with replaced field, or null if field not found
30
+ */
31
+ function stateReplaceField(content, fieldName, newValue) {
32
+ const escaped = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
33
+ const pattern = new RegExp(`(\\*\\*${escaped}:\\*\\*\\s*)(.*)`, 'i');
34
+ if (pattern.test(content)) {
35
+ return content.replace(pattern, `$1${newValue}`);
36
+ }
37
+ return null;
38
+ }
39
+ // ─── State Command Functions ─────────────────────────────────────────────────
40
+ /**
41
+ * CLI command: Load full project state including config, STATE.md, and existence checks.
42
+ * @param cwd - Project working directory
43
+ * @param raw - Output key=value format instead of JSON
44
+ */
45
+ function cmdStateLoad(cwd, raw) {
46
+ const config = loadConfig(cwd);
47
+ const planningDir = path.join(cwd, '.planning');
48
+ const stateRaw = safeReadMarkdown(path.join(planningDir, 'STATE.md')) || '';
49
+ const configExists = fs.existsSync(path.join(planningDir, 'config.json'));
50
+ const roadmapExists = fs.existsSync(path.join(planningDir, 'ROADMAP.md'));
51
+ const stateExists = stateRaw.length > 0;
52
+ const result = {
53
+ config,
54
+ state_raw: stateRaw,
55
+ state_exists: stateExists,
56
+ roadmap_exists: roadmapExists,
57
+ config_exists: configExists,
58
+ };
59
+ // For --raw, output a condensed key=value format followed by STATE.md content
60
+ if (raw) {
61
+ const c = config;
62
+ const lines = [
63
+ `model_profile=${c.model_profile}`,
64
+ `commit_docs=${c.commit_docs}`,
65
+ `branching_strategy=${c.branching_strategy}`,
66
+ `phase_branch_template=${c.phase_branch_template}`,
67
+ `milestone_branch_template=${c.milestone_branch_template}`,
68
+ `parallelization=${c.parallelization}`,
69
+ `research=${c.research}`,
70
+ `plan_checker=${c.plan_checker}`,
71
+ `verifier=${c.verifier}`,
72
+ `config_exists=${configExists}`,
73
+ `roadmap_exists=${roadmapExists}`,
74
+ `state_exists=${stateExists}`,
75
+ ];
76
+ // Include STATE.md content after --- separator so agents get it in one call
77
+ const separator = '\n---\n';
78
+ output({}, true, lines.join('\n') + separator + stateRaw);
79
+ }
80
+ output(result);
81
+ }
82
+ /**
83
+ * CLI command: Read a specific field or section from STATE.md.
84
+ * @param cwd - Project working directory
85
+ * @param section - Field name or section heading to retrieve, or null for full content
86
+ * @param raw - Output raw text instead of JSON
87
+ */
88
+ function cmdStateGet(cwd, section, raw) {
89
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
90
+ try {
91
+ const content = readStateFile(statePath);
92
+ if (!section) {
93
+ output({ content }, raw, content);
94
+ return;
95
+ }
96
+ // Try to find markdown section or field
97
+ const fieldEscaped = section.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
98
+ // Check for **field:** value
99
+ const fieldPattern = new RegExp(`\\*\\*${fieldEscaped}:\\*\\*\\s*(.*)`, 'i');
100
+ const fieldMatch = content.match(fieldPattern);
101
+ if (fieldMatch) {
102
+ output({ [section]: fieldMatch[1].trim() }, raw, fieldMatch[1].trim());
103
+ return;
104
+ }
105
+ // Check for ## Section
106
+ const sectionPattern = new RegExp(`##\\s*${fieldEscaped}\\s*\n([\\s\\S]*?)(?=\\n##|$)`, 'i');
107
+ const sectionMatch = content.match(sectionPattern);
108
+ if (sectionMatch) {
109
+ output({ [section]: sectionMatch[1].trim() }, raw, sectionMatch[1].trim());
110
+ return;
111
+ }
112
+ output({ error: `Section or field "${section}" not found` }, raw, '');
113
+ }
114
+ catch {
115
+ error('STATE.md not found');
116
+ }
117
+ }
118
+ /**
119
+ * CLI command: Batch update multiple **Field:** values in STATE.md.
120
+ * @param cwd - Project working directory
121
+ * @param patches - Object mapping field names to new values
122
+ * @param raw - Output raw text instead of JSON
123
+ * @param opts - Options (e.g., audit flag)
124
+ */
125
+ function cmdStatePatch(cwd, patches, raw, opts) {
126
+ const options = opts || {};
127
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
128
+ try {
129
+ let content = readStateFile(statePath);
130
+ const results = { updated: [], failed: [] };
131
+ for (const [field, value] of Object.entries(patches)) {
132
+ // Try the original field name first
133
+ const fieldEscaped = field.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
134
+ const pattern = new RegExp(`(\\*\\*${fieldEscaped}:\\*\\*\\s*)(.*)`, 'i');
135
+ if (pattern.test(content)) {
136
+ content = content.replace(pattern, `$1${value}`);
137
+ results.updated.push(field);
138
+ }
139
+ else {
140
+ // Try underscore-to-space mapping (e.g., "current_plan" -> "Current plan")
141
+ const normalizedField = field.replace(/_/g, ' ');
142
+ if (normalizedField !== field) {
143
+ const normalizedEscaped = normalizedField.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
144
+ const normalizedPattern = new RegExp(`(\\*\\*${normalizedEscaped}:\\*\\*\\s*)(.*)`, 'i');
145
+ if (normalizedPattern.test(content)) {
146
+ content = content.replace(normalizedPattern, `$1${value}`);
147
+ results.updated.push(field);
148
+ }
149
+ else {
150
+ results.failed.push(field);
151
+ }
152
+ }
153
+ else {
154
+ results.failed.push(field);
155
+ }
156
+ }
157
+ }
158
+ // Append audit entries if requested
159
+ if (options.audit && results.updated.length > 0) {
160
+ const ts = new Date().toISOString();
161
+ const changedFields = results.updated.join(', ');
162
+ const auditEntry = `- ${ts}: updated ${changedFields}`;
163
+ const auditSectionPattern = /(## Audit Log\n)([\s\S]*?)($)/;
164
+ if (auditSectionPattern.test(content)) {
165
+ content = content.replace(auditSectionPattern, `$1$2${auditEntry}\n$3`);
166
+ }
167
+ else {
168
+ content = content + `\n## Audit Log\n${auditEntry}\n`;
169
+ }
170
+ }
171
+ if (results.updated.length > 0) {
172
+ writeStateFile(statePath, content);
173
+ }
174
+ output(results, raw, results.updated.length > 0 ? 'true' : 'false');
175
+ }
176
+ catch {
177
+ error('STATE.md not found');
178
+ }
179
+ }
180
+ /**
181
+ * CLI command: Update a single **Field:** value in STATE.md.
182
+ * @param cwd - Project working directory
183
+ * @param field - Field name to update
184
+ * @param value - New value for the field
185
+ */
186
+ function cmdStateUpdate(cwd, field, value) {
187
+ if (!field || value === undefined) {
188
+ error('field and value required for state update. Usage: state patch --<field> <value>. Provide a field and value, e.g.: state patch --Status "in_progress"');
189
+ }
190
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
191
+ try {
192
+ let content = readStateFile(statePath);
193
+ const fieldEscaped = field.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
194
+ const pattern = new RegExp(`(\\*\\*${fieldEscaped}:\\*\\*\\s*)(.*)`, 'i');
195
+ if (pattern.test(content)) {
196
+ content = content.replace(pattern, `$1${value}`);
197
+ writeStateFile(statePath, content);
198
+ output({ updated: true });
199
+ }
200
+ else {
201
+ // Try underscore-to-space mapping (e.g., "current_plan" -> "Current plan")
202
+ const normalizedField = field.replace(/_/g, ' ');
203
+ if (normalizedField !== field) {
204
+ const normalizedEscaped = normalizedField.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
205
+ const normalizedPattern = new RegExp(`(\\*\\*${normalizedEscaped}:\\*\\*\\s*)(.*)`, 'i');
206
+ if (normalizedPattern.test(content)) {
207
+ content = content.replace(normalizedPattern, `$1${value}`);
208
+ writeStateFile(statePath, content);
209
+ output({ updated: true });
210
+ }
211
+ else {
212
+ output({ updated: false, reason: `Field "${field}" not found in STATE.md` });
213
+ }
214
+ }
215
+ else {
216
+ output({ updated: false, reason: `Field "${field}" not found in STATE.md` });
217
+ }
218
+ }
219
+ }
220
+ catch {
221
+ output({ updated: false, reason: 'STATE.md not found' });
222
+ }
223
+ }
224
+ // ─── State Progression Engine ────────────────────────────────────────────────
225
+ /**
226
+ * CLI command: Increment the current plan counter in STATE.md, detecting last-plan edge case.
227
+ * @param cwd - Project working directory
228
+ * @param raw - Output raw text instead of JSON
229
+ */
230
+ function cmdStateAdvancePlan(cwd, raw) {
231
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
232
+ let content;
233
+ try {
234
+ content = readStateFile(statePath);
235
+ }
236
+ catch {
237
+ output({ error: 'STATE.md not found' }, raw);
238
+ return;
239
+ }
240
+ const currentPlan = parseInt(stateExtractField(content, 'Current Plan') || '', 10);
241
+ const totalPlans = parseInt(stateExtractField(content, 'Total Plans in Phase') || '', 10);
242
+ const today = new Date().toISOString().split('T')[0];
243
+ if (isNaN(currentPlan) || isNaN(totalPlans)) {
244
+ output({ error: 'Cannot parse Current Plan or Total Plans in Phase from STATE.md' }, raw);
245
+ return;
246
+ }
247
+ if (currentPlan >= totalPlans) {
248
+ content =
249
+ stateReplaceField(content, 'Status', 'Phase complete \u2014 ready for verification') ||
250
+ content;
251
+ content = stateReplaceField(content, 'Last Activity', today) || content;
252
+ writeStateFile(statePath, content);
253
+ output({
254
+ advanced: false,
255
+ reason: 'last_plan',
256
+ current_plan: currentPlan,
257
+ total_plans: totalPlans,
258
+ status: 'ready_for_verification',
259
+ }, raw, 'false');
260
+ }
261
+ else {
262
+ const newPlan = currentPlan + 1;
263
+ content = stateReplaceField(content, 'Current Plan', String(newPlan)) || content;
264
+ content = stateReplaceField(content, 'Status', 'Ready to execute') || content;
265
+ content = stateReplaceField(content, 'Last Activity', today) || content;
266
+ writeStateFile(statePath, content);
267
+ output({
268
+ advanced: true,
269
+ previous_plan: currentPlan,
270
+ current_plan: newPlan,
271
+ total_plans: totalPlans,
272
+ }, raw, 'true');
273
+ }
274
+ }
275
+ /**
276
+ * CLI command: Append a row to the Performance Metrics table in STATE.md.
277
+ * @param cwd - Project working directory
278
+ * @param options - Metric options including phase, plan, duration
279
+ * @param raw - Output raw text instead of JSON
280
+ */
281
+ function cmdStateRecordMetric(cwd, options, raw) {
282
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
283
+ let content;
284
+ try {
285
+ content = readStateFile(statePath);
286
+ }
287
+ catch {
288
+ output({ error: 'STATE.md not found' }, raw);
289
+ return;
290
+ }
291
+ const { phase, plan, duration, tasks, files } = options;
292
+ if (!phase || !plan || !duration) {
293
+ output({ error: 'phase, plan, and duration required' }, raw);
294
+ return;
295
+ }
296
+ // Find Performance Metrics section and its table
297
+ const metricsPattern = /(##\s*Performance Metrics[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n)([\s\S]*?)(?=\n##|\n$|$)/i;
298
+ const metricsMatch = content.match(metricsPattern);
299
+ if (metricsMatch) {
300
+ const tableHeader = metricsMatch[1];
301
+ let tableBody = metricsMatch[2].trimEnd();
302
+ const newRow = `| Phase ${phase} P${plan} | ${duration} | ${tasks || '-'} tasks | ${files || '-'} files |`;
303
+ if (tableBody.trim() === '' || tableBody.includes('None yet')) {
304
+ tableBody = newRow;
305
+ }
306
+ else {
307
+ tableBody = tableBody + '\n' + newRow;
308
+ }
309
+ content = content.replace(metricsPattern, `${tableHeader}${tableBody}\n`);
310
+ writeStateFile(statePath, content);
311
+ output({ recorded: true, phase, plan, duration }, raw, 'true');
312
+ }
313
+ else {
314
+ output({ recorded: false, reason: 'Performance Metrics section not found in STATE.md' }, raw, 'false');
315
+ }
316
+ }
317
+ /**
318
+ * CLI command: Recalculate and update the progress bar in STATE.md from disk state.
319
+ * @param cwd - Project working directory
320
+ * @param raw - Output raw text instead of JSON
321
+ */
322
+ function cmdStateUpdateProgress(cwd, raw) {
323
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
324
+ let content;
325
+ try {
326
+ content = readStateFile(statePath);
327
+ }
328
+ catch {
329
+ output({ error: 'STATE.md not found' }, raw);
330
+ return;
331
+ }
332
+ // Count summaries across all phases
333
+ const phasesDir = getPhasesDirPath(cwd);
334
+ let totalPlans = 0;
335
+ let totalSummaries = 0;
336
+ if (fs.existsSync(phasesDir)) {
337
+ const phaseDirs = fs
338
+ .readdirSync(phasesDir, { withFileTypes: true })
339
+ .filter((e) => e.isDirectory())
340
+ .map((e) => e.name);
341
+ for (const dir of phaseDirs) {
342
+ const files = fs.readdirSync(path.join(phasesDir, dir));
343
+ totalPlans += files.filter((f) => f.match(/-PLAN\.md$/i)).length;
344
+ totalSummaries += files.filter((f) => f.match(/-SUMMARY\.md$/i)).length;
345
+ }
346
+ }
347
+ const percent = totalPlans > 0 ? Math.round((totalSummaries / totalPlans) * 100) : 0;
348
+ const barWidth = 10;
349
+ const filled = Math.round((percent / 100) * barWidth);
350
+ const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(barWidth - filled);
351
+ const progressStr = `[${bar}] ${percent}%`;
352
+ const progressPattern = /(\*\*Progress:\*\*\s*).*/i;
353
+ if (progressPattern.test(content)) {
354
+ content = content.replace(progressPattern, `$1${progressStr}`);
355
+ writeStateFile(statePath, content);
356
+ output({
357
+ updated: true,
358
+ percent,
359
+ completed: totalSummaries,
360
+ total: totalPlans,
361
+ bar: progressStr,
362
+ }, raw, progressStr);
363
+ }
364
+ else {
365
+ output({ updated: false, reason: 'Progress field not found in STATE.md' }, raw, 'false');
366
+ }
367
+ }
368
+ /**
369
+ * CLI command: Add a decision entry to the Decisions section in STATE.md.
370
+ * @param cwd - Project working directory
371
+ * @param options - Decision options including summary and optional phase/rationale
372
+ * @param raw - Output raw text instead of JSON
373
+ */
374
+ function cmdStateAddDecision(cwd, options, raw) {
375
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
376
+ const { phase, summary, rationale } = options;
377
+ if (!summary) {
378
+ output({ error: 'summary required' }, raw);
379
+ return;
380
+ }
381
+ let content;
382
+ try {
383
+ content = readStateFile(statePath);
384
+ }
385
+ catch {
386
+ output({ error: 'STATE.md not found' }, raw);
387
+ return;
388
+ }
389
+ const entry = `- [Phase ${phase || '?'}]: ${summary}${rationale ? ` \u2014 ${rationale}` : ''}`;
390
+ // Find Decisions section (various heading patterns)
391
+ const sectionPattern = /(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
392
+ const match = content.match(sectionPattern);
393
+ if (match) {
394
+ let sectionBody = match[2];
395
+ // Remove placeholders
396
+ sectionBody = sectionBody
397
+ .replace(/None yet\.?\s*\n?/gi, '')
398
+ .replace(/No decisions yet\.?\s*\n?/gi, '');
399
+ sectionBody = sectionBody.trimEnd() + '\n' + entry + '\n';
400
+ content = content.replace(sectionPattern, `${match[1]}${sectionBody}`);
401
+ writeStateFile(statePath, content);
402
+ output({ added: true, decision: entry }, raw, 'true');
403
+ }
404
+ else {
405
+ output({ added: false, reason: 'Decisions section not found in STATE.md' }, raw, 'false');
406
+ }
407
+ }
408
+ /**
409
+ * CLI command: Add a blocker entry to the Blockers section in STATE.md.
410
+ * @param cwd - Project working directory
411
+ * @param text - Blocker description text
412
+ * @param raw - Output raw text instead of JSON
413
+ */
414
+ function cmdStateAddBlocker(cwd, text, raw) {
415
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
416
+ if (!text) {
417
+ output({ error: 'text required' }, raw);
418
+ return;
419
+ }
420
+ let content;
421
+ try {
422
+ content = readStateFile(statePath);
423
+ }
424
+ catch {
425
+ output({ error: 'STATE.md not found' }, raw);
426
+ return;
427
+ }
428
+ const entry = `- ${text}`;
429
+ const sectionPattern = /(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
430
+ const match = content.match(sectionPattern);
431
+ if (match) {
432
+ let sectionBody = match[2];
433
+ sectionBody = sectionBody.replace(/None\.?\s*\n?/gi, '').replace(/None yet\.?\s*\n?/gi, '');
434
+ sectionBody = sectionBody.trimEnd() + '\n' + entry + '\n';
435
+ content = content.replace(sectionPattern, `${match[1]}${sectionBody}`);
436
+ writeStateFile(statePath, content);
437
+ output({ added: true, blocker: text }, raw, 'true');
438
+ }
439
+ else {
440
+ output({ added: false, reason: 'Blockers section not found in STATE.md' }, raw, 'false');
441
+ }
442
+ }
443
+ /**
444
+ * CLI command: Remove a matching blocker entry from the Blockers section in STATE.md.
445
+ * @param cwd - Project working directory
446
+ * @param text - Text to match against existing blocker entries (case-insensitive)
447
+ * @param raw - Output raw text instead of JSON
448
+ */
449
+ function cmdStateResolveBlocker(cwd, text, raw) {
450
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
451
+ if (!text) {
452
+ output({ error: 'text required' }, raw);
453
+ return;
454
+ }
455
+ let content;
456
+ try {
457
+ content = readStateFile(statePath);
458
+ }
459
+ catch {
460
+ output({ error: 'STATE.md not found' }, raw);
461
+ return;
462
+ }
463
+ const sectionPattern = /(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
464
+ const match = content.match(sectionPattern);
465
+ if (match) {
466
+ const sectionBody = match[2];
467
+ const lines = sectionBody.split('\n');
468
+ const filtered = lines.filter((line) => {
469
+ if (!line.startsWith('- '))
470
+ return true;
471
+ return !line.toLowerCase().includes(text.toLowerCase());
472
+ });
473
+ let newBody = filtered.join('\n');
474
+ // If section is now empty, add placeholder
475
+ if (!newBody.trim() || !newBody.includes('- ')) {
476
+ newBody = 'None\n';
477
+ }
478
+ content = content.replace(sectionPattern, `${match[1]}${newBody}`);
479
+ writeStateFile(statePath, content);
480
+ output({ resolved: true, blocker: text }, raw, 'true');
481
+ }
482
+ else {
483
+ output({ resolved: false, reason: 'Blockers section not found in STATE.md' }, raw, 'false');
484
+ }
485
+ }
486
+ /**
487
+ * CLI command: Update session continuity fields in STATE.md.
488
+ * @param cwd - Project working directory
489
+ * @param options - Session options (stopped_at, resume_file)
490
+ * @param raw - Output raw text instead of JSON
491
+ */
492
+ function cmdStateRecordSession(cwd, options, raw) {
493
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
494
+ let content;
495
+ try {
496
+ content = readStateFile(statePath);
497
+ }
498
+ catch {
499
+ output({ error: 'STATE.md not found' }, raw);
500
+ return;
501
+ }
502
+ const now = new Date().toISOString();
503
+ const updated = [];
504
+ // Update Last session / Last Date
505
+ let result = stateReplaceField(content, 'Last session', now);
506
+ if (result) {
507
+ content = result;
508
+ updated.push('Last session');
509
+ }
510
+ result = stateReplaceField(content, 'Last Date', now);
511
+ if (result) {
512
+ content = result;
513
+ updated.push('Last Date');
514
+ }
515
+ // Update Stopped at
516
+ if (options.stopped_at) {
517
+ result = stateReplaceField(content, 'Stopped At', options.stopped_at);
518
+ if (!result)
519
+ result = stateReplaceField(content, 'Stopped at', options.stopped_at);
520
+ if (result) {
521
+ content = result;
522
+ updated.push('Stopped At');
523
+ }
524
+ }
525
+ // Update Resume file
526
+ const resumeFile = options.resume_file || 'None';
527
+ result = stateReplaceField(content, 'Resume File', resumeFile);
528
+ if (!result)
529
+ result = stateReplaceField(content, 'Resume file', resumeFile);
530
+ if (result) {
531
+ content = result;
532
+ updated.push('Resume File');
533
+ }
534
+ if (updated.length > 0) {
535
+ writeStateFile(statePath, content);
536
+ output({ recorded: true, updated }, raw, 'true');
537
+ }
538
+ else {
539
+ output({ recorded: false, reason: 'No session fields found in STATE.md' }, raw, 'false');
540
+ }
541
+ }
542
+ // ─── State Snapshot ──────────────────────────────────────────────────────────
543
+ /**
544
+ * CLI command: Parse STATE.md into a structured JSON snapshot with all fields, decisions, and blockers.
545
+ * @param cwd - Project working directory
546
+ * @param raw - Output raw text instead of JSON
547
+ * @param opts - Options (e.g., since timestamp for diff)
548
+ */
549
+ function cmdStateSnapshot(cwd, raw, opts) {
550
+ const options = opts || {};
551
+ const statePath = path.join(cwd, '.planning', 'STATE.md');
552
+ let content;
553
+ try {
554
+ content = readStateFile(statePath);
555
+ }
556
+ catch {
557
+ output({ error: 'STATE.md not found' }, raw);
558
+ return;
559
+ }
560
+ // Helper to extract **Field:** value patterns
561
+ const extractField = (fieldName) => {
562
+ const pattern = new RegExp(`\\*\\*${fieldName}:\\*\\*\\s*(.+)`, 'i');
563
+ const match = content.match(pattern);
564
+ return match ? match[1].trim() : null;
565
+ };
566
+ // Extract basic fields -- support both "Active phase" and legacy "Current Phase" formats
567
+ let currentPhase = extractField('Active phase') || extractField('Current Phase');
568
+ let currentPhaseName = extractField('Current Phase Name');
569
+ let totalPhasesRaw = extractField('Total Phases');
570
+ // Parse "Active phase" format: "Phase N of M (Name)" or "N (slug) -- STATUS"
571
+ if (currentPhase) {
572
+ const activePhaseMatch = currentPhase.match(/Phase\s+(\d+)\s+of\s+(\d+)\s*(?:\(([^)]+)\))?/i);
573
+ if (activePhaseMatch) {
574
+ currentPhase = activePhaseMatch[1];
575
+ if (!totalPhasesRaw)
576
+ totalPhasesRaw = activePhaseMatch[2];
577
+ if (!currentPhaseName && activePhaseMatch[3])
578
+ currentPhaseName = activePhaseMatch[3];
579
+ }
580
+ }
581
+ const currentPlan = extractField('Current plan') || extractField('Current Plan');
582
+ const totalPlansRaw = extractField('Total Plans in Phase');
583
+ const status = extractField('Status');
584
+ const progressRaw = extractField('Progress');
585
+ const lastActivity = extractField('Last Activity');
586
+ const lastActivityDesc = extractField('Last Activity Description');
587
+ const pausedAt = extractField('Paused At');
588
+ // Parse numeric fields
589
+ const totalPhases = totalPhasesRaw ? parseInt(totalPhasesRaw, 10) : null;
590
+ const totalPlansInPhase = totalPlansRaw ? parseInt(totalPlansRaw, 10) : null;
591
+ const progressPercent = progressRaw
592
+ ? parseInt(progressRaw.replace('%', ''), 10)
593
+ : null;
594
+ // Extract decisions table
595
+ const decisions = [];
596
+ const decisionsMatch = content.match(/##\s*Decisions Made[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n([\s\S]*?)(?=\n##|\n$|$)/i);
597
+ if (decisionsMatch) {
598
+ const tableBody = decisionsMatch[1];
599
+ const rows = tableBody
600
+ .trim()
601
+ .split('\n')
602
+ .filter((r) => r.includes('|'));
603
+ for (const row of rows) {
604
+ const cells = row
605
+ .split('|')
606
+ .map((c) => c.trim())
607
+ .filter(Boolean);
608
+ if (cells.length >= 3) {
609
+ decisions.push({
610
+ phase: cells[0],
611
+ summary: cells[1],
612
+ rationale: cells[2],
613
+ });
614
+ }
615
+ }
616
+ }
617
+ // Extract blockers list
618
+ const blockers = [];
619
+ const blockersMatch = content.match(/##\s*Blockers\s*\n([\s\S]*?)(?=\n##|$)/i);
620
+ if (blockersMatch) {
621
+ const blockersSection = blockersMatch[1];
622
+ const items = blockersSection.match(/^-\s+(.+)$/gm);
623
+ if (items) {
624
+ for (const item of items) {
625
+ blockers.push(item.replace(/^-\s+/, '').trim());
626
+ }
627
+ }
628
+ }
629
+ // Extract session info
630
+ const session = {
631
+ last_date: null,
632
+ stopped_at: null,
633
+ resume_file: null,
634
+ };
635
+ const sessionMatch = content.match(/##\s*Session\s*\n([\s\S]*?)(?=\n##|$)/i);
636
+ if (sessionMatch) {
637
+ const sessionSection = sessionMatch[1];
638
+ const lastDateMatch = sessionSection.match(/\*\*Last Date:\*\*\s*(.+)/i);
639
+ const stoppedAtMatch = sessionSection.match(/\*\*Stopped At:\*\*\s*(.+)/i);
640
+ const resumeFileMatch = sessionSection.match(/\*\*Resume File:\*\*\s*(.+)/i);
641
+ if (lastDateMatch)
642
+ session.last_date = lastDateMatch[1].trim();
643
+ if (stoppedAtMatch)
644
+ session.stopped_at = stoppedAtMatch[1].trim();
645
+ if (resumeFileMatch)
646
+ session.resume_file = resumeFileMatch[1].trim();
647
+ }
648
+ const result = {
649
+ current_phase: currentPhase,
650
+ current_phase_name: currentPhaseName,
651
+ total_phases: totalPhases,
652
+ current_plan: currentPlan,
653
+ total_plans_in_phase: totalPlansInPhase,
654
+ status,
655
+ progress_percent: progressPercent,
656
+ last_activity: lastActivity,
657
+ last_activity_desc: lastActivityDesc,
658
+ decisions,
659
+ blockers,
660
+ paused_at: pausedAt,
661
+ session,
662
+ };
663
+ // Save snapshot to .planning/.snapshots/ directory
664
+ const snapshotsDir = path.join(cwd, '.planning', '.snapshots');
665
+ try {
666
+ fs.mkdirSync(snapshotsDir, { recursive: true });
667
+ const ts = new Date().toISOString();
668
+ const snapshotData = {
669
+ current_phase: currentPhase,
670
+ status,
671
+ decisions,
672
+ blockers,
673
+ };
674
+ fs.writeFileSync(path.join(snapshotsDir, `${ts}.json`), JSON.stringify(snapshotData), 'utf-8');
675
+ }
676
+ catch {
677
+ // Non-blocking: snapshot save failure doesn't break the command
678
+ }
679
+ // --since diff mode: compare current state to saved snapshot
680
+ if (options.since) {
681
+ const baselinePath = path.join(snapshotsDir, `${options.since}.json`);
682
+ let baseline;
683
+ try {
684
+ baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf-8'));
685
+ }
686
+ catch {
687
+ output({ error: `No snapshot found for timestamp: ${options.since}`, full_snapshot: result }, raw);
688
+ return;
689
+ }
690
+ // Compute changed scalar fields
691
+ const changed_fields = {};
692
+ const scalarKeys = ['current_phase', 'status'];
693
+ for (const key of scalarKeys) {
694
+ const cur = result[key];
695
+ const base = baseline[key];
696
+ if (cur !== base) {
697
+ changed_fields[key] = { from: base ?? null, to: cur ?? null };
698
+ }
699
+ }
700
+ // Compute new decisions (in current but not in baseline)
701
+ const baseDecisionSet = new Set((baseline.decisions || []).map((d) => `${d.phase}|${d.summary}`));
702
+ const new_decisions = (result.decisions || []).filter((d) => !baseDecisionSet.has(`${d.phase}|${d.summary}`));
703
+ // Compute new/resolved blockers
704
+ const baseBlockerSet = new Set(baseline.blockers || []);
705
+ const curBlockerSet = new Set(result.blockers || []);
706
+ const new_blockers = (result.blockers || []).filter((b) => !baseBlockerSet.has(b));
707
+ const resolved_blockers = (baseline.blockers || []).filter((b) => !curBlockerSet.has(b));
708
+ const has_changes = Object.keys(changed_fields).length > 0 ||
709
+ new_decisions.length > 0 ||
710
+ new_blockers.length > 0 ||
711
+ resolved_blockers.length > 0;
712
+ const diffResult = {
713
+ since: options.since,
714
+ changed_fields,
715
+ new_decisions,
716
+ new_blockers,
717
+ resolved_blockers,
718
+ has_changes,
719
+ };
720
+ output(diffResult, raw, `${has_changes ? `Changes since ${options.since}: ${Object.keys(changed_fields).length} field(s), ${new_decisions.length} decision(s)` : `No changes since ${options.since}`}`);
721
+ return;
722
+ }
723
+ output(result, raw, `Phase ${result.current_phase || 'none'} (${result.status || 'unknown'}) - ${result.progress_percent}%`);
724
+ }
725
+ // ─── Exports ─────────────────────────────────────────────────────────────────
726
+ module.exports = {
727
+ // Internal helpers (exported for testing)
728
+ stateExtractField,
729
+ stateReplaceField,
730
+ // Command functions
731
+ cmdStateLoad,
732
+ cmdStateGet,
733
+ cmdStatePatch,
734
+ cmdStateUpdate,
735
+ cmdStateAdvancePlan,
736
+ cmdStateRecordMetric,
737
+ cmdStateUpdateProgress,
738
+ cmdStateAddDecision,
739
+ cmdStateAddBlocker,
740
+ cmdStateResolveBlocker,
741
+ cmdStateRecordSession,
742
+ cmdStateSnapshot,
743
+ };
744
+ //# sourceMappingURL=state.js.map