gsd-pi 2.44.0-dev.848dd4c → 2.44.0-dev.8dd0d8e

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 (249) hide show
  1. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  2. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  3. package/dist/resources/extensions/gsd/auto/phases.js +37 -36
  4. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  5. package/dist/resources/extensions/gsd/auto-start.js +21 -2
  6. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  7. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  8. package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
  9. package/dist/resources/extensions/gsd/auto.js +30 -3
  10. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
  11. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  12. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  13. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  14. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  15. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  16. package/dist/resources/extensions/gsd/db-writer.js +34 -16
  17. package/dist/resources/extensions/gsd/doctor.js +8 -0
  18. package/dist/resources/extensions/gsd/git-service.js +8 -3
  19. package/dist/resources/extensions/gsd/gsd-db.js +12 -1
  20. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  21. package/dist/resources/extensions/gsd/preferences.js +9 -1
  22. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  23. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  24. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  25. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  26. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  27. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  28. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  29. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  30. package/dist/resources/extensions/gsd/rethink.js +115 -0
  31. package/dist/resources/extensions/gsd/state.js +41 -3
  32. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  33. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  34. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  35. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  36. package/dist/resources/extensions/gsd/worktree-manager.js +32 -2
  37. package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
  38. package/dist/resources/extensions/mcp-client/index.js +14 -0
  39. package/dist/web/standalone/.next/BUILD_ID +1 -1
  40. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  41. package/dist/web/standalone/.next/build-manifest.json +3 -3
  42. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  43. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  44. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  46. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found/page.js +1 -1
  54. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  56. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  57. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  58. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  60. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  63. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/index.html +1 -1
  104. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  105. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  106. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  107. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  109. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  110. package/dist/web/standalone/.next/server/app/page.js +1 -1
  111. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  113. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  116. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  117. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  118. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  119. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  120. package/dist/web/standalone/.next/static/chunks/app/{page-b9367c5ae13b99c6.js → page-6654a8cca61a3d1c.js} +1 -1
  121. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  122. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  123. package/package.json +1 -1
  124. package/packages/native/dist/stream-process/index.js +2 -2
  125. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  126. package/packages/native/src/stream-process/index.ts +2 -2
  127. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  128. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  129. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  130. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  131. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  132. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  133. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  134. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  135. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
  136. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  137. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
  138. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  139. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  140. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  141. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  142. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  144. package/packages/pi-coding-agent/dist/main.js +17 -0
  145. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  146. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  147. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  148. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  149. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  150. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  151. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  153. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  155. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  157. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  159. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  160. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  161. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  162. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  163. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  164. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  165. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  166. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  167. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  168. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  169. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  171. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  172. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  173. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  174. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  175. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  176. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  177. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
  178. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  179. package/packages/pi-coding-agent/src/main.ts +19 -0
  180. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  181. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  182. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  183. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  184. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  185. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  186. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  187. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  188. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  189. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  190. package/src/resources/extensions/gsd/auto/phases.ts +46 -48
  191. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  192. package/src/resources/extensions/gsd/auto-start.ts +25 -2
  193. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  194. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  195. package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
  196. package/src/resources/extensions/gsd/auto.ts +37 -3
  197. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
  198. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  199. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  200. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  201. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  202. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  203. package/src/resources/extensions/gsd/db-writer.ts +39 -17
  204. package/src/resources/extensions/gsd/doctor.ts +7 -1
  205. package/src/resources/extensions/gsd/git-service.ts +6 -2
  206. package/src/resources/extensions/gsd/gsd-db.ts +16 -1
  207. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  208. package/src/resources/extensions/gsd/preferences.ts +11 -1
  209. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  210. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  211. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  212. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  213. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  214. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  215. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  216. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  217. package/src/resources/extensions/gsd/rethink.ts +154 -0
  218. package/src/resources/extensions/gsd/state.ts +41 -1
  219. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  220. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  221. package/src/resources/extensions/gsd/tests/db-writer.test.ts +79 -0
  222. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  223. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +60 -0
  224. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  225. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  226. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  227. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  228. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  229. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  230. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  231. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  232. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  233. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  234. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  235. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  236. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  237. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  238. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  239. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  240. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  241. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  242. package/src/resources/extensions/gsd/worktree-manager.ts +43 -2
  243. package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
  244. package/src/resources/extensions/mcp-client/index.ts +20 -0
  245. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  246. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  247. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  248. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → enTIm32JJtw--VTtLPSC3}/_buildManifest.js +0 -0
  249. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → enTIm32JJtw--VTtLPSC3}/_ssgManifest.js +0 -0
@@ -21,6 +21,7 @@ export interface ReplanSliceTaskInput {
21
21
  verify: string;
22
22
  inputs: string[];
23
23
  expectedOutput: string[];
24
+ fullPlanMd?: string;
24
25
  }
25
26
 
26
27
  export interface ReplanSliceParams {
@@ -136,6 +137,7 @@ export async function handleReplanSlice(
136
137
  verify: updatedTask.verify || "",
137
138
  inputs: updatedTask.inputs || [],
138
139
  expectedOutput: updatedTask.expectedOutput || [],
140
+ fullPlanMd: updatedTask.fullPlanMd,
139
141
  });
