@pellux/goodvibes-tui 0.19.66 → 0.19.68
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 +17 -0
- package/README.md +12 -2
- package/package.json +1 -1
- package/src/cli/service-posture.ts +2 -1
- package/src/renderer/settings-modal.ts +19 -14
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,10 +4,27 @@ All notable changes to GoodVibes TUI.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [0.19.68] — 2026-05-06
|
|
8
|
+
|
|
9
|
+
### Changes
|
|
10
|
+
- 7ff4ab69 fix installed daemon service home
|
|
11
|
+
- 8303819d docs: document Bun global trust setup
|
|
12
|
+
|
|
7
13
|
## [Unreleased]
|
|
8
14
|
|
|
9
15
|
---
|
|
10
16
|
|
|
17
|
+
## [0.19.67] — 2026-05-06
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- Styled `/config` category group headings in bold and indented category rows so the category rail hierarchy is easier to scan.
|
|
21
|
+
|
|
22
|
+
### Verified
|
|
23
|
+
- `bun test src/test/renderer/settings-modal.test.ts`
|
|
24
|
+
- `bunx tsc --noEmit`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
11
28
|
## [0.19.66] — 2026-05-06
|
|
12
29
|
|
|
13
30
|
### Fixed
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
|
|
|
@@ -18,10 +18,19 @@ GoodVibes is a Bun program. Install Bun first and make sure `bun` is on `PATH`,
|
|
|
18
18
|
|
|
19
19
|
```sh
|
|
20
20
|
bun add -g @pellux/goodvibes-tui
|
|
21
|
+
bun pm -g trust @pellux/goodvibes-tui tree-sitter-css tree-sitter-javascript tree-sitter-python tree-sitter-typescript core-js
|
|
21
22
|
goodvibes
|
|
22
23
|
```
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
Bun blocks lifecycle scripts for untrusted global packages. The trust command is required after the first global install so GoodVibes can run its postinstall binary installer and native dependencies can run their install steps. Verify the global install with:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
bun pm -g untrusted
|
|
29
|
+
goodvibes --version
|
|
30
|
+
goodvibes-daemon --version
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`bun pm -g untrusted` should not list `@pellux/goodvibes-tui`; if it does, rerun the trust command above. `npm install -g @pellux/goodvibes-tui` is also supported, but it does not install Bun for you. The package preinstall check fails with a clear message if `bun` is missing from `PATH`.
|
|
25
34
|
|
|
26
35
|
Or run from source:
|
|
27
36
|
|
|
@@ -44,6 +53,7 @@ Release distribution:
|
|
|
44
53
|
|
|
45
54
|
- GitHub Releases are the primary distribution path for compiled binaries
|
|
46
55
|
- `bun add -g @pellux/goodvibes-tui` is the recommended global install path; the package is hosted on the npm registry and Bun installs from that registry directly
|
|
56
|
+
- Bun global installs require trusting `@pellux/goodvibes-tui` so the package postinstall can download the matching TUI and daemon binaries; the native parser dependencies currently requiring trust are `tree-sitter-css`, `tree-sitter-javascript`, `tree-sitter-python`, `tree-sitter-typescript`, and `core-js`
|
|
47
57
|
- `npm install -g @pellux/goodvibes-tui` is supported on Linux, macOS, and WSL when Bun is already installed; the preinstall check verifies Bun, and the install script downloads the matching TUI and daemon binaries for the current platform
|
|
48
58
|
- native Windows is not supported; use WSL on Windows
|
|
49
59
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.68",
|
|
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",
|
|
@@ -349,7 +349,8 @@ export function createPlatformServiceManager(runtime: CliServiceRuntime): Platfo
|
|
|
349
349
|
command: daemonExecutable.command,
|
|
350
350
|
args: [],
|
|
351
351
|
env: {
|
|
352
|
-
|
|
352
|
+
// The daemon CLI treats this as the GoodVibes home root, not the daemon state directory.
|
|
353
|
+
GOODVIBES_DAEMON_HOME: runtime.homeDirectory,
|
|
353
354
|
GOODVIBES_DAEMON_TOKEN: process.env.GOODVIBES_DAEMON_TOKEN ?? '',
|
|
354
355
|
GOODVIBES_HTTP_TOKEN: process.env.GOODVIBES_HTTP_TOKEN ?? '',
|
|
355
356
|
NODE_ENV: process.env.NODE_ENV ?? 'production',
|
|
@@ -417,6 +417,12 @@ type CategoryRailEntry =
|
|
|
417
417
|
| { readonly type: 'group'; readonly label: string }
|
|
418
418
|
| { readonly type: 'category'; readonly category: SettingsCategory; readonly index: number };
|
|
419
419
|
|
|
420
|
+
type CategoryRailRow = {
|
|
421
|
+
readonly text: string;
|
|
422
|
+
readonly type: CategoryRailEntry['type'] | 'more' | 'empty';
|
|
423
|
+
readonly selected: boolean;
|
|
424
|
+
};
|
|
425
|
+
|
|
420
426
|
function buildCategoryRailEntries(): CategoryRailEntry[] {
|
|
421
427
|
const entries: CategoryRailEntry[] = [];
|
|
422
428
|
for (const group of SETTINGS_CATEGORY_GROUPS) {
|
|
@@ -434,26 +440,26 @@ function buildCategoryRailEntries(): CategoryRailEntry[] {
|
|
|
434
440
|
return entries;
|
|
435
441
|
}
|
|
436
442
|
|
|
437
|
-
function renderCategories(modal: SettingsModal, width: number, height: number):
|
|
438
|
-
const rows:
|
|
443
|
+
function renderCategories(modal: SettingsModal, width: number, height: number): CategoryRailRow[] {
|
|
444
|
+
const rows: CategoryRailRow[] = [];
|
|
439
445
|
const entries = buildCategoryRailEntries();
|
|
440
446
|
const selectedEntryIndex = Math.max(0, entries.findIndex(entry => entry.type === 'category' && entry.index === modal.categoryIndex));
|
|
441
447
|
const window = stableWindow(entries.length, selectedEntryIndex, height);
|
|
442
|
-
if (window.start > 0) rows.push(`${GLYPHS.navigation.moreAbove} ${window.start} more row(s) above
|
|
448
|
+
if (window.start > 0) rows.push({ text: `${GLYPHS.navigation.moreAbove} ${window.start} more row(s) above`, type: 'more', selected: false });
|
|
443
449
|
for (let railIndex = window.start; railIndex < window.end; railIndex += 1) {
|
|
444
450
|
const entry = entries[railIndex]!;
|
|
445
451
|
if (entry.type === 'group') {
|
|
446
|
-
rows.push(
|
|
452
|
+
rows.push({ text: entry.label.toUpperCase(), type: 'group', selected: false });
|
|
447
453
|
continue;
|
|
448
454
|
}
|
|
449
455
|
const category = entry.category;
|
|
450
456
|
const active = entry.index === modal.categoryIndex;
|
|
451
457
|
const count = categoryItemCount(modal, category);
|
|
452
458
|
const cursor = active ? (modal.focusPane === 'categories' ? GLYPHS.navigation.selected : '•') : ' ';
|
|
453
|
-
rows.push(
|
|
459
|
+
rows.push({ text: ` ${cursor} ${CATEGORY_LABELS[category]} (${count})`, type: 'category', selected: active });
|
|
454
460
|
}
|
|
455
|
-
if (window.end < entries.length) rows.push(`${GLYPHS.navigation.moreBelow} ${entries.length - window.end} more row(s) below
|
|
456
|
-
while (rows.length < height) rows.push('');
|
|
461
|
+
if (window.end < entries.length) rows.push({ text: `${GLYPHS.navigation.moreBelow} ${entries.length - window.end} more row(s) below`, type: 'more', selected: false });
|
|
462
|
+
while (rows.length < height) rows.push({ text: '', type: 'empty', selected: false });
|
|
457
463
|
return rows.slice(0, height);
|
|
458
464
|
}
|
|
459
465
|
|
|
@@ -643,13 +649,12 @@ export function renderSettingsModal(
|
|
|
643
649
|
fillRange(line, 1, dividerX - 1, PALETTE.categoryBg);
|
|
644
650
|
drawVertical(line, dividerX, bg);
|
|
645
651
|
|
|
646
|
-
const
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
bold: categoryActive,
|
|
652
|
+
const categoryRow = categoryRows[row] ?? { text: '', type: 'empty' as const, selected: false };
|
|
653
|
+
if (categoryRow.selected) fillRange(line, leftStart, dividerX - 1, PALETTE.selectedBg);
|
|
654
|
+
writeText(line, leftStart + 1, leftWidth - 3, categoryRow.text, {
|
|
655
|
+
fg: categoryRow.selected ? PALETTE.text : categoryRow.type === 'group' ? PALETTE.subtitle : PALETTE.muted,
|
|
656
|
+
bg: categoryRow.selected ? PALETTE.selectedBg : PALETTE.categoryBg,
|
|
657
|
+
bold: categoryRow.selected || categoryRow.type === 'group',
|
|
653
658
|
});
|
|
654
659
|
|
|
655
660
|
if (inSeparator) {
|
package/src/version.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '0.19.
|
|
9
|
+
let _version = '0.19.68';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
|
|
12
12
|
_version = pkg.version ?? _version;
|