@f5-sales-demo/xcsh 22.0.1 → 22.1.2

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.
@@ -0,0 +1,299 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+
5
+ const PACKAGE = "@f5-sales-demo/xcsh";
6
+ const WINDOWS_INSTALL_COMMAND =
7
+ "irm https://raw.githubusercontent.com/f5-sales-demo/xcsh/main/scripts/install.ps1 | iex";
8
+
9
+ export type InstallChannel =
10
+ | "homebrew-cask"
11
+ | "macos-mdm"
12
+ | "debian-apt"
13
+ | "npm"
14
+ | "bun"
15
+ | "standalone"
16
+ | "windows-installer"
17
+ | "unknown";
18
+
19
+ export type UpdateRecommendation = {
20
+ channel: InstallChannel;
21
+ action: "external-command" | "self-update" | "managed" | "blocked";
22
+ command?: string;
23
+ evidence: string;
24
+ };
25
+
26
+ type CommandResult = { exitCode: number; stdout: string; stderr: string };
27
+
28
+ export interface InstallChannelDependencies {
29
+ platform: NodeJS.Platform;
30
+ arch: string;
31
+ execPath: string;
32
+ version: string;
33
+ homeDir: string;
34
+ env: NodeJS.ProcessEnv;
35
+ realpath(value: string): Promise<string>;
36
+ readFile(value: string): Promise<string>;
37
+ run(command: string, args: string[]): Promise<CommandResult>;
38
+ }
39
+
40
+ interface InstallReceipt {
41
+ schemaVersion: 1;
42
+ channel: "standalone" | "windows-installer";
43
+ version: string;
44
+ executablePath: string;
45
+ platform: string;
46
+ arch: string;
47
+ }
48
+
49
+ function platformPath(platform: NodeJS.Platform): typeof path.posix | typeof path.win32 {
50
+ return platform === "win32" ? path.win32 : path.posix;
51
+ }
52
+
53
+ function comparablePath(value: string, platform: NodeJS.Platform): string {
54
+ const normalized = platformPath(platform).resolve(value);
55
+ return platform === "win32" ? normalized.toLowerCase() : normalized;
56
+ }
57
+
58
+ function releaseAsset(platform: NodeJS.Platform, arch: string): string | undefined {
59
+ if (platform === "linux" && (arch === "x64" || arch === "arm64")) return `xcsh-linux-${arch}`;
60
+ if (platform === "darwin" && (arch === "x64" || arch === "arm64")) return `xcsh-darwin-${arch}`;
61
+ if (platform === "win32" && arch === "x64") return "xcsh-windows-x64.exe";
62
+ return undefined;
63
+ }
64
+
65
+ function expectedReleaseCacheBinary(deps: InstallChannelDependencies): string | undefined {
66
+ const asset = releaseAsset(deps.platform, deps.arch);
67
+ if (!asset) return undefined;
68
+ const pathApi = platformPath(deps.platform);
69
+ const cacheRoot =
70
+ deps.env.XCSH_RELEASE_CACHE_DIR ??
71
+ (deps.platform === "win32"
72
+ ? pathApi.join(deps.env.LOCALAPPDATA ?? deps.env.TEMP ?? deps.homeDir, "xcsh", "releases")
73
+ : pathApi.join(deps.env.XDG_CACHE_HOME ?? pathApi.join(deps.homeDir, ".cache"), "xcsh", "releases"));
74
+ return pathApi.join(cacheRoot, `v${deps.version}`, `${deps.platform}-${deps.arch}`, asset);
75
+ }
76
+
77
+ function receiptIsValid(
78
+ value: unknown,
79
+ deps: InstallChannelDependencies,
80
+ resolvedExecPath: string,
81
+ ): value is InstallReceipt {
82
+ if (!value || typeof value !== "object") return false;
83
+ const receipt = value as Partial<InstallReceipt>;
84
+ if (
85
+ receipt.schemaVersion !== 1 ||
86
+ (receipt.channel !== "standalone" && receipt.channel !== "windows-installer") ||
87
+ receipt.version !== deps.version ||
88
+ receipt.platform !== deps.platform ||
89
+ receipt.arch !== deps.arch ||
90
+ typeof receipt.executablePath !== "string" ||
91
+ comparablePath(receipt.executablePath, deps.platform) !== comparablePath(resolvedExecPath, deps.platform)
92
+ ) {
93
+ return false;
94
+ }
95
+ if (receipt.channel === "standalone") return deps.platform !== "win32";
96
+ if (deps.platform !== "win32") return false;
97
+ const localAppData = deps.env.LOCALAPPDATA;
98
+ if (!localAppData) return false;
99
+ return (
100
+ comparablePath(resolvedExecPath, deps.platform) ===
101
+ comparablePath(path.win32.join(localAppData, "xcsh", "xcsh.exe"), deps.platform)
102
+ );
103
+ }
104
+
105
+ async function defaultRun(command: string, args: string[]): Promise<CommandResult> {
106
+ try {
107
+ const child = Bun.spawn([command, ...args], { stdin: "ignore", stdout: "pipe", stderr: "pipe" });
108
+ const [exitCode, stdout, stderr] = await Promise.all([
109
+ child.exited,
110
+ new Response(child.stdout).text(),
111
+ new Response(child.stderr).text(),
112
+ ]);
113
+ return { exitCode, stdout, stderr };
114
+ } catch (error) {
115
+ return { exitCode: 127, stdout: "", stderr: error instanceof Error ? error.message : String(error) };
116
+ }
117
+ }
118
+
119
+ export function defaultInstallChannelDependencies(version: string): InstallChannelDependencies {
120
+ return {
121
+ platform: process.platform,
122
+ arch: process.arch,
123
+ execPath: process.execPath,
124
+ version,
125
+ homeDir: homedir(),
126
+ env: process.env,
127
+ realpath,
128
+ readFile: value => readFile(value, "utf8"),
129
+ run: defaultRun,
130
+ };
131
+ }
132
+
133
+ function recommendationFor(channel: Exclude<InstallChannel, "unknown">, evidence: string): UpdateRecommendation {
134
+ switch (channel) {
135
+ case "homebrew-cask":
136
+ return {
137
+ channel,
138
+ action: "external-command",
139
+ command: "brew upgrade --cask f5-sales-demo/tap/xcsh",
140
+ evidence,
141
+ };
142
+ case "macos-mdm":
143
+ return { channel, action: "managed", evidence };
144
+ case "debian-apt":
145
+ return {
146
+ channel,
147
+ action: "external-command",
148
+ command: "sudo apt-get update && sudo apt-get install --only-upgrade xcsh",
149
+ evidence,
150
+ };
151
+ case "npm":
152
+ case "bun":
153
+ return {
154
+ channel,
155
+ action: "external-command",
156
+ command: `${channel} update --global ${PACKAGE}`,
157
+ evidence,
158
+ };
159
+ case "standalone":
160
+ return { channel, action: "self-update", command: "xcsh self-update", evidence };
161
+ case "windows-installer":
162
+ return { channel, action: "external-command", command: WINDOWS_INSTALL_COMMAND, evidence };
163
+ }
164
+ }
165
+
166
+ /** Resolve the owner of the running executable without mutating the installation. */
167
+ export async function resolveInstallChannel(deps: InstallChannelDependencies): Promise<UpdateRecommendation> {
168
+ let resolvedExecPath: string;
169
+ try {
170
+ resolvedExecPath = await deps.realpath(deps.execPath);
171
+ } catch {
172
+ return { channel: "unknown", action: "blocked", evidence: "running executable could not be resolved" };
173
+ }
174
+
175
+ const signals: Array<{ channel: Exclude<InstallChannel, "unknown">; evidence: string }> = [];
176
+ const diagnostics: string[] = [];
177
+ const normalizedResolved = resolvedExecPath.replaceAll("\\", "/");
178
+
179
+ if (
180
+ deps.platform === "darwin" &&
181
+ /^\/(?:opt\/homebrew|usr\/local)\/Caskroom\/xcsh\/[^/]+\/bin\/xcsh$/u.test(normalizedResolved)
182
+ ) {
183
+ signals.push({ channel: "homebrew-cask", evidence: `running executable resolves to ${resolvedExecPath}` });
184
+ }
185
+
186
+ if (deps.platform === "darwin" && deps.execPath === "/usr/local/bin/xcsh" && resolvedExecPath === deps.execPath) {
187
+ const pkg = await deps.run("pkgutil", ["--pkg-info", "com.f5.xcsh"]);
188
+ const files = await deps.run("pkgutil", ["--files", "com.f5.xcsh"]);
189
+ if (
190
+ pkg.exitCode === 0 &&
191
+ /(?:^|\n)package-id:\s*com\.f5\.xcsh(?:\n|$)/u.test(pkg.stdout) &&
192
+ files.exitCode === 0 &&
193
+ files.stdout.split("\n").some(line => line.trim() === "usr/local/bin/xcsh")
194
+ ) {
195
+ signals.push({
196
+ channel: "macos-mdm",
197
+ evidence: "exact /usr/local/bin/xcsh identity and com.f5.xcsh receipt",
198
+ });
199
+ }
200
+ }
201
+
202
+ if (deps.platform === "linux") {
203
+ const dpkg = await deps.run("dpkg-query", ["--search", resolvedExecPath]);
204
+ if (dpkg.exitCode === 0 && dpkg.stdout.split("\n").some(line => line.trim() === `xcsh: ${resolvedExecPath}`)) {
205
+ signals.push({ channel: "debian-apt", evidence: `dpkg package xcsh owns ${resolvedExecPath}` });
206
+ }
207
+ }
208
+
209
+ const marker = deps.env.XCSH_DISTRIBUTION_CHANNEL;
210
+ if (marker === "npm" || marker === "bun") {
211
+ const expectedBinary = expectedReleaseCacheBinary(deps);
212
+ if (
213
+ expectedBinary &&
214
+ comparablePath(expectedBinary, deps.platform) === comparablePath(resolvedExecPath, deps.platform)
215
+ ) {
216
+ signals.push({
217
+ channel: marker,
218
+ evidence: `${marker} launcher marker and compiled-release cache path ${resolvedExecPath}`,
219
+ });
220
+ } else {
221
+ diagnostics.push(`invalid ${marker} launcher marker for ${resolvedExecPath}`);
222
+ }
223
+ } else if (marker) {
224
+ diagnostics.push(`invalid launcher marker ${marker}`);
225
+ }
226
+
227
+ const receiptPath = platformPath(deps.platform).join(
228
+ platformPath(deps.platform).dirname(resolvedExecPath),
229
+ "xcsh-install.json",
230
+ );
231
+ try {
232
+ const parsed = JSON.parse(await deps.readFile(receiptPath));
233
+ if (receiptIsValid(parsed, deps, resolvedExecPath)) {
234
+ signals.push({
235
+ channel: parsed.channel,
236
+ evidence: `valid schema-v1 ${parsed.channel} receipt at ${receiptPath}`,
237
+ });
238
+ } else {
239
+ diagnostics.push(`invalid or stale install receipt at ${receiptPath}`);
240
+ }
241
+ } catch (error) {
242
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
243
+ diagnostics.push(`malformed install receipt at ${receiptPath}`);
244
+ }
245
+ }
246
+
247
+ const uniqueChannels = [...new Set(signals.map(signal => signal.channel))];
248
+ if (uniqueChannels.length > 1 || (uniqueChannels.length > 0 && diagnostics.length > 0)) {
249
+ return {
250
+ channel: "unknown",
251
+ action: "blocked",
252
+ evidence: `conflicting installation evidence: ${[...uniqueChannels, ...diagnostics].join(", ")}`,
253
+ };
254
+ }
255
+ if (signals.length === 1) return recommendationFor(signals[0].channel, signals[0].evidence);
256
+ if (signals.length > 1)
257
+ return recommendationFor(signals[0].channel, signals.map(signal => signal.evidence).join("; "));
258
+
259
+ return {
260
+ channel: "unknown",
261
+ action: "blocked",
262
+ evidence: diagnostics.join("; ") || `no trusted installation provenance for ${resolvedExecPath}`,
263
+ };
264
+ }
265
+
266
+ export function formatUpdateRecommendation(recommendation: UpdateRecommendation): string {
267
+ switch (recommendation.action) {
268
+ case "external-command":
269
+ return `Update with: ${recommendation.command}\nNo update was performed; this installation is owned by ${recommendation.channel}.`;
270
+ case "managed":
271
+ return "Managed by your organization; request an MDM deployment.\nNo update was performed.";
272
+ case "self-update":
273
+ return "This official standalone installation can update itself with: xcsh self-update";
274
+ case "blocked":
275
+ return `Update blocked: ${recommendation.evidence}. Reinstall using the documented installation channel that owns this executable.`;
276
+ }
277
+ }
278
+
279
+ export function formatStartupUpdateNotice(version: string, recommendation: UpdateRecommendation): string {
280
+ const prefix = `Update available: v${version} — `;
281
+ if (recommendation.action === "external-command") return `${prefix}run: ${recommendation.command}`;
282
+ if (recommendation.action === "managed") return `${prefix}managed by your organization; request an MDM deployment`;
283
+ if (recommendation.action === "self-update") return `${prefix}run: xcsh self-update`;
284
+ return `${prefix}update blocked: ${recommendation.evidence}`;
285
+ }
286
+
287
+ export interface StartupUpdateDependencies {
288
+ getLatestVersion(currentVersion: string): Promise<string | undefined>;
289
+ resolveRecommendation(): Promise<UpdateRecommendation>;
290
+ }
291
+
292
+ export async function getStartupUpdateNotice(
293
+ currentVersion: string,
294
+ deps: StartupUpdateDependencies,
295
+ ): Promise<string | undefined> {
296
+ const latestVersion = await deps.getLatestVersion(currentVersion);
297
+ if (!latestVersion) return undefined;
298
+ return formatStartupUpdateNotice(latestVersion, await deps.resolveRecommendation());
299
+ }
@@ -1,18 +1,23 @@
1
- /** Check for and install xcsh executable updates. */
1
+ /** Check for executable updates and follow the detected installation channel. */
2
2
  import { Command, Flags } from "@f5-sales-demo/pi-utils/cli";
