@f5xc-salesdemos/xcsh 18.45.1 → 18.47.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5xc-salesdemos/xcsh",
4
- "version": "18.45.1",
4
+ "version": "18.47.0",
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",
@@ -48,12 +48,12 @@
48
48
  "dependencies": {
49
49
  "@agentclientprotocol/sdk": "0.16.1",
50
50
  "@mozilla/readability": "^0.6",
51
- "@f5xc-salesdemos/xcsh-stats": "18.45.1",
52
- "@f5xc-salesdemos/pi-agent-core": "18.45.1",
53
- "@f5xc-salesdemos/pi-ai": "18.45.1",
54
- "@f5xc-salesdemos/pi-natives": "18.45.1",
55
- "@f5xc-salesdemos/pi-tui": "18.45.1",
56
- "@f5xc-salesdemos/pi-utils": "18.45.1",
51
+ "@f5xc-salesdemos/xcsh-stats": "18.47.0",
52
+ "@f5xc-salesdemos/pi-agent-core": "18.47.0",
53
+ "@f5xc-salesdemos/pi-ai": "18.47.0",
54
+ "@f5xc-salesdemos/pi-natives": "18.47.0",
55
+ "@f5xc-salesdemos/pi-tui": "18.47.0",
56
+ "@f5xc-salesdemos/pi-utils": "18.47.0",
57
57
  "@sinclair/typebox": "^0.34",
58
58
  "@xterm/headless": "^6.0",
59
59
  "ajv": "^8.18",
package/src/cli/args.ts CHANGED
@@ -33,6 +33,7 @@ export interface Args {
33
33
  models?: string[];
34
34
  tools?: string[];
35
35
  noTools?: boolean;
36
+ noMcp?: boolean;
36
37
  noLsp?: boolean;
37
38
  noPty?: boolean;
38
39
  hooks?: string[];
@@ -114,6 +115,8 @@ export function parseArgs(args: string[], extensionFlags?: Map<string, { type: "
114
115
  result.noLsp = true;
115
116
  } else if (arg === "--no-pty") {
116
117
  result.noPty = true;
118
+ } else if (arg === "--no-mcp") {
119
+ result.noMcp = true;
117
120
  } else if (arg === "--tools" && i + 1 < args.length) {
118
121
  const toolNames = args[++i]
119
122
  .split(",")
@@ -76,6 +76,9 @@ export default class Index extends Command {
76
76
  "no-tools": Flags.boolean({
77
77
  description: "Disable all built-in tools",
78
78
  }),
79
+ "no-mcp": Flags.boolean({
80
+ description: "Disable MCP server discovery and tools",
81
+ }),
79
82
  "no-lsp": Flags.boolean({
80
83
  description: "Disable LSP tools, formatting, and diagnostics",
81
84
  }),
@@ -1956,6 +1956,7 @@ export interface SkillsSettings {
1956
1956
  enableCodexUser?: boolean;
1957
1957
  enableClaudeUser?: boolean;
1958
1958
  enableClaudeProject?: boolean;
1959
+ enableClaudePlugins?: boolean;
1959
1960
  enablePiUser?: boolean;
1960
1961
  enablePiProject?: boolean;
1961
1962
  customDirectories?: string[];
@@ -17,17 +17,17 @@ export interface BuildInfo {
17
17
  }
18
18
 
19
19
  export const BUILD_INFO: BuildInfo = {
20
- "version": "18.45.1",
21
- "commit": "b636990701856264c79e2544a376fc16c07ffe9f",
22
- "shortCommit": "b636990",
20
+ "version": "18.47.0",
21
+ "commit": "d0994b94529ed5464212568134c7dc9d75506b21",
22
+ "shortCommit": "d0994b9",
23
23
  "branch": "main",
24
- "tag": "v18.45.1",
25
- "commitDate": "2026-05-06T04:30:34Z",
26
- "buildDate": "2026-05-06T04:51:28.530Z",
24
+ "tag": "v18.47.0",
25
+ "commitDate": "2026-05-06T06:04:50Z",
26
+ "buildDate": "2026-05-06T06:30:34.654Z",
27
27
  "dirty": false,
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/b636990701856264c79e2544a376fc16c07ffe9f",
32
- "releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v18.45.1"
31
+ "commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/d0994b94529ed5464212568134c7dc9d75506b21",
32
+ "releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v18.47.0"
33
33
  };
package/src/main.ts CHANGED
@@ -528,6 +528,10 @@ async function buildSessionOptions(
528
528
  options.toolNames = parsed.tools;
529
529
  }
530
530
 
531
+ if (parsed.noTools || parsed.noMcp) {
532
+ options.enableMCP = false;
533
+ }
534
+
531
535
  if (parsed.noLsp) {
532
536
  options.enableLsp = false;
533
537
  }
@@ -331,6 +331,23 @@ export async function checkSalesforceStatus(_cwd: string): Promise<WelcomeSalesf
331
331
  }
332
332
  }
333
333
 
334
+ export type GitHubCheckState = "connected" | "auth_error";
335
+
336
+ export interface WelcomeGitHubStatus {
337
+ state: GitHubCheckState;
338
+ }
339
+
340
+ export async function checkGitHubStatus(): Promise<WelcomeGitHubStatus | undefined> {
341
+ try {
342
+ if (!$which("gh")) return undefined;
343
+ const result = await $`gh auth status`.quiet().nothrow();
344
+ return { state: result.exitCode === 0 ? "connected" : "auth_error" };
345
+ } catch (err) {
346
+ logger.warn("GitHub startup check failed", { error: String(err) });
347
+ return { state: "auth_error" };
348
+ }
349
+ }
350
+
334
351
  export type ServiceState = "connected" | "unauthenticated" | "unavailable";
335
352
 
336
353
  export interface ServiceStatus {
@@ -372,3 +389,40 @@ export function mapSalesforceStatus(status: WelcomeSalesforceStatus | undefined)
372
389
  return { name: "Salesforce", state: "unauthenticated", hint: "run: sf org login web" };
373
390
  }
374
391
  }
392
+
393
+ export function mapGitHubStatus(status: WelcomeGitHubStatus | undefined): ServiceStatus {
394
+ if (!status) return { name: "GitHub", state: "unavailable", hint: "not installed" };
395
+ switch (status.state) {
396
+ case "connected":
397
+ return { name: "GitHub", state: "connected" };
398
+ case "auth_error":
399
+ return { name: "GitHub", state: "unauthenticated", hint: "run: gh auth login" };
400
+ }
401
+ }
402
+
403
+ export type AzureCheckState = "connected" | "auth_error";
404
+
405
+ export interface WelcomeAzureStatus {
406
+ state: AzureCheckState;
407
+ }
408
+
409
+ export async function checkAzureStatus(): Promise<WelcomeAzureStatus | undefined> {
410
+ try {
411
+ if (!$which("az")) return undefined;
412
+ const result = await $`az account show --output json`.quiet().nothrow();
413
+ return { state: result.exitCode === 0 ? "connected" : "auth_error" };
414
+ } catch (err) {
415
+ logger.warn("Azure startup check failed", { error: String(err) });
416
+ return { state: "auth_error" };
417
+ }
418
+ }
419
+
420
+ export function mapAzureStatus(status: WelcomeAzureStatus | undefined): ServiceStatus {
421
+ if (!status) return { name: "Azure", state: "unavailable", hint: "not installed" };
422
+ switch (status.state) {
423
+ case "connected":
424
+ return { name: "Azure", state: "connected" };
425
+ case "auth_error":
426
+ return { name: "Azure", state: "unauthenticated", hint: "run: az login --use-device-code" };
427
+ }
428
+ }
@@ -51,9 +51,13 @@ import { StatusLineComponent } from "./components/status-line";
51
51
  import type { ToolExecutionHandle } from "./components/tool-execution";
52
52
  import { type UpdateStatus, WelcomeComponent } from "./components/welcome";
53
53
  import {
54
+ checkAzureStatus,
55
+ checkGitHubStatus,
54
56
  checkGitLabStatus,
55
57
  checkSalesforceStatus,
58
+ mapAzureStatus,
56
59
  mapContextStatus,
60
+ mapGitHubStatus,
57
61
  mapGitLabStatus,
58
62
  mapSalesforceStatus,
59
63
  runWelcomeChecks,
@@ -314,13 +318,15 @@ export class InteractiveMode implements InteractiveModeContext {
314
318
  getProjectDir(),
315
319
  );
316
320
 
317
- // Run blocking welcome screen status checks (model + context + gitlab + salesforce) in parallel
318
- const [welcomeResult, gitlabStatus, salesforceStatus] = await Promise.all([
321
+ // Run blocking welcome screen status checks (model + context + gitlab + github + salesforce + azure) in parallel
322
+ const [welcomeResult, gitlabStatus, salesforceStatus, githubStatus, azureStatus] = await Promise.all([
319
323
  logger.time("InteractiveMode.init:welcomeChecks", () =>
320
324
  runWelcomeChecks(this.session.model, this.session.modelRegistry.authStorage),
321
325
  ),
322
326
  checkGitLabStatus(getProjectDir()).catch(() => undefined),
323
327
  checkSalesforceStatus(getProjectDir()).catch(() => undefined),
328
+ checkGitHubStatus().catch(() => undefined),
329
+ checkAzureStatus().catch(() => undefined),
324
330
  ]);
325
331
 
326
332
  const startupQuiet = settings.get("startup.quiet");
@@ -339,7 +345,9 @@ export class InteractiveMode implements InteractiveModeContext {
339
345
  ? [
340
346
  mapContextStatus(welcomeResult.context ?? { state: "no_context" }),
341
347
  mapGitLabStatus(gitlabStatus),
348
+ mapGitHubStatus(githubStatus),
342
349
  mapSalesforceStatus(salesforceStatus),
350
+ mapAzureStatus(azureStatus),
343
351
  ]
344
352
  : [];
345
353
  this.#welcomeComponent = new WelcomeComponent(