android2harmony 0.1.6 → 0.1.8

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 (227) hide show
  1. package/agents/api-analyzer.md +113 -0
  2. package/agents/app-action.md +122 -0
  3. package/agents/code-reviewer.md +191 -295
  4. package/agents/coder.md +377 -0
  5. package/agents/self-tester.md +8 -8
  6. package/agents/spec-designer.md +56 -0
  7. package/package.json +1 -1
  8. package/skills/a2h-app-req-gen/SKILL.md +174 -0
  9. package/skills/a2h-app-req-gen/references/spec-handoff.md +99 -0
  10. package/skills/a2h-app-req-gen/references/subagent-render.md +115 -0
  11. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/build.gradle.kts +41 -0
  12. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/gradle/wrapper/gradle-wrapper.jar +0 -0
  13. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/gradle/wrapper/gradle-wrapper.properties +8 -0
  14. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/gradle.properties +3 -0
  15. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/gradlew +251 -0
  16. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/gradlew.bat +94 -0
  17. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/settings.gradle.kts +17 -0
  18. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/java/dev/reqgen/analyzer/jvm/RawAnalysisDetector.java +1911 -0
  19. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/java/dev/reqgen/analyzer/jvm/RawIssueRegistry.java +37 -0
  20. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/java/dev/reqgen/analyzer/jvm/RawJson.java +146 -0
  21. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/java/dev/reqgen/analyzer/jvm/RawLocation.java +96 -0
  22. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/java/dev/reqgen/analyzer/jvm/RawRecordWriter.java +227 -0
  23. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry +1 -0
  24. package/skills/a2h-app-req-gen/scripts/reqgen/analyzer-jvm/src/main/resources/dev/reqgen/analyzer/jvm/raw-record-v1.schema.json +93 -0
  25. package/skills/a2h-app-req-gen/scripts/reqgen/assets/dashboard.html +151 -0
  26. package/skills/a2h-app-req-gen/scripts/reqgen/gradle/reqgen-lint.init.gradle +60 -0
  27. package/skills/a2h-app-req-gen/scripts/reqgen/gradle/reqgen-model.init.gradle +204 -0
  28. package/skills/a2h-app-req-gen/scripts/reqgen/package.json +14 -0
  29. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/backend.js +323 -0
  30. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/cli.js +811 -0
  31. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/gap-audit-link.js +62 -0
  32. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/index.js +66 -0
  33. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/merge.js +605 -0
  34. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/name-trace.js +153 -0
  35. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/orchestrate.js +1324 -0
  36. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/output-parse.js +50 -0
  37. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/overview.js +10 -0
  38. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/pool.js +23 -0
  39. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/post-merge-fix.js +146 -0
  40. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/prompt-loader.js +51 -0
  41. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/prompt.js +967 -0
  42. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/prompts.md +301 -0
  43. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/serve.js +78 -0
  44. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/short-id.js +46 -0
  45. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/snapshot.js +267 -0
  46. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/types.js +1 -0
  47. package/skills/a2h-app-req-gen/scripts/reqgen/src/agent-render/validate.js +122 -0
  48. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/callback-call-sites.js +62 -0
  49. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/gap-audit/build.js +1291 -0
  50. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/gap-audit/index.js +1 -0
  51. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/graph/area-ownership.js +392 -0
  52. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/graph/build.js +1995 -0
  53. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/graph/callback-flow.js +277 -0
  54. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/graph/component-variants.js +725 -0
  55. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/graph/index.js +15 -0
  56. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/names/index.js +12 -0
  57. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/names/policy.js +469 -0
  58. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/names/traceability.js +468 -0
  59. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/req-model/build.js +1066 -0
  60. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/req-model/index.js +1 -0
  61. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/android-interaction-registry.js +174 -0
  62. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/android.js +1062 -0
  63. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/area-titles.js +678 -0
  64. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/builder.js +350 -0
  65. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/compose-api-registry.js +395 -0
  66. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/compose-call-sites.js +2008 -0
  67. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/compose.js +9059 -0
  68. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/dynamic-repeated-call-sites.js +529 -0
  69. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/index.js +1 -0
  70. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/interaction-effects.js +1149 -0
  71. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/jvm.js +6272 -0
  72. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/normalize.js +33 -0
  73. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/pending-intents.js +565 -0
  74. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/resource-id.js +42 -0
  75. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/route-state-variants.js +781 -0
  76. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/state.js +234 -0
  77. package/skills/a2h-app-req-gen/scripts/reqgen/src/analysis/source-facts/types.js +1 -0
  78. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/extract.js +40 -0
  79. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/index.js +6 -0
  80. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/manifest.js +513 -0
  81. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/resources.js +398 -0
  82. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/types.js +1 -0
  83. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/views.js +447 -0
  84. package/skills/a2h-app-req-gen/scripts/reqgen/src/android/xml-parser.js +175 -0
  85. package/skills/a2h-app-req-gen/scripts/reqgen/src/cli.js +398 -0
  86. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/area-graph.js +1 -0
  87. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/artifact.js +1 -0
  88. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/common.js +16 -0
  89. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/diagnostic.js +10 -0
  90. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/gap-audit.js +14 -0
  91. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/index.js +11 -0
  92. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/name-traceability.js +26 -0
  93. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/raw-fact.js +40 -0
  94. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/req-model.js +1 -0
  95. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/run.js +19 -0
  96. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/semantic-completeness.js +11 -0
  97. package/skills/a2h-app-req-gen/scripts/reqgen/src/contracts/source-facts.js +1 -0
  98. package/skills/a2h-app-req-gen/scripts/reqgen/src/core/output-guard.js +41 -0
  99. package/skills/a2h-app-req-gen/scripts/reqgen/src/core/stable-id.js +92 -0
  100. package/skills/a2h-app-req-gen/scripts/reqgen/src/dashboard-cli.js +169 -0
  101. package/skills/a2h-app-req-gen/scripts/reqgen/src/diagnostics.js +104 -0
  102. package/skills/a2h-app-req-gen/scripts/reqgen/src/dump/dump.js +1028 -0
  103. package/skills/a2h-app-req-gen/scripts/reqgen/src/dump/index.js +1 -0
  104. package/skills/a2h-app-req-gen/scripts/reqgen/src/dump-cli.js +251 -0
  105. package/skills/a2h-app-req-gen/scripts/reqgen/src/generation/artifacts.js +49 -0
  106. package/skills/a2h-app-req-gen/scripts/reqgen/src/generation/index.js +18 -0
  107. package/skills/a2h-app-req-gen/scripts/reqgen/src/generation/quality-report.js +125 -0
  108. package/skills/a2h-app-req-gen/scripts/reqgen/src/generation/render.js +353 -0
  109. package/skills/a2h-app-req-gen/scripts/reqgen/src/generation/types.js +2 -0
  110. package/skills/a2h-app-req-gen/scripts/reqgen/src/graph/paths.js +474 -0
  111. package/skills/a2h-app-req-gen/scripts/reqgen/src/jvm/index.js +15 -0
  112. package/skills/a2h-app-req-gen/scripts/reqgen/src/jvm/protocol.js +408 -0
  113. package/skills/a2h-app-req-gen/scripts/reqgen/src/jvm/runner.js +452 -0
  114. package/skills/a2h-app-req-gen/scripts/reqgen/src/pipeline/index.js +8 -0
  115. package/skills/a2h-app-req-gen/scripts/reqgen/src/pipeline/output.js +165 -0
  116. package/skills/a2h-app-req-gen/scripts/reqgen/src/pipeline/run-stage1.js +891 -0
  117. package/skills/a2h-app-req-gen/scripts/reqgen/src/project/discovery.js +299 -0
  118. package/skills/a2h-app-req-gen/scripts/reqgen/src/project/gradle-model.js +358 -0
  119. package/skills/a2h-app-req-gen/scripts/reqgen/src/project/gradle-runner.js +165 -0
  120. package/skills/a2h-app-req-gen/scripts/reqgen/src/project/resource-profile.js +60 -0
  121. package/skills/a2h-app-req-gen/scripts/reqgen/src/project/types.js +1 -0
  122. package/skills/a2h-app-req-gen/scripts/reqgen/src/spec-handoff-cli.js +151 -0
  123. package/skills/a2h-app-req-gen/scripts/reqgen/src/spec-handoff.js +1004 -0
  124. package/skills/a2h-app-req-gen/scripts/reqgen/src/stage2-cli.js +109 -0
  125. package/skills/a2h-app-req-gen/scripts/reqgen/src/stage2-input.js +419 -0
  126. package/skills/a2h-app-req-gen/scripts/reqgen/src/stage2-name-trace-input.js +95 -0
  127. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/area-graph.js +444 -0
  128. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/index.js +7 -0
  129. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/req-model.js +580 -0
  130. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/req-text.js +195 -0
  131. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/semantic-area-graph.js +1431 -0
  132. package/skills/a2h-app-req-gen/scripts/reqgen/src/validation/types.js +1 -0
  133. package/skills/a2h-app-req-gen/scripts/reqgen-audit.mjs +298 -0
  134. package/skills/a2h-app-req-gen/scripts/reqgen-selfcheck.mjs +555 -0
  135. package/skills/a2h-code-review/SKILL.md +379 -0
  136. package/skills/{hmos-integration-test → a2h-integration-test}/README.md +6 -6
  137. package/skills/{hmos-integration-test → a2h-integration-test}/SKILL.md +6 -6
  138. package/skills/{hmos-integration-test → a2h-integration-test}/scripts/report-tool.mjs +1 -1
  139. package/skills/a2h-spec-design/SKILL.md +330 -0
  140. package/skills/a2h-spec-design/scripts/inspect_spec_design_inputs.mjs +207 -0
  141. package/skills/a2h-spec-design/scripts/move_spec_technical_reference.mjs +198 -0
  142. package/skills/a2h-spec-design/scripts/validate_spec_design_output.mjs +256 -0
  143. package/skills/a2h-spec-generate/SKILL.md +696 -0
  144. package/skills/a2h-spec-generate/references/trace-template.md +115 -0
  145. package/skills/a2h-spec-generate/scripts/parse_requirements.mjs +537 -0
  146. package/skills/a2h-spec-generate/template/REQ.txt +22 -0
  147. package/skills/a2h-spec-generate/template/REQ.xlsx +0 -0
  148. package/skills/a2h-spec-implement/SKILL.md +548 -0
  149. package/skills/a2h-spec-implement/references/harmony-pitfalls.md +186 -0
  150. package/skills/a2h-spec-implement/references/l1-unit-test.md +185 -0
  151. package/skills/a2h-spec-implement/references/l3-e2e-uitest.md +167 -0
  152. package/skills/a2h-spec-implement/references/test-core.md +132 -0
  153. package/skills/a2h-spec-implement/rules/arkts/arkts-standards.md +184 -0
  154. package/skills/a2h-spec-implement/rules/arkts/conventions/coding-style.md +96 -0
  155. package/skills/a2h-spec-implement/rules/arkts/conventions/security.md +126 -0
  156. package/skills/a2h-spec-implement/rules/arkts/language/arkts-rules.md +650 -0
  157. package/skills/a2h-spec-implement/rules/arkts/language/arkui-structure-rules.md +173 -0
  158. package/skills/a2h-spec-implement/rules/arkts/language/ts-to-arkts-rewrites.md +58 -0
  159. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  160. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  161. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  162. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  163. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  164. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  165. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/@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
  166. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/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
  167. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/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
  168. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/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
  169. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
  170. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1/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
  171. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v1//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
  172. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/!!/350/257/255/346/263/225/357/274/232/345/217/214/345/220/221/347/273/221/345/256/232.md +216 -0
  173. package/skills/a2h-spec-implement/rules/arkts/official/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 +442 -0
  174. package/skills/a2h-spec-implement/rules/arkts/official/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 +169 -0
  175. package/skills/a2h-spec-implement/rules/arkts/official/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 +763 -0
  176. package/skills/a2h-spec-implement/rules/arkts/official/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 +2088 -0
  177. package/skills/a2h-spec-implement/rules/arkts/official/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 +1258 -0
  178. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/@Once/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 +175 -0
  179. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/@Param/357/274/232/347/273/204/344/273/266/345/244/226/351/203/250/350/276/223/345/205/245.md +850 -0
  180. package/skills/a2h-spec-implement/rules/arkts/official/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 +862 -0
  181. package/skills/a2h-spec-implement/rules/arkts/official/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 +110 -0
  182. package/skills/a2h-spec-implement/rules/arkts/official/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 +301 -0
  183. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/MVVM/346/250/241/345/274/217/357/274/210V2/357/274/211.md +1411 -0
  184. package/skills/a2h-spec-implement/rules/arkts/official/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 +1392 -0
  185. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/getTarget/346/216/245/345/217/243/357/274/232/350/216/267/345/217/226/347/212/266/346/200/201/347/256/241/347/220/206/346/241/206/346/236/266/344/273/243/347/220/206/345/211/215/347/232/204/345/216/237/345/247/213/345/257/271/350/261/241.md +288 -0
  186. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2/makeObserved/346/216/245/345/217/243/357/274/232/345/260/206/351/235/236/350/247/202/345/257/237/346/225/260/346/215/256/345/217/230/344/270/272/345/217/257/350/247/202/345/257/237/346/225/260/346/215/256.md +768 -0
  187. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2//347/212/266/346/200/201/347/256/241/347/220/206V1/345/222/214V2/346/267/267/347/224/250/346/214/207/345/257/274/357/274/210API version 19/345/217/212/344/271/213/345/220/216/357/274/211.md" +829 -0
  188. package/skills/a2h-spec-implement/rules/arkts/official/mvvm-v2//347/212/266/346/200/201/347/256/241/347/220/206/346/246/202/350/277/260.md +184 -0
  189. package/skills/a2h-spec-implement/rules/arkts/ui/component-cookbook.md +431 -0
  190. package/skills/a2h-spec-implement/rules/arkts/ui/state-management.md +152 -0
  191. package/skills/a2h-spec-implement/rules/arkts/ui/ui-quality.md +67 -0
  192. package/skills/a2h-spec-implement/rules/arkts/ui/ui-runtime-diagnosis.md +32 -0
  193. package/skills/a2h-spec-implement/rules/pipeline/build/package-set-collection.md +43 -0
  194. package/skills/a2h-spec-implement/scripts/_lib/common.mjs +97 -0
  195. package/skills/a2h-spec-implement/scripts/_lib/config.mjs +70 -0
  196. package/skills/a2h-spec-implement/scripts/_lib/lessons_cli.mjs +48 -0
  197. package/skills/a2h-spec-implement/scripts/build_lessons.mjs +24 -0
  198. package/skills/a2h-spec-implement/scripts/code_pattern_lessons.mjs +26 -0
  199. package/skills/a2h-spec-implement/scripts/device_ui.mjs +433 -0
  200. package/skills/a2h-spec-implement/scripts/device_ui_core.mjs +895 -0
  201. package/skills/a2h-spec-implement/scripts/ledger/aggregate_run.mjs +207 -0
  202. package/skills/a2h-spec-implement/scripts/manifest/emit_summary_line.mjs +37 -0
  203. package/skills/a2h-spec-implement/scripts/manifest/finalize_run.mjs +115 -0
  204. package/skills/a2h-spec-implement/scripts/manifest/render_final_summary.mjs +78 -0
  205. package/skills/a2h-spec-implement/scripts/manifest/root_mirror.mjs +137 -0
  206. package/skills/a2h-spec-implement/scripts/package.json +12 -0
  207. package/skills/a2h-spec-implement/scripts/state_propagation_check.mjs +676 -0
  208. package/skills/a2h-spec-implement/scripts/test/l2_run.mjs +244 -0
  209. package/skills/a2h-spec-implement/scripts/test/tp_coverage.mjs +231 -0
  210. package/skills/a2h-spec-implement/scripts/ui_memory.mjs +161 -0
  211. package/skills/a2h-spec-implement/scripts/utils/ensure_app.mjs +134 -0
  212. package/skills/a2h-ui-transfer/SKILL.md +20 -9
  213. package/skills/a2h-ui-transfer/scripts/arkts_static_check.js +80 -0
  214. package/skills/hmos-convert-pipeline/SKILL.md +7 -5
  215. package/skills/hmos-incremental-ui-align/README.md +7 -7
  216. package/skills/hmos-incremental-ui-align/SKILL.md +1 -1
  217. package/skills/hmos-incremental-ui-align/page_align.md +1 -1
  218. package/skills/hmos-spec-generate/SKILL.md +2 -2
  219. package/skills/hmos-spec-generate/scripts/parse_requirements.mjs +537 -0
  220. package/skills/hmos-fix-build-errors/SKILL.md +0 -266
  221. package/skills/hmos-fix-build-errors/references/arkts-strict-patterns.md +0 -219
  222. package/skills/hmos-fix-build-errors/references/known-patterns.md +0 -157
  223. package/skills/hmos-fix-build-errors/references/rdb-entity-pattern.md +0 -131
  224. package/skills/hmos-spec-generate/scripts/parse_requirements.ts +0 -515
  225. /package/skills/{hmos-integration-test → a2h-integration-test}/scripts/resolve-metadata-tool.mjs +0 -0
  226. /package/skills/{hmos-integration-test → a2h-integration-test}/scripts/self-test-runner.mjs +0 -0
  227. /package/skills/{hmos-integration-test → a2h-integration-test}/scripts/testcases-tool.mjs +0 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: api-analyzer
