@my-life-buddies/cli 0.27.1-dev.2 → 0.27.1

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/bin/buddy.js CHANGED
@@ -68,6 +68,7 @@ function createRuntimeLogForwarder(onLog, secrets) {
68
68
  // apps/cli/src/platform-host.ts
69
69
  import {
70
70
  CloudAuthenticator,
71
+ EcsSessionMigrationStore,
71
72
  BuddyDevError,
72
73
  checkRuntimeUpdate,
73
74
  checkProjectGateway,
@@ -95,8 +96,7 @@ import {
95
96
  connectPreviewBridge
96
97
  } from "./preview.js";
97
98
  var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
98
- buddy-cli-sit preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>] [--no-open]
99
- buddy-cli-sit preview --local [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]
99
+ buddy-cli preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>] [--no-open]
100
100
 
101
101
  \u8BF4\u660E:
102
102
  \u9ED8\u8BA4\u6253\u5F00\u5F53\u524D\u642D\u5B50\u7684\u521B\u9020\u8005\u540E\u53F0\u300C\u5F00\u53D1\u8C03\u8BD5\u300D\uFF0C\u8FDE\u63A5\u672C\u5730\u5DE5\u7A0B\uFF1B\u5728\u540E\u53F0\u542F\u52A8/\u505C\u6B62 DEV\u3001\u8BD5\u804A\u3001\u67E5\u770B Widget\u3001\u65F6\u95F4\u7EBF\u4E0E\u534F\u8BAE\u65E5\u5FD7\u3001\u771F\u673A\u9884\u89C8\u3002
@@ -104,16 +104,15 @@ var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
104
104
  \u540E\u53F0\u590D\u5236\u7684\u547D\u4EE4\u5E26 --no-open\uFF0C\u53EA\u8FDE\u63A5\u5DE5\u7A0B\uFF0C\u539F\u8C03\u8BD5\u9875\u81EA\u52A8\u63A5\u5165\uFF0C\u4E0D\u91CD\u590D\u6253\u5F00\u7F51\u9875\uFF1B\u9875\u9762\u5173\u95ED\u540E\u53EF\u6253\u5F00\u7EC8\u7AEF\u4E2D\u7684\u5730\u5740\u3002
105
105
  \u8FDE\u63A5\u540E\u5373\u53EF\u67E5\u770B\u5DE5\u7A0B\u6A21\u578B\u548C\u5DE5\u5177\u5217\u8868\uFF0C\u65E0\u9700\u53D1\u9001\u6D88\u606F\uFF1BCLI \u53EA\u8BFB\u73B0\u6709\u6E90\u4EE3\u7801\uFF0C\u52A8\u6001\u914D\u7F6E\u6807\u6CE8\u5F85\u786E\u8BA4\uFF0C\u4FDD\u5B58\u540E\u81EA\u52A8\u5237\u65B0\u3002
106
106
  \u4E0D\u6267\u884C\u4E1A\u52A1\u5DE5\u5382\u6765\u63A2\u6D4B\u914D\u7F6E\uFF0C\u4E0D\u65B0\u589E\u5DE5\u7A0B\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E5F\u4E0D\u8981\u6C42\u4E3A\u6B64\u5347\u7EA7 Runtime\u3002\u6BCF\u6B21\u8C03\u7528\u7684\u5B9E\u9645\u6A21\u578B\u4E0E\u5DE5\u5177\u4EE5\u6A21\u578B\u8C03\u7528\u65E5\u5FD7\u4E3A\u51C6\u3002
107
- --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\u3002
108
- --local \u662F\u540E\u53F0\u4E0D\u53EF\u7528\u65F6\u7684\u72EC\u7ACB\u672C\u5730\u9884\u89C8\u5907\u7528\u5165\u53E3\uFF0C--port \u4EC5\u4E0E --local \u4E00\u8D77\u4F7F\u7528\u3002
107
+ \u8C03\u8BD5\u9875\u9762\u7531\u521B\u9020\u8005\u540E\u53F0\u63D0\u4F9B\uFF1BCLI \u53EA\u8FDE\u63A5\u548C\u8FD0\u884C\u672C\u5730\u5DE5\u7A0B\uFF0C\u4E0D\u63D0\u4F9B\u72EC\u7ACB\u672C\u5730\u7F51\u9875\u3002
109
108
  \u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u6216\u5173\u95ED\u7EC8\u7AEF\u4F1A\u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\uFF0C\u5237\u65B0\u540E\u53F0\u4E0D\u4F1A\u81EA\u52A8\u542F\u52A8 DEV\u3002
