@opengsd/gsd-pi 1.0.2-dev.e70300c → 1.0.2-dev.fb7ddf1

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 (480) hide show
  1. package/README.md +63 -12
  2. package/dist/headless-answers.js +2 -1
  3. package/dist/headless-events.d.ts +1 -0
  4. package/dist/headless-events.js +8 -1
  5. package/dist/onboarding.js +22 -3
  6. package/dist/resource-loader.d.ts +7 -0
  7. package/dist/resource-loader.js +44 -9
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
  10. package/dist/resources/extensions/context7/index.js +12 -2
  11. package/dist/resources/extensions/get-secrets-from-user.js +16 -16
  12. package/dist/resources/extensions/google-cli/index.js +30 -0
  13. package/dist/resources/extensions/google-cli/models.js +55 -0
  14. package/dist/resources/extensions/google-cli/package.json +11 -0
  15. package/dist/resources/extensions/google-cli/readiness.js +12 -0
  16. package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +81 -1
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
  19. package/dist/resources/extensions/gsd/auto/phases.js +38 -1
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
  21. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
  23. package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
  24. package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
  25. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +232 -49
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
  28. package/dist/resources/extensions/gsd/auto-verification.js +14 -2
  29. package/dist/resources/extensions/gsd/auto-worktree.js +34 -1
  30. package/dist/resources/extensions/gsd/auto.js +40 -2
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
  32. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
  33. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
  36. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  38. package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
  40. package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
  41. package/dist/resources/extensions/gsd/commands-usage.js +105 -1
  42. package/dist/resources/extensions/gsd/config-overlay.js +20 -14
  43. package/dist/resources/extensions/gsd/context-overlay.js +22 -16
  44. package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
  45. package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
  46. package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
  47. package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
  48. package/dist/resources/extensions/gsd/doctor.js +7 -2
  49. package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
  50. package/dist/resources/extensions/gsd/guided-flow.js +5 -6
  51. package/dist/resources/extensions/gsd/key-manager.js +45 -13
  52. package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
  53. package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
  54. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
  55. package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
  56. package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
  57. package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
  58. package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
  59. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
  60. package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
  61. package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
  62. package/dist/resources/extensions/gsd/preferences.js +14 -2
  63. package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
  65. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  67. package/dist/resources/extensions/gsd/prompts/system.md +3 -20
  68. package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
  69. package/dist/resources/extensions/gsd/repo-identity.js +36 -6
  70. package/dist/resources/extensions/gsd/repository-registry.js +3 -1
  71. package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
  72. package/dist/resources/extensions/gsd/skill-activation.js +233 -0
  73. package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
  74. package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
  75. package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
  76. package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
  77. package/dist/resources/extensions/gsd/skill-scope.js +52 -0
  78. package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
  79. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  80. package/dist/resources/extensions/gsd/skills.js +60 -0
  81. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
  82. package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
  83. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
  84. package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
  85. package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
  86. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
  87. package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
  88. package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
  89. package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
  90. package/dist/resources/extensions/gsd/vision-ask.js +22 -0
  91. package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
  93. package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
  94. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  95. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  96. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  97. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  98. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  99. package/dist/resources/extensions/subagent/index.js +8 -15
  100. package/dist/resources/shared/package-manager-detection.js +36 -0
  101. package/dist/resources/skills/agent-browser/SKILL.md +1 -1
  102. package/dist/resources/skills/api-design/SKILL.md +1 -1
  103. package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
  104. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  105. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  106. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  107. package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  108. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  109. package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
  110. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  111. package/dist/resources/skills/forensics/SKILL.md +2 -2
  112. package/dist/resources/skills/grill-me/SKILL.md +1 -1
  113. package/dist/resources/skills/handoff/SKILL.md +1 -1
  114. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  115. package/dist/resources/skills/observability/SKILL.md +1 -1
  116. package/dist/resources/skills/security-review/SKILL.md +1 -1
  117. package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
  118. package/dist/resources/skills/tdd/SKILL.md +1 -1
  119. package/dist/resources/skills/write-docs/SKILL.md +1 -1
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
  121. package/dist/update-check.d.ts +6 -2
  122. package/dist/update-check.js +7 -3
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  125. package/dist/web/standalone/.next/build-manifest.json +2 -2
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/index.html +1 -1
  145. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  152. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  153. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  155. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  156. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  157. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  158. package/package.json +5 -2
  159. package/packages/cloud-mcp-gateway/package.json +2 -2
  160. package/packages/contracts/dist/rpc.test.js +5 -0
  161. package/packages/contracts/dist/rpc.test.js.map +1 -1
  162. package/packages/contracts/dist/workflow.d.ts +15 -0
  163. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  164. package/packages/contracts/dist/workflow.js +16 -0
  165. package/packages/contracts/dist/workflow.js.map +1 -1
  166. package/packages/contracts/dist/workflow.test.js +1 -0
  167. package/packages/contracts/dist/workflow.test.js.map +1 -1
  168. package/packages/contracts/package.json +1 -1
  169. package/packages/daemon/package.json +4 -4
  170. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  171. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  173. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  174. package/packages/gsd-agent-core/package.json +5 -5
  175. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  182. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  184. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  186. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  214. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  223. package/packages/gsd-agent-modes/package.json +7 -7
  224. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  225. package/packages/mcp-server/dist/server.js +7 -1
  226. package/packages/mcp-server/dist/server.js.map +1 -1
  227. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  228. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  229. package/packages/mcp-server/dist/workflow-tools.js +47 -8
  230. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  231. package/packages/mcp-server/package.json +3 -3
  232. package/packages/native/package.json +1 -1
  233. package/packages/pi-agent-core/dist/agent-loop.js +16 -14
  234. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  235. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  236. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  237. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  238. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  239. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  240. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  241. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  242. package/packages/pi-agent-core/package.json +1 -1
  243. package/packages/pi-ai/dist/models.generated.d.ts +48 -206
  244. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  245. package/packages/pi-ai/dist/models.generated.js +67 -220
  246. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  247. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  248. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  249. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  250. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  252. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  253. package/packages/pi-ai/dist/types.d.ts +2 -0
  254. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  255. package/packages/pi-ai/dist/types.js.map +1 -1
  256. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
  257. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
  258. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
  259. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
  261. package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
  262. package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
  263. package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
  264. package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
  265. package/packages/pi-ai/package.json +1 -1
  266. package/packages/pi-coding-agent/README.md +1 -1
  267. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  268. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  271. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  274. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  276. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  278. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
  281. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
  285. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
  288. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  289. package/packages/pi-coding-agent/package.json +8 -8
  290. package/packages/pi-tui/package.json +1 -1
  291. package/packages/rpc-client/package.json +2 -2
  292. package/pkg/package.json +1 -1
  293. package/scripts/install/detect-existing.js +17 -3
  294. package/scripts/install/npm-global.js +103 -33
  295. package/scripts/install.js +1 -0
  296. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
  297. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
  298. package/src/resources/extensions/context7/index.ts +15 -2
  299. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  300. package/src/resources/extensions/google-cli/index.ts +34 -0
  301. package/src/resources/extensions/google-cli/models.ts +57 -0
  302. package/src/resources/extensions/google-cli/package.json +11 -0
  303. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  304. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  305. package/src/resources/extensions/gsd/auto/loop.ts +96 -1
  306. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  307. package/src/resources/extensions/gsd/auto/phases.ts +47 -1
  308. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  309. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  310. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  311. package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
  312. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  313. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  314. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  315. package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
  316. package/src/resources/extensions/gsd/auto-verification.ts +18 -2
  317. package/src/resources/extensions/gsd/auto-worktree.ts +45 -1
  318. package/src/resources/extensions/gsd/auto.ts +50 -2
  319. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  320. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
  321. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  322. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
  323. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  324. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
  325. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  326. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  327. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  328. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  329. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  330. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  331. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  332. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  333. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  334. package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
  335. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  336. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  337. package/src/resources/extensions/gsd/doctor.ts +7 -2
  338. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  339. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  340. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  341. package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
  342. package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
  343. package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
  344. package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
  345. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  346. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  347. package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
  348. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  349. package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
  350. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  351. package/src/resources/extensions/gsd/preferences.ts +17 -2
  352. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  353. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  354. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  355. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  356. package/src/resources/extensions/gsd/prompts/system.md +3 -20
  357. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  358. package/src/resources/extensions/gsd/repo-identity.ts +35 -7
  359. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  360. package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
  361. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  362. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  363. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  364. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  365. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  366. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  367. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  368. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  369. package/src/resources/extensions/gsd/skills.ts +75 -0
  370. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  371. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  372. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  373. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  375. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
  376. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  377. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
  378. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  379. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
  380. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
  382. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  383. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  384. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  385. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  386. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  387. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
  388. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  389. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
  390. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  391. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  393. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  394. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
  395. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  396. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  397. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
  398. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  399. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
  400. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
  401. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
  402. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  403. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
  404. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
  405. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
  406. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  407. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  408. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  409. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
  410. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
  411. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
  412. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  413. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
  414. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  415. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  416. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
  417. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  418. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  419. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  420. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  421. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  422. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  423. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  424. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
  425. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  426. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  427. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  428. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  429. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  430. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  431. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  432. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
  433. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  434. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  435. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  436. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
  437. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  439. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  440. package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
  441. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  442. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  443. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  444. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  445. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  446. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  447. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  448. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
  449. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  450. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  451. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  452. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  453. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  454. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  455. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  456. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  457. package/src/resources/extensions/subagent/index.ts +8 -15
  458. package/src/resources/shared/package-manager-detection.ts +39 -0
  459. package/src/resources/skills/agent-browser/SKILL.md +1 -1
  460. package/src/resources/skills/api-design/SKILL.md +1 -1
  461. package/src/resources/skills/code-optimizer/SKILL.md +6 -11
  462. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  463. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  464. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  465. package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  466. package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  467. package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
  468. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  469. package/src/resources/skills/forensics/SKILL.md +2 -2
  470. package/src/resources/skills/grill-me/SKILL.md +1 -1
  471. package/src/resources/skills/handoff/SKILL.md +1 -1
  472. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  473. package/src/resources/skills/observability/SKILL.md +1 -1
  474. package/src/resources/skills/security-review/SKILL.md +1 -1
  475. package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
  476. package/src/resources/skills/tdd/SKILL.md +1 -1
  477. package/src/resources/skills/write-docs/SKILL.md +1 -1
  478. package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
  479. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
  480. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
