gsd-pi 2.41.0 → 2.42.0-dev.1df898f

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 (494) hide show
  1. package/README.md +92 -29
  2. package/dist/cli-web-branch.d.ts +6 -0
  3. package/dist/cli-web-branch.js +17 -0
  4. package/dist/cli.js +18 -3
  5. package/dist/loader.js +3 -1
  6. package/dist/onboarding.js +2 -1
  7. package/dist/resource-loader.js +39 -6
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +52 -4
  9. package/dist/resources/extensions/async-jobs/await-tool.js +5 -0
  10. package/dist/resources/extensions/async-jobs/index.js +2 -0
  11. package/dist/resources/extensions/gsd/auto/loop.js +89 -1
  12. package/dist/resources/extensions/gsd/auto/phases.js +29 -13
  13. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  14. package/dist/resources/extensions/gsd/auto-dashboard.js +8 -2
  15. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -2
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -0
  17. package/dist/resources/extensions/gsd/auto-prompts.js +3 -16
  18. package/dist/resources/extensions/gsd/auto-recovery.js +12 -4
  19. package/dist/resources/extensions/gsd/auto-start.js +16 -14
  20. package/dist/resources/extensions/gsd/auto-worktree.js +147 -13
  21. package/dist/resources/extensions/gsd/auto.js +64 -2
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +199 -164
  23. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +62 -0
  24. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +25 -3
  26. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +7 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +40 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  29. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  30. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +146 -0
  31. package/dist/resources/extensions/gsd/context-injector.js +74 -0
  32. package/dist/resources/extensions/gsd/context-store.js +4 -3
  33. package/dist/resources/extensions/gsd/custom-execution-policy.js +47 -0
  34. package/dist/resources/extensions/gsd/custom-verification.js +145 -0
  35. package/dist/resources/extensions/gsd/custom-workflow-engine.js +164 -0
  36. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -0
  37. package/dist/resources/extensions/gsd/db-writer.js +5 -2
  38. package/dist/resources/extensions/gsd/definition-loader.js +352 -0
  39. package/dist/resources/extensions/gsd/detection.js +20 -1
  40. package/dist/resources/extensions/gsd/dev-execution-policy.js +24 -0
  41. package/dist/resources/extensions/gsd/dev-workflow-engine.js +82 -0
  42. package/dist/resources/extensions/gsd/doctor-checks.js +31 -1
  43. package/dist/resources/extensions/gsd/doctor-providers.js +10 -0
  44. package/dist/resources/extensions/gsd/doctor.js +11 -1
  45. package/dist/resources/extensions/gsd/engine-resolver.js +40 -0
  46. package/dist/resources/extensions/gsd/engine-types.js +8 -0
  47. package/dist/resources/extensions/gsd/execution-policy.js +8 -0
  48. package/dist/resources/extensions/gsd/exit-command.js +12 -2
  49. package/dist/resources/extensions/gsd/export.js +9 -13
  50. package/dist/resources/extensions/gsd/extension-manifest.json +2 -2
  51. package/dist/resources/extensions/gsd/files.js +28 -11
  52. package/dist/resources/extensions/gsd/forensics.js +94 -3
  53. package/dist/resources/extensions/gsd/git-constants.js +1 -0
  54. package/dist/resources/extensions/gsd/git-service.js +6 -2
  55. package/dist/resources/extensions/gsd/graph.js +225 -0
  56. package/dist/resources/extensions/gsd/gsd-db.js +25 -8
  57. package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
  58. package/dist/resources/extensions/gsd/guided-flow.js +7 -3
  59. package/dist/resources/extensions/gsd/journal.js +85 -0
  60. package/dist/resources/extensions/gsd/md-importer.js +5 -0
  61. package/dist/resources/extensions/gsd/milestone-ids.js +1 -1
  62. package/dist/resources/extensions/gsd/native-git-bridge.js +3 -2
  63. package/dist/resources/extensions/gsd/post-unit-hooks.js +24 -412
  64. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  65. package/dist/resources/extensions/gsd/preferences.js +60 -8
  66. package/dist/resources/extensions/gsd/prompt-loader.js +34 -4
  67. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
  68. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
  69. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/forensics.md +12 -5
  71. package/dist/resources/extensions/gsd/prompts/queue.md +1 -1
  72. package/dist/resources/extensions/gsd/repo-identity.js +92 -7
  73. package/dist/resources/extensions/gsd/rule-registry.js +489 -0
  74. package/dist/resources/extensions/gsd/rule-types.js +6 -0
  75. package/dist/resources/extensions/gsd/run-manager.js +134 -0
  76. package/dist/resources/extensions/gsd/service-tier.js +147 -0
  77. package/dist/resources/extensions/gsd/session-lock.js +2 -2
  78. package/dist/resources/extensions/gsd/structured-data-formatter.js +2 -1
  79. package/dist/resources/extensions/gsd/templates/decisions.md +2 -2
  80. package/dist/resources/extensions/gsd/workflow-engine.js +7 -0
  81. package/dist/resources/extensions/gsd/workflow-templates.js +13 -1
  82. package/dist/resources/extensions/gsd/worktree-manager.js +20 -6
  83. package/dist/resources/extensions/gsd/worktree-resolver.js +21 -4
  84. package/dist/resources/extensions/gsd/worktree.js +2 -2
  85. package/dist/resources/extensions/mcp-client/index.js +2 -1
  86. package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
  87. package/dist/resources/extensions/subagent/index.js +7 -3
  88. package/dist/resources/extensions/voice/index.js +4 -4
  89. package/dist/resources/skills/create-workflow/SKILL.md +103 -0
  90. package/dist/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  91. package/dist/resources/skills/create-workflow/references/verification-policies.md +76 -0
  92. package/dist/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  93. package/dist/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  94. package/dist/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  95. package/dist/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  96. package/dist/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  97. package/dist/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  98. package/dist/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  99. package/dist/web/standalone/.next/BUILD_ID +1 -1
  100. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  101. package/dist/web/standalone/.next/build-manifest.json +4 -4
  102. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  103. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  104. package/dist/web/standalone/.next/required-server-files.json +3 -3
  105. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  106. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  108. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  116. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  170. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  176. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  192. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/index.html +1 -1
  204. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  205. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  206. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  207. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  209. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/page.js +2 -2
  211. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  213. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  214. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  215. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware.js +2 -2
  218. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  220. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  221. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  222. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  223. package/dist/web/standalone/.next/static/chunks/4024.c195dc1fdd2adbea.js +9 -0
  224. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  228. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/{webpack-9afaaebf6042a1d7.js → webpack-fa307370fcf9fb2c.js} +1 -1
  230. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  231. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  232. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  233. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  234. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  235. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  236. package/dist/web/standalone/server.js +1 -1
  237. package/dist/web-mode.d.ts +4 -0
  238. package/dist/web-mode.js +69 -11
  239. package/package.json +1 -1
  240. package/packages/native/src/__tests__/text.test.mjs +33 -0
  241. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  242. package/packages/pi-agent-core/dist/agent.js +2 -0
  243. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  244. package/packages/pi-agent-core/dist/types.d.ts +6 -0
  245. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  246. package/packages/pi-agent-core/dist/types.js.map +1 -1
  247. package/packages/pi-agent-core/src/agent.test.ts +53 -0
  248. package/packages/pi-agent-core/src/agent.ts +3 -0
  249. package/packages/pi-agent-core/src/types.ts +6 -0
  250. package/packages/pi-agent-core/tsconfig.json +1 -1
  251. package/packages/pi-ai/dist/models.d.ts +5 -3
  252. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  253. package/packages/pi-ai/dist/models.generated.d.ts +801 -1468
  254. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  255. package/packages/pi-ai/dist/models.generated.js +1135 -1588
  256. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  257. package/packages/pi-ai/dist/models.js.map +1 -1
  258. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  259. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +60 -2
  260. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  261. package/packages/pi-ai/scripts/generate-models.ts +1543 -0
  262. package/packages/pi-ai/src/models.generated.ts +1140 -1593
  263. package/packages/pi-ai/src/models.ts +7 -4
  264. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +74 -2
  265. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -1
  267. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
  269. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.js +29 -2
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +60 -0
  273. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +3 -1
  275. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
  278. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/lsp/client.js +23 -0
  281. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -0
  284. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +6 -0
  286. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/package-manager.js +63 -11
  288. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +9 -0
  290. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/resource-loader.js +20 -6
  292. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/system-prompt.js +6 -5
  295. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +3 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +9 -6
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +10 -7
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +34 -10
  307. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  308. package/packages/pi-coding-agent/package.json +1 -1
  309. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -1
  310. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +68 -0
  311. package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -2
  312. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +4 -2
  313. package/packages/pi-coding-agent/src/core/extensions/loader.ts +18 -0
  314. package/packages/pi-coding-agent/src/core/lsp/client.ts +29 -0
  315. package/packages/pi-coding-agent/src/core/model-registry.ts +3 -0
  316. package/packages/pi-coding-agent/src/core/package-manager.ts +99 -58
  317. package/packages/pi-coding-agent/src/core/resource-loader.ts +24 -6
  318. package/packages/pi-coding-agent/src/core/system-prompt.ts +6 -5
  319. package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +3 -0
  320. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +10 -6
  321. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +11 -7
  322. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +36 -11
  323. package/pkg/package.json +1 -1
  324. package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
  325. package/src/resources/extensions/async-jobs/async-bash-tool.ts +40 -4
  326. package/src/resources/extensions/async-jobs/await-tool.test.ts +47 -0
  327. package/src/resources/extensions/async-jobs/await-tool.ts +5 -0
  328. package/src/resources/extensions/async-jobs/index.ts +1 -0
  329. package/src/resources/extensions/async-jobs/job-manager.ts +2 -0
  330. package/src/resources/extensions/gsd/auto/loop-deps.ts +5 -2
  331. package/src/resources/extensions/gsd/auto/loop.ts +101 -1
  332. package/src/resources/extensions/gsd/auto/phases.ts +31 -13
  333. package/src/resources/extensions/gsd/auto/session.ts +6 -0
  334. package/src/resources/extensions/gsd/auto/types.ts +4 -0
  335. package/src/resources/extensions/gsd/auto-dashboard.ts +9 -2
  336. package/src/resources/extensions/gsd/auto-dispatch.ts +25 -5
  337. package/src/resources/extensions/gsd/auto-post-unit.ts +8 -0
  338. package/src/resources/extensions/gsd/auto-prompts.ts +2 -18
  339. package/src/resources/extensions/gsd/auto-recovery.ts +12 -4
  340. package/src/resources/extensions/gsd/auto-start.ts +15 -13
  341. package/src/resources/extensions/gsd/auto-worktree.ts +162 -18
  342. package/src/resources/extensions/gsd/auto.ts +71 -2
  343. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +209 -162
  344. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +62 -0
  345. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  346. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -4
  347. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +9 -2
  348. package/src/resources/extensions/gsd/commands/catalog.ts +40 -1
  349. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  350. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  351. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +164 -0
  352. package/src/resources/extensions/gsd/context-injector.ts +100 -0
  353. package/src/resources/extensions/gsd/context-store.ts +4 -3
  354. package/src/resources/extensions/gsd/custom-execution-policy.ts +73 -0
  355. package/src/resources/extensions/gsd/custom-verification.ts +180 -0
  356. package/src/resources/extensions/gsd/custom-workflow-engine.ts +216 -0
  357. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -0
  358. package/src/resources/extensions/gsd/db-writer.ts +6 -2
  359. package/src/resources/extensions/gsd/definition-loader.ts +462 -0
  360. package/src/resources/extensions/gsd/detection.ts +20 -1
  361. package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
  362. package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
  363. package/src/resources/extensions/gsd/doctor-checks.ts +32 -1
  364. package/src/resources/extensions/gsd/doctor-providers.ts +13 -0
  365. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  366. package/src/resources/extensions/gsd/doctor.ts +12 -1
  367. package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
  368. package/src/resources/extensions/gsd/engine-types.ts +71 -0
  369. package/src/resources/extensions/gsd/execution-policy.ts +43 -0
  370. package/src/resources/extensions/gsd/exit-command.ts +14 -2
  371. package/src/resources/extensions/gsd/export.ts +8 -15
  372. package/src/resources/extensions/gsd/extension-manifest.json +2 -2
  373. package/src/resources/extensions/gsd/files.ts +29 -12
  374. package/src/resources/extensions/gsd/forensics.ts +101 -3
  375. package/src/resources/extensions/gsd/git-constants.ts +1 -0
  376. package/src/resources/extensions/gsd/git-service.ts +5 -5
  377. package/src/resources/extensions/gsd/gitignore.ts +1 -1
  378. package/src/resources/extensions/gsd/graph.ts +312 -0
  379. package/src/resources/extensions/gsd/gsd-db.ts +37 -8
  380. package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
  381. package/src/resources/extensions/gsd/guided-flow.ts +7 -3
  382. package/src/resources/extensions/gsd/journal.ts +134 -0
  383. package/src/resources/extensions/gsd/md-importer.ts +6 -0
  384. package/src/resources/extensions/gsd/milestone-ids.ts +1 -1
  385. package/src/resources/extensions/gsd/native-git-bridge.ts +3 -2
  386. package/src/resources/extensions/gsd/post-unit-hooks.ts +24 -462
  387. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  388. package/src/resources/extensions/gsd/preferences.ts +63 -6
  389. package/src/resources/extensions/gsd/prompt-loader.ts +35 -4
  390. package/src/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
  391. package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
  392. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  393. package/src/resources/extensions/gsd/prompts/forensics.md +12 -5
  394. package/src/resources/extensions/gsd/prompts/queue.md +1 -1
  395. package/src/resources/extensions/gsd/repo-identity.ts +95 -7
  396. package/src/resources/extensions/gsd/rule-registry.ts +599 -0
  397. package/src/resources/extensions/gsd/rule-types.ts +68 -0
  398. package/src/resources/extensions/gsd/run-manager.ts +180 -0
  399. package/src/resources/extensions/gsd/service-tier.ts +184 -0
  400. package/src/resources/extensions/gsd/session-lock.ts +2 -2
  401. package/src/resources/extensions/gsd/structured-data-formatter.ts +3 -1
  402. package/src/resources/extensions/gsd/templates/decisions.md +2 -2
  403. package/src/resources/extensions/gsd/tests/activity-log.test.ts +31 -69
  404. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -120
  405. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +85 -0
  406. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
  407. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +202 -0
  408. package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
  409. package/src/resources/extensions/gsd/tests/captures.test.ts +12 -1
  410. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +283 -0
  411. package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
  412. package/src/resources/extensions/gsd/tests/context-store.test.ts +10 -5
  413. package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
  414. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +540 -0
  415. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +382 -0
  416. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +339 -0
  417. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +87 -0
  418. package/src/resources/extensions/gsd/tests/db-writer.test.ts +10 -0
  419. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +778 -0
  420. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +318 -0
  421. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +15 -10
  422. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +5 -4
  423. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +167 -0
  424. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +174 -0
  425. package/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +476 -0
  426. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
  427. package/src/resources/extensions/gsd/tests/exit-command.test.ts +55 -0
  428. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +48 -0
  429. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
  430. package/src/resources/extensions/gsd/tests/git-locale.test.ts +133 -0
  431. package/src/resources/extensions/gsd/tests/git-service.test.ts +44 -0
  432. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
  433. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +8 -1
  434. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +7 -7
  435. package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
  436. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +513 -0
  437. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +147 -0
  438. package/src/resources/extensions/gsd/tests/journal.test.ts +341 -0
  439. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +73 -82
  440. package/src/resources/extensions/gsd/tests/md-importer.test.ts +31 -1
  441. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  442. package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +1 -1
  443. package/src/resources/extensions/gsd/tests/parsers.test.ts +110 -0
  444. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -25
  445. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +3 -1
  446. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +61 -1
  447. package/src/resources/extensions/gsd/tests/routing-history.test.ts +11 -22
  448. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +413 -0
  449. package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
  450. package/src/resources/extensions/gsd/tests/service-tier.test.ts +127 -0
  451. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +56 -3
  452. package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +2 -2
  453. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +102 -0
  454. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +4 -3
  455. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +151 -0
  456. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +45 -0
  457. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +117 -0
  458. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -1
  459. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +156 -263
  460. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +99 -0
  461. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -0
  462. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +4 -0
  463. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +135 -0
  464. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +203 -106
  465. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +79 -5
  466. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +140 -0
  467. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +74 -0
  468. package/src/resources/extensions/gsd/types.ts +3 -0
  469. package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
  470. package/src/resources/extensions/gsd/workflow-templates.ts +12 -1
  471. package/src/resources/extensions/gsd/worktree-manager.ts +21 -6
  472. package/src/resources/extensions/gsd/worktree-resolver.ts +32 -12
  473. package/src/resources/extensions/gsd/worktree.ts +2 -2
  474. package/src/resources/extensions/mcp-client/index.ts +5 -1
  475. package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
  476. package/src/resources/extensions/subagent/index.ts +7 -3
  477. package/src/resources/extensions/voice/index.ts +4 -4
  478. package/src/resources/skills/create-workflow/SKILL.md +103 -0
  479. package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  480. package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
  481. package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  482. package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  483. package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  484. package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  485. package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  486. package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  487. package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  488. package/dist/web/standalone/.next/static/chunks/4024.279c423e4661ece1.js +0 -9
  489. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  490. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  491. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  492. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  493. /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_buildManifest.js +0 -0
  494. /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_ssgManifest.js +0 -0