110
109
  DEV \u5931\u8D25\u5148\u67E5\u770B\u5177\u4F53\u9519\u8BEF\u548C\u8FD0\u884C\u65E5\u5FD7\uFF1B\u5347\u7EA7 CLI \u540E\u9000\u51FA\u65E7 preview \u8FDB\u7A0B\u5E76\u91CD\u65B0\u8FDE\u63A5\uFF0C\u518D\u542F\u52A8 DEV\u3002
111
- \u540E\u53F0\u53EF\u5F3A\u5236\u65AD\u8FDE\uFF1B\u672C\u673A\u505C\u6B62\u672A\u786E\u8BA4\u65F6\uFF0C\u5728\u539F\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C buddy-cli-sit dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002
112
- \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
113
- SIT \u5305\u56FA\u5B9A\u8FDE\u63A5 SIT\uFF1B\u5730\u5740\u53C2\u6570\u53EA\u6821\u9A8C\u56FA\u5B9A\u76EE\u6807\uFF0C\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\u3002Runtime \u7F51\u5173\u7531 CLI \u6CE8\u5165\u3002
114
- CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u68C0\u67E5\u5DE5\u7A0B Runtime \u7684\u51C6\u786E\u7248\u672C\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E0E npm dev \u6700\u65B0\u7248\u672C\u4E00\u81F4\u3002
110
+ \u540E\u53F0\u53EF\u5F3A\u5236\u65AD\u8FDE\uFF1B\u672C\u673A\u505C\u6B62\u672A\u786E\u8BA4\u65F6\uFF0C\u5728\u539F\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C buddy-cli dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002
111
+ \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6B63\u5F0F\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
112
+ \u6B63\u5F0F\u7248\u56FA\u5B9A\u8FDE\u63A5 PROD\uFF1B\u5730\u5740\u53C2\u6570\u53EA\u6821\u9A8C\u56FA\u5B9A\u76EE\u6807\uFF0C\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\u3002Runtime \u7F51\u5173\u7531 CLI \u6CE8\u5165\u3002
113
+ CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u5FC5\u987B\u901A\u8FC7 npm \u6700\u65B0\u7A33\u5B9A\u7248\u68C0\u67E5\u3002
115
114
  \u8EAB\u4EFD\u8BFB\u53D6 package.json.buddyId\uFF1B.env \u4FDD\u5B58 Token\uFF0C\u542F\u52A8\u524D\u5411 Server \u6821\u9A8C\u6240\u5C5E\u642D\u5B50\u3002
116
- \u8FDE\u63A5\u524D\u81EA\u68C0 .env \u7F51\u5173\uFF1B\u53D1\u73B0\u5176\u4ED6\u73AF\u5883\u5730\u5740\u65F6\u505C\u6B62\uFF1B\u8BF7\u4F7F\u7528\u5BF9\u5E94 CLI\uFF0C\u8FC1\u79FB\u65F6\u65B0\u5EFA\u8EAB\u4EFD\u4E14\u4E0D\u590D\u5236\u51ED\u636E\u3002
115
+ \u8FDE\u63A5\u524D\u81EA\u68C0 .env \u7F51\u5173\uFF1B\u5DF2\u77E5\u65E7 ECS \u5730\u5740\u5728\u542F\u52A8 DEV \u65F6\u6821\u9A8C\u5F52\u5C5E\u5E76\u81EA\u52A8\u66F4\u65B0\uFF0C\u4E0D\u540C\u5E73\u53F0\u4ECD\u9700\u660E\u786E\u786E\u8BA4\u3002
117
116
  --refresh-token \u91CD\u65B0\u9886\u53D6\u5DF2\u6709\u5F00\u53D1 Token\uFF0C\u66F4\u65B0\u540C\u4E00\u73AF\u5883\u7684\u5DE5\u7A0B .env\uFF1B\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\uFF0C\u4E0D\u4F1A\u751F\u6210\u65B0\u5BC6\u94A5\u3002
118
117
  Widget \u6D88\u606F\u5361\u7247\u4FDD\u7559\u6307\u5B9A\u8BB0\u5F55\u7684\u6253\u5F00\u76EE\u6807\uFF0C\u5C0F\u6302\u4EF6\u5217\u8868\u6253\u5F00\u9ED8\u8BA4\u89C6\u56FE\u3002
