gsd-pi 2.65.0 → 2.66.0-dev.6c91c1f

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 (458) hide show
  1. package/dist/mcp-server.js +6 -2
  2. package/dist/resources/extensions/browser-tools/capture.js +20 -1
  3. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  4. package/dist/resources/extensions/gsd/auto/finalize-timeout.js +2 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +2 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +48 -5
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +13 -2
  8. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  9. package/dist/resources/extensions/gsd/auto/types.js +2 -0
  10. package/dist/resources/extensions/gsd/auto-dashboard.js +2 -1
  11. package/dist/resources/extensions/gsd/auto-dispatch.js +99 -9
  12. package/dist/resources/extensions/gsd/auto-model-selection.js +7 -5
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +17 -6
  14. package/dist/resources/extensions/gsd/auto-prompts.js +24 -0
  15. package/dist/resources/extensions/gsd/auto-recovery.js +40 -22
  16. package/dist/resources/extensions/gsd/auto-start.js +175 -12
  17. package/dist/resources/extensions/gsd/auto-tool-tracking.js +10 -0
  18. package/dist/resources/extensions/gsd/auto-worktree.js +29 -7
  19. package/dist/resources/extensions/gsd/auto.js +21 -15
  20. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -4
  21. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  22. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +6 -4
  23. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -1
  24. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -3
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -1
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +31 -1
  27. package/dist/resources/extensions/gsd/commands/context.js +8 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -2
  29. package/dist/resources/extensions/gsd/commands-extensions.js +1 -1
  30. package/dist/resources/extensions/gsd/config-overlay.js +312 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +13 -3
  32. package/dist/resources/extensions/gsd/detection.js +1 -1
  33. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  34. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  35. package/dist/resources/extensions/gsd/doctor.js +2 -1
  36. package/dist/resources/extensions/gsd/files.js +17 -0
  37. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  38. package/dist/resources/extensions/gsd/gsd-db.js +47 -4
  39. package/dist/resources/extensions/gsd/guided-flow.js +220 -29
  40. package/dist/resources/extensions/gsd/index.js +1 -1
  41. package/dist/resources/extensions/gsd/json-persistence.js +5 -2
  42. package/dist/resources/extensions/gsd/md-importer.js +14 -7
  43. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  44. package/dist/resources/extensions/gsd/notification-widget.js +2 -1
  45. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  46. package/dist/resources/extensions/gsd/parallel-orchestrator.js +17 -11
  47. package/dist/resources/extensions/gsd/pre-execution-checks.js +26 -5
  48. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  49. package/dist/resources/extensions/gsd/preferences-validation.js +45 -1
  50. package/dist/resources/extensions/gsd/preferences.js +9 -2
  51. package/dist/resources/extensions/gsd/preparation.js +1092 -0
  52. package/dist/resources/extensions/gsd/prompt-validation.js +67 -0
  53. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
  57. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  58. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  59. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  60. package/dist/resources/extensions/gsd/prompts/queue.md +2 -0
  61. package/dist/resources/extensions/gsd/prompts/rethink.md +2 -1
  62. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  63. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  64. package/dist/resources/extensions/gsd/quick.js +19 -15
  65. package/dist/resources/extensions/gsd/reactive-graph.js +12 -0
  66. package/dist/resources/extensions/gsd/roadmap-slices.js +24 -5
  67. package/dist/resources/extensions/gsd/safety/content-validator.js +3 -3
  68. package/dist/resources/extensions/gsd/session-lock.js +23 -1
  69. package/dist/resources/extensions/gsd/state.js +115 -28
  70. package/dist/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  71. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -3
  72. package/dist/resources/extensions/gsd/tools/complete-slice.js +27 -6
  73. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -7
  74. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -5
  75. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +5 -2
  76. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +119 -0
  77. package/dist/resources/extensions/gsd/tools/reopen-slice.js +30 -0
  78. package/dist/resources/extensions/gsd/tools/reopen-task.js +18 -0
  79. package/dist/resources/extensions/gsd/triage-resolution.js +33 -16
  80. package/dist/resources/extensions/gsd/undo.js +3 -2
  81. package/dist/resources/extensions/gsd/workflow-events.js +1 -0
  82. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  83. package/dist/resources/extensions/gsd/workflow-projections.js +7 -9
  84. package/dist/resources/extensions/gsd/workflow-reconcile.js +100 -9
  85. package/dist/resources/extensions/gsd/workflow-templates.js +11 -2
  86. package/dist/resources/extensions/gsd/worktree-manager.js +5 -2
  87. package/dist/resources/extensions/gsd/worktree.js +9 -0
  88. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  89. package/dist/resources/extensions/subagent/agents.js +19 -5
  90. package/dist/web/standalone/.next/BUILD_ID +1 -1
  91. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  92. package/dist/web/standalone/.next/build-manifest.json +4 -4
  93. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  94. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  95. package/dist/web/standalone/.next/required-server-files.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  97. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  99. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  107. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  135. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  155. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  187. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  189. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  191. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/page.js +2 -2
  208. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  210. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  211. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  212. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/middleware.js +2 -2
  215. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  217. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  218. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  219. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  220. package/dist/web/standalone/.next/static/chunks/6502.8874bcae249c02e1.js +9 -0
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-9fed74684e1c5bb1.js} +1 -1
  227. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  228. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  229. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  230. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  231. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  232. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  233. package/dist/web/standalone/server.js +1 -1
  234. package/package.json +1 -1
  235. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/retry-handler.js +30 -19
  237. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +51 -0
  239. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/sdk.js +9 -9
  241. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +10 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +20 -5
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +15 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +18 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/pi-coding-agent/package.json +1 -1
  258. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +80 -0
  259. package/packages/pi-coding-agent/src/core/retry-handler.ts +37 -25
  260. package/packages/pi-coding-agent/src/core/sdk.ts +9 -9
  261. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +10 -0
  262. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +20 -4
  263. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +27 -0
  264. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +16 -1
  265. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +5 -0
  266. package/packages/pi-tui/dist/components/image.d.ts +2 -0
  267. package/packages/pi-tui/dist/components/image.d.ts.map +1 -1
  268. package/packages/pi-tui/dist/components/image.js +4 -0
  269. package/packages/pi-tui/dist/components/image.js.map +1 -1
  270. package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
  271. package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
  272. package/packages/pi-tui/dist/components/image.test.js +32 -0
  273. package/packages/pi-tui/dist/components/image.test.js.map +1 -0
  274. package/packages/pi-tui/src/components/image.test.ts +36 -0
  275. package/packages/pi-tui/src/components/image.ts +5 -0
  276. package/pkg/package.json +1 -1
  277. package/src/resources/extensions/browser-tools/capture.ts +19 -1
  278. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  279. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +3 -0
  280. package/src/resources/extensions/gsd/auto/loop.ts +2 -2
  281. package/src/resources/extensions/gsd/auto/phases.ts +68 -3
  282. package/src/resources/extensions/gsd/auto/run-unit.ts +12 -2
  283. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  284. package/src/resources/extensions/gsd/auto/types.ts +5 -0
  285. package/src/resources/extensions/gsd/auto-dashboard.ts +2 -1
  286. package/src/resources/extensions/gsd/auto-dispatch.ts +110 -9
  287. package/src/resources/extensions/gsd/auto-model-selection.ts +7 -5
  288. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -6
  289. package/src/resources/extensions/gsd/auto-prompts.ts +31 -0
  290. package/src/resources/extensions/gsd/auto-recovery.ts +29 -23
  291. package/src/resources/extensions/gsd/auto-start.ts +188 -10
  292. package/src/resources/extensions/gsd/auto-tool-tracking.ts +10 -0
  293. package/src/resources/extensions/gsd/auto-worktree.ts +28 -7
  294. package/src/resources/extensions/gsd/auto.ts +19 -8
  295. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -4
  296. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -0
  297. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -4
  298. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -1
  299. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -3
  300. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -1
  301. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +36 -1
  302. package/src/resources/extensions/gsd/commands/context.ts +7 -1
  303. package/src/resources/extensions/gsd/commands/handlers/core.ts +26 -2
  304. package/src/resources/extensions/gsd/commands-extensions.ts +1 -1
  305. package/src/resources/extensions/gsd/config-overlay.ts +331 -0
  306. package/src/resources/extensions/gsd/db-writer.ts +11 -3
  307. package/src/resources/extensions/gsd/detection.ts +1 -1
  308. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  309. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  310. package/src/resources/extensions/gsd/doctor.ts +2 -1
  311. package/src/resources/extensions/gsd/files.ts +19 -0
  312. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  313. package/src/resources/extensions/gsd/gsd-db.ts +46 -4
  314. package/src/resources/extensions/gsd/guided-flow.ts +254 -30
  315. package/src/resources/extensions/gsd/index.ts +1 -0
  316. package/src/resources/extensions/gsd/json-persistence.ts +6 -3
  317. package/src/resources/extensions/gsd/md-importer.ts +13 -6
  318. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  319. package/src/resources/extensions/gsd/notification-widget.ts +2 -1
  320. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  321. package/src/resources/extensions/gsd/parallel-orchestrator.ts +19 -11
  322. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -7
  323. package/src/resources/extensions/gsd/preferences-types.ts +25 -0
  324. package/src/resources/extensions/gsd/preferences-validation.ts +45 -1
  325. package/src/resources/extensions/gsd/preferences.ts +9 -2
  326. package/src/resources/extensions/gsd/preparation.ts +1419 -0
  327. package/src/resources/extensions/gsd/prompt-validation.ts +88 -0
  328. package/src/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  329. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  330. package/src/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  331. package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
  332. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  333. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  334. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  335. package/src/resources/extensions/gsd/prompts/queue.md +2 -0
  336. package/src/resources/extensions/gsd/prompts/rethink.md +2 -1
  337. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  338. package/src/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  339. package/src/resources/extensions/gsd/quick.ts +20 -15
  340. package/src/resources/extensions/gsd/reactive-graph.ts +18 -0
  341. package/src/resources/extensions/gsd/roadmap-slices.ts +21 -5
  342. package/src/resources/extensions/gsd/safety/content-validator.ts +3 -3
  343. package/src/resources/extensions/gsd/session-lock.ts +17 -1
  344. package/src/resources/extensions/gsd/state.ts +115 -26
  345. package/src/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  346. package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +223 -0
  347. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +33 -2
  348. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +56 -0
  349. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +41 -0
  350. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +72 -0
  351. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +54 -0
  352. package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
  353. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  354. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +36 -0
  355. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +46 -0
  356. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +33 -0
  357. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +37 -0
  358. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +37 -0
  359. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +125 -0
  360. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +48 -0
  361. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +69 -0
  362. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +42 -0
  363. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +38 -0
  364. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +103 -0
  365. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +42 -0
  366. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +11 -9
  367. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  368. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +28 -30
  369. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  370. package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +525 -0
  371. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +62 -0
  372. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +11 -10
  373. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +48 -0
  374. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +46 -0
  375. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +189 -0
  376. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +77 -0
  377. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +55 -0
  378. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +39 -0
  379. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +68 -0
  380. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +284 -20
  381. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +2 -2
  382. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +2 -2
  383. package/src/resources/extensions/gsd/tests/preparation.test.ts +1211 -0
  384. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +53 -0
  385. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +83 -0
  386. package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +669 -0
  387. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -4
  388. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +85 -0
  389. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -1
  390. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +47 -0
  391. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +107 -0
  392. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +45 -0
  393. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +63 -0
  394. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +4 -5
  395. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +51 -0
  396. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +56 -0
  397. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +31 -0
  398. package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +39 -0
  399. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +51 -0
  400. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
  401. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +36 -0
  402. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
  403. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +13 -0
  404. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +21 -0
  405. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +21 -0
  406. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +6 -7
  407. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +47 -0
  408. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +1 -0
  409. package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +47 -0
  410. package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
  411. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +65 -0
  412. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +29 -1
  413. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +2 -1
  414. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +3 -4
  415. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +15 -0
  416. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +89 -0
  417. package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
  418. package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
  419. package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
  420. package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
  421. package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
  422. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +48 -0
  423. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +6 -3
  424. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +38 -0
  425. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +16 -0
  426. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -0
  427. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +16 -17
  428. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +13 -9
  429. package/src/resources/extensions/gsd/tests/worktree.test.ts +26 -9
  430. package/src/resources/extensions/gsd/tests/write-gate.test.ts +127 -2
  431. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -0
  432. package/src/resources/extensions/gsd/tools/complete-milestone.ts +13 -3
  433. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -6
  434. package/src/resources/extensions/gsd/tools/complete-task.ts +29 -7
  435. package/src/resources/extensions/gsd/tools/plan-milestone.ts +11 -9
  436. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +5 -2
  437. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
  438. package/src/resources/extensions/gsd/tools/reopen-slice.ts +27 -0
  439. package/src/resources/extensions/gsd/tools/reopen-task.ts +17 -0
  440. package/src/resources/extensions/gsd/triage-resolution.ts +37 -17
  441. package/src/resources/extensions/gsd/types.ts +4 -0
  442. package/src/resources/extensions/gsd/undo.ts +3 -2
  443. package/src/resources/extensions/gsd/workflow-events.ts +5 -3
  444. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  445. package/src/resources/extensions/gsd/workflow-projections.ts +7 -8
  446. package/src/resources/extensions/gsd/workflow-reconcile.ts +109 -8
  447. package/src/resources/extensions/gsd/workflow-templates.ts +11 -2
  448. package/src/resources/extensions/gsd/worktree-manager.ts +4 -2
  449. package/src/resources/extensions/gsd/worktree.ts +10 -0
  450. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  451. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +8 -10
  452. package/src/resources/extensions/subagent/agents.ts +30 -6
  453. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
  454. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  455. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  456. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  457. /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → _X1i-S7l1jZfb7lmIZozb}/_buildManifest.js +0 -0
  458. /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → _X1i-S7l1jZfb7lmIZozb}/_ssgManifest.js +0 -0
