@pellux/goodvibes-agent 0.1.68 → 0.1.70
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 +12 -0
- package/package.json +1 -1
- package/src/input/commands/guidance-runtime.ts +9 -8
- package/src/input/commands/shell-core.ts +1 -9
- package/src/input/commands.ts +52 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-steps.ts +4 -4
- package/src/renderer/onboarding/onboarding-wizard.ts +24 -12
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GoodVibes Agent will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.1.70 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Removed copied TUI coding, runtime lifecycle, and developer-maintenance slash commands from the visible Agent command registry.
|
|
8
|
+
- Focused `/help` on Agent operator workflows instead of conversation branching, templates, tool inspection, or blocked TUI exit commands.
|
|
9
|
+
- Added regression coverage so copied TUI commands stay hidden while Agent knowledge, memory, skills, personas, routines, delegation, schedule, secrets, and work-plan commands remain available.
|
|
10
|
+
|
|
11
|
+
## 0.1.69 - 2026-05-31
|
|
12
|
+
|
|
13
|
+
- Made the first-run onboarding detail area wrap selected-row guidance across multiple lines instead of hiding setup context behind single-line truncation.
|
|
14
|
+
- Shortened first-screen setup labels and values so Agent identity, runtime connection, secret policy, profiles, and continue actions remain readable at normal terminal widths.
|
|
15
|
+
- Fixed tiny-view onboarding scroll behavior so the selected action stays visible when field capacity is minimal.
|
|
16
|
+
|
|
5
17
|
## 0.1.68 - 2026-05-31
|
|
6
18
|
|
|
7
19
|
- Removed internal foundation-phase language and blocked lifecycle command examples from package-facing docs.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.70",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
|
|
6
6
|
"type": "module",
|
|
@@ -8,7 +8,7 @@ export function registerGuidanceRuntimeCommands(registry: CommandRegistry): void
|
|
|
8
8
|
registry.register({
|
|
9
9
|
name: 'welcome',
|
|
10
10
|
aliases: ['guide'],
|
|
11
|
-
description: 'Open the
|
|
11
|
+
description: 'Open the Agent setup workspace',
|
|
12
12
|
usage: '[open|print]',
|
|
13
13
|
handler(args, ctx) {
|
|
14
14
|
const sub = args[0] ?? 'open';
|
|
@@ -22,14 +22,15 @@ export function registerGuidanceRuntimeCommands(registry: CommandRegistry): void
|
|
|
22
22
|
}
|
|
23
23
|
if (sub === 'print') {
|
|
24
24
|
ctx.print([
|
|
25
|
-
'Welcome To GoodVibes',
|
|
25
|
+
'Welcome To GoodVibes Agent',
|
|
26
26
|
' /onboarding - open the onboarding wizard with current settings preloaded',
|
|
27
|
-
' /
|
|
28
|
-
' /
|
|
29
|
-
' /
|
|
30
|
-
' /
|
|
31
|
-
' /
|
|
32
|
-
' /
|
|
27
|
+
' /agent - open the Agent operator workspace',
|
|
28
|
+
' /knowledge - inspect isolated Agent Knowledge status, ask, and search',
|
|
29
|
+
' /memory - manage local Agent memory',
|
|
30
|
+
' /personas - manage local Agent personas',
|
|
31
|
+
' /agent-skills - manage reusable local Agent skills',
|
|
32
|
+
' /routines - manage local Agent routines',
|
|
33
|
+
' /delegate - explicitly hand build/fix/review work to GoodVibes TUI',
|
|
33
34
|
].join('\n'));
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
@@ -151,20 +151,12 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
151
151
|
{ id: '/undo', label: '/undo', detail: 'Remove last turn', category: 'Conversation' },
|
|
152
152
|
{ id: '/redo', label: '/redo', detail: 'Restore undone turn', category: 'Conversation' },
|
|
153
153
|
{ id: '/retry', label: '/retry [text]', detail: 'Re-send last message', category: 'Conversation' },
|
|
154
|
-
{ id: '/fork', label: '/fork [name]', detail: 'Snapshot conversation as a named branch', category: 'Conversation' },
|
|
155
|
-
{ id: '/branch', label: '/branch [name]', detail: 'List branches or switch to one', category: 'Conversation' },
|
|
156
|
-
{ id: '/merge', label: '/merge <name>', detail: 'Append messages from a branch', category: 'Conversation' },
|
|
157
|
-
{ id: '/template', label: '/template', detail: 'Browse templates', category: 'Templates' },
|
|
158
|
-
{ id: '/template save', label: '/template save <name> --yes', detail: 'Save prompt as template', category: 'Templates' },
|
|
159
|
-
{ id: '/template use', label: '/template use <name>', detail: 'Execute template', category: 'Templates' },
|
|
160
|
-
{ id: '/tools', label: '/tools', detail: 'List available tools', category: 'Tools & System' },
|
|
161
154
|
{ id: '/paste', label: '/paste', detail: 'Insert clipboard text or image into the prompt', category: 'Tools & System' },
|
|
162
155
|
{ id: '/shortcuts', label: '/shortcuts', detail: 'View keyboard shortcuts reference', category: 'Tools & System' },
|
|
163
156
|
{ id: '/commands', label: '/commands', detail: 'Browse all commands in a scrollable list', category: 'Tools & System' },
|
|
164
157
|
{ id: '/secrets', label: '/secrets set|link|get|test|list|delete', detail: 'Manage encrypted and provider-backed secrets', category: 'Tools & System' },
|
|
165
158
|
{ id: '/help', label: '/help', detail: 'This help', category: 'Tools & System' },
|
|
166
159
|
{ id: '/quit', label: '/quit', detail: 'Exit', category: 'Tools & System' },
|
|
167
|
-
{ id: '/wq', label: '/wq', detail: 'Blocked in Agent; git commit/exit belongs to GoodVibes TUI', category: 'Tools & System' },
|
|
168
160
|
];
|
|
169
161
|
ctx.openSelection('Help — Commands', items, { allowSearch: true }, (result) => {
|
|
170
162
|
if (!result) return;
|
|
@@ -178,7 +170,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
178
170
|
});
|
|
179
171
|
return;
|
|
180
172
|
}
|
|
181
|
-
ctx.print('Use /help to open the help modal. Commands: /agent, /
|
|
173
|
+
ctx.print('Use /help to open the help modal. Commands: /agent, /knowledge, /memory, /personas, /agent-skills, /routines, /delegate, /model, /provider, /config, /paste, /sessions, /bookmarks, /save, /load, /undo, /redo, /retry, /clear, /reset, /compact, /export, /title, /effort, /expand, /collapse, /quit');
|
|
182
174
|
},
|
|
183
175
|
});
|
|
184
176
|
|
package/src/input/commands.ts
CHANGED
|
@@ -55,6 +55,55 @@ import { registerPersonasRuntimeCommands } from './commands/personas-runtime.ts'
|
|
|
55
55
|
import { registerAgentSkillsRuntimeCommands } from './commands/agent-skills-runtime.ts';
|
|
56
56
|
import { registerRoutinesRuntimeCommands } from './commands/routines-runtime.ts';
|
|
57
57
|
|
|
58
|
+
const HIDDEN_COPIED_TUI_COMMANDS = [
|
|
59
|
+
'bootstrap',
|
|
60
|
+
'branch',
|
|
61
|
+
'bridge',
|
|
62
|
+
'cockpit',
|
|
63
|
+
'communication',
|
|
64
|
+
'deeplink',
|
|
65
|
+
'forensics',
|
|
66
|
+
'fork',
|
|
67
|
+
'guidance',
|
|
68
|
+
'handoff',
|
|
69
|
+
'helpers',
|
|
70
|
+
'hooks',
|
|
71
|
+
'incident',
|
|
72
|
+
'incident-review',
|
|
73
|
+
'install',
|
|
74
|
+
'managed',
|
|
75
|
+
'marketplace',
|
|
76
|
+
'merge',
|
|
77
|
+
'memory-review',
|
|
78
|
+
'memory-sync',
|
|
79
|
+
'ops',
|
|
80
|
+
'orchestration',
|
|
81
|
+
'panel',
|
|
82
|
+
'plugin',
|
|
83
|
+
'profilesync',
|
|
84
|
+
'provider-opt',
|
|
85
|
+
'remote',
|
|
86
|
+
'remote-env',
|
|
87
|
+
'remote-setup',
|
|
88
|
+
'replay',
|
|
89
|
+
'scan',
|
|
90
|
+
'services',
|
|
91
|
+
'setup',
|
|
92
|
+
'settingssync',
|
|
93
|
+
'share',
|
|
94
|
+
'skills',
|
|
95
|
+
'storage',
|
|
96
|
+
'team-memory',
|
|
97
|
+
'teleport',
|
|
98
|
+
'template',
|
|
99
|
+
'tools',
|
|
100
|
+
'tunnel',
|
|
101
|
+
'update',
|
|
102
|
+
'worker-pool',
|
|
103
|
+
'wrfc',
|
|
104
|
+
'wq',
|
|
105
|
+
] as const;
|
|
106
|
+
|
|
58
107
|
/**
|
|
59
108
|
* registerBuiltinCommands - Register all built-in slash commands into the registry.
|
|
60
109
|
* Call once during application startup.
|
|
@@ -126,4 +175,7 @@ export function registerBuiltinCommands(registry: CommandRegistry): void {
|
|
|
126
175
|
// ── /knowledge ───────────────────────────────────────────────────────────
|
|
127
176
|
registry.register(knowledgeCommand);
|
|
128
177
|
|
|
178
|
+
for (const commandName of HIDDEN_COPIED_TUI_COMMANDS) {
|
|
179
|
+
registry.unregister(commandName);
|
|
180
|
+
}
|
|
129
181
|
}
|
|
@@ -35,13 +35,13 @@ export const GUIDANCE_MODE_OPTIONS: readonly OnboardingWizardRadioOption[] = [
|
|
|
35
35
|
];
|
|
36
36
|
|
|
37
37
|
export const PERMISSION_MODE_OPTIONS: readonly OnboardingWizardRadioOption[] = [
|
|
38
|
-
{ id: 'prompt', label: 'Ask
|
|
39
|
-
{ id: 'allow-all', label: 'Allow
|
|
40
|
-
{ id: 'custom', label: 'Custom
|
|
38
|
+
{ id: 'prompt', label: 'Ask first', hint: 'Prompt before write, edit, network, and execution tools.' },
|
|
39
|
+
{ id: 'allow-all', label: 'Allow all', hint: 'Allow tools without approval prompts.' },
|
|
40
|
+
{ id: 'custom', label: 'Custom', hint: 'Use tool-specific permission rules.' },
|
|
41
41
|
];
|
|
42
42
|
|
|
43
43
|
export const SECRET_POLICY_OPTIONS: readonly OnboardingWizardRadioOption[] = [
|
|
44
|
-
{ id: 'preferred_secure', label: '
|
|
45
|
-
{ id: 'require_secure', label: 'Require secure
|
|
46
|
-
{ id: 'plaintext_allowed', label: '
|
|
44
|
+
{ id: 'preferred_secure', label: 'Secure', hint: 'Prefer the secure secret backend and fall back only when needed.' },
|
|
45
|
+
{ id: 'require_secure', label: 'Require secure', hint: 'Refuse plaintext secret persistence.' },
|
|
46
|
+
{ id: 'plaintext_allowed', label: 'Plaintext allowed', hint: 'Permit local plaintext secret storage.' },
|
|
47
47
|
];
|
|
@@ -112,5 +112,5 @@ export function getOnboardingWizardBodyRows(viewportHeight: number): number {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
export function getOnboardingWizardVisibleFieldCount(viewportHeight: number): number {
|
|
115
|
-
return Math.max(1, getOnboardingWizardBodyRows(viewportHeight) -
|
|
115
|
+
return Math.max(1, getOnboardingWizardBodyRows(viewportHeight) - 8);
|
|
116
116
|
}
|
|
@@ -27,7 +27,7 @@ function buildApplyAndContinueAction(step: OnboardingWizardStepDefinition): Onbo
|
|
|
27
27
|
kind: 'action',
|
|
28
28
|
id: `${step.id}.apply-and-continue`,
|
|
29
29
|
action: 'apply-and-continue',
|
|
30
|
-
label: 'Apply & Continue
|
|
30
|
+
label: 'Apply & Continue',
|
|
31
31
|
hint: 'Save the current wizard selections in this onboarding session and move to the next section. Settings are persisted on the final Review apply.',
|
|
32
32
|
defaultValue: 'Apply & next',
|
|
33
33
|
spacerBeforeRows: 2,
|
|
@@ -179,7 +179,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
|
|
|
179
179
|
id: 'agent-setup.identity',
|
|
180
180
|
label: 'Product identity',
|
|
181
181
|
hint: 'GoodVibes Agent is a personal operator TUI with Agent-local profiles, memory, skills, personas, routines, and isolated Agent Knowledge.',
|
|
182
|
-
defaultValue: '
|
|
182
|
+
defaultValue: 'Operator',
|
|
183
183
|
},
|
|
184
184
|
{
|
|
185
185
|
kind: 'status',
|
|
@@ -188,7 +188,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
|
|
|
188
188
|
hint: collectionIssues > 0
|
|
189
189
|
? `${collectionIssues} setup snapshot issue(s) were reported. Status and doctor commands show connection details.`
|
|
190
190
|
: 'Agent connects to an already-running GoodVibes runtime for companion chat, work plans, approvals, automation, and Agent Knowledge.',
|
|
191
|
-
defaultValue: collectionIssues > 0 ? `${collectionIssues} issue(s)` : 'External
|
|
191
|
+
defaultValue: collectionIssues > 0 ? `${collectionIssues} issue(s)` : 'External',
|
|
192
192
|
},
|
|
193
193
|
{
|
|
194
194
|
kind: 'radio',
|
|
@@ -203,7 +203,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
|
|
|
203
203
|
id: 'agent-setup.profile-guide',
|
|
204
204
|
label: 'Agent profiles',
|
|
205
205
|
hint: 'Use /agent-profile guide after setup to create household, research, travel, operations, or custom Agent profiles.',
|
|
206
|
-
defaultValue: '
|
|
206
|
+
defaultValue: 'Profiles',
|
|
207
207
|
},
|
|
208
208
|
],
|
|
209
209
|
};
|
|
@@ -112,13 +112,18 @@ function buildFieldRows(
|
|
|
112
112
|
if (selectedRowIndex >= start + capacity) start = selectedRowIndex - capacity + 1;
|
|
113
113
|
start = clamp(start, 0, maxStart);
|
|
114
114
|
|
|
115
|
-
if (start > 0 && selectedRowIndex === start) start = Math.max(0, start - 1);
|
|
116
|
-
if (start + capacity < allRows.length && selectedRowIndex === start + capacity - 1) {
|
|
115
|
+
if (capacity > 1 && start > 0 && selectedRowIndex === start) start = Math.max(0, start - 1);
|
|
116
|
+
if (capacity > 1 && start + capacity < allRows.length && selectedRowIndex === start + capacity - 1) {
|
|
117
117
|
start = Math.min(maxStart, start + 1);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
rows.push(...allRows.slice(start, start + capacity));
|
|
121
|
-
|
|
121
|
+
const firstVisibleRow = rows[0];
|
|
122
|
+
if (
|
|
123
|
+
start > 0
|
|
124
|
+
&& rows.length > 0
|
|
125
|
+
&& !(firstVisibleRow?.kind === 'field' && firstVisibleRow.absoluteIndex === selectedFieldIndex)
|
|
126
|
+
) {
|
|
122
127
|
rows[0] = {
|
|
123
128
|
kind: 'moreAbove',
|
|
124
129
|
text: `${OVERLAY_GLYPHS.moreAbove} ${start} more above`,
|
|
@@ -126,7 +131,12 @@ function buildFieldRows(
|
|
|
126
131
|
}
|
|
127
132
|
|
|
128
133
|
const hiddenBelow = Math.max(0, allRows.length - (start + capacity));
|
|
129
|
-
|
|
134
|
+
const lastVisibleRow = rows[rows.length - 1];
|
|
135
|
+
if (
|
|
136
|
+
hiddenBelow > 0
|
|
137
|
+
&& rows.length > 0
|
|
138
|
+
&& !(lastVisibleRow?.kind === 'field' && lastVisibleRow.absoluteIndex === selectedFieldIndex)
|
|
139
|
+
) {
|
|
130
140
|
rows[rows.length - 1] = {
|
|
131
141
|
kind: 'moreBelow',
|
|
132
142
|
text: `${OVERLAY_GLYPHS.moreBelow} ${hiddenBelow} more below`,
|
|
@@ -253,9 +263,9 @@ function footerText(wizard: OnboardingWizardController): string {
|
|
|
253
263
|
|
|
254
264
|
function controlsText(wizard: OnboardingWizardController): string {
|
|
255
265
|
if (wizard.isEditingTextField()) {
|
|
256
|
-
return 'Controls: Enter saves
|
|
266
|
+
return 'Controls: Enter saves, Esc cancels, Backspace deletes, Del clears.';
|
|
257
267
|
}
|
|
258
|
-
return 'Controls: Enter
|
|
268
|
+
return 'Controls: Enter selects, Del clears, Tab moves.';
|
|
259
269
|
}
|
|
260
270
|
|
|
261
271
|
function renderWideLayout(
|
|
@@ -302,8 +312,9 @@ function renderWideLayout(
|
|
|
302
312
|
`Fields ${wizard.getCompletedFieldCount(wizard.stepIndex)}/${wizard.getStepFieldCount(wizard.stepIndex)} complete`,
|
|
303
313
|
changedScreensLabel(wizard),
|
|
304
314
|
];
|
|
305
|
-
const fieldStartRow = 6;
|
|
306
315
|
const selectedText = selectedFieldText(wizard);
|
|
316
|
+
const selectedHintLines = wrapText(selectedText.hint, Math.max(18, centerWidth - 2)).slice(0, 3);
|
|
317
|
+
const fieldStartRow = 8;
|
|
307
318
|
const fieldRows = buildFieldRows(wizard, visibleFields, Math.max(0, bodyRows - fieldStartRow));
|
|
308
319
|
|
|
309
320
|
const topLine = createOverlayFilledBorderLine(
|
|
@@ -397,9 +408,9 @@ function renderWideLayout(
|
|
|
397
408
|
bg: DEFAULT_OVERLAY_PALETTE.selectedBg,
|
|
398
409
|
bold: true,
|
|
399
410
|
});
|
|
400
|
-
} else if (row
|
|
411
|
+
} else if (row >= 5 && row <= 7) {
|
|
401
412
|
fillWidth(line, centerStart, centerWidth, DEFAULT_OVERLAY_PALETTE.selectedBg);
|
|
402
|
-
putOverlayText(line, centerStart + 1, centerWidth - 2,
|
|
413
|
+
putOverlayText(line, centerStart + 1, centerWidth - 2, selectedHintLines[row - 5] ?? '', {
|
|
403
414
|
fg: UI_TONES.fg.secondary,
|
|
404
415
|
bg: DEFAULT_OVERLAY_PALETTE.selectedBg,
|
|
405
416
|
});
|
|
@@ -482,8 +493,9 @@ function renderCollapsedLayout(
|
|
|
482
493
|
const innerStart = layout.margin + 1;
|
|
483
494
|
const innerWidth = layout.innerWidth;
|
|
484
495
|
const descriptionLines = wrapText(currentStep.description, Math.max(14, innerWidth - 2)).slice(0, 2);
|
|
485
|
-
const fieldStartRow = 6;
|
|
486
496
|
const selectedText = selectedFieldText(wizard);
|
|
497
|
+
const selectedHintLines = wrapText(selectedText.hint, Math.max(14, innerWidth - 2)).slice(0, 3);
|
|
498
|
+
const fieldStartRow = 8;
|
|
487
499
|
const fieldRows = buildFieldRows(wizard, visibleFields, Math.max(0, bodyRows - fieldStartRow));
|
|
488
500
|
|
|
489
501
|
const topLine = createOverlayFilledBorderLine(
|
|
@@ -559,9 +571,9 @@ function renderCollapsedLayout(
|
|
|
559
571
|
bg: DEFAULT_OVERLAY_PALETTE.selectedBg,
|
|
560
572
|
bold: true,
|
|
561
573
|
});
|
|
562
|
-
} else if (row
|
|
574
|
+
} else if (row >= 5 && row <= 7) {
|
|
563
575
|
fillWidth(line, innerStart, innerWidth, DEFAULT_OVERLAY_PALETTE.selectedBg);
|
|
564
|
-
putOverlayText(line, innerStart + 1, innerWidth - 2,
|
|
576
|
+
putOverlayText(line, innerStart + 1, innerWidth - 2, selectedHintLines[row - 5] ?? '', {
|
|
565
577
|
fg: UI_TONES.fg.secondary,
|
|
566
578
|
bg: DEFAULT_OVERLAY_PALETTE.selectedBg,
|
|
567
579
|
});
|
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.1.
|
|
9
|
+
let _version = '0.1.70';
|
|
10
10
|
let _sdkVersion = '0.33.35';
|
|
11
11
|
try {
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|