@@ -117,18 +117,20 @@ export async function mergeCompletedMilestone(basePath, milestoneId) {
117
117
  // to read it from. Only use the worktree path when git actually knows
118
118
  // about it (`getAutoWorktreePath` returns non-null). When the directory
119
119
  // exists on disk but isn't a registered git worktree (e.g. a stale
120
- // session-status marker dir), fall back to the project root and let the
121
- // standalone's mode detection pick branch-mode or skipped using the
122
- // un-registered dir as `worktreeBasePath` would cause `getCurrentBranch`
123
- // to fail with a "Worktree HEAD diverged" error.
120
+ // session-status marker dir), recover through branch mode from the project
121
+ // root. Letting worktree-mode run from the project root can auto-commit
122
+ // overlapping root files to the integration branch before the squash merge,
123
+ // creating a synthetic conflict.
124
124
  const registeredWtPath = getAutoWorktreePath(basePath, milestoneId);
125
125
  const worktreeBasePath = registeredWtPath ?? basePath;
126
+ const isolationModeOverride = registeredWtPath ? undefined : "branch";
126
127
  let result;
127
128
  try {
128
129
  result = mergeMilestoneStandalone(buildWorktreeLifecycleDeps(), {
129
130
  originalBasePath: basePath,
130
131
  worktreeBasePath,
131
132
  milestoneId,
133
+ isolationModeOverride,
132
134
  // Parallel context never runs with degraded isolation — workers only
133
135
  // exist when isolation succeeded. Pass `false` explicitly so the
134
136
  // standalone's degraded-skip branch is not reached.
@@ -7,7 +7,7 @@ import { matchesKey, Key } from "@gsd/pi-tui";
7
7
  import { formatDuration } from "../shared/mod.js";
8
8
  import { formattedShortcutPair } from "./shortcut-defs.js";
9
9
  import { resolveGsdPathContract } from "./paths.js";
10
- import { renderBar, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
10
+ import { renderBar, renderDialogFrame, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
11
11
  // ─── Data Helpers ─────────────────────────────────────────────────────────
12
12
  function readJsonSafe(filePath) {
13
13
  try {
@@ -306,15 +306,14 @@ export class ParallelMonitorOverlay {
306
306
  const t = this.theme;
307
307
  const lines = [];
308
308
  const w = Math.max(1, width);
309
- // Header
309
+ const contentWidth = Math.max(1, w - 4);
310
310
  const totalCost = this.workers.reduce((s, wk) => s + wk.cost, 0);
311
311
  const aliveCount = this.workers.filter((wk) => wk.alive).length;
312
312
  const now = new Date().toLocaleTimeString();
313
- lines.push(t.bold(t.fg("accent", " GSD Parallel Monitor ")));
314
313
  lines.push(t.fg("muted", ` ${now} │ ${aliveCount}/${this.workers.length} alive │ Total: `) +
315
314
  t.bold(`$${totalCost.toFixed(2)}`) +
316
315
  t.fg("muted", " │ 5s refresh"));
317
- lines.push(renderBar(t, w));
316
+ lines.push(renderBar(t, contentWidth));
318
317
  if (this.workers.length === 0) {
319
318
  lines.push("");
320
319
  lines.push(t.fg("warning", " No parallel workers found."));
@@ -360,7 +359,7 @@ export class ParallelMonitorOverlay {
360
359
  });
361
360
  lines.push(` ${t.fg("muted", "slices")} ${chips.join(" ")}`);
362
361
  // Task progress bar
363
- const barWidth = Math.max(6, Math.min(25, w - 32));
362
+ const barWidth = Math.max(6, Math.min(25, contentWidth - 32));
364
363
  const bar = renderProgressBar(t, wk.doneTasks, wk.totalTasks, barWidth, {
365
364
  filledChar: "█",
366
365
  emptyChar: "░",
@@ -378,7 +377,7 @@ export class ParallelMonitorOverlay {
378
377
  }
379
378
  // Event feed
380
379
  lines.push("");
381
- lines.push(renderBar(t, w));
380
+ lines.push(renderBar(t, contentWidth));
382
381
  lines.push(` ${t.bold("Recent Events")}`);
383
382
  if (this.events.length === 0) {
384
383
  lines.push(t.fg("muted", " No events yet..."));
@@ -389,7 +388,6 @@ export class ParallelMonitorOverlay {
389
388
  lines.push(` ${t.fg("muted", "│")} ${t.fg("accent", mid)} ${evt.replace(/^✓ M\d+\//, "")}`);
390
389
  }
391
390
  }
392
- // Footer
393
391
  lines.push("");
394
392
  const allDone = this.workers.length > 0 && this.workers.every((wk) => !wk.alive);
395
393
  if (allDone) {
@@ -400,16 +398,20 @@ export class ParallelMonitorOverlay {
400
398
  }
401
399
  lines.push(` ${t.bold("Total: $" + this.workers.reduce((s, wk) => s + wk.cost, 0).toFixed(2))}`);
402
400
  }
403
- lines.push(renderKeyHints(t, [`ESC/q/${formattedShortcutPair("parallel")} close`, "↑↓ scroll"], w));
404
401
  // Apply scroll — use terminal rows as height estimate
405
402
  const termHeight = process.stdout.rows || 40;
406
- const maxScroll = Math.max(0, lines.length - termHeight);
403
+ const maxBodyRows = Math.max(1, Math.min(lines.length, termHeight - 12));
404
+ const maxScroll = Math.max(0, lines.length - maxBodyRows);
407
405
  this.scrollOffset = Math.min(Math.max(this.scrollOffset, 0), maxScroll);
408
406
  const visible = lines
409
- .slice(this.scrollOffset, this.scrollOffset + termHeight)
410
- .map((line) => safeLine(line, w));
411
- this.cachedLines = visible;
407
+ .slice(this.scrollOffset, this.scrollOffset + maxBodyRows)
408
+ .map((line) => safeLine(line, contentWidth));
409
+ const footer = renderKeyHints(t, [`ESC/q/${formattedShortcutPair("parallel")} close`, "↑↓ scroll"], contentWidth);
410
+ this.cachedLines = renderDialogFrame(t, "GSD Parallel Monitor", visible, w, {
411
+ footer,
412
+ scroll: { offset: this.scrollOffset, visibleRows: maxBodyRows, totalRows: lines.length },
413
+ });
412
414
  this.cachedWidth = width;
413
- return visible;
415
+ return this.cachedLines;
414
416
  }
415
417
  }
@@ -242,10 +242,11 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
242
242
  }
243
243
  const imports = extractRelativeImports(source);
244
244
  for (const { importPath, lineNum } of imports) {
245
- // React Router generated +types modules may not exist on disk during
246
- // post-exec checks (generated during framework build). Don't block task
247
- // completion on these imports.
248
- if (/^\.{1,2}\/\+types\//.test(importPath)) {
245
+ // Framework-generated type modules may not exist on disk during post-exec
246
+ // checks (typically generated during framework builds/typegen). Don't
247
+ // block task completion on these imports.
248
+ if (/^\.{1,2}\/\+types\//.test(importPath) ||
249
+ /^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath)) {
249
250
  continue;
250
251
  }
251
252
  const resolution = resolveImportPath(importPath, file, basePath);
@@ -11,10 +11,17 @@ import { gsdHome } from "./gsd-home.js";
11
11
  import { statSync } from "node:fs";
12
12
  import { validatePreferences } from "./preferences-validation.js";
13
13
  /**
14
- * Known skill directories, in priority order.
15
- * GSD bundled skills live in ~/.gsd/agent/skills/ and win name collisions.
16
- * User-global and project-local ecosystem directories remain available as
17
- * read-only discovery sources, followed by Claude Code compatibility paths.
14
+ * Known skill directories for **preference reference resolution** (bare skill names).
15
+ *
16
+ * Search order (first match wins):
17
+ * 1. ~/.gsd/agent/skills/ (GSD bundled)
18
+ * 2. ~/.agents/skills/ (ecosystem global)
19
+ * 3. .agents/skills/ (project ecosystem)
20
+ * 4. ~/.claude/skills/ and .claude/skills/ (Claude Code compatibility)
21
+ *
22
+ * Note: the ResourceLoader catalog uses PackageManager precedence instead —
23
+ * project `.gsd/skills` and `.agents/skills` can override bundled GSD skills
24
+ * on name collision. See docs/dev/what-is-pi/09-the-customization-stack.md.
18
25
  */
19
26
  export function getSkillSearchDirs(cwd) {
20
27
  const dirs = [
@@ -455,9 +455,10 @@ function mergePreDispatchHooks(base, override) {
455
455
  return merged.length > 0 ? merged : undefined;
456
456
  }
457
457
  // ─── System Prompt Rendering ──────────────────────────────────────────────────
458
- export function renderPreferencesForSystemPrompt(preferences, resolutions) {
458
+ export function renderPreferencesForSystemPrompt(preferences, resolutions, options) {
459
459
  const validated = validatePreferences(preferences);
460
460
  const lines = ["## GSD Skill Preferences"];
461
+ const includeResolvedPaths = options?.includeResolvedPaths ?? true;
461
462
  if (validated.errors.length > 0) {
462
463
  lines.push("- Validation: some preference values were ignored because they were invalid.");
463
464
  }
@@ -466,7 +467,18 @@ export function renderPreferencesForSystemPrompt(preferences, resolutions) {
466
467
  }
467
468
  preferences = validated.preferences;
468
469
  lines.push("- Treat these as explicit skill-selection policy for GSD work.", "- If a listed skill exists and is relevant, load and follow it instead of treating it as a vague suggestion.", "- Current user instructions still override these defaults.");
469
- const fmt = (ref) => resolutions ? formatSkillRef(ref, resolutions) : ref;
470
+ const fmt = (ref) => {
471
+ if (!resolutions)
472
+ return ref;
473
+ if (!includeResolvedPaths) {
474
+ const resolution = resolutions.get(ref);
475
+ if (!resolution || resolution.method === "unresolved") {
476
+ return `${ref} (⚠ not found — check skill name or path)`;
477
+ }
478
+ return ref;
479
+ }
480
+ return formatSkillRef(ref, resolutions);
481
+ };
470
482
  if (preferences.always_use_skills && preferences.always_use_skills.length > 0) {
471
483
  lines.push("- Always use these skills when relevant:");
472
484
  for (const skill of preferences.always_use_skills) {
@@ -21,6 +21,7 @@ import { join, dirname } from "node:path";
21
21
  import { fileURLToPath } from "node:url";
22
22
  import { logWarning } from "./workflow-logger.js";
23
23
  import { gsdHome } from "./gsd-home.js";
24
+ import { chooseVisionAskVariant } from "./vision-ask.js";
24
25
  function hasRequiredExtensionAssets(rootDir, exists = existsSync) {
25
26
  return (exists(join(rootDir, "prompts")) &&
26
27
  exists(join(rootDir, "templates", "task-summary.md")));
@@ -168,6 +169,7 @@ export function loadPrompt(name, vars = {}) {
168
169
  planTemplatePath: join(getTemplatesDir(), "plan.md"),
169
170
  taskPlanTemplatePath: join(getTemplatesDir(), "task-plan.md"),
170
171
  taskSummaryTemplatePath: join(getTemplatesDir(), "task-summary.md"),
172
+ visionAsk: chooseVisionAskVariant(),
171
173
  skillActivation: "If a `GSD Skill Preferences` block is present in system context, use it and the `<available_skills>` catalog in your system prompt to decide which skills to load and follow for this unit, without relaxing required verification or artifact rules.",
172
174
  ...vars,
173
175
  };
@@ -1,8 +1,10 @@
1
1
  {{preamble}}
2
2
 
3
- Ask: "What's the vision?" once, then use the reply as vision input.
3
+ Ask exactly this once: "{{visionAsk}}" Then use the user's reply as vision input.
4
4
 
5
- **Special handling:** If the **user's** message is status, branch state, clarification, or any other non-project-description, treat it as vision input and proceed instead of repeating "What's the vision?" Do **not** treat the system preamble above (e.g. "New milestone M00X.") as vision input — wait for the user.
5
+ The opener is intentionally variable so GSD feels alive across project starts. Keep it natural, easy to answer, and assistant/developer shaped: plain language, light guidance, no corporate wording, no roleplay.
6
+
7
+ **Special handling:** If the **user's** message is status, branch state, clarification, or any other non-project-description, treat it as vision input and proceed instead of repeating the opener. Do **not** treat the system preamble above (e.g. "New milestone M00X.") as vision input — wait for the user.
6
8
 
7
9
  ## Reflection Step
8
10
 
@@ -35,7 +35,7 @@ You are evaluating **quality gates in parallel** for this slice. Each gate is an
35
35
  2. **Wait for all subagents** to complete.
36
36
  3. **Verify each gate wrote its result** by checking that `gsd_save_gate_result` was called for each gate ID.
37
37
  - Call it **directly** — do **not** use `ToolSearch` (it is not available in GSD).
38
- - Inside Claude Code use `mcp__gsd-workflow__gsd_save_gate_result`; otherwise use `gsd_save_gate_result`.
38
+ - Inside Claude Code use the active MCP-scoped workflow name for `gsd_save_gate_result`; otherwise use `gsd_save_gate_result`.
39
39
  - Always pass all required fields (camelCase): `milestoneId`, `sliceId`, `gateId`, `verdict`, `rationale`. Never call with an empty `{}` object.
40
40
  4. **Report the batch outcome** — which gates passed, which flagged concerns, and which were omitted as not applicable.
41
41
 
@@ -4,6 +4,8 @@ Discuss milestone {{milestoneId}} ("{{milestoneTitle}}"). Identify real gray are
4
4
 
5
5
  **Structured questions available: {{structuredQuestionsAvailable}}**
6
6
 
7
+ **Conversation opener:** For the first user-facing question round, if you need a broad starting question, use: "{{visionAsk}}" Pair it with investigation-shaped follow-ups. Keep the tone natural and easy to answer, like an assistant/developer helping the user shape the next piece of work.
8
+
7
9
  {{inlinedTemplates}}
8
10
 
9
11
  ---
@@ -19,9 +19,7 @@ Leave the project ready for the next agent to understand and continue. Artifacts
19
19
 
20
20
  ## Skills
21
21
 
22
- GSD ships with bundled skills. When the task matches, load the relevant skill file with `read` before starting. Use bare skill names; GSD resolves paths.
23
-
24
- {{bundledSkillsTable}}
22
+ GSD ships with bundled skills. Installed skills are listed in `<available_skills>` in your system prompt — load the relevant skill file with `read` using the path shown there before starting matching work. Use bare skill names in preferences; GSD resolves paths.
25
23
 
26
24
  ## Hard Rules
27
25
 
@@ -122,18 +120,7 @@ Templates are in `{{templatesDir}}`.
122
120
 
123
121
  **Browser verification:** Verify frontend work against a running app. Discovery: `browser_find`/`browser_snapshot_refs`. Action: refs/selectors -> `browser_batch`. Verification: `browser_assert`. Diagnostics: `browser_diff` -> console/network logs -> full inspection as last resort. Retry only with a new hypothesis.
124
122
 
125
- ### Anti-patterns never do these
126
-
127
- - Never use `cat` to read a file you might edit; use `read`.
128
- - Never `grep` for a function definition when `lsp` go-to-definition is available.
129
- - Never poll servers with `sleep` loops; use `bg_shell wait_for_ready`.
130
- - Never background with `bash` + `&`; use `bg_shell start`.
131
- - Never use `bg_shell output` for status; use `digest`.
132
- - Never read files one-by-one to understand a subsystem; use `rg` or `scout` first.
133
- - Never guess library APIs; use `get_library_docs`.
134
- - Never ask the user to run/check/set something you can do.
135
- - Never await stale async jobs after editing source; cancel then re-run.
136
- - Never query `.gsd/gsd.db` directly via `sqlite3`, `better-sqlite3`, or `node -e require('better-sqlite3')`; the engine owns a single-writer WAL connection. Use `gsd_milestone_status`, `gsd_journal_query`, or other `gsd_*` tools.
123
+ **Database:** Never query `.gsd/gsd.db` directly via `sqlite3`, `better-sqlite3`, or `node -e require('better-sqlite3')`; the engine owns a single-writer WAL connection. Use `gsd_milestone_status`, `gsd_journal_query`, or other `gsd_*` tools.
137
124
 
138
125
  ### Ask vs infer
139
126
 
@@ -173,8 +160,4 @@ Fix root causes, not symptoms. If applying temporary mitigation, label it and pr
173
160
  - When debugging, stay curious. Problems are puzzles. Say what's interesting about the failure before reaching for fixes.
174
161
  - After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats.
175
162
 
176
- Good narration: "Three existing handlers follow a middleware pattern - using that instead of a custom wrapper."
177
- Good narration: "Tests pass. Running slice-level verification."
178
- Good narration: "I need the task-plan template first, then I'll compare the existing T01 and T02 plans."
179
- Bad narration: "Reading the file now." / "Let me check this." / "I'll look at the tests next."
180
- Bad narration: "Need create plan artifact likely requires template maybe read existing task plans."
163
+ Good narration states a decision or finding: "Three handlers follow a middleware pattern - using that instead of a custom wrapper." Bad narration just announces the next call ("Reading the file now.") or emits compressed planner notes ("Need create plan artifact maybe read existing plans.").
@@ -8,9 +8,9 @@
8
8
  * Conflicting depends_on entries are auto-removed on confirm.
9
9
  */
10
10
  import { Key, matchesKey, truncateToWidth } from "@gsd/pi-tui";
11
- import { makeUI } from "../shared/tui.js";
12
11
  import { GLYPH } from "../shared/mod.js";
13
12
  import { validateQueueOrder } from "./queue-order.js";
13
+ import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
14
14
  /**
15
15
  * Show the queue reorder overlay.
16
16
  * Returns the new order + deps to remove, or null if cancelled.
@@ -26,6 +26,7 @@ export async function showQueueReorder(ctx, completed, pending) {
26
26
  let grabbed = false;
27
27
  let scrollOffset = 0;
28
28
  let cachedLines;
29
+ let cachedWidth;
29
30
  let validation;
30
31
  // Mutable deps map — tracks removals during this session
31
32
  const liveDeps = new Map();
@@ -42,6 +43,7 @@ export async function showQueueReorder(ctx, completed, pending) {
42
43
  revalidate();
43
44
  function refresh() {
44
45
  cachedLines = undefined;
46
+ cachedWidth = undefined;
45
47
  tui.requestRender();
46
48
  }
47
49
  function swapItems(fromIdx, toIdx) {
@@ -125,17 +127,14 @@ export async function showQueueReorder(ctx, completed, pending) {
125
127
  }
126
128
  }
127
129
  function render(width) {
128
- if (cachedLines)
130
+ if (cachedLines && cachedWidth === width)
129
131
  return cachedLines;
130
- const ui = makeUI(theme, width);
132
+ const contentWidth = Math.max(1, width - 4);
131
133
  const lines = [];
132
134
  const queueRows = [];
133
- const push = (...rows) => { for (const r of rows)
134
- lines.push(...r); };
135
- const add = (s) => truncateToWidth(s, width);
135
+ const add = (s) => truncateToWidth(s, contentWidth);
136
136
  let cursorQueueRow = 0;
137
- const headerText = grabbed ? " Queue Reorder Moving Item" : " Queue Reorder";
138
- push(ui.bar(), ui.blank(), ui.header(headerText), ui.blank());
137
+ const headerText = grabbed ? "Queue Reorder - Moving Item" : "Queue Reorder";
139
138
  // Completed milestones (dimmed)
140
139
  if (completed.length > 0) {
141
140
  lines.push(add(theme.fg("dim", " Completed:")));
@@ -143,7 +142,7 @@ export async function showQueueReorder(ctx, completed, pending) {
143
142
  const label = m.title && m.title !== m.id ? `${m.id} ${m.title}` : m.id;
144
143
  lines.push(add(` ${theme.fg("dim", `${GLYPH.statusDone} ${label}`)}`));
145
144
  }
146
- push(ui.blank());
145
+ lines.push("");
147
146
  }
148
147
  // Pending milestones
149
148
  const queueLabel = grabbed ? " Queue (space to release, ↑/↓ to move):" : " Queue (space to grab, ↑/↓ to navigate):";
@@ -190,7 +189,7 @@ export async function showQueueReorder(ctx, completed, pending) {
190
189
  // Removed deps feedback
191
190
  const trailingLines = [];
192
191
  if (removedDeps.length > 0) {
193
- trailingLines.push(...ui.blank());
192
+ trailingLines.push("");
194
193
  for (const r of removedDeps) {
195
194
  trailingLines.push(add(` ${theme.fg("success", `${GLYPH.statusDone} Removed: ${r.milestone} depends_on ${r.dep}`)}`));
196
195
  }
@@ -198,10 +197,9 @@ export async function showQueueReorder(ctx, completed, pending) {
198
197
  // Circular warning
199
198
  const circ = validation.violations.find(v => v.type === 'circular');
200
199
  if (circ) {
201
- trailingLines.push(...ui.blank());
200
+ trailingLines.push("");
202
201
  trailingLines.push(add(` ${theme.fg("error", `${GLYPH.statusWarning} ${circ.message}`)}`));
203
202
  }
204
- trailingLines.push(...ui.blank());
205
203
  // Hints — context-sensitive based on grab state
206
204
  const hints = [];
207
205
  if (grabbed) {
@@ -221,9 +219,9 @@ export async function showQueueReorder(ctx, completed, pending) {
221
219
  hints.push("enter ok");
222
220
  }
223
221
  hints.push("esc");
224
- trailingLines.push(...ui.hints(hints), ...ui.bar());
225
222
  const maxOverlayRows = Math.max(10, process.stdout.rows ? Math.floor(process.stdout.rows * 0.8) : 24);
226
- const availableQueueRows = Math.max(1, maxOverlayRows - lines.length - trailingLines.length);
223
+ const frameRows = 4;
224
+ const availableQueueRows = Math.max(1, maxOverlayRows - frameRows - lines.length - trailingLines.length);
227
225
  const maxScroll = Math.max(0, queueRows.length - availableQueueRows);
228
226
  if (cursorQueueRow < scrollOffset) {
229
227
  scrollOffset = cursorQueueRow;
@@ -232,11 +230,23 @@ export async function showQueueReorder(ctx, completed, pending) {
232
230
  scrollOffset = cursorQueueRow - availableQueueRows + 1;
233
231
  }
234
232
  scrollOffset = Math.min(Math.max(scrollOffset, 0), maxScroll);
235
- lines.push(...queueRows.slice(scrollOffset, scrollOffset + availableQueueRows), ...trailingLines);
236
- cachedLines = lines;
237
- return lines;
233
+ const queueStartRow = lines.length;
234
+ const visibleQueueRows = queueRows.slice(scrollOffset, scrollOffset + availableQueueRows);
235
+ lines.push(...visibleQueueRows, ...trailingLines);
236
+ cachedLines = renderDialogFrame(theme, headerText, lines, width, {
237
+ footer: renderKeyHints(theme, hints, contentWidth),
238
+ scroll: {
239
+ offset: scrollOffset,
240
+ visibleRows: availableQueueRows,
241
+ totalRows: queueRows.length,
242
+ trackOffset: queueStartRow,
243
+ trackRows: visibleQueueRows.length,
244
+ },
245
+ });
246
+ cachedWidth = width;
247
+ return cachedLines;
238
248
  }
239
- return { render, invalidate: () => { cachedLines = undefined; }, handleInput };
249
+ return { render, invalidate: () => { cachedLines = undefined; cachedWidth = undefined; }, handleInput };
240
250
  }, {
241
251
  overlay: true,
242
252
  overlayOptions: { width: "70%", minWidth: 50, maxHeight: "80%", anchor: "center" },
@@ -11,6 +11,7 @@ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, re
11
11
  import { basename, dirname, join, resolve } from "node:path";
12
12
  import { gsdHome } from "./gsd-home.js";
13
13
  import { isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveExternalStateProjectIdentityFromWorktreePath, } from "./worktree-root.js";
14
+ import { logWarning } from "./workflow-logger.js";
14
15
  function isRepoMeta(value) {
15
16
  if (!value || typeof value !== "object")
16
17
  return false;
@@ -167,7 +168,9 @@ function isProjectGsd(gsdPath) {
167
168
  }
168
169
  // ─── Repo Identity ──────────────────────────────────────────────────────────
169
170
  /**
170
- * Get the git remote URL for "origin", or "" if no remote is configured.
171
+ * Get the git remote URL for "origin", or:
172
+ * - "" when git cleanly reports no remote
173
+ * - null when git command failed (transient/unknown)
171
174
  * Uses `git config` rather than `git remote get-url` for broader compat.
172
175
  */
173
176
  function getRemoteUrl(basePath) {
@@ -179,8 +182,25 @@ function getRemoteUrl(basePath) {
179
182
  timeout: 5_000,
180
183
  }).trim();
181
184
  }
182
- catch {
183
- return "";
185
+ catch (error) {
186
+ const status = typeof error === "object" && error !== null && "status" in error
187
+ ? error.status
188
+ : undefined;
189
+ if (status === 1) {
190
+ try {
191
+ if (existsSync(join(resolveGitCommonDir(basePath), "config")))
192
+ return "";
193
+ }
194
+ catch {
195
+ // Fall through to report unknown git/config failures.
196
+ }
197
+ }
198
+ // Keep transient git failures distinct from "no remote configured".
199
+ logWarning("state", "repo-identity: failed to resolve remote.origin.url", {
200
+ basePath,
201
+ error: String(error),
202
+ });
203
+ return null;
184
204
  }
185
205
  }
186
206
  /**
@@ -275,6 +295,16 @@ export function repoIdentity(basePath) {
275
295
  // This makes moves transparent for repos with remotes (#2750).
276
296
  return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
277
297
  }
298
+ if (remoteUrl === null) {
299
+ // Unknown remote status (transient git failure): prefer persisted identity.
300
+ const markerRoot = resolveGitRoot(basePath);
301
+ const markerId = readGsdIdMarker(markerRoot);
302
+ if (markerId) {
303
+ const markerPath = join(process.env.GSD_STATE_DIR || gsdHome(), "projects", markerId);
304
+ if (hasProjectState(markerPath) || readRepoMeta(markerPath))
305
+ return markerId;
306
+ }
307
+ }
278
308
  // Local-only repo: include git root since there's no remote to anchor identity.
279
309
  const root = resolveGitRoot(basePath);
280
310
  const input = `\n${root}`;
@@ -288,8 +318,7 @@ export function repoIdentity(basePath) {
288
318
  * otherwise `~/.gsd/projects/<hash>`.
289
319
  */
290
320
  export function externalGsdRoot(basePath) {
291
- const base = process.env.GSD_STATE_DIR || gsdHome();
292
- return join(base, "projects", repoIdentity(basePath));
321
+ return resolveExternalPathWithRecovery(basePath).path;
293
322
  }
294
323
  /**
295
324
  * Resolve the root directory that stores project-scoped external state.
@@ -467,6 +496,7 @@ function resolveExternalPathWithRecovery(projectPath) {
467
496
  rmSync(markerPath, { recursive: true, force: true });
468
497
  }
469
498
  catch { /* non-fatal */ }
499
+ writeGsdIdMarker(projectPath, computedId);
470
500
  }
471
501
  catch {
472
502
  // If migration fails, just point at the old directory.
@@ -565,7 +595,7 @@ function ensureGsdSymlinkCore(projectPath) {
565
595
  // Write repo metadata once so cleanup commands can identify this directory later.
566
596
  // Skip refresh for external-state worktrees — parent store already has metadata.
567
597
  if (!(isGsdWorktreePath(projectPath) && resolveExternalStateProjectGsdFromWorktreePath(projectPath))) {
568
- writeRepoMeta(externalPath, getRemoteUrl(projectPath), resolveGitRoot(projectPath));
598
+ writeRepoMeta(externalPath, getRemoteUrl(projectPath) ?? "", resolveGitRoot(projectPath));
569
599
  }
570
600
  const replaceWithSymlink = () => {
571
601
  rmSync(localGsd, { recursive: true, force: true });
@@ -50,7 +50,9 @@ function resolveGitWorkingTreeRoot(basePath) {
50
50
  */
51
51
  export function createRepositoryRegistry(basePath, workspacePrefs) {
52
52
  const contract = resolveGsdPathContract(basePath);
53
- const projectRoot = resolveGitWorkingTreeRoot(contract.workRoot) ?? contract.projectRoot;
53
+ const projectRoot = contract.isWorktree
54
+ ? resolveGitWorkingTreeRoot(contract.workRoot) ?? contract.projectRoot
55
+ : contract.projectRoot;
54
56
  const mode = workspacePrefs?.mode ?? "project";
55
57
  const repoMap = new Map();
56
58
  // "project" is reserved: always maps to projectRoot and cannot be overridden.
@@ -15,15 +15,15 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkS
15
15
  import { join, dirname } from "node:path";
16
16
  import { randomBytes } from "node:crypto";
17
17
  const EXECUTION_TOOL_NAMES = new Set([
18
- "bash",
19
- "Bash",
20
- "PowerShell",
21
18
  "async_bash",
19
+ "bash",
20
+ "exec_command",
21
+ "functions.exec_command",
22
22
  "gsd_exec",
23
23
  "gsd_exec_search",
24
- "mcp__gsd-workflow__gsd_exec",
25
- "mcp__gsd-workflow__gsd_exec_search",
24
+ "powershell",
26
25
  ]);
26
+ const MCP_EXECUTION_TOOL_RE = /^mcp__.+__gsd_exec(?:_search)?$/;
27
27
  // ─── Module State ───────────────────────────────────────────────────────────
28
28
  let unitEvidence = [];
29
29
  // ─── Public API ─────────────────────────────────────────────────────────────
@@ -45,6 +45,13 @@ export function getFilePaths() {
45
45
  .filter((e) => e.kind === "write" || e.kind === "edit")
46
46
  .map(e => e.path);
47
47
  }
48
+ /** True when a tool name represents a shell/command execution surface. */
49
+ export function isExecutionToolName(name) {
50
+ if (typeof name !== "string")
51
+ return false;
52
+ const normalized = name.trim().toLowerCase();
53
+ return EXECUTION_TOOL_NAMES.has(normalized) || MCP_EXECUTION_TOOL_RE.test(normalized);
54
+ }
48
55
  // ─── Persistence (Bug #4385 — evidence must survive session restarts) ────────
49
56
  /**
50
57
  * Build the path for the evidence JSON file for a given unit.
@@ -139,7 +146,7 @@ export function clearEvidenceFromDisk(basePath, milestoneId, sliceId, taskId) {
139
146
  * Exit codes and output are filled in by recordToolResult after execution.
140
147
  */
141
148
  export function recordToolCall(toolCallId, toolName, input) {
142
- if (EXECUTION_TOOL_NAMES.has(toolName)) {
149
+ if (isExecutionToolName(toolName)) {
143
150
  unitEvidence.push({
144
151
  kind: "bash",
145
152
  toolCallId,