@f5-sales-demo/xcsh 21.41.5 → 21.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +8 -8
  3. package/src/cli/plugin-cli.ts +44 -8
  4. package/src/config/keybindings.ts +1 -7
  5. package/src/config/model-catalog.ts +1 -1
  6. package/src/config/model-registry.ts +29 -1
  7. package/src/config/settings-schema.ts +11 -0
  8. package/src/extensibility/plugins/marketplace/builtin-marketplace-snapshot.ts +1 -1
  9. package/src/extensibility/plugins/marketplace/builtin-marketplace.provenance.json +3 -3
  10. package/src/extensibility/plugins/marketplace/manager.ts +24 -1
  11. package/src/integrations/registry.ts +14 -0
  12. package/src/integrations/setup.ts +35 -5
  13. package/src/integrations/types.ts +5 -0
  14. package/src/internal-urls/api-catalog-index.generated.ts +32340 -26540
  15. package/src/internal-urls/api-catalog-qmd-index.generated.ts +1 -1
  16. package/src/internal-urls/api-spec-index.generated.ts +2 -2
  17. package/src/internal-urls/build-info.generated.ts +8 -8
  18. package/src/internal-urls/docs-index.generated.ts +1 -1
  19. package/src/internal-urls/terraform-index.generated.ts +136 -2078
  20. package/src/main.ts +1 -2
  21. package/src/modes/components/custom-editor.ts +15 -2
  22. package/src/modes/controllers/input-controller.ts +15 -5
  23. package/src/modes/controllers/login-model.ts +15 -13
  24. package/src/modes/controllers/selector-controller.ts +5 -0
  25. package/src/modes/interactive-mode.ts +12 -3
  26. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  27. package/src/routing/presets.ts +3 -3
  28. package/src/routing/subscription-profiles.ts +9 -9
  29. package/src/sdk.ts +8 -2
  30. package/src/slash-commands/builtin-registry.ts +16 -3
  31. package/src/task/executor.ts +29 -4
  32. package/src/task/index.ts +3 -0
  33. package/src/tools/index.ts +2 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  ### Added
8
8
 
