gsd-pi 2.76.0-dev.82e249f7b → 2.76.0-dev.97807402

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 (236) hide show
  1. package/dist/claude-cli-check.js +32 -3
  2. package/dist/mcp-server.d.ts +7 -0
  3. package/dist/mcp-server.js +35 -1
  4. package/dist/resource-loader.d.ts +1 -1
  5. package/dist/resource-loader.js +2 -8
  6. package/dist/resources/extensions/claude-code-cli/readiness.js +4 -3
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +77 -17
  8. package/dist/resources/extensions/gsd/auto/phases.js +14 -0
  9. package/dist/resources/extensions/gsd/auto/run-unit.js +27 -0
  10. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -1
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  12. package/dist/resources/extensions/gsd/auto-recovery.js +13 -0
  13. package/dist/resources/extensions/gsd/auto-start.js +27 -18
  14. package/dist/resources/extensions/gsd/auto-worktree.js +30 -48
  15. package/dist/resources/extensions/gsd/auto.js +13 -17
  16. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -1
  17. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +39 -9
  18. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +93 -0
  19. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +40 -4
  21. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +12 -1
  22. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  23. package/dist/resources/extensions/gsd/compaction-snapshot.js +121 -0
  24. package/dist/resources/extensions/gsd/error-classifier.js +10 -3
  25. package/dist/resources/extensions/gsd/exec-history.js +120 -0
  26. package/dist/resources/extensions/gsd/exec-sandbox.js +258 -0
  27. package/dist/resources/extensions/gsd/gsd-db.js +115 -7
  28. package/dist/resources/extensions/gsd/guided-flow.js +189 -0
  29. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  30. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  31. package/dist/resources/extensions/gsd/key-manager.js +6 -0
  32. package/dist/resources/extensions/gsd/model-router.js +36 -3
  33. package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -9
  34. package/dist/resources/extensions/gsd/preferences-types.js +9 -0
  35. package/dist/resources/extensions/gsd/preferences-validation.js +83 -0
  36. package/dist/resources/extensions/gsd/preferences.js +17 -17
  37. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  38. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  39. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  40. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -4
  41. package/dist/resources/extensions/gsd/safety/safety-harness.js +4 -0
  42. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  43. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +59 -0
  44. package/dist/resources/extensions/gsd/tools/exec-tool.js +126 -0
  45. package/dist/resources/extensions/gsd/tools/resume-tool.js +23 -0
  46. package/dist/resources/extensions/gsd/workflow-mcp.js +3 -0
  47. package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
  48. package/dist/resources/skills/write-docs/SKILL.md +2 -1
  49. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  50. package/dist/web/standalone/.next/BUILD_ID +1 -1
  51. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  52. package/dist/web/standalone/.next/build-manifest.json +2 -2
  53. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  54. package/dist/web/standalone/.next/required-server-files.json +1 -1
  55. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  56. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  58. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  64. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/index.html +1 -1
  72. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  79. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  81. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  82. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  83. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  84. package/dist/web/standalone/server.js +1 -1
  85. package/package.json +1 -1
  86. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  87. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  88. package/packages/mcp-server/dist/remote-questions.js +732 -0
  89. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  90. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  91. package/packages/mcp-server/dist/server.js +18 -1
  92. package/packages/mcp-server/dist/server.js.map +1 -1
  93. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  94. package/packages/mcp-server/dist/workflow-tools.js +64 -25
  95. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  96. package/packages/mcp-server/package.json +2 -1
  97. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  98. package/packages/mcp-server/src/remote-questions.ts +916 -0
  99. package/packages/mcp-server/src/server.ts +19 -1
  100. package/packages/mcp-server/src/workflow-tools.test.ts +146 -1
  101. package/packages/mcp-server/src/workflow-tools.ts +84 -43
  102. package/packages/mcp-server/tsconfig.test.json +19 -0
  103. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  104. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  105. package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -0
  106. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  107. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  108. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  109. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  110. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  111. package/packages/pi-ai/src/providers/anthropic-shared.ts +3 -1
  112. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  113. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  114. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  115. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  116. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  117. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  118. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  119. package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
  120. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts +2 -0
  122. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts.map +1 -0
  123. package/packages/pi-coding-agent/dist/core/redact-secrets.js +49 -0
  124. package/packages/pi-coding-agent/dist/core/redact-secrets.js.map +1 -0
  125. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts +2 -0
  126. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts.map +1 -0
  127. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js +67 -0
  128. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js.map +1 -0
  129. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  130. package/packages/pi-coding-agent/dist/core/session-manager.js +9 -5
  131. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  132. package/packages/pi-coding-agent/dist/core/session-manager.test.js +25 -1
  133. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  134. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  135. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  137. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  139. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  140. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  141. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  142. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  143. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  144. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  145. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  146. package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
  147. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  148. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  149. package/packages/pi-coding-agent/src/core/session-manager.test.ts +36 -1
  150. package/packages/pi-coding-agent/src/core/session-manager.ts +9 -5
  151. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  152. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  153. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  154. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  155. package/src/resources/extensions/claude-code-cli/readiness.ts +4 -3
  156. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +78 -17
  157. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +149 -5
  158. package/src/resources/extensions/gsd/auto/phases.ts +14 -0
  159. package/src/resources/extensions/gsd/auto/run-unit.ts +29 -0
  160. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -1
  161. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -2
  162. package/src/resources/extensions/gsd/auto-recovery.ts +15 -0
  163. package/src/resources/extensions/gsd/auto-start.ts +29 -19
  164. package/src/resources/extensions/gsd/auto-worktree.ts +34 -52
  165. package/src/resources/extensions/gsd/auto.ts +12 -17
  166. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +23 -1
  167. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +40 -9
  168. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +109 -0
  169. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  170. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +42 -4
  171. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +13 -1
  172. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  173. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  174. package/src/resources/extensions/gsd/error-classifier.ts +10 -3
  175. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  176. package/src/resources/extensions/gsd/exec-sandbox.ts +326 -0
  177. package/src/resources/extensions/gsd/gsd-db.ts +122 -7
  178. package/src/resources/extensions/gsd/guided-flow.ts +221 -0
  179. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  180. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  181. package/src/resources/extensions/gsd/journal.ts +2 -1
  182. package/src/resources/extensions/gsd/key-manager.ts +6 -0
  183. package/src/resources/extensions/gsd/model-router.ts +42 -1
  184. package/src/resources/extensions/gsd/pre-execution-checks.ts +36 -10
  185. package/src/resources/extensions/gsd/preferences-types.ts +46 -0
  186. package/src/resources/extensions/gsd/preferences-validation.ts +79 -0
  187. package/src/resources/extensions/gsd/preferences.ts +17 -17
  188. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  189. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  190. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  191. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -3
  192. package/src/resources/extensions/gsd/safety/safety-harness.ts +6 -0
  193. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +116 -0
  194. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +49 -0
  195. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +123 -0
  196. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  197. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  198. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
  199. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
  200. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  201. package/src/resources/extensions/gsd/tests/exec-history.test.ts +124 -0
  202. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +210 -0
  203. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +58 -0
  204. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +152 -1
  205. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  206. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +1 -1
  207. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  208. package/src/resources/extensions/gsd/tests/key-manager.test.ts +7 -0
  209. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  210. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  211. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
  212. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +14 -0
  213. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +234 -0
  214. package/src/resources/extensions/gsd/tests/preferences.test.ts +110 -0
  215. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  216. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +48 -0
  217. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  218. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
  219. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  220. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  221. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  222. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  223. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  224. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  225. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  226. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +3 -1
  227. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  228. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  229. package/src/resources/extensions/gsd/tools/exec-tool.ts +183 -0
  230. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  231. package/src/resources/extensions/gsd/workflow-logger.ts +2 -1
  232. package/src/resources/extensions/gsd/workflow-mcp.ts +3 -0
  233. package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
  234. package/src/resources/skills/write-docs/SKILL.md +2 -1
  235. /package/dist/web/standalone/.next/static/{ecSsu49rxxcpbNmVP4mLD → pI48IF3dgfs0CBrYi2bh_}/_buildManifest.js +0 -0
  236. /package/dist/web/standalone/.next/static/{ecSsu49rxxcpbNmVP4mLD → pI48IF3dgfs0CBrYi2bh_}/_ssgManifest.js +0 -0
