zelari-code 1.0.1 → 1.0.2
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 +188 -151
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +57 -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/package.json +2 -2
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,32 @@ 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("--help") || argv.includes("-h")) {
|
|
92
101
|
// 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
|
-
|
|
102
|
+
console.log("zelari-code — AI Council coding agent CLI.\n" +
|
|
103
|
+
"\n" +
|
|
104
|
+
"Usage: zelari-code [options]\n" +
|
|
105
|
+
"\n" +
|
|
106
|
+
"Options:\n" +
|
|
107
|
+
" --version, -v Print version and exit\n" +
|
|
108
|
+
" --help, -h Print this help and exit\n" +
|
|
109
|
+
" --no-wizard Skip the first-run wizard\n" +
|
|
110
|
+
" --reset-config Re-run the wizard (clears provider.json on commit)\n" +
|
|
111
|
+
" --headless Run a single task without mounting the TUI\n" +
|
|
112
|
+
" --task <text> Task prompt (required in headless mode)\n" +
|
|
113
|
+
" --output json|plain Output format (default: json)\n" +
|
|
114
|
+
" --council Use the 6-member council pipeline\n" +
|
|
115
|
+
" --provider <id> Provider override (default: active)\n" +
|
|
116
|
+
" --model <id> Model override (default: provider default)\n" +
|
|
117
|
+
"\n" +
|
|
118
|
+
"Environment:\n" +
|
|
119
|
+
" ZELARI_NO_WIZARD=1 Skip the first-run wizard\n" +
|
|
120
|
+
" ANATHEMA_DEV=1 Disable background update check\n");
|
|
112
121
|
process.exit(0);
|
|
113
122
|
}
|
|
114
123
|
// Headless mode: short-circuit TUI entirely. Must be checked BEFORE
|
|
@@ -116,7 +125,7 @@ function pickRootComponent() {
|
|
|
116
125
|
// install (no provider.json yet) by passing --provider + env var.
|
|
117
126
|
const headlessParse = parseHeadlessFlags(argv);
|
|
118
127
|
if (headlessParse.options !== null) {
|
|
119
|
-
return { kind:
|
|
128
|
+
return { kind: "headless", headlessOpts: headlessParse.options };
|
|
120
129
|
}
|
|
121
130
|
if (headlessParse.error !== undefined) {
|
|
122
131
|
// eslint-disable-next-line no-console
|
|
@@ -133,13 +142,13 @@ function pickRootComponent() {
|
|
|
133
142
|
if (decision.shouldRun) {
|
|
134
143
|
// eslint-disable-next-line no-console
|
|
135
144
|
console.error(`[zelari-code] starting wizard: ${decision.reason}`);
|
|
136
|
-
return { kind:
|
|
145
|
+
return { kind: "wizard", element: React.createElement(RunWizard) };
|
|
137
146
|
}
|
|
138
147
|
// v0.7.8: one-shot startup splash (ASCII emblem, ~2s or any-key skip),
|
|
139
148
|
// then the App mounts. Skipped automatically for non-TTY stdout, small
|
|
140
149
|
// terminals, or ZELARI_NO_SPLASH=1 — see components/SplashScreen.tsx.
|
|
141
150
|
return {
|
|
142
|
-
kind:
|
|
151
|
+
kind: "app",
|
|
143
152
|
element: React.createElement(SplashGate, { version: VERSION }, React.createElement(App)),
|
|
144
153
|
};
|
|
145
154
|
}
|
|
@@ -155,7 +164,7 @@ function loadUserSkills() {
|
|
|
155
164
|
const summary = loadSkillMdSkills(process.cwd(), { existingIds: existing });
|
|
156
165
|
if (summary.loaded.length > 0) {
|
|
157
166
|
// eslint-disable-next-line no-console
|
|
158
|
-
console.error(`[zelari-code] loaded ${summary.loaded.length} SKILL.md skill(s): ${summary.loaded.join(
|
|
167
|
+
console.error(`[zelari-code] loaded ${summary.loaded.length} SKILL.md skill(s): ${summary.loaded.join(", ")}`);
|
|
159
168
|
}
|
|
160
169
|
for (const s of summary.skipped) {
|
|
161
170
|
// eslint-disable-next-line no-console
|
|
@@ -168,22 +177,24 @@ function loadUserSkills() {
|
|
|
168
177
|
}
|
|
169
178
|
function main() {
|
|
170
179
|
const picked = pickRootComponent();
|
|
171
|
-
if (picked.kind ===
|
|
180
|
+
if (picked.kind === "done")
|
|
172
181
|
return; // --version or --help printed + exited
|
|
173
182
|
loadUserSkills();
|
|
174
|
-
if (picked.kind ===
|
|
183
|
+
if (picked.kind === "headless") {
|
|
175
184
|
void runHeadless(picked.headlessOpts).then((code) => {
|
|
176
|
-
void getMetricsLogger()
|
|
185
|
+
void getMetricsLogger()
|
|
186
|
+
.flush()
|
|
187
|
+
.catch(() => { });
|
|
177
188
|
process.exit(code);
|
|
178
189
|
});
|
|
179
190
|
return;
|
|
180
191
|
}
|
|
181
192
|
const { waitUntilExit, unmount } = render(picked.element);
|
|
182
|
-
process.on(
|
|
193
|
+
process.on("SIGINT", () => {
|
|
183
194
|
unmount();
|
|
184
195
|
void shutdown();
|
|
185
196
|
});
|
|
186
|
-
process.on(
|
|
197
|
+
process.on("SIGTERM", () => {
|
|
187
198
|
unmount();
|
|
188
199
|
void shutdown();
|
|
189
200
|
});
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zelari-code",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero) with slash commands, provider-agnostic LLM streaming, and self-update.",
|
|
5
5
|
"author": "N-THEM Studio",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@testing-library/react": "^16.3.2",
|
|
45
|
-
"@zelari/core": "1.0.
|
|
45
|
+
"@zelari/core": "1.0.1",
|
|
46
46
|
"@types/node": "^25.3.0",
|
|
47
47
|
"@types/react": "^19.0.10",
|
|
48
48
|
"esbuild": "^0.25.0",
|