zelari-code 1.0.1 → 1.0.3
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/dist/cli/main.bundled.js +533 -195
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +67 -46
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/mcp/mcpClient.js +29 -26
- package/dist/cli/mcp/mcpClient.js.map +1 -1
- package/dist/cli/slashHandlers/updater.js +77 -6
- package/dist/cli/slashHandlers/updater.js.map +1 -1
- package/dist/cli/utils/doctor.js +287 -0
- package/dist/cli/utils/doctor.js.map +1 -0
- package/package.json +4 -2
- package/scripts/postinstall.mjs +186 -0
package/dist/cli/main.js
CHANGED
|
@@ -3,20 +3,29 @@
|
|
|
3
3
|
* zelari-code — CLI coding agent on top of AnathemaBrain.
|
|
4
4
|
* Phase 14 Task 14.3 + 14.4: multi-panel TUI + slash command wiring.
|
|
5
5
|
*/
|
|
6
|
-
import React from
|
|
7
|
-
import { render } from
|
|
6
|
+
import React from "react";
|
|
7
|
+
import { render } from "ink";
|
|
8
8
|
// @ts-ignore
|
|
9
|
-
import { App } from
|
|
10
|
-
import { SplashGate } from
|
|
11
|
-
import { getMetricsLogger } from
|
|
12
|
-
import { getProviderConfigPath } from
|
|
13
|
-
import { parseWizardFlags, shouldRunWizard
|
|
14
|
-
import { RunWizard } from
|
|
15
|
-
import { parseHeadlessFlags } from
|
|
16
|
-
import { runHeadless } from
|
|
17
|
-
import { loadSkillMdSkills } from
|
|
18
|
-
import { listCodingSkills } from
|
|
19
|
-
|
|
9
|
+
import { App } from "./app.js";
|
|
10
|
+
import { SplashGate } from "./components/SplashScreen.js";
|
|
11
|
+
import { getMetricsLogger } from "./metrics.js";
|
|
12
|
+
import { getProviderConfigPath } from "./providerConfig.js";
|
|
13
|
+
import { parseWizardFlags, shouldRunWizard } from "./wizard/firstRun.js";
|
|
14
|
+
import { RunWizard } from "./wizard/runWizard.js";
|
|
15
|
+
import { parseHeadlessFlags } from "./headless.js";
|
|
16
|
+
import { runHeadless } from "./runHeadless.js";
|
|
17
|
+
import { loadSkillMdSkills } from "./skillsMd.js";
|
|
18
|
+
import { listCodingSkills } from "@zelari/core/skills";
|
|
19
|
+
import { getCurrentVersion } from "./updater.js";
|
|
20
|
+
/**
|
|
21
|
+
* Bundled CLI version. Derived from <pkg>/package.json at runtime so it
|
|
22
|
+
* stays in sync with `npm publish` / self-update checks (which also read
|
|
23
|
+
* package.json via `getCurrentVersion`). Previously hardcoded — that
|
|
24
|
+
* caused `--version` to show 1.0.0 after a 1.0.1 publish and confused
|
|
25
|
+
* `/update` (registry's "latest" was 1.0.1, current was 1.0.0 → update
|
|
26
|
+
* offered, then reinstalled 1.0.1 → no change apparent).
|
|
27
|
+
*/
|
|
28
|
+
export const VERSION = getCurrentVersion();
|
|
20
29
|
/**
|
|
21
30
|
* Silent background update check (Task N.6, v3-N).
|
|
22
31
|
*
|
|
@@ -28,11 +37,11 @@ export const VERSION = '1.0.0';
|
|
|
28
37
|
* development where the bundled version is the source repo.
|
|
29
38
|
*/
|
|
30
39
|
async function backgroundUpdateCheck() {
|
|
31
|
-
if (process.env.ANATHEMA_DEV ===
|
|
40
|
+
if (process.env.ANATHEMA_DEV === "1")
|
|
32
41
|
return;
|
|
33
42
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
34
43
|
try {
|
|
35
|
-
const { checkForUpdate } = await import(
|
|
44
|
+
const { checkForUpdate } = await import("./updater.js");
|
|
36
45
|
const info = await checkForUpdate();
|
|
37
46
|
if (info.updateAvailable && !info.error) {
|
|
38
47
|
// eslint-disable-next-line no-console
|
|
@@ -60,7 +69,7 @@ async function shutdown() {
|
|
|
60
69
|
}
|
|
61
70
|
try {
|
|
62
71
|
// v0.7.5: kill spawned MCP server processes so they don't outlive the CLI.
|
|
63
|
-
const { closeMcpClients } = await import(
|
|
72
|
+
const { closeMcpClients } = await import("./mcp/mcpManager.js");
|
|
64
73
|
closeMcpClients();
|
|
65
74
|
}
|
|
66
75
|
catch {
|
|
@@ -83,32 +92,42 @@ async function shutdown() {
|
|
|
83
92
|
*/
|
|
84
93
|
function pickRootComponent() {
|
|
85
94
|
const argv = process.argv.slice(2);
|
|
86
|
-
if (argv.includes(
|
|
95
|
+
if (argv.includes("--version") || argv.includes("-v")) {
|
|
87
96
|
// eslint-disable-next-line no-console
|
|
88
97
|
console.log(`zelari-code v${VERSION}`);
|
|
89
98
|
process.exit(0);
|
|
90
99
|
}
|
|
91
|
-
if (argv.includes(
|
|
100
|
+
if (argv.includes("--doctor") || argv.includes("doctor")) {
|
|
101
|
+
// v1.0.3: install-health diagnostic. Runs BEFORE the bundle is loaded
|
|
102
|
+
// and before any provider / config work, so it works on a broken
|
|
103
|
+
// install (missing bundle, missing shim, wrong PATH, etc.).
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
105
|
+
const { runDoctor } = require("./utils/doctor.js");
|
|
106
|
+
const healthy = runDoctor();
|
|
107
|
+
process.exit(healthy ? 0 : 1);
|
|
108
|
+
}
|
|
109
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
92
110
|
// eslint-disable-next-line no-console
|
|
93
|
-
console.log(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
console.log("zelari-code — AI Council coding agent CLI.\n" +
|
|
112
|
+
"\n" +
|
|
113
|
+
"Usage: zelari-code [options]\n" +
|
|
114
|
+
"\n" +
|
|
115
|
+
"Options:\n" +
|
|
116
|
+
" --version, -v Print version and exit\n" +
|
|
117
|
+
" --help, -h Print this help and exit\n" +
|
|
118
|
+
" --doctor Diagnose install health (shim, bundle, PATH, deps)\n" +
|
|
119
|
+
" --no-wizard Skip the first-run wizard\n" +
|
|
120
|
+
" --reset-config Re-run the wizard (clears provider.json on commit)\n" +
|
|
121
|
+
" --headless Run a single task without mounting the TUI\n" +
|
|
122
|
+
" --task <text> Task prompt (required in headless mode)\n" +
|
|
123
|
+
" --output json|plain Output format (default: json)\n" +
|
|
124
|
+
" --council Use the 6-member council pipeline\n" +
|
|
125
|
+
" --provider <id> Provider override (default: active)\n" +
|
|
126
|
+
" --model <id> Model override (default: provider default)\n" +
|
|
127
|
+
"\n" +
|
|
128
|
+
"Environment:\n" +
|
|
129
|
+
" ZELARI_NO_WIZARD=1 Skip the first-run wizard\n" +
|
|
130
|
+
" ANATHEMA_DEV=1 Disable background update check\n");
|
|
112
131
|
process.exit(0);
|
|
113
132
|
}
|
|
114
133
|
// Headless mode: short-circuit TUI entirely. Must be checked BEFORE
|
|
@@ -116,7 +135,7 @@ function pickRootComponent() {
|
|
|
116
135
|
// install (no provider.json yet) by passing --provider + env var.
|
|
117
136
|
const headlessParse = parseHeadlessFlags(argv);
|
|
118
137
|
if (headlessParse.options !== null) {
|
|
119
|
-
return { kind:
|
|
138
|
+
return { kind: "headless", headlessOpts: headlessParse.options };
|
|
120
139
|
}
|
|
121
140
|
if (headlessParse.error !== undefined) {
|
|
122
141
|
// eslint-disable-next-line no-console
|
|
@@ -133,13 +152,13 @@ function pickRootComponent() {
|
|
|
133
152
|
if (decision.shouldRun) {
|
|
134
153
|
// eslint-disable-next-line no-console
|
|
135
154
|
console.error(`[zelari-code] starting wizard: ${decision.reason}`);
|
|
136
|
-
return { kind:
|
|
155
|
+
return { kind: "wizard", element: React.createElement(RunWizard) };
|
|
137
156
|
}
|
|
138
157
|
// v0.7.8: one-shot startup splash (ASCII emblem, ~2s or any-key skip),
|
|
139
158
|
// then the App mounts. Skipped automatically for non-TTY stdout, small
|
|
140
159
|
// terminals, or ZELARI_NO_SPLASH=1 — see components/SplashScreen.tsx.
|
|
141
160
|
return {
|
|
142
|
-
kind:
|
|
161
|
+
kind: "app",
|
|
143
162
|
element: React.createElement(SplashGate, { version: VERSION }, React.createElement(App)),
|
|
144
163
|
};
|
|
145
164
|
}
|
|
@@ -155,7 +174,7 @@ function loadUserSkills() {
|
|
|
155
174
|
const summary = loadSkillMdSkills(process.cwd(), { existingIds: existing });
|
|
156
175
|
if (summary.loaded.length > 0) {
|
|
157
176
|
// eslint-disable-next-line no-console
|
|
158
|
-
console.error(`[zelari-code] loaded ${summary.loaded.length} SKILL.md skill(s): ${summary.loaded.join(
|
|
177
|
+
console.error(`[zelari-code] loaded ${summary.loaded.length} SKILL.md skill(s): ${summary.loaded.join(", ")}`);
|
|
159
178
|
}
|
|
160
179
|
for (const s of summary.skipped) {
|
|
161
180
|
// eslint-disable-next-line no-console
|
|
@@ -168,22 +187,24 @@ function loadUserSkills() {
|
|
|
168
187
|
}
|
|
169
188
|
function main() {
|
|
170
189
|
const picked = pickRootComponent();
|
|
171
|
-
if (picked.kind ===
|
|
190
|
+
if (picked.kind === "done")
|
|
172
191
|
return; // --version or --help printed + exited
|
|
173
192
|
loadUserSkills();
|
|
174
|
-
if (picked.kind ===
|
|
193
|
+
if (picked.kind === "headless") {
|
|
175
194
|
void runHeadless(picked.headlessOpts).then((code) => {
|
|
176
|
-
void getMetricsLogger()
|
|
195
|
+
void getMetricsLogger()
|
|
196
|
+
.flush()
|
|
197
|
+
.catch(() => { });
|
|
177
198
|
process.exit(code);
|
|
178
199
|
});
|
|
179
200
|
return;
|
|
180
201
|
}
|
|
181
202
|
const { waitUntilExit, unmount } = render(picked.element);
|
|
182
|
-
process.on(
|
|
203
|
+
process.on("SIGINT", () => {
|
|
183
204
|
unmount();
|
|
184
205
|
void shutdown();
|
|
185
206
|
});
|
|
186
|
-
process.on(
|
|
207
|
+
process.on("SIGTERM", () => {
|
|
187
208
|
unmount();
|
|
188
209
|
void shutdown();
|
|
189
210
|
});
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,18 +11,19 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @see https://modelcontextprotocol.io/specification (stdio transport)
|
|
13
13
|
*/
|
|
14
|
-
import { spawn } from
|
|
15
|
-
import { buildCmdLine } from
|
|
14
|
+
import { spawn } from "node:child_process";
|
|
15
|
+
import { buildCmdLine } from "../utils/cmdline.js";
|
|
16
|
+
import { getCurrentVersion } from "../updater.js";
|
|
16
17
|
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
17
18
|
const INIT_TIMEOUT_MS = 15_000;
|
|
18
|
-
export const MCP_PROTOCOL_VERSION =
|
|
19
|
+
export const MCP_PROTOCOL_VERSION = "2025-03-26";
|
|
19
20
|
export class McpClient {
|
|
20
21
|
serverName;
|
|
21
22
|
config;
|
|
22
23
|
child = null;
|
|
23
24
|
nextId = 1;
|
|
24
25
|
pending = new Map();
|
|
25
|
-
stdoutBuffer =
|
|
26
|
+
stdoutBuffer = "";
|
|
26
27
|
closed = false;
|
|
27
28
|
constructor(serverName, config) {
|
|
28
29
|
this.serverName = serverName;
|
|
@@ -33,7 +34,7 @@ export class McpClient {
|
|
|
33
34
|
if (this.child)
|
|
34
35
|
return;
|
|
35
36
|
const spawnOpts = {
|
|
36
|
-
stdio: [
|
|
37
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
37
38
|
env: { ...process.env, ...(this.config.env ?? {}) },
|
|
38
39
|
windowsHide: true,
|
|
39
40
|
};
|
|
@@ -41,37 +42,37 @@ export class McpClient {
|
|
|
41
42
|
// execute, so a shell is required — but passing an args ARRAY together
|
|
42
43
|
// with shell:true is deprecated (DEP0190: args concatenated unescaped).
|
|
43
44
|
// Build the command line ourselves with explicit quoting instead.
|
|
44
|
-
const child = (process.platform ===
|
|
45
|
+
const child = (process.platform === "win32"
|
|
45
46
|
? spawn(buildCmdLine(this.config.command, this.config.args ?? []), {
|
|
46
47
|
...spawnOpts,
|
|
47
48
|
shell: true,
|
|
48
49
|
})
|
|
49
50
|
: spawn(this.config.command, this.config.args ?? [], spawnOpts));
|
|
50
51
|
this.child = child;
|
|
51
|
-
child.stdout.setEncoding(
|
|
52
|
-
child.stdout.on(
|
|
53
|
-
child.on(
|
|
54
|
-
child.on(
|
|
52
|
+
child.stdout.setEncoding("utf8");
|
|
53
|
+
child.stdout.on("data", (chunk) => this.onStdout(chunk));
|
|
54
|
+
child.on("error", (err) => this.failAll(new Error(`[mcp:${this.serverName}] spawn failed: ${err.message}`)));
|
|
55
|
+
child.on("exit", (code) => {
|
|
55
56
|
if (!this.closed) {
|
|
56
|
-
this.failAll(new Error(`[mcp:${this.serverName}] server exited (code ${code ??
|
|
57
|
+
this.failAll(new Error(`[mcp:${this.serverName}] server exited (code ${code ?? "null"})`));
|
|
57
58
|
}
|
|
58
59
|
});
|
|
59
|
-
await this.request(
|
|
60
|
+
await this.request("initialize", {
|
|
60
61
|
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
61
62
|
capabilities: {},
|
|
62
|
-
clientInfo: { name:
|
|
63
|
+
clientInfo: { name: "zelari-code", version: getCurrentVersion() },
|
|
63
64
|
}, INIT_TIMEOUT_MS);
|
|
64
|
-
this.notify(
|
|
65
|
+
this.notify("notifications/initialized", {});
|
|
65
66
|
}
|
|
66
67
|
/** Discover the server's tools. */
|
|
67
68
|
async listTools() {
|
|
68
|
-
const res = (await this.request(
|
|
69
|
+
const res = (await this.request("tools/list", {}));
|
|
69
70
|
return (res.tools ?? [])
|
|
70
71
|
.filter((t) => !!t.name)
|
|
71
72
|
.map((t) => ({
|
|
72
73
|
name: t.name,
|
|
73
|
-
description: t.description ??
|
|
74
|
-
inputSchema: t.inputSchema ?? { type:
|
|
74
|
+
description: t.description ?? "",
|
|
75
|
+
inputSchema: t.inputSchema ?? { type: "object", properties: {} },
|
|
75
76
|
}));
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
@@ -79,10 +80,12 @@ export class McpClient {
|
|
|
79
80
|
* items are summarized by type. Throws when the server flags isError.
|
|
80
81
|
*/
|
|
81
82
|
async callTool(name, args, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
82
|
-
const res = (await this.request(
|
|
83
|
+
const res = (await this.request("tools/call", { name, arguments: args }, timeoutMs));
|
|
83
84
|
const text = (res.content ?? [])
|
|
84
|
-
.map((c) =>
|
|
85
|
-
.
|
|
85
|
+
.map((c) => c.type === "text" && typeof c.text === "string"
|
|
86
|
+
? c.text
|
|
87
|
+
: `[${c.type ?? "unknown"} content]`)
|
|
88
|
+
.join("\n");
|
|
86
89
|
if (res.isError)
|
|
87
90
|
throw new Error(text || `tool "${name}" reported an error`);
|
|
88
91
|
return text;
|
|
@@ -100,14 +103,14 @@ export class McpClient {
|
|
|
100
103
|
if (!child)
|
|
101
104
|
return Promise.reject(new Error(`[mcp:${this.serverName}] not started`));
|
|
102
105
|
const id = this.nextId++;
|
|
103
|
-
const payload = JSON.stringify({ jsonrpc:
|
|
106
|
+
const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
104
107
|
return new Promise((resolve, reject) => {
|
|
105
108
|
const timer = setTimeout(() => {
|
|
106
109
|
this.pending.delete(id);
|
|
107
110
|
reject(new Error(`[mcp:${this.serverName}] ${method} timed out after ${timeoutMs}ms`));
|
|
108
111
|
}, timeoutMs);
|
|
109
112
|
this.pending.set(id, { resolve, reject, timer });
|
|
110
|
-
child.stdin.write(payload +
|
|
113
|
+
child.stdin.write(payload + "\n", (err) => {
|
|
111
114
|
if (err) {
|
|
112
115
|
clearTimeout(timer);
|
|
113
116
|
this.pending.delete(id);
|
|
@@ -117,12 +120,12 @@ export class McpClient {
|
|
|
117
120
|
});
|
|
118
121
|
}
|
|
119
122
|
notify(method, params) {
|
|
120
|
-
this.child?.stdin.write(JSON.stringify({ jsonrpc:
|
|
123
|
+
this.child?.stdin.write(JSON.stringify({ jsonrpc: "2.0", method, params }) + "\n");
|
|
121
124
|
}
|
|
122
125
|
onStdout(chunk) {
|
|
123
126
|
this.stdoutBuffer += chunk;
|
|
124
127
|
let nl;
|
|
125
|
-
while ((nl = this.stdoutBuffer.indexOf(
|
|
128
|
+
while ((nl = this.stdoutBuffer.indexOf("\n")) >= 0) {
|
|
126
129
|
const line = this.stdoutBuffer.slice(0, nl).trim();
|
|
127
130
|
this.stdoutBuffer = this.stdoutBuffer.slice(nl + 1);
|
|
128
131
|
if (!line)
|
|
@@ -134,7 +137,7 @@ export class McpClient {
|
|
|
134
137
|
catch {
|
|
135
138
|
continue; // servers sometimes log garbage to stdout — ignore non-JSON
|
|
136
139
|
}
|
|
137
|
-
if (typeof msg.id !==
|
|
140
|
+
if (typeof msg.id !== "number")
|
|
138
141
|
continue; // notification from server — none handled yet
|
|
139
142
|
const pending = this.pending.get(msg.id);
|
|
140
143
|
if (!pending)
|
|
@@ -142,7 +145,7 @@ export class McpClient {
|
|
|
142
145
|
this.pending.delete(msg.id);
|
|
143
146
|
clearTimeout(pending.timer);
|
|
144
147
|
if (msg.error) {
|
|
145
|
-
pending.reject(new Error(`[mcp:${this.serverName}] ${msg.error.message ??
|
|
148
|
+
pending.reject(new Error(`[mcp:${this.serverName}] ${msg.error.message ?? "JSON-RPC error"} (code ${msg.error.code ?? "?"})`));
|
|
146
149
|
}
|
|
147
150
|
else {
|
|
148
151
|
pending.resolve(msg.result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { appendSystem } from
|
|
1
|
+
import { appendSystem } from "../hooks/messageHelpers.js";
|
|
2
2
|
export async function handleUpdateCheck(ctx) {
|
|
3
3
|
try {
|
|
4
|
-
const { checkForUpdate } = await import(
|
|
4
|
+
const { checkForUpdate } = await import("../updater.js");
|
|
5
5
|
const info = await checkForUpdate();
|
|
6
6
|
if (info.error) {
|
|
7
7
|
appendSystem(ctx.setMessages, `[update] check failed: ${info.error}`);
|
|
@@ -19,9 +19,9 @@ export async function handleUpdateCheck(ctx) {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
export async function handleUpdatePerform(ctx) {
|
|
22
|
-
appendSystem(ctx.setMessages,
|
|
22
|
+
appendSystem(ctx.setMessages, "[update] running `npm install -g zelari-code@latest`...");
|
|
23
23
|
try {
|
|
24
|
-
const { performUpdate } = await import(
|
|
24
|
+
const { performUpdate } = await import("../updater.js");
|
|
25
25
|
const res = await performUpdate();
|
|
26
26
|
if (res.ok) {
|
|
27
27
|
appendSystem(ctx.setMessages, `[update] ✅ installed successfully\n\n` +
|
|
@@ -29,12 +29,83 @@ export async function handleUpdatePerform(ctx) {
|
|
|
29
29
|
`(exit with /exit or Ctrl+C, then run \`zelari-code\` again)`);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// v1.0.3: show the FULL npm output (not just the last error line) so
|
|
33
|
+
// the user can see exactly what npm complained about, and append a
|
|
34
|
+
// targeted recovery hint for the most common failure modes we have
|
|
35
|
+
// seen in the wild: missing global-prefix shim (Windows npm 10/11),
|
|
36
|
+
// and a stale shim pointing at an older install.
|
|
37
|
+
const output = res.output?.trim() || "(empty)";
|
|
38
|
+
const hint = buildUpdateFailureHint(res.error ?? "", output, res.exitCode);
|
|
39
|
+
appendSystem(ctx.setMessages, `[update] ❌ failed: ${res.error ?? "unknown error"}\n` +
|
|
40
|
+
`exit code: ${res.exitCode ?? "n/a"}\n\n` +
|
|
41
|
+
`npm output:\n${output}\n\n` +
|
|
42
|
+
hint);
|
|
34
43
|
}
|
|
35
44
|
}
|
|
36
45
|
catch (err) {
|
|
37
46
|
appendSystem(ctx.setMessages, `[update error] ${err instanceof Error ? err.message : String(err)}`);
|
|
38
47
|
}
|
|
39
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a short, targeted recovery hint based on the npm error text.
|
|
51
|
+
*
|
|
52
|
+
* The "shim broken" / "command not found after update" failure mode is
|
|
53
|
+
* the most common one in the field (Windows + npm 10/11 drops the
|
|
54
|
+
* global shim on major upgrades). We detect it heuristically from the
|
|
55
|
+
* error + output and surface the exact recovery command.
|
|
56
|
+
*
|
|
57
|
+
* @internal exported for unit testing
|
|
58
|
+
*/
|
|
59
|
+
export function buildUpdateFailureHint(error, output, exitCode) {
|
|
60
|
+
const haystack = `${error}\n${output}`.toLowerCase();
|
|
61
|
+
const isWin = process.platform === "win32";
|
|
62
|
+
// ERESOLVE / EPEERINVALID — usually means the user has a different
|
|
63
|
+
// version of @zelari/core or another peer installed globally.
|
|
64
|
+
if (haystack.includes("eresolve") ||
|
|
65
|
+
haystack.includes("epeerinvalid") ||
|
|
66
|
+
haystack.includes("peer dep")) {
|
|
67
|
+
return ("💡 hint: peer-dependency conflict. Try:\n" +
|
|
68
|
+
" npm install -g zelari-code@latest --legacy-peer-deps\n" +
|
|
69
|
+
" or: npm install -g zelari-code@latest --force");
|
|
70
|
+
}
|
|
71
|
+
// EACCES / EPERM — permission issue, common on macOS/Linux when the
|
|
72
|
+
// global prefix is owned by root.
|
|
73
|
+
if (haystack.includes("eacces") || haystack.includes("eperm")) {
|
|
74
|
+
return ("💡 hint: permission denied. On macOS/Linux, avoid sudo with npm:\n" +
|
|
75
|
+
" https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally\n" +
|
|
76
|
+
" On Windows, re-run the terminal as Administrator.");
|
|
77
|
+
}
|
|
78
|
+
// ENOENT for npm itself — the shell could not find `npm` on PATH.
|
|
79
|
+
if (haystack.includes("enoent") && haystack.includes("npm")) {
|
|
80
|
+
return ("💡 hint: `npm` was not found on PATH for the spawned shell.\n" +
|
|
81
|
+
" Re-open the terminal so it picks up your current PATH, or set:\n" +
|
|
82
|
+
' export PATH="$(npm prefix -g)/bin:$PATH" (POSIX)\n' +
|
|
83
|
+
' $env:Path = "$(npm prefix -g);$env:Path" (PowerShell)');
|
|
84
|
+
}
|
|
85
|
+
// Shim-related: shim not created / "command not found" on next run.
|
|
86
|
+
// We can't always see this from the npm output (the failure often
|
|
87
|
+
// happens silently), but if the output mentions zelari-code and any
|
|
88
|
+
// of the typical shim failure tokens, surface the recovery.
|
|
89
|
+
if (haystack.includes("zelari-code") &&
|
|
90
|
+
(haystack.includes("not found") ||
|
|
91
|
+
haystack.includes("eexist") ||
|
|
92
|
+
haystack.includes("ebusy") ||
|
|
93
|
+
haystack.includes("shim") ||
|
|
94
|
+
exitCode === 0) // exit 0 but we got here means ok=false — defensive
|
|
95
|
+
) {
|
|
96
|
+
return ("💡 hint: the install may have completed but the global bin shim\n" +
|
|
97
|
+
" is missing or stale (common on Windows + npm 10/11 after major\n" +
|
|
98
|
+
" upgrades). To repair:\n" +
|
|
99
|
+
" npm install -g zelari-code@latest --force\n" +
|
|
100
|
+
" Then re-open the terminal. If `zelari-code` is still not found,\n" +
|
|
101
|
+
" run the doctor: `zelari-code doctor`");
|
|
102
|
+
}
|
|
103
|
+
// Generic: at least tell the user what we tried and where the output went.
|
|
104
|
+
return ("💡 hint: the install did not succeed. To retry with more detail:\n" +
|
|
105
|
+
" npm install -g zelari-code@latest --verbose 2>&1 | tail -40\n" +
|
|
106
|
+
" On Windows, also try: `npm install -g zelari-code@latest --force`\n" +
|
|
107
|
+
(isWin
|
|
108
|
+
? " Run `zelari-code doctor` from a new terminal to diagnose shim / PATH issues.\n"
|
|
109
|
+
: ""));
|
|
110
|
+
}
|
|
40
111
|
//# sourceMappingURL=updater.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiB1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../../src/cli/slashHandlers/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiB1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAwB;IAExB,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,0BAA0B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAChC,YAAY,CACV,GAAG,CAAC,WAAW,EACf,2BAA2B,IAAI,CAAC,aAAa,wBAAwB,IAAI,CAAC,cAAc,KAAK;gBAC3F,iFAAiF,CACpF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CACV,GAAG,CAAC,WAAW,EACf,wBAAwB,IAAI,CAAC,cAAc,GAAG,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV,GAAG,CAAC,WAAW,EACf,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAwB;IAExB,YAAY,CACV,GAAG,CAAC,WAAW,EACf,yDAAyD,CAC1D,CAAC;IACF,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,YAAY,CACV,GAAG,CAAC,WAAW,EACf,uCAAuC;gBACrC,+DAA+D;gBAC/D,6DAA6D,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,oEAAoE;YACpE,iDAAiD;YACjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YAC/C,MAAM,IAAI,GAAG,sBAAsB,CACjC,GAAG,CAAC,KAAK,IAAI,EAAE,EACf,MAAM,EACN,GAAG,CAAC,QAAQ,CACb,CAAC;YACF,YAAY,CACV,GAAG,CAAC,WAAW,EACf,sBAAsB,GAAG,CAAC,KAAK,IAAI,eAAe,IAAI;gBACpD,cAAc,GAAG,CAAC,QAAQ,IAAI,KAAK,MAAM;gBACzC,gBAAgB,MAAM,MAAM;gBAC5B,IAAI,CACP,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV,GAAG,CAAC,WAAW,EACf,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAc,EACd,QAAuB;IAEvB,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAE3C,mEAAmE;IACnE,8DAA8D;IAC9D,IACE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC7B,CAAC;QACD,OAAO,CACL,2CAA2C;YAC3C,iEAAiE;YACjE,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,kCAAkC;IAClC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,CACL,oEAAoE;YACpE,yGAAyG;YACzG,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,CACL,+DAA+D;YAC/D,qEAAqE;YACrE,+DAA+D;YAC/D,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,kEAAkE;IAClE,oEAAoE;IACpE,4DAA4D;IAC5D,IACE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1B,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,QAAQ,KAAK,CAAC,CAAC,CAAC,oDAAoD;MACtE,CAAC;QACD,OAAO,CACL,mEAAmE;YACnE,qEAAqE;YACrE,4BAA4B;YAC5B,sDAAsD;YACtD,sEAAsE;YACtE,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,OAAO,CACL,oEAAoE;QACpE,wEAAwE;QACxE,wEAAwE;QACxE,CAAC,KAAK;YACJ,CAAC,CAAC,mFAAmF;YACrF,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;AACJ,CAAC"}
|