@pellux/goodvibes-agent 0.1.5 → 0.1.7

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,19 @@
2
2
 
3
3
  All notable changes to GoodVibes Agent will be recorded here.
4
4
 
5
+ ## 0.1.7 - 2026-05-31
6
+
7
+ - Replaced active planning-loop output and tests that still described planning as TUI-owned with Agent-owned planning state and planning namespace language.
8
+ - Added `LICENSE` to the explicit package file contract and release verification so npm tarballs cannot omit license text.
9
+ - Prevented the operator workspace from dispatching placeholder delegation commands such as `/delegate --wrfc <task>`; those actions now provide guidance until the user supplies real task text.
10
+
11
+ ## 0.1.6 - 2026-05-31
12
+
13
+ - Made the publish helper use exported `NODE_AUTH_TOKEN` or `NPM_TOKEN` automatically by writing a temporary npm user config for publish commands.
14
+ - Rewrote source docs for tools, commands, knowledge, artifacts, and multimodal behavior so they describe Agent-only Knowledge/Wiki and never teach default Knowledge/Wiki or HomeGraph fallback.
15
+ - Updated `/plan` command and Planning panel language from copied TUI-owned wording to Agent-owned workspace planning state.
16
+ - Added regression tests that keep source docs and active planning surfaces aligned with Agent Knowledge isolation and Agent product language.
17
+
5
18
  ## 0.1.5 - 2026-05-31
6
19
 
7
20
  - Hardened package-facing release checks so shipped docs and Agent guidance cannot reintroduce default Knowledge/Wiki, HomeGraph, Home Assistant, copied TUI daemon, or copied WRFC-first policy text.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Michael Davis and GoodVibes contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  # Getting Started
2
2
 
3
- GoodVibes Agent `0.1.5` is the current installable public alpha of the personal operator assistant built on the GoodVibes TUI foundation.
3
+ GoodVibes Agent `0.1.7` is the current installable public alpha of the personal operator assistant built on the GoodVibes TUI foundation.
4
4
 
5
5
  ## Requirements
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Release And Publishing
2
2
 
3
- GoodVibes Agent `0.1.5` is the current installable public alpha release.
3
+ GoodVibes Agent `0.1.7` is the current installable public alpha release.
4
4
 
5
5
  ## Package Identity
6
6
 
@@ -25,6 +25,8 @@ npm pack --dry-run
25
25
  git diff --check