@@ -313,6 +313,53 @@ function getWorkflowOpTimeoutMs(env = process.env) {
313
313
  return DEFAULT_WORKFLOW_OP_TIMEOUT_MS;
314
314
  return parsed; // 0 disables the timeout
315
315
  }
316
+ /**
317
+ * Adapt an executor `ToolExecutionResult` ({ content, details?, isError? }) to
318
+ * the MCP `CallToolResult` shape ({ content, structuredContent?, isError? }).
319
+ *
320
+ * MCP transports (including stdio) only serialize fields declared in the
321
+ * protocol, so a non-standard `details` field is silently dropped over the
322
+ * wire. Mirroring it into `structuredContent` — the protocol's supported
323
+ * channel for structured tool payloads — preserves the data for clients that
324
+ * render from it (e.g. the save_gate_result renderer that reads gateId /
325
+ * verdict). See #4472.
326
+ *
327
+ * Discard policy for non-plain-object `details`: the `isPlainObject` guard
328
+ * accepts the canonical case (a record literal) and intentionally drops bare
329
+ * primitives (string, number, boolean), bare arrays, and class instances /
330
+ * Date objects. This is deliberate — MCP `structuredContent` is specified as
331
+ * a JSON object; non-object payloads can't round-trip cleanly. No current
332
+ * executor returns a non-object `details`, so this never fires in practice.
333
+ * Future executors needing to return a primitive should wrap it
334
+ * (`details: { value: 42 }`) rather than relying on the discard.
335
+ */
336
+ function adaptExecutorResult(result) {
337
+ if (!result || typeof result !== "object")
338
+ return result;
339
+ const r = result;
340
+ if (!("details" in r))
341
+ return result;
342
+ const { details, ...rest } = r;
343
+ return isPlainObject(details) ? { ...rest, structuredContent: details } : rest;
344
+ }
345
+ /**
346
+ * Strict plain-object guard. True only for object literals and
347
+ * `Object.create(null)` — not for `Date`, `URL`, `Map`, `Set`, class instances,
348
+ * or arrays. Used to gate `structuredContent` forwarding so the MCP transport
349
+ * receives only true JSON objects (the protocol contract).
350
+ *
351
+ * Mirrored in `src/mcp-server.ts` for the agent-tool registry path's
352
+ * structured-content gate. Keep both copies in sync if the contract definition
353
+ * needs to evolve. See #4477 review.
354
+ */
355
+ function isPlainObject(value) {
356
+ if (value === null || typeof value !== "object")
357
+ return false;
358
+ if (Array.isArray(value))
359
+ return false;
360
+ const proto = Object.getPrototypeOf(value);
361
+ return proto === null || proto === Object.prototype;
362
+ }
316
363
  async function runSerializedWorkflowOperation(fn) {
317
364
  // The shared DB adapter and workflow log base path are process-global, so
318
365
  // workflow MCP mutations must not overlap within a single server process.
@@ -381,58 +428,50 @@ async function enforceWorkflowWriteGate(toolName, projectDir, milestoneId = null
381
428
  }
382
429
  async function handleTaskComplete(projectDir, args) {
383
430
  await enforceWorkflowWriteGate("gsd_task_complete", projectDir, args.milestoneId);
384
- const { taskId, sliceId, milestoneId, oneLiner, narrative, verification, deviations, knownIssues, keyFiles, keyDecisions, blockerDiscovered, verificationEvidence, } = args;
385
431
  const { executeTaskComplete } = await getWorkflowToolExecutors();
386
- return runSerializedWorkflowOperation(() => executeTaskComplete({
387
- taskId,
388
- sliceId,
389
- milestoneId,
390
- oneLiner,
391
- narrative,
392
- verification,
393
- deviations,
394
- knownIssues,
395
- keyFiles,
396
- keyDecisions,
397
- blockerDiscovered,
398
- verificationEvidence,
399
- }, projectDir));
432
+ // Pass `args` through directly rather than destructure-then-rebuild. The
433
+ // previous implementation re-listed each field, which silently dropped
434
+ // schema fields that weren't in the rebuild list (e.g., ADR-011's
435
+ // `escalation` payload). The destructure-then-rebuild pattern is the bug
436
+ // class; matching the spread shape used by sibling handlers (handleSliceComplete,
437
+ // handleReplanSlice) eliminates the recurrence risk by construction.
438
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeTaskComplete(args, projectDir)));
400
439
  }
