@buaa_smat/hometrans 0.1.0 → 0.1.2

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 (136) hide show
  1. package/README.md +141 -124
  2. package/agents/build-fixer.md +1 -0
  3. package/agents/code-review-fix.md +1 -0
  4. package/agents/code-reviewer.md +1 -0
  5. package/agents/logic-coding.md +1 -0
  6. package/agents/logic-context-builder.md +1 -0
  7. package/agents/review-fixer.md +1 -0
  8. package/agents/self-test-fixer.md +1 -0
  9. package/agents/self-tester.md +260 -233
  10. package/agents/spec-generator.md +1 -0
  11. package/agents/test-tools/autotest/README.md +223 -0
  12. package/agents/test-tools/autotest/config.yaml.example +58 -0
  13. package/agents/test-tools/autotest/pyproject.toml +16 -0
  14. package/agents/test-tools/autotest/report_tool.py +759 -0
  15. package/agents/test-tools/autotest/self_test_runner.py +773 -0
  16. package/agents/test-tools/autotest/testcases_schema.md +143 -0
  17. package/agents/test-tools/autotest/testcases_tool.py +215 -0
  18. package/agents/test-tools/autotest/uv.lock +3156 -0
  19. package/agents/test-tools/harmony_autotest-0.1.0-py3-none-any.whl +0 -0
  20. package/agents/test-tools/hypium-6.1.0.210-py3-none-any.whl +0 -0
  21. package/agents/test-tools/hypium_mcp-0.6.5-py3-none-any.whl +0 -0
  22. package/agents/test-tools/xdevice-6.1.0.210-py3-none-any.whl +0 -0
  23. package/agents/test-tools/xdevice_devicetest-6.1.0.210-py3-none-any.whl +0 -0
  24. package/agents/test-tools/xdevice_ohos-6.1.0.210-py3-none-any.whl +0 -0
  25. package/dist/cli/config-store.js +27 -2
  26. package/dist/cli/config.js +17 -6
  27. package/dist/cli/index.js +3 -2
  28. package/dist/cli/init.js +135 -22
  29. package/dist/cli/mcp.js +2 -2
  30. package/dist/context/index.js +165 -69
  31. package/package.json +59 -60
  32. package/skills/code-dev-review-fix/SKILL.md +279 -0
  33. package/skills/code-dev-review-fix-workspace/evals/evals.json +56 -0
  34. package/skills/code-dev-review-fix-workspace/iteration-1/routing-results.md +23 -0
  35. package/skills/convert_pipeline/SKILL.md +423 -439
  36. package/skills/hmos-resources-convert/SKILL.md +623 -0
  37. package/skills/hmos-resources-convert/evals/evals.json +171 -0
  38. package/skills/hmos-resources-convert/references/conversion-rules.md +663 -0
  39. package/skills/hmos-resources-convert/references/dependency-analysis-rules.md +388 -0
  40. package/skills/hmos-resources-convert/references/resource-mapping-rules.md +457 -0
  41. package/skills/hmos-resources-convert/references/xml-drawable-to-svg-rules.md +513 -0
  42. package/skills/hmos-resources-convert/template/AppScope/app.json5 +10 -0
  43. package/skills/hmos-resources-convert/template/AppScope/resources/base/element/string.json +8 -0
  44. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/background.png +0 -0
  45. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/foreground.png +0 -0
  46. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/layered_image.json +7 -0
  47. package/skills/hmos-resources-convert/template/build-profile.json5 +42 -0
  48. package/skills/hmos-resources-convert/template/code-linter.json5 +32 -0
  49. package/skills/hmos-resources-convert/template/entry/build-profile.json5 +33 -0
  50. package/skills/hmos-resources-convert/template/entry/hvigorfile.ts +6 -0
  51. package/skills/hmos-resources-convert/template/entry/obfuscation-rules.txt +23 -0
  52. package/skills/hmos-resources-convert/template/entry/oh-package.json5 +10 -0
  53. package/skills/hmos-resources-convert/template/entry/src/main/ets/entryability/EntryAbility.ets +48 -0
  54. package/skills/hmos-resources-convert/template/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +16 -0
  55. package/skills/hmos-resources-convert/template/entry/src/main/ets/pages/Index.ets +23 -0
  56. package/skills/hmos-resources-convert/template/entry/src/main/module.json5 +55 -0
  57. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/color.json +8 -0
  58. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/float.json +8 -0
  59. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/string.json +16 -0
  60. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/background.png +0 -0
  61. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/foreground.png +0 -0
  62. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/layered_image.json +7 -0
  63. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/startIcon.png +0 -0
  64. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/backup_config.json +3 -0
  65. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/main_pages.json +5 -0
  66. package/skills/hmos-resources-convert/template/entry/src/main/resources/dark/element/color.json +8 -0
  67. package/skills/hmos-resources-convert/template/entry/src/mock/mock-config.json5 +2 -0
  68. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/Ability.test.ets +35 -0
  69. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/List.test.ets +5 -0
  70. package/skills/hmos-resources-convert/template/entry/src/ohosTest/module.json5 +16 -0
  71. package/skills/hmos-resources-convert/template/entry/src/test/List.test.ets +5 -0
  72. package/skills/hmos-resources-convert/template/entry/src/test/LocalUnit.test.ets +33 -0
  73. package/skills/hmos-resources-convert/template/hvigor/hvigor-config.json5 +23 -0
  74. package/skills/hmos-resources-convert/template/hvigorfile.ts +6 -0
  75. package/skills/hmos-resources-convert/template/oh-package-lock.json5 +28 -0
  76. package/skills/hmos-resources-convert/template/oh-package.json5 +10 -0
  77. package/skills/hmos-resources-convert/tools/apktool.bat +85 -0
  78. package/skills/hmos-resources-convert/tools/apktool_3.0.1.jar +0 -0
  79. package/skills/hmos-ui-align/SKILL.md +182 -0
  80. package/skills/hmos-ui-align/config-example.json +11 -0
  81. package/skills/hmos-ui-align/config.json +11 -0
  82. package/skills/hmos-ui-align/diff_analysis.md +53 -0
  83. package/skills/hmos-ui-align/page_align.md +62 -0
  84. package/skills/hmos-ui-align/readme.md +231 -0
  85. package/skills/hmos-ui-align/references/Comparison_Template.md +2 -0
  86. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +648 -0
  87. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +2089 -0
  88. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +1033 -0
  89. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +1183 -0
  90. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +576 -0
  91. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +297 -0
  92. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@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 +395 -0
  93. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/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 +903 -0
  94. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -0
  95. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/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 +1178 -0
  96. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217V1.md +911 -0
  97. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
  98. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/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 +355 -0
  99. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243//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 +11 -0
  100. package/skills/hmos-ui-align/references/UI_Analysis_Template.md +4 -0
  101. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
  102. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
  103. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
  104. package/skills/hmos-ui-align/scripts/app_feature_verify.py +443 -0
  105. package/skills/hmos-ui-align/scripts/navigation-capure.md +37 -0
  106. package/skills/hmos-ui-align/scripts/page_capture.py +592 -0
  107. package/skills/hmos-ui-align-batch/SKILL.md +99 -0
  108. package/skills/hmos-ui-align-batch/references/conversion-procedure.md +180 -0
  109. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
  110. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
  111. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
  112. package/skills/hmos-ui-align-batch/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 +648 -0
  113. package/skills/hmos-ui-align-batch/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 +2089 -0
  114. package/skills/hmos-ui-align-batch/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 +1033 -0
  115. package/skills/hmos-ui-align-batch/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 +1183 -0
  116. package/skills/hmos-ui-align-batch/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 +576 -0
  117. package/skills/hmos-ui-align-batch/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 +297 -0
  118. package/skills/hmos-ui-align-batch/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 +395 -0
  119. package/skills/hmos-ui-align-batch/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 +903 -0
  120. package/skills/hmos-ui-align-batch/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 +106 -0
  121. package/skills/hmos-ui-align-batch/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 +1178 -0
  122. package/skills/hmos-ui-align-batch/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
  123. package/skills/hmos-ui-align-batch/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 +355 -0
  124. package/skills/hmos-ui-align-batch/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 +11 -0
  125. package/skills/hmos-ui-align-batch/scripts/android_parse_fast.py +1606 -0
  126. package/skills/self-test/SKILL.md +369 -0
  127. package/skills/self-test/readme.md +309 -0
  128. package/skills/spec-generator-skill/SKILL.md +332 -0
  129. package/skills/spec-generator-skill/references/android-platform-tokens.md +105 -0
  130. package/skills/spec-generator-skill/references/spec-sample-1.md +78 -0
  131. package/skills/spec-generator-skill/references/spec-sample-2.md +58 -0
  132. package/skills/spec-generator-skill/references/spec-sample-3.md +116 -0
  133. package/skills/spec-generator-skill/references/step4-report-template.md +33 -0
  134. package/agents/self-test-setup.md +0 -165
  135. package/dist/context/resources/sdkConfig.json +0 -24
  136. package/src/context/resources/sdkConfig.json +0 -24
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: spec-generator
2
3
  description: Generates requirement specification (spec) documents for each requirement description file in a given folder by exploring an Android project and decomposing each requirement into atomic user scenarios
