@heybox/hb-sdk 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +106 -18
  2. package/dist/cli-chunks/{create-BV4h2BTs.cjs → create-DpyZCNdo.cjs} +1 -1
  3. package/dist/cli-chunks/{dev-DgX88vaK.cjs → dev-DWIpgJnn.cjs} +1 -1
  4. package/dist/cli-chunks/{doctor-BIZoQ6go.cjs → doctor-DBotVUQI.cjs} +1 -1
  5. package/dist/cli-chunks/{index-ovy_xoLn.cjs → index-BYMTp2I6.cjs} +171 -43
  6. package/dist/cli-chunks/{index-DQAFCtK1.cjs → index-DRsyeAcg.cjs} +3 -3
  7. package/dist/cli-chunks/{login-CoZhlwxt.cjs → login-DIgcT1gv.cjs} +2 -2
  8. package/dist/cli-chunks/{deploy-Bz0-WpHy.cjs → remote-DjaOc1VS.cjs} +797 -21
  9. package/dist/cli-chunks/{session-BQs0wf65.cjs → session-BAgaqpNL.cjs} +1 -1
  10. package/dist/cli.cjs +1 -1
  11. package/dist/devtools/mock-host/main.js +842 -428
  12. package/dist/index.cjs.js +98 -0
  13. package/dist/index.esm.js +96 -1
  14. package/dist/miniapp-publish.cjs.js +26 -0
  15. package/dist/miniapp-publish.esm.js +14 -1
  16. package/dist/protocol.cjs.js +70 -0
  17. package/dist/protocol.esm.js +64 -1
  18. package/dist/templates/vue3-vite-ts/README.md.ejs +1 -1
  19. package/dist/templates/vue3-vite-ts/package.json.ejs +1 -1
  20. package/package.json +1 -1
  21. package/skill/SKILL.md +23 -18
  22. package/skill/references/api-protocol.md +34 -2
  23. package/skill/references/api-root.md +79 -4
  24. package/skill/references/cli.md +86 -349
  25. package/skill/references/llms-index.md +2 -2
  26. package/skill/references/safety-boundaries.md +1 -1
  27. package/skill/scripts/sync-references.mjs +48 -4
  28. package/skill/skill.json +4 -4
  29. package/types/core/sdk.d.ts +9 -0
  30. package/types/core/singleton.d.ts +9 -0
  31. package/types/index.d.ts +7 -1
  32. package/types/miniapp-publish/index.d.ts +13 -0
  33. package/types/modules/device/index.d.ts +34 -0
  34. package/types/modules/navigation/index.d.ts +24 -0
  35. package/types/modules/ui/index.d.ts +42 -0
  36. package/types/protocol/capabilities.d.ts +81 -2
  37. package/types/protocol.d.ts +5 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @heybox/hb-sdk
2
2
 
3
- 黑盒外部小程序前端 SDK。业务页面运行在黑盒父容器创建的 iframe 沙盒中,通过这个 SDK 等待容器 ready、获取登录态、唤起登录、分享、读取窗口信息、使用隔离 storage,以及发起受控网络请求。
3
+ 黑盒外部小程序前端 SDK。业务页面运行在黑盒父容器创建的 iframe 沙盒中,通过这个 SDK 等待容器 ready、获取登录态、唤起登录、分享、展示基础 UI、使用设备能力、控制容器导航、读取窗口信息、使用隔离 storage,以及发起受控网络请求。
4
4
 
5
5
  ## 快速开始
6
6
 
@@ -110,6 +110,53 @@ await share.screenshot({
110
110
  });
111
111
  ```
112
112
 
113
+ ### 基础 UI
114
+
115
+ ```ts
116
+ import { ui } from '@heybox/hb-sdk';
117
+
118
+ await ui.showToast({
119
+ message: '保存成功',
120
+ status: 'success',
121
+ });
122
+
123
+ await ui.showLoading({
124
+ dismissible: true,
125
+ });
126
+
127
+ await ui.hideLoading();
128
+ ```
129
+
130
+ `showToast()` 的 `message` 会 trim 后发送给宿主,不能为空,最长 120 个字符;`status` 只支持 `success` 和 `error`,不传时展示普通文本 toast。loading 是全局单例,多次 `showLoading()` 会覆盖当前配置,`hideLoading()` 在未展示时也会成功。
131
+
132
+ ### 设备能力
133
+
134
+ ```ts
135
+ import { device } from '@heybox/hb-sdk';
136
+
137
+ await device.vibrate({
138
+ intensity: 'light',
139
+ delay: 0,
140
+ });
141
+
142
+ await device.setClipboard({
143
+ text: 'hello',
144
+ });
145
+ ```
146
+
147
+ `vibrate()` 的 `intensity` 默认为 `light`,还支持 `medium` 和 `heavy`;`delay` 默认为 `0`,必须是 `0..5000` 的整数毫秒。`setClipboard()` 第一版只支持文本写入,`text` 必须是非空字符串,最长 10000 个字符,不会自动 trim 写入内容,也不提供读取或清空剪贴板能力。
148
+
149
+ ### 导航控制
150
+
151
+ ```ts
152
+ import { navigation } from '@heybox/hb-sdk';
153
+
154
+ await navigation.reload();
155
+ await navigation.close();
156
+ ```
157
+
158
+ `navigation.close()` 请求宿主关闭当前小程序容器,`navigation.reload()` 请求宿主重载当前小程序页面/容器。调用后 JS 上下文可能被宿主销毁,不保证后续代码继续执行;这两个能力不接受 `reason`、`force`、`confirm` 或 `fallbackUrl` 等扩展参数。
159
+
113
160
  ### 窗口信息
114
161
 
115
162
  ```ts
