gsd-pi 2.80.0-dev.8b3a59f5c → 2.80.0-dev.a947d025c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (714) hide show
  1. package/README.md +35 -59
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  18. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  20. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  21. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  23. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  31. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  32. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  33. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  34. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  36. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  37. package/dist/resources/extensions/gsd/auto.js +273 -87
  38. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  40. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  41. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  42. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  43. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  44. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
  47. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  48. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  50. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  51. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  52. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  54. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  55. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  56. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  57. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  58. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  59. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  60. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  62. package/dist/resources/extensions/gsd/detection.js +106 -0
  63. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  64. package/dist/resources/extensions/gsd/git-service.js +73 -5
  65. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  66. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  67. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  68. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  69. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  70. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  72. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  73. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  75. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  76. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  77. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  81. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  85. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  87. package/dist/resources/extensions/gsd/quick.js +34 -2
  88. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  89. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  90. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  91. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  92. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  93. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  94. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  96. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  97. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  98. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  99. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  100. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  101. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  103. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  104. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  105. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  106. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  107. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  108. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  109. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  110. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  111. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  112. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  113. package/dist/web/standalone/.next/BUILD_ID +1 -1
  114. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  115. package/dist/web/standalone/.next/build-manifest.json +3 -3
  116. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  117. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  118. package/dist/web/standalone/.next/required-server-files.json +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/index.html +1 -1
  138. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  139. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  146. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware.js +3 -3
  149. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  150. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  151. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  152. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  153. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  154. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  155. package/dist/web/standalone/server.js +1 -1
  156. package/dist/welcome-screen.d.ts +2 -0
  157. package/dist/welcome-screen.js +9 -7
  158. package/package.json +6 -4
  159. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  160. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  161. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  162. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  163. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  164. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  165. package/packages/native/tsconfig.tsbuildinfo +1 -1
  166. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  169. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  170. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  171. package/packages/pi-agent-core/dist/agent.js +43 -11
  172. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  173. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  174. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  175. package/packages/pi-agent-core/dist/index.js +2 -0
  176. package/packages/pi-agent-core/dist/index.js.map +1 -1
  177. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  178. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  179. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  180. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  181. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  182. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  183. package/packages/pi-agent-core/dist/types.js.map +1 -1
  184. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  185. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  186. package/packages/pi-agent-core/src/agent.ts +52 -11
  187. package/packages/pi-agent-core/src/index.ts +2 -0
  188. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  189. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  190. package/packages/pi-agent-core/src/types.ts +26 -10
  191. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  192. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  194. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  196. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  198. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  199. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  200. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  202. package/packages/pi-ai/dist/types.d.ts +2 -0
  203. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  204. package/packages/pi-ai/dist/types.js.map +1 -1
  205. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  207. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  209. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  211. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  212. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  213. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  214. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  215. package/packages/pi-ai/src/types.ts +3 -0
  216. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  217. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  218. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  219. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  220. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  227. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +35 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  267. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  291. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  322. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +114 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +177 -19
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +33 -6
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  366. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  369. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +41 -1
  370. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  371. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  372. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  374. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  375. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  376. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  377. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  378. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  379. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  380. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  381. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  382. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  383. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  384. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  385. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  386. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  387. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  388. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  389. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  390. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  391. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  392. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  393. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  394. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  395. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  396. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  397. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +144 -22
  399. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  400. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  401. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  402. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +208 -19
  404. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +41 -8
  406. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  408. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  409. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  410. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  412. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  413. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  414. package/packages/pi-tui/dist/tui.js +18 -8
  415. package/packages/pi-tui/dist/tui.js.map +1 -1
  416. package/packages/pi-tui/src/tui.ts +20 -8
  417. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  418. package/packages/rpc-client/README.md +7 -0
  419. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  420. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  421. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  422. package/src/resources/GSD-WORKFLOW.md +2 -2
  423. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  424. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  425. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  426. package/src/resources/extensions/github-sync/sync.ts +8 -1
  427. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  428. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  429. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  430. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  431. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  432. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  433. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  434. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  435. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  436. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  437. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  438. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  439. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  440. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  441. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  442. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  443. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  444. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  445. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  446. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  447. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  448. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  449. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  450. package/src/resources/extensions/gsd/auto.ts +336 -89
  451. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  452. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  453. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  454. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  455. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  456. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  457. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  458. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  459. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
  460. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  461. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  462. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  463. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  464. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  465. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  466. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  467. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  468. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  469. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  470. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  471. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  472. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  473. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  474. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  475. package/src/resources/extensions/gsd/detection.ts +128 -0
  476. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  477. package/src/resources/extensions/gsd/git-service.ts +87 -10
  478. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  479. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  480. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  481. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  482. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  483. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  484. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  485. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  486. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  487. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  488. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  490. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  491. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  492. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  495. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  497. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  499. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  501. package/src/resources/extensions/gsd/quick.ts +37 -2
  502. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  503. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  504. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  505. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  506. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  507. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  508. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  509. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  510. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  511. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  512. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  513. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  514. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  515. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  516. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  517. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  518. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  519. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  520. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  521. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  522. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  523. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  524. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  525. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  526. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  527. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  528. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  529. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  530. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  531. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  532. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  533. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  534. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  535. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  536. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  537. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  538. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  539. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  540. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  541. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  542. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  543. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  544. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  545. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  546. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  547. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  548. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  549. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  550. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  551. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  552. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  553. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  554. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  555. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  556. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  557. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  558. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  559. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  560. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  561. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  562. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  563. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  564. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  565. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  566. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  567. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  568. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  569. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  572. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  573. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  574. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  575. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  576. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  577. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  578. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  579. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  580. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  581. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  582. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  583. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  584. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  585. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  586. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  587. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  588. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  589. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  590. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  591. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  592. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  593. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  594. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  595. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  596. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  597. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  598. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  599. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  600. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  601. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  602. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  603. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  604. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  605. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  606. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  607. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  608. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  609. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  610. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  611. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  612. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  613. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  614. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  615. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  616. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  617. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  618. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  619. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  620. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  621. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  622. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  623. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  624. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  625. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  626. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  627. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  628. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  629. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  630. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  631. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  632. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  633. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  634. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  635. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  636. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  637. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  638. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  639. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  640. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  641. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  642. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  643. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  644. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  645. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  646. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  647. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  648. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  649. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  650. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  651. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  652. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  653. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  654. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  655. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  656. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  657. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  658. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  659. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  660. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  661. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  662. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  663. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  664. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  665. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  666. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  667. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  668. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  669. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  670. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  671. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  672. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  673. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  674. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  675. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  676. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  677. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  678. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  679. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  680. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  681. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  682. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  683. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  684. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  685. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  686. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  687. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  688. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  689. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  690. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  691. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  692. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  693. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  694. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  695. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  696. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  697. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  698. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  699. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  700. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  701. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  702. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  703. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  704. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  705. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  706. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  707. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  708. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  709. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  710. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  711. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  712. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  713. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  714. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -15,6 +15,7 @@ import { tmpdir } from "node:os";