3
4
  color: cyan
4
5
  ---
@@ -0,0 +1,223 @@
1
+ # Self-Test Runner
2
+
3
+ HarmonyOS 应用自测执行器。负责把自然语言写的测试用例(`test_case.md`)跑在真机上,产出可读的测试报告。底层调用 `harmony-autotest` whl 完成 batch 执行,Agent 编排由 `self-tester`(统一的自测 agent,通过 `setup` 布尔参数控制是否生成用例)与 `self-test-fixer`(可选,按报告修复 HarmonyOS 代码)完成。
4
+
5
+ ---
6
+
7
+ ## 一、一次性准备
8
+
9
+ 每台机器装好插件后做一次即可。
10
+
11
+ ### 1. 工具依赖
12
+
13
+ 确认下列工具在 `PATH` 中:
14
+
15
+ | 工具 | 用途 | 验证命令 |
16
+ |------|------|----------|
17
+ | `uv` | Python 包管理 / 启动 `harmony-autotest` | `uv --version` |
18
+ | `hdc` | 设备连接 / 安装 HAP | `hdc version` |
19
+ | `python` ≥ 3.10 | 入口脚本 | `python --version` |
20
+
21
+ > `uv sync`(拉取 6 个 whl)由 `self_test_runner.py` 自动执行,无需手动 `pip install`。
22
+
23
+ ### 2. 填写 `config.yaml`(包含真实 api_key)
24
+
25
+ ```bash
26
+ cd agents/test-tools/autotest
27
+ cp config.yaml.example config.yaml
28
+ # 编辑 config.yaml,把所有 YOUR_API_KEY_HERE 替换成真实 api_key
29
+ ```
30
+
31
+ - `config.yaml` 已加入 `.gitignore`,不会被提交到仓库。
32
+ - `self_test_runner.py` 启动时会校验:文件存在 + 不含占位符;任一不满足则直接拒绝执行,并输出错误原因。
33
+ - 单层模式只需填 `unified_model.api_key`;双层模式需要同时填 `execute_model.api_key` 与 `decision_model.api_key`。模式由 `agent_mode` 字段决定。
34
+
35
+ ---
36
+
37
+ ## 二、准备测试输入
38
+
39
+ 在某个目录(下文记为 `<case-dir>`)下放置:
40
+
41
+ | 文件 | 必需 | 说明 |
42
+ |------|------|------|
43
+ | `test_case.md` | 是 | 常规测试用例集,多条 `### Scenario:` 块 |
44
+ | `pre_test_case.md` | 否 | 前置用例(如首启授权、新手引导);可写 0 / 1 / 多条 scenario |
45
+
46
+ 格式约定:每条 scenario 写两行
47
+
48
+ ```markdown
49
+ ### Scenario: 冷启动初始化后正常进入主页面
50
+ - 动作:打开应用 → 等待 5 秒
51
+ - 预期结果:文件夹网格主页面成功展示文件夹列表
52
+ ```
53
+
54
+ 并且 `<case-dir>` 向上某层目录里要能找到 `AppScope/app.json5`(HarmonyOS 工程根)—— `self-tester` 据此自动读取 `bundleName` 与 `app_name`。
55
+
56
+ ---
57
+
58
+ ## 三、Agent 流水线
59
+
60
+ ### 1. `self-tester`:解析用例并执行真机测试
61
+
62
+ 读取 `test_case.md`(首轮)与 `pre_test_case.md`(可选)→ 写入 `<output-path>/testcases.json` 和 `<output-path>/app-metadata.json` → 检测真机 → 安装 HAP → 跑 AutoTest → 渲染 `<output-path>/self-test-report.md`。前置用例自动以 `[PRE] ` 前缀置顶,按源文件顺序排列。`setup` 布尔参数控制是否运行解析阶段:
63
+
64
+ | 参数 | 是否必填 | 说明 |
65
+ |------|----------|------|
66
+ | `hap-path` | 必填 | 待测 HAP 包路径 |
67
+ | `output-path` | 必填 | 产物目录(JSON、报告、`task/` 都写在此根目录) |
68
+ | `test-case-path` | `setup=true` 时必填 | `test_case.md` 路径 |
69
+ | `pre-test-case-path` | 可选 | 前置用例文件路径;不传时自动从 `test-case-path` 同目录查找 |
70
+ | `setup` | 可选,默认 `true` | `true` = 解析 + 测试;`false` = 仅测试,要求 `<output-path>/testcases.json` 与 `<output-path>/app-metadata.json` 已存在 |
71
+
72
+ 产出:
73
+
74
+ - `<output-path>/testcases.json` — 用例数组(`setup=true` 时写入)
75
+ - `<output-path>/app-metadata.json` — `{ bundle_name, app_name, project_root }`(`setup=true` 时写入)
76
+ - `<output-path>/_extracted.json` — 用例提取的中间文件(`setup=true` 时写入)
77
+ - `<output-path>/self-test-report.md` — 自测报告(每次都写)
78
+ - `<output-path>/task/task_<timestamp>/` — AutoTest 原始产物(每条用例的 HTML 报告、日志、截图)
79
+
80
+ > **多轮迭代测试**:首轮用 `setup=true`,第二轮起用 `setup=false` 复用首轮产出的两个 JSON,不重复解析 `test_case.md`。
81
+
82
+ 执行前请先确认设备已连接:
83
+
84
+ ```bash
85
+ hdc list targets
86
+ ```
87
+
88
+ agent 会调用 `self_test_runner.py run` 完成前 4 步(1-3 同步、4 后台启动):
89
+
90
+ 1. 校验 `config.yaml`
91
+ 2. `uv sync`(首次 1–3 分钟,后续按 `pyproject.toml` 的 SHA256 自动跳过)
92
+ 3. `hdc uninstall` + `hdc install -r`
93
+ 4. 后台启动 `python -m AutoTest.batch`
94
+
95
+ 随后 agent 用 `self_test_runner.py status` 每 60 秒轮询一次直到 `COMPLETED`,再调 `report_tool.py generate` 把 `task_<ts>/` 产物渲染成 `self-test-report.md`。报告把前置用例与常规用例分两节渲染(`## 前置用例` / `## 用例详情`),由模板生成,不依赖 LLM 现写。
96
+
97
+ `<output-path>/task/task_<timestamp>/` 会保存 batch 运行期间的中间产物(`hypium_mcp.log` / `tmp_hypium/`)—— `AutoTest.batch` 启动时 cwd 即此目录,不再污染 `agents/test-tools/autotest/`。
98
+
99
+ ### 2. `self-test-fixer`:按报告修复 HarmonyOS 代码(可选)
100
+
101
+ 入参就是上一步的 `self-test-report.md`。当 `self-tester` 报告里有 FAIL 时再跑这一步。
102
+
103
+ ---
104
+
105
+ ## 四、直接调用 `self_test_runner.py`(不通过 agent)
106
+
107
+ agent 内部用的就是这个脚本,开发自测时可以直接调:
108
+
109
+ ```bash
110
+ cd agents/test-tools/autotest
111
+
112
+ # 启动一次自测(前台同步做准备 + 后台启动 batch,立即返回 PID)
113
+ python self_test_runner.py run \
114
+ --testcases <path-to-testcases.json> \
115
+ --hap <path-to-app.hap> \
116
+ --bundle-name com.example.xxx \
117
+ --category <app_name> \
118
+ --task-dir <out>/task \
119
+ --output-dir <out>
120
+
121
+ # 轮询状态(agent 每 60s 查一次)
122
+ python self_test_runner.py status --task-dir <out>/task --output-dir <out>
123
+
124
+ # 强行终止后台 batch
125
+ python self_test_runner.py kill --task-dir <out>/task
126
+
127
+ # 重置本地状态(杀残留进程 + 删 .venv + 删本目录残留中间产物)
128
+ # 用它代替手工 `rm -rf .venv` / `uv cache clean`,不会动全局 uv 缓存
129
+ python self_test_runner.py clean
130
+ ```
131
+
132
+ ### `report_tool.py` — 单独重渲染报告
133
+
134
+ batch 跑完后 agent 会自动调一次 `report_tool.py`;本地调试想重渲染某次历史 task:
135
+
136
+ ```bash
137
+ cd agents/test-tools/autotest
138
+ uv run python report_tool.py generate \
139
+ --task-subdir <out>/task/task_<ts> \
140
+ --app-metadata <out>/app-metadata.json \
141
+ --hap <hap-path> \
142
+ --device 127.0.0.1:5555 \
143
+ --suite "<title from test_case.md>" \
144
+ --out <out>/self-test-report.md \
145
+ --validate
146
+ ```
147
+
148
+ 也可以只校验一份已有的 `self-test-report.md`:
149
+
150
+ ```bash
151
+ uv run python report_tool.py validate <out>/self-test-report.md
152
+ ```
153
+
154
+ 读取 `summary.json` + `task_results.jsonl` + 每个 case 的 `<HHMMSS>.json`(解析 AutoTest planner agent 写入的 `<judgment>` 块),用模板渲染整份报告。完全无 LLM 调用。
155
+
156
+ 参数说明:
157
+
158
+ | 参数 | 含义 |
159
+ |------|------|
160
+ | `--testcases` | JSON 数组或 JSONL 均可,旧 JSON 数组会被自动转 JSONL |
161
+ | `--bundle-name` | HAP 包名,用于 `hdc uninstall` |
162
+ | `--category` | 测试分类标签,会传给 `AutoTest.batch`,建议直接用 `app_name` |
163
+ | `--task-dir` | 任务工作目录,脚本会在内部创建 `task_<timestamp>` 子目录 |
164
+ | `--output-dir` | 日志目录(`self_test_*.log`) |
165
+ | `--config` | 指定 `config.yaml` 路径;默认用本脚本同目录的 `config.yaml` |
166
+ | `--force-reinit` | 强制清空 `.venv` 重新 `uv sync`;默认只在 `pyproject.toml` 内容变化时重建 |
167
+
168
+ `status` 子命令的 JSON 响应字段:
169
+
170
+ | 字段 | 含义 |
171
+ |------|------|
172
+ | `status` | `RUNNING` / `COMPLETED` / `CRASHED` / `NOT_STARTED` |
173
+ | `cases_done` | 已完成的用例数 |
174
+ | `pass_count` / `fail_count` / `unknown_count` | 仅 `COMPLETED` 时给出 |
175
+ | `task_subdir` | `task_<timestamp>` 绝对路径,AutoTest 产物都在里面 |
176
+ | `log_tail` | runner 日志最近 5 行 |
177
+
178
+ ---
179
+
180
+ ## 五、目录布局一览
181
+
182
+ ```
183
+ agents/test-tools/autotest/
184
+ ├── README.md # 本文件
185
+ ├── .gitignore # 排除 .venv / config.yaml / 运行期日志等
186
+ ├── pyproject.toml # 声明 6 个远程 whl URL(harmony-autotest / hypium_mcp / hypium / xdevice*3)
187
+ ├── uv.lock # 与 pyproject.toml 配套的版本锁定文件
188
+ ├── config.yaml.example # 用户拷贝填 api_key 的模板
189
+ ├── config.yaml # 用户填好的真实配置(.gitignore 中,不入库)
190
+ ├── self_test_runner.py # 入口脚本:run / status / kill / clean
191
+ ├── testcases_tool.py # 子命令 generate / validate(_extracted.json → testcases.json,含格式校验)
192
+ ├── report_tool.py # 子命令 generate / validate(task_<ts>/ → self-test-report.md,含格式校验)
193
+ ├── testcases_schema.md # testcases.json 字段规范
194
+ └── .venv/ # uv sync 产出(被 .gitignore 排除)
195
+ ```
196
+
197
+ ---
198
+
199
+ ## 六、常见问题
200
+
201
+ **Q: `config.yaml missing or api_key not filled`**
202
+ A: 复制 `config.yaml.example` → `config.yaml` 并填入真实 api_key 后重试。
203
+
204
+ **Q: `uv sync` 卡住或失败**
205
+ A: 6 个 whl 都从 gitcode API v5 拉,需要外网访问 `gitcode.com`。失败时检查代理 / 网络;也可以 `--force-reinit` 强制重建。
206
+
207
+ **Q: 测试过程被打断,下次跑会冲突吗?**
208
+ A: 不会。`self_test_runner.py run` 启动时会扫描并 kill 残留的 `AutoTest.batch` / `hypium_mcp` / `harmony_autotest` 进程(不止靠 PID 文件,按命令行名兜底),并自动清掉本目录顶层的 `tmp_hypium/` / `hypium_mcp.log` 等遗留中间产物。`task/` 目录在 agent 流程里也会被清空。
209
+
210
+ **Q: 想彻底重置一遍本地状态再跑?**
211
+ A: 跑一次 `python self_test_runner.py clean`:杀残留 → 删 `.venv` → 删 `tmp_hypium/` / `hypium_mcp.log` / `batch.pid` / `batch_stdout.log`。**不要**手工 `uv cache clean`——全局缓存清空后重装 6 个 whl 要从 gitcode 重新拉(1–3 分钟);保留缓存的话 `uv sync` 只需几秒。
212
+
213
+ **Q: 想自己改 `testcases.json` 后再跑?**
214
+ A: 改完后跑一遍校验,再交给 `self-tester`(`setup=false`):
215
+
216
+ ```bash
217
+ uv run python testcases_tool.py validate <path-to-testcases.json>
218
+ ```
219
+
220
+ 只有打印 `VALIDATION PASSED` 才能用。
221
+
222
+ **Q: 报告里 `AutoTest 任务路径` 指向哪?**
223
+ A: 每条用例的 AutoTest 执行目录(HTML 报告 + 日志 + 截图),路径形如 `<output>/task/task_<ts>/<case_name>/`。报告里所有 case 都必须带这个字段。
@@ -0,0 +1,58 @@
1
+ # AutoTest Configuration — User-provided overlay
2
+ #
3
+ # 使用方法:
4
+ # 1. 复制本文件为同目录下的 `config.yaml`
5
+ # 2. 填入所有 `YOUR_API_KEY_HERE` 占位的真实 api_key(至少 unified_model 或对应模式下的 model)
6
+ # 3. self_test_runner.py 在启动前会校验 config.yaml 存在且 api_key 已替换,否则拒绝执行
7
+ #
8
+ # 该文件最终通过 `python -m AutoTest.batch --config <绝对路径>` 注入到 AutoTest,
9
+ # 覆盖 whl 内置的同名默认配置(默认配置里 api_key 全是占位符)。
10
+
11
+ # Agent Mode: "layered" (双层模式) | "single" (单层模式)
12
+ agent_mode: "single"
13
+
14
+ # ===== 双层模式配置 =====
15
+ execute_model:
16
+ name: "gui-plus-2026-02-26"
17
+ base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
18
+ api_key: "YOUR_API_KEY_HERE"
19
+ provider: "mai-ui"
20
+ max_steps: 3
21
+
22
+ decision_model:
23
+ name: "qwen3.5-plus"
24
+ base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
25
+ api_key: "YOUR_API_KEY_HERE"
26
+ provider: "openai"
27
+ temperature: 0.0
28
+ top_p: 0.1
29
+ frequency_penalty: 1.0
30
+
31
+ # ===== 单层模式配置 =====
32
+ unified_model:
33
+ name: "qwen3.5-plus"
34
+ base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
35
+ api_key: "YOUR_API_KEY_HERE"
36
+ provider: "openai"
37
+ temperature: 0.1
38
+ top_p: 0.9
39
+ frequency_penalty: 0.5
40
+
41
+ # ===== 设备配置 =====
42
+ device:
43
+ device_sn: null
44
+ ip: "127.0.0.1"
45
+ port: 8710
46
+ device_log_level: "debug"
47
+
48
+ # ===== Agent 通用配置 =====
49
+ agent:
50
+ max_steps: 50
51
+ verbose: true
52
+ lang: "zh"
53
+ enable_preprocess: false
54
+ # debug_mode: null | "memory" | "file"
55
+ debug_mode: null
56
+
57
+ # ===== 自定义适配器(可选) =====
58
+ # adapter_class: "external.custom_adapter.CustomMCPAdapter"
@@ -0,0 +1,16 @@
1
+ [project]
2
+ name = "auto-test-runner"
3
+ version = "0.1.0"
4
+ description = "Self-test runner harness for HarmonyOS apps; delegates execution to the harmony-autotest whl."
5
+ requires-python = ">=3.10"
6
+ dependencies = [
7
+ "harmony-autotest @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/harmony_autotest-0.1.0-py3-none-any.whl?ref=main",
8
+ "hypium_mcp @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/hypium_mcp-0.6.5-py3-none-any.whl?ref=main",
9
+ "hypium @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/hypium-6.1.0.210-py3-none-any.whl?ref=main",
10
+ "xdevice @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/xdevice-6.1.0.210-py3-none-any.whl?ref=main",
11
+ "xdevice-ohos @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/xdevice_ohos-6.1.0.210-py3-none-any.whl?ref=main",
12
+ "xdevice-devicetest @ https://gitcode.com/api/v5/repos/SMAT/HomeTrans/raw/agents/test-tools/xdevice_devicetest-6.1.0.210-py3-none-any.whl?ref=main",
13
+ ]
14
+
15
+ [[tool.uv.index]]
16
+ url = "https://pypi.tuna.tsinghua.edu.cn/simple"