@siming-org/cli 0.8.6 → 0.8.8
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/index.js +139 -51
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -80,6 +80,12 @@ function userConfigPath() {
|
|
|
80
80
|
}
|
|
81
81
|
var SIMING_NO_CONFIG_FILES_ENV = "SIMING_NO_CONFIG_FILES";
|
|
82
82
|
var immunityNotified = false;
|
|
83
|
+
var warnedInvalidPortOnce = /* @__PURE__ */ new Set();
|
|
84
|
+
function warnInvalidPortOnce(kind, message) {
|
|
85
|
+
if (warnedInvalidPortOnce.has(kind)) return;
|
|
86
|
+
warnedInvalidPortOnce.add(kind);
|
|
87
|
+
console.error(message);
|
|
88
|
+
}
|
|
83
89
|
var SOURCE_FORM_MARK = "/packages/cli/";
|
|
84
90
|
var NODE_MODULES_MARK = "/node_modules/";
|
|
85
91
|
function notifyImmunityOnce() {
|
|
@@ -231,7 +237,7 @@ function resolveLocalSimingPort(env = process.env, paths) {
|
|
|
231
237
|
if (portEnv !== void 0) {
|
|
232
238
|
const n = Number(portEnv);
|
|
233
239
|
if (Number.isInteger(n) && n >= 1 && n <= 65535) return n;
|
|
234
|
-
|
|
240
|
+
warnInvalidPortOnce("invalid-port-env", `[siming] \u5FFD\u7565\u975E\u6CD5 PORT="${portEnv}"\uFF08\u5E94\u4E3A 1-65535 \u6574\u6570\uFF09`);
|
|
235
241
|
}
|
|
236
242
|
const userPath = paths?.user ?? userConfigPath();
|
|
237
243
|
const systemPath = paths?.system ?? SYSTEM_CONFIG_PATH;
|
|
@@ -242,7 +248,7 @@ function resolveLocalSimingPort(env = process.env, paths) {
|
|
|
242
248
|
if (raw === void 0) continue;
|
|
243
249
|
const n = typeof raw === "number" ? raw : Number(raw);
|
|
244
250
|
if (Number.isInteger(n) && n >= 1 && n <= 65535) return n;
|
|
245
|
-
|
|
251
|
+
warnInvalidPortOnce(`invalid-port-file:${absPath}`, `[siming] \u5FFD\u7565 ${absPath} \u4E2D\u975E\u6CD5 port="${String(raw)}"`);
|
|
246
252
|
}
|
|
247
253
|
}
|
|
248
254
|
return 7777;
|
|
@@ -254,6 +260,12 @@ function maskMongoUri(uri) {
|
|
|
254
260
|
// src/config/local-config.ts
|
|
255
261
|
var CONFIG_DIR = join2(homedir2(), ".siming");
|
|
256
262
|
var CONFIG_PATH = join2(CONFIG_DIR, "config.json");
|
|
263
|
+
var warnedOnce = /* @__PURE__ */ new Set();
|
|
264
|
+
function warnOnce(kind, message) {
|
|
265
|
+
if (warnedOnce.has(kind)) return;
|
|
266
|
+
warnedOnce.add(kind);
|
|
267
|
+
console.error(message);
|
|
268
|
+
}
|
|
257
269
|
var ServerUrlSchema = z.string().regex(/^https?:\/\/\S+$/, "must be an http(s):// URL");
|
|
258
270
|
function readLocalConfig(env = process.env, opts = {}) {
|
|
259
271
|
if (opts.ignoreImmunity !== true && shouldSkipConfigFiles(env)) return null;
|
|
@@ -263,12 +275,12 @@ function readLocalConfig(env = process.env, opts = {}) {
|
|
|
263
275
|
if (typeof parsed.serverUrl !== "string" || parsed.serverUrl.length === 0) return null;
|
|
264
276
|
const r = ServerUrlSchema.safeParse(parsed.serverUrl);
|
|
265
277
|
if (!r.success) {
|
|
266
|
-
|
|
278
|
+
warnOnce("local-invalid-serverurl", `[siming] \u5FFD\u7565\u975E\u6CD5 config.json serverUrl="${parsed.serverUrl}"\uFF0C\u964D\u7EA7\u5230\u9ED8\u8BA4`);
|
|
267
279
|
return null;
|
|
268
280
|
}
|
|
269
281
|
return { serverUrl: parsed.serverUrl };
|
|
270
282
|
} catch (e) {
|
|
271
|
-
|
|
283
|
+
warnOnce("local-read-failed", `[siming] \u8BFB\u53D6 ~/.siming/config.json \u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`);
|
|
272
284
|
return null;
|
|
273
285
|
}
|
|
274
286
|
}
|
|
@@ -290,16 +302,42 @@ function getLocalServerUrl() {
|
|
|
290
302
|
}
|
|
291
303
|
|
|
292
304
|
// src/config/workspace-config.ts
|
|
293
|
-
import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync as writeFileSync2, rmSync, renameSync } from "fs";
|
|
294
|
-
import { join as join3, dirname } from "path";
|
|
305
|
+
import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, statSync, writeFileSync as writeFileSync2, rmSync, renameSync } from "fs";
|
|
306
|
+
import { join as join3, dirname, resolve as resolve2 } from "path";
|
|
295
307
|
import { z as z2 } from "zod";
|
|
296
308
|
var WORKSPACE_DIR_NAME = ".siming";
|
|
297
309
|
var CONFIG_FILE = "config.json";
|
|
310
|
+
var warnedOnce2 = /* @__PURE__ */ new Set();
|
|
311
|
+
function warnOnce2(kind, message) {
|
|
312
|
+
if (warnedOnce2.has(kind)) return;
|
|
313
|
+
warnedOnce2.add(kind);
|
|
314
|
+
console.error(message);
|
|
315
|
+
}
|
|
298
316
|
var DefaultProjectSchema = z2.string().regex(/^(?![a-f0-9]{24}$)[a-z0-9][a-z0-9-]{1,30}$/, "must be a project key (kebab-case, 2-31 chars; not a MongoDB id)");
|
|
317
|
+
function mainRepoRootOf(dir) {
|
|
318
|
+
try {
|
|
319
|
+
const st = statSync(join3(dir, ".git"));
|
|
320
|
+
if (!st.isFile()) return null;
|
|
321
|
+
} catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
const gitLine = readFileSync3(join3(dir, ".git"), "utf-8").trim();
|
|
326
|
+
if (!gitLine.startsWith("gitdir:")) return null;
|
|
327
|
+
const gitdir = resolve2(dir, gitLine.slice("gitdir:".length).trim());
|
|
328
|
+
const commondir = readFileSync3(join3(gitdir, "commondir"), "utf-8").trim();
|
|
329
|
+
if (commondir.length === 0) return null;
|
|
330
|
+
return dirname(resolve2(gitdir, commondir));
|
|
331
|
+
} catch {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
299
335
|
function findWorkspaceDir(start) {
|
|
300
336
|
let dir = start !== void 0 && start.length > 0 ? start : process.cwd();
|
|
301
337
|
for (; ; ) {
|
|
302
338
|
if (existsSync3(join3(dir, WORKSPACE_DIR_NAME))) return dir;
|
|
339
|
+
const mainRoot = mainRepoRootOf(dir);
|
|
340
|
+
if (mainRoot !== null && existsSync3(join3(mainRoot, WORKSPACE_DIR_NAME))) return mainRoot;
|
|
303
341
|
const parent = dirname(dir);
|
|
304
342
|
if (parent === dir) return null;
|
|
305
343
|
dir = parent;
|
|
@@ -319,16 +357,16 @@ function readWorkspaceConfig(workspaceDir) {
|
|
|
319
357
|
if (typeof parsed.serverUrl === "string" && parsed.serverUrl.length > 0) {
|
|
320
358
|
const r = ServerUrlSchema.safeParse(parsed.serverUrl);
|
|
321
359
|
if (r.success) cfg.serverUrl = r.data;
|
|
322
|
-
else
|
|
360
|
+
else warnOnce2("workspace-invalid-serverurl", `[siming] \u5FFD\u7565\u975E\u6CD5 .siming/config.json serverUrl="${parsed.serverUrl}"`);
|
|
323
361
|
}
|
|
324
362
|
if (typeof parsed.defaultProject === "string" && parsed.defaultProject.length > 0) {
|
|
325
363
|
const r = DefaultProjectSchema.safeParse(parsed.defaultProject);
|
|
326
364
|
if (r.success) cfg.defaultProject = r.data;
|
|
327
|
-
else
|
|
365
|
+
else warnOnce2("workspace-invalid-defaultproject", `[siming] \u5FFD\u7565\u975E\u6CD5 .siming/config.json defaultProject="${parsed.defaultProject}"`);
|
|
328
366
|
}
|
|
329
367
|
return Object.keys(cfg).length > 0 ? cfg : null;
|
|
330
368
|
} catch (e) {
|
|
331
|
-
|
|
369
|
+
warnOnce2("workspace-read-failed", `[siming] \u8BFB\u53D6\u5DE5\u4F5C\u533A\u914D\u7F6E\u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`);
|
|
332
370
|
return null;
|
|
333
371
|
}
|
|
334
372
|
}
|
|
@@ -522,18 +560,23 @@ function writeGlobalAuthToken(token, path) {
|
|
|
522
560
|
|
|
523
561
|
// src/client/http-client.ts
|
|
524
562
|
var SimingHttpClient = class {
|
|
525
|
-
/** T202609150002:通道 source 标识(x-siming-source header 单一注入口;Web 通道由 web client 固定携带 web
|
|
563
|
+
/** T202609150002:通道 source 标识(x-siming-source header 单一注入口;Web 通道由 web client 固定携带 web)。
|
|
564
|
+
* baseUrl 可传常量或 resolver(T202610150001):长驻进程(mcp-serve)传 resolver 每请求现解析——
|
|
565
|
+
* 与 token 每请求解析(request() 内 resolveAuthToken)同策略,配置补齐/变更后自愈,无需重启。 */
|
|
526
566
|
constructor(baseUrl, source = "cli") {
|
|
527
567
|
this.baseUrl = baseUrl;
|
|
528
568
|
this.source = source;
|
|
529
569
|
}
|
|
530
570
|
baseUrl;
|
|
531
571
|
source;
|
|
532
|
-
|
|
572
|
+
resolveBase() {
|
|
573
|
+
return typeof this.baseUrl === "string" ? this.baseUrl : this.baseUrl();
|
|
574
|
+
}
|
|
575
|
+
/** server base URL(诊断输出用——auth whoami 展示目标地址);每访问现解析 */
|
|
533
576
|
get url() {
|
|
534
|
-
return this.
|
|
577
|
+
return this.resolveBase();
|
|
535
578
|
}
|
|
536
|
-
async request(method, path, body) {
|
|
579
|
+
async request(method, path, body, baseOverride) {
|
|
537
580
|
const token = resolveAuthToken();
|
|
538
581
|
const headers = {
|
|
539
582
|
...token !== void 0 ? { Authorization: `Bearer ${token}` } : {},
|
|
@@ -541,7 +584,8 @@ var SimingHttpClient = class {
|
|
|
541
584
|
// T202609150002:issue 域通道注入(服务端按 header 判定 source,缺省 web)
|
|
542
585
|
"x-siming-source": this.source
|
|
543
586
|
};
|
|
544
|
-
|
|
587
|
+
const base = baseOverride ?? this.resolveBase();
|
|
588
|
+
return fetch(`${base}${path}`, {
|
|
545
589
|
method,
|
|
546
590
|
headers,
|
|
547
591
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
@@ -561,25 +605,27 @@ var SimingHttpClient = class {
|
|
|
561
605
|
}
|
|
562
606
|
/** DELETE 返回 204 无 body,成功即 ok(void) */
|
|
563
607
|
async delete(path) {
|
|
608
|
+
const base = this.resolveBase();
|
|
564
609
|
try {
|
|
565
|
-
const res = await this.request("DELETE", path);
|
|
610
|
+
const res = await this.request("DELETE", path, void 0, base);
|
|
566
611
|
if (res.ok) return ok2(void 0);
|
|
567
612
|
const body = await res.json().catch(() => void 0);
|
|
568
613
|
return fail(extractError(res, body));
|
|
569
614
|
} catch (e) {
|
|
570
|
-
return fail(networkError(e));
|
|
615
|
+
return fail(networkError(e, `${base}${path}`));
|
|
571
616
|
}
|
|
572
617
|
}
|
|
573
618
|
async json(method, path, body) {
|
|
619
|
+
const base = this.resolveBase();
|
|
574
620
|
try {
|
|
575
|
-
const res = await this.request(method, path, body);
|
|
621
|
+
const res = await this.request(method, path, body, base);
|
|
576
622
|
const data = await res.json().catch(() => void 0);
|
|
577
623
|
if (!res.ok) {
|
|
578
624
|
return fail(extractError(res, data));
|
|
579
625
|
}
|
|
580
626
|
return ok2(data);
|
|
581
627
|
} catch (e) {
|
|
582
|
-
return fail(networkError(e));
|
|
628
|
+
return fail(networkError(e, `${base}${path}`));
|
|
583
629
|
}
|
|
584
630
|
}
|
|
585
631
|
};
|
|
@@ -610,35 +656,59 @@ function extractError(res, body) {
|
|
|
610
656
|
}
|
|
611
657
|
}
|
|
612
658
|
if (res.status === 401) {
|
|
613
|
-
error.hint = bizCode === "AUTH_TOKEN_INVALID" ? "Token \u65E0\u6548\u6216\u5DF2\u88AB\
|
|
659
|
+
error.hint = bizCode === "AUTH_TOKEN_INVALID" ? "Token \u65E0\u6548\u6216\u5DF2\u88AB\u540A\u9500\uFF1AWeb \u7BA1\u7406\u53F0\u67E5\u770B/\u590D\u5236\u6709\u6548 Token\uFF0C\u6216\u91CD\u65B0\u7B7E\u53D1\u540E\u8FD0\u884C siming auth token set \u66F4\u65B0\u672C\u5730\u914D\u7F6E" : "\u672A\u914D\u7F6E\u51ED\u8BC1\uFF1A\u8FD0\u884C siming auth whoami \u8BCA\u65AD\u8EAB\u4EFD\uFF1BWeb \u7BA1\u7406\u53F0\u751F\u6210 Token \u540E\u8FD0\u884C siming auth token set \u914D\u7F6E";
|
|
614
660
|
}
|
|
615
661
|
return error;
|
|
616
662
|
}
|
|
617
|
-
|
|
618
|
-
|
|
663
|
+
var warnedOnce3 = /* @__PURE__ */ new Set();
|
|
664
|
+
function warnOnce3(kind, message) {
|
|
665
|
+
if (warnedOnce3.has(kind)) return;
|
|
666
|
+
warnedOnce3.add(kind);
|
|
667
|
+
console.error(message);
|
|
668
|
+
}
|
|
669
|
+
function networkError(e, target) {
|
|
670
|
+
const base = e instanceof Error ? e.message : String(e);
|
|
671
|
+
let message = base;
|
|
672
|
+
if (e instanceof Error && e.cause !== void 0 && e.cause !== null) {
|
|
673
|
+
const cause = e.cause;
|
|
674
|
+
const code = cause !== null && typeof cause === "object" && "code" in cause ? cause.code : void 0;
|
|
675
|
+
const causeMsg = typeof code === "string" && code.length > 0 ? code : cause instanceof Error ? cause.message : String(cause);
|
|
676
|
+
message = `${base}\uFF08${causeMsg}\uFF09`;
|
|
677
|
+
}
|
|
678
|
+
if (target !== void 0) message = `${message} [${target}]`;
|
|
679
|
+
return { message, httpStatus: 0 };
|
|
680
|
+
}
|
|
681
|
+
function resolveServerUrlDetailed(baseUrl) {
|
|
682
|
+
if (baseUrl !== void 0) return { url: baseUrl.replace(/\/$/, ""), source: "flag" };
|
|
683
|
+
const envUrl = process.env.SIMING_SERVER_URL;
|
|
684
|
+
if (envUrl !== void 0) {
|
|
685
|
+
const r = ServerUrlSchema.safeParse(envUrl);
|
|
686
|
+
if (r.success) return { url: r.data.replace(/\/$/, ""), source: "env" };
|
|
687
|
+
warnOnce3("invalid-env-serverurl", `[siming] \u5FFD\u7565\u975E\u6CD5 SIMING_SERVER_URL="${envUrl}"\uFF0C\u964D\u7EA7\u5230\u672C\u5730\u914D\u7F6E/\u9ED8\u8BA4`);
|
|
688
|
+
}
|
|
689
|
+
const workspaceUrl = readWorkspaceConfig()?.serverUrl;
|
|
690
|
+
if (workspaceUrl !== void 0) return { url: workspaceUrl.replace(/\/$/, ""), source: "workspace" };
|
|
691
|
+
const local = readLocalConfig();
|
|
692
|
+
if (local !== null) return { url: local.serverUrl.replace(/\/$/, ""), source: "global" };
|
|
693
|
+
return { url: `http://localhost:${resolveLocalSimingPort()}`, source: "default" };
|
|
619
694
|
}
|
|
620
695
|
function resolveServerUrl(baseUrl) {
|
|
621
|
-
|
|
622
|
-
if (url === void 0) {
|
|
623
|
-
const envUrl = process.env.SIMING_SERVER_URL;
|
|
624
|
-
if (envUrl !== void 0) {
|
|
625
|
-
const r = ServerUrlSchema.safeParse(envUrl);
|
|
626
|
-
if (r.success) {
|
|
627
|
-
url = r.data;
|
|
628
|
-
} else {
|
|
629
|
-
console.error(`[siming] \u5FFD\u7565\u975E\u6CD5 SIMING_SERVER_URL="${envUrl}"\uFF0C\u964D\u7EA7\u5230\u672C\u5730\u914D\u7F6E/\u9ED8\u8BA4`);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
url = url ?? readWorkspaceConfig()?.serverUrl ?? getLocalServerUrl();
|
|
634
|
-
return url.replace(/\/$/, "");
|
|
696
|
+
return resolveServerUrlDetailed(baseUrl).url;
|
|
635
697
|
}
|
|
636
698
|
function createClient(baseUrl, source) {
|
|
637
|
-
return new SimingHttpClient(resolveServerUrl(baseUrl), source);
|
|
699
|
+
if (baseUrl !== void 0) return new SimingHttpClient(resolveServerUrl(baseUrl), source);
|
|
700
|
+
return new SimingHttpClient(() => resolveServerUrl(), source);
|
|
638
701
|
}
|
|
639
702
|
|
|
640
703
|
// src/commands/healthcheck.ts
|
|
641
704
|
var HEALTHCHECK_TIMEOUT_MS = 2e3;
|
|
705
|
+
var SOURCE_LABEL = {
|
|
706
|
+
flag: "CLI \u53C2\u6570 --url",
|
|
707
|
+
env: "\u73AF\u5883\u53D8\u91CF SIMING_SERVER_URL",
|
|
708
|
+
workspace: "\u5DE5\u4F5C\u533A .siming/config.json",
|
|
709
|
+
global: "\u5168\u5C40 ~/.siming/config.json",
|
|
710
|
+
default: "\u9ED8\u8BA4\u63A8\u5BFC"
|
|
711
|
+
};
|
|
642
712
|
async function runHealthcheck(opts) {
|
|
643
713
|
try {
|
|
644
714
|
const res = await fetch(`${opts.url}/health`, { signal: AbortSignal.timeout(HEALTHCHECK_TIMEOUT_MS) });
|
|
@@ -652,12 +722,21 @@ async function runHealthcheck(opts) {
|
|
|
652
722
|
}
|
|
653
723
|
}
|
|
654
724
|
async function healthcheckCommand(opts) {
|
|
655
|
-
const
|
|
725
|
+
const resolved = resolveServerUrlDetailed(opts.url);
|
|
726
|
+
const result = await runHealthcheck({ url: resolved.url });
|
|
656
727
|
if (result.ok) {
|
|
657
|
-
ok(`server healthy (v${result.version})`);
|
|
728
|
+
ok(`server healthy (v${result.version}) [${resolved.url}\uFF08\u6765\u6E90: ${SOURCE_LABEL[resolved.source]}\uFF09]`);
|
|
729
|
+
} else if (resolved.source === "default") {
|
|
730
|
+
err(
|
|
731
|
+
`\u672A\u53D1\u73B0\u4EFB\u4F55 siming \u914D\u7F6E\uFF08env/\u5DE5\u4F5C\u533A/\u5168\u5C40\u5C42\u5747\u672A\u8BBE\u7F6E serverUrl\uFF09\uFF0C\u6309\u9ED8\u8BA4\u5730\u5740 ${resolved.url} \u63A2\u6D4B\u5931\u8D25: ${result.error ?? "unknown"}`
|
|
732
|
+
);
|
|
733
|
+
info(
|
|
734
|
+
"hint: server \u672A\u542F\u52A8\u5219\u5148\u8FD0\u884C `siming server start`\uFF1Bserver \u5DF2\u542F\u52A8\u4F46\u7AEF\u53E3\u4E0D\u540C\uFF0C\u5219\u5728\u9879\u76EE\u6839\u521B\u5EFA .siming/config.json \u914D\u7F6E serverUrl\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF SIMING_SERVER_URL"
|
|
735
|
+
);
|
|
736
|
+
process.exitCode = 1;
|
|
658
737
|
} else {
|
|
659
|
-
err(`server
|
|
660
|
-
info("hint:
|
|
738
|
+
err(`server \u4E0D\u53EF\u8FBE\uFF08${resolved.url}\uFF0C\u6765\u6E90: ${SOURCE_LABEL[resolved.source]}\uFF09: ${result.error ?? "unknown"}`);
|
|
739
|
+
info("hint: \u786E\u8BA4\u8BE5\u5730\u5740\u4E0A\u7684 server \u662F\u5426\u5B58\u6D3B\uFF08siming server status\uFF09\uFF1B\u5730\u5740\u4E0D\u5BF9\u5219\u4FEE\u6B63\u5BF9\u5E94\u6765\u6E90\u5C42\u7684 serverUrl \u914D\u7F6E");
|
|
661
740
|
process.exitCode = 1;
|
|
662
741
|
}
|
|
663
742
|
}
|
|
@@ -2214,13 +2293,13 @@ function writeWorkspaceLayer(token, kind, opts) {
|
|
|
2214
2293
|
return ok2({ path: devJsonPath, kind, warnedDirectStart: !hadIsolationKeys, overwrote: hadToken });
|
|
2215
2294
|
}
|
|
2216
2295
|
function readStdinLine(stream) {
|
|
2217
|
-
return new Promise((
|
|
2296
|
+
return new Promise((resolve4) => {
|
|
2218
2297
|
let data = "";
|
|
2219
2298
|
const finish = (value) => {
|
|
2220
2299
|
stream.removeAllListeners("readable");
|
|
2221
2300
|
stream.removeAllListeners("end");
|
|
2222
2301
|
stream.destroy?.();
|
|
2223
|
-
|
|
2302
|
+
resolve4(value);
|
|
2224
2303
|
};
|
|
2225
2304
|
stream.setEncoding("utf8");
|
|
2226
2305
|
stream.on("end", () => finish(data));
|
|
@@ -3182,7 +3261,16 @@ function createMcpServer() {
|
|
|
3182
3261
|
}
|
|
3183
3262
|
|
|
3184
3263
|
// src/commands/mcp-serve.ts
|
|
3264
|
+
var SOURCE_LABEL2 = {
|
|
3265
|
+
flag: "CLI \u53C2\u6570 --url",
|
|
3266
|
+
env: "\u73AF\u5883\u53D8\u91CF SIMING_SERVER_URL",
|
|
3267
|
+
workspace: "\u5DE5\u4F5C\u533A .siming/config.json",
|
|
3268
|
+
global: "\u5168\u5C40 ~/.siming/config.json",
|
|
3269
|
+
default: "\u9ED8\u8BA4\u63A8\u5BFC"
|
|
3270
|
+
};
|
|
3185
3271
|
async function mcpServeCommand() {
|
|
3272
|
+
const resolved = resolveServerUrlDetailed();
|
|
3273
|
+
console.error(`[siming] mcp-serve \u5DF2\u542F\u52A8\uFF1Aserver=${resolved.url}\uFF08\u6765\u6E90: ${SOURCE_LABEL2[resolved.source]}\uFF09\uFF1BserverUrl \u6BCF\u8BF7\u6C42\u73B0\u89E3\u6790\uFF0C\u914D\u7F6E\u53D8\u66F4\u65E0\u9700\u91CD\u542F`);
|
|
3186
3274
|
const server = createMcpServer();
|
|
3187
3275
|
const transport = new StdioServerTransport();
|
|
3188
3276
|
await server.connect(transport);
|
|
@@ -9047,7 +9135,7 @@ async function runDoctor(client) {
|
|
|
9047
9135
|
name: "auth",
|
|
9048
9136
|
status: invalidToken ? "FAIL" : missingToken ? "WARN" : "PASS",
|
|
9049
9137
|
detail: `server \u9274\u6743${authEnabled ? "\u5DF2\u5F00\u542F" : "\u672A\u5F00\u542F"}\uFF1B\u51ED\u8BC1\u5C42\uFF1A${layerDetail}\uFF1Bserver \u5B9E\u6D4B\u8EAB\u4EFD\uFF1A${identity}`,
|
|
9050
|
-
...invalidToken ? { hint: "\u672C\u5730 Token \u672A\u901A\u8FC7 server \u6821\u9A8C\uFF08\u53EF\u80FD\u5DF2\u88AB\
|
|
9138
|
+
...invalidToken ? { hint: "\u672C\u5730 Token \u672A\u901A\u8FC7 server \u6821\u9A8C\uFF08\u53EF\u80FD\u5DF2\u88AB\u540A\u9500\uFF09\u2014\u2014Web \u7BA1\u7406\u53F0\u67E5\u770B/\u590D\u5236\u6709\u6548 Token \u6216\u91CD\u65B0\u7B7E\u53D1\u540E\u8FD0\u884C siming auth token set --force \u66F4\u65B0" } : {},
|
|
9051
9139
|
...missingToken ? { hint: "\u9274\u6743\u5DF2\u5F00\u542F\u4F46\u672C\u5730\u672A\u914D\u7F6E Token\u2014\u2014\u6570\u636E\u64CD\u4F5C\u5C06 401\uFF1BWeb \u7BA1\u7406\u53F0\u751F\u6210 Token \u540E\u8FD0\u884C siming auth token set --global \u914D\u7F6E\uFF08\u672C\u673A\u4E00\u6B21\u5168\u5DE5\u4F5C\u533A\u751F\u6548\uFF09\uFF0C\u6216\u5DE5\u4F5C\u533A\u914D\u7F6E siming auth token set" } : {}
|
|
9052
9140
|
});
|
|
9053
9141
|
}
|
|
@@ -9315,13 +9403,13 @@ function createSettingsCommand() {
|
|
|
9315
9403
|
return settings;
|
|
9316
9404
|
}
|
|
9317
9405
|
function readStdin() {
|
|
9318
|
-
return new Promise((
|
|
9406
|
+
return new Promise((resolve4) => {
|
|
9319
9407
|
let data = "";
|
|
9320
9408
|
process.stdin.setEncoding("utf8");
|
|
9321
9409
|
process.stdin.on("data", (chunk) => {
|
|
9322
9410
|
data += chunk;
|
|
9323
9411
|
});
|
|
9324
|
-
process.stdin.on("end", () =>
|
|
9412
|
+
process.stdin.on("end", () => resolve4(data));
|
|
9325
9413
|
});
|
|
9326
9414
|
}
|
|
9327
9415
|
|
|
@@ -9333,7 +9421,7 @@ import { VERSION as VERSION4, SIMING_CONFIG_KEYS as SIMING_CONFIG_KEYS2 } from "
|
|
|
9333
9421
|
// src/commands/server/daemon.ts
|
|
9334
9422
|
import { execFileSync } from "child_process";
|
|
9335
9423
|
import { closeSync, existsSync as existsSync11, lstatSync, mkdirSync as mkdirSync6, openSync, readFileSync as readFileSync17, renameSync as renameSync5, rmSync as rmSync4, writeFileSync as writeFileSync6 } from "fs";
|
|
9336
|
-
import { join as join11, resolve as
|
|
9424
|
+
import { join as join11, resolve as resolve3 } from "path";
|
|
9337
9425
|
import { spawn } from "child_process";
|
|
9338
9426
|
|
|
9339
9427
|
// src/commands/server/probe.ts
|
|
@@ -9542,7 +9630,7 @@ function readLogTail(lines = 30) {
|
|
|
9542
9630
|
return all.slice(-lines);
|
|
9543
9631
|
}
|
|
9544
9632
|
function spawnDaemon(configEnv) {
|
|
9545
|
-
const entry =
|
|
9633
|
+
const entry = resolve3(process.argv[1] ?? "");
|
|
9546
9634
|
if (entry.length === 0 || !existsSync11(entry)) {
|
|
9547
9635
|
throw new Error(`\u65E0\u6CD5\u5B9A\u4F4D siming \u5165\u53E3\u811A\u672C\uFF08process.argv[1]=${process.argv[1] ?? "(\u7A7A)"}\uFF09`);
|
|
9548
9636
|
}
|
|
@@ -9867,12 +9955,12 @@ async function logsAction(opts) {
|
|
|
9867
9955
|
}
|
|
9868
9956
|
if (tail.length > 0) console.log(tail.join("\n"));
|
|
9869
9957
|
if (!opts.follow) return 0;
|
|
9870
|
-
await new Promise((
|
|
9958
|
+
await new Promise((resolve4) => {
|
|
9871
9959
|
const child = spawn2("tail", ["-n", "0", "-f", logfilePath()], { stdio: "inherit" });
|
|
9872
|
-
child.on("exit", () =>
|
|
9960
|
+
child.on("exit", () => resolve4());
|
|
9873
9961
|
child.on("error", (e) => {
|
|
9874
9962
|
err(`\u65E0\u6CD5\u542F\u52A8 tail: ${e.message}`);
|
|
9875
|
-
|
|
9963
|
+
resolve4();
|
|
9876
9964
|
});
|
|
9877
9965
|
});
|
|
9878
9966
|
return 0;
|
|
@@ -10267,7 +10355,7 @@ function createAuthCommand() {
|
|
|
10267
10355
|
info("\u63D0\u793A\uFF1A\u76EE\u6807 server \u5DF2\u5F00\u542F\u9274\u6743\u4E14\u672C\u5730\u672A\u914D\u7F6E Token\u2014\u2014Web \u7BA1\u7406\u53F0\u751F\u6210 Token \u540E\u8FD0\u884C siming auth token set --global \u914D\u7F6E\uFF08\u672C\u673A\u4E00\u6B21\u5168\u5DE5\u4F5C\u533A\u751F\u6548\uFF09\uFF0C\u6216\u5DE5\u4F5C\u533A\u914D\u7F6E siming auth token set\uFF08\u9879\u76EE\u5F52\u5C5E\u573A\u666F\uFF09");
|
|
10268
10356
|
}
|
|
10269
10357
|
if (authEnabled && localToken !== "none" && identity === "none") {
|
|
10270
|
-
info("\u63D0\u793A\uFF1A\u672C\u5730 Token \u672A\u901A\u8FC7 server \u6821\u9A8C\uFF08\u53EF\u80FD\u5DF2\u88AB\
|
|
10358
|
+
info("\u63D0\u793A\uFF1A\u672C\u5730 Token \u672A\u901A\u8FC7 server \u6821\u9A8C\uFF08\u53EF\u80FD\u5DF2\u88AB\u540A\u9500\uFF09\u2014\u2014Web \u7BA1\u7406\u53F0\u67E5\u770B/\u590D\u5236\u6709\u6548 Token \u6216\u91CD\u65B0\u7B7E\u53D1\u540E siming auth token set --force \u66F4\u65B0");
|
|
10271
10359
|
}
|
|
10272
10360
|
process.exitCode = 0;
|
|
10273
10361
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@siming-org/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Wuchao",
|
|
6
6
|
"engines": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"picocolors": "^1.1.1",
|
|
28
28
|
"yaml": "^2.6.0",
|
|
29
29
|
"zod": "^4.4.3",
|
|
30
|
-
"@siming-org/core": "0.8.
|
|
31
|
-
"@siming-org/server": "0.8.
|
|
30
|
+
"@siming-org/core": "0.8.8",
|
|
31
|
+
"@siming-org/server": "0.8.8"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"tsup": "^8.3.5",
|