15
15
  import { autoLoop } from "../auto/loop.js";
16
16
  import { resolveAgentEnd, _hasPendingResolveForTest, _resetPendingResolve } from "../auto/resolve.js";
17
17
  import type { LoopDeps } from "../auto/loop-deps.js";
18
+ import { WorktreeStateProjection } from "../worktree-state-projection.js";
18
19
  import type { SessionLockStatus } from "../session-lock.js";
19
20
  import { writeGraph, readGraph, type WorkflowGraph, type GraphStep } from "../graph.ts";
20
21
  import { writeFileSync } from "node:fs";
@@ -172,7 +173,6 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
172
173
  rebuildState: async () => {},
173
174
  loadEffectiveGSDPreferences: () => undefined,
174
175
  preDispatchHealthGate: async () => ({ proceed: true, fixesApplied: [] }),
175
- syncProjectRootToWorktree: () => {},
176
176
  checkResourcesStale: () => null,
177
177
  validateSessionLock: () => ({ valid: true } as SessionLockStatus),
178
178
  updateSessionLock: () => {},
@@ -192,7 +192,11 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
192
192
  resolveMilestoneFile: () => null,
193
193
  reconcileMergeState: () => "clean",
194
194
  preflightCleanRoot: () => ({ stashPushed: false, summary: "" }),
195
- postflightPopStash: () => {},
195
+ postflightPopStash: () => ({
196
+ restored: true,
197
+ needsManualRecovery: false,
198
+ message: "restored",
199
+ }),
196
200
  getLedger: () => null,
197
201
  getProjectTotals: () => ({ cost: 0 }),
198
202
  formatCost: (c: number) => `$${c.toFixed(2)}`,
@@ -224,15 +228,19 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
224
228
  readFileSync: () => "",
225
229
  atomicWriteSync: () => {},
226
230
  GitServiceImpl: class {} as any,
