@f5-sales-demo/xcsh 22.4.3 → 22.4.6

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 (34) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/package.json +8 -8
  3. package/src/cli/linux-standalone-update.ts +118 -0
  4. package/src/cli/plugin-cli.ts +21 -14
  5. package/src/cli/update-cli.ts +11 -0
  6. package/src/cli.ts +4 -1
  7. package/src/extensibility/extensions/loader.ts +9 -1
  8. package/src/extensibility/extensions/types.ts +2 -0
  9. package/src/extensibility/plugins/marketplace/builtin-marketplace-snapshot.ts +1 -1
  10. package/src/extensibility/plugins/marketplace/builtin-marketplace.provenance.json +3 -3
  11. package/src/extensibility/plugins/marketplace/fetcher.ts +6 -0
  12. package/src/extensibility/plugins/marketplace/manager.ts +3 -0
  13. package/src/extensibility/plugins/marketplace/runtime.ts +10 -0
  14. package/src/extensibility/plugins/marketplace/types.ts +1 -0
  15. package/src/host/archive.ts +182 -0
  16. package/src/host/host.ts +78 -0
  17. package/src/host/management.ts +63 -0
  18. package/src/host/software.ts +370 -0
  19. package/src/index.ts +3 -0
  20. package/src/integrations/registry.ts +37 -5
  21. package/src/integrations/setup.ts +19 -3
  22. package/src/integrations/types.ts +17 -1
  23. package/src/internal-urls/api-catalog-qmd-index.generated.ts +2 -2
  24. package/src/internal-urls/build-info.generated.ts +8 -8
  25. package/src/internal-urls/docs-index.generated.ts +1 -1
  26. package/src/modes/components/btw-panel.ts +8 -6
  27. package/src/modes/components/plan-preview.ts +2 -6
  28. package/src/modes/components/question-transcript.ts +7 -19
  29. package/src/modes/components/searchable-select-list.ts +20 -6
  30. package/src/modes/components/selector-frame.ts +72 -4
  31. package/src/modes/components/transcript-notice.ts +8 -16
  32. package/src/modes/controllers/selector-controller.ts +10 -2
  33. package/src/person-profile/machine-collectors.ts +4 -86
  34. package/src/slash-commands/builtin-registry.ts +6 -2
package/CHANGELOG.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  ### Added
8
8
 
