@pellux/goodvibes-agent 0.1.98 → 0.1.100

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,15 @@
2
2
 
3
3
  All notable changes to GoodVibes Agent will be recorded here.
4
4
 
5
+ ## 0.1.100 - 2026-06-01
6
+
7
+ - e2d5eee Run release tests only through branch CI
8
+ - 7d46e87 Prune dormant copied command modules
9
+
10
+ ## 0.1.99 - 2026-06-01
11
+
12
+ - 804edd2 Prune copied setup commands and single-test CI
13
+
5
14
  ## 0.1.98 - 2026-06-01
6
15
 
7
16
  - Avoid duplicate remote test runs during releases by letting the tag Release workflow own the single full validation pass.
@@ -38,6 +38,10 @@ git diff --check
38
38
 
39
39
  The GitHub release workflow publishes to npm only when the repository variable `PUBLISH_NPM` is `true` and the repository secret `NPM_TOKEN` is configured. Without those repository settings, the workflow still validates and creates the GitHub release, but npm publish must be run from a local environment with an exported token.
40
40
 
41
+ Branch CI is the only workflow that runs the full test suite. It runs `bun run test` once for the release SHA. The release workflow must not run tests again; it verifies that branch CI passed for the exact checked-out SHA and then continues with non-test release validation.
42
+
43
+ Do not add targeted `bun test` passes or separate release-only test gates to CI, release, or aggregate scripts. Tests that matter for release must be included in the single full branch-CI suite.
44
+
41
45
  Also run the package install smoke from a packed artifact. It must prove:
42
46
 
43
47
  - 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.98",
3
+ "version": "0.1.100",
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",
@@ -16,35 +16,16 @@
16
16
  "!src/test",
17
17
  "!src/**/*.test.ts",
18
18
  "!src/**/__tests__",
19
- "!src/input/commands/branch-runtime.ts",
20
- "!src/input/commands/control-room-runtime.ts",
21
- "!src/input/commands/discovery-runtime.ts",
22
- "!src/input/commands/hooks-runtime.ts",
23
- "!src/input/commands/incident-runtime.ts",
24
- "!src/input/commands/integration-runtime.ts",
25
- "!src/input/commands/local-setup.ts",
26
- "!src/input/commands/managed-runtime.ts",
27
- "!src/input/commands/marketplace-runtime.ts",
28
- "!src/input/commands/memory-product-runtime.ts",
29
- "!src/input/commands/operator-panel-runtime.ts",
30
- "!src/input/commands/platform-services-runtime.ts",
31
- "!src/input/commands/profile-sync-runtime.ts",
32
19
  "!src/input/commands/provider.ts",
33
20
  "!src/input/commands/remote-runtime.ts",
34
21
  "!src/input/commands/remote-runtime-pool.ts",
35
22
  "!src/input/commands/remote-runtime-setup.ts",
36
23
  "!src/input/commands/replay-runtime.ts",
37
- "!src/input/commands/services-runtime.ts",
38
- "!src/input/commands/settings-sync-runtime.ts",
39
- "!src/input/commands/share-runtime.ts",
40
24
  "!src/input/commands/skills-runtime.ts",
41
- "!src/input/commands/teleport-runtime.ts",
42
25
  "!src/panels/cockpit-panel.ts",
43
26
  "!src/panels/communication-panel.ts",
44
27
  "!src/panels/control-plane-panel.ts",
45
- "!src/panels/diff-panel.ts",
46
28
  "!src/panels/forensics-panel.ts",
47
- "!src/panels/git-panel.ts",
48
29
  "!src/panels/hooks-panel.ts",
49
30
  "!src/panels/incident-review-panel.ts",
50
31
  "!src/panels/marketplace-panel.ts",
@@ -54,13 +35,10 @@
54
35
  "!src/panels/plugins-panel.ts",
55
36
  "!src/panels/remote-panel.ts",
56
37
  "!src/panels/routes-panel.ts",
57
- "!src/panels/sandbox-panel.ts",
58
38
  "!src/panels/services-panel.ts",
59
39
  "!src/panels/settings-sync-panel.ts",
60
40
  "!src/panels/skills-panel.ts",
61
41
  "!src/panels/watchers-panel.ts",
62
- "!src/panels/worktree-panel.ts",
63
- "!src/panels/wrfc-panel.ts",
64
42
  "!src/verification",
65
43
  "tsconfig.json",
66
44
  "README.md",
@@ -92,8 +70,7 @@
92
70
  "publish:dry-run": "bun run scripts/publish-package.ts --dry-run",
93
71
  "publish:check": "bun run scripts/publish-check.ts",
94
72
  "package:install-check": "bun run scripts/package-install-check.ts",
95
- "eval:gate": "bun test src/test/runtime/eval/runner.test.ts",
96
- "ci:gate": "bun run typecheck && bun run test && bun run architecture:check && bun run perf:check && bun run eval:gate && bun run build && bun run publish:check && bun run package:install-check && bun run verification:ledger",
73
+ "ci:gate": "bun run typecheck && bun run test && bun run architecture:check && bun run perf:check && bun run build && bun run publish:check && bun run package:install-check && bun run verification:ledger",
97
74
  "build:prod": "bun run scripts/build.ts",
