@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.
- package/CHANGELOG.md +69 -98
- package/README.md +16 -7
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/cli/ensure-goodvibes-gitignore.ts +32 -0
- package/src/cli/entrypoint.ts +2 -0
- package/src/core/conversation-line-cache.ts +432 -0
- package/src/core/conversation-rendering.ts +11 -3
- package/src/core/conversation.ts +90 -4
- package/src/core/stream-event-wiring.ts +104 -2
- package/src/core/stream-stall-watchdog.ts +41 -17
- package/src/export/cost-utils.ts +90 -8
- package/src/input/command-registry.ts +16 -0
- package/src/input/commands/diff-runtime.ts +61 -30
- package/src/input/commands/session-content.ts +12 -0
- package/src/input/commands/session-workflow.ts +3 -0
- package/src/input/commands/share-runtime.ts +9 -2
- package/src/input/handler-content-actions.ts +30 -11
- package/src/input/handler-feed-routes.ts +63 -1
- package/src/input/handler-feed.ts +12 -0
- package/src/input/handler-interactions.ts +2 -0
- package/src/input/handler-types.ts +1 -0
- package/src/input/handler.ts +4 -0
- package/src/input/input-history.ts +17 -4
- package/src/main.ts +27 -23
- package/src/panels/agent-inspector-shared.ts +33 -10
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/development.ts +1 -1
- package/src/panels/cockpit-read-model.ts +16 -11
- package/src/panels/cost-tracker-panel.ts +28 -5
- package/src/panels/debug-panel.ts +11 -5
- package/src/panels/diff-panel.ts +122 -22
- package/src/panels/docs-panel.ts +9 -0
- package/src/panels/file-explorer-panel.ts +9 -0
- package/src/panels/git-panel.ts +11 -11
- package/src/panels/knowledge-graph-panel.ts +9 -0
- package/src/panels/local-auth-panel.ts +10 -0
- package/src/panels/panel-list-panel.ts +9 -0
- package/src/panels/project-planning-panel.ts +10 -0
- package/src/panels/provider-health-tracker.ts +5 -1
- package/src/panels/provider-health-views.ts +8 -1
- package/src/panels/scrollable-list-panel.ts +9 -0
- package/src/panels/session-browser-panel.ts +9 -0
- package/src/panels/token-budget-panel.ts +5 -3
- package/src/panels/types.ts +13 -0
- package/src/panels/work-plan-panel.ts +10 -0
- package/src/renderer/agent-detail-modal.ts +42 -12
- package/src/renderer/code-block.ts +58 -28
- package/src/renderer/context-inspector.ts +3 -6
- package/src/renderer/conversation-surface.ts +1 -21
- package/src/renderer/diff-view.ts +6 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/fullscreen-workspace.ts +2 -7
- package/src/renderer/hint-grammar.ts +1 -1
- package/src/renderer/history-search-overlay.ts +10 -16
- package/src/renderer/markdown.ts +9 -1
- package/src/renderer/model-picker-overlay.ts +8 -499
- package/src/renderer/model-workspace.ts +9 -24
- package/src/renderer/overlay-box.ts +7 -9
- package/src/renderer/process-indicator.ts +13 -25
- package/src/renderer/process-modal.ts +17 -2
- package/src/renderer/profile-picker-modal.ts +13 -14
- package/src/renderer/prompt-content-width.ts +16 -0
- package/src/renderer/selection-modal-overlay.ts +3 -1
- package/src/renderer/semantic-diff.ts +1 -1
- package/src/renderer/settings-modal-helpers.ts +10 -34
- package/src/renderer/shell-surface.ts +29 -9
- package/src/renderer/surface-layout.ts +0 -12
- package/src/renderer/term-caps.ts +1 -1
- package/src/renderer/tool-call.ts +6 -20
- package/src/renderer/ui-factory.ts +98 -14
- package/src/renderer/ui-primitives.ts +18 -1
- package/src/runtime/bootstrap-command-context.ts +3 -0
- package/src/runtime/bootstrap-command-parts.ts +3 -1
- package/src/runtime/bootstrap-core.ts +5 -0
- package/src/runtime/bootstrap-hook-bridge.ts +5 -0
- package/src/runtime/bootstrap-shell.ts +12 -1
- package/src/runtime/render-scheduler.ts +80 -0
- package/src/utils/splash-lines.ts +10 -2
- package/src/version.ts +1 -1
- package/src/renderer/file-tree.ts +0 -153
- package/src/renderer/progress.ts +0 -100
- 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
|
-
## [
|
|
7
|
+
## [1.1.0] — 2026-07-03
|
|
8
8
|
|
|
9
9
|
### Changes
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
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
|
[](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](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
|
-
>
|
|
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` |
|
|
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+
|
|
1390
|
-
| `Ctrl
|
|
1391
|
-
|
|
|
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
|
-
|
|
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
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "
|
|
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.
|
|
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
|
+
}
|
package/src/cli/entrypoint.ts
CHANGED
|
@@ -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,
|