119
118
  Widget \u9875\u9762\u5199\u64CD\u4F5C\u987B\u7531 operations.userUI \u663E\u5F0F\u6388\u6743\uFF0C\u7F3A\u7701\u53EA\u8BFB\uFF1B\u540E\u53F0\u7F16\u8F91\u8FD8\u9700\u914D\u5957 Server\u3001Web \u548C window.dadaWidget \u6865\u63A5\u3002
@@ -133,9 +132,7 @@ function parsePreviewArguments(args) {
133
132
  let directory = ".";
134
133
  let directorySet = false;
135
134
  let appServer;
136
- let port;
137
135
  let help = false;
138
- let local = false;
139
136
  let noOpen = false;
140
137
  let refreshToken = false;
141
138
  let buddyId;
@@ -152,11 +149,7 @@ function parsePreviewArguments(args) {
152
149
  help = true;
153
150
  continue;
154
151
  }
155
- if (flag === "--local") {
156
- if (local) throw new Error("--local \u4E0D\u80FD\u91CD\u590D");
157
- local = true;
158
- continue;
159
- }
152
+ if (flag === "--local" || flag === "--port") throw new Error(`${flag} \u5DF2\u505C\u7528\uFF1B\u8BF7\u8FD0\u884C buddy-cli preview\uFF0C\u5728\u521B\u9020\u8005\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u3002`);
160
153
  if (flag === "--no-open") {
161
154
  if (noOpen) throw new Error("--no-open \u4E0D\u80FD\u91CD\u590D");
162
155
  noOpen = true;
@@ -177,10 +170,6 @@ function parsePreviewArguments(args) {
177
170
  directory = value;
178
171
  directorySet = true;
179
172
  break;
180
- case "--port":
181
- if (port !== void 0 || !/^\d+$/u.test(value) || Number(value) < 1 || Number(value) > 65535) throw new Error("--port \u5FC5\u987B\u662F 1\u201365535 \u7684\u7AEF\u53E3\u4E14\u4E0D\u80FD\u91CD\u590D");
182
- port = Number(value);
183
- break;
184
173
  case "--app-server":
185
174
  appServer = setOnce(appServer, value, flag);
186
175
  break;
@@ -188,16 +177,7 @@ function parsePreviewArguments(args) {
188
177
  throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? ""}`);
189
178
  }
190
179
  }
191
- if (port !== void 0 && !local) throw new Error("--port \u4EC5\u7528\u4E8E --local \u5907\u7528\u9884\u89C8");
192
- if (local && developerWeb) throw new Error("--local \u4E0D\u9700\u8981 --developer-web");
193
- if (local && noOpen) throw new Error("--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF0C\u4E0D\u80FD\u548C --local \u4E00\u8D77\u4F7F\u7528");
194
- return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...port === void 0 ? {} : { port }, ...refreshToken ? { refreshToken: true } : {}, ...noOpen ? { noOpen: true } : {} });
195
- }
196
- function waitForAbort(signal) {
197
- if (signal.aborted) return Promise.resolve();
198
- return new Promise((resolveWait) => {
199
- signal.addEventListener("abort", () => resolveWait(), { once: true });
200
- });
180
+ return Object.freeze({ directory, appServer, help, buddyId, developerWeb, ...refreshToken ? { refreshToken: true } : {}, ...noOpen ? { noOpen: true } : {} });
201
181
  }
202
182
  function previewHandle(handle) {
203
183
  return Object.freeze({
@@ -312,12 +292,12 @@ var BuddyPlatformHost = class {
312
292
  }
313
293
  });
314
294
  await controller.refreshInspection();
315
- const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });
295
+ const serverHandle = await startPreviewControlServer({ controller });
316
296
  let bridge;
317
297
  try {
318
298
  const pageUrl = new URL(webUrl);
319
299
  pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;
320
- if (!parsed.local) bridge = await connectPreviewBridge({
300
+ bridge = await connectPreviewBridge({
321
301
  webUrl,
322
302
  platformOrigin: baseUrl.origin,
323
303
  buddyId: manifest.buddyId,
@@ -330,10 +310,10 @@ var BuddyPlatformHost = class {
330
310
  });
331
311
  if (parsed.noOpen) io.write(`\u8BF7\u8FD4\u56DE\u539F\u540E\u53F0\u8C03\u8BD5\u9875\uFF0C\u9875\u9762\u4F1A\u81EA\u52A8\u63A5\u5165\u672C\u5730\u5DE5\u7A0B\u3002\u9875\u9762\u5730\u5740\uFF1A${pageUrl.href}`);
332
312
  else {
333
- await this.#openUrl(parsed.local ? serverHandle.bootstrapUrl : pageUrl);
334
- io.write(`\u642D\u642D${parsed.local ? "\u5907\u7528\u672C\u5730\u9884\u89C8" : "\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5"}\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${parsed.local ? serverHandle.origin.href : pageUrl.href}`);
313
+ await this.#openUrl(pageUrl);
314
+ io.write(`\u642D\u642D\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${pageUrl.href}`);
335
315
  }
336
- if (!parsed.local) io.write(`${bridge?.reused ? "\u5DF2\u590D\u7528" : "\u5DF2\u8FDE\u63A5"}\u672C\u5730\u5DE5\u7A0B\uFF1A${projectRoot}\uFF08${manifest.buddyId}\uFF09\uFF0C\u8BF7\u5728\u540E\u53F0\u67E5\u770B DEV \u72B6\u6001\u3002`);
316
+ io.write(`${bridge?.reused ? "\u5DF2\u590D\u7528" : "\u5DF2\u8FDE\u63A5"}\u672C\u5730\u5DE5\u7A0B\uFF1A${projectRoot}\uFF08${manifest.buddyId}\uFF09\uFF0C\u8BF7\u5728\u540E\u53F0\u67E5\u770B DEV \u72B6\u6001\u3002`);
337
317
  io.write("\u5728\u9875\u9762\u4E2D\u542F\u52A8 DEV\uFF1B\u6D88\u606F\u4F1A\u7ECF\u8FC7 DEV App Server\uFF0C\u4E0D\u4F1A\u4ECE\u6D4F\u89C8\u5668\u76F4\u8FDE Agent\u3002");
338
318
  if (bridge?.reused) {
339
319
  io.write("\u8FDE\u63A5\u7531\u539F CLI \u7EF4\u6301\uFF0C\u8BF7\u4FDD\u6301\u539F\u7EC8\u7AEF\u8FD0\u884C\uFF1B\u5F53\u524D\u547D\u4EE4\u5DF2\u5B8C\u6210\u3002");
@@ -341,7 +321,7 @@ var BuddyPlatformHost = class {
341
321
  }
342
322
  io.write("\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\u3002");
343
323
  if (signal.aborted) return { exitCode: 130, route: "preview" };
344
- await (bridge ? bridge.completion : waitForAbort(signal));
324
+ await bridge.completion;
345
325
  return { exitCode: 130, route: "preview" };
346
326
  } finally {
347
327
  await bridge?.close().catch(() => void 0);
@@ -445,10 +425,16 @@ var BuddyPlatformHost = class {
445
425
  developerWebUrl,
446
426
  openBrowser: this.#openUrl
447
427
  }),
448
- new SystemCloudTokenStore({
449
- account: `developer-session:${createHash("sha256").update(key).digest("hex")}`,
450
- commandRunner: this.#credentialCommandRunner
451
- })
428
+ new EcsSessionMigrationStore(
429
+ new SystemCloudTokenStore({
430
+ account: `developer-session:${createHash("sha256").update(key).digest("hex")}`,
431
+ commandRunner: this.#credentialCommandRunner
432
+ }),
433
+ new SystemCloudTokenStore({
434
+ account: `developer-session:${createHash("sha256").update("https://47.116.168.81").digest("hex")}`,
435
+ commandRunner: this.#credentialCommandRunner
436
+ })
437
+ )
452
438
  );
453
439
  this.#sessions.set(key, session);
454
440
  }
@@ -459,7 +445,7 @@ var BuddyPlatformHost = class {
459
445
  // apps/cli/src/platform-support.ts
460
446
  var UnsupportedDeveloperPlatformError = class extends Error {
461
447
  constructor(platform) {
462
- super(`buddy-cli-sit V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);
448
+ super(`buddy-cli V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);
463
449
  this.platform = platform;
464
450
  this.name = "UnsupportedDeveloperPlatformError";
465
451
  }
@@ -475,6 +461,7 @@ import { readFile } from "node:fs/promises";
475
461
  import { homedir as homedir2 } from "node:os";
476
462
  import { join as join3 } from "node:path";
477
463
  import { promisify } from "node:util";
464
+ import { npmPackageManifest } from "./core.js";
478
465
 
479
466
  // apps/cli/src/update-lock.ts
480
467
  import { mkdir, rm, writeFile } from "node:fs/promises";
@@ -482,7 +469,7 @@ import { dirname, join } from "node:path";
482
469
  import { homedir } from "node:os";
483
470
  import { createHash as createHash2 } from "node:crypto";
484
471
  import { setTimeout as delay } from "node:timers/promises";
485
- var defaultUpdateCache = () => join(homedir(), ".cache", "buddy-cli-sit", "updates");
472
+ var defaultUpdateCache = () => join(homedir(), ".cache", "buddy-cli", "updates");
486
473
  var globalUpdateLock = (cache, prefix) => join(cache, "locks", createHash2("sha256").update(prefix).digest("hex"));
487
474
  async function withUpdateLock(path, signal, action) {
488
475
  await mkdir(dirname(path), { recursive: true, mode: 448 });
@@ -571,23 +558,22 @@ async function globalInstallation(packageRoot, packageName) {
571
558
  // apps/cli/src/self-update.ts
572
559
  var PACKAGE = "@my-life-buddies/cli";
573
560
  var REGISTRY = "https://registry.npmjs.org/";
574
- var MANUAL_UPDATE = `npm install --global --prefix "$HOME/.local/share/buddy-cli/sit" ${PACKAGE}@dev --registry=${REGISTRY} --prefer-online`;
561
+ var MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY} --prefer-online`;
575
562
  var execute = promisify(execFile);
576
563
  var HELP = `\u7528\u6CD5:
577
- buddy-cli-sit --version [--json]
578
- buddy-cli-sit update --check [--json]
579
- buddy-cli-sit update [--json]
564
+ buddy-cli --version [--json]
565
+ buddy-cli update --check [--json]
566
+ buddy-cli update [--json]
580
567
 
581
568
  --version \u67E5\u770B\u5F53\u524D\u8FD0\u884C\u7684 CLI \u7248\u672C\uFF08\u65E0\u9700\u8054\u7F51\uFF09
582
- --check \u68C0\u67E5\u516C\u5171 npm \u7684 dev \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5
569
+ --check \u68C0\u67E5\u516C\u5171 npm \u7684 latest \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5
583
570
  --json \u8F93\u51FA JSON\uFF0C\u4F9B Coding Agent \u6216\u811A\u672C\u8BFB\u53D6
584
571
 
585
572
  \u65E0\u9700\u767B\u5F55\u642D\u642D\u8D26\u53F7\uFF0C\u4E5F\u65E0\u9700\u8FDB\u5165\u642D\u5B50\u5DE5\u7A0B\u3002
586
573
  \u6B63\u5E38\u547D\u4EE4\uFF08\u542B guide\uFF09\u4F1A\u5148\u8054\u7F51\u81EA\u68C0\uFF0C\u81EA\u52A8\u66F4\u65B0\u540E\u7531\u65B0\u7248\u7EE7\u7EED\u6267\u884C\uFF1B\u7B49\u5F85\u5B8C\u6210\u5373\u53EF\u3002
587
574
  \u5B89\u88C5\u4E3B\u52A8\u5237\u65B0 npm \u7248\u672C\u7F13\u5B58\uFF0C\u627E\u4E0D\u5230\u7248\u672C\uFF08ETARGET\uFF09\u65F6\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF1B\u5931\u8D25\u8BF4\u660E\u5177\u4F53\u539F\u56E0\u3002
588
575
  --help\u3001\u5404\u547D\u4EE4 --help \u4E0E --version \u79BB\u7EBF\u53EF\u7528\uFF1B\u67E5\u8BE2\u6216\u66F4\u65B0\u5931\u8D25\u65F6\u505C\u6B62\u4E1A\u52A1\u64CD\u4F5C\u3002
589
- update \u66F4\u65B0\u5F53\u524D CLI \u6240\u5728\u7684 npm \u5B89\u88C5\u76EE\u5F55\uFF08\u542B --global --prefix \u81EA\u5B9A\u4E49\u76EE\u5F55\uFF09\uFF0C\u4E0D\u4FEE\u6539\u5176\u4ED6\u5B89\u88C5\u6216\u5DE5\u7A0B Runtime \u4F9D\u8D56\u3002
590
- \u540C\u4E00\u5305 latest/dev \u9700\u5206\u76EE\u5F55\u5B89\u88C5\u624D\u80FD\u5171\u5B58\uFF1BSIT \u547D\u4EE4\u4E3A buddy-cli-sit\uFF0C\u6B63\u5F0F\u547D\u4EE4\u4E3A buddy-cli\u3002
576
+ update \u66F4\u65B0\u5F53\u524D CLI \u6240\u5728\u7684 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF08\u542B\u81EA\u5B9A\u4E49 --prefix\uFF09\uFF0C\u4E0D\u4FEE\u6539\u5176\u4ED6\u5B89\u88C5\u6216\u5DE5\u7A0B Runtime \u4F9D\u8D56\u3002
591
577
  \u5DF2\u7ECF\u662F\u6700\u65B0\u7248\u6216\u5F53\u524D\u7248\u672C\u66F4\u9AD8\u65F6\u4E0D\u5B89\u88C5\u3001\u4E0D\u964D\u7EA7\u3002
592
578
  \u6E90\u7801\u3001npm link\u3001\u5C40\u90E8\u5B89\u88C5\u6216 npx \u7684\u6B63\u5E38\u547D\u4EE4\u4F7F\u7528\u7F13\u5B58\u7684\u65B0\u7248\u6267\u884C\uFF0C\u4E0D\u8986\u76D6\u6E90\u7801\u6216\u5DE5\u7A0B\u4F9D\u8D56\u3002
593
579
  \u4E0A\u8FF0\u5B89\u88C5\u65B9\u5F0F\u4E0D\u80FD\u7528 update \u5355\u72EC\u4FEE\u6539\u539F\u5B89\u88C5\uFF0C\u8BF7\u6CBF\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002
@@ -625,16 +611,9 @@ async function latestVersion(options) {
625
611
  const timeout = AbortSignal.timeout(1e4);
626
612
  const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;
627
613
  try {
628
- const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(PACKAGE)}/dev`, {
629
- signal,
630
- headers: { Accept: "application/json" },
631
- redirect: "error"
632
- });
633
- if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);
634
- const metadata = await response.json();
614
+ const metadata = await npmPackageManifest(PACKAGE, "latest", { fetch: options.fetch, signal });
635
615
  if (metadata?.name !== PACKAGE) throw new Error("npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D");
636
- parseVersion(metadata.version);
637
- if (typeof metadata.version !== "string" || !/^\d+\.\d+\.\d+-dev\.\d+$/.test(metadata.version)) throw new Error("npm dev \u672A\u6307\u5411 x.y.z-dev.N \u7248\u672C\uFF1BSIT CLI \u4E0D\u4F1A\u8DE8\u6E20\u9053\u66F4\u65B0\uFF0C\u8BF7\u8054\u7CFB\u53D1\u5E03\u8005\u4FEE\u6B63 dev \u6807\u7B7E");
616
+ if (parseVersion(metadata.version).length !== 3) throw new Error("npm latest \u6307\u5411\u4E86\u6D4B\u8BD5\u7248\uFF0C\u6B63\u5F0F CLI \u4E0D\u4F1A\u8DE8\u6E20\u9053\u66F4\u65B0\uFF1B\u8BF7\u8054\u7CFB\u53D1\u5E03\u8005\u4FEE\u6B63 latest \u6807\u7B7E");
638
617
  return metadata.version;
639
618
  } catch (cause) {
640
619
  if (options.signal?.aborted) throw new Error("\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002");
@@ -643,20 +622,15 @@ async function latestVersion(options) {
643
622
  }
644
623
  }