@@ -233,17 +280,34 @@ try {
233
280
  | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
234
281
  | `hb-sdk create <project-name>` | 创建外部小程序模板。 |
235
282
  | `hb-sdk dev [--runtime-url <url>]` | 启动当前项目的 Vite dev server 和浏览器 mock 宿主环境,并默认打开调试页;`--runtime-url` 会传给真实客户端 dev shell。 |
236
- | `hb-sdk deploy --release-note <text> [--skip-build] [--auto-publish]` | 构建、上传并提交当前小程序版本审核。`--skip-build` 跳过 build 直接上传 `dist/`;默认审核通过后需在开放平台手动发布,`--auto-publish` 改为审核通过后自动发布。 |
237
283
  | `hb-sdk login [--login-base-url <url>]` | 登录 Heybox,并把 CLI 自己需要的登录态和登录入口环境保存在本地缓存中。 |
238
284
  | `hb-sdk login status` | 查看脱敏后的 CLI 登录态。 |
239
285
  | `hb-sdk login clear` | 清理 CLI 登录态。 |
240
286
  | `hb-sdk doctor` | 检查本机 `hb-sdk` Agent Skill 是否匹配当前 SDK,并输出手动安装/刷新命令。 |
287
+ | `hb-sdk remote access` | 查看当前 CLI 用户是否具备开发者用户小程序创建和管理资格。 |
288
+ | `hb-sdk remote list [--status <status>] [--keyword <text>]` | 列出当前 CLI 用户可管理的远端用户小程序,用于发现并绑定当前项目。 |
289
+ | `hb-sdk remote create --name <name> [--preview-image-url <url>] [--force-bind]` | 创建远端用户小程序并写入当前项目的 `package.json.heybox.miniProgramId`。 |
290
+ | `hb-sdk remote bind <mini-program-id> [--force]` | 校验当前 CLI 用户可管理目标小程序后,再把它绑定到当前项目。 |
291
+ | `hb-sdk remote info` | 查看当前项目绑定的小程序详情。 |
292
+ | `hb-sdk remote update [--name <name>] [--preview-image-url <url>]` | 更新绑定小程序的名称或远程预览图 URL。 |
293
+ | `hb-sdk remote allowlist list/add/remove/set ...` | 管理绑定小程序的预览白名单。 |
294
+ | `hb-sdk remote deploy --release-note <text> [--skip-build] [--auto-publish]` | 构建、上传并提交当前小程序版本审核;`--skip-build` 跳过 build 直接上传 `dist/`。 |
295
+ | `hb-sdk remote versions` | 列出绑定小程序的远端版本。 |
296
+ | `hb-sdk remote preview <version>` | 查看指定版本的远端预览入口。 |
297
+ | `hb-sdk remote release <version> [--yes]` | 发布审核通过的版本;非 TTY 环境必须传 `--yes`。 |
298
+ | `hb-sdk remote withdraw <version> [--yes] [--reason <text>]` | 撤回审核中或已通过但未发布的版本;非 TTY 环境必须传 `--yes`。 |
299
+ | `hb-sdk remote take-down [--yes]` | 下架当前线上小程序;非 TTY 环境必须传 `--yes`。 |
300
+ | `hb-sdk remote reopen [--yes]` | 重新上架已下架的小程序;非 TTY 环境必须传 `--yes`。 |
301
+
302
+ 远端平台操作统一放在 `hb-sdk remote` 命令组下;顶层 `hb-sdk deploy` 已硬切删除,不再作为兼容别名保留。`hb-sdk login` 仍是顶层命令,因为它管理 CLI 登录态,不绑定到某个具体小程序。
303
+
304
+ `hb-sdk remote ...` 支持通用参数 `--json`、`--api-base-url <url>`、`--login-base-url <url>`、`--allow-unsafe-api-base-url` 和 `--verbose`。其中 `--json` 会让 stdout 只输出一个 JSON 对象,进度、警告和诊断信息不应污染 stdout。
241
305
 
242
306
  所有命令都支持 `--verbose` / `-v`。默认输出只展示关键阶段状态、可访问 URL、下一步命令和可直接处理的错误提示;需要排查后端 envelope、HTTP 状态、trace id、原始响应体、cache 路径、API origin、逐文件上传进度或提交审核原始失败原因时,再追加 `--verbose` 查看详细调试信息。交互式终端会用颜色、符号和 loading 动画区分成功、警告、错误与耗时步骤;CI、非 TTY 和管道输出会退化为 `[hb-sdk] LEVEL ...` 这种稳定文本行。
243
307
 
244
- ## hb-sdk deploy
308
+ ## hb-sdk remote deploy
245
309
 
246
- `hb-sdk deploy` 把版本预检、build、CDN 上传、提交审核 API 串成单条命令。命令前置要求:
310
+ `hb-sdk remote deploy` 把版本预检、build、CDN 上传、提交审核 API 串成单条命令。顶层 `hb-sdk deploy` 已删除;旧脚本必须改成 `hb-sdk remote deploy`。命令前置要求:
247
311
 
248
312
  1. `package.json` 必须含 `heybox.miniProgramId` 字段,CLI 只从这里读 mini program id:
249
313
  ```json
@@ -255,23 +319,23 @@ try {
255
319
  ```
256
320
  2. 已运行过 `hb-sdk login` 登录 Heybox。
257
321
  3. 如果需要以公司的名义发布小程序,需先找 @秦浩东 申请小程序开发权限。
258
- 4. 每次部署都要准备发布日志:`hb-sdk deploy --release-note "..."`。发布日志 trim 后不能为空,最多 500 个字符,允许换行;CI / 非 TTY 环境缺失时会直接失败,TTY 环境会提示输入。
322
+ 4. 每次部署都要准备发布日志:`hb-sdk remote deploy --release-note "..."`。发布日志 trim 后不能为空,最多 500 个字符,允许换行;CI / 非 TTY 环境缺失时会直接失败,TTY 环境会提示输入。
259
323
  5. 项目根有 `scripts.build`,会被 CLI 通过 lockfile 自动选用的 `pnpm`、`yarn` 或 `npm` 触发;无 lockfile 时回退 `npm`。
260
324
  6. 构建产物落在 `dist/`,包含 `index.html` 和 `manifest.json`。
261
325
 
262
326
  执行流程:
263
327
 
264
328
  1. 校验 `heybox.miniProgramId`、发布日志和登录态。
265
- 2. 普通 deploy 读取 `package.json.version`,登录后、build 前调用 `/mall/developer/user_miniprogram/version/precheck`,入参为 `mini_program_id`、`version`、`release_note`、`auto_publish`。
329
+ 2. 普通 remote deploy 读取 `package.json.version`,登录后、build 前调用 `/mall/developer/user_miniprogram/version/precheck`,入参为 `mini_program_id`、`version`、`release_note`、`auto_publish`。
266
330
  3. 触发 `<pm> run build`,除非使用 `--skip-build`。
267
- 4. 解析 `dist/manifest.json`,校验 `version` 为 `x.y.z`,自动剥离 BOM;普通 deploy 要求该版本与 precheck 使用的 `package.json.version` 一致。
331
+ 4. 解析 `dist/manifest.json`,校验 `version` 为 `x.y.z`,自动剥离 BOM;普通 remote deploy 要求该版本与 precheck 使用的 `package.json.version` 一致。
268
332
  5. `--skip-build` 会先读取已有 `dist/manifest.json.version`,再调用 precheck。
269
333
  6. 遍历 `dist/` 文件,跳过 `manifest.json`、`.DS_Store`、`.map`;遇到 symlink 或 `node_modules` 直接报错。
270
334
  7. 校验所有上传路径长度不超过 64。
271
335
  8. 4 并发上传到 COS。默认只展示上传阶段和文件总数;`--verbose` 会展示并发数、bucket / region 和逐文件结果,但不会输出 keys、签名、cookie 或 token。任一文件失败立刻 abort,不提交审核。
272
336
  9. 全部上传成功后调用 `/mall/developer/user_miniprogram/version/submit_audit`,输出提交审核成功、发布策略和可用的 preview URL;后端原始失败细节只在 `--verbose` 下展示。
273
337
 
274
- 默认 `auto_publish=false`,审核通过后需在开放平台手动发布;使用 `--auto-publish` 时提交 `auto_publish=true`,审核通过后自动发布。未发布候选版本可通过开放平台"内测白名单"让指定用户在广场看到;正式入口使用 `mini_program_id`,`mini_url` 仅用于本地调试。
338
+ 默认 `auto_publish=false`,审核通过后使用 `hb-sdk remote versions` 查看版本状态,再用 `hb-sdk remote release <version>` 发布;使用 `--auto-publish` 时提交 `auto_publish=true`,审核通过后自动发布。未发布候选版本可通过 `hb-sdk remote allowlist add <heybox_id>` 加入预览白名单,让指定用户在广场看到;正式入口使用 `mini_program_id`,`mini_url` 仅用于本地调试。
275
339
 
276
340
  `--skip-build` 用于 CI 双阶段:上一步已经 build 完缓存好了 `dist/`,本步只做预检、上传和提交审核。`dist/manifest.json` 或 `dist/index.html` 缺失会立即报错。
277
341
 
@@ -282,20 +346,44 @@ try {
282
346
  ```bash
283
347
  HB_SDK_API_BASE_URL=https://api.test.xiaoheihe.cn \
284
348
  HB_SDK_LOGIN_BASE_URL=https://login.test.xiaoheihe.cn \
285
- hb-sdk deploy --release-note "测试环境验证"
349
+ hb-sdk remote deploy --release-note "测试环境验证"
286
350
 
287
351
  hb-sdk login --login-base-url https://login.test.xiaoheihe.cn
288
- hb-sdk deploy --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "测试环境验证"
289
- hb-sdk deploy --verbose --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "排查预检失败"
352
+ hb-sdk remote deploy --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "测试环境验证"
353
+ hb-sdk remote deploy --verbose --api-base-url https://api.test.xiaoheihe.cn --login-base-url https://login.test.xiaoheihe.cn --release-note "排查预检失败"
290
354
 
291
- HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk deploy --api-base-url http://127.0.0.1:8080 --release-note "本地后台联调"
355
+ HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1 hb-sdk remote deploy --api-base-url http://127.0.0.1:8080 --release-note "本地后台联调"
292
356
  ```
293
357
 
294
- `--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,只影响 deploy 里的预检、CDN 上传凭证/回调、提交审核等后台 API;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 deploy 前校验当前 CLI 登录态是否属于同一个登录环境。仓库内开发可在 `packages/hb-sdk/src/cli/config.ts` 里按 `@heybox/hb-types` 的 `RylaiServiceTagConfig` 配置 `default_tag` 或 path-prefix 级 `special_tag`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag` 请求参数,用于开发环境路由或灰度验证。自定义地址只接受 origin,不允许包含 path、query 或 hash;API origin 默认还必须是 Heybox 受信 HTTPS 域名,只有本地联调等场景可显式使用 `--allow-unsafe-api-base-url` 或 `HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1` 放开。日志只输出 origin,不输出带身份和签名参数的完整请求 URL。`hb-sdk doctor`、npm latest 检查、mock host 的 `network.request()` 不受这些配置影响。
358
+ `--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,影响 `hb-sdk remote` 里的远端平台后台 API,包括预检、CDN 上传凭证/回调、提交审核、版本、发布、撤回、下架、重新上架、详情、基础信息和白名单等调用;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 remote 命令前校验当前 CLI 登录态是否属于同一个登录环境。仓库内开发可在 `packages/hb-sdk/src/cli/config.ts` 里按 `@heybox/hb-types` 的 `RylaiServiceTagConfig` 配置 `default_tag` 或 path-prefix 级 `special_tag`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag` 请求参数,用于开发环境路由或灰度验证。自定义地址只接受 origin,不允许包含 path、query 或 hash;API origin 默认还必须是 Heybox 受信 HTTPS 域名,只有本地联调等场景可显式使用 `--allow-unsafe-api-base-url` 或 `HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1` 放开。日志只输出 origin,不输出带身份和签名参数的完整请求 URL。`hb-sdk doctor`、npm latest 检查、mock host 的 `network.request()` 不受这些配置影响。
359
+
360
+ ## hb-sdk remote 命令参考
361
+
362
+ `hb-sdk remote` 默认作用于当前项目绑定的小程序,即 `package.json.heybox.miniProgramId`。`remote list` 只用于发现可管理的小程序;会改变远端状态的命令仍然只操作当前绑定的小程序,不接受临时 `mini_program_id` 参数。
363
+
364
+ | 命令 | 说明 |
365
+ | ---- | ---- |
366
+ | `hb-sdk remote access` | 查询当前 CLI 用户是否具备开发者用户小程序管理资格。 |
367
+ | `hb-sdk remote list [--status <status>] [--keyword <text>]` | 列出当前 CLI 用户可管理的小程序,并标出当前绑定项。 |
368
+ | `hb-sdk remote create --name <name> [--preview-image-url <url>] [--force-bind]` | 创建远端小程序并绑定当前项目;已有绑定时必须显式传 `--force-bind` 才能覆盖。 |
369
+ | `hb-sdk remote bind <mini-program-id> [--force]` | 先校验当前 CLI 用户可管理目标小程序,再写入当前项目绑定;`--force` 只允许覆盖本地绑定,不跳过远端校验。 |
370
+ | `hb-sdk remote info` | 查看当前绑定小程序的远端详情。 |
371
+ | `hb-sdk remote update [--name <name>] [--preview-image-url <url>]` | 更新名称或远程预览图 URL,至少传一个变更字段。 |
372
+ | `hb-sdk remote allowlist list` | 查看预览白名单。 |
373
+ | `hb-sdk remote allowlist add <heybox-id...>` | 添加十进制 Heybox ID 到预览白名单。 |
374
+ | `hb-sdk remote allowlist remove <heybox-id...>` | 从预览白名单移除非 owner 条目。 |
375
+ | `hb-sdk remote allowlist set <heybox-id...>` | 替换非 owner 白名单条目,并保留平台返回的 owner 语义。 |
376
+ | `hb-sdk remote deploy --release-note <text> [--skip-build] [--auto-publish]` | 构建、上传并提交当前版本审核。 |
377
+ | `hb-sdk remote versions` | 列出当前绑定小程序的远端版本。 |
378
+ | `hb-sdk remote preview <version>` | 查看指定版本的远端预览入口。 |
379
+ | `hb-sdk remote release <version> [--yes]` | 发布审核通过的版本;交互式终端会确认,非 TTY 必须传 `--yes`。 |
380
+ | `hb-sdk remote withdraw <version> [--yes] [--reason <text>]` | 撤回审核中或已通过但未发布的版本;交互式终端会确认,非 TTY 必须传 `--yes`。 |
381
+ | `hb-sdk remote take-down [--yes]` | 下架当前线上小程序;交互式终端会确认,非 TTY 必须传 `--yes`。 |
382
+ | `hb-sdk remote reopen [--yes]` | 重新上架已下架的小程序;交互式终端会确认,非 TTY 必须传 `--yes`。 |
295
383
 
296
384
  CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe SDK,也不会改变 `auth.login()`、`user.getInfo()`、`network.request()` 或 mock 宿主中的用户状态。`hb-sdk login status` 默认展示脱敏状态、`heyboxId`、`loginBaseUrl` 和登录时间;`--verbose` 额外展示 cache 路径。不输出 `pkey`、cookie 或完整请求头。
297
385
 
298
- `create`、`dev`、`deploy`、`login`、`login status`、`login clear`、`doctor` 这些 CLI 命令会在成功执行后检查 npm registry 上的 `@heybox/hb-sdk@latest`。如果发现新版本,会在 stderr 打印升级提醒;检查失败会静默跳过,不影响当前命令。`doctor` 已经诊断出 `SDK_MISMATCH` 时不会再追加统一提醒,避免同一次输出里重复提示升级 SDK。`hb-sdk --version` / `hb-sdk -V` 也会执行同一套检查,但 stdout 只输出版本号,升级提醒继续按 warn 级别写到 stderr。可通过 `HB_SDK_NO_UPDATE_CHECK=1` 禁用版本提醒;`CI=true` 时也会自动跳过检查。
386
+ `create`、`dev`、`remote ...`、`login`、`login status`、`login clear`、`doctor` 这些 CLI 命令会在成功执行后检查 npm registry 上的 `@heybox/hb-sdk@latest`。普通命令的检查结果会缓存 24 小时;如果发现新版本,会在 stderr 打印升级提醒;检查失败会静默跳过,不影响当前命令。`doctor` 已经诊断出 `SDK_MISMATCH` 时不会再追加统一提醒,避免同一次输出里重复提示升级 SDK。`hb-sdk --version` / `hb-sdk -V` 会直接请求 npm registry 获取 latest,不读取本地缓存;stdout 只输出版本号,升级提醒继续按 warn 级别写到 stderr。可通过 `HB_SDK_NO_UPDATE_CHECK=1` 禁用版本提醒;`CI=true` 时也会自动跳过检查。
299
387
 
300
388
  ## SDK 与 Runtime
301
389
 
@@ -307,7 +395,7 @@ CLI 登录态只供 CLI 命令访问黑盒接口时复用,不会注入 iframe
307
395
 
308
396
  - 调用模块能力前会自动等待 `ready()`,但业务仍建议在页面启动阶段显式 `await ready()`,便于集中处理握手失败。
309
397
  - `user.getInfo()` 不会触发登录;登录必须由业务在用户操作后调用 `auth.login()`。
310
- - 分享、截图、storage 和网络请求只开放稳定窄接口,不透传黑盒客户端内部协议参数。
398
+ - 分享、截图、UI、设备、导航、storage 和网络请求只开放稳定窄接口,不透传黑盒客户端内部协议参数。
311
399
  - `network.request()` 的 `validateStatus` 只在 SDK 本地执行,不会被序列化给父容器。
312
400
  - `on()` 返回取消监听函数;组件卸载或页面销毁时应主动取消监听。
313
401
  - 使用 `createMiniProgramSDK()` 创建独立实例后,不再需要时应调用 `destroy()`。
@@ -341,19 +429,19 @@ export default defineConfig({
341
429
 
342
430
  - 读取 `package.json` 失败或 JSON 解析失败:`vite build` 直接失败,并输出具体原因。
343
431
  - `package.json.version` 不是非空字符串:`vite build` 直接失败。
344
- - `package.json.version` 仍是模板默认值 `0.0.0`:`vite build` 输出 warning 并写入 manifest;`hb-sdk deploy` 会拒绝发布,必须改成实际 `x.y.z` 版本。
432
+ - `package.json.version` 仍是模板默认值 `0.0.0`:`vite build` 输出 warning 并写入 manifest;`hb-sdk remote deploy` 会拒绝发布,必须改成实际 `x.y.z` 版本。
345
433
  - 版本号不满足极简 semver 形态 `x.y.z`:只输出 Rollup/Vite warning,仍会写入 manifest。
346
434
 
347
435
  `manifest.json` 不部署到 CDN,只交给发布流水线读取后上送后台;Host 通过后台 API 间接读取版本信息。第一阶段只支持 Vite 项目,非 Vite 打包器未来通过其他子入口扩展。
348
436
 
349
437
  ## 导出
350
438
 
351
- 默认导出 `hbSDK`,包含 `ready`、`on`、`off`、`auth`、`user`、`share`、`viewport`、`storage`、`network`。
439
+ 默认导出 `hbSDK`,包含 `ready`、`on`、`off`、`auth`、`user`、`share`、`viewport`、`storage`、`network`、`ui`、`device`、`navigation`。
352
440
 
353
441
  常用命名导出:
354
442
 
355
443
  - `ready`、`on`、`off`
356
- - `auth`、`user`、`share`、`viewport`、`storage`、`network`
444
+ - `auth`、`user`、`share`、`viewport`、`storage`、`network`、`ui`、`device`、`navigation`
357
445
  - `createMiniProgramSDK`、`MiniProgramSDK`
358
446
  - `HbMiniProgramSDKError`、`HbMiniProgramNetworkError`
359
447
  - 各模块公开类型,例如 `MiniProgramNetworkRequestConfig`、`MiniProgramNetworkResponse`、`MiniProgramUserInfoResult`
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var require$$0 = require('fs');
7
7
  var require$$1 = require('path');
8
- var index = require('./index-ovy_xoLn.cjs');
8
+ var index = require('./index-BYMTp2I6.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -9,7 +9,7 @@ var node_url = require('node:url');
9
9
  var net = require('node:net');
10
10
  var node_http = require('node:http');
11
11
  var browser = require('./browser-RAy8e8cV.cjs');
12
- var index = require('./index-ovy_xoLn.cjs');
12
+ var index = require('./index-BYMTp2I6.cjs');
13
13
  require('node:process');
14
14
  require('node:buffer');
15
15
  require('node:util');
@@ -4,7 +4,7 @@ var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var os = require('node:os');
6
6
  var path = require('node:path');
7
- var index = require('./index-ovy_xoLn.cjs');
7
+ var index = require('./index-BYMTp2I6.cjs');
8
8
  require('node:module');
9
9
  require('path');
10
10
  require('os');
@@ -234,19 +234,19 @@ function requireArgument () {
234
234
 
235
235
  var command = {};
236
236
 
237
- const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-ovy_xoLn.cjs', document.baseURI).href)));
237
+ const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYMTp2I6.cjs', document.baseURI).href)));
238
238
  function __require$4() { return require$5("node:events"); }
239
239
 
240
- const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-ovy_xoLn.cjs', document.baseURI).href)));
240
+ const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYMTp2I6.cjs', document.baseURI).href)));
241
241
  function __require$3() { return require$4("node:child_process"); }
242
242
 
243
- const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-ovy_xoLn.cjs', document.baseURI).href)));
243
+ const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYMTp2I6.cjs', document.baseURI).href)));
244
244
  function __require$2() { return require$3("node:path"); }
245
245
 
246
- const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-ovy_xoLn.cjs', document.baseURI).href)));
246
+ const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYMTp2I6.cjs', document.baseURI).href)));
247
247
  function __require$1() { return require$2("node:fs"); }
248
248
 
249
- const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-ovy_xoLn.cjs', document.baseURI).href)));
249
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-BYMTp2I6.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -12866,7 +12866,7 @@ async function getUpdateReminder(options = {}) {
12866
12866
  }
12867
12867
  const now = options.now?.() ?? new Date();
12868
12868
  const currentVersion = options.currentVersion ?? (await readCurrentSdkVersion$1(options.packageJsonFiles));
12869
- const cached = await readFreshUpdateCheckCache(getUpdateCheckCacheFilePath(options), now);
12869
+ const cached = options.forceRefresh ? null : await readFreshUpdateCheckCache(getUpdateCheckCacheFilePath(options), now);
12870
12870
  if (cached) {
12871
12871
  return createUpdateReminder(currentVersion, cached.latestVersion);
12872
12872
  }
@@ -12875,10 +12875,12 @@ async function getUpdateReminder(options = {}) {
12875
12875
  latestVersion = await fetchLatestVersion(options);
12876
12876
  }
12877
12877
  catch {
12878
- await writeUpdateCheckCache({
12879
- version: UPDATE_CHECK_CACHE_VERSION,
12880
- checkedAt: now.toISOString(),
12881
- }, options).catch(() => undefined);
12878
+ if (!options.forceRefresh) {
12879
+ await writeUpdateCheckCache({
12880
+ version: UPDATE_CHECK_CACHE_VERSION,
12881
+ checkedAt: now.toISOString(),
12882
+ }, options).catch(() => undefined);
12883
+ }
12882
12884
  return null;
12883
12885
  }
12884
12886
  await writeUpdateCheckCache({
@@ -13092,7 +13094,7 @@ function readErrorMessage(error, options = {}) {
13092
13094
  }
13093
13095
 
13094
13096
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13095
- const BUILT_CLI_VERSION = '0.4.3';
13097
+ const BUILT_CLI_VERSION = '0.4.5';
13096
13098
  const PACKAGE_JSON_CANDIDATES = [
13097
13099
  path.resolve(__dirname, '..', '..', 'package.json'),
13098
13100
  path.resolve(__dirname, '..', 'package.json'),
@@ -13151,9 +13153,9 @@ function createCliProgram(overrides = {}) {
13151
13153
  printLoginStatus: defaultPrintLoginStatus,
13152
13154
  printUpdateReminder: printUpdateReminder,
13153
13155
  runCreateCommand: defaultRunCreateCommand,
13154
- runDeployCommand: defaultRunDeployCommand,
13155
13156
  runDevCommand: defaultRunDevCommand,
13156
13157
  runDoctorCommand: defaultRunDoctorCommand,
13158
+ runRemoteCommand: defaultRunRemoteCommand,
13157
13159
  ...overrides,
13158
13160
  };
13159
13161
  const program = new Command();
@@ -13180,25 +13182,7 @@ function createCliProgram(overrides = {}) {
13180
13182
  const logger = resolveLogger(command);
13181
13183
  await handlers.runDevCommand(options, { logger });
13182
13184
  }, handlers.printUpdateReminder, resolveLogger));
13183
- addVerboseOption(program
13184
- .command('deploy')
13185
- .description('构建并提交当前小程序版本审核')
13186
- .option('--skip-build', '跳过 build,直接读 dist 目录上传并提交审核')
13187
- .option('--release-note <text>', '发布日志,提交审核必填')
13188
- .option('--auto-publish', '审核通过后自动发布;默认需在开放平台手动发布')
13189
- .option('--api-base-url <url>', 'Heybox 后台 API origin,默认读取 HB_SDK_API_BASE_URL 或生产地址')
13190
- .option('--allow-unsafe-api-base-url', '允许向非 Heybox HTTPS API origin 发送登录态,仅限本地调试')
13191
- .option('--login-base-url <url>', '校验 CLI 登录态使用的登录 origin,默认读取 HB_SDK_LOGIN_BASE_URL 或生产地址')).action(withUpdateReminder(async (options, command) => {
13192
- const logger = resolveLogger(command);
13193
- await handlers.runDeployCommand({
13194
- allowUnsafeApiBaseUrl: Boolean(options.allowUnsafeApiBaseUrl),
13195
- apiBaseUrl: options.apiBaseUrl,
13196
- autoPublish: Boolean(options.autoPublish),
13197
- loginBaseUrl: options.loginBaseUrl,
13198
- releaseNote: options.releaseNote,
13199
- skipBuild: Boolean(options.skipBuild),
13200
- }, { logger });
13201
- }, handlers.printUpdateReminder, resolveLogger));
13185
+ installRemoteCommands(program, handlers, resolveLogger);
13202
13186
  addVerboseOption(program.command('doctor').description('诊断 hb-sdk 本地环境和 Agent Skill 版本')).action(async (...args) => {
13203
13187
  const logger = resolveLogger(readCommandFromActionArgs(args));
13204
13188
  const result = await handlers.runDoctorCommand({ logger });
@@ -13229,6 +13213,141 @@ function createCliProgram(overrides = {}) {
13229
13213
  function addVerboseOption(command) {
13230
13214
  return command.option('-v, --verbose', '输出详细调试信息');
13231
13215
  }
13216
+ function addRemotePublicOptions(command) {
13217
+ return addVerboseOption(command
13218
+ .option('--json', '以 JSON 格式输出 remote 命令结果')
13219
+ .option('--api-base-url <url>', 'Heybox 后台 API origin,默认读取 HB_SDK_API_BASE_URL 或生产地址')
13220
+ .option('--login-base-url <url>', '校验 CLI 登录态使用的登录 origin,默认读取 HB_SDK_LOGIN_BASE_URL 或生产地址')
13221
+ .option('--allow-unsafe-api-base-url', '允许向非 Heybox HTTPS API origin 发送登录态,仅限本地调试'));
13222
+ }
13223
+ function installRemoteCommands(program, handlers, resolveLogger) {
13224
+ const remote = addRemotePublicOptions(program.command('remote').description('管理当前项目绑定的远程 Heybox 用户小程序'));
13225
+ addRemotePublicOptions(remote.command('access').description('查看当前账号的用户小程序访问权限')).action(createRemoteAction(handlers, resolveLogger, 'access'));
13226
+ addRemotePublicOptions(remote
13227
+ .command('list')
13228
+ .description('列出当前账号可管理的用户小程序')
13229
+ .option('--status <status>', '按状态筛选')
13230
+ .option('--keyword <text>', '按关键词筛选')).action(createRemoteAction(handlers, resolveLogger, 'list', (command) => pickOptions(command, ['status', 'keyword'])));
13231
+ addRemotePublicOptions(remote
13232
+ .command('create')
13233
+ .description('创建远程用户小程序并绑定当前项目')
13234
+ .requiredOption('--name <name>', '小程序名称')
13235
+ .option('--preview-image-url <url>', '远程预览图 HTTPS URL')
13236
+ .option('--force-bind', '允许覆盖当前 package.json 中已有绑定')).action(createRemoteAction(handlers, resolveLogger, 'create', (command) => ({
13237
+ ...pickOptions(command, ['name', 'previewImageUrl']),
13238
+ forceBind: Boolean(readCommandOptionsWithAncestors(command).forceBind),
13239
+ })));
13240
+ addRemotePublicOptions(remote.command('bind').description('绑定当前项目到已存在的远程用户小程序').argument('<mini-program-id>', '远程小程序 ID').option('--force', '允许覆盖当前 package.json 中已有绑定')).action(createRemoteAction(handlers, resolveLogger, 'bind', (command, miniProgramId) => ({
13241
+ force: Boolean(readCommandOptionsWithAncestors(command).force),
13242
+ miniProgramId: readStringArgument(miniProgramId, 'mini-program-id'),
13243
+ })));
13244
+ addRemotePublicOptions(remote.command('info').description('查看当前绑定的远程用户小程序详情')).action(createRemoteAction(handlers, resolveLogger, 'info'));
13245
+ addRemotePublicOptions(remote
13246
+ .command('update')
13247
+ .description('更新当前绑定的远程用户小程序基础信息')
13248
+ .option('--name <name>', '小程序名称')
13249
+ .option('--preview-image-url <url>', '远程预览图 HTTPS URL')).action(createRemoteAction(handlers, resolveLogger, 'update', (command) => pickOptions(command, ['name', 'previewImageUrl'])));
13250
+ const allowlist = addRemotePublicOptions(remote.command('allowlist').description('管理当前绑定小程序的预览白名单'));
13251
+ addRemotePublicOptions(allowlist.command('list').description('查看预览白名单')).action(createRemoteAction(handlers, resolveLogger, 'allowlist:list'));
13252
+ addRemotePublicOptions(allowlist.command('add').description('添加预览白名单 Heybox ID').argument('<heybox-id...>', 'Heybox ID')).action(createRemoteAction(handlers, resolveLogger, 'allowlist:add', (_command, heyboxIds) => ({
13253
+ heyboxIds: readStringArrayArgument(heyboxIds, 'heybox-id'),
13254
+ })));
13255
+ addRemotePublicOptions(allowlist.command('remove').description('移除预览白名单 Heybox ID').argument('<heybox-id...>', 'Heybox ID')).action(createRemoteAction(handlers, resolveLogger, 'allowlist:remove', (_command, heyboxIds) => ({
13256
+ heyboxIds: readStringArrayArgument(heyboxIds, 'heybox-id'),
13257
+ })));
13258
+ addRemotePublicOptions(allowlist.command('set').description('替换预览白名单 Heybox ID').argument('<heybox-id...>', 'Heybox ID')).action(createRemoteAction(handlers, resolveLogger, 'allowlist:set', (_command, heyboxIds) => ({
13259
+ heyboxIds: readStringArrayArgument(heyboxIds, 'heybox-id'),
13260
+ })));
13261
+ addRemotePublicOptions(remote
13262
+ .command('deploy')
13263
+ .description('构建并提交当前小程序版本审核')
13264
+ .option('--skip-build', '跳过 build,直接读 dist 目录上传并提交审核')
13265
+ .option('--release-note <text>', '发布日志,提交审核必填')
13266
+ .option('--auto-publish', '审核通过后自动发布;默认需在 CLI 中手动发布')).action(createRemoteAction(handlers, resolveLogger, 'deploy', (command) => {
13267
+ const options = readCommandOptionsWithAncestors(command);
13268
+ return {
13269
+ autoPublish: Boolean(options.autoPublish),
13270
+ releaseNote: readStringOption(options.releaseNote),
13271
+ skipBuild: Boolean(options.skipBuild),
13272
+ };
13273
+ }));
13274
+ addRemotePublicOptions(remote.command('versions').description('列出当前绑定小程序的远程版本')).action(createRemoteAction(handlers, resolveLogger, 'versions'));
13275
+ addRemotePublicOptions(remote.command('preview').description('查看指定版本的预览信息').argument('<version>', '版本号')).action(createRemoteAction(handlers, resolveLogger, 'preview', (_command, version) => ({
13276
+ version: readStringArgument(version, 'version'),
13277
+ })));
13278
+ addRemotePublicOptions(remote.command('release').description('发布指定已审核通过的版本').argument('<version>', '版本号').option('--yes', '跳过危险操作确认')).action(createRemoteAction(handlers, resolveLogger, 'release', (command, version) => ({
13279
+ version: readStringArgument(version, 'version'),
13280
+ ...readYesOption(command),
13281
+ })));
13282
+ addRemotePublicOptions(remote
13283
+ .command('withdraw')
13284
+ .description('撤回指定审核中或已通过的版本')
13285
+ .argument('<version>', '版本号')
13286
+ .option('--yes', '跳过危险操作确认')
13287
+ .option('--reason <text>', '撤回原因')).action(createRemoteAction(handlers, resolveLogger, 'withdraw', (command, version) => ({
13288
+ reason: readStringOption(readCommandOptionsWithAncestors(command).reason),
13289
+ version: readStringArgument(version, 'version'),
13290
+ ...readYesOption(command),
13291
+ })));
13292
+ addRemotePublicOptions(remote.command('take-down').description('下架当前在线小程序').option('--yes', '跳过危险操作确认')).action(createRemoteAction(handlers, resolveLogger, 'take-down', (command) => readYesOption(command)));
13293
+ addRemotePublicOptions(remote.command('reopen').description('重新上架已下架小程序').option('--yes', '跳过危险操作确认')).action(createRemoteAction(handlers, resolveLogger, 'reopen', (command) => readYesOption(command)));
13294
+ }
13295
+ function createRemoteAction(handlers, resolveLogger, commandName, getCommandOptions = () => ({})) {
13296
+ return withUpdateReminder(async (...args) => {
13297
+ const command = readCommandFromActionArgs(args);
13298
+ if (!command) {
13299
+ throw new Error('无法解析 remote 命令上下文');
13300
+ }
13301
+ const logger = resolveLogger(command);
13302
+ const commandArgs = args.slice(0, -2);
13303
+ await handlers.runRemoteCommand({
13304
+ command: commandName,
13305
+ ...readRemoteCommonOptions(command),
13306
+ ...getCommandOptions(command, ...commandArgs),
13307
+ }, { logger });
13308
+ }, handlers.printUpdateReminder, resolveLogger);
13309
+ }
13310
+ function readRemoteCommonOptions(command) {
13311
+ const options = readCommandOptionsWithAncestors(command);
13312
+ return {
13313
+ allowUnsafeApiBaseUrl: Boolean(options.allowUnsafeApiBaseUrl),
13314
+ apiBaseUrl: readStringOption(options.apiBaseUrl),
13315
+ json: Boolean(options.json),
13316
+ loginBaseUrl: readStringOption(options.loginBaseUrl),
13317
+ verbose: Boolean(options.verbose),
13318
+ };
13319
+ }
13320
+ function readYesOption(command) {
13321
+ return {
13322
+ yes: Boolean(readCommandOptionsWithAncestors(command).yes),
13323
+ };
13324
+ }
13325
+ function pickOptions(command, keys) {
13326
+ const options = readCommandOptionsWithAncestors(command);
13327
+ const picked = {};
13328
+ for (const key of keys) {
13329
+ const value = readStringOption(options[key]);
13330
+ if (value !== undefined) {
13331
+ picked[key] = value;
13332
+ }
13333
+ }
13334
+ return picked;
13335
+ }
13336
+ function readStringOption(value) {
13337
+ return typeof value === 'string' ? value : undefined;
13338
+ }
13339
+ function readStringArgument(value, name) {
13340
+ if (typeof value !== 'string') {
13341
+ throw new Error(`无法解析 ${name} 参数`);
13342
+ }
13343
+ return value;
13344
+ }
13345
+ function readStringArrayArgument(value, name) {
13346
+ if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) {
13347
+ throw new Error(`无法解析 ${name} 参数`);
13348
+ }
13349
+ return value;
13350
+ }
13232
13351
  function hasVerboseArg(argv) {
13233
13352
  return argv.includes('--verbose') || argv.includes('-v');
13234
13353
  }
@@ -13249,33 +13368,33 @@ function createCommandLoggerResolver(options) {
13249
13368
  };
13250
13369
  }
13251
13370
  const defaultClearLoginStatus = async (...args) => {
13252
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoZhlwxt.cjs'); });
13371
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DIgcT1gv.cjs'); });
13253
13372
  return clearLoginStatus(...args);
13254
13373
  };
13255
13374
  const defaultLoginToHeybox = async (...args) => {
13256
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-CoZhlwxt.cjs'); });
13375
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DIgcT1gv.cjs'); });
13257
13376
  return loginToHeybox(...args);
13258
13377
  };
13259
13378
  const defaultPrintLoginStatus = async (...args) => {
13260
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoZhlwxt.cjs'); });
13379
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DIgcT1gv.cjs'); });
13261
13380
  return printLoginStatus(...args);
13262
13381
  };
13263
13382
  const defaultRunCreateCommand = async (...args) => {
13264
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BV4h2BTs.cjs'); });
13383
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-DpyZCNdo.cjs'); });
13265
13384
  return runCreateCommand(...args);
13266
13385
  };
13267
- const defaultRunDeployCommand = async (...args) => {
13268
- const { runDeployCommand } = await Promise.resolve().then(function () { return require('./deploy-Bz0-WpHy.cjs'); }).then(function (n) { return n.deploy; });
13269
- return runDeployCommand(...args);
13270
- };
13271
13386
  const defaultRunDevCommand = async (...args) => {
13272
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-DgX88vaK.cjs'); });
13387
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-DWIpgJnn.cjs'); });
13273
13388
  return runDevCommand(...args);
13274
13389
  };
13275
13390
  const defaultRunDoctorCommand = async (...args) => {
13276
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-BIZoQ6go.cjs'); });
13391
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-DBotVUQI.cjs'); });
13277
13392
  return runDoctorCommand(...args);
13278
13393
  };
13394
+ const defaultRunRemoteCommand = async (...args) => {
13395
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-DjaOc1VS.cjs'); }).then(function (n) { return n.remote; });
13396
+ return runRemoteCommand(...args);
13397
+ };
13279
13398
  function resolveStandaloneLogger(options, verbose) {
13280
13399
  return options.logger ?? options.createLogger?.({ verbose }) ?? createCliLogger({ verbose });
13281
13400
  }
@@ -13283,7 +13402,16 @@ function readCommandVerbose(command) {
13283
13402
  if (!command) {
13284
13403
  return false;
13285
13404
  }
13286
- return Boolean(command.optsWithGlobals?.().verbose || command.opts().verbose);
13405
+ return Boolean(readCommandOptionsWithAncestors(command).verbose);
13406
+ }
13407
+ function readCommandOptionsWithAncestors(command) {
13408
+ const chain = [];
13409
+ let current = command;
13410
+ while (current) {
13411
+ chain.push(current);
13412
+ current = current.parent;
13413
+ }
13414
+ return Object.assign({}, ...chain.reverse().map((item) => item.opts()));
13287
13415
  }
13288
13416
  function installVersionUpdateReminder(program, printUpdateReminder, resolveLogger) {
13289
13417
  const parseAsync = program.parseAsync.bind(program);
@@ -13292,7 +13420,7 @@ function installVersionUpdateReminder(program, printUpdateReminder, resolveLogge
13292
13420
  if (isVersionRequest(argv, parseOptions)) {
13293
13421
  const logger = resolveLogger(hasVerboseArg(getUserArgs(argv, parseOptions)));
13294
13422
  logger.raw(getCliVersion(), { stream: 'stdout' });
13295
- await printUpdateReminder({ logger });
13423
+ await printUpdateReminder({ forceRefresh: true, logger });
13296
13424
  throw new CommanderError(0, 'commander.version', 'version displayed');
13297
13425
  }
13298
13426
  return parseAsync(...args);
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-ovy_xoLn.cjs');
3
+ var index$2 = require('./index-BYMTp2I6.cjs');
4
4
  var require$$0$2 = require('fs');
5
5
  var require$$2$1 = require('crypto');
6
6
  var require$$1$2 = require('path');
7
7
  var require$$0$3 = require('assert');
8
8
  var require$$4$2 = require('events');
9
9
  var require$$1$1 = require('util');
10
- var deploy = require('./deploy-Bz0-WpHy.cjs');
10
+ var remote = require('./remote-DjaOc1VS.cjs');
11
11
  var require$$0$5 = require('net');
12
12
  var require$$0$4 = require('url');
13
13
  var require$$2$2 = require('http');
@@ -13707,7 +13707,7 @@ function requireSource () {
13707
13707
  const ajv_1 = requireAjv$1();
13708
13708
  const ajv_formats_1 = requireDist();
13709
13709
  const debounceFn = requireDebounceFn();
13710
- const semver = deploy.requireSemver();
13710
+ const semver = remote.requireSemver();
13711
13711
  const onetime = index$2.requireOnetime();
13712
13712
  const encryptionAlgorithm = 'aes-256-cbc';
13713
13713
  const createPlainObject = () => {
@@ -2,9 +2,9 @@
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
4
  var node_http = require('node:http');
5
- var session = require('./session-BQs0wf65.cjs');
5
+ var session = require('./session-BAgaqpNL.cjs');
6
6
  var browser = require('./browser-RAy8e8cV.cjs');
7
- var index = require('./index-ovy_xoLn.cjs');
7
+ var index = require('./index-BYMTp2I6.cjs');
8
8
  require('node:path');
9
9
  require('fs');
10
10
  require('constants');