@pellux/goodvibes-tui 1.13.1 → 1.15.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 (158) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +6 -6
  3. package/bin/goodvibes +6 -0
  4. package/bin/goodvibes-daemon +6 -0
  5. package/bin/launcher-support.js +34 -1
  6. package/docs/foundation-artifacts/operator-contract.json +8076 -2047
  7. package/package.json +15 -11
  8. package/scripts/postinstall.js +73 -48
  9. package/src/cli/bundle-command.ts +5 -5
  10. package/src/cli/completion.ts +1 -1
  11. package/src/cli/completions/generate.ts +15 -3
  12. package/src/cli/doctor.ts +385 -0
  13. package/src/cli/entrypoint.ts +72 -1
  14. package/src/cli/help.ts +29 -9
  15. package/src/cli/hooks-command.ts +74 -0
  16. package/src/cli/hooks-report.ts +167 -0
  17. package/src/cli/index.ts +3 -0
  18. package/src/cli/management.ts +13 -1
  19. package/src/cli/parser.ts +10 -2
  20. package/src/cli/plugin-bundles-command.ts +228 -0
  21. package/src/cli/plugin-command.ts +179 -0
  22. package/src/cli/service-posture.ts +10 -0
  23. package/src/cli/status.ts +275 -2
  24. package/src/cli/tui-startup.ts +119 -1
  25. package/src/cli/types.ts +3 -1
  26. package/src/config/index.ts +16 -0
  27. package/src/config/tui-extension-settings.ts +169 -0
  28. package/src/core/approval-alert.ts +15 -2
  29. package/src/core/compaction-receipt.ts +127 -0
  30. package/src/core/model-routing-chip.ts +82 -0
  31. package/src/core/permission-mode.ts +89 -0
  32. package/src/core/rewind-receipt.ts +83 -0
  33. package/src/core/rewind-turn-anchors.ts +160 -0
  34. package/src/core/scriptable-statusline.ts +141 -0
  35. package/src/core/session-auto-titler.ts +110 -0
  36. package/src/core/stream-event-wiring.ts +20 -0
  37. package/src/core/system-message-router.ts +1 -1
  38. package/src/core/terminal-notifier.ts +102 -0
  39. package/src/core/turn-event-wiring.ts +80 -1
  40. package/src/input/command-reference.ts +96 -0
  41. package/src/input/command-registry.ts +25 -0
  42. package/src/input/commands/channel-pairing.ts +245 -0
  43. package/src/input/commands/channel-runtime.ts +152 -6
  44. package/src/input/commands/checkin-runtime.ts +89 -0
  45. package/src/input/commands/checkpoint-runtime.ts +7 -179
  46. package/src/input/commands/ci-runtime.ts +207 -0
  47. package/src/input/commands/cost-attribution-format.ts +52 -0
  48. package/src/input/commands/cost-runtime.ts +44 -4
  49. package/src/input/commands/editor-runtime.ts +22 -0
  50. package/src/input/commands/flags-runtime.ts +328 -0
  51. package/src/input/commands/health-metrics-format.ts +67 -0
  52. package/src/input/commands/health-runtime.ts +55 -1
  53. package/src/input/commands/memory.ts +23 -0
  54. package/src/input/commands/operator-rpc.ts +95 -0
  55. package/src/input/commands/palette-runtime.ts +22 -0
  56. package/src/input/commands/permissions-provenance.ts +264 -0
  57. package/src/input/commands/permissions-runtime.ts +21 -0
  58. package/src/input/commands/planning-runtime.ts +28 -1
  59. package/src/input/commands/platform-access-runtime.ts +2 -97
  60. package/src/input/commands/principals-runtime.ts +212 -0
  61. package/src/input/commands/product-runtime.ts +43 -3
  62. package/src/input/commands/recall-files-config.ts +54 -0
  63. package/src/input/commands/recall-files-git.ts +57 -0
  64. package/src/input/commands/recall-files.ts +185 -0
  65. package/src/input/commands/recall-query.ts +8 -3
  66. package/src/input/commands/recall-review.ts +2 -2
  67. package/src/input/commands/recall-shared.ts +13 -0
  68. package/src/input/commands/relay-runtime.ts +86 -0
  69. package/src/input/commands/review-runtime.ts +160 -0
  70. package/src/input/commands/rewind-runtime.ts +362 -0
  71. package/src/input/commands/schedule-nl.ts +147 -0
  72. package/src/input/commands/schedule-runtime.ts +29 -10
  73. package/src/input/commands/secret-runtime.ts +55 -0
  74. package/src/input/commands/session-content.ts +19 -8
  75. package/src/input/commands/session-workflow.ts +10 -0
  76. package/src/input/commands/update-runtime.ts +412 -0
  77. package/src/input/commands/workstream-attempt-dependents.ts +103 -0
  78. package/src/input/commands/workstream-attempts.ts +244 -0
  79. package/src/input/commands/workstream-runtime.ts +164 -26
  80. package/src/input/commands/worktree-runtime.ts +56 -2
  81. package/src/input/commands.ts +135 -80
  82. package/src/input/composer-capture.ts +67 -0
  83. package/src/input/composer-editor.ts +134 -0
  84. package/src/input/concealed-input.ts +94 -0
  85. package/src/input/exec-env-scrub-config.ts +84 -0
  86. package/src/input/feature-unit-layout.ts +142 -0
  87. package/src/input/feed-context-factory.ts +2 -0
  88. package/src/input/handler-feed-routes.ts +17 -0
  89. package/src/input/handler-feed.ts +3 -0
  90. package/src/input/handler-modal-routes.ts +5 -2
  91. package/src/input/handler-shortcuts.ts +37 -0
  92. package/src/input/handler.ts +24 -2
  93. package/src/input/keybindings.ts +11 -2
  94. package/src/input/onboarding/onboarding-feature-units.ts +536 -0
  95. package/src/input/onboarding/onboarding-wizard-apply.ts +40 -6
  96. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +324 -629
  97. package/src/input/onboarding/onboarding-wizard-steps.ts +5 -5
  98. package/src/input/onboarding/onboarding-wizard-types.ts +6 -0
  99. package/src/input/relay-settings-descriptions.ts +35 -0
  100. package/src/input/sandbox-exec-config.ts +107 -0
  101. package/src/input/settings-modal-adjustment.ts +4 -7
  102. package/src/input/settings-modal-data.ts +178 -8
  103. package/src/input/settings-modal-mutations.ts +41 -13
  104. package/src/input/settings-modal-types.ts +42 -5
  105. package/src/input/settings-modal.ts +67 -15
  106. package/src/input/submission-router.ts +4 -1
  107. package/src/input/worktree-setup-config.ts +93 -0
  108. package/src/main.ts +43 -43
  109. package/src/panels/builtin/development.ts +14 -0
  110. package/src/panels/diff-review-model.ts +189 -0
  111. package/src/panels/diff-review-panel.ts +395 -0
  112. package/src/panels/fleet-panel-format.ts +114 -2
  113. package/src/panels/fleet-panel.ts +65 -78
  114. package/src/panels/fleet-read-model.ts +91 -11
  115. package/src/panels/fleet-stop.ts +19 -4
  116. package/src/panels/modals/memory-modal.ts +11 -2
  117. package/src/permissions/hunk-selection.ts +86 -5
  118. package/src/permissions/prompt.ts +108 -7
  119. package/src/permissions/sandbox-exec-gate.ts +162 -0
  120. package/src/renderer/settings-modal-helpers.ts +21 -1
  121. package/src/renderer/settings-modal.ts +70 -44
  122. package/src/renderer/shell-surface.ts +23 -1
  123. package/src/renderer/system-message.ts +4 -0
  124. package/src/renderer/tool-result-summary.ts +95 -5
  125. package/src/renderer/ui-factory.ts +22 -0
  126. package/src/runtime/bootstrap-command-context.ts +15 -1
  127. package/src/runtime/bootstrap-command-parts.ts +14 -2
  128. package/src/runtime/bootstrap-core.ts +38 -38
  129. package/src/runtime/bootstrap-notifier-sync.ts +41 -0
  130. package/src/runtime/bootstrap-shell.ts +8 -0
  131. package/src/runtime/bootstrap.ts +21 -23
  132. package/src/runtime/context-accounting-source.ts +103 -0
  133. package/src/runtime/conversation-rewind-port.ts +130 -0
  134. package/src/runtime/fleet-needs-input-push.ts +70 -0
  135. package/src/runtime/install-self-check-startup.ts +36 -0
  136. package/src/runtime/install-self-check.ts +149 -0
  137. package/src/runtime/onboarding/fast-path.ts +93 -0
  138. package/src/runtime/process-lifecycle.ts +32 -24
  139. package/src/runtime/relay-reachability-bridge.ts +53 -0
  140. package/src/runtime/release-artifacts.ts +109 -0
  141. package/src/runtime/services.ts +33 -33
  142. package/src/runtime/trust/workspace-registration.ts +184 -0
  143. package/src/runtime/trust/workspace-trust.ts +202 -0
  144. package/src/runtime/ui-services.ts +2 -1
  145. package/src/runtime/update-check.ts +113 -0
  146. package/src/runtime/workspace-checkpointing.ts +32 -0
  147. package/src/runtime/workstream-attempts-validation.ts +77 -0
  148. package/src/runtime/workstream-draft-edits.ts +95 -0
  149. package/src/runtime/workstream-draft-store.ts +101 -0
  150. package/src/runtime/workstream-draft-types.ts +42 -0
  151. package/src/runtime/workstream-services.ts +70 -39
  152. package/src/shell/blocking-input.ts +29 -0
  153. package/src/shell/ui-openers.ts +65 -0
  154. package/src/verification/verification-ledger.ts +56 -2
  155. package/src/version.ts +1 -1
  156. package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +0 -130
  157. package/src/runtime/gateway-verbs.ts +0 -47
  158. 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.13.1",
