expo-harmony-toolkit 1.9.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -9,7 +9,7 @@
9
9
  <p>
10
10
  <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/actions/workflows/ci.yml"><img alt="Checks" src="https://img.shields.io/badge/checks-passing-16a34a?style=flat-square&logo=githubactions&logoColor=white"></a>
11
11
  <a href="./LICENSE"><img alt="License" src="https://img.shields.io/badge/license-MIT-0f766e?style=flat-square"></a>
12
- <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/releases"><img alt="Version" src="https://img.shields.io/badge/version-v1.9.0-111827?style=flat-square"></a>
12
+ <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/releases"><img alt="Version" src="https://img.shields.io/badge/version-v1.9.1-111827?style=flat-square"></a>
13
13
  <a href="./docs/support-matrix.md"><img alt="Matrix" src="https://img.shields.io/badge/matrix-expo55--rnoh082--ui--stack-2563eb?style=flat-square"></a>
14
14
  <img alt="Input" src="https://img.shields.io/badge/input-Managed%2FCNG%20%2B%20bare%20intake-059669?style=flat-square">
15
15
  </p>
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
 
26
26
  > [!IMPORTANT]
27
- > `v1.9.0` keeps the `verified + preview + experimental` model and brings bare workflow intake, five app foundation modules, and the `react-native-gesture-handler` formal slice onto the mainline tracker. The public promise remains tighter: `latest` only carries fully accepted `verified` capabilities, while `next` is reserved for preview fast-track work. The expanded goal still does not widen the current `verified` boundary yet.
27
+ > `v1.9.1` keeps the `v1.9.0` bare workflow intake, app foundation modules, and `react-native-gesture-handler` formal slice, and adds a local HAR normalize opt-out for `build-hap`. The public promise remains tighter: `latest` only carries fully accepted `verified` capabilities, while `next` is reserved for preview fast-track work. The expanded goal still does not widen the current `verified` boundary yet.
28
28
 
29
29
  > [!TIP]
30
30
  > The two validated `@react-native-oh-tpl/*` adapters in the public matrix are currently consumed via exact Git URLs and commits. For repository development and the official UI-stack sample, prefer `pnpm install --ignore-scripts` so adapter prepare hooks do not fail on private upstream resources.
@@ -48,7 +48,7 @@
48
48
  <!-- GENERATED:readme-current-status:start -->
49
49
  | Item | Status |
50
50
  | --- | --- |
51
- | Current version | `v1.9.0` |
51
+ | Current version | `v1.9.1` |
52
52
  | Support model | `verified + preview + experimental` |
53
53
  | Public `verified` matrix | `expo55-rnoh082-ui-stack` |
54
54
  | Supported input | Managed/CNG Expo projects; bare workflow intake baseline |
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  <p>
10
10
  <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/actions/workflows/ci.yml"><img alt="Checks" src="https://img.shields.io/badge/checks-passing-16a34a?style=flat-square&logo=githubactions&logoColor=white"></a>
11
11
  <a href="./LICENSE"><img alt="License" src="https://img.shields.io/badge/license-MIT-0f766e?style=flat-square"></a>
12
- <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/releases"><img alt="Version" src="https://img.shields.io/badge/version-v1.9.0-111827?style=flat-square"></a>
12
+ <a href="https://github.com/BlackishGreen33/Expo-Harmony-Toolkit/releases"><img alt="Version" src="https://img.shields.io/badge/version-v1.9.1-111827?style=flat-square"></a>
13
13
  <a href="./docs/support-matrix.md"><img alt="Matrix" src="https://img.shields.io/badge/matrix-expo55--rnoh082--ui--stack-2563eb?style=flat-square"></a>
14
14
  <img alt="Input" src="https://img.shields.io/badge/input-Managed%2FCNG%20%2B%20bare%20intake-059669?style=flat-square">
15
15
  </p>
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
 
26
26
  > [!IMPORTANT]
