@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  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.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -1,797 +0,0 @@
1
- // PROTOTYPE — throwaway design explorations for chat/tool transcript layout.
2
- // Run: npm run prototype:tui-design [-- all|<id>]
3
- import { alignRight, padRight, style, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
4
- import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
5
- import { buildTreePrefix } from "../tree-render-utils.js";
6
- import { DENSITY_VARIANTS, getVariant as getDensityVariant, lineStats, renderSampleTranscript as renderDensitySample, } from "./transcript-density-prototype.js";
7
- export { lineStats };
8
- // ── Shared sample data (mirrors real session flow) ──────────────────────────
9
- const USER_TEXT = "tighten up the tool cards in the transcript";
10
- const USER_LABEL = "YOU";
11
- function headerLabel(text) {
12
- return text.toUpperCase();
13
- }
14
- function styledHeader(text, color = "borderAccent") {
15
- return theme.fg(color, theme.bold(headerLabel(text)));
16
- }
17
- const ASSISTANT_TEXT = "I'll kill the background servers and checkpoint the database before saving the assessment summary.";
18
- const COLLAPSED_TOOLS = [
19
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
20
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
21
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
22
- ];
23
- /** Post-assistant work sequence — used for connector prototypes. */
24
- const SHELL_WORK = [
25
- ...COLLAPSED_TOOLS.map((t) => ({
26
- kind: "rule",
27
- title: t.title,
28
- target: t.target,
29
- status: t.status,
30
- tone: "success",
31
- })),
32
- {
33
- kind: "expanded",
34
- title: "Background Shell",
35
- command: "bg_shell kill [87ad363a]",
36
- result: "Killed 87ad363a python3 -m http.server 3005",
37
- status: "success · 340ms",
38
- tone: "success",
39
- },
40
- ];
41
- const FINALIZE_WORK = [
42
- {
43
- kind: "rule",
44
- title: "Save Summary",
45
- target: "summary_save ASSESSMENT M002/S02",
46
- status: "success · 120ms",
47
- tone: "success",
48
- },
49
- {
50
- kind: "body",
51
- title: "Checkpoint GSD Database",
52
- lines: [
53
- "WAL checkpoint complete — database is safe to stage with git.",
54
- "Checkpoint at .planning/state/gsd.sqlite-wal",
55
- ],
56
- status: "success · 89ms",
57
- tone: "success",
58
- },
59
- ];
60
- /** Visual hierarchy for flow/connectors (body lines use spaces only — copy-clean). */
61
- const FLOW_INDENT = {
62
- phase: 2,
63
- work: 4,
64
- body: 7,
65
- bridge: 6,
66
- };
67
- function indentSpaces(cols) {
68
- return cols > 0 ? " ".repeat(cols) : "";
69
- }
70
- function indentLine(content, cols, width) {
71
- if (cols <= 0)
72
- return padLine(content, width);
73
- const budget = Math.max(1, width - cols);
74
- return padLine(indentSpaces(cols) + truncateToWidth(content, budget, ""), width);
75
- }
76
- // ── Low-level helpers ───────────────────────────────────────────────────────
77
- function toneColor(tone) {
78
- switch (tone) {
79
- case "running":
80
- return "toolRunning";
81
- case "success":
82
- return "border";
83
- case "error":
84
- return "toolError";
85
- case "warning":
86
- return "warning";
87
- case "muted":
88
- default:
89
- return "toolMuted";
90
- }
91
- }
92
- function padLine(line, width) {
93
- return padRight(truncateToWidth(line, width, ""), width);
94
- }
95
- function openRule(title, right, width, tone, bottomRule = false) {
96
- let surface = style()
97
- .border("open")
98
- .borderColor((text) => theme.fg(tone, text))
99
- .title(title);
100
- if (right)
101
- surface = surface.titleRight(right);
102
- if (!bottomRule)
103
- surface = surface.bottomRule(false);
104
- return surface.render([], Math.max(20, width));
105
- }
106
- function openBlock(body, width, opts, bottomRule = false) {
107
- const tc = toneColor(opts.tone);
108
- const titleText = (opts.titlePrefix ?? "") + styledHeader(opts.title, opts.titleColor ?? "borderAccent");
109
- let surface = style()
110
- .border("open")
111
- .borderColor((text) => theme.fg(tc, text))
112
- .title(titleText);
113
- if (opts.right)
114
- surface = surface.titleRight(theme.fg(tc, opts.right));
115
- if (!bottomRule)
116
- surface = surface.bottomRule(false);
117
- return surface.render(body, Math.max(20, width));
118
- }
119
- function statusDot(tone) {
120
- const color = tone === "success" ? "success" : tone === "error" ? "error" : tone === "running" ? "toolRunning" : "dim";
121
- return theme.fg(color, "●");
122
- }
123
- function chip(label, color = "borderAccent") {
124
- return theme.fg(color, theme.bold(` ${headerLabel(label)} `));
125
- }
126
- function dimRule(width, fraction = 0.35) {
127
- const w = Math.max(12, Math.floor(width * fraction));
128
- return [padLine(theme.fg("dim", "─".repeat(w)), width)];
129
- }
130
- /** Connectors on rule/spine rows only — body lines use space indent (copy-clean). */
131
- function spineGapLine(width, indentCols = FLOW_INDENT.work) {
132
- return indentLine(theme.fg("dim", "│"), indentCols, width);
133
- }
134
- function branchPrefix(isLast, indentCols = FLOW_INDENT.work) {
135
- return theme.fg("dim", indentSpaces(indentCols) + (isLast ? "└─ " : "├─ "));
136
- }
137
- function prefixRuleLine(prefix, ruleLine, width) {
138
- const budget = Math.max(20, width - visibleWidth(prefix));
139
- return padLine(prefix + truncateToWidth(ruleLine, budget, ""), width);
140
- }
141
- function renderIndentedWorkBlock(rendered, width, opts) {
142
- if (rendered.length === 0)
143
- return [];
144
- const out = [prefixRuleLine(opts.branchPrefix, rendered[0], width)];
145
- for (let j = 1; j < rendered.length; j++) {
146
- out.push(indentLine(rendered[j], opts.bodyIndent, width));
147
- }
148
- return out;
149
- }
150
- function indentOpenBodyLines(lines, width, bodyIndent = FLOW_INDENT.body) {
151
- if (lines.length <= 1)
152
- return lines;
153
- return [lines[0], ...lines.slice(1).map((line) => indentLine(line.trimEnd(), bodyIndent, width))];
154
- }
155
- function renderCollapsedRuleLine(title, target, status, width, tone, innerWidth) {
156
- const w = innerWidth ?? width;
157
- const tc = toneColor(tone);
158
- const titleText = `${theme.fg("borderAccent", headerLabel(title))}${target ? ` ${theme.fg("text", target)}` : ""}`;
159
- const right = theme.fg(tone === "success" ? "success" : tc, status);
160
- return openRule(titleText, right, w, tc, false)[0];
161
- }
162
- function renderWorkItem(item, width, innerWidth) {
163
- const w = innerWidth ?? width;
164
- const tone = item.tone ?? "success";
165
- switch (item.kind) {
166
- case "rule":
167
- return [renderCollapsedRuleLine(item.title, item.target, item.status, width, tone, w)];
168
- case "expanded":
169
- return openBlock([theme.fg("dim", item.command), `${theme.fg("success", "✓")} ${item.result}`], w, { title: item.title, right: item.status, tone }, false);
170
- case "body":
171
- return openBlock(item.lines.map((line, i) => (i === item.lines.length - 1 ? theme.fg("dim", line) : line)), w, { title: item.title, right: item.status, tone }, false);
172
- }
173
- }
174
- function renderUserTurn(width) {
175
- return openBlock([USER_TEXT], width, { title: USER_LABEL, titleColor: "border", tone: "muted" }, false);
176
- }
177
- function workflowBridgeLine(label, width) {
178
- const lead = theme.fg("borderAccent", " ╰─ ") + styledHeader(label, "borderAccent");
179
- const fill = Math.max(4, width - visibleWidth(lead) - 2);
180
- return padLine(lead + theme.fg("dim", " " + "─".repeat(fill)), width);
181
- }
182
- function renderAssistantTurn(width, bridgeLabel) {
183
- const out = openBlock([ASSISTANT_TEXT], width, {
184
- title: "GSD",
185
- titleColor: "borderAccent",
186
- right: theme.fg("dim", "gpt-test · 1.2s"),
187
- tone: "success",
188
- }, false);
189
- if (bridgeLabel) {
190
- out.push(workflowBridgeLine(bridgeLabel, width));
191
- }
192
- return out;
193
- }
194
- /** Vertical spine + tree branch prefixes on rule rows; body lines indented under branch. */
195
- function renderConnectedWork(items, width, opts = {}) {
196
- const workIndent = opts.workIndent ?? FLOW_INDENT.work;
197
- const bodyIndent = opts.bodyIndent ?? FLOW_INDENT.body;
198
- const innerWidth = Math.max(20, width - workIndent - 3);
199
- const out = [];
200
- for (let i = 0; i < items.length; i++) {
201
- const isLast = i === items.length - 1;
202
- const rendered = renderWorkItem(items[i], width, innerWidth);
203
- out.push(...renderIndentedWorkBlock(rendered, width, {
204
- branchPrefix: theme.fg("dim", indentSpaces(workIndent) + buildTreePrefix([], isLast, 1)),
205
- bodyIndent,
206
- }));
207
- }
208
- return out;
209
- }
210
- /** Continuous │ spine between rule rows; nested body content indented. */
211
- function renderSpineLinkedWork(items, width, opts = {}) {
212
- const workIndent = opts.workIndent ?? FLOW_INDENT.work;
213
- const bodyIndent = opts.bodyIndent ?? FLOW_INDENT.body;
214
- const innerWidth = Math.max(20, width - workIndent - 3);
215
- const out = [];
216
- for (let i = 0; i < items.length; i++) {
217
- const isLast = i === items.length - 1;
218
- if (i > 0) {
219
- out.push(spineGapLine(width, workIndent));
220
- }
221
- const rendered = renderWorkItem(items[i], width, innerWidth);
222
- out.push(...renderIndentedWorkBlock(rendered, width, {
223
- branchPrefix: branchPrefix(isLast, workIndent),
224
- bodyIndent,
225
- }));
226
- }
227
- return out;
228
- }
229
- function renderPhaseHeader(label, meta, width, indentCols = FLOW_INDENT.phase) {
230
- const innerWidth = Math.max(20, width - indentCols);
231
- const title = styledHeader(label, "borderAccent");
232
- const right = theme.fg("dim", meta);
233
- const rule = openRule(title, right, innerWidth, "borderAccent", false)[0];
234
- return [indentLine(rule, indentCols, width)];
235
- }
236
- function renderCompactTurn(role, body, width, opts = {}) {
237
- const titleColor = opts.titleColor ?? (role === "You" ? "border" : "borderAccent");
238
- const displayRole = role === "You" ? USER_LABEL : headerLabel(role);
239
- return openBlock([body], width, {
240
- title: displayRole,
241
- titleColor,
242
- right: opts.meta ? theme.fg("dim", opts.meta) : undefined,
243
- tone: opts.tone ?? (role === "You" ? "muted" : "success"),
244
- }, false);
245
- }
246
- function renderWorkGroup(group, width) {
247
- const bridged = group.bridged ?? false;
248
- const workIndent = bridged ? FLOW_INDENT.bridge : FLOW_INDENT.work;
249
- const bodyIndent = workIndent + 3;
250
- const out = [];
251
- if (bridged) {
252
- out.push(workflowBridgeLine(group.label, width));
253
- out.push(spineGapLine(width, workIndent));
254
- }
255
- else {
256
- out.push(...renderPhaseHeader(group.label, group.meta, width));
257
- out.push(spineGapLine(width, workIndent));
258
- }
259
- out.push(...renderSpineLinkedWork(group.items, width, { workIndent, bodyIndent }));
260
- return out;
261
- }
262
- /** ★ Recommended — open turns, bridged work groups, spine-linked actions. */
263
- function renderGsdFlow(width) {
264
- return [
265
- ...renderCompactTurn("You", USER_TEXT, width),
266
- ...renderCompactTurn("GSD", ASSISTANT_TEXT, width, { meta: "gpt-test · 1.2s" }),
267
- ...renderWorkGroup({
268
- label: "shell cleanup",
269
- meta: "4 actions · 1.4s",
270
- items: SHELL_WORK.map((item) => item.kind === "expanded"
271
- ? { ...item, status: `${item.status} · ctrl+o collapse` }
272
- : { ...item, status: `${item.status} · ctrl+o expand` }),
273
- bridged: true,
274
- }, width),
275
- "",
276
- ...renderWorkGroup({ label: "finalize", meta: "2 actions · 209ms", items: FINALIZE_WORK, bridged: true }, width),
277
- ];
278
- }
279
- /** Document mode — Glamour-style sections, no tree connectors. */
280
- function renderGsdDocument(width) {
281
- const section = (title, meta, lines, titleColor = "mdHeading") => {
282
- const headIndent = 0;
283
- const bodyIndent = 2;
284
- const listIndent = 4;
285
- const out = [
286
- indentLine(styledHeader(title, titleColor), headIndent, width),
287
- indentLine(theme.fg("dim", meta), bodyIndent, width),
288
- ];
289
- for (const line of lines) {
290
- out.push(indentLine(line, line.startsWith("•") ? listIndent : bodyIndent, width));
291
- }
292
- out.push("");
293
- return out;
294
- };
295
- return [
296
- ...section(USER_LABEL, "12:34:01", [USER_TEXT], "border"),
297
- ...section("GSD", "gpt-test · 1.2s", [ASSISTANT_TEXT], "borderAccent"),
298
- ...section("Shell cleanup", "4 actions · 1.4s", [
299
- ...COLLAPSED_TOOLS.map((t) => `${theme.fg("mdListBullet", "•")} ${t.target} ${theme.fg("success", t.status)}`),
300
- theme.fg("dim", "bg_shell kill [87ad363a]"),
301
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
302
- ], "toolTitle"),
303
- ...section("Finalization", "2 actions · 209ms", [
304
- `${theme.fg("success", "✓")} ASSESSMENT M002/S02 saved`,
305
- "WAL checkpoint complete — database is safe to stage with git.",
306
- theme.fg("dim", "Checkpoint at .planning/state/gsd.sqlite-wal"),
307
- ], "customMessageLabel"),
308
- ];
309
- }
310
- /** Stream mode — minimal prompts, flat indented work list. */
311
- function renderGsdStream(width) {
312
- const prompt = (mark, text, color = "text") => padLine(`${theme.fg("dim", mark)} ${theme.fg(color, text)}`, width);
313
- const workLine = (label, detail, status) => indentLine(`${styledHeader(label, "borderAccent")} ${theme.fg("dim", detail)} ${theme.fg("success", status)}`, FLOW_INDENT.work, width);
314
- return [
315
- prompt("›", USER_TEXT, "userMessageText"),
316
- prompt("◆", ASSISTANT_TEXT, "assistantMessageText"),
317
- indentLine(theme.fg("dim", headerLabel("shell cleanup")), FLOW_INDENT.work, width),
318
- ...COLLAPSED_TOOLS.map((t) => workLine(t.title, t.target, t.status)),
319
- workLine("Background Shell", "Killed 87ad363a python3 -m http.server 3005", "340ms"),
320
- "",
321
- indentLine(theme.fg("dim", headerLabel("finalize")), FLOW_INDENT.work, width),
322
- workLine("Save Summary", "ASSESSMENT M002/S02", "120ms"),
323
- workLine("Checkpoint", "WAL checkpoint complete", "89ms"),
324
- ];
325
- }
326
- /** Connected rail cards — matches GSD step-complete / auto-status-message.ts. */
327
- const CONNECTED_INDENT = 4;
328
- function connectedRuleFill(width, indent = CONNECTED_INDENT) {
329
- return "─".repeat(Math.max(16, Math.min(40, width - indent - 1)));
330
- }
331
- /** Bridge from an indented user turn down to a left-pegged GSD turn. */
332
- function renderChatTurnBridge(width, fromIndent = CONNECTED_INDENT) {
333
- const bridge = indentSpaces(fromIndent + 2) + "╰──────╮";
334
- return [padLine(theme.fg("borderAccent", bridge), width)];
335
- }
336
- function renderConnectedCard(width, title, bodyLines, opts = {}) {
337
- const indent = opts.indent ?? CONNECTED_INDENT;
338
- const prefix = indentSpaces(indent);
339
- const railColor = opts.railColor ?? "borderAccent";
340
- const rail = (text) => theme.fg(railColor, text);
341
- const resolvedTitleColor = opts.titleColor ??
342
- (title.includes("✕") ? "error" : title.includes("✓") ? "success" : railColor);
343
- const titleStyled = theme.fg(resolvedTitleColor, theme.bold(headerLabel(title)));
344
- const lead = prefix + rail("╭─ ") + titleStyled;
345
- let topLine = lead;
346
- if (opts.titleRight) {
347
- const fill = Math.max(4, width - visibleWidth(lead) - visibleWidth(opts.titleRight) - 1);
348
- topLine = lead + rail(" " + "─".repeat(fill) + " ") + opts.titleRight;
349
- }
350
- const out = [padLine(topLine, width)];
351
- for (const line of bodyLines) {
352
- out.push(padLine(prefix + " " + line, width));
353
- }
354
- out.push(padLine(prefix + rail("╰" + connectedRuleFill(width, indent)), width));
355
- return out;
356
- }
357
- function renderConnectedDetail(label, value) {
358
- return `${theme.fg("dim", `${headerLabel(label)}:`)} ${theme.fg("accent", value)}`;
359
- }
360
- function renderConnectedToolLine(target, status) {
361
- return `${theme.fg("text", target)} ${theme.fg("success", status)}`;
362
- }
363
- /** Connected rail applied to full transcript — the step-complete look you liked. */
364
- function renderGsdConnected(width) {
365
- const shellBody = [
366
- ...COLLAPSED_TOOLS.map((t) => renderConnectedToolLine(t.target, t.status)),
367
- theme.fg("dim", "bg_shell kill [87ad363a]"),
368
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
369
- ];
370
- return [
371
- ...renderConnectedCard(width, USER_LABEL, [USER_TEXT], { railColor: "border", titleColor: "border" }),
372
- ...renderChatTurnBridge(width),
373
- ...renderConnectedCard(width, "GSD", [ASSISTANT_TEXT], {
374
- indent: 0,
375
- titleRight: theme.fg("dim", "gpt-test · 1.2s"),
376
- }),
377
- "",
378
- ...renderConnectedCard(width, "✓ Shell cleanup", shellBody),
379
- "",
380
- ...renderConnectedCard(width, "✓ Finalization", [
381
- renderConnectedDetail("Save Summary", "ASSESSMENT M002/S02 · success · 120ms"),
382
- renderConnectedDetail("Checkpoint", "WAL checkpoint complete · 89ms"),
383
- ]),
384
- "",
385
- ...renderConnectedCard(width, "✓ GSD Step Complete", [
386
- renderConnectedDetail("Completed", "planning M003-mx79kt/S01"),
387
- ]),
388
- ];
389
- }
390
- // ── Design: current (re-export density baseline) ─────────────────────────────
391
- function renderCurrent(width) {
392
- return renderDensitySample(width, getDensityVariant("current"));
393
- }
394
- // ── Design: open-unified (ADR-019 everywhere) ────────────────────────────────
395
- function renderOpenUnified(width) {
396
- const out = [];
397
- out.push(...openBlock([USER_TEXT], width, { title: USER_LABEL, titleColor: "border", tone: "muted" }, false));
398
- out.push(...openBlock([ASSISTANT_TEXT], width, {
399
- title: "GSD",
400
- right: theme.fg("dim", "gpt-test · 1.2s"),
401
- tone: "success",
402
- }, false));
403
- for (const tool of COLLAPSED_TOOLS) {
404
- const title = `${theme.fg("borderAccent", headerLabel(tool.title))} ${theme.fg("text", tool.target)}`;
405
- const right = theme.fg("success", `${tool.status} · ctrl+o expand`);
406
- out.push(...openRule(title, right, width, "border", false).map((line) => indentLine(line, FLOW_INDENT.work, width)));
407
- }
408
- out.push(...indentOpenBodyLines(openBlock([
409
- theme.fg("dim", "bg_shell kill [87ad363a]"),
410
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
411
- ], width, {
412
- title: "Background Shell",
413
- right: theme.fg("success", "success · 340ms · ctrl+o collapse"),
414
- tone: "success",
415
- }, false), width));
416
- out.push(...openRule(`${theme.fg("borderAccent", headerLabel("Save Summary"))} ${theme.fg("text", "summary_save ASSESSMENT M002/S02")}`, theme.fg("success", "success · 120ms"), width, "border", false));
417
- out.push(...indentOpenBodyLines(openBlock([
418
- "WAL checkpoint complete — database is safe to stage with git.",
419
- theme.fg("dim", "Checkpoint at .planning/state/gsd.sqlite-wal"),
420
- ], width, { title: "Checkpoint GSD Database", right: "success · 89ms", tone: "success" }, false), width));
421
- return out;
422
- }
423
- // ── Design: glamour-flow (document / Glamour stylesheet) ─────────────────────
424
- function renderGlamourFlow(width) {
425
- const contentIndent = 2;
426
- const listIndent = 4;
427
- const heading = (text, color = "mdHeading") => padLine(styledHeader(text, color), width);
428
- const meta = (text) => indentLine(theme.fg("dim", text), contentIndent, width);
429
- const body = (text, indent = contentIndent) => indentLine(text, indent, width);
430
- return [
431
- heading(USER_LABEL, "border"),
432
- meta("12:34:01"),
433
- body(USER_TEXT),
434
- "",
435
- heading("GSD", "borderAccent"),
436
- meta("gpt-test · 1.2s"),
437
- body(ASSISTANT_TEXT),
438
- "",
439
- heading("Background Shell", "toolTitle"),
440
- meta("3 actions · shell cleanup"),
441
- ...COLLAPSED_TOOLS.map((t) => body(`${theme.fg("mdListBullet", "•")} ${t.target} ${theme.fg("success", t.status)}`, listIndent)),
442
- "",
443
- heading("Background Shell", "toolTitle"),
444
- meta("expanded · success · 340ms"),
445
- body(theme.fg("dim", "bg_shell kill [87ad363a]"), listIndent),
446
- body(`${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`, listIndent),
447
- "",
448
- heading("Save Summary", "toolTitle"),
449
- body(`${theme.fg("success", "✓")} ASSESSMENT M002/S02 saved`, contentIndent),
450
- "",
451
- heading("Checkpoint GSD Database", "customMessageLabel"),
452
- meta("success · 89ms"),
453
- body("WAL checkpoint complete — database is safe to stage with git.", contentIndent),
454
- body(theme.fg("dim", "Checkpoint at .planning/state/gsd.sqlite-wal"), contentIndent),
455
- ];
456
- }
457
- // ── Design: charm-minimal (Lip Gloss semantic badges) ────────────────────────
458
- function renderCharmMinimal(width) {
459
- const out = [];
460
- out.push(padLine(`${chip(USER_LABEL, "border")} ${USER_TEXT}`, width));
461
- out.push(padLine(`${chip("GSD", "borderAccent")} ${ASSISTANT_TEXT}`, width));
462
- out.push(padLine(theme.fg("dim", ` ${"─".repeat(Math.min(40, width - 4))}`), width));
463
- for (const tool of COLLAPSED_TOOLS) {
464
- const title = `${statusDot("success")} ${styledHeader(tool.title, "borderAccent")} ${theme.fg("dim", tool.target)}`;
465
- out.push(...openRule(title, theme.fg("success", tool.status), width, "border", false));
466
- }
467
- out.push(...indentOpenBodyLines(openBlock([
468
- theme.fg("dim", "bg_shell kill [87ad363a]"),
469
- `${theme.fg("success", "✓")} ${theme.fg("text", "Killed 87ad363a python3 -m http.server 3005")}`,
470
- ], width, {
471
- title: "Background Shell",
472
- titlePrefix: `${statusDot("success")} `,
473
- right: theme.fg("success", "success · 340ms"),
474
- tone: "success",
475
- }, false), width));
476
- out.push(...openRule(`${statusDot("success")} ${styledHeader("Save Summary", "borderAccent")} ${theme.fg("dim", "M002/S02")}`, theme.fg("success", "120ms"), width, "border", false));
477
- out.push(...openBlock(["WAL checkpoint complete — database is safe to stage with git."], width, {
478
- title: "Checkpoint",
479
- titlePrefix: `${statusDot("success")} `,
480
- titleColor: "customMessageLabel",
481
- right: theme.fg("success", "89ms"),
482
- tone: "success",
483
- }, false));
484
- return out;
485
- }
486
- // ── Design: timeline (log stream) ────────────────────────────────────────────
487
- function renderTimeline(width) {
488
- const stamp = (t) => theme.fg("dim", t);
489
- const out = [];
490
- out.push(...openBlock([USER_TEXT], width, {
491
- title: USER_LABEL,
492
- titleColor: "border",
493
- right: stamp("12:34:01"),
494
- tone: "muted",
495
- }, false));
496
- out.push(...openBlock([ASSISTANT_TEXT], width, {
497
- title: "GSD",
498
- right: stamp("12:34:02 · gpt-test"),
499
- tone: "success",
500
- }, false));
501
- out.push(...openBlock([
502
- ...COLLAPSED_TOOLS.map((t, i) => `${stamp(String(12 + i).padStart(2, "0") + ":34:0" + (3 + i))} ${t.target} ${theme.fg("success", t.status)}`),
503
- ], width, {
504
- title: "Phase · Shell cleanup",
505
- right: stamp("3 actions · 1.02s"),
506
- tone: "success",
507
- }, false));
508
- out.push(...openBlock([
509
- theme.fg("dim", "bg_shell kill [87ad363a]"),
510
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
511
- ], width, {
512
- title: "Background Shell",
513
- right: stamp("12:34:06 · expanded"),
514
- tone: "success",
515
- }, false));
516
- out.push(...openRule(`${theme.fg("borderAccent", headerLabel("Save Summary"))} ${theme.fg("text", "ASSESSMENT M002/S02")}`, stamp("12:34:07 · 120ms"), width, "border", false));
517
- out.push(...openBlock(["WAL checkpoint complete — database is safe to stage with git."], width, { title: "Checkpoint GSD Database", right: stamp("12:34:08 · 89ms"), tone: "success" }, false));
518
- return out;
519
- }
520
- // ── Design: phase-rollup (batch repetitive tools) ────────────────────────────
521
- function renderPhaseRollup(width) {
522
- const out = [];
523
- out.push(...openBlock([USER_TEXT], width, { title: USER_LABEL, titleColor: "border", tone: "muted" }, false));
524
- out.push(...openBlock([ASSISTANT_TEXT], width, {
525
- title: "GSD",
526
- right: theme.fg("dim", "gpt-test · 1.2s"),
527
- tone: "success",
528
- }, false));
529
- out.push(...openBlock(COLLAPSED_TOOLS.map((t) => alignRight(t.target, theme.fg("success", t.status), Math.max(20, width - FLOW_INDENT.body))), width, {
530
- title: "Shell cleanup",
531
- right: theme.fg("success", "3 actions · 1.02s · ctrl+o expand"),
532
- tone: "success",
533
- }, false).map((line, i) => (i === 0 ? line : indentLine(line.trimEnd(), FLOW_INDENT.body, width))));
534
- out.push(...indentOpenBodyLines(openBlock([
535
- theme.fg("dim", "bg_shell kill [87ad363a]"),
536
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
537
- ], width, {
538
- title: "Background Shell",
539
- right: theme.fg("success", "success · 340ms"),
540
- tone: "success",
541
- }, false), width));
542
- out.push(...openRule(`${theme.fg("borderAccent", headerLabel("Save Summary"))} ${theme.fg("text", "ASSESSMENT M002/S02")}`, theme.fg("success", "success · 120ms"), width, "border", false).map((line) => indentLine(line, FLOW_INDENT.work, width)));
543
- out.push(...indentOpenBodyLines(openBlock([
544
- "WAL checkpoint complete — database is safe to stage with git.",
545
- theme.fg("dim", ".planning/state/gsd.sqlite-wal"),
546
- ], width, { title: "Checkpoint GSD Database", right: "success · 89ms", tone: "success" }, false), width));
547
- return out;
548
- }
549
- // ── Design: whisper (ultra-minimal) ──────────────────────────────────────────
550
- function renderWhisper(width) {
551
- const prompt = (p, text) => padLine(`${theme.fg("dim", p)} ${theme.fg("text", text)}`, width);
552
- const tool = (label, detail, status) => padLine(`${theme.fg("dim", " ")}${styledHeader(label, "borderAccent")} ${theme.fg("muted", detail)} ${theme.fg("success", status)}`, width);
553
- return [
554
- prompt("›", USER_TEXT),
555
- ...dimRule(width, 0.25),
556
- prompt("◆", ASSISTANT_TEXT),
557
- ...dimRule(width, 0.25),
558
- padLine(theme.fg("dim", ` ${headerLabel("tools")}`), width),
559
- ...COLLAPSED_TOOLS.map((t) => tool(t.title, t.target, t.status)),
560
- tool("Background Shell", "Killed 87ad363a python3 -m http.server 3005", "340ms"),
561
- tool("Save Summary", "ASSESSMENT M002/S02", "120ms"),
562
- tool("Checkpoint", "WAL checkpoint complete", "89ms"),
563
- ];
564
- }
565
- // ── Design: flow connectors (linked work sets) ───────────────────────────────
566
- function renderFlowTree(width) {
567
- return [
568
- ...renderUserTurn(width),
569
- ...renderAssistantTurn(width),
570
- ...renderConnectedWork(SHELL_WORK, width),
571
- indentLine(theme.fg("dim", "─".repeat(Math.min(28, width - FLOW_INDENT.work - 4))), FLOW_INDENT.work, width),
572
- ...renderConnectedWork(FINALIZE_WORK, width),
573
- ];
574
- }
575
- function renderFlowSpine(width) {
576
- return [
577
- ...renderUserTurn(width),
578
- ...renderAssistantTurn(width),
579
- ...renderSpineLinkedWork(SHELL_WORK, width),
580
- "",
581
- ...renderPhaseHeader("Finalization", "2 actions", width),
582
- spineGapLine(width, FLOW_INDENT.work),
583
- ...renderSpineLinkedWork(FINALIZE_WORK, width),
584
- ];
585
- }
586
- function renderFlowBridge(width) {
587
- const bridged = { workIndent: FLOW_INDENT.bridge, bodyIndent: FLOW_INDENT.bridge + 3 };
588
- return [
589
- ...renderUserTurn(width),
590
- ...renderAssistantTurn(width, "shell cleanup"),
591
- spineGapLine(width, FLOW_INDENT.bridge),
592
- ...renderSpineLinkedWork(SHELL_WORK, width, bridged),
593
- "",
594
- workflowBridgeLine("finalize", width),
595
- spineGapLine(width, FLOW_INDENT.bridge),
596
- ...renderSpineLinkedWork(FINALIZE_WORK, width, bridged),
597
- ];
598
- }
599
- function renderFlowPhases(width) {
600
- return [
601
- ...renderUserTurn(width),
602
- ...renderAssistantTurn(width),
603
- ...renderPhaseHeader("Shell cleanup", "4 actions · 1.4s", width),
604
- spineGapLine(width, FLOW_INDENT.work),
605
- ...renderSpineLinkedWork(SHELL_WORK, width),
606
- "",
607
- ...renderPhaseHeader("Finalization", "2 actions · 209ms", width),
608
- spineGapLine(width, FLOW_INDENT.work),
609
- ...renderSpineLinkedWork(FINALIZE_WORK, width),
610
- ];
611
- }
612
- // ── Design: lipgloss-panel (rounded messages, open tools) ───────────────────
613
- function renderLipglossPanel(width) {
614
- const userPanel = style()
615
- .border("rounded")
616
- .borderColor((text) => theme.fg("border", text))
617
- .paddingX(1)
618
- .paddingY(0)
619
- .title(styledHeader(USER_LABEL, "border"))
620
- .render([USER_TEXT], width);
621
- const assistantPanel = style()
622
- .border("rounded")
623
- .borderColor((text) => theme.fg("borderAccent", text))
624
- .paddingX(1)
625
- .paddingY(0)
626
- .title(styledHeader("GSD", "borderAccent"))
627
- .titleRight(theme.fg("dim", "gpt-test · 1.2s"))
628
- .render([ASSISTANT_TEXT], width);
629
- const out = [...userPanel, "", ...assistantPanel, ""];
630
- for (const tool of COLLAPSED_TOOLS) {
631
- const title = `${styledHeader(tool.title, "borderAccent")} ${theme.fg("text", tool.target)}`;
632
- out.push(...openRule(title, theme.fg("success", tool.status), width, "border", false));
633
- }
634
- out.push(...openBlock([
635
- theme.fg("dim", "bg_shell kill [87ad363a]"),
636
- `${theme.fg("success", "✓")} Killed 87ad363a python3 -m http.server 3005`,
637
- ], width, { title: "Background Shell", right: "success · 340ms", tone: "success" }, false));
638
- out.push(...openRule(`${styledHeader("Save Summary", "borderAccent")} ${theme.fg("text", "ASSESSMENT M002/S02")}`, theme.fg("success", "120ms"), width, "border", false));
639
- out.push(...openBlock(["WAL checkpoint complete — database is safe to stage with git."], width, { title: "Checkpoint GSD Database", right: "success · 89ms", tone: "success" }, false));
640
- return out;
641
- }
642
- // ── Density variants (prior exploration) ─────────────────────────────────────
643
- function wrapDensity(variant) {
644
- return {
645
- id: variant.id,
646
- label: variant.label,
647
- tagline: variant.tagline,
648
- inspiration: "Density tuning (prior prototype)",
649
- render: (width) => renderDensitySample(width, variant),
650
- };
651
- }
652
- // ── Registry ─────────────────────────────────────────────────────────────────
653
- /** Default comparison set — the rethink. */
654
- export const RETHINK_PROTOTYPES = [
655
- {
656
- id: "current",
657
- label: "0 · Current",
658
- tagline: "Production today — rounded bubbles, spaced tool cards",
659
- inspiration: "Baseline (before)",
660
- render: renderCurrent,
661
- },
662
- {
663
- id: "gsd-flow",
664
- label: "★ GSD Flow",
665
- tagline: "Recommended — open turns, bridged work groups, spine tree, tight",
666
- inspiration: "ADR-019 + flow-phases + flow-bridge synthesis",
667
- render: renderGsdFlow,
668
- },
669
- {
670
- id: "gsd-document",
671
- label: "GSD Document",
672
- tagline: "Glamour-style sections — prose-first, bullet tools, no connectors",
673
- inspiration: "Charm Glamour / readable long sessions",
674
- render: renderGsdDocument,
675
- },
676
- {
677
- id: "gsd-stream",
678
- label: "GSD Stream",
679
- tagline: "Ultra-compact — prompt chars, flat indented work list",
680
- inspiration: "Claude Code brevity + maximum density",
681
- render: renderGsdStream,
682
- },
683
- {
684
- id: "gsd-connected",
685
- label: "★ GSD Connected",
686
- tagline: "Connected rail cards — the step-complete look applied to the full flow",
687
- inspiration: "auto-status-message.ts formatConnectedStepStack",
688
- render: renderGsdConnected,
689
- },
690
- ];
691
- /** Prior exploration variants — npm run prototype:tui-design -- explore */
692
- export const LEGACY_PROTOTYPES = [
693
- {
694
- id: "open-unified",
695
- label: "Open unified",
696
- tagline: "ADR-019 everywhere — horizontal rules only",
697
- inspiration: "ADR-019",
698
- render: renderOpenUnified,
699
- },
700
- {
701
- id: "glamour-flow",
702
- label: "Glamour flow",
703
- tagline: "Document headings + bullet tools",
704
- inspiration: "Glamour",
705
- render: renderGlamourFlow,
706
- },
707
- {
708
- id: "charm-minimal",
709
- label: "Charm minimal",
710
- tagline: "Chips, dots, semantic rule colors",
711
- inspiration: "Lip Gloss",
712
- render: renderCharmMinimal,
713
- },
714
- {
715
- id: "timeline",
716
- label: "Timeline",
717
- tagline: "Timestamp log stream",
718
- inspiration: "Structured logging",
719
- render: renderTimeline,
720
- },
721
- {
722
- id: "phase-rollup",
723
- label: "Phase rollup",
724
- tagline: "Batch repetitive tools",
725
- inspiration: "Batch UX",
726
- render: renderPhaseRollup,
727
- },
728
- {
729
- id: "whisper",
730
- label: "Whisper",
731
- tagline: "Prompt chars + half-width separators",
732
- inspiration: "Minimal shell",
733
- render: renderWhisper,
734
- },
735
- {
736
- id: "lipgloss-panel",
737
- label: "Lipgloss panel",
738
- tagline: "Rounded message panels + open tools",
739
- inspiration: "Lip Gloss rounded",
740
- render: renderLipglossPanel,
741
- },
742
- {
743
- id: "flow-tree",
744
- label: "Flow tree",
745
- tagline: "Tree branches per action",
746
- inspiration: "tree-render-utils",
747
- render: renderFlowTree,
748
- },
749
- {
750
- id: "flow-spine",
751
- label: "Flow spine",
752
- tagline: "Vertical spine between rules",
753
- inspiration: "Timeline spine",
754
- render: renderFlowSpine,
755
- },
756
- {
757
- id: "flow-bridge",
758
- label: "Flow bridge",
759
- tagline: "╰─ bridge from assistant",
760
- inspiration: "Connected rail",
761
- render: renderFlowBridge,
762
- },
763
- {
764
- id: "flow-phases",
765
- label: "Flow phases",
766
- tagline: "Named phases + spine",
767
- inspiration: "ToolPhaseSummary",
768
- render: renderFlowPhases,
769
- },
770
- ...DENSITY_VARIANTS.filter((v) => !["current"].includes(v.id)).map(wrapDensity),
771
- ];
772
- export const DESIGN_PROTOTYPES = [...RETHINK_PROTOTYPES, ...LEGACY_PROTOTYPES];
773
- export function getDesignPrototype(id) {
774
- const resolved = id === "rethink" ? "gsd-flow" : id;
775
- const found = DESIGN_PROTOTYPES.find((p) => p.id === resolved);
776
- if (!found) {
777
- throw new Error(`Unknown prototype "${id}". Rethink: ${RETHINK_PROTOTYPES.map((p) => p.id).join(", ")} · legacy: npm run prototype:tui-design -- explore`);
778
- }
779
- return found;
780
- }
781
- export function resolvePrototypeSet(mode) {
782
- if (mode === "explore")
783
- return DESIGN_PROTOTYPES;
784
- if (mode === "all" || mode === "rethink")
785
- return RETHINK_PROTOTYPES;
786
- return [getDesignPrototype(mode)];
787
- }
788
- export function renderPrototypeBanner(prototype, width) {
789
- const label = `${prototype.label} — ${prototype.tagline}`;
790
- const inspo = theme.fg("dim", `inspired by: ${prototype.inspiration}`);
791
- const rule = theme.fg("borderAccent", "═".repeat(Math.max(20, width)));
792
- return ["", rule, truncateToWidth(theme.fg("text", label), width, ""), truncateToWidth(inspo, width, ""), rule, ""];
793
- }
794
- export function listPrototypeIds() {
795
- return DESIGN_PROTOTYPES.map((p) => p.id);
796
- }
797
- //# sourceMappingURL=transcript-design-prototype.js.map