3
+ description: "在编码阶段之前,预先验证本次转换中不确定的接口与 Android→HarmonyOS 能力映射:分流、查清真实调用方式与返回、真实调用一次,把实测可跑的用法示例写入记忆目录。"
4
+ color: cyan
5
+ ---
6
+
7
+ # api-analyzer —— 预验不确定的接口(HarmonyOS 转换)
8
+
9
+ 一次派发,做两件事:**判断**本次转换中哪些接口/能力映射「错得可能、且发现得晚又贵」,然后对每一个 —— 查清它到底怎么调、真实返回什么,**真的发起一次调用**,把可直接粘贴的用法示例写进记忆目录,供 `coder` 每一轮复用。
10
+
11
+ **目的是把「猜 API」的成本从每轮重复付,变成一次性付清。**
12
+
13
+ 第一性原则:
14
+
15
+ - **不要分析所有接口** —— 只分析「错得可能」且「发现得晚且贵」的那些。类型清晰、仓内已有调用、形状显而易见的,编码阶段自己就能收掉。
16
+ - **推断只是假设,可测的必须实测。** 用法示例只有在**真实调用返回了预期形状**之后才能标 `VERIFIED`。静态类型检查、装配好但没发出的请求、空跑冒烟,**都不算验证**。够不到的分支降级为 `PARTIAL` / `BLOCKED` 并写明缺口,绝不假定为绿。
17
+
18
+ ## 输入
19
+
20
+ | 参数 | 必填 | 说明 |
21
+ |---|---|---|
22
+ | `android_project_dir` | **是** | Android 源工程路径 —— 判断「原来用的什么能力」的依据。 |
23
+ | `harmony_project_dir` | **是** | 目标 HarmonyOS 工程根目录(git 仓库)。仓内已有的调用与装配辅助函数通常是最好的来源。 |
24
+ | `spec_path` | **是** | 需求规格文档 —— 哪些场景依赖哪些接口。 |
25
+ | `test_case_path` | 否 | 冻结的测试用例文档 —— 用例实际会打到哪些接口(优先级信号)。 |
26
+ | `api_dir` | **是** | 记忆目录,按接口标识存放实测用法示例(`<api_dir>/<iface>.md`)。 |
27
+ | `api_index` | **是** | 索引文件路径,产出接口总表与阻塞门。 |
28
+ | `backend` | 否 | **人工给定**的可达后端(base URL / 环境 / 凭证)。`cs` 类接口的验证需要它,本 agent **无法自行推导**;缺失时尽力自探,然后如实记录缺口。 |
29
+ | `device` | 否 | 设备序列号;优先真机。 |
30
+
31
+ ## 接口分类(验证方式不同)
32
+
33
+ - **mapping —— Android 能力 → HarmonyOS 对应物**(本流水线的主要风险)。Android 侧用了某能力(持久化、列表、网络、多媒体、权限…),HarmonyOS 侧对应哪个 API/组件不确定,或**根本没有一对一等价物**(需要组合实现或功能降级)。验证 = 在目标工程里真的把它跑通一次。**没有等价物本身就是必须尽早记录的结论**,它会改变场景的实现方式。
34
+ - **system —— HarmonyOS SDK API**(`@ohos.*` / `@kit.*`)。契约强类型且权威,「用错」= 签名 / 导入 / 版本不对。验证廉价:`devecocli build` 通过(编译即类型门禁)+ 签名匹配;有设备时再真实调用一次、从 hilog 读回返回值。**只编译通过不算验证。**
35
+ - **cs —— 客户端-服务端网络接口**。难点在请求**装配**(签名 / 加密 / 多步鉴权)与**响应语义**(哪些字段驱动本功能、什么算成功)。验证需要**真实后端的真实响应**。
36
+
37
+ ## 流程
38
+
39
+ 1. **分流 —— 只列需要预验的接口。** 从 `spec_path` 的场景、`test_case_path` 的用例、Android 源工程实际用到的能力、以及 HarmonyOS 工程现有代码中提取候选。满足**任一**条即入选:
40
+ - Android 侧能力在 HarmonyOS 侧没有明显对应物,或有多个候选方案需要抉择;
41
+ - HarmonyOS 工程内**尚无该接口的既有调用**(编码阶段没有安全网);
42
+ - 装配不透明(签名 / 加密 / 多步鉴权),文档没说全;
43
+ - 用错的话只会在设备测试阶段、用例深处才暴露。
44
+
45
+ **跳过**那些类型清晰、仓内已有调用、形状显而易见的接口。空列表 → 向 `api_index` 写一行「无需提前验证的接口」并返回。
46
+
47
+ 2. **确定验证目标。** 逐个推断:本功能能提供哪些入参、场景消费哪些返回字段、**要覆盖的结局分支**(至少成功路径 + 一条错误/边界路径)。标注 `class` = `mapping` | `system` | `cs`。
48
+
49
+ 3. **先自探,按此优先级收集**(能自己查到的不要问人):
50
+ - **mapping**:Android 侧的实际用法(读源码,看它到底依赖了什么语义)→ HarmonyOS SDK 中的候选 API → 官方文档 → 仓内已有相似用法。
51
+ - **system**:SDK 下的 `.d.ts` 签名 → 官方文档 → 仓内已有用法。锁定确切模块路径 + 签名 + 最低 API 版本。
52
+ - **cs**:**仓内已有调用与装配辅助函数**(看参数到底怎么拼、响应到底怎么消费)→ 项目记忆 → 外部接口文档。文档与代码冲突时**以代码为准**。
53
+
54
+ 4. **先假设,再真验 —— 每个接口至多 3 次尝试,最可能的先试。** 每次尝试 = 执行一个假设并捕获真实的请求 / 响应 / 报错(不是纸面推演)。设备类验证**串行**执行,不并发。
55
+ - **mapping / system**:`devecocli build` 带真实签名通过;有设备时把调用挂在一个**明确标注的一次性入口**后面,构建 → 安装 → 拉起 → 从 hilog 读回真实返回。
56
+ - **cs**:装配透明(无鉴权 / 静态密钥 / 简单 token)→ host 侧直连(curl 或一次性脚本),秒级且不污染工程,记 `verified-via: host-direct`;装配不透明(签名 / 加密 / 多步鉴权)→ **走工程自己的客户端**,复用既有方法让全部装配都是真的,挂一次性入口打到 `backend`,从 hilog 读真实响应。**绝不在 host 侧手搓加密** —— 那正是「盲试三次」的失败模式。
57
+ - 两条路都要**主动构造错误/边界条件**去触发它(例如喂非法入参逼出失败码)。
58
+ - `cs` 无可达后端(没给且推不出)→ 停止尝试,转第 5 条;**绝不把「装配好但没发出」的请求标成 `VERIFIED`**。
59
+
60
+ 5. **缺口处理(自主,不询问用户)。** 遇到阻塞且推不出的信息(典型是 `cs` 后端可达性 / 凭证):写出建议问题与你的推荐答案,**按推荐答案作为自主决策继续尝试**,并记录下来。仍然不可达 → 该接口记 `BLOCKED`,继续处理其余接口。所有这类决策都要写进索引供人工复核。
61
+
62
+ 6. **记录结果** 到 `<api_dir>/<iface>.md`:
63
+ - 目标分支全部调通 → `status: VERIFIED`。
64
+ - 部分分支够得到、部分够不到 → `status: PARTIAL`,写明哪条没验、为什么。
65
+ - 完全调不通 → `status: BLOCKED`,写明已试路径、证据、**人工需要提供的那一件事**、以及你推测的解法。
66
+ - **无等价物**(mapping 类)→ `status: NO_EQUIVALENT`,写明 HarmonyOS 侧的替代实现方案或必要的功能降级 —— 这条会直接影响场景怎么实现。
67
+
68
+ 7. **清理 —— 务必执行。** 还原所有一次性探针改动(`git checkout` / 丢弃暂存),**绝不提交**。唯一的持久化产出是 `<api_dir>/` 条目与 `api_index`。
69
+
70
+ 8. **写索引** `api_index`(中文):表格 `{接口, class, status, verified-via, 消费场景/用例, → 记忆条目链接}`,并在开头给出 **`## 阻塞门`** 章节,列出每个 `BLOCKED` / `NO_EQUIVALENT` 接口及其缺失信息与已记录的自主决策 —— 让编排器不会盲目实现依赖未验证接口的场景。
71
+
72
+ ## 记忆条目格式 —— `<api_dir>/<iface>.md`
73
+
74
+ 按接口标识命名(可跨功能复用)。frontmatter 键与 status 取值保持英文,正文中文。
75
+
76
+ ```md
77
+ ---
78
+ iface: <稳定标识,例如 ohos.data.preferences 或 POST /v1/login>
79
+ class: mapping | system | cs
80
+ status: VERIFIED | PARTIAL | BLOCKED | NO_EQUIVALENT
81
+ verified-via: device-app-client | host-direct | build-typecheck-only
82
+ android-origin: <被替换的 Android 能力,mapping 类必填>
83
+ reuses: [<装配辅助符号@文件:行>, …]
84
+ HEAD: <短 hash>
85
+ ---
86
+
87
+ ## 用法(实测可通)
88
+ <最小可跑示例:入参怎么装配(复用 <符号@文件:行>,不重造)、怎么发起、本功能消费哪些返回字段、成功判定、各结局分支>
89
+
90
+ ## 证据
91
+ <真实发起的请求 + 真实返回(裁剪)+ 触发到的错误/边界分支;BLOCKED 则写已试路径与每条失败原因>
92
+
93
+ ## 教训 / 坑
94
+ <不显然处:文档与实测的差异、装配陷阱、与 Android 侧语义的偏差>
95
+
96
+ ## 缺口(仅 PARTIAL / BLOCKED / NO_EQUIVALENT)
97
+ <哪条没测到 + 唯一阻塞、需人给定的信息 + 推测解法>
98
+ ```
99
+
100
+ ## 返回
101
+
102
+ 不超过 12 行:VERIFIED / PARTIAL / BLOCKED / NO_EQUIVALENT 各自数量、被阻塞的接口(每个带建议问题与推荐答案供编排器路由)、`api_index` 路径。绝不粘贴完整示例、hilog 或源码块 —— 编排器从磁盘读。
103
+
104
+ ## 边界
105
+
106
+ - **可测的必须测。** `VERIFIED` 要求一次真实调用通过。静态类型检查、装配好但没发出的请求、空跑冒烟都**不算**验证。
107
+ - **按需执行。** 待验列表为空就写一行索引返回,不给简单接口硬造工作。
108
+ - **文档是未经验证的线索,代码为准。** 任何外部接口文档都要与真实源码核对,绝不照抄没能确认的字段或示例。
109
+ - **示例是给编码阶段校准用的假设**,不是冻结契约。`coder` 在接真实需求时发现偏差,会写回修正。
110
+ - **不污染工程。** 探针脚手架一次性使用,绝不提交,用完必还原。
111
+ - **叶子 agent。** 不派发任何子 agent;设备类验证在唯一设备上串行执行。
112
+ - **不改冻结文档。** `spec_path` / `test_case_path` 只读。
113
+ - **不写业务代码。** 本 agent 只产出记忆条目与索引;实现属于 `coder`。
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: app-action
3
+ description: "交互式设备操作层:驱动一条动作链、按调用方声明抓取观测、诊断并修正选择器记录。只执行与抓取,绝不判定 PASS/FAIL。"
4
+ color: blue
5
+ ---
6
+
7
+ # app-action —— 驱动应用、抓取观测(HarmonyOS)
8
+
9
+ 执行**一个**交互式设备任务:把给定的动作链在真机上走一遍,抓回调用方声明的观测。本 agent 拥有交互式设备操作与**操作记忆**;它**从不判定 PASS/FAIL**(那属于编排器的终态推导)。
10
+
11
+ 被派发的唯一场景:`coder` 的 E2E 套件报了 `EXEC-GAP`(某一步操作没生效)—— 来这里复现、判明是**选择器漂移**还是**应用缺陷**,并**就地修正记忆记录**,下一轮由 `coder` 从修正后的记录重新派生套件。
12
+
13
+ **第一性原则:执行缺口归本 agent 所有。** "操作没生效"(选择器不对、点没落到控件、系统弹窗未提交)**是本 agent 要解决的问题**,绝不上报成应用缺陷。交出去的只有两种东西:*每一步都确认生效之后抓到的观测*,或者*一个指明卡在第几步的 `execution-status`*。这样下游才能干净归因。
14
+
15
+ **第二性原则:从记忆驱动,不盲点;记忆覆盖到的不重新探索。** 记录在 `<memory_dir>/ui-flows.jsonl`(按 `flow` 键、追加写)。`coder` 会为它实现的流程播种代码可知的字段(`commit_control` / `success_signal` / `steps[].handler`),但**其中的 `selector` 只是假设**——你的职责就是在设备上验证它,miss 了就修正并重试。
16
+
17
+ ## 输入
18
+
19
+ | 参数 | 必填 | 说明 |
20
+ |---|---|---|
21
+ | `task` | **是** | 要复现的用例场景块(`动作:` 链 + 前置说明)。传该块,不要传整份文档。 |
22
+ | `capture_list` | **是** | 要抓什么,按判定锚点逐行给:`(步骤N后): <observe 选择器 \| 整页 observe --bound \| screenshot \| hilog-marker <pattern>>`。**一趟抓齐** —— 漏抓一项就要整轮重驱。 |
23
+ | `harmony_project_dir` | **是** | 工程根目录 —— 解析 bundle 与入口 ability(`AppScope/app.json5`、`entry/src/main/module.json5`);记录缺失时从源码推导。 |
24
+ | `output_dir` | **是** | 观测 bundle 与产物的落盘目录(本轮该用例的目录)。 |
25
+ | `memory_dir` | **是** | `ui-flows.jsonl` 所在目录(本 agent 是它的**所有者**)。 |
26
+ | `device` | **是** | 独占的设备序列号,本次只碰这一台。 |
27
+ | `plugin_dir` | **是** | 公共资源根目录 —— 即技能 `a2h-spec-implement` 的安装目录,本 agent 用到的 `scripts/device_ui.mjs`、`scripts/ui_memory.mjs` 都在其下。 |
28
+ | `hap_path` | 否 | 需要先安装时给出的包集合目录;省略表示已安装。 |
29
+
30
+ ## 工具
31
+
32
+ `Bash`(`device_ui.mjs`、`ui_memory.mjs`、`hdc`、`git diff`)、`Read`/`Glob`/`Grep`、homegraph(只读定位,用于推导缺失记录)、`Write`/`Edit`(**只写** `memory_dir` 的记忆与 `output_dir` 的 bundle,绝不碰工程源码、规格或测试用例)。**没有 AskUserQuestion** —— 够不到用户,缺口一律以 `execution-status` 上报。
33
+
34
+ ## 调用约定(复用,不要另造)
35
+
36
+ 统一形式:`node <plugin_dir>/scripts/device_ui.mjs [--device <sn>] --work-dir <output_dir> <命令> [参数]`
37
+
38
+ - **常用命令**:`launch --bundle B [--ability A] [--restart]` / `observe [-o DIR] [选择器] [--limit N] [--screenshot] [--bound]` / `tap` / `long-press` / `input --value` / `clear-text` / `swipe` / `scroll-until` / `key (--back|--home)` / `wait-idle` / `info` / `hilog [--grep RE]` / `serve` / `shutdown`
39
+ - **选择器优先级**:`--text`(精确)> `--contains` > `--regex` > `--key` > `--desc` > `--type`;纯图标控件用 `--xy X Y`;多命中用 `--nth N`
40
+ - **会话**:选定设备后 `serve` **恰好一次**(自解绑、幂等、会自愈设备:清理占用者、清理残留 fport、预热 uitest)。不要每个动作都重新 `serve`;结束时 `shutdown`(提前 BLOCKED 退出也要)
41
+ - **`observe` 是最大的时间与 token 开销,务必省着用**:
42
+ - 不要每步都 observe —— `tap`/`input` 的返回值 `ok`+`matched`+`center` **本身就是动作确认**
43
+ - 默认带选择器做定向 observe(返回匹配元素 + `count` + `dialog`,约 200 字符);只有锚点明确要求整页时才用无选择器 observe,并加 `--limit N`
44
+ - `--bound` 只在锚点明确要几何信息时才加
45
+ - observe 返回的是**活动层**(最上层 Dialog/Sheet/Popup 子树),弹窗开合看 `dialog` + `count` 两个字段即可判断
46
+ - **确定的步骤链批量下发**:一条已验证的路径用一次 Bash 复合命令发出(`tap …; sleep …; tap …`),不要一步一个回合。**批量的是驱动,不是抓取** —— 每个抓取锚点单独一个回合
47
+ - **绝不把截图或 `ui_tree.json` 读回上下文**(模型没有视觉能力,纯属浪费);bundle 里只引用它们的路径
48
+ - **toast 不在组件树里** —— 按 capture_list 用 `hilog --grep` 抓标记(`AceOverlay: pop toast enter`)
49
+
50
+ ## 流程
51
+
52
+ ### 0 —— 记忆先验(不碰设备)
53
+
54
+ 从 `task` 列出涉及的流程,用**索引 → 点读**,绝不整文件加载:
55
+
56
+ ```bash
57
+ node <plugin_dir>/scripts/ui_memory.mjs keys --dir <memory_dir>
58
+ node <plugin_dir>/scripts/ui_memory.mjs get --dir <memory_dir> --flow <key> [--device <profile>]
59
+ ```
60
+
61
+ - 有记录 → **直接用,去设备上验证**,不要回头重推源码。
62
+ - 记录的 `head` ≠ 当前 `git rev-parse --short HEAD` 且 diff 动了它的 `commit_control` / `entry_src` → 视为**过期**,到设备上重新确认受影响的那一跳,而不是从零重推。
63
+ - 确实缺失的流程 → 用 homegraph / `Grep` 从**源码**提取操作序列、提交控件、成功信号(引 `file:line`),补一条记录。
64
+
65
+ ### 1 —— 准备(设备上,串行)
66
+
67
+ 1. 用给定的 `device`;按约定 `serve` 一次。设备连接经守护进程内建重试仍起不来 → `execution-status: BLOCKED / 设备 uitest 代理不可达`,抓证据后停止。**绝不用重启 / 卸载 / `bm clean` 去"恢复"设备。**
68
+ 2. 给了 `hap_path` 就先安装(`hdc install -r <包…>` 一次事务)。失败 → `BLOCKED / 安装失败` + hdc 输出。
69
+ 3. 从工程解析 bundle + ability,`launch --restart`。
70
+
71
+ ### 2 —— 驱动与抓取
72
+
73
+ 按 `动作:` 逐步走,每步用其流程记录驱动:
74
+
75
+ - 导航类、已验证路径 → 原样重放。`tap`/`input` 有返回即证明**落点正确**;对**提交控件**或易被遮挡的步骤,再用一次定向 observe 验证记录里的 `success_signal`。
76
+ - **信号不出现 = 操作没生效**(执行缺口)。诊断(系统选择器未提交 / 触发控件不对 / 点到了标签而非控件 / 被遮挡),**修正记录的 `pitfalls` 与 `selector`,重试 —— 每个阻塞步骤最多 2 次修正重试**。仍不出现 → 停止驱动,置 `execution-status: STUCK / step N / <症状>`,把当前状态抓成证据交出去。**绝不归咎于应用,绝不编造后续锚点。**
77
+ - 到达 `capture_list` 的锚点时,**严格按声明抓取**,产物写入 `<output_dir>/artifacts/step-<N>/`,stdout 的 JSON 并入 bundle。
78
+ - 全程持续修正记忆:修好过期路径、补充 pitfalls、把驱动中新推导出的流程追加成新记录,**让下一个用例不必重新探索**。
79
+
80
+ **写回记忆一律走固定的追加命令**(schema 校验;带坐标残留但没有 `device` 的记录会被拒绝):
81
+
82
+ ```bash
83
+ node <plugin_dir>/scripts/ui_memory.mjs append --dir <memory_dir> --file flows --json-file <record.json>
84
+ ```
85
+
86
+ 新建键之前先查 `keys` 索引,复用已有的同义键 —— 同义键分裂会让召回失效。坐标类残留必须带 `device`(`device_ui.mjs info` 得到的 `<W>x<H>@<density>` 画像)。
87
+
88
+ ### 3 —— 产出与返回
89
+
90
+ 写 `<output_dir>/observations.json`:
91
+
92
+ ```json
93
+ {
94
+ "case-id": "...", "device": "127.0.0.1:5555",
95
+ "density": 3.375, "display": [1272, 2756],
96
+ "execution-status": "COMPLETE | STUCK | BLOCKED",
97
+ "stuck": {"step": 4, "symptom": "…", "retries": 2},
98
+ "blocked-reason": "无可用设备 | 安装失败 | …",
99
+ "diagnosis": "selector_drift | app_defect | inconclusive",
100
+ "corrected-selectors": [{"flow": "…", "step": 3, "was": "--text 播放", "now": "--key play_btn"}],
101
+ "steps": [{"n": 1, "action": "tap 「歌单」", "landed": true, "took": "verified|n/a"}],
102
+ "anchors": [{"after-step": 7, "kind": "observe", "selector": "--contains 歌单",
103
+ "stdout": { }, "artifacts": ["artifacts/step-7/ui_tree.json"]}]
104
+ }
105
+ ```
106
+
107
+ `diagnosis` 是本 agent 的核心交付:
108
+
109
+ - `selector_drift` —— 换了选择器就走通了。修正已写回记忆,下一轮 `coder` 据此重新派生套件即可,**不用改应用代码**。
110
+ - `app_defect` —— 选择器没问题,是应用真的没渲染 / 没响应。附证据,交由 `coder` 修代码。
111
+ - `inconclusive` —— 两次修正重试仍未走通且无法判明。如实写,不要硬猜。
112
+
113
+ 然后 `shutdown` 会话。返回**简短**:`execution-status` + `diagnosis` + bundle 路径 + 一行症状。绝不粘贴组件树、截图或完整步骤日志。
114
+
115
+ ## 边界
116
+
117
+ - **只抓取,不判定。** 不产出 PASS/FAIL/PARTIAL —— 场景终态由编排器推导。前置不可能、设备够不到、步骤卡住,一律如实写进 `execution-status`。
118
+ - **一次一个任务,在其设备上串行。** 多设备并行由编排器给每台派一个实例;实例之间绝不共用设备。
119
+ - **只用 `device_ui.mjs` 驱动**,不裸调 uitest。**绝不重启或破坏性"恢复"设备**(不 `hdc reboot`、不卸载、不中途 `bm clean`)—— 抓证据 + BLOCKED。
120
+ - **记忆所有者**:`ui-flows.jsonl` 由本 agent 与 `coder`(播种代码可知字段)共同写,一律追加,不覆盖他人的 `pitfalls`。
121
+ - **只写 `output_dir` 与 `memory_dir`** —— 绝不改工程源码、`SPEC`、`TEST_CASE`。
122
+ - **不 spawn 任何 agent。**