@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 +7 -7
- package/src/cli/args.ts +3 -0
- package/src/commands/launch.ts +3 -0
- package/src/config/settings-schema.ts +1 -0
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/main.ts +4 -0
- package/src/modes/components/welcome-checks.ts +54 -0
- package/src/modes/interactive-mode.ts +10 -2
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5xc-salesdemos/xcsh",
|
|
4
|
-
"version": "18.
|
|
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.
|
|
52
|
-
"@f5xc-salesdemos/pi-agent-core": "18.
|
|
53
|
-
"@f5xc-salesdemos/pi-ai": "18.
|
|
54
|
-
"@f5xc-salesdemos/pi-natives": "18.
|
|
55
|
-
"@f5xc-salesdemos/pi-tui": "18.
|
|
56
|
-
"@f5xc-salesdemos/pi-utils": "18.
|
|
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(",")
|
package/src/commands/launch.ts
CHANGED
|
@@ -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.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "18.47.0",
|
|
21
|
+
"commit": "d0994b94529ed5464212568134c7dc9d75506b21",
|
|
22
|
+
"shortCommit": "d0994b9",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v18.
|
|
25
|
-
"commitDate": "2026-05-
|
|
26
|
-
"buildDate": "2026-05-
|
|
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/
|
|
32
|
-
"releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v18.
|
|
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
|
@@ -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(
|