@harmonyos-arkts/d2h 0.1.2 → 0.1.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 (71) hide show
  1. package/README.md +78 -44
  2. package/agents/android-to-hmos-00-orchestrator.md +34 -28
  3. package/agents/d2h.md +266 -95
  4. package/dist/bin/install-opencode.js +137 -43
  5. package/dist/src/install-opencode.js +44 -0
  6. package/dist/src/install-vscode.js +226 -0
  7. package/dist/src/toolchain.js +83 -0
  8. package/docs/environment-check.md +86 -0
  9. package/opencode/agents.json +1 -1
  10. package/opencode/vscode-d2h-package.json +7 -0
  11. package/opencode/vscode-d2h-plugin.mjs +29 -0
  12. package/package.json +6 -4
  13. package/schemas/task-envelope.schema.json +58 -4
  14. package/schemas/task-plan.schema.json +281 -63
  15. package/scripts/check-environment.mjs +321 -0
  16. package/skills/android2hmos_resources_convert/SKILL.md +37 -19
  17. package/skills/appgraph-rule-audit/SKILL.md +24 -5
  18. package/skills/d2h-hypium-forge/SKILL.md +252 -0
  19. package/skills/d2h-hypium-forge/references/functional-spec-template.md +140 -0
  20. package/skills/d2h-hypium-forge/references/official-api.md +135 -0
  21. package/skills/d2h-hypium-forge/references/pitfalls.md +98 -0
  22. package/skills/d2h-hypium-forge/references/testability-template.md +71 -0
  23. package/skills/d2h-hypium-forge/scripts/_common_template.py +614 -0
  24. package/skills/d2h-hypium-forge/scripts/analyze_results.py +156 -0
  25. package/skills/d2h-hypium-forge/scripts/assert_audit.py +107 -0
  26. package/skills/d2h-hypium-forge/scripts/collect_runtime_pages.py +169 -0
  27. package/skills/d2h-hypium-forge/scripts/forge_report.py +325 -0
  28. package/skills/d2h-hypium-forge/scripts/inject_resource_ids.py +114 -0
  29. package/skills/d2h-hypium-forge/scripts/lint_asserts.py +80 -0
  30. package/skills/d2h-hypium-forge/scripts/lint_locate.py +60 -0
  31. package/skills/d2h-hypium-forge/scripts/merge_appgraph.py +249 -0
  32. package/skills/d2h-hypium-forge/scripts/precondition.py +140 -0
  33. package/skills/d2h-hypium-forge/scripts/preinject_ids.py +232 -0
  34. package/skills/d2h-hypium-forge/scripts/run_direct.py +392 -0
  35. package/skills/d2h-hypium-forge/scripts/run_parallel.py +121 -0
  36. package/skills/d2h-hypium-forge/scripts/scan_features.py +255 -0
  37. package/skills/d2h-hypium-forge/scripts/upgrade_asserts.py +66 -0
  38. package/skills/d2h-hypium-forge/scripts/validate_scenarios.py +84 -0
  39. package/skills/d2h-utg-ai-generate/SKILL.md +128 -0
  40. package/skills/d2h-utg-ai-generate/references/click-paths-schema.json +76 -0
  41. package/skills/d2h-utg-ai-generate/references/extraction-guide.md +34 -0
  42. package/skills/d2h-utg-ai-generate/references/facts-contract.md +96 -0
  43. package/skills/d2h-utg-ai-generate/references/page-schema.json +61 -0
  44. package/skills/d2h-utg-ai-generate/references/utg-schema.json +89 -0
  45. package/skills/d2h-utg-ai-generate/scripts/build_page_json.py +314 -0
  46. package/skills/d2h-utg-ai-generate/scripts/build_utg.py +123 -0
  47. package/skills/d2h-utg-ai-generate/scripts/capture_from_page_json.ts +280 -0
  48. package/skills/d2h-utg-ai-generate/scripts/utg_common.py +524 -0
  49. package/skills/d2h-utg-ai-generate/scripts/utg_html.py +489 -0
  50. package/skills/d2h-utg-ai-generate/scripts/validate_utg.py +69 -0
  51. package/skills/d2h-utg-ai-generate/scripts/vendor/D3-LICENSE +13 -0
  52. package/skills/d2h-utg-ai-generate/scripts/vendor/d3-7.9.0.min.js +2 -0
  53. package/skills/d2h-utg-ai-generate/tests/test_pipeline.py +369 -0
  54. package/skills/d2h-utg-static-generate/SKILL.md +73 -0
  55. package/skills/d2h-utg-static-generate/references/discoveries.md +38 -0
  56. package/skills/d2h-utg-static-generate/scripts/generate.py +499 -0
  57. package/skills/d2h-utg-static-generate/tests/test_static.py +335 -0
  58. package/skills/d2h-utg-static-generate/tests/verify-offline-html.py +60 -0
  59. package/skills/d2h-utg-static-generate/tests/verify-produced-fixture.py +131 -0
  60. package/skills/harmonyos-migration-playbook/SKILL.md +30 -3
  61. package/skills/harmonyos-migration-playbook/references/lesson-lifecycle.md +4 -4
  62. package/skills/harmonyos-migration-playbook/references/ui-automation.md +4 -3
  63. package/skills/harmonyos-migration-playbook/references/windows-environment.md +2 -2
  64. package/skills/maintaining-migration-report/SKILL.md +88 -99
  65. package/skills/maintaining-migration-report/references/final-acceptance.md +48 -0
  66. package/skills/maintaining-migration-report/references/source-provenance.md +66 -0
  67. package/skills/managing-d2h-toolchain/SKILL.md +23 -0
  68. package/skills/managing-d2h-toolchain/environment-requirements.json +16 -0
  69. package/skills/managing-d2h-toolchain/toolchain.json +16 -0
  70. package/skills/preparing-migration-workspace/SKILL.md +76 -69
  71. package/skills/preparing-migration-workspace/toolchain.json +0 -43
