@buaa_smat/hometrans 0.1.13 → 0.1.15

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 (88) hide show
  1. package/README.md +194 -136
  2. package/agents/build-fixer.md +38 -48
  3. package/agents/code-reviewer.md +20 -20
  4. package/agents/logic-coder.md +8 -8
  5. package/agents/logic-context-builder.md +5 -5
  6. package/agents/review-fixer.md +16 -16
  7. package/agents/self-test-fixer.md +15 -15
  8. package/agents/self-tester.md +56 -55
  9. package/agents/spec-generator.md +16 -16
  10. package/dist/cli/config-store.js +120 -9
  11. package/dist/cli/config.js +4 -4
  12. package/dist/cli/env-vars.js +129 -0
  13. package/dist/cli/init.js +315 -276
  14. package/dist/cli/uninstall.js +152 -17
  15. package/dist/context/index.js +10 -197
  16. package/env-requirements.json +181 -181
  17. package/package.json +1 -1
  18. package/resource/choose_editor.png +0 -0
  19. package/resource/common_config.png +0 -0
  20. package/resource/integration_test_config.png +0 -0
  21. package/resource/migration_process.svg +94 -0
  22. package/resource/migration_process_transparent.svg +93 -0
  23. package/resource/set_env.png +0 -0
  24. package/resource/ui_align_config.png +0 -0
  25. package/skills/hmos-batch-ui-align/SKILL.md +10 -0
  26. package/skills/hmos-batch-ui-align/references/conversion-procedure.md +180 -180
  27. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2533 -2533
  28. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -555
  29. package/skills/hmos-batch-ui-align/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -117
  30. package/skills/hmos-batch-ui-align/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 -648
  31. package/skills/hmos-batch-ui-align/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 +2088 -2088
  32. package/skills/hmos-batch-ui-align/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 -1033
  33. package/skills/hmos-batch-ui-align/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 -1183
  34. package/skills/hmos-batch-ui-align/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 -576
  35. package/skills/hmos-batch-ui-align/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 -297
  36. package/skills/hmos-batch-ui-align/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 -395
  37. package/skills/hmos-batch-ui-align/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 +902 -902
  38. package/skills/hmos-batch-ui-align/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 -106
  39. package/skills/hmos-batch-ui-align/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 -1178
  40. package/skills/hmos-batch-ui-align/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -911
  41. package/skills/hmos-batch-ui-align/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 +354 -354
  42. package/skills/hmos-batch-ui-align/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 -11
  43. package/skills/hmos-convert-pipeline/SKILL.md +63 -49
  44. package/skills/hmos-fix-build-errors/SKILL.md +5 -6
  45. package/skills/hmos-fix-build-errors/references/arkts-strict-patterns.md +219 -219
  46. package/skills/hmos-fix-build-errors/references/known-patterns.md +157 -157
  47. package/skills/hmos-fix-build-errors/references/rdb-entity-pattern.md +131 -131
  48. package/skills/hmos-incremental-ui-align/{readme.md → README.md} +28 -21
  49. package/skills/hmos-incremental-ui-align/SKILL.md +46 -27
  50. package/skills/hmos-incremental-ui-align/diff_analysis.md +52 -52
  51. package/skills/hmos-incremental-ui-align/page_align.md +62 -62
  52. package/skills/hmos-incremental-ui-align/references/Comparison_Template.md +2 -2
  53. package/skills/hmos-incremental-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 -648
  54. package/skills/hmos-incremental-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 +2088 -2088
  55. package/skills/hmos-incremental-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 -1033
  56. package/skills/hmos-incremental-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 -1183
  57. package/skills/hmos-incremental-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 -576
  58. package/skills/hmos-incremental-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 -297
  59. package/skills/hmos-incremental-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 -395
  60. package/skills/hmos-incremental-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 +902 -902
  61. package/skills/hmos-incremental-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 -106
  62. package/skills/hmos-incremental-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 -1178
  63. package/skills/hmos-incremental-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 -911
  64. package/skills/hmos-incremental-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 +354 -354
  65. package/skills/hmos-incremental-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 -11
  66. package/skills/hmos-incremental-ui-align/references/UI_Analysis_Template.md +3 -3
  67. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2533 -2533
  68. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -555
  69. package/skills/hmos-incremental-ui-align/references/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -117
  70. package/skills/hmos-incremental-ui-align/scripts/navigation-capure.md +37 -37
  71. package/skills/hmos-integration-test/{readme.md → README.md} +38 -38
  72. package/skills/hmos-integration-test/SKILL.md +63 -52
  73. package/skills/hmos-resources-convert/SKILL.md +5 -5
  74. package/skills/hmos-resources-convert/references/conversion-rules.md +663 -663
  75. package/skills/hmos-resources-convert/references/dependency-analysis-rules.md +388 -388
  76. package/skills/hmos-resources-convert/references/resource-mapping-rules.md +457 -457
  77. package/skills/hmos-resources-convert/references/xml-drawable-to-svg-rules.md +513 -513
  78. package/skills/hmos-spec-generate/SKILL.md +19 -19
  79. package/skills/hmos-spec-generate/references/android-platform-tokens.md +105 -105
  80. package/skills/hmos-spec-generate/references/spec-sample-1.md +78 -78
  81. package/skills/hmos-spec-generate/references/spec-sample-2.md +58 -58
  82. package/skills/hmos-spec-generate/references/spec-sample-3.md +116 -116
  83. package/skills/hmos-spec-generate/references/step4-report-template.md +33 -33
  84. package/tools/test-tools/autotest/README.md +33 -17
  85. package/tools/test-tools/autotest/self_test_runner.py +109 -15
  86. package/resource/hometrans_config.png +0 -0
  87. package/skills/hmos-incremental-ui-align/config-example.json +0 -11
  88. package/tools/test-tools/autotest/config.yaml.example +0 -58
