gsd-pi 2.82.0 → 3.0.0

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 (555) hide show
  1. package/README.md +51 -32
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  8. package/dist/resources/extensions/cmux/index.js +5 -0
  9. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  10. package/dist/resources/extensions/gsd/auto/loop.js +19 -6
  11. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  12. package/dist/resources/extensions/gsd/auto/phases.js +90 -31
  13. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  16. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  17. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
  21. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  22. package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
  23. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  24. package/dist/resources/extensions/gsd/auto-verification.js +45 -26
  25. package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
  26. package/dist/resources/extensions/gsd/auto.js +178 -63
  27. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  28. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  29. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -2
  30. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
  33. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  34. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  36. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  37. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  38. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  39. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  40. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  41. package/dist/resources/extensions/gsd/context-store.js +112 -0
  42. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  43. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  44. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  45. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  47. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  48. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  50. package/dist/resources/extensions/gsd/doctor.js +2 -28
  51. package/dist/resources/extensions/gsd/export-html.js +27 -425
  52. package/dist/resources/extensions/gsd/forensics.js +3 -3
  53. package/dist/resources/extensions/gsd/git-service.js +45 -3
  54. package/dist/resources/extensions/gsd/gsd-db.js +21 -6
  55. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  56. package/dist/resources/extensions/gsd/guided-flow.js +101 -116
  57. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  59. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  60. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  61. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  62. package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
  63. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  64. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  65. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  66. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  67. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  68. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  69. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  70. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  74. package/dist/resources/extensions/gsd/paths.js +4 -0
  75. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  76. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  78. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  82. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  83. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  87. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  88. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  90. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  91. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  92. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  93. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  94. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  96. package/dist/resources/extensions/gsd/state.js +3 -3
  97. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  98. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  99. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  100. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  103. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  104. package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
  105. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  107. package/dist/resources/extensions/gsd/validation.js +23 -1
  108. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  109. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  110. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  111. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  112. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  113. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  114. package/dist/resources/extensions/shared/html-shell.js +388 -0
  115. package/dist/resources/extensions/subagent/index.js +448 -78
  116. package/dist/resources/extensions/subagent/launch.js +77 -0
  117. package/dist/resources/extensions/subagent/run-store.js +148 -0
  118. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  119. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  120. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  121. package/dist/resources/extensions/visual-brief/index.js +5 -0
  122. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  123. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  130. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/index.html +1 -1
  153. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  154. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  159. package/dist/web/standalone/.next/server/app/page.js +2 -2
  160. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  163. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  164. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  168. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  169. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  170. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  171. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  172. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  173. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  174. package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
  175. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  176. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  177. package/package.json +6 -5
  178. package/packages/contracts/dist/rpc.test.js +7 -0
  179. package/packages/contracts/dist/rpc.test.js.map +1 -1
  180. package/packages/contracts/dist/workflow.d.ts +21 -0
  181. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  182. package/packages/contracts/dist/workflow.js +24 -0
  183. package/packages/contracts/dist/workflow.js.map +1 -1
  184. package/packages/contracts/src/rpc.test.ts +8 -0
  185. package/packages/contracts/src/workflow.ts +24 -0
  186. package/packages/daemon/package.json +2 -2
  187. package/packages/mcp-server/README.md +14 -3
  188. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  189. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  190. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  191. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  192. package/packages/mcp-server/package.json +2 -2
  193. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  194. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  195. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  196. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  197. package/packages/native/package.json +1 -1
  198. package/packages/native/tsconfig.json +2 -1
  199. package/packages/native/tsconfig.tsbuildinfo +1 -1
  200. package/packages/pi-agent-core/package.json +1 -1
  201. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  202. package/packages/pi-ai/dist/index.d.ts +2 -2
  203. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  204. package/packages/pi-ai/dist/index.js +1 -1
  205. package/packages/pi-ai/dist/index.js.map +1 -1
  206. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  207. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  208. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  209. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  210. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  213. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  214. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  215. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  216. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  217. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  218. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  220. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  221. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  222. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  223. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  224. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  225. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  227. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  228. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  229. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  230. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  231. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  232. package/packages/pi-ai/package.json +1 -1
  233. package/packages/pi-ai/src/index.ts +7 -2
  234. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  235. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  236. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  238. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  239. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  240. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  251. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  253. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  259. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  265. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  267. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  268. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  269. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  270. package/packages/pi-coding-agent/package.json +1 -1
  271. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  272. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  273. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  274. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  275. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  276. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  277. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  278. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  279. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  280. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  281. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  282. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  283. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  284. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  285. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  286. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  287. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  288. package/packages/pi-tui/dist/terminal.js +12 -0
  289. package/packages/pi-tui/dist/terminal.js.map +1 -1
  290. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  291. package/packages/pi-tui/dist/tui.js +5 -0
  292. package/packages/pi-tui/dist/tui.js.map +1 -1
  293. package/packages/pi-tui/package.json +1 -1
  294. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  295. package/packages/pi-tui/src/terminal.ts +11 -0
  296. package/packages/pi-tui/src/tui.ts +6 -0
  297. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  298. package/packages/rpc-client/package.json +1 -1
  299. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  300. package/pkg/package.json +1 -1
  301. package/src/resources/GSD-WORKFLOW.md +10 -1
  302. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  303. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  304. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  305. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  306. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  307. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
  308. package/src/resources/extensions/cmux/index.ts +6 -0
  309. package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
  310. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  311. package/src/resources/extensions/gsd/auto/loop.ts +22 -6
  312. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  313. package/src/resources/extensions/gsd/auto/phases.ts +104 -38
  314. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  315. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  316. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  317. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  318. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  319. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  320. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  321. package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
  322. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  323. package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
  324. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  325. package/src/resources/extensions/gsd/auto-verification.ts +58 -36
  326. package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
  327. package/src/resources/extensions/gsd/auto.ts +187 -61
  328. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  329. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  330. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -2
  331. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  332. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  333. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
  334. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  335. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  336. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  337. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  338. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  339. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  340. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  341. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  342. package/src/resources/extensions/gsd/context-store.ts +120 -1
  343. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  344. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  345. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  346. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  347. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  348. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  349. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  350. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  351. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  352. package/src/resources/extensions/gsd/doctor.ts +2 -27
  353. package/src/resources/extensions/gsd/export-html.ts +27 -427
  354. package/src/resources/extensions/gsd/forensics.ts +3 -3
  355. package/src/resources/extensions/gsd/git-service.ts +51 -4
  356. package/src/resources/extensions/gsd/gsd-db.ts +21 -6
  357. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  358. package/src/resources/extensions/gsd/guided-flow.ts +134 -133
  359. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  360. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  361. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  362. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  363. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  364. package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
  365. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  366. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  367. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  368. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  369. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  370. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  371. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  372. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  373. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  374. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  375. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  376. package/src/resources/extensions/gsd/paths.ts +5 -0
  377. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  378. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  379. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  380. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  381. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  382. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  383. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  384. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  385. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  386. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  387. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  388. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  389. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  390. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  391. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  392. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  393. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  394. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  395. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  396. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  397. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  398. package/src/resources/extensions/gsd/state.ts +3 -3
  399. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  400. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  401. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  402. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  403. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  404. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  405. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -0
  406. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
  407. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  408. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  409. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  410. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
  411. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  412. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  413. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  414. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  415. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  416. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  417. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  418. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  419. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  420. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  421. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  422. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  423. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  424. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  425. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  426. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  427. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  428. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  429. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  430. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  431. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  432. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  433. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  434. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  435. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  436. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  437. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  438. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  439. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
  440. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  441. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  442. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  443. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  444. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  445. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  446. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  447. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  448. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  449. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  450. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  451. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  452. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  453. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
  454. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  455. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  456. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  457. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
  458. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  459. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  460. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  461. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  462. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  463. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  464. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  465. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  466. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  467. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  468. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  469. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  470. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  471. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  472. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  473. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  474. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  475. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  476. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
  477. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  478. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  479. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  480. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  481. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  482. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  483. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
  484. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  485. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  486. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  487. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  488. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  489. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  490. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  491. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  492. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  493. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  494. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  495. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  496. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  497. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  498. package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
  499. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  500. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  501. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
  502. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  503. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  504. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  505. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  506. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  507. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  508. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  509. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  510. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  511. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  512. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  513. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  514. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  515. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  516. package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
  517. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  518. package/src/resources/extensions/gsd/types.ts +1 -1
  519. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  520. package/src/resources/extensions/gsd/validation.ts +23 -1
  521. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  522. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  523. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  524. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  525. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  526. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  527. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  528. package/src/resources/extensions/shared/html-shell.ts +412 -0
  529. package/src/resources/extensions/subagent/index.ts +567 -103
  530. package/src/resources/extensions/subagent/launch.ts +131 -0
  531. package/src/resources/extensions/subagent/run-store.ts +218 -0
  532. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  533. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  534. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  535. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  536. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  537. package/src/resources/extensions/visual-brief/index.ts +8 -0
  538. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  539. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  540. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  541. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  542. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  544. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  546. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  547. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  548. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  549. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  550. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  551. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  552. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  553. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  554. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
  555. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd-build/mcp-server",