9
+ - Added shared host-aware software setup with live management probes, reviewed package-manager routes, checksum-verified per-user archives, and asynchronous CLI/TUI setup preparation ([#4598](https://github.com/f5-sales-demo/xcsh/issues/4598)).
10
+
9
11
  - Refreshed generated internal LiteLLM configuration with seven current GPT-6/Claude models,
10
12
  route-accurate Responses and native Messages transports, hidden legacy session resolution, and an
11
13
  independent maximum-context setting ([#4279](https://github.com/f5-sales-demo/xcsh/issues/4279)).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/xcsh",
4
- "version": "22.4.3",
4
+ "version": "22.4.6",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://github.com/f5-sales-demo/xcsh",
7
7
  "author": "Can Boluk",
@@ -67,13 +67,13 @@
67
67
  },
68
68
  "dependencies": {
69
69
  "@agentclientprotocol/sdk": "1.4.0",
70
- "@f5-sales-demo/pi-agent-core": "22.4.3",
71
- "@f5-sales-demo/pi-ai": "22.4.3",
72
- "@f5-sales-demo/pi-natives": "22.4.3",
73
- "@f5-sales-demo/pi-resource-management": "22.4.3",
74
- "@f5-sales-demo/pi-tui": "22.4.3",
75
- "@f5-sales-demo/pi-utils": "22.4.3",
76
- "@f5-sales-demo/xcsh-stats": "22.4.3",
70
+ "@f5-sales-demo/pi-agent-core": "22.4.6",
71
+ "@f5-sales-demo/pi-ai": "22.4.6",
72
+ "@f5-sales-demo/pi-natives": "22.4.6",
73
+ "@f5-sales-demo/pi-resource-management": "22.4.6",
74
+ "@f5-sales-demo/pi-tui": "22.4.6",
75
+ "@f5-sales-demo/pi-utils": "22.4.6",
76
+ "@f5-sales-demo/xcsh-stats": "22.4.6",
77
77
  "@mozilla/readability": "^0.6",
78
78
  "@resvg/resvg-wasm": "2.6.2",
79
79
  "@sinclair/typebox": "0.34.52",
@@ -0,0 +1,118 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+
4
+ const REPO = "f5-sales-demo/xcsh";
5
+ const MAX_INSTALLER_BYTES = 256 * 1024;
6
+
7
+ export interface LinuxInstallerInput {
8
+ script: Buffer;
9
+ installDir: string;
10
+ version: string;
11
+ }
12
+
13
+ export interface LinuxStandaloneUpdateOptions {
14
+ targetPath: string;
15
+ arch?: string;
16
+ fetchImpl?(input: string | URL | Request, init?: RequestInit): Promise<Response>;
17
+ runInstaller?(input: LinuxInstallerInput): Promise<void>;
18
+ }
19
+
20
+ async function runInstaller(input: LinuxInstallerInput): Promise<void> {
21
+ const child = Bun.spawn(["/bin/sh", "-s", "--", "--binary", "--ref", `v${input.version}`], {
22
+ stdin: "pipe",
23
+ stdout: "inherit",
24
+ stderr: "inherit",
25
+ env: { ...process.env, PI_INSTALL_DIR: input.installDir },
26
+ });
27
+ try {
28
+ child.stdin.write(input.script);
29
+ await child.stdin.end();
30
+ } catch (error) {
31
+ child.kill();
32
+ await child.exited;
33
+ throw error;
34
+ }
35
+ const exitCode = await child.exited;
36
+ if (exitCode !== 0) throw new Error(`Verified Linux installer exited with status ${exitCode}`);
37
+ }
38
+
39
+ /** Use the published installer's complete integrity transaction for every Linux replacement. */
40
+ export async function updateLinuxStandalone(version: string, options: LinuxStandaloneUpdateOptions): Promise<void> {
41
+ if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(version))
42
+ throw new Error("A stable published version is required for Linux standalone updates");
43
+ if (!path.posix.isAbsolute(options.targetPath) || path.posix.basename(options.targetPath) !== "xcsh")
44
+ throw new Error("Linux standalone target must be an absolute xcsh executable path");
45
+ const arch = options.arch ?? process.arch;
46
+ if (arch !== "x64" && arch !== "arm64") throw new Error("Unsupported Linux standalone update architecture");
47
+
48
+ const fetchImpl = options.fetchImpl ?? fetch;
49
+ const tag = `v${version}`;
50
+ const api = `https://api.github.com/repos/${REPO}`;
51
+ const releaseResponse = await fetchImpl(`${api}/releases/tags/${tag}`, {
52
+ signal: AbortSignal.timeout(30_000),
53
+ });
54
+ if (!releaseResponse.ok) throw new Error(`Cannot read immutable release metadata: ${releaseResponse.status}`);
55
+ const release = (await releaseResponse.json()) as {
56
+ tag_name?: unknown;
57
+ draft?: unknown;
58
+ prerelease?: unknown;
59
+ immutable?: unknown;
60
+ assets?: unknown;
61
+ } | null;
62
+ if (
63
+ release?.tag_name !== tag ||
64
+ release.draft !== false ||
65
+ release.prerelease !== false ||
66
+ release.immutable !== true
67
+ )
68
+ throw new Error("Linux self-update requires the exact published immutable release");
69
+ if (!Array.isArray(release.assets)) throw new Error("Linux release is missing integrity assets");
70
+ const binary = `xcsh-linux-${arch}`;
71
+ for (const name of [binary, `${binary}.sha256`, `${binary}.provenance.json`, `${binary}.provenance.json.sha256`]) {
72
+ const matches = release.assets.filter(asset => asset?.name === name);
73
+ if (
74
+ matches.length !== 1 ||
75
+ typeof matches[0].digest !== "string" ||
76
+ !/^sha256:[a-f0-9]{64}$/.test(matches[0].digest) ||
77
+ !Number.isInteger(matches[0].size) ||
78
+ matches[0].size <= 0
79
+ )
80
+ throw new Error("Linux release has incomplete or ambiguous integrity assets");
81
+ }
82
+
83
+ const sourceResponse = await fetchImpl(`${api}/contents/scripts/install.sh?ref=${tag}`, {
84
+ signal: AbortSignal.timeout(30_000),
85
+ });
86
+ if (!sourceResponse.ok) throw new Error(`Cannot read tagged installer source: ${sourceResponse.status}`);
87
+ const source = (await sourceResponse.json()) as {
88
+ type?: unknown;
89
+ path?: unknown;
90
+ encoding?: unknown;
91
+ size?: unknown;
92
+ sha?: unknown;
93
+ content?: unknown;
94
+ } | null;
95
+ if (
96
+ source?.type !== "file" ||
97
+ source.path !== "scripts/install.sh" ||
98
+ source.encoding !== "base64" ||
99
+ typeof source.size !== "number" ||
100
+ !Number.isInteger(source.size) ||
101
+ source.size <= 0 ||
102
+ source.size > MAX_INSTALLER_BYTES ||
103
+ typeof source.sha !== "string" ||
104
+ !/^[a-f0-9]{40}$/.test(source.sha) ||
105
+ typeof source.content !== "string"
106
+ )
107
+ throw new Error("Invalid tagged installer source metadata");
108
+ const script = Buffer.from(source.content, "base64");
109
+ const blobSha = createHash("sha1").update(`blob ${script.length}\0`).update(script).digest("hex");
110
+ if (script.length !== source.size || blobSha !== source.sha)
111
+ throw new Error("Tagged installer source does not match its Git blob identity");
112
+
113
+ await (options.runInstaller ?? runInstaller)({
114
+ script,
115
+ installDir: path.posix.dirname(options.targetPath),
116
+ version,
117
+ });
118
+ }
@@ -344,10 +344,10 @@ export async function reviewAndExecuteIntegrationSetup(
344
344
  handle: IntegrationHandle<unknown>,
345
345
  options: { force?: boolean } = {},
346
346
  ) {
347
- const plan = handle.setupPlan;
348
- if (!plan) throw new Error(`Integration ${handle.id} does not declare setup`);
347
+ if (!handle.setupPlan) throw new Error(`Integration ${handle.id} does not declare setup`);
349
348
  const current = await handle.get();
350
349
  if (shouldSkipIntegrationSetup(current.state, options.force)) return current;
350
+ const plan = handle.prepareSetup ? await handle.prepareSetup() : handle.setupPlan!;
351
351
  if (plan.guidedAction?.kind === "context_wizard")
352
352
  throw new Error(
353
353
  `Plugin ${handle.plugin ?? handle.id} setup requires interactive xcsh; run /plugin setup ${handle.plugin ?? handle.id} in the xcsh TUI.`,
@@ -373,18 +373,22 @@ async function handleIntegrationSetup(
373
373
  if (args.length !== 1) throw new Error(`Usage: ${APP_NAME} plugin setup <plugin> [--context <name>] [--force]`);
374
374
  if (!process.stdin.isTTY || !process.stdout.isTTY) throw new Error("Plugin setup requires an interactive terminal");
375
375
  const handles = await loadIntegrationHandles();
376
- await withPluginContext(flags.context, async () => {
377
- const handle = selectSetupIntegration(handles, args[0]);
378
- const current = await handle.get();
379
- if (shouldSkipIntegrationSetup(current.state, flags.force)) {
380
- process.stdout.write(`${handle.plugin ?? handle.id}: ready (setup is not required)\n`);
381
- return;
382
- }
383
- const result = await reviewAndExecuteIntegrationSetup(handle, { force: flags.force });
384
- process.stdout.write(
385
- `${handle.plugin ?? handle.id}: ${result.state}${result.reason ? ` (${result.reason})` : ""}\n`,
386
- );
387
- });
376
+ try {
377
+ await withPluginContext(flags.context, async () => {
378
+ const handle = selectSetupIntegration(handles, args[0]);
379
+ const current = await handle.get();
380
+ if (shouldSkipIntegrationSetup(current.state, flags.force)) {
381
+ process.stdout.write(`${handle.plugin ?? handle.id}: ready (setup is not required)\n`);
382
+ return;
383
+ }
384
+ const result = await reviewAndExecuteIntegrationSetup(handle, { force: flags.force });
385
+ process.stdout.write(
386
+ `${handle.plugin ?? handle.id}: ${result.state}${result.reason ? ` (${result.reason})` : ""}\n`,
387
+ );
388
+ });
389
+ } catch (error) {
390
+ throw new CliUsageError(error instanceof Error ? error.message : "Plugin setup failed");
391
+ }
388
392
  }
389
393
 
390
394
  async function reportMarketplaceInstallation(
@@ -411,6 +415,9 @@ async function reportMarketplaceInstallation(
411
415
  lifecycle: entry,
412
416
  trigger: "direct-install",
413
417
  handles,
418
+ review: async handle => {
419
+ process.stdout.write(`${describeSetupPlan(handle)}\n`);
420
+ },
414
421
  });
415
422
  if (installSetup) await personProfileService.reconcileFromCollectors(undefined, 0);
416
423
  const statuses = await Promise.all(
@@ -5,6 +5,7 @@ import path from "node:path";
5
5
  import { pipeline } from "node:stream/promises";
6
6
  import { APP_NAME, isEnoent, VERSION } from "@f5-sales-demo/pi-utils";
7
7
  import chalk from "chalk";
8
+ import { type LinuxInstallerInput, updateLinuxStandalone } from "./linux-standalone-update";
8
9
  import {
9
10
  createInstallReceipt,
10
11
  defaultInstallChannelDependencies,
@@ -76,6 +77,7 @@ export interface StandaloneReplacementOptions {
76
77
  writeFile?(file: string, contents: string): Promise<void>;
77
78
  unlink?(file: string): Promise<void>;
78
79
  validate?(executable: string, expectedVersion: string): Promise<void>;
80
+ runLinuxInstaller?(input: LinuxInstallerInput): Promise<void>;
79
81
  }
80
82
 
81
83
  async function ignoreMissing(unlink: (file: string) => Promise<void>, file: string): Promise<void> {
@@ -94,6 +96,15 @@ export async function replaceStandaloneExecutable(
94
96
  const targetPath = options.targetPath;
95
97
  const platform = options.platform ?? process.platform;
96
98
  const arch = options.arch ?? process.arch;
99
+ if (platform === "linux") {
100
+ if (arch !== "x64" && arch !== "arm64") throw new Error("Unsupported Linux standalone update architecture");
101
+ return updateLinuxStandalone(expectedVersion, {
102
+ targetPath,
103
+ arch,
104
+ fetchImpl: options.fetchImpl,
105
+ runInstaller: options.runLinuxInstaller,
106
+ });
107
+ }
97
108
  const binaryName = getBinaryName(platform, arch);
98
109
  const url = `https://github.com/${REPO}/releases/download/v${expectedVersion}/${binaryName}`;
99
110
  const tempPath = `${targetPath}.new-${process.pid}`;
package/src/cli.ts CHANGED
@@ -5,11 +5,14 @@ import { APP_NAME, initI18n, MIN_BUN_VERSION, registerLocales, t, VERSION } from
5
5
  * lightweight CLI runner from pi-utils.
6
6
  */
7
7
  import { CliUsageError, type CommandEntry, run } from "@f5-sales-demo/pi-utils/cli";
8
+ import { installCliOutputHandlers, writeCliOutput } from "@f5-sales-demo/pi-utils/cli-output";
8
9
  import { validateInlineFlagSyntax } from "./cli/flag-spec";
9
10
  import { findPrefixedCommand, launchFlagScopeMessage } from "./cli/root-command-routing";
10
11
  import { sandboxArgs, sandboxFlags, validateSandboxInvocation } from "./cli/sandbox-spec";
11
12
  import { locales } from "./locales/index";
12
13
 
14
+ installCliOutputHandlers();
15
+
13
16
  registerLocales(locales);
14
17
  initI18n();
15
18
 
@@ -97,7 +100,7 @@ async function showHelp(config: import("@f5-sales-demo/pi-utils/cli").CliConfig)
97
100
  renderRootHelp(config);
98
101
  const extra = getExtraHelpText();
99
102
  if (extra.trim().length > 0) {
100
- process.stdout.write(`\n${extra}\n`);
103
+ writeCliOutput(process.stdout, `\n${extra}\n`);
101
104
  }
102
105
  }
103
106
 
@@ -21,12 +21,15 @@ import {
21
21
  } from "../../discovery/helpers";
22
22
  import type { ExecOptions } from "../../exec/exec";
23
23
  import { execCommand } from "../../exec/exec";
24
+ import { host } from "../../host/host";
25
+ import { software } from "../../host/software";
24
26
  import { integrationRegistry } from "../../integrations/registry";
25
27
  import type { IntegrationDefinition, IntegrationHandle } from "../../integrations/types";
26
28
  import { personProfileService } from "../../person-profile/service";
27
29
  import type { CustomMessage } from "../../session/messages";
28
30
  import { EventBus } from "../../utils/event-bus";
29
31
  import { getAllPluginExtensionPaths } from "../plugins/loader";
32
+ import { assertRuntimeRequirement } from "../plugins/marketplace/runtime";
30
33
  import { resolvePath } from "../utils";
31
34
  import herdrReporter from "./bundled/herdr-reporter";
32
35
  import herdrTerminal from "./bundled/herdr-terminal";
@@ -130,6 +133,8 @@ class ConcreteExtensionAPI implements ExtensionAPI, IExtensionRuntime {
130
133
  config: import("./types").ProviderConfig;
131
134
  sourceId: string;
132
135
  }> = [];
136
+ readonly host = host;
137
+ readonly software = software;
133
138
  readonly personProfile: ExtensionAPI["personProfile"];
134
139
  readonly integrations: ExtensionAPI["integrations"];
135
140
  readonly advisories: ExtensionAPI["advisories"];
@@ -301,7 +306,7 @@ class ConcreteExtensionAPI implements ExtensionAPI, IExtensionRuntime {
301
306
  }
302
307
 
303
308
  exec(command: string, args: string[], options?: ExecOptions) {
304
- return execCommand(command, args, options?.cwd ?? this.cwd, options);
309
+ return execCommand(host.findExecutable(command) ?? command, args, options?.cwd ?? this.cwd, options);
305
310
  }
306
311
 
307
312
  getActiveTools(): string[] {
@@ -692,6 +697,9 @@ export async function discoverAndLoadExtensions(
692
697
  // A marketplace plugin may use package metadata only.
693
698
  }
694
699
 
700
+ const minimumRuntimeVersion = (canonical as { minimumRuntimeVersion?: string } | undefined)
701
+ ?.minimumRuntimeVersion;
702
+ if (minimumRuntimeVersion) assertRuntimeRequirement({ name: root.plugin, minimumRuntimeVersion });
695
703
  // The canonical manifest owns an explicitly declared extension list. Older marketplace
696
704
  // plugins keep lifecycle metadata in that manifest and their extension declaration in
697
705
  // package.json, so use the established package contract only when it is omitted.
@@ -1040,6 +1040,8 @@ export interface ExtensionAPI {
1040
1040
  pi: typeof piCodingAgent;
1041
1041
 
1042
1042
  /** Canonical, provenance-aware person profile integration. */
1043
+ readonly host: typeof import("../../host/host").host;
1044
+ readonly software: typeof import("../../host/software").software;
1043
1045
  readonly personProfile: {
1044
1046
  get(): Promise<import("../../person-profile/schema").PersonProfile>;
1045
1047
  registerCollector(collector: import("../../person-profile/service").ExtensionProfileCollector): void;
@@ -1,4 +1,4 @@
1
1
  const builtinMarketplaceSnapshot =
2
- '{\n "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",\n "name": "f5-sales-demo-marketplace",\n "version": "1.0.0",\n "metadata": {\n "description": "Claude Code plugins for f5-sales-demo documentation repositories"\n },\n "owner": {\n "name": "f5-sales-demo",\n "url": "https://github.com/f5-sales-demo"\n },\n "plugins": [\n {\n "name": "docs-tools",\n "description": "MDX content validation and review tools for f5-sales-demo docs repos",\n "version": "1.1.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-tools",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-tools",\n "category": "productivity",\n "keywords": ["mdx", "documentation", "validation", "starlight", "astro"],\n "tags": ["docs", "linting", "content-review", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "sales-engineer",\n "description": "Sales Engineer persona framework for F5 XC demo repositories — demo execution, environment operations, presentation, Q&A, post-session debrief",\n "version": "1.0.12",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/sales-engineer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/sales-engineer",\n "category": "productivity",\n "keywords": ["sales-engineer", "demo", "persona", "presentation", "f5xc"],\n "tags": ["demo", "sales", "persona", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Sales engineering content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "docs-pipeline",\n "description": "Documentation pipeline architecture — config ownership, release dispatch chain, content authoring, managed files, local preview",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-pipeline",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-pipeline",\n "category": "productivity",\n "keywords": ["docs", "pipeline", "astro", "starlight", "content", "authoring"],\n "tags": ["docs", "pipeline", "content", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation pipeline content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "brand",\n "description": "F5 corporate branding enforcement — colors, typography, logos, icons, accessibility, and visual identity standards across all content types",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/brand",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/brand",\n "category": "productivity",\n "keywords": ["brand", "design-system", "colors", "typography", "accessibility"],\n "tags": ["brand", "design", "visual-identity", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Brand guidance content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "meddpicc",\n "description": "MEDDPICC sales qualification and deal-execution framework — evidence-based deal management, stakeholder mapping, mutual action plans, and forecast integrity for complex enterprise B2B sales",\n "version": "7.5.9",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/meddpicc",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/meddpicc",\n "category": "productivity",\n "keywords": [\n "meddpicc",\n "sales-qualification",\n "deal-management",\n "enterprise-sales",\n "forecast",\n "champion",\n "economic-buyer",\n "mutual-action-plan",\n "f5xc"\n ],\n "tags": ["sales", "qualification", "deal-management", "forecast", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["MEDDPICC content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "devcontainer",\n "description": "Container awareness — tool catalog, self-identity, self-diagnosis, and maintenance for the f5-sales-demo devcontainer",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/devcontainer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/devcontainer",\n "category": "productivity",\n "keywords": ["devcontainer", "tools", "catalog", "cli", "inventory", "container"],\n "tags": ["devcontainer", "tools", "catalog", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["devcontainer"],\n "requirements": ["A supported development container runtime"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "platform",\n "description": "Provider-neutral F5 Distributed Cloud Secure Mesh Site v2 capabilities, configuration, bootstrap, and status tools",\n "version": "6.0.1",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/platform",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/platform",\n "category": "productivity",\n "keywords": [\n "console",\n "browser",\n "automation",\n "azure-sso",\n "mcp",\n "chrome-devtools",\n "f5xc",\n "api",\n "rest",\n "platform",\n "openapi",\n "crud",\n "spec-aware"\n ],\n "tags": ["console", "browser", "automation", "f5xc", "api", "platform", "openapi"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["platform"],\n "requirements": ["F5 Distributed Cloud API URL and token environment variables"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "osint-framework",\n "description": "OSINT Framework tool catalog and investigation skills — 1,064 free intelligence-gathering tools across 34 categories, mapped from osintframework.com. Category-based skills, executable investigation pipelines, CLI tool execution, and OPSEC-aware workflows.",\n "version": "1.0.8",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/osint-framework",\n "keywords": ["osint", "reconnaissance", "intelligence", "investigation", "security"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/osint-framework",\n "category": "security",\n "tags": ["osint", "recon", "security", "intelligence"],\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["OSINT framework content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "firecrawl",\n "description": "Local self-hosted firecrawl web scraping — scrape, crawl, and map websites via the local firecrawl API on port 3002. No API keys, no subscriptions, fully open-source.",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/firecrawl",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/firecrawl",\n "category": "productivity",\n "keywords": ["firecrawl", "scrape", "crawl", "web-scraping", "markdown", "self-hosted", "local", "open-source"],\n "tags": ["firecrawl", "scraping", "web", "local"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["firecrawl"],\n "requirements": ["A reachable local Firecrawl service"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "salesforce",\n "description": "Salesforce pipeline intelligence with shared lifecycle setup, account discovery, context, and reporting tools",\n "version": "1.5.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/salesforce",\n "keywords": [\n "salesforce",\n "sf",\n "apex",\n "lwc",\n "soql",\n "metadata",\n "deploy",\n "testing",\n "sfdx",\n "agentforce",\n "pipeline",\n "xcsh"\n ],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/salesforce",\n "category": "development",\n "tags": ["salesforce", "development", "cli", "crm", "xcsh-extension"],\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["salesforce"],\n "requirements": ["Salesforce CLI", "An authenticated default Salesforce org"],\n "setupRequired": true,\n "collectedData": ["accounts", "identifiers", "business_profile"],\n "pluginDependencies": []\n }\n },\n {\n "name": "cloudstatus",\n "description": "Live cloud status and Internet network intelligence for xcsh — current incidents, routing, registration, RPKI, peering, facilities, F5 Regional Edge evidence, and bounded path diagnostics",\n "version": "1.7.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/cloudstatus",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/cloudstatus",\n "category": "productivity",\n "keywords": [\n "status",\n "monitoring",\n "incidents",\n "maintenance",\n "statuspage",\n "operational-intelligence",\n "network-intelligence",\n "bgp",\n "rdap",\n "rpki",\n "routing",\n "location",\n "peeringdb",\n "facilities",\n "f5xc",\n "atlassian"\n ],\n "tags": ["status", "network-intelligence", "routing", "peering", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "on_demand",\n "integrations": ["cloudstatus"],\n "requirements": ["Network access when a cloud-status command is invoked"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "azure",\n "description": "Azure CLI integration and deterministic F5 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "4.4.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/azure",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/azure",\n "category": "development",\n "keywords": ["azure", "az", "cloud", "f5xc", "customer-edge", "secure-mesh-site"],\n "tags": ["azure", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["azure"],\n "requirements": ["Azure CLI", "An authenticated Azure account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "aws",\n "description": "AWS CLI integration and deterministic F5 Secure Mesh Site v2 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "2.1.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/aws",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/aws",\n "category": "development",\n "keywords": ["aws", "amazon", "cloud", "f5xc", "customer-edge", "secure-mesh-site", "tgw", "nlb"],\n "tags": ["aws", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["aws"],\n "requirements": ["AWS CLI", "AWS credentials or an authenticated SSO profile"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "kvm",\n "description": "Dual-NIC KVM Secure Mesh Site v2 with isolated SLO, home-LAN SLI, inside VIP, and rollback-protected host preparation",\n "version": "3.0.4",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/kvm",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/kvm",\n "category": "development",\n "keywords": ["kvm", "libvirt", "qemu", "f5xc", "customer-edge", "secure-mesh-site", "home-lan", "terraform"],\n "tags": ["kvm", "libvirt", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["kvm"],\n "requirements": [\n "Terraform CLI",\n "libvirt and qemu system access",\n "curl",\n "F5 Distributed Cloud Platform integration"\n ],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "gcloud",\n "description": "Google Cloud CLI integration — container-adapted auth, context injection, CLI operator agent, token expiry detection, and welcome screen status",\n "version": "1.3.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/gcloud",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/gcloud",\n "category": "development",\n "keywords": ["gcloud", "google", "cloud"],\n "tags": ["gcloud", "google", "cloud", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["gcloud"],\n "requirements": ["Google Cloud CLI", "An authenticated Google Cloud account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": []\n }\n },\n {\n "name": "gitlab",\n "description": "GitLab CLI integration with shared lifecycle readiness, profile discovery, and issue management tools",\n "version": "1.3.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "keywords": ["gitlab", "glab", "issues", "git"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/gitlab",\n "category": "development",\n "tags": ["gitlab", "development", "cli", "xcsh-extension"],\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/gitlab",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["gitlab"],\n "requirements": ["GitLab CLI", "An authenticated GitLab account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": []\n }\n },\n {\n "name": "github",\n "description": "GitHub and Git operations with typed lifecycle stages, normalized evidence, and advisory governance",\n "version": "3.1.1",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/github",\n "keywords": ["github", "gh", "git", "pr", "issues", "ci", "workflow", "git-sops", "github-ops"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/github",\n "category": "development",\n "tags": ["github", "development", "cli", "workflow", "xcsh-extension"],\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["github", "github_email"],\n "requirements": ["GitHub CLI", "An authenticated GitHub account"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": ["accounts", "email", "identifiers", "sameAs"],\n "pluginDependencies": []\n }\n },\n {\n "name": "herdr",\n "description": "Install and operate the stable F5 Herdr fork with verified native xcsh health, explicit pairing, and complete pane-control guidance.",\n "version": "1.1.5",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/herdr",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Herdr",\n "version": "1.1.5"\n },\n "source": "./plugins/herdr",\n "category": "development",\n "keywords": ["herdr", "terminal", "multiplexer", "panes", "agents"],\n "tags": ["terminal", "orchestration", "agents", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["herdr"],\n "requirements": [\n "Supported 64-bit Linux, macOS, or Windows host",\n "HTTPS access to the f5-sales-demo/herdr stable manifest and release"\n ],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "asm-migration",\n "description": "Deterministic BIG-IP ASM conversion and guarded F5 Distributed Cloud deployment",\n "version": "2.1.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/asm-migration",\n "keywords": ["asm", "waf", "migration", "f5xc", "xcsh-extension"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/asm-migration",\n "category": "security",\n "tags": ["asm", "waf", "security", "migration", "f5xc"],\n "recommended": false,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["asm_migration"],\n "requirements": ["ASM migration runtime dependencies", "F5 Distributed Cloud Platform integration"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "terraform",\n "description": "Senior DevOps Infrastructure-as-Code plugin providing HashiCorp Registry proactive version checks, HCL authoring, testing frameworks, and troubleshooting playbooks.",\n "version": "2.1.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/terraform",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/terraform",\n "category": "development",\n "keywords": ["terraform", "hcl", "iac", "devops", "hashicorp", "testing", "troubleshooting"],\n "tags": ["terraform", "iac", "devops", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["terraform"],\n "requirements": ["Terraform CLI"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "xorg",\n "version": "1.1.9",\n "description": "Ubuntu 24.04 Xorg desktop automation substrate",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Xorg",\n "version": "1.1.9"\n },\n "source": "./plugins/xorg",\n "category": "development",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/xorg",\n "keywords": ["xorg", "at-spi", "xtest", "pipewire"],\n "tags": ["linux", "desktop", "automation"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["xorg"],\n "requirements": ["Ubuntu 24.04 with passwordless sudo"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "zoom",\n "version": "1.1.1",\n "description": "Verified Zoom Workplace control through public xorgctl JSON",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Zoom",\n "version": "1.1.1"\n },\n "source": "./plugins/zoom",\n "category": "productivity",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/zoom",\n "keywords": ["zoom", "meeting", "accessibility", "virtual-camera"],\n "tags": ["zoom", "meeting", "automation"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["zoom"],\n "requirements": ["Ubuntu 24.04 amd64", "Zoom Workplace 7.2.1.5760", "Xorg, Herdr, and Ghostty plugins"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["xorg", "herdr", "ghostty"]\n }\n },\n {\n "name": "ghostty",\n "version": "1.0.4",\n "description": "Curated Linux Ghostty setup for Xorg and Herdr terminal sessions",\n "license": "MIT",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Ghostty",\n "version": "1.0.4"\n },\n "source": "./plugins/ghostty",\n "category": "development",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/ghostty",\n "keywords": ["ghostty", "terminal", "xorg", "herdr"],\n "tags": ["linux", "terminal", "xorg"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["ghostty"],\n "requirements": ["Ubuntu Linux", "Xorg and Herdr marketplace plugins"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": ["xorg", "herdr"]\n }\n }\n ]\n}\n';
2
+ '{\n "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",\n "name": "f5-sales-demo-marketplace",\n "version": "1.0.0",\n "metadata": {\n "description": "Claude Code plugins for f5-sales-demo documentation repositories"\n },\n "owner": {\n "name": "f5-sales-demo",\n "url": "https://github.com/f5-sales-demo"\n },\n "plugins": [\n {\n "name": "docs-tools",\n "description": "MDX content validation and review tools for f5-sales-demo docs repos",\n "version": "1.1.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-tools",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-tools",\n "category": "productivity",\n "keywords": ["mdx", "documentation", "validation", "starlight", "astro"],\n "tags": ["docs", "linting", "content-review", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "sales-engineer",\n "description": "Sales Engineer persona framework for F5 XC demo repositories — demo execution, environment operations, presentation, Q&A, post-session debrief",\n "version": "1.0.12",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/sales-engineer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/sales-engineer",\n "category": "productivity",\n "keywords": ["sales-engineer", "demo", "persona", "presentation", "f5xc"],\n "tags": ["demo", "sales", "persona", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Sales engineering content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "docs-pipeline",\n "description": "Documentation pipeline architecture — config ownership, release dispatch chain, content authoring, managed files, local preview",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-pipeline",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-pipeline",\n "category": "productivity",\n "keywords": ["docs", "pipeline", "astro", "starlight", "content", "authoring"],\n "tags": ["docs", "pipeline", "content", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation pipeline content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "brand",\n "description": "F5 corporate branding enforcement — colors, typography, logos, icons, accessibility, and visual identity standards across all content types",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/brand",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/brand",\n "category": "productivity",\n "keywords": ["brand", "design-system", "colors", "typography", "accessibility"],\n "tags": ["brand", "design", "visual-identity", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Brand guidance content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "meddpicc",\n "description": "MEDDPICC sales qualification and deal-execution framework — evidence-based deal management, stakeholder mapping, mutual action plans, and forecast integrity for complex enterprise B2B sales",\n "version": "7.6.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/meddpicc",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/meddpicc",\n "category": "productivity",\n "keywords": [\n "meddpicc",\n "sales-qualification",\n "deal-management",\n "enterprise-sales",\n "forecast",\n "champion",\n "economic-buyer",\n "mutual-action-plan",\n "f5xc"\n ],\n "tags": ["sales", "qualification", "deal-management", "forecast", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["MEDDPICC content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "devcontainer",\n "description": "Container awareness — tool catalog, self-identity, self-diagnosis, and maintenance for the f5-sales-demo devcontainer",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/devcontainer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/devcontainer",\n "category": "productivity",\n "keywords": ["devcontainer", "tools", "catalog", "cli", "inventory", "container"],\n "tags": ["devcontainer", "tools", "catalog", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["devcontainer"],\n "requirements": ["A supported development container runtime"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "platform",\n "description": "Provider-neutral F5 Distributed Cloud Secure Mesh Site v2 capabilities, configuration, bootstrap, and status tools",\n "version": "6.0.1",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/platform",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/platform",\n "category": "productivity",\n "keywords": [\n "console",\n "browser",\n "automation",\n "azure-sso",\n "mcp",\n "chrome-devtools",\n "f5xc",\n "api",\n "rest",\n "platform",\n "openapi",\n "crud",\n "spec-aware"\n ],\n "tags": ["console", "browser", "automation", "f5xc", "api", "platform", "openapi"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["platform"],\n "requirements": ["F5 Distributed Cloud API URL and token environment variables"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "osint-framework",\n "description": "OSINT Framework tool catalog and investigation skills — 1,064 free intelligence-gathering tools across 34 categories, mapped from osintframework.com. Category-based skills, executable investigation pipelines, CLI tool execution, and OPSEC-aware workflows.",\n "version": "1.0.8",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/osint-framework",\n "keywords": ["osint", "reconnaissance", "intelligence", "investigation", "security"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/osint-framework",\n "category": "security",\n "tags": ["osint", "recon", "security", "intelligence"],\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["OSINT framework content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "firecrawl",\n "description": "Local self-hosted firecrawl web scraping — scrape, crawl, and map websites via the local firecrawl API on port 3002. No API keys, no subscriptions, fully open-source.",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/firecrawl",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/firecrawl",\n "category": "productivity",\n "keywords": ["firecrawl", "scrape", "crawl", "web-scraping", "markdown", "self-hosted", "local", "open-source"],\n "tags": ["firecrawl", "scraping", "web", "local"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["firecrawl"],\n "requirements": ["A reachable local Firecrawl service"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "salesforce",\n "description": "Salesforce pipeline intelligence with shared lifecycle setup, account discovery, context, and reporting tools",\n "version": "1.5.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/salesforce",\n "keywords": [\n "salesforce",\n "sf",\n "apex",\n "lwc",\n "soql",\n "metadata",\n "deploy",\n "testing",\n "sfdx",\n "agentforce",\n "pipeline",\n "xcsh"\n ],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/salesforce",\n "category": "development",\n "tags": ["salesforce", "development", "cli", "crm", "xcsh-extension"],\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["salesforce"],\n "requirements": ["Salesforce CLI", "An authenticated default Salesforce org"],\n "setupRequired": true,\n "collectedData": ["accounts", "identifiers", "business_profile"],\n "pluginDependencies": []\n }\n },\n {\n "name": "cloudstatus",\n "description": "Live cloud status and Internet network intelligence for xcsh — current incidents, routing, registration, RPKI, peering, facilities, F5 Regional Edge evidence, and bounded path diagnostics",\n "version": "1.7.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/cloudstatus",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/cloudstatus",\n "category": "productivity",\n "keywords": [\n "status",\n "monitoring",\n "incidents",\n "maintenance",\n "statuspage",\n "operational-intelligence",\n "network-intelligence",\n "bgp",\n "rdap",\n "rpki",\n "routing",\n "location",\n "peeringdb",\n "facilities",\n "f5xc",\n "atlassian"\n ],\n "tags": ["status", "network-intelligence", "routing", "peering", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "on_demand",\n "integrations": ["cloudstatus"],\n "requirements": ["Network access when a cloud-status command is invoked"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "azure",\n "description": "Azure CLI integration and deterministic F5 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "4.4.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/azure",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/azure",\n "category": "development",\n "keywords": ["azure", "az", "cloud", "f5xc", "customer-edge", "secure-mesh-site"],\n "tags": ["azure", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["azure"],\n "requirements": ["Azure CLI", "An authenticated Azure account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "aws",\n "description": "AWS CLI integration and deterministic F5 Secure Mesh Site v2 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "2.1.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/aws",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/aws",\n "category": "development",\n "keywords": ["aws", "amazon", "cloud", "f5xc", "customer-edge", "secure-mesh-site", "tgw", "nlb"],\n "tags": ["aws", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["aws"],\n "requirements": ["AWS CLI", "AWS credentials or an authenticated SSO profile"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "kvm",\n "description": "Dual-NIC KVM Secure Mesh Site v2 with isolated SLO, home-LAN SLI, inside VIP, and rollback-protected host preparation",\n "version": "3.0.4",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/kvm",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/kvm",\n "category": "development",\n "keywords": ["kvm", "libvirt", "qemu", "f5xc", "customer-edge", "secure-mesh-site", "home-lan", "terraform"],\n "tags": ["kvm", "libvirt", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["kvm"],\n "requirements": [\n "Terraform CLI",\n "libvirt and qemu system access",\n "curl",\n "F5 Distributed Cloud Platform integration"\n ],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "gcloud",\n "description": "Google Cloud CLI integration — container-adapted auth, context injection, CLI operator agent, token expiry detection, and welcome screen status",\n "version": "1.3.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/gcloud",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/gcloud",\n "category": "development",\n "keywords": ["gcloud", "google", "cloud"],\n "tags": ["gcloud", "google", "cloud", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["gcloud"],\n "requirements": ["Google Cloud CLI", "An authenticated Google Cloud account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": []\n }\n },\n {\n "name": "gitlab",\n "description": "GitLab CLI integration with shared lifecycle readiness, profile discovery, and issue management tools",\n "version": "1.3.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "keywords": ["gitlab", "glab", "issues", "git"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/gitlab",\n "category": "development",\n "tags": ["gitlab", "development", "cli", "xcsh-extension"],\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/gitlab",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["gitlab"],\n "requirements": ["GitLab CLI", "An authenticated GitLab account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": []\n }\n },\n {\n "name": "github",\n "description": "GitHub and Git operations with typed lifecycle stages, normalized evidence, and advisory governance",\n "version": "3.1.1",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/github",\n "keywords": ["github", "gh", "git", "pr", "issues", "ci", "workflow", "git-sops", "github-ops"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/github",\n "category": "development",\n "tags": ["github", "development", "cli", "workflow", "xcsh-extension"],\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["github", "github_email"],\n "requirements": ["GitHub CLI", "An authenticated GitHub account"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": ["accounts", "email", "identifiers", "sameAs"],\n "pluginDependencies": []\n }\n },\n {\n "name": "herdr",\n "description": "Install and operate the stable F5 Herdr fork with verified native xcsh health, explicit pairing, and complete pane-control guidance.",\n "version": "1.1.5",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/herdr",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Herdr",\n "version": "1.1.5"\n },\n "source": "./plugins/herdr",\n "category": "development",\n "keywords": ["herdr", "terminal", "multiplexer", "panes", "agents"],\n "tags": ["terminal", "orchestration", "agents", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["herdr"],\n "requirements": [\n "Supported 64-bit Linux, macOS, or Windows host",\n "HTTPS access to the f5-sales-demo/herdr stable manifest and release"\n ],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "asm-migration",\n "description": "Deterministic BIG-IP ASM conversion and guarded F5 Distributed Cloud deployment",\n "version": "2.1.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/asm-migration",\n "keywords": ["asm", "waf", "migration", "f5xc", "xcsh-extension"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/asm-migration",\n "category": "security",\n "tags": ["asm", "waf", "security", "migration", "f5xc"],\n "recommended": false,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["asm_migration"],\n "requirements": ["ASM migration runtime dependencies", "F5 Distributed Cloud Platform integration"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "terraform",\n "description": "Senior DevOps Infrastructure-as-Code plugin providing HashiCorp Registry proactive version checks, HCL authoring, testing frameworks, and troubleshooting playbooks.",\n "version": "2.1.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/terraform",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/terraform",\n "category": "development",\n "keywords": ["terraform", "hcl", "iac", "devops", "hashicorp", "testing", "troubleshooting"],\n "tags": ["terraform", "iac", "devops", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["terraform"],\n "requirements": ["Terraform CLI"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "xorg",\n "version": "1.1.9",\n "description": "Ubuntu 24.04 Xorg desktop automation substrate",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Xorg",\n "version": "1.1.9"\n },\n "source": "./plugins/xorg",\n "category": "development",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/xorg",\n "keywords": ["xorg", "at-spi", "xtest", "pipewire"],\n "tags": ["linux", "desktop", "automation"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["xorg"],\n "requirements": ["Ubuntu 24.04 with passwordless sudo"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "zoom",\n "version": "1.1.6",\n "description": "Verified Zoom Workplace control through public xorgctl JSON",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Zoom",\n "version": "1.1.6"\n },\n "source": "./plugins/zoom",\n "category": "productivity",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/zoom",\n "keywords": ["zoom", "meeting", "accessibility", "virtual-camera"],\n "tags": ["zoom", "meeting", "automation"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["zoom"],\n "requirements": ["Ubuntu 24.04 amd64", "Zoom Workplace 7.2.1.5760", "Xorg, Herdr, and Ghostty plugins"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["xorg", "herdr", "ghostty"]\n }\n },\n {\n "name": "ghostty",\n "version": "1.0.4",\n "description": "Curated Linux Ghostty setup for Xorg and Herdr terminal sessions",\n "license": "MIT",\n "author": {\n "name": "f5-sales-demo"\n },\n "extensions": ["extensions/integration.ts"],\n "xcsh": {\n "name": "Ghostty",\n "version": "1.0.4"\n },\n "source": "./plugins/ghostty",\n "category": "development",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/ghostty",\n "keywords": ["ghostty", "terminal", "xorg", "herdr"],\n "tags": ["linux", "terminal", "xorg"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["ghostty"],\n "requirements": ["Ubuntu Linux", "Xorg and Herdr marketplace plugins"],\n "setupRequired": true,\n "setupAuthorization": "install",\n "collectedData": [],\n "pluginDependencies": ["xorg", "herdr"]\n }\n }\n ]\n}\n';
3
3
 
4
4
  export default builtinMarketplaceSnapshot;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "repository": "https://github.com/f5-sales-demo/marketplace",
3
3
  "sourcePath": ".xcsh-plugin/marketplace.json",
4
- "commit": "c47a8ac17ac805af56d8fc4240de5bd30d57cc54",
5
- "sha256": "8dd87f4f9dc8e228d3688dd8add17faa332e9a7fe0e4453999963682be1f6ccf",
6
- "capturedAt": "2026-09-29T12:08:23.831Z"
4
+ "commit": "e5460adca2d6ebab2e585c8a8924b0c1ce502c8f",
5
+ "sha256": "9de315c4ef171142a1e2235f99be47c9bdb51963ba456728d153c570cb6e8724",
6
+ "capturedAt": "2026-09-30T03:10:08.894Z"
7
7
  }
@@ -132,6 +132,12 @@ export function parseMarketplaceCatalog(content: string, filePath: string): Mark
132
132
  const entry = plugins[i];
133
133
  assertField(typeof entry === "object" && entry !== null && !Array.isArray(entry), `plugins[${i}]`, filePath);
134
134
  const p = entry as Record<string, unknown>;
135
+ assertField(
136
+ p.minimumRuntimeVersion === undefined ||
137
+ (typeof p.minimumRuntimeVersion === "string" && /^\d+\.\d+\.\d+$/.test(p.minimumRuntimeVersion)),
138
+ `plugins[${i}].minimumRuntimeVersion`,
139
+ filePath,
140
+ );
135
141
  assertField(typeof p.name === "string" && isValidNameSegment(p.name), `plugins[${i}].name`, filePath);
136
142
  // source can be a string path or a typed object (github/url/git-subdir/npm)
137
143
  // all typed objects carry a "source" discriminant string field
@@ -1,3 +1,4 @@
1
+ import { assertRuntimeRequirement } from "./runtime";
1
2
  /**
2
3
  * MarketplaceManager — orchestrates registry, fetcher, resolver, and cache.
3
4
  *
@@ -491,6 +492,8 @@ export class MarketplaceManager {
491
492
  if (!entry) throw new Error(`Marketplace "${marketplace}" not found`);
492
493
  const catalog = await this.#readCatalog(entry);
493
494
  const plan = resolvePluginDependencyNames(catalog, name);
495
+ for (const pluginName of plan)
496
+ assertRuntimeRequirement(catalog.plugins.find(plugin => plugin.name === pluginName)!);
494
497
  const retainReplacedCache = entry.sourceType === "local";
495
498
  const registryPath = this.#registryPath(scope);
496
499
  const before = await readInstalledPluginsRegistry(registryPath);
@@ -0,0 +1,10 @@
1
+ import { VERSION } from "@f5-sales-demo/pi-utils";
2
+ export function assertRuntimeRequirement(
3
+ plugin: { name: string; minimumRuntimeVersion?: string },
4
+ current = VERSION,
5
+ ): void {
6
+ if (plugin.minimumRuntimeVersion === undefined) return;
7
+ if (!/^\d+\.\d+\.\d+$/.test(plugin.minimumRuntimeVersion)) throw new Error("Invalid minimum xcsh runtime version");
8
+ if (Bun.semver.order(current, plugin.minimumRuntimeVersion) < 0)
9
+ throw new Error(`${plugin.name} requires xcsh ${plugin.minimumRuntimeVersion} or later; upgrade xcsh first`);
10
+ }
@@ -89,6 +89,7 @@ export interface MarketplacePluginLifecycle {
89
89
  }
90
90
 
91
91
  export interface MarketplacePluginEntry {
92
+ minimumRuntimeVersion?: string;
92
93
  name: string;
93
94
  displayName?: string;
94
95
  source: PluginSource;