@f5-sales-demo/xcsh 22.1.0 → 22.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -42,6 +42,8 @@
42
42
 
43
43
  ### Changed
44
44
 
45
+ - Standardized executable updates on `xcsh self-update`; `xcsh update` is now reserved for strict manifest resource updates ([#4487](https://github.com/f5-sales-demo/xcsh/issues/4487)).
46
+
45
47
  - Added `power.sleepPrevention` with an `idle` default and cumulative `off`, `idle`, `display`, and
46
48
  `system` modes for session-scoped sleep prevention on macOS, Linux, and Windows
47
49
  ([#3724](https://github.com/f5-sales-demo/xcsh/issues/3724)).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/xcsh",
4
- "version": "22.1.0",
4
+ "version": "22.2.0",
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.1.0",
71
- "@f5-sales-demo/pi-ai": "22.1.0",
72
- "@f5-sales-demo/pi-natives": "22.1.0",
73
- "@f5-sales-demo/pi-resource-management": "22.1.0",
74
- "@f5-sales-demo/pi-tui": "22.1.0",
75
- "@f5-sales-demo/pi-utils": "22.1.0",
76
- "@f5-sales-demo/xcsh-stats": "22.1.0",
70
+ "@f5-sales-demo/pi-agent-core": "22.2.0",
71
+ "@f5-sales-demo/pi-ai": "22.2.0",
72
+ "@f5-sales-demo/pi-natives": "22.2.0",
73
+ "@f5-sales-demo/pi-resource-management": "22.2.0",
74
+ "@f5-sales-demo/pi-tui": "22.2.0",
75
+ "@f5-sales-demo/pi-utils": "22.2.0",
76
+ "@f5-sales-demo/xcsh-stats": "22.2.0",
77
77
  "@mozilla/readability": "^0.6",
78
78
  "@resvg/resvg-wasm": "2.6.2",
79
79
  "@sinclair/typebox": "0.34.52",
@@ -27,14 +27,6 @@ export interface UpdateCommandDependencies {
27
27
  stderr(value: string): void;
28
28
  }
29
29
 
30
- export function parseUpdateArgs(args: string[]): { force: boolean; check: boolean } | undefined {
31
- if (args.length === 0 || args[0] !== "self-update") return undefined;
32
- return {
33
- force: args.includes("--force") || args.includes("-f"),
34
- check: args.includes("--check") || args.includes("-c"),
35
- };
36
- }
37
-
38
30
  async function getLatestRelease(): Promise<ReleaseInfo> {
39
31
  const response = await fetch("https://registry.npmjs.org/@f5-sales-demo/xcsh/latest");
40
32
  if (!response.ok) throw new Error(`Failed to fetch release info: ${response.statusText}`);
@@ -147,7 +139,7 @@ function defaultUpdateCommandDependencies(): UpdateCommandDependencies {
147
139
  };
148
140
  }
149
141
 
150
- /** Run the shared policy for both `update` and `self-update`. */
142
+ /** Run the executable self-update policy. */
151
143
  export async function runUpdateCommand(
152
144
  opts: { force: boolean; check: boolean },
153
145
  deps: UpdateCommandDependencies = defaultUpdateCommandDependencies(),
@@ -205,24 +197,3 @@ export async function runUpdateCommand(
205
197
  export function getBrewUpgradeCommand(): string {
206
198
  return "brew upgrade --cask f5-sales-demo/tap/xcsh";
207
199
  }
208
-
209
- export function printUpdateHelp(): void {
210
- console.log(`${chalk.bold(`${APP_NAME} update`)} - Check the executable and follow its installation channel
211
-
212
- ${chalk.bold("Usage:")}
213
- ${APP_NAME} update [--check | --force]
214
- ${APP_NAME} update -f <manifest> [resource options]
215
-
216
- ${chalk.bold("Executable options:")}
217
- -c, --check Report the detected channel without changing files
218
- --force Show or perform the channel-owned action even when current
219
-
220
- Only an official standalone install with a valid adjacent xcsh-install.json
221
- receipt can replace itself. Homebrew, apt, npm, Bun, Windows installer, and MDM
222
- installs print their exact owner-managed instruction and perform no update.
223
- Unknown or conflicting provenance is blocked without changing the installation.
224
-
225
- Short -f means --filename for xcsh update. Use xcsh self-update -f for the
226
- short executable force form. Executable and resource flags cannot be mixed.
227
- `);
228
- }
@@ -157,7 +157,7 @@ function recommendationFor(channel: Exclude<InstallChannel, "unknown">, evidence
157
157
  evidence,
158
158
  };
159
159
  case "standalone":
160
- return { channel, action: "self-update", command: "xcsh update", evidence };
160
+ return { channel, action: "self-update", command: "xcsh self-update", evidence };
161
161
  case "windows-installer":
162
162
  return { channel, action: "external-command", command: WINDOWS_INSTALL_COMMAND, evidence };
163
163
  }
@@ -270,7 +270,7 @@ export function formatUpdateRecommendation(recommendation: UpdateRecommendation)
270
270
  case "managed":
271
271
  return "Managed by your organization; request an MDM deployment.\nNo update was performed.";
272
272
  case "self-update":
273
- return "This official standalone installation can update itself with: xcsh update";
273
+ return "This official standalone installation can update itself with: xcsh self-update";
274
274
  case "blocked":
275
275
  return `Update blocked: ${recommendation.evidence}. Reinstall using the documented installation channel that owns this executable.`;
276
276
  }
@@ -280,7 +280,7 @@ export function formatStartupUpdateNotice(version: string, recommendation: Updat
280
280
  const prefix = `Update available: v${version} — `;
281
281
  if (recommendation.action === "external-command") return `${prefix}run: ${recommendation.command}`;
282
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 update`;
283
+ if (recommendation.action === "self-update") return `${prefix}run: xcsh self-update`;
284
284
  return `${prefix}update blocked: ${recommendation.evidence}`;
285
285
  }
286
286
 
@@ -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,24 +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 resources or follow the xcsh executable installation channel";
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
- const exitCode = await runUpdateCommand({ force: invocation.force, check: invocation.check });
99
- if (exitCode !== 0) process.exitCode = exitCode;
100
- return;
101
- }
102
53
  await runResourceCli({
103
54
  operation: "update",
104
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
  }
@@ -95,6 +95,48 @@ export function matchesBaselineCatalogDiscoveryTerm(term: string, values: readon
95
95
  return values.some(value => normalizeApiCatalogDiscoveryTerm(value).includes(normalized));
96
96
  }
97
97
 
98
+ function categoryDocuments(category: ApiCatalogCategory): ApiCatalogDiscoveryDocument[] {
99
+ const destination = `xcsh://api-catalog/${category.name}`;
100
+ if (category.operations.length === 0) {
101
+ return [
102
+ {
103
+ id: `category:${category.name}`,
104
+ categoryName: category.name,
105
+ markdown: [
106
+ `# ${category.displayName}`,
107
+ "",
108
+ `- Category: ${category.name}`,
109
+ `- Destination: ${destination}`,
110
+ "",
111
+ "## Operations",
112
+ "- None",
113
+ "",
114
+ ].join("\n"),
115
+ },
116
+ ];
117
+ }
118
+ return category.operations
119
+ .slice()
120
+ .sort((left, right) => left.operationId.localeCompare(right.operationId))
121
+ .map(operation => ({
122
+ id: `operation:${category.name}:${operation.operationId}`,
123
+ categoryName: category.name,
124
+ markdown: [
125
+ `# ${category.displayName}: ${operation.name}`,
126
+ "",
127
+ `- Category: ${category.name}`,
128
+ `- Destination: ${destination}`,
129
+ `- Operation: ${operation.name}`,
130
+ `- Alias: ${(operation.operationAliases ?? []).join(", ")}`,
131
+ `- Description: ${operation.description}`,
132
+ `- Method: ${operation.method.toUpperCase()}`,
133
+ `- Path: ${operation.path}`,
134
+ `- Operation ID: ${operation.operationId}`,
135
+ "",
136
+ ].join("\n"),
137
+ }));
138
+ }
139
+
98
140
  function categoryDocument(category: ApiCatalogCategory): ApiCatalogDiscoveryDocument {
99
141
  const destination = `xcsh://api-catalog/${category.name}`;
100
142
  const operations = category.operations.flatMap(operation => [
@@ -105,7 +147,6 @@ function categoryDocument(category: ApiCatalogCategory): ApiCatalogDiscoveryDocu
105
147
  ` - Path: ${operation.path}`,
106
148
  ` - Operation ID: ${operation.operationId}`,
107
149
  ]);
108
-
109
150
  return {
110
151
  id: `category:${category.name}`,
111
152
  categoryName: category.name,
@@ -139,6 +180,20 @@ export function buildApiCatalogDiscoveryCorpus(
139
180
  };
140
181
  }
141
182
 
183
+ /** Candidate-only operation granularity; authoritative results remain category URLs. */
184
+ export function buildApiOperationDiscoveryCorpus(
185
+ index: ApiCatalogIndex,
186
+ data: Readonly<Record<string, ApiCatalogCategory>>,
187
+ ): ApiCatalogDiscoveryCorpus {
188
+ return {
189
+ catalogVersion: index.version,
190
+ documents: Object.values(data)
191
+ .slice()
192
+ .sort((left, right) => left.name.localeCompare(right.name))
193
+ .flatMap(categoryDocuments),
194
+ };
195
+ }
196
+
142
197
  export function fingerprintApiCatalogDiscoveryCorpus(
143
198
  corpus: ApiCatalogDiscoveryCorpus,
144
199
  sourceSha: string,
@@ -3,18 +3,20 @@ import path from "node:path";
3
3
  import { rankQmdBm25CatalogDiscovery } from "./api-catalog-discovery";
4
4
  import { QMD_API_CATALOG_PREBUILT_INDEX } from "./api-catalog-qmd-index.generated";
5
5
  import type { ApiSpecIndex } from "./api-spec-types";
6
+ import {
7
+ buildKnowledgeSearchPlan,
8
+ classifyKnowledgeRequest,
9
+ type KnowledgeClassifierResource,
10
+ type KnowledgeSearchPlan,
11
+ } from "./knowledge-classifier";
6
12
 
7
- export interface ApiCatalogPreflightResource {
8
- readonly name: string;
9
- readonly aliases: readonly string[];
10
- readonly domain: string;
11
- readonly categories: readonly string[];
12
- }
13
+ export interface ApiCatalogPreflightResource extends KnowledgeClassifierResource {}
13
14
 
14
15
  export interface ApiCatalogPreflightIntent {
15
16
  readonly resource: string;
16
17
  readonly domain: string;
17
18
  readonly queries: readonly string[];
19
+ readonly structuredQuery?: KnowledgeSearchPlan;
18
20
  }
19
21
 
20
22
  export interface ApiCatalogPreflightDestination {
@@ -45,16 +47,6 @@ interface RunApiCatalogPreflightOptions extends ApiCatalogPreflightOptions {
45
47
  readonly rank?: (query: string) => Promise<readonly string[]>;
46
48
  }
47
49
 
48
- const EXCLUDED_INTENT =
49
- /\b(?:troubleshoot|debug|not working|returning\s+\d{3}|pricing|price|quote|licen[cs]ing|sales)\b/i;
50
- const THIRD_PARTY_SCOPE = /\b(?:aws|amazon|azure|gcp|google cloud|kubernetes)\b/i;
51
- const F5_XC_SCOPE = /\b(?:f5(?:\s+distributed\s+cloud)?|xc)\b/i;
52
- const ANAPHORIC_RESOURCE = /\b(?:its|it|that|this)\b/i;
53
- const DOCUMENTATION_ROUTE = /xcsh:\/\/documentation(?:\/|\?)/i;
54
- const API_METADATA_INTENT =
55
- /\b(?:endpoint|api\s+path|http\s+method|method|payload|request\s+body|required\s+fields?|enum|allowed\s+values?|constraints?|limits?|maximum|max(?:imum)?|minimum|min(?:imum)?|how\s+many|create|creates|creating|get|gets|list|lists|update|updates|replace|replaces|delete|deletes|clone|import)\b/i;
56
- const EXPLICIT_API_INTENT = /\b(?:api|endpoint|method|payload|schema)\b/i;
57
-
58
50
  let generatedResources: readonly ApiCatalogPreflightResource[] | undefined;
59
51
  let generatedCatalogVersion: string | undefined;
60
52
 
@@ -67,10 +59,6 @@ function normalizedPhrase(value: string): string {
67
59
  .replace(/\s+/g, " ");
68
60
  }
69
61
 
70
- function preferredAlias(resource: { name: string; aliases: readonly string[] }): string {
71
- return normalizedPhrase(resource.aliases[0] ?? resource.name);
72
- }
73
-
74
62
  function defaultAliases(name: string, descriptionShort?: string): string[] {
75
63
  const canonical = normalizedPhrase(name);
76
64
  const aliases = [normalizedPhrase(descriptionShort ?? ""), canonical].filter(Boolean);
@@ -97,56 +85,40 @@ function loadGeneratedMetadata(): { resources: readonly ApiCatalogPreflightResou
97
85
  return { resources: generatedResources, catalogVersion: generatedCatalogVersion };
98
86
  }
99
87
 
100
- function crudVerb(prompt: string): string | undefined {
101
- const value = normalizedPhrase(prompt);
102
- if (/\b(?:create|creates|creating)\b/.test(value)) return "create";
103
- if (/\b(?:get|gets|read|fetch)\b/.test(value)) return "get";
104
- if (/\b(?:list|lists)\b/.test(value)) return "list";
105
- if (/\b(?:update|updates)\b/.test(value)) return "update";
106
- if (/\b(?:replace|replaces)\b/.test(value)) return "replace";
107
- if (/\b(?:delete|deletes|remove)\b/.test(value)) return "delete";
108
- if (/\bclone\b/.test(value)) return "clone";
109
- if (/\bimport\b/.test(value)) return "import";
110
- return undefined;
111
- }
112
-
113
88
  export function classifyApiCatalogPreflight(
114
89
  prompt: string,
115
90
  options: ApiCatalogPreflightOptions,
116
91
  ): ApiCatalogPreflightIntent | null {
117
- if (!options.toolsEnabled || DOCUMENTATION_ROUTE.test(prompt) || EXCLUDED_INTENT.test(prompt)) return null;
118
- if (THIRD_PARTY_SCOPE.test(prompt) && !F5_XC_SCOPE.test(prompt)) return null;
119
- if (/\bterraform\b/i.test(prompt) && !EXPLICIT_API_INTENT.test(prompt)) return null;
120
- if (!API_METADATA_INTENT.test(prompt)) return null;
121
-
122
92
  const resources = options.resources ?? loadGeneratedMetadata().resources;
123
- const normalizedPrompt = ` ${normalizedPhrase(prompt)} `;
124
- const matches = resources
125
- .flatMap(resource =>
126
- resource.aliases
127
- .map(alias => normalizedPhrase(alias))
128
- .filter(alias => alias && normalizedPrompt.includes(` ${alias} `))
129
- .map(alias => ({ resource, alias })),
130
- )
131
- .sort(
132
- (left, right) =>
133
- right.alias.length - left.alias.length ||
134
- right.resource.categories.length - left.resource.categories.length ||
135
- left.resource.name.localeCompare(right.resource.name) ||
136
- left.resource.domain.localeCompare(right.resource.domain),
137
- );
138
- const selected = matches[0]?.resource;
139
- if (!selected) {
140
- if (ANAPHORIC_RESOURCE.test(prompt) && options.previousResource) return options.previousResource;
141
- return null;
93
+ const previous = options.previousResource
94
+ ? {
95
+ route: "api" as const,
96
+ confidence: 0.99,
97
+ resource: options.previousResource.resource,
98
+ domain: options.previousResource.domain,
99
+ constraints: { domain: options.previousResource.domain },
100
+ query:
101
+ options.previousResource.structuredQuery ??
102
+ buildKnowledgeSearchPlan(
103
+ "api",
104
+ options.previousResource.queries[0] ?? options.previousResource.resource,
105
+ ),
106
+ }
107
+ : undefined;
108
+ const classified = classifyKnowledgeRequest(prompt, { toolsEnabled: options.toolsEnabled, resources, previous });
109
+ if (classified.route !== "api" || !classified.resource || !classified.domain) return null;
110
+ if (
111
+ options.previousResource &&
112
+ classified.resource === options.previousResource.resource &&
113
+ /\b(?:its|it|that|this|those|them|the same)\b/i.test(prompt)
114
+ ) {
115
+ return options.previousResource;
142
116
  }
143
-
144
- const alias = preferredAlias(selected);
145
- const verb = crudVerb(prompt);
146
117
  return {
147
- resource: selected.name,
148
- domain: selected.domain,
149
- queries: verb ? [alias, `${verb} ${alias}`] : [alias],
118
+ resource: classified.resource,
119
+ domain: classified.domain,
120
+ queries: classified.query.lex,
121
+ structuredQuery: classified.query,
150
122
  };
151
123
  }
152
124