@@ -9,7 +9,8 @@
9
9
  *
10
10
  * Also provides detectFileOverlap() for surfacing downstream impact on quick tasks.
11
11
  */
12
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
12
+ import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs";
13
+ import { atomicWriteSync } from "./atomic-write.js";
13
14
  import { join } from "node:path";
14
15
  import { createRequire } from "node:module";
15
16
  import { gsdRoot, milestonesDir } from "./paths.js";
@@ -46,11 +47,11 @@ export function executeInject(basePath, mid, sid, capture) {
46
47
  const filesSection = content.indexOf("## Files Likely Touched");
47
48
  if (filesSection !== -1) {
48
49
  const updated = content.slice(0, filesSection) + newTask + "\n\n" + content.slice(filesSection);
49
- writeFileSync(planPath, updated, "utf-8");
50
+ atomicWriteSync(planPath, updated, "utf-8");
50
51
  }
51
52
  else {
52
53
  // No Files section — append at end
53
- writeFileSync(planPath, content.trimEnd() + "\n\n" + newTask + "\n", "utf-8");
54
+ atomicWriteSync(planPath, content.trimEnd() + "\n\n" + newTask + "\n", "utf-8");
54
55
  }
55
56
  return newId;
56
57
  }
@@ -78,7 +79,7 @@ export function executeReplan(basePath, mid, sid, capture) {
78
79
  `This file was created by the triage pipeline. The next dispatch cycle`,
79
80
  `will detect it and enter the replanning-slice phase.`,
80
81
  ].join("\n");
