@pellux/goodvibes-agent 0.1.116 → 1.0.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 (285) hide show
  1. package/CHANGELOG.md +48 -661
  2. package/README.md +64 -57
  3. package/bin/goodvibes-agent.ts +16 -2
  4. package/dist/package/main.js +199180 -192185
  5. package/docs/README.md +15 -8
  6. package/docs/channels-remote-and-api.md +50 -0
  7. package/docs/connected-host.md +59 -0
  8. package/docs/getting-started.md +61 -50
  9. package/docs/knowledge-artifacts-and-multimodal.md +91 -0
  10. package/docs/project-planning.md +79 -0
  11. package/docs/providers-and-routing.md +46 -0
  12. package/docs/release-and-publishing.md +48 -11
  13. package/docs/tools-and-commands.md +123 -0
  14. package/docs/voice-and-live-tts.md +51 -0
  15. package/package.json +3 -6
  16. package/src/agent/behavior-discovery-summary.ts +1 -3
  17. package/src/agent/channel-delivery.ts +201 -0
  18. package/src/agent/media-generation.ts +159 -0
  19. package/src/agent/memory-prompt.ts +0 -1
  20. package/src/agent/note-registry.ts +329 -0
  21. package/src/agent/operator-actions.ts +343 -0
  22. package/src/agent/persona-discovery.ts +1 -3
  23. package/src/agent/persona-registry.ts +19 -16
  24. package/src/agent/record-labels.ts +107 -0
  25. package/src/agent/reminder-schedule-format.ts +33 -24
  26. package/src/agent/reminder-schedule.ts +27 -26
  27. package/src/agent/routine-registry.ts +54 -14
  28. package/src/agent/routine-schedule-args.ts +2 -1
  29. package/src/agent/routine-schedule-format.ts +77 -53
  30. package/src/agent/routine-schedule-promotion.ts +35 -33
  31. package/src/agent/routine-schedule-receipts.ts +29 -27
  32. package/src/agent/runtime-profile-starters.ts +5 -5
  33. package/src/agent/runtime-profile.ts +91 -12
  34. package/src/agent/skill-registry.ts +210 -32
  35. package/src/cli/agent-knowledge-args.ts +5 -1
  36. package/src/cli/agent-knowledge-command.ts +40 -34
  37. package/src/cli/agent-knowledge-format.ts +80 -67
  38. package/src/cli/agent-knowledge-methods.ts +1 -1
  39. package/src/cli/agent-knowledge-runtime.ts +32 -26
  40. package/src/cli/bundle-command.ts +14 -9
  41. package/src/cli/config-overrides.ts +37 -36
  42. package/src/cli/entrypoint.ts +16 -7
  43. package/src/cli/external-runtime.ts +10 -4
  44. package/src/cli/help.ts +54 -29
  45. package/src/cli/local-library-command.ts +203 -83
  46. package/src/cli/management-commands.ts +105 -68
  47. package/src/cli/management.ts +55 -74
  48. package/src/cli/memory-command.ts +66 -32
  49. package/src/cli/parser.ts +37 -3
  50. package/src/cli/profiles-command.ts +166 -31
  51. package/src/cli/provider-auth-routes.ts +2 -1
  52. package/src/cli/routines-command.ts +176 -40
  53. package/src/cli/service-posture.ts +16 -16
  54. package/src/cli/status.ts +56 -135
  55. package/src/core/conversation-message-snapshot.ts +131 -0
  56. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  57. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  58. package/src/input/agent-workspace-activation.ts +35 -8
  59. package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
  60. package/src/input/agent-workspace-basic-command-editors.ts +502 -9
  61. package/src/input/agent-workspace-categories.ts +423 -51
  62. package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
  63. package/src/input/agent-workspace-channel-command-editors.ts +65 -0
  64. package/src/input/agent-workspace-channels.ts +35 -2
  65. package/src/input/agent-workspace-command-editor.ts +41 -3
  66. package/src/input/agent-workspace-config-reader.ts +16 -0
  67. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  68. package/src/input/agent-workspace-editors.ts +166 -1
  69. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  70. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  71. package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
  72. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  73. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  74. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  75. package/src/input/agent-workspace-local-operations.ts +218 -0
  76. package/src/input/agent-workspace-local-selection.ts +75 -0
  77. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  78. package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
  79. package/src/input/agent-workspace-media-command-editors.ts +27 -0
  80. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  81. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  82. package/src/input/agent-workspace-memory-editor.ts +2 -2
  83. package/src/input/agent-workspace-navigation.ts +81 -0
  84. package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
  85. package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
  86. package/src/input/agent-workspace-operations-command-editors.ts +196 -0
  87. package/src/input/agent-workspace-panel-route.ts +43 -0
  88. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  89. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  90. package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
  91. package/src/input/agent-workspace-requirements.ts +11 -0
  92. package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
  93. package/src/input/agent-workspace-search.ts +169 -0
  94. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  95. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  96. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  97. package/src/input/agent-workspace-setup.ts +37 -16
  98. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  99. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  100. package/src/input/agent-workspace-snapshot.ts +162 -21
  101. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  102. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  103. package/src/input/agent-workspace-token.ts +18 -2
  104. package/src/input/agent-workspace-types.ts +212 -4
  105. package/src/input/agent-workspace-voice-media.ts +4 -7
  106. package/src/input/agent-workspace-web-research-editor.ts +104 -0
  107. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  108. package/src/input/agent-workspace.ts +178 -240
  109. package/src/input/command-registry.ts +5 -2
  110. package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
  111. package/src/input/commands/agent-skills-runtime.ts +149 -72
  112. package/src/input/commands/agent-workspace-runtime.ts +23 -6
  113. package/src/input/commands/brief-runtime.ts +55 -25
  114. package/src/input/commands/channels-runtime.ts +147 -33
  115. package/src/input/commands/compat-runtime.ts +32 -0
  116. package/src/input/commands/delegation-runtime.ts +29 -23
  117. package/src/input/commands/experience-runtime.ts +6 -4
  118. package/src/input/commands/guidance-runtime.ts +4 -4
  119. package/src/input/commands/health-runtime.ts +149 -126
  120. package/src/input/commands/knowledge.ts +82 -60
  121. package/src/input/commands/local-provider-runtime.ts +43 -21
  122. package/src/input/commands/local-runtime.ts +138 -16
  123. package/src/input/commands/local-setup-review.ts +10 -20
  124. package/src/input/commands/mcp-runtime.ts +63 -46
  125. package/src/input/commands/notify-runtime.ts +38 -9
  126. package/src/input/commands/operator-actions-runtime.ts +138 -0
  127. package/src/input/commands/operator-runtime.ts +6 -76
  128. package/src/input/commands/personas-runtime.ts +46 -31
  129. package/src/input/commands/planning-runtime.ts +1 -1
  130. package/src/input/commands/platform-access-runtime.ts +35 -98
  131. package/src/input/commands/product-runtime.ts +2 -2
  132. package/src/input/commands/provider-accounts-runtime.ts +60 -39
  133. package/src/input/commands/qrcode-runtime.ts +50 -9
  134. package/src/input/commands/recall-bundle.ts +11 -11
  135. package/src/input/commands/recall-capture.ts +13 -11
  136. package/src/input/commands/recall-query.ts +29 -21
  137. package/src/input/commands/recall-review.ts +2 -1
  138. package/src/input/commands/routines-runtime.ts +99 -45
  139. package/src/input/commands/runtime-services.ts +1 -14
  140. package/src/input/commands/schedule-runtime.ts +33 -20
  141. package/src/input/commands/security-runtime.ts +6 -11
  142. package/src/input/commands/session-content.ts +80 -78
  143. package/src/input/commands/session-workflow.ts +134 -104
  144. package/src/input/commands/session.ts +3 -174
  145. package/src/input/commands/shell-core.ts +38 -17
  146. package/src/input/commands/subscription-runtime.ts +54 -185
  147. package/src/input/commands/support-bundle-runtime.ts +53 -0
  148. package/src/input/commands/tasks-runtime.ts +21 -21
  149. package/src/input/commands/work-plan-runtime.ts +33 -8
  150. package/src/input/commands.ts +6 -2
  151. package/src/input/feed-context-factory.ts +2 -2
  152. package/src/input/file-picker.ts +3 -2
  153. package/src/input/handler-command-route.ts +4 -7
  154. package/src/input/handler-content-actions.ts +89 -26
  155. package/src/input/handler-feed-routes.ts +19 -12
  156. package/src/input/handler-feed.ts +6 -5
  157. package/src/input/handler-interactions.ts +9 -36
  158. package/src/input/handler-modal-stack.ts +3 -3
  159. package/src/input/handler-onboarding.ts +52 -91
  160. package/src/input/handler-shortcuts.ts +16 -7
  161. package/src/input/handler.ts +50 -23
  162. package/src/input/input-history.ts +5 -6
  163. package/src/input/keybindings.ts +27 -16
  164. package/src/input/mcp-workspace.ts +90 -26
  165. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  166. package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
  167. package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
  168. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  169. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
  170. package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
  171. package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
  172. package/src/input/onboarding/onboarding-wizard.ts +87 -2
  173. package/src/input/profile-picker-modal.ts +31 -12
  174. package/src/input/session-picker-modal.ts +21 -4
  175. package/src/input/settings-modal-agent-policy.ts +6 -6
  176. package/src/input/settings-modal-behavior.ts +0 -3
  177. package/src/input/settings-modal-subscriptions.ts +3 -3
  178. package/src/input/settings-modal-types.ts +2 -13
  179. package/src/input/settings-modal.ts +20 -66
  180. package/src/input/submission-intent.ts +0 -1
  181. package/src/input/submission-router.ts +3 -3
  182. package/src/main.ts +18 -10
  183. package/src/panels/approval-panel.ts +8 -8
  184. package/src/panels/automation-control-panel.ts +4 -4
  185. package/src/panels/base-panel.ts +1 -1
  186. package/src/panels/builtin/agent.ts +1 -1
  187. package/src/panels/builtin/operations.ts +3 -12
  188. package/src/panels/builtin/session.ts +32 -24
  189. package/src/panels/builtin/shared.ts +7 -7
  190. package/src/panels/cost-tracker-panel.ts +1 -1
  191. package/src/panels/docs-panel.ts +5 -3
  192. package/src/panels/index.ts +0 -1
  193. package/src/panels/knowledge-panel.ts +6 -5
  194. package/src/panels/memory-panel.ts +7 -6
  195. package/src/panels/panel-list-panel.ts +36 -80
  196. package/src/panels/project-planning-panel.ts +19 -12
  197. package/src/panels/provider-account-snapshot.ts +51 -25
  198. package/src/panels/provider-accounts-panel.ts +33 -18
  199. package/src/panels/provider-health-domains.ts +48 -7
  200. package/src/panels/provider-health-panel.ts +5 -4
  201. package/src/panels/qr-panel.ts +44 -20
  202. package/src/panels/schedule-panel.ts +9 -17
  203. package/src/panels/security-panel.ts +8 -8
  204. package/src/panels/session-browser-panel.ts +10 -10
  205. package/src/panels/subscription-panel.ts +6 -6
  206. package/src/panels/system-messages-panel.ts +3 -3
  207. package/src/panels/tasks-panel.ts +21 -14
  208. package/src/panels/tool-inspector-panel.ts +19 -12
  209. package/src/panels/work-plan-panel.ts +5 -5
  210. package/src/planning/project-planning-coordinator.ts +3 -3
  211. package/src/provider-auth-route-display.ts +9 -0
  212. package/src/renderer/agent-workspace-style.ts +34 -0
  213. package/src/renderer/agent-workspace.ts +254 -57
  214. package/src/renderer/autocomplete-overlay.ts +25 -6
  215. package/src/renderer/block-actions.ts +1 -3
  216. package/src/renderer/bookmark-modal.ts +19 -4
  217. package/src/renderer/buffer.ts +4 -2
  218. package/src/renderer/context-inspector.ts +50 -13
  219. package/src/renderer/diff.ts +1 -1
  220. package/src/renderer/file-picker-overlay.ts +19 -6
  221. package/src/renderer/help-overlay.ts +112 -34
  222. package/src/renderer/history-search-overlay.ts +19 -4
  223. package/src/renderer/live-tail-modal.ts +27 -5
  224. package/src/renderer/mcp-workspace.ts +176 -43
  225. package/src/renderer/model-picker-overlay.ts +58 -3
  226. package/src/renderer/model-workspace.ts +104 -22
  227. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  228. package/src/renderer/process-modal.ts +27 -6
  229. package/src/renderer/profile-picker-modal.ts +21 -5
  230. package/src/renderer/search-overlay.ts +25 -5
  231. package/src/renderer/selection-modal-overlay.ts +46 -14
  232. package/src/renderer/session-picker-modal.ts +18 -1
  233. package/src/renderer/settings-modal-helpers.ts +2 -40
  234. package/src/renderer/settings-modal.ts +88 -55
  235. package/src/renderer/system-message.ts +1 -1
  236. package/src/renderer/tool-call.ts +20 -11
  237. package/src/runtime/agent-runtime-events.ts +129 -0
  238. package/src/runtime/bootstrap-command-context.ts +7 -1
  239. package/src/runtime/bootstrap-command-parts.ts +11 -8
  240. package/src/runtime/bootstrap-core.ts +23 -65
  241. package/src/runtime/bootstrap-hook-bridge.ts +7 -18
  242. package/src/runtime/bootstrap-shell.ts +46 -8
  243. package/src/runtime/bootstrap.ts +36 -46
  244. package/src/runtime/connected-host-auth.ts +47 -0
  245. package/src/runtime/diagnostics/panels/index.ts +2 -2
  246. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  247. package/src/runtime/diagnostics/panels/policy.ts +7 -7
  248. package/src/runtime/index.ts +2 -5
  249. package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
  250. package/src/runtime/onboarding/apply.ts +288 -74
  251. package/src/runtime/onboarding/derivation.ts +10 -13
  252. package/src/runtime/onboarding/snapshot.ts +2 -17
  253. package/src/runtime/onboarding/types.ts +34 -20
  254. package/src/runtime/onboarding/verify.ts +105 -4
  255. package/src/runtime/operator-token-cleanup.ts +3 -3
  256. package/src/runtime/services.ts +95 -11
  257. package/src/runtime/store/selectors/index.ts +3 -3
  258. package/src/runtime/store/state.ts +1 -4
  259. package/src/runtime/surface-feature-flags.ts +41 -6
  260. package/src/runtime/ui-read-models.ts +3 -4
  261. package/src/runtime/ui-services.ts +6 -6
  262. package/src/shell/blocking-input.ts +2 -1
  263. package/src/shell/service-settings-sync.ts +7 -7
  264. package/src/shell/ui-openers.ts +17 -38
  265. package/src/tools/agent-analysis-registry-policy.ts +0 -1
  266. package/src/tools/agent-channel-send-tool.ts +133 -0
  267. package/src/tools/agent-context-policy.ts +1 -1
  268. package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
  269. package/src/tools/agent-knowledge-tool.ts +170 -0
  270. package/src/tools/agent-local-registry-tool.ts +279 -73
  271. package/src/tools/agent-media-generate-tool.ts +133 -0
  272. package/src/tools/agent-notify-tool.ts +143 -0
  273. package/src/tools/agent-operator-action-tool.ts +137 -0
  274. package/src/tools/agent-operator-briefing-tool.ts +217 -0
  275. package/src/tools/agent-reminder-schedule-tool.ts +237 -0
  276. package/src/tools/agent-tool-policy-guard.ts +13 -15
  277. package/src/tools/agent-work-plan-tool.ts +256 -0
  278. package/src/version.ts +1 -1
  279. package/docs/connected-services.md +0 -51
  280. package/src/cli/package-verification.ts +0 -274
  281. package/src/input/commands/policy-dispatch.ts +0 -339
  282. package/src/input/commands/policy.ts +0 -17
  283. package/src/panels/panel-picker.ts +0 -105
  284. package/src/panels/policy-panel.ts +0 -308
  285. package/src/renderer/panel-picker-overlay.ts +0 -202
