@pellux/goodvibes-tui 1.0.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +130 -127
  2. package/README.md +32 -14
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +2 -2
  5. package/src/cli/ensure-goodvibes-gitignore.ts +32 -0
  6. package/src/cli/entrypoint.ts +2 -0
  7. package/src/core/alert-gating.ts +67 -0
  8. package/src/core/approval-alert.ts +72 -0
  9. package/src/core/budget-breach-notifier.ts +106 -0
  10. package/src/core/conversation-rendering.ts +19 -0
  11. package/src/core/conversation.ts +58 -0
  12. package/src/core/focus-tracker.ts +41 -0
  13. package/src/core/long-task-notifier.ts +33 -6
  14. package/src/core/stream-event-wiring.ts +104 -2
  15. package/src/core/stream-stall-watchdog.ts +41 -17
  16. package/src/core/system-message-router.ts +37 -51
  17. package/src/core/turn-cancellation.ts +20 -0
  18. package/src/core/turn-event-wiring.ts +64 -3
  19. package/src/export/cost-utils.ts +126 -8
  20. package/src/input/command-registry.ts +54 -1
  21. package/src/input/commands/checkpoint-runtime.ts +280 -0
  22. package/src/input/commands/codebase-runtime.ts +192 -0
  23. package/src/input/commands/diff-runtime.ts +61 -30
  24. package/src/input/commands/eval.ts +1 -1
  25. package/src/input/commands/health-runtime.ts +1 -1
  26. package/src/input/commands/image-runtime.ts +112 -0
  27. package/src/input/commands/intelligence-runtime.ts +11 -1
  28. package/src/input/commands/local-auth-runtime.ts +4 -1
  29. package/src/input/commands/local-runtime.ts +9 -3
  30. package/src/input/commands/marketplace-runtime.ts +2 -2
  31. package/src/input/commands/memory.ts +6 -1
  32. package/src/input/commands/operator-panel-runtime.ts +40 -24
  33. package/src/input/commands/planning-runtime.ts +26 -3
  34. package/src/input/commands/platform-sandbox-runtime.ts +1 -6
  35. package/src/input/commands/plugin-runtime.ts +2 -2
  36. package/src/input/commands/policy-dispatch.ts +21 -0
  37. package/src/input/commands/provider-accounts-runtime.ts +1 -1
  38. package/src/input/commands/qrcode-runtime.ts +3 -3
  39. package/src/input/commands/recall-review.ts +35 -0
  40. package/src/input/commands/remote-runtime.ts +3 -3
  41. package/src/input/commands/runtime-services.ts +54 -13
  42. package/src/input/commands/services-runtime.ts +1 -1
  43. package/src/input/commands/session-content.ts +12 -0
  44. package/src/input/commands/session-workflow.ts +19 -1
  45. package/src/input/commands/settings-sync-runtime.ts +1 -1
  46. package/src/input/commands/share-runtime.ts +9 -2
  47. package/src/input/commands/shell-core.ts +15 -7
  48. package/src/input/commands/skills-runtime.ts +2 -8
  49. package/src/input/commands/subscription-runtime.ts +2 -2
  50. package/src/input/commands/test-runtime.ts +277 -0
  51. package/src/input/commands/websearch-runtime.ts +101 -0
  52. package/src/input/commands/work-plan-runtime.ts +36 -10
  53. package/src/input/commands/workstream-runtime.ts +338 -0
  54. package/src/input/commands.ts +12 -0
  55. package/src/input/config-modal-types.ts +161 -0
  56. package/src/input/config-modal.ts +377 -0
  57. package/src/input/feed-context-factory.ts +7 -8
  58. package/src/input/handler-command-route.ts +27 -17
  59. package/src/input/handler-content-actions.ts +22 -8
  60. package/src/input/handler-feed-routes.ts +107 -7
  61. package/src/input/handler-feed.ts +49 -13
  62. package/src/input/handler-interactions.ts +3 -3
  63. package/src/input/handler-modal-routes.ts +65 -0
  64. package/src/input/handler-modal-stack.ts +3 -5
  65. package/src/input/handler-modal-token-routes.ts +16 -49
  66. package/src/input/handler-picker-routes.ts +11 -94
  67. package/src/input/handler-shortcuts.ts +24 -14
  68. package/src/input/handler-types.ts +3 -6
  69. package/src/input/handler-ui-state.ts +10 -22
  70. package/src/input/handler.ts +10 -28
  71. package/src/input/keybindings.ts +22 -8
  72. package/src/input/model-picker-types.ts +24 -6
  73. package/src/input/model-picker.ts +58 -0
  74. package/src/input/panel-integration-actions.ts +9 -170
  75. package/src/input/settings-modal-data.ts +95 -0
  76. package/src/input/settings-modal-mutations.ts +6 -4
  77. package/src/main.ts +41 -44
  78. package/src/panels/agent-inspector-shared.ts +35 -11
  79. package/src/panels/base-panel.ts +22 -1
  80. package/src/panels/builtin/agent.ts +21 -107
  81. package/src/panels/builtin/development.ts +16 -62
  82. package/src/panels/builtin/knowledge.ts +8 -32
  83. package/src/panels/builtin/operations.ts +84 -428
  84. package/src/panels/builtin/session.ts +21 -112
  85. package/src/panels/builtin/shared.ts +9 -43
  86. package/src/panels/builtin-modals.ts +218 -0
  87. package/src/panels/builtin-panels.ts +5 -0
  88. package/src/panels/cost-tracker-panel.ts +63 -14
  89. package/src/panels/diff-panel.ts +123 -60
  90. package/src/panels/eval-registry.ts +60 -0
  91. package/src/panels/fleet-panel.ts +800 -0
  92. package/src/panels/fleet-read-model.ts +477 -0
  93. package/src/panels/fleet-steer.ts +92 -0
  94. package/src/panels/fleet-stop.ts +125 -0
  95. package/src/panels/fleet-tabs.ts +230 -0
  96. package/src/panels/fleet-transcript.ts +356 -0
  97. package/src/panels/git-panel.ts +9 -9
  98. package/src/panels/index.ts +7 -31
  99. package/src/panels/local-auth-panel.ts +10 -0
  100. package/src/panels/modals/hooks-modal.ts +187 -0
  101. package/src/panels/modals/keybindings-modal.ts +151 -0
  102. package/src/panels/modals/knowledge-modal.ts +158 -0
  103. package/src/panels/modals/local-auth-modal.ts +132 -0
  104. package/src/panels/modals/marketplace-modal.ts +218 -0
  105. package/src/panels/modals/memory-modal.ts +180 -0
  106. package/src/panels/modals/modal-surface-helpers.ts +54 -0
  107. package/src/panels/modals/modal-theme.ts +36 -0
  108. package/src/panels/modals/pairing-modal.ts +144 -0
  109. package/src/panels/modals/planning-modal.ts +282 -0
  110. package/src/panels/modals/plugins-modal.ts +174 -0
  111. package/src/panels/modals/policy-modal.ts +256 -0
  112. package/src/panels/modals/provider-health-modal.ts +136 -0
  113. package/src/panels/modals/remote-modal.ts +115 -0
  114. package/src/panels/modals/sandbox-modal.ts +150 -0
  115. package/src/panels/modals/security-modal.ts +217 -0
  116. package/src/panels/modals/services-modal.ts +179 -0
  117. package/src/panels/modals/settings-sync-modal.ts +142 -0
  118. package/src/panels/modals/skills-modal.ts +189 -0
  119. package/src/panels/modals/subscription-modal.ts +172 -0
  120. package/src/panels/modals/work-plan-modal.ts +149 -0
  121. package/src/panels/panel-confirm-overlay.ts +72 -0
  122. package/src/panels/panel-manager.ts +108 -5
  123. package/src/panels/project-planning-answer-actions.ts +4 -2
  124. package/src/panels/scrollable-list-panel.ts +9 -0
  125. package/src/panels/skills-panel.ts +7 -51
  126. package/src/panels/token-budget-panel.ts +5 -3
  127. package/src/panels/types.ts +26 -0
  128. package/src/permissions/hunk-selection.ts +179 -0
  129. package/src/permissions/prompt.ts +60 -4
  130. package/src/renderer/compaction-history-modal.ts +19 -3
  131. package/src/renderer/compaction-preview.ts +13 -2
  132. package/src/renderer/compaction-quality.ts +100 -0
  133. package/src/renderer/config-modal.ts +81 -0
  134. package/src/renderer/conversation-overlays.ts +10 -17
  135. package/src/renderer/fleet-tab-strip.ts +56 -0
  136. package/src/renderer/footer-tips.ts +10 -2
  137. package/src/renderer/git-status.ts +40 -0
  138. package/src/renderer/help-overlay.ts +2 -2
  139. package/src/renderer/model-workspace.ts +44 -1
  140. package/src/renderer/panel-workspace-bar.ts +8 -2
  141. package/src/renderer/shell-surface.ts +8 -1
  142. package/src/renderer/turn-injection.ts +114 -0
  143. package/src/renderer/ui-factory.ts +91 -7
  144. package/src/runtime/bootstrap-command-context.ts +24 -1
  145. package/src/runtime/bootstrap-command-parts.ts +36 -7
  146. package/src/runtime/bootstrap-core.ts +19 -4
  147. package/src/runtime/bootstrap-hook-bridge.ts +5 -0
  148. package/src/runtime/bootstrap-shell.ts +41 -17
  149. package/src/runtime/bootstrap.ts +11 -17
  150. package/src/runtime/code-index-services.ts +112 -0
  151. package/src/runtime/orchestrator-core-services.ts +49 -0
  152. package/src/runtime/process-lifecycle.ts +3 -1
  153. package/src/runtime/services.ts +91 -43
  154. package/src/runtime/ui-services.ts +8 -0
  155. package/src/runtime/workstream-services.ts +195 -0
  156. package/src/shell/blocking-input.ts +22 -1
  157. package/src/shell/ui-openers.ts +129 -17
  158. package/src/utils/format-duration.ts +8 -18
  159. package/src/utils/splash-lines.ts +1 -1
  160. package/src/version.ts +1 -1
  161. package/src/panels/agent-inspector-panel.ts +0 -786
  162. package/src/panels/approval-panel.ts +0 -252
  163. package/src/panels/automation-control-panel.ts +0 -479
  164. package/src/panels/cockpit-panel.ts +0 -481
  165. package/src/panels/cockpit-read-model.ts +0 -233
  166. package/src/panels/communication-panel.ts +0 -256
  167. package/src/panels/control-plane-panel.ts +0 -470
  168. package/src/panels/debug-panel.ts +0 -609
  169. package/src/panels/docs-panel.ts +0 -375
  170. package/src/panels/eval-panel.ts +0 -627
  171. package/src/panels/file-explorer-panel.ts +0 -664
  172. package/src/panels/file-preview-panel.ts +0 -517
  173. package/src/panels/hooks-panel.ts +0 -401
  174. package/src/panels/incident-review-panel.ts +0 -406
  175. package/src/panels/intelligence-panel.ts +0 -383
  176. package/src/panels/knowledge-graph-panel.ts +0 -506
  177. package/src/panels/marketplace-panel.ts +0 -399
  178. package/src/panels/memory-panel.ts +0 -558
  179. package/src/panels/ops-control-panel.ts +0 -329
  180. package/src/panels/ops-strategy-panel.ts +0 -321
  181. package/src/panels/orchestration-panel.ts +0 -465
  182. package/src/panels/panel-list-panel.ts +0 -557
  183. package/src/panels/plan-dashboard-panel.ts +0 -707
  184. package/src/panels/policy-panel.ts +0 -517
  185. package/src/panels/project-planning-panel.ts +0 -721
  186. package/src/panels/provider-health-panel.ts +0 -678
  187. package/src/panels/provider-health-tracker.ts +0 -306
  188. package/src/panels/provider-health-views.ts +0 -560
  189. package/src/panels/qr-panel.ts +0 -280
  190. package/src/panels/remote-panel.ts +0 -534
  191. package/src/panels/routes-panel.ts +0 -241
  192. package/src/panels/sandbox-panel.ts +0 -456
  193. package/src/panels/security-panel.ts +0 -447
  194. package/src/panels/services-panel.ts +0 -329
  195. package/src/panels/session-browser-panel.ts +0 -487
  196. package/src/panels/settings-sync-panel.ts +0 -398
  197. package/src/panels/subscription-panel.ts +0 -342
  198. package/src/panels/symbol-outline-panel.ts +0 -619
  199. package/src/panels/system-messages-panel.ts +0 -364
  200. package/src/panels/tasks-panel.ts +0 -608
  201. package/src/panels/thinking-panel.ts +0 -333
  202. package/src/panels/tool-inspector-panel.ts +0 -537
  203. package/src/panels/work-plan-panel.ts +0 -530
  204. package/src/panels/worktree-panel.ts +0 -360
  205. package/src/panels/wrfc-panel.ts +0 -790
  206. package/src/renderer/agent-detail-modal.ts +0 -465
  207. package/src/renderer/live-tail-modal.ts +0 -156
  208. package/src/renderer/process-modal.ts +0 -656
  209. package/src/renderer/qr-renderer.ts +0 -120