81
- writeFileSync(triggerPath, content, "utf-8");
82
+ atomicWriteSync(triggerPath, content, "utf-8");
82
83
  // Also write replan_triggered_at column for DB-backed detection
83
84
  try {
84
85
  const req = createRequire(import.meta.url);
@@ -146,7 +147,7 @@ export function executeBacktrack(basePath, currentMilestoneId, capture) {
146
147
  `2. Identify missing features/requirements from the target milestone`,
147
148
  `3. Resume auto-mode — the state machine will re-enter discussion for the target`,
148
149
  ].join("\n");
149
- writeFileSync(triggerPath, content, "utf-8");
150
+ atomicWriteSync(triggerPath, content, "utf-8");
150
151
  // If we have a valid target, also reset that milestone's completion status
151
152
  // so deriveState() will re-enter it as the active milestone.
152
153
  if (targetMilestoneId) {
@@ -156,7 +157,7 @@ export function executeBacktrack(basePath, currentMilestoneId, capture) {
156
157
  // Write a regression marker so the state machine knows this milestone
157
158
  // needs re-discussion, not just re-execution
158
159
  const regressionPath = join(targetDir, `${targetMilestoneId}-REGRESSION.md`);
159
- writeFileSync(regressionPath, [
160
+ atomicWriteSync(regressionPath, [
160
161
  `# Milestone Regression`,
161
162
  ``,
162
163
  `**From:** ${currentMilestoneId}`,
@@ -292,7 +293,7 @@ export function ensureDeferMilestoneDir(basePath, targetMilestone, captures) {
292
293
  captureList || `(no captures yet)`,
293
294
  ``,
294
295
  ].join("\n");
295
- writeFileSync(join(msDir, `${targetMilestone}-CONTEXT-DRAFT.md`), draftContent, "utf-8");
296
+ atomicWriteSync(join(msDir, `${targetMilestone}-CONTEXT-DRAFT.md`), draftContent, "utf-8");
296
297
  return true;
297
298
  }
298
299
  catch {
@@ -373,13 +374,16 @@ export function executeTriageResolutions(basePath, mid, sid) {
373
374
  }
374
375
  }
375
376
  }
376
- // Also process deferred captures that target milestone IDs — create
377
- // milestone directories so deriveState() discovers them.
378
- const deferred = loadAllCaptures(basePath).filter(c => c.status === "resolved" && !c.executed && c.classification === "defer");
379
- if (deferred.length > 0) {
380
- // Group deferred captures by target milestone
377
+ // Also process deferred and milestone-class captures (#3542).
378
+ // A defer/milestone capture's "action" is the triage decision itself —
379
+ // once classified and resolved, the capture is done. The target milestone
380
+ // picks up the work naturally from its planning context.
381
+ const deferrable = loadAllCaptures(basePath).filter(c => c.status === "resolved" && !c.executed &&
382
+ (c.classification === "defer" || c.classification === "milestone"));
383
+ if (deferrable.length > 0) {
384
+ // Group captures that reference a specific milestone — create dirs as needed.
381
385
  const byMilestone = new Map();
382
- for (const cap of deferred) {
386
+ for (const cap of deferrable) {
383
387
  const target = cap.resolution?.match(/\b(M\d{3}(?:-[a-z0-9]{6})?)\b/)?.[1];
384
388
  if (target) {
385
389
  const list = byMilestone.get(target) ?? [];
@@ -394,12 +398,25 @@ export function executeTriageResolutions(basePath, mid, sid) {
394
398
  if (created) {
395
399
  result.deferredMilestones++;
396
400
  result.actions.push(`Created milestone ${milestoneId} for ${captures.length} deferred capture(s)`);
397
- for (const cap of captures) {
398
- markCaptureExecuted(basePath, cap.id);
399
- }
400
401
  }
401
402
  }
402
403
  }
404
+ // Stamp ALL defer/milestone captures as executed (#3542 gaps 1-3).
405
+ // Previously only captures that triggered dir creation were stamped.
406
+ // Captures without a milestone ID in resolution text, or targeting an
407
+ // existing directory, were silently dropped — never stamped.
408
+ for (const cap of deferrable) {
409
+ if (!cap.executed) {
410
+ markCaptureExecuted(basePath, cap.id);
411
+ }
412
+ }
413
+ }
414
+ // Mark note captures as executed — they're informational only, no action
415
+ // needed. Without this they stay in "resolved but not executed" limbo (#3578).
416
+ const notes = loadAllCaptures(basePath).filter(c => c.status === "resolved" && !c.executed && c.classification === "note");
417
+ for (const cap of notes) {
418
+ markCaptureExecuted(basePath, cap.id);
419
+ result.actions.push(`Note acknowledged: ${cap.id} — "${cap.text}"`);
403
420
  }
404
421
  if (actionable.length === 0)
405
422
  return result;
@@ -2,9 +2,10 @@
2
2
  // handleUndo: Rollback the most recent completed unit (revert git, remove state, uncheck plans).
3
3
  // handleUndoTask: Reset a single task's DB status to "pending" and re-render markdown.
4
4
  // handleResetSlice: Reset a slice and all its tasks, re-rendering plan + roadmap.
5
- import { existsSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
5
+ import { existsSync, readFileSync, unlinkSync, readdirSync } from "node:fs";
6
6
  import { join, basename } from "node:path";
7
7
  import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
8
+ import { atomicWriteSync } from "./atomic-write.js";
8
9
  import { parseUnitId } from "./unit-id.js";
9
10
  import { deriveState } from "./state.js";
10
11
  import { invalidateAllCaches } from "./cache.js";
@@ -331,7 +332,7 @@ export function uncheckTaskInPlan(basePath, mid, sid, tid) {
331
332
  const regex = new RegExp(`^(\\s*-\\s*)\\[x\\](\\s*\\**${tid}\\**[:\\s])`, "mi");
332
333
  if (regex.test(content)) {
333
334
  content = content.replace(regex, "$1[ ]$2");
334
- writeFileSync(planFile, content, "utf-8");
335
+ atomicWriteSync(planFile, content);
335
336
  return true;
336
337
  }
337
338
  return false;
@@ -24,6 +24,7 @@ export function appendEvent(basePath, event) {
24
24
  .digest("hex")
25
25
  .slice(0, 16);
26
26
  const fullEvent = {
27
+ v: 2,
27
28
  ...event,
28
29
  hash,
29
30
  session_id: ENGINE_SESSION_ID,
@@ -223,7 +223,7 @@ function _sanitizeForAudit(entry) {
223
223
  };
224
224
  if (entry.context) {
225
225
  // Allowlist: only persist known-safe structured keys
226
- const SAFE_KEYS = new Set(["fn", "tool", "mid", "sid", "tid", "worktree"]);
226
+ const SAFE_KEYS = new Set(["fn", "tool", "mid", "sid", "tid", "worktree", "id", "error", "count"]);
227
227
  const filtered = {};
228
228
  for (const [k, v] of Object.entries(entry.context)) {
229
229
  if (SAFE_KEYS.has(k)) {
@@ -6,6 +6,7 @@ import { atomicWriteSync } from "./atomic-write.js";
6
6
  import { join } from "node:path";
7
7
  import { mkdirSync, existsSync } from "node:fs";
8
8
  import { logWarning } from "./workflow-logger.js";
9
+ import { isClosedStatus } from "./status-guards.js";
9
10
  import { deriveState } from "./state.js";
10
11
  // ─── Helpers ─────────────────────────────────────────────────────────────
11
12
  /**
@@ -38,7 +39,7 @@ export function renderPlanContent(sliceRow, taskRows) {
38
39
  lines.push("");
39
40
  lines.push("## Tasks");
40
41
  for (const task of taskRows) {
41
- const checkbox = task.status === "done" || task.status === "complete" ? "[x]" : "[ ]";
42
+ const checkbox = isClosedStatus(task.status) ? "[x]" : "[ ]";
42
43
  lines.push(`- ${checkbox} **${task.id}: ${task.title}** \u2014 ${task.description}`);
43
44
  // Estimate subline (always present if non-empty)
44
45
  if (task.estimate) {
@@ -96,7 +97,7 @@ export function renderRoadmapContent(milestoneRow, sliceRows) {
96
97
  lines.push("| ID | Slice | Risk | Depends | Done | After this |");
97
98
  lines.push("|----|-------|------|---------|------|------------|");
98
99
  for (const slice of sliceRows) {
99
- const done = slice.status === "done" || slice.status === "complete" ? "\u2705" : "\u2B1C";
100
+ const done = isClosedStatus(slice.status) ? "\u2705" : "\u2B1C";
100
101
  // depends is already parsed to string[] by rowToSlice
101
102
  let depends = "\u2014";
102
103
  if (slice.depends && slice.depends.length > 0) {
@@ -324,13 +325,10 @@ export async function renderAllProjections(basePath, milestoneId) {
324
325
  // Query all slices for this milestone
325
326
  const sliceRows = getMilestoneSlices(milestoneId);
326
327
  for (const slice of sliceRows) {
327
- // Render PLAN.md for each slice
328
- try {
329
- renderPlanProjection(basePath, milestoneId, slice.id);
330
- }
331
- catch (err) {
332
- logWarning("projection", `renderPlanProjection failed for ${milestoneId}/${slice.id}: ${err.message}`);
333
- }
328
+ // PLAN.md is rendered by the authoritative markdown-renderer.js in
329
+ // plan-slice/replan-slice tools. Do NOT overwrite it here — the simplified
330
+ // projection is missing key sections (Must-Haves, Verification, Files
331
+ // Likely Touched) and corrupts multi-line task descriptions (#3651).
334
332
  // Render SUMMARY.md for each completed task
335
333
  const taskRows = getSliceTasks(milestoneId, slice.id);
336
334
  const doneTasks = taskRows.filter(t => t.status === "done" || t.status === "complete");
@@ -2,8 +2,11 @@ import { join } from "node:path";
2
2
  import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
3
3
  import { logWarning, logError } from "./workflow-logger.js";
4
4
  import { readEvents, findForkPoint, appendEvent, getSessionId } from "./workflow-events.js";
5
- import { transaction, updateTaskStatus, updateSliceStatus, getSliceTasks, insertVerificationEvidence, upsertDecision, openDatabase, } from "./gsd-db.js";
5
+ import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, _getAdapter, getMilestoneSlices, insertVerificationEvidence, upsertDecision, openDatabase, setTaskBlockerDiscovered, } from "./gsd-db.js";
6
6
  import { isClosedStatus } from "./status-guards.js";
7
+ import { invalidateStateCache } from "./state.js";
8
+ import { clearPathCache } from "./paths.js";
9
+ import { clearParseCache } from "./files.js";
7
10
  import { writeManifest } from "./workflow-manifest.js";
8
11
  import { atomicWriteSync } from "./atomic-write.js";
9
12
  import { acquireSyncLock, releaseSyncLock } from "./sync-lock.js";
@@ -44,7 +47,15 @@ function replayEvents(events) {
44
47
  transaction(() => {
45
48
  for (const event of events) {
46
49
  const p = event.params;
47
- switch (event.cmd) {
50
+ // Normalize cmd format: completion tools write hyphens ("complete-task"),
51
+ // legacy logs use underscores ("complete_task"). Accept both formats.
52
+ // Type guard: malformed event lines with non-string cmd are skipped.
53
+ if (typeof event.cmd !== "string") {
54
+ logWarning("reconcile", `Event with non-string cmd skipped: ${JSON.stringify(event.cmd)}`);
55
+ continue;
56
+ }
57
+ const cmd = event.cmd.replace(/-/g, "_");
58
+ switch (cmd) {
48
59
  case "complete_task": {
49
60
  const milestoneId = p["milestoneId"];
50
61
  const sliceId = p["sliceId"];
@@ -60,13 +71,11 @@ function replayEvents(events) {
60
71
  break;
61
72
  }
62
73
  case "report_blocker": {
63
- // report_blocker marks the task with blocker_discovered = 1
64
- // The DB helper updateTaskStatus doesn't handle blockers,
65
- // so we just update status to "blocked" as a best-effort replay.
66
74
  const milestoneId = p["milestoneId"];
67
75
  const sliceId = p["sliceId"];
68
76
  const taskId = p["taskId"];
69
77
  updateTaskStatus(milestoneId, sliceId, taskId, "blocked");
78
+ setTaskBlockerDiscovered(milestoneId, sliceId, taskId, true);
70
79
  break;
71
80
  }
72
81
  case "record_verification": {
@@ -91,9 +100,64 @@ function replayEvents(events) {
91
100
  replaySliceComplete(milestoneId, sliceId, event.ts);
92
101
  break;
93
102
  }
103
+ case "complete_milestone": {
104
+ const milestoneId = p["milestoneId"];
105
+ if (!milestoneId)
106
+ break;
107
+ // Invariant check: only mark complete if all slices are closed.
108
+ // Without this guard, a reordered/partial event stream could close
109
+ // a milestone while work is still incomplete.
110
+ const mSlices = getMilestoneSlices(milestoneId);
111
+ const allClosed = mSlices.length === 0 || mSlices.every(s => isClosedStatus(s.status));
112
+ if (allClosed) {
113
+ updateMilestoneStatus(milestoneId, "complete", event.ts);
114
+ }
115
+ else {
116
+ logWarning("reconcile", `Skipping complete_milestone replay for ${milestoneId}: not all slices are closed`);
117
+ }
118
+ break;
119
+ }
120
+ case "plan_milestone": {
121
+ // Replay milestone creation — uses INSERT OR IGNORE (gsd-db's insertMilestone is safe)
122
+ const mId = p["milestoneId"];
123
+ if (mId) {
124
+ insertMilestone({ id: mId, title: p["title"] ?? mId });
125
+ }
126
+ break;
127
+ }
94
128
  case "plan_slice": {
95
- // plan_slice events are informational slice should already exist.
96
- // No DB mutation needed during replay (the slice was inserted at plan time).
129
+ // Replay slice creationstrict INSERT OR IGNORE to avoid overwriting
130
+ // progressed status. insertSlice() uses ON CONFLICT DO UPDATE which
131
+ // could downgrade a completed slice back to pending.
132
+ const milestoneId = p["milestoneId"];
133
+ const sliceId = p["sliceId"];
134
+ if (milestoneId && sliceId) {
135
+ const adapter = _getAdapter();
136
+ if (adapter) {
137
+ adapter.prepare(`INSERT OR IGNORE INTO slices (milestone_id, id, title, status, created_at)
138
+ VALUES (:mid, :sid, :title, 'pending', :ts)`).run({ ":mid": milestoneId, ":sid": sliceId, ":title": p["title"] ?? sliceId, ":ts": event.ts });
139
+ }
140
+ }
141
+ break;
142
+ }
143
+ case "plan_task": {
144
+ // Replay task creation — strict INSERT OR IGNORE to avoid overwriting
145
+ // progressed status. insertTask() uses ON CONFLICT DO UPDATE which
146
+ // could downgrade a done/in-progress task back to pending.
147
+ const milestoneId = p["milestoneId"];
148
+ const sliceId = p["sliceId"];
149
+ const taskId = p["taskId"];
150
+ if (milestoneId && sliceId && taskId) {
151
+ const adapter = _getAdapter();
152
+ if (adapter) {
153
+ adapter.prepare(`INSERT OR IGNORE INTO tasks (milestone_id, slice_id, id, title, status, created_at)
154
+ VALUES (:mid, :sid, :tid, :title, 'pending', :ts)`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId, ":title": p["title"] ?? taskId, ":ts": event.ts });
155
+ }
156
+ }
157
+ break;
158
+ }
159
+ case "replan_slice": {
160
+ // Informational — replan events don't mutate DB during replay
97
161
  break;
98
162
  }
99
163
  case "save_decision": {
@@ -111,7 +175,7 @@ function replayEvents(events) {
111
175
  break;
112
176
  }
113
177
  default:
114
- // Unknown commands are silently skipped during replay
178
+ logWarning("reconcile", `Unknown event cmd during replay: "${event.cmd}" — skipped`);
115
179
  break;
116
180
  }
117
181
  }
@@ -125,22 +189,37 @@ function replayEvents(events) {
125
189
  */
126
190
  export function extractEntityKey(event) {
127
191
  const p = event.params;
128
- switch (event.cmd) {
192
+ // Normalize cmd format: accept both hyphens and underscores
193
+ if (typeof event.cmd !== "string")
194
+ return null;
195
+ const cmd = event.cmd.replace(/-/g, "_");
196
+ switch (cmd) {
129
197
  case "complete_task":
130
198
  case "start_task":
131
199
  case "report_blocker":
132
200
  case "record_verification":
201
+ case "plan_task":
133
202
  return typeof p["taskId"] === "string"
134
203
  ? { type: "task", id: p["taskId"] }
135
204
  : null;
136
205
  case "complete_slice":
206
+ case "replan_slice":
137
207
  return typeof p["sliceId"] === "string"
138
208
  ? { type: "slice", id: p["sliceId"] }
139
209
  : null;
210
+ case "complete_milestone":
211
+ return typeof p["milestoneId"] === "string"
212
+ ? { type: "milestone", id: p["milestoneId"] }
213
+ : null;
140
214
  case "plan_slice":
141
215
  return typeof p["sliceId"] === "string"
142
216
  ? { type: "slice_plan", id: p["sliceId"] }
143
217
  : null;
218
+ case "complete_milestone":
219
+ case "plan_milestone":
220
+ return typeof p["milestoneId"] === "string"
221
+ ? { type: "milestone", id: p["milestoneId"] }
222
+ : null;
144
223
  case "save_decision":
145
224
  if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
146
225
  return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
@@ -291,6 +370,13 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
291
370
  indexed.sort((a, b) => a.e.ts.localeCompare(b.e.ts) || a.i - b.i);
292
371
  const merged = indexed.map(({ e }) => e);
293
372
  // Step 7: Write merged event log FIRST (so crash recovery can re-derive DB state)
373
+ // Guard: detect concurrent appendEvent calls between our read (step 1) and
374
+ // this rewrite. If the log grew, re-read and retry to avoid dropping events.
375
+ const preWriteEvents = readEvents(mainLogPath);
376
+ if (preWriteEvents.length > mainEvents.length) {
377
+ logWarning("reconcile", `Event log grew during reconcile (${mainEvents.length} → ${preWriteEvents.length}), retrying with fresh read`);
378
+ return _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath);
379
+ }
294
380
  const baseEvents = mainEvents.slice(0, forkPoint + 1);
295
381
  const mergedLog = baseEvents.concat(merged);
296
382
  const logContent = mergedLog.map((e) => JSON.stringify(e)).join("\n") + (mergedLog.length > 0 ? "\n" : "");
@@ -306,6 +392,11 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
306
392
  catch (err) {
307
393
  logWarning("reconcile", "manifest write failed (non-fatal)", { error: err.message });
308
394
  }
395
+ // Step 10: Invalidate caches so deriveState() sees post-reconcile DB state.
396
+ // Use targeted invalidation (not invalidateAllCaches) to avoid wiping artifacts table.
397
+ invalidateStateCache();
398
+ clearPathCache();
399
+ clearParseCache();
309
400
  return { autoMerged: merged.length, conflicts: [] };
310
401
  }
311
402
  // ─── Conflict Resolution (D-06) ─────────────────────────────────────────────
@@ -29,8 +29,17 @@ let cachedRegistry = null;
29
29
  export function loadRegistry() {
30
30
  if (cachedRegistry)
31
31
  return cachedRegistry;
32
- const content = readFileSync(registryPath, "utf-8");
33
- cachedRegistry = JSON.parse(content);
32
+ if (!existsSync(registryPath)) {
33
+ cachedRegistry = { version: 1, templates: {} };
34
+ return cachedRegistry;
35
+ }
36
+ try {
37
+ const content = readFileSync(registryPath, "utf-8");
38
+ cachedRegistry = JSON.parse(content);
39
+ }
40
+ catch {
41
+ cachedRegistry = { version: 1, templates: {} };
42
+ }
34
43
  return cachedRegistry;
35
44
  }
36
45
  /**
@@ -44,7 +44,10 @@ function normalizePathForComparison(path) {
44
44
  export function resolveGitDir(basePath) {
45
45
  const gitPath = join(basePath, ".git");
46
46
  if (!existsSync(gitPath))
47
- return join(basePath, ".git");
47
+ return gitPath;
48
+ // In a normal repo .git is a directory — skip the file read (#3597)
49
+ if (lstatSync(gitPath).isDirectory())
50
+ return gitPath;
48
51
  try {
49
52
  const content = readFileSync(gitPath, "utf-8").trim();
50
53
  if (content.startsWith("gitdir: ")) {
@@ -54,7 +57,7 @@ export function resolveGitDir(basePath) {
54
57
  catch (e) {
55
58
  logWarning("worktree", `.git file read failed: ${e.message}`);
56
59
  }
57
- return join(basePath, ".git");
60
+ return gitPath;
58
61
  }
59
62
  export function worktreesDir(basePath) {
60
63
  return join(basePath, ".gsd", "worktrees");
@@ -34,6 +34,15 @@ function getService(basePath) {
34
34
  }
35
35
  return cachedService;
36
36
  }
37
+ /**
38
+ * Clear the cached GitServiceImpl. For testing only — forces the next
39
+ * getService() call to re-read preferences and create a fresh instance.
40
+ * @internal
41
+ */
42
+ export function _resetServiceCache() {
43
+ cachedService = null;
44
+ cachedBasePath = null;
45
+ }
37
46
  /**
38
47
  * Set the active milestone ID on the cached GitServiceImpl.
39
48
  * This enables integration branch resolution in getMainBranch().
@@ -204,7 +204,7 @@ export async function showInterviewRound(questions, opts, ctx) {
204
204
  // instead of being trapped in a re-asking loop (bug #2715).
205
205
  // Only auto-open if the user hasn't already provided notes —
206
206
  // otherwise Enter from notes mode loops back here endlessly.
207
- if (!isMultiSelect(currentIdx) && states[currentIdx].cursorIndex === noneOrDoneIdx(currentIdx) && !states[currentIdx].notes) {
207
+ if (!isMultiSelect(currentIdx) && states[currentIdx].cursorIndex === noneOrDoneIdx(currentIdx) && !states[currentIdx].notes && !states[currentIdx].notesVisible) {
208
208
  states[currentIdx].notesVisible = true;
209
209
  focusNotes = true;
210
210
  loadStateToEditor();
@@ -5,6 +5,23 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { getAgentDir, parseFrontmatter } from "@gsd/pi-coding-agent";
7
7
  const PROJECT_AGENT_DIR_CANDIDATES = [".gsd", ".pi"];
8
+ function parseAgentTools(value) {
9
+ if (typeof value === "string") {
10
+ const tools = value
11
+ .split(",")
12
+ .map((tool) => tool.trim())
13
+ .filter(Boolean);
14
+ return tools.length > 0 ? tools : undefined;
15
+ }
16
+ if (Array.isArray(value)) {
17
+ const tools = value
18
+ .flatMap((tool) => typeof tool === "string" ? tool.split(",") : [])
19
+ .map((tool) => tool.trim())
20
+ .filter(Boolean);
21
+ return tools.length > 0 ? tools : undefined;
22
+ }
23
+ return undefined;
24
+ }
8
25
  function loadAgentsFromDir(dir, source) {
9
26
  const agents = [];
10
27
  if (!fs.existsSync(dir)) {
@@ -31,13 +48,10 @@ function loadAgentsFromDir(dir, source) {
31
48
  continue;
32
49
  }
33
50
  const { frontmatter, body } = parseFrontmatter(content);
34
- if (!frontmatter.name || !frontmatter.description) {
51
+ if (typeof frontmatter.name !== "string" || typeof frontmatter.description !== "string") {
35
52
  continue;
36
53
  }
37
- const tools = frontmatter.tools
38
- ?.split(",")
39
- .map((t) => t.trim())
40
- .filter(Boolean);
54
+ const tools = parseAgentTools(frontmatter.tools);
41
55
  agents.push({
42
56
  name: frontmatter.name,
43
57
  description: frontmatter.description,
@@ -1 +1 @@
1
- MRM3OSYIAa4HMDqVGQ9nt
1
+ _X1i-S7l1jZfb7lmIZozb
@@ -11,37 +11,37 @@
11
11
  "/api/captures/route": "/api/captures",
12
12
  "/api/export-data/route": "/api/export-data",
13
13
  "/api/browse-directories/route": "/api/browse-directories",
14
- "/api/forensics/route": "/api/forensics",
15
14
  "/api/git/route": "/api/git",
15
+ "/api/forensics/route": "/api/forensics",
16
16
  "/api/history/route": "/api/history",
17
17
  "/api/hooks/route": "/api/hooks",
18
- "/api/inspect/route": "/api/inspect",
19
18
  "/api/knowledge/route": "/api/knowledge",
20
19
  "/api/experimental/route": "/api/experimental",
20
+ "/api/inspect/route": "/api/inspect",
21
21
  "/api/live-state/route": "/api/live-state",
22
22
  "/api/notifications/route": "/api/notifications",
23
- "/api/preferences/route": "/api/preferences",
24
23
  "/api/recovery/route": "/api/recovery",
25
- "/api/onboarding/route": "/api/onboarding",
26
- "/api/projects/route": "/api/projects",
24
+ "/api/preferences/route": "/api/preferences",
27
25
  "/api/session/browser/route": "/api/session/browser",
26
+ "/api/onboarding/route": "/api/onboarding",
27
+ "/api/session/command/route": "/api/session/command",
28
28
  "/api/session/events/route": "/api/session/events",
29
- "/api/session/manage/route": "/api/session/manage",
30
29
  "/api/settings-data/route": "/api/settings-data",
31
- "/api/session/command/route": "/api/session/command",
30
+ "/api/session/manage/route": "/api/session/manage",
32
31
  "/api/shutdown/route": "/api/shutdown",
33
32
  "/api/skill-health/route": "/api/skill-health",
34
33
  "/api/steer/route": "/api/steer",
35
34
  "/api/terminal/input/route": "/api/terminal/input",
36
- "/api/files/route": "/api/files",
37
35
  "/api/terminal/resize/route": "/api/terminal/resize",
38
36
  "/api/switch-root/route": "/api/switch-root",
37
+ "/api/files/route": "/api/files",
39
38
  "/api/terminal/sessions/route": "/api/terminal/sessions",
40
- "/api/terminal/upload/route": "/api/terminal/upload",
41
- "/api/terminal/stream/route": "/api/terminal/stream",
42
- "/api/undo/route": "/api/undo",
43
39
  "/api/visualizer/route": "/api/visualizer",
40
+ "/api/terminal/upload/route": "/api/terminal/upload",
41
+ "/api/projects/route": "/api/projects",
44
42
  "/api/update/route": "/api/update",
43
+ "/api/terminal/stream/route": "/api/terminal/stream",
45
44
  "/api/remote-questions/route": "/api/remote-questions",
45
+ "/api/undo/route": "/api/undo",
46
46
  "/page": "/"
47
47
  }
@@ -4,14 +4,14 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/MRM3OSYIAa4HMDqVGQ9nt/_buildManifest.js",
8
- "static/MRM3OSYIAa4HMDqVGQ9nt/_ssgManifest.js"
7
+ "static/_X1i-S7l1jZfb7lmIZozb/_buildManifest.js",
8
+ "static/_X1i-S7l1jZfb7lmIZozb/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
- "static/chunks/webpack-a1c1e452c6b32d04.js",
11
+ "static/chunks/webpack-9fed74684e1c5bb1.js",
12
12
  "static/chunks/4bd1b696-e5d7c65570c947b7.js",
13
13
  "static/chunks/3794-337d1ca25ad99a89.js",
14
- "static/chunks/main-app-d3d4c336195465f9.js"
14
+ "static/chunks/main-app-fdab67f7802d7832.js"
15
15
  ],
16
16
  "rootMainFilesTree": {},
17
17
  "pages": {
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "bb1a193e6c1bf4abd4a9d63cdf8655b7",
82
- "previewModeSigningKey": "ca5e2b71c749274a2c0a666756ffb23c45fc42b15d3d6d88453fff2c7153813c",
83
- "previewModeEncryptionKey": "8ab4799711ced11dba484f001c1fb80246ebf723c020e899c9dbccc68dbde139"
81
+ "previewModeId": "c7bdd50bc7b86c00e028499fa79f4347",
82
+ "previewModeSigningKey": "80ca15367c0ce4e9c5beeb9c9f454f2076f15265b876af88f0ee89d880ea8215",
83
+ "previewModeEncryptionKey": "d162efa9d90ba18d616511e57429f642af2c6ba6231df509da0e2cc144d49b1e"
84
84
  }
85
85
  }
@@ -6,7 +6,7 @@
6
6
  "static/chunks/363642f4.f9053a63f1b97508.js",
7
7
  "static/chunks/4986-c2fc8845ce785303.js",
8
8
  "static/chunks/2008.817d0885545aaea9.js",
9
- "static/chunks/6502.7593d7797a4b3999.js"
9
+ "static/chunks/6502.8874bcae249c02e1.js"
10
10
  ]
11
11
  },
12
12
  "components/gsd/chat-mode.tsx -> react-markdown": {
@@ -100,7 +100,7 @@
100
100
  "transform": "lodash/{{member}}"
101
101
  }
102
102
  },
103
- "outputFileTracingRoot": "/home/runner/_work/gsd-2/gsd-2",
103
+ "outputFileTracingRoot": "/__w/gsd-2/gsd-2",
104
104
  "cacheComponents": false,
105
105
  "cacheLife": {
106
106
  "default": {
@@ -297,11 +297,11 @@
297
297
  "node-pty"
298
298
  ],
299
299
  "turbopack": {
300
- "root": "/home/runner/_work/gsd-2/gsd-2"
300
+ "root": "/__w/gsd-2/gsd-2"
301
301
  },
302
302
  "distDirRoot": ".next"
303
303
  },
304
- "appDir": "/home/runner/_work/gsd-2/gsd-2/web",
304
+ "appDir": "/__w/gsd-2/gsd-2/web",
305
305
  "relativeAppDir": "web",
306
306
  "files": [
307
307
  ".next/routes-manifest.json",