gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0-dev.3cddbbba2

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 (814) hide show
  1. package/README.md +47 -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/extensions/claude-code-cli/readiness.js +18 -7
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  15. package/dist/resources/extensions/github-sync/sync.js +4 -1
  16. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +214 -17
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  19. package/dist/resources/extensions/gsd/auto/phases.js +372 -134
  20. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +88 -33
  22. package/dist/resources/extensions/gsd/auto/session.js +18 -1
  23. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  24. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -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 +199 -177
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +30 -11
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +119 -79
  31. package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
  32. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  33. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  34. package/dist/resources/extensions/gsd/auto-start.js +251 -16
  35. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  36. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  37. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  38. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  39. package/dist/resources/extensions/gsd/auto-worktree.js +237 -336
  40. package/dist/resources/extensions/gsd/auto.js +493 -129
  41. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +133 -12
  42. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  43. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  44. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  45. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  46. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  47. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  48. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  49. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +337 -55
  50. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  51. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  52. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  54. package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
  55. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  56. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  57. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  58. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  59. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  60. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  61. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  62. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  64. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  65. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  66. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  67. package/dist/resources/extensions/gsd/git-service.js +75 -6
  68. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  69. package/dist/resources/extensions/gsd/guided-flow.js +119 -42
  70. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  71. package/dist/resources/extensions/gsd/health-widget.js +6 -9
  72. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  73. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  74. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  75. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  76. package/dist/resources/extensions/gsd/native-git-bridge.js +46 -22
  77. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  78. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  79. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  80. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  81. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  82. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  83. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  84. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  85. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  86. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  87. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  89. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  90. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  93. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  94. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  95. package/dist/resources/extensions/gsd/quick.js +34 -2
  96. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  99. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  100. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  102. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  103. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  104. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  105. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  106. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  107. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  108. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  109. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  110. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  111. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  112. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  113. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  114. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  115. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  117. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1364 -0
  119. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  122. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  123. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  124. package/dist/web/standalone/.next/BUILD_ID +1 -1
  125. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  126. package/dist/web/standalone/.next/build-manifest.json +3 -3
  127. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  128. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  129. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.html +1 -1
  148. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  149. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  150. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  151. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  156. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/middleware.js +3 -3
  159. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  160. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  161. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  162. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  163. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  164. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  165. package/dist/welcome-screen.d.ts +2 -7
  166. package/dist/welcome-screen.js +68 -75
  167. package/package.json +3 -3
  168. package/packages/daemon/package.json +2 -2
  169. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  170. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  171. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  172. package/packages/mcp-server/package.json +2 -2
  173. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  174. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  175. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  176. package/packages/native/package.json +1 -1
  177. package/packages/native/tsconfig.tsbuildinfo +1 -1
  178. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  179. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  180. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  181. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  182. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  183. package/packages/pi-agent-core/dist/agent.js +43 -11
  184. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  185. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  186. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  187. package/packages/pi-agent-core/dist/index.js +2 -0
  188. package/packages/pi-agent-core/dist/index.js.map +1 -1
  189. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  190. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  191. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  192. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  193. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  194. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  195. package/packages/pi-agent-core/dist/types.js.map +1 -1
  196. package/packages/pi-agent-core/package.json +1 -1
  197. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  198. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  199. package/packages/pi-agent-core/src/agent.ts +52 -11
  200. package/packages/pi-agent-core/src/index.ts +2 -0
  201. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  202. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  203. package/packages/pi-agent-core/src/types.ts +26 -10
  204. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  205. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  206. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  207. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  208. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  209. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  210. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  211. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  212. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  213. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  214. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  215. package/packages/pi-ai/dist/types.d.ts +2 -0
  216. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  217. package/packages/pi-ai/dist/types.js.map +1 -1
  218. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  219. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  220. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  221. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  222. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  223. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  224. package/packages/pi-ai/package.json +1 -1
  225. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  226. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  227. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  228. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  229. package/packages/pi-ai/src/types.ts +3 -0
  230. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  231. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  232. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  233. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  234. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  235. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  237. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  239. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  241. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  243. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  245. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  247. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  249. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  250. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  251. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  252. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  253. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  254. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  255. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  256. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  257. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  259. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  262. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  264. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  266. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  268. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  270. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  273. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  277. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  279. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  281. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  283. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  285. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  287. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  289. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  291. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  293. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  295. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  297. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  301. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  303. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  305. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  307. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  309. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  311. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  313. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  315. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  317. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  319. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  321. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  323. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  325. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  327. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  329. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  330. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  331. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  333. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  335. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  337. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  339. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +161 -7
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  362. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -73
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  400. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  401. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  408. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  410. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  412. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  413. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  414. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  415. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  417. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  418. package/packages/pi-coding-agent/package.json +1 -1
  419. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  420. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  421. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  422. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  423. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  424. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  425. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  426. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  427. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  428. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  429. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  430. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  431. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  432. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  433. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  434. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  435. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  436. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  437. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  438. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  439. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  440. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  441. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  442. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  443. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  444. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  445. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  446. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  447. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  448. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  449. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  450. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  451. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +228 -7
  452. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  453. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  454. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  455. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  456. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  457. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  458. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  459. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  460. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +247 -94
  461. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  462. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  463. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  464. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  466. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  467. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  468. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  469. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  470. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  471. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  472. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  473. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  474. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  475. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  476. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  477. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  478. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  479. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  480. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  481. package/packages/pi-tui/dist/tui.js +18 -8
  482. package/packages/pi-tui/dist/tui.js.map +1 -1
  483. package/packages/pi-tui/package.json +1 -1
  484. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  485. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  486. package/packages/pi-tui/src/tui.ts +20 -8
  487. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  488. package/packages/rpc-client/README.md +7 -0
  489. package/packages/rpc-client/package.json +1 -1
  490. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  491. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  492. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  493. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  494. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  495. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  496. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  497. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  498. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  499. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  500. package/pkg/package.json +1 -1
  501. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  502. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  503. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  504. package/src/resources/extensions/github-sync/sync.ts +8 -1
  505. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  506. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  507. package/src/resources/extensions/gsd/auto/loop-deps.ts +19 -16
  508. package/src/resources/extensions/gsd/auto/loop.ts +247 -25
  509. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  510. package/src/resources/extensions/gsd/auto/phases.ts +512 -202
  511. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  512. package/src/resources/extensions/gsd/auto/run-unit.ts +97 -34
  513. package/src/resources/extensions/gsd/auto/session.ts +19 -1
  514. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  515. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  516. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  517. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  518. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  519. package/src/resources/extensions/gsd/auto-dashboard.ts +249 -182
  520. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  521. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -1
  522. package/src/resources/extensions/gsd/auto-post-unit.ts +131 -81
  523. package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
  524. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  525. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  526. package/src/resources/extensions/gsd/auto-start.ts +321 -21
  527. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  528. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  529. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  530. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  531. package/src/resources/extensions/gsd/auto-worktree.ts +267 -360
  532. package/src/resources/extensions/gsd/auto.ts +578 -126
  533. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +166 -12
  534. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  535. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  536. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  537. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  538. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  539. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  540. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  541. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +384 -55
  542. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  543. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  544. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  545. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  546. package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
  547. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  548. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  549. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  550. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  551. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  552. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  553. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  554. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  555. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  556. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  557. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  558. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  559. package/src/resources/extensions/gsd/git-service.ts +89 -10
  560. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  561. package/src/resources/extensions/gsd/guided-flow.ts +148 -49
  562. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  563. package/src/resources/extensions/gsd/health-widget.ts +8 -9
  564. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  565. package/src/resources/extensions/gsd/journal.ts +2 -0
  566. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  567. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  568. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  569. package/src/resources/extensions/gsd/native-git-bridge.ts +53 -19
  570. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  571. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  572. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  573. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  574. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  575. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  576. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  577. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  578. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  579. package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  580. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  581. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  582. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  583. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  584. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  585. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  586. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  587. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  588. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  589. package/src/resources/extensions/gsd/quick.ts +37 -2
  590. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  591. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  592. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  593. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  594. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  595. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  596. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  597. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +134 -9
  598. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1125 -215
  599. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  600. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  601. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  602. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +363 -18
  603. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  604. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  605. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  606. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  607. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  608. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +16 -1
  609. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  610. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  611. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  612. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  613. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +160 -0
  614. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  615. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  616. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  617. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  618. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  619. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  620. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  621. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  622. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
  623. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  624. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  625. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  626. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  627. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  628. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  629. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  630. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  631. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  632. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  633. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  634. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  635. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  636. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  637. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +46 -11
  638. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  639. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  640. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +24 -11
  641. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  642. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  643. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +100 -38
  644. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  645. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  646. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  647. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  648. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  649. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  650. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  651. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  652. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  653. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  654. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  655. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  656. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  657. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  658. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  659. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  660. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  661. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  662. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  663. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +92 -0
  664. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  665. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  666. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  667. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  668. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -11
  669. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  670. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  671. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  672. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  673. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  674. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +77 -12
  675. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  676. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  677. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  678. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  679. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  680. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  681. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  682. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  683. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  684. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  685. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -182
  686. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  687. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  688. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  689. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  690. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  691. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  692. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  693. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  694. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  695. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  696. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  697. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  698. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  699. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  700. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  701. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  702. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  703. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  704. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  705. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -1
  706. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  707. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  708. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  709. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  710. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  711. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  712. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  713. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  714. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  715. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  716. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  717. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  718. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  719. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +36 -164
  720. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  721. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  722. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  723. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  724. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  725. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  726. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  727. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  728. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  729. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  730. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  731. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  732. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  733. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  734. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  735. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
  736. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  737. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  738. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  739. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  740. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  741. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  742. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  743. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -56
  744. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  745. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  746. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  747. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  748. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  749. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  750. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  751. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  752. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +295 -0
  753. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  754. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
  755. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  756. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  757. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  758. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  759. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  760. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  761. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  762. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  763. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  764. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  765. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  766. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -57
  767. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  768. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  769. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  770. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  771. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  772. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
  773. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +197 -78
  774. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +888 -0
  775. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  776. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  777. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  778. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  779. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  780. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  781. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  782. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  783. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  784. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  785. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  786. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  787. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  788. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  789. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  790. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  791. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  792. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  793. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  794. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  795. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  796. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  797. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  798. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  799. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  800. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  801. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  802. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1882 -0
  803. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  804. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  805. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  806. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  807. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  808. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  809. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  810. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  811. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1247
  812. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  813. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_buildManifest.js +0 -0
  814. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_ssgManifest.js +0 -0
