@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.
Files changed (2) hide show
  1. package/dist/index.js +139 -51
  2. 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
- console.error(`[siming] \u5FFD\u7565\u975E\u6CD5 PORT="${portEnv}"\uFF08\u5E94\u4E3A 1-65535 \u6574\u6570\uFF09`);
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
- console.error(`[siming] \u5FFD\u7565 ${absPath} \u4E2D\u975E\u6CD5 port="${String(raw)}"`);
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
- console.error(`[siming] \u5FFD\u7565\u975E\u6CD5 config.json serverUrl="${parsed.serverUrl}"\uFF0C\u964D\u7EA7\u5230\u9ED8\u8BA4`);
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
- console.error(`[siming] \u8BFB\u53D6 ~/.siming/config.json \u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`);
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 console.error(`[siming] \u5FFD\u7565\u975E\u6CD5 .siming/config.json serverUrl="${parsed.serverUrl}"`);
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 console.error(`[siming] \u5FFD\u7565\u975E\u6CD5 .siming/config.json defaultProject="${parsed.defaultProject}"`);
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
- console.error(`[siming] \u8BFB\u53D6\u5DE5\u4F5C\u533A\u914D\u7F6E\u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`);
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
- /** server base URL(诊断输出用——auth whoami 展示目标地址) */
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.baseUrl;
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
- return fetch(`${this.baseUrl}${path}`, {
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\u91CD\u7F6E\uFF1AWeb \u7BA1\u7406\u53F0\u91CD\u65B0\u751F\u6210\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";
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
- function networkError(e) {
618
- return { message: e instanceof Error ? e.message : String(e), httpStatus: 0 };
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
- let url = baseUrl;
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 result = await runHealthcheck({ url: resolveServerUrl(opts.url) });
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 unreachable: ${result.error ?? "unknown"}`);
660
- info("hint: run `siming server start` (Phase-1 setup) or check the URL");
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((resolve3) => {
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
- resolve3(value);
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\u91CD\u7F6E\uFF09\u2014\u2014Web \u7BA1\u7406\u53F0\u91CD\u65B0\u751F\u6210\u540E\u8FD0\u884C siming auth token set --force \u66F4\u65B0" } : {},
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((resolve3) => {
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", () => resolve3(data));
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 resolve2 } from "path";
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 = resolve2(process.argv[1] ?? "");
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((resolve3) => {
9958
+ await new Promise((resolve4) => {
9871
9959
  const child = spawn2("tail", ["-n", "0", "-f", logfilePath()], { stdio: "inherit" });
9872
- child.on("exit", () => resolve3());
9960
+ child.on("exit", () => resolve4());
9873
9961
  child.on("error", (e) => {
9874
9962
  err(`\u65E0\u6CD5\u542F\u52A8 tail: ${e.message}`);
9875
- resolve3();
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\u91CD\u7F6E\uFF09\u2014\u2014\u91CD\u65B0\u751F\u6210\u540E siming auth token set --force \u66F4\u65B0");
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.6",
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.6",
31
- "@siming-org/server": "0.8.6"
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",