package/CHANGELOG.md CHANGED
@@ -4,138 +4,134 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.7.0] — 2026-07-04
8
+
9
+ The evolution release: six batched development cycles (internal 1.2.0–1.6.0, which were never published) land together as one public version. The through-line is a product that reports the truth about itself — reversible edits you can actually undo, a live fleet you can watch and steer, orchestration that runs the plan it showed you, memory that demonstrably enters the turns it claims to, and a panel surface cut down to the consoles that earn their place. Ships against @pellux/goodvibes-sdk 0.38.0.
10
+
11
+ ### Reversibility and checkpoints
12
+ - Workspace checkpoints with `/checkpoints`, `/checkpoint`, and `/rewind`: snapshot the working tree, list snapshots newest-first, and preview-then-restore files from any checkpoint (files only — conversation history is left untouched). Backed by the SDK's `WorkspaceCheckpointManager` and wired through TUI services, with guards so an unguarded checkpoint call can no longer surface as a silent unhandled rejection.
13
+ - Per-hunk accept/reject for multi-edit approval prompts: when one approval covers several hunks you accept or reject each individually, and the decision is honored end-to-end instead of being all-or-nothing.
14
+ - `/test` runs the project test script and shows real pass/fail results, parsing both the SDK runner output and plain `bun test` output (per-test counts and the names of failing tests); the end state persists in the transcript instead of evaporating.
15
+ - Manual `/compact` now hands the compaction subagent the real original task and the full agent roster, so the handoff summary is accurate.
16
+
17
+ ### Fleet observability, session tabs, and steering
18
+ - A live Fleet panel over the real SDK process/agent registry: a process tree with per-node live states, honest cost, id-anchored selection that survives list churn, and capability-gated interrupt/kill actions. It is the fast-access surface below the prompt and the home of `F2`, `Ctrl+O`, and the footer `[Enter]`.
19
+ - Unfocused-user alerts that actually reach you when GoodVibes is in a background terminal: budget breach, agent/chain failure, awaiting-approval, and long-task notices, gated on real terminal-focus tracking (CSI 1004) with an honest "unknown" fallback.
20
+ - Live transcript tabs over the conversation snapshot bridge: attach to a running agent, browse its transcript read-only (with reserved-notice honesty), detach without killing it, and see interrupted vs. killed as distinct states with a frozen elapsed clock.
21
+ - A steering composer with a `queued` / `consumed` / `dropped` badge: send an instruction to a running agent and see honestly whether it was picked up, with TTL and ordering guards, and the consumed signal deferred until the steered turn actually succeeds.
22
+
23
+ ### Workstream orchestration
24
+ - `/workstream` authoring and oversight for multi-phase agent work: phases are insertable structure (float-ordinal ordering), work items flow to free capacity, and each item commits inside its own worktree through the scoped-commit machinery. The authoring view renders the real plan, so the proposal and the launched run can never disagree.
25
+ - Resume-prefix replay with crash-artifact reconciliation: an interrupted workstream re-queues its in-phase items on resume instead of double-running or dropping them.
26
+ - Budgets that refuse rather than kill, with a recovery path, and cooperative cancellation that reaches real child processes.
27
+ - Fleet-tree nesting for workstreams, plus pause/resume support.
28
+
29
+ ### Passive memory and the code index
30
+ - Durable memory demonstrably enters both agent turns and the main-session turn: per-turn retrieval is budgeted (800 tokens by default, floor 95), flag-gated, and inspectable — `/recall injections` shows exactly which records would be injected for a task and why, defaulting to the main-session ring.
31
+ - A repo source-tree code index with honest bounds and labeling: `/codebase build`, `/codebase status`, and `/codebase search`.
32
+ - Compaction quality scoring and a corrected capacity-percentage in the compaction path.
33
+ - The model picker gained an embeddings target, so the memory index's embedding provider is selectable alongside chat models.
34
+
35
+ ### The panel purge and config modals
36
+ - The panel surface was cut from roughly 50 panels to 6 surviving consoles — the Fleet hub plus git, diff, cost, tokens, and local-auth — with 19 configuration and review surfaces re-homed onto a single liveness-enforcing config-modal host. Heavy operator state that used to sprawl across dozens of panels now opens as a focused modal.
37
+ - Every retired panel id resolves honestly: old ids become aliases, modal redirects, or friendly "this moved" notices, so `/panel open <id>` and saved layouts never silently point at nothing.
38
+ - Live panels stay subscribed while open and now repaint while the main thread is idle, so agent, tool, and thinking updates no longer look frozen.
39
+
40
+ ### Keymap and focus honesty
41
+ - The keymap advertises what it actually does: `Ctrl+PageUp` / `Ctrl+PageDown` move between panel tabs (`Ctrl+[` was removed — it is byte `0x1B` and collided with Escape, so it never fired reliably; `Ctrl+]` remains a next-tab chord), `Ctrl+O` and `F2` both open and focus the Fleet panel (the retired Ops Control and process modals fold into it), and `Ctrl+C` honestly advertises the double-press to quit.
42
+ - Focus routing was fixed at the root: multi-character paste is detected per token instead of by a per-feed character-sum heuristic, and keyboard focus transfers only on an explicit request — so typed text no longer leaks into single-letter panel hotkeys.
43
+
44
+ ### Control-plane truth
45
+ - The control plane reports real lifecycle: a `stopping…` state while a process winds down, pause↔resume (including `/schedule` jobs shown in the fleet tree), zombie reaping, and a dirty-residue commit guard so an interrupted scoped commit cannot leave stray changes behind.
46
+
47
+ ### New commands
48
+ - `/search <query> [--limit <n>]` — search the web and render ranked results with source labels.
49
+ - `/imagine <prompt>` — generate an image from a prompt (distinct from `/image`, which attaches an existing image file; the two names collided and the generator was renamed).
50
+ - `/workstream` — author and oversee multi-phase agent workstreams.
51
+ - `/checkpoints`, `/checkpoint`, `/rewind` — workspace checkpoint list / create / restore.
52
+ - `/codebase` — build, inspect, and search the repo source-tree code index.
53
+ - `/test` — run the project test script and show pass/fail.
54
+ - `/recall injections` — inspect the memory records that would be injected for a task.
55
+
56
+ ### Notable fixes
57
+ - Clearing a feature-flag override back to default now removes it from disk instead of persisting a redundant entry.
58
+ - The `paused` process state renders with its own glyph and tone in the fleet tree.
59
+ - Planning: dismissing a planning action no longer corrupts the project goal; the `sessions` front door opens the session picker; `/panel open` reports redirects and deleted ids honestly.
60
+ - `Escape` cancel-first precedence and live git-init header refresh, so a directory becomes a recognized repo without a restart.
61
+
62
+ ### Internal
63
+ - SDK dependency 0.36.0 → 0.38.0 (through 0.37.0 / 0.37.1 / 0.37.2); foundation artifacts regenerated against the released SDK.
64
+ - A release-blocking gate requires the SDK pin, the lockfile resolution, and the installed package to all agree, plus a source-import sweep that fails on any non-npm SDK import — so the local-SDK development overlay can never ship.
65
+ - Test suite at 639 files green; coverage, performance, architecture, and eval-regression gates enforced on every cycle. Each wave was verified with the full gate block, a three-lens adversarial review, and a live tmux replay of its pillar scenarios.
66
+
67
+ ## [1.1.0] — 2026-07-03
68
+
69
+ Wave 0 of the post-1.0 evolution effort: trust repairs. Every change closes a defect found by live dogfooding v1.0.0 where the product reported something other than the truth. Ships against @pellux/goodvibes-sdk 0.36.0 (same effort, SDK side).
70
+
71
+ ### Fixed
72
+ - Failing commands are visible again: the SDK masked every command-level failure as "Error: Unknown error", so a red test suite was literally invisible to the model — it would honestly conclude "no failure observed" while your tests were failing. Exit code, stdout, and stderr now reach the model byte-faithfully, and long-output truncation keeps the tail (where test runners print failures) instead of the head. Verified live: the model reads a sabotaged test's actual assertion diff and fixes the right side.
73
+ - Agent auto-commits are scoped: a WRFC chain used to `git add --all`, sweeping your unrelated dirty files into its commit with a truncated message. Commits now include only chain-touched files, with full accurate messages, under a new policy config (`off | scoped | all`, default scoped). Verified live with bait files.
74
+ - Agent chains can no longer die silently: transport failures surface a reasoned failure state in the transcript and status strip, with one bounded automatic retry.
75
+ - Panels work during turns: Ctrl+P / F2 / the status-strip Enter were dead exactly while agents ran — the Inspector was unreachable whenever there was something to inspect. Verified live mid-chain.
76
+ - Panels no longer eat typed text: multi-character input routes to the composer instead of being silently consumed as single-letter panel hotkeys, and a visible focus indicator shows where keys go.
77
+ - Streaming honesty: a stalled provider stream now shows a real stall/reconnect indicator (with attempt counts via the SDK's new STREAM_RETRY event) instead of cycling whimsical labels over dead air — and the indicator correctly stays quiet while a tool is executing.
78
+ - Slash routing is deterministic: `/command` in an empty composer is always a command, never sent to the model as chat (previously state-dependent after overlay use, burning tokens on junk turns).
79
+ - Per-agent stats are real: the Inspector showed Tools 0 / Tokens 0 / Cost $0.00 for agents that wrote hundreds of lines; agents (including WRFC owners, which aggregate their whole chain) now report true token/tool counts, and footer counters survive session resume.
80
+ - Cost is honest: models missing from the old hardcoded ~16-model price table silently showed $0.00 everywhere; pricing now resolves through the SDK catalog with an explicit "unpriced" marker when unknown.
81
+ - Indicator truth: the footer no longer shows `hitl:balanced` alongside DANGER MODE; the effective permission posture wins.
82
+ - Renderer truth: subprocess stderr can no longer leak raw into the transcript and garble cells (`/diff` in a non-git dir now prints one honest sentence, not a fake diff); git repos are re-detected live after `git init` without a restart; cancelled-turn echo no longer mangles its first character.
83
+
84
+ ### Added
85
+ - Auto-resume offer at startup when a previous session exists.
86
+ - `/sessions` groups subagent sessions instead of burying your real session under them.
87
+ - `.goodvibes/` transient state is auto-gitignored in project directories.
88
+ - Wider, persistent Ctrl+C exit-confirmation notice.
89
+
90
+ ### Internal
91
+ - SDK dependency 0.35.0 → 0.36.0; foundation artifacts regenerated (new event contract entries).
92
+ - Local-SDK overlay dev tooling (`scripts/sdk-dev.ts link|status|restore`) with release-blocking gates in release.ts and publish-check so a local SDK can never ship.
93
+ - Wave verified three ways: full gate block, a 3-lens adversarial code review, and a live tmux scenario replay of the five previously-failing dogfood scenarios (all PASS).
94
+
7
95
  ## [1.0.0] — 2026-07-03
8
96
 
9
- ### Changes
10
- - d26fc23f ci: drop temporary renderer-excellence branch trigger after merge
11
- - 532c900b integrate renderer-excellence: renderer performance and correctness effort (v1.0.0 scope)
12
- - cdf5931d fix(input): normalize CR line endings from bracketed pastes
13
- - 1318959f chore(perf): re-capture baseline reference medians on a quiet box
14
- - 946a2c83 integrate WO-210 into renderer-excellence
15
- - 209ade5f perf(budgets): ratchet transcript.append_one 20ms->6ms; streaming tail proven non-material (WO-210)
16
- - c7e445c2 integrate WO-209 into renderer-excellence
17
- - df4d8d03 integrate WO-208 into renderer-excellence
18
- - f5476715 perf(conversation): per-message Line[] cache — append-one 45ms→0.9ms (WO-209)
19
- - 76539cd8 perf(renderer): WO-208 coalesce main.ts render() fan-out into one same-tick composite
20
- - 204342c4 refactor(renderer): delete the six dead exports parked during the R2 literal-ownership split
21
- - 9c1dbdae integrate WO-207 into renderer-excellence
22
- - ae660b2a integrate WO-206 into renderer-excellence
23
- - 6acd74f6 integrate WO-205 into renderer-excellence
24
- - c6eb004c feat(architecture): WO-206 no-unused-exports rule for src/renderer
25
- - 8997719b feat(renderer): WO-207 palette unification across the renderer layer
26
- - 3ec18bb1 refactor(renderer): WO-205 dedup + dead code + honest picker
27
- - 43eb8165 ci: run full CI on renderer-excellence pushes for the v1.0.0 effort
28
- - 6e483f55 fix(renderer): diff panel keeps its shipped colors — the panels are the reference, not diff-view
29
- - 50755108 integrate WO-204 into renderer-excellence
30
- - 17425f6a integrate WO-203 into renderer-excellence
31
- - 68bc13c3 fix(renderer): WO-203 verified correctness fixes
32
- - 721f4d91 feat(renderer): WO-204 — restore conversation diff rendering, align diff surface colors
33
- - c5aff410 integrate WO-202 into renderer-excellence
34
- - 0f03a124 integrate WO-201 into renderer-excellence
35
- - e5ba2978 test(renderer): WO-201 golden contract expansion — splash, transcript scenes, all overlays
36
- - 210d5814 perf(scripts): WO-202 line-production benchmarks above the compositor
37
- - bf6459af fix(tests): skills delete test polls the rescanned state, not just file removal
97
+ The renderer milestone: the full rendering pipeline measured, cached, gated, and visually pinned — plus a fix for a long-shipped multi-line paste defect. 1.0.0 marks the stability posture promised since early development: semver, with incompatible changes landing only in major releases.
98
+
99
+ ### Features
100
+ - Restored conversation diff rendering: expanded diff-shaped tool results render with green add / red delete / blue hunk-header gutters through the same color tokens as the diff panel and the git panel's inline diff, so diffs look identical on every surface. This path had been unwired since v0.9.6; the new no-unused-exports gate exists so nothing goes silently dead again.
101
+ - Unified the renderer palette onto the `UI_TONES` token set — byte-identical color swaps; genuinely distinct palettes (agent-detail neon theme, code-block VS-Code-Dark+ fallback) are preserved exactly as named accents.
102
+ - Long-conversation append performance: a per-message line cache renders only the new message on append (~0.9ms median) instead of rebuilding the whole transcript (~45.5ms and ~71MB of throwaway allocations at 1,000 messages).
103
+ - Render coalescing: same-tick render requests collapse into one composite — streaming bursts previously triggered up to 7 redundant composites per tick.
104
+ - Honest profile picker: dropped the hardcoded fake "Settings" column that showed identical text for every profile; adopted proportional column widths.
105
+
106
+ ### Fixes
107
+ - Multi-line paste works: terminals transmit the line breaks inside a bracketed paste as carriage returns, which the composer inserted verbatim — the input box never grew, ghost text overwrote the prompt marker, and edits acted on an invisible layout. Line endings are now normalized at the paste boundary, and history entries persisted before the fix are laundered on load. (A shipped defect since bracketed paste landed, not a regression from this effort.)
108
+ - Seven rendering-correctness fixes at narrow/short terminal sizes: real viewport height in the agent-detail modal, overlay width clamped ahead of its 20/24-column floors, consistent compact-footer height math, and wide-glyph (CJK/fullwidth) boundary fixes — each landed with a test that failed before the fix.
109
+
110
+ ### Internal
111
+ - Golden-frame harness expanded to 35 committed byte-exact reference frames: the splash at 60/100/140 columns, transcript scenes (plain and diff tool results collapsed/expanded, code blocks on both tokenizer paths, thinking blocks, streaming partials), and every overlay at normal and hostile sizes. Splash goldens render with a pinned version fixture so release version bumps can never break them (the first v1.0.0 validate run failed on exactly that).
112
+ - Performance baseline harness with enforced CI budgets (`scripts/perf-baseline.json`, `perf:check`): startup load, frame-composite p95/p99, and line-production budgets for transcript build/append/resize, panel build, markdown, code blocks, and overlay open. `transcript.append_one` ratcheted 20ms → 6ms.
113
+ - No-unused-exports architecture gate for the renderer layer; three dead renderer modules deleted (`progress.ts`, `file-tree.ts`, `status-token.ts`).
114
+ - Splash art and its wide/narrow glyph typography byte-identical throughout enforced by an empty-diff check every wave plus the splash goldens.
38
115
 
39
116
  ## [0.29.0] — 2026-07-03
40
117
 
41
- ### Changes
42
- - 2842a791 perf(ci): parallelize the per-file test runner; raise the test job timeout
43
- - 218bb217 merge: panel-system remediation — 38 work orders, consoles not signposts (0.29.0)
44
- - a37c028e fix(input): WO-160 smoke findings overlay write-back clobber, /ops view parity, panel-list honesty, modal viewport
45
- - 5741f633 fix(tests): isolate GitPanel non-repo test from the runner's in-tree TMPDIR
46
- - 6eaea7c4 fix(panels): WO-160 consistency sweep alias tests, action-substitute signposts
47
- - 42164e34 fix(panels): cockpit c/i leave the key unconsumed on terminal or absent roster entries
48
- - 10247db1 feat(input): make Ctrl+O a real keybind for the Ops Control panel
49
- - ac598536 refactor(panels): route selected-row reads through getSelectedItem and ban raw [this.selectedIndex]
50
- - 34bac3f0 chore(panels): tighten hex-literal baseline to exact actual counts
51
- - 3d2caf90 integrate WO-153 into panel-ux-remediation
52
- - 1f0ed5ca integrate WO-152 into panel-ux-remediation
53
- - 8b6fbce6 integrate WO-151 into panel-ux-remediation
54
- - ce0b7cb8 fix(panels): closure-audit findings — incident/settings-sync filtered desyncs, subscription start signposts
55
- - ba7db35e feat(panels): WO-152 registry taxonomy, icons, always-register, lifecycle flags
56
- - 7cbdd4ec feat(panels): WO-153 filter-model convergence onto ScrollableListPanel
57
- - 40cb9153 feat(panels): WO-151 keybindings, help discoverability, one hint grammar
58
- - 782e7752 fix(panels): services test/detail act on the filtered selection
59
- - e8783a89 integrate WO-154 into panel-ux-remediation
60
- - cdb399b9 integrate WO-140 into panel-ux-remediation
61
- - 943089ea integrate WO-139 into panel-ux-remediation
62
- - d527c223 integrate WO-141 into panel-ux-remediation
63
- - a65ee307 integrate WO-150 into panel-ux-remediation
64
- - a73e874b feat(panels): WO-140 planning cluster polish (wrfc/project-planning/work-plan)
65
- - e1921ab8 feat(panels): WO-141 keep-panel hardening + residual signpost sweep
66
- - 8b018746 feat(panels): WO-139 provider-cost leftovers — subscription/local-auth/cost-tracker
67
- - da7b9550 feat(panels): WO-150 unify focus ownership in PanelManager
68
- - 4c569ae8 feat(shell): WO-154 main-UX shell splash, footer cost/compact, overlay posture
69
- - 7218349c fix(panels): wave 3a review findings — filtered-selection desyncs, residual signposts, dead constants
70
- - 1cc9f195 integrate WO-138 into panel-ux-remediation
71
- - 179a9a91 integrate WO-137 into panel-ux-remediation
72
- - 4df3036e integrate WO-136 into panel-ux-remediation
73
- - 20533671 integrate WO-135 into panel-ux-remediation
74
- - 2f116f82 integrate WO-134 into panel-ux-remediation
75
- - 595df267 integrate WO-133 into panel-ux-remediation
76
- - 490dc881 feat(panels): WO-137 diagnostics trio — security, debug, system-messages
77
- - 066fd91a feat(panels): WO-138 session-comm quad real actions (remote/communication/routes/qr)
78
- - a9a1ebe0 feat(panels): WO-134 Plugins + Hooks control rooms
79
- - e4380896 feat(panels): WO-136 Docs + Intelligence live actions
80
- - 8f6a3f45 feat(panels): WO-133 explorer + preview lazy loading, git decorations, diff/reload keys
81
- - 744dc460 feat(panels): WO-135 marketplace + skills real actions
82
- - a04c86e9 fix(panels): reserve summary row inside stacked scrollable section budgets
83
- - b2a43d9b fix(panels): reserve a row for the window-summary inside the scrollable budget
84
- - acb3e3b5 fix(panels): bind w to dispatch teamwork review from Tasks; stop git panel swallowing i on loaded repos
85
- - 4bc04330 integrate WO-130 into panel-ux-remediation
86
- - e15c010b integrate WO-128 into panel-ux-remediation
87
- - 3020d2e1 integrate WO-127 into panel-ux-remediation
88
- - 1a0c0d76 integrate WO-132 into panel-ux-remediation
89
- - 79ac40bd integrate WO-131 into panel-ux-remediation
90
- - 61092aa0 integrate WO-126 into panel-ux-remediation
91
- - f83d6820 feat(panels): WO-131 agent-runtime trio — tools + tasks + orchestration
92
- - 8dafc5c0 feat(panels): WO-132 Git + Diff consoles — stage/unstage/commit, explicit init confirm, self-loading diff panel
93
- - 24c5127e feat(panels): WO-128 plan dashboard revival
94
- - 2c8e8d1f feat(panels): WO-126 symbol outline on tree-sitter
95
- - 2d424e1c feat(panels): WO-130 Cockpit operator polish
96
- - 66c0deeb feat(panels): WO-127 eval console — baseline seed, live run, regressions
97
- - 1a53ef2c fix(panels): drop redundant slash-command guidance from knowledge review mode
98
- - 16ba104d fix(tests): operator-surfaces gate verifies forensics alias resolves to incident
99
- - a5b8f4e9 integrate FOLLOWUPS into panel-ux-remediation
100
- - f60988eb integrate WO-125 into panel-ux-remediation
101
- - 39996bfd integrate WO-124 into panel-ux-remediation
102
- - 78fb4916 integrate WO-123 into panel-ux-remediation
103
- - e5294103 integrate WO-122 into panel-ux-remediation
104
- - 371f4d60 integrate WO-121 into panel-ux-remediation
105
- - 1ff1e0ae integrate WO-120 into panel-ux-remediation
106
- - 933b09a3 feat(panels): WO-120 register ops-control panel and wire operator actions
107
- - 39bfc1a1 feat(panels): WO-125 wire worktree and sandbox lifecycle verbs to their registries
108
- - 4992fd03 feat(panels): WO-121 control-plane approvals console
109
- - ea1c47b0 feat(panels): WO-123 knowledge console replaces static command catalogue
110
- - 91273a60 feat(panels): WO-124 settings-sync console — resolve conflicts in-panel, Tab browse modes
111
- - 74f5d39d feat(panels): WO-122 policy governance console actions and depth
112
- - f4679a7e fix(panels): broaden hex-literal ratchet to 3/6/8-digit forms, clear remaining raw hex in fullscreen-primitives and diff-panel
113
- - 6e1b814c fix(panels): forensics resolves as alias to incident, not duplicate registration
114
- - 6a0f4405 fix(tests): operator-surfaces gate asserts merged provider-health id instead of retired providers id
115
- - 09d81371 fix(tests): retarget legacy-turn-bus ban from deleted context-visualizer-panel to its WO-113 successor token-budget-panel
116
- - e835a821 integrate WO-114 into panel-ux-remediation
117
- - 433b4c25 integrate WO-113 into panel-ux-remediation
118
- - 70466337 integrate WO-112 into panel-ux-remediation
119
- - a1ebf5da fix(tests): contract module count 30 after WO-110+WO-111 both deleted a module
120
- - fd25fb19 integrate WO-111 into panel-ux-remediation
121
- - 0d72a2ef integrate WO-110 into panel-ux-remediation
122
- - 0a344b60 WO-112: Provider console merge: providers + accounts into provider-health
123
- - d4c7c8b4 WO-111: Automation console merge: schedule + watchers into automation
124
- - 1fc22d27 WO-110: Agent console merge: agent-logs into inspector
125
- - 0d4858ff WO-114: Incident console merge: forensics into incident
126
- - a4cdfb3c WO-113: Context/token merge: context into tokens
127
- - fd8e84ef integrate WO-002 into panel-ux-remediation
128
- - 1a85ece3 WO-002: Panel palette and chrome sweep (extendPalette everywhere)
129
- - 1cd556da integrate WO-006 into panel-ux-remediation
130
- - d6effd51 integrate WO-005 into panel-ux-remediation
131
- - d7735d20 integrate WO-004 into panel-ux-remediation
132
- - 9b1de69a integrate WO-003 into panel-ux-remediation
133
- - e149323f integrate WO-001 into panel-ux-remediation
134
- - 45e90fa7 WO-006: Shared-test decongestion: per-panel spec modules
135
- - 2d7d5777 WO-001: Theme-token backbone + architecture-gate hex enforcement
136
- - 207cd46b WO-003: Action-callback plumbing pattern + ConfirmState generalization
137
- - abf6771b WO-005: session-maintenance evaluator dedup
138
- - 4fe16129 WO-004: Dead code and dead keybinding removal
118
+ The panel remediation release: a 27-finding audit closed across 38 work orders — panels became working consoles instead of slash-command signposts.
119
+
120
+ ### Features
121
+ - Panels perform their actions directly: ops task/agent interventions, approval resolution, policy simulate/preflight/promote/rollback, knowledge review, settings-sync conflict resolution, worktree/sandbox lifecycle, and git operations run from the panel — keyed, with confirm gates on destructive actions — instead of printing "run /some-command".
122
+ - `Ctrl+O` opens the Ops Control panel as a real, rebindable keybinding.
123
+ - Five panel merges with the old ids preserved as aliases: agent-logs→inspector, context→tokens, providers+accounts→provider-health, forensics→incident.
124
+
125
+ ### Fixes
126
+ - `/shortcuts` and `/commands` overlays actually display: the token-feed pipeline was reverting overlay flags that command handlers set mid-feed, so both commands silently did nothing. Fixed with change-detecting write-back plus a regression test.
127
+ - Every Alt-modifier keybinding works again after a tokenizer/matcher mismatch left them all dead at runtime (Alt+B/Alt+F word navigation, Alt+D and Alt+Y kill-ring bindings).
128
+ - A stale-selection bug class across the Marketplace, Services, Incident, and Settings-sync panels: after filtering, an action could silently apply to the wrong row. Fixed via a shared `getSelectedItem()` accessor plus an architecture rule banning raw selected-index access.
129
+ - Panel focus ownership centralized in PanelManager with a self-healing invariant, replacing scattered per-panel focus bookkeeping.
130
+
131
+ ### Internal
132
+ - Parallel per-file test runner (`scripts/run-tests.ts`): min(8, cores−1) workers with isolated TMPDIRs — the suite dropped from ~10.5 minutes to under 2 locally; the CI test-job cap raised to 20 minutes as a hang backstop.
133
+ - New architecture gates: a raw-hex-literal ratchet (424 → 262 literals, exact per-file baseline), the selected-index rule, registry-time icon uniqueness, panel contract-module parity, an 800-line source-file cap, and a focus-invariant test.
134
+ - +278 tests across the remediation.
139
135
 
140
136
  ## [0.28.0] — 2026-06-30
141
137
 
@@ -185,6 +181,13 @@ Full deep-review audit of the TUI (33 findings fixed, each reviewed to a score o
185
181
  - 97f74119 chore: upgrade @pellux/goodvibes-sdk to 0.34.0
186
182
  - 6de2627a revert: remove daemon control-plane buildout — duplicated @pellux/goodvibes-sdk 0.34.0
187
183
 
184
+ ## [0.25.0] — 2026-06-21
185
+
186
+ ### Changes
187
+ - 5353a7d9 chore: release v0.25.0
188
+ - a8a4cd4f fix(daemon/remote): make runProcess timeout resolve promptly under orphaned children
189
+ - c00461be feat(daemon): implement control-plane operator surfaces for channels, email, calendar, and remote execution
190
+
188
191
  ## [0.24.1] — 2026-06-17
189
192
 
190
193
  ### Changes
package/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  [![CI](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.7.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
6
6
 
7
7
  A terminal-native AI coding, operations, automation, knowledge, and integration console with a typed runtime, omnichannel surfaces, structured memory/knowledge, and a raw ANSI renderer.
8
8
 
9
- > ⚠️ **Active early development pre-1.0.** This project is under active early development. CLI flags, config keys, slash commands, key bindings, daemon routes, and on-disk layouts can and do change quickly sometimes across patch releases. There are no legacy/compat shims. Documentation always describes the **current** behavior, not historical behavior. When 1.0.0 ships the project freezes to enterprise-grade stability guarantees (semver, deprecation windows, migration guides). Until then: pin exact versions and read `CHANGELOG.md` before upgrading.
9
+ > **1.0.0 shipped 2026-07-03.** From 1.0.0 the project follows the stability posture promised for this milestone: semver, with incompatible changes to CLI flags, config keys, slash commands, key bindings, daemon routes, and on-disk layouts landing only in major releases, and deprecations noted in `CHANGELOG.md` first. Documentation always describes the **current** behavior, not historical behavior.
10
10
 
11
11
  <!-- screenshot -->
12
12
 
@@ -146,6 +146,7 @@ The TUI now consumes the extracted `@pellux/goodvibes-sdk` (`0.34.0`) platform l
146
146
  - Shared panel workspace layout budgeting with renderer-owned visible-row budgets
147
147
  - Copy/selection logic that strips decorative gutters and visual scaffolding from clipboard output
148
148
  - Line-count indicator rendered right-aligned inside the prompt border on multi-line input (footer height stays stable regardless of prompt line count)
149
+ - Multi-line clipboard paste handled at the input boundary: bracketed-paste carriage-return line separators are normalized to newlines, the composer grows to the pasted line count, and pastes longer than 8 lines collapse to a compact paste marker
149
150
 
150
151
  ### Conversation And Transcript Workflow
151
152
  - Markdown rendering, syntax highlighting, inline diffs, collapsible blocks, bookmarks, block copy, and block save
@@ -156,12 +157,12 @@ The TUI now consumes the extracted `@pellux/goodvibes-sdk` (`0.34.0`) platform l
156
157
 
157
158
  ### Panels, Control Rooms, And Workspaces
158
159
  - Split-pane panel system with panel picker, layout control, and keyboard-first focus behavior
159
- - Dedicated control rooms for provider accounts, provider health, local auth, settings sync, remote, MCP, marketplace, orchestration, tasks, intelligence, worktrees, approvals, forensics, security, policy, cockpit, system messages, and more
160
- - Summary-first heavy panels with posture, issues, next actions, and detail regions
161
- - Routed system-message workspace for startup discovery and operational notices
160
+ - Six persistent consoles the Fleet hub plus git, diff, cost, tokens, and local-auth with heavier operator surfaces (providers, remote, MCP, marketplace, orchestration, tasks, intelligence, worktrees, approvals, policy, security, settings sync, and more) re-homed as configuration/review modals on a single liveness-enforcing config-modal host
161
+ - Retired panel ids resolve honestly through aliases, modal redirects, and "this moved" notices, so `/panel open <id>` and saved layouts never point at nothing
162
+ - Summary-first heavy surfaces with posture, issues, next actions, and detail regions
162
163
  - Cross-panel actions between Explorer, Preview, and Symbols so file browsing can open previews and jump to symbol locations directly from panel focus
163
- - Live panels stay subscribed while open, so agent, tool, and thinking updates continue while the panel is visible
164
- - Dedicated `Agents` panel provides a view-only live peek into running agent sessions while the background-process strip remains the fast-access surface below the prompt
164
+ - Live panels stay subscribed while open and repaint while the main thread is idle, so agent, tool, and thinking updates never look frozen
165
+ - The Fleet panel is the live control room for running agents, workstreams, and scheduled jobs attach/detach (detach never kills), steer, pause/resume, and capability-gated interrupt/kill reached by `F2`, `Ctrl+O`, or the footer `[Enter]`
165
166
 
166
167
  ### Modal And Selection UX
167
168
  - Modal stack navigation that unwinds correctly back to the slash-command menu and prior nested modals
@@ -586,7 +587,7 @@ Changing `service.autostart` or `service.enabled` from `/config` reconciles the
586
587
 
587
588
  GoodVibes is built around routing runtime state to the right surface.
588
589
 
589
- The current product ships dedicated workspaces for:
590
+ The Fleet panel is the one persistent operator control room; most other operator surfaces now open as configuration and review modals on a shared, liveness-enforcing config-modal host rather than as standing panels. The product surfaces state for:
590
591
 
591
592
  - provider accounts and provider health
592
593
  - local auth and local service posture
@@ -1264,6 +1265,9 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1264
1265
  | `/session [action]` | `/sess` | Full session management: list, rename, resume, fork, save, info, export, search, delete |
1265
1266
  | `/undo [file]` | `/u` | Remove last turn, or `/undo file` to revert last file write/edit |
1266
1267
  | `/redo [file]` | — | Restore last undone turn, or `/redo file` to re-apply last reverted file |
1268
+ | `/checkpoints` | — | List workspace checkpoints, newest first |
1269
+ | `/checkpoint [label]` | — | Create a manual workspace checkpoint (forensic retention) |
1270
+ | `/rewind [id]` | — | Preview and restore a workspace checkpoint (files only — conversation history is unchanged) |
1267
1271
  | `/retry [text]` | `/r` | Re-send the last user message |
1268
1272
  | `/template` | `/tmpl` | Manage prompt templates: save, use, list, edit, delete |
1269
1273
  | `/tools` | `/t` | List available tools |
@@ -1274,8 +1278,9 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1274
1278
  | `/memory [action]` | — | Session memory management: `list`, `add <text>`, `remove <id>` |
1275
1279
  | `/keep <text>` | — | Pin text to session memory; survives context compaction |
1276
1280
  | `/memory-sync [action]` | `/memsync` | Durable memory export/import and bundle exchange: `export <path> [scope]`, `import <path>` |
1277
- | `/recall [action]` | `/rc` | Durable knowledge and memory substrate: capture, review, explain, export, import, and handoff |
1281
+ | `/recall [action]` | `/rc` | Durable knowledge and memory substrate: capture, review, explain, inspect `injections`, export, import, and handoff |
1278
1282
  | `/knowledge [action]` | `/know`, `/kb` | Structured knowledge graph: ingest URLs/bookmarks, inspect issues, build packets, and run consolidation jobs |
1283
+ | `/codebase [action]` | — | Repo source-tree code index: `build`, `status`, and `search` |
1279
1284
  | `/context` | `/ctx` | Inspect context window usage (token breakdown per message) |
1280
1285
  | `/next-error` | `/ne` | Jump to the next error message in the conversation |
1281
1286
  | `/prev-error` | `/pe` | Jump to the previous error message in the conversation |
@@ -1286,6 +1291,7 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1286
1291
  | `/scan` | — | Scan for local LLM servers |
1287
1292
  | `/plan [goal]` | — | Inspect or seed TUI-owned project planning state; `panel`, `approve`, `list`, and `show <id>` are supported |
1288
1293
  | `/work-plan [action]` | `/wp`, `/todo`, `/workplan` | Open or update the persistent workspace work-plan checklist |
1294
+ | `/workstream [action]` | — | Author and oversee multi-phase agent workstreams (orchestration engine) |
1289
1295
  | `/panel [action]` | `/panels` | Panel management: open, close, list, toggle, move, focus, split, width, height |
1290
1296
  | `/plugin [action]` | — | Manage plugins (enable/disable/reload/list) |
1291
1297
  | `/marketplace [action]` | — | Browse curated plugin, skill, hook-pack, and policy-pack surfaces |
@@ -1296,6 +1302,7 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1296
1302
  | `/wrfc` | — | Show WRFC chain status, constraint satisfaction counts, and per-constraint `[SAT]`/`[UNS]`/`[UNV]` breakdown |
1297
1303
  | `/health [action]` | — | Unified runtime health review and repair entry point |
1298
1304
  | `/guidance [action]` | — | Contextual operational guidance without cluttering the conversation |
1305
+ | `/test [pattern]` | — | Run the project test script and show pass/fail results |
1299
1306
  | `/remote [action]` | — | Distributed peer, node-host contract, work-queue, and artifact control room |
1300
1307
  | `/sandbox [action]` | — | Isolation presets, doctor/probe, sessions, and QEMU setup flows |
1301
1308
  | `/setup [action]` | — | First-run readiness, services, sandbox, transfer bundles, and deep links |
@@ -1309,6 +1316,8 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1309
1316
  | `/keybindings` | `/kb` | List current keyboard bindings and their config file path |
1310
1317
  | `/schedule [action]` | `/sched` | Manage scheduled agent tasks (cron): add, list, remove, enable, disable, run |
1311
1318
  | `/image <path>` | `/img` | Attach an image file to the next message |
1319
+ | `/imagine <prompt>` | — | Generate an image from a prompt |
1320
+ | `/search <query>` | — | Search the web and render ranked results with source labels (`--limit <n>`) |
1312
1321
  | `/paste` | `/clip` | Pull supported text or image data directly from the system clipboard into the prompt |
1313
1322
  | `/refresh-models` | — | Refresh model catalog, benchmarks, and token limits |
1314
1323
  | `/notify [action]` | `/ntf` | Manage webhook notifications (ntfy.sh): add, remove, list, clear, test |
@@ -1318,7 +1327,8 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1318
1327
  | `/diff [target]` | `/d` | Show unified diff: session, head, working, staged, or a git ref |
1319
1328
  | `/mcp [add\|remove\|reload\|tools]` | — | Manage MCP servers at runtime and list connected tools |
1320
1329
  | `/help [command]` | `/h`, `/?` | Show available commands and keyboard shortcuts |
1321
- | `/quit` | `/q`, `/:q` | Exit the application |
1330
+ | `/quit` | `/:q` | Exit the application |
1331
+ | `/wq` | `/:wq` | Commit all git changes, then exit |
1322
1332
 
1323
1333
  > **Tip:** Use the `/add-provider` skill for interactive guided provider setup with smart defaults for popular providers.
1324
1334
  >
@@ -1386,9 +1396,14 @@ All shortcuts are customizable via `~/.goodvibes/tui/keybindings.json`. Use `/ke
1386
1396
  | Key | Action |
1387
1397
  |-----|--------|
1388
1398
  | `Ctrl+P` | Toggle panel sidebar |
1389
- | `Ctrl+}` | Next panel tab |
1390
- | `Ctrl+~` | Previous panel tab |
1391
- | `,` / `.` | Cycle panel tabs (when panel focused) |
1399
+ | `F2` | Open and focus the Fleet panel |
1400
+ | `Ctrl+]` / `Ctrl+PageDown` | Next panel tab |
1401
+ | `Ctrl+PageUp` | Previous panel tab |
1402
+ | `Alt+1`…`Alt+9` | Jump to panel tab 1–9 |
1403
+ | `Ctrl+X` | Close the focused panel |
1404
+ | `Ctrl+Shift+X` | Close all panels |
1405
+ | `Ctrl+O` | Open and focus the Fleet panel (formerly Ops Control) |
1406
+ | `Ctrl+G` | Toggle focus between split panes |
1392
1407
 
1393
1408
  ### System
1394
1409
 
@@ -1652,6 +1667,9 @@ src/
1652
1667
  - **Backend-first external surface** — the daemon/control plane exposes typed HTTP/gateway methods for knowledge, artifacts, media, search, channels, and remote peers so future clients do not have to reimplement runtime logic
1653
1668
  - **Plugin system** — manifest.json + sandboxed API surface for commands, providers, tools, gateway methods, channels, embeddings, voice, media, and search
1654
1669
  - **Crash recovery** — periodic JSONL snapshots with recovery prompt on next startup; an fsync-per-record append-only transcript journal between snapshots is replayed at every resume seam (command resume, Ctrl+R crash recovery, panel resume) for SIGKILL-proof durability
1670
+ - **Golden-frame regression harness** — 35 committed byte-exact reference frames (including the splash at three widths) pin the renderer's output; any unintended visual change fails CI
1671
+ - **Render coalescing** — same-tick render requests collapse into one composite via `src/runtime/render-scheduler.ts`, so a streaming burst pays for one frame instead of several
1672
+ - **Per-message line cache** — `src/core/conversation-line-cache.ts` renders only the appended message on transcript growth (~0.9ms) instead of rebuilding the whole conversation (~45ms at 1,000 messages)
1655
1673
 
1656
1674
  ---
1657
1675
 
@@ -1669,7 +1687,7 @@ bun run dev
1669
1687
  bun test
1670
1688
  ```
1671
1689
 
1672
- 8,978 tests across contract, security, release gate, runtime, renderer, panel, integration, and UX anti-regression suites. Performance budget gate runs as part of CI — the build fails if any of the 5 perf budgets (store update latency, event dispatch latency, tool execution overhead, compaction duration, startup time) are exceeded.
1690
+ The suite spans 623 test files (contract, security, release gate, runtime, renderer, panel, integration, and UX anti-regression), run through a parallel per-file runner (`scripts/run-tests.ts`). Performance budgets run as a CI gate — the build fails if startup load, frame-composite p95/p99, or any line-production budget (transcript build/append/resize, panel two-pane build, markdown render, code-block render on both tokenizer paths, overlay open) exceeds the ratcheted values in `scripts/perf-baseline.json`. Architecture gates run alongside: import-cycle and layer rules, an 800-line cap on non-test source files, a raw-hex-literal ratchet, icon-uniqueness and panel contract-parity checks, and a no-unused-exports rule for the renderer layer (`scripts/check-architecture.ts`, `scripts/no-unused-exports-rule.ts`).
1673
1691
 
1674
1692
  ### Build standalone binary
1675
1693
 
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "0.35.0"
6
+ "version": "0.38.0"
7
7
  },
8
8
  "auth": {
9
9
  "modes": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-tui",
3
- "version": "1.0.0",
3
+ "version": "1.7.0",
4
4
  "description": "Terminal-native GoodVibes product for coding, operations, automation, knowledge, channels, and daemon-backed control-plane workflows.",
5
5
  "type": "module",
6
6
  "main": "src/main.ts",
@@ -99,7 +99,7 @@
99
99
  "@anthropic-ai/vertex-sdk": "^0.16.0",
100
100
  "@ast-grep/napi": "^0.42.0",
101
101
  "@aws/bedrock-token-generator": "^1.1.0",
102
- "@pellux/goodvibes-sdk": "0.35.0",
102
+ "@pellux/goodvibes-sdk": "0.38.0",
103
103
  "bash-language-server": "^5.6.0",
104
104
  "fuse.js": "^7.1.0",
105
105
  "graphql": "^16.13.2",
@@ -0,0 +1,32 @@
1
+ import { existsSync, readFileSync, appendFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ /**
5
+ * The TUI's own `.goodvibes/` directory (logs, overflow buffers, exec output,
6
+ * cache, session state, etc.) is transient scratch space, not project source —
7
+ * but nothing else in the codebase excludes it from the *project's* git
8
+ * history. Any `git add -A` (write-quit's auto-commit, a WRFC chain's own
9
+ * commit, etc.) sweeps the whole tree in unless the project's .gitignore
10
+ * already happens to exclude it. Idempotent and append-only: never rewrites
11
+ * or reorders a project's existing .gitignore, only adds the rule if it is
12
+ * verifiably absent, and never touches a directory that isn't a git repo.
13
+ */
14
+ const GOODVIBES_IGNORE_PATTERN = /(^|\n)[ \t]*\/?\.goodvibes\/?\*?[ \t]*(\n|$)/;
15
+
16
+ export function ensureGoodvibesGitignore(projectRoot: string): void {
17
+ try {
18
+ if (!existsSync(join(projectRoot, '.git'))) return; // only matters for git projects
19
+ const gitignorePath = join(projectRoot, '.gitignore');
20
+ const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';
21
+ if (GOODVIBES_IGNORE_PATTERN.test(existing)) return; // already excluded
22
+ const rule = '# goodvibes-tui transient state\n.goodvibes/\n';
23
+ if (existing.length === 0) {
24
+ writeFileSync(gitignorePath, rule);
25
+ return;
26
+ }
27
+ const separator = existing.endsWith('\n') ? '\n' : '\n\n';
28
+ appendFileSync(gitignorePath, separator + rule);
29
+ } catch {
30
+ // Best-effort only — never block startup on a gitignore write failure.
31
+ }
32
+ }
@@ -22,6 +22,7 @@ import {
22
22
  renderOnboardingCliStatus,
23
23
  } from './index.ts';
24
24
  import { buildCliServicePosture } from './service-posture.ts';
25
+ import { ensureGoodvibesGitignore } from './ensure-goodvibes-gitignore.ts';
25
26
 
26
27
  type ShellEntrypointOwnership = {
27
28
  readonly workingDirectory: string;
@@ -95,6 +96,7 @@ export async function prepareShellCliRuntime(
95
96
  homeDirectory: bootstrapHomeDirectory,
96
97
  } = resolveShellEntrypointOwnership(roots, cli.flags.workingDir ?? (cli.command === 'tui' ? cli.commandArgs[0] : undefined));
97
98
  configureActivityLogger(join(bootstrapWorkingDir, '.goodvibes', 'logs'));
99
+ ensureGoodvibesGitignore(bootstrapWorkingDir);
98
100
  const configManager = new ConfigManager({
99
101
  workingDir: bootstrapWorkingDir,
100
102
  homeDir: bootstrapHomeDirectory,
@@ -0,0 +1,67 @@
1
+ /**
2
+ * alert-gating — shared config + focus gating logic for the unfocused-user
3
+ * alert classes (budget-breach, long-task, agent/chain failure,
4
+ * awaiting-approval). Each alert class has its own on/off config key
5
+ * (default true); a single master key, `behavior.notifyOnlyWhenUnfocused`
6
+ * (default true), decides whether any of them additionally require the
7
+ * terminal to be unfocused-or-unknown before firing.
8
+ *
9
+ * Extracted so every alert-class module (long-task-notifier.ts,
10
+ * budget-breach-notifier.ts, approval-alert.ts, and the agent/chain-failure
11
+ * wiring in turn-event-wiring.ts) shares one implementation of "should this
12
+ * fire right now" instead of re-deriving the same two config reads and the
13
+ * same focus check.
14
+ */
15
+ import type { FocusTracker } from './focus-tracker.ts';
16
+
17
+ /** Minimal config-read surface every gating check needs. */
18
+ export type ConfigGet = (key: string) => unknown;
19
+
20
+ /** Read a TUI-local synthetic boolean setting, defaulting when absent/invalid. */
21
+ export function readBooleanConfig(configGet: ConfigGet, key: string, defaultValue: boolean): boolean {
22
+ const raw = configGet(key);
23
+ if (typeof raw === 'boolean') return raw;
24
+ if (raw === undefined || raw === null) return defaultValue;
25
+ // Tolerate string/number forms the same way the rest of the config layer does
26
+ // (settings-modal writes real booleans, but env/file edits may not).
27
+ if (raw === 'true' || raw === 1) return true;
28
+ if (raw === 'false' || raw === 0) return false;
29
+ return defaultValue;
30
+ }
31
+
32
+ /** `behavior.notifyOnlyWhenUnfocused` — master gate, default on. */
33
+ export function readNotifyOnlyWhenUnfocused(configGet: ConfigGet): boolean {
34
+ return readBooleanConfig(configGet, 'behavior.notifyOnlyWhenUnfocused', true);
35
+ }
36
+
37
+ /**
38
+ * Decide whether a given alert class should fire right now.
39
+ *
40
+ * `classConfigKey` is the per-class on/off switch (e.g.
41
+ * 'behavior.notifyOnBudgetBreach'); default true when absent. When that key
42
+ * is off, the class never fires regardless of focus. When it's on, the
43
+ * result additionally depends on the master `notifyOnlyWhenUnfocused` gate:
44
+ * if that master gate is off, the class fires unconditionally (today's
45
+ * pre-focus-tracking behavior); if on (the default), it only fires when the
46
+ * terminal is unfocused or focus state was never observed (see
47
+ * FocusTracker.shouldAlertWhenUnfocused).
48
+ */
49
+ export function shouldFireAlert(
50
+ focusTracker: Pick<FocusTracker, 'shouldAlertWhenUnfocused'>,
51
+ configGet: ConfigGet,
52
+ classConfigKey: string,
53
+ ): boolean {
54
+ if (!readBooleanConfig(configGet, classConfigKey, true)) return false;
55
+ if (!readNotifyOnlyWhenUnfocused(configGet)) return true;
56
+ return focusTracker.shouldAlertWhenUnfocused();
57
+ }
58
+
59
+ /**
60
+ * notifyCompletion (SDK platform/utils) only rings the bell above 5s of
61
+ * "duration" and only pops a desktop notification above 30s — a heuristic
62
+ * tuned for long-running-turn notifications. The alert classes in this
63
+ * directory are point-in-time events with no natural duration, so they pass
64
+ * this constant as the `durationMs` argument to force both the bell and the
65
+ * desktop popup unconditionally.
66
+ */
67
+ export const FORCE_NOTIFY_DURATION_MS = 30_001;