645
624
  async function installUpdate(version, options) {
646
- if (!/^\d+\.\d+\.\d+-dev\.\d+$/.test(version)) throw new Error("SIT CLI \u53EA\u80FD\u66F4\u65B0 x.y.z-dev.N \u7248\u672C\uFF0C\u4E0D\u4F1A\u8DE8\u6E20\u9053\u5B89\u88C5\u3002");
647
625
  const runNpm = options.runNpm ?? ((args, settings2) => execute("npm", args, { ...settings2, encoding: "utf8", maxBuffer: 4 * 1024 * 1024 }));
648
626
  const settings = { cwd: homedir2(), signal: options.signal, timeout: 1e4 };
649
627
  const installation = await globalInstallation(options.packageRoot, PACKAGE);
650
628
  if (!installation) {
651
- throw new Error("\u5F53\u524D CLI \u662F\u6E90\u7801\u3001\u94FE\u63A5\u6216\u9879\u76EE\u5185\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u6539\u5199\u539F\u5B89\u88C5\u3002\u6B63\u5E38\u547D\u4EE4\u4F1A\u4ECE SIT \u72EC\u7ACB\u7F13\u5B58\u8FD0\u884C\u65B0\u7248\uFF1B\u5355\u72EC\u66F4\u65B0\u8BF7\u6CBF\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u3002");
629
+ throw new Error("\u5F53\u524D CLI \u662F\u6E90\u7801\u3001\u94FE\u63A5\u6216\u9879\u76EE\u5185\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u6539\u5199\u539F\u5B89\u88C5\u3002\u6B63\u5E38\u547D\u4EE4\u4F1A\u4ECE\u72EC\u7ACB\u7F13\u5B58\u8FD0\u884C\u65B0\u7248\uFF1B\u5355\u72EC\u66F4\u65B0\u8BF7\u6CBF\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u3002");
652
630
  }
653
631
  const { root: installedRoot, prefix } = installation;
654
- const manualUpdate = `npm install --global --prefix '${prefix.replace(/'/gu, "'\\''")}' ${PACKAGE}@dev --registry=${REGISTRY} --prefer-online`;
655
632
  await withUpdateLock(globalUpdateLock(options.cacheDirectory ?? defaultUpdateCache(), prefix), options.signal, async () => {
656
633
  const current = JSON.parse(await readFile(join3(installedRoot, "package.json"), "utf8"));
657
- if (current.name !== PACKAGE || !/^\d+\.\d+\.\d+-dev\.\d+$/.test(current.version)) {
658
- throw new Error("\u5F53\u524D\u5B89\u88C5\u76EE\u5F55\u5DF2\u88AB\u5176\u4ED6\u6E20\u9053\u66FF\u6362\uFF0C\u5DF2\u505C\u6B62\u66F4\u65B0\u3002\u8BF7\u5C06 latest \u548C dev \u5B89\u88C5\u5230\u4E0D\u540C\u76EE\u5F55\uFF0C\u518D\u91CD\u65B0\u8FD0\u884C buddy-cli-sit\u3002");
659
- }
660
634
  if (current.name === PACKAGE && current.version === version) return;
661
635
  if (current.name === PACKAGE && compareVersions(current.version, version) > 0) throw new Error("\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u5DF2\u5B89\u88C5\u66F4\u65B0\u7684 CLI\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u547D\u4EE4\u3002");
662
636
  try {
@@ -673,13 +647,13 @@ async function installUpdate(version, options) {
673
647
  "--no-fund"
674
648
  ], { ...settings, timeout: 18e4 }, runNpm);
675
649
  } catch (cause) {
676
- if (options.signal?.aborted) throw new Error("\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u8BF7\u8FD0\u884C buddy-cli-sit --version \u68C0\u67E5\u5B89\u88C5\u72B6\u6001\u3002");
650
+ if (options.signal?.aborted) throw new Error("\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\u5B89\u88C5\u72B6\u6001\u3002");
677
651
  throw new Error(`${cause instanceof Error ? cause.message : "npm \u5B89\u88C5\u672A\u5B8C\u6210\u3002"}
678
- \u4E5F\u53EF\u624B\u52A8\u5B89\u88C5\uFF1A${manualUpdate}`);
652
+ \u4E5F\u53EF\u624B\u52A8\u5B89\u88C5\uFF1A${MANUAL_UPDATE}`);
679
653
  }
680
654
  const installed = JSON.parse(await readFile(join3(installedRoot, "package.json"), "utf8"));
681
655
  if (installed.name !== PACKAGE || installed.version !== version) {
682
- throw new Error(`npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u786E\u8BA4\u5B89\u88C5\u5230 ${version}\u3002\u8BF7\u8FD0\u884C buddy-cli-sit --version \u68C0\u67E5\uFF0C\u5FC5\u8981\u65F6\u91CD\u8BD5\uFF1A${manualUpdate}`);
656
+ throw new Error(`npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u786E\u8BA4\u5B89\u88C5\u5230 ${version}\u3002\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\uFF0C\u5FC5\u8981\u65F6\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);
683
657
  }
684
658
  });