@@ -25,12 +25,13 @@ import {
25
25
  isDbAvailable,
26
26
  } from "./gsd-db.js";
27
27
  import { atomicWriteSync } from "./atomic-write.js";
28
- import { execSync, execFileSync } from "node:child_process";
28
+ import { execFileSync } from "node:child_process";
29
29
  import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
30
30
  import { gsdRoot } from "./paths.js";
31
31
  import {
32
32
  createWorktree,
33
33
  removeWorktree,
34
+ resolveGitDir,
34
35
  worktreePath,
35
36
  } from "./worktree-manager.js";
36
37
  import {
@@ -57,6 +58,8 @@ import {
57
58
  nativeBranchDelete,
58
59
  nativeBranchExists,
59
60
  nativeDiffNumstat,
61
+ nativeUpdateRef,
62
+ nativeIsAncestor,
60
63
  } from "./native-git-bridge.js";
61
64
 
62
65
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -182,7 +185,7 @@ export function syncGsdStateToWorktree(
182
185
  const mainMilestones = readdirSync(mainMilestonesDir, {
183
186
  withFileTypes: true,
184
187
  })
185
- .filter((d) => d.isDirectory() && /^M\d{3}/.test(d.name))
188
+ .filter((d) => d.isDirectory())
186
189
  .map((d) => d.name);
187
190
 
188
191
  for (const mid of mainMilestones) {
@@ -339,7 +342,7 @@ export function syncWorktreeStateBack(
339
342
 
340
343
  try {
341
344
  const wtMilestones = readdirSync(wtMilestonesDir, { withFileTypes: true })
342
- .filter((d) => d.isDirectory() && /^M\d{3}/.test(d.name))
345
+ .filter((d) => d.isDirectory())
343
346
  .map((d) => d.name);
344
347
 
345
348
  for (const mid of wtMilestones) {
@@ -468,14 +471,22 @@ export function runWorktreePostCreateHook(
468
471
  }
469
472
  if (!hookPath) return null;
470
473
 
471
- // Resolve relative paths against the source project root
472
- const resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
474
+ // Resolve relative paths against the source project root.
475
+ // On Windows, convert 8.3 short paths (e.g. RUNNER~1) to long paths
476
+ // so execFileSync can locate the file correctly.
477
+ let resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
473
478
  if (!existsSync(resolved)) {
474
479
  return `Worktree post-create hook not found: ${resolved}`;
475
480
  }
481
+ if (process.platform === "win32") {
482
+ try { resolved = realpathSync.native(resolved); } catch { /* keep original */ }
483
+ }
476
484
 
477
485
  try {
478
- execSync(resolved, {
486
+ // .bat/.cmd files on Windows require shell mode — execFileSync cannot
487
+ // spawn them directly (EINVAL).
488
+ const needsShell = process.platform === "win32" && /\.(bat|cmd)$/i.test(resolved);
489
+ execFileSync(resolved, [], {
479
490
  cwd: worktreeDir,
480
491
  env: {
481
492
  ...process.env,
@@ -485,6 +496,7 @@ export function runWorktreePostCreateHook(
485
496
  stdio: ["ignore", "pipe", "pipe"],
486
497
  encoding: "utf-8",
487
498
  timeout: 30_000, // 30 second timeout
499
+ shell: needsShell,
488
500
  });
489
501
  return null;
490
502
  } catch (err) {
@@ -761,6 +773,24 @@ export function teardownAutoWorktree(
761
773
  branch,
762
774
  deleteBranch: !preserveBranch,
763
775
  });
776
+
777
+ // Verify cleanup succeeded — warn if the worktree directory is still on disk.
778
+ // On Windows, bash-based cleanup can silently fail when paths contain
779
+ // backslashes (#1436), leaving ~1 GB+ orphaned directories.
780
+ const wtDir = worktreePath(originalBasePath, milestoneId);
781
+ if (existsSync(wtDir)) {
782
+ console.error(
783
+ `[GSD] WARNING: Worktree directory still exists after teardown: ${wtDir}\n` +
784
+ ` This is likely an orphaned directory consuming disk space.\n` +
785
+ ` Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`,
786
+ );
787
+ // Attempt a direct filesystem removal as a fallback
788
+ try {
789
+ rmSync(wtDir, { recursive: true, force: true });
790
+ } catch {
791
+ // Non-fatal — the warning above tells the user how to clean up
792
+ }
793
+ }
764
794
  }
765
795
 
766
796
  /**
@@ -940,7 +970,7 @@ export function mergeMilestoneToMain(
940
970
  originalBasePath_: string,
941
971
  milestoneId: string,
942
972
  roadmapContent: string,
943
- ): { commitMessage: string; pushed: boolean; prCreated: boolean } {
973
+ ): { commitMessage: string; pushed: boolean; prCreated: boolean; codeFilesChanged: boolean } {
944
974
  const worktreeCwd = process.cwd();
945
975
  const milestoneBranch = autoWorktreeBranch(milestoneId);
946
976
 
@@ -1002,6 +1032,62 @@ export function mergeMilestoneToMain(
1002
1032
  }
1003
1033
  const commitMessage = subject + body;
1004
1034
 
1035
+ // 6b. Reconcile worktree HEAD with milestone branch ref (#1846).
1036
+ // When the worktree HEAD detaches and advances past the named branch,
1037
+ // the branch ref becomes stale. Squash-merging the stale ref silently
1038
+ // orphans all commits between the branch ref and the actual worktree HEAD.
1039
+ // Fix: fast-forward the branch ref to the worktree HEAD before merging.
1040
+ // Only applies when merging from an actual worktree (worktreeCwd differs
1041
+ // from originalBasePath_).
1042
+ if (worktreeCwd !== originalBasePath_) {
1043
+ try {
1044
+ const worktreeHead = execFileSync("git", ["rev-parse", "HEAD"], {
1045
+ cwd: worktreeCwd,
1046
+ stdio: ["ignore", "pipe", "pipe"],
1047
+ encoding: "utf-8",
1048
+ }).trim();
1049
+ const branchHead = execFileSync("git", ["rev-parse", milestoneBranch], {
1050
+ cwd: originalBasePath_,
1051
+ stdio: ["ignore", "pipe", "pipe"],
1052
+ encoding: "utf-8",
1053
+ }).trim();
1054
+
1055
+ if (worktreeHead && branchHead && worktreeHead !== branchHead) {
1056
+ if (nativeIsAncestor(originalBasePath_, branchHead, worktreeHead)) {
1057
+ // Worktree HEAD is strictly ahead — fast-forward the branch ref
1058
+ nativeUpdateRef(
1059
+ originalBasePath_,
1060
+ `refs/heads/${milestoneBranch}`,
1061
+ worktreeHead,
1062
+ );
1063
+ debugLog("mergeMilestoneToMain", {
1064
+ action: "fast-forward-branch-ref",
1065
+ milestoneBranch,
1066
+ oldRef: branchHead.slice(0, 8),
1067
+ newRef: worktreeHead.slice(0, 8),
1068
+ });
1069
+ } else {
1070
+ // Diverged — fail loudly rather than silently losing commits
1071
+ process.chdir(previousCwd);
1072
+ throw new GSDError(
1073
+ GSD_GIT_ERROR,
1074
+ `Worktree HEAD (${worktreeHead.slice(0, 8)}) diverged from ` +
1075
+ `${milestoneBranch} (${branchHead.slice(0, 8)}). ` +
1076
+ `Manual reconciliation required before merge.`,
1077
+ );
1078
+ }
1079
+ }
1080
+ } catch (err) {
1081
+ // Re-throw GSDError (divergence); swallow rev-parse failures
1082
+ // (e.g. worktree dir already removed by external cleanup)
1083
+ if (err instanceof GSDError) throw err;
1084
+ debugLog("mergeMilestoneToMain", {
1085
+ action: "reconcile-skipped",
1086
+ reason: String(err),
1087
+ });
1088
+ }
1089
+ }
1090
+
1005
1091
  // 7. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1006
1092
  const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
1007
1093
 
@@ -1066,6 +1152,16 @@ export function mergeMilestoneToMain(
1066
1152
  const commitResult = nativeCommit(originalBasePath_, commitMessage);
1067
1153
  const nothingToCommit = commitResult === null;
1068
1154
 
1155
+ // 8a. Clean up SQUASH_MSG left by git merge --squash (#1853).
1156
+ // git only removes SQUASH_MSG when the commit reads it directly (plain
1157
+ // `git commit`). nativeCommit uses `-F -` (stdin) or libgit2, neither
1158
+ // of which trigger git's SQUASH_MSG cleanup. If left on disk, doctor
1159
+ // reports `corrupt_merge_state` on every subsequent run.
1160
+ try {
1161
+ const squashMsgPath = join(resolveGitDir(originalBasePath_), "SQUASH_MSG");
1162
+ if (existsSync(squashMsgPath)) unlinkSync(squashMsgPath);
1163
+ } catch { /* best-effort */ }
1164
+
1069
1165
  // 8b. Safety check (#1792): if nothing was committed, verify the milestone
1070
1166
  // work is already on the integration branch before allowing teardown.
1071
1167
  // Compare only non-.gsd/ paths — .gsd/ state files diverge normally and
@@ -1091,12 +1187,33 @@ export function mergeMilestoneToMain(
1091
1187
  }
1092
1188
  }
1093
1189
 
1190
+ // 8c. Detect whether any non-.gsd/ code files were actually merged (#1906).
1191
+ // When a milestone only produced .gsd/ metadata (summaries, roadmaps) but no
1192
+ // real code, the user sees "milestone complete" but nothing changed in their
1193
+ // codebase. Surface this so the caller can warn the user.
1194
+ let codeFilesChanged = false;
1195
+ if (!nothingToCommit) {
1196
+ try {
1197
+ const mergedFiles = nativeDiffNumstat(
1198
+ originalBasePath_,
1199
+ "HEAD~1",
1200
+ "HEAD",
1201
+ );
1202
+ codeFilesChanged = mergedFiles.some(
1203
+ (entry) => !entry.path.startsWith(".gsd/"),
1204
+ );
1205
+ } catch {
1206
+ // If HEAD~1 doesn't exist (first commit), assume code was changed
1207
+ codeFilesChanged = true;
1208
+ }
1209
+ }
1210
+
1094
1211
  // 9. Auto-push if enabled
1095
1212
  let pushed = false;
1096
1213
  if (prefs.auto_push === true && !nothingToCommit) {
1097
1214
  const remote = prefs.remote ?? "origin";
1098
1215
  try {
1099
- execSync(`git push ${remote} ${mainBranch}`, {
1216
+ execFileSync("git", ["push", remote, mainBranch], {
1100
1217
  cwd: originalBasePath_,
1101
1218
  stdio: ["ignore", "pipe", "pipe"],
1102
1219
  encoding: "utf-8",
@@ -1114,20 +1231,23 @@ export function mergeMilestoneToMain(
1114
1231
  const prTarget = prefs.pr_target_branch ?? mainBranch;
1115
1232
  try {
1116
1233
  // Push the milestone branch to remote first
1117
- execSync(`git push ${remote} ${milestoneBranch}`, {
1234
+ execFileSync("git", ["push", remote, milestoneBranch], {
1118
1235
  cwd: originalBasePath_,
1119
1236
  stdio: ["ignore", "pipe", "pipe"],
1120
1237
  encoding: "utf-8",
1121
1238
  });
1122
1239
  // Create PR via gh CLI
1123
- execSync(
1124
- `gh pr create --base "${prTarget}" --head "${milestoneBranch}" --title "Milestone ${milestoneId} complete" --body "Auto-created by GSD on milestone completion."`,
1125
- {
1126
- cwd: originalBasePath_,
1127
- stdio: ["ignore", "pipe", "pipe"],
1128
- encoding: "utf-8",
1129
- },
1130
- );
1240
+ execFileSync("gh", [
1241
+ "pr", "create",
1242
+ "--base", prTarget,
1243
+ "--head", milestoneBranch,
1244
+ "--title", `Milestone ${milestoneId} complete`,
1245
+ "--body", "Auto-created by GSD on milestone completion.",
1246
+ ], {
1247
+ cwd: originalBasePath_,
1248
+ stdio: ["ignore", "pipe", "pipe"],
1249
+ encoding: "utf-8",
1250
+ });
1131
1251
  prCreated = true;
1132
1252
  } catch {
1133
1253
  // PR creation failure is non-fatal — gh may not be installed or authenticated
@@ -1138,6 +1258,30 @@ export function mergeMilestoneToMain(
1138
1258
  // throws only when the milestone has unanchored code changes, passes
1139
1259
  // through when the code is genuinely already on the integration branch.
1140
1260
 
1261
+ // 10a. Pre-teardown safety net (#1853): if the worktree still has uncommitted
1262
+ // changes (e.g. nativeHasChanges cache returned stale false, or auto-commit
1263
+ // silently failed), force one final commit so code is not destroyed by
1264
+ // `git worktree remove --force`.
1265
+ if (existsSync(worktreeCwd)) {
1266
+ try {
1267
+ const dirtyCheck = nativeWorkingTreeStatus(worktreeCwd);
1268
+ if (dirtyCheck) {
1269
+ debugLog("mergeMilestoneToMain", {
1270
+ phase: "pre-teardown-dirty",
1271
+ worktreeCwd,
1272
+ status: dirtyCheck.slice(0, 200),
1273
+ });
1274
+ nativeAddAllWithExclusions(worktreeCwd, RUNTIME_EXCLUSION_PATHS);
1275
+ nativeCommit(worktreeCwd, "chore: pre-teardown auto-commit of uncommitted worktree changes");
1276
+ }
1277
+ } catch (e) {
1278
+ debugLog("mergeMilestoneToMain", {
1279
+ phase: "pre-teardown-commit-error",
1280
+ error: String(e),
1281
+ });
1282
+ }
1283
+ }
1284
+
1141
1285
  // 11. Remove worktree directory first (must happen before branch deletion)
1142
1286
  try {
1143
1287
  removeWorktree(originalBasePath_, milestoneId, {
@@ -1159,5 +1303,5 @@ export function mergeMilestoneToMain(
1159
1303
  originalBase = null;
1160
1304
  nudgeGitBranchCache(previousCwd);
1161
1305
 
1162
- return { commitMessage, pushed, prCreated };
1306
+ return { commitMessage, pushed, prCreated, codeFilesChanged };
1163
1307
  }
@@ -167,7 +167,9 @@ import {
167
167
  buildLoopRemediationSteps,
168
168
  reconcileMergeState,
169
169
  } from "./auto-recovery.js";
170
- import { resolveDispatch } from "./auto-dispatch.js";
170
+ import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
171
+ import { initRegistry, convertDispatchRules } from "./rule-registry.js";
172
+ import { emitJournalEvent as _emitJournalEvent, type JournalEntry } from "./journal.js";
171
173
  import {
172
174
  type AutoDashboardData,
173
175
  updateProgressWidget as _updateProgressWidget,
@@ -356,6 +358,22 @@ export function isAutoPaused(): boolean {
356
358
  return s.paused;
357
359
  }
358
360
 
361
+ export function setActiveEngineId(id: string | null): void {
362
+ s.activeEngineId = id;
363
+ }
364
+
365
+ export function getActiveEngineId(): string | null {
366
+ return s.activeEngineId;
367
+ }
368
+
369
+ export function setActiveRunDir(runDir: string | null): void {
370
+ s.activeRunDir = runDir;
371
+ }
372
+
373
+ export function getActiveRunDir(): string | null {
374
+ return s.activeRunDir;
375
+ }
376
+
359
377
  /**
360
378
  * Return the model captured at auto-mode start for this session.
361
379
  * Used by error-recovery to fall back to the session's own model
@@ -535,6 +553,33 @@ function handleLostSessionLock(
535
553
  ctx?.ui.setFooter(undefined);
536
554
  }
537
555
 
556
+ /**
557
+ * Lightweight cleanup after autoLoop exits via step-wizard break.
558
+ *
559
+ * Unlike stopAuto (which tears down the entire session), this only clears
560
+ * the stale unit state, progress widget, status badge, and restores CWD so
561
+ * the dashboard does not show an orphaned timer and the shell is usable.
562
+ */
563
+ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
564
+ s.currentUnit = null;
565
+ s.active = false;
566
+ clearUnitTimeout();
567
+
568
+ ctx.ui.setStatus("gsd-auto", undefined);
569
+ ctx.ui.setWidget("gsd-progress", undefined);
570
+ ctx.ui.setFooter(undefined);
571
+
572
+ // Restore CWD out of worktree back to original project root
573
+ if (s.originalBasePath) {
574
+ s.basePath = s.originalBasePath;
575
+ try {
576
+ process.chdir(s.basePath);
577
+ } catch {
578
+ /* best-effort */
579
+ }
580
+ }
581
+ }
582
+
538
583
  export async function stopAuto(
539
584
  ctx?: ExtensionContext,
540
585
  pi?: ExtensionAPI,
@@ -753,6 +798,8 @@ export async function pauseAuto(
753
798
  stepMode: s.stepMode,
754
799
  pausedAt: new Date().toISOString(),
755
800
  sessionFile: s.pausedSessionFile,
801
+ activeEngineId: s.activeEngineId,
802
+ activeRunDir: s.activeRunDir,
756
803
  };
757
804
  const runtimeDir = join(gsdRoot(s.originalBasePath || s.basePath), "runtime");
758
805
  mkdirSync(runtimeDir, { recursive: true });
@@ -849,6 +896,11 @@ function buildResolver(): WorktreeResolver {
849
896
  * This bundles all private functions that autoLoop needs without exporting them.
850
897
  */
851
898
  function buildLoopDeps(): LoopDeps {
899
+ // Initialize the unified rule registry with converted dispatch rules.
900
+ // Must happen before LoopDeps is assembled so facade functions
901
+ // (resolveDispatch, runPreDispatchHooks, etc.) delegate to the registry.
902
+ initRegistry(convertDispatchRules(DISPATCH_RULES));
903
+
852
904
  return {
853
905
  lockBase,
854
906
  buildSnapshotOpts,
@@ -959,6 +1011,9 @@ function buildLoopDeps(): LoopDeps {
959
1011
  return "";
960
1012
  }
961
1013
  },
1014
+
1015
+ // Journal
1016
+ emitJournalEvent: (entry: JournalEntry) => _emitJournalEvent(s.basePath, entry),
962
1017
  } as unknown as LoopDeps;
963
1018
  }
964
1019
 
@@ -981,7 +1036,19 @@ export async function startAuto(
981
1036
  const pausedPath = join(gsdRoot(base), "runtime", "paused-session.json");
982
1037
  if (existsSync(pausedPath)) {
983
1038
  const meta = JSON.parse(readFileSync(pausedPath, "utf-8"));
984
- if (meta.milestoneId) {
1039
+ if (meta.activeEngineId && meta.activeEngineId !== "dev") {
1040
+ // Custom workflow resume — restore engine state
1041
+ s.activeEngineId = meta.activeEngineId;
1042
+ s.activeRunDir = meta.activeRunDir ?? null;
1043
+ s.originalBasePath = meta.originalBasePath || base;
1044
+ s.stepMode = meta.stepMode ?? requestedStepMode;
1045
+ s.paused = true;
1046
+ try { unlinkSync(pausedPath); } catch { /* non-fatal */ }
1047
+ ctx.ui.notify(
1048
+ `Resuming paused custom workflow${meta.activeRunDir ? ` (${meta.activeRunDir})` : ""}.`,
1049
+ "info",
1050
+ );
1051
+ } else if (meta.milestoneId) {
985
1052
  // Validate the milestone still exists and isn't already complete (#1664).
986
1053
  const mDir = resolveMilestonePath(base, meta.milestoneId);
987
1054
  const summaryFile = resolveMilestoneFile(base, meta.milestoneId, "SUMMARY");
@@ -1121,6 +1188,7 @@ export async function startAuto(
1121
1188
  await selfHealRuntimeRecords(s.basePath, ctx);
1122
1189
 
1123
1190
  await autoLoop(ctx, pi, s, buildLoopDeps());
1191
+ cleanupAfterLoopExit(ctx);
1124
1192
  return;
1125
1193
  }
1126
1194
 
@@ -1155,6 +1223,7 @@ export async function startAuto(
1155
1223
 
1156
1224
  // Dispatch the first unit
1157
1225
  await autoLoop(ctx, pi, s, buildLoopDeps());
1226
+ cleanupAfterLoopExit(ctx);
1158
1227
  }
1159
1228
 
1160
1229
  // ─── Agent End Handler ────────────────────────────────────────────────────────