android2harmony 0.1.4 → 0.1.6

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 (116) hide show
  1. package/README.md +1 -407
  2. package/agents/self-tester.md +55 -376
  3. package/dist/index.js +238 -124
  4. package/dist/index.js.map +4 -4
  5. package/package.json +36 -32
  6. package/skills/a2h-resource-convert/SKILL.md +931 -0
  7. package/skills/a2h-resource-convert/references/code-vector-icon-rules.md +335 -0
  8. package/skills/{hmos-resources-convert → a2h-resource-convert}/references/conversion-rules.md +15 -2
  9. package/skills/{hmos-resources-convert → a2h-resource-convert}/references/dependency-analysis-rules.md +24 -2
  10. package/skills/a2h-resource-convert/references/lottie-conversion-rules.md +219 -0
  11. package/skills/{hmos-resources-convert → a2h-resource-convert}/references/resource-mapping-rules.md +27 -2
  12. package/skills/{hmos-resources-convert → a2h-resource-convert}/references/xml-drawable-to-svg-rules.md +118 -1
  13. package/skills/a2h-resource-convert/scripts/a2h_resource_convert.js +2186 -0
  14. package/skills/a2h-resource-convert/scripts/app_identity.js +741 -0
  15. package/skills/a2h-resource-convert/scripts/code_vector_icons.js +607 -0
  16. package/skills/a2h-resource-convert/scripts/package.json +3 -0
  17. package/skills/a2h-resource-convert/scripts/svg_fidelity_check.js +632 -0
  18. package/skills/a2h-ui-transfer/SKILL.md +431 -0
  19. package/skills/a2h-ui-transfer/references/conversion-procedure.md +547 -0
  20. package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/_/350/214/203/345/274/217/351/200/211/346/213/251/350/257/264/346/230/216.md +1 -1
  21. package/skills/a2h-ui-transfer/references/mvvm-v2/_/350/243/205/351/245/260/345/231/250/351/200/237/346/237/245.md +133 -0
  22. package/skills/{hmos-batch-ui-align/scripts/android_parse_fast.ts → a2h-ui-transfer/scripts/android_parse_fast.js} +532 -301
  23. package/skills/a2h-ui-transfer/scripts/arkts_static_check.js +1624 -0
  24. package/skills/a2h-ui-transfer/scripts/measure_pack.js +1005 -0
  25. package/skills/a2h-ui-transfer/scripts/package.json +3 -0
  26. package/skills/hmos-fix-build-errors/SKILL.md +1 -1
  27. package/skills/hmos-incremental-ui-align/README.md +15 -15
  28. package/skills/hmos-incremental-ui-align/SKILL.md +15 -15
  29. package/skills/hmos-incremental-ui-align/references/State_Model_Template.md +2 -2
  30. package/skills/hmos-incremental-ui-align/scripts/app_feature_verify.js +790 -0
  31. package/skills/hmos-incremental-ui-align/scripts/extract_checklist.js +285 -0
  32. package/skills/hmos-incremental-ui-align/scripts/navigation-capure.md +76 -76
  33. package/skills/hmos-incremental-ui-align/scripts/page_capture.js +756 -0
  34. package/skills/hmos-incremental-ui-align/scripts/page_capture_burst.js +155 -0
  35. package/skills/hmos-integration-test/README.md +341 -0
  36. package/skills/hmos-integration-test/SKILL.md +446 -0
  37. package/skills/hmos-integration-test/scripts/report-tool.mjs +646 -0
  38. package/skills/hmos-integration-test/scripts/resolve-metadata-tool.mjs +147 -0
  39. package/skills/hmos-integration-test/scripts/self-test-runner.mjs +1006 -0
  40. package/skills/hmos-integration-test/scripts/testcases-tool.mjs +189 -0
  41. package/skills/hmos-spec-generate/SKILL.md +26 -24
  42. package/skills/hmos-spec-generate/scripts/parse_requirements.ts +515 -0
  43. package/skills/hmos-spec-generate/template/REQ.txt +22 -0
  44. package/skills/hmos-spec-generate/template/REQ.xlsx +0 -0
  45. package/skills/hmos-batch-ui-align/SKILL.md +0 -141
  46. package/skills/hmos-batch-ui-align/references/conversion-procedure.md +0 -217
  47. package/skills/hmos-incremental-ui-align/scripts/app_feature_verify.ts +0 -999
  48. package/skills/hmos-incremental-ui-align/scripts/extract_checklist.ts +0 -343
  49. package/skills/hmos-incremental-ui-align/scripts/page_capture.ts +0 -977
  50. package/skills/hmos-incremental-ui-align/scripts/page_capture_burst.ts +0 -188
  51. package/skills/hmos-resources-convert/SKILL.md +0 -654
  52. package/skills/hmos-resources-convert/template/AppScope/app.json5 +0 -10
  53. package/skills/hmos-resources-convert/template/AppScope/resources/base/element/string.json +0 -8
  54. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/background.png +0 -0
  55. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/foreground.png +0 -0
  56. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/layered_image.json +0 -7
  57. package/skills/hmos-resources-convert/template/build-profile.json5 +0 -42
  58. package/skills/hmos-resources-convert/template/code-linter.json5 +0 -32
  59. package/skills/hmos-resources-convert/template/entry/build-profile.json5 +0 -33
  60. package/skills/hmos-resources-convert/template/entry/hvigorfile.ts +0 -6
  61. package/skills/hmos-resources-convert/template/entry/obfuscation-rules.txt +0 -23
  62. package/skills/hmos-resources-convert/template/entry/oh-package.json5 +0 -10
  63. package/skills/hmos-resources-convert/template/entry/src/main/ets/entryability/EntryAbility.ets +0 -48
  64. package/skills/hmos-resources-convert/template/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +0 -16
  65. package/skills/hmos-resources-convert/template/entry/src/main/ets/pages/Index.ets +0 -23
  66. package/skills/hmos-resources-convert/template/entry/src/main/module.json5 +0 -55
  67. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/color.json +0 -8
  68. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/float.json +0 -8
  69. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/string.json +0 -16
  70. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/background.png +0 -0
  71. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/foreground.png +0 -0
  72. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/layered_image.json +0 -7
  73. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/startIcon.png +0 -0
  74. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/backup_config.json +0 -3
  75. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/main_pages.json +0 -5
  76. package/skills/hmos-resources-convert/template/entry/src/main/resources/dark/element/color.json +0 -8
  77. package/skills/hmos-resources-convert/template/entry/src/mock/mock-config.json5 +0 -2
  78. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/Ability.test.ets +0 -35
  79. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/List.test.ets +0 -5
  80. package/skills/hmos-resources-convert/template/entry/src/ohosTest/module.json5 +0 -16
  81. package/skills/hmos-resources-convert/template/entry/src/test/List.test.ets +0 -5
  82. package/skills/hmos-resources-convert/template/entry/src/test/LocalUnit.test.ets +0 -33
  83. package/skills/hmos-resources-convert/template/hvigor/hvigor-config.json5 +0 -23
  84. package/skills/hmos-resources-convert/template/hvigorfile.ts +0 -6
  85. package/skills/hmos-resources-convert/template/oh-package-lock.json5 +0 -28
  86. package/skills/hmos-resources-convert/template/oh-package.json5 +0 -10
  87. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +0 -0
  88. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +0 -0
  89. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +0 -0
  90. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md" +0 -0
  91. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md" +0 -0
  92. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md" +0 -0
  93. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md" +0 -0
  94. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md" +0 -0
  95. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md" +0 -0
  96. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md" +0 -0
  97. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md" +0 -0
  98. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md" +0 -0
  99. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md" +0 -0
  100. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md" +0 -0
  101. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md" +0 -0
  102. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md" +0 -0
  103. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/!!/350/257/255/346/263/225/357/274/232/345/217/214/345/220/221/347/273/221/345/256/232.md" +0 -0
  104. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Computed/350/243/205/351/245/260/345/231/250/357/274/232/350/256/241/347/256/227/345/261/236/346/200/247.md" +0 -0
  105. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Event/350/243/205/351/245/260/345/231/250/357/274/232/350/247/204/350/214/203/347/273/204/344/273/266/350/276/223/345/207/272.md" +0 -0
  106. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Local/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/351/203/250/347/212/266/346/200/201.md" +0 -0
  107. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Monitor/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/344/277/256/346/224/271/345/274/202/346/255/245/347/233/221/345/220/254.md" +0 -0
  108. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@ObservedV2/350/243/205/351/245/260/345/231/250/345/222/214@Trace/350/243/205/351/245/260/345/231/250/357/274/232/347/261/273/345/261/236/346/200/247/345/217/230/345/214/226/350/247/202/346/265/213.md" +0 -0
  109. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Once/350/243/205/351/245/260/345/231/250/357/274/232/345/210/235/345/247/213/345/214/226/345/220/214/346/255/245/344/270/200/346/254/241.md" +0 -0
  110. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Param/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/244/226/351/203/250/350/276/223/345/205/245.md" +0 -0
  111. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Provider/350/243/205/351/245/260/345/231/250/345/222/214@Consumer/350/243/205/351/245/260/345/231/250/357/274/232/350/267/250/347/273/204/344/273/266/345/261/202/347/272/247/345/217/214/345/220/221/345/220/214/346/255/245.md" +0 -0
  112. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Type/350/243/205/351/245/260/345/231/250/357/274/232/346/240/207/350/256/260/347/261/273/345/261/236/346/200/247/347/232/204/347/261/273/345/236/213.md" +0 -0
  113. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/AppStorageV2/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200UI/347/212/266/346/200/201/345/255/230/345/202/250.md" +0 -0
  114. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/MVVM/346/250/241/345/274/217/357/274/210V2/357/274/211.md" +0 -0
  115. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/PersistenceV2/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md" +0 -0
  116. /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2//347/212/266/346/200/201/347/256/241/347/220/206V1/345/220/221V2/350/277/201/347/247/273/344/270/216/346/267/267/347/224/250/346/214/207/345/257/274.md" +0 -0