401
440
  async function handleSliceComplete(projectDir, args) {
402
441
  await enforceWorkflowWriteGate("gsd_slice_complete", projectDir, args.milestoneId);
403
442
  const { executeSliceComplete } = await getWorkflowToolExecutors();
404
443
  const { projectDir: _projectDir, ...params } = args;
405
- return runSerializedWorkflowOperation(() => executeSliceComplete(params, projectDir));
444
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeSliceComplete(params, projectDir)));
406
445
  }
407
446
  async function handleReplanSlice(projectDir, args) {
408
447
  await enforceWorkflowWriteGate("gsd_replan_slice", projectDir, args.milestoneId);
409
448
  const { executeReplanSlice } = await getWorkflowToolExecutors();
410
449
  const { projectDir: _projectDir, ...params } = args;
411
- return runSerializedWorkflowOperation(() => executeReplanSlice(params, projectDir));
450
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeReplanSlice(params, projectDir)));
412
451
  }
413
452
  async function handleCompleteMilestone(projectDir, args) {
414
453
  await enforceWorkflowWriteGate("gsd_complete_milestone", projectDir, args.milestoneId);
415
454
  const { executeCompleteMilestone } = await getWorkflowToolExecutors();
416
455
  const { projectDir: _projectDir, ...params } = args;
417
- return runSerializedWorkflowOperation(() => executeCompleteMilestone(params, projectDir));
456
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeCompleteMilestone(params, projectDir)));
418
457
  }
