@pellux/goodvibes-tui 1.13.0 → 1.14.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.
- package/CHANGELOG.md +101 -0
- package/README.md +6 -6
- package/bin/goodvibes +6 -0
- package/bin/goodvibes-daemon +6 -0
- package/bin/launcher-support.js +34 -1
- package/docs/foundation-artifacts/operator-contract.json +8076 -2047
- package/package.json +15 -11
- package/scripts/postinstall.js +73 -48
- package/src/cli/bundle-command.ts +5 -5
- package/src/cli/completion.ts +1 -1
- package/src/cli/completions/generate.ts +15 -3
- package/src/cli/doctor.ts +385 -0
- package/src/cli/entrypoint.ts +72 -1
- package/src/cli/help.ts +29 -9
- package/src/cli/hooks-command.ts +74 -0
- package/src/cli/hooks-report.ts +167 -0
- package/src/cli/index.ts +3 -0
- package/src/cli/management.ts +13 -1
- package/src/cli/parser.ts +10 -2
- package/src/cli/plugin-bundles-command.ts +228 -0
- package/src/cli/plugin-command.ts +179 -0
- package/src/cli/service-posture.ts +10 -0
- package/src/cli/status.ts +275 -2
- package/src/cli/tui-startup.ts +119 -1
- package/src/cli/types.ts +3 -1
- package/src/config/index.ts +16 -0
- package/src/config/tui-extension-settings.ts +169 -0
- package/src/core/approval-alert.ts +15 -2
- package/src/core/compaction-receipt.ts +127 -0
- package/src/core/model-routing-chip.ts +82 -0
- package/src/core/permission-mode.ts +89 -0
- package/src/core/rewind-receipt.ts +83 -0
- package/src/core/rewind-turn-anchors.ts +160 -0
- package/src/core/scriptable-statusline.ts +141 -0
- package/src/core/session-auto-titler.ts +110 -0
- package/src/core/stream-event-wiring.ts +20 -0
- package/src/core/system-message-router.ts +1 -1
- package/src/core/terminal-notifier.ts +102 -0
- package/src/core/turn-event-wiring.ts +80 -1
- package/src/input/command-reference.ts +96 -0
- package/src/input/command-registry.ts +25 -0
- package/src/input/commands/channel-pairing.ts +245 -0
- package/src/input/commands/channel-runtime.ts +152 -6
- package/src/input/commands/checkin-runtime.ts +89 -0
- package/src/input/commands/checkpoint-runtime.ts +7 -179
- package/src/input/commands/ci-runtime.ts +207 -0
- package/src/input/commands/cost-attribution-format.ts +52 -0
- package/src/input/commands/cost-runtime.ts +44 -4
- package/src/input/commands/editor-runtime.ts +22 -0
- package/src/input/commands/flags-runtime.ts +328 -0
- package/src/input/commands/health-metrics-format.ts +67 -0
- package/src/input/commands/health-runtime.ts +55 -1
- package/src/input/commands/memory.ts +23 -0
- package/src/input/commands/operator-rpc.ts +95 -0
- package/src/input/commands/palette-runtime.ts +22 -0
- package/src/input/commands/permissions-provenance.ts +264 -0
- package/src/input/commands/permissions-runtime.ts +21 -0
- package/src/input/commands/planning-runtime.ts +28 -1
- package/src/input/commands/platform-access-runtime.ts +2 -97
- package/src/input/commands/principals-runtime.ts +212 -0
- package/src/input/commands/product-runtime.ts +43 -3
- package/src/input/commands/recall-files-config.ts +54 -0
- package/src/input/commands/recall-files-git.ts +57 -0
- package/src/input/commands/recall-files.ts +185 -0
- package/src/input/commands/recall-query.ts +8 -3
- package/src/input/commands/recall-review.ts +2 -2
- package/src/input/commands/recall-shared.ts +13 -0
- package/src/input/commands/relay-runtime.ts +86 -0
- package/src/input/commands/review-runtime.ts +160 -0
- package/src/input/commands/rewind-runtime.ts +362 -0
- package/src/input/commands/schedule-nl.ts +147 -0
- package/src/input/commands/schedule-runtime.ts +29 -10
- package/src/input/commands/secret-runtime.ts +55 -0
- package/src/input/commands/session-content.ts +19 -8
- package/src/input/commands/session-workflow.ts +10 -0
- package/src/input/commands/update-runtime.ts +363 -0
- package/src/input/commands/workstream-attempt-dependents.ts +103 -0
- package/src/input/commands/workstream-attempts.ts +244 -0
- package/src/input/commands/workstream-runtime.ts +164 -26
- package/src/input/commands/worktree-runtime.ts +56 -2
- package/src/input/commands.ts +135 -80
- package/src/input/composer-capture.ts +67 -0
- package/src/input/composer-editor.ts +134 -0
- package/src/input/concealed-input.ts +94 -0
- package/src/input/exec-env-scrub-config.ts +84 -0
- package/src/input/feature-unit-layout.ts +142 -0
- package/src/input/feed-context-factory.ts +2 -0
- package/src/input/handler-feed-routes.ts +17 -0
- package/src/input/handler-feed.ts +3 -0
- package/src/input/handler-modal-routes.ts +5 -2
- package/src/input/handler-shortcuts.ts +37 -0
- package/src/input/handler.ts +24 -2
- package/src/input/keybindings.ts +11 -2
- package/src/input/onboarding/onboarding-feature-units.ts +536 -0
- package/src/input/onboarding/onboarding-wizard-apply.ts +40 -6
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +324 -629
- package/src/input/onboarding/onboarding-wizard-steps.ts +5 -5
- package/src/input/onboarding/onboarding-wizard-types.ts +6 -0
- package/src/input/relay-settings-descriptions.ts +35 -0
- package/src/input/sandbox-exec-config.ts +107 -0
- package/src/input/settings-modal-adjustment.ts +4 -7
- package/src/input/settings-modal-data.ts +178 -8
- package/src/input/settings-modal-mutations.ts +41 -13
- package/src/input/settings-modal-types.ts +42 -5
- package/src/input/settings-modal.ts +67 -15
- package/src/input/submission-router.ts +4 -1
- package/src/input/worktree-setup-config.ts +93 -0
- package/src/main.ts +43 -43
- package/src/panels/builtin/development.ts +14 -0
- package/src/panels/diff-review-model.ts +189 -0
- package/src/panels/diff-review-panel.ts +395 -0
- package/src/panels/fleet-panel-format.ts +114 -2
- package/src/panels/fleet-panel.ts +65 -78
- package/src/panels/fleet-read-model.ts +91 -11
- package/src/panels/fleet-stop.ts +19 -4
- package/src/panels/modals/memory-modal.ts +11 -2
- package/src/permissions/hunk-selection.ts +86 -5
- package/src/permissions/prompt.ts +108 -7
- package/src/permissions/sandbox-exec-gate.ts +162 -0
- package/src/renderer/settings-modal-helpers.ts +21 -1
- package/src/renderer/settings-modal.ts +70 -44
- package/src/renderer/shell-surface.ts +23 -1
- package/src/renderer/system-message.ts +4 -0
- package/src/renderer/tool-result-summary.ts +95 -5
- package/src/renderer/ui-factory.ts +22 -0
- package/src/runtime/bootstrap-command-context.ts +15 -1
- package/src/runtime/bootstrap-command-parts.ts +14 -2
- package/src/runtime/bootstrap-core.ts +38 -38
- package/src/runtime/bootstrap-notifier-sync.ts +41 -0
- package/src/runtime/bootstrap-shell.ts +8 -0
- package/src/runtime/bootstrap.ts +21 -23
- package/src/runtime/context-accounting-source.ts +103 -0
- package/src/runtime/conversation-rewind-port.ts +130 -0
- package/src/runtime/fleet-needs-input-push.ts +70 -0
- package/src/runtime/install-self-check-startup.ts +36 -0
- package/src/runtime/install-self-check.ts +149 -0
- package/src/runtime/onboarding/fast-path.ts +93 -0
- package/src/runtime/process-lifecycle.ts +32 -24
- package/src/runtime/relay-reachability-bridge.ts +53 -0
- package/src/runtime/release-artifacts.ts +79 -0
- package/src/runtime/services.ts +38 -37
- package/src/runtime/trust/workspace-registration.ts +184 -0
- package/src/runtime/trust/workspace-trust.ts +202 -0
- package/src/runtime/ui-services.ts +2 -1
- package/src/runtime/update-check.ts +113 -0
- package/src/runtime/workspace-checkpointing.ts +32 -0
- package/src/runtime/workstream-attempts-validation.ts +77 -0
- package/src/runtime/workstream-draft-edits.ts +95 -0
- package/src/runtime/workstream-draft-store.ts +101 -0
- package/src/runtime/workstream-draft-types.ts +42 -0
- package/src/runtime/workstream-services.ts +70 -39
- package/src/shell/blocking-input.ts +29 -0
- package/src/shell/ui-openers.ts +65 -0
- package/src/verification/verification-ledger.ts +56 -2
- package/src/version.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +0 -130
- package/src/runtime/render-scheduler.ts +0 -90
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-tui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Terminal-native GoodVibes product for coding, operations, automation, knowledge, channels, and daemon-backed control-plane workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/main.ts",
|
|
@@ -51,6 +51,9 @@
|
|
|
51
51
|
"release:dry": "bun run scripts/release.ts --dry-run",
|
|
52
52
|
"publish:package": "bun run scripts/publish-package.ts",
|
|
53
53
|
"publish:dry-run": "bun run scripts/publish-package.ts --dry-run",
|
|
54
|
+
"platform:assemble": "bun run scripts/assemble-platform-packages.ts",
|
|
55
|
+
"platform:publish": "bun run scripts/publish-platform-packages.ts",
|
|
56
|
+
"platform:publish:dry-run": "bun run scripts/publish-platform-packages.ts --dry-run",
|
|
54
57
|
"publish:dry-run:github": "GOODVIBES_PUBLIC_PACKAGE_NAME=@mgd34msu/goodvibes-tui GOODVIBES_PUBLISH_REGISTRY=https://npm.pkg.github.com bun run scripts/publish-package.ts --dry-run",
|
|
55
58
|
"publish:check": "bun run scripts/publish-check.ts",
|
|
56
59
|
"package:install-check": "bun run scripts/package-install-check.ts",
|
|
@@ -59,8 +62,10 @@
|
|
|
59
62
|
"perf:check": "bun run scripts/perf-check.ts",
|
|
60
63
|
"perf:baseline": "GOODVIBES_PERF_SAVE_BASELINE=1 bun run scripts/perf-check.ts",
|
|
61
64
|
"architecture:check": "bun run scripts/check-architecture.ts",
|
|
65
|
+
"workflows:check": "bun run scripts/check-workflows.ts",
|
|
62
66
|
"audit:home": "bun run scripts/audit-goodvibes-home.ts",
|
|
63
67
|
"foundation:artifacts": "bun run scripts/export-foundation-artifacts.ts",
|
|
68
|
+
"docs:commands": "bun run scripts/generate-command-reference.ts",
|
|
64
69
|
"verification:ledger": "bun run scripts/verification-ledger.ts",
|
|
65
70
|
"verification:live": "bun run scripts/verify-live.ts",
|
|
66
71
|
"eval:gate": "bun run scripts/eval-gate.ts",
|
|
@@ -99,7 +104,8 @@
|
|
|
99
104
|
"@anthropic-ai/vertex-sdk": "^0.16.0",
|
|
100
105
|
"@ast-grep/napi": "^0.42.0",
|
|
101
106
|
"@aws/bedrock-token-generator": "^1.1.0",
|
|
102
|
-
"@pellux/goodvibes-sdk": "1.
|
|
107
|
+
"@pellux/goodvibes-sdk": "1.7.1",
|
|
108
|
+
"@pellux/goodvibes-terminal-shell": "1.7.1",
|
|
103
109
|
"bash-language-server": "^5.6.0",
|
|
104
110
|
"fuse.js": "^7.1.0",
|
|
105
111
|
"graphql": "^16.13.2",
|
|
@@ -124,15 +130,13 @@
|
|
|
124
130
|
"@types/bun": "^1.3.10",
|
|
125
131
|
"typescript": "^5.9.3"
|
|
126
132
|
},
|
|
127
|
-
"
|
|
128
|
-
"@pellux/goodvibes-
|
|
129
|
-
"
|
|
130
|
-
"
|
|
131
|
-
"
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
"tree-sitter-typescript"
|
|
135
|
-
],
|
|
133
|
+
"optionalDependencies": {
|
|
134
|
+
"@pellux/goodvibes-tui-linux-x64": "1.14.0",
|
|
135
|
+
"@pellux/goodvibes-tui-linux-arm64": "1.14.0",
|
|
136
|
+
"@pellux/goodvibes-tui-darwin-x64": "1.14.0",
|
|
137
|
+
"@pellux/goodvibes-tui-darwin-arm64": "1.14.0"
|
|
138
|
+
},
|
|
139
|
+
"trustedDependencies": [],
|
|
136
140
|
"overrides": {
|
|
137
141
|
"minimatch": "^10.2.5"
|
|
138
142
|
}
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
import { chmodSync, copyFileSync, cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import {
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
5
|
import { basename, dirname, join } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { CHECKSUM_MANIFEST_NAME, parseChecksumFile, resolveArtifactNames, sha256, verifyChecksum } from '../src/runtime/release-artifacts.ts';
|
|
8
|
+
|
|
9
|
+
// Platform package names, mirrored from scripts/platform-packages.ts, keyed by
|
|
10
|
+
// `${process.platform}-${node-arch}`.
|
|
11
|
+
const PLATFORM_PACKAGE_NAMES = {
|
|
12
|
+
'linux-x64': '@pellux/goodvibes-tui-linux-x64',
|
|
13
|
+
'linux-arm64': '@pellux/goodvibes-tui-linux-arm64',
|
|
14
|
+
'darwin-x64': '@pellux/goodvibes-tui-darwin-x64',
|
|
15
|
+
'darwin-arm64': '@pellux/goodvibes-tui-darwin-arm64',
|
|
16
|
+
};
|
|
7
17
|
|
|
8
18
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
19
|
const projectRoot = join(__dirname, '..');
|
|
@@ -15,56 +25,12 @@ function isSourceCheckout() {
|
|
|
15
25
|
return existsSync(join(projectRoot, '.git')) || existsSync(join(projectRoot, 'bun.lock'));
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
function resolveArtifactNames(platform, arch) {
|
|
19
|
-
if (platform === 'linux' && arch === 'x64') {
|
|
20
|
-
return {
|
|
21
|
-
app: 'goodvibes-linux-x64',
|
|
22
|
-
daemon: 'goodvibes-daemon-linux-x64',
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
if (platform === 'linux' && arch === 'arm64') {
|
|
26
|
-
return {
|
|
27
|
-
app: 'goodvibes-linux-arm64',
|
|
28
|
-
daemon: 'goodvibes-daemon-linux-arm64',
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
if (platform === 'darwin' && arch === 'x64') {
|
|
32
|
-
return {
|
|
33
|
-
app: 'goodvibes-macos-x64',
|
|
34
|
-
daemon: 'goodvibes-daemon-macos-x64',
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
if (platform === 'darwin' && arch === 'arm64') {
|
|
38
|
-
return {
|
|
39
|
-
app: 'goodvibes-macos-arm64',
|
|
40
|
-
daemon: 'goodvibes-daemon-macos-arm64',
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
28
|
function prepareBinary(path) {
|
|
47
29
|
if (process.platform !== 'win32') {
|
|
48
30
|
chmodSync(path, 0o755);
|
|
49
31
|
}
|
|
50
32
|
}
|
|
51
33
|
|
|
52
|
-
function sha256(buffer) {
|
|
53
|
-
return createHash('sha256').update(buffer).digest('hex');
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function parseChecksumFile(contents) {
|
|
57
|
-
const checksums = new Map();
|
|
58
|
-
for (const rawLine of contents.split(/\r?\n/)) {
|
|
59
|
-
const line = rawLine.trim();
|
|
60
|
-
if (!line) continue;
|
|
61
|
-
const match = line.match(/^([a-f0-9]{64})\s+\*?(.+)$/i);
|
|
62
|
-
if (!match) continue;
|
|
63
|
-
checksums.set(match[2], match[1].toLowerCase());
|
|
64
|
-
}
|
|
65
|
-
return checksums;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
34
|
function resolveRepositoryBaseUrl() {
|
|
69
35
|
const repositoryUrl = typeof pkg.repository?.url === 'string' ? pkg.repository.url : '';
|
|
70
36
|
const normalized = repositoryUrl
|
|
@@ -93,6 +59,48 @@ async function downloadText(url) {
|
|
|
93
59
|
return await response.text();
|
|
94
60
|
}
|
|
95
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Copy the prebuilt binaries (and sqlite-vec addon, if present) out of the
|
|
64
|
+
* installed platform package into vendor/. Returns true when it handled the
|
|
65
|
+
* install, false when no platform package is available (fall back to download).
|
|
66
|
+
*/
|
|
67
|
+
function installFromPlatformPackage(artifacts, vendorDir) {
|
|
68
|
+
const pkgName = PLATFORM_PACKAGE_NAMES[`${process.platform}-${process.arch}`];
|
|
69
|
+
if (!pkgName) return false;
|
|
70
|
+
|
|
71
|
+
let pkgBinDir;
|
|
72
|
+
try {
|
|
73
|
+
const require = createRequire(join(projectRoot, 'package.json'));
|
|
74
|
+
const pkgJsonPath = require.resolve(`${pkgName}/package.json`);
|
|
75
|
+
pkgBinDir = join(dirname(pkgJsonPath), 'bin');
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const app = join(pkgBinDir, artifacts.app);
|
|
81
|
+
const daemon = join(pkgBinDir, artifacts.daemon);
|
|
82
|
+
if (!existsSync(app) || !existsSync(daemon)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (const artifactName of [artifacts.app, artifacts.daemon]) {
|
|
87
|
+
const destination = join(vendorDir, artifactName);
|
|
88
|
+
rmSync(destination, { force: true });
|
|
89
|
+
copyFileSync(join(pkgBinDir, artifactName), destination);
|
|
90
|
+
prepareBinary(destination);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Carry the sqlite-vec native addon (bin/lib/...) beside the vendored binary
|
|
94
|
+
// so semantic memory keeps working (resolved as <execDir>/lib/...).
|
|
95
|
+
const libSrc = join(pkgBinDir, 'lib');
|
|
96
|
+
if (existsSync(libSrc)) {
|
|
97
|
+
cpSync(libSrc, join(vendorDir, 'lib'), { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
console.log(`postinstall: installed binaries from ${pkgName} (registry integrity, no download)`);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
|
|
96
104
|
async function installPlatformBinaries() {
|
|
97
105
|
const artifacts = resolveArtifactNames(process.platform, process.arch);
|
|
98
106
|
if (!artifacts) {
|
|
@@ -128,6 +136,14 @@ async function installPlatformBinaries() {
|
|
|
128
136
|
return;
|
|
129
137
|
}
|
|
130
138
|
|
|
139
|
+
// Prefer the platform package (@pellux/goodvibes-tui-<os>-<arch>): the package
|
|
140
|
+
// manager installed it with registry integrity and no lifecycle script, so its
|
|
141
|
+
// binaries need no checksum download here. Copy them into vendor/ so the bin/
|
|
142
|
+
// launchers find them on the fast path.
|
|
143
|
+
if (installFromPlatformPackage(artifacts, vendorDir)) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
131
147
|
const releaseBaseUrl =
|
|
132
148
|
process.env.GOODVIBES_RELEASE_BASE_URL?.trim() ||
|
|
133
149
|
`${resolveRepositoryBaseUrl()}/releases/download/v${pkg.version}`;
|
|
@@ -144,9 +160,11 @@ async function installPlatformBinaries() {
|
|
|
144
160
|
await downloadFile(`${releaseBaseUrl}/${artifactName}`, tempDestination);
|
|
145
161
|
const actual = sha256(readFileSync(tempDestination));
|
|
146
162
|
const expected = checksums.get(artifactName);
|
|
147
|
-
|
|
163
|
+
try {
|
|
164
|
+
verifyChecksum(artifactName, actual, expected);
|
|
165
|
+
} catch (error) {
|
|
148
166
|
rmSync(tempDestination, { force: true });
|
|
149
|
-
throw
|
|
167
|
+
throw error;
|
|
150
168
|
}
|
|
151
169
|
rmSync(destination, { force: true });
|
|
152
170
|
copyFileSync(tempDestination, destination);
|
|
@@ -217,4 +235,11 @@ async function main() {
|
|
|
217
235
|
deployBundledFiles();
|
|
218
236
|
}
|
|
219
237
|
|
|
220
|
-
|
|
238
|
+
// Guarded so this module can be imported by tests (to exercise
|
|
239
|
+
// verifyChecksum, parseChecksumFile, etc.) without triggering a real
|
|
240
|
+
// network install as a side effect of the import.
|
|
241
|
+
if (import.meta.main) {
|
|
242
|
+
await main();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export { verifyChecksum, parseChecksumFile, sha256, resolveArtifactNames, CHECKSUM_MANIFEST_NAME };
|
|
@@ -125,14 +125,14 @@ export async function handleBundleCommand(runtime: CliCommandRuntime): Promise<C
|
|
|
125
125
|
|
|
126
126
|
if (sub === 'inspect') {
|
|
127
127
|
const path = rest[0];
|
|
128
|
-
if (!path) return { output: 'Usage: goodvibes bundle inspect <path>', exitCode: 2 };
|
|
128
|
+
if (!path) return { output: 'Usage: goodvibes support-bundle inspect <path>', exitCode: 2 };
|
|
129
129
|
const sourcePath = shellPaths.resolveWorkspacePath(path);
|
|
130
130
|
const parsed = readJsonFile(sourcePath);
|
|
131
131
|
if (!parsed.ok) return { output: `Invalid bundle JSON: ${parsed.error}`, exitCode: 1 };
|
|
132
132
|
const summary = inspectBundle(sourcePath, parsed.value);
|
|
133
133
|
return {
|
|
134
134
|
output: formatJsonOrText(runtime, summary, [
|
|
135
|
-
'GoodVibes bundle',
|
|
135
|
+
'GoodVibes support bundle',
|
|
136
136
|
` type: ${summary.type}`,
|
|
137
137
|
` version: ${summary.version}`,
|
|
138
138
|
` path: ${summary.path}`,
|
|
@@ -192,14 +192,14 @@ export async function handleBundleCommand(runtime: CliCommandRuntime): Promise<C
|
|
|
192
192
|
path: targetPath,
|
|
193
193
|
redactedConfigPaths: redactedConfig.redactedPaths,
|
|
194
194
|
serviceIssues: service.issues,
|
|
195
|
-
}, `
|
|
195
|
+
}, `Support bundle exported: ${targetPath}\n redactedConfigKeys: ${redactedConfig.redactedPaths.length}\n serviceIssues: ${service.issues.length}`),
|
|
196
196
|
exitCode: 0,
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
if (sub === 'import') {
|
|
201
201
|
const path = rest[0];
|
|
202
|
-
if (!path) return { output: 'Usage: goodvibes bundle import <path>', exitCode: 2 };
|
|
202
|
+
if (!path) return { output: 'Usage: goodvibes support-bundle import <path>', exitCode: 2 };
|
|
203
203
|
const sourcePath = shellPaths.resolveWorkspacePath(path);
|
|
204
204
|
const parsed = readJsonFile(sourcePath);
|
|
205
205
|
if (!parsed.ok) return { output: `Invalid bundle JSON: ${parsed.error}`, exitCode: 1 };
|
|
@@ -223,5 +223,5 @@ export async function handleBundleCommand(runtime: CliCommandRuntime): Promise<C
|
|
|
223
223
|
};
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
return { output: 'Usage: goodvibes bundle export [path]|inspect <path>|import <path>', exitCode: 2 };
|
|
226
|
+
return { output: 'Usage: goodvibes support-bundle export [path]|inspect <path>|import <path>', exitCode: 2 };
|
|
227
227
|
}
|
package/src/cli/completion.ts
CHANGED
|
@@ -263,9 +263,9 @@ export const COMPLETION_COMMANDS: readonly CompletionCommand[] = [
|
|
|
263
263
|
subcommands: ['status'],
|
|
264
264
|
},
|
|
265
265
|
{
|
|
266
|
-
name: 'bundle',
|
|
267
|
-
aliases: ['bundle', 'bundles'],
|
|
268
|
-
description: 'Move
|
|
266
|
+
name: 'support-bundle',
|
|
267
|
+
aliases: ['support-bundle', 'bundle', 'bundles'],
|
|
268
|
+
description: 'Move a support snapshot (config + diagnostics + posture)',
|
|
269
269
|
subcommands: ['export', 'inspect', 'import'],
|
|
270
270
|
},
|
|
271
271
|
{
|
|
@@ -280,6 +280,18 @@ export const COMPLETION_COMMANDS: readonly CompletionCommand[] = [
|
|
|
280
280
|
description: 'Bridge CLI operations (alias: remote)',
|
|
281
281
|
subcommands: [],
|
|
282
282
|
},
|
|
283
|
+
{
|
|
284
|
+
name: 'hooks',
|
|
285
|
+
aliases: ['hooks', 'hook'],
|
|
286
|
+
description: 'Validate hooks.json against the hook loader schema',
|
|
287
|
+
subcommands: ['validate'],
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'plugin',
|
|
291
|
+
aliases: ['plugin', 'plugins'],
|
|
292
|
+
description: 'Scaffold or validate a plugin directory',
|
|
293
|
+
subcommands: ['init', 'validate'],
|
|
294
|
+
},
|
|
283
295
|
{
|
|
284
296
|
name: 'completion',
|
|
285
297
|
aliases: ['completion', 'completions'],
|