@pellux/goodvibes-agent 0.1.68 → 0.1.69

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 CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to GoodVibes Agent will be recorded here.
4
4
 
5
+ ## 0.1.69 - 2026-05-31
6
+
7
+ - Made the first-run onboarding detail area wrap selected-row guidance across multiple lines instead of hiding setup context behind single-line truncation.
8
+ - Shortened first-screen setup labels and values so Agent identity, runtime connection, secret policy, profiles, and continue actions remain readable at normal terminal widths.
9
+ - Fixed tiny-view onboarding scroll behavior so the selected action stays visible when field capacity is minimal.
10
+
5
11
  ## 0.1.68 - 2026-05-31
6
12
 
7
13
  - 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.68",
3
+ "version": "0.1.69",
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",
@@ -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 before powerful actions', hint: 'Prompt before write, edit, network, and execution tools.' },
39
- { id: 'allow-all', label: 'Allow everything', hint: 'Allow tools without approval prompts.' },
40
- { id: 'custom', label: 'Custom advanced rules', hint: 'Use tool-specific permission rules.' },
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: 'Use secure storage when available', hint: 'Prefer the secure secret backend and fall back only when needed.' },
45
- { id: 'require_secure', label: 'Require secure storage', hint: 'Refuse plaintext secret persistence.' },
46
- { id: 'plaintext_allowed', label: 'Allow plaintext storage', hint: 'Permit local plaintext secret storage.' },
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) - 6);
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 To Next Section',
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: 'Agent operator',
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 service',
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: 'Local profiles',
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
- if (start > 0 && rows.length > 0) {
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
- if (hiddenBelow > 0 && rows.length > 0) {
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 this value, Esc cancels editing, Backspace deletes one character, Delete or Ctrl+U clears the field.';
266
+ return 'Controls: Enter saves, Esc cancels, Backspace deletes, Del clears.';
257
267
  }
258
- return 'Controls: Enter or Space changes the selected row; Delete or Ctrl+U clears selected text inputs; Tab/Shift+Tab changes screens; arrows move.';
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 === 5) {
411
+ } else if (row >= 5 && row <= 7) {
401
412
  fillWidth(line, centerStart, centerWidth, DEFAULT_OVERLAY_PALETTE.selectedBg);
402
- putOverlayText(line, centerStart + 1, centerWidth - 2, truncateDisplay(selectedText.hint, 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 === 5) {
574
+ } else if (row >= 5 && row <= 7) {
563
575
  fillWidth(line, innerStart, innerWidth, DEFAULT_OVERLAY_PALETTE.selectedBg);
564
- putOverlayText(line, innerStart + 1, innerWidth - 2, truncateDisplay(selectedText.hint, 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.68';
9
+ let _version = '0.1.69';
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 {