@@ -1,124 +1,131 @@
1
1
  ---
2
2
  name: preparing-migration-workspace
3
- description: 在 Android 转 HarmonyOS 迁移开始或恢复时,通过 droid2hmos 执行统一 Preflight,并依据 CLI 返回结果和报告决定是否进入事实扫描与实现。也用于配置、Git checkpoint、构建测试、AppGraph 分析和设备检查。
3
+ description: 在 Android 转 HarmonyOS 迁移开始或恢复时,通过 droid2hmos 读取状态、执行 Preflight、初始化或校验配置,并采集设备与外部环境就绪度。只负责工作区准备和能力分流;不调度分析、实现、构建、测试、回归或 Git checkpoint。
4
4
  ---
5
5
 
6
6
  # 准备迁移工作区
7
7
 
8
- 本 Skill 只编排 `droid2hmos` 和独立的 `appgraph` CLI,不直接调用 Node 脚本、Gradle、Hvigor、Hypium、ADB 或 HDC。不要在 `ohos/` 尚不存在时猜测 HarmonyOS 构建配置。
8
+ 本 Skill 只负责回答四个问题:项目和迁移工作区是否定位正确、非设备基线是否可用、设备是否可用、哪些外部条件仍阻塞特定能力。它不决定后续状态,也不把设备失败扩大为整个迁移停止。
9
9
 
10
- 迁移产物(`.migration/`)统一位于安卓工程父目录下的 `<工程名>-migration/.migration/`,由 CLI 自动创建和维护,不写入安卓工程内部。创建 `.migration/` 时 CLI 会自动在工作区根目录生成 `.gitignore`(内容 `.migration/`),防止迁移产物被上层 Git 仓库提交到远端。下文所有 `.migration/...` 路径均相对该工作区根目录。
10
+ 工具安装、精确版本和升级由 `managing-d2h-toolchain` 负责。本 Skill 只消费已检查的 CLI;发现版本或能力不符时返回该 Skill 处理,不运行 npm。
11
11
 