685
659
  }
@@ -689,13 +663,13 @@ async function runSelfUpdateCommand(args, io, options) {
689
663
  const json = args.includes("--json");
690
664
  const fail = (message, exitCode) => {
691
665
  if (json) io.write(JSON.stringify({ package: PACKAGE, currentVersion: options.version, error: message }));
692
- else io.writeError(`buddy-cli-sit: ${message}`);
666
+ else io.writeError(`buddy-cli: ${message}`);
693
667
  return { exitCode };
694
668
  };
695
669
  const flags = args.slice(1);
696
670
  const allowed = versionOnly ? ["--json", "--help", "-h"] : ["--check", "--json", "--help", "-h"];
697
671
  if (flags.some((flag) => !allowed.includes(flag)) || new Set(flags).size !== flags.length) {
698
- return fail("\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli-sit update --help \u67E5\u770B\u7528\u6CD5\u3002", 2);
672
+ return fail("\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli update --help \u67E5\u770B\u7528\u6CD5\u3002", 2);
699
673
  }
700
674
  if (flags.includes("--help") || flags.includes("-h")) {
701
675
  if (json) io.write(JSON.stringify({ help: HELP }));
@@ -708,8 +682,6 @@ async function runSelfUpdateCommand(args, io, options) {
708
682
  io.write(json ? JSON.stringify({ package: PACKAGE, version: options.version }) : options.version);
709
683
  return { exitCode: 0 };
710
684
  }
711
- const pin = process.env.BUDDY_CLI_PIN_VERSION;
712
- if (pin !== void 0) throw new Error("\u5F53\u524D\u5DF2\u7528 BUDDY_CLI_PIN_VERSION \u9501\u5B9A CLI\uFF1B\u5982\u9700\u66F4\u65B0\uFF0C\u8BF7\u5148 unset BUDDY_CLI_PIN_VERSION\u3002");
713
685
  const latest = await latestVersion(options);
714
686
  const comparison = compareVersions(latest, options.version);
715
687
  const check = flags.includes("--check");
@@ -729,8 +701,8 @@ async function runSelfUpdateCommand(args, io, options) {
729
701
  ...updated ? { installedVersion: latest } : {}
730
702
  }));
