@ohos-cpf/3rdloop 0.0.1

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 (389) hide show
  1. package/README.md +425 -0
  2. package/bin/3rdloop.mjs +48 -0
  3. package/lib/cli.js +741 -0
  4. package/lib/config.js +318 -0
  5. package/lib/doctor.js +114 -0
  6. package/lib/exit-codes.js +31 -0
  7. package/lib/opencode.js +156 -0
  8. package/lib/orch.js +427 -0
  9. package/lib/queries.js +264 -0
  10. package/lib/runner.js +979 -0
  11. package/lib/step.js +326 -0
  12. package/lib/ui.js +223 -0
  13. package/lib/workflow.js +291 -0
  14. package/lib/workflows.js +132 -0
  15. package/package.json +50 -0
  16. package/vendor/Server/Agent/SkillSelector/README.md +344 -0
  17. package/vendor/Server/Agent/SkillSelector/core/Agent.js +207 -0
  18. package/vendor/Server/Agent/SkillSelector/index.js +14 -0
  19. package/vendor/Server/Agent/SkillSelector/llm/llmClient.js +313 -0
  20. package/vendor/Server/Agent/SkillSelector/llm/prompts.js +161 -0
  21. package/vendor/Server/Agent/SkillSelector/llm/reactSteps.js +144 -0
  22. package/vendor/Server/Agent/SkillSelector/matcher/fuzzyMatcher.js +433 -0
  23. package/vendor/Server/Agent/SkillSelector/scanner/skillScanner.js +382 -0
  24. package/vendor/Server/Agent/SkillSelector/types.js +63 -0
  25. package/vendor/Server/Agent/SkillSelector/utils/actionWords.js +60 -0
  26. package/vendor/Server/Brain/AnalysisStrategies.js +422 -0
  27. package/vendor/Server/Brain/Brain.js +686 -0
  28. package/vendor/Server/Brain/DecompositionStrategies.js +621 -0
  29. package/vendor/Server/Brain/PlanPersistence.js +196 -0
  30. package/vendor/Server/Brain/SkillExecutor.js +251 -0
  31. package/vendor/Server/Brain/index.js +11 -0
  32. package/vendor/Server/CLI/cli.js +243 -0
  33. package/vendor/Server/CLI/opencode/index.js +804 -0
  34. package/vendor/Server/CLI/opencode.js +5 -0
  35. package/vendor/Server/DbUse/MessageArchive.js +61 -0
  36. package/vendor/Server/DbUse/StorageManager.js +107 -0
  37. package/vendor/Server/DbUse/adapters/BaseAdapter.js +94 -0
  38. package/vendor/Server/DbUse/adapters/FileAdapter.js +138 -0
  39. package/vendor/Server/DbUse/adapters/JsonAdapter.js +138 -0
  40. package/vendor/Server/DbUse/adapters/JsonlAdapter.js +114 -0
  41. package/vendor/Server/DbUse/adapters/SqliteAdapter.js +157 -0
  42. package/vendor/Server/DbUse/index.js +160 -0
  43. package/vendor/Server/DbUse/stores/SessionStore.js +279 -0
  44. package/vendor/Server/DbUse/stores/TaskExecutionStore.js +133 -0
  45. package/vendor/Server/DbUse/stores/TaskRegistryStore.js +262 -0
  46. package/vendor/Server/DbUse/stores/TaskStepStore.js +279 -0
  47. package/vendor/Server/FlexRunner/FlexRunner.js +1759 -0
  48. package/vendor/Server/FlexRunner/index.js +12 -0
  49. package/vendor/Server/Knowledge/KnowledgeImporter.js +523 -0
  50. package/vendor/Server/Knowledge/KnowledgeManager.js +341 -0
  51. package/vendor/Server/Knowledge/index.js +33 -0
  52. package/vendor/Server/LoopEngine/LoopEngine.js +1133 -0
  53. package/vendor/Server/LoopEngine/index.js +11 -0
  54. package/vendor/Server/Orchestrator/Orchestrator.js +1425 -0
  55. package/vendor/Server/Orchestrator/StepNode.js +312 -0
  56. package/vendor/Server/Orchestrator/index.js +13 -0
  57. package/vendor/Server/Routes/controllers/BrainController.js +241 -0
  58. package/vendor/Server/Routes/controllers/FlexRunnerController.js +1125 -0
  59. package/vendor/Server/Routes/controllers/HealthController.js +44 -0
  60. package/vendor/Server/Routes/controllers/KnowledgeImportController.js +355 -0
  61. package/vendor/Server/Routes/controllers/LoopEngineController.js +788 -0
  62. package/vendor/Server/Routes/controllers/OrchestratorController.js +911 -0
  63. package/vendor/Server/Routes/controllers/StatsController.js +57 -0
  64. package/vendor/Server/Routes/controllers/StreamController.js +67 -0
  65. package/vendor/Server/Routes/library/logger.js +179 -0
  66. package/vendor/Server/Routes/library/zipArchive.js +172 -0
  67. package/vendor/Server/Routes/router/Router.js +204 -0
  68. package/vendor/Server/Routes/routes/brain.js +47 -0
  69. package/vendor/Server/Routes/routes/flexrunner.js +72 -0
  70. package/vendor/Server/Routes/routes/health.js +28 -0
  71. package/vendor/Server/Routes/routes/index.js +57 -0
  72. package/vendor/Server/Routes/routes/knowledge.js +55 -0
  73. package/vendor/Server/Routes/routes/loopengine.js +58 -0
  74. package/vendor/Server/Routes/routes/orchestrator.js +61 -0
  75. package/vendor/Server/Routes/routes/registry.js +98 -0
  76. package/vendor/Server/Routes/routes/stats.js +23 -0
  77. package/vendor/Server/Routes/routes/stream.js +30 -0
  78. package/vendor/Server/Routes/server.js +202 -0
  79. package/vendor/Server/Routes/sse/SseHub.js +308 -0
  80. package/vendor/Server/Skills/acceptance-check/SKILL.md +174 -0
  81. package/vendor/Server/Skills/acceptance-check/references/PHASE1_ARTIFACT_COLLECTION.md +52 -0
  82. package/vendor/Server/Skills/acceptance-check/references/PHASE2_CRITERIA_EVALUATION.md +77 -0
  83. package/vendor/Server/Skills/arkts-code-check/SKILL.md +314 -0
  84. package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +160 -0
  85. package/vendor/Server/Skills/arkts-code-check/references/FILE_TYPE_GUIDE.md +29 -0
  86. package/vendor/Server/Skills/arkts-code-check/references/PHASE1_INFO_COLLECTION.md +222 -0
  87. package/vendor/Server/Skills/arkts-code-check/references/REPORT_TEMPLATE.md +220 -0
  88. package/vendor/Server/Skills/arkts-library-compile-validate/SKILL.md +329 -0
  89. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/build.ps1 +93 -0
  90. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/code-linter.cjs +433 -0
  91. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/migrate.cjs +851 -0
  92. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/ohpm-switch.cjs +789 -0
  93. package/vendor/Server/Skills/arkts-library-demo-code/SKILL.md +291 -0
  94. package/vendor/Server/Skills/arkts-library-demo-code/references/API_SIGNATURE_CHECKS.md +68 -0
  95. package/vendor/Server/Skills/arkts-library-demo-code/references/BUILD_VALIDATION.md +184 -0
  96. package/vendor/Server/Skills/arkts-library-demo-code/references/CODE_STANDARDS.md +337 -0
  97. package/vendor/Server/Skills/arkts-library-demo-code/references/EXAMPLES.md +400 -0
  98. package/vendor/Server/Skills/arkts-library-demo-code/references/SYSTEM_API_LOOKUP.md +99 -0
  99. package/vendor/Server/Skills/arkts-library-demo-code/references/TEMPLATE.md +544 -0
  100. package/vendor/Server/Skills/arkts-library-demo-code/scripts/build.ps1 +93 -0
  101. package/vendor/Server/Skills/arkts-library-demo-code/scripts/code-linter.cjs +433 -0
  102. package/vendor/Server/Skills/arkts-library-demo-code/scripts/migrate.cjs +851 -0
  103. package/vendor/Server/Skills/arkts-library-demo-code/scripts/ohpm-switch.cjs +789 -0
  104. package/vendor/Server/Skills/arkts-library-demo-coverage/SKILL.md +174 -0
  105. package/vendor/Server/Skills/arkts-library-demo-scenario/SKILL.md +321 -0
  106. package/vendor/Server/Skills/arkts-library-demo-scenario/references/EXAMPLES.md +100 -0
  107. package/vendor/Server/Skills/arkts-library-demo-scenario/references/TEMPLATE.md +185 -0
  108. package/vendor/Server/Skills/arkts-library-documentation-quality-check/SKILL.md +234 -0
  109. package/vendor/Server/Skills/arkts-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +103 -0
  110. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/CHECK_DIMENSIONS.md +89 -0
  111. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/COMPLIANCE_CHECKLIST.md +62 -0
  112. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/KB_QUERY_GUIDE.md +108 -0
  113. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/MCP_TOOL_DISCOVERY.md +124 -0
  114. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/REPORT_TEMPLATE.md +90 -0
  115. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/SCORING_FORMULA.md +57 -0
  116. package/vendor/Server/Skills/arkts-library-documentation-quality-check/scripts/validate-skill.cjs +259 -0
  117. package/vendor/Server/Skills/arkts-library-interface-spec/SKILL.md +97 -0
  118. package/vendor/Server/Skills/arkts-library-memory-leak-check/SKILL.md +392 -0
  119. package/vendor/Server/Skills/arkts-library-source-clone/SKILL.md +113 -0
  120. package/vendor/Server/Skills/arkts-library-stability-check/SKILL.md +313 -0
  121. package/vendor/Server/Skills/arkts-library-stability-check/assets/REPORT_TEMPLATE.md +154 -0
  122. package/vendor/Server/Skills/arkts-library-stability-check/references/CHECKLIST.md +166 -0
  123. package/vendor/Server/Skills/arkts-library-stability-check/references/CODE_EXAMPLES.md +309 -0
  124. package/vendor/Server/Skills/arkts-library-stability-check/references/SCORING_RULES.md +90 -0
  125. package/vendor/Server/Skills/arkts-library-stability-check/scripts/validate-skill.cjs +282 -0
  126. package/vendor/Server/Skills/arkts-library-test-coverage-check/SKILL.md +361 -0
  127. package/vendor/Server/Skills/arkts-library-test-coverage-check/assets/REPORT_TEMPLATE.md +146 -0
  128. package/vendor/Server/Skills/arkts-library-test-coverage-check/references/CHECKLIST.md +253 -0
  129. package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +115 -0
  130. package/vendor/Server/Skills/arkts-library-test-coverage-check/scripts/validate-skill.cjs +263 -0
  131. package/vendor/Server/Skills/arkts-library-xts-code/SKILL.md +455 -0
  132. package/vendor/Server/Skills/arkts-library-xts-code/assets/report-template.md +60 -0
  133. package/vendor/Server/Skills/arkts-library-xts-code/references/ACCESS_MODIFIER_PRECHECK.md +76 -0
  134. package/vendor/Server/Skills/arkts-library-xts-code/references/BUILD_VERIFICATION.md +200 -0
  135. package/vendor/Server/Skills/arkts-library-xts-code/references/CODE_STANDARDS.md +519 -0
  136. package/vendor/Server/Skills/arkts-library-xts-code/references/SUBAGENT_PROMPT_TEMPLATE.md +276 -0
  137. package/vendor/Server/Skills/arkts-library-xts-code/references/SYSTEM_API_LOOKUP.md +93 -0
  138. package/vendor/Server/Skills/arkts-library-xts-code/references/XTS_TEMPLATE.md +767 -0
  139. package/vendor/Server/Skills/arkts-library-xts-code/scripts/build.ps1 +93 -0
  140. package/vendor/Server/Skills/arkts-library-xts-code/scripts/code-linter.cjs +433 -0
  141. package/vendor/Server/Skills/arkts-library-xts-code/scripts/migrate.cjs +851 -0
  142. package/vendor/Server/Skills/arkts-library-xts-code/scripts/ohpm-switch.cjs +789 -0
  143. package/vendor/Server/Skills/arkts-library-xts-code/scripts/precheck-access-modifiers.cjs +221 -0
  144. package/vendor/Server/Skills/arkts-library-xts-code-fix/SKILL.md +229 -0
  145. package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +97 -0
  146. package/vendor/Server/Skills/arkts-library-xts-doc/SKILL.md +194 -0
  147. package/vendor/Server/Skills/arkts-library-xts-doc/references/EXAMPLES.md +576 -0
  148. package/vendor/Server/Skills/arkts-library-xts-doc/references/TEMPLATE.md +575 -0
  149. package/vendor/Server/Skills/arkts-library-xts-doc/references/TESTABILITY_GUIDE.md +182 -0
  150. package/vendor/Server/Skills/arkts-library-xts-execution/SKILL.md +491 -0
  151. package/vendor/Server/Skills/arkts-library-xts-execution/references/error-fixing-examples.md +217 -0
  152. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/build.ps1 +93 -0
  153. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/code-linter.cjs +433 -0
  154. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/migrate.cjs +851 -0
  155. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/ohpm-switch.cjs +789 -0
  156. package/vendor/Server/Skills/flutter-code-check/SKILL.md +299 -0
  157. package/vendor/Server/Skills/flutter-code-check/assets/OUTPUT_TEMPLATE.md +312 -0
  158. package/vendor/Server/Skills/flutter-code-check/references/CHECKLIST.md +190 -0
  159. package/vendor/Server/Skills/flutter-code-check/references/PLATFORMS.md +134 -0
  160. package/vendor/Server/Skills/flutter-code-check/scripts/validate-skill.cjs +259 -0
  161. package/vendor/Server/Skills/flutter-interface/README.md +75 -0
  162. package/vendor/Server/Skills/flutter-interface/SKILL.md +291 -0
  163. package/vendor/Server/Skills/flutter-interface/references/EXAMPLES.md +336 -0
  164. package/vendor/Server/Skills/flutter-interface/references/GIT_CLONE_GUIDE.md +190 -0
  165. package/vendor/Server/Skills/flutter-interface/references/SCRIPT_REFERENCE.md +258 -0
  166. package/vendor/Server/Skills/flutter-interface/references/TEMPLATE.md +254 -0
  167. package/vendor/Server/Skills/flutter-library-consistency-check/SKILL.md +518 -0
  168. package/vendor/Server/Skills/flutter-library-consistency-check/references/CHECKLIST.md +382 -0
  169. package/vendor/Server/Skills/flutter-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +342 -0
  170. package/vendor/Server/Skills/flutter-library-consistency-check/references/PLATFORM_LIMITATION_GUIDE.md +71 -0
  171. package/vendor/Server/Skills/flutter-library-documentation-quality-check/SKILL.md +519 -0
  172. package/vendor/Server/Skills/flutter-library-documentation-quality-check/references/CHECKLIST.md +407 -0
  173. package/vendor/Server/Skills/flutter-library-memory-leak-check/SKILL.md +653 -0
  174. package/vendor/Server/Skills/flutter-library-memory-leak-check/references/CHECKLIST.md +397 -0
  175. package/vendor/Server/Skills/flutter-library-stability-check/SKILL.md +745 -0
  176. package/vendor/Server/Skills/flutter-library-stability-check/references/CHECKLIST.md +721 -0
  177. package/vendor/Server/Skills/flutter-library-test-coverage-check/SKILL.md +414 -0
  178. package/vendor/Server/Skills/flutter-library-test-coverage-check/assets/REPORT_TEMPLATE.md +150 -0
  179. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/CHECKLIST.md +304 -0
  180. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCORING_RULES.md +265 -0
  181. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCRIPT_USAGE.md +286 -0
  182. package/vendor/Server/Skills/knowledge-import/SKILL.md +383 -0
  183. package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +165 -0
  184. package/vendor/Server/Skills/knowledge-import/references/SKILL_LOCATOR_GUIDE.md +91 -0
  185. package/vendor/Server/Skills/knowledge-import/references/SKILL_OPTIMIZATION_GUIDE.md +127 -0
  186. package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +301 -0
  187. package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_ISSUE_TEMPLATE.md +105 -0
  188. package/vendor/Server/Skills/ohos-lib-pr-push/references/GITCODE_API.md +127 -0
  189. package/vendor/Server/Skills/ohos-lib-pr-push/scripts/gitcode-api.cjs +208 -0
  190. package/vendor/Server/Skills/rn-code-check/SKILL.md +321 -0
  191. package/vendor/Server/Skills/rn-code-check/references/API-GUIDE.md +235 -0
  192. package/vendor/Server/Skills/rn-code-check/references/CHECKLIST.md +189 -0
  193. package/vendor/Server/Skills/rn-code-check/references/REPORT-TEMPLATE.md +247 -0
  194. package/vendor/Server/Skills/rn-lib-add-example/SKILL.md +198 -0
  195. package/vendor/Server/Skills/rn-lib-add-example/references/APP_RENAME_GUIDE.md +40 -0
  196. package/vendor/Server/Skills/rn-lib-add-example/references/SHELL_ADAPTATION_CHECKLIST.md +78 -0
  197. package/vendor/Server/Skills/rn-lib-add-example/references/TEMPLATE_REPO_GUIDE.md +70 -0
  198. package/vendor/Server/Skills/rn-lib-add-example/references/VERIFICATION_GUIDE.md +47 -0
  199. package/vendor/Server/Skills/rn-lib-add-example/scripts/create-example.cjs +252 -0
  200. package/vendor/Server/Skills/rn-lib-update-doc/SKILL.md +176 -0
  201. package/vendor/Server/Skills/rn-lib-update-doc/config.json +5 -0
  202. package/vendor/Server/Skills/rn-lib-update-doc/references/changelog-template.md +35 -0
  203. package/vendor/Server/Skills/rn-lib-update-doc/references/format-diff.md +137 -0
  204. package/vendor/Server/Skills/rn-lib-update-doc/references/link-registry.json +33 -0
  205. package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2-overview.md +40 -0
  206. package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2.md +429 -0
  207. package/vendor/Server/Skills/rn-lib-update-doc/scripts/detect-readme-format.cjs +105 -0
  208. package/vendor/Server/Skills/rn-lib-update-doc/scripts/find-usage-doc.cjs +90 -0
  209. package/vendor/Server/Skills/rn-lib-update-doc/scripts/link-verify.cjs +213 -0
  210. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-changelog.cjs +73 -0
  211. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-package-meta.cjs +258 -0
  212. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-readme-links.cjs +341 -0
  213. package/vendor/Server/Skills/rn-lib-update-doc/scripts/resolve-usage-docs.cjs +67 -0
  214. package/vendor/Server/Skills/rn-library-consistency-check/SKILL.md +299 -0
  215. package/vendor/Server/Skills/rn-library-consistency-check/assets/REPORT_TEMPLATE.md +293 -0
  216. package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_COMPONENT_CHECK_GUIDE.md +857 -0
  217. package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_TURBOMODULE_CHECK_GUIDE.md +856 -0
  218. package/vendor/Server/Skills/rn-library-consistency-check/references/CHECKLIST.md +157 -0
  219. package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_COMPONENT_CHECK_GUIDE.md +801 -0
  220. package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_TURBOMODULE_CHECK_GUIDE.md +684 -0
  221. package/vendor/Server/Skills/rn-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +233 -0
  222. package/vendor/Server/Skills/rn-library-consistency-check/references/NATIVE_COMPONENT_IDENTIFICATION.md +1373 -0
  223. package/vendor/Server/Skills/rn-library-consistency-check/references/SCORING_STANDARD.md +220 -0
  224. package/vendor/Server/Skills/rn-library-consistency-check/scripts/validate-skill.py +245 -0
  225. package/vendor/Server/Skills/rn-library-documentation-quality-check/SKILL.md +263 -0
  226. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL.md +414 -0
  227. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL_en.md +413 -0
  228. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +311 -0
  229. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CHECK_CHECKLIST.md +355 -0
  230. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CROSS_VALIDATION_GUIDE.md +115 -0
  231. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/DOC_COLLECTION_GUIDE.md +139 -0
  232. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/EXAMPLES.md +586 -0
  233. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/GOTCHAS.md +57 -0
  234. package/vendor/Server/Skills/rn-library-documentation-quality-check/scripts/validate-skill.py +259 -0
  235. package/vendor/Server/Skills/rn-library-interface-analyzer/SKILL.md +301 -0
  236. package/vendor/Server/Skills/rn-library-interface-analyzer/assets/REPORT_TEMPLATE.md +148 -0
  237. package/vendor/Server/Skills/rn-library-interface-analyzer/references/DOC_ANNOTATION_GUIDE.md +118 -0
  238. package/vendor/Server/Skills/rn-library-interface-analyzer/references/SCRIPT_USAGE_GUIDE.md +168 -0
  239. package/vendor/Server/Skills/rn-library-interface-analyzer/references/URL_PARSING_RULES.md +176 -0
  240. package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +274 -0
  241. package/vendor/Server/Skills/rn-library-issue-generalizer/assets/case-template.md +45 -0
  242. package/vendor/Server/Skills/rn-library-issue-generalizer/assets/rule-template.md +25 -0
  243. package/vendor/Server/Skills/rn-library-issue-generalizer/references/PR_FETCH_GUIDE.md +61 -0
  244. package/vendor/Server/Skills/rn-library-issue-generalizer/references/RULE_TEMPLATE_GUIDE.md +165 -0
  245. package/vendor/Server/Skills/rn-library-issue-generalizer/scripts/fetch-pr-info.py +239 -0
  246. package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +263 -0
  247. package/vendor/Server/Skills/rn-library-known-issue-check/assets/REPORT_TEMPLATE.md +96 -0
  248. package/vendor/Server/Skills/rn-library-known-issue-check/references/COMPLIANCE_CHECKLIST.md +58 -0
  249. package/vendor/Server/Skills/rn-library-known-issue-check/references/INSPECTION_GUIDE.md +99 -0
  250. package/vendor/Server/Skills/rn-library-known-issue-check/references/PRESCREEN_GUIDE.md +64 -0
  251. package/vendor/Server/Skills/rn-library-known-issue-check/references/SOURCE_PREP_GUIDE.md +75 -0
  252. package/vendor/Server/Skills/rn-library-known-issue-check/scripts/validate-known-issue-report.py +164 -0
  253. package/vendor/Server/Skills/rn-library-memory-leak-check/SKILL.md +339 -0
  254. package/vendor/Server/Skills/rn-library-memory-leak-check/assets/REPORT_TEMPLATE.md +83 -0
  255. package/vendor/Server/Skills/rn-library-memory-leak-check/references/CHECKLIST.md +859 -0
  256. package/vendor/Server/Skills/rn-library-memory-leak-check/references/HARMONY_CODE_PATTERNS.md +122 -0
  257. package/vendor/Server/Skills/rn-library-memory-leak-check/scripts/scan_harmony_code.py +279 -0
  258. package/vendor/Server/Skills/rn-library-stability-check/SKILL.md +273 -0
  259. package/vendor/Server/Skills/rn-library-stability-check/assets/REPORT_TEMPLATE.md +129 -0
  260. package/vendor/Server/Skills/rn-library-stability-check/references/CHECKLIST.md +581 -0
  261. package/vendor/Server/Skills/rn-library-stability-check/references/SCORING_RULES.md +138 -0
  262. package/vendor/Server/Skills/rn-library-stability-check/scripts/scan-harmony-code.py +168 -0
  263. package/vendor/Server/Skills/rn-library-test-coverage-check/SKILL.md +506 -0
  264. package/vendor/Server/Skills/rn-library-test-coverage-check/references/CHECKLIST.md +280 -0
  265. package/vendor/Server/Skills/rn-library-test-coverage-check/references/DEMO_LOCATION.md +221 -0
  266. package/vendor/Server/Skills/rn-library-test-coverage-check/references/REPORT_TEMPLATE.md +209 -0
  267. package/vendor/Server/Skills/rn-library-test-coverage-check/references/SCRIPT_USAGE.md +325 -0
  268. package/vendor/Server/Skills/rn-ohos-xts-generator/SKILL.md +279 -0
  269. package/vendor/Server/Skills/rn-ohos-xts-generator/assets/TEST_FILE_TEMPLATES.md +404 -0
  270. package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_TROUBLESHOOTING.md +185 -0
  271. package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_WORKFLOW.md +265 -0
  272. package/vendor/Server/Skills/rn-ohos-xts-generator/references/COMMON_CONFIG.md +189 -0
  273. package/vendor/Server/Skills/rn-ohos-xts-generator/references/CONFIG_GUIDE.md +203 -0
  274. package/vendor/Server/Skills/rn-ohos-xts-generator/references/COVERAGE_ANALYZER.md +147 -0
  275. package/vendor/Server/Skills/rn-ohos-xts-generator/references/DESIGN_DOC_GUIDE.md +148 -0
  276. package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_FLOW.md +165 -0
  277. package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_STRATEGY.md +195 -0
  278. package/vendor/Server/Skills/rn-ohos-xts-generator/references/HARMONY_SCANNER.md +249 -0
  279. package/vendor/Server/Skills/rn-ohos-xts-generator/references/JEST_FRAMEWORK.md +235 -0
  280. package/vendor/Server/Skills/rn-ohos-xts-generator/references/PLATFORM_COMPAT.md +161 -0
  281. package/vendor/Server/Skills/rn-ohos-xts-generator/references/RN_TEST_PATTERNS.md +413 -0
  282. package/vendor/Server/Skills/rn-ohos-xts-generator/references/SOURCE_PARSER.md +235 -0
  283. package/vendor/Server/Skills/rn-ohos-xts-generator/references/TEST_CONVENTIONS.md +245 -0
  284. package/vendor/Server/Skills/rn-ohos-xts-generator/references/TROUBLESHOOTING.md +282 -0
  285. package/vendor/Server/Skills/rn-ohos-xts-generator/references/USAGE_GUIDE.md +251 -0
  286. package/vendor/Server/Skills/rnoh-cptf-api-test/SKILL.md +469 -0
  287. package/vendor/Server/Skills/rnoh-cptf-api-test/assets/CPTF_TEST_TEMPLATE.md +310 -0
  288. package/vendor/Server/Skills/rnoh-cptf-api-test/assets/DEMO_PAGE_TEMPLATE.md +303 -0
  289. package/vendor/Server/Skills/rnoh-cptf-api-test/references/CPTF_TEST_GENERATION_GUIDE.md +421 -0
  290. package/vendor/Server/Skills/rnoh-cptf-api-test/references/DEMO_GENERATION_GUIDE.md +358 -0
  291. package/vendor/Server/Skills/rnoh-cptf-api-test/references/QUALITY_CHECKLIST.md +114 -0
  292. package/vendor/Server/Skills/rnoh-cptf-api-test/references/SPEC_PARSING_GUIDE.md +274 -0
  293. package/vendor/Server/Skills/rnoh-cptf-api-test/scripts/validate-rnoh-cptf-api-test.sh +185 -0
  294. package/vendor/Server/Skills/rnoh-cptf-demo-test/SKILL.md +191 -0
  295. package/vendor/Server/Skills/rnoh-cptf-demo-test/assets/TEST_TEMPLATE.md +216 -0
  296. package/vendor/Server/Skills/rnoh-cptf-demo-test/references/CPTF_SETUP.md +107 -0
  297. package/vendor/Server/Skills/rnoh-cptf-demo-test/references/DEMO_ANALYSIS.md +120 -0
  298. package/vendor/Server/Skills/rnoh-cptf-demo-test/scripts/validate-rnoh-cptf-test.sh +108 -0
  299. package/vendor/Server/Skills/rnoh-cptf-test-run/SKILL.md +237 -0
  300. package/vendor/Server/Skills/rnoh-cptf-test-run/references/DEBUG_PLAYBOOK.md +261 -0
  301. package/vendor/Server/Skills/rnoh-cptf-test-run/scripts/validate-run-env.sh +112 -0
  302. package/vendor/Server/Skills/rnoh-lib-code-adapt/SKILL.md +498 -0
  303. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/adapt-checklist.md +270 -0
  304. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/api-migration-checklist.md +164 -0
  305. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/common-compile-errors.md +556 -0
  306. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/deveco-cli-tools.md +459 -0
  307. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/edge-cases.md +65 -0
  308. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/har-tgz-build.md +512 -0
  309. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/version-compat-matrix.md +132 -0
  310. package/vendor/Server/Skills/rnoh-lib-code-adapt/scripts/auto-integrate.sh +424 -0
  311. package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +137 -0
  312. package/vendor/Server/Skills/rnoh-lib-demo-create/SKILL.md +306 -0
  313. package/vendor/Server/Skills/rnoh-lib-demo-create/assets/DEMO_PAGE_TEMPLATE.md +485 -0
  314. package/vendor/Server/Skills/rnoh-lib-demo-create/assets/INDEX_TEMPLATE.md +172 -0
  315. package/vendor/Server/Skills/rnoh-lib-demo-create/references/DEMO_CODE_RULES.md +422 -0
  316. package/vendor/Server/Skills/rnoh-lib-demo-create/references/QUALITY_CHECKLIST.md +95 -0
  317. package/vendor/Server/Skills/rnoh-lib-demo-create/references/SOURCE_EXPLORATION.md +169 -0
  318. package/vendor/Server/Skills/rnoh-lib-demo-doc/SKILL.md +554 -0
  319. package/vendor/Server/Skills/rnoh-lib-demo-doc/assets/DEMO_DOC_TEMPLATE.md +106 -0
  320. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/COVERAGE_INCREMENTAL.md +216 -0
  321. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/DEMO_DESIGN_RULES.md +413 -0
  322. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/OUTPUT_FORMAT.md +269 -0
  323. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/QUALITY_CHECKLIST.md +98 -0
  324. package/vendor/Server/Skills/rnoh-lib-func-test/SKILL.md +337 -0
  325. package/vendor/Server/Skills/rnoh-lib-rnt-search/SKILL.md +722 -0
  326. package/vendor/Server/Skills/rnoh-lib-rnt-search/assets/PORT_REPORT_TEMPLATE.md +219 -0
  327. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/DEMO_PORTING_GUIDE.md +345 -0
  328. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/PORT_VERIFICATION.md +269 -0
  329. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/RNT_PROJECT_STRUCTURE.md +173 -0
  330. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/analyze-demo-deps.cjs +267 -0
  331. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/detect-rnoh-version.cjs +174 -0
  332. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/find-rnt-demo.sh +111 -0
  333. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/port-demo.sh +186 -0
  334. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/read-lib-meta.cjs +150 -0
  335. package/vendor/Server/Skills/rnoh-lib-test-align/SKILL.md +296 -0
  336. package/vendor/Server/Skills/rnoh-lib-test-align/references/jest-troubleshooting.md +371 -0
  337. package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +212 -0
  338. package/vendor/Server/Skills/rnoh-lib-test-align/references/runtime-troubleshooting.md +345 -0
  339. package/vendor/Server/Skills/rnoh-lib-test-align/references/unit-test-template.md +223 -0
  340. package/vendor/Server/Skills/rnoh-lib-test-align/scripts/port-test-demo.sh +1053 -0
  341. package/vendor/Server/Skills/rnoh-lib-version-diff/SKILL.md +255 -0
  342. package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_ADAPTATION.md +77 -0
  343. package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_API_LOOKUP.md +224 -0
  344. package/vendor/Server/Skills/rnoh-lib-version-diff/references/script-reference.md +174 -0
  345. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/detect-upstream-version.js +967 -0
  346. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/generate-diff.js +1798 -0
  347. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/package.json +5 -0
  348. package/vendor/Server/Skills/rnoh-lib-version-diff/templates/report-template.md +137 -0
  349. package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +145 -0
  350. package/vendor/Server/Skills/skill-generator/SKILL.md +365 -0
  351. package/vendor/Server/Skills/skill-generator/assets/SKILL_TEMPLATE.md +183 -0
  352. package/vendor/Server/Skills/skill-generator/references/COMPLIANCE_CHECKLIST.md +82 -0
  353. package/vendor/Server/Skills/skill-generator/references/KB_QUERY_GUIDE.md +110 -0
  354. package/vendor/Server/Skills/skill-generator/references/MCP_TOOL_DISCOVERY.md +122 -0
  355. package/vendor/Server/Skills/skill-generator/references/SKILL_SPEC.md +121 -0
  356. package/vendor/Server/Skills/skill-generator/scripts/validate-skill.cjs +259 -0
  357. package/vendor/Server/Skills/task-analysis/SKILL.md +234 -0
  358. package/vendor/Server/Skills/task-analysis/assets/OUTPUT_EXAMPLES.md +160 -0
  359. package/vendor/Server/Skills/task-analysis/references/ACCEPTANCE_CRITERIA_GUIDE.md +190 -0
  360. package/vendor/Server/Skills/task-analysis/references/ANALYSIS_SCHEMA.md +224 -0
  361. package/vendor/Server/Skills/task-analysis/references/INTEGRATION_CONTEXT.md +162 -0
  362. package/vendor/Server/Skills/task-analysis/references/LESSONS_LEARNED.md +55 -0
  363. package/vendor/Server/Skills/task-analysis/references/REPLAN_CONTEXT_GUIDE.md +126 -0
  364. package/vendor/Server/Skills/task-analysis/scripts/validate-analysis-output.sh +256 -0
  365. package/vendor/Server/Skills/task-decomposition/SKILL.md +529 -0
  366. package/vendor/Server/Skills/task-decomposition/assets/OUTPUT_EXAMPLES.md +451 -0
  367. package/vendor/Server/Skills/task-decomposition/references/ACCEPTANCE_CRITERIA_GUIDE.md +179 -0
  368. package/vendor/Server/Skills/task-decomposition/references/DEPENDENCY_GRAPH_GUIDE.md +152 -0
  369. package/vendor/Server/Skills/task-decomposition/references/INTEGRATION_CONTEXT.md +175 -0
  370. package/vendor/Server/Skills/task-decomposition/references/REPLAN_CONTEXT_GUIDE.md +195 -0
  371. package/vendor/Server/Skills/task-decomposition/references/TASK_DECOMPOSITION_TEMPLATES.md +226 -0
  372. package/vendor/Server/Skills/task-decomposition/scripts/list-available-skills.cjs +263 -0
  373. package/vendor/Server/Skills/task-decomposition/scripts/skill-blacklist.json +29 -0
  374. package/vendor/Server/Skills/task-decomposition/scripts/validate-decomposition-output.cjs +376 -0
  375. package/vendor/Server/Skills/task-decomposition/scripts/validate-param-consistency.cjs +259 -0
  376. package/vendor/Server/Skills/task-decomposition/scripts/validate-specified-skills.cjs +216 -0
  377. package/vendor/Server/Skills/task-decomposition/scripts/validate-step-graph.cjs +425 -0
  378. package/vendor/Server/Skills/tpc-cpp-check/SKILL.md +427 -0
  379. package/vendor/Server/Skills/tpc-cpp-check/references/CHECKLIST.md +214 -0
  380. package/vendor/Server/Skills/tpc-cpp-check/references/HPKBUILD_GUIDE.md +235 -0
  381. package/vendor/Server/Skills/tpc-cpp-check/references/REPORT_TEMPLATE.md +250 -0
  382. package/vendor/Server/TestCheck/TestCheck.js +775 -0
  383. package/vendor/Server/TestCheck/index.js +11 -0
  384. package/vendor/Server/library/McpToolGuide.js +280 -0
  385. package/vendor/Server/library/StatsService.js +127 -0
  386. package/vendor/Server/library/cstTime.js +16 -0
  387. package/vendor/Server/package.json +17 -0
  388. package/vendor/VERSION +3 -0
  389. package/workflows/pr-check.mjs +106 -0
