@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/README.md +86 -127
- package/dist/bin/buddy.js +47 -82
- package/dist/bin/buddy.js.map +2 -2
- package/dist/bin/core.js +504 -541
- package/dist/bin/core.js.map +4 -4
- package/dist/bin/preview.js +2 -57
- package/dist/bin/preview.js.map +3 -3
- package/package.json +10 -11
- package/resources/brand/README.md +1 -1
- package/dist/web/app.css +0 -758
- package/dist/web/app.js +0 -1155
- package/dist/web/assets/developer-platform-icon.png.base64 +0 -1
- package/dist/web/brand.css +0 -100
- package/dist/web/chat-markdown.js +0 -181
- package/dist/web/diagnostics.js +0 -193
- package/dist/web/index.html +0 -268
- package/dist/web/products.css +0 -19
- package/dist/web/products.js +0 -104
- package/dist/web/tokens.css +0 -15
- package/dist/web/tool-inventory.js +0 -94
- package/dist/web/widgets.css +0 -62
- package/dist/web/widgets.js +0 -317
- /package/dist/{web → bin/resources}/widget-document.js +0 -0
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
|
|
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
|
-
|
|
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
|
|
112
|
-
\u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \
|
|
113
|
-
|
|
114
|
-
CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\
|
|
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\
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
334
|
-
io.write(`\u642D\u642D
|
|
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
|
-
|
|
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
|
|
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
|
|
449
|
-
|
|
450
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
578
|
-
buddy-cli
|
|
579
|
-
buddy-cli
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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${
|
|
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
|
|
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
|
|
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
|
|
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
|
|
733
|
-
else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm
|
|
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 = "
|
|
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
|
|
963
|
+
terminal.writeError(`buddy-cli: ${message}`);
|
|
999
964
|
process.exitCode = 1;
|
|
1000
965
|
} finally {
|
|
1001
966
|
unbindTermination();
|