@my-life-buddies/cli 0.19.0 → 0.21.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 +32 -16
- package/dist/bin/buddy.js +11 -9
- package/dist/bin/buddy.js.map +2 -2
- package/dist/bin/core.js +412 -234
- package/dist/bin/core.js.map +4 -4
- package/dist/bin/preview.js +5 -5
- package/dist/bin/preview.js.map +2 -2
- package/package.json +3 -3
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
|
|
|
@@ -75,17 +75,17 @@ npm publish --workspace @my-life-buddies/cli
|
|
|
75
75
|
|
|
76
76
|
版本维护:每批修改 CLI 发布内容时递增一次版本,默认 patch;根包和内部工作区版本、依赖引用、锁文件一起更新。Agent 工程自己的项目版本独立。升级 Runtime 时同步模板依赖与模板锁文件,并运行独立安装验收。
|
|
77
77
|
|
|
78
|
-
CLI 默认连接 MLB 测试环境 `
|
|
78
|
+
CLI 默认连接 MLB 测试环境 `https://47.116.168.81`,不必先配置地址:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
buddy-cli login
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
这是实际 test
|
|
84
|
+
这是实际 test 环境,使用 HTTPS;其他远程平台同样要求 HTTPS,HTTP 仅用于本机 loopback 联调。手机 App 需要连接同一环境。
|
|
85
85
|
|
|
86
86
|
CLI 会打开搭搭创作者平台网页完成登录和授权。浏览器已有有效 Cookie 时,页面直接显示当前账号,开发者确认后即可返回终端;没有登录时,先在同一网页完成短信登录,再确认授权。CLI 不读取浏览器 Cookie,也拿不到短信验证码,只通过本机回调收到一次性授权码,再换取自己的会话。
|
|
87
87
|
|
|
88
|
-
CLI 会把换取到的会话保存到 macOS Keychain。有效会话会复用,不必每条命令都重新登录;切换服务器 origin(协议、主机或端口)后,使用另一份凭据,不把原服务器的 Token
|
|
88
|
+
CLI 会把换取到的会话保存到 macOS Keychain。有效会话会复用,不必每条命令都重新登录;切换服务器 origin(协议、主机或端口)后,使用另一份凭据,不把原服务器的 Token 发过去。开发者平台网页自动使用当前网关域名下的 `/developer/`。显式设置 `BUDDY_DEVELOPER_WEB_URL` 或 `preview --developer-web` 时,必须与网关同源,否则在联网前报错;本地静态页面联调也需通过同一入口代理 MLB API。
|
|
89
89
|
|
|
90
90
|
旧版没有标记服务器归属的钥匙串记录不会自动复用或删除;升级后需要重新登录一次。
|
|
91
91
|
|
|
@@ -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
|
|
|
@@ -370,7 +370,7 @@ initialState: {
|
|
|
370
370
|
}
|
|
371
371
|
```
|
|
372
372
|
|
|
373
|
-
新工程生成 `{ "requirements": [] }`。最多 32 项,ID 不能重复;`id`、`purpose` 会去除首尾空白,用途必须为 1~200 字。完整选项由 `buddy-cli datasets [--json]`
|
|
373
|
+
新工程生成 `{ "requirements": [] }`。最多 32 项,ID 不能重复;`id`、`purpose` 会去除首尾空白,用途必须为 1~200 字。完整选项由 `buddy-cli datasets [--json]` 按当前环境的版本规则读取,DEV 与 push 使用工程安装的 SDK 校验 ID。
|
|
374
374
|
|
|
375
375
|
Runtime 0.17.0 启动时自动读取该文件,通过 `PUT /internal/v1/data-access/requirements` 登记;文件缺失或空数组会上传空声明,清除旧声明。登记失败阻止启动,不会带着未同步的配置上线。DEV 监听该文件,保存后重启 Runtime 并重新登记。部署环境需提供对应登记接口。
|
|
376
376
|
|
|
@@ -406,7 +406,7 @@ buddy-cli preview --directory ./study-buddy
|
|
|
406
406
|
- CLI 被强杀、电脑离线或旧版进程无法响应时,网页不能保证本机进程已退出。到原电脑的工程目录执行后台提供的停止指令,例如:
|
|
407
407
|
|
|
408
408
|
```bash
|
|
409
|
-
buddy-cli dev stop --buddy-id b_example --app-server
|
|
409
|
+
buddy-cli dev stop --buddy-id b_example --app-server https://47.116.168.81
|
|
410
410
|
```
|
|
411
411
|
|
|
412
412
|
`dev stop` 无需登录、查询 npm 或访问平台,支持 `--directory`;按平台和工程 buddyId 查找本机进程。原 CLI 存活时通知它停止监听与 Runtime,原 CLI 已退出时核对进程身份后清理残留;不能确认身份时保留锁并报错,不误杀其他进程。同一搭子从其他目录启动时,应在提示的原工程目录执行。其他电脑的进程需到那台电脑停止。清理后如需调试,重新执行连接指令,再在页面启动 DEV;不会提审或发布。
|
|
@@ -435,9 +435,9 @@ Preview 展示平台对话记录、发送与流式输出耗时、会话状态和
|
|
|
435
435
|
|
|
436
436
|
### 从海外服务器回迁阿里云
|
|
437
437
|
|
|
438
|
-
平台地址为 `
|
|
438
|
+
平台地址为 `https://47.116.168.81`,开发者后台为 <https://47.116.168.81/developer/>。升级 CLI 后重新运行 `buddy-cli login`;海外域名与阿里云 IP 的浏览器 Cookie 和 CLI 登录凭据独立保存,不能直接沿用海外登录态。
|
|
439
439
|
|
|
440
|
-
|
|
440
|
+
仅在明确要切回默认外部平台时,移除或更新终端和 shell 配置中的 `MLB_GATEWAY_URL` 及旧 `BUDDY_APP_SERVER_URL`、`BUDDY_DEV_APP_SERVER_URL`、`BUDDY_DEVELOPER_WEB_URL` 覆盖,再在工程目录运行:
|
|
441
441
|
|
|
442
442
|
```bash
|
|
443
443
|
buddy-cli login
|
|
@@ -450,16 +450,28 @@ DEV 启动前会从阿里云平台重新领取已有开发 Token,并更新 `.e
|
|
|
450
450
|
|
|
451
451
|
### 什么时候需要另一个服务地址
|
|
452
452
|
|
|
453
|
-
|
|
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 下载。
|
|
454
462
|
|
|
455
463
|
| 命令 | 地址优先级(从高到低) |
|
|
456
464
|
| --- | --- |
|
|
457
|
-
| `login`、`init`、`logout`、`push`、`status` | `
|
|
458
|
-
| `dev`、`preview` | `--app-server` → `
|
|
465
|
+
| `login`、`init`、`logout`、`meta`、`push`、`status` | `MLB_GATEWAY_URL` → 旧地址配置 → 默认 test |
|
|
466
|
+
| `dev`、`preview`(包括 `dev stop`) | `--app-server` → `MLB_GATEWAY_URL` → 旧地址配置 → 默认 test |
|
|
459
467
|
|
|
460
|
-
`
|
|
468
|
+
旧配置只在未设置 `MLB_GATEWAY_URL` 时兼容:账号和上传命令依次读取 `BUDDY_APP_SERVER_URL`、`BUDDY_DEV_APP_SERVER_URL`;`dev`、`preview` 顺序相反。新配置只需设置 `MLB_GATEWAY_URL`,它会统一覆盖这两种旧变量。空值、错误地址和跨平台的后台地址会报错,不静默回退。远程平台要求 HTTPS;本机 loopback 允许 HTTP。
|
|
461
469
|
|
|
462
|
-
|
|
470
|
+
CLI 根据选定地址打开 `/developer/` 网页、访问 MLB API,并在启动 DEV 时把该地址和开发 Token 写入工程 `.env`。Runtime 通过 Node 加载 `.env` 中的 `MLB_GATEWAY_URL`。CLI 本身不自动加载项目 `.env` 或读取 shell 启动文件来选平台,因此 `login` 和新建工程也能在工程外使用。修改变量仅影响后续命令,不会让正在运行的预览中途切换。
|
|
471
|
+
|
|
472
|
+
切换平台后,CLI 按服务器 origin 分别保存登录和开发凭据,不向新平台发送旧平台的 Token。工程 `.env` 已绑定其他平台时会阻止复用;确认目标平台和工程归属后,使用 `--refresh-token` 更新开发凭据。搭子 ID、项目和平台上的数据不会自动迁移。使用后台生成的连接或停止指令时保留完整参数,`--app-server` 只覆盖该次命令。
|
|
473
|
+
|
|
474
|
+
`models` 和 `datasets` 从公共 npm 读取 Runtime 能力,不向平台申请目录或权限;默认平台使用最新稳定版。平台地址与 Runtime 规则以当前终端的 `buddy-cli guide` 输出为准,Coding Agent 应先完成指南要求的必要选择,再继续创建工程;不要用别的环境的指南替代当前输出。
|
|
463
475
|
|
|
464
476
|
## 上传程序包,不等于发布
|
|
465
477
|
|
|
@@ -518,7 +530,7 @@ buddy-cli datasets
|
|
|
518
530
|
buddy-cli datasets --directory ./my-buddy --json
|
|
519
531
|
```
|
|
520
532
|
|
|
521
|
-
|
|
533
|
+
默认平台的目录来自 npm 最新稳定版 Runtime 的 `DATA_ACCESS_CAPABILITIES`,包括 ID、名称、来源和 Schema 版本。JSON 返回版本信息、适配状态和 `datasets` 数组(字段见上方模型目录说明)。命令不登录、不启动搭子、不申请权限,也不修改配置;从子目录运行会向上找到工程。每次都需要联网检查 latest,下载失败时明确报错,不把旧缓存称为最新版。
|
|
522
534
|
|
|
523
535
|
开发者将实际选择的 ID 和用途写进 `data-access.json.requirements`。JSON Schema 检查形状与用途;DEV 和上传预检按工程安装的 Runtime 检查所选模型与非空数据声明。目录缺失、依赖未安装或版本不匹配时明确报错。Runtime 0.12.2 有 10 项,但单次数据查询仍最多 8 项。
|
|
524
536
|
|
|
@@ -555,3 +567,7 @@ CLI 与 Runtime 统一使用 `package.json.buddyId`。CLI 启动前校验本地
|
|
|
555
567
|
Runtime 0.19.0 支持在 `schema.json.openTargets` 声明入口。业务通过 `conversation.widget.send(id, { idempotencyKey, openTarget })` 或模型工具发送 `version: 1`、`entry` 以及可选 `resource`、`state`;记录必须已经存在。H5 读取 `window.widget.openTarget` 定位,无目标时显示默认页。
|
|
556
568
|
|
|
557
569
|
后台和本地模拟器保留每条消息的目标,通过 `POST /app/widgets/:widgetId/presentation` 获取鉴权页面;列表入口不传目标。同一 Widget 的不同卡片、加载重试与 DEV 重载分别保留自己的目标;目标记录删除或权限变化时显示打开失败,不回退默认页。
|
|
570
|
+
|
|
571
|
+
## CLI 0.20:MLB 统一提供服务
|
|
572
|
+
|
|
573
|
+
默认平台入口与网页同源,使用 HTTPS。CLI 的一次性浏览器授权走 `/cli/web/authorizations`、`/cli/web/exchange`,预览连接走 `/cli/preview/*`,不再调用独立 Web 服务。网页仍使用 `/developer/`;仅指定平台地址时,后台地址默认取同域名的 `/developer/`。已有地址覆盖需更新到当前平台域名,并重新运行 `buddy-cli login`。两套环境凭据隔离,预览不触发上传或发布。
|
package/dist/bin/buddy.js
CHANGED
|
@@ -70,7 +70,6 @@ import {
|
|
|
70
70
|
BuddyDevError,
|
|
71
71
|
checkRuntimeUpdate,
|
|
72
72
|
DEFAULT_MLB_TEST_URL,
|
|
73
|
-
DEFAULT_DEVELOPER_WEB_URL,
|
|
74
73
|
HttpDeveloperPlatformClient,
|
|
75
74
|
LoopbackBrowserLoginAdapter,
|
|
76
75
|
MlbDevRegistrationClient,
|
|
@@ -82,6 +81,7 @@ import {
|
|
|
82
81
|
createPushPreflight,
|
|
83
82
|
createPushSourceBundle,
|
|
84
83
|
resolvePlatformUrl,
|
|
84
|
+
resolveDeveloperWebUrl,
|
|
85
85
|
openExternalUrl,
|
|
86
86
|
requireBuddyAgentProjectRoot
|
|
87
87
|
} from "./core.js";
|
|
@@ -104,7 +104,8 @@ var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
|
|
|
104
104
|
--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
|
|
105
105
|
\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
|
|
106
106
|
\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
|
|
107
|
-
\u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\
|
|
107
|
+
\u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
|
|
108
|
+
MLB_GATEWAY_URL \u7EDF\u4E00\u9009\u62E9\u5E73\u53F0\uFF0C--app-server \u53EF\u8986\u76D6\u672C\u6B21\u547D\u4EE4\uFF1B\u540E\u53F0\u9ED8\u8BA4\u4F7F\u7528\u540C\u4E00\u5730\u5740\u7684 /developer/\u3002
|
|
108
109
|
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
|
|
109
110
|
\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
|
|
110
111
|
--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
|
|
@@ -250,6 +251,7 @@ var BuddyPlatformHost = class {
|
|
|
250
251
|
baseUrl,
|
|
251
252
|
token: async () => (await session.token({ signal: this.#signal })).accessToken
|
|
252
253
|
}),
|
|
254
|
+
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env, platformUrl: baseUrl },
|
|
253
255
|
preparePush
|
|
254
256
|
};
|
|
255
257
|
}
|
|
@@ -281,11 +283,9 @@ var BuddyPlatformHost = class {
|
|
|
281
283
|
const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer, development: true });
|
|
282
284
|
const manifest = await readBuddyProjectManifest(projectRoot);
|
|
283
285
|
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`);
|
|
284
|
-
const webUrl =
|
|
285
|
-
if (webUrl.protocol !== "https:" && !(webUrl.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(webUrl.hostname)) || webUrl.username || webUrl.password || webUrl.search || webUrl.hash) throw new Error("\u521B\u9020\u8005\u540E\u53F0\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF0C\u672C\u673A\u8C03\u8BD5\u53EF\u4F7F\u7528 loopback HTTP");
|
|
286
|
-
if (!webUrl.pathname.endsWith("/")) webUrl.pathname += "/";
|
|
286
|
+
const webUrl = resolveDeveloperWebUrl(baseUrl, parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
|
|
287
287
|
const signal = this.#signal ?? new AbortController().signal;
|
|
288
|
-
await checkRuntimeUpdate(projectRoot, (message) => io.writeError(message), { signal,
|
|
288
|
+
await checkRuntimeUpdate(projectRoot, (message) => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env, platformUrl: baseUrl });
|
|
289
289
|
const session = this.#session(baseUrl, webUrl);
|
|
290
290
|
await session.token({ signal });
|
|
291
291
|
const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);
|
|
@@ -356,7 +356,7 @@ var BuddyPlatformHost = class {
|
|
|
356
356
|
const handle = await starter.start({
|
|
357
357
|
projectRoot,
|
|
358
358
|
signal,
|
|
359
|
-
runtimeUpdate: this.#runtimeUpdate,
|
|
359
|
+
runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env, platformUrl: baseUrl },
|
|
360
360
|
onError(error) {
|
|
361
361
|
logs.flush();
|
|
362
362
|
let message = error.message;
|
|
@@ -423,13 +423,14 @@ var BuddyPlatformHost = class {
|
|
|
423
423
|
return resolvePlatformUrl({ env: this.#env });
|
|
424
424
|
}
|
|
425
425
|
#session(baseUrl, webUrl) {
|
|
426
|
+
const developerWebUrl = resolveDeveloperWebUrl(baseUrl, webUrl ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
|
|
426
427
|
const key = baseUrl.origin;
|
|
427
428
|
let session = this.#sessions.get(key);
|
|
428
429
|
if (!session) {
|
|
429
430
|
session = new CloudAuthenticator(
|
|
430
431
|
new LoopbackBrowserLoginAdapter({
|
|
431
432
|
platformUrl: baseUrl,
|
|
432
|
-
|
|
433
|
+
developerWebUrl,
|
|
433
434
|
openBrowser: this.#openUrl
|
|
434
435
|
}),
|
|
435
436
|
new SystemCloudTokenStore({
|
|
@@ -913,9 +914,10 @@ try {
|
|
|
913
914
|
const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });
|
|
914
915
|
const result = maintenance ?? await runBuddyCli(args, terminal, {
|
|
915
916
|
runtimeCatalog: { signal: lifecycle.signal },
|
|
916
|
-
scaffoldPlatformAgent: (root, name) => scaffoldPlatformAgent(root, name, {
|
|
917
|
+
scaffoldPlatformAgent: (root, name, runtimeVersion) => scaffoldPlatformAgent(root, name, {
|
|
917
918
|
resolveDependencies: (template) => latestRuntimeTemplate(template, {
|
|
918
919
|
signal: lifecycle.signal,
|
|
920
|
+
runtimeVersion,
|
|
919
921
|
report: (message) => terminal.write(message)
|
|
920
922
|
})
|
|
921
923
|
}),
|
package/dist/bin/buddy.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/bin/buddy.ts", "../../src/platform-host.ts", "../../src/runtime-logs.ts", "../../src/platform-support.ts", "../../src/self-update.ts", "../../src/update-lock.ts", "../../src/termination.ts", "../../src/auto-update.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { stdin, stderr, stdout } from \"node:process\";\nimport { createRequire } from \"node:module\";\nimport { dirname } from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport {\n PromptCancelledError,\n runBuddyCli,\n type Choice,\n type CliIO,\n type InputOptions,\n type SelectOptions,\n} from \"@buddy/cli-core\";\nimport { BuddyPlatformHost } from \"../platform-host.js\";\nimport { assertSupportedDeveloperPlatform } from \"../platform-support.js\";\nimport { runSelfUpdateCommand } from \"../self-update.js\";\nimport { bindTerminationSignals } from \"../termination.js\";\nimport { runAutoUpdate } from \"../auto-update.js\";\nimport { latestRuntimeTemplate, scaffoldPlatformAgent } from \"@buddy/cli-core/init/scaffold\";\n\nclass TerminalIO implements CliIO {\n readonly canPrompt = Boolean(stdin.isTTY && stdout.isTTY);\n private readline: Interface | undefined;\n private activeQuestion: AbortController | undefined;\n private cancelled = false;\n\n write(message: string): void {\n stdout.write(`${message}\\n`);\n }\n\n writeError(message: string): void {\n stderr.write(`${message}\\n`);\n }\n\n async openMetaPreview(path: string): Promise<void> {\n try { await promisify(execFile)(\"open\", [path]); }\n catch { this.write(`\u8BF7\u6253\u5F00\u672C\u5730\u5934\u50CF\u9884\u89C8\u540E\u518D\u786E\u8BA4\uFF1A${path}`); }\n }\n\n async select<Value extends string>(\n question: string,\n choices: readonly Choice<Value>[],\n options: SelectOptions<Value> = {},\n ): Promise<Value> {\n while (true) {\n this.write(`\\n${question}`);\n choices.forEach((choice, index) => {\n this.write(` ${index + 1}. ${choice.label}`);\n if (choice.description) this.write(` ${choice.description}`);\n });\n\n const defaultIndex = options.defaultValue === undefined\n ? undefined\n : choices.findIndex((choice) => choice.value === options.defaultValue);\n const prompt = defaultIndex === undefined || defaultIndex < 0\n ? \"\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF1A\"\n : `\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF08\u9ED8\u8BA4\uFF1A${defaultIndex + 1}\uFF09\uFF1A`;\n const answer = (await this.question(prompt)).trim();\n if (!answer && defaultIndex !== undefined && defaultIndex >= 0) return choices[defaultIndex]!.value;\n const selected = Number(answer) - 1;\n const choice = choices[selected];\n if (choice) return choice.value;\n this.writeError(`\u8BF7\u8F93\u5165 1 \u5230 ${choices.length} \u4E4B\u95F4\u7684\u5E8F\u53F7\u3002`);\n }\n }\n\n async input(question: string, options: InputOptions = {}): Promise<string> {\n const defaultHint = options.defaultValue === undefined ? \"\" : `\uFF08\u9ED8\u8BA4\uFF1A${options.defaultValue}\uFF09`;\n const answer = (await this.question(`${question}${defaultHint}\uFF1A`)).trim();\n return answer || options.defaultValue || \"\";\n }\n\n close(): void {\n this.readline?.close();\n }\n\n private getReadline(): Interface {\n if (this.readline) return this.readline;\n this.readline = createInterface({ input: stdin, output: stdout });\n this.readline.on(\"SIGINT\", () => {\n this.cancelled = true;\n this.activeQuestion?.abort();\n });\n return this.readline;\n }\n\n private async question(prompt: string): Promise<string> {\n const controller = new AbortController();\n this.activeQuestion = controller;\n try {\n return await this.getReadline().question(prompt, { signal: controller.signal });\n } catch (cause) {\n if (this.cancelled) throw new PromptCancelledError();\n throw cause;\n } finally {\n if (this.activeQuestion === controller) this.activeQuestion = undefined;\n }\n }\n}\n\nconst terminal = new TerminalIO();\nconst lifecycle = new AbortController();\nconst abortFromSignal = (signal: NodeJS.Signals) => {\n if (!lifecycle.signal.aborted) lifecycle.abort(new Error(signal));\n};\nconst unbindTermination = bindTerminationSignals(lifecycle);\n// Terminal closure may break output while asynchronous process cleanup is running.\nconst onOutputError = (error: NodeJS.ErrnoException) => {\n if (error.code === \"EPIPE\" || error.code === \"EIO\") abortFromSignal(\"SIGHUP\");\n else throw error;\n};\nstdout.on(\"error\", onOutputError);\nstderr.on(\"error\", onOutputError);\n\ntry {\n assertSupportedDeveloperPlatform();\n const args = process.argv.slice(2);\n const require = createRequire(import.meta.url);\n const manifestPath = require.resolve(\"@my-life-buddies/cli/package.json\");\n const updateOptions = {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n };\n const maintenance = await runSelfUpdateCommand(args, terminal, updateOptions)\n ?? await runAutoUpdate(args, terminal, updateOptions);\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\n scaffoldPlatformAgent: (root, name) => scaffoldPlatformAgent(root, name, {\n resolveDependencies: template => latestRuntimeTemplate(template, {\n signal: lifecycle.signal, report: message => terminal.write(message),\n }),\n }),\n ...(command === \"dev\" ? { dev: host().devOptions() } : {}),\n // Resolve credentials only when a supported command actually needs them.\n get cloud() { return host().cloudOptions(); },\n preview: (previewArgs, io) => host().runPreview(previewArgs, io),\n });\n process.exitCode = result.exitCode;\n} catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n terminal.writeError(`buddy-cli: ${message}`);\n process.exitCode = 1;\n} finally {\n unbindTermination();\n terminal.close();\n}\n", "import { resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readBuddyProjectManifest } from \"@buddy/cli-core/config\";\nimport { createRuntimeLogForwarder } from \"./runtime-logs.js\";\n\nimport {\n CloudAuthenticator,\n BuddyDevError,\n checkRuntimeUpdate,\n type RuntimePackageOptions,\n DEFAULT_MLB_TEST_URL,\n DEFAULT_DEVELOPER_WEB_URL,\n HttpDeveloperPlatformClient,\n LoopbackBrowserLoginAdapter,\n MlbDevRegistrationClient,\n MockDeveloperPlatformClient,\n SystemCloudTokenStore,\n SystemBuddyTokenStore,\n createBuddyDevStarter,\n stopLocalDev,\n createPushPreflight,\n createPushSourceBundle,\n resolvePlatformUrl,\n openExternalUrl,\n requireBuddyAgentProjectRoot,\n type CliIO,\n type CredentialCommandRunner,\n type CliRunResult,\n type RunCloudCommandOptions,\n type RunDevCommandOptions,\n} from \"@buddy/cli-core\";\nimport {\n PreviewController,\n MlbSimulatorClient,\n createBuddyPreviewUrl,\n startPreviewControlServer,\n connectPreviewBridge,\n type PreviewBuddyDetails,\n type PreviewDevHandle,\n type PreviewDevStarter,\n} from \"@buddy/preview\";\n\nexport interface ParsedPreviewArguments {\n readonly directory: string;\n readonly appServer?: string;\n readonly port?: number;\n readonly help: boolean;\n readonly local: boolean;\n readonly noOpen?: boolean;\n readonly refreshToken?: boolean;\n readonly buddyId?: string;\n readonly developerWeb?: string;\n}\n\nexport const PREVIEW_COMMAND_HELP = `\u7528\u6CD5:\n 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]\n buddy-cli preview --local [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]\n\n\u8BF4\u660E:\n \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\n --buddy-id \u6821\u9A8C\u5F53\u524D\u5DE5\u7A0B\u8EAB\u4EFD\uFF1B\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u63D0\u4F9B\u642D\u5B50\u548C\u73AF\u5883\u5B8C\u6574\u53C2\u6570\u3002\n \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\n --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\u3002\n --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\n \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\n \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\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTP \u4EC5\u9650\u6D4B\u8BD5\uFF09\u3002\n 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\n \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\n --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\n 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\n \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002`;\n\nfunction valueAfter(args: readonly string[], index: number, flag: string): string {\n const value = args[index + 1];\n if (value === undefined || !value.trim()) throw new Error(`${flag} \u7F3A\u5C11\u503C`);\n return value;\n}\n\nfunction setOnce(current: string | undefined, value: string, flag: string): string {\n if (current !== undefined) throw new Error(`${flag} \u4E0D\u80FD\u91CD\u590D`);\n return value;\n}\n\nexport function parsePreviewArguments(args: readonly string[]): ParsedPreviewArguments {\n let directory = \".\";\n let directorySet = false;\n let appServer: string | undefined;\n let port: number | undefined;\n let help = false;\n let local = false;\n let noOpen = false;\n let refreshToken = false;\n let buddyId: string | undefined;\n let developerWeb: string | undefined;\n for (let index = 0; index < args.length; index += 1) {\n const flag = args[index];\n if (flag === \"--refresh-token\") {\n if (refreshToken) throw new Error(\"--refresh-token \u4E0D\u80FD\u91CD\u590D\");\n refreshToken = true;\n continue;\n }\n if (flag === \"--help\" || flag === \"-h\") {\n if (args.length !== 1) throw new Error(\"--help \u4E0D\u80FD\u548C\u5176\u4ED6 preview \u53C2\u6570\u4E00\u8D77\u4F7F\u7528\");\n help = true;\n continue;\n }\n if (flag === \"--local\") { if (local) throw new Error(\"--local \u4E0D\u80FD\u91CD\u590D\"); local = true; continue; }\n if (flag === \"--no-open\") { if (noOpen) throw new Error(\"--no-open \u4E0D\u80FD\u91CD\u590D\"); noOpen = true; continue; }\n const value = valueAfter(args, index, flag ?? \"\u53C2\u6570\");\n index += 1;\n switch (flag) {\n case \"--buddy-id\":\n buddyId = setOnce(buddyId, value, flag);\n if (!/^[A-Za-z0-9_-]{1,128}$/u.test(buddyId)) throw new Error(\"--buddy-id \u65E0\u6548\");\n break;\n case \"--developer-web\":\n developerWeb = setOnce(developerWeb, value, flag);\n break;\n case \"--directory\":\n if (directorySet) throw new Error(\"--directory \u4E0D\u80FD\u91CD\u590D\");\n directory = value;\n directorySet = true;\n break;\n case \"--port\":\n if (port !== undefined || !/^\\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\");\n port = Number(value);\n break;\n case \"--app-server\":\n appServer = setOnce(appServer, value, flag);\n break;\n default:\n throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? \"\"}`);\n }\n }\n if (port !== undefined && !local) throw new Error(\"--port \u4EC5\u7528\u4E8E --local \u5907\u7528\u9884\u89C8\");\n if (local && developerWeb) throw new Error(\"--local \u4E0D\u9700\u8981 --developer-web\");\n if (local && noOpen) throw new Error(\"--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF0C\u4E0D\u80FD\u548C --local \u4E00\u8D77\u4F7F\u7528\");\n return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...(port === undefined ? {} : { port }), ...(refreshToken ? { refreshToken: true } : {}), ...(noOpen ? { noOpen: true } : {}) });\n}\n\nexport interface BuddyPlatformHostOptions {\n readonly runtimeUpdate?: RuntimePackageOptions;\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n readonly signal?: AbortSignal;\n readonly openUrl?: (url: URL) => Promise<void>;\n readonly credentialCommandRunner?: CredentialCommandRunner;\n}\n\nfunction waitForAbort(signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolveWait) => {\n signal.addEventListener(\"abort\", () => resolveWait(), { once: true });\n });\n}\n\nfunction previewHandle(handle: Awaited<ReturnType<ReturnType<typeof createBuddyDevStarter>[\"start\"]>>): PreviewDevHandle {\n return Object.freeze({\n closed: handle.completion.then((completion) => {\n if (completion.state === \"failed\") throw completion.error ?? new Error(\"DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\");\n }),\n close: () => handle.stop(),\n });\n}\n\nexport class BuddyPlatformHost {\n readonly #runtimeUpdate: RuntimePackageOptions | undefined;\n readonly #env: Readonly<NodeJS.ProcessEnv>;\n readonly #signal: AbortSignal | undefined;\n readonly #openUrl: (url: URL) => Promise<void>;\n readonly #sessions = new Map<string, CloudAuthenticator>();\n readonly #credentialCommandRunner: CredentialCommandRunner | undefined;\n readonly #mockClient = new MockDeveloperPlatformClient();\n\n constructor(options: BuddyPlatformHostOptions = {}) {\n this.#runtimeUpdate = options.runtimeUpdate;\n this.#env = options.env ?? process.env;\n this.#signal = options.signal;\n this.#openUrl = options.openUrl ?? openExternalUrl;\n this.#credentialCommandRunner = options.credentialCommandRunner;\n }\n\n cloudOptions(): Omit<RunCloudCommandOptions, \"cwd\"> {\n const preparePush: NonNullable<RunCloudCommandOptions[\"preparePush\"]> = async (\n projectRoot,\n _config,\n expectedRuntimeVersion,\n ) => {\n const plan = await createPushPreflight({ projectRoot, expectedRuntimeVersion });\n return createPushSourceBundle(plan);\n };\n if (this.#env.BUDDY_CLI_MOCK_CLOUD === \"1\") {\n const mockToken = {\n accessToken: \"local-mock-access-token\",\n subject: \"account_local_mock\",\n expiresAt: Date.now() + 60 * 60_000,\n };\n return {\n mode: \"local-mock\",\n signal: this.#signal,\n session: {\n async token() { return mockToken; },\n async currentToken() { return mockToken; },\n async clear() {},\n },\n client: this.#mockClient,\n preparePush,\n };\n }\n const baseUrl = this.#configuredServer();\n const session = this.#session(baseUrl);\n return {\n mode: \"cloud\",\n session,\n signal: this.#signal,\n client: new HttpDeveloperPlatformClient({\n baseUrl,\n token: async () => (await session.token({ signal: this.#signal })).accessToken,\n }),\n preparePush,\n };\n }\n\n devOptions(): Omit<RunDevCommandOptions, \"cwd\"> {\n return {\n signal: this.#signal,\n env: this.#env,\n authorize: async ({ appServerUrl: baseUrl }) => {\n await this.#session(baseUrl).token({ signal: this.#signal });\n },\n createRegistrationClient: async ({ appServerUrl: baseUrl, refreshToken }) => {\n const token = await this.#session(baseUrl).token({ signal: this.#signal });\n return new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n },\n };\n }\n\n async runPreview(args: readonly string[], io: CliIO): Promise<CliRunResult> {\n const parsed = parsePreviewArguments(args);\n if (parsed.help) {\n io.write(PREVIEW_COMMAND_HELP);\n return { exitCode: 0, route: \"preview\" };\n }\n\n const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));\n const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer, development: true });\n const manifest = await readBuddyProjectManifest(projectRoot);\n 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`);\n const webUrl = new URL(parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL ?? DEFAULT_DEVELOPER_WEB_URL);\n if ((webUrl.protocol !== \"https:\" && !(webUrl.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(webUrl.hostname)))\n || webUrl.username || webUrl.password || webUrl.search || webUrl.hash) throw new Error(\"\u521B\u9020\u8005\u540E\u53F0\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF0C\u672C\u673A\u8C03\u8BD5\u53EF\u4F7F\u7528 loopback HTTP\");\n if (!webUrl.pathname.endsWith(\"/\")) webUrl.pathname += \"/\";\n const signal = this.#signal ?? new AbortController().signal;\n await checkRuntimeUpdate(projectRoot, message => io.writeError(message), { signal, ...this.#runtimeUpdate });\n const session = this.#session(baseUrl, webUrl);\n await session.token({ signal });\n const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);\n const controller = new PreviewController({\n projectRoot,\n devStarter: starter,\n readBuddyDetails: async (buddyId) => {\n const token = await this.#session(baseUrl).token({ signal });\n return new MlbSimulatorClient({\n baseUrl,\n buddyId: `${buddyId}-dev`,\n auth: { developerAccessToken: token.accessToken },\n }).details({ signal });\n },\n });\n const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });\n let bridge: Awaited<ReturnType<typeof connectPreviewBridge>> | undefined;\n try {\n const pageUrl = new URL(webUrl);\n pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;\n if (!parsed.local) bridge = await connectPreviewBridge({ webUrl, platformOrigin: baseUrl.origin, buddyId: manifest.buddyId,\n controller, localServer: serverHandle, token: async () => (await session.token({ signal })).accessToken,\n signal, onStatus: message => io.write(message),\n stopLocalDev: () => stopLocalDev({ gatewayUrl: baseUrl, devAgentId: manifest.buddyId, projectRoot }),\n });\n 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}`);\n else {\n await this.#openUrl(parsed.local ? serverHandle.bootstrapUrl : pageUrl);\n 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}`);\n }\n 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`);\n 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\");\n if (bridge?.reused) {\n 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\");\n return { exitCode: 0, route: \"preview\" };\n }\n io.write(\"\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\u3002\");\n if (signal.aborted) return { exitCode: 130, route: \"preview\" };\n await (bridge ? bridge.completion : waitForAbort(signal));\n return { exitCode: 130, route: \"preview\" };\n } finally {\n await bridge?.close().catch(() => undefined);\n await controller.close().catch(() => undefined);\n await serverHandle.close();\n }\n }\n\n #previewStarter(baseUrl: URL, buddyId: string, session: CloudAuthenticator, refreshToken: boolean): PreviewDevStarter {\n const starter = createBuddyDevStarter();\n return Object.freeze({\n start: async ({ projectRoot, signal, onLog, onLifecycle }: Parameters<PreviewDevStarter[\"start\"]>[0]) => {\n if ((await readBuddyProjectManifest(projectRoot)).buddyId !== buddyId) throw new Error(\"\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5\");\n const token = await session.token({ signal });\n const secrets = new Set([token.accessToken]);\n const logs = createRuntimeLogForwarder(event => onLog?.(event), secrets);\n const registrationClient = new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n let reloadError: { code: string; message: string } | undefined;\n const handle = await starter.start({ projectRoot, signal, runtimeUpdate: this.#runtimeUpdate,\n onError(error) {\n logs.flush();\n let message = error.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n reloadError = { code: error.code, message: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) };\n },\n onStateChange(phase) {\n if (phase === \"reloading\") reloadError = undefined;\n if (phase === \"reloading\" || phase === \"reload_failed\" || phase === \"ready\") onLifecycle?.({ phase, ...(phase === \"reload_failed\" && reloadError ? { error: reloadError } : {}) });\n },\n registrationClient: {\n async register(request, options) {\n const registered = await registrationClient.register(request, options);\n secrets.add(registered.agentToken);\n return registered;\n },\n listOnline: options => registrationClient.listOnline(options),\n },\n onLog: logs.write,\n }).catch(cause => {\n logs.flush();\n if (cause instanceof BuddyDevError && cause.code.startsWith(\"DEV_RUNTIME_\")) {\n let message = cause.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n Object.assign(cause, { publicMessage: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) });\n }\n throw cause;\n });\n const preview = previewHandle(handle);\n void preview.closed.then(() => logs.flush(), () => logs.flush());\n const devBuddyId = `${handle.devAgentId}-dev`;\n const simulator = new MlbSimulatorClient({\n baseUrl,\n buddyId: devBuddyId,\n auth: { developerAccessToken: token.accessToken },\n });\n let buddy: PreviewBuddyDetails;\n let previewUrl: string;\n try {\n buddy = await simulator.details({ signal });\n previewUrl = createBuddyPreviewUrl(devBuddyId);\n signal.throwIfAborted();\n } catch (cause) {\n // Do not leave an Agent running after a failed/unauthorized profile read.\n await handle.stop();\n throw cause;\n }\n return Object.freeze({\n handle: preview,\n ready: Object.freeze({\n agentId: devBuddyId,\n buddy,\n devicePairing: Object.freeze({ url: previewUrl }),\n simulatorUrl: baseUrl.href,\n }),\n simulator,\n });\n },\n });\n }\n\n #buddyTokenStore(baseUrl: URL, subject: string, buddyId: string): SystemBuddyTokenStore {\n return new SystemBuddyTokenStore({ platformUrl: baseUrl, subject, buddyId, commandRunner: this.#credentialCommandRunner });\n }\n\n #configuredServer(): URL {\n return resolvePlatformUrl({ env: this.#env });\n }\n\n #session(baseUrl: URL, webUrl?: URL): CloudAuthenticator {\n const key = baseUrl.origin;\n let session = this.#sessions.get(key);\n if (!session) {\n session = new CloudAuthenticator(\n new LoopbackBrowserLoginAdapter({\n platformUrl: baseUrl,\n ...(webUrl ? { developerWebUrl: webUrl } : this.#env.BUDDY_DEVELOPER_WEB_URL ? { developerWebUrl: this.#env.BUDDY_DEVELOPER_WEB_URL } : {}),\n openBrowser: this.#openUrl,\n }),\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(key).digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\n );\n this.#sessions.set(key, session);\n }\n return session;\n }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { DevLogEvent } from \"@buddy/cli-core\";\n\nconst MAX_LOG_LINE = 8_192;\n\n/** Assemble process chunks before masking credentials, including tokens split across chunks. */\nexport function createRuntimeLogForwarder(\n onLog: (event: DevLogEvent) => void,\n secrets: ReadonlySet<string>,\n) {\n const streams = new Map<DevLogEvent[\"source\"], { text: string; truncated: boolean }>();\n const emit = (source: DevLogEvent[\"source\"]) => {\n const pending = streams.get(source);\n if (!pending) return;\n streams.delete(source);\n let text = stripVTControlCharacters(pending.text);\n for (const secret of secrets) if (secret) text = text.split(secret).join(\"[REDACTED]\");\n if (pending.truncated) {\n // ANSI removal can move a credential cut at the raw buffer boundary into\n // the visible prefix. Mask its trailing prefix too, before display truncation.\n for (const secret of secrets) {\n for (let size = Math.min(secret.length - 1, text.length); size > 0; size--) {\n if (text.endsWith(secret.slice(0, size))) {\n text = text.slice(0, -size) + \"[REDACTED]\";\n break;\n }\n }\n }\n }\n text = text.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f]/gu, \"\").trimEnd();\n if (!text) return;\n text = text.slice(0, MAX_LOG_LINE) + (pending.truncated ? \" \u2026[truncated]\" : \"\");\n try { onLog({ source, text }); } catch { /* Diagnostics must not break supervision. */ }\n };\n return {\n write({ source, text }: DevLogEvent) {\n const limit = MAX_LOG_LINE + Math.max(0, ...[...secrets].map(secret => secret.length));\n for (const part of text.split(/(?<=\\n)/u)) {\n const pending = streams.get(source) ?? { text: \"\", truncated: false };\n const available = Math.max(0, limit - pending.text.length);\n pending.text += part.slice(0, available);\n pending.truncated ||= part.length > available;\n streams.set(source, pending);\n if (part.endsWith(\"\\n\")) emit(source);\n }\n },\n flush() { for (const source of streams.keys()) emit(source); },\n };\n}\n", "export class UnsupportedDeveloperPlatformError extends Error {\n constructor(readonly platform: NodeJS.Platform) {\n super(`buddy-cli V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);\n this.name = \"UnsupportedDeveloperPlatformError\";\n }\n}\n\nexport function assertSupportedDeveloperPlatform(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform !== \"darwin\") throw new UnsupportedDeveloperPlatformError(platform);\n}\n", "import { execFile } from \"node:child_process\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { defaultUpdateCache, globalUpdateLock, withUpdateLock } from \"./update-lock.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY}`;\nconst execute = promisify(execFile);\nconst HELP = `\u7528\u6CD5:\n buddy-cli --version [--json]\n buddy-cli update --check [--json]\n buddy-cli update [--json]\n\n--version \u67E5\u770B\u5F53\u524D\u8FD0\u884C\u7684 CLI \u7248\u672C\uFF08\u65E0\u9700\u8054\u7F51\uFF09\n--check \u68C0\u67E5\u516C\u5171 npm \u7684 latest \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5\n--json \u8F93\u51FA JSON\uFF0C\u4F9B Coding Agent \u6216\u811A\u672C\u8BFB\u53D6\n\n\u65E0\u9700\u767B\u5F55\u642D\u642D\u8D26\u53F7\uFF0C\u4E5F\u65E0\u9700\u8FDB\u5165\u642D\u5B50\u5DE5\u7A0B\u3002\n\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\n--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\nupdate \u7528\u4E8E\u5355\u72EC\u66F4\u65B0\u5F53\u524D npm \u5168\u5C40\u5B89\u88C5\u7684 CLI\uFF0C\u4E0D\u4FEE\u6539\u642D\u5B50\u5DE5\u7A0B\u7684 Runtime \u4F9D\u8D56\u3002\n\u5DF2\u7ECF\u662F\u6700\u65B0\u7248\u6216\u5F53\u524D\u7248\u672C\u66F4\u9AD8\u65F6\u4E0D\u5B89\u88C5\u3001\u4E0D\u964D\u7EA7\u3002\n\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\n\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\n\u65E7\u7248 CLI \u5C1A\u65E0 update \u547D\u4EE4\u65F6\uFF0C\u8FD0\u884C\uFF1A\\n ${MANUAL_UPDATE}`;\n\nexport interface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\nexport interface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n cacheDirectory?: string;\n fetch?: typeof globalThis.fetch;\n runNpm?: (args: string[], options: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n}\n\n// SemVer precedence ignores build metadata; numeric identifiers compare numerically.\nfunction parseVersion(version: unknown): string[] {\n const numeric = \"(?:0|[1-9][0-9]*)\";\n const identifier = `(?:${numeric}|[0-9]*[A-Za-z-][0-9A-Za-z-]*)`;\n const pattern = new RegExp(`^(${numeric})\\\\.(${numeric})\\\\.(${numeric})(?:-(${identifier}(?:\\\\.${identifier})*))?(?:\\\\+[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?$`, \"u\");\n const match = typeof version === \"string\" && version.length <= 256 ? pattern.exec(version) : null;\n if (!match || match[0] !== version) throw new Error(\"\u7248\u672C\u4FE1\u606F\u4E0D\u662F\u6709\u6548\u7684 SemVer \u7248\u672C\u53F7\u3002\");\n return [match[1]!, match[2]!, match[3]!, ...(match[4]?.split(\".\") ?? [])];\n}\n\nexport function compareVersions(left: string, right: string): number {\n const a = parseVersion(left);\n const b = parseVersion(right);\n for (let i = 0; i < 3; i++) {\n if (BigInt(a[i]!) !== BigInt(b[i]!)) return BigInt(a[i]!) > BigInt(b[i]!) ? 1 : -1;\n }\n if (a.length === 3 || b.length === 3) return a.length === b.length ? 0 : a.length === 3 ? 1 : -1;\n for (let i = 3; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (x === y) continue;\n if (x === undefined || y === undefined) return x === undefined ? -1 : 1;\n const xn = /^[0-9]+$/u.test(x);\n const yn = /^[0-9]+$/u.test(y);\n if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;\n if (xn !== yn) return xn ? -1 : 1;\n return x > y ? 1 : -1;\n }\n return 0;\n}\n\nexport async function latestVersion(options: UpdateOptions): Promise<string> {\n const timeout = AbortSignal.timeout(10_000);\n const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;\n try {\n const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(PACKAGE)}/latest`, {\n signal, headers: { Accept: \"application/json\" }, redirect: \"error\",\n });\n if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);\n const metadata = await response.json() as { name?: unknown; version?: unknown } | null;\n if (metadata?.name !== PACKAGE) throw new Error(\"npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D\");\n parseVersion(metadata.version);\n return metadata.version as string;\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002\");\n if (timeout.aborted) throw new Error(\"\u68C0\u67E5\u66F4\u65B0\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002\");\n throw new Error(`\u65E0\u6CD5\u68C0\u67E5 npm \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`);\n }\n}\n\nexport async function installUpdate(version: string, options: UpdateOptions): Promise<void> {\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n // The CLI supports macOS, where global packages live under prefix/lib/node_modules.\n const installedRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let sameInstallation = false;\n try {\n sameInstallation = !(await lstat(installedRoot)).isSymbolicLink()\n && await realpath(installedRoot) === await realpath(options.packageRoot);\n } catch { /* Missing global package means this CLI came from another installation. */ }\n if (!sameInstallation) {\n throw new Error(\"\u5F53\u524D CLI \u4E0D\u662F\u8FD9\u4E2A npm \u73AF\u5883\u7684\u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u66F4\u65B0\u3002\u8BF7\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\uFF1B\u82E5\u4F7F\u7528 nvm\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5B89\u88C5\u8BE5 CLI \u7684 Node.js \u73AF\u5883\u3002\");\n }\n await withUpdateLock(globalUpdateLock(options.cacheDirectory ?? defaultUpdateCache(), prefix), options.signal, async () => {\n const current = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (current.name === PACKAGE && current.version === version) return;\n 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\");\n try {\n await runNpm([\n \"install\", \"--global\", `${PACKAGE}@${version}`, \"--prefix\", prefix,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\",\n ], { ...settings, timeout: 180_000 });\n } catch (cause) {\n 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\");\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u548C\u5168\u5C40\u76EE\u5F55\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n const installed = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (installed.name !== PACKAGE || installed.version !== version) {\n 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}`);\n }\n });\n}\n\n/** Public CLI maintenance runs before any project or platform credential handling. */\nexport async function runSelfUpdateCommand(\n args: readonly string[],\n io: Pick<CliIO, \"write\" | \"writeError\">,\n options: UpdateOptions,\n): Promise<CliRunResult | undefined> {\n const versionOnly = args[0] === \"--version\" || args[0] === \"-v\";\n if (!versionOnly && args[0] !== \"update\") return undefined;\n const json = args.includes(\"--json\");\n const fail = (message: string, exitCode: number) => {\n if (json) io.write(JSON.stringify({ package: PACKAGE, currentVersion: options.version, error: message }));\n else io.writeError(`buddy-cli: ${message}`);\n return { exitCode };\n };\n const flags = args.slice(1);\n const allowed = versionOnly ? [\"--json\", \"--help\", \"-h\"] : [\"--check\", \"--json\", \"--help\", \"-h\"];\n if (flags.some(flag => !allowed.includes(flag)) || new Set(flags).size !== flags.length) {\n return fail(\"\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli update --help \u67E5\u770B\u7528\u6CD5\u3002\", 2);\n }\n if (flags.includes(\"--help\") || flags.includes(\"-h\")) {\n if (json) io.write(JSON.stringify({ help: HELP }));\n else io.write(HELP);\n return { exitCode: 0 };\n }\n try {\n parseVersion(options.version);\n if (versionOnly) {\n io.write(json ? JSON.stringify({ package: PACKAGE, version: options.version }) : options.version);\n return { exitCode: 0 };\n }\n const latest = await latestVersion(options);\n const comparison = compareVersions(latest, options.version);\n const check = flags.includes(\"--check\");\n const status = comparison > 0 ? \"update_available\" : comparison < 0 ? \"ahead\" : \"up_to_date\";\n if (!check && comparison > 0) {\n if (!json) io.write(`\u6B63\u5728\u66F4\u65B0 CLI\uFF1A${options.version} \u2192 ${latest}\u2026`);\n await installUpdate(latest, options);\n }\n const updated = !check && comparison > 0;\n if (json) {\n io.write(JSON.stringify({\n package: PACKAGE, currentVersion: options.version, latestVersion: latest,\n updateAvailable: comparison > 0 && !updated, status: updated ? \"updated\" : status,\n ...(updated ? { installedVersion: latest } : {}),\n }));\n } else if (updated) io.write(`CLI \u5DF2\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002`);\n 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`);\n else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm latest ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);\n else io.write(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\uFF1A${options.version}\u3002`);\n return { exitCode: 0 };\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause), 1);\n }\n}\n", "import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nexport const defaultUpdateCache = () => join(homedir(), \".cache\", \"buddy-cli\", \"updates\");\nexport const globalUpdateLock = (cache: string, prefix: string) => join(cache, \"locks\", createHash(\"sha256\").update(prefix).digest(\"hex\"));\n\n/** Never steal an installation lock on a timer: npm may still be writing files. */\nexport async function withUpdateLock<T>(path: string, signal: AbortSignal | undefined, action: () => Promise<T>): Promise<T> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const deadline = Date.now() + 200_000;\n for (;;) {\n signal?.throwIfAborted();\n try { await mkdir(path, { mode: 0o700 }); break; }\n catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"EEXIST\") throw cause;\n if (Date.now() >= deadline) throw new Error(`\u7B49\u5F85\u5176\u4ED6 CLI \u66F4\u65B0\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4\u66F4\u65B0\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u518D\u6E05\u7406\u9501\u76EE\u5F55\u5E76\u91CD\u8BD5\uFF1A${path}`);\n await delay(100, undefined, { signal });\n }\n }\n try {\n await writeFile(`${path}/owner.json`, JSON.stringify({ pid: process.pid, startedAt: Date.now() }), { mode: 0o600 });\n signal?.throwIfAborted();\n return await action();\n } finally { await rm(path, { recursive: true, force: true }); }\n}\n", "/** Keep the CLI alive long enough to stop detached Runtime children on terminal closure. */\nexport function bindTerminationSignals(controller: AbortController): () => void {\n const handlers = new Map<NodeJS.Signals, () => void>();\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n const handler = () => { if (!controller.signal.aborted) controller.abort(new Error(signal)); };\n handlers.set(signal, handler);\n process.on(signal, handler);\n }\n return () => { for (const [signal, handler] of handlers) process.off(signal, handler); };\n}\n", "import { execFile, spawn } from \"node:child_process\";\nimport { lstat, mkdir, mkdtemp, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { constants, homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { compareVersions, installUpdate, latestVersion, type UpdateOptions } from \"./self-update.js\";\nimport { defaultUpdateCache, withUpdateLock } from \"./update-lock.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst execute = promisify(execFile);\nexport const HANDOFF_ENV = \"BUDDY_CLI_UPDATE_HANDOFF\";\n\ninterface ChildOptions { cwd: string; env: NodeJS.ProcessEnv; signal?: AbortSignal }\nexport interface AutoUpdateOptions extends UpdateOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n runCli?: (entry: string, args: readonly string[], options: ChildOptions) => Promise<CliRunResult>;\n}\n\nasync function installedVersion(root: string): Promise<string | undefined> {\n try {\n const pkg = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n return pkg.name === PACKAGE && typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch { return undefined; }\n}\n\nasync function checkedEntry(root: string, version: string): Promise<string> {\n if (await installedVersion(root) !== version) throw new Error(`CLI \u5B89\u88C5\u7ED3\u679C\u4E0E\u672C\u6B21\u8981\u6C42\u7684 ${version} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u8BD5\u3002`);\n const entry = join(root, \"dist\", \"bin\", \"buddy.js\");\n if (!(await lstat(entry)).isFile()) throw new Error(\"\u65B0\u7248 CLI \u7F3A\u5C11\u6709\u6548\u7684\u6267\u884C\u5165\u53E3\u3002\");\n return entry;\n}\n\nasync function prepareLatest(version: string, options: AutoUpdateOptions): Promise<string> {\n const cache = options.cacheDirectory ?? defaultUpdateCache();\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n const globalRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let isGlobal = false;\n try {\n isGlobal = !(await lstat(globalRoot)).isSymbolicLink()\n && await realpath(globalRoot) === await realpath(options.packageRoot);\n } catch { /* Local, source and npx installations use an isolated release cache. */ }\n if (isGlobal) {\n await installUpdate(version, options);\n return checkedEntry(globalRoot, version);\n }\n const destination = join(cache, \"releases\", version);\n return withUpdateLock(join(cache, \"locks\", `release-${version}`), options.signal, async () => {\n const root = join(destination, \"node_modules\", PACKAGE);\n try { return await checkedEntry(root, version); } catch { /* Repair incomplete cached installs. */ }\n await mkdir(join(cache, \"releases\"), { recursive: true, mode: 0o700 });\n const temporary = await mkdtemp(join(cache, \"releases\", \".install-\"));\n try {\n await writeFile(join(temporary, \"package.json\"), JSON.stringify({ private: true }));\n try {\n await runNpm([\"install\", \"--prefix\", temporary, \"--save-exact\", `${PACKAGE}@${version}`,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\"],\n { cwd: temporary, signal: options.signal, timeout: 180_000 });\n } catch (cause) {\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`\u65B0\u7248 CLI \u7F13\u5B58\u5B89\u88C5\u5931\u8D25\uFF08${code}\uFF09\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u3001Node.js \u7248\u672C\u548C\u76EE\u5F55\u6743\u9650\u540E\u91CD\u8BD5\u3002`);\n }\n await checkedEntry(join(temporary, \"node_modules\", PACKAGE), version);\n options.signal?.throwIfAborted();\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return checkedEntry(root, version);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n });\n}\n\n/** Direct argv, inherited terminal and no shell; parent waits and forwards cancellation. */\nexport async function runUpdatedCli(entry: string, args: readonly string[], options: ChildOptions): Promise<CliRunResult> {\n options.signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...args], { cwd: options.cwd, env: options.env, stdio: \"inherit\" });\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n const abort = () => {\n const reason = options.signal?.reason?.message;\n const signal = reason === \"SIGINT\" ? \"SIGINT\" : reason === \"SIGHUP\" ? \"SIGHUP\" : \"SIGTERM\";\n child.kill(signal);\n killTimer ??= setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n killTimer.unref();\n };\n const cleanup = () => { options.signal?.removeEventListener(\"abort\", abort); clearTimeout(killTimer); };\n child.once(\"error\", error => { cleanup(); reject(error); });\n child.once(\"exit\", (code, signal) => {\n cleanup();\n resolve({ exitCode: code ?? 128 + (signal ? constants.signals[signal] : 1) });\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** Runs before any project, credentials, platform host or business side effects. */\nexport async function runAutoUpdate(args: readonly string[], io: Pick<CliIO, \"write\" | \"writeError\">, options: AutoUpdateOptions): Promise<CliRunResult | undefined> {\n if (args[0] === \"dev\" && args[1] === \"stop\") return undefined; // Emergency local cleanup must work offline.\n if (args[0] === \"help\" || args[0] === \"update\" || args[0] === \"--version\" || args[0] === \"-v\"\n || args.includes(\"--help\") || args.includes(\"-h\")) return undefined;\n try {\n const env = { ...(options.env ?? process.env) };\n const handoff = env[HANDOFF_ENV];\n // Consume the marker; commands started later by an Agent must check again.\n if (handoff !== undefined) {\n delete env[HANDOFF_ENV];\n if (!options.env) delete process.env[HANDOFF_ENV];\n const expected = JSON.parse(handoff);\n const entry = await realpath(join(options.packageRoot, \"dist\", \"bin\", \"buddy.js\"));\n if (expected.parent !== process.ppid || expected.version !== options.version || expected.entry !== entry\n || JSON.stringify(expected.args) !== JSON.stringify(args)) throw new Error(\"CLI \u81EA\u52A8\u66F4\u65B0\u63A5\u7EED\u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\u3002\");\n return undefined;\n }\n const latest = await latestVersion(options);\n if (compareVersions(latest, options.version) <= 0) return undefined;\n io.writeError(`CLI \u81EA\u52A8\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002\u5B8C\u6210\u540E\u7EE7\u7EED\u5F53\u524D\u547D\u4EE4\uFF0C\u8BF7\u52FF\u91CD\u590D\u6267\u884C\u3002`);\n const entry = await realpath(await prepareLatest(latest, options));\n options.signal?.throwIfAborted();\n env[HANDOFF_ENV] = JSON.stringify({ parent: process.pid, version: latest, entry, args });\n return await (options.runCli ?? runUpdatedCli)(entry, args, { cwd: options.cwd ?? process.cwd(), env, signal: options.signal });\n } catch (cause) {\n const error = options.signal?.aborted ? \"CLI \u81EA\u52A8\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\u3002\"\n : `CLI \u81EA\u68C0\u6216\u66F4\u65B0\u5931\u8D25\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\uFF1A${cause instanceof Error ? cause.message : String(cause)}`;\n if (args.includes(\"--json\")) io.write(JSON.stringify({ code: \"CLI_UPDATE_FAILED\", error }));\n else io.writeError(error);\n return { exitCode: 1 };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { stdin, stderr, stdout } from \"node:process\";\nimport { createRequire } from \"node:module\";\nimport { dirname } from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport {\n PromptCancelledError,\n runBuddyCli,\n type Choice,\n type CliIO,\n type InputOptions,\n type SelectOptions,\n} from \"@buddy/cli-core\";\nimport { BuddyPlatformHost } from \"../platform-host.js\";\nimport { assertSupportedDeveloperPlatform } from \"../platform-support.js\";\nimport { runSelfUpdateCommand } from \"../self-update.js\";\nimport { bindTerminationSignals } from \"../termination.js\";\nimport { runAutoUpdate } from \"../auto-update.js\";\nimport { latestRuntimeTemplate, scaffoldPlatformAgent } from \"@buddy/cli-core/init/scaffold\";\n\nclass TerminalIO implements CliIO {\n readonly canPrompt = Boolean(stdin.isTTY && stdout.isTTY);\n private readline: Interface | undefined;\n private activeQuestion: AbortController | undefined;\n private cancelled = false;\n\n write(message: string): void {\n stdout.write(`${message}\\n`);\n }\n\n writeError(message: string): void {\n stderr.write(`${message}\\n`);\n }\n\n async openMetaPreview(path: string): Promise<void> {\n try { await promisify(execFile)(\"open\", [path]); }\n catch { this.write(`\u8BF7\u6253\u5F00\u672C\u5730\u5934\u50CF\u9884\u89C8\u540E\u518D\u786E\u8BA4\uFF1A${path}`); }\n }\n\n async select<Value extends string>(\n question: string,\n choices: readonly Choice<Value>[],\n options: SelectOptions<Value> = {},\n ): Promise<Value> {\n while (true) {\n this.write(`\\n${question}`);\n choices.forEach((choice, index) => {\n this.write(` ${index + 1}. ${choice.label}`);\n if (choice.description) this.write(` ${choice.description}`);\n });\n\n const defaultIndex = options.defaultValue === undefined\n ? undefined\n : choices.findIndex((choice) => choice.value === options.defaultValue);\n const prompt = defaultIndex === undefined || defaultIndex < 0\n ? \"\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF1A\"\n : `\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF08\u9ED8\u8BA4\uFF1A${defaultIndex + 1}\uFF09\uFF1A`;\n const answer = (await this.question(prompt)).trim();\n if (!answer && defaultIndex !== undefined && defaultIndex >= 0) return choices[defaultIndex]!.value;\n const selected = Number(answer) - 1;\n const choice = choices[selected];\n if (choice) return choice.value;\n this.writeError(`\u8BF7\u8F93\u5165 1 \u5230 ${choices.length} \u4E4B\u95F4\u7684\u5E8F\u53F7\u3002`);\n }\n }\n\n async input(question: string, options: InputOptions = {}): Promise<string> {\n const defaultHint = options.defaultValue === undefined ? \"\" : `\uFF08\u9ED8\u8BA4\uFF1A${options.defaultValue}\uFF09`;\n const answer = (await this.question(`${question}${defaultHint}\uFF1A`)).trim();\n return answer || options.defaultValue || \"\";\n }\n\n close(): void {\n this.readline?.close();\n }\n\n private getReadline(): Interface {\n if (this.readline) return this.readline;\n this.readline = createInterface({ input: stdin, output: stdout });\n this.readline.on(\"SIGINT\", () => {\n this.cancelled = true;\n this.activeQuestion?.abort();\n });\n return this.readline;\n }\n\n private async question(prompt: string): Promise<string> {\n const controller = new AbortController();\n this.activeQuestion = controller;\n try {\n return await this.getReadline().question(prompt, { signal: controller.signal });\n } catch (cause) {\n if (this.cancelled) throw new PromptCancelledError();\n throw cause;\n } finally {\n if (this.activeQuestion === controller) this.activeQuestion = undefined;\n }\n }\n}\n\nconst terminal = new TerminalIO();\nconst lifecycle = new AbortController();\nconst abortFromSignal = (signal: NodeJS.Signals) => {\n if (!lifecycle.signal.aborted) lifecycle.abort(new Error(signal));\n};\nconst unbindTermination = bindTerminationSignals(lifecycle);\n// Terminal closure may break output while asynchronous process cleanup is running.\nconst onOutputError = (error: NodeJS.ErrnoException) => {\n if (error.code === \"EPIPE\" || error.code === \"EIO\") abortFromSignal(\"SIGHUP\");\n else throw error;\n};\nstdout.on(\"error\", onOutputError);\nstderr.on(\"error\", onOutputError);\n\ntry {\n assertSupportedDeveloperPlatform();\n const args = process.argv.slice(2);\n const require = createRequire(import.meta.url);\n const manifestPath = require.resolve(\"@my-life-buddies/cli/package.json\");\n const updateOptions = {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n };\n const maintenance = await runSelfUpdateCommand(args, terminal, updateOptions)\n ?? await runAutoUpdate(args, terminal, updateOptions);\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\n scaffoldPlatformAgent: (root, name, runtimeVersion) => scaffoldPlatformAgent(root, name, {\n resolveDependencies: template => latestRuntimeTemplate(template, {\n signal: lifecycle.signal, runtimeVersion, report: message => terminal.write(message),\n }),\n }),\n ...(command === \"dev\" ? { dev: host().devOptions() } : {}),\n // Resolve credentials only when a supported command actually needs them.\n get cloud() { return host().cloudOptions(); },\n preview: (previewArgs, io) => host().runPreview(previewArgs, io),\n });\n process.exitCode = result.exitCode;\n} catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n terminal.writeError(`buddy-cli: ${message}`);\n process.exitCode = 1;\n} finally {\n unbindTermination();\n terminal.close();\n}\n", "import { resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readBuddyProjectManifest } from \"@buddy/cli-core/config\";\nimport { createRuntimeLogForwarder } from \"./runtime-logs.js\";\n\nimport {\n CloudAuthenticator,\n BuddyDevError,\n checkRuntimeUpdate,\n type RuntimePackageOptions,\n DEFAULT_MLB_TEST_URL,\n HttpDeveloperPlatformClient,\n LoopbackBrowserLoginAdapter,\n MlbDevRegistrationClient,\n MockDeveloperPlatformClient,\n SystemCloudTokenStore,\n SystemBuddyTokenStore,\n createBuddyDevStarter,\n stopLocalDev,\n createPushPreflight,\n createPushSourceBundle,\n resolvePlatformUrl,\n resolveDeveloperWebUrl,\n openExternalUrl,\n requireBuddyAgentProjectRoot,\n type CliIO,\n type CredentialCommandRunner,\n type CliRunResult,\n type RunCloudCommandOptions,\n type RunDevCommandOptions,\n} from \"@buddy/cli-core\";\nimport {\n PreviewController,\n MlbSimulatorClient,\n createBuddyPreviewUrl,\n startPreviewControlServer,\n connectPreviewBridge,\n type PreviewBuddyDetails,\n type PreviewDevHandle,\n type PreviewDevStarter,\n} from \"@buddy/preview\";\n\nexport interface ParsedPreviewArguments {\n readonly directory: string;\n readonly appServer?: string;\n readonly port?: number;\n readonly help: boolean;\n readonly local: boolean;\n readonly noOpen?: boolean;\n readonly refreshToken?: boolean;\n readonly buddyId?: string;\n readonly developerWeb?: string;\n}\n\nexport const PREVIEW_COMMAND_HELP = `\u7528\u6CD5:\n 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]\n buddy-cli preview --local [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]\n\n\u8BF4\u660E:\n \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\n --buddy-id \u6821\u9A8C\u5F53\u524D\u5DE5\u7A0B\u8EAB\u4EFD\uFF1B\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u63D0\u4F9B\u642D\u5B50\u548C\u73AF\u5883\u5B8C\u6574\u53C2\u6570\u3002\n \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\n --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\u3002\n --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\n \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\n \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\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002\n MLB_GATEWAY_URL \u7EDF\u4E00\u9009\u62E9\u5E73\u53F0\uFF0C--app-server \u53EF\u8986\u76D6\u672C\u6B21\u547D\u4EE4\uFF1B\u540E\u53F0\u9ED8\u8BA4\u4F7F\u7528\u540C\u4E00\u5730\u5740\u7684 /developer/\u3002\n 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\n \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\n --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\n 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\n \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002`;\n\nfunction valueAfter(args: readonly string[], index: number, flag: string): string {\n const value = args[index + 1];\n if (value === undefined || !value.trim()) throw new Error(`${flag} \u7F3A\u5C11\u503C`);\n return value;\n}\n\nfunction setOnce(current: string | undefined, value: string, flag: string): string {\n if (current !== undefined) throw new Error(`${flag} \u4E0D\u80FD\u91CD\u590D`);\n return value;\n}\n\nexport function parsePreviewArguments(args: readonly string[]): ParsedPreviewArguments {\n let directory = \".\";\n let directorySet = false;\n let appServer: string | undefined;\n let port: number | undefined;\n let help = false;\n let local = false;\n let noOpen = false;\n let refreshToken = false;\n let buddyId: string | undefined;\n let developerWeb: string | undefined;\n for (let index = 0; index < args.length; index += 1) {\n const flag = args[index];\n if (flag === \"--refresh-token\") {\n if (refreshToken) throw new Error(\"--refresh-token \u4E0D\u80FD\u91CD\u590D\");\n refreshToken = true;\n continue;\n }\n if (flag === \"--help\" || flag === \"-h\") {\n if (args.length !== 1) throw new Error(\"--help \u4E0D\u80FD\u548C\u5176\u4ED6 preview \u53C2\u6570\u4E00\u8D77\u4F7F\u7528\");\n help = true;\n continue;\n }\n if (flag === \"--local\") { if (local) throw new Error(\"--local \u4E0D\u80FD\u91CD\u590D\"); local = true; continue; }\n if (flag === \"--no-open\") { if (noOpen) throw new Error(\"--no-open \u4E0D\u80FD\u91CD\u590D\"); noOpen = true; continue; }\n const value = valueAfter(args, index, flag ?? \"\u53C2\u6570\");\n index += 1;\n switch (flag) {\n case \"--buddy-id\":\n buddyId = setOnce(buddyId, value, flag);\n if (!/^[A-Za-z0-9_-]{1,128}$/u.test(buddyId)) throw new Error(\"--buddy-id \u65E0\u6548\");\n break;\n case \"--developer-web\":\n developerWeb = setOnce(developerWeb, value, flag);\n break;\n case \"--directory\":\n if (directorySet) throw new Error(\"--directory \u4E0D\u80FD\u91CD\u590D\");\n directory = value;\n directorySet = true;\n break;\n case \"--port\":\n if (port !== undefined || !/^\\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\");\n port = Number(value);\n break;\n case \"--app-server\":\n appServer = setOnce(appServer, value, flag);\n break;\n default:\n throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? \"\"}`);\n }\n }\n if (port !== undefined && !local) throw new Error(\"--port \u4EC5\u7528\u4E8E --local \u5907\u7528\u9884\u89C8\");\n if (local && developerWeb) throw new Error(\"--local \u4E0D\u9700\u8981 --developer-web\");\n if (local && noOpen) throw new Error(\"--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF0C\u4E0D\u80FD\u548C --local \u4E00\u8D77\u4F7F\u7528\");\n return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...(port === undefined ? {} : { port }), ...(refreshToken ? { refreshToken: true } : {}), ...(noOpen ? { noOpen: true } : {}) });\n}\n\nexport interface BuddyPlatformHostOptions {\n readonly runtimeUpdate?: RuntimePackageOptions;\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n readonly signal?: AbortSignal;\n readonly openUrl?: (url: URL) => Promise<void>;\n readonly credentialCommandRunner?: CredentialCommandRunner;\n}\n\nfunction waitForAbort(signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolveWait) => {\n signal.addEventListener(\"abort\", () => resolveWait(), { once: true });\n });\n}\n\nfunction previewHandle(handle: Awaited<ReturnType<ReturnType<typeof createBuddyDevStarter>[\"start\"]>>): PreviewDevHandle {\n return Object.freeze({\n closed: handle.completion.then((completion) => {\n if (completion.state === \"failed\") throw completion.error ?? new Error(\"DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\");\n }),\n close: () => handle.stop(),\n });\n}\n\nexport class BuddyPlatformHost {\n readonly #runtimeUpdate: RuntimePackageOptions | undefined;\n readonly #env: Readonly<NodeJS.ProcessEnv>;\n readonly #signal: AbortSignal | undefined;\n readonly #openUrl: (url: URL) => Promise<void>;\n readonly #sessions = new Map<string, CloudAuthenticator>();\n readonly #credentialCommandRunner: CredentialCommandRunner | undefined;\n readonly #mockClient = new MockDeveloperPlatformClient();\n\n constructor(options: BuddyPlatformHostOptions = {}) {\n this.#runtimeUpdate = options.runtimeUpdate;\n this.#env = options.env ?? process.env;\n this.#signal = options.signal;\n this.#openUrl = options.openUrl ?? openExternalUrl;\n this.#credentialCommandRunner = options.credentialCommandRunner;\n }\n\n cloudOptions(): Omit<RunCloudCommandOptions, \"cwd\"> {\n const preparePush: NonNullable<RunCloudCommandOptions[\"preparePush\"]> = async (\n projectRoot,\n _config,\n expectedRuntimeVersion,\n ) => {\n const plan = await createPushPreflight({ projectRoot, expectedRuntimeVersion });\n return createPushSourceBundle(plan);\n };\n if (this.#env.BUDDY_CLI_MOCK_CLOUD === \"1\") {\n const mockToken = {\n accessToken: \"local-mock-access-token\",\n subject: \"account_local_mock\",\n expiresAt: Date.now() + 60 * 60_000,\n };\n return {\n mode: \"local-mock\",\n signal: this.#signal,\n session: {\n async token() { return mockToken; },\n async currentToken() { return mockToken; },\n async clear() {},\n },\n client: this.#mockClient,\n preparePush,\n };\n }\n const baseUrl = this.#configuredServer();\n const session = this.#session(baseUrl);\n return {\n mode: \"cloud\",\n session,\n signal: this.#signal,\n client: new HttpDeveloperPlatformClient({\n baseUrl,\n token: async () => (await session.token({ signal: this.#signal })).accessToken,\n }),\n runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env, platformUrl: baseUrl },\n preparePush,\n };\n }\n\n devOptions(): Omit<RunDevCommandOptions, \"cwd\"> {\n return {\n signal: this.#signal,\n env: this.#env,\n authorize: async ({ appServerUrl: baseUrl }) => {\n await this.#session(baseUrl).token({ signal: this.#signal });\n },\n createRegistrationClient: async ({ appServerUrl: baseUrl, refreshToken }) => {\n const token = await this.#session(baseUrl).token({ signal: this.#signal });\n return new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n },\n };\n }\n\n async runPreview(args: readonly string[], io: CliIO): Promise<CliRunResult> {\n const parsed = parsePreviewArguments(args);\n if (parsed.help) {\n io.write(PREVIEW_COMMAND_HELP);\n return { exitCode: 0, route: \"preview\" };\n }\n\n const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));\n const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer, development: true });\n const manifest = await readBuddyProjectManifest(projectRoot);\n 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`);\n const webUrl = resolveDeveloperWebUrl(baseUrl, parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL);\n const signal = this.#signal ?? new AbortController().signal;\n await checkRuntimeUpdate(projectRoot, message => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env, platformUrl: baseUrl });\n const session = this.#session(baseUrl, webUrl);\n await session.token({ signal });\n const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);\n const controller = new PreviewController({\n projectRoot,\n devStarter: starter,\n readBuddyDetails: async (buddyId) => {\n const token = await this.#session(baseUrl).token({ signal });\n return new MlbSimulatorClient({\n baseUrl,\n buddyId: `${buddyId}-dev`,\n auth: { developerAccessToken: token.accessToken },\n }).details({ signal });\n },\n });\n const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });\n let bridge: Awaited<ReturnType<typeof connectPreviewBridge>> | undefined;\n try {\n const pageUrl = new URL(webUrl);\n pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;\n if (!parsed.local) bridge = await connectPreviewBridge({ webUrl, platformOrigin: baseUrl.origin, buddyId: manifest.buddyId,\n controller, localServer: serverHandle, token: async () => (await session.token({ signal })).accessToken,\n signal, onStatus: message => io.write(message),\n stopLocalDev: () => stopLocalDev({ gatewayUrl: baseUrl, devAgentId: manifest.buddyId, projectRoot }),\n });\n 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}`);\n else {\n await this.#openUrl(parsed.local ? serverHandle.bootstrapUrl : pageUrl);\n 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}`);\n }\n 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`);\n 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\");\n if (bridge?.reused) {\n 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\");\n return { exitCode: 0, route: \"preview\" };\n }\n io.write(\"\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\u3002\");\n if (signal.aborted) return { exitCode: 130, route: \"preview\" };\n await (bridge ? bridge.completion : waitForAbort(signal));\n return { exitCode: 130, route: \"preview\" };\n } finally {\n await bridge?.close().catch(() => undefined);\n await controller.close().catch(() => undefined);\n await serverHandle.close();\n }\n }\n\n #previewStarter(baseUrl: URL, buddyId: string, session: CloudAuthenticator, refreshToken: boolean): PreviewDevStarter {\n const starter = createBuddyDevStarter();\n return Object.freeze({\n start: async ({ projectRoot, signal, onLog, onLifecycle }: Parameters<PreviewDevStarter[\"start\"]>[0]) => {\n if ((await readBuddyProjectManifest(projectRoot)).buddyId !== buddyId) throw new Error(\"\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5\");\n const token = await session.token({ signal });\n const secrets = new Set([token.accessToken]);\n const logs = createRuntimeLogForwarder(event => onLog?.(event), secrets);\n const registrationClient = new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n let reloadError: { code: string; message: string } | undefined;\n const handle = await starter.start({ projectRoot, signal, runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env, platformUrl: baseUrl },\n onError(error) {\n logs.flush();\n let message = error.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n reloadError = { code: error.code, message: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) };\n },\n onStateChange(phase) {\n if (phase === \"reloading\") reloadError = undefined;\n if (phase === \"reloading\" || phase === \"reload_failed\" || phase === \"ready\") onLifecycle?.({ phase, ...(phase === \"reload_failed\" && reloadError ? { error: reloadError } : {}) });\n },\n registrationClient: {\n async register(request, options) {\n const registered = await registrationClient.register(request, options);\n secrets.add(registered.agentToken);\n return registered;\n },\n listOnline: options => registrationClient.listOnline(options),\n },\n onLog: logs.write,\n }).catch(cause => {\n logs.flush();\n if (cause instanceof BuddyDevError && cause.code.startsWith(\"DEV_RUNTIME_\")) {\n let message = cause.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n Object.assign(cause, { publicMessage: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) });\n }\n throw cause;\n });\n const preview = previewHandle(handle);\n void preview.closed.then(() => logs.flush(), () => logs.flush());\n const devBuddyId = `${handle.devAgentId}-dev`;\n const simulator = new MlbSimulatorClient({\n baseUrl,\n buddyId: devBuddyId,\n auth: { developerAccessToken: token.accessToken },\n });\n let buddy: PreviewBuddyDetails;\n let previewUrl: string;\n try {\n buddy = await simulator.details({ signal });\n previewUrl = createBuddyPreviewUrl(devBuddyId);\n signal.throwIfAborted();\n } catch (cause) {\n // Do not leave an Agent running after a failed/unauthorized profile read.\n await handle.stop();\n throw cause;\n }\n return Object.freeze({\n handle: preview,\n ready: Object.freeze({\n agentId: devBuddyId,\n buddy,\n devicePairing: Object.freeze({ url: previewUrl }),\n simulatorUrl: baseUrl.href,\n }),\n simulator,\n });\n },\n });\n }\n\n #buddyTokenStore(baseUrl: URL, subject: string, buddyId: string): SystemBuddyTokenStore {\n return new SystemBuddyTokenStore({ platformUrl: baseUrl, subject, buddyId, commandRunner: this.#credentialCommandRunner });\n }\n\n #configuredServer(): URL {\n return resolvePlatformUrl({ env: this.#env });\n }\n\n #session(baseUrl: URL, webUrl?: URL): CloudAuthenticator {\n const developerWebUrl = resolveDeveloperWebUrl(baseUrl, webUrl ?? this.#env.BUDDY_DEVELOPER_WEB_URL);\n const key = baseUrl.origin;\n let session = this.#sessions.get(key);\n if (!session) {\n session = new CloudAuthenticator(\n new LoopbackBrowserLoginAdapter({\n platformUrl: baseUrl,\n developerWebUrl,\n openBrowser: this.#openUrl,\n }),\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(key).digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\n );\n this.#sessions.set(key, session);\n }\n return session;\n }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { DevLogEvent } from \"@buddy/cli-core\";\n\nconst MAX_LOG_LINE = 8_192;\n\n/** Assemble process chunks before masking credentials, including tokens split across chunks. */\nexport function createRuntimeLogForwarder(\n onLog: (event: DevLogEvent) => void,\n secrets: ReadonlySet<string>,\n) {\n const streams = new Map<DevLogEvent[\"source\"], { text: string; truncated: boolean }>();\n const emit = (source: DevLogEvent[\"source\"]) => {\n const pending = streams.get(source);\n if (!pending) return;\n streams.delete(source);\n let text = stripVTControlCharacters(pending.text);\n for (const secret of secrets) if (secret) text = text.split(secret).join(\"[REDACTED]\");\n if (pending.truncated) {\n // ANSI removal can move a credential cut at the raw buffer boundary into\n // the visible prefix. Mask its trailing prefix too, before display truncation.\n for (const secret of secrets) {\n for (let size = Math.min(secret.length - 1, text.length); size > 0; size--) {\n if (text.endsWith(secret.slice(0, size))) {\n text = text.slice(0, -size) + \"[REDACTED]\";\n break;\n }\n }\n }\n }\n text = text.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f]/gu, \"\").trimEnd();\n if (!text) return;\n text = text.slice(0, MAX_LOG_LINE) + (pending.truncated ? \" \u2026[truncated]\" : \"\");\n try { onLog({ source, text }); } catch { /* Diagnostics must not break supervision. */ }\n };\n return {\n write({ source, text }: DevLogEvent) {\n const limit = MAX_LOG_LINE + Math.max(0, ...[...secrets].map(secret => secret.length));\n for (const part of text.split(/(?<=\\n)/u)) {\n const pending = streams.get(source) ?? { text: \"\", truncated: false };\n const available = Math.max(0, limit - pending.text.length);\n pending.text += part.slice(0, available);\n pending.truncated ||= part.length > available;\n streams.set(source, pending);\n if (part.endsWith(\"\\n\")) emit(source);\n }\n },\n flush() { for (const source of streams.keys()) emit(source); },\n };\n}\n", "export class UnsupportedDeveloperPlatformError extends Error {\n constructor(readonly platform: NodeJS.Platform) {\n super(`buddy-cli V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);\n this.name = \"UnsupportedDeveloperPlatformError\";\n }\n}\n\nexport function assertSupportedDeveloperPlatform(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform !== \"darwin\") throw new UnsupportedDeveloperPlatformError(platform);\n}\n", "import { execFile } from \"node:child_process\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { defaultUpdateCache, globalUpdateLock, withUpdateLock } from \"./update-lock.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY}`;\nconst execute = promisify(execFile);\nconst HELP = `\u7528\u6CD5:\n buddy-cli --version [--json]\n buddy-cli update --check [--json]\n buddy-cli update [--json]\n\n--version \u67E5\u770B\u5F53\u524D\u8FD0\u884C\u7684 CLI \u7248\u672C\uFF08\u65E0\u9700\u8054\u7F51\uFF09\n--check \u68C0\u67E5\u516C\u5171 npm \u7684 latest \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5\n--json \u8F93\u51FA JSON\uFF0C\u4F9B Coding Agent \u6216\u811A\u672C\u8BFB\u53D6\n\n\u65E0\u9700\u767B\u5F55\u642D\u642D\u8D26\u53F7\uFF0C\u4E5F\u65E0\u9700\u8FDB\u5165\u642D\u5B50\u5DE5\u7A0B\u3002\n\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\n--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\nupdate \u7528\u4E8E\u5355\u72EC\u66F4\u65B0\u5F53\u524D npm \u5168\u5C40\u5B89\u88C5\u7684 CLI\uFF0C\u4E0D\u4FEE\u6539\u642D\u5B50\u5DE5\u7A0B\u7684 Runtime \u4F9D\u8D56\u3002\n\u5DF2\u7ECF\u662F\u6700\u65B0\u7248\u6216\u5F53\u524D\u7248\u672C\u66F4\u9AD8\u65F6\u4E0D\u5B89\u88C5\u3001\u4E0D\u964D\u7EA7\u3002\n\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\n\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\n\u65E7\u7248 CLI \u5C1A\u65E0 update \u547D\u4EE4\u65F6\uFF0C\u8FD0\u884C\uFF1A\\n ${MANUAL_UPDATE}`;\n\nexport interface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\nexport interface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n cacheDirectory?: string;\n fetch?: typeof globalThis.fetch;\n runNpm?: (args: string[], options: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n}\n\n// SemVer precedence ignores build metadata; numeric identifiers compare numerically.\nfunction parseVersion(version: unknown): string[] {\n const numeric = \"(?:0|[1-9][0-9]*)\";\n const identifier = `(?:${numeric}|[0-9]*[A-Za-z-][0-9A-Za-z-]*)`;\n const pattern = new RegExp(`^(${numeric})\\\\.(${numeric})\\\\.(${numeric})(?:-(${identifier}(?:\\\\.${identifier})*))?(?:\\\\+[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?$`, \"u\");\n const match = typeof version === \"string\" && version.length <= 256 ? pattern.exec(version) : null;\n if (!match || match[0] !== version) throw new Error(\"\u7248\u672C\u4FE1\u606F\u4E0D\u662F\u6709\u6548\u7684 SemVer \u7248\u672C\u53F7\u3002\");\n return [match[1]!, match[2]!, match[3]!, ...(match[4]?.split(\".\") ?? [])];\n}\n\nexport function compareVersions(left: string, right: string): number {\n const a = parseVersion(left);\n const b = parseVersion(right);\n for (let i = 0; i < 3; i++) {\n if (BigInt(a[i]!) !== BigInt(b[i]!)) return BigInt(a[i]!) > BigInt(b[i]!) ? 1 : -1;\n }\n if (a.length === 3 || b.length === 3) return a.length === b.length ? 0 : a.length === 3 ? 1 : -1;\n for (let i = 3; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (x === y) continue;\n if (x === undefined || y === undefined) return x === undefined ? -1 : 1;\n const xn = /^[0-9]+$/u.test(x);\n const yn = /^[0-9]+$/u.test(y);\n if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;\n if (xn !== yn) return xn ? -1 : 1;\n return x > y ? 1 : -1;\n }\n return 0;\n}\n\nexport async function latestVersion(options: UpdateOptions): Promise<string> {\n const timeout = AbortSignal.timeout(10_000);\n const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;\n try {\n const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(PACKAGE)}/latest`, {\n signal, headers: { Accept: \"application/json\" }, redirect: \"error\",\n });\n if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);\n const metadata = await response.json() as { name?: unknown; version?: unknown } | null;\n if (metadata?.name !== PACKAGE) throw new Error(\"npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D\");\n parseVersion(metadata.version);\n return metadata.version as string;\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002\");\n if (timeout.aborted) throw new Error(\"\u68C0\u67E5\u66F4\u65B0\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002\");\n throw new Error(`\u65E0\u6CD5\u68C0\u67E5 npm \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`);\n }\n}\n\nexport async function installUpdate(version: string, options: UpdateOptions): Promise<void> {\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n // The CLI supports macOS, where global packages live under prefix/lib/node_modules.\n const installedRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let sameInstallation = false;\n try {\n sameInstallation = !(await lstat(installedRoot)).isSymbolicLink()\n && await realpath(installedRoot) === await realpath(options.packageRoot);\n } catch { /* Missing global package means this CLI came from another installation. */ }\n if (!sameInstallation) {\n throw new Error(\"\u5F53\u524D CLI \u4E0D\u662F\u8FD9\u4E2A npm \u73AF\u5883\u7684\u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u66F4\u65B0\u3002\u8BF7\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\uFF1B\u82E5\u4F7F\u7528 nvm\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5B89\u88C5\u8BE5 CLI \u7684 Node.js \u73AF\u5883\u3002\");\n }\n await withUpdateLock(globalUpdateLock(options.cacheDirectory ?? defaultUpdateCache(), prefix), options.signal, async () => {\n const current = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (current.name === PACKAGE && current.version === version) return;\n 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\");\n try {\n await runNpm([\n \"install\", \"--global\", `${PACKAGE}@${version}`, \"--prefix\", prefix,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\",\n ], { ...settings, timeout: 180_000 });\n } catch (cause) {\n 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\");\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u548C\u5168\u5C40\u76EE\u5F55\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n const installed = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (installed.name !== PACKAGE || installed.version !== version) {\n 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}`);\n }\n });\n}\n\n/** Public CLI maintenance runs before any project or platform credential handling. */\nexport async function runSelfUpdateCommand(\n args: readonly string[],\n io: Pick<CliIO, \"write\" | \"writeError\">,\n options: UpdateOptions,\n): Promise<CliRunResult | undefined> {\n const versionOnly = args[0] === \"--version\" || args[0] === \"-v\";\n if (!versionOnly && args[0] !== \"update\") return undefined;\n const json = args.includes(\"--json\");\n const fail = (message: string, exitCode: number) => {\n if (json) io.write(JSON.stringify({ package: PACKAGE, currentVersion: options.version, error: message }));\n else io.writeError(`buddy-cli: ${message}`);\n return { exitCode };\n };\n const flags = args.slice(1);\n const allowed = versionOnly ? [\"--json\", \"--help\", \"-h\"] : [\"--check\", \"--json\", \"--help\", \"-h\"];\n if (flags.some(flag => !allowed.includes(flag)) || new Set(flags).size !== flags.length) {\n return fail(\"\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli update --help \u67E5\u770B\u7528\u6CD5\u3002\", 2);\n }\n if (flags.includes(\"--help\") || flags.includes(\"-h\")) {\n if (json) io.write(JSON.stringify({ help: HELP }));\n else io.write(HELP);\n return { exitCode: 0 };\n }\n try {\n parseVersion(options.version);\n if (versionOnly) {\n io.write(json ? JSON.stringify({ package: PACKAGE, version: options.version }) : options.version);\n return { exitCode: 0 };\n }\n const latest = await latestVersion(options);\n const comparison = compareVersions(latest, options.version);\n const check = flags.includes(\"--check\");\n const status = comparison > 0 ? \"update_available\" : comparison < 0 ? \"ahead\" : \"up_to_date\";\n if (!check && comparison > 0) {\n if (!json) io.write(`\u6B63\u5728\u66F4\u65B0 CLI\uFF1A${options.version} \u2192 ${latest}\u2026`);\n await installUpdate(latest, options);\n }\n const updated = !check && comparison > 0;\n if (json) {\n io.write(JSON.stringify({\n package: PACKAGE, currentVersion: options.version, latestVersion: latest,\n updateAvailable: comparison > 0 && !updated, status: updated ? \"updated\" : status,\n ...(updated ? { installedVersion: latest } : {}),\n }));\n } else if (updated) io.write(`CLI \u5DF2\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002`);\n 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`);\n else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm latest ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);\n else io.write(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\uFF1A${options.version}\u3002`);\n return { exitCode: 0 };\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause), 1);\n }\n}\n", "import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nexport const defaultUpdateCache = () => join(homedir(), \".cache\", \"buddy-cli\", \"updates\");\nexport const globalUpdateLock = (cache: string, prefix: string) => join(cache, \"locks\", createHash(\"sha256\").update(prefix).digest(\"hex\"));\n\n/** Never steal an installation lock on a timer: npm may still be writing files. */\nexport async function withUpdateLock<T>(path: string, signal: AbortSignal | undefined, action: () => Promise<T>): Promise<T> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const deadline = Date.now() + 200_000;\n for (;;) {\n signal?.throwIfAborted();\n try { await mkdir(path, { mode: 0o700 }); break; }\n catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"EEXIST\") throw cause;\n if (Date.now() >= deadline) throw new Error(`\u7B49\u5F85\u5176\u4ED6 CLI \u66F4\u65B0\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4\u66F4\u65B0\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u518D\u6E05\u7406\u9501\u76EE\u5F55\u5E76\u91CD\u8BD5\uFF1A${path}`);\n await delay(100, undefined, { signal });\n }\n }\n try {\n await writeFile(`${path}/owner.json`, JSON.stringify({ pid: process.pid, startedAt: Date.now() }), { mode: 0o600 });\n signal?.throwIfAborted();\n return await action();\n } finally { await rm(path, { recursive: true, force: true }); }\n}\n", "/** Keep the CLI alive long enough to stop detached Runtime children on terminal closure. */\nexport function bindTerminationSignals(controller: AbortController): () => void {\n const handlers = new Map<NodeJS.Signals, () => void>();\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n const handler = () => { if (!controller.signal.aborted) controller.abort(new Error(signal)); };\n handlers.set(signal, handler);\n process.on(signal, handler);\n }\n return () => { for (const [signal, handler] of handlers) process.off(signal, handler); };\n}\n", "import { execFile, spawn } from \"node:child_process\";\nimport { lstat, mkdir, mkdtemp, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { constants, homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { compareVersions, installUpdate, latestVersion, type UpdateOptions } from \"./self-update.js\";\nimport { defaultUpdateCache, withUpdateLock } from \"./update-lock.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst execute = promisify(execFile);\nexport const HANDOFF_ENV = \"BUDDY_CLI_UPDATE_HANDOFF\";\n\ninterface ChildOptions { cwd: string; env: NodeJS.ProcessEnv; signal?: AbortSignal }\nexport interface AutoUpdateOptions extends UpdateOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n runCli?: (entry: string, args: readonly string[], options: ChildOptions) => Promise<CliRunResult>;\n}\n\nasync function installedVersion(root: string): Promise<string | undefined> {\n try {\n const pkg = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n return pkg.name === PACKAGE && typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch { return undefined; }\n}\n\nasync function checkedEntry(root: string, version: string): Promise<string> {\n if (await installedVersion(root) !== version) throw new Error(`CLI \u5B89\u88C5\u7ED3\u679C\u4E0E\u672C\u6B21\u8981\u6C42\u7684 ${version} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u8BD5\u3002`);\n const entry = join(root, \"dist\", \"bin\", \"buddy.js\");\n if (!(await lstat(entry)).isFile()) throw new Error(\"\u65B0\u7248 CLI \u7F3A\u5C11\u6709\u6548\u7684\u6267\u884C\u5165\u53E3\u3002\");\n return entry;\n}\n\nasync function prepareLatest(version: string, options: AutoUpdateOptions): Promise<string> {\n const cache = options.cacheDirectory ?? defaultUpdateCache();\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n const globalRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let isGlobal = false;\n try {\n isGlobal = !(await lstat(globalRoot)).isSymbolicLink()\n && await realpath(globalRoot) === await realpath(options.packageRoot);\n } catch { /* Local, source and npx installations use an isolated release cache. */ }\n if (isGlobal) {\n await installUpdate(version, options);\n return checkedEntry(globalRoot, version);\n }\n const destination = join(cache, \"releases\", version);\n return withUpdateLock(join(cache, \"locks\", `release-${version}`), options.signal, async () => {\n const root = join(destination, \"node_modules\", PACKAGE);\n try { return await checkedEntry(root, version); } catch { /* Repair incomplete cached installs. */ }\n await mkdir(join(cache, \"releases\"), { recursive: true, mode: 0o700 });\n const temporary = await mkdtemp(join(cache, \"releases\", \".install-\"));\n try {\n await writeFile(join(temporary, \"package.json\"), JSON.stringify({ private: true }));\n try {\n await runNpm([\"install\", \"--prefix\", temporary, \"--save-exact\", `${PACKAGE}@${version}`,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\"],\n { cwd: temporary, signal: options.signal, timeout: 180_000 });\n } catch (cause) {\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`\u65B0\u7248 CLI \u7F13\u5B58\u5B89\u88C5\u5931\u8D25\uFF08${code}\uFF09\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u3001Node.js \u7248\u672C\u548C\u76EE\u5F55\u6743\u9650\u540E\u91CD\u8BD5\u3002`);\n }\n await checkedEntry(join(temporary, \"node_modules\", PACKAGE), version);\n options.signal?.throwIfAborted();\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return checkedEntry(root, version);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n });\n}\n\n/** Direct argv, inherited terminal and no shell; parent waits and forwards cancellation. */\nexport async function runUpdatedCli(entry: string, args: readonly string[], options: ChildOptions): Promise<CliRunResult> {\n options.signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...args], { cwd: options.cwd, env: options.env, stdio: \"inherit\" });\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n const abort = () => {\n const reason = options.signal?.reason?.message;\n const signal = reason === \"SIGINT\" ? \"SIGINT\" : reason === \"SIGHUP\" ? \"SIGHUP\" : \"SIGTERM\";\n child.kill(signal);\n killTimer ??= setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n killTimer.unref();\n };\n const cleanup = () => { options.signal?.removeEventListener(\"abort\", abort); clearTimeout(killTimer); };\n child.once(\"error\", error => { cleanup(); reject(error); });\n child.once(\"exit\", (code, signal) => {\n cleanup();\n resolve({ exitCode: code ?? 128 + (signal ? constants.signals[signal] : 1) });\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** Runs before any project, credentials, platform host or business side effects. */\nexport async function runAutoUpdate(args: readonly string[], io: Pick<CliIO, \"write\" | \"writeError\">, options: AutoUpdateOptions): Promise<CliRunResult | undefined> {\n if (args[0] === \"dev\" && args[1] === \"stop\") return undefined; // Emergency local cleanup must work offline.\n if (args[0] === \"help\" || args[0] === \"update\" || args[0] === \"--version\" || args[0] === \"-v\"\n || args.includes(\"--help\") || args.includes(\"-h\")) return undefined;\n try {\n const env = { ...(options.env ?? process.env) };\n const handoff = env[HANDOFF_ENV];\n // Consume the marker; commands started later by an Agent must check again.\n if (handoff !== undefined) {\n delete env[HANDOFF_ENV];\n if (!options.env) delete process.env[HANDOFF_ENV];\n const expected = JSON.parse(handoff);\n const entry = await realpath(join(options.packageRoot, \"dist\", \"bin\", \"buddy.js\"));\n if (expected.parent !== process.ppid || expected.version !== options.version || expected.entry !== entry\n || JSON.stringify(expected.args) !== JSON.stringify(args)) throw new Error(\"CLI \u81EA\u52A8\u66F4\u65B0\u63A5\u7EED\u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\u3002\");\n return undefined;\n }\n const latest = await latestVersion(options);\n if (compareVersions(latest, options.version) <= 0) return undefined;\n io.writeError(`CLI \u81EA\u52A8\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002\u5B8C\u6210\u540E\u7EE7\u7EED\u5F53\u524D\u547D\u4EE4\uFF0C\u8BF7\u52FF\u91CD\u590D\u6267\u884C\u3002`);\n const entry = await realpath(await prepareLatest(latest, options));\n options.signal?.throwIfAborted();\n env[HANDOFF_ENV] = JSON.stringify({ parent: process.pid, version: latest, entry, args });\n return await (options.runCli ?? runUpdatedCli)(entry, args, { cwd: options.cwd ?? process.cwd(), env, signal: options.signal });\n } catch (cause) {\n const error = options.signal?.aborted ? \"CLI \u81EA\u52A8\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\u3002\"\n : `CLI \u81EA\u68C0\u6216\u66F4\u65B0\u5931\u8D25\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\uFF1A${cause instanceof Error ? cause.message : String(cause)}`;\n if (args.includes(\"--json\")) io.write(JSON.stringify({ code: \"CLI_UPDATE_FAILED\", error }));\n else io.writeError(error);\n return { exitCode: 1 };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["execFile", "promisify", "dirname", "homedir", "join", "createHash", "settings", "homedir", "stdout", "join", "execFile", "lstat", "mkdir", "readFile", "realpath", "rm", "writeFile", "homedir", "isAbsolute", "join", "promisify", "PACKAGE", "REGISTRY", "execute", "promisify", "execFile", "readFile", "join", "lstat", "settings", "homedir", "stdout", "isAbsolute", "realpath", "mkdir", "writeFile", "rm", "resolve", "entry", "promisify", "execFile", "choice", "require", "dirname"]
|
|
7
7
|
}
|