12
- 开始或恢复时先获取只读事实快照:
12
+ 只调用 `droid2hmos` 的 `status`、`preflight`、`config init/validate` 和按需的 `device check`。不要直接调用 Node 脚本、Gradle、Hvigor、Hypium、ADB、HDC 或 AppGraph 分析命令,也不要在 `ohos/` 尚不存在时猜测 HarmonyOS 构建配置。
13
+
14
+ 迁移产物(`.migration/`)统一位于 Android 工程父目录下的 `<工程名>-migration/.migration/`,由 CLI 创建和维护,不写入 Android 工程内部。下文所有 `.migration/...` 路径均相对该迁移工作区根目录。
15
+
16
+ ## 输入与事实来源
17
+
18
+ 输入必须包含 Android Gradle 工程根目录。根目录应有 Gradle 标记,应用模块中应有 `AndroidManifest.xml`。
19
+
20
+ 开始或恢复时先获取只读快照:
13
21
 
14
22
  ```text
15
23
  droid2hmos status <ANDROID_PROJECT>
16
24
  ```
17
25
 
18
- 使用 `completion.unmet` 识别缺口,使用 `allowedActions` 选择当前可安全调用的命令。`phase` 只解释当前现场,不是必须手工推进的状态;不得创建或编辑 `.migration/state.json`。
26
+ 以 CLI 返回的 `workspace`、`allowedActions`、`completion.unmet`、Preflight 检查项、`failedChecks` 和 `retry` 为机器事实。`phase` 只解释当前现场;不得创建或编辑 `.migration/state.json`。
19
27
 
20
- 传入路径必须是 Android Gradle 工程根目录:根目录应有 Gradle 标记,并且应用模块中应有 `AndroidManifest.xml`。如果 `workspace.projectPresent=false` 且 `workspace.projectCandidates` 非空,说明传入的是包装目录;改用列出的明确候选工程,不得在包装目录初始化第二套 `.migration` 或 HarmonyOS 工程。
28
+ 如果 `workspace.projectPresent=false` 且 `workspace.projectCandidates` 非空,说明传入的是包装目录。改用列出的明确候选工程,不得在包装目录初始化第二套迁移工作区或 HarmonyOS 工程。
21
29
 
22
- ## 首次执行
30
+ ## 首次准备
23
31
 
24
- 运行统一门禁:
32
+ 运行统一预检:
25
33
 
26
34
  ```text
27
35
  droid2hmos preflight <ANDROID_PROJECT> [--sdk-path <PATH>] [--timeout-ms <MS>]
28
36
  ```
29
37
 
30
- `preflight` 负责选择检查项、判定检查项是否阻塞,并生成完整结果,包括:
38
+ `preflight` 由 Kernel 选择并判定检查项,可能包含:
31
39
 
32
40
  - Android UI 技术栈支持性;
33
- - Git 仓库、分支、`HEAD` 和工作区干净状态;
34
- - Git、Node.js 20-24、npm、Python 3.10+、JDK、Android SDK 和 DevEco 工具链;
35
- - `appgraph --version` 及迁移分析能力健康检查;
41
+ - Git 仓库、分支、`HEAD` 和用户已有改动;
42
+ - Git、Node.js、npm、Python、JDK、DevEco 和 HarmonyOS SDK(Android SDK 探测已移除,迁移不依赖 Android 编译环境);
43
+ - AppGraph 健康检查;
36
44
  - `.migration/config.json` 初始化和校验;
37
- - Android 基线状态及设备检查;
38
- - 已有 HarmonyOS 工程复用,或在目标为空时创建可编译工程壳;
39
- - HarmonyOS SDK 探测、应用 HAP 基线构建和必须通过的 HDC 设备检查;
45
+ - Android 基线状态;
46
+ - 已有 HarmonyOS 工程复用,或在空目标中创建工程壳;
47
+ - Preflight 自身所需的基线构建和设备检查;
40
48
  - `.migration/preflight-report.json` 原子生成。
41
49
 
