gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.a947d025c

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 (720) hide show
  1. package/README.md +35 -59
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  18. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  20. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  21. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  23. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  31. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  32. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  33. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  34. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  36. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  37. package/dist/resources/extensions/gsd/auto.js +273 -87
  38. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  40. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  41. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  42. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  43. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  44. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +341 -55
  47. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  48. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +147 -2
  50. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  51. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  52. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  54. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  55. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  56. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  57. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  58. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  59. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  60. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  61. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  62. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  63. package/dist/resources/extensions/gsd/detection.js +106 -0
  64. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  65. package/dist/resources/extensions/gsd/git-service.js +73 -5
  66. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  67. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  68. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  69. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  70. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  71. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  72. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  74. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  75. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  76. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  82. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  84. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  86. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  88. package/dist/resources/extensions/gsd/quick.js +34 -2
  89. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  90. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  91. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  92. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  93. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  94. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  95. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  96. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  97. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  98. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  99. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  100. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  101. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  103. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  104. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  106. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  107. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  108. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  109. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  110. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  111. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  112. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  113. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  114. package/dist/web/standalone/.next/BUILD_ID +1 -1
  115. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  116. package/dist/web/standalone/.next/build-manifest.json +3 -3
  117. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  118. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  119. package/dist/web/standalone/.next/required-server-files.json +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.html +1 -1
  139. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  142. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  147. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/middleware.js +3 -3
  150. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  151. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  152. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  153. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  154. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  155. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  156. package/dist/web/standalone/server.js +1 -1
  157. package/dist/welcome-screen.d.ts +2 -0
  158. package/dist/welcome-screen.js +9 -7
  159. package/package.json +6 -4
  160. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  161. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  162. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  163. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  164. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  165. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  166. package/packages/native/tsconfig.tsbuildinfo +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  169. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  170. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  171. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  172. package/packages/pi-agent-core/dist/agent.js +43 -11
  173. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  174. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  175. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  176. package/packages/pi-agent-core/dist/index.js +2 -0
  177. package/packages/pi-agent-core/dist/index.js.map +1 -1
  178. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  179. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  180. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  181. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  182. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  183. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  184. package/packages/pi-agent-core/dist/types.js.map +1 -1
  185. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  186. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  187. package/packages/pi-agent-core/src/agent.ts +52 -11
  188. package/packages/pi-agent-core/src/index.ts +2 -0
  189. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  190. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  191. package/packages/pi-agent-core/src/types.ts +26 -10
  192. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  194. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  196. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  198. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  199. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  200. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  202. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  203. package/packages/pi-ai/dist/types.d.ts +2 -0
  204. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/types.js.map +1 -1
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  207. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  209. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  211. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  212. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  213. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  214. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  215. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  216. package/packages/pi-ai/src/types.ts +3 -0
  217. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  218. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  219. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  220. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  226. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  228. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  230. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  234. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  238. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  246. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  249. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  255. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  257. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  260. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  264. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  266. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  268. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  270. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  272. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  274. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  276. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  278. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  280. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  282. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  284. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  288. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  292. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  296. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  300. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  304. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  306. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  308. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  310. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  312. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  314. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  322. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  324. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  326. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  352. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  355. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  359. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  366. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  369. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  370. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  371. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  372. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  374. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  375. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  376. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  377. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  378. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  379. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  380. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  381. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  382. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  383. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  384. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  385. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  386. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  387. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  389. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  390. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  391. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  392. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  393. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  394. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  395. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  396. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  397. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  399. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  400. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  401. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  402. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  404. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  406. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  408. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  409. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  410. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  412. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  413. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  414. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  415. package/packages/pi-tui/dist/tui.js +18 -8
  416. package/packages/pi-tui/dist/tui.js.map +1 -1
  417. package/packages/pi-tui/src/tui.ts +20 -8
  418. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  419. package/packages/rpc-client/README.md +7 -0
  420. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  421. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  422. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  423. package/src/resources/GSD-WORKFLOW.md +2 -2
  424. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  425. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  426. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  427. package/src/resources/extensions/github-sync/sync.ts +8 -1
  428. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  429. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  430. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  431. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  432. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  433. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  434. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  435. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  436. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  437. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  438. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  439. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  440. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  441. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  442. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  443. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  444. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  445. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  446. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  447. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  448. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  449. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  450. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  451. package/src/resources/extensions/gsd/auto.ts +336 -89
  452. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  453. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  454. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  455. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  456. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  457. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  458. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  459. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  460. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +396 -55
  461. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  462. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  463. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +153 -2
  464. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  465. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  466. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  467. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  468. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  469. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  470. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  471. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  472. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  473. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  474. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  475. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  476. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  477. package/src/resources/extensions/gsd/detection.ts +128 -0
  478. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  479. package/src/resources/extensions/gsd/git-service.ts +87 -10
  480. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  481. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  482. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  483. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  484. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  485. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  486. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  487. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  488. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  489. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  490. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  491. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  492. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  493. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  494. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  495. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  497. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  499. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  500. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  501. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  502. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  503. package/src/resources/extensions/gsd/quick.ts +37 -2
  504. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  505. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  506. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  507. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  508. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  509. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  510. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  511. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  512. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  513. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  514. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  515. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  516. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  517. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  518. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  519. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  520. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  521. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  522. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  523. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  524. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  525. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  526. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  527. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  528. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  529. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  530. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  531. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  532. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  533. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  534. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  535. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  537. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  538. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  539. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  540. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  541. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  542. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  544. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  545. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  546. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  547. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  548. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  549. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  550. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  551. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  552. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  553. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  554. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  555. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  556. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  557. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  558. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  559. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  560. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  561. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  562. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  563. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  564. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  565. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  566. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  567. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  568. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  569. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  570. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  571. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  572. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  573. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  574. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  575. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  576. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  577. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  578. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  579. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  580. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  581. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  583. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  584. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  585. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  586. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  587. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  588. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  589. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  590. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  591. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  592. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  593. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  594. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  595. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  596. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  597. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  598. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  599. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  600. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  601. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  602. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  603. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  604. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  605. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  606. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  607. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  608. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  609. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  610. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  611. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  612. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  613. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  614. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  615. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  616. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  617. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  618. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  619. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  620. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  621. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  622. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  623. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  624. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  625. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  626. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  627. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  628. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  629. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  630. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  632. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  633. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  634. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  635. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  636. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  637. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  638. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  639. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  640. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  641. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  642. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  643. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  644. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  645. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  646. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  647. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  648. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  649. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  650. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  651. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  652. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  653. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  654. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  655. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  656. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  657. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  658. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  659. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  660. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  661. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  662. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  663. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  664. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  665. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  666. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  667. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  668. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  669. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  670. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  671. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  672. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  673. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  674. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  675. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  676. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  677. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  678. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  679. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  680. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  681. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  682. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  683. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  684. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  685. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  686. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  687. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  688. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  689. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  690. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  691. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  692. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  693. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  694. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  695. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  696. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  697. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  698. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  699. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  700. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  701. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  702. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  703. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  704. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  705. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  706. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  707. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  708. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  709. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  710. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  711. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  712. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  713. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  714. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  715. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  716. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  717. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  718. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  719. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  720. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -1,72 +1,61 @@