98
75
  "build:all": "bun run scripts/build.ts --all",
99
76
  "perf:check": "bun run scripts/perf-check.ts",
@@ -1,12 +1,32 @@
1
- import { dirname, join, resolve } from 'node:path';
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync } from 'node:fs';
3
2
  import type { CommandContext } from '../command-registry.ts';
4
3
  import { discoverSkills } from '../../agent/skill-discovery.ts';
5
4
  import { getPluginDirectories } from '../../plugins/loader';
6
5
  import { listBuiltinSubscriptionProviders } from '@pellux/goodvibes-sdk/platform/config';
7
- import type { SetupReviewSnapshot } from './local-setup-transfer.ts';
8
6
  import { requireProviderApi, requireReadModels, requireServiceRegistry, requireShellPaths, requireSubscriptionManager } from './runtime-services.ts';
9
- import { GOODVIBES_AGENT_SURFACE_ROOT } from '../../config/surface.ts';
7
+
8
+ export interface SetupReviewSnapshot {
9
+ readonly sessionId: string;
10
+ readonly providerCount: number;
11
+ readonly serviceCount: number;
12
+ readonly oauthProviderCount: number;
13
+ readonly builtinSubscriptionProviderCount: number;
14
+ readonly activeSubscriptionCount: number;
15
+ readonly pendingSubscriptionCount: number;
16
+ readonly serviceIssues: string[];
17
+ readonly skillCount: number;
18
+ readonly pluginCount: number;
19
+ readonly quarantinedPluginCount: number;
20
+ readonly pluginDirectories: string[];
21
+ readonly managedHookCount: number;
22
+ readonly managedHookChainCount: number;
23
+ readonly mcpServerCount: number;
24
+ readonly quarantinedMcpCount: number;
25
+ readonly elevatedMcpCount: number;
26
+ readonly remoteRunnerCount: number;
27
+ readonly issues: Array<{ readonly severity: 'pass' | 'warn' | 'fail'; readonly area: string; readonly message: string }>;
28
+ readonly services: string[];
29
+ }
10
30
 
11
31
  export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<SetupReviewSnapshot> {
12
32
  const shellPaths = requireShellPaths(ctx);
@@ -116,23 +136,3 @@ export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<Set
116
136
  services,
117
137
  };
118
138
  }