3
- "version": "2.82.0",
3
+ "version": "3.0.0",
4
4
  "description": "MCP server exposing GSD orchestration tools for Claude Code, Cursor, and other MCP clients",
5
5
  "license": "MIT",
6
6
  "gsd": {
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@gsd-build/contracts": "^2.80.0",
38
- "@gsd-build/rpc-client": "^2.82.0",
38
+ "@gsd-build/rpc-client": "^3.0.0",
39
39
  "@modelcontextprotocol/sdk": "^1.27.1",
40
40
  "zod": "^4.0.0"
41
41
  },
@@ -0,0 +1,244 @@
1
+ // ADR-008 validation criterion #3 — behavior-parity lock-in for gsd_task_complete.
2
+ //
3
+ // ADR-008 §1 ("One handler layer, multiple transports") is shipped: both
4
+ // native (`db-tools.ts`) and MCP (`workflow-tools.ts`) registrations wrap the
5
+ // same `executeTaskComplete` from `workflow-tool-executors.ts`. This test
6
+ // guards the equivalence so a future executor refactor cannot silently drift
7
+ // the two transports apart.
8
+ //
9
+ // Strategy: run the same completion against two equivalent fresh basePaths,
10
+ // one via the native path (direct call to the shared executor — which is
11
+ // faithfully what `db-tools.ts:670-674` does after `resolveCtxCwd`) and one
12
+ // via the MCP path (`registerWorkflowTools` + tool.handler). Snapshot DB row,
13
+ // summary file content, and journal events for each. Assert equivalence
14
+ // modulo expected diffs (timestamps).
15
+
16
+ import { describe, it } from "node:test";
17
+ import assert from "node:assert/strict";
18
+ import { mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from "node:fs";
19
+ import { join } from "node:path";
20
+ import { tmpdir } from "node:os";
21
+ import { randomUUID } from "node:crypto";
22
+
23
+ import {
24
+ closeDatabase,
25
+ getTask,
26
+ } from "../../../src/resources/extensions/gsd/gsd-db.ts";
27
+ import { executeTaskComplete } from "../../../src/resources/extensions/gsd/tools/workflow-tool-executors.ts";
28
+ import { registerWorkflowTools } from "./workflow-tools.ts";
29
+
30
+ function makeTmpBase(): string {
31
+ const base = join(tmpdir(), `gsd-mcp-parity-${randomUUID()}`);
32
+ mkdirSync(join(base, ".gsd"), { recursive: true });
33
+ return base;
34
+ }
35
+
36
+ function seedMilestoneAndSlice(base: string): void {
37
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
38
+ writeFileSync(
39
+ join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
40
+ "# S01\n\n- [ ] **T01: Demo** `est:5m`\n",
41
+ "utf-8",
42
+ );
43
+ }
44
+
45
+ function cleanup(base: string): void {
46
+ try {
47
+ closeDatabase();
48
+ } catch {
49
+ // swallow
50
+ }
51
+ try {
52
+ rmSync(base, { recursive: true, force: true });
53
+ } catch {
54
+ // swallow
55
+ }
56
+ }
57
+
58
+ function makeMockServer() {
59
+ const tools: Array<{
60
+ name: string;
61
+ handler: (args: Record<string, unknown>) => Promise<unknown>;
62
+ }> = [];
63
+ return {
64
+ tools,
65
+ tool(
66
+ name: string,
67
+ _description: string,
68
+ _params: Record<string, unknown>,
69
+ handler: (args: Record<string, unknown>) => Promise<unknown>,
70
+ ) {
71
+ tools.push({ name, handler });
72
+ },
73
+ };
74
+ }
75
+
76
+ interface SnapshotShape {
77
+ /** SUMMARY.md content, trimmed, with ISO timestamps replaced by a sentinel. */
78
+ summary: string;
79
+ /** Task row, with volatile fields (timestamps, derived ids) elided. */
80
+ taskRow: Record<string, unknown>;
81
+ /** Journal events for this completion, with timestamps and ids normalized. */
82
+ journalEvents: Array<{ cmd: string; params: Record<string, unknown>; actor: string }>;
83
+ }
84
+
85
+ const ISO_TIMESTAMP_RE = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z/g;
86
+
87
+ function normalizeTimestamps(text: string): string {
88
+ return text.replace(ISO_TIMESTAMP_RE, "<NORMALIZED-TS>");
89
+ }
90
+
91
+ function normalizeParams(params: Record<string, unknown>): Record<string, unknown> {
92
+ // Recursively replace ISO timestamps in any string value so the deep-equal
93
+ // doesn't fail on `ts`/`completed_at` style fields nested in the payload.
94
+ const out: Record<string, unknown> = {};
95
+ for (const [k, v] of Object.entries(params)) {
96
+ if (typeof v === "string") {
97
+ out[k] = normalizeTimestamps(v);
98
+ } else if (Array.isArray(v)) {
99
+ out[k] = v.map((item) =>
100
+ typeof item === "string"
101
+ ? normalizeTimestamps(item)
102
+ : item && typeof item === "object"
103
+ ? normalizeParams(item as Record<string, unknown>)
104
+ : item,
105
+ );
106
+ } else if (v !== null && typeof v === "object") {
107
+ out[k] = normalizeParams(v as Record<string, unknown>);
108
+ } else {
109
+ out[k] = v;
110
+ }
111
+ }
112
+ return out;
113
+ }
114
+
115
+ function snapshotState(base: string, milestoneId: string, sliceId: string, taskId: string): SnapshotShape {
116
+ const summaryPath = join(base, ".gsd", "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
117
+ assert.ok(existsSync(summaryPath), `summary file must exist at ${summaryPath}`);
118
+ const summary = normalizeTimestamps(readFileSync(summaryPath, "utf-8").trim());
119
+
120
+ const row = getTask(milestoneId, sliceId, taskId);
121
+ assert.ok(row, "task row must exist in DB after completion");
122
+ // Recursively normalize ISO timestamps in the row (the SQLite row uses
123
+ // snake_case `completed_at` and embeds another ISO timestamp inside the
124
+ // string field `full_summary_md`). Recursive normalization is simpler and
125
+ // more robust than maintaining an elision list.
126
+ const taskRow = normalizeParams(row as Record<string, unknown>);
127
+ assert.equal(taskRow.status, "complete", "task status must be 'complete' after completion");
128
+
129
+ const journalPath = join(base, ".gsd", "event-log.jsonl");
130
+ const journalEvents: SnapshotShape["journalEvents"] = [];
131
+ if (existsSync(journalPath)) {
132
+ const lines = readFileSync(journalPath, "utf-8")
133
+ .split("\n")
134
+ .filter((l) => l.length > 0);
135
+ for (const line of lines) {
136
+ try {
137
+ const evt = JSON.parse(line) as { cmd: string; params: Record<string, unknown>; actor: string };
138
+ if (evt.cmd === "complete-task" || evt.cmd === "complete_task") {
139
+ // Normalize cmd to canonical hyphen form, and elide ISO timestamps
140
+ // in the payload so the wall-clock skew between the two runs doesn't
141
+ // produce a spurious diff.
142
+ journalEvents.push({
143
+ cmd: "complete-task",
144
+ params: normalizeParams(evt.params),
145
+ actor: evt.actor,
146
+ });
147
+ }
148
+ } catch {
149
+ // Skip corrupted lines — non-fatal for parity comparison.
150
+ }
151
+ }
152
+ }
153
+
154
+ return { summary, taskRow, journalEvents };
155
+ }
156
+
157
+ const COMPLETION_ARGS = {
158
+ taskId: "T01",
159
+ sliceId: "S01",
160
+ milestoneId: "M001",
161
+ oneLiner: "Completed the demo task",
162
+ narrative: "Did the work described in the plan. Verified by running the test suite.",
163
+ verification: "npm test — all passing",
164
+ deviations: "None.",
165
+ knownIssues: "None.",
166
+ keyFiles: ["src/demo.ts"],
167
+ keyDecisions: ["Used Option A from the plan."],
168
+ };
169
+
170
+ describe("ADR-008 parity: gsd_task_complete native vs MCP", () => {
171
+ it("native and MCP produce equivalent DB row, summary, and journal event", async () => {
172
+ let baseNative = "";
173
+ let baseMcp = "";
174
+ try {
175
+ // ─── Native path ─────────────────────────────────────────────────
176
+ // The native wrapper in db-tools.ts:670-674 is:
177
+ // const taskCompleteExecute = async (_tcid, params, ...) => {
178
+ // const { executeTaskComplete } = await loadWorkflowExecutors();
179
+ // return executeTaskComplete(params, resolveCtxCwd(_ctx));
180
+ // };
181
+ // Calling executeTaskComplete directly with a basePath is the same
182
+ // post-resolution call shape.
183
+ baseNative = makeTmpBase();
184
+ seedMilestoneAndSlice(baseNative);
185
+ const nativeResult = await executeTaskComplete(COMPLETION_ARGS, baseNative);
186
+ assert.ok(!nativeResult.isError, "native completion must succeed");
187
+
188
+ const snapshotNative = snapshotState(baseNative, "M001", "S01", "T01");
189
+ closeDatabase();
190
+
191
+ // ─── MCP path ────────────────────────────────────────────────────
192
+ baseMcp = makeTmpBase();
193
+ seedMilestoneAndSlice(baseMcp);
194
+
195
+ const server = makeMockServer();
196
+ registerWorkflowTools(server as Parameters<typeof registerWorkflowTools>[0]);
197
+ const taskTool = server.tools.find((t) => t.name === "gsd_task_complete");
198
+ assert.ok(taskTool, "gsd_task_complete must be registered on the MCP surface");
199
+
200
+ const mcpResult = await taskTool.handler({ projectDir: baseMcp, ...COMPLETION_ARGS });
201
+ assert.ok(!mcpResult.isError, "mcp completion must succeed");
202
+
203
+ const snapshotMcp = snapshotState(baseMcp, "M001", "S01", "T01");
204
+
205
+ // ─── Compare ─────────────────────────────────────────────────────
206
+ assert.equal(
207
+ snapshotNative.summary,
208
+ snapshotMcp.summary,
209
+ "SUMMARY.md content must be byte-equal between native and MCP completions",
210
+ );
211
+
212
+ assert.deepEqual(
213
+ snapshotNative.taskRow,
214
+ snapshotMcp.taskRow,
215
+ "tasks DB row (modulo volatile timestamps and ids) must be equal",
216
+ );
217
+
218
+ // Journal event count must match (1 complete-task event per completion).
219
+ assert.equal(
220
+ snapshotNative.journalEvents.length,
221
+ snapshotMcp.journalEvents.length,
222
+ "both transports must emit the same number of complete-task journal events",
223
+ );
224
+
225
+ // Each journal event's params must match (these encode the completion
226
+ // payload; cmd is normalized and actor must align).
227
+ for (let i = 0; i < snapshotNative.journalEvents.length; i++) {
228
+ assert.equal(
229
+ snapshotNative.journalEvents[i].actor,
230
+ snapshotMcp.journalEvents[i].actor,
231
+ `journal event #${i} actor must match between native and MCP`,
232
+ );
233
+ assert.deepEqual(
234
+ snapshotNative.journalEvents[i].params,
235
+ snapshotMcp.journalEvents[i].params,
236
+ `journal event #${i} params must match between native and MCP`,
237
+ );
238
+ }
239
+ } finally {
240
+ if (baseNative) cleanup(baseNative);
241
+ if (baseMcp) cleanup(baseMcp);
242
+ }
243
+ });
244
+ });
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests packaged workflow tools exposed by the GSD MCP server.
3
+
1
4
  import { describe, it } from "node:test";
2
5
  import assert from "node:assert/strict";
3
6
  import { mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from "node:fs";
@@ -96,6 +99,22 @@ describe("workflow MCP tools", () => {
96
99
  assert.deepEqual(server.tools.map((t) => t.name), [...WORKFLOW_TOOL_NAMES]);
97
100
  });
98
101
 
102
+ it("registers task reopen in the workflow MCP tool surface", () => {
103
+ const server = makeMockServer();
104
+ registerWorkflowTools(server as any);
105
+
106
+ const toolNames = server.tools.map((t) => t.name);
107
+ assert.ok(toolNames.includes("gsd_task_reopen"));
108
+ assert.ok(toolNames.includes("gsd_reopen_task"));
109
+
110
+ const taskReopen = server.tools.find((t) => t.name === "gsd_task_reopen");
111
+ assert.ok(taskReopen);
112
+ assert.ok("milestoneId" in taskReopen.params);
113
+ assert.ok("sliceId" in taskReopen.params);
114
+ assert.ok("taskId" in taskReopen.params);
115
+ assert.ok("reason" in taskReopen.params);
116
+ });
117
+
99
118
  it("prefers source TypeScript before compiled dist fallbacks", () => {
100
119
  assert.deepEqual(
101
120
  _buildImportCandidates("../../../src/resources/extensions/gsd/tools/workflow-tool-executors.js"),
@@ -645,6 +664,9 @@ export const executeValidateMilestone = noop;
645
664
  export const executeReassessRoadmap = noop;
646
665
  export const executeSaveGateResult = noop;
647
666
  export const executeSummarySave = noop;
667
+ export const executeTaskReopen = noop;
668
+ export const executeSliceReopen = noop;
669
+ export const executeMilestoneReopen = noop;
648
670
 
649
671
  export const executeTaskComplete = async (params, projectDir) => {
650
672
  const capturePath = process.env.GSD_TEST_TASK_COMPLETE_CAPTURE_PATH;
@@ -820,7 +842,7 @@ export const executeTaskComplete = async (params, projectDir) => {
820
842
  estimate: "15m",
821
843
  files: ["src/resources/extensions/gsd/tools/workflow-tool-executors.ts"],
822
844
  verify: "node --test",
823
- inputs: ["ROADMAP.md"],
845
+ inputs: [".gsd/milestones/M001/M001-ROADMAP.md"],
824
846
  expectedOutput: ["S01-PLAN.md", "T01-PLAN.md"],
825
847
  },
826
848
  ],
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers packaged workflow tools exposed by the GSD MCP server.
3
+
1
4
  /**
2
5
  * Workflow MCP tools — exposes the core GSD mutation/read handlers over MCP.
3
6
  */
@@ -228,6 +231,36 @@ type WorkflowToolExecutors = {
228
231
  },
229
232
  basePath?: string,
230
233
  ) => Promise<unknown>;
234
+ executeTaskReopen: (
235
+ params: {
236
+ taskId: string;
237
+ sliceId: string;
238
+ milestoneId: string;
239
+ reason?: string;
240
+ actorName?: string;
241
+ triggerReason?: string;
242
+ },
243
+ basePath?: string,
244
+ ) => Promise<unknown>;
245
+ executeSliceReopen: (
246
+ params: {
247
+ sliceId: string;
248
+ milestoneId: string;
249
+ reason?: string;
250
+ actorName?: string;
251
+ triggerReason?: string;
252
+ },
253
+ basePath?: string,
254
+ ) => Promise<unknown>;
255
+ executeMilestoneReopen: (
256
+ params: {
257
+ milestoneId: string;
258
+ reason?: string;
259
+ actorName?: string;
260
+ triggerReason?: string;
261
+ },
262
+ basePath?: string,
263
+ ) => Promise<unknown>;
231
264
  };
232
265
 
233
266
  type WorkflowWriteGateModule = {
@@ -478,6 +511,9 @@ function isWorkflowToolExecutors(value: unknown): value is WorkflowToolExecutors
478
511
  "executeSaveGateResult",
479
512
  "executeSummarySave",
480
513
  "executeTaskComplete",
514
+ "executeTaskReopen",
515
+ "executeSliceReopen",
516
+ "executeMilestoneReopen",
481
517
  ];
482
518
 
483
519
  return Array.isArray(record.SUPPORTED_SUMMARY_ARTIFACT_TYPES) &&
@@ -835,6 +871,39 @@ async function handleTaskComplete(
835
871
  );
836
872
  }
837
873
 
874
+ async function handleTaskReopen(
875
+ projectDir: string,
876
+ args: Omit<z.infer<typeof taskReopenSchema>, "projectDir">,
877
+ ): Promise<unknown> {
878
+ await enforceWorkflowWriteGate("gsd_task_reopen", projectDir, args.milestoneId);
879
+ const { executeTaskReopen } = await getWorkflowToolExecutors();
880
+ return adaptExecutorResult(
881
+ await runSerializedWorkflowOperation(() => executeTaskReopen(args, projectDir)),
882
+ );
883
+ }
884
+
885
+ async function handleSliceReopen(
886
+ projectDir: string,
887
+ args: Omit<z.infer<typeof sliceReopenSchema>, "projectDir">,
888
+ ): Promise<unknown> {
889
+ await enforceWorkflowWriteGate("gsd_slice_reopen", projectDir, args.milestoneId);
890
+ const { executeSliceReopen } = await getWorkflowToolExecutors();
891
+ return adaptExecutorResult(
892
+ await runSerializedWorkflowOperation(() => executeSliceReopen(args, projectDir)),
893
+ );
894
+ }
895
+
896
+ async function handleMilestoneReopen(
897
+ projectDir: string,
898
+ args: Omit<z.infer<typeof milestoneReopenSchema>, "projectDir">,
899
+ ): Promise<unknown> {
900
+ await enforceWorkflowWriteGate("gsd_milestone_reopen", projectDir, args.milestoneId);
901
+ const { executeMilestoneReopen } = await getWorkflowToolExecutors();
902
+ return adaptExecutorResult(
903
+ await runSerializedWorkflowOperation(() => executeMilestoneReopen(args, projectDir)),
904
+ );
905
+ }
906
+
838
907
  async function handleSliceComplete(
839
908
  projectDir: string,
840
909
  args: z.infer<typeof sliceCompleteSchema>,
@@ -1384,6 +1453,36 @@ const taskCompleteParams = {
1384
1453
  };
1385
1454
  const taskCompleteSchema = z.object(taskCompleteParams);
1386
1455
 
1456
+ const taskReopenParams = {
1457
+ projectDir: projectDirParam,
1458
+ taskId: nonEmptyString("taskId").describe("Task ID (e.g. T01)"),
1459
+ sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
1460
+ milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
1461
+ reason: z.string().optional().describe("Why the task is being reopened"),
1462
+ actorName: z.string().optional().describe("Caller-provided actor identity for audit trail"),
1463
+ triggerReason: z.string().optional().describe("Caller-provided reason this action was triggered"),
1464
+ };
1465
+ const taskReopenSchema = z.object(taskReopenParams);
1466
+
1467
+ const sliceReopenParams = {
1468
+ projectDir: projectDirParam,
1469
+ sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
1470
+ milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
1471
+ reason: z.string().optional().describe("Why the slice is being reopened"),
1472
+ actorName: z.string().optional().describe("Caller-provided actor identity for audit trail"),
1473
+ triggerReason: z.string().optional().describe("Caller-provided reason this action was triggered"),
1474
+ };
1475
+ const sliceReopenSchema = z.object(sliceReopenParams);
1476
+
1477
+ const milestoneReopenParams = {
1478
+ projectDir: projectDirParam,
1479
+ milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
1480
+ reason: z.string().optional().describe("Why the milestone is being reopened"),
1481
+ actorName: z.string().optional().describe("Caller-provided actor identity for audit trail"),
1482
+ triggerReason: z.string().optional().describe("Caller-provided reason this action was triggered"),
1483
+ };
1484
+ const milestoneReopenSchema = z.object(milestoneReopenParams);
1485
+
1387
1486
  const milestoneStatusParams = {
1388
1487
  projectDir: projectDirParam,
1389
1488
  milestoneId: z.string().describe("Milestone ID to query (e.g. M001)"),
@@ -1851,6 +1950,75 @@ export function registerWorkflowTools(realServer: McpToolServer): void {
1851
1950
  },
1852
1951
  );
1853
1952
 
1953
+ server.tool(
1954
+ "gsd_task_reopen",
1955
+ "Reset a completed task back to pending so it can be re-done.",
1956
+ taskReopenParams,
1957
+ async (args: Record<string, unknown>) => {
1958
+ const parsed = parseWorkflowArgs(taskReopenSchema, args);
1959
+ const { projectDir, ...taskArgs } = parsed;
1960
+ return handleTaskReopen(projectDir, taskArgs);
1961
+ },
1962
+ );
1963
+
1964
+ server.tool(
1965
+ "gsd_reopen_task",
1966
+ "Alias for gsd_task_reopen. Reset a completed task back to pending so it can be re-done.",
1967
+ taskReopenParams,
1968
+ async (args: Record<string, unknown>) => {
1969
+ logAliasUsage("gsd_reopen_task", "gsd_task_reopen");
1970
+ const parsed = parseWorkflowArgs(taskReopenSchema, args);
1971
+ const { projectDir, ...taskArgs } = parsed;
1972
+ return handleTaskReopen(projectDir, taskArgs);
1973
+ },
1974
+ );
1975
+
1976
+ server.tool(
1977
+ "gsd_slice_reopen",
1978
+ "Reset a completed slice back to in_progress and reset its tasks to pending.",
1979
+ sliceReopenParams,
1980
+ async (args: Record<string, unknown>) => {
1981
+ const parsed = parseWorkflowArgs(sliceReopenSchema, args);
1982
+ const { projectDir, ...sliceArgs } = parsed;
1983
+ return handleSliceReopen(projectDir, sliceArgs);
1984
+ },
1985
+ );
1986
+
1987
+ server.tool(
1988
+ "gsd_reopen_slice",
1989
+ "Alias for gsd_slice_reopen. Reset a completed slice back to in_progress and reset its tasks to pending.",
1990
+ sliceReopenParams,
1991
+ async (args: Record<string, unknown>) => {
1992
+ logAliasUsage("gsd_reopen_slice", "gsd_slice_reopen");
1993
+ const parsed = parseWorkflowArgs(sliceReopenSchema, args);
1994
+ const { projectDir, ...sliceArgs } = parsed;
1995
+ return handleSliceReopen(projectDir, sliceArgs);
1996
+ },
1997
+ );
1998
+
1999
+ server.tool(
2000
+ "gsd_milestone_reopen",
2001
+ "Reset a closed milestone back to active and reset its slices/tasks for rework.",
2002
+ milestoneReopenParams,
2003
+ async (args: Record<string, unknown>) => {
2004
+ const parsed = parseWorkflowArgs(milestoneReopenSchema, args);
2005
+ const { projectDir, ...milestoneArgs } = parsed;
2006
+ return handleMilestoneReopen(projectDir, milestoneArgs);
2007
+ },
2008
+ );
2009
+
2010
+ server.tool(
2011
+ "gsd_reopen_milestone",
2012
+ "Alias for gsd_milestone_reopen. Reset a closed milestone back to active and reset its slices/tasks for rework.",
2013
+ milestoneReopenParams,
2014
+ async (args: Record<string, unknown>) => {
2015
+ logAliasUsage("gsd_reopen_milestone", "gsd_milestone_reopen");
2016
+ const parsed = parseWorkflowArgs(milestoneReopenSchema, args);
2017
+ const { projectDir, ...milestoneArgs } = parsed;
2018
+ return handleMilestoneReopen(projectDir, milestoneArgs);
2019
+ },
2020
+ );
2021
+
1854
2022
  server.tool(
1855
2023
  "gsd_milestone_status",
1856
2024
  "Read the current status of a milestone and all its slices from the GSD database.",