140
142
  } else {
141
143
  // Insert new task then set planning fields
@@ -154,6 +156,7 @@ export async function handleReplanSlice(
154
156
  verify: updatedTask.verify || "",
155
157
  inputs: updatedTask.inputs || [],
156
158
  expectedOutput: updatedTask.expectedOutput || [],
159
+ fullPlanMd: updatedTask.fullPlanMd,
157
160
  });
158
161
  }
159
162
  }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * validate-milestone handler — the core operation behind gsd_validate_milestone.
3
+ *
4
+ * Persists milestone validation results to the assessments table,
5
+ * renders VALIDATION.md to disk, and invalidates caches.
6
+ */
7
+
8
+ import { join } from "node:path";
9
+
10
+ import {
11
+ transaction,
12
+ _getAdapter,
13
+ } from "../gsd-db.js";
14
+ import { resolveMilestonePath, clearPathCache } from "../paths.js";
15
+ import { saveFile, clearParseCache } from "../files.js";
16
+ import { invalidateStateCache } from "../state.js";
17
+
18
+ export interface ValidateMilestoneParams {
19
+ milestoneId: string;
20
+ verdict: "pass" | "needs-attention" | "needs-remediation";
21
+ remediationRound: number;
22
+ successCriteriaChecklist: string;
23
+ sliceDeliveryAudit: string;
24
+ crossSliceIntegration: string;
25
+ requirementCoverage: string;
26
+ verdictRationale: string;
27
+ remediationPlan?: string;
28
+ }
29
+
30
+ export interface ValidateMilestoneResult {
31
+ milestoneId: string;
32
+ verdict: string;
33
+ validationPath: string;
34
+ }
35
+
36
+ function renderValidationMarkdown(params: ValidateMilestoneParams): string {
37
+ let md = `---
38
+ verdict: ${params.verdict}
39
+ remediation_round: ${params.remediationRound}
40
+ ---
41
+
42
+ # Milestone Validation: ${params.milestoneId}
43
+
44
+ ## Success Criteria Checklist
45
+ ${params.successCriteriaChecklist}
46
+
47
+ ## Slice Delivery Audit
48
+ ${params.sliceDeliveryAudit}
49
+
50
+ ## Cross-Slice Integration
51
+ ${params.crossSliceIntegration}
52
+
53
+ ## Requirement Coverage
54
+ ${params.requirementCoverage}
55
+
56
+ ## Verdict Rationale
57
+ ${params.verdictRationale}
58
+ `;
59
+
60
+ if (params.verdict === "needs-remediation" && params.remediationPlan) {
61
+ md += `\n## Remediation Plan\n${params.remediationPlan}\n`;
62
+ }
63
+
64
+ return md;
65
+ }
66
+
67
+ export async function handleValidateMilestone(
68
+ params: ValidateMilestoneParams,
69
+ basePath: string,
70
+ ): Promise<ValidateMilestoneResult | { error: string }> {
71
+ if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
72
+ return { error: "milestoneId is required and must be a non-empty string" };
73
+ }
74
+ const validVerdicts = ["pass", "needs-attention", "needs-remediation"];
75
+ if (!validVerdicts.includes(params.verdict)) {
76
+ return { error: `verdict must be one of: ${validVerdicts.join(", ")}` };
77
+ }
78
+
79
+ // ── Filesystem render ──────────────────────────────────────────────────
80
+ const validationMd = renderValidationMarkdown(params);
81
+
82
+ let validationPath: string;
83
+ const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
84
+ if (milestoneDir) {
85
+ validationPath = join(milestoneDir, `${params.milestoneId}-VALIDATION.md`);
86
+ } else {
87
+ const gsdDir = join(basePath, ".gsd");
88
+ const manualDir = join(gsdDir, "milestones", params.milestoneId);
89
+ validationPath = join(manualDir, `${params.milestoneId}-VALIDATION.md`);
90
+ }
91
+
92
+ try {
93
+ await saveFile(validationPath, validationMd);
94
+ } catch (renderErr) {
95
+ process.stderr.write(
96
+ `gsd-db: validate_milestone — disk render failed: ${(renderErr as Error).message}\n`,
97
+ );
98
+ return { error: `disk render failed: ${(renderErr as Error).message}` };
99
+ }
100
+
101
+ // ── DB write — store in assessments table ──────────────────────────────
102
+ const validatedAt = new Date().toISOString();
103
+
104
+ transaction(() => {
105
+ const adapter = _getAdapter()!;
106
+ adapter.prepare(
107
+ `INSERT OR REPLACE INTO assessments (path, milestone_id, slice_id, task_id, status, scope, full_content, created_at)
108
+ VALUES (:path, :mid, NULL, NULL, :verdict, 'milestone-validation', :content, :created_at)`,
109
+ ).run({
110
+ ":path": validationPath,
111
+ ":mid": params.milestoneId,
112
+ ":verdict": params.verdict,
113
+ ":content": validationMd,
114
+ ":created_at": validatedAt,
115
+ });
116
+ });
117
+
118
+ invalidateStateCache();
119
+ clearPathCache();
120
+ clearParseCache();
121
+
122
+ return {
123
+ milestoneId: params.milestoneId,
124
+ verdict: params.verdict,
125
+ validationPath,
126
+ };
127
+ }
@@ -16,6 +16,7 @@
16
16
  */