42
- 已有 HarmonyOS 工程不得被覆盖。只想校验现有工程、不允许初始化工程壳时加 `--no-init-harmony`。命令失败后读取报告中的 `failedChecks`、`retry` 和对应日志;只有 `transient/bounded` 允许在给出的上限内原样重试,其余失败必须先改变输入或环境,不得绕过门禁继续事实扫描或实现。
43
-
44
- 环境类门禁(`toolchain`、`devecocli-auth`、`appgraph`、`harmony-sdk`、`harmony-device`)只探测一次:它们依赖本机工具、华为账号授权或物理设备,原样重跑 `preflight` 不会自愈。这类失败会返回 `retry.kind=external` 且带 `remediation`;必须把 `remediation` 明确转述给用户、等待用户修改环境,不得在同一环境下连续重跑 `preflight`。其余(非环境类)失败在按 `retry` 指引改变输入后重跑。
45
-
46
- 本 Skill 不单独定义或重算任何子检查门禁。命令成功且报告总体结果为 `passed` 时继续。
50
+ 这些是 Preflight 的内部门禁,不授权本 Skill 在预检后继续调度仓库级构建、测试或分析。已有 HarmonyOS 工程不得被覆盖;只校验现有工程且不允许初始化工程壳时使用 `--no-init-harmony`。
47
51
 
48
- ## 语言资源基线清点
52
+ 命令失败时读取 `failedChecks`、`retry` 和对应日志:
49
53
 
50
- Preflight 通过后、进入事实扫描与批次规划前,对 Android 工程做一次只读语言清点(文件枚举,不涉及构建):列出各应用模块 `src/*/res/` 下带语言/地区限定符的 `values-<locale>` 目录(如 `values-zh`、`values-en-rUS`、`values-b+es+419`;排除 `night`、`land`、`v<N>`、`sw<N>dp` 等非语言限定符),记录语言清单与数量。该清点结果是规划的强制输入:
54
+ - `retry.kind=transient/bounded`:只在返回的上限内原样重试;
55
+ - `retry.kind=external`:记录为外部阻塞项并返回具体 `remediation`,不要在环境未变化时连续重跑;
56
+ - 其他失败:返回受影响能力和补救建议,不自行推断绕过方式。
51
57
 
52
- - 语言数 > 1:实现批次必须包含 i18n 资源迁移批次,该批次开始前加载 `arkts-i18n` skill,按其目录规范迁移全部语言;
53
- - 语言数 = 1:也须在写入首个字符串资源前加载 `arkts-i18n` 确认资源组织方式;
54
- - 任何情况下不得把用户可见文案硬编码进页面代码来替代字符串资源迁移。
58
+ 不要把 `preflight` 非零退出一概解释为“迁移不能继续”。例如 HarmonyOS 设备不可用只阻止设备测试、运行态验收和依赖设备的证据采集;当 `allowedActions` 仍允许时,源码阅读、静态分析和非设备实现可以继续。反之,工程定位、配置或必要工具链缺失可能使 `allowedNonDeviceWork=false`。最终分流必须忠实反映本次 CLI 快照。
55
59
 
56
- ## 配置与测试
60
+ ## 配置
57
61
 
58
- 需要显式提供项目特有的 Android 命令时,先运行:
62
+ 需要显式提供 HarmonyOS 工程路径时使用:
59
63
 
60
64
  ```text
61
- droid2hmos config init <ANDROID_PROJECT> [--harmony-project <PATH>] [--android-build <COMMAND>] [--android-test <COMMAND>]
65
+ droid2hmos config init <ANDROID_PROJECT> [--harmony-project <PATH>]
62
66
  droid2hmos config validate <ANDROID_PROJECT>
63
67
  ```
64
68
 
65
- 配置中只保存 Android 侧有限命令和能够确认的路径。不得保存或猜测 `harmonyBuild`、`harmonyTest`、module、product 或 target;HarmonyOS 参数由 CLI 从真实工程配置解析。
66
-
67
- `androidBuild` 默认为 null:迁移流程不编译 Android 工程,`analyze android` 是纯源码静态分析且不要求 APK。只有用户明确要求 Android/HarmonyOS 双端运行对照时,才通过 `--android-build` 显式配置构建命令;未配置时执行 `droid2hmos build android` 会返回引导提示而非自动探测。
68
-
69
- 在首次 Preflight 之后需要针对性诊断或验证时使用:
70
-
71
- ```text
72
- droid2hmos build <android|harmony|all> <ANDROID_PROJECT> [--timeout-ms <MS>]
73
- droid2hmos test android <ANDROID_PROJECT> [--task <TASK>] [--timeout-ms <MS>]
74
- droid2hmos test harmony <ANDROID_PROJECT> (--class <CLASS> [--case <CASE>] | --all) [--target <DEVICE>] [--case-timeout-ms <MS>] [--ref <REPORT_REF>...]
75
- ```
69
+ 配置中只保存能够确认的路径。不得保存或猜测 `harmonyBuild`、`harmonyTest`、module、product 或 target;HarmonyOS 参数由 CLI 从真实工程配置解析。
76
70
 