@@ -1,4 +1,4 @@
1
- import type { ConfigKey, ConfigManager, ConfigSetting, GoodVibesConfig, PersistedFlagState } from '../config/index.ts';
1
+ import type { ConfigKey, ConfigManager, ConfigSetting, PersistedFlagState } from '../config/index.ts';
2
2
  import { CONFIG_SCHEMA, ConfigError } from '../config/index.ts';
3
3
  import type { GoodVibesCliCommand, GoodVibesCliFlags } from './types.ts';
4
4
  import { RUNTIME_ENDPOINT_CONFIG_KEYS, hostModeForHostname } from './endpoints.ts';
@@ -8,6 +8,31 @@ const CONFIG_SCHEMA_BY_KEY = new Map<string, ConfigSetting>(
8
8
  CONFIG_SCHEMA.map((setting) => [setting.key, setting]),
9
9
  );
10
10
 
11
+ type RuntimeOnlyConfigManager = {
12
+ readonly config: Record<string, unknown>;
13
+ };
14
+
15
+ function mutableConfig(configManager: ConfigManager): Record<string, unknown> {
16
+ return (configManager as unknown as RuntimeOnlyConfigManager).config;
17
+ }
18
+
19
+ function setRuntimeOnlyConfigValue(configManager: ConfigManager, key: ConfigKey, value: unknown): void {
20
+ const parts = key.split('.');
21
+ let cursor = mutableConfig(configManager);
22
+ for (const part of parts.slice(0, -1)) {
23
+ const next = cursor[part];
24
+ if (!next || typeof next !== 'object' || Array.isArray(next)) {
25
+ throw new ConfigError(`Unknown config key: ${key}`);
26
+ }
27
+ cursor = next as Record<string, unknown>;
28
+ }
29
+ const leaf = parts.at(-1);
30
+ if (!leaf || !(leaf in cursor)) {
31
+ throw new ConfigError(`Unknown config key: ${key}`);
32
+ }
33
+ cursor[leaf] = value;
34
+ }
35
+
11
36
  function parseConfigOverrideValue(value: string): unknown {
12
37
  const trimmed = value.trim();
13
38
  if (trimmed.length === 0) return '';
@@ -53,45 +78,22 @@ function parseRuntimeUrl(rawValue: string, source: string): { readonly host: str
53
78
  return { host: url.hostname, port };
54
79
  }
55
80
 
56
- function getRuntimeConfig(configManager: ConfigManager): GoodVibesConfig {
57
- const mutable = configManager as unknown as { config?: GoodVibesConfig };
58
- if (!mutable.config || typeof mutable.config !== 'object') {
59
- throw new ConfigError('ConfigManager runtime config is not available for CLI overrides.');
60
- }
61
- return mutable.config;
62
- }
63
-
64
81
  function validateConfigValue(setting: ConfigSetting, value: unknown): void {
65
82
  if (setting.type === 'boolean' && typeof value !== 'boolean') {
66
- throw new ConfigError(`Invalid value for ${setting.key}: expected boolean.`);
83
+ throw new ConfigError(`Invalid value for ${setting.key}. Expected boolean.`);
67
84
  }
68
85
  if (setting.type === 'number' && (typeof value !== 'number' || !Number.isFinite(value))) {
69
- throw new ConfigError(`Invalid value for ${setting.key}: expected number.`);
86
+ throw new ConfigError(`Invalid value for ${setting.key}. Expected number.`);
70
87
  }
71
88
  if (setting.type === 'string' && typeof value !== 'string') {
72
- throw new ConfigError(`Invalid value for ${setting.key}: expected string.`);
89
+ throw new ConfigError(`Invalid value for ${setting.key}. Expected string.`);
73
90
  }
74
91
  if (setting.type === 'enum' && setting.enumValues && !setting.enumValues.includes(String(value))) {
75
- throw new ConfigError(`Invalid value for ${setting.key}: "${String(value)}". Allowed: ${setting.enumValues.join(', ')}`);
92
+ throw new ConfigError(`Invalid value for ${setting.key} "${String(value)}". Allowed values ${setting.enumValues.join(', ')}.`);
76
93
  }
77
94
  if (setting.validate && !setting.validate(value)) {
78
- throw new ConfigError(`Invalid value for ${setting.key}: ${String(value)}`);
79
- }
80
- }
81
-
82
- function setNestedConfigValue(config: GoodVibesConfig, key: ConfigKey, value: unknown): void {
83
- const parts = key.split('.');
84
- let cursor: unknown = config;
85
- for (const part of parts.slice(0, -1)) {
86
- if (cursor == null || typeof cursor !== 'object' || !(part in cursor)) {
87
- throw new ConfigError(`Invalid config path: section '${part}' does not exist`);
88
- }
89
- cursor = (cursor as Record<string, unknown>)[part];
90
- }
91
- if (cursor == null || typeof cursor !== 'object') {
92
- throw new ConfigError(`Invalid config path: section '${parts.slice(0, -1).join('.')}' does not exist`);
95
+ throw new ConfigError(`Invalid value for ${setting.key} ${String(value)}`);
93
96
  }
94
- (cursor as Record<string, unknown>)[parts[parts.length - 1]!] = value;
95
97
  }
96
98
 
97
99
  export function applyRuntimeConfigValue(configManager: ConfigManager, key: ConfigKey, value: unknown): void {
@@ -100,7 +102,7 @@ export function applyRuntimeConfigValue(configManager: ConfigManager, key: Confi
100
102
  throw new ConfigError(`Unknown config key: ${key}`);
101
103
  }
102
104
  validateConfigValue(setting, value);
103
- setNestedConfigValue(getRuntimeConfig(configManager), key, value);
105
+ setRuntimeOnlyConfigValue(configManager, key, value);
104
106
  }
105
107
 
106
108
  export function applyRuntimeConfigOverrides(
@@ -119,7 +121,7 @@ export function applyRuntimeConfigOverrides(
119
121
  try {
120
122
  applyRuntimeConfigValue(configManager, key, parseConfigOverrideValue(rawValue));
121
123
  } catch (error) {
122
- errors.push(error instanceof Error ? `Invalid --config ${override}: ${error.message}` : `Invalid --config ${override}`);
124
+ errors.push(error instanceof Error ? `Invalid --config ${override}. ${error.message}` : `Invalid --config ${override}`);
123
125
  }
124
126
  }
125
127
  return errors;
@@ -149,15 +151,14 @@ export function applyRuntimeFeatureFlagOverrides(
149
151
  },
150
152
  ): void {
151
153
  if (options.enableFeatures.length === 0 && options.disableFeatures.length === 0) return;
152
- const config = getRuntimeConfig(configManager);
153
- const flags = { ...config.featureFlags };
154
+ const flags = { ...configManager.getCategory('featureFlags') };
154
155
  for (const feature of options.enableFeatures) {
155
156
  flags[feature] = 'enabled' satisfies PersistedFlagState;
156
157
  }
157
158
  for (const feature of options.disableFeatures) {
158
159
  flags[feature] = 'disabled' satisfies PersistedFlagState;
159
160
  }
160
- config.featureFlags = flags;
161
+ mutableConfig(configManager).featureFlags = flags;
161
162
  }
162
163
 
163
164
  export function applyRuntimeEndpointFlagOverrides(
@@ -174,7 +175,7 @@ export function applyRuntimeEndpointFlagOverrides(
174
175
  applyRuntimeConfigValue(configManager, keys.host, flags.hostname);
175
176
  } catch (error) {
176
177
  errors.push(error instanceof Error
177
- ? `Invalid --hostname ${flags.hostname}: ${error.message}`
178
+ ? `Invalid --hostname ${flags.hostname}. ${error.message}`
178
179
  : `Invalid --hostname ${flags.hostname}`);
179
180
  }
180
181
  }
@@ -184,7 +185,7 @@ export function applyRuntimeEndpointFlagOverrides(
184
185
  applyRuntimeConfigValue(configManager, keys.port, flags.port);
185
186
  } catch (error) {
186
187
  errors.push(error instanceof Error
187
- ? `Invalid --port ${flags.port}: ${error.message}`
188
+ ? `Invalid --port ${flags.port}. ${error.message}`
188
189
  : `Invalid --port ${flags.port}`);
189
190
  }
190
191
  }