227
- resolver: {
228
- get workPath() { return "/tmp/project"; },
229
- get projectRoot() { return "/tmp/project"; },
230
- get lockPath() { return "/tmp/project"; },
231
- enterMilestone: () => {},
232
- exitMilestone: () => {},
233
- mergeAndExit: () => {},
234
- mergeAndEnterNext: () => {},
231
+ lifecycle: {
232
+ enterMilestone: () => ({ ok: true, mode: "none", path: "/tmp/project" }),
233
+ exitMilestone: (_mid: string, opts: { merge: boolean }) => ({
234
+ ok: true,
235
+ merged: opts.merge,
236
+ codeFilesChanged: false,
237
+ }),
238
+ degradeToBranchMode: () => {},
239
+ restoreToProjectRoot: () => {},
240
+ isInMilestone: () => true,
241
+ getCurrentMilestoneIfAny: () => "M001",
235
242
  } as any,
243
+ worktreeProjection: new WorktreeStateProjection(),
236
244
  postUnitPreVerification: async () => "continue" as const,
237
245
  runPostUnitVerification: async () => "continue" as const,
238
246
  postUnitPostVerification: async () => "continue" as const,
@@ -0,0 +1,138 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Behavior tests for deleted-cwd fallback handling.
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+ import { mkdtempSync, rmSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+
9
+ import { registerDbTools } from "../bootstrap/db-tools.ts";
10
+ import { registerDynamicTools, ensureDbOpen, safeWorkspaceCwd } from "../bootstrap/dynamic-tools.ts";
11
+ import { registerExecTools } from "../bootstrap/exec-tools.ts";
12
+ import { registerJournalTools } from "../bootstrap/journal-tools.ts";
13
+ import { registerMemoryTools } from "../bootstrap/memory-tools.ts";
14
+ import { registerQueryTools } from "../bootstrap/query-tools.ts";
15
+
16
+ async function withDeletedCwd(fn: (projectRoot: string) => Promise<void> | void): Promise<void> {
17
+ const previousCwd = process.cwd();
18
+ const previousProjectRoot = process.env.GSD_PROJECT_ROOT;
19
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-safe-cwd-project-"));
20
+ const removedCwd = mkdtempSync(join(tmpdir(), "gsd-removed-cwd-"));
21
+
22
+ process.env.GSD_PROJECT_ROOT = projectRoot;
23
+ process.chdir(removedCwd);
24
+ rmSync(removedCwd, { recursive: true, force: true });
25
+
26
+ try {
27
+ assert.throws(() => process.cwd(), /ENOENT/);
28
+ await fn(projectRoot);
29
+ } finally {
30
+ process.chdir(previousCwd);
31
+ if (previousProjectRoot === undefined) delete process.env.GSD_PROJECT_ROOT;
32
+ else process.env.GSD_PROJECT_ROOT = previousProjectRoot;
33
+ rmSync(projectRoot, { recursive: true, force: true });
34
+ }
35
+ }
36
+
37
+ function collectTools(register: (pi: any) => void): any[] {
38
+ const tools: any[] = [];
39
+ register({
40
+ registerTool(tool: any) {
41
+ tools.push(tool);
42
+ },
43
+ });
44
+ return tools;
45
+ }
46
+
47
+ test("safeWorkspaceCwd falls back to captured project root when cwd was removed", async () => {
48
+ await withDeletedCwd((projectRoot) => {
49
+ assert.equal(safeWorkspaceCwd(), projectRoot);
50
+ });
51
+ });
52
+
53
+ test("ensureDbOpen default path does not throw when cwd was removed", async () => {
54
+ await withDeletedCwd(async () => {
55
+ assert.equal(await ensureDbOpen(), false);
56
+ });
57
+ });
58
+
59
+ test("dynamic tools register when cwd was removed", async () => {
60
+ await withDeletedCwd(() => {
61
+ const tools = collectTools(registerDynamicTools);
62
+ assert.equal(tools.length, 4);
63
+ });
64
+ });
65
+
66
+ test("db-backed tool fallbacks return normal unavailable-db errors when cwd was removed", async () => {
67
+ await withDeletedCwd(async () => {
68
+ const tools = collectTools(registerDbTools);
69
+ const decisionSave = tools.find((tool) => tool.name === "gsd_decision_save");
70
+
71
+ const result = await decisionSave.execute(
72
+ "call-1",
73
+ {
74
+ scope: "test",
75
+ decision: "Handle deleted cwd",
76
+ choice: "Use captured project root",
77
+ rationale: "The worktree cwd may disappear during cleanup.",
78
+ },
79
+ undefined,
80
+ undefined,
81
+ undefined,
82
+ );
83
+
84
+ assert.equal(result.details.error, "db_unavailable");
85
+ });
86
+ });
87
+
88
+ test("memory and query tools do not throw when cwd was removed", async () => {
89
+ await withDeletedCwd(async () => {
90
+ const memoryTools = collectTools(registerMemoryTools);
91
+ const queryTools = collectTools(registerQueryTools);
92
+
93
+ await assert.doesNotReject(() =>
94
+ memoryTools.find((tool) => tool.name === "memory_query").execute(
95
+ "call-1",
96
+ { query: "cwd fallback" },
97
+ undefined,
98
+ undefined,
99
+ undefined,
100
+ ),
101
+ );
102
+ await assert.doesNotReject(() =>
103
+ queryTools.find((tool) => tool.name === "gsd_milestone_status").execute(
104
+ "call-2",
105
+ { milestoneId: "M001" },
106
+ undefined,
107
+ undefined,
108
+ undefined,
109
+ ),
110
+ );
111
+ });
112
+ });
113
+
114
+ test("journal and exec tools do not throw when cwd was removed", async () => {
115
+ await withDeletedCwd(async () => {
116
+ const journalTools = collectTools(registerJournalTools);
117
+ const execTools = collectTools(registerExecTools);
118
+
119
+ await assert.doesNotReject(() =>
120
+ journalTools.find((tool) => tool.name === "gsd_journal_query").execute(
121
+ "call-1",
122
+ { limit: 1 },
123
+ undefined,
124
+ undefined,
125
+ undefined,
126
+ ),
127
+ );
128
+ await assert.doesNotReject(() =>
129
+ execTools.find((tool) => tool.name === "gsd_resume").execute(
130
+ "call-2",
131
+ {},
132
+ undefined,
133
+ undefined,
134
+ undefined,
135
+ ),
136
+ );
137
+ });
138
+ });
@@ -1,21 +1,12 @@
1
1
  /**
2
- * dashboard-custom-engine.test.ts — Tests that the custom engine path
3
- * calls updateProgressWidget and that unitLabel handles "custom-step".
4
- *
5
- * Uses source-level assertions for the non-exported unitLabel function
6
- * and the updateProgressWidget call placement. Tests exported helpers
7
- * (unitVerb, unitPhaseLabel) directly.
2
+ * dashboard-custom-engine.test.ts — custom-step dashboard labels.
8
3
  */
9
4
 
10
5
  import { describe, it } from "node:test";
11
6
  import assert from "node:assert/strict";
12
- import { readFileSync } from "node:fs";
13
- import { resolve } from "node:path";
14
- import { fileURLToPath } from "node:url";
15
7
 
16
8
  import { unitVerb, unitPhaseLabel } from "../auto-dashboard.js";
17
-
18
- // ─── Tests ───────────────────────────────────────────────────────────────
9
+ import { unitLabel } from "../dashboard-overlay.ts";
19
10
 
20
11
  describe("Dashboard custom-engine: unitLabel and related helpers", () => {
21
12
  it('unitVerb("custom-step") returns "executing workflow step"', () => {
@@ -26,62 +17,7 @@ describe("Dashboard custom-engine: unitLabel and related helpers", () => {
26
17
  assert.equal(unitPhaseLabel("custom-step"), "WORKFLOW");
27
18
  });
28
19
 
29
- it('dashboard-overlay.ts contains a case for "custom-step" returning "Workflow Step"', () => {
30
- const __filename = fileURLToPath(import.meta.url);
31
- const overlayPath = resolve(__filename, "../../dashboard-overlay.ts");
32
- const source = readFileSync(overlayPath, "utf-8");
33
- assert.ok(
34
- source.includes('"custom-step"') && source.includes('"Workflow Step"'),
35
- 'dashboard-overlay.ts should contain case "custom-step": return "Workflow Step"',
36
- );
37
- });
38
- });
39
-
40
- describe("Dashboard custom-engine: updateProgressWidget in custom engine path", () => {
41
- it("loop.ts custom engine path includes updateProgressWidget call before runGuards", () => {
42
- const __filename = fileURLToPath(import.meta.url);
43
- const loopPath = resolve(__filename, "../../auto/loop.ts");
44
- const source = readFileSync(loopPath, "utf-8");
45
-
46
- // Find the custom engine block
47
- const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
48
- assert.ok(customEngineStart > -1, "Should find custom engine path in loop.ts");
49
-
50
- // The updateProgressWidget call should appear after the custom engine block start
51
- // and before the runGuards call in that block
52
- const afterCustomEngine = source.slice(customEngineStart);
53
- const widgetCallIndex = afterCustomEngine.indexOf(
54
- "deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state)",
55
- );
56
- const guardsCallIndex = afterCustomEngine.indexOf("runGuards(ic,");
57
- assert.ok(widgetCallIndex > -1, "updateProgressWidget should be called in custom engine path");
58
- assert.ok(
59
- widgetCallIndex < guardsCallIndex,
60
- "updateProgressWidget should be called before runGuards in custom engine path",
61
- );
62
- });
63
-
64
- it("updateProgressWidget call is placed after iterData is built", () => {
65
- const __filename = fileURLToPath(import.meta.url);
66
- const loopPath = resolve(__filename, "../../auto/loop.ts");
67
- const source = readFileSync(loopPath, "utf-8");
68
-
69
- const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
70
- const afterCustomEngine = source.slice(customEngineStart);
71
-
72
- // Verify custom engine path has iterData built before the widget call
73
- const iterDataIndex = afterCustomEngine.indexOf("buildCustomEngineIterationData({");
74
- const widgetIndex = afterCustomEngine.indexOf("deps.updateProgressWidget");
75
- assert.ok(iterDataIndex > -1 && widgetIndex > -1, "Both iterData and widget call should exist");
76
- assert.ok(
77
- iterDataIndex < widgetIndex,
78
- "iterData should be built before updateProgressWidget is called",
79
- );
80
-
81
- // Verify the call uses iterData.state (which holds the derived GSD state)
82
- assert.ok(
83
- afterCustomEngine.includes("iterData.state"),
84
- "Custom engine updateProgressWidget should reference iterData.state",
85
- );
20
+ it('unitLabel("custom-step") returns "Workflow Step"', () => {
21
+ assert.equal(unitLabel("custom-step"), "Workflow Step");
86
22
  });
87
23
  });
@@ -20,6 +20,7 @@ import {
20
20
  clearPendingAutoStart,
21
21
  checkDeepProjectSetupAfterTurn,
22
22
  clearPendingDeepProjectSetup,
23
+ FOREGROUND_DEEP_SETUP_RULE_NAMES,
23
24
  showSmartEntry,
24
25
  startDeepProjectSetupForeground,
25
26
  } from "../guided-flow.ts";
@@ -272,7 +273,7 @@ test("deep project setup: bootstrap can start auto-mode without an active milest
272
273
  shouldUseWorktreeIsolation: () => false,
273
274
  registerSigtermHandler: () => {},
274
275
  lockBase: () => base,
275
- buildResolver: () => ({}) as any,
276
+ buildLifecycle: () => ({}) as any,
276
277
  },
277
278
  {
278
279
  classification: "none",
@@ -377,7 +378,7 @@ test("deep project setup: bootstrap continues queued M002 without milestone cont
377
378
  shouldUseWorktreeIsolation: () => false,
378
379
  registerSigtermHandler: () => {},
379
380
  lockBase: () => base,
380
- buildResolver: () => ({}) as any,
381
+ buildLifecycle: () => ({}) as any,
381
382
  },
382
383
  {
383
384
  classification: "none",
@@ -1013,15 +1014,9 @@ test("deep project setup: same project advances when agent_end session id change
1013
1014
  });
1014
1015
 
1015
1016
  test("deep project setup: foreground dispatcher does not probe research-project rule", () => {
1016
- const source = readFileSync(new URL("../guided-flow.ts", import.meta.url), "utf-8");
1017
- const match = source.match(/const FOREGROUND_DEEP_SETUP_RULE_NAMES = new Set\(\[([\s\S]*?)\]\);/);
1018
- assert.ok(match, "foreground deep setup rule allowlist should be present");
1019
- assert.doesNotMatch(
1020
- match![1]!,
1021
- /research-project/,
1022
- "foreground setup must not evaluate research-project because that rule claims the inflight marker",
1023
- );
1024
- assert.match(source, /research-project have dispatch-time side effects/);
1017
+ assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no PROJECT) → discuss-project"), true);
1018
+ assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no research decision) research-decision"), true);
1019
+ assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no PROJECT research) research-project"), false);
1025
1020
  });
1026
1021
 
1027
1022
  test("deep project setup: project-level units verify their real artifacts", () => {
@@ -1,14 +1,10 @@
1
1
  // GSD Extension — Regression test for #4996: deferred milestone dir creation
2
- // Verifies that showHeadlessMilestoneCreation does not pre-create the milestone
3
- // directory before the discuss flow runs. The dir should only appear after a
4
- // writer (saveArtifactToDb / atomicWriteAsync) emits the first artifact.
5
2
 
6
3
  import { describe, it, beforeEach, afterEach } from "node:test";
7
4
  import assert from "node:assert/strict";
8
- import { mkdtempSync, mkdirSync, existsSync, rmSync, readFileSync } from "node:fs";
9
- import { dirname, join } from "node:path";
5
+ import { mkdtempSync, mkdirSync, existsSync, rmSync } from "node:fs";
6
+ import { join } from "node:path";
10
7
  import { tmpdir } from "node:os";
11
- import { fileURLToPath } from "node:url";
12
8
 
13
9
  import { isReusableGhostMilestone } from "../state.ts";
14
10
  import { nextMilestoneIdReserved } from "../milestone-id-reservation.ts";
@@ -16,47 +12,12 @@ import { clearReservedMilestoneIds, findMilestoneIds } from "../milestone-ids.ts
16
12
  import { invalidateAllCaches } from "../cache.ts";
17
13
  import { closeDatabase, openDatabase } from "../gsd-db.ts";
18
14
 
19
- const __dirname = dirname(fileURLToPath(import.meta.url));
20
- const GUIDED_FLOW_PATH = join(__dirname, "..", "guided-flow.ts");
21
-
22
- function getShowHeadlessBody(): string {
23
- const source = readFileSync(GUIDED_FLOW_PATH, "utf-8");
24
- const fnStart = source.indexOf("export async function showHeadlessMilestoneCreation");
25
- assert.ok(fnStart > -1, "showHeadlessMilestoneCreation must exist in guided-flow.ts");
26
- const nextExport = source.indexOf("\nexport ", fnStart + 1);
27
- return source.slice(fnStart, nextExport === -1 ? source.length : nextExport);
28
- }
29
-
30
15
  function makeBase(prefix = "gsd-deferred-dir-"): string {
31
16
  const base = mkdtempSync(join(tmpdir(), prefix));
32
17
  mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
33
18
  return base;
34
19
  }
35
20
 
36
- describe("showHeadlessMilestoneCreation source guard (#4996)", () => {
37
- it("does not call mkdirSync in the headless milestone creation path", () => {
38
- const body = getShowHeadlessBody();
39
- assert.doesNotMatch(
40
- body,
41
- /\bmkdirSync\s*\(/,
42
- "showHeadlessMilestoneCreation must not pre-create milestone directories",
43
- );
44
- });
45
-
46
- it("does not call mkdir or mkdirp before dispatchWorkflow", () => {
47
- const body = getShowHeadlessBody();
48
- const dispatchIdx = body.indexOf("dispatchWorkflow");
49
- assert.ok(dispatchIdx > -1, "dispatchWorkflow must be present");
50
-
51
- const beforeDispatch = body.slice(0, dispatchIdx);
52
- assert.doesNotMatch(
53
- beforeDispatch,
54
- /\b(?:mkdir|mkdirp)\s*\(/,
55
- "showHeadlessMilestoneCreation must defer directory creation until artifact write",
56
- );
57
- });
58
- });
59
-
60
21
  describe("deferred milestone dir creation (#4996)", () => {
61
22
  let base: string;
62
23
 
@@ -74,43 +35,31 @@ describe("deferred milestone dir creation (#4996)", () => {
74
35
  it("(a) fresh project: milestones dir has no M001 entry before any discuss flow", () => {
75
36
  base = makeBase();
76
37
  const nextId = nextMilestoneIdReserved(findMilestoneIds(base), false, base);
77
- assert.equal(nextId, "M001", "reservation should choose M001 for a fresh project");
38
+ assert.equal(nextId, "M001");
78
39
 
79
40
  const ids = findMilestoneIds(base);
80
- assert.equal(ids.length, 0, "no milestone dirs should exist before any discuss flow");
81
-
82
- // And specifically M001 should not exist
83
- const m001Dir = join(base, ".gsd", "milestones", "M001");
84
- assert.ok(!existsSync(m001Dir), "M001 dir must not exist before the discuss flow runs");
41
+ assert.equal(ids.length, 0);
42
+ assert.ok(!existsSync(join(base, ".gsd", "milestones", "M001")));
85
43
  });
86
44
 
87
- it("(b) abandoned discuss flow leaves no orphan: isReusableGhostMilestone returns false for non-existent dir", () => {
45
+ it("(b) abandoned discuss flow leaves no orphan", () => {
88
46
  base = makeBase();
89
47
  const nextId = nextMilestoneIdReserved(findMilestoneIds(base), false, base);
90
- assert.equal(nextId, "M001", "reservation should not require a pre-created directory");
48
+ assert.equal(nextId, "M001");
91
49
 
92
50
  const m001Dir = join(base, ".gsd", "milestones", "M001");
93
- assert.ok(!existsSync(m001Dir), "no M001 dir should exist");
94
- assert.equal(isReusableGhostMilestone(base, "M001"), false, "non-existent milestone should not be reusable");
95
- // findMilestoneIds only returns dirs that exist
96
- const ids = findMilestoneIds(base);
97
- assert.ok(!ids.includes("M001"), "M001 should not appear in findMilestoneIds when no dir exists");
51
+ assert.ok(!existsSync(m001Dir));
52
+ assert.equal(isReusableGhostMilestone(base, "M001"), false);
53
+ assert.ok(!findMilestoneIds(base).includes("M001"));
98
54
  });
99
55
 
100
- it("(c) a stub dir left from a previous bug IS reusable but a newly-generated ID with no dir is not in the ghost list", () => {
56
+ it("(c) a stub dir left from a previous bug is reusable", () => {
101
57
  base = makeBase();
102
58
  openDatabase(join(base, ".gsd", "gsd.db"));
103
- // Create a stub to represent a pre-existing phantom
104
59
  mkdirSync(join(base, ".gsd", "milestones", "M001", "slices"), { recursive: true });
105
60
 
106
- // isReusableGhostMilestone identifies the orphaned stub
107
- assert.ok(isReusableGhostMilestone(base, "M001"), "pre-existing stub should be identified as reusable ghost");
108
- const nextId = nextMilestoneIdReserved(findMilestoneIds(base), false, base);
109
- assert.equal(nextId, "M001", "reservation should reuse the pre-existing ghost");
110
-
111
- // The new ID (M002, which would be max+1 in this scenario but ghost reuse returns M001)
112
- // should not have a dir
113
- const m002Dir = join(base, ".gsd", "milestones", "M002");
114
- assert.ok(!existsSync(m002Dir), "a freshly-requested ID should have no dir until first artifact write");
61
+ assert.equal(isReusableGhostMilestone(base, "M001"), true);
62
+ assert.equal(nextMilestoneIdReserved(findMilestoneIds(base), false, base), "M001");
63
+ assert.ok(!existsSync(join(base, ".gsd", "milestones", "M002")));
115
64
  });
116
65
  });
@@ -11,12 +11,14 @@
11
11
  import test from "node:test";
12
12
  import assert from "node:assert/strict";
13
13
  import { mkdirSync, writeFileSync, rmSync, existsSync } from "node:fs";
14
+ import { execFileSync } from "node:child_process";
14
15
  import { join } from "node:path";
15
16
  import { tmpdir } from "node:os";
16
17
  import {
17
18
  detectProjectState,
18
19
  detectV1Planning,
19
20
  detectProjectSignals,
21
+ classifyProject,
20
22
  scanProjectFiles,
21
23
  } from "../detection.ts";
22
24
 
@@ -37,6 +39,18 @@ function cleanup(dir: string): void {
37
39
  }
38
40
  }
39
41
 
42
+ function git(dir: string, args: string[]): void {
43
+ execFileSync("git", args, { cwd: dir, stdio: "ignore" });
44
+ }
45
+
46
+ function makeGitRepo(prefix: string): string {
47
+ const dir = makeTempDir(prefix);
48
+ git(dir, ["init"]);
49
+ git(dir, ["config", "user.email", "test@example.com"]);
50
+ git(dir, ["config", "user.name", "Test User"]);
51
+ return dir;
52
+ }
53
+
40
54
  // ─── detectProjectState ─────────────────────────────────────────────────────────
41
55
 
42
56
  test("detectProjectState: empty directory returns state=none", (t) => {
@@ -49,6 +63,132 @@ test("detectProjectState: empty directory returns state=none", (t) => {
49
63
  assert.equal(result.v2, undefined);
50
64
  });
51
65
 
66
+ test("classifyProject: no git repo is invalid", (t) => {
67
+ const dir = makeTempDir("classify-invalid");
68
+ t.after(() => cleanup(dir));
69
+
70
+ const classification = classifyProject(dir);
71
+ assert.equal(classification.kind, "invalid-repo");
72
+ });
73
+
74
+ test("classifyProject: empty git repo is greenfield", (t) => {
75
+ const dir = makeGitRepo("classify-greenfield");
76
+ t.after(() => cleanup(dir));
77
+
78
+ const classification = classifyProject(dir);
79
+ assert.equal(classification.kind, "greenfield");
80
+ });
81
+
82
+ test("classifyProject: nested empty git repo does not inherit ancestor markers", (t) => {
83
+ const parent = makeGitRepo("classify-parent-marker");
84
+ t.after(() => cleanup(parent));
85
+
86
+ writeFileSync(join(parent, "package.json"), JSON.stringify({ name: "parent" }), "utf-8");
87
+ git(parent, ["add", "package.json"]);
88
+ git(parent, ["commit", "-m", "add parent marker"]);
89
+ const child = join(parent, "nested");
90
+ mkdirSync(child, { recursive: true });
91
+ git(child, ["init"]);
92
+ git(child, ["config", "user.email", "test@example.com"]);
93
+ git(child, ["config", "user.name", "Test User"]);
94
+
95
+ const classification = classifyProject(child);
96
+ assert.equal(classification.kind, "greenfield");
97
+ });
98
+
99
+ test("classifyProject: tracked static HTML is existing untyped content", (t) => {
100
+ const dir = makeGitRepo("classify-index");
101
+ t.after(() => cleanup(dir));
102
+
103
+ writeFileSync(join(dir, "index.html"), "<main></main>\n", "utf-8");
104
+ git(dir, ["add", "index.html"]);
105
+ git(dir, ["commit", "-m", "add static page"]);
106
+
107
+ const classification = classifyProject(dir);
108
+ assert.equal(classification.kind, "untyped-existing");
109
+ assert.deepEqual(classification.contentFiles, ["index.html"]);
110
+ });
111
+
112
+ test("classifyProject: README-only repo is existing untyped content", (t) => {
113
+ const dir = makeGitRepo("classify-readme");
114
+ t.after(() => cleanup(dir));
115
+
116
+ writeFileSync(join(dir, "README.md"), "# docs\n", "utf-8");
117
+ git(dir, ["add", "README.md"]);
118
+ git(dir, ["commit", "-m", "add docs"]);
119
+
120
+ const classification = classifyProject(dir);
121
+ assert.equal(classification.kind, "untyped-existing");
122
+ });
123
+
124
+ test("classifyProject: src-only content is untyped existing, not typed marker", (t) => {
125
+ const dir = makeGitRepo("classify-src-only");
126
+ t.after(() => cleanup(dir));
127
+
128
+ mkdirSync(join(dir, "src"), { recursive: true });
129
+ writeFileSync(join(dir, "src", "index.txt"), "content\n", "utf-8");
130
+ git(dir, ["add", "src/index.txt"]);
131
+ git(dir, ["commit", "-m", "add source content"]);
132
+
133
+ const classification = classifyProject(dir);
134
+ assert.equal(classification.kind, "untyped-existing");
135
+ assert.deepEqual(classification.contentFiles, ["src/index.txt"]);
136
+ });
137
+
138
+ test("classifyProject: nested untracked files count as project content", (t) => {
139
+ const dir = makeGitRepo("classify-untracked-nested");
140
+ t.after(() => cleanup(dir));
141
+
142
+ mkdirSync(join(dir, "docs"), { recursive: true });
143
+ writeFileSync(join(dir, "docs", "index.html"), "<main></main>\n", "utf-8");
144
+
145
+ const classification = classifyProject(dir);
146
+ assert.equal(classification.kind, "untyped-existing");
147
+ assert.deepEqual(classification.untrackedFiles, ["docs/index.html"]);
148
+ });
149
+
150
+ test("classifyProject: known markers produce typed existing project", (t) => {
151
+ const dir = makeGitRepo("classify-typed");
152
+ t.after(() => cleanup(dir));
153
+
154
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "typed" }), "utf-8");
155
+ git(dir, ["add", "package.json"]);
156
+ git(dir, ["commit", "-m", "add package"]);
157
+
158
+ const classification = classifyProject(dir);
159
+ assert.equal(classification.kind, "typed-existing");
160
+ assert.ok(classification.markers.includes("package.json"));
161
+ });
162
+
163
+ test("classifyProject: ignored build/cache-only files do not count as content", (t) => {
164
+ const dir = makeGitRepo("classify-ignored");
165
+ t.after(() => cleanup(dir));
166
+
167
+ writeFileSync(join(dir, ".gitignore"), "dist/\n.cache/\n", "utf-8");
168
+ git(dir, ["add", ".gitignore"]);
169
+ git(dir, ["commit", "-m", "ignore generated files"]);
170
+ mkdirSync(join(dir, "dist"), { recursive: true });
171
+ writeFileSync(join(dir, "dist", "bundle.js"), "generated\n", "utf-8");
172
+ mkdirSync(join(dir, ".cache"), { recursive: true });
173
+ writeFileSync(join(dir, ".cache", "x"), "cache\n", "utf-8");
174
+
175
+ const classification = classifyProject(dir);
176
+ assert.equal(classification.kind, "greenfield");
177
+ });
178
+
179
+ test("classifyProject: generated framework/cache dirs do not count as content", (t) => {
180
+ const dir = makeGitRepo("classify-generated-dirs");
181
+ t.after(() => cleanup(dir));
182
+
183
+ mkdirSync(join(dir, ".next", "server"), { recursive: true });
184
+ writeFileSync(join(dir, ".next", "server", "page.js"), "generated\n", "utf-8");
185
+ mkdirSync(join(dir, ".venv", "lib"), { recursive: true });
186
+ writeFileSync(join(dir, ".venv", "lib", "site.py"), "generated\n", "utf-8");
187
+
188
+ const classification = classifyProject(dir);
189
+ assert.equal(classification.kind, "greenfield");
190
+ });
191
+
52
192
  test("detectProjectState: directory with .gsd/milestones/M001 returns v2-gsd", (t) => {
53
193
  const dir = makeTempDir("v2-gsd");
54
194
  t.after(() => cleanup(dir));