77
- Android 测试只有在 `.migration/config.json` 已声明可执行的 `androidTest` 时运行。HarmonyOS 测试只有在已有 Hypium 测试资产时运行;没有测试资产时记录缺口,并在第一个可交互功能验收前建立。多个 HDC 目标可响应时必须显式传 `--target`,防止证据偶然落在另一台设备。`--case-timeout-ms` 控制单个 Hypium 用例超时,`--ref` 只声明该测试实际断言的报告项。CLI 会解析 Hypium 摘要:失败、错误、忽略、零执行或缺少摘要即使 HDC 退出码为零也视为失败。
71
+ `androidBuild`/`androidTest` 字段仅为兼容旧工作区保留:CLI 不再提供设置入口,也不再执行这些命令(Android 构建与测试能力已移除)。
78
72
 
79
- Hvigor 返回成功但没有刷新输出时,CLI 只复用不早于各自构建输入的既有应用/ohosTest HAP;应用源码变化只要求应用 HAP 更新,不会强制无关的 ohosTest HAP 重打。产物比对应源码或构建配置旧时必须失败并要求修复构建,而不是安装过期包。
73
+ ## 设备状态采集
80
74
 
81
- ## 分析与设备诊断
82
-
83
- Android 和 HarmonyOS 分析统一使用:
84
-
85
- ```text
86
- droid2hmos analyze <android|harmony|all> <ANDROID_PROJECT>
87
- ```
88
-
89
- CLI 负责调用 PATH 中的 `appgraph`,HarmonyOS 分析自动读取配置里的 SDK 路径。只有统一命令失败且需要定位工具缺陷时,才直接运行 `appgraph --version` 或查看其帮助;不得自行拼接内部分析参数作为正常工作流。
90
-
91
- 需要单独复查设备时使用:
75
+ 当现有 Preflight 报告缺少当前设备状态,或调用方明确需要刷新设备状态时,可运行:
92
76
 
93
77
  ```text
94
- droid2hmos device check <android|harmony>
78
+ droid2hmos device check harmony
95
79
  ```
96
80
 
97
- Android 设备缺失是可记录的增强项;HarmonyOS 设备必须可被发现且 Shell 可响应,否则停止需要设备证据的流程。
81
+ 只记录设备发现、Shell 响应、目标歧义和返回的 remediation(Android 设备检测已移除,仅支持 HarmonyOS)。多个目标、认证、签名或设备离线问题进入 `externalBlockers` 或 `capabilityBlockers`,由调用方决定何时处理。本 Skill 不因设备问题暂停并要求用户作流程选择。
98
82
 
99
- ## 恢复执行与 Git checkpoint
83
+ ## 恢复
100
84
 
101
- 恢复迁移时不得重新初始化已有 `ohos/`。先运行:
85
+ 恢复时不得重新初始化已有 `ohos/`。运行:
102
86
 
103
87
  ```text
104
88
  droid2hmos status <ANDROID_PROJECT>
105
- droid2hmos checkpoint status <ANDROID_PROJECT>
106
89
  droid2hmos config validate <ANDROID_PROJECT>
107
90
  ```
108
91
 