3
3
  import { runUpdateCommand } from "../cli/update-cli";
4
4
  import { initTheme } from "../modes/theme/theme";
5
5
 
6
6
  export default class SelfUpdate extends Command {
7
- static description = "Check for and install xcsh executable updates";
7
+ static description = "Check for xcsh updates and follow the detected installation channel";
8
8
  static flags = {
9
- force: Flags.boolean({ char: "f", description: "Force update", default: false }),
10
- check: Flags.boolean({ char: "c", description: "Check for updates without installing", default: false }),
9
+ force: Flags.boolean({
10
+ char: "f",
11
+ description: "Show or perform the channel-owned action when current",
12
+ default: false,
13
+ }),
14
+ check: Flags.boolean({ char: "c", description: "Report the channel without changing files", default: false }),
11
15
  };
12
16
 
13
17
  async run(): Promise<void> {
14
18
  const { flags } = await this.parse(SelfUpdate);
15
19
  await initTheme();
16
- await runUpdateCommand({ force: flags.force, check: flags.check });
20
+ const exitCode = await runUpdateCommand({ force: flags.force, check: flags.check });
21
+ if (exitCode !== 0) process.exitCode = exitCode;
17
22
  }
18
23
  }
@@ -1,44 +1,22 @@
1
- import { CliUsageError, Command, Flags, parseCommandArgv } from "@f5-sales-demo/pi-utils/cli";
1
+ import { CliUsageError, Command, parseCommandArgv } from "@f5-sales-demo/pi-utils/cli";
2
2
  import { runResourceCli } from "../cli/resource-cli";