27
- > `v1.9.0` 延续 `verified + preview + experimental` 三层支持模型,并把 bare workflow intake、五个 app foundation modules 与 `react-native-gesture-handler` formal slice 纳入主线追踪。当前公开承诺仍然收紧为:`latest` 只承诺完整验收的 `verified` 能力,`next` 用于 preview fast track。目标扩大不等于当前 `verified` 边界已经放宽。
27
+ > `v1.9.1` 延续 `v1.9.0` bare workflow intakeapp foundation modules 与 `react-native-gesture-handler` formal slice,并为 `build-hap` 增加本地 HAR normalize opt-out。当前公开承诺仍然收紧为:`latest` 只承诺完整验收的 `verified` 能力,`next` 用于 preview fast track。目标扩大不等于当前 `verified` 边界已经放宽。
28
28
 
29
29
  > [!TIP]
30
30
  > 由于当前公开矩阵内的两套 `@react-native-oh-tpl/*` adapter 依赖以 Git URL + exact commit 形式接入,仓库开发和官方 UI-stack sample 推荐使用 `pnpm install --ignore-scripts`,避免 Git adapter 在 prepare 阶段拉取私有资源而中断安装。
@@ -48,7 +48,7 @@
48
48
  <!-- GENERATED:readme-current-status:start -->
49
49
  | 项目 | 说明 |
50
50
  | --- | --- |
51
- | 当前版本 | `v1.9.0` |
51
+ | 当前版本 | `v1.9.1` |
52
52
  | 支持模型 | `verified + preview + experimental` |
53
53
  | 唯一 `verified` 公开矩阵 | `expo55-rnoh082-ui-stack` |
54
54
  | 输入范围 | Managed/CNG Expo 项目;bare workflow intake baseline |
