@my-life-buddies/cli 0.21.1 → 0.22.0
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 +18 -44
- package/dist/bin/buddy.js +15 -11
- package/dist/bin/buddy.js.map +3 -3
- package/dist/bin/core.js +481 -548
- package/dist/bin/core.js.map +4 -4
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
这份说明按一次开发过程展开:登记搭子,准备工程,在本地预览,然后上传程序包。所有搭子统一使用 `@my-life-buddies/buddy-runtime`,业务能力通过 Prompt、`src/buddy-options.mjs` 和 Tool 实现。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
新建工程动态查询公共 npm 的最新稳定版 Runtime,并写入准确版本与锁文件;查询或锁文件生成失败时停止,不回退旧版本。版本选择与联调范围见 [Runtime 集成说明](../../docs/runtime-integration.md)。
|
|
8
8
|
|
|
9
9
|
## 准备 CLI 和平台地址
|
|
10
10
|
|
|
@@ -71,17 +71,17 @@ npm run verify:package
|
|
|
71
71
|
npm publish --workspace @my-life-buddies/cli
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
`main` 构建正式的 `@my-life-buddies/cli@latest`,只包含 `buddy-cli` 命令。`publishConfig` 明确指定 `latest`、公共 npm 和 `public` 访问级别;构建会拒绝预发布版本。正式发布必须从 main 重新构建,不可将测试产物直接改挂 latest。Core 和 Preview 保留 monorepo 开发边界并标记为 `private`,构建时合入 CLI 的内部模块;Preview 页面和工程模板资源进入 CLI 包;Creator 与 Avatar Skill 使用时独立加载。安装不会请求 `@buddy/cli-core` 或 `@buddy/preview`。第三方运行依赖按正常 npm dependencies 安装,构建工具 esbuild 不进入安装依赖。根工作区和 Web 同样保持 `private`。
|
|
75
75
|
|
|
76
76
|
版本维护:每批修改 CLI 发布内容时递增一次版本,默认 patch;根包和内部工作区版本、依赖引用、锁文件一起更新。Agent 工程自己的项目版本独立。升级 Runtime 时同步模板依赖与模板锁文件,并运行独立安装验收。
|
|
77
77
|
|
|
78
|
-
CLI
|
|
78
|
+
正式版 CLI 固定连接 ECS Test `https://47.116.168.81`,无需配置地址:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
buddy-cli login
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
这是实际的 ECS Test 环境,使用 HTTPS;不能改为其他平台或本机网关。手机 App 需要连接同一环境。
|
|
85
85
|
|
|
86
86
|
CLI 会打开搭搭创作者平台网页完成登录和授权。浏览器已有有效 Cookie 时,页面直接显示当前账号,开发者确认后即可返回终端;没有登录时,先在同一网页完成短信登录,再确认授权。CLI 不读取浏览器 Cookie,也拿不到短信验证码,只通过本机回调收到一次性授权码,再换取自己的会话。
|
|
87
87
|
|
|
@@ -337,9 +337,9 @@ buddy-cli meta update --buddy-id b_example --name "川大厨" --avatar ./avatar.
|
|
|
337
337
|
buddy-cli models
|
|
338
338
|
```
|
|
339
339
|
|
|
340
|
-
|
|
340
|
+
不必先创建工程。无论是否在工程内,CLI 每次查询公共 npm latest,把对应 Runtime 缓存到 `~/.cache/buddy-cli/runtimes/<版本>` 并读取枚举;同版本复用缓存,不修改工程依赖。查询或下载失败时明确报错,不把旧缓存称为最新版。两个目录命令的 `--json` 返回 `source`(固定为 `npm`)、`runtimeVersion`、目录,以及 `projectRuntimeVersion`、`latestRuntimeVersion`、`versionStatus`、`adaptationRequired`。版本状态为 `no_project`、`unconfigured`、`current`、`update_available` 或 `project_ahead`;没有准确工程版本时返回 `null`,工程未锁定版本或版本与 npm latest 不一致时需要适配。提示输出到 stderr,stdout 保持纯 JSON。
|
|
341
341
|
|
|
342
|
-
在已有工程执行 `buddy-cli`、`init` 或打开 `preview`
|
|
342
|
+
在已有工程执行 `buddy-cli`、`init` 或打开 `preview` 时检查更新并提示适配,但允许继续编辑工程。正式包中,`dev`、Preview 中每次启动 DEV、文件自动重载,以及 `push` 必须联网查询 npm 最新稳定版,工程声明及实际安装版本必须与本次查询结果完全一致;不接受旧版、超前版、预发布版或范围依赖。查询失败即停止,不使用缓存冒充最新,也没有跳过检查参数。已有 npm 锁文件需与目标版本一致,push 还会按本次查询结果校验实际上传快照及其中的 npm 锁文件。失败信息包含原因和适配提示,CLI 不自动修改工程依赖、模型或数据权限。修复后重新启动;自动重载失败后保存文件可重试。帮助、登录、status、meta 和兼容命令 avatar 不查询 Runtime。
|
|
343
343
|
|
|
344
344
|
此限制由本版 CLI 执行,不修改服务端策略或已部署进程;直接运行工程 `npm start`、旧 CLI 或服务端发布入口不受本版 CLI 检查约束。
|
|
345
345
|
|
|
@@ -433,47 +433,21 @@ Preview 展示平台对话记录、发送与流式输出耗时、会话状态和
|
|
|
433
433
|
|
|
434
434
|
保存代码、提示词、资料或 Widget 后,CLI 会合并连续修改并自动重启 Runtime;可能中断当前回复。已有 Widget 数据保留,Schema 变更不会自动迁移旧数据。原聊天历史从 MLB 读取,不因浏览器刷新就另建一份;服务端数据的保留期限不由 CLI 决定。
|
|
435
435
|
|
|
436
|
-
###
|
|
436
|
+
### 正式包的平台与 Runtime
|
|
437
437
|
|
|
438
|
-
|
|
438
|
+
正式包固定连接 ECS Test:`https://47.116.168.81`,后台为 `https://47.116.168.81/developer/`。无需手动设置 `MLB_GATEWAY_URL`,也不询问开发或发布环境。
|
|
439
439
|
|
|
440
|
-
|
|
440
|
+
- 登录、API、凭据领取、预览与上传均使用固定目标;CLI 将该网关及开发 Token 写入工程 `.env` 给 Runtime 使用。
|
|
441
|
+
- `--app-server`、`--developer-web` 仅接受同一固定目标,兼容已有后台连接指令,不能切换环境。
|
|
442
|
+
- `MLB_GATEWAY_URL`、`BUDDY_APP_SERVER_URL`、`BUDDY_DEV_APP_SERVER_URL`、`BUDDY_DEVELOPER_WEB_URL` 任一冲突都会报错;显式正确参数不能掩盖其他冲突配置。按提示移除终端及 shell 配置里的旧值,重新打开 Coding Agent 或终端后重试。
|
|
443
|
+
- 创建或恢复工程、读取或修改工程资料、预览、DEV 和上传都会检查工程 `.env`。其他环境工程请使用对应 CLI;迁移到公共平台需在新目录重新登记搭子后复制业务代码,不复制 `.env`、buddyId 或凭据。`--refresh-token` 仅刷新同一环境的开发凭据。
|
|
444
|
+
- 登录态按平台 origin 保存,开发 Token 与本地实例锁继续按平台和搭子隔离。不读取旧的无平台归属登录记录。CLI 地址限制不代替 Server 的账号、归属及凭据环境校验。
|
|
441
445
|
|
|
442
|
-
|
|
443
|
-
buddy-cli login
|
|
444
|
-
buddy-cli dev --refresh-token
|
|
445
|
-
# 或连接后台,再在页面中启动 DEV:
|
|
446
|
-
buddy-cli preview --refresh-token
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
DEV 启动前会从阿里云平台重新领取已有开发 Token,并更新 `.env` 的 `MLB_GATEWAY_URL`;保留 `package.json.buddyId`、业务变量和注释,不另建搭子。`preview --refresh-token` 在页面实际启动 DEV 时写入配置。工程 Runtime 和锁文件仍须按 CLI 提示升级至 npm 最新稳定版;直接运行 `npm start` 的工程也需更新旧网关环境变量,显式配置会覆盖 Runtime 默认值。
|
|
450
|
-
|
|
451
|
-
### 什么时候需要另一个服务地址
|
|
452
|
-
|
|
453
|
-
CLI 与 Runtime 共用 `MLB_GATEWAY_URL`。需要连接其他平台时,在运行 CLI 的终端设置平台提供的地址(仅协议、域名和可选端口,不加 `/cli` 或 `/developer`):
|
|
454
|
-
|
|
455
|
-
```bash
|
|
456
|
-
export MLB_GATEWAY_URL=https://platform.example
|
|
457
|
-
buddy-cli login
|
|
458
|
-
buddy-cli preview
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
将示例地址替换成实际平台地址。设置在当前终端及其子进程中生效;要在新终端保留,可加入已有的 shell 启动配置。Coding Agent 执行 CLI 的进程同样需要继承这个变量;图形应用未必继承另一个终端中的设置。无需新增 `config.json`、工程平台字段或另一份 npm 包。平台地址不影响 CLI 自动更新、Runtime 和 Skill 从公共 npm 下载。
|
|
462
|
-
|
|
463
|
-
| 命令 | 地址优先级(从高到低) |
|
|
464
|
-
| --- | --- |
|
|
465
|
-
| `login`、`init`、`logout`、`meta`、`push`、`status` | `MLB_GATEWAY_URL` → 旧地址配置 → 默认 test |
|
|
466
|
-
| `dev`、`preview`(包括 `dev stop`) | `--app-server` → `MLB_GATEWAY_URL` → 旧地址配置 → 默认 test |
|
|
467
|
-
|
|
468
|
-
旧配置只在未设置 `MLB_GATEWAY_URL` 时兼容:账号和上传命令依次读取 `BUDDY_APP_SERVER_URL`、`BUDDY_DEV_APP_SERVER_URL`;`dev`、`preview` 顺序相反。新配置只需设置 `MLB_GATEWAY_URL`,它会统一覆盖这两种旧变量。空值、错误地址和跨平台的后台地址会报错,不静默回退。远程平台要求 HTTPS;本机 loopback 允许 HTTP。
|
|
469
|
-
|
|
470
|
-
CLI 根据选定地址打开 `/developer/` 网页、访问 MLB API,并在启动 DEV 时把该地址和开发 Token 写入工程 `.env`。Runtime 通过 Node 加载 `.env` 中的 `MLB_GATEWAY_URL`。CLI 本身不自动加载项目 `.env` 或读取 shell 启动文件来选平台,因此 `login` 和新建工程也能在工程外使用。修改变量仅影响后续命令,不会让正在运行的预览中途切换。
|
|
471
|
-
|
|
472
|
-
`preview` 在连接前、`dev` 在启动前检查工程 `.env` 的网关。已知旧 ECS 入口 `http://47.116.168.81:8788` 和 `http://47.116.168.81` 统一转向 `https://47.116.168.81`;启动 DEV 时按当前账号和 `package.json.buddyId` 校验归属并领取开发凭据,取得实例锁后再更新 `.env`,保留业务变量和注释。检查失败不改文件。终端会说明旧地址处理方式,后台显示可公开的具体配置错误。
|
|
446
|
+
临时保留同一 ECS 的旧入口迁移:`http://47.116.168.81:8788` 和 `http://47.116.168.81` 转为 HTTPS。启动 DEV 时校验归属,取得实例锁后更新 `.env`,保留业务配置与注释;失败不改文件。正式推广完成后可移除此兼容分支。
|
|
473
447
|
|
|
474
|
-
|
|
448
|
+
`models`、`datasets` 和新建工程动态查询公共 npm 的 Runtime `latest`,只接受正式版本;新工程固定准确版本与锁文件。DEV、自动重载及 push 要求工程声明、实际安装和锁文件与本次最新正式版一致;不提供 `--runtime-version` 或测试版选择,不自动修改已有依赖。CLI 与 Runtime 的版本号无需一致。Runtime 发布者须在 ECS Test 支持对应能力后才更新 `latest`。
|
|
475
449
|
|
|
476
|
-
|
|
450
|
+
正式 CLI 自动更新也只查询 `latest`;若该标签误指向预发布版本,停止并提示发布者修正,不跨到测试渠道。
|
|
477
451
|
|
|
478
452
|
## 上传程序包,不等于发布
|
|
479
453
|
|
|
@@ -532,7 +506,7 @@ buddy-cli datasets
|
|
|
532
506
|
buddy-cli datasets --directory ./my-buddy --json
|
|
533
507
|
```
|
|
534
508
|
|
|
535
|
-
|
|
509
|
+
正式包的目录来自 npm 最新稳定版 Runtime 的 `DATA_ACCESS_CAPABILITIES`,包括 ID、名称、来源和 Schema 版本。JSON 返回版本信息、适配状态和 `datasets` 数组(字段见上方模型目录说明)。命令不登录、不启动搭子、不申请权限,也不修改配置;从子目录运行会向上找到工程。每次都需要联网检查 latest,下载失败时明确报错,不把旧缓存称为最新版。
|
|
536
510
|
|
|
537
511
|
开发者将实际选择的 ID 和用途写进 `data-access.json.requirements`。JSON Schema 检查形状与用途;DEV 和上传预检按工程安装的 Runtime 检查所选模型与非空数据声明。目录缺失、依赖未安装或版本不匹配时明确报错。Runtime 0.12.2 有 10 项,但单次数据查询仍最多 8 项。
|
|
538
512
|
|
|
@@ -572,4 +546,4 @@ Runtime 0.19.0 支持在 `schema.json.openTargets` 声明入口。业务通过 `
|
|
|
572
546
|
|
|
573
547
|
## CLI 0.20:MLB 统一提供服务
|
|
574
548
|
|
|
575
|
-
|
|
549
|
+
正式包入口固定与 ECS Test 网页同源,使用 HTTPS。CLI 的一次性浏览器授权走 `/cli/web/authorizations`、`/cli/web/exchange`,预览连接走 `/cli/preview/*`。不调用独立 Web 服务,不支持地址覆盖;预览不触发上传或发布。
|
package/dist/bin/buddy.js
CHANGED
|
@@ -9,6 +9,7 @@ import { dirname as dirname2 } from "node:path";
|
|
|
9
9
|
import { createInterface } from "node:readline/promises";
|
|
10
10
|
import {
|
|
11
11
|
PromptCancelledError,
|
|
12
|
+
resolvePlatformUrl as resolvePlatformUrl2,
|
|
12
13
|
runBuddyCli
|
|
13
14
|
} from "./core.js";
|
|
14
15
|
|
|
@@ -104,13 +105,14 @@ var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
|
|
|
104
105
|
--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\u3002
|
|
105
106
|
--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
|
|
106
107
|
\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
|
|
108
|
+
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
|
|
107
109
|
\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
|
|
108
110
|
\u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
|
|
109
|
-
|
|
111
|
+
\u6B63\u5F0F\u7248\u56FA\u5B9A\u8FDE\u63A5 ECS Test\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
|
|
110
112
|
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
|
|
111
113
|
\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
|
|
112
114
|
\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
|
|
113
|
-
--refresh-token \u91CD\u65B0\u9886\u53D6\u5DF2\u6709\u5F00\u53D1 Token\uFF0C\u66F4\u65B0\u5DE5\u7A0B .env\uFF1B\u4E0D\u4F1A\u751F\u6210\u65B0\u5BC6\u94A5\u3002
|
|
115
|
+
--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
|
|
114
116
|
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
|
|
115
117
|
\u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002`;
|
|
116
118
|
function valueAfter(args, index, flag) {
|
|
@@ -253,7 +255,7 @@ var BuddyPlatformHost = class {
|
|
|
253
255
|
baseUrl,
|
|
254
256
|
token: async () => (await session.token({ signal: this.#signal })).accessToken
|
|
255
257
|
}),
|
|
256
|
-
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env
|
|
258
|
+
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },
|
|
257
259
|
preparePush
|
|
258
260
|
};
|
|
259
261
|
}
|
|
@@ -282,13 +284,13 @@ var BuddyPlatformHost = class {
|
|
|
282
284
|
return { exitCode: 0, route: "preview" };
|
|
283
285
|
}
|
|
284
286
|
const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));
|
|
285
|
-
const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer
|
|
287
|
+
const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer });
|
|
286
288
|
const manifest = await readBuddyProjectManifest(projectRoot);
|
|
287
289
|
if (parsed.buddyId && parsed.buddyId !== manifest.buddyId) throw new Error(`\u5F53\u524D\u5DE5\u7A0B\u5C5E\u4E8E ${manifest.buddyId}\uFF0C\u8FDE\u63A5\u6307\u4EE4\u8981\u6C42 ${parsed.buddyId}\uFF1B\u8BF7\u5728\u6B63\u786E\u642D\u5B50\u7684\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C\u3002`);
|
|
288
290
|
const webUrl = resolveDeveloperWebUrl(baseUrl, parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
|
|
289
291
|
const signal = this.#signal ?? new AbortController().signal;
|
|
290
|
-
await checkProjectGateway(projectRoot, baseUrl, {
|
|
291
|
-
await checkRuntimeUpdate(projectRoot, (message) => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env
|
|
292
|
+
await checkProjectGateway(projectRoot, baseUrl, { report: (message) => io.write(message) });
|
|
293
|
+
await checkRuntimeUpdate(projectRoot, (message) => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env });
|
|
292
294
|
const session = this.#session(baseUrl, webUrl);
|
|
293
295
|
await session.token({ signal });
|
|
294
296
|
const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);
|
|
@@ -359,10 +361,10 @@ var BuddyPlatformHost = class {
|
|
|
359
361
|
const handle = await starter.start({
|
|
360
362
|
projectRoot,
|
|
361
363
|
signal,
|
|
362
|
-
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env
|
|
364
|
+
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },
|
|
363
365
|
onError(error) {
|
|
364
366
|
logs.flush();
|
|
365
|
-
let message = error.message;
|
|
367
|
+
let message = error.publicMessage ?? error.message;
|
|
366
368
|
for (const secret of secrets) if (secret) message = message.split(secret).join("[REDACTED]");
|
|
367
369
|
reloadError = { code: error.code, message: message.replace(/[\u0000-\u001f\u007f]/gu, " ").slice(0, 512) };
|
|
368
370
|
},
|
|
@@ -426,6 +428,7 @@ var BuddyPlatformHost = class {
|
|
|
426
428
|
return resolvePlatformUrl({ env: this.#env });
|
|
427
429
|
}
|
|
428
430
|
#session(baseUrl, webUrl) {
|
|
431
|
+
resolvePlatformUrl({ env: this.#env, override: baseUrl.href });
|
|
429
432
|
const developerWebUrl = resolveDeveloperWebUrl(baseUrl, webUrl ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
|
|
430
433
|
const key = baseUrl.origin;
|
|
431
434
|
let session = this.#sessions.get(key);
|
|
@@ -606,7 +609,7 @@ async function latestVersion(options) {
|
|
|
606
609
|
if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);
|
|
607
610
|
const metadata = await response.json();
|
|
608
611
|
if (metadata?.name !== PACKAGE) throw new Error("npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D");
|
|
609
|
-
parseVersion(metadata.version);
|
|
612
|
+
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");
|
|
610
613
|
return metadata.version;
|
|
611
614
|
} catch (cause) {
|
|
612
615
|
if (options.signal?.aborted) throw new Error("\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002");
|
|
@@ -956,12 +959,13 @@ try {
|
|
|
956
959
|
const command = args[0];
|
|
957
960
|
let platformHost;
|
|
958
961
|
const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });
|
|
962
|
+
const offlineHelp = !command ? false : ["help", "--help", "-h"].includes(command) || args.includes("--help") || args.includes("-h");
|
|
963
|
+
if (maintenance === void 0 && !offlineHelp) resolvePlatformUrl2();
|
|
959
964
|
const result = maintenance ?? await runBuddyCli(args, terminal, {
|
|
960
965
|
runtimeCatalog: { signal: lifecycle.signal },
|
|
961
|
-
scaffoldPlatformAgent: (root, name
|
|
966
|
+
scaffoldPlatformAgent: (root, name) => scaffoldPlatformAgent(root, name, {
|
|
962
967
|
resolveDependencies: (template) => latestRuntimeTemplate(template, {
|
|
963
968
|
signal: lifecycle.signal,
|
|
964
|
-
runtimeVersion,
|
|
965
969
|
report: (message) => terminal.write(message)
|
|
966
970
|
})
|
|
967
971
|
}),
|