731
703
  } else if (updated) io.write(`CLI \u5DF2\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002`);
732
- else if (comparison > 0) io.write(`\u53D1\u73B0\u65B0\u7248\u672C\uFF1A${options.version} \u2192 ${latest}\u3002\u8FD0\u884C buddy-cli-sit update \u66F4\u65B0\u3002`);
733
- else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm dev ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);
704
+ else if (comparison > 0) io.write(`\u53D1\u73B0\u65B0\u7248\u672C\uFF1A${options.version} \u2192 ${latest}\u3002\u8FD0\u884C buddy-cli update \u66F4\u65B0\u3002`);
705
+ else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm latest ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);
734
706
  else io.write(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\uFF1A${options.version}\u3002`);
735
707
  return { exitCode: 0 };
736
708
  } catch (cause) {
@@ -762,7 +734,7 @@ import { promisify as promisify2 } from "node:util";
762
734
  var PACKAGE2 = "@my-life-buddies/cli";
763
735
  var REGISTRY2 = "https://registry.npmjs.org/";
764
736
  var execute2 = promisify2(execFile2);
765
- var HANDOFF_ENV = "BUDDY_CLI_SIT_UPDATE_HANDOFF";
737
+ var HANDOFF_ENV = "BUDDY_CLI_UPDATE_HANDOFF";
766
738
  async function installedVersion(root) {
767
739
  try {
768
740
  const pkg = JSON.parse(await readFile2(join4(root, "package.json"), "utf8"));
@@ -855,13 +827,6 @@ async function runAutoUpdate(args, io, options) {
855
827
  if (args[0] === "help" || args[0] === "update" || args[0] === "--version" || args[0] === "-v" || args.includes("--help") || args.includes("-h")) return void 0;
856
828
  try {
857
829
  const env = { ...options.env ?? process.env };
858
- const pin = env.BUDDY_CLI_PIN_VERSION;
859
- if (pin !== void 0) {
860
- if (!/^\d+\.\d+\.\d+-dev\.\d+$/.test(pin) || pin !== options.version) {
861
- throw new Error(`CLI \u7248\u672C\u9501\u5B9A\u4E0D\u5339\u914D\uFF1A\u8981\u6C42 ${pin}\uFF0C\u5F53\u524D ${options.version}\u3002\u8BF7\u5B89\u88C5 @my-life-buddies/cli@${pin} \u6216 unset BUDDY_CLI_PIN_VERSION\u3002`);
862
- }
863
- return void 0;
864
- }
865
830
  const handoff = env[HANDOFF_ENV];
866
831
  if (handoff !== void 0) {
867
832
  delete env[HANDOFF_ENV];
@@ -995,7 +960,7 @@ try {
995
960
  process.exitCode = result.exitCode;
996
961
  } catch (cause) {
997
962
  const message = cause instanceof Error ? cause.message : String(cause);
998
- terminal.writeError(`buddy-cli-sit: ${message}`);
963
+ terminal.writeError(`buddy-cli: ${message}`);
999
964
  process.exitCode = 1;
1000
965
  } finally {
1001
966
  unbindTermination();