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,174 @@
1
+ ---
2
+ name: a2h-app-req-gen
3
+ description: Analyze an Android application with Android Lint/UAST and source evidence, render page-scoped Chinese REQ documents, hand them to $a2h-spec-generate, and produce traceable HarmonyOS specs without requiring a UTG workspace.
4
+ argument-hint: "[concurrency=8]"
5
+ ---
6
+
7
+ # Android App REQ(Android-Lint → Spec)
8
+
9
+ 本 skill 从 Android 项目源码、Manifest、资源和 Android Lint/UAST 事实开始,生成页面级
10
+ REQ,再按页面批次交给 `$a2h-spec-generate`。它不要求 UTG、`click_paths.json` 或 StageM
11
+ 输入,也不生成或修改 UTG。
12
+
13
+ ## 运行根目录和前置条件
14
+
15
+ 本 skill 的运行根目录固定为当前目录下的 `scripts/reqgen/`,其中包含 `package.json`、
16
+ `src/`、`analyzer-jvm/`、`gradle/` 和运行所需脚本。不要要求调用方填写这个内部路径,
17
+ 也不要从仓库外寻找另一个 reqgen checkout。
18
+
19
+ 运行前确认:
20
+
21
+ - Node.js 22 或更高;
22
+ - JDK 17(构建并运行内置 JVM analyzer);
23
+ - 目标 Android 项目自身所需的 JDK、Gradle 和 Android SDK;
24
+ - 目标 Android 项目根目录的 `local.properties` 或有效的
25
+ `ANDROID_HOME`/`ANDROID_SDK_ROOT`。
26
+
27
+ `src/` 下是纯 ESM JavaScript(`.js`),零第三方运行时依赖,**不需要安装步骤,也没有构建
28
+ 步骤** —— 直接 `node src/<entry>.js` 即可。下文的 `pnpm <script>` 只是 `package.json` 里
29
+ 的脚本别名;没有 pnpm 时把它换成等价的 `node src/<entry>.js` 直接调用。
30
+
31
+ 优先把运行输出放在目标项目或调用方指定的输出目录;未显式指定时,CLI 会在运行根目录下
32
+ 创建 `.build/` 临时目录。`.build/`、依赖目录和其他运行产物只属于运行时,不能提交回本
33
+ skill 的源码包。
34
+
35
+ ## 确定 Android 分析目标
36
+
37
+ 1. 指定 Android application module 和 build variant;只有 Gradle 模型中存在唯一候选时,
38
+ 才能省略其中一个。
39
+ 2. 默认资源配置为 `zh-CN/portrait/notnight/API36/xhdpi/360dp`,可用
40
+ `--locale`、`--orientation`、`--ui-mode`、`--api-level`、`--density` 和
41
+ `--smallest-width-dp` 分别覆盖。
42
+ 3. Stage 1 每次从当前源码和工程配置重新分析,不读取或伪造 UTG 工件。
43
+
44
+ ## Stage 1:构建 Android-Lint 事实包
45
+
46
+ 从 `scripts/reqgen/` 执行:
47
+
48
+ ```bash
49
+ pnpm stage1 -- --project <android-project> \
50
+ [--module <:application-module>] [--variant <build-variant>] \
51
+ [--output <new-run-directory>]
52
+ ```
53
+
54
+ Windows PowerShell 中使用等价的 `cmd /c "pnpm stage1 -- ..."`,确保 `--` 参数原样传递。
55
+
56
+ 项目、Gradle、Manifest、UAST 或分析器基础设施失败时停止并报告原因。源码歧义记录为
57
+ 有证据位置的 `unresolved`,不得猜测补全。
58
+
59
+ 成功运行至少应包含:
60
+
61
+ - `run-report.json`;
62
+ - `source-facts.json`、`area-graph.json`、`req-model.json`、`gap-audit.json`、
63
+ `diagnostics.json`;
64
+ - `generation/req.draft.md`、`generation/quality-report.json`、
65
+ `generation/name-traceability.json`。
66
+
67
+ `semanticCompleteness: incomplete-known` 是可审阅的已知缺口,不等于基础设施失败;只有
68
+ `run-report.json` 仍为 `succeeded`、validation 已完成且工件属于同一次运行时,Stage 2 才能
69
+ 继续使用该目录。
70
+
71
+ ## Stage 2:按页面渲染 REQ
72
+
73
+ Stage 2 只消费同一次完整 Stage 1 运行。不要手改结构化工件、`task.md` 或 `expected.json`。
74
+ 完整的派发、self-check、finalize 和恢复协议见
75
+ [references/subagent-render.md](./references/subagent-render.md)。
76
+
77
+ 默认先准备 Area 任务(不启动后端):
78
+
79
+ ```bash
80
+ pnpm stage2 -- --input <stage1-run-directory> \
81
+ --project-root <android-project> [--output <output-directory>]
82
+ ```
83
+
84
+ 主 Agent 读取生成的 `render-manifest.json`,把每个 `task.md` 交给一个隔离 subagent;宿主
85
+ 支持命名 profile 时可使用 `reqgen-renderer`,否则直接使用普通隔离 subagent。每个 subagent
86
+ 只能写自己的 `output.json`,并必须执行 task 中给出的 `reqgen-selfcheck.mjs check` 和
87
+ `finalize`。
88
+
89
+ 所有已完成任务定稿后,离线合并:
90
+
91
+ ```bash
92
+ pnpm stage2 -- --input <stage1-run-directory> --snapshot \
93
+ --output <stage2-output-directory> [--per-feature] [--with-unreachable-area]
94
+ ```
95
+
96
+ 没有 subagent 派发能力时,可使用 shell 后端:
97
+
98
+ ```bash
99
+ pnpm stage2 -- --mode shell --input <stage1-run-directory> \
100
+ --project-root <android-project> --output <stage2-output-directory>
101
+ ```
102
+
103
+ `--mode shell-legacy` 只在统一 task/self-check 协议不可用时使用。任何模型或后端失败都要
104
+ 保留可观察的失败信息,不用空正文或虚构结果掩盖。
105
+
106
+ ## Stage 3:生成 Spec 输入批次
107
+
108
+ Stage 2 的旧 `req-<idx>.txt` 是兼容快照格式,不能把多个页面文件拼成一个全局 REQ。执行
109
+ handoff,将每个 Area/page 变成独立批次:
110
+
111
+ ```bash
112
+ pnpm spec-handoff -- \
113
+ --input <stage1-run-directory> \
114
+ --stage2-output <stage2-output-directory> \
115
+ --output <spec-input-directory>
116
+ ```
117
+
118
+ 也可以在 Stage 2 snapshot 时直接传入 `--spec-output`:
119
+
120
+ ```bash
121
+ pnpm stage2 -- --input <stage1-run-directory> --snapshot \
122
+ --output <stage2-output-directory> \
123
+ --spec-output <spec-input-directory>
124
+ ```
125
+
126
+ handoff 输出:
127
+
128
+ ```text
129
+ <spec-input-directory>/
130
+ ├── manifest.json
131
+ ├── 001-<页面名>/REQ.txt
132
+ └── 002-<页面名>/REQ.txt
133
+ ```
134
+
135
+ 每个 `REQ.txt` 的第一行是 UI 路径标题,需求段落之间使用一个空行。文件名本身没有特殊
136
+ 协议含义;`REQ.txt` 是页面批次的约定名称,`REQ-N.txt` 只是旧包装器的命名方式。
137
+ handoff 会去除会被下游误判为需求边界的 Area 元数据和正文空行,并在 `manifest.json` 中
138
+ 记录 `requirementFile`、`owningPage`、`pagePath`、Area ID、需求数和警告。
139
+
140
+ 不要把不同 `owningPage` 的批次合并,也不要把 Lint 事实标记为 UTG/StageM 事实。来源对
141
+ 下游 Spec 解析是透明的,但产物中的来源状态必须保持真实。
142
+
143
+ ## Stage 4:逐批调用 `$a2h-spec-generate`
144
+
145
+ 端到端流程的终点是 Spec,而不是只生成 `REQ.txt`。主 Agent 读取
146
+ `<spec-input-directory>/manifest.json`,对每个批次单独调用 `$a2h-spec-generate`:
147
+
148
+ ```text
149
+ requirement_description_file = <spec-input-directory>/<requirementFile>
150
+ android_project_dir = <原 Android 项目根目录>
151
+ spec_output_dir = <spec-output-directory>/<batchId>
152
+ ```
153
+
154
+ 每次调用只传一个 `requirementFile`,并为不同批次使用独立的 Spec 输出目录。不要把多个批次
155
+ 拼接成一个扁平的 `req-<idx>.txt` 再只调用一次;`$a2h-spec-generate` 要求单次调用内的所有
156
+ 需求归属同一个 `owning-page`,混入多个页面会让它在 Step 0.6 直接停止。遍历 manifest 批次
157
+ 是本 handoff 唯一的输入合同。
158
+
159
+ 最终验收应能看到每个成功批次对应的 Spec 和 `.trace` 文件,并且 Spec 的页面归属、UI 路径
160
+ 和需求数量与对应 `REQ.txt`/manifest 批次一致。`incomplete-known`、unresolved 和 handoff
161
+ 警告必须继续保留在可审阅的运行产物中。
162
+
163
+ ## 输出和范围约束
164
+
165
+ - 不修改 Android 业务源码、Manifest、资源、UTG 或已经定稿的 worker 输出;
166
+ - 不创建或替换 UTG;
167
+ - 不把外部 App、网页或系统设置当作本 App Area;
168
+ - 不修改冻结的 `expected.json` 来使 self-check 通过;
169
+ - 所有运行输出、缓存和依赖安装都应位于调用方输出目录或运行时目录,不提交到 skill 源码;
170
+ - Android-Lint/JDK/Gradle/SDK 基础设施不可用时必须直接报告,不降级为伪造的业务
171
+ `unresolved`。
172
+
173
+ 交接字段和兼容解析的详细说明见
174
+ [references/spec-handoff.md](./references/spec-handoff.md)。
@@ -0,0 +1,99 @@
1
+ # Android-Lint REQ 到 UI Spec 的交接格式
2
+
3
+ `a2h-app-req-gen` 使用 Android Lint/UAST、Manifest 和资源文件生成 Stage 1 事实,
4
+ 再由 Stage 2 根据目标 Android 项目源码渲染 REQ 正文。这个流程不需要 UTG 或
5
+ StageM 产物。下游 `$a2h-spec-generate` 不关心事实由哪一种分析器产生,但它对
6
+ 输入文本的分段方式和页面边界有明确要求,因此 Stage 2 结果需要经过 handoff。
7
+
8
+ ## 下游实际读取什么
9
+
10
+ `$a2h-spec-generate` 接受 `.xlsx`、`.xlsm`、`.csv`、`.txt` 和 `.md`。对于文本
11
+ 文件,它把空行分隔的每个段落当作一条需求:段落第一行是 UI 路径标题,其余
12
+ 行是需求正文。文件名没有协议含义,所以 `REQ.txt`、`req-1.txt` 或其他 `.txt`
13
+ 名称都能被解析。
14
+
15
+ 一次 spec 调用中的所有需求必须属于同一个 `owning-page`。Stage 2 的每个 Area
16
+ 通常对应一个页面、弹窗或其他独立 UI surface,因此 handoff 默认生成一个 Area
17
+ 一个批次,不生成跨页面的总 `REQ.txt`。
18
+
19
+ ## 为什么不能直接使用旧 `req-{idx}.txt`
20
+
21
+ 旧文件可能以 `前置条件:` 开头。这个头部和第一条需求之间存在空行时,下游
22
+ 解析器会把它当成一条标题为“前置条件”的需求。Stage 2 的 Agent 正文也可以
23
+ 包含段落空行;这些空行会被同一个解析器误判为新的需求边界。多个旧文件还不能
24
+ 直接拼成一个总输入,否则会把不同 Area 的页面混在同一次 spec 调用中。
25
+
26
+ handoff 执行以下确定性转换:
27
+
28
+ - 从 finalized `rendering/<unit>/output.json` 读取结构化 Stage 2 结果;旧运行只
29
+ 剩 `req-{idx}.txt` 或 `req.md` 时,使用兼容解析并在 manifest 中记录警告。
30
+ - 每个 Area 生成一个 `<batch>/REQ.txt`,不把不同 Area 合并到同一文件。
31
+ - 把 Area 的前置条件放进该 Area 每条需求的正文。
32
+ - 删除 Area 级的 `访问路径:` 和 `区域说明:` 元数据。
33
+ - 保留正文的普通换行和列表缩进,同时删除空白行,保证空行只承担需求分隔作用。
34
+ - 写文件前按下游文本解析规则重新计算段落数;段落数与需求数不一致时停止。
35
+
36
+ ## 运行方式
37
+
38
+ Stage 2 使用 shell 后端时,可以在同一次运行结束后直接导出:
39
+
40
+ ```bash
41
+ pnpm stage2 -- --mode shell \
42
+ --input <stage1-run-directory> \
43
+ --project-root <android-project> \
44
+ --spec-output <spec-input-directory>
45
+ ```
46
+
47
+ 默认 subagent 模式完成所有渲染任务后,在 snapshot 命令中导出:
48
+
49
+ ```bash
50
+ pnpm stage2 -- --input <stage1-run-directory> --snapshot \
51
+ --output <stage2-output-directory> \
52
+ --spec-output <spec-input-directory>
53
+ ```
54
+
55
+ 已有 Stage 2 结果也可以单独转换:
56
+
57
+ ```bash
58
+ pnpm spec-handoff -- \
59
+ --input <stage1-run-directory> \
60
+ --stage2-output <stage2-output-directory> \
61
+ --output <spec-input-directory>
62
+ ```
63
+
64
+ 输出目录非空时,独立命令会停止。确认目录只保存上一次 handoff 生成的内容后,
65
+ 可以增加 `--replace` 重新生成。
66
+
67
+ ## 输出与下一步
68
+
69
+ ```text
70
+ <spec-input-directory>/
71
+ ├── manifest.json
72
+ ├── 001-<页面名>/REQ.txt
73
+ └── 002-<页面名>/REQ.txt
74
+ ```
75
+
76
+ `manifest.json` 为每个批次记录 `requirementFile`、`owningPage`、`pagePath`、Area
77
+ ID 和需求数量。运行 `$a2h-spec-generate` 时,需要遍历 manifest 中的批次,
78
+ 每次只传一个 `requirementFile`,并始终把原 Android 项目根目录作为
79
+ `android_project_dir`。不同批次应使用彼此独立的 spec 输出子目录,避免多个
80
+ 页面的 trace 和页内顺序信息互相混入。
81
+
82
+ 调用参数对应关系如下(这是对下游 skill 的调用约定,不是另一个 REQ 文件格式):
83
+
84
+ ```text
85
+ requirement_description_file = <spec-input-directory>/<requirementFile>
86
+ android_project_dir = <android-project>
87
+ spec_output_dir = <spec-output-directory>/<batchId>
88
+ ```
89
+
90
+ 先处理 `manifest.json` 中的一个批次,再处理下一个批次;不要把多个批次的
91
+ `REQ.txt` 拼接后只调用一次 `$a2h-spec-generate`。
92
+
93
+ `owningPage` 和 `pagePath` 来自 Stage 1 的 Area 图,用于说明 handoff 如何划分
94
+ 批次。下游 skill 仍会根据 REQ 和源码重新确认页面归属,并通过自己的 trace
95
+ 生成最终 spec。handoff 不创建 UTG 字段,也不会把 Lint 结果标记成 StageM 结果。
96
+
97
+ Stage 1 报告为 `incomplete-known` 时,handoff 仍可生成输入,但会把这个状态写入
98
+ manifest 的 `warnings`。如果找不到 finalized Stage 2 输出,handoff 只在存在有效
99
+ Stage 1 工件时生成确定性草稿,并明确记录“尚未完成 Stage 2”的警告。
@@ -0,0 +1,115 @@
1
+ # Stage 2 子代理渲染协议
2
+
3
+ 在成功且已完成校验的 Stage 1 运行后使用本协议。它规定默认 subagent 模式下,
4
+ 运行 `a2h-app-req-gen` 的主 Agent 如何完成渲染。顺序不可倒置:先续跑与派发,
5
+ 再快照合并,最后才全文审校。
6
+
7
+ ## 运行模式
8
+
9
+ | 模式 | 谁启动渲染器 | 渲染协议 |
10
+ |---|---|---|
11
+ | 默认 / `--mode subagent` | 运行本 skill 的主 Agent | 程序生成 `task.md`,主 Agent 为每个单元派发子代理。 |
12
+ | `--mode shell` | Stage 2 Node 进程 | 统一的 `task.md` 与 self-check/finalize 协议,适合自动化。 |
13
+ | `--mode shell-legacy` | Stage 2 Node 进程 | inline prompt 与进程内校验;仅在统一协议不可用时使用。 |
14
+
15
+ `--mode shell` 和 `--mode shell-legacy` 都需要 `--project-root`;默认
16
+ `--concurrency 8`、`--max-retries 5`、`--backoff-ms 5000`。默认 subagent
17
+ 模式没有渲染并发 CLI 参数:本 skill 的 `concurrency` 参数控制主 Agent 的派发
18
+ 上限,默认 8。
19
+
20
+ ## 1. Prepare 或续跑
21
+
22
+ ```bash
23
+ pnpm stage2 -- --input <stage1-run-directory> \
24
+ --project-root <android-project> --output <output-directory>
25
+ ```
26
+
27
+ Prepare 为每个可渲染 Area 创建这些程序拥有的文件:
28
+
29
+ - `rendering/<unit>/task.md`
30
+ - `rendering/<unit>/expected.json`
31
+ - `render-manifest.json`:每个单元的 task、expected、output 与 self-check 路径
32
+ - `render-list.md`:由当前磁盘输出推导出的可读队列
33
+
34
+ 不要编辑 `task.md` 或 `expected.json`。中断后重新执行同一条 prepare 命令即可续跑;
35
+ 它不修改已有 `output.json`,而是重新读取每个单元的输出并生成 `render-list.md`。
36
+
37
+ `render-list.md` 是方便阅读的视图,不是事实源。单元完成的唯一依据是它自己的
38
+ `output.json` 同时包含 `status: "ok"` 和 `finalized: true`。手工勾选列表不会让
39
+ 单元完成,也不会影响 snapshot;下一次 prepare 会按 `output.json` 覆盖这些勾选。
40
+
41
+ ## 2. 派发、验收、重试或停止
42
+
43
+ 同时运行的子代理不超过 `concurrency`。对每个未完成的 manifest 条目,只传递它的
44
+ `taskPath`;子代理自行读取该文件,并且只写其中指定的 `outputPath`。
45
+
46
+ 子代理先写原始判断,执行任务给出的 `check` 命令,依据问题修正;只在最后一次
47
+ check 输出 `ok: true` 时执行原地 `finalize`。主 Agent 仅在 `output.json` 满足上述
48
+ 完成条件后接受单元,不能用手写摘要替代子代理输出。
49
+
50
+ 输出缺失或未完成时,对同一任务重试一次;再次未完成则保持 pending,并在本次派发
51
+ 会话中计为 skipped。skipped 超过 3 个时停止派发,报告 completed、skipped、
52
+ unstarted 单元及原因。后续 resume 是新的派发会话,可以再次尝试此前 pending 单元。
53
+
54
+ ## 3. Snapshot 已完成内容和回退内容
55
+
56
+ 派发完成或停止后,只合并已持久化的输出:
57
+
58
+ ```bash
59
+ pnpm stage2 -- --input <stage1-run-directory> --snapshot \
60
+ --output <output-directory> [--per-feature] [--with-unreachable-area] \
61
+ [--spec-output <spec-input-directory>]
62
+ ```
63
+
64
+ Snapshot 不连接任何后端。缺失或未成功渲染的单元使用确定性的 Stage 1 模板正文;
65
+ 它写出 `req-<timestamp>.md` 与 `req-<index>.txt`,将选定的 Markdown 快照复制为
66
+ `<output-directory>/req.md`。如果需要交给 `$a2h-spec-generate`,同时传入
67
+ `--spec-output`;它会在快照合并后生成页面批次和 `manifest.json`,不需要再次解析
68
+ 手工编辑的 Markdown。
69
+
70
+ 有两项刻意的范围规则:
71
+
72
+ - 只导航到本 App Area 的 Feature 不会进入渲染,并从最终 REQ 省略;导航到外部或
73
+ 未确认目标的 Feature 仍会渲染。
74
+ - 未确认可达的 Area 默认省略;使用 `--with-unreachable-area` 才在所有可达 Area
75
+ 之后保留它们。
76
+
77
+ ## 4. 全文审校
78
+
79
+ 本节只在快照已复制为 `req.md` 后开始。它不是续跑或派发的一部分:若渲染单元需要
80
+ 返工,回到第 1–2 节,完成后重新 snapshot。
81
+
82
+ 只通读一次 `req.md`,检查跨单元的呈现问题:
83
+
84
+ - 标题和列表格式是否统一;
85
+ - 措辞是否通顺、是否存在明显的前后矛盾;
86
+ - 同一概念的术语是否一致。
87
+
88
+ 不要在此重新做逐单元源码探索或证据核验。只能对 `req.md` 做非并发的呈现层编辑;
89
+ 若要修改渲染单元,应重新 snapshot,而不是在全文审校中修补。
90
+
91
+ ## Shell 命令
92
+
93
+ 无子代理派发能力时,使用统一自动化路径:
94
+
95
+ ```bash
96
+ pnpm stage2 -- --mode shell --input <stage1-run-directory> \
97
+ --project-root <android-project> --concurrency 8
98
+ ```
99
+
100
+ 只有统一协议不可用时,才使用 inline-prompt 回退:
101
+
102
+ ```bash
103
+ pnpm stage2 -- --mode shell-legacy --input <stage1-run-directory> \
104
+ --project-root <android-project> --backend <claude|opencode>
105
+ ```
106
+
107
+ 两个 shell 模式都可使用 Stage 2 CLI 支持的 `--backend`、`--agent-name`、
108
+ `--ai-command`、`--max-retries`、`--backoff-ms`、`--per-feature`、
109
+ `--with-unreachable-area` 参数。
110
+
111
+ > **注意:** 通过 `--output` 显式指定输出目录时,目标目录必须为空或不存在,
112
+ > 否则 Stage 2 会直接报错退出(防止意外覆盖已有的渲染结果)。`--snapshot`
113
+ > 模式豁免此检查——快照必须读取已有 `output.json`。默认路径不受限制。
114
+ > 在自动化派发流程中,请确保每次运行使用不同的 `--output` 目录,或先清空
115
+ > 目标目录。
@@ -0,0 +1,41 @@
1
+ plugins {
2
+ `java-library`
3
+ }
4
+
5
+ group = "dev.reqgen"
6
+ version = "0.1.0"
7
+
8
+ java {
9
+ toolchain {
10
+ languageVersion.set(JavaLanguageVersion.of(17))
11
+ }
12
+ withSourcesJar()
13
+ }
14
+
15
+ dependencies {
16
+ compileOnly("com.android.tools.lint:lint-api:31.13.2")
17
+ compileOnly("com.android.tools.lint:lint-checks:31.13.2")
18
+
19
+ testImplementation("com.android.tools.lint:lint-api:31.13.2")
20
+ testImplementation("com.android.tools.lint:lint-checks:31.13.2")
21
+ testImplementation("com.android.tools.lint:lint-tests:31.13.2")
22
+ testImplementation("junit:junit:4.13.2")
23
+ }
24
+
25
+ tasks.withType<JavaCompile>().configureEach {
26
+ options.release.set(17)
27
+ options.encoding = "UTF-8"
28
+ options.compilerArgs.addAll(listOf("-Xlint:all", "-Xlint:-processing"))
29
+ }
30
+
31
+ tasks.test {
32
+ useJUnit()
33
+ maxParallelForks = 1
34
+ }
35
+
36
+ tasks.jar {
37
+ manifest {
38
+ attributes["Lint-Registry-v2"] =
39
+ "dev.reqgen.analyzer.jvm.RawIssueRegistry"
40
+ }
41
+ }
@@ -0,0 +1,8 @@
1
+ distributionBase=GRADLE_USER_HOME
2
+ distributionPath=wrapper/dists
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
4
+ distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
5
+ networkTimeout=10000
6
+ validateDistributionUrl=true
7
+ zipStoreBase=GRADLE_USER_HOME
8
+ zipStorePath=wrapper/dists
@@ -0,0 +1,3 @@
1
+ org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
2
+ org.gradle.daemon=false
3
+ org.gradle.parallel=false