@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5xc-salesdemos/xcsh",
4
- "version": "19.5.0",
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.0",
54
- "@f5xc-salesdemos/pi-agent-core": "19.5.0",
55
- "@f5xc-salesdemos/pi-ai": "19.5.0",
56
- "@f5xc-salesdemos/pi-natives": "19.5.0",
57
- "@f5xc-salesdemos/pi-tui": "19.5.0",
58
- "@f5xc-salesdemos/pi-utils": "19.5.0",
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.0",
21
- "commit": "1845641b31e29a09b04c301d1bcfc297a719c5f9",
22
- "shortCommit": "1845641",
20
+ "version": "19.5.1",
21
+ "commit": "9c15a98f105051030aa1e0f5376d315d0214e8fd",
22
+ "shortCommit": "9c15a98",
23
23
  "branch": "main",
24
- "tag": "v19.5.0",
25
- "commitDate": "2026-06-04T16:42:25Z",
26
- "buildDate": "2026-06-04T17:10:47.523Z",
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/1845641b31e29a09b04c301d1bcfc297a719c5f9",
32
- "releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v19.5.0"
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 === "available" && !plugin.installed) {
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 "available":
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 === "available"
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 availableCount = plugins.filter(p => !p.installed).length;
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 (availableCount > 0) {
132
- tabs.push({ id: "available", label: "Available", count: availableCount });
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 "available":
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" | "available" | "updates";
23
+ export type PluginTabId = "installed" | "discover" | "updates";
23
24
 
24
25
  export interface PluginTab {
25
26
  id: PluginTabId;