109
- 然后只重跑快照显示为缺失或因源码指纹变化而失效的 `build`、`test`、`device check` 或 `analyze`。如果工具链、AppGraph、工程壳或基础环境可能变化,则重新运行完整 `preflight`。`.migration/` 运行态文件不会让重复 Preflight 自己判定工作区变脏;已有配置中尚未纳入 Git 的 HarmonyOS 目录可作为上次预检生成物忽略,但首次运行前就存在的未跟踪 `ohos/` 和该目录内已有的 tracked 变更仍然阻塞,不能借此隐藏用户改动。
110
-
111
- 完成一个经验证的迁移单元后,只提交明确列出的文件:
112
-
113
- ```text
114
- droid2hmos checkpoint create <ANDROID_PROJECT> --message <MESSAGE> --include <PATH> [--include <PATH>...]
92
+ 仅当工具链、配置、工程壳或设备环境可能变化,或 CLI 明确要求刷新 Preflight 时,重新运行 `preflight`。不要在这里检查或创建 checkpoint,也不要补跑 `analyze`、`build`、`test` 或全量回归;这些属于调用方根据当前工作单元和状态决定的后续动作。
93
+
94
+ 不得处理、覆盖、提交或删除用户已有改动。
95
+
96
+ ## 结构化结果
97
+
98
+ 始终返回同一就绪度结构:
99
+
100
+ ```json
101
+ {
102
+ "baselineReady": true,
103
+ "deviceReady": false,
104
+ "externalBlockers": [],
105
+ "capabilityBlockers": [
106
+ {
107
+ "capability": "device-validation",
108
+ "check": "harmony-device",
109
+ "reason": "no responsive target",
110
+ "remediation": "connect or start one HarmonyOS target"
111
+ }
112
+ ],
113
+ "allowedNonDeviceWork": true,
114
+ "allowedActions": [],
115
+ "evidence": [".migration/preflight-report.json"],
116
+ "suggestedRemediation": []
117
+ }
115
118
  ```
116
119
 
117
- 仅在调用者明确要求纳入全部相关变更时使用 `--all`。即使使用 `--all`,`.migration/` 运行态和证据归档也不会进入提交。不得处理、覆盖或删除用户已有改动;生成的 AppGraph、命令日志和预检日志不进入检查点。显式路径暂存失败时命令会撤销本次新加入暂存区的文件,并保留调用前已经暂存的内容。
118
-
119
- ## 继续条件
120
+ 字段语义:
120
121
 
121
- - `droid2hmos preflight` 成功退出;
122
- - `.migration/preflight-report.json` 已生成且总体结果为 `passed`。
122
+ - `baselineReady`:工程定位、迁移配置和非设备基础能力是否足以支持 CLI 明确允许的后续工作;不能仅用 Preflight 总体退出码代替;
123
+ - `deviceReady`:当前 HarmonyOS 目标是否满足设备类工作要求;
124
+ - `externalBlockers`:需要用户、账号、签名、物理设备或外部环境变化的阻塞项;
125
+ - `capabilityBlockers`:按能力说明阻塞范围,不能写成笼统的“迁移停止”;
126
+ - `allowedNonDeviceWork`:当前是否仍可继续源码阅读、静态分析或非设备实现;
127
+ - `allowedActions`:原样返回 CLI 快照中的允许动作;
128
+ - `evidence`:本次读取或生成的状态、配置和 Preflight 报告;
129
+ - `suggestedRemediation`:CLI 给出的可执行补救,不臆造成功结论。
123
130
 
124
- 各检查项的 `required`、`status` 和最终阻塞关系以本次 CLI 输出及报告为唯一依据,Skill 不重复推导通过条件。
131
+ 本 Skill 不推进外部状态机、不更新迁移报告、不创建 checkpoint、不调用 `complete`,也不决定定向测试或全量回归。调用方根据上述结果决定下一步。
@@ -1,43 +0,0 @@
1
- {
2
- "orchestrator": {
3
- "command": "droid2hmos",
4
- "preflight": ["preflight"],
5
- "requiredCapabilities": [
6
- "status",
7
- "complete",
8
- "config init",
9
- "config validate",
10
- "checkpoint status",
11
- "checkpoint create",
12
- "build android",
13
- "build harmony",
14
- "test android",
15
- "test harmony",
16
- "device check android",
17
- "device check harmony",
18
- "analyze android",
19
- "analyze harmony",
20
- "evidence capture",
21
- "evidence flow",
22
- "evidence compare",
23
- "report init",
24
- "report update",
25
- "report validate",
26
- "report render",
27
- "mock init",
28
- "service start",
29
- "service status",
30
- "service stop",
31
- "logs list",
32
- "logs show",
33
- "logs failures",
34
- "logs stats"
35
- ]
36
- },
37
- "appgraph": {
38
- "command": "appgraph",
39
- "versionProbe": ["--version"],
40
- "healthProbe": ["spec-analysis", "--help"],
41
- "managedBy": "droid2hmos preflight"
42
- }
43
- }