package/README.md CHANGED
@@ -1,407 +1 @@
1
- # 安卓应用迁移鸿蒙指导
2
-
3
- **a2h工具用于辅助鸿蒙开发者完成原生安卓应用迁移到鸿蒙应用,为应用迁移的各个环节提供能力支持。**
4
-
5
- **本文档为使用a2h工具进行应用迁移的流程指导。**
6
-
7
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
8
- [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D%2022.18-339933.svg?logo=node.js&logoColor=white)](https://nodejs.org/en/download)
9
-
10
- [![Claude Code](https://img.shields.io/badge/Claude_Code-supported-blueviolet.svg)](#选择本地editor)
11
- [![Cursor](https://img.shields.io/badge/Cursor-supported-blueviolet.svg)](#选择本地editor)
12
- [![OpenCode](https://img.shields.io/badge/OpenCode-supported-blueviolet.svg)](#选择本地editor)
13
- [![DevEco Code](https://img.shields.io/badge/DevEco_Code-supported-blueviolet.svg)](#选择本地editor)
14
- [![Codex](https://img.shields.io/badge/Codex-supported-blueviolet.svg)](#选择本地editor)
15
- [![CodeBuddy](https://img.shields.io/badge/CodeBuddy-supported-blueviolet.svg)](#选择本地editor)
16
-
17
- ---
18
-
19
- ## 安装DevEco Studio以及Android Studio
20
-
21
- 1. **安装DevEco Studio** — 下载地址:<https://developer.huawei.com/consumer/cn/download/>。安装完成后,配置以下 **PATH环境变量**:
22
-
23
- | 工具 | PATH中加入的目录 |
24
- |------|------------------|
25
- | java | `<DevEco安装目录>\jbr\bin` |
26
- | hdc | `<DevEco安装目录>\sdk\default\openharmony\toolchains` |
27
-
28
- 验证方式:执行 `java -version`、`hdc -v` 均返回正常
29
-
30
-
31
- 2. **安装Android Studio** — 下载地址:<https://developer.android.com/studio>,并在 **SDK Manager** 中安装SDK。
32
-
33
- 验证方式:执行 `adb version` 返回正常
34
-
35
- 被依赖:
36
- - 步骤1.1UI迁移(可选,仅自动抓取页面快照时需要)
37
- - 步骤1.2UI对齐(必需)
38
-
39
- 注:也可用真机替代模拟器用于UI迁移和对齐。但当前工具不支持部分系统(Android API 16及更早版本、华为emui、部分车机.IOT设备)
40
-
41
- ## 安装Node.js
42
-
43
- 安装 **Node.js(版本需 >= 22.18)** — 下载地址:<https://nodejs.org/en/download>。
44
-
45
- 验证方式:执行 `node -v`、`npm -v`、`npx -v` 均返回正常,且 `node -v` 显示版本不低于 22.18
46
-
47
- ## 安装a2h
48
-
49
- 执行 `npm install -g android2harmony`。
50
-
51
- 验证方式:执行 `a2h --version` 返回正常
52
-
53
- ## 环境初始化
54
-
55
- 执行 `a2h init`。
56
-
57
- > 如果在PowerShell下运行,命令需要加上 `.cmd` 后缀,如 `a2h.cmd --version`、`a2h.cmd init`。
58
-
59
- ### 选择本地editor:
60
- ![choose_editor.png](https://raw.gitcode.com/yang237/a2h/raw/main/resource/choose_editor.png)
61
-
62
- ### 参数配置:
63
-
64
- #### 配置鸿蒙SDK:
65
- ![set_sdk.png](https://raw.gitcode.com/yang237/a2h/raw/main/resource/set_sdk.png)
66
-
67
- #### 配置多模态模型(不执行UI对齐以及集成测试可以跳过该配置):
68
- ![set_multimodel.png](https://raw.gitcode.com/yang237/a2h/raw/main/resource/set_multimodel.png)
69
-
70
- | 参数 | 含义 |
71
- |-----------------|---------|
72
- | `model_api_key` | 用于模型API请求认证的令牌 |
73
- | `model_name` | 多模态(视觉)模型的名字 |
74
- | `model_base_url` | 模型API服务的基础地址 |
75
-
76
- ##### 配置参考
77
-
78
- 前往[阿里云百炼平台](https://bailian.console.aliyun.com/)开通服务并申请 API Key,选用 Qwen 系列多模态(视觉)模型(如 `qwen3.5-plus`)。
79
-
80
- | 参数 | 取值 |
81
- |---|-----------------------------------------------------|
82
- | `model_api_key` | 百炼控制台申请的 API Key(形如 `sk-xxxxxxxx`) |
83
- | `model_name` | `qwen3.5-plus` |
84
- | `model_base_url` | `https://dashscope.aliyuncs.com/compatible-mode/v1` |
85
-
86
- #### 将配置信息添加到环境变量:
87
- ![set_environment.png](https://raw.gitcode.com/yang237/a2h/raw/main/resource/set_environment.png)
88
-
89
- ### 准备项目
90
-
91
- 准备 **Android源项目** 与 **HarmonyOS目标项目目录**。
92
-
93
- ---
94
- ## 迁移流程
95
- ![migration_process.svg](https://raw.gitcode.com/yang237/a2h/raw/main/resource/migration_process.svg)
96
-
97
- ---
98
-
99
- ## 步骤1:UI迁移
100
-
101
- ### 1.1 UI迁移
102
-
103
- > 📦 依赖:Android Studio + 安卓真机/模拟器(可选,仅自动抓取页面快照时需要)。
104
-
105
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-batch-ui-align,并且传递相关参数)
106
-
107
- 斜杠调用方式举例
108
- ```
109
- /hmos-batch-ui-align android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> ui_info_root=<页面快照目录> apk_path=<安卓apk路径>
110
- ```
111
- 自然语言调用方式举例
112
- ```
113
- 帮我使用skill:hmos-batch-ui-align完成安卓应用页面到鸿蒙应用的迁移,传递的参数是 android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> ui_info_root=<页面快照目录> apk_path=<安卓apk路径>
114
- ```
115
-
116
- **输入参数**
117
-
118
- | 参数 | 类型 | 说明 |
119
- |------|------|-------------------------------------------------------------------------------------------------------------|
120
- | `android_project_dir` | **必选** | Android项目根目录路径 |
121
- | `harmony_project_dir` | **必选** | HarmonyOS项目输出路径 |
122
- | `ui_info_root` | 可选 | 包含 `page_NNNN_ActivityName` 格式子目录的父目录(每子目录含 `meta.json` + `view.xml` + 可选 `screenshot.png`);不提供时自动通过adb抓取 |
123
- | `pages` | 可选 | 显式列出的页面子集(不提供则处理所有页面) |
124
- | `apk_path` | 可选 | Android APK文件路径;透传给内部的 `hmos-resources-convert`,提供后跳过Gradle构建,直接用apktool解包该APK提取资源 |
125
-
126
- **输出产物**
127
-
128
- | 产物 | 位置 | 说明 |
129
- |------|------|------|
130
- | ArkTS页面文件 | HarmonyOS项目下 | 由Android Activity转换生成的ArkTS页面 |
131
- | 资源文件 | HarmonyOS项目下 | 页面所需资源(含UI迁移内部触发的资源转换产物) |
132
- | 批量转换报告 | HarmonyOS项目下 | 各页面转换结果、缺陷与统计 |
133
-
134
- ### 1.2 UI对齐(按需)
135
-
136
- > 📦 依赖:DevEco Studio、Android Studio(必需);安卓真机/模拟器 + 鸿蒙真机/模拟器(必需)。
137
-
138
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-incremental-ui-align,并且传递相关参数)
139
-
140
- 斜杠调用方式举例
141
- ```
142
- /hmos-incremental-ui-align android_project_dir=<安卓工程路径> harmony_project_dir=<鸿蒙工程路径>
143
- ```
144
- 自然语言调用方式举例
145
- ```
146
- 帮我使用skill:hmos-incremental-ui-align完成安卓和鸿蒙应用的页面对齐,传递的参数是 android_project_dir=<安卓工程路径> harmony_project_dir=<鸿蒙工程路径>
147
- ```
148
-
149
- **输入参数**
150
-
151
- | 参数 | 类型 | 说明 |
152
- |------|------|------|
153
- | `android_project_dir` | 必填 | 安卓源码根目录;用于自动解析安卓app名/包名 |
154
- | `harmony_project_dir` | 必填 | 鸿蒙工程根目录(会被直接修改);用于自动解析鸿蒙app名/包名 |
155
- | `capture_output_dir` | 可选 | 采集产物输出目录,默认 `<harmony_project_dir>/.hometrans/capture_output` |
156
-
157
- **输出产物**
158
-
159
- | 产物 | 位置 | 说明 |
160
- |------|------|------|
161
- | 修改后的ArkTS页面文件 | HarmonyOS项目下 | 对齐目标页面后的代码改动 |
162
- | 双端页面截图与视图树 | `capture_output_dir` | Android/HarmonyOS两侧 `screenshot.png` + 视图树文件 |
163
- | 对齐差异/修复报告 | `capture_output_dir` | 差异分析与修复说明 |
164
-
165
- ---
166
-
167
- ## 步骤2:生成需求规格
168
-
169
- > 📦 依赖:homegraph(必需)。
170
-
171
- > 👤 前置:用户编写 `REQ.txt` 文件 — 以自然语言描述原始需求,如有多个需求则在文件中使用空行进行分隔,需求中建议包含页面跳转路径的说明以及业务逻辑的描述。
172
-
173
- `REQ.txt` 示例:
174
-
175
- ```text
176
- 设置-歌词-歌词界面-卡拉OK歌词动画兼容策略(播放页歌词设置同步实现)
177
- 逐字歌词效果,默认是当前行
178
- 1,当前行:只为前歌曲的歌词中有单字时间戳的歌词行显示逐字特效
179
- 2,扩展全部:当前歌曲的歌词中只要有一行歌词带单字时间戳,所有歌词行都显示逐字特效
180
- 3,总是:当前歌曲所有歌词行都显示逐字特效
181
-
182
- 设置-用户界面-圆形播放封面(圆形支持旋转)
183
- 开关,默认关闭,打开后,在播放页以圆形展示封面,并且自动旋转
184
-
185
- 设置-用户界面-允许不规则封面(支持长方形封面,参考无归)
186
- 开关,默认打开,播放页封面以大小一致的正方形展示,打开后,在播放页封面以原始样式展示
187
-
188
- 设置-歌词-悬浮窗状态栏歌词
189
- 开关 ,默认关闭,打开前需要申请悬浮窗权限,打开后在悬浮窗滚动展示歌词
190
- 1,左右位置:默认0%
191
- 2,上下位置:默认0px
192
- 3,宽度:默认150dp
193
- 4,大小:默认14.0dp
194
- 5,选择颜色:默认蓝色
195
- 6,歌词文本居左对齐:开关 默认关闭,歌词在设置的宽度内中对齐
196
- 7,状态栏歌词不显示翻译:开关 默认关闭
197
- 8,在播放界面隐藏:开关 默认关闭 打开后如果切换到播放页,则不在悬浮窗区域显示歌词
198
- ```
199
-
200
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-spec-generate,并且传递相关参数)
201
-
202
- 斜杠调用方式举例
203
- ```
204
- /hmos-spec-generate requirement_description_file=<需求描述文件路径> android_project_dir=<安卓项目路径> spec_output_dir=<规格输出目录>
205
- ```
206
- 自然语言调用方式举例
207
- ```
208
- 帮我使用skill:hmos-spec-generate生成需求spec文档,传递的参数是 requirement_description_file=<需求描述文件路径> android_project_dir=<安卓项目路径> spec_output_dir=<规格输出目录>
209
- ```
210
-
211
- **输入参数**
212
-
213
- | 参数 | 类型 | 说明 |
214
- |------|------|------|
215
- | `requirement_description_file` | **必选** | 需求描述 `.txt` 文件路径(每段以 `REQ` 开头,空行分隔) |
216
- | `android_project_dir` | **必选** | Android项目根目录路径(必须位于Git仓库内) |
217
- | `spec_output_dir` | **必选** | 规格文档输出目录(自动创建;每个REQ生成 `<feature>-SPEC.md` + `.trace/<feature>.md`) |
218
-
219
- **输出产物**
220
-
221
- | 产物 | 位置 | 说明 |
222
- |------|------|------|
223
- | `<feature>-SPEC.md` | `spec_output_dir` | 每个REQ对应一份原子场景规格文档 |
224
- | `.trace/<feature>.md` | `spec_output_dir/.trace/` | 每个REQ对应的代码trace(homegraph探索结果) |
225
-
226
- ---
227
-
228
- ## 步骤3:逻辑代码转换流水线
229
-
230
- > 📦 依赖:DevEco Studio(必需,构建/评审修复);Node.js (≥ 18,运行 `self-test-runner.js` 等编译后的入口) + 鸿蒙真机(集成测试阶段需要,可经 `skip_test` 跳过)。
231
-
232
- > 👤 前置:
233
- > 1. 如果执行集成测试,需要**准备测试用例文档**:可由 [`hmos-test-case-generation` skill](#测试用例生成可独立运行产出喂给集成测试) 自动生成,其产出的 `test_case.md` 作为 `test_case_path` 传入;`pre_test_case.md` 为前置测试用例(非必须,用于测试用例的环境准备等),作为 `pre_test_case_path` 传入。
234
- > 2. 如果执行集成测试,需要**连接HarmonyOS真机**并且在DevEco Studio中[**配置签名**](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/networkboost-preparations#%E9%85%8D%E7%BD%AE%E7%AD%BE%E5%90%8D)。
235
-
236
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-convert-pipeline,并且传递相关参数)
237
-
238
- 斜杠调用方式举例
239
- ```
240
- /hmos-convert-pipeline android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> spec_file_path=<需求规格文档路径>
241
- ```
242
- 自然语言调用方式举例
243
- ```
244
- 帮我使用skill:hmos-convert-pipeline完成逻辑代码开发,代码检视,集成测试,传递的参数是 android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> spec_file_path=<需求规格文档路径>
245
- ```
246
-
247
- **输入参数**
248
-
249
- | 参数 | 类型 | 说明 |
250
- |------|------|------|
251
- | `android_project_dir` | **必选** | Android项目根目录路径 |
252
- | `harmony_project_dir` | **必选** | HarmonyOS项目根目录路径 |
253
- | `spec_file_path` | **必选** | 需求规格文档路径(各阶段直接读取,无需复制到输出目录) |
254
- | `assets_output_path` | 可选 | 输出/报告文件存放目录(默认鸿蒙工程下 `.hometrans`,自动创建) |
255
- | `test_case_path` | 可选 | 自测用例文件路径(默认读输出目录下 `test_case.md`;不存在则跳过自测循环) |
256
- | `pre_test_case_path` | 可选 | 前置用例文件路径(默认读输出目录下 `pre_test_case.md`;存在才传给自测) |
257
- | `max_rounds_review` | 可选 | 代码检视循环最大轮数(正整数 `>= 1`,默认 `2`) |
258
- | `max_rounds_test` | 可选 | 自测循环最大轮数(正整数 `>= 1`,默认 `2`) |
259
- | `skip_test` | 可选 | `true` 跳过集成测试阶段(无真机验证环境时设为 `true`,默认 `false`) |
260
-
261
- > 参数按位置传递:要传某个可选参数,需先显式给出它前面的所有可选参数。
262
-
263
- **输出产物**
264
-
265
- | 产物 | 位置 | 说明 |
266
- |------|------|------|
267
- | 已签名HAP | HarmonyOS项目下 `build/` | 通过自测/评审循环后的最终发布包 |
268
- | `pipeline-manifest.md` | `assets_output_path` | 流水线清单:阶段耗时、轮数、缺陷统计 |
269
- | 构建阶段报告 | `assets_output_path` | 编译错误与修复记录 |
270
- | 评审阶段报告 | `assets_output_path` | 代码检视报告与修复记录 |
271
- | 自测阶段报告 | `assets_output_path` | 测试结果、失败用例与修复记录 |
272
-
273
- ---
274
-
275
- ## 步骤4:人工验收
276
-
277
- **输入**
278
-
279
- | 输入 | 说明 |
280
- |------|------|
281
- | `pipeline-manifest.md` | 流水线清单与缺陷统计 |
282
- | 自测报告 | 集成测试skill/步骤3自测阶段产出的测试报告 |
283
- | 已签名HAP | 步骤3流水线产出的最终发布包 |
284
-
285
- **输出**
286
-
287
- | 产物 | 说明 |
288
- |------|------|
289
- | 可发布的HarmonyOS应用 | 已处理报告中的遗留缺陷/TODO,通过核心场景走查 |
290
-
291
- 通读 `pipeline-manifest.md` 与自测报告,真机走查核心场景,处理报告中的遗留缺陷/TODO后发布。
292
-
293
- ---
294
-
295
- ## 独立skill能力
296
-
297
- 以下能力包含在迁移流程中也可按需独立调用。
298
-
299
- ### 资源转换
300
-
301
- > 📦 依赖:DevEco Studio中的java(可选,缺失时回退读取源码 `res/`)。
302
-
303
- > ⚠️ 提示:如果步骤1采用 **UI迁移**(`hmos-batch-ui-align`),则跳过当前能力(UI迁移内部已包含资源转换)。
304
-
305
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-resources-convert,并且传递相关参数)
306
-
307
- 斜杠调用方式举例
308
- ```
309
- /hmos-resources-convert android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> resource_mapping_path=<资源映射文档路径>
310
- ```
311
- 自然语言调用方式举例
312
- ```
313
- 帮我使用skill:hmos-resources-convert完成安卓应用到鸿蒙应用的资源转换,传递的参数是 android_project_dir=<安卓项目路径> harmony_project_dir=<鸿蒙项目路径> resource_mapping_path=<资源映射文档路径>
314
- ```
315
-
316
- **输入参数**
317
-
318
- | 参数 | 类型 | 说明 |
319
- |------|------|------|
320
- | `android_project_dir` | **必选** | Android项目根目录路径(含 `build.gradle` 或 `build.gradle.kts`) |
321
- | `harmony_project_dir` | **必选** | HarmonyOS项目输出路径 |
322
- | `resource_mapping_path` | **必选** | Android ↔ HarmonyOS资源映射文档的完整输出路径(`.md`) |
323
- | `apk_path` | 可选 | Android APK文件路径;提供后跳过Gradle构建,直接用apktool解包该APK提取资源 |
324
-
325
- **输出产物**
326
-
327
- | 产物 | 位置 | 说明 |
328
- |------|------|------|
329
- | `resources/` 目录 | HarmonyOS项目下 | 转换后的HarmonyOS资源(strings、colors、dimensions、images等) |
330
- | 资源映射文档 | `resource_mapping_path` | Android ↔ HarmonyOS资源条目映射(`.md`) |
331
- | 转换报告 | HarmonyOS项目下 | 资源转换过程与统计 |
332
-
333
- ### 测试用例生成(可独立运行;产出喂给集成测试)
334
-
335
- > 📦 依赖:Node.js ≥ 22.18 / 23.6(必需,非LLM校验脚本 `validate.ts`、BFS crawler 和 mapping 转换脚本经 Node 原生类型擦除运行,无需编译、无依赖);ADB + Android 设备/模拟器(可选,仅在需 TCG 自动产 `ui_elements.json` 时需要);其余由LLM编排。
336
-
337
- TCG 的主流程是测试用例生成:输入 spec-generate 产出的 `<feature>-SPEC.md`(`## 场景N` 原子场景块),输出自带四诚实证据的 `test_case.md` / `pre_test_case.md`,可直接作为集成测试skill的 `test_case_path` / `pre_test_case_path`。
338
-
339
- `ui_elements.json` 是这个生成流程的可选软参照,用于把操作具化为真实控件路径。若没有传入 `ui-elements-path`,但提供了 `package` 或 `android-project-dir`,TCG 会先运行 viewtree-based UI elements mapping 生成:使用 `tools/bfs-crawl/android_viewtree_bfs_crawler.ts` 采集 Android 运行时 viewtree dump,再通过转换脚本生成 mapping。
340
-
341
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-test-case-generation,并且传递相关参数)
342
-
343
- 斜杠调用方式举例
344
- ```
345
- /hmos-test-case-generation spec-path=<SPEC文档路径> package=<包名>
346
- ```
347
- 自然语言调用方式举例
348
- ```
349
- 帮我使用skill:hmos-test-case-generation基于规格文档生成测试用例,传递的参数是 spec-path=<SPEC文档路径> package=<包名>
350
- ```
351
-
352
- **输入参数**
353
-
354
- | 参数 | 类型 | 说明 |
355
- |------|------|------|
356
- | `spec-path` | **必选** | `<feature>-SPEC.md`(spec-generate 产出,含 `## 场景N` 原子场景块) |
357
- | `ui-elements-path` | 可选 | `ui_elements.json`(软参照,不保真、可缺;缺但给了 `package` 或 `android-project-dir` 时 TCG 自动产) |
358
- | `package` | 可选 | Android 应用包名(如 `com.example.app`);`ui-elements-path` 缺时直接用它跑 dump,优先于 `android-project-dir` |
359
- | `android-project-dir` | 可选 | Android 源码工程根目录;`package` 也缺时从 `build.gradle` 推导包名再跑 dump(需 ADB + 设备) |
360
- | `references-dir` | 可选 | 参考资料(操作定义/页面描述/模板/可复用前置用例库/特殊测试数据) |
361
- | `output-path` | 可选 | 输出目录;默认 `spec-path` 同级的 `testcase-output/` |
362
-
363
- **主要交付产物**
364
-
365
- | 产物 | 位置 | 说明 |
366
- |------|------|------|
367
- | `test_case.md` | `<output-path>/` 顶层 | 主测试用例(固定文件名,自带四诚实证据,作为下游 `hmos-integration-test` 的 `test_case_path`) |
368
- | `pre_test_case.md` | `<output-path>/` 顶层 | 前置用例(从「见前置用例」前提反向组装;无命中则不出) |
369
- | `review_notes.md` | `<output-path>/` 顶层 | 单一人工伴随件(阻塞区 + 非阻塞区合一;不得另产 `manual-intervention.md`) |
370
-
371
- > `output-path` 只放上表中的交付产物。运行时会在其同级创建 `{output-path}.work/`,保存 `_bfs_dump/`、`cases-report.json`、`md-report.json` 等过程产物。
372
-
373
- > 完成时 stdout 最后一行 `TCG_COMPLETE specs={N} ok={K} failed={A} output={output-path}`(N=场景数,K=两门均放行的场景数,A=留记号/FATAL的场景数)。
374
-
375
- ### 集成测试(已包含在步骤3的流水线,也可以单独运行)
376
-
377
- > 📦 依赖:DevEco Studio(必需,真机调试);鸿蒙真机(必需)。
378
-
379
- 打开本地editor(claude code,open code等),在会话中通过 `斜杠/ `或者 `自然语言 `的方式调用skill--hmos-integration-test,并且传递相关参数)
380
-
381
- 斜杠调用方式举例
382
- ```
383
- /hmos-integration-test test_case_path=<测试用例路径> hap_path=<签名HAP路径>
384
- ```
385
- 自然语言调用方式举例
386
- ```
387
- 帮我使用skill:hmos-integration-test基于测试用例完成鸿蒙应用的集成测试,传递的参数是 test_case_path=<测试用例路径> hap_path=<签名HAP路径>
388
- ```
389
-
390
- **输入参数**
391
-
392
- | 参数 | 类型 | 说明 |
393
- |------|------|------|
394
- | `test_case_path` | **必选** | `test_case.md` 测试用例文件路径 |
395
- | `hap_path` | **必选** | 已签名的HAP文件路径 |
396
- | `output_path` | 可选 | 报告输出目录 |
397
- | `pre_test_case_path` | 可选 | 前置用例文件路径 |
398
- | `android_project_dir` | 可选 | Android项目路径(修复时参考) |
399
- | `max_rounds` | 可选 | 测试-修复循环最大轮数(默认 `3`) |
400
-
401
- **输出产物**
402
-
403
- | 产物 | 位置 | 说明 |
404
- |------|------|------|
405
- | 测试报告 | `output_path` | 测试结果、通过/失败用例统计 |
406
- | 失败用例详情 | `output_path` | 失败用例的复现步骤与日志 |
407
- | 修复建议 | `output_path` | 针对失败用例的修复方向(进入测试-修复循环时生效) |
1
+ # HomeTrans integrated into [DevEco Code](https://gitcode.com/openharmony-sig/deveco-code/)