@heybox/hb-sdk 0.8.1-alpha.14 → 0.8.1-alpha.16

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 (40) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +13 -0
  3. package/dist/cli-chunks/{build-D-VaxzAE.cjs → build-D3JxmtmD.cjs} +17 -7
  4. package/dist/cli-chunks/{context-BH7BZPoY.cjs → context-CcJDF3v_.cjs} +2 -2
  5. package/dist/cli-chunks/{create-Bmp9E1n8.cjs → create-Cww0mYrn.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-BntAFyWR.cjs → dev-Dd2_LjFP.cjs} +9 -9
  7. package/dist/cli-chunks/{doctor-t3YMD3qv.cjs → doctor-DTDwA9UZ.cjs} +1 -1
  8. package/dist/cli-chunks/{index-VP8boR-7.cjs → index-B5jxW7GS.cjs} +15 -15
  9. package/dist/cli-chunks/{index-CjP8Qye_.cjs → index-BKbdNtX4.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-B_5UnniK.cjs → index.esm-DxT8YC2x.cjs} +7 -7
  11. package/dist/cli-chunks/{login-p38-WSHx.cjs → login-BZEWhweM.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-BfJ5TGoA.cjs → project-vite-DpQOovxh.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-CBH04z6v.cjs → remote-zyWYZ-W8.cjs} +69 -10
  14. package/dist/cli-chunks/{runtime-permission-env-CVYOOxPB.cjs → runtime-permission-env-C7QvBZp0.cjs} +38 -1
  15. package/dist/cli-chunks/{session-BEpV8CZQ.cjs → session-DN0ZLQC2.cjs} +1 -1
  16. package/dist/cli-chunks/{skill-DuVDTrA2.cjs → skill-lsh9bXs0.cjs} +2 -2
  17. package/dist/cli-chunks/{version-Df-F-uhW.cjs → version-CoWxDzB4.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-BgW__pJ2.js +101 -0
  20. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-C1GHFN_L.js → desktop-app-launch-CvKi6AqK.js} +1 -1
  21. package/dist/devtools/browser-dev-host/assets/{index-mfGqyKpq.js → index-BqskekK_.js} +3 -3
  22. package/dist/devtools/browser-dev-host/index.html +2 -2
  23. package/dist/index.cjs.js +1 -1
  24. package/dist/index.esm.js +1 -1
  25. package/dist/miniapp-publish.cjs.js +118 -0
  26. package/dist/miniapp-publish.esm.js +115 -1
  27. package/dist/vite.cjs.js +39 -1
  28. package/dist/vite.esm.js +39 -1
  29. package/package.json +4 -4
  30. package/skill/SKILL.md +15 -14
  31. package/skill/references/api-protocol.md +2 -2
  32. package/skill/references/api-root.md +3 -1
  33. package/skill/references/cli.md +2 -0
  34. package/skill/skill.json +5 -5
  35. package/types/miniapp-manifest/bindings.d.ts +5 -0
  36. package/types/miniapp-manifest/index.d.ts +1 -0
  37. package/types/miniapp-manifest/node.d.ts +1 -0
  38. package/types/miniapp-manifest/schema.d.ts +48 -0
  39. package/types/miniapp-publish/index.d.ts +2 -0
  40. package/dist/devtools/browser-dev-host/assets/browser-dev-host-D_nC-Zex.js +0 -101
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  本文件随 `@heybox/hb-sdk` npm 包公开分发,只记录外部小程序开发者可观察到的变化。内部集成、实现策略和审查证据不在此维护。
4
4
 
5
+ ## 0.8.1-alpha.16
6
+
7
+ - 新增 `resolveMiniappManifestPlatforms(sdkVersion, manifest)`:按 `manifest.platforms` 与 hb-sdk `0.9.0` 硬切口径解析小程序支持的平台;缺少声明且低于 `0.9.0`(含缺失 sdkVersion)时按 Android / iOS / OHOS 移动端兼容,显式声明非法(空数组、未知值、重复值、类型错误)时直接抛错。
8
+ - 该能力从 `@heybox/hb-sdk/miniapp-publish` 导出,开放平台网页与其它调用方复用它做上传前校验,不再各自实现硬切比较或缺省逻辑。
9
+
10
+ ## 0.8.1-alpha.15
11
+
12
+ - 支持在 `package.json#heybox.bindAppIds` 中声明当前版本关联的小黑盒 PC 游戏 appid;构建产物写入规范化后的 Manifest 顶层 `bindAppIds`,最多 20 项。
13
+ - `hb-sdk build` 保持离线校验;`hb-sdk remote deploy` 会在上传前校验游戏是否存在且可用,并在正式提审时由服务端再次校验。缺失或空数组表示清空绑定,`--from-version` 继承源版本快照。
14
+ - `hb-sdk remote info` 只读展示本地、线上、新增和移除绑定;绑定不是 Runtime 权限,修改仍只能更新项目配置并重新发布版本。
15
+
5
16
  ## 0.8.1-alpha.14