3
- import { runUpdateCommand } from "../cli/update-cli";
4
- import { initTheme } from "../modes/theme/theme";
5
3
  import { manifestResourceFlags } from "./resource-flags";
6
4
 
7
- const updateFlags = {
8
- ...manifestResourceFlags,
9
- force: Flags.boolean({
10
- description: "Force executable update (short -f is reserved for resource manifests)",
11
- default: false,
12
- }),
13
- check: Flags.boolean({ char: "c", description: "Check for executable updates without installing", default: false }),
14
- };
15
-
16
5
  type ResourceOutputFormat = "json" | "yaml" | "table" | "wide";
17
6
 
18
- export type UpdateInvocation =
19
- | { mode: "executable"; force: boolean; check: boolean }
20
- | {
21
- mode: "resource";
22
- filenames: string[] | undefined;
23
- namespace: string | undefined;
24
- outputFormat: ResourceOutputFormat;
25
- recursive: boolean;
26
- dryRun: "client" | undefined;
27
- resultFile: string | undefined;
28
- };
29
-
30
- function explicitlyRequestsDefaultOutput(argv: readonly string[]): boolean {
31
- return argv.some(arg => arg === "--output" || arg.startsWith("--output=") || arg === "-o");
32
- }
7
+ export type UpdateInvocation = {
8
+ mode: "resource";
9
+ filenames: string[] | undefined;
10
+ namespace: string | undefined;
11
+ outputFormat: ResourceOutputFormat;
12
+ recursive: boolean;
13
+ dryRun: "client" | undefined;
14
+ resultFile: string | undefined;
15
+ };
33
16
 
