@f5-sales-demo/xcsh 21.44.0 → 21.44.1
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 +9 -0
- package/package.json +8 -8
- package/src/cli/plugin-cli.ts +102 -36
- package/src/commands/plugin.ts +4 -0
- package/src/extensibility/extensions/runner.ts +2 -1
- package/src/extensibility/plugins/marketplace/builtin-marketplace-snapshot.ts +1 -1
- package/src/extensibility/plugins/marketplace/builtin-marketplace.provenance.json +3 -3
- package/src/extensibility/plugins/marketplace/manager.ts +44 -18
- package/src/internal-urls/api-catalog-qmd-index.generated.ts +2 -2
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/modes/controllers/context-command-controller.ts +25 -1
- package/src/modes/interactive-mode.ts +1 -1
- package/src/slash-commands/builtin-registry.ts +39 -8
- package/src/slash-commands/marketplace-install-parser.ts +38 -3
- package/src/slash-commands/plugin-reviewed-actions.ts +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -57,6 +57,15 @@
|
|
|
57
57
|
|
|
58
58
|
### Fixed
|
|
59
59
|
|
|
60
|
+
- Published KVM 3.0.4 through the built-in marketplace snapshot with immutable source provenance,
|
|
61
|
+
so fresh xcsh installations discover the qualified plugin without a development catalog
|
|
62
|
+
([#4321](https://github.com/f5-sales-demo/xcsh/issues/4321),
|
|
63
|
+
[#4323](https://github.com/f5-sales-demo/xcsh/issues/4323)).
|
|
64
|
+
- Made Platform plugin setup offer sorted activation commands for saved session contexts,
|
|
65
|
+
resolved unique short plugin names during reviewed uninstall while rejecting ambiguity, and
|
|
66
|
+
directed slash-command health checks to the supported `xcsh plugin doctor` CLI. Plugin
|
|
67
|
+
integration status and setup can now select a saved session context explicitly with `--context`
|
|
68
|
+
([#4306](https://github.com/f5-sales-demo/xcsh/issues/4306)).
|
|
60
69
|
- Accepted fully qualified marketplace plugin identifiers in `plugin setup`, matching install,
|
|
61
70
|
upgrade, uninstall, and doctor behavior ([#4288](https://github.com/f5-sales-demo/xcsh/issues/4288)).
|
|
62
71
|
- Added the exact `/plugin setup <plugin>` next action after interactive installation of plugins
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5-sales-demo/xcsh",
|
|
4
|
-
"version": "21.44.
|
|
4
|
+
"version": "21.44.1",
|
|
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.44.
|
|
68
|
-
"@f5-sales-demo/pi-ai": "21.44.
|
|
69
|
-
"@f5-sales-demo/pi-natives": "21.44.
|
|
70
|
-
"@f5-sales-demo/pi-resource-management": "21.44.
|
|
71
|
-
"@f5-sales-demo/pi-tui": "21.44.
|
|
72
|
-
"@f5-sales-demo/pi-utils": "21.44.
|
|
73
|
-
"@f5-sales-demo/xcsh-stats": "21.44.
|
|
67
|
+
"@f5-sales-demo/pi-agent-core": "21.44.1",
|
|
68
|
+
"@f5-sales-demo/pi-ai": "21.44.1",
|
|
69
|
+
"@f5-sales-demo/pi-natives": "21.44.1",
|
|
70
|
+
"@f5-sales-demo/pi-resource-management": "21.44.1",
|
|
71
|
+
"@f5-sales-demo/pi-tui": "21.44.1",
|
|
72
|
+
"@f5-sales-demo/pi-utils": "21.44.1",
|
|
73
|
+
"@f5-sales-demo/xcsh-stats": "21.44.1",
|
|
74
74
|
"@mozilla/readability": "^0.6",
|
|
75
75
|
"@sinclair/typebox": "0.34.52",
|
|
76
76
|
"@tobilu/qmd": "2.8.3",
|
package/src/cli/plugin-cli.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { createInterface } from "node:readline/promises";
|
|
|
9
9
|
import { APP_NAME, getProjectDir } from "@f5-sales-demo/pi-utils";
|
|
10
10
|
import { CliUsageError } from "@f5-sales-demo/pi-utils/cli";
|
|
11
11
|
import chalk from "chalk";
|
|
12
|
+
import { Settings } from "../config/settings";
|
|
12
13
|
import { preloadPluginRoots, resolveOrDefaultProjectRegistryPath } from "../discovery/helpers";
|
|
13
14
|
import { discoverAndLoadExtensions } from "../extensibility/extensions";
|
|
14
15
|
import { PluginManager, parseSettingValue, validateSetting } from "../extensibility/plugins";
|
|
@@ -30,6 +31,16 @@ import {
|
|
|
30
31
|
import type { IntegrationHandle } from "../integrations/types";
|
|
31
32
|
import { theme } from "../modes/theme/theme";
|
|
32
33
|
import { personProfileService } from "../person-profile/service";
|
|
34
|
+
import { ContextError, ContextService, type XCSHContext } from "../services/xcsh-context";
|
|
35
|
+
import {
|
|
36
|
+
deriveTenantFromUrl,
|
|
37
|
+
isInjectableContextEnvKey,
|
|
38
|
+
XCSH_API_TOKEN,
|
|
39
|
+
XCSH_API_URL,
|
|
40
|
+
XCSH_CONTEXT_NAME,
|
|
41
|
+
XCSH_NAMESPACE,
|
|
42
|
+
XCSH_TENANT,
|
|
43
|
+
} from "../services/xcsh-env";
|
|
33
44
|
|
|
34
45
|
// =============================================================================
|
|
35
46
|
// Types
|
|
@@ -64,6 +75,7 @@ export interface PluginCommandArgs {
|
|
|
64
75
|
disable?: string;
|
|
65
76
|
set?: string;
|
|
66
77
|
scope?: "user" | "project";
|
|
78
|
+
context?: string;
|
|
67
79
|
};
|
|
68
80
|
}
|
|
69
81
|
|
|
@@ -145,6 +157,11 @@ export function parsePluginArgs(args: string[]): PluginCommandArgs | undefined {
|
|
|
145
157
|
// --scope with no value following
|
|
146
158
|
console.error(chalk.red(`--scope requires a value: "user" or "project".`));
|
|
147
159
|
process.exit(1);
|
|
160
|
+
} else if (arg === "--context" && i + 1 < args.length && !args[i + 1].startsWith("-")) {
|
|
161
|
+
result.flags.context = args[++i];
|
|
162
|
+
} else if (arg === "--context") {
|
|
163
|
+
console.error(chalk.red("--context requires a saved context name."));
|
|
164
|
+
process.exit(1);
|
|
148
165
|
} else if (!arg.startsWith("-")) {
|
|
149
166
|
result.args.push(arg);
|
|
150
167
|
}
|
|
@@ -166,6 +183,8 @@ export { classifyInstallTarget } from "./classify-install-target";
|
|
|
166
183
|
*/
|
|
167
184
|
export async function runPluginCommand(cmd: PluginCommandArgs): Promise<void> {
|
|
168
185
|
const manager = new PluginManager();
|
|
186
|
+
if (cmd.flags.context && cmd.action !== "status" && cmd.action !== "setup")
|
|
187
|
+
throw new CliUsageError("plugin --context is supported only for integration status or setup");
|
|
169
188
|
|
|
170
189
|
switch (cmd.action) {
|
|
171
190
|
case "install":
|
|
@@ -243,34 +262,78 @@ export function selectSetupIntegration(
|
|
|
243
262
|
return setupMatches[0];
|
|
244
263
|
}
|
|
245
264
|
|
|
246
|
-
|
|
247
|
-
|
|
265
|
+
function contextEnvironment(context: XCSHContext): Record<string, string> {
|
|
266
|
+
const environment: Record<string, string> = {
|
|
267
|
+
[XCSH_API_URL]: context.apiUrl,
|
|
268
|
+
[XCSH_API_TOKEN]: context.apiToken,
|
|
269
|
+
[XCSH_NAMESPACE]: context.defaultNamespace,
|
|
270
|
+
[XCSH_CONTEXT_NAME]: context.name,
|
|
271
|
+
};
|
|
272
|
+
const tenant = deriveTenantFromUrl(context.apiUrl);
|
|
273
|
+
if (tenant) environment[XCSH_TENANT] = tenant;
|
|
274
|
+
for (const [name, value] of Object.entries(context.env ?? {})) {
|
|
275
|
+
if (isInjectableContextEnvKey(name) && value) environment[name] = value;
|
|
276
|
+
}
|
|
277
|
+
return environment;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async function withPluginContext<T>(name: string | undefined, run: () => Promise<T>): Promise<T> {
|
|
281
|
+
if (!name) return run();
|
|
282
|
+
let context: XCSHContext;
|
|
283
|
+
try {
|
|
284
|
+
await Settings.init({ cwd: getProjectDir() });
|
|
285
|
+
const service = await ContextService.getOrInit(undefined, getProjectDir());
|
|
286
|
+
const review = service.prepareActivation(name);
|
|
287
|
+
context = await service.activate(name, { revision: review.revision, beforeCommit: () => {} });
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (error instanceof ContextError) throw new CliUsageError(error.message);
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
const previous = new Map<string, string | undefined>();
|
|
293
|
+
for (const [key, value] of Object.entries(contextEnvironment(context))) {
|
|
294
|
+
previous.set(key, process.env[key]);
|
|
295
|
+
if (!process.env[key]) process.env[key] = value;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
return await run();
|
|
299
|
+
} finally {
|
|
300
|
+
for (const [key, value] of previous) {
|
|
301
|
+
if (value === undefined) delete process.env[key];
|
|
302
|
+
else process.env[key] = value;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
async function handleIntegrationStatus(args: string[], flags: { json?: boolean; context?: string }): Promise<void> {
|
|
308
|
+
if (args.length > 1) throw new Error(`Usage: ${APP_NAME} plugin status [plugin] [--context <name>] [--json]`);
|
|
248
309
|
const handles = await loadIntegrationHandles();
|
|
249
310
|
const selected = args[0] ? handles.filter(handle => matchesIntegration(handle, args[0])) : handles;
|
|
250
311
|
if (args[0] && !selected.length) throw new Error(`No enabled integration is registered for ${args[0]}`);
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if (flags.json) {
|
|
261
|
-
process.stdout.write(`${JSON.stringify({ integrations: statuses })}\n`);
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
if (!statuses.length) {
|
|
265
|
-
process.stdout.write("No enabled plugin integrations are registered.\n");
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
for (const status of statuses) {
|
|
269
|
-
process.stdout.write(
|
|
270
|
-
`${status.plugin ?? status.id}: ${status.state}${status.reason ? ` (${status.reason})` : ""}\n`,
|
|
312
|
+
await withPluginContext(flags.context, async () => {
|
|
313
|
+
const statuses = await Promise.all(
|
|
314
|
+
selected.map(async handle => {
|
|
315
|
+
const { value: _, ...status } = await handle.get();
|
|
316
|
+
return {
|
|
317
|
+
...status,
|
|
318
|
+
nextAction: status.state === "setup_required" ? describeIntegrationSetupNextAction(handle) : undefined,
|
|
319
|
+
};
|
|
320
|
+
}),
|
|
271
321
|
);
|
|
272
|
-
if (
|
|
273
|
-
|
|
322
|
+
if (flags.json) {
|
|
323
|
+
process.stdout.write(`${JSON.stringify({ integrations: statuses })}\n`);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if (!statuses.length) {
|
|
327
|
+
process.stdout.write("No enabled plugin integrations are registered.\n");
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
for (const status of statuses) {
|
|
331
|
+
process.stdout.write(
|
|
332
|
+
`${status.plugin ?? status.id}: ${status.state}${status.reason ? ` (${status.reason})` : ""}\n`,
|
|
333
|
+
);
|
|
334
|
+
if (status.nextAction) process.stdout.write(` next: ${status.nextAction}\n`);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
274
337
|
}
|
|
275
338
|
|
|
276
339
|
export async function reviewAndExecuteIntegrationSetup(handle: IntegrationHandle<unknown>) {
|
|
@@ -295,20 +358,23 @@ export async function reviewAndExecuteIntegrationSetup(handle: IntegrationHandle
|
|
|
295
358
|
return result;
|
|
296
359
|
}
|
|
297
360
|
|
|
298
|
-
async function handleIntegrationSetup(args: string[], flags: { json?: boolean }): Promise<void> {
|
|
361
|
+
async function handleIntegrationSetup(args: string[], flags: { json?: boolean; context?: string }): Promise<void> {
|
|
299
362
|
if (flags.json) throw new CliUsageError("plugin setup is human-only and does not accept --json");
|
|
300
|
-
if (args.length !== 1) throw new Error(`Usage: ${APP_NAME} plugin setup <plugin
|
|
363
|
+
if (args.length !== 1) throw new Error(`Usage: ${APP_NAME} plugin setup <plugin> [--context <name>]`);
|
|
301
364
|
if (!process.stdin.isTTY || !process.stdout.isTTY) throw new Error("Plugin setup requires an interactive terminal");
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
365
|
+
const handles = await loadIntegrationHandles();
|
|
366
|
+
await withPluginContext(flags.context, async () => {
|
|
367
|
+
const handle = selectSetupIntegration(handles, args[0]);
|
|
368
|
+
const current = await handle.get();
|
|
369
|
+
if (current.state === "ready") {
|
|
370
|
+
process.stdout.write(`${handle.plugin ?? handle.id}: ready (setup is not required)\n`);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const result = await reviewAndExecuteIntegrationSetup(handle);
|
|
374
|
+
process.stdout.write(
|
|
375
|
+
`${handle.plugin ?? handle.id}: ${result.state}${result.reason ? ` (${result.reason})` : ""}\n`,
|
|
376
|
+
);
|
|
377
|
+
});
|
|
312
378
|
}
|
|
313
379
|
|
|
314
380
|
async function reportMarketplaceInstallation(
|
package/src/commands/plugin.ts
CHANGED
|
@@ -51,6 +51,9 @@ export default class Plugin extends Command {
|
|
|
51
51
|
description: 'Install scope: "user" (default) or "project"',
|
|
52
52
|
options: ["user", "project"],
|
|
53
53
|
}),
|
|
54
|
+
context: Flags.string({
|
|
55
|
+
description: "Use a saved context for integration status or setup",
|
|
56
|
+
}),
|
|
54
57
|
};
|
|
55
58
|
|
|
56
59
|
async run(): Promise<void> {
|
|
@@ -71,6 +74,7 @@ export default class Plugin extends Command {
|
|
|
71
74
|
disable: flags.disable,
|
|
72
75
|
set: flags.set,
|
|
73
76
|
scope: flags.scope as "user" | "project" | undefined,
|
|
77
|
+
context: flags.context,
|
|
74
78
|
},
|
|
75
79
|
};
|
|
76
80
|
|
|
@@ -256,7 +256,7 @@ export class ExtensionRunner {
|
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
/** Replace every registration surface after marketplace state changes. */
|
|
259
|
-
reloadExtensions(extensions: readonly Extension[], runtime: ExtensionRuntime): void {
|
|
259
|
+
async reloadExtensions(extensions: readonly Extension[], runtime: ExtensionRuntime): Promise<void> {
|
|
260
260
|
const activeOwners = new Set(extensions.map(extension => extension.resolvedPath));
|
|
261
261
|
for (const extension of this.extensions) {
|
|
262
262
|
if (activeOwners.has(extension.resolvedPath)) continue;
|
|
@@ -269,6 +269,7 @@ export class ExtensionRunner {
|
|
|
269
269
|
if (this.#initialization) {
|
|
270
270
|
const { actions, contextActions, commandContextActions, uiContext } = this.#initialization;
|
|
271
271
|
this.initialize(actions, contextActions, commandContextActions, uiContext);
|
|
272
|
+
await this.emit({ type: "session_start" });
|
|
272
273
|
}
|
|
273
274
|
}
|
|
274
275
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
const builtinMarketplaceSnapshot =
|
|
2
|
-
'{\n "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",\n "name": "f5-sales-demo-marketplace",\n "version": "1.0.0",\n "metadata": {\n "description": "Claude Code plugins for f5-sales-demo documentation repositories"\n },\n "owner": {\n "name": "f5-sales-demo",\n "url": "https://github.com/f5-sales-demo"\n },\n "plugins": [\n {\n "name": "docs-tools",\n "description": "MDX content validation and review tools for f5-sales-demo docs repos",\n "version": "1.1.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-tools",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-tools",\n "category": "productivity",\n "keywords": ["mdx", "documentation", "validation", "starlight", "astro"],\n "tags": ["docs", "linting", "content-review", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "sales-engineer",\n "description": "Sales Engineer persona framework for F5 XC demo repositories — demo execution, environment operations, presentation, Q&A, post-session debrief",\n "version": "1.0.12",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/sales-engineer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/sales-engineer",\n "category": "productivity",\n "keywords": ["sales-engineer", "demo", "persona", "presentation", "f5xc"],\n "tags": ["demo", "sales", "persona", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Sales engineering content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "docs-pipeline",\n "description": "Documentation pipeline architecture — config ownership, release dispatch chain, content authoring, managed files, local preview",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/docs-pipeline",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/docs-pipeline",\n "category": "productivity",\n "keywords": ["docs", "pipeline", "astro", "starlight", "content", "authoring"],\n "tags": ["docs", "pipeline", "content", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Documentation pipeline content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "brand",\n "description": "F5 corporate branding enforcement — colors, typography, logos, icons, accessibility, and visual identity standards across all content types",\n "version": "1.0.6",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/brand",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/brand",\n "category": "productivity",\n "keywords": ["brand", "design-system", "colors", "typography", "accessibility"],\n "tags": ["brand", "design", "visual-identity", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["Brand guidance content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "meddpicc",\n "description": "MEDDPICC sales qualification and deal-execution framework — evidence-based deal management, stakeholder mapping, mutual action plans, and forecast integrity for complex enterprise B2B sales",\n "version": "7.5.9",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/meddpicc",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/meddpicc",\n "category": "productivity",\n "keywords": [\n "meddpicc",\n "sales-qualification",\n "deal-management",\n "enterprise-sales",\n "forecast",\n "champion",\n "economic-buyer",\n "mutual-action-plan",\n "f5xc"\n ],\n "tags": ["sales", "qualification", "deal-management", "forecast", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["MEDDPICC content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "devcontainer",\n "description": "Container awareness — tool catalog, self-identity, self-diagnosis, and maintenance for the f5-sales-demo devcontainer",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/devcontainer",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/devcontainer",\n "category": "productivity",\n "keywords": ["devcontainer", "tools", "catalog", "cli", "inventory", "container"],\n "tags": ["devcontainer", "tools", "catalog", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["devcontainer"],\n "requirements": ["A supported development container runtime"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "platform",\n "description": "Provider-neutral F5 Distributed Cloud Secure Mesh Site v2 capabilities, configuration, bootstrap, and status tools",\n "version": "6.0.1",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/platform",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/platform",\n "category": "productivity",\n "keywords": [\n "console",\n "browser",\n "automation",\n "azure-sso",\n "mcp",\n "chrome-devtools",\n "f5xc",\n "api",\n "rest",\n "platform",\n "openapi",\n "crud",\n "spec-aware"\n ],\n "tags": ["console", "browser", "automation", "f5xc", "api", "platform", "openapi"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["platform"],\n "requirements": ["F5 Distributed Cloud API URL and token environment variables"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "osint-framework",\n "description": "OSINT Framework tool catalog and investigation skills — 1,064 free intelligence-gathering tools across 34 categories, mapped from osintframework.com. Category-based skills, executable investigation pipelines, CLI tool execution, and OPSEC-aware workflows.",\n "version": "1.0.8",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/osint-framework",\n "keywords": ["osint", "reconnaissance", "intelligence", "investigation", "security"],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/osint-framework",\n "category": "security",\n "tags": ["osint", "recon", "security", "intelligence"],\n "lifecycle": {\n "mode": "content",\n "integrations": [],\n "requirements": ["OSINT framework content only"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "firecrawl",\n "description": "Local self-hosted firecrawl web scraping — scrape, crawl, and map websites via the local firecrawl API on port 3002. No API keys, no subscriptions, fully open-source.",\n "version": "1.2.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/firecrawl",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/firecrawl",\n "category": "productivity",\n "keywords": ["firecrawl", "scrape", "crawl", "web-scraping", "markdown", "self-hosted", "local", "open-source"],\n "tags": ["firecrawl", "scraping", "web", "local"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["firecrawl"],\n "requirements": ["A reachable local Firecrawl service"],\n "setupRequired": true,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "salesforce",\n "description": "Salesforce pipeline intelligence with shared lifecycle setup, account discovery, context, and reporting tools",\n "version": "1.5.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/salesforce",\n "keywords": [\n "salesforce",\n "sf",\n "apex",\n "lwc",\n "soql",\n "metadata",\n "deploy",\n "testing",\n "sfdx",\n "agentforce",\n "pipeline",\n "xcsh"\n ],\n "license": "Apache-2.0",\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "source": "./plugins/salesforce",\n "category": "development",\n "tags": ["salesforce", "development", "cli", "crm", "xcsh-extension"],\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["salesforce"],\n "requirements": ["Salesforce CLI", "An authenticated default Salesforce org"],\n "setupRequired": true,\n "collectedData": ["accounts", "identifiers", "business_profile"],\n "pluginDependencies": []\n }\n },\n {\n "name": "cloudstatus",\n "description": "Live cloud status and Internet network intelligence for xcsh — current incidents, routing, registration, RPKI, peering, facilities, F5 Regional Edge evidence, and bounded path diagnostics",\n "version": "1.7.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/cloudstatus",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/cloudstatus",\n "category": "productivity",\n "keywords": [\n "status",\n "monitoring",\n "incidents",\n "maintenance",\n "statuspage",\n "operational-intelligence",\n "network-intelligence",\n "bgp",\n "rdap",\n "rpki",\n "routing",\n "location",\n "peeringdb",\n "facilities",\n "f5xc",\n "atlassian"\n ],\n "tags": ["status", "network-intelligence", "routing", "peering", "f5xc"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "lifecycle": {\n "mode": "on_demand",\n "integrations": ["cloudstatus"],\n "requirements": ["Network access when a cloud-status command is invoked"],\n "setupRequired": false,\n "collectedData": [],\n "pluginDependencies": []\n }\n },\n {\n "name": "azure",\n "description": "Azure CLI integration and deterministic F5 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "4.4.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/azure",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/azure",\n "category": "development",\n "keywords": ["azure", "az", "cloud", "f5xc", "customer-edge", "secure-mesh-site"],\n "tags": ["azure", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["azure"],\n "requirements": ["Azure CLI", "An authenticated Azure account"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "aws",\n "description": "AWS CLI integration and deterministic F5 Secure Mesh Site v2 Customer Edge discovery, planning, lifecycle, and diagnostics",\n "version": "2.1.0",\n "homepage": "https://github.com/f5-sales-demo/marketplace/tree/main/plugins/aws",\n "license": "Apache-2.0",\n "author": {\n "name": "f5-sales-demo"\n },\n "source": "./plugins/aws",\n "category": "development",\n "keywords": ["aws", "amazon", "cloud", "f5xc", "customer-edge", "secure-mesh-site", "tgw", "nlb"],\n "tags": ["aws", "cloud", "f5xc", "customer-edge", "xcsh-extension"],\n "repository": "https://github.com/f5-sales-demo/marketplace",\n "recommended": true,\n "lifecycle": {\n "mode": "integrated",\n "integrations": ["aws"],\n "requirements": ["AWS CLI", "AWS credentials or an authenticated SSO profile"],\n "setupRequired": true,\n "collectedData": ["accounts"],\n "pluginDependencies": ["platform"]\n }\n },\n {\n "name": "kvm",\n "description": "Dual-NIC KVM Secure Mesh Site v2 with isolated SLO, home-LAN SLI, inside VIP, and rollback-protected host preparation",\n "version": "3.0.0",\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.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.2",\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.2"\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": "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.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.2",\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.2"\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": "
|
|
5
|
-
"sha256": "
|
|
6
|
-
"capturedAt": "2026-09-
|
|
4
|
+
"commit": "748c48091741810c56dcdc418b881536ff2d61d9",
|
|
5
|
+
"sha256": "5c86fd246160eccaf0e961080000d6df73ff8c5828fcfe545860c32e8c032ba4",
|
|
6
|
+
"capturedAt": "2026-09-25T09:36:59.948Z"
|
|
7
7
|
}
|
|
@@ -42,7 +42,7 @@ import type {
|
|
|
42
42
|
MarketplacePluginEntry,
|
|
43
43
|
MarketplaceRegistryEntry,
|
|
44
44
|
} from "./types";
|
|
45
|
-
import { buildPluginId, isInstalledPluginEffectivelyEnabled, parsePluginId } from "./types";
|
|
45
|
+
import { buildPluginId, isInstalledPluginEffectivelyEnabled, isValidNameSegment, parsePluginId } from "./types";
|
|
46
46
|
|
|
47
47
|
// ── Options ──────────────────────────────────────────────────────────────────
|
|
48
48
|
|
|
@@ -697,19 +697,38 @@ export class MarketplaceManager {
|
|
|
697
697
|
return "0.0.0";
|
|
698
698
|
}
|
|
699
699
|
|
|
700
|
-
async
|
|
701
|
-
|
|
702
|
-
if (!
|
|
703
|
-
throw new Error(`Invalid plugin ID format: "${pluginId}". Expected "name@marketplace".`);
|
|
700
|
+
async resolveInstalledPluginId(pluginId: string, scope?: "user" | "project"): Promise<string> {
|
|
701
|
+
if (parsePluginId(pluginId)) return pluginId;
|
|
702
|
+
if (!isValidNameSegment(pluginId)) {
|
|
703
|
+
throw new Error(`Invalid plugin ID format: "${pluginId}". Expected "name" or "name@marketplace".`);
|
|
704
704
|
}
|
|
705
705
|
|
|
706
|
-
const {
|
|
706
|
+
const { userReg, projectReg } = await this.#findInBothRegistries(pluginId);
|
|
707
|
+
const registries = scope === "user" ? [userReg] : scope === "project" ? [projectReg] : [userReg, projectReg];
|
|
708
|
+
const matches = new Set<string>();
|
|
709
|
+
for (const registry of registries) {
|
|
710
|
+
for (const [installedId, entries] of Object.entries(registry.plugins)) {
|
|
711
|
+
if (entries.length > 0 && parsePluginId(installedId)?.name === pluginId) matches.add(installedId);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
const candidates = [...matches].sort();
|
|
715
|
+
if (candidates.length === 0) throw new Error(`Plugin "${pluginId}" is not installed`);
|
|
716
|
+
if (candidates.length > 1) {
|
|
717
|
+
throw new Error(`Plugin name "${pluginId}" is ambiguous. Use one of: ${candidates.join(", ")}`);
|
|
718
|
+
}
|
|
719
|
+
return candidates[0]!;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
async #resolvePluginUninstall(pluginId: string, scope?: "user" | "project") {
|
|
723
|
+
const resolvedPluginId = await this.resolveInstalledPluginId(pluginId, scope);
|
|
724
|
+
|
|
725
|
+
const { userEntries, projectEntries, userReg, projectReg } = await this.#findInBothRegistries(resolvedPluginId);
|
|
707
726
|
|
|
708
727
|
const inUser = userEntries && userEntries.length > 0;
|
|
709
728
|
const inProject = projectEntries && projectEntries.length > 0;
|
|
710
729
|
|
|
711
730
|
if (!inUser && !inProject) {
|
|
712
|
-
throw new Error(`Plugin "${
|
|
731
|
+
throw new Error(`Plugin "${resolvedPluginId}" is not installed`);
|
|
713
732
|
}
|
|
714
733
|
|
|
715
734
|
// Disambiguation: if installed in both scopes and no explicit scope, require one.
|
|
@@ -736,26 +755,33 @@ export class MarketplaceManager {
|
|
|
736
755
|
const targetEntries = targetScope === "project" ? projectEntries! : userEntries!;
|
|
737
756
|
const targetReg = targetScope === "project" ? projectReg : userReg;
|
|
738
757
|
const registryPath = this.#registryPath(targetScope);
|
|
739
|
-
await this.#assertNoInstalledDependents(
|
|
740
|
-
return { targetEntries, targetReg, targetScope, registryPath };
|
|
758
|
+
await this.#assertNoInstalledDependents(resolvedPluginId, targetReg);
|
|
759
|
+
return { pluginId: resolvedPluginId, targetEntries, targetReg, targetScope, registryPath };
|
|
741
760
|
}
|
|
742
761
|
|
|
743
762
|
async previewUninstallPlugin(pluginId: string, scope?: "user" | "project"): Promise<PluginUninstallPreview> {
|
|
744
|
-
const {
|
|
763
|
+
const {
|
|
764
|
+
pluginId: resolvedPluginId,
|
|
765
|
+
targetEntries,
|
|
766
|
+
targetScope,
|
|
767
|
+
} = await this.#resolvePluginUninstall(pluginId, scope);
|
|
745
768
|
return {
|
|
746
|
-
pluginId,
|
|
769
|
+
pluginId: resolvedPluginId,
|
|
747
770
|
scope: targetScope,
|
|
748
771
|
installPaths: targetEntries.map(entry => entry.installPath),
|
|
749
772
|
};
|
|
750
773
|
}
|
|
751
774
|
|
|
752
775
|
async uninstallPlugin(pluginId: string, scope?: "user" | "project"): Promise<void> {
|
|
753
|
-
const {
|
|
754
|
-
pluginId,
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
776
|
+
const {
|
|
777
|
+
pluginId: resolvedPluginId,
|
|
778
|
+
targetEntries,
|
|
779
|
+
targetReg,
|
|
780
|
+
targetScope,
|
|
781
|
+
registryPath,
|
|
782
|
+
} = await this.#resolvePluginUninstall(pluginId, scope);
|
|
783
|
+
|
|
784
|
+
const updatedReg = removeInstalledPlugin(targetReg, resolvedPluginId);
|
|
759
785
|
await writeInstalledPluginsRegistry(registryPath, updatedReg);
|
|
760
786
|
|
|
761
787
|
// Read both registries AFTER removal — only delete paths no longer referenced by either.
|
|
@@ -778,7 +804,7 @@ export class MarketplaceManager {
|
|
|
778
804
|
|
|
779
805
|
this.#clearCache();
|
|
780
806
|
|
|
781
|
-
logger.debug("Plugin uninstalled", { pluginId, scope: targetScope });
|
|
807
|
+
logger.debug("Plugin uninstalled", { pluginId: resolvedPluginId, scope: targetScope });
|
|
782
808
|
}
|
|
783
809
|
|
|
784
810
|
// ── Plugin state ──────────────────────────────────────────────────────────
|