@pellux/goodvibes-tui 0.29.0 → 1.1.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 (83) hide show
  1. package/CHANGELOG.md +69 -98
  2. package/README.md +16 -7
  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/conversation-line-cache.ts +432 -0
  8. package/src/core/conversation-rendering.ts +11 -3
  9. package/src/core/conversation.ts +90 -4
  10. package/src/core/stream-event-wiring.ts +104 -2
  11. package/src/core/stream-stall-watchdog.ts +41 -17
  12. package/src/export/cost-utils.ts +90 -8
  13. package/src/input/command-registry.ts +16 -0
  14. package/src/input/commands/diff-runtime.ts +61 -30
  15. package/src/input/commands/session-content.ts +12 -0
  16. package/src/input/commands/session-workflow.ts +3 -0
  17. package/src/input/commands/share-runtime.ts +9 -2
  18. package/src/input/handler-content-actions.ts +30 -11
  19. package/src/input/handler-feed-routes.ts +63 -1
  20. package/src/input/handler-feed.ts +12 -0
  21. package/src/input/handler-interactions.ts +2 -0
  22. package/src/input/handler-types.ts +1 -0
  23. package/src/input/handler.ts +4 -0
  24. package/src/input/input-history.ts +17 -4
  25. package/src/main.ts +27 -23
  26. package/src/panels/agent-inspector-shared.ts +33 -10
  27. package/src/panels/base-panel.ts +1 -1
  28. package/src/panels/builtin/development.ts +1 -1
  29. package/src/panels/cockpit-read-model.ts +16 -11
  30. package/src/panels/cost-tracker-panel.ts +28 -5
  31. package/src/panels/debug-panel.ts +11 -5
  32. package/src/panels/diff-panel.ts +122 -22
  33. package/src/panels/docs-panel.ts +9 -0
  34. package/src/panels/file-explorer-panel.ts +9 -0
  35. package/src/panels/git-panel.ts +11 -11
  36. package/src/panels/knowledge-graph-panel.ts +9 -0
  37. package/src/panels/local-auth-panel.ts +10 -0
  38. package/src/panels/panel-list-panel.ts +9 -0
  39. package/src/panels/project-planning-panel.ts +10 -0
  40. package/src/panels/provider-health-tracker.ts +5 -1
  41. package/src/panels/provider-health-views.ts +8 -1
  42. package/src/panels/scrollable-list-panel.ts +9 -0
  43. package/src/panels/session-browser-panel.ts +9 -0
  44. package/src/panels/token-budget-panel.ts +5 -3
  45. package/src/panels/types.ts +13 -0
  46. package/src/panels/work-plan-panel.ts +10 -0
  47. package/src/renderer/agent-detail-modal.ts +42 -12
  48. package/src/renderer/code-block.ts +58 -28
  49. package/src/renderer/context-inspector.ts +3 -6
  50. package/src/renderer/conversation-surface.ts +1 -21
  51. package/src/renderer/diff-view.ts +6 -4
  52. package/src/renderer/fullscreen-primitives.ts +1 -1
  53. package/src/renderer/fullscreen-workspace.ts +2 -7
  54. package/src/renderer/hint-grammar.ts +1 -1
  55. package/src/renderer/history-search-overlay.ts +10 -16
  56. package/src/renderer/markdown.ts +9 -1
  57. package/src/renderer/model-picker-overlay.ts +8 -499
  58. package/src/renderer/model-workspace.ts +9 -24
  59. package/src/renderer/overlay-box.ts +7 -9
  60. package/src/renderer/process-indicator.ts +13 -25
  61. package/src/renderer/process-modal.ts +17 -2
  62. package/src/renderer/profile-picker-modal.ts +13 -14
  63. package/src/renderer/prompt-content-width.ts +16 -0
  64. package/src/renderer/selection-modal-overlay.ts +3 -1
  65. package/src/renderer/semantic-diff.ts +1 -1
  66. package/src/renderer/settings-modal-helpers.ts +10 -34
  67. package/src/renderer/shell-surface.ts +29 -9
  68. package/src/renderer/surface-layout.ts +0 -12
  69. package/src/renderer/term-caps.ts +1 -1
  70. package/src/renderer/tool-call.ts +6 -20
  71. package/src/renderer/ui-factory.ts +98 -14
  72. package/src/renderer/ui-primitives.ts +18 -1
  73. package/src/runtime/bootstrap-command-context.ts +3 -0
  74. package/src/runtime/bootstrap-command-parts.ts +3 -1
  75. package/src/runtime/bootstrap-core.ts +5 -0
  76. package/src/runtime/bootstrap-hook-bridge.ts +5 -0
  77. package/src/runtime/bootstrap-shell.ts +12 -1
  78. package/src/runtime/render-scheduler.ts +80 -0
  79. package/src/utils/splash-lines.ts +10 -2
  80. package/src/version.ts +1 -1
  81. package/src/renderer/file-tree.ts +0 -153
  82. package/src/renderer/progress.ts +0 -100
  83. package/src/renderer/status-token.ts +0 -67