1
1
  /**
2
- * Regression test for #3628 — restore tool set after discuss flow scoping
3
- *
4
- * The discuss flow narrows the active tool set to avoid "grammar too complex"
5
- * errors. Without restoring after sendMessage, the narrowed tools leaked into
6
- * subsequent dispatches, breaking plan/execute flows.
7
- *
8
- * The fix saves the full tool set before scoping and restores it after
9
- * sendMessage returns.
2
+ * Regression test for #3628 — restore tool set after discuss flow scoping.
10
3
  */
11
4
 
12
- import { describe, it } from 'node:test'
13
- import assert from 'node:assert/strict'
14
- import { readFileSync } from 'node:fs'
15
- import { resolve } from 'node:path'
16
- import { extractSourceRegion } from "./test-helpers.ts";
17
-
18
- const src = readFileSync(
19
- resolve(process.cwd(), 'src', 'resources', 'extensions', 'gsd', 'guided-flow.ts'),
20
- 'utf-8',
21
- )
22
-
23
- describe('restore tools after discuss flow scoping (#3628)', () => {
24
- it('savedTools is declared before the discuss scoping block', () => {
25
- // savedTools must be declared before the discuss-* check
26
- const savedToolsDecl = src.indexOf('let savedTools')
27
- const discussCheck = src.indexOf('if (unitType?.startsWith("discuss-"))')
28
- assert.ok(savedToolsDecl !== -1, 'savedTools variable must be declared')
29
- assert.ok(discussCheck !== -1, 'discuss-* type check must exist')
30
- assert.ok(
31
- savedToolsDecl < discussCheck,
32
- 'savedTools must be declared before the discuss scoping block',
33
- )
34
- })
35
-
36
- it('savedTools captures current tools inside the discuss block', () => {
37
- const discussCheck = src.indexOf('if (unitType?.startsWith("discuss-"))')
38
- assert.ok(discussCheck !== -1)
39
-
40
- // Look for savedTools assignment within the discuss block
41
- const blockAfter = extractSourceRegion(src, 'if (unitType?.startsWith("discuss-"))')
42
- assert.ok(
43
- blockAfter.includes('savedTools = currentTools'),
44
- 'savedTools must be assigned from currentTools inside the discuss block',
45
- )
46
- })
47
-
48
- it('savedTools is restored after sendMessage', () => {
49
- // #4573: guided-flow.ts now contains multiple `triggerTurn: true` calls
50
- // (ready-phrase and empty-turn recovery paths). The discuss-flow scoping
51
- // sendMessage is the one that follows `savedTools = currentTools`, so
52
- // anchor the search there rather than at the first `triggerTurn: true`.
53
- const savedToolsAssign = src.indexOf('savedTools = currentTools')
54
- assert.ok(savedToolsAssign !== -1, 'savedTools = currentTools must exist')
55
-
56
- const sendMsg = src.indexOf('triggerTurn: true', savedToolsAssign)
57
- assert.ok(sendMsg !== -1, 'discuss-flow sendMessage with triggerTurn must exist after savedTools capture')
58
-
59
- // After sendMessage, savedTools should be restored via setActiveTools.
60
- // Use fromIdx to anchor at the discuss-flow sendMessage, not the first
61
- // triggerTurn: true occurrence in the file.
62
- const afterSend = extractSourceRegion(src, 'triggerTurn: true', { fromIdx: savedToolsAssign })
63
- assert.ok(
64
- afterSend.includes('if (savedTools)'),
65
- 'savedTools restoration guard must exist after sendMessage',
66
- )
67
- assert.ok(
68
- afterSend.includes('setActiveTools(savedTools)'),
69
- 'setActiveTools(savedTools) must be called to restore the full tool set',
70
- )
71
- })
72
- })
5
+ import test from "node:test";
6
+ import assert from "node:assert/strict";
7
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { tmpdir } from "node:os";
10
+
11
+ import { _dispatchWorkflowForTest } from "../guided-flow.ts";
12
+
13
+ test("discuss workflow scopes tools for the queued turn and restores the full tool set", async () => {
14
+ const dir = mkdtempSync(join(tmpdir(), "gsd-discuss-tools-"));
15
+ const workflowPath = join(dir, "GSD-WORKFLOW.md");
16
+ const originalWorkflowPath = process.env.GSD_WORKFLOW_PATH;
17
+ const originalTools = [
18
+ "gsd_task_complete",
19
+ "gsd_summary_save",
20
+ "shell_exec",
21
+ "gsd_plan_milestone",
22
+ ];
23
+ let activeTools = [...originalTools];
24
+ let sentTools: string[] | null = null;
25
+ let triggerTurn = false;
26
+
27
+ const pi = {
28
+ getActiveTools: () => [...activeTools],
29
+ setActiveTools: (tools: string[]) => {
30
+ activeTools = [...tools];
31
+ },
32
+ sendMessage: (_message: unknown, options?: { triggerTurn?: boolean }) => {
33
+ sentTools = [...activeTools];
34
+ triggerTurn = options?.triggerTurn === true;
35
+ },
36
+ };
37
+
38
+ try {
39
+ writeFileSync(workflowPath, "# Workflow\n", "utf-8");
40
+ process.env.GSD_WORKFLOW_PATH = workflowPath;
41
+
42
+ await _dispatchWorkflowForTest(
43
+ pi as any,
44
+ "Interview the user.",
45
+ "gsd-discuss",
46
+ undefined,
47
+ "discuss-milestone",
48
+ );
49
+
50
+ assert.deepEqual(sentTools, ["gsd_summary_save"]);
51
+ assert.deepEqual(activeTools, originalTools);
52
+ assert.equal(triggerTurn, true);
53
+ } finally {
54
+ if (originalWorkflowPath === undefined) {
55
+ delete process.env.GSD_WORKFLOW_PATH;
56
+ } else {
57
+ process.env.GSD_WORKFLOW_PATH = originalWorkflowPath;
58
+ }
59
+ rmSync(dir, { recursive: true, force: true });
60
+ }
61
+ });
@@ -1,15 +1,6 @@
1
1
  /**
2
- * Tests for fix of #3723: auto-mode resume/crash-recovery dispatches
3
- * from project root instead of milestone worktree.
4
- *
5
- * During resume, the paused-session metadata may record `worktreePath` that
6
- * was active when the session paused. The resume path must use that path (or
7
- * derive the worktree path via filesystem lookup) to set the dispatch context
8
- * (`s.basePath`), rather than defaulting to the project root.
9
- *
10
- * The fix adds an early worktree-path resolution step in the paused-session
11
- * resume block of auto.ts — immediately after `s.basePath = base` — so that
12
- * the correct dispatch directory is used before the dispatch loop runs.
2
+ * Tests for fix of #3723: auto-mode resume/crash-recovery dispatches from
3
+ * the paused milestone worktree when that worktree still exists.
13
4
  */