@@ -0,0 +1,888 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Worktree Lifecycle Module — typed-result contract tests for enterMilestone (ADR-016).
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { execFileSync } from "node:child_process";
9
+ import {
10
+ WorktreeLifecycle,
11
+ resolvePausedResumeBasePath,
12
+ type WorktreeLifecycleDeps,
13
+ type WorktreeLifecycleTestOverrides,
14
+ type NotifyCtx,
15
+ } from "../worktree-lifecycle.js";
16
+ import { WorktreeStateProjection } from "../worktree-state-projection.js";
17
+ import { AutoSession } from "../auto/session.js";
18
+ import { openDatabase, closeDatabase, insertMilestone } from "../gsd-db.js";
19
+ import { registerAutoWorker } from "../db/auto-workers.js";
20
+ import { claimMilestoneLease } from "../db/milestone-leases.js";
21
+
22
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
23
+
24
+ interface CallLog {
25
+ fn: string;
26
+ args: unknown[];
27
+ }
28
+
29
+ // The C1-C4-inlined primitive overrides come from
30
+ // `WorktreeLifecycleTestOverrides`, the test seam exported by the Module.
31
+ // Lifecycle reads these through `primitiveOverrides()` when present and
32
+ // falls back to direct imports otherwise.
33
+ type LegacyTestDeps = WorktreeLifecycleDeps & WorktreeLifecycleTestOverrides;
34
+
35
+ function makeSession(overrides?: Partial<AutoSession>): AutoSession {
36
+ const s = new AutoSession();
37
+ s.basePath = overrides?.basePath ?? "/project";
38
+ s.originalBasePath = overrides?.originalBasePath ?? "/project";
39
+ Object.assign(s, overrides);
40
+ return s;
41
+ }
42
+
43
+ function makeDeps(
44
+ overrides?: Partial<LegacyTestDeps>,
45
+ ): LegacyTestDeps & { calls: CallLog[] } {
46
+ const calls: CallLog[] = [];
47
+ // ADR-016 phase 2 / C-track close-out: WorktreeLifecycleDeps is now a
48
+ // 3-field bag (gitServiceFactory, worktreeProjection, mergeMilestoneToMain).
49
+ // Tests still pass legacy override hooks via `LegacyTestDeps` — Lifecycle
50
+ // ignores the extras structurally and reads them through the C1-healing
51
+ // primitive-override pattern when stubs are needed.
52
+ const deps: LegacyTestDeps & { calls: CallLog[] } = {
53
+ calls,
54
+ gitServiceFactory: (basePath: string) => {
55
+ calls.push({ fn: "gitServiceFactory", args: [basePath] });
56
+ return { basePath } as unknown as ReturnType<
57
+ WorktreeLifecycleDeps["gitServiceFactory"]
58
+ >;
59
+ },
60
+ worktreeProjection: new WorktreeStateProjection(),
61
+ // Legacy stubs — Lifecycle no longer reads these post-C2; preserved as
62
+ // no-ops so existing test fixtures keep type-checking.
63
+ isInAutoWorktree: () => false,
64
+ autoCommitCurrentBranch: (
65
+ basePath: string,
66
+ unitType: string,
67
+ unitId: string,
68
+ taskContext?: unknown,
69
+ ) => {
70
+ calls.push({ fn: "autoCommitCurrentBranch", args: [basePath, unitType, unitId, taskContext] });
71
+ return null;
72
+ },
73
+ autoWorktreeBranch: (mid: string) => `milestone/${mid}`,
74
+ teardownAutoWorktree: () => {},
75
+ mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
76
+ ...overrides,
77
+ };
78
+ return deps;
79
+ }
80
+
81
+ /**
82
+ * Create a real temporary git repo for tests that exercise the inlined
83
+ * worktree-manager primitives (post-C2). Returns the realpath of the new
84
+ * repo. Tests that previously relied on `deps.createAutoWorktree`,
85
+ * `deps.enterAutoWorktree`, etc. now drive Lifecycle through these
86
+ * fixtures.
87
+ */
88
+ function makeGitRepoBase(opts?: {
89
+ isolation?: "worktree" | "branch" | "none";
90
+ }): string {
91
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-lifecycle-git-")));
92
+ const git = (args: string[]): void => {
93
+ execFileSync("git", args, { cwd: base, stdio: "pipe" });
94
+ };
95
+ git(["init", "-b", "main"]);
96
+ git(["config", "user.email", "test@test.com"]);
97
+ git(["config", "user.name", "Test"]);
98
+ writeFileSync(join(base, "README.md"), "# test\n");
99
+ writeFileSync(join(base, ".gitignore"), ".gsd/worktrees/\n");
100
+ mkdirSync(join(base, ".gsd"), { recursive: true });
101
+ if (opts?.isolation && opts.isolation !== "none") {
102
+ writeFileSync(
103
+ join(base, ".gsd", "preferences.md"),
104
+ `## Git\n- isolation: ${opts.isolation}\n`,
105
+ );
106
+ }
107
+ git(["add", "."]);
108
+ git(["commit", "-m", "init"]);
109
+ return base;
110
+ }
111
+
112
+ function cleanupRepoBase(base: string, previousCwd?: string): void {
113
+ try { closeDatabase(); } catch { /* noop */ }
114
+ try { if (previousCwd) process.chdir(previousCwd); } catch { /* noop */ }
115
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
116
+ }
117
+
118
+ function makeCtx(): NotifyCtx & {
119
+ messages: Array<{ msg: string; level?: string }>;
120
+ } {
121
+ const messages: Array<{ msg: string; level?: string }> = [];
122
+ return {
123
+ messages,
124
+ notify: (msg, level) => {
125
+ messages.push({ msg, level });
126
+ },
127
+ };
128
+ }
129
+
130
+ function makeDbBase(): string {
131
+ const base = mkdtempSync(join(tmpdir(), "gsd-lifecycle-"));
132
+ mkdirSync(join(base, ".gsd"), { recursive: true });
133
+ return base;
134
+ }
135
+
136
+ function cleanupDbBase(base: string): void {
137
+ try { closeDatabase(); } catch { /* noop */ }
138
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
139
+ }
140
+
141
+ // ─── enterMilestone — typed-result contract ──────────────────────────────────
142
+
143
+ test("enterMilestone returns ok:true mode:worktree on successful create", (t) => {
144
+ // ADR-016 phase 2 / C2 (#5625): the worktree-manager primitives are
145
+ // inlined, so the success path needs a real git repo. The test exercises
146
+ // Lifecycle.enterMilestone end-to-end against `createAutoWorktree`'s
147
+ // real implementation in `auto-worktree.ts`.
148
+ const previousCwd = process.cwd();
149
+ const base = makeGitRepoBase({ isolation: "worktree" });
150
+ t.after(() => cleanupRepoBase(base, previousCwd));
151
+
152
+ const s = makeSession({ basePath: base, originalBasePath: base });
153
+ const deps = makeDeps();
154
+ const ctx = makeCtx();
155
+ const lifecycle = new WorktreeLifecycle(s, deps);
156
+
157
+ const result = lifecycle.enterMilestone("M001", ctx);
158
+
159
+ assert.equal(result.ok, true, `expected ok:true, got: ${JSON.stringify(result)}`);
160
+ if (result.ok) {
161
+ assert.equal(result.mode, "worktree");
162
+ assert.ok(
163
+ result.path.endsWith("/.gsd/worktrees/M001"),
164
+ `expected path to end with /.gsd/worktrees/M001, got ${result.path}`,
165
+ );
166
+ }
167
+ assert.ok(
168
+ s.basePath.endsWith("/.gsd/worktrees/M001"),
169
+ `expected s.basePath to end with /.gsd/worktrees/M001, got ${s.basePath}`,
170
+ );
171
+ // After C3 (#5626) `invalidateAllCaches` is inlined; assertion against
172
+ // `deps.calls` for cache invalidation is no longer possible.
173
+ });
174
+
175
+ test("enterMilestone returns ok:true mode:branch on successful branch fallback", (t) => {
176
+ // Real fixture with isolation:branch — `enterBranchModeForMilestone`'s
177
+ // real implementation runs against the temp repo.
178
+ const previousCwd = process.cwd();
179
+ const base = makeGitRepoBase({ isolation: "branch" });
180
+ t.after(() => cleanupRepoBase(base, previousCwd));
181
+
182
+ const s = makeSession({ basePath: base, originalBasePath: base });
183
+ const deps = makeDeps({ getIsolationMode: () => "branch" });
184
+ const ctx = makeCtx();
185
+ const lifecycle = new WorktreeLifecycle(s, deps);
186
+
187
+ const result = lifecycle.enterMilestone("M001", ctx);
188
+
189
+ assert.equal(result.ok, true, `expected ok:true, got: ${JSON.stringify(result)}`);
190
+ if (result.ok) {
191
+ assert.equal(result.mode, "branch");
192
+ assert.equal(result.path, base);
193
+ }
194
+ // Branch mode does not mutate s.basePath
195
+ assert.equal(s.basePath, base);
196
+ });
197
+
198
+ test("enterMilestone returns ok:true mode:none when isolation disabled", () => {
199
+ const s = makeSession();
200
+ const deps = makeDeps({ getIsolationMode: () => "none" });
201
+ const ctx = makeCtx();
202
+ const lifecycle = new WorktreeLifecycle(s, deps);
203
+
204
+ const result = lifecycle.enterMilestone("M001", ctx);
205
+
206
+ assert.equal(result.ok, true);
207
+ if (result.ok) {
208
+ assert.equal(result.mode, "none");
209
+ assert.equal(result.path, "/project");
210
+ }
211
+ assert.equal(s.basePath, "/project");
212
+ });
213
+
214
+ test("enterMilestone returns ok:false reason:isolation-degraded when session degraded", () => {
215
+ const s = makeSession({ isolationDegraded: true });
216
+ const deps = makeDeps();
217
+ const ctx = makeCtx();
218
+ const lifecycle = new WorktreeLifecycle(s, deps);
219
+
220
+ const result = lifecycle.enterMilestone("M001", ctx);
221
+
222
+ assert.equal(result.ok, false);
223
+ if (!result.ok) {
224
+ assert.equal(result.reason, "isolation-degraded");
225
+ }
226
+ assert.equal(s.basePath, "/project");
227
+ assert.equal(s.milestoneLeaseToken, null);
228
+ assert.equal(deps.calls.filter((c) => c.fn === "getIsolationMode").length, 0);
229
+ });
230
+
231
+ test("enterMilestone returns ok:false reason:creation-failed and degrades session on worktree throw", (t) => {
232
+ // After C2 the worktree-manager primitives are inlined. Use a real
233
+ // fixture and break the repo by deleting `.git` so any git op throws.
234
+ const previousCwd = process.cwd();
235
+ const base = makeGitRepoBase({ isolation: "worktree" });
236
+ t.after(() => cleanupRepoBase(base, previousCwd));
237
+ rmSync(join(base, ".git"), { recursive: true, force: true });
238
+
239
+ const s = makeSession({ basePath: base, originalBasePath: base });
240
+ const deps = makeDeps();
241
+ const ctx = makeCtx();
242
+ const lifecycle = new WorktreeLifecycle(s, deps);
243
+
244
+ const result = lifecycle.enterMilestone("M001", ctx);
245
+
246
+ assert.equal(result.ok, false, `expected ok:false, got: ${JSON.stringify(result)}`);
247
+ if (!result.ok) {
248
+ assert.equal(result.reason, "creation-failed");
249
+ assert.ok(result.cause instanceof Error);
250
+ }
251
+ assert.equal(s.isolationDegraded, true);
252
+ // s.basePath unchanged on failure
253
+ assert.equal(s.basePath, base);
254
+ });
255
+
256
+ test("enterMilestone returns ok:false reason:creation-failed when branch mode throws", (t) => {
257
+ // Branch-mode failure scenario: real fixture with isolation:branch, but
258
+ // delete the `.git` directory so any branch operation throws.
259
+ const previousCwd = process.cwd();
260
+ const base = makeGitRepoBase({ isolation: "branch" });
261
+ t.after(() => cleanupRepoBase(base, previousCwd));
262
+ rmSync(join(base, ".git"), { recursive: true, force: true });
263
+
264
+ const s = makeSession({ basePath: base, originalBasePath: base });
265
+ const deps = makeDeps({ getIsolationMode: () => "branch" });
266
+ const ctx = makeCtx();
267
+ const lifecycle = new WorktreeLifecycle(s, deps);
268
+
269
+ const result = lifecycle.enterMilestone("M001", ctx);
270
+
271
+ assert.equal(result.ok, false, `expected ok:false, got: ${JSON.stringify(result)}`);
272
+ if (!result.ok) {
273
+ assert.equal(result.reason, "creation-failed");
274
+ }
275
+ assert.equal(s.isolationDegraded, true);
276
+ });
277
+
278
+ test("enterMilestone enters existing worktree when path resolves", (t) => {
279
+ // After C2, `getAutoWorktreePath` runs against real git. To exercise the
280
+ // "existing worktree" branch we pre-create the worktree on disk so
281
+ // git's worktree list includes it.
282
+ const previousCwd = process.cwd();
283
+ const base = makeGitRepoBase({ isolation: "worktree" });
284
+ t.after(() => cleanupRepoBase(base, previousCwd));
285
+ const wt = join(base, ".gsd", "worktrees", "M001");
286
+ execFileSync("git", ["checkout", "-b", "milestone/M001"], {
287
+ cwd: base,
288
+ stdio: "pipe",
289
+ });
290
+ execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "pipe" });
291
+ execFileSync(
292
+ "git",
293
+ ["worktree", "add", wt, "milestone/M001"],
294
+ { cwd: base, stdio: "pipe" },
295
+ );
296
+
297
+ const s = makeSession({ basePath: base, originalBasePath: base });
298
+ const deps = makeDeps();
299
+ const ctx = makeCtx();
300
+ const lifecycle = new WorktreeLifecycle(s, deps);
301
+
302
+ const result = lifecycle.enterMilestone("M001", ctx);
303
+
304
+ assert.equal(result.ok, true, `expected ok:true, got: ${JSON.stringify(result)}`);
305
+ if (result.ok) {
306
+ assert.equal(result.mode, "worktree");
307
+ assert.ok(
308
+ result.path.endsWith("/.gsd/worktrees/M001"),
309
+ `expected path to end with /.gsd/worktrees/M001, got ${result.path}`,
310
+ );
311
+ }
312
+ });
313
+
314
+ test("enterMilestone returns ok:false reason:lease-conflict when another worker holds the lease", (t) => {
315
+ const base = makeDbBase();
316
+ t.after(() => cleanupDbBase(base));
317
+ openDatabase(join(base, ".gsd", "gsd.db"));
318
+ insertMilestone({ id: "M001", title: "Test", status: "active" });
319
+ const holder = registerAutoWorker({ projectRootRealpath: base });
320
+ const contender = registerAutoWorker({ projectRootRealpath: base });
321
+ const claim = claimMilestoneLease(holder, "M001");
322
+ assert.equal(claim.ok, true);
323
+
324
+ const s = makeSession({ basePath: base, originalBasePath: base, workerId: contender });
325
+ const deps = makeDeps();
326
+ const ctx = makeCtx();
327
+ const lifecycle = new WorktreeLifecycle(s, deps);
328
+
329
+ const result = lifecycle.enterMilestone("M001", ctx);
330
+
331
+ assert.equal(result.ok, false);
332
+ if (!result.ok) {
333
+ assert.equal(result.reason, "lease-conflict");
334
+ }
335
+ assert.equal(s.isolationDegraded, false);
336
+ assert.equal(s.basePath, base);
337
+ assert.equal(s.milestoneLeaseToken, null);
338
+ assert.equal(deps.calls.filter((c) => c.fn === "getIsolationMode").length, 0);
339
+ assert.equal(ctx.messages.length, 1);
340
+ assert.equal(ctx.messages[0]?.level, "error");
341
+ });
342
+
343
+ test("enterMilestone is idempotent when already in the milestone worktree", (t) => {
344
+ // Real-fixture variant after C2/C3. The session is already pointing at
345
+ // the worktree path with currentMilestoneId set, so the idempotency
346
+ // early-return inside `_enterMilestoneCore` fires without invoking the
347
+ // inlined worktree primitives.
348
+ const previousCwd = process.cwd();
349
+ const base = makeGitRepoBase({ isolation: "worktree" });
350
+ t.after(() => cleanupRepoBase(base, previousCwd));
351
+ const wt = join(base, ".gsd", "worktrees", "M001");
352
+
353
+ const s = makeSession({
354
+ basePath: wt,
355
+ originalBasePath: base,
356
+ currentMilestoneId: "M001",
357
+ });
358
+ const deps = makeDeps();
359
+ const ctx = makeCtx();
360
+ const lifecycle = new WorktreeLifecycle(s, deps);
361
+
362
+ const result = lifecycle.enterMilestone("M001", ctx);
363
+
364
+ assert.equal(result.ok, true, `expected ok:true, got: ${JSON.stringify(result)}`);
365
+ if (result.ok) {
366
+ assert.equal(result.mode, "worktree");
367
+ assert.equal(result.path, wt);
368
+ }
369
+ assert.equal(s.basePath, wt);
370
+ });
371
+
372
+ test("enterMilestone returns ok:false reason:invalid-milestone-id on path traversal", () => {
373
+ const s = makeSession();
374
+ const deps = makeDeps();
375
+ const ctx = makeCtx();
376
+ const lifecycle = new WorktreeLifecycle(s, deps);
377
+
378
+ const traversal = lifecycle.enterMilestone("../escape", ctx);
379
+ const separator = lifecycle.enterMilestone("a/b", ctx);
380
+
381
+ assert.equal(traversal.ok, false);
382
+ if (!traversal.ok) {
383
+ assert.equal(traversal.reason, "invalid-milestone-id");
384
+ }
385
+ assert.equal(separator.ok, false);
386
+ if (!separator.ok) {
387
+ assert.equal(separator.reason, "invalid-milestone-id");
388
+ }
389
+ });
390
+
391
+ // ─── exitMilestone — typed-result contract ────────────────────────────────────
392
+ //
393
+ // The delegation-shape tests that lived here were retired in slice 7 / step
394
+ // D of ADR-016: Lifecycle no longer takes a `resolverFactory`. The merge
395
+ // behaviour they covered now runs inside Lifecycle directly and is exercised
396
+ // end-to-end by the merge-mode tests in worktree-resolver.test.ts (which
397
+ // drive Lifecycle through Resolver delegation until step E retires the
398
+ // Resolver class entirely). When that retirement lands, those tests move
399
+ // here verbatim.
400
+
401
+ // ─── Queries (issue #5587) ────────────────────────────────────────────────────
402
+
403
+ test("isInMilestone returns true when session matches milestone id", () => {
404
+ const s = makeSession();
405
+ s.currentMilestoneId = "M001";
406
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
407
+
408
+ assert.equal(lifecycle.isInMilestone("M001"), true);
409
+ assert.equal(lifecycle.isInMilestone("M002"), false);
410
+ });
411
+
412
+ test("isInMilestone returns false when session has no active milestone", () => {
413
+ const s = makeSession();
414
+ s.currentMilestoneId = null;
415
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
416
+
417
+ assert.equal(lifecycle.isInMilestone("M001"), false);
418
+ });
419
+
420
+ test("getCurrentMilestoneIfAny returns the active milestone id or null", () => {
421
+ const s = makeSession();
422
+ s.currentMilestoneId = "M042";
423
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
424
+
425
+ assert.equal(lifecycle.getCurrentMilestoneIfAny(), "M042");
426
+
427
+ s.currentMilestoneId = null;
428
+ assert.equal(lifecycle.getCurrentMilestoneIfAny(), null);
429
+ });
430
+
431
+ // ─── degradeToBranchMode (issue #5587) ────────────────────────────────────────
432
+
433
+ test("degradeToBranchMode sets isolationDegraded and runs branch-mode setup", (t) => {
434
+ // After C2, `enterBranchModeForMilestone` runs against real git. Use a
435
+ // real fixture so the branch checkout succeeds and we can observe the
436
+ // session's isolationDegraded flag flip.
437
+ const previousCwd = process.cwd();
438
+ const base = makeGitRepoBase({ isolation: "branch" });
439
+ t.after(() => cleanupRepoBase(base, previousCwd));
440
+
441
+ const s = makeSession({ basePath: base, originalBasePath: base });
442
+ const deps = makeDeps();
443
+ const ctx = makeCtx();
444
+ const lifecycle = new WorktreeLifecycle(s, deps);
445
+
446
+ lifecycle.degradeToBranchMode("M001", ctx);
447
+
448
+ assert.equal(s.isolationDegraded, true);
449
+ // After C3 (#5626) `invalidateAllCaches` is inlined.
450
+ });
451
+
452
+ test("degradeToBranchMode is no-op when isolationDegraded is already true", () => {
453
+ const s = makeSession();
454
+ s.isolationDegraded = true;
455
+ const deps = makeDeps();
456
+ const ctx = makeCtx();
457
+ const lifecycle = new WorktreeLifecycle(s, deps);
458
+
459
+ lifecycle.degradeToBranchMode("M001", ctx);
460
+
461
+ // Pre-check returns early before any side effect. After C3 the
462
+ // `invalidateAllCaches` mock is gone; we assert the observable
463
+ // contract: `s.isolationDegraded` stays true and no notify message
464
+ // is emitted.
465
+ assert.equal(s.isolationDegraded, true);
466
+ assert.equal(ctx.messages.length, 0);
467
+ });
468
+
469
+ test("degradeToBranchMode marks degraded and notifies on branch-mode failure", () => {
470
+ // Synthetic /project causes the real `enterBranchModeForMilestone` to
471
+ // throw — same shape as the original mock-throws test but exercises the
472
+ // production error path against the inlined helper.
473
+ const s = makeSession();
474
+ const deps = makeDeps({});
475
+ const ctx = makeCtx();
476
+ const lifecycle = new WorktreeLifecycle(s, deps);
477
+
478
+ lifecycle.degradeToBranchMode("M001", ctx);
479
+
480
+ assert.equal(s.isolationDegraded, true);
481
+ assert.ok(
482
+ ctx.messages.some(
483
+ (m) => m.level === "warning" && m.msg.includes("Branch isolation setup"),
484
+ ),
485
+ );
486
+ });
487
+
488
+ // ─── restoreToProjectRoot (issue #5587) ───────────────────────────────────────
489
+
490
+ test("restoreToProjectRoot restores basePath to originalBasePath and rebuilds git service", () => {
491
+ const s = makeSession();
492
+ s.originalBasePath = "/project";
493
+ s.basePath = "/project/.gsd/worktrees/M001";
494
+ const deps = makeDeps();
495
+ const lifecycle = new WorktreeLifecycle(s, deps);
496
+
497
+ lifecycle.restoreToProjectRoot();
498
+
499
+ assert.equal(s.basePath, "/project");
500
+ // After C4 (#5627) the rebuild goes through `gitServiceFactory`
501
+ // instead of `new GitServiceImpl(...)`. `invalidateAllCaches` is
502
+ // inlined post-C3 and no longer routes through deps.
503
+ assert.equal(
504
+ deps.calls.filter((c) => c.fn === "gitServiceFactory").length,
505
+ 1,
506
+ );
507
+ });
508
+
509
+ test("restoreToProjectRoot rebuilds git service via gitServiceFactory at the restored base path", () => {
510
+ // ADR-016 phase 2 / C4 (#5627): the gitConfig load + GitServiceImpl
511
+ // construction now live behind the `gitServiceFactory` seam. Lifecycle
512
+ // is no longer responsible for either; the test asserts only that the
513
+ // factory is invoked with the restored basePath.
514
+ const s = makeSession();
515
+ s.originalBasePath = "/project";
516
+ s.basePath = "/project/.gsd/worktrees/M001";
517
+ const deps = makeDeps();
518
+ const lifecycle = new WorktreeLifecycle(s, deps);
519
+
520
+ lifecycle.restoreToProjectRoot();
521
+
522
+ assert.deepEqual(
523
+ deps.calls.find((c) => c.fn === "gitServiceFactory")?.args,
524
+ ["/project"],
525
+ );
526
+ });
527
+
528
+ test("restoreToProjectRoot is no-op when originalBasePath is empty", () => {
529
+ const s = makeSession();
530
+ s.originalBasePath = "";
531
+ s.basePath = "/some/path";
532
+ const deps = makeDeps();
533
+ const lifecycle = new WorktreeLifecycle(s, deps);
534
+
535
+ lifecycle.restoreToProjectRoot();
536
+
537
+ assert.equal(s.basePath, "/some/path"); // unchanged
538
+ assert.equal(deps.calls.filter((c) => c.fn === "gitServiceFactory").length, 0);
539
+ });
540
+
541
+ // ─── adoptSessionRoot (ADR-016 phase 2 / B2, issue #5620) ─────────────────────
542
+
543
+ test("adoptSessionRoot sets basePath and seeds originalBasePath on a fresh session", () => {
544
+ const s = makeSession();
545
+ s.basePath = "";
546
+ s.originalBasePath = "";
547
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
548
+
549
+ lifecycle.adoptSessionRoot("/project");
550
+
551
+ assert.equal(s.basePath, "/project");
552
+ assert.equal(s.originalBasePath, "/project");
553
+ });
554
+
555
+ test("adoptSessionRoot preserves a pre-existing originalBasePath when no override is passed", () => {
556
+ // Resume-from-paused path (auto.ts:2148 after meta-restore at 2003/2055):
557
+ // s.originalBasePath was already restored from paused metadata; the verb
558
+ // must NOT overwrite that value.
559
+ const s = makeSession();
560
+ s.basePath = "";
561
+ s.originalBasePath = "/persisted/project-root";
562
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
563
+
564
+ lifecycle.adoptSessionRoot("/project");
565
+
566
+ assert.equal(s.basePath, "/project");
567
+ assert.equal(s.originalBasePath, "/persisted/project-root");
568
+ });
569
+
570
+ test("adoptSessionRoot honors an explicit originalBase override", () => {
571
+ const s = makeSession();
572
+ s.basePath = "";
573
+ s.originalBasePath = "/old-root";
574
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
575
+
576
+ lifecycle.adoptSessionRoot("/project", "/explicit-original");
577
+
578
+ assert.equal(s.basePath, "/project");
579
+ assert.equal(s.originalBasePath, "/explicit-original");
580
+ });
581
+
582
+ test("adoptSessionRoot does not chdir, rebuild git service, or invalidate caches", () => {
583
+ // The verb is a pure session-state mutation. Side effects (chdir, git
584
+ // service rebuild, cache invalidation) belong to other Lifecycle verbs
585
+ // (`enterMilestone`, `restoreToProjectRoot`).
586
+ const s = makeSession();
587
+ s.basePath = "";
588
+ s.originalBasePath = "";
589
+ const deps = makeDeps();
590
+ const lifecycle = new WorktreeLifecycle(s, deps);
591
+
592
+ lifecycle.adoptSessionRoot("/project");
593
+
594
+ assert.equal(deps.calls.filter((c) => c.fn === "gitServiceFactory").length, 0);
595
+ assert.equal(deps.calls.filter((c) => c.fn === "invalidateAllCaches").length, 0);
596
+ });
597
+
598
+ // ─── resumeFromPausedSession (ADR-016 phase 2 / B3, issue #5621) ──────────────
599
+
600
+ test("resumeFromPausedSession adopts the persisted worktree path when it exists", (t) => {
601
+ // Use a real temp directory so the existsSync check inside the verb
602
+ // succeeds. Earlier `process.cwd()` ran into ENOENT after sibling tests
603
+ // deleted their basePaths and left cwd dangling.
604
+ const wtDir = realpathSync(mkdtempSync(join(tmpdir(), "gsd-resume-test-")));
605
+ t.after(() => { try { rmSync(wtDir, { recursive: true, force: true }); } catch { /* */ } });
606
+
607
+ const s = makeSession();
608
+ s.basePath = "/some/old/path";
609
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
610
+
611
+ // Verify the pure helper's contract first (folded in from the legacy
612
+ // _resolvePausedResumeBasePathForTest)
613
+ assert.equal(
614
+ resolvePausedResumeBasePath("/project", "/persisted/worktree/M001", () => true),
615
+ "/persisted/worktree/M001",
616
+ );
617
+
618
+ // Exercise the verb with a real path that exists.
619
+ lifecycle.resumeFromPausedSession("/project", wtDir);
620
+ assert.equal(s.basePath, wtDir);
621
+ });
622
+
623
+ test("resumeFromPausedSession falls back to base when persisted worktree is null", () => {
624
+ const s = makeSession();
625
+ s.basePath = "/old";
626
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
627
+
628
+ lifecycle.resumeFromPausedSession("/project", null);
629
+ assert.equal(s.basePath, "/project");
630
+ });
631
+
632
+ test("resumeFromPausedSession falls back to base when persisted worktree does not exist", () => {
633
+ const s = makeSession();
634
+ s.basePath = "/old";
635
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
636
+
637
+ lifecycle.resumeFromPausedSession(
638
+ "/project",
639
+ "/this/path/does/not/exist/abc/xyz",
640
+ );
641
+ assert.equal(s.basePath, "/project");
642
+ });
643
+
644
+ test("resumeFromPausedSession does not chdir, rebuild git service, or invalidate caches", () => {
645
+ const s = makeSession();
646
+ const deps = makeDeps();
647
+ const lifecycle = new WorktreeLifecycle(s, deps);
648
+
649
+ lifecycle.resumeFromPausedSession("/project", null);
650
+
651
+ assert.equal(deps.calls.filter((c) => c.fn === "gitServiceFactory").length, 0);
652
+ assert.equal(deps.calls.filter((c) => c.fn === "invalidateAllCaches").length, 0);
653
+ });
654
+
655
+ // ─── adoptOrphanWorktree (ADR-016 phase 2 / B4, issue #5622) ──────────────────
656
+
657
+ // After C2 (#5625) the `getAutoWorktreePath` primitive is inlined, so these
658
+ // tests use a real-git fixture with a pre-created worktree to exercise the
659
+ // swap-run-revert protocol. The "fall back when getAutoWorktreePath returns
660
+ // null" test uses a fixture WITHOUT a worktree so the real call returns null.
661
+
662
+ test("adoptOrphanWorktree swaps to worktree path and reverts to base on !merged", (t) => {
663
+ const previousCwd = process.cwd();
664
+ const base = makeGitRepoBase({ isolation: "worktree" });
665
+ t.after(() => cleanupRepoBase(base, previousCwd));
666
+ const wt = join(base, ".gsd", "worktrees", "M001");
667
+ execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: base, stdio: "pipe" });
668
+ execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "pipe" });
669
+ execFileSync("git", ["worktree", "add", wt, "milestone/M001"], { cwd: base, stdio: "pipe" });
670
+
671
+ const s = makeSession();
672
+ s.basePath = "/old";
673
+ s.originalBasePath = "/old";
674
+ s.active = true;
675
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
676
+
677
+ let basePathInsideCallback = "";
678
+ const result = lifecycle.adoptOrphanWorktree("M001", base, () => {
679
+ basePathInsideCallback = s.basePath;
680
+ return { merged: false as const, reason: "synthetic" };
681
+ });
682
+
683
+ assert.equal(basePathInsideCallback, wt);
684
+ assert.equal(s.basePath, base);
685
+ assert.equal(s.originalBasePath, base);
686
+ assert.equal(result.merged, false);
687
+ });
688
+
689
+ test("adoptOrphanWorktree holds the swap on merged && active", (t) => {
690
+ const previousCwd = process.cwd();
691
+ const base = makeGitRepoBase({ isolation: "worktree" });
692
+ t.after(() => cleanupRepoBase(base, previousCwd));
693
+ const wt = join(base, ".gsd", "worktrees", "M001");
694
+ execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: base, stdio: "pipe" });
695
+ execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "pipe" });
696
+ execFileSync("git", ["worktree", "add", wt, "milestone/M001"], { cwd: base, stdio: "pipe" });
697
+
698
+ const s = makeSession();
699
+ s.basePath = "/old";
700
+ s.originalBasePath = "/old";
701
+ s.active = true;
702
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
703
+
704
+ lifecycle.adoptOrphanWorktree("M001", base, () => ({
705
+ merged: true as const,
706
+ }));
707
+
708
+ assert.equal(s.basePath, wt);
709
+ assert.equal(s.originalBasePath, base);
710
+ });
711
+
712
+ test("adoptOrphanWorktree restores prior paths on merged && !active", (t) => {
713
+ const previousCwd = process.cwd();
714
+ const base = makeGitRepoBase({ isolation: "worktree" });
715
+ t.after(() => cleanupRepoBase(base, previousCwd));
716
+ const wt = join(base, ".gsd", "worktrees", "M001");
717
+ execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: base, stdio: "pipe" });
718
+ execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "pipe" });
719
+ execFileSync("git", ["worktree", "add", wt, "milestone/M001"], { cwd: base, stdio: "pipe" });
720
+
721
+ const s = makeSession();
722
+ s.basePath = "/prior";
723
+ s.originalBasePath = "/prior-original";
724
+ s.active = false;
725
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
726
+
727
+ lifecycle.adoptOrphanWorktree("M001", base, () => ({
728
+ merged: true as const,
729
+ }));
730
+
731
+ assert.equal(s.basePath, "/prior");
732
+ assert.equal(s.originalBasePath, "/prior-original");
733
+ });
734
+
735
+ test("adoptOrphanWorktree falls back to base when getAutoWorktreePath returns null", (t) => {
736
+ // Real fixture with isolation:worktree but NO worktree pre-created — the
737
+ // real `getAutoWorktreePath` returns null so the verb falls back to base.
738
+ const previousCwd = process.cwd();
739
+ const base = makeGitRepoBase({ isolation: "worktree" });
740
+ t.after(() => cleanupRepoBase(base, previousCwd));
741
+
742
+ const s = makeSession();
743
+ s.basePath = "/old";
744
+ s.active = true;
745
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
746
+
747
+ let basePathInsideCallback = "";
748
+ lifecycle.adoptOrphanWorktree("M001", base, () => {
749
+ basePathInsideCallback = s.basePath;
750
+ return { merged: true as const };
751
+ });
752
+
753
+ assert.equal(basePathInsideCallback, base);
754
+ });
755
+
756
+ test("adoptOrphanWorktree restores prior paths and cwd when the callback throws", () => {
757
+ const originalCwd = process.cwd();
758
+ const base = mkdtempSync(join(tmpdir(), "gsd-orphan-rollback-base-"));
759
+ const worktree = mkdtempSync(join(tmpdir(), "gsd-orphan-rollback-wt-"));
760
+ const s = makeSession({
761
+ basePath: "/prior",
762
+ originalBasePath: originalCwd,
763
+ active: true,
764
+ });
765
+ const deps = makeDeps({
766
+ getAutoWorktreePath: () => worktree,
767
+ });
768
+ const lifecycle = new WorktreeLifecycle(s, deps);
769
+ const thrown = new Error("synthetic callback failure");
770
+
771
+ try {
772
+ assert.throws(
773
+ () =>
774
+ lifecycle.adoptOrphanWorktree<{ merged: boolean }>("M001", base, () => {
775
+ assert.equal(s.basePath, worktree);
776
+ assert.equal(s.originalBasePath, base);
777
+ throw thrown;
778
+ }),
779
+ thrown,
780
+ );
781
+
782
+ assert.equal(s.basePath, "/prior");
783
+ assert.equal(s.originalBasePath, originalCwd);
784
+ assert.equal(process.cwd(), originalCwd);
785
+ } finally {
786
+ process.chdir(originalCwd);
787
+ rmSync(base, { recursive: true, force: true });
788
+ rmSync(worktree, { recursive: true, force: true });
789
+ }
790
+ });
791
+
792
+ test("adoptOrphanWorktree rejects traversal-style milestone ids before path resolution", () => {
793
+ const s = makeSession({
794
+ basePath: "/prior",
795
+ originalBasePath: "/prior-original",
796
+ active: true,
797
+ });
798
+ const deps = makeDeps({
799
+ getAutoWorktreePath: () => {
800
+ throw new Error("getAutoWorktreePath should not be called");
801
+ },
802
+ });
803
+ const lifecycle = new WorktreeLifecycle(s, deps);
804
+
805
+ assert.throws(
806
+ () =>
807
+ lifecycle.adoptOrphanWorktree("../M001", "/project", () => ({
808
+ merged: true as const,
809
+ })),
810
+ /Invalid milestoneId: \.\.\/M001/,
811
+ );
812
+
813
+ assert.equal(s.basePath, "/prior");
814
+ assert.equal(s.originalBasePath, "/prior-original");
815
+ assert.equal(
816
+ deps.calls.filter((c) => c.fn === "getAutoWorktreePath").length,
817
+ 0,
818
+ );
819
+ });
820
+
821
+ test("adoptOrphanWorktree forwards the callback's return value", (t) => {
822
+ const previousCwd = process.cwd();
823
+ const base = makeGitRepoBase({ isolation: "worktree" });
824
+ t.after(() => cleanupRepoBase(base, previousCwd));
825
+
826
+
827
+ const s = makeSession();
828
+ s.active = true;
829
+ const lifecycle = new WorktreeLifecycle(s, makeDeps());
830
+
831
+ const result = lifecycle.adoptOrphanWorktree("M001", base, () => ({
832
+ merged: true as const,
833
+ customField: "preserved",
834
+ }));
835
+
836
+ assert.equal(result.merged, true);
837
+ assert.equal(result.customField, "preserved");
838
+ });
839
+
840
+ test("adoptOrphanWorktree leaves session unchanged when getAutoWorktreePath throws", () => {
841
+ const s = makeSession();
842
+ s.basePath = "/prior";
843
+ s.originalBasePath = "/prior-original";
844
+ s.active = true;
845
+ const lifecycle = new WorktreeLifecycle(
846
+ s,
847
+ makeDeps({
848
+ getAutoWorktreePath: () => {
849
+ throw new Error("git state unavailable");
850
+ },
851
+ }),
852
+ );
853
+
854
+ assert.throws(
855
+ () =>
856
+ lifecycle.adoptOrphanWorktree("M001", "/project", () => ({
857
+ merged: true as const,
858
+ })),
859
+ /git state unavailable/,
860
+ );
861
+ assert.equal(s.basePath, "/prior");
862
+ assert.equal(s.originalBasePath, "/prior-original");
863
+ });
864
+
865
+ test("adoptOrphanWorktree restores prior paths when callback throws", () => {
866
+ const s = makeSession();
867
+ s.basePath = "/prior";
868
+ s.originalBasePath = "/prior-original";
869
+ s.active = true;
870
+ const lifecycle = new WorktreeLifecycle(
871
+ s,
872
+ makeDeps({
873
+ getAutoWorktreePath: () => "/project/.gsd/worktrees/M001",
874
+ }),
875
+ );
876
+
877
+ assert.throws(
878
+ () =>
879
+ lifecycle.adoptOrphanWorktree("M001", "/project", () => {
880
+ assert.equal(s.basePath, "/project/.gsd/worktrees/M001");
881
+ assert.equal(s.originalBasePath, "/project");
882
+ throw new Error("merge exploded");
883
+ }),
884
+ /merge exploded/,
885
+ );
886
+ assert.equal(s.basePath, "/prior");
887
+ assert.equal(s.originalBasePath, "/prior-original");
888
+ });