26
26
  ```
27
27
 
28
+ `bun run publish:package` publishes from a staged package directory. If `NPM_CONFIG_USERCONFIG` is already set, npm uses it. Otherwise the script creates a temporary 0600 npm userconfig from `NODE_AUTH_TOKEN` or `NPM_TOKEN`, uses it for that publish command, and removes it with the staging directory.
29
+
28
30
  Also run the package install smoke from a packed artifact. It must prove:
29
31
 
30
32
  - the installed command is on `PATH`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "description": "Near-fork GoodVibes operator assistant with the GoodVibes TUI shell, renderer, input, fullscreen workspace, and daemon-connected Agent product brain.",
6
6
  "type": "module",
@@ -11,6 +11,7 @@
11
11
  },
12
12
  "files": [
13
13
  "bin",
14
+ "LICENSE",
14
15
  ".goodvibes/agents",
15
16
  ".goodvibes/skills",
16
17
  ".goodvibes/GOODVIBES.md",
@@ -32,6 +32,7 @@ const REQUIRED_BIN_COMMANDS = ['goodvibes-agent'] as const;
32
32
  const REQUIRED_TARBALL_PATHS = [
33
33
  'README.md',
34
34
  'CHANGELOG.md',
35
+ 'LICENSE',
35
36
  'package.json',
36
37
  'src/main.ts',
37
38
  'bin/goodvibes-agent.ts',
@@ -233,7 +233,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
233
233
  detail: 'Agent does not become the coding TUI. Build, implement, fix, patch, and review work must be handed to GoodVibes TUI with the full original ask and WRFC only when explicitly requested.',
234
234
  actions: [
235
235
  { id: 'delegate-guidance', label: 'Delegation rule', detail: 'For build/fix/review work, delegate one request to GoodVibes TUI instead of spawning local Engineer/Reviewer/Tester roots.', kind: 'guidance', safety: 'delegates' },
236
- { id: 'review-command', label: 'Review delegation command', detail: 'Use /delegate --wrfc only when the user explicitly asks for code review/build execution.', command: '/delegate --wrfc <task>', kind: 'command', safety: 'delegates' },
236
+ { id: 'review-command', label: 'Review delegation command', detail: 'Use /delegate --wrfc <task> only when the user explicitly asks for code review/build execution. Close this workspace and include the actual task text.', kind: 'guidance', safety: 'delegates' },
237
237
  { id: 'remote-policy', label: 'Remote runner policy', detail: 'Remote dispatch/rerun is blocked in Agent; TUI owns runner topology for delegated build work.', command: '/remote dispatch', kind: 'command', safety: 'blocked' },
238
238
  ],
239
239
  },
@@ -395,6 +395,17 @@ export class AgentWorkspace {
395
395
  };
396
396
  return;
397
397
  }
398
+ if (/<[^>\s]+(?:\s+[^>]*)?>/.test(action.command)) {
399
+ this.status = `Placeholder command not dispatched: ${action.command}.`;
400
+ this.lastActionResult = {
401
+ kind: 'guidance',
402
+ title: `${action.label} needs details`,
403
+ detail: 'This action is a command template. Close the workspace and run it with real task text instead of placeholder values.',
404
+ command: action.command,
405
+ safety: action.safety,
406
+ };
407
+ return;
408
+ }
398
409
  if (!this.context?.executeCommand || !this.dispatchCommand) {
399
410
  this.status = `Command dispatch is not available for ${action.command}.`;
400
411
  this.lastActionResult = {
@@ -43,14 +43,14 @@ function formatNextQuestion(question: ProjectPlanningQuestion | undefined): stri
43
43
  if (!question) return 'No next question recorded.';
44
44
  const lines = [`Next question: ${question.prompt}`];
45
45
  if (question.recommendedAnswer) lines.push(`Recommended answer: ${question.recommendedAnswer}`);
46
- lines.push('Answer in the prompt, or focus the Planning panel to choose/type an answer.');
46
+ lines.push('Answer in the prompt, or focus the Planning workspace to choose/type an answer.');
47
47
  return lines.join('\n');
48
48
  }
49
49
 
50
50
  export function registerPlanningRuntimeCommands(registry: CommandRegistry): void {
51
51
  registry.register({
52
52
  name: 'plan',
53
- description: 'Inspect or seed TUI-owned project planning state',
53
+ description: 'Inspect or seed Agent workspace planning state',
54
54
  usage: '[panel | approve | list | show <id> | mode | explain | override <strategy> | status | clear | <planning goal>]',
55
55
  argsHint: '[panel|approve|status|<goal>]',
56
56
  async handler(args, ctx) {
@@ -86,7 +86,7 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
86
86
  ctx.print(
87
87
  `Project planning: ${evaluation.readiness}\n` +
88
88
  `Project: ${status.projectId}\n` +
89
- `Knowledge space: ${status.knowledgeSpaceId}\n` +
89
+ `Planning namespace: ${status.knowledgeSpaceId}\n` +
90
90
  `Artifacts: ${status.counts.states} state, ${status.counts.decisions} decisions, ${status.counts.languageArtifacts} language\n` +
91
91
  formatNextQuestion(evaluation.nextQuestion),
92
92
  );
@@ -175,11 +175,11 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
175
175
  state: {
176
176
  goal: taskDescription,
177
177
  knownContext: [
178
- `Workspace planning was seeded from the TUI /plan command.`,
178
+ `Workspace planning was seeded from the Agent /plan command.`,
179
179
  ],
180
180
  metadata: {
181
181
  active: true,
182
- owner: 'tui',
182
+ owner: 'agent',
183
183
  source: 'plan-command',
184
184
  lastPromptAt: Date.now(),
185
185
  },
@@ -55,9 +55,9 @@ export interface BuiltinPanelDeps {
55
55
  resumeSession?: (sessionId: string) => void;
56
56
  /** Request a shell repaint directly rather than routing through a retired event path. */
57
57
  requestRender?: () => void;
58
- /** Submit a Planning panel answer through the normal TUI chat/planning coordinator path. */
58
+ /** Submit a Planning panel answer through the normal Agent chat/planning coordinator path. */
59
59
  submitPlanningAnswer?: (answer: string) => void;
60
- /** Pause the TUI-owned planning loop and return focus to normal prompt input. */
60
+ /** Pause the Agent-owned planning loop and return focus to normal prompt input. */
61
61
  dismissPlanning?: () => void;
62
62
  /** ForensicsRegistry for the Forensics panel. */
63
63
  forensicsRegistry?: import('@/runtime/index.ts').ForensicsRegistry;
@@ -96,9 +96,9 @@ export interface BuiltinPanelDeps {
96
96
  adaptivePlanner?: AdaptivePlanner;
97
97
  /** Passive SDK-backed project planning artifact service. */
98
98
  projectPlanningService?: ProjectPlanningService;
99
- /** Stable workspace project id for project:<projectId> planning spaces. */
99
+ /** Stable workspace project id for project:<projectId> planning namespaces. */
100
100
  projectPlanningProjectId?: string;
101
- /** TUI-owned persistent work plan store. */
101
+ /** Agent-owned persistent work plan store. */
102
102
  workPlanStore?: import('../../work-plans/work-plan-store.ts').WorkPlanStore;
103
103
  /** Shared system-messages panel instance attached from boot so low-priority chatter stays out of conversation. */
104
104
  systemMessagesPanel?: import('../system-messages-panel.ts').SystemMessagesPanel;
@@ -174,11 +174,11 @@ export class ProjectPlanningPanel extends BasePanel {
174
174
  lines: [
175
175
  buildKeyValueLine(width, [
176
176
  { label: 'project', value: this.projectId, valueColor: C.planning },
177
- { label: 'space', value: status?.knowledgeSpaceId ?? `project:${this.projectId}`, valueColor: C.value },
178
- { label: 'mode', value: 'TUI-owned passive backing store', valueColor: C.info },
177
+ { label: 'store', value: status?.knowledgeSpaceId ?? `project:${this.projectId}`, valueColor: C.value },
178
+ { label: 'mode', value: 'Agent-owned workspace planning state', valueColor: C.info },
179
179
  ], C),
180
180
  buildPanelLine(width, [
181
- [' Planning never starts from daemon, webhooks, ntfy, Home Assistant, or companion surfaces.', C.dim],
181
+ [' Planning stays in the Agent main conversation; build/fix/review execution is delegated explicitly to GoodVibes TUI.', C.dim],
182
182
  ]),
183
183
  ],
184
184
  });
@@ -189,7 +189,7 @@ export class ProjectPlanningPanel extends BasePanel {
189
189
  lines: buildEmptyState(
190
190
  width,
191
191
  'No project planning state has been saved for this workspace.',
192
- 'Describe the intended change in normal chat to let the TUI start the planning interview. The SDK only stores and evaluates artifacts.',
192
+ 'Describe the intended operator outcome in normal chat to let the Agent start the planning interview. The SDK stores and evaluates artifacts; it does not start execution.',
193
193
  [],
194
194
  C,
195
195
  ),
@@ -227,7 +227,7 @@ export class ProjectPlanningPanel extends BasePanel {
227
227
 
228
228
  return buildPanelWorkspace(width, height, {
229
229
  title: this.loading ? 'Project Planning - loading' : 'Project Planning',
230
- intro: 'Passive SDK-backed planning artifacts for the current workspace. Conversation control stays inside this TUI.',
230
+ intro: 'SDK-backed planning artifacts for the current Agent workspace. Conversation control stays in the main Agent turn.',
231
231
  sections: [scroll.section],
232
232
  footerLines: this.footerLines(width),
233
233
  palette: C,
@@ -198,7 +198,7 @@ export class ProjectPlanningCoordinator {
198
198
  metadata: {
199
199
  ...(existing?.metadata ?? {}),
200
200
  active: true,
201
- owner: 'tui',
201
+ owner: 'agent',
202
202
  source: 'conversation',
203
203
  lastPromptAt: now,
204
204
  },
@@ -471,13 +471,13 @@ export class ProjectPlanningCoordinator {
471
471
  .join('\n') || '- none recorded yet';
472
472
 
473
473
  return [
474
- 'TUI-owned project planning loop is active for this turn.',
474
+ 'Agent-owned planning loop is active for this turn.',
475
475
  'Do not execute code changes, spawn agents, or claim implementation is complete unless the user explicitly approves execution after the plan is structurally ready.',
476
476
  'Be relentless and thorough: challenge vague wording, inspect relevant context before proposing execution, and ask exactly one focused question when information is missing.',
477
477
  'Do not ask broad questions like "what is in scope?" without examples. Break broad planning gaps into concrete choices, explain tradeoffs, and recommend a default the user can accept or correct.',
478
478
  '',
479
479
  `Project id: ${this.projectId}`,
480
- `Knowledge space: ${state.knowledgeSpaceId}`,
480
+ `Planning namespace: ${state.knowledgeSpaceId}`,
481
481
  `Readiness: ${evaluation.readiness}`,
482
482
  `Execution approved: ${state.executionApproved ? 'yes' : 'no'}`,
483
483
  `Goal: ${state.goal || '(missing)'}`,
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.5';
9
+ let _version = '0.1.7';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
12
12
  _version = pkg.version ?? _version;