14
5
 
15
6
  import test from "node:test";
@@ -18,95 +9,8 @@ import { readFileSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
18
9
  import { join } from "node:path";
19
10
  import { tmpdir } from "node:os";
20
11
  import { randomUUID } from "node:crypto";
21
- import { fileURLToPath } from "node:url";
22
- import { dirname } from "node:path";
23
12
 
24
- const __dirname = dirname(fileURLToPath(import.meta.url));
25
- const autoSrc = readFileSync(join(__dirname, "..", "auto.ts"), "utf-8");
26
-
27
- // ── Source-structure tests ────────────────────────────────────────────────────
28
-
29
- /**
30
- * Extract the paused-session resume block from auto.ts.
31
- *
32
- * The block we care about is the `if (s.paused) { ... }` section inside
33
- * startAuto, which contains `s.basePath = base` (line ~1473) followed by the
34
- * `enterMilestone` call.
35
- *
36
- * We find it by locating the `s.basePath = base` assignment that appears
37
- * WITHIN the s.paused branch (there's only one: all other basePath assignments
38
- * use originalBasePath or a different value). We extract from that assignment
39
- * up to just before `enterMilestone(`.
40
- */
41
- function getBasepathToEnterMilestoneSegment(): string {
42
- // Find `s.basePath = base;` in the s.paused branch
43
- // This assignment appears uniquely inside the resume block
44
- const assignPattern = "s.basePath = base;";
45
- const assignIdx = autoSrc.indexOf(assignPattern);
46
- assert.ok(
47
- assignIdx > -1,
48
- `auto.ts must contain '${assignPattern}' in the resume block`,
49
- );
50
-
51
- // Find the next enterMilestone call after this assignment
52
- const enterMilestoneIdx = autoSrc.indexOf("enterMilestone(", assignIdx);
53
- assert.ok(
54
- enterMilestoneIdx > assignIdx,
55
- "auto.ts must call enterMilestone after the s.basePath = base assignment",
56
- );
57
-
58
- // Return the code between the assignment and enterMilestone
59
- return autoSrc.slice(assignIdx, enterMilestoneIdx);
60
- }
61
-
62
- test("auto.ts resume block resolves paused-session worktreePath and applies it to s.basePath before entering worktree (fixes #3723)", () => {
63
- // The segment between `s.basePath = base` and `enterMilestone(` must
64
- // contain logic that resolves the paused-session worktreePath and applies
65
- // it to s.basePath when the worktree exists on disk.
66
- //
67
- // The fix reads the worktree path from freshStartAssessment.pausedSession
68
- // (since `meta` is out of scope at this point in startAuto) and assigns
69
- // it to s.basePath, guarded by existsSync.
70
- //
71
- // Without this fix, the dispatch loop runs from `base` (project root)
72
- // instead of the worktree, causing split-brain execution (#3723).
73
- const segment = getBasepathToEnterMilestoneSegment();
74
-
75
- // The fix uses freshStartAssessment.pausedSession?.worktreePath via a
76
- // local variable (resumeWorktreePath) and assigns to s.basePath.
77
- const hasWorktreePathResolution =
78
- segment.includes("worktreePath") &&
79
- segment.includes("existsSync") &&
80
- segment.includes("s.basePath =");
81
-
82
- assert.ok(
83
- hasWorktreePathResolution,
84
- "auto.ts must resolve the paused-session worktreePath, check existsSync, and assign " +
85
- "s.basePath before enterMilestone — crash-recovery currently dispatches from project root " +
86
- "instead of milestone worktree (issue #3723). The fix belongs between `s.basePath = base` " +
87
- "and the enterMilestone call.",
88
- );
89
- });
90
-
91
- test("auto.ts worktreePath assignment in resume block guards against non-existent path (fixes #3723)", () => {
92
- // The assignment to s.basePath from the paused-session worktreePath must
93
- // be guarded by existsSync to avoid setting an invalid basePath if the
94
- // worktree was cleaned up between pause and resume.
95
- const segment = getBasepathToEnterMilestoneSegment();
96
-
97
- // Must have existsSync guard AND a worktreePath reference AND s.basePath assignment
98
- const hasGuardedAssignment =
99
- segment.includes("existsSync") &&
100
- segment.includes("worktreePath") &&
101
- segment.includes("s.basePath =");
102
-
103
- assert.ok(
104
- hasGuardedAssignment,
105
- "auto.ts must guard the s.basePath = worktreePath assignment with existsSync (fixes #3723)",
106
- );
107
- });
108
-
109
- // ── Functional tests ──────────────────────────────────────────────────────────
13
+ import { _resolvePausedResumeBasePathForTest } from "../auto.ts";
110
14
 
111
15
  function makeTmpBase(): string {
112
16
  const base = join(tmpdir(), `gsd-resume-wt-${randomUUID()}`);
@@ -115,7 +19,7 @@ function makeTmpBase(): string {
115
19
  }
116
20
 
117
21
  function cleanup(base: string): void {
118
- try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
22
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
119
23
  }
120
24
 
121
25
  function writePausedSession(
@@ -142,7 +46,6 @@ function makeWorktreePath(base: string, milestoneId: string): string {
142
46
 
143
47
  function setupWorktreeOnDisk(wt: string): void {
144
48
  mkdirSync(wt, { recursive: true });
145
- // Simulate a git worktree: .git file with gitdir pointer
146
49
  writeFileSync(
147
50
  join(wt, ".git"),
148
51
  "gitdir: /project/.git/worktrees/M001-test\n",
@@ -150,81 +53,46 @@ function setupWorktreeOnDisk(wt: string): void {
150
53
  );
151
54
  }
152
55
 
153
- function writeRoadmap(base: string, milestoneId = "M001-test"): void {
154
- const milestoneDir = join(base, ".gsd", "milestones", milestoneId);
155
- mkdirSync(join(milestoneDir, "slices", "S01", "tasks"), { recursive: true });
156
- writeFileSync(
157
- join(milestoneDir, `${milestoneId}-ROADMAP.md`),
158
- [
159
- `# ${milestoneId}: Test Milestone`,
160
- "",
161
- "## Slices",
162
- "",
163
- "- [ ] **S01: Test slice** `risk:low`",
164
- " After this: Demo",
165
- ].join("\n"),
166
- "utf-8",
167
- );
168
- }
56
+ test("resume base path uses paused-session worktreePath when the worktree exists", () => {
57
+ const base = makeTmpBase();
58
+ const wt = makeWorktreePath(base, "M001-test");
59
+ try {
60
+ setupWorktreeOnDisk(wt);
61
+ assert.equal(
62
+ _resolvePausedResumeBasePathForTest(base, wt),
63
+ wt,
64
+ );
65
+ } finally {
66
+ cleanup(base);
67
+ }
68
+ });
169
69
 
170
- test("readPausedSessionMetadata round-trips worktreePath from paused-session.json", () => {
171
- // Verify that the paused-session metadata correctly stores and reads back
172
- // the worktreePath field — this is what the resume path in auto.ts uses
173
- // to determine the dispatch basePath (#3723).
174
- //
175
- // Implemented inline to avoid slow import chain from interrupted-session.ts.
70
+ test("resume base path falls back to project root when paused worktree is missing", () => {
71
+ const base = makeTmpBase();
72
+ const wt = makeWorktreePath(base, "M001-test");
73
+ try {
74
+ assert.equal(
75
+ _resolvePausedResumeBasePathForTest(base, wt),
76
+ base,
77
+ );
78
+ } finally {
79
+ cleanup(base);
80
+ }
81
+ });
82
+
83
+ test("read paused-session metadata round-trips worktreePath from paused-session.json", () => {
176
84
  const base = makeTmpBase();
177
85
  const wt = makeWorktreePath(base, "M001-test");
178
86
  try {
179
87
  setupWorktreeOnDisk(wt);
180
88
  writePausedSession(base, "M001-test", wt);
181
89
 
182
- // Simulate readPausedSessionMetadata without importing the full module
183
90
  const pausedPath = join(base, ".gsd", "runtime", "paused-session.json");
184
91
  const meta = JSON.parse(readFileSync(pausedPath, "utf-8"));
185
92
 
186
- assert.ok(meta, "paused-session metadata must be readable");
187
93
  assert.equal(meta.milestoneId, "M001-test");
188
- assert.equal(meta.worktreePath, wt, "worktreePath must round-trip through paused-session.json");
94
+ assert.equal(meta.worktreePath, wt);
189
95
  } finally {
190
96
  cleanup(base);
191
97
  }
192
98
  });
193
-
194
- test("auto.ts resume block uses worktreePath from freshStartAssessment.pausedSession as dispatch basePath when worktree exists (#3723)", () => {
195
- // End-to-end structural verification: the auto.ts source must contain code
196
- // that reads the worktreePath from freshStartAssessment.pausedSession AND
197
- // applies it to s.basePath (guarded by existsSync) between the
198
- // `s.basePath = base` assignment and `enterMilestone`.
199
- //
200
- // This is the core of the #3723 fix. Without this check, a session that
201
- // paused while operating inside a worktree will resume dispatching from the
202
- // project root, not the worktree — causing split-brain execution where some
203
- // operations target the worktree and others target the project root.
204
- const segment = getBasepathToEnterMilestoneSegment();
205
-
206
- // Must reference freshStartAssessment.pausedSession?.worktreePath or
207
- // equivalent local variable, AND contain an existsSync guard
208
- const hasAssessmentWorktreePath =
209
- segment.includes("freshStartAssessment.pausedSession") &&
210
- segment.includes("worktreePath");
211
-
212
- assert.ok(
213
- hasAssessmentWorktreePath,
214
- "auto.ts must read worktreePath from freshStartAssessment.pausedSession between " +
215
- "s.basePath=base and enterMilestone",
216
- );
217
- assert.ok(
218
- segment.includes("existsSync"),
219
- "auto.ts must guard worktreePath usage with existsSync",
220
- );
221
- // The actual basePath re-assignment must be present in the segment
222
- // (note: there are multiple `s.basePath =` assignments — we need one after
223
- // the initial `s.basePath = base` assignment within this segment)
224
- const worktreeAssignIdx = segment.lastIndexOf("s.basePath =");
225
- const baseAssignIdx = segment.indexOf("s.basePath = base");
226
- assert.ok(
227
- worktreeAssignIdx > baseAssignIdx,
228
- "auto.ts must assign s.basePath to the worktree path after `s.basePath = base` in the resume block",
229
- );
230
- });
@@ -0,0 +1,192 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { execFileSync } from "node:child_process";
4
+ import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { tmpdir } from "node:os";
7
+
8
+ import { buildCompleteMilestonePrompt, buildPlanMilestonePrompt } from "../auto-prompts.ts";
9
+
10
+ function git(cwd: string, args: string[]): string {
11
+ return execFileSync("git", args, {
12
+ cwd,
13
+ stdio: ["ignore", "pipe", "pipe"],
14
+ encoding: "utf-8",
15
+ env: { ...process.env, GIT_AUTHOR_NAME: "Test User", GIT_AUTHOR_EMAIL: "test@example.com", GIT_COMMITTER_NAME: "Test User", GIT_COMMITTER_EMAIL: "test@example.com" },
16
+ }).trim();
17
+ }
18
+
19
+ function makeRepo(files: Record<string, string>): string {
20
+ const base = mkdtempSync(join(tmpdir(), "gsd-right-size-"));
21
+ git(base, ["init", "-b", "main"]);
22
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
23
+ writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"), "# Context\n\nTest milestone.");
24
+ for (const [path, content] of Object.entries(files)) {
25
+ const abs = join(base, path);
26
+ mkdirSync(join(abs, ".."), { recursive: true });
27
+ writeFileSync(abs, content);
28
+ }
29
+ git(base, ["add", "."]);
30
+ git(base, ["commit", "-m", "init"]);
31
+ return base;
32
+ }
33
+
34
+ function writeCompleteMilestoneFiles(base: string, validation: string): void {
35
+ const dir = join(base, ".gsd", "milestones", "M001");
36
+ mkdirSync(join(dir, "slices", "S01"), { recursive: true });
37
+ writeFileSync(join(dir, "M001-ROADMAP.md"), "# M001\n\n## Slices\n- [x] **S01: One** `risk:low` `depends:[]`\n > Done\n");
38
+ writeFileSync(join(dir, "M001-VALIDATION.md"), validation);
39
+ writeFileSync(join(dir, "slices", "S01", "S01-SUMMARY.md"), "# S01 Summary\n\n**Verification:** passed\n");
40
+ }
41
+
42
+ function validationMetadata(): string {
43
+ return [
44
+ "validation_metadata:",
45
+ " covered_artifacts:",
46
+ " - `.gsd/milestones/M001/M001-VALIDATION.md`",
47
+ " - `.gsd/milestones/M001/M001-ROADMAP.md`",
48
+ " - `.gsd/milestones/M001/slices/S01/S01-SUMMARY.md`",
49
+ ].join("\n");
50
+ }
51
+
52
+ test("plan-milestone prompt includes tiny untyped project classification and one-slice guidance", async () => {
53
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
54
+ try {
55
+ const prompt = await buildPlanMilestonePrompt("M001", "Polish static page", base, "minimal");
56
+ assert.match(prompt, /\*\*Kind:\*\* untyped-existing/);
57
+ assert.match(prompt, /\*\*Content files:\*\* 1/);
58
+ assert.match(prompt, /`index\.html`/);
59
+ assert.match(prompt, /Prefer exactly one slice/);
60
+ } finally {
61
+ rmSync(base, { recursive: true, force: true });
62
+ }
63
+ });
64
+
65
+ test("plan-milestone prompt includes small untyped project 1-2 slice guidance", async () => {
66
+ const base = makeRepo({
67
+ "index.html": "html",
68
+ "README.md": "readme",
69
+ "styles.css": "body {}",
70
+ });
71
+ try {
72
+ const prompt = await buildPlanMilestonePrompt("M001", "Polish static files", base, "minimal");
73
+ assert.match(prompt, /\*\*Kind:\*\* untyped-existing/);
74
+ assert.match(prompt, /\*\*Content files:\*\* 3/);
75
+ assert.match(prompt, /Prefer 1-2 slices/);
76
+ } finally {
77
+ rmSync(base, { recursive: true, force: true });
78
+ }
79
+ });
80
+
81
+ test("plan-milestone prompt keeps normal guidance for typed projects", async () => {
82
+ const base = makeRepo({
83
+ "package.json": "{\"scripts\":{\"test\":\"node --test\"}}\n",
84
+ "src/index.js": "console.log('ok');\n",
85
+ });
86
+ try {
87
+ const prompt = await buildPlanMilestonePrompt("M001", "Update app", base, "minimal");
88
+ assert.match(prompt, /\*\*Kind:\*\* typed-existing/);
89
+ assert.match(prompt, /Use normal ecosystem-aware planning guidance/);
90
+ assert.doesNotMatch(prompt, /Prefer exactly one slice/);
91
+ } finally {
92
+ rmSync(base, { recursive: true, force: true });
93
+ }
94
+ });
95
+
96
+ test("workflow docs no longer contain blanket 4-10 slice guidance", () => {
97
+ const docs = readFileSync(join(process.cwd(), "src", "resources", "GSD-WORKFLOW.md"), "utf-8");
98
+ assert.doesNotMatch(docs, /4-10 slices/);
99
+ assert.match(docs, /1-10 slices/);
100
+ assert.match(docs, /single-file/);
101
+ });
102
+
103
+ test("prompt templates carry right-sized planning and closeout mode guidance", () => {
104
+ const planTemplate = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "prompts", "plan-milestone.md"), "utf-8");
105
+ const completeTemplate = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "prompts", "complete-milestone.md"), "utf-8");
106
+
107
+ assert.match(planTemplate, /Use 1-10 slices, sized to the work/);
108
+ assert.match(planTemplate, /tiny\/single-file\/static work should usually be one slice/);
109
+ assert.match(planTemplate, /untyped-existing/);
110
+ assert.match(completeTemplate, /Closeout Review Mode/);
111
+ assert.match(completeTemplate, /passing validation artifact is present/);
112
+ assert.doesNotMatch(completeTemplate, /^### Delegate Review Work/m);
113
+ });
114
+
115
+ test("complete-milestone prompt trusts passing validation artifact", async () => {
116
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
117
+ try {
118
+ writeCompleteMilestoneFiles(base, `---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\n${validationMetadata()}\n\nAll checks passed.`);
119
+ const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
120
+ assert.match(prompt, /Passing Validation Artifact/);
121
+ assert.match(prompt, /Treat it as authoritative/);
122
+ assert.match(prompt, /Do not delegate fresh reviewer\/security\/tester audits/);
123
+ assert.match(prompt, /All checks passed/);
124
+ } finally {
125
+ rmSync(base, { recursive: true, force: true });
126
+ }
127
+ });
128
+
129
+ test("complete-milestone prompt trusts centralized markdown body pass verdict", async () => {
130
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
131
+ try {
132
+ writeCompleteMilestoneFiles(base, `# Validation\n\n**Verdict:** PASS\n\n${validationMetadata()}\n\nAll checks passed.`);
133
+ const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
134
+ assert.match(prompt, /Passing Validation Artifact/);
135
+ assert.match(prompt, /Treat it as authoritative/);
136
+ assert.match(prompt, /Do not delegate fresh reviewer\/security\/tester audits/);
137
+ } finally {
138
+ rmSync(base, { recursive: true, force: true });
139
+ }
140
+ });
141
+
142
+ test("complete-milestone prompt does not trust stale pass validation without metadata", async () => {
143
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
144
+ try {
145
+ writeCompleteMilestoneFiles(base, "---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\nAll checks passed.");
146
+ const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
147
+ assert.match(prompt, /Validation Requires Attention/);
148
+ assert.match(prompt, /missing freshness metadata/);
149
+ assert.doesNotMatch(prompt, /Passing Validation Artifact/);
150
+ } finally {
151
+ rmSync(base, { recursive: true, force: true });
152
+ }
153
+ });
154
+
155
+ test("complete-milestone prompt does not trust pass validation missing current summary coverage", async () => {
156
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
157
+ try {
158
+ writeCompleteMilestoneFiles(base, [
159
+ "---",
160
+ "verdict: pass",
161
+ "remediation_round: 0",
162
+ "---",
163
+ "",
164
+ "# Validation",
165
+ "validation_metadata:",
166
+ " covered_artifacts:",
167
+ " - `.gsd/milestones/M001/M001-VALIDATION.md`",
168
+ " - `.gsd/milestones/M001/M001-ROADMAP.md`",
169
+ "",
170
+ "All checks passed.",
171
+ ].join("\n"));
172
+ const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
173
+ assert.match(prompt, /Validation Requires Attention/);
174
+ assert.match(prompt, /does not cover current milestone artifacts/);
175
+ assert.doesNotMatch(prompt, /Passing Validation Artifact/);
176
+ } finally {
177
+ rmSync(base, { recursive: true, force: true });
178
+ }
179
+ });
180
+
181
+ test("complete-milestone prompt keeps deeper review path without passing validation", async () => {
182
+ const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
183
+ try {
184
+ writeCompleteMilestoneFiles(base, "---\nverdict: needs-attention\nremediation_round: 0\n---\n\n# Validation\nFix gaps.");
185
+ const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
186
+ assert.match(prompt, /Validation Requires Attention/);
187
+ assert.match(prompt, /verdict `needs-attention`/);
188
+ assert.match(prompt, /Use `subagent` for review work needing fresh context/i);
189
+ } finally {
190
+ rmSync(base, { recursive: true, force: true });
191
+ }
192
+ });