34
- /** Resolve the backward-compatible `update` command before either updater can perform I/O. */
17
+ /** Parse the resource-update command before it can perform I/O. */
35
18
  export function parseUpdateInvocation(argv: readonly string[]): UpdateInvocation {
36
- if (argv.length === 1 && argv[0] === "-f") {
37
- throw new CliUsageError(
38
- "Ambiguous -f: use 'xcsh update --force' or 'xcsh self-update -f' for executable updates; otherwise provide a resource manifest",
39
- );
40
- }
41
- const parsed = parseCommandArgv(argv, { flags: updateFlags });
19
+ const parsed = parseCommandArgv(argv, { flags: manifestResourceFlags });
42
20
  if (parsed.argv.length > 0) {
43
21
  throw new CliUsageError(`Unexpected argument${parsed.argv.length === 1 ? "" : "s"}: ${parsed.argv.join(" ")}`);
44
22
  }
@@ -50,25 +28,7 @@ export function parseUpdateInvocation(argv: readonly string[]): UpdateInvocation
50
28
  recursive: boolean;
51
29
  "dry-run"?: "client";
52
30
  "result-file"?: string;
53
- force: boolean;
54
- check: boolean;
55
31
  };
56
- const executableRequested = flags.force || flags.check;
57
- const resourceRequested =
58
- flags.filename !== undefined ||
59
- flags.namespace !== undefined ||
60
- flags.recursive ||
61
- flags["dry-run"] !== undefined ||
62
- flags["result-file"] !== undefined ||
63
- flags.output !== "table" ||
64
- explicitlyRequestsDefaultOutput(argv);
65
-
66
- if (executableRequested && resourceRequested) {
67
- throw new CliUsageError("update cannot combine executable-update and resource-update flags");
68
- }
69
- if (!resourceRequested) {
70
- return { mode: "executable", force: flags.force, check: flags.check };
71
- }
72
32
  return {
73
33
  mode: "resource",
74
34
  filenames: flags.filename,
@@ -81,23 +41,15 @@ export function parseUpdateInvocation(argv: readonly string[]): UpdateInvocation
81
41
  }