9
+ - Added current ChatGPT subscription roles for GPT-6 Luna/Sol, Claude Opus 5.5 selection, and an
10
+ opt-in Providers setting for the GPT-6 1.05M-token context window. The default remains 272K to
11
+ make long-context pricing explicit; LiteLLM retains its existing catalog
12
+ ([#4240](https://github.com/f5-sales-demo/xcsh/issues/4240)).
9
13
  - Added owner-scoped, capability-filtered plugin advisories that render machine-readable provenance,
10
14
  fail open on matcher errors, and refresh with plugin lifecycle changes
11
15
  ([#4175](https://github.com/f5-sales-demo/xcsh/issues/4175)).
@@ -53,6 +57,13 @@
53
57
 
54
58
  ### Fixed
55
59
 
60
+ - Added the exact `/plugin setup <plugin>` next action after interactive installation of plugins
61
+ that require separately authorized setup ([#4253](https://github.com/f5-sales-demo/xcsh/issues/4253)).
62
+ - Made marketplace plugin uninstall dry-runs return a deterministic preview without changing the
63
+ installed registry or cache ([#4251](https://github.com/f5-sales-demo/xcsh/issues/4251)).
64
+ - Routed Platform plugin setup through the native interactive context wizard, rejected empty or
65
+ mixed setup plans, and made generated API catalogs enforce the `XCSH_*`-only environment contract
66
+ ([#4234](https://github.com/f5-sales-demo/xcsh/issues/4234)).
56
67
  - Added Herdr protocol 26 native-interaction compatibility and bounded idempotent retry for
57
68
  ambiguously acknowledged semantic reports without exposing interaction content
58
69
  ([#4161](https://github.com/f5-sales-demo/xcsh/issues/4161)).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/xcsh",
4
- "version": "21.41.5",
4
+ "version": "21.43.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",
@@ -64,13 +64,13 @@
64
64
  },
65
65
  "dependencies": {
66
66
  "@agentclientprotocol/sdk": "1.4.0",
67
- "@f5-sales-demo/pi-agent-core": "21.41.5",
68
- "@f5-sales-demo/pi-ai": "21.41.5",
69
- "@f5-sales-demo/pi-natives": "21.41.5",
70
- "@f5-sales-demo/pi-resource-management": "21.41.5",
71
- "@f5-sales-demo/pi-tui": "21.41.5",
72
- "@f5-sales-demo/pi-utils": "21.41.5",
73
- "@f5-sales-demo/xcsh-stats": "21.41.5",
67
+ "@f5-sales-demo/pi-agent-core": "21.43.0",
68
+ "@f5-sales-demo/pi-ai": "21.43.0",
69
+ "@f5-sales-demo/pi-natives": "21.43.0",
70
+ "@f5-sales-demo/pi-resource-management": "21.43.0",
71
+ "@f5-sales-demo/pi-tui": "21.43.0",
72
+ "@f5-sales-demo/pi-utils": "21.43.0",
73
+ "@f5-sales-demo/xcsh-stats": "21.43.0",
74
74
  "@mozilla/readability": "^0.6",
75
75
  "@sinclair/typebox": "0.34.52",
76
76
  "@tobilu/qmd": "2.8.3",
@@ -20,7 +20,12 @@ import {
20
20
  MarketplaceManager,
21
21
  resolvePluginDependencyPlan,
22
22
  } from "../extensibility/plugins/marketplace/index.js";
23
- import { describeSetupPlan, executeInstallAuthorizedSetup, executeReviewedSetup } from "../integrations/setup";
23
+ import {
24
+ describeIntegrationSetupNextAction,
25
+ describeSetupPlan,
26
+ executeInstallAuthorizedSetup,
27
+ executeReviewedSetup,
28
+ } from "../integrations/setup";
24
29
  import type { IntegrationHandle } from "../integrations/types";
25
30
  import { theme } from "../modes/theme/theme";
26
31
  import { personProfileService } from "../person-profile/service";
@@ -221,6 +226,8 @@ function matchesIntegration(handle: IntegrationHandle<unknown>, target: string):
221
226
  return handle.id === target || handle.plugin === target || handle.plugin?.split("@")[0] === target;
222
227
  }
223
228
 
229
+ export { describeIntegrationSetupNextAction } from "../integrations/setup";
230
+
224
231
  export function selectSetupIntegration(
225
232
  handles: readonly IntegrationHandle<unknown>[],
226
233
  target: string,
@@ -244,8 +251,7 @@ async function handleIntegrationStatus(args: string[], flags: { json?: boolean }
244
251
  const { value: _, ...status } = await handle.get();
245
252
  return {
246
253
  ...status,
247
- nextAction:
248
- status.state === "setup_required" ? `${APP_NAME} plugin setup ${handle.plugin ?? handle.id}` : undefined,
254
+ nextAction: status.state === "setup_required" ? describeIntegrationSetupNextAction(handle) : undefined,
249
255
  };
250
256
  }),
251
257
  );
@@ -270,6 +276,10 @@ export async function reviewAndExecuteIntegrationSetup(handle: IntegrationHandle
270
276
  if (!plan) throw new Error(`Integration ${handle.id} does not declare setup`);
271
277
  const current = await handle.get();
272
278
  if (current.state === "ready") return current;
279
+ if (plan.guidedAction?.kind === "context_wizard")
280
+ throw new Error(
281
+ `Plugin ${handle.plugin ?? handle.id} setup requires interactive xcsh; run /plugin setup ${handle.plugin ?? handle.id} in the xcsh TUI.`,
282
+ );
273
283
  process.stdout.write(`${describeSetupPlan(handle)}\n`);
274
284
  const prompt = createInterface({ input: process.stdin, output: process.stdout });
275
285
  try {
@@ -335,7 +345,11 @@ async function reportMarketplaceInstallation(
335
345
  const setupHandle = setupHandles.length === 1 ? setupHandles[0] : undefined;
336
346
  const setupStatus = setupHandle ? statuses.find(status => status.id === setupHandle.id) : undefined;
337
347
  const nextAction =
338
- entry.setupRequired && setupStatus?.state !== "ready" ? `${APP_NAME} plugin setup ${plugin}` : undefined;
348
+ entry.setupRequired && setupStatus?.state !== "ready"
349
+ ? setupHandle
350
+ ? describeIntegrationSetupNextAction(setupHandle)
351
+ : `${APP_NAME} plugin setup ${plugin}`
352
+ : undefined;
339
353
  if (flags.json || !process.stdin.isTTY || !process.stdout.isTTY) {
340
354
  const result = {
341
355
  installation: { state: "installed", plugin, marketplace, version: entry.version, scope: entry.scope },
@@ -759,7 +773,7 @@ async function handleInstall(
759
773
  async function handleUninstall(
760
774
  manager: PluginManager,
761
775
  packages: string[],
762
- flags: { json?: boolean; scope?: "user" | "project" },
776
+ flags: { json?: boolean; dryRun?: boolean; scope?: "user" | "project" },
763
777
  ): Promise<void> {
764
778
  if (packages.length === 0) {
765
779
  console.error(chalk.red(`Usage: ${APP_NAME} plugin uninstall <package> ...`));
@@ -777,8 +791,30 @@ async function handleUninstall(
777
791
  if (installedPlugins.has(name) || target.type === "marketplace") {
778
792
  // Exact match against installed marketplace plugin IDs (name@marketplace)
779
793
  try {
794
+ if (flags.dryRun) {
795
+ const preview = await mktMgr.previewUninstallPlugin(name, flags.scope);
796
+ if (flags.json) {
797
+ console.log(
798
+ JSON.stringify(
799
+ {
800
+ action: "uninstall",
801
+ target: preview.pluginId,
802
+ scope: preview.scope,
803
+ dryRun: true,
804
+ installPaths: preview.installPaths,
805
+ },
806
+ null,
807
+ 2,
808
+ ),
809
+ );
810
+ } else {
811
+ console.log(chalk.dim(`[dry-run] Would uninstall ${preview.pluginId} (${preview.scope})`));
812
+ }
813
+ continue;
814
+ }
780
815
  await mktMgr.uninstallPlugin(name, flags.scope);
781
- console.log(chalk.green(`${theme.status.success} Uninstalled ${name}`));
816
+ if (flags.json) console.log(JSON.stringify({ uninstalled: name }));
817
+ else console.log(chalk.green(`${theme.status.success} Uninstalled ${name}`));
782
818
  } catch (err) {
783
819
  console.error(chalk.red(`${theme.status.error} Failed to uninstall ${name}: ${err}`));
784
820
  process.exit(1);
@@ -1292,8 +1328,8 @@ ${chalk.bold("Options:")}
1292
1328
  --json Output as JSON
1293
1329
  --fix Attempt automatic fixes (doctor)
1294
1330
  --force Overwrite without prompting (install)
1295
- --scope <scope> Install scope: user (default) or project (install name@marketplace)
1296
- --dry-run Preview changes without applying (install)
1331
+ --scope <scope> Marketplace install/uninstall scope: user (default) or project
1332
+ --dry-run Preview supported install, uninstall, or upgrade changes
1297
1333
  -l, --local Use project-local overrides
1298
1334
 
1299
1335
  ${chalk.bold("Examples:")}
@@ -45,7 +45,6 @@ interface AppKeybindings {
45
45
  "app.session.deleteNoninvasive": true;
46
46
  "app.tree.foldOrUp": true;
47
47
  "app.tree.unfoldOrDown": true;
48
- "app.plan.toggle": true;
49
48
  "app.history.search": true;
50
49
  "app.stt.toggle": true;
51
50
  }
@@ -78,7 +77,7 @@ export const KEYBINDINGS = {
78
77
  description: "Suspend application",
79
78
  },
80
79
  "app.thinking.cycle": {
81
- defaultKeys: "shift+tab",
80
+ defaultKeys: "alt+.",
82
81
  description: "Cycle thinking level",
83
82
  },
84
83
  "app.thinking.toggle": {
@@ -177,10 +176,6 @@ export const KEYBINDINGS = {
177
176
  defaultKeys: ["ctrl+right", "alt+right"],
178
177
  description: "Unfold or move down",
179
178
  },
180
- "app.plan.toggle": {
181
- defaultKeys: "alt+shift+p",
182
- description: "Toggle plan mode",
183
- },
184
179
  "app.history.search": {
185
180
  defaultKeys: "ctrl+r",
186
181
  description: "Search history",
@@ -205,7 +200,6 @@ const KEYBINDING_NAME_MIGRATIONS = {
205
200
  cycleModelBackward: "app.model.cycleBackward",
206
201
  selectModel: "app.model.select",
207
202
  selectModelTemporary: "app.model.selectTemporary",
208
- togglePlanMode: "app.plan.toggle",
209
203
  historySearch: "app.history.search",
210
204
  expandTools: "app.tools.expand",
211
205
  toggleThinking: "app.thinking.toggle",
@@ -11,7 +11,7 @@ function compareVersions(left: string, right: string): number {
11
11
  }
12
12
 
13
13
  /** Keep historical catalogs available while presenting only current user-facing families. */
14
- const DEFAULT_OPENAI_CODEX_MODEL_IDS = new Set(["gpt-5.6-luna", "gpt-5.6-terra", "gpt-5.6-sol", "gpt-6-astra"]);
14
+ const DEFAULT_OPENAI_CODEX_MODEL_IDS = new Set(["gpt-5.6-terra", "gpt-6-astra", "gpt-6-luna", "gpt-6-sol"]);
15
15
 
16
16
  /** Shared catalog boundary for the TUI and attached human interfaces. */
17
17
  export function filterCurrentBrowserModels(models: readonly Model[]): Model[] {
@@ -50,6 +50,10 @@ export type { CanonicalModelIndex, CanonicalModelRecord, CanonicalModelVariant,
50
50
 
51
51
  export const kNoAuth = NO_AUTH_API_KEY;
52
52
 
53
+ const OPENAI_CODEX_STANDARD_CONTEXT_WINDOW = 272_000;
54
+ const OPENAI_CODEX_MAX_CONTEXT_WINDOW = 1_050_000;
55
+ const OPENAI_CODEX_MAX_CONTEXT_MODEL_IDS = new Set(["gpt-6-luna", "gpt-6-sol"]);
56
+
53
57
  export function isAuthenticated(apiKey: string | undefined | null): apiKey is string {
54
58
  return Boolean(apiKey) && apiKey !== kNoAuth;
55
59
  }
@@ -871,6 +875,7 @@ export class ModelRegistry {
871
875
  #lastDiscoveryWarnings: Map<string, string> = new Map();
872
876
  #hasProbed = false;
873
877
  #refreshQueue: Promise<void> = Promise.resolve();
878
+ #openAICodexMaxContext = false;
874
879
 
875
880
  #enqueueRefresh(operation: () => Promise<void>): Promise<void> {
876
881
  const pending = this.#refreshQueue.then(operation);
@@ -890,7 +895,10 @@ export class ModelRegistry {
890
895
  constructor(
891
896
  readonly authStorage: AuthStorage,
892
897
  modelsPath?: string,
893
- private readonly options: { getProviderOrder?: () => readonly string[] } = {},
898
+ private readonly options: {
899
+ getProviderOrder?: () => readonly string[];
900
+ getOpenAICodexMaxContext?: () => boolean;
901
+ } = {},
894
902
  ) {
895
903
  this.#modelsConfigFile = ModelsConfigFile.relocate(modelsPath);
896
904
  this.#cacheDbPath = modelsPath ? path.join(path.dirname(modelsPath), "models.db") : undefined;
@@ -1042,6 +1050,7 @@ export class ModelRegistry {
1042
1050
  }
1043
1051
 
1044
1052
  #loadModels() {
1053
+ this.#openAICodexMaxContext = this.options.getOpenAICodexMaxContext?.() ?? this.#openAICodexMaxContext;
1045
1054
  // Load custom models from models.json first (to know which providers to override)
1046
1055
  const {
1047
1056
  models: customModels = [],
@@ -1075,6 +1084,25 @@ export class ModelRegistry {
1075
1084
  const combined = this.#mergeCustomModels(withConfigModels, this.#runtimeModelOverlays);
1076
1085
 
1077
1086
  this.#models = this.#applyProviderModelAllowlists(this.#applyModelOverrides(combined, this.#modelOverrides));
1087
+ this.#applyOpenAICodexContextWindow();
1088
+ this.#rebuildCanonicalIndex();
1089
+ }
1090
+
1091
+ #applyOpenAICodexContextWindow(): void {
1092
+ const contextWindow = this.#openAICodexMaxContext
1093
+ ? OPENAI_CODEX_MAX_CONTEXT_WINDOW
1094
+ : OPENAI_CODEX_STANDARD_CONTEXT_WINDOW;
1095
+ for (const model of this.#models) {
1096
+ if (model.provider === "openai-codex" && OPENAI_CODEX_MAX_CONTEXT_MODEL_IDS.has(model.id)) {
1097
+ model.contextWindow = contextWindow;
1098
+ }
1099
+ }
1100
+ }
1101
+
1102
+ /** Update GPT-6 subscription context limits without rebuilding the registry. */
1103
+ setOpenAICodexMaxContext(enabled: boolean): void {
1104
+ this.#openAICodexMaxContext = enabled;
1105
+ this.#applyOpenAICodexContextWindow();
1078
1106
  this.#rebuildCanonicalIndex();
1079
1107
  }
1080
1108
 
@@ -2102,6 +2102,17 @@ export const SETTINGS_SCHEMA = {
2102
2102
  },
2103
2103
  },
2104
2104
 
2105
+ "providers.openaiCodexMaxContext": {
2106
+ type: "boolean",
2107
+ default: false,
2108
+ ui: {
2109
+ tab: "providers",
2110
+ label: "OpenAI Codex Maximum Context",
2111
+ description:
2112
+ "Use the 1.05M-token context window for GPT-6 Luna and Sol (long-context pricing applies above 272K)",
2113
+ },
2114
+ },
2115
+
2105
2116
  "providers.parallelFetch": {
2106
2117
  type: "boolean",
2107
2118
  default: true,
@@ -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": "5.1.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": "Deterministic F5 Distributed Cloud Secure Mesh Site v2 lifecycle for KVM, libvirt, and Terraform-owned FRR routing",\n "version": "2.0.2",\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", "frr", "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 "Docker CLI",\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.2",\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 "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.0",\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.0"\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}\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": "5.1.2",\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": "Deterministic F5 Distributed Cloud Secure Mesh Site v2 lifecycle for KVM, libvirt, and Terraform-owned FRR routing",\n "version": "2.0.2",\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", "frr", "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 "Docker CLI",\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.2",\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 "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.0",\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.0"\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}\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": "f85837e95700ebe73bee7b5ffb6dd67fc46791c1",
5
- "sha256": "46515b473992e35856a550d238581b02554627b75ce9d05aececc913fd423db0",
6
- "capturedAt": "2026-09-23T07:09:59.120Z"
4
+ "commit": "512b3915e18e5bae247f58e2c7e3bbdb94656e7a",
5
+ "sha256": "7e3868a2afd6fbeb31e9d212c30947b9cc6b127ffa8412e9e4f9f06171834251",
6
+ "capturedAt": "2026-09-23T20:05:58.783Z"
7
7
  }
@@ -88,6 +88,12 @@ export interface PluginDependencyPlanItem {
88
88
  dependency: boolean;
89
89
  }
90
90
 
91
+ export interface PluginUninstallPreview {
92
+ pluginId: string;
93
+ scope: "user" | "project";
94
+ installPaths: string[];
95
+ }
96
+
91
97
  function resolvePluginDependencyNames(catalog: MarketplaceCatalog, root: string): string[] {
92
98
  const plugins = new Map(catalog.plugins.map(plugin => [plugin.name, plugin]));
93
99
  const state = new Map<string, "visiting" | "visited">();
@@ -691,7 +697,7 @@ export class MarketplaceManager {
691
697
  return "0.0.0";
692
698
  }
693
699
 
694
- async uninstallPlugin(pluginId: string, scope?: "user" | "project"): Promise<void> {
700
+ async #resolvePluginUninstall(pluginId: string, scope?: "user" | "project") {
695
701
  const parsed = parsePluginId(pluginId);
696
702
  if (!parsed) {
697
703
  throw new Error(`Invalid plugin ID format: "${pluginId}". Expected "name@marketplace".`);
@@ -731,6 +737,23 @@ export class MarketplaceManager {
731
737
  const targetReg = targetScope === "project" ? projectReg : userReg;
732
738
  const registryPath = this.#registryPath(targetScope);
733
739
  await this.#assertNoInstalledDependents(pluginId, targetReg);
740
+ return { targetEntries, targetReg, targetScope, registryPath };
741
+ }
742
+
743
+ async previewUninstallPlugin(pluginId: string, scope?: "user" | "project"): Promise<PluginUninstallPreview> {
744
+ const { targetEntries, targetScope } = await this.#resolvePluginUninstall(pluginId, scope);
745
+ return {
746
+ pluginId,
747
+ scope: targetScope,
748
+ installPaths: targetEntries.map(entry => entry.installPath),
749
+ };
750
+ }
751
+
752
+ async uninstallPlugin(pluginId: string, scope?: "user" | "project"): Promise<void> {
753
+ const { targetEntries, targetReg, targetScope, registryPath } = await this.#resolvePluginUninstall(
754
+ pluginId,
755
+ scope,
756
+ );
734
757
 
735
758
  const updatedReg = removeInstalledPlugin(targetReg, pluginId);
736
759
  await writeInstalledPluginsRegistry(registryPath, updatedReg);
@@ -48,6 +48,7 @@ function freezePlan(plan: IntegrationSetupPlan | undefined): IntegrationSetupPla
48
48
  verification: Object.freeze(
49
49
  plan.verification.map(step => Object.freeze({ ...step, argv: freezeStrings(step.argv) })),
50
50
  ),
51
+ ...(plan.guidedAction ? { guidedAction: Object.freeze({ kind: plan.guidedAction.kind }) } : {}),
51
52
  };
52
53
  return Object.freeze(frozen);
53
54
  }
@@ -58,6 +59,16 @@ function validateArgv(argv: readonly string[]): boolean {
58
59
 
59
60
  function validatePlan(plan: IntegrationSetupPlan | undefined): void {
60
61
  if (!plan) return;
62
+ const guidedActionValid =
63
+ plan.guidedAction === undefined ||
64
+ (typeof plan.guidedAction === "object" &&
65
+ plan.guidedAction !== null &&
66
+ plan.guidedAction.kind === "context_wizard" &&
67
+ Object.keys(plan.guidedAction).length === 1);
68
+ const hasExecutablePlan =
69
+ Array.isArray(plan.steps) &&
70
+ Array.isArray(plan.verification) &&
71
+ (plan.steps.length > 0 || plan.verification.length > 0);
61
72
  if (
62
73
  !Array.isArray(plan.pluginDependencies) ||
63
74
  !Array.isArray(plan.requiredEnvironment) ||
@@ -65,6 +76,9 @@ function validatePlan(plan: IntegrationSetupPlan | undefined): void {
65
76
  !Array.isArray(plan.profileFields) ||
66
77
  !Array.isArray(plan.steps) ||
67
78
  !Array.isArray(plan.verification) ||
79
+ !guidedActionValid ||
80
+ (!plan.guidedAction && !hasExecutablePlan) ||
81
+ (plan.guidedAction !== undefined && hasExecutablePlan) ||
68
82
  plan.steps.some(
69
83
  step =>
70
84
  !step ||
@@ -17,10 +17,28 @@ export interface SetupStepRunnerOptions {
17
17
  readonly nonInteractiveOutput?: "inherit" | "ignore";
18
18
  }
19
19
 
20
+ export function describeIntegrationSetupNextAction(
21
+ handle: Pick<IntegrationHandle<unknown>, "id" | "plugin" | "setupPlan">,
22
+ ): string {
23
+ const target = handle.plugin ?? handle.id;
24
+ return handle.setupPlan?.guidedAction?.kind === "context_wizard"
25
+ ? `Open xcsh interactively and run /plugin setup ${target}`
26
+ : `xcsh plugin setup ${target}`;
27
+ }
28
+
29
+ export function describeInteractiveInstallSetupNextAction(
30
+ plugin: string,
31
+ lifecycle: { readonly setupRequired: boolean; readonly setupAuthorization?: "separate" | "install" },
32
+ ): string | undefined {
33
+ if (!lifecycle.setupRequired || (lifecycle.setupAuthorization ?? "separate") === "install") return undefined;
34
+ return `/plugin setup ${plugin}`;
35
+ }
36
+
20
37
  export function describeInstallSetupOutcome(
21
38
  plugin: string,
22
39
  status: Pick<IntegrationSnapshot<unknown>, "state" | "reason">,
23
40
  dependencyPlan: readonly { readonly pluginId: string }[],
41
+ handles: readonly Pick<IntegrationHandle<unknown>, "id" | "plugin" | "setupPlan">[] = [],
24
42
  ): string {
25
43
  const summary = `${plugin}: ${status.state}${status.reason ? ` (${status.reason})` : ""}`;
26
44
  if (status.state === "ready") return summary;
@@ -28,7 +46,12 @@ export function describeInstallSetupOutcome(
28
46
  status.reason === "dependency_missing"
29
47
  ? dependencyPlan.find(item => item.pluginId.split("@")[0] !== plugin)?.pluginId.split("@")[0]
30
48
  : undefined;
31
- return `${summary}\nnext: xcsh plugin setup ${blockingDependency ?? plugin}`;
49
+ const target = blockingDependency ?? plugin;
50
+ const handle = handles.find(
51
+ candidate => candidate.id === target || candidate.plugin === target || candidate.plugin?.split("@")[0] === target,
52
+ );
53
+ const nextAction = handle ? describeIntegrationSetupNextAction(handle) : `xcsh plugin setup ${target}`;
54
+ return `${summary}\nnext: ${nextAction}`;
32
55
  }
33
56
 
34
57
  export function describeSetupPlan(handle: IntegrationHandle<unknown>): string {
@@ -39,11 +62,17 @@ export function describeSetupPlan(handle: IntegrationHandle<unknown>): string {
39
62
  `Plugin dependencies: ${plan.pluginDependencies.join(", ") || "none"}`,
40
63
  `Required environment names: ${plan.requiredEnvironment.join(", ") || "none"}`,
41
64
  `Person-profile categories: ${plan.profileFields.join(", ") || "none"}`,
42
- "Commands:",
43
- ...plan.steps.map(step => ` ${step.kind}: ${JSON.stringify(step.argv)} (timeout ${step.timeoutMs}ms)`),
44
- "Verification:",
45
- ...plan.verification.map(step => ` ${JSON.stringify(step.argv)} (timeout ${step.timeoutMs}ms)`),
46
65
  ];
66
+ if (plan.guidedAction?.kind === "context_wizard") {
67
+ lines.push("Guided action: native xcsh context wizard");
68
+ } else {
69
+ lines.push(
70
+ "Commands:",
71
+ ...plan.steps.map(step => ` ${step.kind}: ${JSON.stringify(step.argv)} (timeout ${step.timeoutMs}ms)`),
72
+ "Verification:",
73
+ ...plan.verification.map(step => ` ${JSON.stringify(step.argv)} (timeout ${step.timeoutMs}ms)`),
74
+ );
75
+ }
47
76
  return lines.join("\n");
48
77
  }
49
78
 
@@ -86,6 +115,7 @@ export async function executeReviewedSetup<T>(
86
115
  signal?: AbortSignal,
87
116
  ): Promise<IntegrationSnapshot<T>> {
88
117
  if (reviewedPlan !== handle.setupPlan) throw new Error("Setup requires the current reviewed setup plan");
118
+ if (reviewedPlan.guidedAction) throw new Error("Guided setup must run through its native interactive action");
89
119
  for (const step of reviewedPlan.steps) {
90
120
  if (signal?.aborted) throw new Error("Integration setup cancelled");
91
121
  if ((await run(step, signal)) !== 0) throw new Error(`Integration ${step.kind} step failed`);
@@ -34,12 +34,17 @@ export interface IntegrationVerificationStep {
34
34
  readonly timeoutMs: number;
35
35
  }
36
36
 
37
+ export interface IntegrationGuidedSetupAction {
38
+ readonly kind: "context_wizard";
39
+ }
40
+
37
41
  export interface IntegrationSetupPlan {
38
42
  readonly pluginDependencies: readonly string[];
39
43
  readonly requiredEnvironment: readonly string[];
40
44
  readonly profileFields: readonly string[];
41
45
  readonly steps: readonly IntegrationSetupStep[];
42
46
  readonly verification: readonly IntegrationVerificationStep[];
47
+ readonly guidedAction?: IntegrationGuidedSetupAction;
43
48
  }
44
49
 
45
50
  export interface IntegrationDefinition<T> {