17
17
 
18
18
  import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
19
+ import { execFileSync } from "node:child_process";
19
20
  import { join, resolve, sep } from "node:path";
20
21
  import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
21
22
  import {
@@ -321,8 +322,48 @@ export function removeWorktree(
321
322
  return;
322
323
  }
323
324
 
324
- // Remove worktree using the resolved path (force if requested, to handle dirty worktrees)
325
- try { nativeWorktreeRemove(basePath, resolvedWtPath, force); } catch { /* may fail */ }
325
+ // Submodule safety (#2337): detect submodules with uncommitted changes
326
+ // before force-removing the worktree. Force removal destroys all uncommitted
327
+ // state, which is especially destructive for submodule directories.
328
+ let hasSubmoduleChanges = false;
329
+ const gitmodulesPath = join(resolvedWtPath, ".gitmodules");
330
+ if (existsSync(gitmodulesPath)) {
331
+ try {
332
+ const submoduleStatus = execFileSync(
333
+ "git", ["submodule", "status"],
334
+ { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
335
+ ).trim();
336
+ // Lines starting with '+' indicate uncommitted submodule changes
337
+ hasSubmoduleChanges = submoduleStatus.split("\n").some(
338
+ (line: string) => line.startsWith("+") || line.startsWith("-"),
339
+ );
340
+ if (hasSubmoduleChanges) {
341
+ // Stash submodule changes so they are not lost during force removal.
342
+ // The stash is created in the worktree before it's torn down.
343
+ try {
344
+ execFileSync(
345
+ "git", ["stash", "push", "-m", "gsd: auto-stash submodule changes before worktree teardown"],
346
+ { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
347
+ );
348
+ process.stderr.write(
349
+ `[GSD] WARNING: Stashed uncommitted submodule changes in ${resolvedWtPath} before worktree teardown.\n`,
350
+ );
351
+ } catch {
352
+ // Stash failed — warn the user that submodule changes may be lost
353
+ process.stderr.write(
354
+ `[GSD] WARNING: Submodule changes detected in ${resolvedWtPath} — stash failed, changes may be lost during force removal.\n`,
355
+ );
356
+ }
357
+ }
358
+ } catch {
359
+ // submodule status failed — proceed with normal removal
360
+ }
361
+ }
362
+
363
+ // Remove worktree: try non-force first when submodules have changes,
364
+ // falling back to force only after submodule state has been preserved.
365
+ const useForce = hasSubmoduleChanges ? false : force;
366
+ try { nativeWorktreeRemove(basePath, resolvedWtPath, useForce); } catch { /* may fail */ }
326
367
 
327
368
  // If the directory is still there (e.g. locked), try harder with force
328
369
  if (existsSync(resolvedWtPath)) {
@@ -17,6 +17,7 @@ import { existsSync, unlinkSync } from "node:fs";
17
17
  import { join } from "node:path";
18
18
  import type { AutoSession } from "./auto/session.js";
19
19
  import { debugLog } from "./debug-logger.js";
20
+ import { MergeConflictError } from "./git-service.js";
20
21
 
21
22
  // ─── Dependency Interface ──────────────────────────────────────────────────
22
23
 
@@ -433,6 +434,12 @@ export class WorktreeResolver {
433
434
  /* best-effort */
434
435
  }
435
436
  }
437
+
438
+ // Re-throw MergeConflictError so the auto loop can detect real code
439
+ // conflicts and stop instead of retrying forever (#2330).
440
+ if (err instanceof MergeConflictError) {
441
+ throw err;
442
+ }
436
443
  }
437
444
 
438
445
  // Always restore basePath and rebuild — whether merge succeeded or failed
@@ -213,6 +213,26 @@ function formatToolList(serverName: string, tools: McpToolSchema[]): string {
213
213
  return lines.join("\n");
214
214
  }
215
215
 
216
+ // ─── Status helper (consumed by /gsd mcp) ─────────────────────────────────────
217
+
218
+ /**
219
+ * Return the live connection status for a named MCP server.
220
+ * Safe to call even when the server has never been connected.
221
+ */
222
+ export function getConnectionStatus(name: string): {
223
+ connected: boolean;
224
+ tools: string[];
225
+ error?: string;
226
+ } {
227
+ const conn = connections.get(name);
228
+ const cached = toolCache.get(name);
229
+ return {
230
+ connected: !!conn,
231
+ tools: cached ? cached.map((t) => t.name) : [],
232
+ error: undefined,
233
+ };
234
+ }
235
+
216
236
  // ─── Extension ────────────────────────────────────────────────────────────────
217
237
 
218
238
  export default function (pi: ExtensionAPI) {