3
+ "version": "1.15.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.6.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
- "trustedDependencies": [
128
- "@pellux/goodvibes-sdk",
129
- "core-js",
130
- "tree-sitter-css",
131
- "tree-sitter-javascript",
132
- "tree-sitter-json",
133
- "tree-sitter-python",
134
- "tree-sitter-typescript"
135
- ],
133
+ "optionalDependencies": {
134
+ "@pellux/goodvibes-tui-linux-x64": "1.15.0",
135
+ "@pellux/goodvibes-tui-linux-arm64": "1.15.0",
136
+ "@pellux/goodvibes-tui-darwin-x64": "1.15.0",
137
+ "@pellux/goodvibes-tui-darwin-arm64": "1.15.0"
138
+ },
139
+ "trustedDependencies": [],
136
140
  "overrides": {
137
141
  "minimatch": "^10.2.5"
138
142
  }
@@ -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 { createHash } from 'node:crypto';
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
- if (expected && expected !== actual) {
163
+ try {
164
+ verifyChecksum(artifactName, actual, expected);
165
+ } catch (error) {
148
166
  rmSync(tempDestination, { force: true });
149
- throw new Error(`checksum mismatch for ${artifactName}: expected ${expected}, got ${actual}`);
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
- await main();
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
- }, `Bundle exported: ${targetPath}\n redactedConfigKeys: ${redactedConfig.redactedPaths.length}\n serviceIssues: ${service.issues.length}`),
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
  }
@@ -21,7 +21,7 @@ const COMMANDS = [
21
21
  'surfaces',
22
22
  'listener',
23
23
  'control-plane',
24
- 'bundle',
24
+ 'support-bundle',
25
25
  'remote',
26
26
  'bridge',
27
27
  'completion',
@@ -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 setup/profile/trust/support bundles',
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'],