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,92 @@
1
+ import { createHash } from "node:crypto";
2
+ import { semanticIdentityKinds } from "../contracts/common.js";
3
+ const namespacePattern = /^[a-z][a-z0-9-]*$/u;
4
+ const caseIdPattern = /^[a-z0-9][a-z0-9._-]*$/u;
5
+ const idPattern =
6
+ /^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._-]*(?:\/[A-Za-z0-9._~:@#+=-]+)+$/u;
7
+ const identityKindSet = new Set(semanticIdentityKinds);
8
+ export function isValidCaseId(value) {
9
+ return caseIdPattern.test(value);
10
+ }
11
+ /**
12
+ * Derives a stable-ID-safe default from a project directory name. Explicit
13
+ * case IDs remain a caller-owned contract and are validated instead of being
14
+ * silently rewritten.
15
+ */
16
+ export function deriveCaseId(projectName) {
17
+ const canonicalName = projectName.trim().normalize("NFC");
18
+ const slug = canonicalName
19
+ .normalize("NFKD")
20
+ .replace(/\p{Mark}+/gu, "")
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9._-]+/gu, "-")
23
+ .replace(/^[^a-z0-9]+|[^a-z0-9]+$/gu, "");
24
+ if (isValidCaseId(slug)) {
25
+ return slug;
26
+ }
27
+ const digest = createHash("sha256")
28
+ .update(canonicalName)
29
+ .digest("hex")
30
+ .slice(0, 12);
31
+ return `case-${digest}`;
32
+ }
33
+ function normalize(value) {
34
+ return value.replace(/\r\n?/gu, "\n").trim().normalize("NFC");
35
+ }
36
+ function entityKindSlug(value) {
37
+ const slug = normalize(value)
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9]+/gu, "-")
40
+ .replace(/^-+|-+$/gu, "");
41
+ if (!namespacePattern.test(slug)) {
42
+ throw new Error(`entityKind cannot form a stable slug: ${value}`);
43
+ }
44
+ return slug;
45
+ }
46
+ function normalizedIdentity(identity) {
47
+ const unique = new Map();
48
+ identity.forEach((part, index) => {
49
+ if (!identityKindSet.has(part.kind)) {
50
+ throw new Error(`identity[${index}].kind is not semantic: ${part.kind}`);
51
+ }
52
+ const value = normalize(part.value);
53
+ if (value.length === 0) {
54
+ throw new Error(`identity[${index}].value must not be blank`);
55
+ }
56
+ const item = [part.kind, value];
57
+ unique.set(JSON.stringify(item), item);
58
+ });
59
+ return [...unique.values()].sort((left, right) => {
60
+ const leftKey = `${left[0]}\u0000${left[1]}`;
61
+ const rightKey = `${right[0]}\u0000${right[1]}`;
62
+ return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;
63
+ });
64
+ }
65
+ export function stableIdentityDigest(input) {
66
+ if (!namespacePattern.test(input.namespace)) {
67
+ throw new Error(`Invalid stable ID namespace: ${input.namespace}`);
68
+ }
69
+ if (!isValidCaseId(input.caseId)) {
70
+ throw new Error(`Invalid stable ID caseId: ${input.caseId}`);
71
+ }
72
+ const canonical = JSON.stringify({
73
+ namespace: input.namespace,
74
+ caseId: input.caseId,
75
+ entityKind: entityKindSlug(input.entityKind),
76
+ identity: normalizedIdentity(input.identity),
77
+ });
78
+ return createHash("sha256").update(canonical).digest("hex");
79
+ }
80
+ /**
81
+ * Builds an ID from semantic anchors only. The API intentionally has no array
82
+ * index or discovery-order argument, so reordering extractor output cannot
83
+ * change an entity's ID.
84
+ */
85
+ export function createStableId(input) {
86
+ const kind = entityKindSlug(input.entityKind);
87
+ const digest = stableIdentityDigest(input).slice(0, 20);
88
+ return `${input.namespace}:${input.caseId}/${kind}/${digest}`;
89
+ }
90
+ export function isStableId(value) {
91
+ return idPattern.test(value);
92
+ }
@@ -0,0 +1,169 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { constants } from "node:fs";
3
+ import { access, copyFile, mkdir } from "node:fs/promises";
4
+ import path, { dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { buildOpenCommand, createStaticServer } from "./agent-render/serve.js";
7
+ const DASHBOARD_TEMPLATE = join(
8
+ dirname(fileURLToPath(import.meta.url)),
9
+ "..",
10
+ "assets",
11
+ "dashboard.html",
12
+ );
13
+ const USAGE = `Usage:
14
+ pnpm dashboard -- --input <successful-stage1-run-directory>
15
+
16
+ Options:
17
+ --input Stage 1 run directory (required)
18
+ --rendering Explicit rendering directory (default: <input>/generation/rendering)
19
+ --port Server port (default: 0 for ephemeral)
20
+ --host Bind address (default: 127.0.0.1)
21
+ --no-open Do not open a browser automatically`;
22
+ class DashboardUsageError extends Error {}
23
+ function parseOptions(argv) {
24
+ const args = argv[0] === "--" ? argv.slice(1) : argv;
25
+ const values = new Map();
26
+ let noOpen = false;
27
+ for (let index = 0; index < args.length; index += 1) {
28
+ const token = args[index];
29
+ if (token === "--no-open") {
30
+ noOpen = true;
31
+ continue;
32
+ }
33
+ if (!token.startsWith("--")) {
34
+ throw new DashboardUsageError(`Unexpected argument: ${token}`);
35
+ }
36
+ const separator = token.indexOf("=");
37
+ const name = token.slice(2, separator === -1 ? undefined : separator);
38
+ const supported = new Set(["input", "rendering", "port", "host"]);
39
+ if (!supported.has(name)) {
40
+ throw new DashboardUsageError(`Unknown option: --${name}`);
41
+ }
42
+ if (values.has(name)) {
43
+ throw new DashboardUsageError(`Option may be provided once: --${name}`);
44
+ }
45
+ const inline = separator === -1 ? undefined : token.slice(separator + 1);
46
+ const value = inline ?? args[index + 1];
47
+ if (value === undefined || value.startsWith("--")) {
48
+ throw new DashboardUsageError(`Option requires a value: --${name}`);
49
+ }
50
+ values.set(name, value);
51
+ if (inline === undefined) index += 1;
52
+ }
53
+ const input = values.get("input");
54
+ if (input === undefined) {
55
+ throw new DashboardUsageError("Missing required option: --input");
56
+ }
57
+ const port = values.has("port") ? validPort(values.get("port")) : 0;
58
+ const host = values.get("host") ?? "127.0.0.1";
59
+ return {
60
+ inputDir: resolve(input),
61
+ renderingDir: values.has("rendering")
62
+ ? resolve(values.get("rendering"))
63
+ : undefined,
64
+ port,
65
+ host,
66
+ open: !noOpen,
67
+ };
68
+ }
69
+ function positiveInteger(value, name) {
70
+ const result = Number(value);
71
+ if (!Number.isSafeInteger(result) || result <= 0) {
72
+ throw new DashboardUsageError(
73
+ `--${name} must be a positive integer, got ${value}`,
74
+ );
75
+ }
76
+ return result;
77
+ }
78
+ function validPort(value) {
79
+ const result = Number(value);
80
+ if (!Number.isSafeInteger(result) || result < 0 || result > 65535) {
81
+ throw new DashboardUsageError(`--port must be 0-65535, got ${value}`);
82
+ }
83
+ return result;
84
+ }
85
+ async function pathExists(candidate) {
86
+ try {
87
+ await access(candidate, constants.F_OK);
88
+ return true;
89
+ } catch {
90
+ return false;
91
+ }
92
+ }
93
+ async function resolveRenderingDir(inputDir) {
94
+ if (path.basename(inputDir) === "rendering") {
95
+ return inputDir;
96
+ }
97
+ const candidates = [
98
+ join(inputDir, "rendering"),
99
+ join(inputDir, "generation", "rendering"),
100
+ ];
101
+ for (const candidate of candidates) {
102
+ if (await pathExists(candidate)) {
103
+ return candidate;
104
+ }
105
+ }
106
+ return candidates[0];
107
+ }
108
+ async function ensureDashboardHtml(renderingDir) {
109
+ await mkdir(renderingDir, { recursive: true });
110
+ const target = join(renderingDir, "dashboard.html");
111
+ try {
112
+ await access(DASHBOARD_TEMPLATE, constants.F_OK);
113
+ } catch {
114
+ throw new DashboardUsageError(
115
+ `Dashboard template not found: ${DASHBOARD_TEMPLATE}`,
116
+ );
117
+ }
118
+ await copyFile(DASHBOARD_TEMPLATE, target);
119
+ }
120
+ async function main(argv) {
121
+ let options;
122
+ try {
123
+ options = parseOptions(argv);
124
+ } catch (error) {
125
+ console.error(
126
+ `Error: ${error instanceof Error ? error.message : String(error)}`,
127
+ );
128
+ console.error(USAGE);
129
+ return 2;
130
+ }
131
+ const renderingDir =
132
+ options.renderingDir ?? (await resolveRenderingDir(options.inputDir));
133
+ await ensureDashboardHtml(renderingDir);
134
+ const server = createStaticServer(renderingDir);
135
+ await server.listen(options.port, options.host);
136
+ const address = server.address();
137
+ if (address === null) {
138
+ throw new Error("Server did not bind to a socket");
139
+ }
140
+ const url = `http://${address.address}:${address.port}/dashboard.html`;
141
+ console.log(
142
+ JSON.stringify({ status: "starting", renderingDir, dashboard: url }),
143
+ );
144
+ if (options.open) {
145
+ try {
146
+ const { command, args } = buildOpenCommand(process.platform, url);
147
+ spawnSync(command, args, { stdio: "ignore" });
148
+ } catch (error) {
149
+ console.error(
150
+ `Could not open browser (${error instanceof Error ? error.message : String(error)}). Open ${url} manually.`,
151
+ );
152
+ }
153
+ }
154
+ process.once("SIGINT", async () => {
155
+ await server.close();
156
+ console.log("\nDashboard server stopped.");
157
+ process.exit(0);
158
+ });
159
+ return new Promise(() => {
160
+ // Keep the process alive until SIGINT.
161
+ });
162
+ }
163
+ main(process.argv.slice(2)).then(
164
+ (code) => process.exit(code),
165
+ (error) => {
166
+ console.error(error instanceof Error ? error.message : String(error));
167
+ process.exit(1);
168
+ },
169
+ );
@@ -0,0 +1,104 @@
1
+ import { createHash } from "node:crypto";
2
+ import { defineDiagnostic } from "./contracts/index.js";
3
+ function stageFor(category) {
4
+ switch (category) {
5
+ case "input":
6
+ return "configure";
7
+ case "environment":
8
+ case "gradle":
9
+ case "variant":
10
+ return "project-model";
11
+ case "manifest":
12
+ case "resources":
13
+ case "uast":
14
+ return "extract";
15
+ case "analysis":
16
+ return "normalize";
17
+ case "model":
18
+ return "req-text";
19
+ case "validation":
20
+ return "validate";
21
+ }
22
+ }
23
+ function contractCategory(category) {
24
+ switch (category) {
25
+ case "input":
26
+ case "variant":
27
+ return "configuration";
28
+ case "environment":
29
+ case "gradle":
30
+ case "manifest":
31
+ case "resources":
32
+ case "uast":
33
+ return "infrastructure";
34
+ case "model":
35
+ return "model";
36
+ case "analysis":
37
+ case "validation":
38
+ return "invariant";
39
+ }
40
+ }
41
+ function jsonValue(value) {
42
+ if (
43
+ value === null ||
44
+ typeof value === "string" ||
45
+ typeof value === "boolean"
46
+ ) {
47
+ return value;
48
+ }
49
+ if (typeof value === "number") {
50
+ return Number.isFinite(value) ? value : String(value);
51
+ }
52
+ if (Array.isArray(value)) {
53
+ return value.map(jsonValue);
54
+ }
55
+ if (typeof value === "object") {
56
+ return Object.fromEntries(
57
+ Object.entries(value).map(([key, item]) => [key, jsonValue(item)]),
58
+ );
59
+ }
60
+ return String(value);
61
+ }
62
+ function diagnosticId(code, stage, message) {
63
+ const digest = createHash("sha256")
64
+ .update(JSON.stringify({ code, stage, message }))
65
+ .digest("hex")
66
+ .slice(0, 20);
67
+ return `diagnostic:runtime/failure/${digest}`;
68
+ }
69
+ export class AnalysisFailure extends Error {
70
+ diagnostics;
71
+ constructor(message, diagnostics) {
72
+ super(message);
73
+ this.name = "AnalysisFailure";
74
+ this.diagnostics = diagnostics;
75
+ }
76
+ }
77
+ /**
78
+ * Compatibility boundary for infrastructure code. It now emits the same
79
+ * versioned Diagnostic contract that is serialized in the Stage 1 run report.
80
+ */
81
+ export function hardFailure(code, category, message, remediation, details) {
82
+ const stage = stageFor(category);
83
+ const diagnostic = defineDiagnostic({
84
+ id: diagnosticId(code, stage, message),
85
+ code,
86
+ stage,
87
+ message,
88
+ ...(remediation ? { remediation } : {}),
89
+ ...(details
90
+ ? {
91
+ details: Object.fromEntries(
92
+ Object.entries(details).map(([key, value]) => [
93
+ key,
94
+ jsonValue(value),
95
+ ]),
96
+ ),
97
+ }
98
+ : {}),
99
+ disposition: "fail-run",
100
+ severity: "error",
101
+ category: contractCategory(category),
102
+ });
103
+ return new AnalysisFailure(message, [diagnostic]);
104
+ }