@@ -1,116 +1,116 @@
1
- # Spec Sample 3 — Shared-mechanic + Per-value Decomposition (Enumerated Setting with Multiple Entries)
2
-
3
- **Style focus**: enumerated settings (a "三选一" choice) accessible from MULTIPLE entry points where (a) the menu interaction is identical across all entries AND all values, (b) each value carries its own runtime semantics. Factor the shared menu interaction across all entries into ONE scenario (do NOT split per entry); give each enum value its OWN runtime-semantics scenario (do NOT bundle "user picks X" with "what X does"); cover entry-point synchronization as a separate scenario.
4
-
5
- **Anti-pattern**: splitting the mechanical scenario per entry point, or bundling "user picks X" with "what X does" in the same scenario per value — both lose information (menu mechanics get silently dropped, and per-entry duplication breaks DRY).
6
-
7
- **Read when**: 3.5 Synthesize.
8
-
9
- ---
10
-
11
- # 视频自动播放SPEC
12
-
13
- 用户在"设置-视频偏好"入口或"视频列表页"入口的"自动播放"项中选择视频自动播放策略, 决定视频列表里视频卡片的自动播放范围。
14
-
15
- ## 场景一
16
-
17
- ### 场景概述
18
-
19
- 用户在"设置-视频偏好"入口或"视频列表页"入口的"自动播放"项中选择一种策略
20
-
21
- ### 场景逻辑步骤
22
-
23
- - 1. 用户在"设置-视频偏好"页面点击"自动播放"项, 或者用户在"视频列表页"右上角菜单中点击"自动播放"项
24
- - 2. 弹出三选一选项菜单, 按顺序列出: "始终自动播放" / "仅 Wi-Fi 下自动播放" / "从不自动播放"
25
- - 3. 选项菜单中当前生效的策略处于选中高亮状态
26
- - 4. 用户点击其中一个选项
27
- - 5. 选项菜单关闭, 新选中的策略立即生效; "自动播放"项的副标题刷新为新选中选项的文案
28
- - 6. 当前视频列表按新策略立即重新判定每张可见视频卡片的自动播放行为并刷新
29
-
30
- ## 场景二
31
-
32
- ### 场景概述
33
-
34
- 应用启动时加载"自动播放"策略的上次保存值, 未设置过时按默认值生效
35
-
36
- ### 场景逻辑步骤
37
-
38
- - 1. 应用启动
39
- - 2. 读取上次保存的"自动播放"策略值, 作为本次启动后的当前生效策略
40
- - 3. 如果从未设置过该选项, 或读取到的值无法识别, 则当前生效策略回退为默认值"仅 Wi-Fi 下自动播放"
41
- - 4. 用户从任一入口打开"自动播放"项时, 副标题与选项菜单的选中高亮均反映该当前生效值
42
-
43
- ## 场景三
44
-
45
- ### 场景概述
46
-
47
- 当策略为"始终自动播放"时, 任意网络下可见视频卡片均自动播放
48
-
49
- ### 场景逻辑步骤
50
-
51
- - 1. 当前生效策略为"始终自动播放"
52
- - 2. 视频列表中每张滚入可视区域的视频卡片自动开始静音播放, 不区分当前网络类型
53
- - 3. 视频卡片滚出可视区域时停止播放; 再次滚回时恢复播放
54
-
55
- ## 场景四
56
-
57
- ### 场景概述
58
-
59
- 当策略为"仅 Wi-Fi 下自动播放"时, 仅 Wi-Fi 网络下视频卡片自动播放
60
-
61
- ### 场景逻辑步骤
62
-
63
- - 1. 当前生效策略为"仅 Wi-Fi 下自动播放"
64
- - 2. 实时判定当前网络类型:
65
- - 2.1 当前为 Wi-Fi 时, 视频列表中每张滚入可视区域的视频卡片自动开始静音播放
66
- - 2.2 当前为蜂窝数据或离线状态时, 视频卡片显示首帧静态封面, 不自动播放
67
- - 3. 播放过程中网络类型切换时, 立即按新网络类型重新判定
68
-
69
- ## 场景五
70
-
71
- ### 场景概述
72
-
73
- 当策略为"从不自动播放"时, 所有视频卡片均不自动播放
74
-
75
- ### 场景逻辑步骤
76
-
77
- - 1. 当前生效策略为"从不自动播放"
78
- - 2. 视频列表中所有视频卡片显示首帧静态封面, 不自动启动播放
79
- - 3. 仅当用户主动点击视频卡片中央播放按钮时开始播放
80
-
81
- ## 场景六
82
-
83
- ### 场景概述
84
-
85
- 用户在任一入口修改策略后, 另一入口与视频列表同步反映新值
86
-
87
- ### 场景逻辑步骤
88
-
89
- - 1. 用户在"设置-视频偏好"入口或"视频列表页"入口任一处修改"自动播放"策略
90
- - 2. 当前视频列表立即按新策略重新判定每张可见视频卡片的自动播放行为并刷新
91
- - 3. 用户随后打开另一入口的"自动播放"项时, 副标题与选项菜单的选中高亮均显示为刚刚修改后的值
92
- - 4. 下次启动应用, 该策略依然保持为修改后的值
93
-
94
- ## 场景七
95
-
96
- ### 场景概述
97
-
98
- 用户打开"自动播放"选项菜单后未做选择就关闭
99
-
100
- ### 场景逻辑步骤
101
-
102
- - 1. 用户在任一入口打开"自动播放"项, 弹出选项菜单
103
- - 2. 用户通过点击菜单外部区域或按系统返回键关闭菜单, 未做任何选择
104
- - 3. 当前生效策略保持不变, 副标题保持原值, 视频列表自动播放行为保持原状
105
-
106
- ## 场景八
107
-
108
- ### 场景概述
109
-
110
- "视频自动播放"策略的作用范围与不作用范围
111
-
112
- ### 场景逻辑步骤
113
-
114
- - 1. **仅作用于** 以下界面: "视频列表页"的视频卡片自动播放行为; "设置-视频偏好"页和"视频列表页"右上角菜单的"自动播放"项副标题与选项菜单选中态
115
- - 2. **不作用于** 以下界面: "视频详情页"(用户进入后总是自动播放, 不受策略约束) / "首页轮播视频"(由首页独立策略控制) / "搜索结果中的视频项"(不显示自动播放) / "评论区嵌入视频"(由评论区独立策略控制)
116
- - 3. **不作用于** 以下设备情形: 车载模式下视频卡片均不自动播放, 与策略无关
1
+ # Spec Sample 3 — Shared-mechanic + Per-value Decomposition (Enumerated Setting with Multiple Entries)
2
+
3
+ **Style focus**: enumerated settings (a "三选一" choice) accessible from MULTIPLE entry points where (a) the menu interaction is identical across all entries AND all values, (b) each value carries its own runtime semantics. Factor the shared menu interaction across all entries into ONE scenario (do NOT split per entry); give each enum value its OWN runtime-semantics scenario (do NOT bundle "user picks X" with "what X does"); cover entry-point synchronization as a separate scenario.
4
+
5
+ **Anti-pattern**: splitting the mechanical scenario per entry point, or bundling "user picks X" with "what X does" in the same scenario per value — both lose information (menu mechanics get silently dropped, and per-entry duplication breaks DRY).
6
+
7
+ **Read when**: 3.5 Synthesize.
8
+
9
+ ---
10
+
11
+ # 视频自动播放SPEC
12
+
13
+ 用户在"设置-视频偏好"入口或"视频列表页"入口的"自动播放"项中选择视频自动播放策略, 决定视频列表里视频卡片的自动播放范围。
14
+
15
+ ## 场景一
16
+
17
+ ### 场景概述
18
+
19
+ 用户在"设置-视频偏好"入口或"视频列表页"入口的"自动播放"项中选择一种策略
20
+
21
+ ### 场景逻辑步骤
22
+
23
+ - 1. 用户在"设置-视频偏好"页面点击"自动播放"项, 或者用户在"视频列表页"右上角菜单中点击"自动播放"项
24
+ - 2. 弹出三选一选项菜单, 按顺序列出: "始终自动播放" / "仅 Wi-Fi 下自动播放" / "从不自动播放"
25
+ - 3. 选项菜单中当前生效的策略处于选中高亮状态
26
+ - 4. 用户点击其中一个选项
27
+ - 5. 选项菜单关闭, 新选中的策略立即生效; "自动播放"项的副标题刷新为新选中选项的文案
28
+ - 6. 当前视频列表按新策略立即重新判定每张可见视频卡片的自动播放行为并刷新
29
+
30
+ ## 场景二
31
+
32
+ ### 场景概述
33
+
34
+ 应用启动时加载"自动播放"策略的上次保存值, 未设置过时按默认值生效
35
+
36
+ ### 场景逻辑步骤
37
+
38
+ - 1. 应用启动
39
+ - 2. 读取上次保存的"自动播放"策略值, 作为本次启动后的当前生效策略
40
+ - 3. 如果从未设置过该选项, 或读取到的值无法识别, 则当前生效策略回退为默认值"仅 Wi-Fi 下自动播放"
41
+ - 4. 用户从任一入口打开"自动播放"项时, 副标题与选项菜单的选中高亮均反映该当前生效值
42
+
43
+ ## 场景三
44
+
45
+ ### 场景概述
46
+
47
+ 当策略为"始终自动播放"时, 任意网络下可见视频卡片均自动播放
48
+
49
+ ### 场景逻辑步骤
50
+
51
+ - 1. 当前生效策略为"始终自动播放"
52
+ - 2. 视频列表中每张滚入可视区域的视频卡片自动开始静音播放, 不区分当前网络类型
53
+ - 3. 视频卡片滚出可视区域时停止播放; 再次滚回时恢复播放
54
+
55
+ ## 场景四
56
+
57
+ ### 场景概述
58
+
59
+ 当策略为"仅 Wi-Fi 下自动播放"时, 仅 Wi-Fi 网络下视频卡片自动播放
60
+
61
+ ### 场景逻辑步骤
62
+
63
+ - 1. 当前生效策略为"仅 Wi-Fi 下自动播放"
64
+ - 2. 实时判定当前网络类型:
65
+ - 2.1 当前为 Wi-Fi 时, 视频列表中每张滚入可视区域的视频卡片自动开始静音播放
66
+ - 2.2 当前为蜂窝数据或离线状态时, 视频卡片显示首帧静态封面, 不自动播放
67
+ - 3. 播放过程中网络类型切换时, 立即按新网络类型重新判定
68
+
69
+ ## 场景五
70
+
71
+ ### 场景概述
72
+
73
+ 当策略为"从不自动播放"时, 所有视频卡片均不自动播放
74
+
75
+ ### 场景逻辑步骤
76
+
77
+ - 1. 当前生效策略为"从不自动播放"
78
+ - 2. 视频列表中所有视频卡片显示首帧静态封面, 不自动启动播放
79
+ - 3. 仅当用户主动点击视频卡片中央播放按钮时开始播放
80
+
81
+ ## 场景六
82
+
83
+ ### 场景概述
84
+
85
+ 用户在任一入口修改策略后, 另一入口与视频列表同步反映新值
86
+
87
+ ### 场景逻辑步骤
88
+
89
+ - 1. 用户在"设置-视频偏好"入口或"视频列表页"入口任一处修改"自动播放"策略
90
+ - 2. 当前视频列表立即按新策略重新判定每张可见视频卡片的自动播放行为并刷新
91
+ - 3. 用户随后打开另一入口的"自动播放"项时, 副标题与选项菜单的选中高亮均显示为刚刚修改后的值
92
+ - 4. 下次启动应用, 该策略依然保持为修改后的值
93
+
94
+ ## 场景七
95
+
96
+ ### 场景概述
97
+
98
+ 用户打开"自动播放"选项菜单后未做选择就关闭
99
+
100
+ ### 场景逻辑步骤
101
+
102
+ - 1. 用户在任一入口打开"自动播放"项, 弹出选项菜单
103
+ - 2. 用户通过点击菜单外部区域或按系统返回键关闭菜单, 未做任何选择
104
+ - 3. 当前生效策略保持不变, 副标题保持原值, 视频列表自动播放行为保持原状
105
+
106
+ ## 场景八
107
+
108
+ ### 场景概述
109
+
110
+ "视频自动播放"策略的作用范围与不作用范围
111
+
112
+ ### 场景逻辑步骤
113
+
114
+ - 1. **仅作用于** 以下界面: "视频列表页"的视频卡片自动播放行为; "设置-视频偏好"页和"视频列表页"右上角菜单的"自动播放"项副标题与选项菜单选中态
115
+ - 2. **不作用于** 以下界面: "视频详情页"(用户进入后总是自动播放, 不受策略约束) / "首页轮播视频"(由首页独立策略控制) / "搜索结果中的视频项"(不显示自动播放) / "评论区嵌入视频"(由评论区独立策略控制)
116
+ - 3. **不作用于** 以下设备情形: 车载模式下视频卡片均不自动播放, 与策略无关
@@ -1,33 +1,33 @@
1
- # Step 4 — Summary Report Template
2
-
3
- **Read when**: Step 4, for the report output format.
4
-
5
- Produce the report following the structure below. Keep the in-session reply within ~40 lines; per-block detail belongs in spec / trace files, not in the report.
6
-
7
- ## Per-block table
8
-
9
- | feature | input title | spec path | trace path | recall | scenarios | deviations |
10
- |---|---|---|---|---|---|---|
11
- | `<feature-1>` | `<title-1>` | `<feature-1>-SPEC.md` | `.trace/<feature-1>.md` | ok | 4 | 1 |
12
- | `<feature-2>` | `<title-2>` | `<feature-2>-SPEC.md` | `.trace/<feature-2>.md` | ok | 2 | 0 |
13
- | `<feature-3>` | `<title-3>` | — | — | no_recall | — | — |
14
- | ... | | | | | | |
15
-
16
- Recall column values: `ok`, `no_recall`, `skipped`.
17
-
18
- ## Skipped blocks
19
-
20
- If any blocks were skipped (`empty body` / `no_recall` / `error`), list them:
21
-
22
- - `<feature>` — `<title>` — reason: `empty body`
23
- - `<feature>` — `<title>` — reason: `no_recall`
24
- - `<feature>` — `<title>` — reason: `error: <verbatim error message>`
25
-
26
- ## Aggregates
27
-
28
- - Total REQ blocks parsed: `<N>`
29
- - Total specs generated: `<M>` (M ≤ N)
30
- - Total atomic scenarios produced: `<S>`
31
- - Total deviations recorded across all traces: `<D>`
32
- - Count of `no_recall`: `<X>`
33
- - Count of `skipped`: `<Y>`
1
+ # Step 4 — Summary Report Template
2
+
3
+ **Read when**: Step 4, for the report output format.
4
+
5
+ Produce the report following the structure below. Keep the in-session reply within ~40 lines; per-block detail belongs in spec / trace files, not in the report.
6
+
7
+ ## Per-block table
8
+
9
+ | feature | input title | spec path | trace path | recall | scenarios | deviations |
10
+ |---|---|---|---|---|---|---|
11
+ | `<feature-1>` | `<title-1>` | `<feature-1>-SPEC.md` | `.trace/<feature-1>.md` | ok | 4 | 1 |
12
+ | `<feature-2>` | `<title-2>` | `<feature-2>-SPEC.md` | `.trace/<feature-2>.md` | ok | 2 | 0 |
13
+ | `<feature-3>` | `<title-3>` | — | — | no_recall | — | — |
14
+ | ... | | | | | | |
15
+
16
+ Recall column values: `ok`, `no_recall`, `skipped`.
17
+
18
+ ## Skipped blocks
19
+
20
+ If any blocks were skipped (`empty body` / `no_recall` / `error`), list them:
21
+
22
+ - `<feature>` — `<title>` — reason: `empty body`
23
+ - `<feature>` — `<title>` — reason: `no_recall`
24
+ - `<feature>` — `<title>` — reason: `error: <verbatim error message>`
25
+
26
+ ## Aggregates
27
+
28
+ - Total REQ blocks parsed: `<N>`
29
+ - Total specs generated: `<M>` (M ≤ N)
30
+ - Total atomic scenarios produced: `<S>`
31
+ - Total deviations recorded across all traces: `<D>`
32
+ - Count of `no_recall`: `<X>`
33
+ - Count of `skipped`: `<Y>`
@@ -20,17 +20,35 @@ HarmonyOS 应用自测执行器。负责把自然语言写的测试用例(`tes
20
20
 
21
21
  > `uv sync`(从本地 `tools/test-tools/` 目录加载 6 个 whl)由 `self_test_runner.py` 自动执行,无需手动 `pip install`。
22
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
23
+ ### 2. 配置 `autotest`(在 `~/.hometrans/config.json` 中)
24
+
25
+ AutoTest 配置不再使用本目录下的 `config.yaml`,而是集中存放在 HomeTrans 全局配置
26
+ `~/.hometrans/config.json` 的 **`autotest`** 字段(与 `env`、`editors` 同级)。
27
+
28
+ ```jsonc
29
+ {
30
+ "editors": [ /* ... */ ],
31
+ "env": { /* ... */ },
32
+ "autotest": {
33
+ "unified_model": {
34
+ "name": "",
35
+ "base_url": "",
36
+ "api_key": "YOUR_API_KEY_HERE",
37
+ "provider": "openai",
38
+ "temperature": 0.1,
39
+ "top_p": 0.9,
40
+ "frequency_penalty": 0.5
41
+ },
42
+ "device": { "device_sn": null, "ip": "127.0.0.1", "port": 8710, "device_log_level": "debug" },
43
+ "agent": { "max_steps": 50, "verbose": true, "lang": "zh", "enable_preprocess": false, "debug_mode": null }
44
+ }
45
+ }
29
46
  ```
30
47
 
31
- - `config.yaml` 已加入 `.gitignore`,不会被提交到仓库。
32
- - `self_test_runner.py` 启动时会校验:文件存在 + 不含占位符;任一不满足则直接拒绝执行,并输出错误原因。
33
- - 单层模式只需填 `unified_model.api_key`;双层模式需要同时填 `execute_model.api_key` `decision_model.api_key`。模式由 `agent_mode` 字段决定。
48
+ - `ht init` 的 **测试配置** 环节会展示该块默认内容并提示填写 `api_key`(及 `name`/`base_url`/`provider`),写入 `~/.hometrans/config.json` `autotest` 块。该 key 不再写入系统环境变量。
49
+ - `api_key` 兜底:若该字段仍是占位符/空,`self_test_runner.py` 跑用例前会尝试用 OS 环境变量 `TEST_API_KEY` 补全(一般用不到,仅作手动设置时的安全网);二者都没有才报错退出。
50
+ - 运行时 `self_test_runner.py` 读取该块、物化成本次任务专属的临时 YAML(`task_<ts>/autotest_config.yaml`)再交给 `AutoTest.batch`,缺 `agent_mode` 时默认补 `"single"`。
51
+ - 默认单层模式只需填 `unified_model.api_key`;如需双层模式,可在 `autotest` 块里手动加 `execute_model` / `decision_model`(各自含 `api_key`)并把 `agent_mode` 设为 `"layered"`。
34
52
 
35
53
  ---
36
54
 
@@ -87,7 +105,7 @@ hdc list targets
87
105
 
88
106
  agent 会调用 `self_test_runner.py run` 完成前 4 步(1-3 同步、4 后台启动):
89
107
 
90
- 1. 校验 `config.yaml`
108
+ 1. 读取并校验 `autotest` 配置(`~/.hometrans/config.json`),物化成临时 YAML
91
109
  2. `uv sync`(首次 1–3 分钟,后续按 `pyproject.toml` 的 SHA256 自动跳过)
92
110
  3. `hdc uninstall` + `hdc install -r`
93
111
  4. 后台启动 `python -m AutoTest.batch`
@@ -162,7 +180,7 @@ uv run python report_tool.py validate <out>/self-test-report.md
162
180
  | `--category` | 测试分类标签,会传给 `AutoTest.batch`,建议直接用 `app_name` |
163
181
  | `--task-dir` | 任务工作目录,脚本会在内部创建 `task_<timestamp>` 子目录 |
164
182
  | `--output-dir` | 日志目录(`self_test_*.log`) |
165
- | `--config` | 指定 `config.yaml` 路径;默认用本脚本同目录的 `config.yaml` |
183
+ | `--config` | 指定 HomeTrans 配置文件(`config.json`)路径;默认 `~/.hometrans/config.json`,从中读取 `autotest` 配置 |
166
184
  | `--force-reinit` | 强制清空 `.venv` 重新 `uv sync`;默认只在 `pyproject.toml` 内容变化时重建 |
167
185
 
168
186
  `status` 子命令的 JSON 响应字段:
@@ -182,12 +200,10 @@ uv run python report_tool.py validate <out>/self-test-report.md
182
200
  ```
183
201
  agents/test-tools/autotest/
184
202
  ├── README.md # 本文件
185
- ├── .gitignore # 排除 .venv / config.yaml / 运行期日志等
203
+ ├── .gitignore # 排除 .venv / 运行期日志等
186
204
  ├── pyproject.toml # 声明 6 个本地 whl 路径(harmony-autotest / hypium_mcp / hypium / xdevice*3,均在上一级 tools/test-tools/)
187
205
  ├── uv.lock # 与 pyproject.toml 配套的版本锁定文件
188
- ├── config.yaml.example # 用户拷贝填 api_key 的模板
189
- ├── config.yaml # 用户填好的真实配置(.gitignore 中,不入库)
190
- ├── self_test_runner.py # 入口脚本:run / status / kill / clean
206
+ ├── self_test_runner.py # 入口脚本:run / status / kill / clean(autotest 配置读自 ~/.hometrans/config.json)
191
207
  ├── testcases_tool.py # 子命令 generate / validate(_extracted.json → testcases.json,含格式校验)
192
208
  ├── report_tool.py # 子命令 generate / validate(task_<ts>/ → self-test-report.md,含格式校验)
193
209
  ├── testcases_schema.md # testcases.json 字段规范
@@ -198,8 +214,8 @@ agents/test-tools/autotest/
198
214
 
199
215
  ## 六、常见问题
200
216
 
201
- **Q: `config.yaml missing or api_key not filled`**
202
- A: 复制 `config.yaml.example` `config.yaml` 并填入真实 api_key 后重试。
217
+ **Q: `autotest 配置缺失 / api_key 没填`**
218
+ A: `ht init` 重新生成 `~/.hometrans/config.json` `autotest` 块并填好 `TEST_API_KEY`;或手动把 `autotest.unified_model.api_key` 改成真实 key;或设置 OS 环境变量 `TEST_API_KEY` 后重试。
203
219
 
204
220
  **Q: `uv sync` 卡住或失败**
205
221
  A: 6 个 whl 改为从本地 `tools/test-tools/` 目录加载(`pyproject.toml` 的 `[tool.uv.sources]` 用相对路径 `../*.whl`)。失败时确认这 6 个 whl 文件存在于上一级目录;其余依赖仍从清华 PyPI 镜像拉取,需基本网络。也可以 `--force-reinit` 强制重建。
@@ -18,7 +18,7 @@
18
18
  `--testcases` 同时接受 JSON 数组(旧 `testcases.json`)与 JSONL,JSON 数组会自动转换成 JSONL。
19
19
 
20
20
  执行流程:
21
- 主进程:清理 + 校验 config.yaml + uv sync + hdc install hap(等待完成)
21
+ 主进程:清理 + 读取/校验 autotest 配置(~/.hometrans/config.json)+ uv sync + hdc install hap(等待完成)
22
22
 
23
23
  后台:python -m AutoTest.batch(循环执行 testcases.jsonl,cwd 为 task_<timestamp> 子目录)
24
24
 
@@ -398,27 +398,119 @@ def _prepare_testcases_jsonl(input_path: Path, task_subdir: Path) -> Path:
398
398
  return input_path
399
399
 
400
400
 
401
- def validate_config(config_path: Path) -> None:
402
- """确保用户已提供 config.yaml 且 api_key 已替换。"""
401
+ _MODEL_KEYS = ("unified_model", "execute_model", "decision_model")
402
+ DEFAULT_AGENT_MODE = "single"
403
+
404
+
405
+ def _find_hometrans_config(explicit: str | None) -> Path:
406
+ """定位 HomeTrans 全局配置 `~/.hometrans/config.json`(含 `autotest` 字段)。
407
+
408
+ 优先级:显式 --config > 环境变量 HOMETRANS_CONFIG > 由 HOMETRANS_TOOL_PATH
409
+ 反推(tools 目录的父目录)> 默认 ~/.hometrans/config.json。
410
+ """
411
+ if explicit:
412
+ return Path(explicit).resolve()
413
+ env_cfg = os.environ.get("HOMETRANS_CONFIG")
414
+ if env_cfg:
415
+ return Path(env_cfg).resolve()
416
+ tool_path = os.environ.get("HOMETRANS_TOOL_PATH")
417
+ if tool_path:
418
+ cand = Path(tool_path).resolve().parent / "config.json"
419
+ if cand.exists():
420
+ return cand
421
+ return Path.home() / ".hometrans" / "config.json"
422
+
423
+
424
+ def _model_dicts(autotest: dict):
425
+ """遍历 autotest 里存在的模型端点(单层 unified_model / 双层 execute+decision)。"""
426
+ for key in _MODEL_KEYS:
427
+ model = autotest.get(key)
428
+ if isinstance(model, dict):
429
+ yield key, model
430
+
431
+
432
+ def load_autotest_config(explicit: str | None) -> dict:
433
+ """从 `~/.hometrans/config.json` 读取 `autotest` 配置并校验。
434
+
435
+ - 缺文件 / 缺 `autotest` 字段 → 报错退出,提示运行 `ht init`。
436
+ - 任一模型端点的 api_key 仍为占位符/空时,用 OS 环境变量 TEST_API_KEY 兜底填充。
437
+ - 兜底后仍有未填的 api_key → 报错退出。
438
+ - 缺 `agent_mode` 时默认补 "single"。
439
+ 返回可直接物化成 YAML 的 dict。
440
+ """
441
+ config_path = _find_hometrans_config(explicit)
403
442
  if not config_path.exists():
404
443
  logger.error(
405
- f"未找到配置文件: {config_path}\n"
406
- f"请复制 `config.yaml.example` `config.yaml` 并填入真实 api_key 后重试。"
444
+ f"未找到 HomeTrans 配置文件: {config_path}\n"
445
+ f"请先运行 `ht init` 生成 ~/.hometrans/config.json(其中包含 autotest 配置)。"
407
446
  )
408
447
  sys.exit(1)
409
448
 
410
449
  try:
411
- text = config_path.read_text(encoding="utf-8")
412
- except OSError as e:
413
- logger.error(f"无法读取配置文件 {config_path}: {e}")
450
+ data = json.loads(config_path.read_text(encoding="utf-8"))
451
+ except (OSError, json.JSONDecodeError) as e:
452
+ logger.error(f"无法解析配置文件 {config_path}: {e}")
414
453
  sys.exit(1)
415
454
 
416
- if API_KEY_PLACEHOLDER in text:
455
+ autotest = data.get("autotest") if isinstance(data, dict) else None
456
+ if not isinstance(autotest, dict):
417
457
  logger.error(
418
- f"配置文件 {config_path} 中仍包含占位符 `{API_KEY_PLACEHOLDER}`,请将所有 api_key 替换为真实值后重试。"
458
+ f"配置文件 {config_path} 缺少 `autotest` 配置。请运行 `ht init` 重新生成。"
419
459
  )
420
460
  sys.exit(1)
421
461
 
462
+ # 深拷贝,避免改动原始 dict(虽然这里只读不写回)
463
+ autotest = json.loads(json.dumps(autotest))
464
+
465
+ # 用 OS 环境变量 TEST_API_KEY 兜底填充占位/空 api_key
466
+ env_key = os.environ.get("TEST_API_KEY", "").strip()
467
+ missing = []
468
+ for name, model in _model_dicts(autotest):
469
+ cur = str(model.get("api_key", "")).strip()
470
+ if not cur or cur == API_KEY_PLACEHOLDER:
471
+ if env_key:
472
+ model["api_key"] = env_key
473
+ else:
474
+ missing.append(f"{name}.api_key")
475
+
476
+ if not list(_model_dicts(autotest)):
477
+ logger.error(
478
+ f"配置文件 {config_path} 的 autotest 未定义任何模型端点"
479
+ f"(unified_model / execute_model / decision_model)。"
480
+ )
481
+ sys.exit(1)
482
+
483
+ if missing:
484
+ logger.error(
485
+ f"autotest 配置中以下 api_key 仍为占位符/空:{', '.join(missing)}。\n"
486
+ f"请在 {config_path} 的 autotest 配置里填入真实 api_key,"
487
+ f"或设置 OS 环境变量 TEST_API_KEY 后重试。"
488
+ )
489
+ sys.exit(1)
490
+
491
+ autotest.setdefault("agent_mode", DEFAULT_AGENT_MODE)
492
+ logger.info(
493
+ f"已从 {config_path} 读取 autotest 配置(agent_mode={autotest.get('agent_mode')})"
494
+ )
495
+ return autotest
496
+
497
+
498
+ def materialize_config(autotest: dict, dest: Path) -> Path:
499
+ """把 autotest dict 物化成 YAML 文件交给 `AutoTest.batch --config`。
500
+
501
+ 优先用 PyYAML 输出标准块状 YAML;系统 Python 没装 PyYAML 时退回写 JSON
502
+ 内容(JSON 是合法的 YAML,AutoTest 的 yaml.safe_load 同样可解析)。
503
+ """
504
+ dest.parent.mkdir(parents=True, exist_ok=True)
505
+ try:
506
+ import yaml # type: ignore
507
+
508
+ text = yaml.safe_dump(autotest, allow_unicode=True, sort_keys=False)
509
+ except Exception:
510
+ text = json.dumps(autotest, ensure_ascii=False, indent=2)
511
+ dest.write_text(text, encoding="utf-8")
512
+ return dest
513
+
422
514
 
423
515
  def cmd_run(args):
424
516
  """run 子命令:准备环境 + 后台执行 AutoTest.batch"""
@@ -475,12 +567,13 @@ def cmd_run(args):
475
567
  pass
476
568
 
477
569
  try:
478
- # 在删 venv / 跑 uv 之前先校验 uv 与 config.yaml,避免清理后才发现缺东西
570
+ # 在删 venv / 跑 uv 之前先校验 uv 与 autotest 配置,避免清理后才发现缺东西
479
571
  uv = get_uv()
480
572
 
481
- config_path = Path(args.config).resolve() if args.config else (SCRIPT_DIR / "config.yaml")
482
- validate_config(config_path)
483
- logger.info(f"配置文件: {config_path}")
573
+ # ~/.hometrans/config.json 读取 autotest 配置,物化成本次任务专属的 YAML
574
+ autotest_cfg = load_autotest_config(args.config)
575
+ config_path = materialize_config(autotest_cfg, task_subdir / "autotest_config.yaml")
576
+ logger.info(f"配置文件(由 config.json 的 autotest 字段生成): {config_path}")
484
577
 
485
578
  cleanup_before_run(force_reinit=args.force_reinit)
486
579
 
@@ -742,7 +835,8 @@ def main():
742
835
  p_run.add_argument("--output-dir", default=None, help="日志目录")
743
836
  p_run.add_argument("--category", default=DEFAULT_CATEGORY, help="测试分类名称,传给 AutoTest.batch")
744
837
  p_run.add_argument("--config", default=None,
745
- help="AutoTest 配置文件绝对路径;默认为脚本同目录下的 config.yaml")
838
+ help="HomeTrans 配置文件(config.json)路径;默认 ~/.hometrans/config.json,"
839
+ "从中读取 autotest 配置并物化成临时 YAML 交给 AutoTest.batch")
746
840
  p_run.add_argument("--force-reinit", action="store_true",
747
841
  help="强制清理 .venv 并重新 uv sync;默认仅在 pyproject.toml 内容变更时才重建")
748
842
  p_run.set_defaults(func=cmd_run)
Binary file
@@ -1,11 +0,0 @@
1
- {
2
- "android.app_name": "",
3
- "android.package": "com.xxxxxx",
4
- "android.project_dir": "",
5
- "harmony.app_name": "",
6
- "harmony.package": "com.xxxxxx",
7
- "harmony.project_dir": "",
8
- "hmos_sdk_dir": "",
9
- "glm_api_key": "",
10
- "capture_output_dir": ""
11
- }
@@ -1,58 +0,0 @@
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"