6
17
 
7
18
  - 新增 `package.json#heybox.window` 开发者声明:`defaultWidth` / `defaultHeight` / `minWidth` / `minHeight` / `resizable`,构建时写入 `dist/manifest.json`,所有平台都会写入,由各宿主自行消费。
package/README.md CHANGED
@@ -106,6 +106,19 @@ async function revokeAuthorizationFromUserAction() {
106
106
  }
107
107
  ```
108
108
 
109
+ 需要让已发布版本出现在新 PC 的游戏工作区时,在同一个 `heybox` 对象中按需声明精确的小黑盒 PC 游戏 appid:
110
+
111
+ ```json
112
+ {
113
+ "heybox": {
114
+ "platforms": ["windows", "macos"],
115
+ "bindAppIds": ["730", "3513350"]
116
+ }
117
+ }
118
+ ```
119
+
120
+ `bindAppIds` 只接受规范十进制字符串,最多 20 项,并按数值升序写入 Manifest。它不是权限,构建不联网;游戏真实性在远端预检和提审时校验。字段缺失或 `[]` 都表示清空绑定,`remote deploy --from-version` 则继承源版本快照。PC 展示仍受 `platforms` 过滤。
121
+
109
122
  再启用构建插件:
110
123
 
111
124
  ```ts
@@ -3,13 +3,13 @@
3
3
  var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var runtimePermissionEnv = require('./runtime-permission-env-CVYOOxPB.cjs');
6
+ var runtimePermissionEnv = require('./runtime-permission-env-C7QvBZp0.cjs');
7
7
  require('node:crypto');
8
8
  require('node:zlib');
9
9
  var runtimeGate = require('./runtime-gate-BWb8QIcX.cjs');
10
- var index = require('./index-VP8boR-7.cjs');
11
- var projectVite = require('./project-vite-BfJ5TGoA.cjs');
12
- require('./version-Df-F-uhW.cjs');
10
+ var index = require('./index-B5jxW7GS.cjs');
11
+ var projectVite = require('./project-vite-DpQOovxh.cjs');
12
+ require('./version-CoWxDzB4.cjs');
13
13
  require('node:async_hooks');
14
14
  require('node:module');
15
15
  require('path');
@@ -23,6 +23,9 @@ require('buffer');
23
23
  require('util');
24
24
  require('node:url');
25
25
 
26
+ function areStringArraysEqual(left, right) {
27
+ return left.length === right.length && left.every((value, index) => value === right[index]);
28
+ }
26
29
  async function runBuildCommand(_options = {}, runtime = {}) {
27
30
  const logger = runtime.logger ?? index.createCliLogger();
28
31
  const projectRoot = projectVite.findProjectRoot(runtime.cwd ?? process.cwd());
@@ -32,6 +35,7 @@ async function runBuildCommand(_options = {}, runtime = {}) {
32
35
  const skipPlatformCsp = runtimePermissionEnv.shouldSkipMiniappPlatformCspFromEnv(env);
33
36
  const declaredPlatforms = runtimePermissionEnv.readMiniappPlatformsFromPackageJson(projectRoot);
34
37
  const declaredWindow = runtimePermissionEnv.readMiniappWindowFromPackageJson(projectRoot);
38
+ const declaredBindAppIds = runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(projectRoot);
35
39
  runtimePermissionEnv.readMiniappPermissionsFromPackageJson(projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
36
40
  await fs.rm(distDir, { force: true, recursive: true });
37
41
  try {
@@ -50,7 +54,7 @@ async function runBuildCommand(_options = {}, runtime = {}) {
50
54
  write: true,
51
55
  },
52
56
  }), { successText: 'Vite 构建完成' });
53
- const result = await validateBuildOutput(projectRoot, logger, declaredPlatforms, declaredWindow);
57
+ const result = await validateBuildOutput(projectRoot, logger, declaredPlatforms, declaredWindow, declaredBindAppIds);
54
58
  logger.success(`构建完成: dist/ | manifest version ${result.version} | sdkVersion ${result.sdkVersion} | 待上传文件 ${result.fileCount} 个 | ${formatSize(result.totalBytes)}`);
55
59
  return result;
56
60
  }, env);
@@ -79,7 +83,7 @@ function createFixedBuildOutputPlugin(projectRoot) {
79
83
  },
80
84
  };
81
85
  }