package/CHANGELOG.md CHANGED
@@ -4,106 +4,70 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
- ## [0.29.0] — 2026-07-03
7
+ ## [1.1.0] — 2026-07-03
8
8
 
9
9
  ### Changes
10
- - 2842a791 perf(ci): parallelize the per-file test runner; raise the test job timeout
11
- - 218bb217 merge: panel-system remediation — 38 work orders, consoles not signposts (0.29.0)
12
- - a37c028e fix(input): WO-160 smoke findings — overlay write-back clobber, /ops view parity, panel-list honesty, modal viewport
13
- - 5741f633 fix(tests): isolate GitPanel non-repo test from the runner's in-tree TMPDIR
14
- - 6eaea7c4 fix(panels): WO-160 consistency sweep alias tests, action-substitute signposts
15
- - 42164e34 fix(panels): cockpit c/i leave the key unconsumed on terminal or absent roster entries
16
- - 10247db1 feat(input): make Ctrl+O a real keybind for the Ops Control panel
17
- - ac598536 refactor(panels): route selected-row reads through getSelectedItem and ban raw [this.selectedIndex]
18
- - 34bac3f0 chore(panels): tighten hex-literal baseline to exact actual counts
19
- - 3d2caf90 integrate WO-153 into panel-ux-remediation
20
- - 1f0ed5ca integrate WO-152 into panel-ux-remediation
21
- - 8b6fbce6 integrate WO-151 into panel-ux-remediation
22
- - ce0b7cb8 fix(panels): closure-audit findings incident/settings-sync filtered desyncs, subscription start signposts
23
- - ba7db35e feat(panels): WO-152 registry taxonomy, icons, always-register, lifecycle flags
24
- - 7cbdd4ec feat(panels): WO-153 filter-model convergence onto ScrollableListPanel
25
- - 40cb9153 feat(panels): WO-151 keybindings, help discoverability, one hint grammar
26
- - 782e7752 fix(panels): services test/detail act on the filtered selection
27
- - e8783a89 integrate WO-154 into panel-ux-remediation
28
- - cdb399b9 integrate WO-140 into panel-ux-remediation
29
- - 943089ea integrate WO-139 into panel-ux-remediation
30
- - d527c223 integrate WO-141 into panel-ux-remediation
31
- - a65ee307 integrate WO-150 into panel-ux-remediation
32
- - a73e874b feat(panels): WO-140 planning cluster polish (wrfc/project-planning/work-plan)
33
- - e1921ab8 feat(panels): WO-141 keep-panel hardening + residual signpost sweep
34
- - 8b018746 feat(panels): WO-139 provider-cost leftovers — subscription/local-auth/cost-tracker
35
- - da7b9550 feat(panels): WO-150 unify focus ownership in PanelManager
36
- - 4c569ae8 feat(shell): WO-154 main-UX shell splash, footer cost/compact, overlay posture
37
- - 7218349c fix(panels): wave 3a review findingsfiltered-selection desyncs, residual signposts, dead constants
38
- - 1cc9f195 integrate WO-138 into panel-ux-remediation
39
- - 179a9a91 integrate WO-137 into panel-ux-remediation
40
- - 4df3036e integrate WO-136 into panel-ux-remediation
41
- - 20533671 integrate WO-135 into panel-ux-remediation
42
- - 2f116f82 integrate WO-134 into panel-ux-remediation
43
- - 595df267 integrate WO-133 into panel-ux-remediation
44
- - 490dc881 feat(panels): WO-137 diagnostics trio security, debug, system-messages
45
- - 066fd91a feat(panels): WO-138 session-comm quad real actions (remote/communication/routes/qr)
46
- - a9a1ebe0 feat(panels): WO-134 Plugins + Hooks control rooms
47
- - e4380896 feat(panels): WO-136 Docs + Intelligence live actions
48
- - 8f6a3f45 feat(panels): WO-133 explorer + preview lazy loading, git decorations, diff/reload keys
49
- - 744dc460 feat(panels): WO-135 marketplace + skills real actions
50
- - a04c86e9 fix(panels): reserve summary row inside stacked scrollable section budgets
51
- - b2a43d9b fix(panels): reserve a row for the window-summary inside the scrollable budget
52
- - acb3e3b5 fix(panels): bind w to dispatch teamwork review from Tasks; stop git panel swallowing i on loaded repos
53
- - 4bc04330 integrate WO-130 into panel-ux-remediation
54
- - e15c010b integrate WO-128 into panel-ux-remediation
55
- - 3020d2e1 integrate WO-127 into panel-ux-remediation
56
- - 1a0c0d76 integrate WO-132 into panel-ux-remediation
57
- - 79ac40bd integrate WO-131 into panel-ux-remediation
58
- - 61092aa0 integrate WO-126 into panel-ux-remediation
59
- - f83d6820 feat(panels): WO-131 agent-runtime trio tools + tasks + orchestration
60
- - 8dafc5c0 feat(panels): WO-132 Git + Diff consoles — stage/unstage/commit, explicit init confirm, self-loading diff panel
61
- - 24c5127e feat(panels): WO-128 plan dashboard revival
62
- - 2c8e8d1f feat(panels): WO-126 symbol outline on tree-sitter
63
- - 2d424e1c feat(panels): WO-130 Cockpit operator polish
64
- - 66c0deeb feat(panels): WO-127 eval console baseline seed, live run, regressions
65
- - 1a53ef2c fix(panels): drop redundant slash-command guidance from knowledge review mode
66
- - 16ba104d fix(tests): operator-surfaces gate verifies forensics alias resolves to incident
67
- - a5b8f4e9 integrate FOLLOWUPS into panel-ux-remediation
68
- - f60988eb integrate WO-125 into panel-ux-remediation
69
- - 39996bfd integrate WO-124 into panel-ux-remediation
70
- - 78fb4916 integrate WO-123 into panel-ux-remediation
71
- - e5294103 integrate WO-122 into panel-ux-remediation
72
- - 371f4d60 integrate WO-121 into panel-ux-remediation
73
- - 1ff1e0ae integrate WO-120 into panel-ux-remediation
74
- - 933b09a3 feat(panels): WO-120 register ops-control panel and wire operator actions
75
- - 39bfc1a1 feat(panels): WO-125 wire worktree and sandbox lifecycle verbs to their registries
76
- - 4992fd03 feat(panels): WO-121 control-plane approvals console
77
- - ea1c47b0 feat(panels): WO-123 knowledge console replaces static command catalogue
78
- - 91273a60 feat(panels): WO-124 settings-sync console — resolve conflicts in-panel, Tab browse modes
79
- - 74f5d39d feat(panels): WO-122 policy governance console actions and depth
80
- - f4679a7e fix(panels): broaden hex-literal ratchet to 3/6/8-digit forms, clear remaining raw hex in fullscreen-primitives and diff-panel
81
- - 6e1b814c fix(panels): forensics resolves as alias to incident, not duplicate registration
82
- - 6a0f4405 fix(tests): operator-surfaces gate asserts merged provider-health id instead of retired providers id
83
- - 09d81371 fix(tests): retarget legacy-turn-bus ban from deleted context-visualizer-panel to its WO-113 successor token-budget-panel
84
- - e835a821 integrate WO-114 into panel-ux-remediation
85
- - 433b4c25 integrate WO-113 into panel-ux-remediation
86
- - 70466337 integrate WO-112 into panel-ux-remediation
87
- - a1ebf5da fix(tests): contract module count 30 after WO-110+WO-111 both deleted a module
88
- - fd25fb19 integrate WO-111 into panel-ux-remediation
89
- - 0d72a2ef integrate WO-110 into panel-ux-remediation
90
- - 0a344b60 WO-112: Provider console merge: providers + accounts into provider-health
91
- - d4c7c8b4 WO-111: Automation console merge: schedule + watchers into automation
92
- - 1fc22d27 WO-110: Agent console merge: agent-logs into inspector
93
- - 0d4858ff WO-114: Incident console merge: forensics into incident
94
- - a4cdfb3c WO-113: Context/token merge: context into tokens
95
- - fd8e84ef integrate WO-002 into panel-ux-remediation
96
- - 1a85ece3 WO-002: Panel palette and chrome sweep (extendPalette everywhere)
97
- - 1cd556da integrate WO-006 into panel-ux-remediation
98
- - d6effd51 integrate WO-005 into panel-ux-remediation
99
- - d7735d20 integrate WO-004 into panel-ux-remediation
100
- - 9b1de69a integrate WO-003 into panel-ux-remediation
101
- - e149323f integrate WO-001 into panel-ux-remediation
102
- - 45e90fa7 WO-006: Shared-test decongestion: per-panel spec modules
103
- - 2d7d5777 WO-001: Theme-token backbone + architecture-gate hex enforcement
104
- - 207cd46b WO-003: Action-callback plumbing pattern + ConfirmState generalization
105
- - abf6771b WO-005: session-maintenance evaluator dedup
106
- - 4fe16129 WO-004: Dead code and dead keybinding removal
10
+ - e3d20840 chore(artifacts): regenerate foundation artifacts against SDK 0.36.0
11
+ - 2dab222b integrate wave0: trust repairs (v1.1.0 scope)
12
+ - d3116e0a chore(deps): bump @pellux/goodvibes-sdk to 0.36.0 (Wave-0 trust repairs)
13
+ - 08caa3a3 test(tools): pin the SDK 0.36 tail-preserving truncation contract
14
+ - e1e124b7 chore: trim stall-gate comment to keep main.ts under the 800-line cap
15
+ - 57a9c5bd fix(stream): suppress stall indicator false-positive during tool execution
16
+ - 96225275 fix(test-runner): fence git discovery at the per-file temp root
17
+ - efbfc8de chore(wave0): trim main.ts/git-panel.ts back to the 800-line cap after wave merges
18
+ - e7d166e4 integrate WO-315 (W0.10 cost-truth unpriced markers) into wave0
19
+ - 83d77e50 integrate WO-314 (W0.9 per-agent stats + footer usage hydration) into wave0
20
+ - 5801ced8 integrate WO-313 (W0.7 stream stall honesty, TUI half) into wave0
21
+ - 5abfed54 integrate WO-312 (W0.4/5/6/11/12 diff+slash+ctrlc cluster) into wave0
22
+ - 40fdee43 integrate WO-311 (W0.8 panel focus/burst/indicator) into wave0
23
+ - 8e61b248 fix(wo312): Wave 0 TUI trust-repair cluster (W0.4/W0.5/W0.6/W0.11/W0.12)
24
+ - 210b4b80 fix(W0.9): honest per-agent usage display + footer token hydration after resume
25
+ - b791dbd2 fix(cost): catalog-backed pricing with honest unpriced state (WO-315/W0.10)
26
+ - 1af7105e fix(input,renderer): panel entry points reachable + burst guard + focus indicator (W0.8)
27
+ - 000250a1 fix(streaming): honest stall indicator + mid-stream watchdog re-arm (W0.7)
28
+ - 74141d53 feat(dev): local SDK overlay for rapid iteration, with release-blocking gates
29
+ - 69c282a1 docs: reconcile documentation with the shipped 0.29.0 and 1.0.0 releases
30
+
31
+ ## [1.0.0] 2026-07-03
32
+
33
+ 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.
34
+
35
+ ### Features
36
+ - 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.
37
+ - 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.
38
+ - 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).
39
+ - Render coalescing: same-tick render requests collapse into one composite — streaming bursts previously triggered up to 7 redundant composites per tick.
40
+ - Honest profile picker: dropped the hardcoded fake "Settings" column that showed identical text for every profile; adopted proportional column widths.
41
+
42
+ ### Fixes
43
+ - 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.)
44
+ - 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.
45
+
46
+ ### Internal
47
+ - 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).
48
+ - 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.
49
+ - No-unused-exports architecture gate for the renderer layer; three dead renderer modules deleted (`progress.ts`, `file-tree.ts`, `status-token.ts`).
50
+ - Splash art and its wide/narrow glyph typography byte-identical throughout — enforced by an empty-diff check every wave plus the splash goldens.
51
+
52
+ ## [0.29.0] 2026-07-03
53
+
54
+ The panel remediation release: a 27-finding audit closed across 38 work orders — panels became working consoles instead of slash-command signposts.
55
+
56
+ ### Features
57
+ - 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".
58
+ - `Ctrl+O` opens the Ops Control panel as a real, rebindable keybinding.
59
+ - Five panel merges with the old ids preserved as aliases: agent-logs→inspector, context→tokens, providers+accounts→provider-health, forensics→incident.
60
+
61
+ ### Fixes
62
+ - `/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.
63
+ - 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).
64
+ - 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.
65
+ - Panel focus ownership centralized in PanelManager with a self-healing invariant, replacing scattered per-panel focus bookkeeping.
66
+
67
+ ### Internal
68
+ - 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.
69
+ - 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.
70
+ - +278 tests across the remediation.
107
71
 
108
72
  ## [0.28.0] — 2026-06-30
109
73
 
@@ -153,6 +117,13 @@ Full deep-review audit of the TUI (33 findings fixed, each reviewed to a score o
153
117
  - 97f74119 chore: upgrade @pellux/goodvibes-sdk to 0.34.0
154
118
  - 6de2627a revert: remove daemon control-plane buildout — duplicated @pellux/goodvibes-sdk 0.34.0
155
119
 
120
+ ## [0.25.0] — 2026-06-21
121
+
122
+ ### Changes
123
+ - 5353a7d9 chore: release v0.25.0
124
+ - a8a4cd4f fix(daemon/remote): make runProcess timeout resolve promptly under orphaned children
125
+ - c00461be feat(daemon): implement control-plane operator surfaces for channels, email, calendar, and remote execution
126
+
156
127
  ## [0.24.1] — 2026-06-17
157
128
 
158
129
  ### 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-0.29.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.1.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
@@ -1318,7 +1319,8 @@ Those pieces cover conversation-noise routing, panel-health/performance budgets,
1318
1319
  | `/diff [target]` | `/d` | Show unified diff: session, head, working, staged, or a git ref |
1319
1320
  | `/mcp [add\|remove\|reload\|tools]` | — | Manage MCP servers at runtime and list connected tools |
1320
1321
  | `/help [command]` | `/h`, `/?` | Show available commands and keyboard shortcuts |
1321
- | `/quit` | `/q`, `/:q` | Exit the application |
1322
+ | `/quit` | `/:q` | Exit the application |
1323
+ | `/wq` | `/:wq` | Commit all git changes, then exit |
1322
1324
 
1323
1325
  > **Tip:** Use the `/add-provider` skill for interactive guided provider setup with smart defaults for popular providers.
1324
1326
  >
@@ -1386,9 +1388,13 @@ All shortcuts are customizable via `~/.goodvibes/tui/keybindings.json`. Use `/ke
1386
1388
  | Key | Action |