@@ -25,7 +25,7 @@ import {
25
25
  import { buildCliServicePosture } from './service-posture.ts';
26
26
  import { inspectCliExternalRuntime } from './external-runtime.ts';
27
27
  import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
28
- import { resolveAgentRuntimeProfileHome } from '../agent/runtime-profile.ts';
28
+ import { resolveAgentRuntimeProfileHome, resolveSelectedAgentRuntimeProfileHome } from '../agent/runtime-profile.ts';
29
29
 
30
30
  type ShellEntrypointOwnership = {
31
31
  readonly workingDirectory: string;
@@ -52,14 +52,20 @@ export type PreparedShellCliRuntime = {
52
52
  readonly bootstrapHomeDirectory: string;
53
53
  };
54
54
 
55
- function resolveShellEntrypointOwnership(
55
+ export function resolveShellEntrypointOwnership(
56
56
  roots: ShellEntrypointRoots,
57
57
  workingDirOverride?: string,
58
- agentProfile?: string,
58
+ options: {
59
+ readonly agentProfile?: string;
60
+ readonly useSelectedProfile: boolean;
61
+ } = { useSelectedProfile: true },
59
62
  ): ShellEntrypointOwnership {
60
- const homeDirectory = agentProfile
61
- ? resolveAgentRuntimeProfileHome(roots.homeDirectory, agentProfile).homeDirectory
62
- : roots.homeDirectory;
63
+ const selectedProfile = options.agentProfile
64
+ ? resolveAgentRuntimeProfileHome(roots.homeDirectory, options.agentProfile)
65
+ : options.useSelectedProfile
66
+ ? resolveSelectedAgentRuntimeProfileHome(roots.homeDirectory)
67
+ : null;
68
+ const homeDirectory = selectedProfile?.homeDirectory ?? roots.homeDirectory;
63
69
  return {
64
70
  workingDirectory: workingDirOverride ?? roots.defaultWorkingDirectory,
65
71
  homeDirectory,
@@ -103,7 +109,10 @@ export async function prepareShellCliRuntime(
103
109
  ownership = resolveShellEntrypointOwnership(
104
110
  roots,
105
111
  cli.flags.workingDir ?? (cli.command === 'tui' ? cli.commandArgs[0] : undefined),
106
- cli.command === 'profiles' ? undefined : cli.flags.agentProfile,
112
+ {
113
+ agentProfile: cli.command === 'profiles' ? undefined : cli.flags.agentProfile,
114
+ useSelectedProfile: cli.command !== 'profiles',
115
+ },
107
116
  );
108
117
  } catch (error) {
109
118
  console.error(error instanceof Error ? error.message : String(error));
@@ -26,7 +26,7 @@ export interface CliExternalRuntimeSnapshot {
26
26
  readonly agentKnowledge: {
27
27
  readonly route: '/api/goodvibes-agent/knowledge/status';
28
28
  readonly ready: boolean;
29
- readonly kind: 'ok' | 'auth_required' | 'daemon_unavailable' | 'version_mismatch' | 'route_unavailable' | 'runtime_error';
29
+ readonly kind: 'ok' | 'auth_required' | 'connected_host_unavailable' | 'version_mismatch' | 'connected_host_route_unavailable' | 'connected_host_error';
30
30
  readonly statusCode: number | null;
31
31
  };
32
32
  readonly error: string | null;
@@ -112,7 +112,7 @@ export async function inspectCliExternalRuntime(
112
112
  agentKnowledge: {
113
113
  route,
114
114
  ready: false,
115
- kind: status.status === 401 ? 'auth_required' : 'daemon_unavailable',
115
+ kind: status.status === 401 ? 'auth_required' : 'connected_host_unavailable',
116
116
  statusCode: status.status,
117
117
  },
118
118
  error: typeof status.body === 'string' ? status.body : `HTTP ${status.status}`,
@@ -169,7 +169,13 @@ export async function inspectCliExternalRuntime(
169
169
  agentKnowledge: {
170
170
  route,
171
171
  ready: knowledge.ok,
172
- kind: knowledge.ok ? 'ok' : knowledge.status === 401 ? 'auth_required' : knowledge.status === 404 ? 'route_unavailable' : 'runtime_error',
172
+ kind: knowledge.ok
173
+ ? 'ok'
174
+ : knowledge.status === 401
175
+ ? 'auth_required'
176
+ : knowledge.status === 404
177
+ ? 'connected_host_route_unavailable'
178
+ : 'connected_host_error',
173
179
  statusCode: knowledge.status,
174
180
  },
175
181
  error: knowledge.ok ? null : typeof knowledge.body === 'string' ? knowledge.body : `HTTP ${knowledge.status}`,
@@ -186,7 +192,7 @@ export async function inspectCliExternalRuntime(
186
192
  agentKnowledge: {
187
193
  route,
188
194
  ready: false,
189
- kind: 'daemon_unavailable',
195
+ kind: 'connected_host_unavailable',
190
196
  statusCode: null,
191
197
  },
192
198
  error: summarizeError(error),
package/src/cli/help.ts CHANGED
@@ -37,12 +37,13 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
37
37
  ' /setup Open setup/config flows',
38
38
  ' /model Choose provider and model',
39
39
  ' /knowledge Use isolated Agent Knowledge',
40
- ' /personas, /skills Tune local Agent behavior',
41
- ' /routines Run local routines in the main conversation',
42
- ' /schedule remind Create confirmed reminders or inspect schedules',
43
- ' /delegate Explicitly hand build/fix/review work to GoodVibes TUI',
40
+ ' /notes Open Agent-local scratchpad notes',
41
+ ' /personas, /skills Tune Agent-local behavior',
42
+ ' /routines Run local routines in the main conversation',
43
+ ' /schedule remind Create confirmed reminders or inspect schedules',
44
+ ' /delegate Explicitly hand build/fix/review work to GoodVibes TUI',
44
45
  '',
45
- 'Commands:',
46
+ 'Scriptable mirrors:',
46
47
  ' run|exec [prompt] Run non-interactively with text/json/stream-json output',
47
48
  ' status Print config, provider, auth, and setup posture',
48
49
  ' doctor Print status plus setup warnings',
@@ -55,8 +56,8 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
55
56
  ' memory Manage Agent-owned durable memory records',
56
57
  ' routines Inspect local routines and explicitly promote one to a connected schedule',
57
58
  ' auth Inspect Agent auth posture and connection token state',
58
- ' compat Inspect Agent SDK pin, connected service version, and Agent Knowledge route readiness',
59
- ' knowledge Use isolated Agent Knowledge/Wiki routes',
59
+ ' compat Inspect Agent SDK pin, connected host version, and Agent Knowledge route readiness',
60
+ ' knowledge Use isolated Agent Knowledge routes',
60
61
  ' ask|search Shortcuts for isolated Agent Knowledge ask/search',
61
62
  ' delegate Explicitly delegate build/fix/review work to GoodVibes TUI',
62
63
  ' subscription Start/finish/logout provider subscription sessions',
@@ -106,7 +107,7 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
106
107
  ` ${binary} profiles create household --template household --yes`,
107
108
  ` ${binary} --agent-profile household`,
108
109
  ` ${binary} personas create --name "Travel Planner" --description "Plan trips" --body "Compare options before booking"`,
109
- ` ${binary} skills create --name "Daily Brief" --description "Summarize operator state" --procedure "Review Agent Knowledge, work plans, approvals, and routines" --enabled`,
110
+ ` ${binary} skills create --name "Daily Brief" --description "Summarize operator state" --procedure "Review Agent Knowledge, work plans, approvals, and routines" --requires-env GOODVIBES_AGENT_TOKEN --requires-command gh --enabled`,
110
111
  ` ${binary} memory add fact "Prefers concise morning briefings" --scope project --tags preference`,
111
112
  ` ${binary} memory search "morning briefings"`,
112
113
  ` ${binary} routines promote daily-operations-sweep --cron "0 9 * * *" --timezone America/Chicago --yes`,
@@ -115,7 +116,7 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
115
116
  ` ${binary} knowledge ask "What is GoodVibes Agent?"`,
116
117
  ` ${binary} ask "What is GoodVibes Agent?"`,
117
118
  ` ${binary} search "release checklist"`,
118
- ` ${binary} delegate --wrfc "fix the failing tests in ~/work/project"`,
119
+ ` ${binary} delegate --review "fix the failing tests in ~/work/project"`,
119
120
  ` ${binary} subscription providers`,
120
121
  ` ${binary} subscription login openai start --open`,
121
122
  ` ${binary} pair`,
@@ -138,12 +139,12 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
138
139
  },
139
140
  setup: {
140
141
  usage: ['setup', 'setup status', 'onboarding', 'onboarding status'],
141
- summary: 'Open Agent setup, or inspect whether setup has already been shown for this user.',
142
+ summary: 'Open Agent setup, or inspect whether setup has already been applied for this user.',
142
143
  examples: ['setup', 'setup status', 'onboarding status'],
143
144
  },
144
145
  status: {
145
146
  usage: ['status', 'status --json', '--runtime-url http://127.0.0.1:3421 status'],
146
- summary: 'Print Agent config, provider, auth, connected-service state, and setup posture.',
147
+ summary: 'Print Agent config, provider, auth, connected-host state, and setup posture.',
147
148
  examples: ['status', 'status --json', '--runtime-url http://127.0.0.1:3421 status'],
148
149
  },
149
150
  doctor: {
@@ -157,9 +158,9 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
157
158
  examples: ['providers', 'providers inspect openai-subscriber', 'providers use openai openai:gpt-5.4'],
158
159
  },
159
160
  profiles: {
160
- usage: ['profiles list', 'profiles templates', 'profiles templates from-discovered <id> --yes', 'profiles create-from-discovered <name> --yes', 'profiles templates export <id> <path> --yes', 'profiles templates import <path> --yes', 'profiles show <name>', 'profiles create <name> [--template <id>] --yes', 'profiles delete <name> --yes', '--agent-profile <name>'],
161
- summary: 'Create and inspect isolated Agent profile homes, with starter templates for household, research, travel, operations, personal productivity, and local imported starters. A profile changes Agent-local config, sessions, memory, personas, skills, routines, and setup paths without changing connected GoodVibes services.',
162
- examples: ['profiles templates', 'profiles create-from-discovered research-desk --yes', 'profiles templates from-discovered research-desk --yes', 'profiles templates export research ./research-starter.json --yes', 'profiles templates import ./research-starter.json --yes', 'profiles create household --template household --yes', '--agent-profile household status'],
161
+ usage: ['profiles list', 'profiles default', 'profiles use <name> --yes', 'profiles default clear --yes', 'profiles templates', 'profiles templates from-discovered <id> --yes', 'profiles create-from-discovered <name> --yes', 'profiles templates export <id> <path> --yes', 'profiles templates import <path> --yes', 'profiles show <name>', 'profiles create <name> [--template <id>] --yes', 'profiles delete <name> --yes', '--agent-profile <name>'],
162
+ summary: 'Create and inspect isolated Agent profile homes, with starter templates for household, research, travel, operations, personal productivity, and local imported starters. A profile changes Agent-local config, sessions, memory, personas, skills, routines, and setup paths without changing the connected GoodVibes host.',
163
+ examples: ['profiles templates', 'profiles create household --template household --yes', 'profiles use household --yes', 'profiles default', 'profiles create-from-discovered research-desk --yes', 'profiles templates from-discovered research-desk --yes', 'profiles templates export research ./research-starter.json --yes', 'profiles templates import ./research-starter.json --yes', '--agent-profile household status'],
163
164
  },
164
165
  personas: {
165
166
  usage: [
@@ -177,7 +178,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
177
178
  'personas stale <id> <reason>',
178
179
  'personas delete <id> --yes',
179
180
  ],
180
- summary: 'Manage Agent-local personas for the serial main conversation. Personas do not spawn worker agents.',
181
+ summary: 'Manage Agent-local personas for the serial main conversation. Personas do not create separate Agent jobs.',
181
182
  examples: [
182
183
  'personas list',
183
184
  'personas discover',
@@ -192,25 +193,28 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
192
193
  'skills list',
193
194
  'skills enabled',
194
195
  'skills active',
196
+ 'skills attention',
195
197
  'skills discover',
196
198
  'skills import-discovered <name> [--enabled] --yes',
197
199
  'skills search <query>',
198
200
  'skills show <id>',
199
- 'skills create --name <name> --description <summary> --procedure <steps> [--tags a,b] [--triggers a,b] [--enabled]',
200
- 'skills update <id> [--name <name>] [--description <summary>] [--procedure <steps>] [--tags a,b] [--triggers a,b]',
201
+ 'skills create --name <name> --description <summary> --procedure <steps> [--tags a,b] [--triggers a,b] [--requires-env A,B] [--requires-command gh,jq] [--enabled]',
202
+ 'skills update <id> [--name <name>] [--description <summary>] [--procedure <steps>] [--tags a,b] [--triggers a,b] [--requires-env A,B] [--requires-command gh,jq]',
201
203
  'skills enable <id>',
202
204
  'skills disable <id>',
203
205
  'skills review <id>',
204
206
  'skills stale <id> <reason>',
205
207
  'skills delete <id> --yes',
206
- 'skills bundle [list|enabled|show|create|update|enable|disable|review|stale|delete]',
208
+ 'skills bundle [list|enabled|attention|show|create|update|enable|disable|review|stale|delete]',
207
209
  ],
208
210
  summary: 'Manage reusable Agent-local procedures and skill bundles for the main conversation.',
209
211
  examples: [
210
212
  'skills list',
213
+ 'skills attention',
214
+ 'skills bundle attention',
211
215
  'skills discover',
212
216
  'skills import-discovered "Daily Brief" --enabled --yes',
213
- 'skills create --name "Daily Brief" --description "Summarize operator state" --procedure "Review Agent Knowledge, work plans, approvals, and routines" --enabled',
217
+ 'skills create --name "Daily Brief" --description "Summarize operator state" --procedure "Review Agent Knowledge, work plans, approvals, and routines" --requires-env GOODVIBES_AGENT_TOKEN --requires-command gh --enabled',
214
218
  'skills bundle create --name "Ops Pack" --description "Daily operations bundle" --skills daily-brief --enabled',
215
219
  'skills delete daily-brief --yes',
216
220
  ],
@@ -233,7 +237,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
233
237
  'memory handoff-inspect <path>',
234
238
  'memory vector [status|doctor|rebuild]',
235
239
  ],
236
- summary: 'Manage Agent-owned durable memory. This uses the Agent memory store only; it never falls back to default Knowledge/Wiki or non-Agent knowledge segments.',
240
+ summary: 'Manage Agent-owned durable memory. This uses the Agent memory store only; it never falls back to default knowledge or non-Agent knowledge segments.',
237
241
  examples: [
238
242
  'memory list',
239
243
  'memory add fact "Prefers concise morning briefings" --scope project --tags preference',
@@ -247,20 +251,24 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
247
251
  usage: [
248
252
  'routines list',
249
253
  'routines enabled',
254
+ 'routines attention',
250
255
  'routines discover',
251
256
  'routines import-discovered <name> [--enabled] --yes',
252
257
  'routines show <id>',
258
+ 'routines create --name <name> --description <summary> --steps <steps> [--tags a,b] [--triggers a,b] [--requires-env A,B] [--requires-command gh,jq] [--enabled]',
253
259
  'routines receipts',
254
260
  'routines reconcile',
255
261
  'routines receipt <receipt-id>',
256
262
  'routines promote <id> (--cron <expr>|--every <interval>|--at <iso-time>) [--timezone <tz>] [--name <schedule-name>] [--provider <id>] [--model <model>] [--delivery-channel <channel[:route[:label]]>|--delivery-route <route[:label]>|--delivery-webhook <url>|--delivery-link <url>] [--disabled] --yes',
257
263
  ],
258
- summary: 'Inspect and import Agent-local routines, review local promotion receipts, reconcile receipts against live connected schedules, and explicitly promote a reviewed routine into a GoodVibes schedule. Without --yes, promote only prints the schedules.create preview.',
264
+ summary: 'Inspect, create, and import Agent-local routines with setup readiness. The same routine workflow is available in the TUI through /routines and the Agent workspace. GoodVibes schedule promotion is explicit. Without --yes, promotion only prints the preview.',
259
265
  examples: [
260
266
  'routines list',
267
+ 'routines attention',
261
268
  'routines discover',
262
269
  'routines import-discovered "Daily Brief" --enabled --yes',
263
270
  'routines show daily-operations-sweep',
271
+ 'routines create --name "Daily Sweep" --description "Review operator state" --steps "Check tasks, approvals, channels, and Agent Knowledge" --requires-env GOODVIBES_AGENT_TOKEN',
264
272
  'routines receipts',
265
273
  'routines reconcile',
266
274
  'routines promote daily-operations-sweep --cron "0 9 * * *" --timezone America/Chicago --delivery-channel slack --yes',
@@ -298,7 +306,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
298
306
  'knowledge import-browser-history [--browsers chrome,firefox] [--sources history,bookmark] --yes',
299
307
  'knowledge reindex --yes',
300
308
  ],
301
- summary: 'Call isolated Agent Knowledge/Wiki routes under /api/goodvibes-agent/knowledge. No default wiki or non-Agent fallback.',
309
+ summary: 'Call isolated Agent Knowledge routes under /api/goodvibes-agent/knowledge. No default knowledge or non-Agent fallback.',
302
310
  examples: [
303
311
  'knowledge status',
304
312
  'knowledge ask "What is GoodVibes Agent?"',
@@ -315,20 +323,20 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
315
323
  },
316
324
  ask: {
317
325
  usage: ['ask <question> [--limit <n>] [--mode concise|standard|detailed]'],
318
- summary: 'Shortcut for isolated Agent Knowledge ask. This never queries default Knowledge/Wiki or non-Agent knowledge.',
326
+ summary: 'Shortcut for isolated Agent Knowledge ask. This never queries default knowledge or non-Agent knowledge.',
319
327
  examples: ['ask "What is GoodVibes Agent?"', 'ask "release checklist" --mode concise'],
320
328
  },
321
329
  search: {
322
330
  usage: ['search <query> [--limit <n>]'],
323
- summary: 'Shortcut for isolated Agent Knowledge search. This never queries default Knowledge/Wiki or non-Agent knowledge.',
331
+ summary: 'Shortcut for isolated Agent Knowledge search. This never queries default knowledge or non-Agent knowledge.',
324
332
  examples: ['search "release checklist"', 'search "operator workspace" --limit 5'],
325
333
  },
326
334
  delegate: {
327
- usage: ['delegate [--wrfc] <build/fix/review task>'],
328
- summary: 'Create one shared-session task request for GoodVibes TUI. WRFC is requested only with --wrfc.',
335
+ usage: ['delegate [--review] <build/fix/review task>'],
336
+ summary: 'Create one shared-session task request for GoodVibes TUI. Delegated review is requested with --review.',
329
337
  examples: [
330
338
  'delegate "fix the failing tests in this repo"',
331
- 'delegate --wrfc "implement the settings screen and review it"',
339
+ 'delegate --review "implement the settings screen and review it"',
332
340
  ],
333
341
  },
334
342
  subscription: {
@@ -348,7 +356,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
348
356
  },
349
357
  tasks: {
350
358
  usage: ['tasks list', 'tasks show <taskId>'],
351
- summary: 'Inspect connected-service task summaries. Agent blocks service-owned task submission; use run for one-shot work or delegate for explicit build/fix/review handoff.',
359
+ summary: 'Inspect connected-host task summaries. Agent blocks host-owned task submission; use run for one-shot work or delegate for explicit build/fix/review handoff.',
352
360
  examples: ['tasks list', 'tasks show task-123', 'run "check provider readiness"', 'delegate "fix the failing tests"'],
353
361
  },
354
362
  bundle: {
@@ -370,7 +378,9 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
370
378
 
371
379
  const HELP_ALIASES: Record<string, string> = {
372
380
  exec: 'run',
381
+ e: 'run',
373
382
  onboarding: 'setup',
383
+ compatibility: 'compat',
374
384
  provider: 'providers',
375
385
  model: 'models',
376
386
  profile: 'profiles',
@@ -378,19 +388,34 @@ const HELP_ALIASES: Record<string, string> = {
378
388
  skill: 'skills',
379
389
  'agent-skills': 'skills',
380
390
  memories: 'memory',
391
+ routine: 'routines',
392
+ know: 'knowledge',
393
+ kb: 'knowledge',
394
+ find: 'search',
395
+ build: 'delegate',
381
396
  subscriptions: 'subscription',
382
397
  secret: 'secrets',
383
398
  session: 'sessions',
384
399
  task: 'tasks',
400
+ bundles: 'bundle',
385
401
  qrcode: 'pair',
386
402
  qr: 'pair',
403
+ completions: 'completion',
387
404
  };
388
405
 
406
+ export function listGoodVibesHelpTopics(): readonly string[] {
407
+ return Object.keys(COMMAND_HELP).sort();
408
+ }
409
+
389
410
  function normalizeHelpTopic(topic: string): string {
390
411
  const normalized = topic.trim().toLowerCase();
391
412
  return HELP_ALIASES[normalized] ?? normalized;
392
413
  }
393
414
 
415
+ export function hasGoodVibesCommandHelp(topic: string): boolean {
416
+ return COMMAND_HELP[normalizeHelpTopic(topic)] !== undefined;
417
+ }
418
+
394
419
  export function renderGoodVibesCommandHelp(topic: string, binary = 'goodvibes-agent'): string {
395
420
  const normalized = normalizeHelpTopic(topic);
396
421
  const help = COMMAND_HELP[normalized];
@@ -402,7 +427,7 @@ export function renderGoodVibesCommandHelp(topic: string, binary = 'goodvibes-ag
402
427
  ].join('\n');
403
428
  }
404
429
  return [
405
- `GoodVibes ${normalized}`,
430
+ `GoodVibes Agent ${normalized}`,
406
431
  '',
407
432
  help.summary,
408
433
  '',