419
458
  async function handleValidateMilestone(projectDir, args) {
420
459
  await enforceWorkflowWriteGate("gsd_validate_milestone", projectDir, args.milestoneId);
421
460
  const { executeValidateMilestone } = await getWorkflowToolExecutors();
422
461
  const { projectDir: _projectDir, ...params } = args;
423
- return runSerializedWorkflowOperation(() => executeValidateMilestone(params, projectDir));
462
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeValidateMilestone(params, projectDir)));
424
463
  }
425
464
  async function handleReassessRoadmap(projectDir, args) {
426
465
  await enforceWorkflowWriteGate("gsd_reassess_roadmap", projectDir, args.milestoneId);
427
466
  const { executeReassessRoadmap } = await getWorkflowToolExecutors();
428
467
  const { projectDir: _projectDir, ...params } = args;
429
- return runSerializedWorkflowOperation(() => executeReassessRoadmap(params, projectDir));
468
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeReassessRoadmap(params, projectDir)));
430
469
  }
431
470
  async function handleSaveGateResult(projectDir, args) {
432
471
  await enforceWorkflowWriteGate("gsd_save_gate_result", projectDir, args.milestoneId);
433
472
  const { executeSaveGateResult } = await getWorkflowToolExecutors();
434
473
  const { projectDir: _projectDir, ...params } = args;
435
- return runSerializedWorkflowOperation(() => executeSaveGateResult(params, projectDir));
474
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeSaveGateResult(params, projectDir)));
436
475
  }
437
476
  async function ensureMilestoneDbRow(milestoneId) {
438
477
  try {
@@ -921,14 +960,14 @@ export function registerWorkflowTools(server) {
921
960
  const { projectDir, ...params } = parsed;
922
961
  await enforceWorkflowWriteGate("gsd_plan_milestone", projectDir, params.milestoneId);
923
962
  const { executePlanMilestone } = await getWorkflowToolExecutors();
924
- return runSerializedWorkflowOperation(() => executePlanMilestone(params, projectDir));
963
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executePlanMilestone(params, projectDir)));
925
964
  });
926
965
  server.tool("gsd_plan_slice", "Write slice/task planning state to the GSD database and render plan artifacts from DB.", planSliceParams, async (args) => {
927
966
  const parsed = parseWorkflowArgs(planSliceSchema, args);
928
967
  const { projectDir, ...params } = parsed;
929
968
  await enforceWorkflowWriteGate("gsd_plan_slice", projectDir, params.milestoneId);
930
969
  const { executePlanSlice } = await getWorkflowToolExecutors();
931
- return runSerializedWorkflowOperation(() => executePlanSlice(params, projectDir));
970
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executePlanSlice(params, projectDir)));
932
971
  });
933
972
  server.tool("gsd_plan_task", "Write task planning state to the GSD database and render tasks/T##-PLAN.md from DB.", planTaskParams, async (args) => {
934
973
  const parsed = parseWorkflowArgs(planTaskSchema, args);
@@ -1037,7 +1076,7 @@ export function registerWorkflowTools(server) {
1037
1076
  if (!supportedArtifactTypes.includes(artifact_type)) {
1038
1077
  throw new Error(`artifact_type must be one of: ${supportedArtifactTypes.join(", ")}`);
1039
1078
  }
1040
- return runSerializedWorkflowOperation(() => executors.executeSummarySave({ milestone_id, slice_id, task_id, artifact_type, content }, projectDir));
1079
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executors.executeSummarySave({ milestone_id, slice_id, task_id, artifact_type, content }, projectDir)));
1041
1080
  });
1042
1081
  server.tool("gsd_task_complete", "Record a completed task to the GSD database and render its SUMMARY.md.", taskCompleteParams, async (args) => {
1043
1082
  const parsed = parseWorkflowArgs(taskCompleteSchema, args);
@@ -1055,7 +1094,7 @@ export function registerWorkflowTools(server) {
1055
1094
  // during pending-gate or queue-mode states.
1056
1095
  const { projectDir, milestoneId } = parseWorkflowArgs(milestoneStatusSchema, args);
1057
1096
  const { executeMilestoneStatus } = await getWorkflowToolExecutors();
1058
- return runSerializedWorkflowOperation(() => executeMilestoneStatus({ milestoneId }, projectDir));
1097
+ return adaptExecutorResult(await runSerializedWorkflowOperation(() => executeMilestoneStatus({ milestoneId }, projectDir)));
1059
1098
  });
1060
1099
  server.tool("gsd_journal_query", "Query the structured event journal for auto-mode iterations.", journalQueryParams, async (args) => {
1061
1100
  const { projectDir, limit, ...filters } = parseWorkflowArgs(journalQuerySchema, args);