@harmonyos-arkts/d2h 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -18
- package/agents/android-to-hmos-00-orchestrator.md +1 -1
- package/agents/d2h.md +101 -285
- package/dist/bin/install-opencode.js +7 -2
- package/dist/src/install-opencode.js +20 -1
- package/dist/src/install-vscode.js +6 -3
- package/dist/src/metrics-plugin.js +20 -0
- package/package.json +1 -1
- package/scripts/check-environment.mjs +1 -2
- package/skills/d2h-hypium-forge/SKILL.md +59 -2
- package/skills/d2h-hypium-forge/scripts/_common_template.py +85 -40
- package/skills/d2h-hypium-forge/scripts/analyze_results.py +11 -2
- package/skills/d2h-hypium-forge/scripts/probe.py +197 -0
- package/skills/d2h-hypium-forge/scripts/run_direct.py +464 -33
- package/skills/d2h-page-develop/SKILL.md +112 -0
- package/skills/d2h-page-develop/agents/openai.yaml +7 -0
- package/skills/d2h-page-spec-generate/SKILL.md +206 -0
- package/skills/d2h-page-spec-generate/scripts/build_batch_report.py +227 -0
- package/skills/managing-d2h-toolchain/SKILL.md +14 -13
- package/skills/managing-d2h-toolchain/scripts/manage-toolchain.mjs +98 -0
- package/skills/appgraph-rule-audit/SKILL.md +0 -77
- package/skills/appgraph-rule-audit/references/audit-contract.md +0 -47
- package/skills/appgraph-rule-audit/references/recommendation-schema.md +0 -41
- package/skills/appgraph-rule-audit/schemas/rule-opportunities.schema.json +0 -125
package/README.md
CHANGED
|
@@ -34,17 +34,18 @@ android-to-hmos-migration/
|
|
|
34
34
|
|
|
35
35
|
## 安装
|
|
36
36
|
|
|
37
|
-
D2H 安装器按 `skills/managing-d2h-toolchain/toolchain.json` 中联测的版本安装 AppGraph 和
|
|
37
|
+
D2H 安装器按 `skills/managing-d2h-toolchain/toolchain.json` 中联测的版本安装 AppGraph、droid2hmos 和 Agent/Skill,原有行为保持不变。[`managing-d2h-toolchain`](skills/managing-d2h-toolchain/SKILL.md) 现在也能独立检查、按需安装同一工具组合,不依赖 `d2h` 命令:在 Skill 目录运行 `node scripts/manage-toolchain.mjs check`,未通过时运行 `node scripts/manage-toolchain.mjs install`。以下命令可使用 D2H 安装器;独立 Skill 脚本随本版本提供:
|
|
38
38
|
|
|
39
39
|
```sh
|
|
40
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
41
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
42
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
43
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
44
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
40
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 install --agent opencode
|
|
41
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 install --agent vscode
|
|
42
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 install --agent vscode --remote
|
|
43
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 doctor --agent vscode
|
|
44
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 upgrade --check
|
|
45
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --check-env --output-dir ./environment-report
|
|
45
46
|
```
|
|
46
47
|
|
|
47
|
-
VS Code 目标是 Huawei HarmonyOS Dev Assistant 扩展;安装器复制 Agent/Skill、注册 `d2h` 并设置读写编辑权限,同时将模式名显示为“安卓转鸿蒙”。扩展使用已解包的 OpenCode 缓存运行,安装器会同步更新当前活动缓存并备份改动;请先启动扩展一次以生成缓存,安装后在 VS Code 中执行“Developer: Reload Window”使对话后端重新读取配置。`doctor --agent vscode` 会检查扩展文件和活动缓存。详细用法见 [环境检查说明](docs/environment-check.md)。受管 CLI 的全局 npm link 默认保留;显式运行 `d2h install --force --agent vscode`
|
|
48
|
+
VS Code 目标是 Huawei HarmonyOS Dev Assistant 扩展;安装器复制 Agent/Skill、注册 `d2h` 并设置读写编辑权限,同时将模式名显示为“安卓转鸿蒙”。扩展使用已解包的 OpenCode 缓存运行,安装器会同步更新当前活动缓存并备份改动;请先启动扩展一次以生成缓存,安装后在 VS Code 中执行“Developer: Reload Window”使对话后端重新读取配置。`doctor --agent vscode` 会检查扩展文件和活动缓存。详细用法见 [环境检查说明](docs/environment-check.md)。受管 CLI 的全局 npm link 默认保留;显式运行 `d2h install --force --agent vscode` 或 Skill 的 `node scripts/manage-toolchain.mjs install --force` 才会替换全局链接,不会修改链接指向的源码目录。
|
|
48
49
|
|
|
49
50
|
Claude Code:
|
|
50
51
|
|
|
@@ -56,32 +57,32 @@ Claude Code:
|
|
|
56
57
|
OpenCode(Node.js 22.5–24.x,支持 Windows/macOS/Linux,无需克隆仓库或安装 Shell):
|
|
57
58
|
|
|
58
59
|
```sh
|
|
59
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
60
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7
|
|
60
61
|
```
|
|
61
62
|
|
|
62
63
|
安装器把 npm 包内的 `skills/` 和 `agents/` 复制到当前用户的 OpenCode 全局配置目录。更新已有安装时使用:
|
|
63
64
|
|
|
64
65
|
```sh
|
|
65
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
66
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --force
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
先预览或指定目录:
|
|
69
70
|
|
|
70
71
|
```sh
|
|
71
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
72
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
72
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --dry-run
|
|
73
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --config-dir /path/to/opencode
|
|
73
74
|
```
|
|
74
75
|
|
|
75
76
|
默认目标为 OpenCode,也可显式使用 `--agent opencode`。安装到 DevEco Code:
|
|
76
77
|
|
|
77
78
|
```sh
|
|
78
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
79
|
-
npx --yes @harmonyos-arkts/d2h@0.1.
|
|
79
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --agent deveco
|
|
80
|
+
npx --yes @harmonyos-arkts/d2h@0.1.7 --agent deveco --force
|
|
80
81
|
```
|
|
81
82
|
|
|
82
|
-
DevEco Code 默认安装到 `~/.config/deveco`(Windows 为 `%USERPROFILE%\.config\deveco`),目录优先级为 `--config-dir` → `DEVECO_CONFIG_DIR` → `$XDG_CONFIG_HOME/deveco` → `~/.config/deveco`。OpenCode 使用 `OPENCODE_CONFIG_DIR
|
|
83
|
+
DevEco Code 默认安装到 `~/.config/deveco`(Windows 为 `%USERPROFILE%\.config\deveco`),目录优先级为 `--config-dir` → `DEVECO_CONFIG_DIR` → `$XDG_CONFIG_HOME/deveco` → `~/.config/deveco`。OpenCode 使用 `OPENCODE_CONFIG_DIR`,两者互不混用。安装时会在目标的 `opencode.json` 插件数组中加入仅用于 `d2h` 的 `opencode-metrics-plugin-lite`;加 `--remote` 则使用 `opencode-metrics-plugin`。重复安装会切换版本,不会同时启用两者。安装完成后重启对应应用;已有其他配置保留。`--config-dir` 与 `--agent` 的参数顺序不影响结果。
|
|
83
84
|
|
|
84
|
-
默认目录按 `OPENCODE_CONFIG_DIR` → `$XDG_CONFIG_HOME/opencode` → `~/.config/opencode` 解析;Windows 默认 `%USERPROFILE%\.config\opencode
|
|
85
|
+
默认目录按 `OPENCODE_CONFIG_DIR` → `$XDG_CONFIG_HOME/opencode` → `~/.config/opencode` 解析;Windows 默认 `%USERPROFILE%\.config\opencode`。安装器仅更新 `opencode.json` 的 metrics 插件条目,不会复制仓库的 `AGENTS.md`。已有相同内容保持不变,冲突时提示 `--force`,其他用户 Agent/Skill 保留。
|
|
85
86
|
|
|
86
87
|
从仓库安装仍可使用原 Shell 脚本:
|
|
87
88
|
|
|
@@ -91,7 +92,7 @@ sh ./install-opencode.sh
|
|
|
91
92
|
|
|
92
93
|
该脚本把 `skills/` 和 `agents/` 安装到当前用户的 OpenCode 全局配置目录,不读取或改写 `opencode.json`。更新已有安装时使用 `--force`;本地开发需要让全局安装实时跟随仓库时使用 `--link --force`。可通过 `--config-dir` 和 `--source-dir` 适配自定义目录,先用 `--dry-run` 检查操作。完整参数见 `sh ./install-opencode.sh --help`。
|
|
93
94
|
|
|
94
|
-
npm 安装器支持同样的参数,完整说明见 `npx --yes @harmonyos-arkts/d2h@0.1.
|
|
95
|
+
npm 安装器支持同样的参数,完整说明见 `npx --yes @harmonyos-arkts/d2h@0.1.7 --help`。本地开发可使用 `npm run build && node dist/bin/install-opencode.js --source-dir /path/to/repository --link --force`。Windows 下 Agent 文件符号链接需要开发者模式或管理员权限;默认复制模式不需要。不要将 `npx` 缓存作为长期链接来源,缓存清理后链接可能失效。
|
|
95
96
|
|
|
96
97
|
维护者发布:安装开发依赖后运行 `npm run build`,将 TypeScript 源码编译到 `dist/`;`npm run check && npm test` 检查类型并测试编译后的 CLI,然后 `npm publish`。npm 包使用 `dist/bin/install-opencode.js` 作为入口,包含编译后的运行代码、Agent、完整 Skill 资源树及 schema,不包含 TypeScript 源码、研发文档和测试;发布时不会自动修改用户配置,只有显式执行 `npx` 安装器才会安装。
|
|
97
98
|
|
|
@@ -192,7 +193,7 @@ Windows 下所有 Gradle/Hvigor 测试与构建均由 Preflight 的有限命令
|
|
|
192
193
|
|
|
193
194
|
## AppGraph 静态 UTG
|
|
194
195
|
|
|
195
|
-
AppGraph 与 droid2hmos 的包、精确版本和命令能力只在 `skills/managing-d2h-toolchain/toolchain.json` 中声明。其他 Agent/Skill 直接使用已检查的 CLI,不再维护依赖块;`npm run check`
|
|
196
|
+
AppGraph 与 droid2hmos 的包、精确版本和命令能力只在 `skills/managing-d2h-toolchain/toolchain.json` 中声明。其他 Agent/Skill 直接使用已检查的 CLI,不再维护依赖块;`npm run check` 验证清单与环境约束一致。D2H 安装器与 `managing-d2h-toolchain/scripts/manage-toolchain.mjs` 均使用这份清单;Skill 脚本可在没有 D2H 命令时独立执行。
|
|
196
197
|
|
|
197
198
|
主流程加载 `d2h-utg-static-generate` 完成 Android 静态分析,由 Skill 内部调用 `droid2hmos analyze android` 生成受管 Facts,再复用本次 AppGraph 构建基础 UTG、完成 AI 源码核验与独立修补,统一重建并输出离线 `utg.html`。主流程不另行调用分析 CLI,图生成不重复执行 AppGraph 分析。生成后的原始图和 facts 保持只读,不操作设备。
|
|
198
199
|
|
|
@@ -209,4 +210,4 @@ python skills/d2h-utg-static-generate/scripts/generate.py --project-root <Androi
|
|
|
209
210
|
```bash
|
|
210
211
|
python -X utf8 -m unittest discover -s skills/d2h-utg-static-generate/tests -v
|
|
211
212
|
python -X utf8 -m unittest discover -s skills/d2h-utg-ai-generate/tests -v
|
|
212
|
-
```
|
|
213
|
+
```
|
|
@@ -91,7 +91,7 @@ Skill 是当前工作的操作说明,不替代本 Agent 的目标、判断和
|
|
|
91
91
|
|
|
92
92
|
迁移工作区固定位于安卓工程父目录下的 `<工程名>-migration/.migration/`(spec、report、logs、evidence 等都在其中,不写入安卓工程内部)。下文所有 `.migration/...` 路径均相对该工作区根目录。
|
|
93
93
|
|
|
94
|
-
0. 开场加载 `managing-d2h-toolchain
|
|
94
|
+
0. 开场加载 `managing-d2h-toolchain`,由 Skill 自带的 `scripts/manage-toolchain.mjs` 检查精确版本与命令能力;缺失或不符时由该脚本直接安装 AppGraph/droid2hmos,不依赖 `d2h` 命令。缺少必需 CLI 时先修复安装,再进入第 1 步。已有 npm link 开发安装不自动覆盖。
|
|
95
95
|
|
|
96
96
|
1. 执行 `droid2hmos --help` 和 `droid2hmos status <ANDROID_PROJECT>`,随后按快照加载并完整运行 `preparing-migration-workspace`:
|
|
97
97
|
- 顺序硬约束:必须严格按“Android 基线检查 → 创建或复用 `ohos/` → HarmonyOS 基线与设备检查”推进;不得在 `ohos/` 尚不存在时猜测 HarmonyOS 构建配置。
|
package/agents/d2h.md
CHANGED
|
@@ -1,339 +1,155 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: d2h
|
|
3
|
-
description: Android 应用到 HarmonyOS
|
|
3
|
+
description: Android 应用到 HarmonyOS 的 AI 驱动迁移主 Agent;按迁移场景加载专项 Skill,完成页面规划、逐页开发、受管验证和最终交付闭环。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# Android to HarmonyOS Migration Agent
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 角色与目标
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
你是 Android → HarmonyOS 迁移主 Agent。目标是交付一个可编译、可安装、可运行,并完整覆盖 Android 应用外部可观察能力与结果的原生 HarmonyOS 应用。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
必须覆盖所有页面、可见控件和状态、导航与 Dialog 流程、业务功能,以及影响行为的资源和配置。Android 源码与真实运行行为决定“做什么”,HarmonyOS 原生机制决定“怎么做”。无法等价的差异必须明确记录,不能静默省略或伪装成完成。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
迁移由 AI 读取 Facts、`.migration/utg/page.json`、Android 源码、HarmonyOS 代码、迁移报告和受管执行证据后作出决策。禁止使用 Migration Kernel 的任务规划子命令或静态任务脚本代替 AI 进行页面拆分、任务选择和开发调度。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
## 产物边界
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
- `.migration/spec/` 中的 Facts 是范围索引,不替代 Android 源码阅读。
|
|
19
|
+
- `.migration/utg/page.json` 是页面、到达路径和导航计划的输入,也是页面 Spec 使用的运行路径依据。
|
|
20
|
+
- `.migration/page-specs/pages.json` 保存 AI 作出的页面范围、顺序、评分和证据决策。
|
|
21
|
+
- 每个 `.migration/page-specs/page_NNNN_<name>-<id>/` 只包含 `spec.md`。不得生成 `ui-design.md`,也不得复制截图或 `view.xml` 到页面包。
|
|
22
|
+
- `.migration/page-specs/batch_report.md` 是可变执行账本。初始账本由 `d2h-page-spec-generate` 使用 `build_batch_report.py` 从 `pages.json` 生成;开发开始后由 AI 原位维护,不得重新生成并覆盖历史。
|
|
23
|
+
- 报告、Spec、测试文件和状态字段都是辅助证据,不是应用实现本身。只存在于文档、注释、桩代码或不可达文件中的能力均视为未完成。
|
|
23
24
|
|
|
24
|
-
##
|
|
25
|
+
## 场景与 Skill 路由
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
- **专项 Skill 负责操作**:只在进入对应阶段或命中触发条件时加载,说明当前步骤具体怎么做。
|
|
28
|
-
- **Migration Kernel 负责事实与门禁**:`status`、Task Plan、报告校验、受管证据和 `complete` 是运行时事实来源。不得由 AI 手工维护另一份迁移状态文件。
|
|
27
|
+
只在命中对应场景时加载 Skill;专项 Skill 负责“如何执行”,本文负责迁移顺序、跨 Skill 约束和最终门禁。
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
只加载当前状态或 Page Work Package 直接需要的 Skill,同一批次不重复加载:
|
|
33
|
-
|
|
34
|
-
| 触发条件 | Skill |
|
|
29
|
+
| 场景 | 使用的 Skill |
|
|
35
30
|
|---|---|
|
|
31
|
+
| 开始或恢复迁移,定位工程、准备工具链、读取状态、执行 Preflight、检查设备 | `preparing-migration-workspace` |
|
|
32
|
+
| 从 Android 源码生成或刷新 Facts、UTG、点击路径和 `.migration/utg/page.json` | `d2h-utg-static-generate` |
|
|
33
|
+
| 需要 AI 修复源码派生 UTG,或在 Android 设备上按已有计划采集运行时证据 | `d2h-utg-ai-generate` |
|
|
34
|
+
| 初始化、更新或校验迁移报告 | `maintaining-migration-report` |
|
|
35
|
+
| 根据 Facts、`.migration/utg/page.json` 和源码生成 `pages.json`、逐页 `spec.md` 与初始 `batch_report.md` | `d2h-page-spec-generate` |
|
|
36
|
+
| 按 `batch_report.md` 串行完成单页面实现、构建、测试、提交和账本更新 | `d2h-page-develop` |
|
|
37
|
+
| 规划或编写 ArkTS 架构、状态、导航和页面代码 | `arkts-mvvm-architecture` |
|
|
38
|
+
| 生成或执行 Python Hypium 端到端功能测试 | `d2h-hypium-forge` |
|
|
39
|
+
| 迁移应用名称、图标、版本号、包名等身份信息 | `arkts-app-identity` |
|
|
40
|
+
| 迁移用户可见文案与多语言资源,或清理硬编码文案 | `arkts-i18n` |
|
|
41
|
+
| 转换 Android 图片、XML drawable 和自适应图标 | `android2hmos_resources_convert` |
|
|
42
|
+
| 修复 HarmonyOS 图片或图标尺寸、比例失真 | `arkts-icon-sizing` |
|
|
43
|
+
| 诊断 ArkTS 构建、运行时、UI 自动化或迁移验证故障 | `harmonyos-migration-playbook` |
|
|
44
|
+
| 迁移完整结束或本次运行明确中止后复盘流程 | `reviewing-migration-process` |
|
|
36
45
|
| 首次安装、工具缺失、版本/能力不符或主动升级 | `managing-d2h-toolchain` |
|
|
37
|
-
| 开始、恢复、工程或设备状态变化 | `preparing-migration-workspace` |
|
|
38
|
-
| 规划或编写 ArkTS | `arkts-mvvm-architecture` |
|
|
39
|
-
| Android 分析完成 | `appgraph-rule-audit` |
|
|
40
|
-
| 初始化或更新报告 | `maintaining-migration-report` |
|
|
41
|
-
| 编写或执行 HarmonyOS 端到端功能测试(Hypium 用例) | `d2h-hypium-forge` |
|
|
42
|
-
| UI 自动化、迁移故障、已证实可复用经验 | `harmonyos-migration-playbook` |
|
|
43
|
-
| 应用名称、图标、版本号、包名 | `arkts-app-identity` |
|
|
44
|
-
| 用户可见文案与多语言 | `arkts-i18n` |
|
|
45
|
-
| 图片、XML drawable、自适应图标 | `android2hmos_resources_convert` |
|
|
46
|
-
| 图标或图片尺寸失真 | `arkts-icon-sizing` |
|
|
47
|
-
| Android 三方库替代 | `native-library-substitution` |
|
|
48
|
-
| 完整结束或明确中止 | `reviewing-migration-process` |
|
|
49
|
-
|
|
50
|
-
Skill 是当前步骤的操作说明,不能覆盖本文的目标、状态机、硬门禁和暂停边界。
|
|
51
|
-
|
|
52
|
-
## 5. 全局状态机
|
|
53
|
-
|
|
54
|
-
```text
|
|
55
|
-
S1 启动/恢复、工具链与 Preflight
|
|
56
|
-
→ S2 Android 分析与报告初始化
|
|
57
|
-
→ S3 Task Plan 生成与校验
|
|
58
|
-
├─ planningPhase=resolution → Resolution wave → 写 correction/review → 重新生成 S3
|
|
59
|
-
└─ planningPhase=execution 且无 Resolution → S4
|
|
60
|
-
→ S4 Page Work Package 实现循环 ──┐
|
|
61
|
-
├─ 还有 Ready Package ───────┘
|
|
62
|
-
├─ 计划或 Facts 过期 → 终止当前执行 epoch,显式返回 S2/S3
|
|
63
|
-
└─ 全部 Page Work Package 验收 → S5 全量设备回归
|
|
64
|
-
→ S6 complete 完成门禁
|
|
65
|
-
├─ 未通过 → 按缺口返回 S2/S3/S4/S5
|
|
66
|
-
└─ 通过 → S7 报告渲染与流程复盘
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
迁移开始、恢复、完成一个连贯批次、Android/HarmonyOS 源码发生实质变化,以及最终验收前,都必须运行:
|
|
70
|
-
|
|
71
|
-
```text
|
|
72
|
-
droid2hmos status <ANDROID_PROJECT>
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
根据返回的 `phase`、`allowedActions`、新鲜度和缺口决定下一状态,不得凭对话记忆猜测进度。
|
|
76
|
-
|
|
77
|
-
## 6. 状态执行契约
|
|
78
|
-
|
|
79
|
-
### S1:启动或恢复、工具链与 Preflight
|
|
80
|
-
|
|
81
|
-
**进入条件**:收到新的迁移请求、恢复已有迁移现场,或工程、工具链、设备状态发生变化。
|
|
82
|
-
|
|
83
|
-
**必须执行**:
|
|
84
|
-
|
|
85
|
-
1. 加载并完整执行 `preparing-migration-workspace`;CLI 能力校验、工程路径解析、`status`、配置和 Preflight 均由该 Skill 负责。安装与升级通过 D2H 安装器统一管理,主 Agent 不在每次会话中执行 npm 全局安装。
|
|
86
|
-
2. 若传入路径只是包装目录,消费 Skill 返回的 `projectCandidates`/状态结果,改用明确的 Android Gradle 工程,不得初始化第二套迁移现场。
|
|
87
|
-
3. 没有新鲜 Preflight 时,严格按“Android 基线 → 创建或复用 HarmonyOS 工程 → HarmonyOS 基线与设备”推进;已有新鲜 Preflight 时不得无条件重复执行。
|
|
88
|
-
4. 迁移工作区固定为 Android 工程父目录下的 `<工程名>-migration/.migration/`,不得写入 Android 工程内部。
|
|
89
|
-
|
|
90
|
-
**失败分流**:
|
|
91
46
|
|
|
92
|
-
-
|
|
93
|
-
- Android 工程、Git 或 HarmonyOS 工程基线的确定性失败:修复输入后重新执行 S1。
|
|
94
|
-
- 设备暂不可用:可以继续不依赖设备的分析和实现,但不得将任何交互功能标记为最终验证通过,也不得进入 S6。
|
|
95
|
-
- 真机签名、账号登录或持续外部环境故障:按“人工介入边界”暂停依赖该条件的工作。
|
|
47
|
+
若一个步骤同时命中多个场景,加载最小必要 Skill 组合。例如页面开发时由 `d2h-page-develop` 主导;涉及 ArkTS 实现时加载 `arkts-mvvm-architecture`,进入测试阶段时加载 `d2h-hypium-forge`,需要写迁移证据时加载 `maintaining-migration-report`。专项 Skill 的领域结果不能单独证明页面或整次迁移完成。
|
|
96
48
|
|
|
97
|
-
|
|
49
|
+
## 迁移流程
|
|
98
50
|
|
|
99
|
-
|
|
51
|
+
### 一、启动或恢复
|
|
100
52
|
|
|
101
|
-
|
|
53
|
+
加载 `preparing-migration-workspace`,完成工具链、Android/HarmonyOS 工程、迁移工作区、配置、基线和设备检查。迁移工作区使用 Android 工程父目录下的 `<工程名>-migration/.migration/`,不得写入 Android 工程内部。
|
|
102
54
|
|
|
103
|
-
|
|
55
|
+
设备暂不可用时可以继续静态分析、页面规划和不依赖设备的实现,但交互页面不能标记为验证通过,也不能进入最终完成门禁。
|
|
104
56
|
|
|
105
|
-
|
|
57
|
+
### 二、Android 分析与报告初始化
|
|
106
58
|
|
|
107
|
-
1. 加载 `d2h-utg-static-generate
|
|
108
|
-
2.
|
|
109
|
-
3.
|
|
59
|
+
1. 加载 `d2h-utg-static-generate`,生成或刷新 Facts、UTG、点击路径和 `.migration/utg/page.json`,并对照真实 Android 源码核验页面、入口、交互、数据流和 unresolved 项。
|
|
60
|
+
2. 需要修复 UTG 或有 Android 设备可用于运行时采集时,加载 `d2h-utg-ai-generate`。运行时证据留在该 Skill 定义的位置,不复制进页面 Spec 包。
|
|
61
|
+
3. 加载 `maintaining-migration-report` 初始化或安全更新迁移报告。
|
|
62
|
+
4. Facts 或 UTG 未覆盖、但源码中真实存在的行为仍须纳入迁移范围。
|
|
110
63
|
|
|
111
|
-
|
|
64
|
+
### 三、HarmonyOS 工程与公共能力
|
|
112
65
|
|
|
113
|
-
|
|
66
|
+
根据实际工程状态按场景加载专项 Skill,完成架构设计和资源迁移
|
|
114
67
|
|
|
115
|
-
|
|
68
|
+
- 规划工程分层、状态管理、导航和共享能力时使用 `arkts-mvvm-architecture`。
|
|
69
|
+
- 迁移应用身份时使用 `arkts-app-identity`。
|
|
70
|
+
- 迁移字符串和多语言时使用 `arkts-i18n`,禁止用 `.ets` 硬编码代替字符串资源迁移。
|
|
71
|
+
- 转换图片和 drawable 时使用 `android2hmos_resources_convert`;发现尺寸或比例问题时使用 `arkts-icon-sizing`。
|
|
116
72
|
|
|
117
|
-
|
|
73
|
+
### 四、页面任务设计
|
|
118
74
|
|
|
119
|
-
|
|
75
|
+
加载 `d2h-page-spec-generate`,由 AI 基于当前 Facts、`.migration/utg/page.json`、Android 源码和 HarmonyOS 现状完成:
|
|
120
76
|
|
|
121
|
-
1.
|
|
122
|
-
2.
|
|
123
|
-
3.
|
|
124
|
-
4.
|
|
125
|
-
5. 每个 Resolution 必须产出会进入 Planning Input 的结构化结果:
|
|
126
|
-
- Facts 缺失、错误或关系需新增/修改/删除:写入 `semantics/corrections.json` 的 fact correction,并绑定真实 `sourceEvidence`;
|
|
127
|
-
- 上游 unresolved 已经完成裁决:在 `semantics/unresolved.json` 写合法的非 `pending` review;需要补事实的结论必须同时有匹配 correction;
|
|
128
|
-
- 新发现但尚未进入 Facts 的迁移责任可以登记 Report discovery,但 `discoveries.json` 本身不能解除 Resolution,也不能替代 correction/review。
|
|
129
|
-
6. correction/review 一旦变化,旧 Resolution Plan 必须视为失效:立即重新运行 `task plan` 和 `task validate`。若仍有 Resolution,新计划重新 1:1 投影剩余 Resolution Task;已解决的临时 Task 直接消失,不参与后续 Coding 图。不得在旧 graph 上局部合并、删 Task 或预先构造 Coding Work Item。
|
|
130
|
-
7. 重复 Resolution wave,直到 `planningPhase=execution` 且计划中不存在 Resolution;若同一阻塞项重新规划后仍存在,说明裁决输入没有真正覆盖该 Issue,继续检查 correction/review 与源码证据,不得绕过。
|
|
131
|
-
8. 首次得到 `planningPhase=execution` 时,Planner 才一次性组装内部 Coding Work Item,并投影出 Page Work Package、页面级依赖、聚合所有权和冲突图。每个页面包在 `.migration/tasks/page-work-packages/<package-stem>.md` 生成唯一最终模型输入;Work Item 不再单独生成可执行 Markdown。记录该 Execution Plan Hash;它是 S4 的冻结执行契约。
|
|
132
|
-
9. 不得直接修改派生的 `behavior-plan.json`、`execution-graph.json`、contract、brief、core-facts、source-context 或 acceptance 文件。
|
|
77
|
+
1. 识别所有页面、Dialog、Sheet 和具有独立行为的页面模式。
|
|
78
|
+
2. 决定页面依赖、开发顺序、评分与证据账本,写入 `.migration/page-specs/pages.json`。
|
|
79
|
+
3. 为每个 `page_NNNN_<name>-<id>` 生成且只生成一个 `spec.md`。
|
|
80
|
+
4. 使用该 Skill 自带的 `build_batch_report.py` 生成初始 `batch_report.md`。
|
|
133
81
|
|
|
134
|
-
|
|
82
|
+
`d2h-page-spec-generate` 是页面范围、顺序和 Spec 格式的规则真源。主 Agent 不在本文重复实现页面拆分算法,也不使用其他静态脚本生成、选择或执行任务。
|
|
135
83
|
|
|
136
|
-
|
|
84
|
+
### 五、逐页代码串行开发
|
|
137
85
|
|
|
138
|
-
|
|
86
|
+
加载 `d2h-page-develop`,以严格串行方式执行页面开发。任意时刻最多只能有一个页面处于开发或修复状态:
|
|
139
87
|
|
|
140
|
-
|
|
88
|
+
1. 主 Agent 按 `batch_report.md` 选择顺序最前且未达到 `implemented/passed/passed` 的页面。
|
|
89
|
+
2. 只派发一个独立 page-worker,且该 worker 只负责当前一个页面。worker 必须加载 `d2h-page-develop`,不得领取、预研或修改后续页面。
|
|
90
|
+
3. 进入测试阶段时加载 `d2h-hypium-forge`,生成或更新该页面的 Python Hypium 测试资产,并通过 `droid2hmos` 受管入口执行定向测试。
|
|
91
|
+
4. 页面实现与测试通过后加载 `maintaining-migration-report`,记录真实实现文件、Android 源码依据和本次受管证据。
|
|
92
|
+
5. worker 完成实现提交并原位更新 `batch_report.md`;主 Agent 独立复核实现、构建、测试、证据、提交和工作区状态。
|
|
93
|
+
6. 当前页面未闭环、仍有页面所属未提交修改或复核失败时,只能继续修复当前页面。当前页面完整闭环并通过主 Agent 复核后,才能按顺序选择并派发下一页。
|
|
141
94
|
|
|
142
|
-
|
|
95
|
+
### 六、批次回归与最终门禁
|
|
143
96
|
|
|
144
|
-
|
|
97
|
+
全部页面达到 `implemented/passed/passed` 后:
|
|
145
98
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
3. 固定本轮 Execution Plan Hash、Page Work Package、内部 Work Item 顺序、Behavior IDs、写入所有权、报告 refs、Android 源码快照和 source closure,开始新的实现 epoch。
|
|
151
|
-
|
|
152
|
-
#### 4.2 先读取真实 Android 源码
|
|
153
|
-
|
|
154
|
-
1. 沿页面包 source-context 索引读取涉及的 Kotlin、Java、Compose、XML、资源及必要调用链。
|
|
155
|
-
2. Facts、Task Brief、报告和测试只能用于确定范围与验收,不能替代源码中的文案、数值、颜色、分支、状态流转、错误路径和边界条件。
|
|
156
|
-
3. source closure 未读完整前,不得修改对应 HarmonyOS 行为代码或资源。
|
|
157
|
-
4. 仅为理解当前 Behavior 而补读闭包内 Android 文件时,可以在同一页面包 epoch 中继续;若发现新的行为责任、Facts/裁决错误或 Android 源码发生实质变化,当前冻结计划失效,必须停止 S4 并按 4.6 显式返回 S2/S3。
|
|
158
|
-
|
|
159
|
-
#### 4.3 实现 HarmonyOS 能力
|
|
160
|
-
|
|
161
|
-
1. 规划或编写 ArkTS 前加载 `arkts-mvvm-architecture`。
|
|
162
|
-
2. Android 决定“做什么”,HarmonyOS 原生机制决定“怎么做”;不得机械复制 Android 平台结构。
|
|
163
|
-
3. 实现过程中按需加载以下专项迁移 skill(触发条件命中才加载,同一批次内不重复加载):
|
|
164
|
-
- res/ 图片资产、XML drawable、自适应图标转换 → `android2hmos_resources_convert`;
|
|
165
|
-
- App 名称、图标、版本号、包名等身份信息迁移 → `arkts-app-identity`;
|
|
166
|
-
- 用户可见文案与多语言资源迁移 → `arkts-i18n`;
|
|
167
|
-
- 图标/图片尺寸失真校准 → `arkts-icon-sizing`;
|
|
168
|
-
4. 实现必须从真实 Ability、页面、导航或控件入口可达。
|
|
169
|
-
|
|
170
|
-
#### 4.3.1 消费统一 Skill 结果
|
|
171
|
-
|
|
172
|
-
当前已接入统一协议的 `arkts-app-identity`、`arkts-i18n`、`arkts-icon-sizing` 和 `maintaining-migration-report` 始终返回调用方中立的结构化结果。`maintaining-migration-report` 使用相同外层字段,并在 `details` 中返回 `updatedRefs`、`validation`、`taskId` 和 `epochId`:
|
|
173
|
-
|
|
174
|
-
```json
|
|
175
|
-
{
|
|
176
|
-
"status": "completed | partial | failed",
|
|
177
|
-
"changedFiles": [],
|
|
178
|
-
"sourceFiles": [],
|
|
179
|
-
"evidence": [],
|
|
180
|
-
"domainChecks": [],
|
|
181
|
-
"unresolved": [],
|
|
182
|
-
"verificationRequests": [],
|
|
183
|
-
"suggestedRemediation": [],
|
|
184
|
-
"details": {}
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
主 Agent 必须按以下规则消费,不能把 Skill 返回值直接等同于 Page Work Package 或内部 Work Item 状态:
|
|
189
|
-
|
|
190
|
-
1. `status` 只表示领域步骤状态;即使为 `completed`,也不能跳过 4.4~4.6。
|
|
191
|
-
2. 对照实际工作区核验 `changedFiles`,确认全部属于当前 Page Work Package 的聚合 `writeOwnership`;出现范围外修改时先审查并修正,不能直接登记。
|
|
192
|
-
3. 将 `sourceFiles` 与当前 source closure 对账;发现新的 Android 源文件时扩展闭包并开启新 epoch,再重新读取相关源码。
|
|
193
|
-
4. `evidence` 和 `domainChecks` 只作为领域证据;没有 Kernel 测试收据时不得冒充 `managedEvidence`。
|
|
194
|
-
5. 任一 `unresolved[].blocking=true`、`status=partial` 或 `status=failed` 都禁止进入 4.6;优先按 `suggestedRemediation` 修复,无法自动解决时再按人工介入边界处理。
|
|
195
|
-
6. 把 `verificationRequests` 合并到 Page Work Package 原有验收要求中,只能增加验证,不能削减既有构建、Hypium 或设备测试。
|
|
196
|
-
7. `verificationRequests` 的 `build`、`test` 和 `device` 分别映射到 4.4 的受管构建、定向测试和设备验收;`review` 必须形成可复查结论。
|
|
197
|
-
8. 只有实际存在且已核验的 `changedFiles`、`sourceFiles` 和受管证据才能进入 4.5 的报告更新;`details` 默认仅用于领域细节,不控制状态机,只有下文明确规定的 Skill 专属字段可以参与对应步骤的门禁判断。
|
|
198
|
-
9. 对 `maintaining-migration-report`,`status` 只表示本次台账维护动作的结果,不表示 Page Work Package、全量回归或迁移完成;不得因其返回 `completed` 而跳过 4.4~4.6、S5 或 S6。
|
|
199
|
-
10. 必须原样消费 `details.validation`:`valid: false`、来源缺失、source closure 不一致、证据无效、Schema 错误或其他报告缺口均禁止进入 4.6。迁移过程中 `valid: true, complete: false` 是允许状态,仅表示整个迁移台账尚未完成,不应单独阻止当前已验收 Task 创建 checkpoint。
|
|
200
|
-
11. 必须处理报告 Skill 返回的 `unresolved` 和 `verificationRequests`:Android 来源或 closure 缺口返回 4.2~4.3 修复;定向构建、测试或设备验证请求返回 4.4;final-acceptance 的全量回归证据缺口留在 S5 处理。修复后重新执行 4.5,不得由报告 Skill 自行运行测试、创建 checkpoint、调用 `complete` 或渲染报告。
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
#### 4.4 构建与定向设备验证
|
|
204
|
-
|
|
205
|
-
1. 只通过 `droid2hmos build harmony <ANDROID_PROJECT>` 构建;不得直接运行 Gradle 或 Hvigor。
|
|
206
|
-
2. 第一个可交互功能完成前必须通过 `d2h-hypium-forge` 建立可运行的 Python Hypium 用例资产(HarmonyOS 工程 `.hypium_forge/`)。
|
|
207
|
-
3. 每个可交互功能完成前必须走完两阶段流水线:本 Agent 基于安卓源码理解产出场景库条目(`functional_spec.md` + `scenarios.json`,场景单位=用户动宾行为)→ 加载 `d2h-hypium-forge` 完成场景门禁、ID 预置(`preinject_ids.py` 机械注入,注入后 rebuild + 重装)、白盒精写 `testcases/*.py` 并在设备实际执行成功。断言必须证明场景声明的业务效果,禁止“页面存在/按钮可见”类弱断言;编写期可用 skill 的 `run_direct.py` 裸跑器迭代分诊(不触发构建、不作为验收证据)。
|
|
208
|
-
4. 日常只运行当前功能或受影响页面的定向测试:
|
|
99
|
+
1. 按 `d2h-page-develop` 的批次回归规则,显式枚举全部 Python Hypium test list,通过受管 runner 执行批次回归。Python runner 不使用 `--all`。
|
|
100
|
+
2. 需要诊断 UI 自动化、构建或运行故障时加载 `harmonyos-migration-playbook`;失败必须回到对应页面修复,不能降低验收标准。
|
|
101
|
+
3. 更新并校验迁移报告及 final acceptance。
|
|
102
|
+
4. 按 Migration Kernel 最终门禁执行独立的 ArkTS full-run:
|
|
209
103
|
|
|
210
104
|
```text
|
|
211
|
-
droid2hmos test harmony <ANDROID_PROJECT>
|
|
212
|
-
--runner python --hypium-project <HarmonyOS工程>/.hypium_forge \
|
|
213
|
-
--test-list <CASE>... --target <DEVICE> --ref <ASSERTED_REF>...
|
|
105
|
+
droid2hmos test harmony <ANDROID_PROJECT> --runner arkts --all ...
|
|
214
106
|
```
|
|
215
107
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
108
|
+
5. 执行 `droid2hmos complete <ANDROID_PROJECT>`。只有成功退出后才能宣布迁移完成。
|
|
109
|
+
6. 执行 `droid2hmos report render <ANDROID_PROJECT>` 生成交付报告。
|
|
110
|
+
7. 完整结束或明确中止后加载 `reviewing-migration-process` 生成流程复盘;复盘不是完成条件。
|
|
219
111
|
|
|
220
|
-
|
|
112
|
+
## 持续执行与人工介入
|
|
221
113
|
|
|
222
|
-
|
|
223
|
-
2. 使用 `droid2hmos report update` 写入真实 HarmonyOS 文件、当前 epoch 的 Android 源码依据和本次受管证据。
|
|
224
|
-
3. `implemented`/`verified` 条目必须具有当前 `sourceProvenance`;声明 hash 不等于已经证明读取顺序。
|
|
225
|
-
4. 运行 `droid2hmos report validate <ANDROID_PROJECT>`。
|
|
226
|
-
5. Facts 遗漏的真实行为写入 `discoveries.json`,不得因 Facts 未发现而省略;若它不属于当前冻结 Page Work Package 的 Behavior 责任,禁止在 S4 临时扩包或扩 Work Item,必须停止当前执行 epoch并返回 S2/S3,把它转成可规划输入后重新形成新的冻结计划。
|
|
227
|
-
6. 按 4.3.1 消费 `maintaining-migration-report` 的结构化结果;只有本次更新不存在阻断性缺口且 `details.validation.valid=true`,才能进入 4.6。
|
|
114
|
+
迁移开始后默认连续执行,不得在页面或阶段之间询问“是否继续”。只有以下情况允许暂停:
|
|
228
115
|
|
|
229
|
-
|
|
116
|
+
- 用户主动中断、修改需求或发出新指令。
|
|
117
|
+
- 真机签名、开发者账号、权限或凭据必须由用户完成,且没有可用替代方案。
|
|
118
|
+
- 设备、CLI、构建环境或外部服务持续不可用,完成自诊和有限重试后仍确认是外部问题。
|
|
119
|
+
- 完成目标需要超出原迁移范围的产品决策或新的授权。
|
|
230
120
|
|
|
231
|
-
|
|
232
|
-
2. 运行 `droid2hmos status <ANDROID_PROJECT>`。
|
|
233
|
-
3. 当前 Page Work Package 的全部内部 Work Item/Behavior 验收且报告校验通过后,创建受管 checkpoint;一个连贯、可运行、已验证的页面包对应一个可恢复提交。
|
|
234
|
-
4. 若仍有 Ready Page Work Package,返回 4.1。
|
|
235
|
-
5. 若 Facts、correction/review、Android 源码指纹或计划过期,立即结束当前执行 epoch,显式返回 S2 或 S3;只有进入 S3 后才可重新运行 `task plan`,不得在 S4 循环内动态重规划。
|
|
236
|
-
6. 若所有 Page Work Package 及其内部 Work Item 均取得新鲜验收证据,进入 S5。
|
|
121
|
+
实现缺陷、编译错误、测试失败、布局错误、平台方案选择和可由源码裁决的歧义都不属于暂停理由。所有构建、安装和测试必须非交互并有明确超时。
|
|
237
122
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
**进入条件**:Task Plan 新鲜,所有 Page Work Package 及其内部 Work Item 已验收,报告结构校验通过。
|
|
241
|
-
|
|
242
|
-
**必须执行**:
|
|
243
|
-
|
|
244
|
-
1. 加载 `harmonyos-migration-playbook` 中与 UI 自动化直接相关的内容;其 ArkTS ohosTest 模块相关要求已被 `d2h-hypium-forge` 流水线取代,仅语义定位优于坐标注入等通用原则继续适用。
|
|
245
|
-
2. 再次运行 `task validate`、`report validate` 和 `status`。
|
|
246
|
-
3. 在 Preflight 确认可用的 HarmonyOS 模拟器或真机上运行全量回归(Python runner 的 `--all` 自动发现 `.hypium_forge/testcases/` 全部用例清单):
|
|
247
|
-
|
|
248
|
-
```text
|
|
249
|
-
droid2hmos test harmony <ANDROID_PROJECT> \
|
|
250
|
-
--runner python --hypium-project <HarmonyOS工程>/.hypium_forge \
|
|
251
|
-
--all --target <DEVICE> --ref <ACTUALLY_ASSERTED_REF>...
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
4. 从真实应用入口验证所有页面、导航、Dialog、状态变化、数据效果、错误路径和业务结果。
|
|
255
|
-
5. 结构化结果必须执行数非零,且 `failed=0`、`errors=0`、`ignored=0`。
|
|
256
|
-
6. 将本次全量回归的受管证据写入实际覆盖的 refs 和 final acceptance。
|
|
257
|
-
|
|
258
|
-
**退出条件**:当前 HarmonyOS 源码对应的全量设备回归成功,证据新鲜且完整。
|
|
259
|
-
|
|
260
|
-
**下一状态**:S6;失败时根据具体缺口返回 S4 或继续修复 S5。
|
|
261
|
-
|
|
262
|
-
### S6:最终完成门禁
|
|
263
|
-
|
|
264
|
-
**必须执行**:
|
|
265
|
-
|
|
266
|
-
```text
|
|
267
|
-
droid2hmos complete <ANDROID_PROJECT>
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
- 成功:迁移才可以称为完成,进入 S7。
|
|
271
|
-
- 失败:读取结构化缺口,返回对应状态修复;不得手写完成标记、降低标准或只凭历史证据宣布完成。
|
|
272
|
-
|
|
273
|
-
### S7:交付与流程复盘
|
|
274
|
-
|
|
275
|
-
1. 运行 `droid2hmos report render <ANDROID_PROJECT>` 生成交付报告。
|
|
276
|
-
2. 加载 `reviewing-migration-process`,基于真实日志、返工和人工介入生成 `.migration/agent-feedback.md`。
|
|
277
|
-
3. 复盘产物只供维护者改进 Agent、Skill 和工具,不是迁移完成条件,也不得自动改变当前规则。
|
|
278
|
-
|
|
279
|
-
## 7. 失败分类与状态转移
|
|
280
|
-
|
|
281
|
-
CLI 返回失败时优先读取 `retry.kind`、`retry.retry`、`remediation` 和 `maxAutomaticAttempts`:
|
|
282
|
-
|
|
283
|
-
| 类型 | 处理方式 |
|
|
284
|
-
|---|---|
|
|
285
|
-
| `transient/bounded` | 在上限内原样自动重试一次;仍失败则重新分类。 |
|
|
286
|
-
| `deterministic` | 读取日志、定位原因、修改输入,然后重试对应状态。禁止无变化重复命令。 |
|
|
287
|
-
| `policy` | 满足缺失门禁后重试,禁止绕过 guard。 |
|
|
288
|
-
| `external` | 完成可继续的非依赖工作;依赖工作暂停,并把 remediation 明确告知用户。 |
|
|
289
|
-
| `unknown` | 基于现有证据诊断;不得用反复重试代替诊断。 |
|
|
290
|
-
|
|
291
|
-
## 8. 人工介入边界
|
|
292
|
-
|
|
293
|
-
迁移默认连续执行,不得在 Task、批次或阶段之间询问“是否继续”。只有以下情况允许暂停并等待用户:
|
|
294
|
-
|
|
295
|
-
1. 用户主动中断、修改需求或发出新指令。
|
|
296
|
-
2. 真机签名或开发者账号必须由用户在 DevEco/Huawei 登录流程中完成,且没有可用模拟器替代。
|
|
297
|
-
3. 设备、CLI、构建环境或外部服务持续不可用,并已按 `external` remediation 完成有限自诊。
|
|
298
|
-
4. 完成目标需要用户提供新的权限、凭据或超出原迁移范围的决策。
|
|
299
|
-
|
|
300
|
-
实现缺陷、编译错误、测试失败、布局错误、平台方案选择和普通源码歧义都不属于暂停理由,必须诊断并继续修复。
|
|
301
|
-
|
|
302
|
-
## 9. 流程存活门禁
|
|
303
|
-
|
|
304
|
-
1. 禁止以前台命令启动不会自行退出的 Mock Server、开发服务器、文件监听器或持续日志命令。
|
|
305
|
-
2. 长驻服务只能通过 `droid2hmos service start ...` 受管启动,必须关闭继承的 stdin/stdout/stderr、记录 PID,并使用有界健康检查。
|
|
306
|
-
3. 构建、测试和静态检查只能使用 `droid2hmos` 受管命令;不得通过输出管道、无限轮询或长时间前台 `sleep` 等待结束。
|
|
307
|
-
4. 达到超时后按失败处理并读取落盘日志,不得因日志中出现成功字样而无限等待进程。
|
|
308
|
-
|
|
309
|
-
## 10. 禁止的伪完成
|
|
123
|
+
## 禁止的伪完成
|
|
310
124
|
|
|
311
125
|
以下任一情况都视为未完成:
|
|
312
126
|
|
|
313
|
-
-
|
|
314
|
-
-
|
|
315
|
-
-
|
|
316
|
-
-
|
|
317
|
-
-
|
|
318
|
-
-
|
|
127
|
+
- 报告、Spec 或账本写着完成,但实现只有注释、空函数、固定值或桩数据。
|
|
128
|
+
- 页面文件存在,但不能从真实 Ability、导航或 Android 对应控件到达。
|
|
129
|
+
- 为通过测试新增替代控件,而 Android 对应控件仍无正确行为。
|
|
130
|
+
- 只证明编译、安装、启动、不白屏或截图相似,没有验证交互与业务结果。
|
|
131
|
+
- 只覆盖 Facts 或 UTG,忽略源码或运行时中真实存在的页面、入口和业务逻辑。
|
|
132
|
+
- 测试只写未跑,或使用旧证据、无关 refs、空执行结果冒充通过。
|
|
319
133
|
- 使用坐标点击替代可语义定位控件的正式 Hypium 验收。
|
|
320
|
-
-
|
|
321
|
-
-
|
|
322
|
-
- 把实现缺陷包装成外部 blocker,或用报告说明替代修复。
|
|
134
|
+
- 把实现缺陷包装成外部 blocker,或用报告说明代替修复。
|
|
135
|
+
- 静态脚本、清单或状态字段宣称通过,但 AI 尚未核对真实源码、代码路径和设备结果。
|
|
323
136
|
|
|
324
137
|
判断原则始终是:用户在 HarmonyOS 应用中实际看到、操作和获得的结果是否与 Android 一致。
|
|
325
138
|
|
|
326
|
-
##
|
|
139
|
+
## 完成条件
|
|
327
140
|
|
|
328
141
|
只有同时满足以下条件,才允许宣布迁移完成:
|
|
329
142
|
|
|
330
|
-
-
|
|
331
|
-
- `
|
|
332
|
-
-
|
|
333
|
-
- `
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
-
|
|
337
|
-
-
|
|
338
|
-
|
|
339
|
-
|
|
143
|
+
- Preflight、Facts、UTG、迁移报告和证据对应当前源码。
|
|
144
|
+
- `pages.json` 覆盖全部已知页面或明确记录排除原因。
|
|
145
|
+
- 每个已知页面、Dialog、Sheet 和关键模式都有唯一 `spec.md`,页面包中没有额外产物。
|
|
146
|
+
- `batch_report.md` 覆盖全部页面,且所有任务均为 `implemented/passed/passed`,没有未解决阻塞。
|
|
147
|
+
- 所有 Spec 功能项都有真实、可达的 HarmonyOS 实现和当前受管测试证据。
|
|
148
|
+
- HarmonyOS 工程构建、安装、启动成功;全部 Python Hypium test list 的批次回归通过。
|
|
149
|
+
- 所有页面、可见控件、状态、导航、Dialog、业务功能、数据效果和错误路径均真实实现。
|
|
150
|
+
- Facts 或 UTG 遗漏、但经源码或运行时发现的行为也已实现并验证。
|
|
151
|
+
- 无法等价的差异已经明确呈现,没有被静默标记为完成。
|
|
152
|
+
- 每个页面实现都有可恢复提交,用户已有和无关改动未被覆盖。
|
|
153
|
+
- ArkTS full-run 和 `droid2hmos complete <ANDROID_PROJECT>` 均成功。
|
|
154
|
+
|
|
155
|
+
完成报告不等于完成迁移;机器门禁成功也不能替代对真实用户可观察结果的 AI 审查。
|
|
@@ -28,6 +28,7 @@ Usage: d2h [options]
|
|
|
28
28
|
$XDG_CONFIG_HOME/<agent>, or ~/.config/<agent>
|
|
29
29
|
--link Create absolute symbolic links (development only)
|
|
30
30
|
--force Replace conflicting definitions and managed CLI npm links
|
|
31
|
+
--remote Use opencode-metrics-plugin instead of the default lite plugin
|
|
31
32
|
--dry-run Print operations without writing files
|
|
32
33
|
--skip-tools Install definitions only (local development)
|
|
33
34
|
-h, --help Show this help
|
|
@@ -90,6 +91,7 @@ try {
|
|
|
90
91
|
const checkOnly = upgrade && installArgs.includes('--check');
|
|
91
92
|
const skipTools = installArgs.includes('--skip-tools') || explicitSource;
|
|
92
93
|
let extensionDir;
|
|
94
|
+
let remote = false;
|
|
93
95
|
const options = {
|
|
94
96
|
sourceDir: packageRoot,
|
|
95
97
|
agent: 'opencode',
|
|
@@ -115,6 +117,9 @@ try {
|
|
|
115
117
|
const key = { '--link': 'link', '--force': 'force', '--dry-run': 'dryRun' }[arg];
|
|
116
118
|
options[key] = true;
|
|
117
119
|
}
|
|
120
|
+
else if (arg === '--remote') {
|
|
121
|
+
remote = true;
|
|
122
|
+
}
|
|
118
123
|
else if (arg === '--skip-tools' || (upgrade && arg === '--check')) {
|
|
119
124
|
continue;
|
|
120
125
|
}
|
|
@@ -142,9 +147,9 @@ try {
|
|
|
142
147
|
console.log(`Skipped managed CLI installation (${Object.keys(loadToolchain(packageRoot).tools).join(', ')}).`);
|
|
143
148
|
if (!checkOnly) {
|
|
144
149
|
if (options.agent === 'vscode')
|
|
145
|
-
installVSCode({ sourceDir: options.sourceDir, extensionDir, dryRun: options.dryRun });
|
|
150
|
+
installVSCode({ sourceDir: options.sourceDir, extensionDir, remote, dryRun: options.dryRun });
|
|
146
151
|
else
|
|
147
|
-
installOpenCode(options);
|
|
152
|
+
installOpenCode({ ...options, remote });
|
|
148
153
|
}
|
|
149
154
|
}
|
|
150
155
|
}
|