package/build/cli.js CHANGED
@@ -40,6 +40,7 @@ async function run(argv = process.argv) {
40
40
  .description('Build a Harmony HAP from the validated sidecar and bundle outputs')
41
41
  .option('-p, --project-root <path>', 'path to the Expo project')
42
42
  .option('--mode <mode>', 'build mode: debug or release', 'debug')
43
+ .option('--no-har-normalize', 'let ohpm consume file:*.har dependencies without extracting local HARs')
43
44
  .action(buildHap_1.runBuildHapCommand);
44
45
  program
45
46
  .command('init')
@@ -1,5 +1,6 @@
1
1
  export interface BuildHapCommandOptions {
2
2
  projectRoot?: string;
3
3
  mode?: 'debug' | 'release';
4
+ harNormalize?: boolean;
4
5
  }
5
6
  export declare function runBuildHapCommand(options: BuildHapCommandOptions): Promise<void>;
@@ -17,6 +17,7 @@ async function runBuildHapCommand(options) {
17
17
  }
18
18
  const report = await (0, build_1.buildHapProject)(projectRoot, {
19
19
  mode,
20
+ skipHarNormalize: options.harNormalize === false,
20
21
  });
21
22
  await (0, metadata_1.writeBuildReport)(projectRoot, report);
22
23
  if (report.status === 'failed') {
@@ -2,6 +2,7 @@ import type { BuildReport } from '../types';
2
2
  import type { CommandRunner } from './build/commands';
3
3
  export type { CommandRunner, CommandRunnerResult } from './build/commands';
4
4
  export { renderBuildReport } from './build/reporting';
5
+ export declare const SKIP_HAR_NORMALIZE_WARNING = "Local HAR normalization is disabled; ohpm will consume file:*.har dependencies directly and normalized build-profile/RNOH compatibility steps will be skipped.";
5
6
  interface BundleProjectOptions {
6
7
  env?: NodeJS.ProcessEnv;
7
8
  runner?: CommandRunner;
@@ -11,6 +12,7 @@ interface BuildHapProjectOptions {
11
12
  mode: 'debug' | 'release';
12
13
  env?: NodeJS.ProcessEnv;
13
14
  runner?: CommandRunner;
15
+ skipHarNormalize?: boolean;
14
16
  }
15
17
  export declare function bundleProject(projectRoot: string, options?: BundleProjectOptions): Promise<BuildReport>;
16
18
  export declare function buildHapProject(projectRoot: string, options: BuildHapProjectOptions): Promise<BuildReport>;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.renderBuildReport = void 0;
6
+ exports.SKIP_HAR_NORMALIZE_WARNING = exports.renderBuildReport = void 0;
7
7
  exports.bundleProject = bundleProject;
8
8
  exports.buildHapProject = buildHapProject;
9
9
  exports.getDesiredHarmonyScripts = getDesiredHarmonyScripts;
@@ -20,6 +20,7 @@ const reporting_1 = require("./build/reporting");
20
20
  const rnohCompatibility_1 = require("./build/rnohCompatibility");
21
21
  var reporting_2 = require("./build/reporting");
22
22
  Object.defineProperty(exports, "renderBuildReport", { enumerable: true, get: function () { return reporting_2.renderBuildReport; } });
23
+ exports.SKIP_HAR_NORMALIZE_WARNING = 'Local HAR normalization is disabled; ohpm will consume file:*.har dependencies directly and normalized build-profile/RNOH compatibility steps will be skipped.';
23
24
  async function bundleProject(projectRoot, options = {}) {
24
25
  const runtimeEnv = options.env ?? process.env;
25
26
  const runCommand = options.runner ?? commands_1.defaultCommandRunner;
@@ -193,6 +194,7 @@ async function bundleProject(projectRoot, options = {}) {
193
194
  async function buildHapProject(projectRoot, options) {
194
195
  const runtimeEnv = options.env ?? process.env;
195
196
  const runCommand = options.runner ?? commands_1.defaultCommandRunner;
197
+ const skipHarNormalize = options.skipHarNormalize === true || runtimeEnv.EXPO_HARMONY_SKIP_HAR_NORMALIZE === '1';
196
198
  const loadedProject = await (0, project_1.loadProject)(projectRoot);
197
199
  const envReport = await (0, env_1.buildEnvReport)(loadedProject.projectRoot, {
198
200
  env: runtimeEnv,
@@ -202,6 +204,9 @@ async function buildHapProject(projectRoot, options) {
202
204
  ...envReport.warnings.filter((warning) => !warning.startsWith('Harmony sidecar files are not present yet.')),
203
205
  ...relevantEnvAdvisories.map((issue) => `${issue.code}: ${issue.message}`),
204
206
  ];
207
+ if (skipHarNormalize) {
208
+ warnings.push(exports.SKIP_HAR_NORMALIZE_WARNING);
209
+ }
205
210
  const blockingIssues = [];
206
211
  if (!envReport.hvigorPath) {
207
212
  blockingIssues.push({
@@ -286,39 +291,41 @@ async function buildHapProject(projectRoot, options) {
286
291
  let restoreNormalizedRnohCliAutolinkingTemplates = async () => { };
287
292
  let restoreNormalizedRnohCodegenAlignment = async () => { };
288
293
  let restoreNormalizedHarmonyPackageJsons = async () => { };
289
- try {
290
- const normalizedLocalHarDependencies = await (0, localHar_1.normalizeLocalHarDependencies)(harmonyProjectRoot);
291
- normalizedLocalHarPackages = normalizedLocalHarDependencies.packages;
292
- restoreNormalizedDependencies = normalizedLocalHarDependencies.restore;
293
- restoreNormalizedLocalHarModules = await (0, localHar_1.ensureHarmonyBuildProfileSupportsNormalizedLocalDeps)(harmonyProjectRoot, normalizedLocalHarDependencies.packages);
294
- restoreNormalizedRnohCliAutolinkingTemplates =
295
- await (0, rnohCompatibility_1.normalizeProjectRnohCliAutolinkingTemplates)(loadedProject.projectRoot);
296
- restoreNormalizedHarmonyPackageJsons =
297
- await (0, autolinking_1.normalizeKnownHarmonyPackageJsons)(loadedProject.projectRoot);
298
- }
299
- catch (error) {
300
- const message = error instanceof Error ? error.message : String(error);
301
- return (0, reporting_1.createBuildReport)({
302
- projectRoot: loadedProject.projectRoot,
303
- command: 'build-hap',
304
- mode: options.mode,
305
- status: 'failed',
306
- harmonyProjectRoot,
307
- entryFile: bundleReport.entryFile,
308
- bundleOutputPath: bundleReport.bundleOutputPath,
309
- assetsDestPath: bundleReport.assetsDestPath,
310
- artifactPaths: [],
311
- blockingIssues: [
312
- {
313
- code: 'build.hap.failed',
314
- message,
315
- },
316
- ],
317
- warnings: [...warnings, ...bundleReport.warnings],
318
- steps,
319
- });
294
+ if (!skipHarNormalize) {
295
+ try {
296
+ const normalizedLocalHarDependencies = await (0, localHar_1.normalizeLocalHarDependencies)(harmonyProjectRoot);
297
+ normalizedLocalHarPackages = normalizedLocalHarDependencies.packages;
298
+ restoreNormalizedDependencies = normalizedLocalHarDependencies.restore;
299
+ restoreNormalizedLocalHarModules = await (0, localHar_1.ensureHarmonyBuildProfileSupportsNormalizedLocalDeps)(harmonyProjectRoot, normalizedLocalHarDependencies.packages);
300
+ restoreNormalizedRnohCliAutolinkingTemplates =
301
+ await (0, rnohCompatibility_1.normalizeProjectRnohCliAutolinkingTemplates)(loadedProject.projectRoot);
302
+ restoreNormalizedHarmonyPackageJsons =
303
+ await (0, autolinking_1.normalizeKnownHarmonyPackageJsons)(loadedProject.projectRoot);
304
+ }
305
+ catch (error) {
306
+ const message = error instanceof Error ? error.message : String(error);
307
+ return (0, reporting_1.createBuildReport)({
308
+ projectRoot: loadedProject.projectRoot,
309
+ command: 'build-hap',
310
+ mode: options.mode,
311
+ status: 'failed',
312
+ harmonyProjectRoot,
313
+ entryFile: bundleReport.entryFile,
314
+ bundleOutputPath: bundleReport.bundleOutputPath,
315
+ assetsDestPath: bundleReport.assetsDestPath,
316
+ artifactPaths: [],
317
+ blockingIssues: [
318
+ {
319
+ code: 'build.hap.failed',
320
+ message,
321
+ },
322
+ ],
323
+ warnings: [...warnings, ...bundleReport.warnings],
324
+ steps,
325
+ });
326
+ }
327
+ restoreNormalizedRnohCodegenAlignment = await (0, localHar_1.alignRnohCodegenWithNormalizedLocalPackage)(harmonyProjectRoot, normalizedLocalHarPackages);
320
328
  }
321
- restoreNormalizedRnohCodegenAlignment = await (0, localHar_1.alignRnohCodegenWithNormalizedLocalPackage)(harmonyProjectRoot, normalizedLocalHarPackages);
322
329
  const ohpmCommand = (0, commands_1.buildInvocation)(envReport.ohpmPath, ['install', '--all']);
323
330
  try {
324
331
  const ohpmResult = await runCommand(ohpmCommand.file, ohpmCommand.args, {
@@ -349,10 +356,12 @@ async function buildHapProject(projectRoot, options) {
349
356
  steps,
350
357
  });
351
358
  }
352
- if (!normalizedLocalHarPackages.some((localPackage) => localPackage.packageName === '@rnoh/react-native-openharmony')) {
353
- await (0, localHar_1.ensureRnohGeneratedTsShim)(harmonyProjectRoot);
359
+ if (!skipHarNormalize) {
360
+ if (!normalizedLocalHarPackages.some((localPackage) => localPackage.packageName === '@rnoh/react-native-openharmony')) {
361
+ await (0, localHar_1.ensureRnohGeneratedTsShim)(harmonyProjectRoot);
362
+ }
363
+ await (0, localHar_1.patchRnohGeneratedCodegenForNormalizedLocalPackage)(harmonyProjectRoot);
354
364
  }
355
- await (0, localHar_1.patchRnohGeneratedCodegenForNormalizedLocalPackage)(harmonyProjectRoot);
356
365
  await (0, localHar_1.patchKnownHarmonyAdapterCodegenOutputs)(harmonyProjectRoot);
357
366
  const hvigorCommand = (0, commands_1.buildInvocation)(envReport.hvigorPath, [
358
367
  'assembleHap',
@@ -1,6 +1,6 @@
1
1
  export declare const TOOLKIT_PACKAGE_NAME = "expo-harmony-toolkit";
2
2
  export declare const CLI_NAME = "expo-harmony";
3
- export declare const TOOLKIT_VERSION = "1.9.0";
3
+ export declare const TOOLKIT_VERSION = "1.9.1";
4
4
  export declare const TEMPLATE_VERSION = "rnoh-0.82.29";
5
5
  export declare const RNOH_VERSION = "0.82.29";
6
6
  export declare const RNOH_CLI_VERSION = "0.82.29";
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DESIRED_PACKAGE_SCRIPTS = exports.HARMONY_RUNTIME_PRELUDE_RELATIVE_PATH = exports.HARMONY_ROUTER_ENTRY_FILENAME = exports.STRICT_ENV_EXIT_CODE = exports.STRICT_DOCTOR_EXIT_CODE = exports.DEFAULT_HVIGOR_PLUGIN_FILENAME = exports.PREBUILD_METADATA_FILENAME = exports.TOOLKIT_CONFIG_FILENAME = exports.BUILD_REPORT_FILENAME = exports.ENV_REPORT_FILENAME = exports.DOCTOR_REPORT_FILENAME = exports.MANIFEST_FILENAME = exports.SIGNING_LOCAL_EXAMPLE_FILENAME = exports.SIGNING_LOCAL_FILENAME = exports.GENERATED_SHIMS_DIR = exports.GENERATED_DIR = exports.SUPPORTED_EXPO_SDKS = exports.RNOH_CLI_VERSION = exports.RNOH_VERSION = exports.TEMPLATE_VERSION = exports.TOOLKIT_VERSION = exports.CLI_NAME = exports.TOOLKIT_PACKAGE_NAME = void 0;
4
4
  exports.TOOLKIT_PACKAGE_NAME = 'expo-harmony-toolkit';
5
5
  exports.CLI_NAME = 'expo-harmony';
6
- exports.TOOLKIT_VERSION = '1.9.0';
6
+ exports.TOOLKIT_VERSION = '1.9.1';
7
7
  exports.TEMPLATE_VERSION = 'rnoh-0.82.29';
8
8
  exports.RNOH_VERSION = '0.82.29';
9
9
  exports.RNOH_CLI_VERSION = '0.82.29';
@@ -8,4 +8,4 @@ export declare const SUPPORTING_SAMPLE_PATHS: readonly ["examples/official-app-s
8
8
  export declare const VERIFIED_JS_UI_CAPABILITY_NAMES: readonly ["expo-router", "expo-linking", "expo-constants", ...("react-native-reanimated" | "react-native-svg")[]];
9
9
  export declare const PREVIEW_CAPABILITY_DEFINITIONS: import("..").CapabilityDefinition[];
10
10
  export declare const EXPERIMENTAL_CAPABILITY_NAMES: readonly string[];
11
- export declare const PUBLIC_CURRENT_VERSION = "1.9.0";
11
+ export declare const PUBLIC_CURRENT_VERSION = "1.9.1";
package/docs/cli-build.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CLI 构建指南
2
2
 
3
- `v1.9.0` 延续 `verified + preview + experimental` 支持分层,把 bare workflow 放进 intake baseline,并把五个 app foundation modules 纳入 preview shim baseline;`expo55-rnoh082-ui-stack` 仍是唯一 verified 矩阵。
3
+ `v1.9.1` 延续 `verified + preview + experimental` 支持分层,把 bare workflow 放进 intake baseline,并补上 `build-hap` 的本地 HAR normalize opt-out;`expo55-rnoh082-ui-stack` 仍是唯一 verified 矩阵。
4
4
 
5
5
  CLI 命令集合不变:
6
6
 
@@ -105,6 +105,27 @@ expo-harmony env --strict
105
105
  expo-harmony build-hap --mode debug
106
106
  ```
107
107
 
108
+ ### HAR normalize opt-out
109
+
110
+ 默认情况下,`build-hap` 会把 root / entry `oh-package.json5` 里的 `file:*.har` 本地依赖解压到 `harmony/expo-harmony-local-deps`,再让 `ohpm` 消费解压后的目录。这条路径仍是默认 verified build path。
111
+
112
+ 如果项目已经确认当前 DevEco / ohpm 能直接消费纯 HAR,可以显式跳过这一步:
113
+
114
+ ```bash
115
+ EXPO_HARMONY_SKIP_HAR_NORMALIZE=1 expo-harmony build-hap --mode debug
116
+ expo-harmony build-hap --mode debug --no-har-normalize
117
+ ```
118
+
119
+ 开启后:
120
+
121
+ - `file:../node_modules/.../*.har` specifier 会保持原样
122
+ - 不生成 `expo-harmony-local-deps`
123
+ - 不临时注册 normalized local HAR modules 到 `build-profile.json5`
124
+ - 不执行依赖 normalized local RNOH 目录的 codegen / path 兜底
125
+ - `ohpm install --all` 与 `hvigor assembleHap` 继续执行
126
+
127
+ 该开关是 escape hatch,不代表 opt-out 路径和默认路径具备完全相同的兼容兜底。
128
+
108
129
  ### Release
109
130
 
110
131
  ```bash
package/docs/roadmap.md CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  ## 当前主线
68
68
 
69
- `v1.8.x` 已完成 repo 内可收口项,当前主线切到 `v1.9.x`。`v1.9.0` 先落 bare workflow baseline、app foundation modules 与 `react-native-gesture-handler` formal slice;剩余需要真机或 release HAP 的证据继续保留在 v1.8.x capability board,不阻塞 v1.9.x 的 bare / foundation / third-party onboarding 工作。
69
+ `v1.8.x` 已完成 repo 内可收口项,当前主线切到 `v1.9.x`。`v1.9.0` 先落 bare workflow baseline、app foundation modules 与 `react-native-gesture-handler` formal slice;`v1.9.1` 作为 build-hap patch release,补上 HAR normalize opt-out,让已确认 ohpm 可直接消费纯 HAR 的项目可以绕过 `expo-harmony-local-deps`。剩余需要真机或 release HAP 的证据继续保留在 v1.8.x capability board,不阻塞 v1.9.x 的 bare / foundation / third-party onboarding 工作。
70
70
 
71
71
  ### v1.8.0 Intake Hardening + Parallel Promotion
72
72
 
@@ -153,7 +153,28 @@
153
153
  - acceptance 记录
154
154
  - 本阶段不改变 `verified` 边界;foundation modules 以 `preview` + `runtimeMode=shim` 记录,`react-native-gesture-handler` 以 `experimental` + formal adapter slice 记录
155
155
 
156
- ### v1.9.1 Third-party Native Wave A
156
+ ### v1.9.1 Build HAP HAR Normalize Opt-out
157
+
158
+ 目标日期:`2026-06-02`
159
+
160
+ 目标:把 issue #1 中的本地 HAR 解压 opt-out 做成正式 patch release,同时不改变默认 verified build path。
161
+
162
+ - `build-hap` 新增显式 opt-out:
163
+ - `EXPO_HARMONY_SKIP_HAR_NORMALIZE=1`
164
+ - `expo-harmony build-hap --no-har-normalize`
165
+ - 默认继续执行现有 `normalizeLocalHarDependencies` 路径:
166
+ - 解压 `file:*.har` 到 `expo-harmony-local-deps`
167
+ - 临时改写 root / entry `oh-package.json5`
168
+ - 注册 normalized local HAR modules
169
+ - 执行依赖 normalized local package 的 RNOH codegen / path 兜底
170
+ - opt-out 开启后:
171
+ - 保留 `file:../node_modules/.../*.har`
172
+ - 让 `ohpm install --all` 直接消费纯 HAR
173
+ - 在 build report / CLI 文档里明确提示跳过的自动兜底
174
+ - 本阶段只改变 build-hap escape hatch,不扩大 `verified` 能力边界
175
+ - `v1.9.0` 已经存在于 npm `next`,本阶段发布为 `v1.9.1` 并进入 `latest`
176
+
177
+ ### v1.9.2 Third-party Native Wave A
157
178
 
158
179
  目标日期:`2026-09-30`
159
180
 
@@ -172,7 +193,7 @@
172
193
  - debug + release evidence
173
194
  - 任何进入 Wave A 的 blocker,都不允许继续停留在“矩阵外模糊探索”
174
195
 
175
- ### v1.9.2 Third-party Native Wave B + Regression Farm
196
+ ### v1.9.3 Third-party Native Wave B + Regression Farm
176
197
 
177
198
  目标日期:`2026-10-31`
178
199
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-harmony-toolkit",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
4
4
  "description": "面向 Managed/CNG Expo 项目的 HarmonyOS 迁移、准入检查与 UI-stack 构建工具链",
5
5
  "main": "app.plugin.js",
6
6
  "types": "build/index.d.ts",