@@ -0,0 +1,345 @@
1
+ # 设备运行时崩溃排错指南
2
+
3
+ RN 0.84 + React 19 + RNOH 0.84 环境下,测试 demo 移植到鸿蒙设备后遇到的运行时崩溃及解决方案。
4
+
5
+ 本文档基于 rntpc_react-native-netinfo 库的实战调试经验整理。
6
+
7
+ ## 崩溃 1:Element type is invalid: got: object
8
+
9
+ ### 症状
10
+
11
+ 应用启动即崩溃,错误信息:`Element type is invalid: got: object`。
12
+
13
+ ### 根因
14
+
15
+ `example/src/index.tsx` 中定义了 `ExampleApp` 组件类,并在文件末尾调用 `AppRegistry.registerComponent('app_name', () => ExampleApp)`,但**缺少 `export default` 导出**。
16
+
17
+ `example/index.js` 中 `import App from './src/index'` 要求 `src/index.tsx` 有默认导出。缺少默认导出时,`App` 为 `undefined`,React 注册了一个 `undefined` 组件,运行时报 "Element type is invalid"。
18
+
19
+ ### 诊断方法
20
+
21
+ ```bash
22
+ # 检查 index.tsx 是否有 export default
23
+ grep "export default" example/src/index.tsx
24
+ ```
25
+
26
+ 如果没有输出,即为问题所在。
27
+
28
+ ### 解决方案
29
+
30
+ 在 `AppRegistry.registerComponent` **之前**添加默认导出:
31
+
32
+ ```typescript
33
+ // example/src/index.tsx 末尾
34
+
35
+ export default ExampleApp;
36
+
37
+ AppRegistry.registerComponent('app_name', () => ExampleApp);
38
+ ```
39
+
40
+ **注意**:`app_name` 必须与 `app.json` 中的 `"name"` 字段一致,且与 `Index.ets` 中 `RNApp` 的 `appKey` 一致。
41
+
42
+ ## 崩溃 2:Cannot read property 'useState' of null
43
+
44
+ ### 症状
45
+
46
+ 应用启动后白屏或崩溃,错误信息:`Cannot read property 'useState' of null`。调用栈指向调用了 `useState()` 的组件(如 NetInfoHook 中的 `useNetInfo()`)。
47
+
48
+ ### 根因
49
+
50
+ Metro bundler 为 `react` 创建了**两个模块实例**:
51
+
52
+ ```
53
+ 模块 ID 49: node_modules/react/index.js ← example 代码使用
54
+ 模块 ID 640: ../node_modules/react/index.js ← 库代码使用
55
+ ```
56
+
57
+ 两个 React 实例导致 `ReactSharedInternals.H`(hooks dispatcher)不一致:
58
+ - 渲染器在实例 A 上设置 dispatcher
59
+ - 组件在实例 B 上调用 `useState()`
60
+ - 实例 B 的 `H` 为 null → 崩溃
61
+
62
+ #### 为什么会有两个 react
63
+
64
+ 库通过 `"file:.."` 安装(symlink 到父目录),目录结构:
65
+
66
+ ```
67
+ rntpc_react-native-netinfo/ ← 库根目录
68
+ ├── node_modules/react/ ← React 副本 A
69
+ ├── src/index.ts ← import {useState} from 'react' → 解析到副本 A
70
+ └── example/ ← 测试工程
71
+ ├── node_modules/react/ ← React 副本 B
72
+ └── src/index.tsx ← import * as React from 'react' → 解析到副本 B
73
+ ```
74
+
75
+ Metro 的 `nodeModulesPaths` 包含了两个目录,对不同的导入上下文解析到不同的 `react` 路径。
76
+
77
+ ### 诊断方法
78
+
79
+ 构建 dev bundle 并检查 React 模块路径:
80
+
81
+ ```bash
82
+ npx react-native bundle --platform harmony --dev true \
83
+ --entry-file index.js --bundle-output /tmp/test-bundle-dev.js
84
+
85
+ grep -oE '(node_modules|\.\./node_modules)/react/index\.js' /tmp/test-bundle-dev.js | sort | uniq -c
86
+ ```
87
+
88
+ 如果输出包含两个不同路径,即为多副本问题:
89
+
90
+ ```
91
+ 1 node_modules/react/index.js ← example 的
92
+ 1 ../node_modules/react/index.js ← 库根目录的
93
+ ```
94
+
95
+ ### 解决方案
96
+
97
+ 在 `metro.config.js` 中**包装** RNOH 的 `resolveRequest`,拦截裸 `react` 导入:
98
+
99
+ ```javascript
100
+ const path = require('path');
101
+ const {mergeConfig, getDefaultConfig} = require('@react-native/metro-config');
102
+ const {createHarmonyMetroConfig} = require('@react-native-oh/react-native-harmony/metro.config');
103
+
104
+ const projectRoot = __dirname;
105
+ const libraryRoot = path.resolve(projectRoot, '..');
106
+ const exampleNodeModules = path.resolve(projectRoot, 'node_modules');
107
+
108
+ // 只拦截裸 'react' 导入,强制解析到 example 的 node_modules
109
+ const SINGLETON_MODULES = new Set(['react']);
110
+
111
+ // 先获取 RNOH 的 resolveRequest
112
+ const harmonyConfig = createHarmonyMetroConfig({
113
+ reactNativeHarmonyPackageName: '@react-native-oh/react-native-harmony',
114
+ });
115
+ const rnohResolveRequest = harmonyConfig.resolver?.resolveRequest;
116
+
117
+ // 包装:先拦截 react,其余委托给 RNOH
118
+ function wrappedResolveRequest(context, moduleName, platform) {
119
+ if (SINGLETON_MODULES.has(moduleName)) {
120
+ return {
121
+ filePath: path.resolve(exampleNodeModules, moduleName, 'index.js'),
122
+ type: 'sourceFile',
123
+ };
124
+ }
125
+ if (rnohResolveRequest) {
126
+ return rnohResolveRequest(context, moduleName, platform);
127
+ }
128
+ return context.resolveRequest(context, moduleName, platform);
129
+ }
130
+
131
+ const config = {
132
+ watchFolders: [libraryRoot],
133
+ resolver: {
134
+ nodeModulesPaths: [
135
+ exampleNodeModules,
136
+ path.resolve(libraryRoot, 'node_modules'),
137
+ ],
138
+ resolveRequest: wrappedResolveRequest,
139
+ },
140
+ transformer: {
141
+ getTransformOptions: async () => ({
142
+ transform: {
143
+ experimentalImportSupport: false,
144
+ inlineRequires: true,
145
+ },
146
+ }),
147
+ },
148
+ };
149
+
150
+ module.exports = mergeConfig(
151
+ getDefaultConfig(__dirname),
152
+ harmonyConfig,
153
+ config,
154
+ );
155
+ ```
156
+
157
+ #### 关键约束
158
+
159
+ 1. **不能直接设置 `resolveRequest` 覆盖 RNOH**:`mergeConfig` 按从左到右应用,后面的 config 的 `resolveRequest` 会完全覆盖前面的。RNOH 的 `createHarmonyMetroConfig` 提供了自己的 `resolveRequest`,处理 `.harmony.js` 平台文件解析、`react-native` → `@react-native-oh/react-native-harmony` 重定向等。如果直接覆盖,harmony 平台构建会失败。
160
+
161
+ 2. **不要拦截 `react-native`**:RNOH 的 resolver 会将 `react-native` 重定向到 `@react-native-oh/react-native-harmony`。如果也拦截 `react-native`,会破坏这个重定向。只需拦截 `react`(裸导入)。
162
+
163
+ 3. **必须先获取 RNOH 的 resolveRequest 引用,再在 config 中包装**:通过 `harmonyConfig.resolver?.resolveRequest` 提取引用,在 `wrappedResolveRequest` 中调用它。
164
+
165
+ #### 验证
166
+
167
+ ```bash
168
+ npx react-native bundle --platform harmony --dev true \
169
+ --entry-file index.js --bundle-output /tmp/test-bundle-dev.js
170
+
171
+ grep -oE '(node_modules|\.\./node_modules)/react/index\.js' /tmp/test-bundle-dev.js | sort | uniq -c
172
+ ```
173
+
174
+ 正确结果应只有 1 个:
175
+
176
+ ```
177
+ 1 node_modules/react/index.js
178
+ ```
179
+
180
+ ## 崩溃 3:白屏无渲染(加载旧 bundle)
181
+
182
+ ### 症状
183
+
184
+ 修复 metro.config.js 后 `npm run dev` 构建成功,但设备上仍然白屏或崩溃。Metro dev server 未运行时尤其明显。
185
+
186
+ ### 根因
187
+
188
+ 鸿蒙应用启动时按优先级尝试多个 bundle 来源(见 `Index.ets` 中的 `AnyJSBundleProvider`):
189
+
190
+ 1. `MetroJSBundleProvider` — 从 Metro dev server 加载(需要 Metro 运行中)
191
+ 2. `FileJSBundleProvider('/data/storage/el2/base/files/bundle.harmony.js')` — 从设备文件加载
192
+ 3. `ResourceJSBundleProvider('hermes_bundle.hbc')` — 从编译好的 Hermes 字节码加载
193
+ 4. `ResourceJSBundleProvider('bundle.harmony.js')` — 从 rawfile 资源加载
194
+
195
+ 如果 Metro 未运行,且 HAP 未重新构建,设备会加载**编译进 HAP 的旧 `rawfile/bundle.harmony.js`**(包含修复前的重复 React 实例)。
196
+
197
+ ### 诊断方法
198
+
199
+ ```bash
200
+ # 检查 rawfile 中的 bundle 是否有重复 React
201
+ grep -oE '(node_modules|\.\./node_modules)/react/index\.js' \
202
+ harmony/entry/src/main/resources/rawfile/bundle.harmony.js | sort | uniq -c
203
+ ```
204
+
205
+ 如果输出两个路径,说明 rawfile 中是旧 bundle。
206
+
207
+ ### 解决方案
208
+
209
+ 重新构建 bundle 并重新部署 HAP:
210
+
211
+ ```bash
212
+ # 1. 重新构建 bundle(会更新 harmony/entry/src/main/resources/rawfile/bundle.harmony.js)
213
+ npm run dev
214
+
215
+ # 2. 在 DevEco Studio 中 Build → Run,重新编译 HAP 并安装到设备
216
+ ```
217
+
218
+ **注意**:`npm run dev` 只更新源文件目录中的 `bundle.harmony.js`,DevEco Studio 构建时才会将其打包进 HAP。仅执行 `npm run dev` 不重新构建 HAP 是不够的。
219
+
220
+ #### 快速验证(不重新构建 HAP)
221
+
222
+ 启动 Metro dev server,让设备实时加载最新 bundle:
223
+
224
+ ```bash
225
+ # 设置端口转发
226
+ hdc fport tcp:8081 tcp:8081
227
+
228
+ # 启动 Metro(会自动执行 hdc rport)
229
+ npm run start
230
+ ```
231
+
232
+ 在设备上重新打开应用,Metro 会提供最新的 bundle。如果应用正常渲染,说明问题已解决,接下来只需重新构建 HAP 即可。
233
+
234
+ ## 崩溃 4:Jest 单元测试中的 React 多副本
235
+
236
+ ### 症状
237
+
238
+ Jest 测试中调用 hooks 时崩溃:`Cannot read properties of null (reading 'useRef')` 或 `reading 'useState'`。
239
+
240
+ ### 根因
241
+
242
+ 与崩溃 2 相同的根因——库根目录和 example 目录各有一份 `node_modules/react`。但 Jest 环境下的解决方式不同。
243
+
244
+ ### 解决方案
245
+
246
+ 在 `jest.config.js` 的 `moduleNameMapper` 中强制统一 React 路径:
247
+
248
+ ```javascript
249
+ moduleNameMapper: {
250
+ '^react-native$': '<rootDir>/__mocks__/react-native.js',
251
+ '^react$': '<rootDir>/node_modules/react/index.js',
252
+ '^react/jsx-runtime$': '<rootDir>/node_modules/react/jsx-runtime.js',
253
+ },
254
+ ```
255
+
256
+ 详见 [jest-troubleshooting.md](jest-troubleshooting.md) 问题 1。
257
+
258
+ ## 崩溃 5:HAP 安装失败 — no signature file
259
+
260
+ ### 症状
261
+
262
+ `hdc install entry-default-unsigned.hap` 返回错误:
263
+
264
+ ```text
265
+ error: failed to install bundle. code:9568320 error: no signature file.
266
+ ```
267
+
268
+ ### 根因
269
+
270
+ 工程的 `build-profile.json5` 中 `signingConfigs` 为空数组 `[]` 或缺失。hvigor 构建时跳过签名步骤,生成 unsigned HAP,设备拒绝安装。
271
+
272
+ ### 解决方案
273
+
274
+ **不要自行创建签名文件**。从平台统一签名配置文件读取并合并:
275
+
276
+ **签名配置文件**:`3rdLibraryLoop/Server/` 目录下的 `.signing` 文件(相对于本 SKILL 的 references 目录为 `../../../.signing`)
277
+
278
+ ```bash
279
+ # 1. 读取签名配置(路径相对于 Server 目录)
280
+ cat ../../.signing
281
+
282
+ # 2. 将 signingConfigs 数组合并到工程的 build-profile.json5
283
+ # 将 .signing 文件中的 "signingConfigs" 数组内容
284
+ # 写入 build-profile.json5 的 "app.signingConfigs" 字段
285
+ # 确保 products[0].signingConfig = "default" 引用名称匹配
286
+
287
+ # 3. 确认签名材料文件存在(路径来自 .signing 文件中的 certpath/profile/storeFile)
288
+ ls -la $HOME/.ohos/config/*.cer $HOME/.ohos/config/*.p7b $HOME/.ohos/config/*.p12
289
+
290
+ # 4. 清理并使用 devecocli 重新构建
291
+ cd <project>/example/harmony
292
+ devecocli build clean
293
+ devecocli build --modules entry@default --build-mode debug
294
+
295
+ # 5. 安装到设备
296
+ hdc install <project>/example/harmony/entry/build/default/outputs/default/entry-default-unsigned.hap
297
+ ```
298
+
299
+ **合并后的 build-profile.json5 示例**:
300
+
301
+ ```json5
302
+ {
303
+ "app": {
304
+ "products": [
305
+ {
306
+ "name": 'default',
307
+ "signingConfig": 'default', // 引用下面的 signingConfigs 名称
308
+ "compatibleSdkVersion": '5.0.0(12)',
309
+ "runtimeOS": 'HarmonyOS'
310
+ }
311
+ ],
312
+ "signingConfigs": [
313
+ {
314
+ "name": "default",
315
+ "type": "HarmonyOS",
316
+ "material": {
317
+ "certpath": "$HOME/.ohos/config/xxx.cer",
318
+ "keyAlias": "debugKey",
319
+ "keyPassword": "xxx",
320
+ "profile": "$HOME/.ohos/config/xxx.p7b",
321
+ "signAlg": "SHA256withECDSA",
322
+ "storeFile": "$HOME/.ohos/config/xxx.p12",
323
+ "storePassword": "xxx"
324
+ }
325
+ }
326
+ ]
327
+ },
328
+ // ... modules 配置保持不变
329
+ }
330
+ ```
331
+
332
+ ## 检查清单
333
+
334
+ 修复运行时崩溃后,逐项确认:
335
+
336
+ - [ ] `example/src/index.tsx` 有 `export default ExampleApp;`
337
+ - [ ] `export default` 在 `AppRegistry.registerComponent` 之前
338
+ - [ ] `app.json` 的 `name` 与 `Index.ets` 的 `appKey` 一致
339
+ - [ ] `metro.config.js` 包装了 RNOH 的 `resolveRequest`(未直接覆盖)
340
+ - [ ] dev bundle 中只有 1 个 `react/index.js` 路径
341
+ - [ ] `npm run dev` 重新生成了 `rawfile/bundle.harmony.js`
342
+ - [ ] `build-profile.json5` 的 `signingConfigs` 已从 `.signing` 文件合并(非空)
343
+ - [ ] HAP 构建输出无 `Will skip sign` 警告
344
+ - [ ] `hdc install` 成功安装 HAP 到设备
345
+ - [ ] 设备上应用正常启动渲染,无崩溃
@@ -0,0 +1,223 @@
1
+ # 单元测试编写指南
2
+
3
+ RN 0.84 + React 19 环境下,为鸿蒙化组件编写 jest 单元测试的模板和最佳实践。
4
+
5
+ 本文档基于 rntpc_picker 库的实战经验整理,适用于所有 Fabric 组件的鸿蒙化测试。
6
+
7
+ ## 测试架构
8
+
9
+ ### 核心思路
10
+
11
+ 鸿蒙化组件(如 `PickerHarmony.harmony.js`)使用 Fabric 原生组件(如 `RNCPickerNativeComponent`)。
12
+ 在单元测试中,我们 mock 掉 Fabric 原生组件,通过 `globalThis` 捕获传入的 props,从而验证组件逻辑。
13
+
14
+ ```text
15
+ 测试文件 被测组件 Mock 原生组件
16
+ PickerHarmony.test.tsx → PickerHarmony.harmony.js → __mocks__/RNCPickerNativeComponent.js
17
+
18
+ globalThis.__CAPTURED_PROPS__
19
+
20
+ 测试断言读取
21
+ ```
22
+
23
+ ### Mock 原生组件模板
24
+
25
+ 适用于所有 `codegenNativeComponent` 生成的 Fabric 组件:
26
+
27
+ ```javascript
28
+ // __mocks__/<ComponentName>NativeComponent.js
29
+ const React = require('react');
30
+
31
+ // NativeCommands mock
32
+ const Commands = {
33
+ // 替换为实际的 command 名称
34
+ setNativeSelectedIndex: jest.fn(),
35
+ };
36
+
37
+ // forwardRef 捕获 props,通过 globalThis 传递给测试
38
+ const MockNativeComponent = React.forwardRef((props, ref) => {
39
+ globalThis.__COMPONENT_CAPTURED_PROPS__ = props;
40
+ globalThis.__COMPONENT_CAPTURED_ONCHANGE__ = props.onChange; // 按需捕获事件回调
41
+ React.useImperativeHandle(ref, () => ({
42
+ setNativeProps: jest.fn(),
43
+ }));
44
+ return React.createElement('NativeComponent', props);
45
+ });
46
+
47
+ module.exports = {
48
+ __esModule: true,
49
+ default: MockNativeComponent,
50
+ Commands,
51
+ };
52
+ ```
53
+
54
+ ### Mock react-native 模板
55
+
56
+ ```javascript
57
+ // __mocks__/react-native.js
58
+ const React = require('react');
59
+
60
+ const View = (props) => React.createElement('View', props, props.children);
61
+ const Text = (props) => React.createElement('Text', props, props.children);
62
+ const StyleSheet = { create: (styles) => styles, flatten: (style) => style };
63
+ const Platform = { OS: 'harmony', select: (obj) => obj.harmony || obj.default };
64
+ const processColor = (color) => color; // 透传,测试中不转换颜色
65
+
66
+ module.exports = {
67
+ View, Text, StyleSheet, Platform, processColor,
68
+ // 按需添加:Button, ScrollView, Switch, I18nManager 等
69
+ };
70
+ ```
71
+
72
+ ## 测试文件模板
73
+
74
+ ### 基本结构
75
+
76
+ ```typescript
77
+ import * as React from 'react';
78
+ import TestRenderer, {act} from 'react-test-renderer';
79
+
80
+ // 1. Mock Fabric 原生组件(jest.mock 会被自动提升到文件顶部)
81
+ jest.mock('<相对路径>/<ComponentName>NativeComponent', () => {
82
+ return require('<相对路径>/__mocks__/<ComponentName>NativeComponent');
83
+ });
84
+
85
+ // 2. 导入被测组件(此时原生组件已被 mock)
86
+ import MyComponent from '<相对路径>/<ComponentName>.harmony';
87
+
88
+ const {Item} = MyComponent as any; // 如有子组件
89
+
90
+ // 3. 快捷访问器
91
+ const lastProps = (): any => globalThis.__COMPONENT_CAPTURED_PROPS__;
92
+ const lastOnChange = (): any => globalThis.__COMPONENT_CAPTURED_ONCHANGE__;
93
+
94
+ // 4. act() 包裹的渲染辅助函数(React 19 必须)
95
+ function renderComponent(element: React.ReactElement) {
96
+ let renderer;
97
+ act(() => {
98
+ renderer = TestRenderer.create(element);
99
+ });
100
+ return renderer;
101
+ }
102
+
103
+ // 5. 测试用例
104
+ describe('MyComponent', () => {
105
+ beforeEach(() => {
106
+ globalThis.__COMPONENT_CAPTURED_PROPS__ = null;
107
+ globalThis.__COMPONENT_CAPTURED_ONCHANGE__ = null;
108
+ });
109
+
110
+ // 渲染基础测试
111
+ describe('渲染基础测试', () => {
112
+ it('should render with children', () => {
113
+ renderComponent(<MyComponent prop1="value" />);
114
+ expect(lastProps()).toBeTruthy();
115
+ });
116
+
117
+ it('should render without crashing with empty children', () => {
118
+ renderComponent(<MyComponent prop1="value">{null}</MyComponent>);
119
+ expect(lastProps()).toBeTruthy();
120
+ });
121
+ });
122
+
123
+ // 状态计算测试
124
+ describe('状态计算', () => {
125
+ it('should calculate correct state based on prop', () => {
126
+ renderComponent(<MyComponent selectedValue="key1" />);
127
+ expect(lastProps().selectedIndex).toBe(1);
128
+ });
129
+ });
130
+
131
+ // 事件处理测试
132
+ describe('事件处理', () => {
133
+ it('should call onChange and onValueChange', () => {
134
+ const onChange = jest.fn();
135
+ const onValueChange = jest.fn();
136
+ renderComponent(<MyComponent onChange={onChange} onValueChange={onValueChange} />);
137
+
138
+ const mockEvent = {
139
+ nativeEvent: { newValue: 'key1', newIndex: 1 },
140
+ };
141
+ act(() => {
142
+ lastOnChange()(mockEvent);
143
+ });
144
+
145
+ expect(onChange).toHaveBeenCalledWith(mockEvent);
146
+ expect(onValueChange).toHaveBeenCalledWith('key1', 1);
147
+ });
148
+
149
+ it('should not crash when callbacks not provided', () => {
150
+ renderComponent(<MyComponent />);
151
+ expect(() => {
152
+ act(() => { lastOnChange()({ nativeEvent: {} }); });
153
+ }).not.toThrow();
154
+ });
155
+ });
156
+
157
+ // Prop 传递测试
158
+ describe('prop 传递到原生组件', () => {
159
+ it('should pass testID to native', () => {
160
+ renderComponent(<MyComponent testID="my-id" />);
161
+ expect(lastProps().testID).toBe('my-id');
162
+ });
163
+
164
+ it('should pass enabled to native', () => {
165
+ renderComponent(<MyComponent enabled={false} />);
166
+ expect(lastProps().enabled).toBe(false);
167
+ });
168
+ });
169
+
170
+ // ref 转发测试
171
+ describe('ref forwarding', () => {
172
+ it('should forward ref to native', () => {
173
+ const ref = React.createRef() as any;
174
+ renderComponent(<MyComponent ref={ref} />);
175
+ expect(ref.current).toBeTruthy();
176
+ });
177
+ });
178
+
179
+ // 静态属性测试
180
+ describe('static properties', () => {
181
+ it('should expose Item as static property', () => {
182
+ expect(MyComponent.Item).toBeDefined();
183
+ });
184
+ });
185
+ });
186
+ ```
187
+
188
+ ## 测试用例设计原则
189
+
190
+ ### 1. 覆盖率维度
191
+
192
+ | 维度 | 覆盖内容 | 示例 |
193
+ | ---- | -------- | ---- |
194
+ | 渲染 | 组件能正常渲染,props 正确传递 | `expect(lastProps()).toBeTruthy()` |
195
+ | 状态计算 | useMemo/useState 计算结果正确 | `expect(lastProps().selectedIndex).toBe(1)` |
196
+ | 数据映射 | children → items 映射正确 | `expect(lastProps().items[0]).toEqual({...})` |
197
+ | 类型转换 | String/Number 转换正确 | `expect(lastProps().items[0].label).toBe('123')` |
198
+ | 事件处理 | onChange/onValueChange 正确调用 | `expect(onValueChange).toHaveBeenCalledWith('key1', 1)` |
199
+ | 边界值 | null/undefined/默认值处理 | `expect(lastProps().numberOfLines).toBe(1)` |
200
+ | 数值处理 | round/clamp 逻辑 | `expect(lastProps().numberOfLines).toBe(3)` |
201
+ | Prop 透传 | 所有 prop 正确传递到原生组件 | `expect(lastProps().testID).toBe('my-id')` |
202
+ | Ref 转发 | ref 正确转发 | `expect(ref.current).toBeTruthy()` |
203
+ | 静态属性 | 子组件作为静态属性暴露 | `expect(MyComponent.Item).toBeDefined()` |
204
+
205
+ ### 2. 测试优先级
206
+
207
+ 1. **P0 — 核心逻辑**: 状态计算(useMemo)、数据映射(children → items)
208
+ 2. **P0 — 事件处理**: onChange/onValueChange 回调验证
209
+ 3. **P1 — Prop 传递**: 所有 props 正确传递到原生组件
210
+ 4. **P1 — 边界值**: null/undefined/默认值/数值处理
211
+ 5. **P2 — Ref 转发**: ref 正确转发到原生组件
212
+ 6. **P2 — 静态属性**: 子组件(如 Item)正确暴露
213
+
214
+ ### 3. 不适合单元测试的内容
215
+
216
+ 以下内容依赖原生运行时,不适合在 jest 单元测试中覆盖,应在真机集成测试中验证:
217
+
218
+ - `useLayoutEffect` 中通过 `global.nativeFabricUIManager` 调用 NativeCommands
219
+ - `setNativeProps` 实际效果
220
+ - `processColor` 的真实颜色转换(mock 中透传即可)
221
+ - 原生组件的实际渲染行为
222
+
223
+ 在覆盖率报告中标注为「不适用(原生环境)」。