@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.
- package/CHANGELOG.md +11 -0
- package/package.json +8 -8
- package/src/cli/plugin-cli.ts +44 -8
- package/src/config/keybindings.ts +1 -7
- package/src/config/model-catalog.ts +1 -1
- package/src/config/model-registry.ts +29 -1
- package/src/config/settings-schema.ts +11 -0
- 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 +24 -1
- package/src/integrations/registry.ts +14 -0
- package/src/integrations/setup.ts +35 -5
- package/src/integrations/types.ts +5 -0
- package/src/internal-urls/api-catalog-index.generated.ts +32340 -26540
- package/src/internal-urls/api-catalog-qmd-index.generated.ts +1 -1
- package/src/internal-urls/api-spec-index.generated.ts +2 -2
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/internal-urls/docs-index.generated.ts +1 -1
- package/src/internal-urls/terraform-index.generated.ts +136 -2078
- package/src/main.ts +1 -2
- package/src/modes/components/custom-editor.ts +15 -2
- package/src/modes/controllers/input-controller.ts +15 -5
- package/src/modes/controllers/login-model.ts +15 -13
- package/src/modes/controllers/selector-controller.ts +5 -0
- package/src/modes/interactive-mode.ts +12 -3
- package/src/modes/utils/hotkeys-markdown.ts +1 -1
- package/src/routing/presets.ts +3 -3
- package/src/routing/subscription-profiles.ts +9 -9
- package/src/sdk.ts +8 -2
- package/src/slash-commands/builtin-registry.ts +16 -3
- package/src/task/executor.ts +29 -4
- package/src/task/index.ts +3 -0
- 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.
|
|
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.
|
|
68
|
-
"@f5-sales-demo/pi-ai": "21.
|
|
69
|
-
"@f5-sales-demo/pi-natives": "21.
|
|
70
|
-
"@f5-sales-demo/pi-resource-management": "21.
|
|
71
|
-
"@f5-sales-demo/pi-tui": "21.
|
|
72
|
-
"@f5-sales-demo/pi-utils": "21.
|
|
73
|
-
"@f5-sales-demo/xcsh-stats": "21.
|
|
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",
|
package/src/cli/plugin-cli.ts
CHANGED
|
@@ -20,7 +20,12 @@ import {
|
|
|
20
20
|
MarketplaceManager,
|
|
21
21
|
resolvePluginDependencyPlan,
|
|
22
22
|
} from "../extensibility/plugins/marketplace/index.js";
|
|
23
|
-
import {
|
|
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"
|
|
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(
|
|
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>
|
|
1296
|
-
--dry-run Preview
|
|
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: "
|
|
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-
|
|
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: {
|
|
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": "
|
|
5
|
-
"sha256": "
|
|
6
|
-
"capturedAt": "2026-09-
|
|
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
|
|
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
|
-
|
|
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> {
|