82
- async function validateBuildOutput(projectRoot, logger, declaredPlatforms, declaredWindow) {
86
+ async function validateBuildOutput(projectRoot, logger, declaredPlatforms, declaredWindow, declaredBindAppIds) {
83
87
  const distDir = path.join(projectRoot, 'dist');
84
88
  const entryHtmlPath = path.join(distDir, 'index.html');
85
89
  const manifestPath = path.join(distDir, 'manifest.json');
@@ -97,13 +101,18 @@ async function validateBuildOutput(projectRoot, logger, declaredPlatforms, decla
97
101
  if (hadBom) {
98
102
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
99
103
  }
100
- const { platforms, sdkVersion, version, permissions, window } = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
104
+ const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
105
+ const { platforms, sdkVersion, version, permissions, window } = validated;
106
+ const bindAppIds = validated.bindAppIds ?? [];
101
107
  if (!runtimePermissionEnv.areMiniappPlatformsEqual(platforms, declaredPlatforms)) {
102
108
  throw new Error('dist/manifest.json.platforms 与 package.json#heybox.platforms 不一致,请重新 build');
103
109
  }
104
110
  if (!runtimePermissionEnv.areMiniappWindowsEqual(window, declaredWindow)) {
105
111
  throw new Error('dist/manifest.json.window 与 package.json#heybox.window 不一致,请重新 build');
106
112
  }
113
+ if (!areStringArraysEqual(bindAppIds, declaredBindAppIds)) {
114
+ throw new Error('dist/manifest.json.bindAppIds 与 package.json#heybox.bindAppIds 不一致,请重新 build');
115
+ }
107
116
  const allFiles = await walkDistFiles(distDir);
108
117
  const uploadFiles = allFiles.filter((file) => runtimePermissionEnv.shouldUploadDistFile(file.relativePath));
109
118
  const sizeError = runtimePermissionEnv.validateMiniappUploadSizeBudgets(uploadFiles);
@@ -112,6 +121,7 @@ async function validateBuildOutput(projectRoot, logger, declaredPlatforms, decla
112
121
  }
113
122
  return {
114
123
  distDir,
124
+ bindAppIds,
115
125
  fileCount: uploadFiles.length,
116
126
  sdkVersion,
117
127
  platforms,
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-CVYOOxPB.cjs');
4
- var session = require('./session-BEpV8CZQ.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-C7QvBZp0.cjs');
4
+ var session = require('./session-DN0ZLQC2.cjs');
5
5
  var fs$1 = require('node:fs');
6
6
  var fs = require('node:fs/promises');
7
7
  var path = require('node:path');
@@ -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-VP8boR-7.cjs');
8
+ var index = require('./index-B5jxW7GS.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -8,17 +8,17 @@ var net = require('node:net');
8
8
  var promises = require('node:dns/promises');
9
9
  var node_http = require('node:http');
10
10
  var node_module = require('node:module');
11
- var context = require('./context-BH7BZPoY.cjs');
12
- var runtimePermissionEnv = require('./runtime-permission-env-CVYOOxPB.cjs');
11
+ var context = require('./context-CcJDF3v_.cjs');
12
+ var runtimePermissionEnv = require('./runtime-permission-env-C7QvBZp0.cjs');
13
13
  var undici = require('undici');
14
14
  var fs$1 = require('node:fs/promises');
15
- var index = require('./index-VP8boR-7.cjs');
15
+ var index = require('./index-B5jxW7GS.cjs');
16
16
  var require$$0$1 = require('crypto');
17
17
  var require$$0 = require('buffer');
18
- var session = require('./session-BEpV8CZQ.cjs');
18
+ var session = require('./session-DN0ZLQC2.cjs');
19
19
  var browser = require('./browser-RAy8e8cV.cjs');
20
- var projectVite = require('./project-vite-BfJ5TGoA.cjs');
21
- var version = require('./version-Df-F-uhW.cjs');
20
+ var projectVite = require('./project-vite-DpQOovxh.cjs');
21
+ var version = require('./version-CoWxDzB4.cjs');
22
22
  require('node:zlib');
23
23
 
24
24
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -1950,8 +1950,8 @@ const DEFAULT_CHANNEL_TRANSPORT = {
1950
1950
  };
1951
1951
  const IPV4_LOOPBACK_ADDRESSES = new net.BlockList();
1952
1952
  IPV4_LOOPBACK_ADDRESSES.addSubnet('127.0.0.0', 8, 'ipv4');
1953
- const { WebSocket, WebSocketServer } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-BntAFyWR.cjs', document.baseURI).href)))('ws');
1954
- const { parse: parseHtml } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-BntAFyWR.cjs', document.baseURI).href)))('parse5');
1953
+ const { WebSocket, WebSocketServer } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-Dd2_LjFP.cjs', document.baseURI).href)))('ws');
1954
+ const { parse: parseHtml } = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/dev-Dd2_LjFP.cjs', document.baseURI).href)))('parse5');
1955
1955
  const BROWSER_DEV_HOST_ROOT_CANDIDATES = [
1956
1956
  path.resolve(__dirname, 'devtools/browser-dev-host'),
1957
1957
  path.resolve(__dirname, '../devtools/browser-dev-host'),
@@ -11049,7 +11049,7 @@ function assertNodeRuntimeCapabilities(ctx, settings) {
11049
11049
  function createNodeRealtimeDriverRegistry() {
11050
11050
  const registry = createRuntimeRealtimeDriverRegistry();
11051
11051
  registry.registerLazy('node-websocket', async () => {
11052
- const mod = await Promise.resolve().then(function () { return require('./index.esm-B_5UnniK.cjs'); });
11052
+ const mod = await Promise.resolve().then(function () { return require('./index.esm-DxT8YC2x.cjs'); });
11053
11053
  return mod.createNodeWebSocketRuntimeDriver();
11054
11054
  });
11055
11055
  return registry;
@@ -3,7 +3,7 @@
3
3
  var fs = require('node:fs/promises');
4
4
  var os = require('node:os');
5
5
  var path = require('node:path');
6
- var index = require('./index-VP8boR-7.cjs');
6
+ var index = require('./index-B5jxW7GS.cjs');
7
7
  require('node:module');
8
8
  require('node:fs');
9
9
  require('path');
@@ -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-VP8boR-7.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-B5jxW7GS.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-VP8boR-7.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-B5jxW7GS.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-VP8boR-7.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-B5jxW7GS.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-VP8boR-7.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-B5jxW7GS.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-VP8boR-7.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-B5jxW7GS.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -13424,7 +13424,7 @@ function getPathname(pathWithQuery) {
13424
13424
  }
13425
13425
 
13426
13426
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13427
- const BUILT_CLI_VERSION = '0.8.1-alpha.14';
13427
+ const BUILT_CLI_VERSION = '0.8.1-alpha.16';
13428
13428
  const PACKAGE_JSON_CANDIDATES = [
13429
13429
  path.resolve(__dirname, '..', '..', 'package.json'),
13430
13430
  path.resolve(__dirname, '..', 'package.json'),
@@ -13773,39 +13773,39 @@ function createCommandLoggerResolver(options) {
13773
13773
  };
13774
13774
  }
13775
13775
  const defaultClearLoginStatus = async (...args) => {
13776
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-p38-WSHx.cjs'); });
13776
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-BZEWhweM.cjs'); });
13777
13777
  return clearLoginStatus(...args);
13778
13778
  };
13779
13779
  const defaultLoginToHeybox = async (...args) => {
13780
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-p38-WSHx.cjs'); });
13780
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-BZEWhweM.cjs'); });
13781
13781
  return loginToHeybox(...args);
13782
13782
  };
13783
13783
  const defaultPrintLoginStatus = async (...args) => {
13784
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-p38-WSHx.cjs'); });
13784
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-BZEWhweM.cjs'); });
13785
13785
  return printLoginStatus(...args);
13786
13786
  };
13787
13787
  const defaultRunBuildCommand = async (...args) => {
13788
- const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-D-VaxzAE.cjs'); });
13788
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-D3JxmtmD.cjs'); });
13789
13789
  return runBuildCommand(...args);
13790
13790
  };
13791
13791
  const defaultRunCreateCommand = async (...args) => {
13792
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-Bmp9E1n8.cjs'); });
13792
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-Cww0mYrn.cjs'); });
13793
13793
  return runCreateCommand(...args);
13794
13794
  };
13795
13795
  const defaultRunDevCommand = async (...args) => {
13796
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-BntAFyWR.cjs'); }).then(function (n) { return n.dev; });
13796
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-Dd2_LjFP.cjs'); }).then(function (n) { return n.dev; });
13797
13797
  return runDevCommand(...args);
13798
13798
  };
13799
13799
  const defaultRunDoctorCommand = async (...args) => {
13800
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-t3YMD3qv.cjs'); });
13800
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-DTDwA9UZ.cjs'); });
13801
13801
  return runDoctorCommand(...args);
13802
13802
  };
13803
13803
  const defaultRunSkillInstallCommand = async (...args) => {
13804
- const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-DuVDTrA2.cjs'); });
13804
+ const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-lsh9bXs0.cjs'); });
13805
13805
  return runSkillInstallCommand(...args);
13806
13806
  };
13807
13807
  const defaultRunRemoteCommand = async (...args) => {
13808
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-CBH04z6v.cjs'); });
13808
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-zyWYZ-W8.cjs'); });
13809
13809
  return runRemoteCommand(...args);
13810
13810
  };
13811
13811
  function resolveStandaloneLogger(options, verbose) {
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-VP8boR-7.cjs');
3
+ var index$2 = require('./index-B5jxW7GS.cjs');
4
4
  var require$$0$3 = require('fs');
5
5
  var require$$0$2 = require('crypto');
6
6
  var require$$1$2 = require('path');
7
7
  var require$$0$5 = require('assert');
8
8
  var require$$0$4 = require('events');
9
9
  var require$$1$1 = require('util');
10
- var runtimePermissionEnv = require('./runtime-permission-env-CVYOOxPB.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-C7QvBZp0.cjs');
11
11
  var require$$0$7 = require('net');
12
12
  var require$$0$6 = require('url');
13
13
  var require$$2$1 = require('http');
@@ -11,8 +11,8 @@ var require$$0$4 = require('url');
11
11
  var require$$0 = require('zlib');
12
12
  var require$$0$1 = require('buffer');
13
13
  var require$$1 = require('util');
14
- var index = require('./index-VP8boR-7.cjs');
15
- var dev = require('./dev-BntAFyWR.cjs');
14
+ var index = require('./index-B5jxW7GS.cjs');
15
+ var dev = require('./dev-Dd2_LjFP.cjs');
16
16
  require('node:module');
17
17
  require('node:fs');
18
18
  require('node:fs/promises');
@@ -27,11 +27,11 @@ require('node:os');
27
27
  require('node:net');
28
28
  require('node:dns/promises');
29
29
  require('node:http');
30
- require('./context-BH7BZPoY.cjs');
31
- require('./runtime-permission-env-CVYOOxPB.cjs');
32
- require('./version-Df-F-uhW.cjs');
30
+ require('./context-CcJDF3v_.cjs');
31
+ require('./runtime-permission-env-C7QvBZp0.cjs');
32
+ require('./version-CoWxDzB4.cjs');
33
33
  require('node:async_hooks');
34
- require('./session-BEpV8CZQ.cjs');
34
+ require('./session-DN0ZLQC2.cjs');
35
35
  require('fs');
36
36
  require('constants');
37
37
  require('undici');
@@ -41,7 +41,7 @@ require('node:buffer');
41
41
  require('node:url');
42
42
  require('node:util');
43
43
  require('node:child_process');
44
- require('./project-vite-BfJ5TGoA.cjs');
44
+ require('./project-vite-DpQOovxh.cjs');
45
45
  require('node:zlib');
46
46
 
47
47
  var bufferUtil = {exports: {}};
@@ -3,9 +3,9 @@
3
3
  var promises = require('node:readline/promises');
4
4
  var node_crypto = require('node:crypto');
5
5
  var node_http = require('node:http');
6
- var session = require('./session-BEpV8CZQ.cjs');
6
+ var session = require('./session-DN0ZLQC2.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-VP8boR-7.cjs');
8
+ var index = require('./index-B5jxW7GS.cjs');
9
9
  require('node:path');
10
10
  require('fs');
11
11
  require('constants');
@@ -5,7 +5,7 @@ var fs$1 = require('node:fs/promises');
5
5
  var node_module = require('node:module');
6
6
  var path = require('node:path');
7
7
  var node_url = require('node:url');
8
- var index = require('./index-VP8boR-7.cjs');
8
+ var index = require('./index-B5jxW7GS.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  var promises = require('node:readline/promises');
4
- var index = require('./index-VP8boR-7.cjs');
5
- var session = require('./session-BEpV8CZQ.cjs');
4
+ var index = require('./index-B5jxW7GS.cjs');
5
+ var session = require('./session-DN0ZLQC2.cjs');
6
6
  var childProcess = require('node:child_process');
7
7
  var fs = require('node:fs');
8
8
  var fs$1 = require('node:fs/promises');
9
9
  var path = require('node:path');
10
- var runtimePermissionEnv = require('./runtime-permission-env-CVYOOxPB.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-C7QvBZp0.cjs');
11
11
  var node_crypto = require('node:crypto');
12
12
  require('node:zlib');
13
13
  var runtimeGate = require('./runtime-gate-BWb8QIcX.cjs');
14
- var context = require('./context-BH7BZPoY.cjs');
14
+ var context = require('./context-CcJDF3v_.cjs');
15
15
  require('node:module');
16
16
  require('path');
17
17
  require('os');
@@ -24,7 +24,7 @@ require('buffer');
24
24
  require('util');
25
25
  require('fs');
26
26
  require('constants');
27
- require('./version-Df-F-uhW.cjs');
27
+ require('./version-CoWxDzB4.cjs');
28
28
  require('node:async_hooks');
29
29
 
30
30
  async function getCDNUploadInfo(options, runtime = {}) {
@@ -69,6 +69,7 @@ async function precheckUserMiniprogramVersion(options, runtime = {}) {
69
69
  // 展示资料由服务端沿用 last approved 或注入默认名/默认图;CLI 不传 name/icon/cover。
70
70
  ...(options.version ? { version: options.version } : {}),
71
71
  ...(options.source_version ? { source_version: options.source_version } : {}),
72
+ ...(options.manifest ? { manifest: JSON.stringify(options.manifest) } : {}),
72
73
  release_note: options.releaseNote,
73
74
  auto_publish: String(options.autoPublish),
74
75
  }, runtime);
@@ -274,7 +275,7 @@ function createDefaultCosClient(uploadToken, COS) {
274
275
  };
275
276
  }
276
277
  async function loadCosConstructor() {
277
- const cosModule = await Promise.resolve().then(function () { return require('./index-CjP8Qye_.cjs'); }).then(function (n) { return n.index; });
278
+ const cosModule = await Promise.resolve().then(function () { return require('./index-BKbdNtX4.cjs'); }).then(function (n) { return n.index; });
278
279
  return cosModule.default;
279
280
  }
280
281
  function formatSize(bytes) {
@@ -517,6 +518,7 @@ async function runDeployCommand(options, runtime = {}) {
517
518
  const fromVersion = options.fromVersion?.trim();
518
519
  const declaredPlatforms = fromVersion ? undefined : runtimePermissionEnv.readMiniappPlatformsFromPackageJson(projectRoot);
519
520
  const declaredWindow = fromVersion ? undefined : runtimePermissionEnv.readMiniappWindowFromPackageJson(projectRoot);
521
+ const declaredBindAppIds = fromVersion ? undefined : runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(projectRoot);
520
522
  const releaseNote = await resolveDeployReleaseNote(options, runtime);
521
523
  const session$1 = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? session.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
522
524
  logger.debug(`Heybox API: ${apiBaseUrl}`);
@@ -600,6 +602,17 @@ async function runDeployCommand(options, runtime = {}) {
600
602
  if (version !== precheckVersion) {
601
603
  throw new Error(`dist/manifest.json.version (${version}) 与预检版本 (${precheckVersion}) 不一致,请重新 build 后再 deploy`);
602
604
  }
605
+ if (declaredBindAppIds && !areStringArraysEqual(parsedManifest.bindAppIds, declaredBindAppIds)) {
606
+ throw new Error('dist/manifest.json.bindAppIds 与 package.json#heybox.bindAppIds 不一致,请重新 build 后再 deploy');
607
+ }
608
+ await runVersionPrecheck({
609
+ session: session$1,
610
+ miniProgramId,
611
+ version,
612
+ manifest,
613
+ releaseNote,
614
+ autoPublish,
615
+ }, runtime, apiBaseUrl, projectRoot, logger);
603
616
  const uploadFiles = await logger.task('正在校验 dist 上传文件', async () => {
604
617
  const allFiles = await walkDistFiles(distDir);
605
618
  const blocked = allFiles.find((entry) => runtimePermissionEnv.relativePathContainsNodeModulesSegment(entry.relativePath));
@@ -737,6 +750,9 @@ function findProjectRoot(startDir) {
737
750
  async function readPackageJson(projectRoot) {
738
751
  return JSON.parse(await fs$1.readFile(path.join(projectRoot, 'package.json'), 'utf8'));
739
752
  }
753
+ function areStringArraysEqual(left, right) {
754
+ return left.length === right.length && left.every((value, index) => value === right[index]);
755
+ }
740
756
  async function readDeployManifest(projectRoot, logger) {
741
757
  const distDir = path.join(projectRoot, 'dist');
742
758
  const manifestPath = path.join(distDir, 'manifest.json');
@@ -756,8 +772,14 @@ async function readDeployManifest(projectRoot, logger) {
756
772
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
757
773
  }
758
774
  const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
775
+ const bindAppIds = validated.bindAppIds ?? [];
759
776
  return {
760
- manifest: { ...manifest, platforms: validated.platforms },
777
+ manifest: {
778
+ ...manifest,
779
+ platforms: validated.platforms,
780
+ ...(bindAppIds.length === 0 ? {} : { bindAppIds }),
781
+ },
782
+ bindAppIds,
761
783
  sdkVersion: validated.sdkVersion,
762
784
  version: validated.version,
763
785
  platforms: validated.platforms,
@@ -1266,9 +1288,18 @@ async function remoteInfo(options, context, runtime) {
1266
1288
  const detail = await context.api.getMiniProgramDetail(miniProgramId);
1267
1289
  const localPermissions = runtimePermissionEnv.readMiniappPermissionsFromPackageJson(context.packageJson.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
1268
1290
  const permissionViews = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, detail.runtime_permissions).views;
1269
- const output = { changed: false, miniProgramId, detail: toCamelCaseDeep(detail), permissions: permissionViews };
1291
+ const localBindAppIds = runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(context.packageJson.projectRoot);
1292
+ const currentBindApps = normalizeRemoteBoundApps(detail.bind_apps);
1293
+ const currentByID = new Map(currentBindApps.map((item) => [item.appid, item]));
1294
+ const local = localBindAppIds.map((appid) => currentByID.get(appid) ?? { appid });
1295
+ const currentIDs = new Set(currentBindApps.map((item) => item.appid));
1296
+ const added = local.filter((item) => !currentIDs.has(item.appid));
1297
+ const localIDs = new Set(localBindAppIds);
1298
+ const removed = currentBindApps.filter((item) => !localIDs.has(item.appid));
1299
+ const bindings = { local, current: currentBindApps, added, removed };
1300
+ const output = { changed: false, miniProgramId, detail: toCamelCaseDeep(detail), permissions: permissionViews, bindings };
1270
1301
  if (!options.json) {
1271
- printMiniProgramDetail(context.logger, detail, permissionViews);
1302
+ printMiniProgramDetail(context.logger, detail, permissionViews, bindings);
1272
1303
  }
1273
1304
  return finishRemoteCommand(options, runtime, output);
1274
1305
  }
@@ -1767,7 +1798,7 @@ async function promptConfirm(message, runtime) {
1767
1798
  rl.close();
1768
1799
  }
1769
1800
  }
1770
- function printMiniProgramDetail(logger, detail, permissionViews) {
1801
+ function printMiniProgramDetail(logger, detail, permissionViews, bindings) {
1771
1802
  logger.info(`Mini-program: ${detail.mini_program_id ?? '--'}`);
1772
1803
  logger.info(`Name: ${detail.name ?? '--'}`);
1773
1804
  logger.info(`Status: ${detail.status ?? '--'}`);
@@ -1786,6 +1817,34 @@ function printMiniProgramDetail(logger, detail, permissionViews) {
1786
1817
  : '';
1787
1818
  logger.info(` ${view.key}: 声明=${view.declared ? '是' : '否'}${approval} 最终=${view.effective ? '可用' : '不可用'}${configs}`);
1788
1819
  }
1820
+ if (bindings) {
1821
+ logger.info('关联游戏(本地/线上/新增/移除):');
1822
+ logger.info(` local=${formatBoundApps(bindings.local)}`);
1823
+ logger.info(` current=${formatBoundApps(bindings.current)}`);
1824
+ logger.info(` added=${formatBoundApps(bindings.added)}`);
1825
+ logger.info(` removed=${formatBoundApps(bindings.removed)}`);
1826
+ }
1827
+ }
1828
+ function normalizeRemoteBoundApps(value) {
1829
+ if (!Array.isArray(value))
1830
+ return [];
1831
+ return value.flatMap((item) => {
1832
+ if (!item || typeof item !== 'object')
1833
+ return [];
1834
+ const source = item;
1835
+ if (typeof source.appid !== 'string' || !/^[1-9]\d*$/.test(source.appid))
1836
+ return [];
1837
+ return [
1838
+ {
1839
+ appid: source.appid,
1840
+ ...(typeof source.name === 'string' && source.name.trim() ? { name: source.name.trim() } : {}),
1841
+ ...(typeof source.icon_url === 'string' && source.icon_url.trim() ? { icon_url: source.icon_url.trim() } : {}),
1842
+ },
1843
+ ];
1844
+ });
1845
+ }
1846
+ function formatBoundApps(items) {
1847
+ return items.length === 0 ? '--' : items.map((item) => (item.name ? `${item.appid}(${item.name})` : item.appid)).join(', ');
1789
1848
  }
1790
1849
  function printDeveloperEntities(logger, entities) {
1791
1850
  for (const entity of entities) {
@@ -2,7 +2,7 @@
2
2
 
3
3
  var fs = require('node:fs');
4
4
  var path = require('node:path');
5
- var version = require('./version-Df-F-uhW.cjs');
5
+ var version = require('./version-CoWxDzB4.cjs');
6
6
  require('node:crypto');
7
7
  var node_async_hooks = require('node:async_hooks');
8
8
 
@@ -2791,6 +2791,35 @@ function requireSemver () {
2791
2791
 
2792
2792
  var semverExports = requireSemver();
2793
2793
 
2794
+ const MINIAPP_BIND_APP_IDS_MAX_COUNT = 20;
2795
+ function parseMiniappBindAppIds(value, options = {}) {
2796
+ const sourceLabel = options.sourceLabel ?? 'package.json#heybox.bindAppIds';
2797
+ if (value === undefined)
2798
+ return Object.freeze([]);
2799
+ if (!Array.isArray(value))
2800
+ throw new Error(`${sourceLabel} 必须是字符串数组`);
2801
+ if (value.length > MINIAPP_BIND_APP_IDS_MAX_COUNT) {
2802
+ throw new Error(`${sourceLabel} 最多包含 ${MINIAPP_BIND_APP_IDS_MAX_COUNT} 个游戏 appid`);
2803
+ }
2804
+ const seen = new Set();
2805
+ const appIds = [];
2806
+ for (const item of value) {
2807
+ if (typeof item !== 'string' || !/^[1-9]\d*$/.test(item)) {
2808
+ throw new Error(`${sourceLabel} 包含非法游戏 appid:${String(item)}`);
2809
+ }
2810
+ const numeric = Number(item);
2811
+ if (!Number.isSafeInteger(numeric) || numeric > 2_147_483_647) {
2812
+ throw new Error(`${sourceLabel} 包含超出正 int32 范围的游戏 appid:${item}`);
2813
+ }
2814
+ if (seen.has(item))
2815
+ throw new Error(`${sourceLabel} 包含重复游戏 appid:${item}`);
2816
+ seen.add(item);
2817
+ appIds.push(item);
2818
+ }
2819
+ appIds.sort((left, right) => Number(left) - Number(right));
2820
+ return Object.freeze(appIds);
2821
+ }
2822
+
2794
2823
  const MINI_PROGRAM_PERMISSION_KEYS = [
2795
2824
  'userInfo',
2796
2825
  'steamLibrary',
@@ -3163,6 +3192,7 @@ function validateMiniappManifestForDeploy(manifest) {
3163
3192
  });
3164
3193
  const companions = validateGeneratedCompanions(manifest.companions);
3165
3194
  const window = validateMiniappWindow(manifest.window, 'manifest.window');
3195
+ const bindAppIds = parseMiniappBindAppIds(manifest.bindAppIds, { sourceLabel: 'manifest.bindAppIds' });
3166
3196
  return {
3167
3197
  version,
3168
3198
  sdkVersion,
@@ -3170,6 +3200,7 @@ function validateMiniappManifestForDeploy(manifest) {
3170
3200
  ...(permissions.permissions === undefined ? {} : { permissions: permissions.permissions }),
3171
3201
  ...(companions === undefined ? {} : { companions }),
3172
3202
  ...(window === undefined ? {} : { window }),
3203
+ ...(bindAppIds.length === 0 ? {} : { bindAppIds }),
3173
3204
  };
3174
3205
  }
3175
3206
  function validateGeneratedCompanions(value) {
@@ -3734,6 +3765,11 @@ function readMiniappPermissionsFromPackageJson(root, sdkVersion) {
3734
3765
  sdkVersion,
3735
3766
  });
3736
3767
  }
3768
+ function readMiniappBindAppIdsFromPackageJson(root) {
3769
+ const { packageJson } = readMiniappPackageJson(root);
3770
+ const heybox = readMiniappHeyboxConfig(packageJson);
3771
+ return parseMiniappBindAppIds(heybox?.bindAppIds);
3772
+ }
3737
3773
  function resolveMiniappSdkVersion() {
3738
3774
  if (!version.HB_SDK_VERSION.startsWith('__HB_SDK_'))
3739
3775
  return version.HB_SDK_VERSION;
@@ -3889,6 +3925,7 @@ exports.normalizeRelativePath = normalizeRelativePath;
3889
3925
  exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
3890
3926
  exports.parseMiniappManifestJson = parseMiniappManifestJson;
3891
3927
  exports.prepareMiniappArtifactFiles = prepareMiniappArtifactFiles;
3928
+ exports.readMiniappBindAppIdsFromPackageJson = readMiniappBindAppIdsFromPackageJson;
3892
3929
  exports.readMiniappPermissionsFromPackageJson = readMiniappPermissionsFromPackageJson;
3893
3930
  exports.readMiniappPlatformsFromPackageJson = readMiniappPlatformsFromPackageJson;
3894
3931
  exports.readMiniappWindowFromPackageJson = readMiniappWindowFromPackageJson;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-VP8boR-7.cjs');
3
+ var index = require('./index-B5jxW7GS.cjs');
4
4
  var node_crypto = require('node:crypto');
5
5
  var path = require('node:path');
6
6
  var require$$0$2 = require('fs');
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var version = require('./version-Df-F-uhW.cjs');
3
+ var version = require('./version-CoWxDzB4.cjs');
4
4
  var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var childProcess = require('node:child_process');
7
- var index = require('./index-VP8boR-7.cjs');
7
+ var index = require('./index-B5jxW7GS.cjs');
8
8
  require('node:module');
9
9
  require('node:fs');
10
10
  require('path');
@@ -3,6 +3,6 @@
3
3
  /** 构建时替换为当前发布包的实际版本。 */
4
4
  const HB_SDK_VERSION = typeof undefined === 'string'
5
5
  ? undefined
6
- : '0.8.1-alpha.14';
6
+ : '0.8.1-alpha.16';
7
7
 
8
8
  exports.HB_SDK_VERSION = HB_SDK_VERSION;