1387
1389
  |-----|--------|
1388
1390
  | `Ctrl+P` | Toggle panel sidebar |
1389
- | `Ctrl+}` | Next panel tab |
1390
- | `Ctrl+~` | Previous panel tab |
1391
- | `,` / `.` | Cycle panel tabs (when panel focused) |
1391
+ | `Ctrl+]` | Next panel tab |
1392
+ | `Ctrl+[` | Previous panel tab |
1393
+ | `Alt+1`…`Alt+9` | Jump to panel tab 1–9 |
1394
+ | `Ctrl+X` | Close the focused panel |
1395
+ | `Ctrl+Shift+X` | Close all panels |
1396
+ | `Ctrl+O` | Open the Ops Control panel |
1397
+ | `Ctrl+G` | Toggle focus between split panes |
1392
1398
 
1393
1399
  ### System
1394
1400
 
@@ -1652,6 +1658,9 @@ src/
1652
1658
  - **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
1659
  - **Plugin system** — manifest.json + sandboxed API surface for commands, providers, tools, gateway methods, channels, embeddings, voice, media, and search
1654
1660
  - **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
1661
+ - **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
1662
+ - **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
1663
+ - **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
1664
 
1656
1665
  ---
1657
1666
 
@@ -1669,7 +1678,7 @@ bun run dev
1669
1678
  bun test
1670
1679
  ```
1671
1680
 
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.
1681
+ 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
1682
 
1674
1683
  ### Build standalone binary
1675
1684
 
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "0.35.0"
6
+ "version": "0.36.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": "0.29.0",
3
+ "version": "1.1.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.36.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,