@f5xc-salesdemos/xcsh 19.5.0 → 19.5.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/package.json +7 -7
- package/src/extensibility/plugins/marketplace/manager.ts +3 -1
- package/src/extensibility/plugins/marketplace/types.ts +2 -0
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/modes/components/plugins/plugin-dashboard.ts +2 -2
- package/src/modes/components/plugins/plugin-inspector-pane.ts +1 -1
- package/src/modes/components/plugins/plugin-list-pane.ts +2 -2
- package/src/modes/components/plugins/state-manager.ts +7 -4
- package/src/modes/components/plugins/types.ts +2 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5xc-salesdemos/xcsh",
|
|
4
|
-
"version": "19.5.
|
|
4
|
+
"version": "19.5.1",
|
|
5
5
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
6
6
|
"homepage": "https://github.com/f5xc-salesdemos/xcsh",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@agentclientprotocol/sdk": "0.16.1",
|
|
52
52
|
"@mozilla/readability": "^0.6",
|
|
53
|
-
"@f5xc-salesdemos/xcsh-stats": "19.5.
|
|
54
|
-
"@f5xc-salesdemos/pi-agent-core": "19.5.
|
|
55
|
-
"@f5xc-salesdemos/pi-ai": "19.5.
|
|
56
|
-
"@f5xc-salesdemos/pi-natives": "19.5.
|
|
57
|
-
"@f5xc-salesdemos/pi-tui": "19.5.
|
|
58
|
-
"@f5xc-salesdemos/pi-utils": "19.5.
|
|
53
|
+
"@f5xc-salesdemos/xcsh-stats": "19.5.1",
|
|
54
|
+
"@f5xc-salesdemos/pi-agent-core": "19.5.1",
|
|
55
|
+
"@f5xc-salesdemos/pi-ai": "19.5.1",
|
|
56
|
+
"@f5xc-salesdemos/pi-natives": "19.5.1",
|
|
57
|
+
"@f5xc-salesdemos/pi-tui": "19.5.1",
|
|
58
|
+
"@f5xc-salesdemos/pi-utils": "19.5.1",
|
|
59
59
|
"@sinclair/typebox": "^0.34",
|
|
60
60
|
"@xterm/headless": "^6.0",
|
|
61
61
|
"ajv": "^8.20",
|
|
@@ -323,13 +323,15 @@ export class MarketplaceManager {
|
|
|
323
323
|
const now = new Date().toISOString();
|
|
324
324
|
// Carry over enabled flag from existing entry — a disabled plugin must stay disabled after upgrade
|
|
325
325
|
const wasDisabled = existing?.some(e => e.enabled === false);
|
|
326
|
+
// Honor defaultEnabled from catalog — new installs with defaultEnabled: false start disabled
|
|
327
|
+
const defaultDisabled = !existing && pluginEntry.defaultEnabled === false;
|
|
326
328
|
const installedEntry: InstalledPluginEntry = {
|
|
327
329
|
scope,
|
|
328
330
|
installPath: cachePath,
|
|
329
331
|
version,
|
|
330
332
|
installedAt: now,
|
|
331
333
|
lastUpdated: now,
|
|
332
|
-
...(wasDisabled ? { enabled: false } : {}),
|
|
334
|
+
...(wasDisabled || defaultDisabled ? { enabled: false } : {}),
|
|
333
335
|
};
|
|
334
336
|
|
|
335
337
|
const freshInstReg = await readInstalledPluginsRegistry(registryPath);
|
|
@@ -76,6 +76,7 @@ export interface MarketplacePluginAuthor {
|
|
|
76
76
|
|
|
77
77
|
export interface MarketplacePluginEntry {
|
|
78
78
|
name: string;
|
|
79
|
+
displayName?: string;
|
|
79
80
|
source: PluginSource;
|
|
80
81
|
description?: string;
|
|
81
82
|
version?: string;
|
|
@@ -87,6 +88,7 @@ export interface MarketplacePluginEntry {
|
|
|
87
88
|
category?: string;
|
|
88
89
|
tags?: string[];
|
|
89
90
|
strict?: boolean;
|
|
91
|
+
defaultEnabled?: boolean;
|
|
90
92
|
commands?: string | string[];
|
|
91
93
|
agents?: string | string[];
|
|
92
94
|
hooks?: string | Record<string, unknown>;
|
|
@@ -17,17 +17,17 @@ export interface BuildInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const BUILD_INFO: BuildInfo = {
|
|
20
|
-
"version": "19.5.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "19.5.1",
|
|
21
|
+
"commit": "9c15a98f105051030aa1e0f5376d315d0214e8fd",
|
|
22
|
+
"shortCommit": "9c15a98",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v19.5.
|
|
25
|
-
"commitDate": "2026-06-
|
|
26
|
-
"buildDate": "2026-06-04T17:
|
|
24
|
+
"tag": "v19.5.1",
|
|
25
|
+
"commitDate": "2026-06-04T17:32:07Z",
|
|
26
|
+
"buildDate": "2026-06-04T17:56:43.676Z",
|
|
27
27
|
"dirty": true,
|
|
28
28
|
"prNumber": "",
|
|
29
29
|
"repoUrl": "https://github.com/f5xc-salesdemos/xcsh",
|
|
30
30
|
"repoSlug": "f5xc-salesdemos/xcsh",
|
|
31
|
-
"commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/
|
|
32
|
-
"releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v19.5.
|
|
31
|
+
"commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/9c15a98f105051030aa1e0f5376d315d0214e8fd",
|
|
32
|
+
"releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v19.5.1"
|
|
33
33
|
};
|
|
@@ -251,7 +251,7 @@ export class PluginDashboard extends Container {
|
|
|
251
251
|
if (!plugin) return;
|
|
252
252
|
const tabId = this.#activeTabId();
|
|
253
253
|
|
|
254
|
-
if (tabId === "
|
|
254
|
+
if (tabId === "discover" && !plugin.installed) {
|
|
255
255
|
await this.#installPlugin(plugin);
|
|
256
256
|
} else if (tabId === "updates" && plugin.hasUpdate) {
|
|
257
257
|
await this.#upgradePlugin(plugin);
|
|
@@ -320,7 +320,7 @@ export class PluginDashboard extends Container {
|
|
|
320
320
|
#getHelpText(): string {
|
|
321
321
|
const tabId = this.#activeTabId();
|
|
322
322
|
switch (tabId) {
|
|
323
|
-
case "
|
|
323
|
+
case "discover":
|
|
324
324
|
return " ↑/↓: navigate Enter: install Tab: next tab Ctrl+R: reload Esc: close";
|
|
325
325
|
case "updates":
|
|
326
326
|
return " ↑/↓: navigate Enter: upgrade Tab: next tab Ctrl+R: reload Esc: close";
|
|
@@ -14,7 +14,7 @@ export class PluginInspectorPane implements Component {
|
|
|
14
14
|
const lines: string[] = [];
|
|
15
15
|
const p = this.plugin;
|
|
16
16
|
|
|
17
|
-
lines.push(theme.bold(theme.fg("contentAccent", replaceTabs(p.name))));
|
|
17
|
+
lines.push(theme.bold(theme.fg("contentAccent", replaceTabs(p.displayName || p.name))));
|
|
18
18
|
lines.push("");
|
|
19
19
|
|
|
20
20
|
lines.push(`${theme.fg("muted", "Source:")} ${p.source}`);
|
|
@@ -22,7 +22,7 @@ export class PluginListPane implements Component {
|
|
|
22
22
|
|
|
23
23
|
if (this.plugins.length === 0) {
|
|
24
24
|
const msg =
|
|
25
|
-
this.activeTab === "
|
|
25
|
+
this.activeTab === "discover"
|
|
26
26
|
? "No plugins available. Add a marketplace first."
|
|
27
27
|
: this.activeTab === "updates"
|
|
28
28
|
? "All plugins are up to date."
|
|
@@ -71,7 +71,7 @@ export class PluginListPane implements Component {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
parts.push(" ");
|
|
74
|
-
parts.push(plugin.name);
|
|
74
|
+
parts.push(plugin.displayName || plugin.name);
|
|
75
75
|
|
|
76
76
|
if (plugin.version) {
|
|
77
77
|
parts.push(theme.fg("dim", ` v${plugin.version}`));
|
|
@@ -48,6 +48,7 @@ function catalogToDashboard(entry: MarketplacePluginEntry, marketplace: string):
|
|
|
48
48
|
return {
|
|
49
49
|
id: `${entry.name}@${marketplace}`,
|
|
50
50
|
name: normalizePluginDisplayName(entry.name),
|
|
51
|
+
displayName: entry.displayName,
|
|
51
52
|
marketplace,
|
|
52
53
|
source: "marketplace",
|
|
53
54
|
version: entry.version,
|
|
@@ -96,6 +97,7 @@ export async function loadAllPlugins(mgr: MarketplaceManager, npmMgr: PluginMana
|
|
|
96
97
|
if (installedIds.has(pluginId)) {
|
|
97
98
|
const existing = plugins.find(p => p.id === pluginId);
|
|
98
99
|
if (existing) {
|
|
100
|
+
existing.displayName = existing.displayName || entry.displayName;
|
|
99
101
|
existing.description = existing.description || entry.description;
|
|
100
102
|
existing.category = existing.category || entry.category;
|
|
101
103
|
existing.tags = existing.tags || entry.tags;
|
|
@@ -124,12 +126,12 @@ export async function loadAllPlugins(mgr: MarketplaceManager, npmMgr: PluginMana
|
|
|
124
126
|
export function buildTabs(plugins: DashboardPlugin[]): PluginTab[] {
|
|
125
127
|
const tabs: PluginTab[] = [];
|
|
126
128
|
const installedCount = plugins.filter(p => p.installed).length;
|
|
127
|
-
const
|
|
129
|
+
const discoverCount = plugins.filter(p => !p.installed).length;
|
|
128
130
|
const updatesCount = plugins.filter(p => p.hasUpdate).length;
|
|
129
131
|
|
|
130
132
|
tabs.push({ id: "installed", label: "Installed", count: installedCount });
|
|
131
|
-
if (
|
|
132
|
-
tabs.push({ id: "
|
|
133
|
+
if (discoverCount > 0) {
|
|
134
|
+
tabs.push({ id: "discover", label: "Discover", count: discoverCount });
|
|
133
135
|
}
|
|
134
136
|
if (updatesCount > 0) {
|
|
135
137
|
tabs.push({ id: "updates", label: "Updates", count: updatesCount });
|
|
@@ -141,7 +143,7 @@ export function filterByTab(plugins: DashboardPlugin[], tabId: PluginTabId): Das
|
|
|
141
143
|
switch (tabId) {
|
|
142
144
|
case "installed":
|
|
143
145
|
return plugins.filter(p => p.installed);
|
|
144
|
-
case "
|
|
146
|
+
case "discover":
|
|
145
147
|
return plugins.filter(p => !p.installed);
|
|
146
148
|
case "updates":
|
|
147
149
|
return plugins.filter(p => p.hasUpdate);
|
|
@@ -155,6 +157,7 @@ export function applySearch(plugins: DashboardPlugin[], query: string): Dashboar
|
|
|
155
157
|
const q = query.toLowerCase();
|
|
156
158
|
return plugins.filter(p => {
|
|
157
159
|
if (p.name.toLowerCase().includes(q)) return true;
|
|
160
|
+
if (p.displayName?.toLowerCase().includes(q)) return true;
|
|
158
161
|
if (p.description?.toLowerCase().includes(q)) return true;
|
|
159
162
|
if (p.marketplace?.toLowerCase().includes(q)) return true;
|
|
160
163
|
if (p.category?.toLowerCase().includes(q)) return true;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface DashboardPlugin {
|
|
2
2
|
id: string;
|
|
3
3
|
name: string;
|
|
4
|
+
displayName?: string;
|
|
4
5
|
marketplace?: string;
|
|
5
6
|
source: "npm" | "marketplace";
|
|
6
7
|
scope?: "user" | "project";
|
|
@@ -19,7 +20,7 @@ export interface DashboardPlugin {
|
|
|
19
20
|
updateVersion?: string;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
export type PluginTabId = "installed" | "
|
|
23
|
+
export type PluginTabId = "installed" | "discover" | "updates";
|
|
23
24
|
|
|
24
25
|
export interface PluginTab {
|
|
25
26
|
id: PluginTabId;
|