119
-
120
- export function exportSetupSupportBundle(
121
- targetDirArg: string,
122
- snapshot: SetupReviewSnapshot,
123
- ctx: CommandContext,
124
- ): string {
125
- const shellPaths = requireShellPaths(ctx);
126
- const targetDir = shellPaths.resolveWorkspacePath(targetDirArg);
127
- mkdirSync(targetDir, { recursive: true });
128
- writeFileSync(join(targetDir, 'startup-review.json'), JSON.stringify(snapshot, null, 2) + '\n', 'utf-8');
129
- const servicesPath = shellPaths.resolveProjectPath(GOODVIBES_AGENT_SURFACE_ROOT, 'services.json');
130
- if (existsSync(servicesPath)) {
131
- writeFileSync(join(targetDir, 'services.json'), readFileSync(servicesPath, 'utf-8'), 'utf-8');
132
- }
133
- const hooksPath = shellPaths.resolveProjectPath('hooks.managed.json');
134
- if (existsSync(hooksPath)) {
135
- writeFileSync(join(targetDir, 'hooks.managed.json'), readFileSync(hooksPath, 'utf-8'), 'utf-8');
136
- }
137
- return targetDir;
138
- }
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.98';
9
+ let _version = '0.1.100';
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 {
@@ -1,132 +0,0 @@
1
- import { dirname, join, resolve } from 'node:path';
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
- import type { CommandContext } from '../command-registry.ts';
4
- import type { ConfigKey } from '../../config/index.ts';
5
- import { CONFIG_SCHEMA } from '../../config/index.ts';
6
- import { requireShellPaths } from './runtime-services.ts';
7
- import { GOODVIBES_AGENT_SURFACE_ROOT } from '../../config/surface.ts';
8
-
9
- export interface SetupReviewSnapshot {
10
- readonly sessionId: string;
11
- readonly providerCount: number;
12
- readonly serviceCount: number;
13
- readonly oauthProviderCount: number;
14
- readonly builtinSubscriptionProviderCount: number;
15
- readonly activeSubscriptionCount: number;
16
- readonly pendingSubscriptionCount: number;
17
- readonly serviceIssues: string[];
18
- readonly skillCount: number;
19
- readonly pluginCount: number;
20
- readonly quarantinedPluginCount: number;
21
- readonly pluginDirectories: string[];
22
- readonly managedHookCount: number;
23
- readonly managedHookChainCount: number;
24
- readonly mcpServerCount: number;
25
- readonly quarantinedMcpCount: number;
26
- readonly elevatedMcpCount: number;
27
- readonly remoteRunnerCount: number;
28
- readonly issues: Array<{ severity: 'pass' | 'warn' | 'fail'; area: string; message: string }>;
29
- readonly services: string[];
30
- }
31
-
32
- export interface SetupTransferBundle {
33
- readonly schemaVersion: 'v1';
34
- readonly exportedAt: number;
35
- readonly startupReview: SetupReviewSnapshot;
36
- readonly config: Record<string, unknown>;
37
- readonly services?: Record<string, unknown>;
38
- readonly ecosystem?: {
39
- readonly plugins?: Record<string, unknown>;
40
- readonly skills?: Record<string, unknown>;
41
- };
42
- }
43
-
44
- export function inspectSetupTransferBundle(bundle: SetupTransferBundle): string {
45
- const ecosystemPluginCount = bundle.ecosystem?.plugins && Array.isArray((bundle.ecosystem.plugins as { entries?: unknown[] }).entries)
46
- ? ((bundle.ecosystem.plugins as { entries: unknown[] }).entries.length)
47
- : 0;
48
- const ecosystemSkillCount = bundle.ecosystem?.skills && Array.isArray((bundle.ecosystem.skills as { entries?: unknown[] }).entries)
49
- ? ((bundle.ecosystem.skills as { entries: unknown[] }).entries.length)
50
- : 0;
51
- return [
52
- 'Setup Transfer Review',
53
- ` schemaVersion: ${bundle.schemaVersion}`,
54
- ` exportedAt: ${new Date(bundle.exportedAt).toISOString()}`,
55
- ` session: ${bundle.startupReview.sessionId}`,
56
- ` services: ${bundle.startupReview.serviceCount}`,
57
- ` plugins: ${bundle.startupReview.pluginCount}`,
58
- ` skills: ${bundle.startupReview.skillCount}`,
59
- ` remote workers: ${bundle.startupReview.remoteRunnerCount}`,
60
- ` config keys: ${Object.keys(bundle.config ?? {}).length}`,
61
- ` curated plugins: ${ecosystemPluginCount}`,
62
- ` curated skills: ${ecosystemSkillCount}`,
63
- ].join('\n');
64
- }
65
-
66
- export function buildSetupTransferBundle(ctx: CommandContext, snapshot: SetupReviewSnapshot): SetupTransferBundle {
67
- const shellPaths = requireShellPaths(ctx);
68
- const config: Record<string, unknown> = {};
69
- for (const entry of CONFIG_SCHEMA) {
70
- try {
71
- config[entry.key] = structuredClone(ctx.platform.configManager.get(entry.key as ConfigKey));
72
- } catch {
73
- // Ignore unreadable config values in transfer bundles.
74
- }
75
- }
76
- const servicesPath = shellPaths.resolveProjectPath(GOODVIBES_AGENT_SURFACE_ROOT, 'services.json');
77
- const pluginsPath = shellPaths.resolveProjectPath(GOODVIBES_AGENT_SURFACE_ROOT, 'ecosystem', 'plugins.json');
78
- const skillsPath = shellPaths.resolveProjectPath(GOODVIBES_AGENT_SURFACE_ROOT, 'ecosystem', 'skills.json');
79
- const services = existsSync(servicesPath)
80
- ? JSON.parse(readFileSync(servicesPath, 'utf-8')) as Record<string, unknown>
81
- : undefined;
82
- const plugins = existsSync(pluginsPath)
83
- ? JSON.parse(readFileSync(pluginsPath, 'utf-8')) as Record<string, unknown>
84
- : undefined;
85
- const skills = existsSync(skillsPath)
86
- ? JSON.parse(readFileSync(skillsPath, 'utf-8')) as Record<string, unknown>
87
- : undefined;
88
-
89
- return {
90
- schemaVersion: 'v1',
91
- exportedAt: Date.now(),
92
- startupReview: snapshot,
93
- config,
94
- services,
95
- ecosystem: {
96
- plugins,
97
- skills,
98
- },
99
- };
100
- }
101
-
102
- export function createSetupLink(surface: string, target?: string): string {
103
- const encodedTarget = target ? `?target=${encodeURIComponent(target)}` : '';
104
- return `goodvibes://open/${encodeURIComponent(surface)}${encodedTarget}`;
105
- }
106
-
107
- export function parseSetupLink(value: string): { surface: string; target?: string } | null {
108
- try {
109
- const parsed = new URL(value);
110
- if (parsed.protocol !== 'goodvibes:') return null;
111
- const segments = parsed.pathname.split('/').filter(Boolean);
112
- if (parsed.hostname !== 'open' || segments.length !== 1) return null;
113
- return {
114
- surface: decodeURIComponent(segments[0]!),
115
- target: parsed.searchParams.get('target') ?? undefined,
116
- };
117
- } catch {
118
- return null;
119
- }
120
- }
121
-
122
- export function exportSetupTransferBundle(
123
- ctx: CommandContext,
124
- pathArg: string,
125
- bundle: SetupTransferBundle,
126
- ): string {
127
- const shellPaths = requireShellPaths(ctx);
128
- const targetPath = shellPaths.resolveWorkspacePath(pathArg);
129
- mkdirSync(dirname(targetPath), { recursive: true });
130
- writeFileSync(targetPath, JSON.stringify(bundle, null, 2) + '\n', 'utf-8');
131
- return targetPath;
132
- }