82
42
 
83
43
  export default class Update extends Command {
84
- static description = "Update the xcsh executable or existing resources from manifests";
85
- static flags = updateFlags;
44
+ static description = "Update F5 Distributed Cloud resources from manifests";
45
+ static flags = manifestResourceFlags;
86
46
  static examples = [
87
- "xcsh update # update the executable",
88
- "xcsh update --check # check the executable version",
89
- "xcsh update --force # force an executable reinstall",
90
- "xcsh self-update -f # short force form for the executable",
91
47
  "xcsh update -f manifest.yaml # update resources from a manifest",
48
+ "xcsh update -f manifests/ -R # update resources from a manifest directory",
92
49
  ];
93
50
 
94
51
  async run(): Promise<void> {
95
52
  const invocation = parseUpdateInvocation(this.argv);
96
- if (invocation.mode === "executable") {
97
- await initTheme();
98
- await runUpdateCommand({ force: invocation.force, check: invocation.check });
99
- return;
100
- }
101
53
  await runResourceCli({
102
54
  operation: "update",
103
55
  filenames: invocation.filenames,
@@ -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 "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.3",\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.3"\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.8",\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.8"\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.0.5",\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.0.5"\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", "Zoom Workplace", "Xorg plugin"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["xorg"]\n }\n },\n {\n "name": "ghostty",\n "version": "1.0.2",\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.2"\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.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.3",\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.3"\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.0.5",\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.0.5"\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", "Zoom Workplace", "Xorg plugin"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": ["xorg"]\n }\n },\n {\n "name": "ghostty",\n "version": "1.0.2",\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.2"\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": "229752aaa99ddfd929266d7cc66c15589b639bb0",
5
- "sha256": "6da31bb20788ff089d1e60b9269672a734d2c95bcfa9d8504601d071a3d5d781",
6
- "capturedAt": "2026-09-26T19:26:07.299Z"
4
+ "commit": "5683fee44ba0c4552625e28967b2fd1a09eb62d5",
5
+ "sha256": "5fec43e8aa49520cdb4206b792e6508c2048c5c4d178841c2477595a8a33f803",
6
+ "capturedAt": "2026-09-27T22:31:32.091Z"
7
7
  }