@ohos-cpf/3rdloop 0.0.7 → 0.0.9

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 (230) hide show
  1. package/README.md +44 -25
  2. package/lib/cli.js +54 -29
  3. package/lib/config-cmd.js +1 -1
  4. package/lib/config.js +32 -0
  5. package/lib/doctor.js +266 -48
  6. package/lib/mcp.js +498 -0
  7. package/lib/opencode.js +75 -29
  8. package/lib/orch.js +32 -10
  9. package/lib/runner.js +8 -5
  10. package/lib/serve.js +162 -149
  11. package/lib/step.js +15 -4
  12. package/lib/web.js +107 -265
  13. package/lib/workflow.js +18 -8
  14. package/package.json +6 -2
  15. package/vendor/Archive/data/.index/meta.json +7 -0
  16. package/vendor/Archive/data/.index/search.db +0 -0
  17. package/vendor/Archive/data/docs/experiences/arkts-check-tool-pitfalls-baseline-comparison.md +13 -0
  18. package/vendor/Archive/data/docs/experiences/arkts-deep-path-import-recognition.md +31 -0
  19. package/vendor/Archive/data/docs/experiences/arkts-demo-coverage-entry-file-case-mismatch.md +25 -0
  20. package/vendor/Archive/data/docs/experiences/arkts-demo-coverage-import-trailing-slash.md +20 -0
  21. package/vendor/Archive/data/docs/experiences/arkts-library-source-files-may-be-ts.md +18 -0
  22. package/vendor/Archive/data/docs/experiences/arkts-typedarray-buffer-interface-cast-compile-fixes.md +36 -0
  23. package/vendor/Archive/data/docs/experiences/arkts-xts-compile-error-clustering-fix.md +24 -0
  24. package/vendor/Archive/data/docs/experiences/arkts-xts-doc-expected-value-runtime-probe.md +35 -0
  25. package/vendor/Archive/data/docs/experiences/arkts-xts-fixture-rawfile-testability-injection.md +33 -0
  26. package/vendor/Archive/data/docs/experiences/code-linter-chinese-comment-false-positive.md +16 -0
  27. package/vendor/Archive/data/docs/experiences/esobject-new-expression-variable-tracking.md +33 -0
  28. package/vendor/Archive/data/docs/experiences/filesystem-case-sensitivity-module-resolution.md +31 -0
  29. package/vendor/Archive/data/docs/experiences/gitcode-clone-redirect-warning-normal.md +13 -0
  30. package/vendor/Archive/data/docs/experiences/kn_msgvq1w585ec8319.md +77 -0
  31. package/vendor/Archive/data/docs/experiences/kn_msovnm6rd46de72c.md +98 -0
  32. package/vendor/Archive/data/docs/experiences/kn_mspt8vntfe708576.md +87 -0
  33. package/vendor/Archive/data/docs/experiences/kn_mspu1ei77adbbb48.md +133 -0
  34. package/vendor/Archive/data/docs/experiences/kn_mspubgak8d30bfce.md +128 -0
  35. package/vendor/Archive/data/docs/experiences/kn_mspug2de3cb1f7c3.md +115 -0
  36. package/vendor/Archive/data/docs/experiences/kn_skill_opt_001.md +38 -0
  37. package/vendor/Archive/data/docs/experiences/loop-artifacts-verification-evidence-triangle.md +19 -0
  38. package/vendor/Archive/data/docs/experiences/macos-bash-replace-build-ps1.md +19 -0
  39. package/vendor/Archive/data/docs/experiences/macos-bsd-diff-q-illegal-option.md +15 -0
  40. package/vendor/Archive/data/docs/experiences/migrate-cjs-compatible-api-version-map-limit.md +17 -0
  41. package/vendor/Archive/data/docs/experiences/mp3agic-arkts-library-behavior-quirks.md +21 -0
  42. package/vendor/Archive/data/docs/experiences/ohos-face-detection-scan-api-mapping.md +15 -0
  43. package/vendor/Archive/data/docs/experiences/pr-metadata-and-diff-integrity-verification.md +12 -0
  44. package/vendor/Archive/data/docs/experiences/rn-coverage-index-signature-pseudo-member-false-negative.md +32 -0
  45. package/vendor/Archive/data/docs/experiences/rn-memory-check-severity-calibration.md +21 -0
  46. package/vendor/Archive/data/docs/experiences/rn-platform-specific-api-exclusion-evidence.md +24 -0
  47. package/vendor/Archive/data/docs/experiences/rn-upstream-version-diff-pitfalls.md +17 -0
  48. package/vendor/Archive/data/docs/experiences/rn-version-gap-risk-rating-rules.md +13 -0
  49. package/vendor/Archive/data/docs/experiences/rn-view-lib-native-contract-diff-fabric-spec.md +16 -0
  50. package/vendor/Archive/data/docs/experiences/rnoh-adapter-package-version-field-semantics.md +18 -0
  51. package/vendor/Archive/data/docs/experiences/rnoh-arkts-sqlite-rows-array-format.md +18 -0
  52. package/vendor/Archive/data/docs/experiences/rnoh-dependency-residue-scan-strategy.md +18 -0
  53. package/vendor/Archive/data/docs/experiences/rnoh-example-local-lib-dep-use-tgz.md +53 -0
  54. package/vendor/Archive/data/docs/experiences/rnoh-example-prereserve-rntesterlist.md +17 -0
  55. package/vendor/Archive/data/docs/experiences/rnoh-example-template-compatiblesdkversion-upgrade.md +29 -0
  56. package/vendor/Archive/data/docs/experiences/rnoh-example-turbomodule-shell-adaptation-checklist.md +41 -0
  57. package/vendor/Archive/data/docs/experiences/rnoh-mcp-build-project-tool-risk.md +18 -0
  58. package/vendor/Archive/data/docs/experiences/rnoh-npm-devdependencies-version-precheck.md +29 -0
  59. package/vendor/Archive/data/docs/experiences/rnoh-repo-baseline-version-verification.md +13 -0
  60. package/vendor/Archive/data/docs/experiences/rnoh-repo-upstream-directory-mapping.md +18 -0
  61. package/vendor/Archive/data/docs/experiences/rnoh-stateless-library-zero-leak-verification.md +31 -0
  62. package/vendor/Archive/data/docs/experiences/rnoh-template-npmrc-credential-removal.md +15 -0
  63. package/vendor/Archive/data/docs/experiences/rnoh-turbomodule-codegen-wiring-verification.md +19 -0
  64. package/vendor/Archive/data/docs/experiences/rnoh-turbomodule-cpp-methodmap-compatibility-check.md +20 -0
  65. package/vendor/Archive/data/docs/experiences/scenario-doc-vs-source-signature-diff-four-patterns.md +24 -0
  66. package/vendor/Archive/data/docs/experiences/static-analysis-grep-cross-validation.md +29 -0
  67. package/vendor/Archive/demo.js +489 -0
  68. package/vendor/Archive/index.js +43 -0
  69. package/vendor/Archive/package.json +16 -0
  70. package/vendor/Archive/src/constants.js +83 -0
  71. package/vendor/Archive/src/data/stopwords.txt +110 -0
  72. package/vendor/Archive/src/data/synonyms.json +25 -0
  73. package/vendor/Archive/src/data/terms.txt +59 -0
  74. package/vendor/Archive/src/db/sqlite-backend.js +312 -0
  75. package/vendor/Archive/src/db/sqlite-schema.js +64 -0
  76. package/vendor/Archive/src/engine.js +501 -0
  77. package/vendor/Archive/src/index/index-manager.js +203 -0
  78. package/vendor/Archive/src/index/index-state.js +94 -0
  79. package/vendor/Archive/src/index/search-text-builder.js +106 -0
  80. package/vendor/Archive/src/index.js +22 -0
  81. package/vendor/Archive/src/parser/api-identifiers.js +121 -0
  82. package/vendor/Archive/src/parser/api-suffixes.js +48 -0
  83. package/vendor/Archive/src/parser/heading-normalize.js +40 -0
  84. package/vendor/Archive/src/parser/markdown-splitter.js +215 -0
  85. package/vendor/Archive/src/search/catalog-routing.js +87 -0
  86. package/vendor/Archive/src/search/fts-search.js +289 -0
  87. package/vendor/Archive/src/search/query-normalizer.js +159 -0
  88. package/vendor/Archive/src/search/query-rewriter.js +72 -0
  89. package/vendor/Archive/src/search/search-engine.js +72 -0
  90. package/vendor/Archive/src/search/snippet.js +64 -0
  91. package/vendor/Archive/src/store/dir-store.js +103 -0
  92. package/vendor/Archive/src/store/doc-store.js +36 -0
  93. package/vendor/Archive/src/tokenizer/lexicon.js +151 -0
  94. package/vendor/Archive/src/tokenizer/tokenizer.js +167 -0
  95. package/vendor/Archive/src/types.js +86 -0
  96. package/vendor/Archive/src/utils/hash.js +16 -0
  97. package/vendor/Archive/src/utils/lock.js +73 -0
  98. package/vendor/Archive/src/utils/path-safety.js +96 -0
  99. package/vendor/Archive/src/utils/paths.js +39 -0
  100. package/vendor/BadCase/rn/INDEX.md +127 -0
  101. package/vendor/BadCase/rn/cases/KI-001-webview/350/247/206/351/242/221/346/227/240/346/263/225/346/250/252/345/261/217.md +52 -0
  102. package/vendor/BadCase/rn/cases/KI-002-fastImage/347/203/255/346/233/264/346/226/260/345/233/276/347/211/207/345/244/261/350/264/245.md +37 -0
  103. package/vendor/BadCase/rn/cases/KI-003-wechat/347/274/251/347/225/245/345/233/276/346/234/254/345/234/260/345/233/276/347/211/207.md +62 -0
  104. package/vendor/BadCase/rn/cases/KI-004-wechat/345/233/236/350/260/203/346/227/266/345/272/217.md +47 -0
  105. package/vendor/BadCase/rn/cases/KI-005-geolocation/345/257/274/345/205/245/350/267/257/345/276/204/345/220/216/347/274/200.md +31 -0
  106. package/vendor/BadCase/rn/cases/KI-006-SmartRefreshLayout/346/231/272/350/203/275/346/214/207/351/222/210/345/264/251/346/272/203.md +55 -0
  107. package/vendor/BadCase/rn/cases/KI-007-orientation-locker/344/274/240/346/204/237/345/231/250/345/210/235/345/247/213/345/214/226.md +58 -0
  108. package/vendor/BadCase/rn/cases/KI-008-orientation-locker/344/274/240/346/204/237/345/231/250/345/274/225/347/224/250/350/256/241/346/225/260.md +47 -0
  109. package/vendor/BadCase/rn/cases/KI-009-pager-view/345/265/214/345/245/227/346/273/221/345/212/250.md +38 -0
  110. package/vendor/BadCase/rn/cases/KI-010-screens/346/211/213/345/212/277/345/206/262/347/252/201.md +48 -0
  111. package/vendor/BadCase/rn/cases/KI-011-spring-scrollview/346/211/213/345/212/277/351/207/215/345/244/215/347/273/221/345/256/232.md +49 -0
  112. package/vendor/BadCase/rn/cases/KI-012-qr-camera/346/250/252/345/261/217/351/200/202/351/205/215.md +59 -0
  113. package/vendor/BadCase/rn/cases/KI-013-webview/346/267/261/350/211/262/346/250/241/345/274/217/350/203/214/346/231/257/350/211/262.md +37 -0
  114. package/vendor/BadCase/rn/cases/KI-014-amap-geolocation/345/233/236/350/260/203/347/274/272/345/244/261.md +42 -0
  115. package/vendor/BadCase/rn/cases/KI-015-reanimated/350/277/220/350/241/214/346/227/266/346/236/220/346/236/204/345/264/251/346/272/203.md +54 -0
  116. package/vendor/BadCase/rn/cases/KI-016-fs/346/226/207/344/273/266/350/257/273/345/217/226/347/274/226/347/240/201.md +58 -0
  117. package/vendor/BadCase/rn/cases/KI-017-blob-util/345/217/202/346/225/260/347/274/226/347/240/201/351/224/231/350/257/257.md +39 -0
  118. package/vendor/BadCase/rn/cases/KI-018-modal/345/274/271/347/252/227/351/227/252/347/203/201.md +53 -0
  119. package/vendor/BadCase/rn/cases/KI-019-code-push/351/207/215/345/220/257/351/200/273/350/276/221/345/244/261/346/225/210.md +79 -0
  120. package/vendor/BadCase/rn/cases/KI-020-netinfo/346/225/217/346/204/237/344/277/241/346/201/257/346/263/204/351/234/262.md +60 -0
  121. package/vendor/BadCase/rn/cases/KI-021-video/346/234/254/345/234/260/350/247/206/351/242/221/346/222/255/346/224/276/345/274/202/345/270/270.md +79 -0
  122. package/vendor/BadCase/rn/cases/KI-022-audio-recorder-player/346/236/232/344/270/276/347/274/272/345/244/261.md +38 -0
  123. package/vendor/BadCase/rn/cases/KI-023-svg/346/270/220/345/217/230/347/273/247/346/211/277/345/244/261/346/225/210.md +62 -0
  124. package/vendor/BadCase/rn/generalization-log.md +55 -0
  125. package/vendor/BadCase/rn/pr-info/rntpc_react-native-SmartRefreshLayout-32.json +328 -0
  126. package/vendor/BadCase/rn/pr-info/rntpc_react-native-SmartRefreshLayout-32.md +382 -0
  127. package/vendor/BadCase/rn/pr-info/rntpc_react-native-amap-geolocation-27.json +1351 -0
  128. package/vendor/BadCase/rn/pr-info/rntpc_react-native-amap-geolocation-27.md +1176 -0
  129. package/vendor/BadCase/rn/pr-info/rntpc_react-native-audio-recorder-player-22.json +538 -0
  130. package/vendor/BadCase/rn/pr-info/rntpc_react-native-audio-recorder-player-22.md +1488 -0
  131. package/vendor/BadCase/rn/pr-info/rntpc_react-native-blob-util-23.json +211 -0
  132. package/vendor/BadCase/rn/pr-info/rntpc_react-native-blob-util-23.md +35 -0
  133. package/vendor/BadCase/rn/pr-info/rntpc_react-native-code-push-17.json +2048 -0
  134. package/vendor/BadCase/rn/pr-info/rntpc_react-native-code-push-17.md +3866 -0
  135. package/vendor/BadCase/rn/pr-info/rntpc_react-native-fast-image-102.json +198 -0
  136. package/vendor/BadCase/rn/pr-info/rntpc_react-native-fast-image-102.md +40 -0
  137. package/vendor/BadCase/rn/pr-info/rntpc_react-native-fs-38.json +751 -0
  138. package/vendor/BadCase/rn/pr-info/rntpc_react-native-fs-38.md +883 -0
  139. package/vendor/BadCase/rn/pr-info/rntpc_react-native-geolocation-24.json +1544 -0
  140. package/vendor/BadCase/rn/pr-info/rntpc_react-native-geolocation-24.md +2598 -0
  141. package/vendor/BadCase/rn/pr-info/rntpc_react-native-modal-20.json +246 -0
  142. package/vendor/BadCase/rn/pr-info/rntpc_react-native-modal-20.md +554 -0
  143. package/vendor/BadCase/rn/pr-info/rntpc_react-native-netinfo-31.json +211 -0
  144. package/vendor/BadCase/rn/pr-info/rntpc_react-native-netinfo-31.md +54 -0
  145. package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-45.json +1626 -0
  146. package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-45.md +2213 -0
  147. package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-51.json +208 -0
  148. package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-51.md +77 -0
  149. package/vendor/BadCase/rn/pr-info/rntpc_react-native-pager-view-32.json +377 -0
  150. package/vendor/BadCase/rn/pr-info/rntpc_react-native-pager-view-32.md +174 -0
  151. package/vendor/BadCase/rn/pr-info/rntpc_react-native-qr-decode-image-camera-37.json +232 -0
  152. package/vendor/BadCase/rn/pr-info/rntpc_react-native-qr-decode-image-camera-37.md +194 -0
  153. package/vendor/BadCase/rn/pr-info/rntpc_react-native-reanimated-82.json +198 -0
  154. package/vendor/BadCase/rn/pr-info/rntpc_react-native-reanimated-82.md +67 -0
  155. package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-87.json +198 -0
  156. package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-87.md +38 -0
  157. package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-93.json +208 -0
  158. package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-93.md +34 -0
  159. package/vendor/BadCase/rn/pr-info/rntpc_react-native-spring-scrollview-38.json +222 -0
  160. package/vendor/BadCase/rn/pr-info/rntpc_react-native-spring-scrollview-38.md +56 -0
  161. package/vendor/BadCase/rn/pr-info/rntpc_react-native-svg-117.json +463 -0
  162. package/vendor/BadCase/rn/pr-info/rntpc_react-native-svg-117.md +383 -0
  163. package/vendor/BadCase/rn/pr-info/rntpc_react-native-video-66.json +464 -0
  164. package/vendor/BadCase/rn/pr-info/rntpc_react-native-video-66.md +565 -0
  165. package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-112.json +198 -0
  166. package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-112.md +47 -0
  167. package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-121.json +232 -0
  168. package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-121.md +422 -0
  169. package/vendor/BadCase/rn/pr-info/rntpc_react-native-wechat-lib-15.json +295 -0
  170. package/vendor/BadCase/rn/pr-info/rntpc_react-native-wechat-lib-15.md +1038 -0
  171. package/vendor/BadCase/rn/rules/R-01-/345/205/250/345/261/217/347/252/227/345/217/243/347/212/266/346/200/201/347/256/241/347/220/206/345/256/214/346/225/264/346/200/247.md +20 -0
  172. package/vendor/BadCase/rn/rules/R-02-/350/265/204/346/272/220URI/345/275/242/346/200/201/345/210/206/346/224/257/350/246/206/347/233/226.md +21 -0
  173. package/vendor/BadCase/rn/rules/R-03-/351/231/204/345/261/236/346/223/215/344/275/234/345/244/261/350/264/245/351/230/273/346/226/255/344/270/273/346/265/201/347/250/213.md +20 -0
  174. package/vendor/BadCase/rn/rules/R-04-/345/274/202/346/255/245/345/233/236/350/260/203/346/263/250/345/206/214/346/227/266/345/272/217.md +20 -0
  175. package/vendor/BadCase/rn/rules/R-05-/346/250/241/345/235/227/345/257/274/345/205/245/350/267/257/345/276/204/350/247/204/350/214/203.md +19 -0
  176. package/vendor/BadCase/rn/rules/R-06-/344/274/240/346/204/237/345/231/250/347/241/254/344/273/266/346/235/203/351/231/220/346/214/211/351/234/200/350/216/267/345/217/226.md +21 -0
  177. package/vendor/BadCase/rn/rules/R-07-/346/231/272/350/203/275/346/214/207/351/222/210/347/224/237/345/221/275/345/221/250/346/234/237/347/256/241/347/220/206.md +20 -0
  178. package/vendor/BadCase/rn/rules/R-08-/346/211/213/345/212/277/344/272/213/344/273/266/346/263/250/345/206/214/344/270/216/345/206/262/347/252/201/345/244/204/347/220/206.md +22 -0
  179. package/vendor/BadCase/rn/rules/R-09-/346/250/252/347/253/226/345/261/217/345/244/232/345/275/242/346/200/201/345/270/203/345/261/200/351/200/202/351/205/215.md +20 -0
  180. package/vendor/BadCase/rn/rules/R-10-/346/267/261/350/211/262/346/250/241/345/274/217/344/270/273/351/242/230/351/242/234/350/211/262/351/200/202/351/205/215.md +19 -0
  181. package/vendor/BadCase/rn/rules/R-11-/346/216/245/345/217/243/345/233/236/350/260/203/345/256/236/347/216/260/345/256/214/346/225/264/346/200/247.md +20 -0
  182. package/vendor/BadCase/rn/rules/R-12-/345/216/237/347/224/237/350/277/220/350/241/214/346/227/266/350/265/204/346/272/220/346/236/220/346/236/204/346/227/266/345/272/217.md +20 -0
  183. package/vendor/BadCase/rn/rules/R-13-/346/226/207/344/273/266/346/225/260/346/215/256/347/274/226/347/240/201/344/270/216/346/240/274/345/274/217/345/205/274/345/256/271.md +21 -0
  184. package/vendor/BadCase/rn/rules/R-14-/345/212/250/347/224/273/345/210/235/345/247/213/345/214/226/346/227/266/345/272/217/344/270/216/347/212/266/346/200/201/345/220/214/346/255/245.md +20 -0
  185. package/vendor/BadCase/rn/rules/R-15-/347/212/266/346/200/201/346/214/201/344/271/205/345/214/226/344/270/216/351/207/215/345/220/257/351/200/273/350/276/221/344/270/200/350/207/264/346/200/247.md +20 -0
  186. package/vendor/BadCase/rn/rules/R-16-/346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/346/263/204/351/234/262.md +19 -0
  187. package/vendor/BadCase/rn/rules/R-17-/345/252/222/344/275/223/350/265/204/346/272/220/347/224/237/345/221/275/345/221/250/346/234/237/344/270/216/351/224/231/350/257/257/345/244/204/347/220/206.md +21 -0
  188. package/vendor/BadCase/rn/rules/R-18-/350/203/275/345/212/233/346/236/232/344/270/276/351/205/215/347/275/256/345/256/214/346/225/264/346/200/247.md +19 -0
  189. package/vendor/BadCase/rn/rules/R-19-/345/233/276/345/275/242/346/270/262/346/237/223/345/261/236/346/200/247/347/273/247/346/211/277/344/270/216/351/207/215/347/275/256.md +19 -0
  190. package/vendor/MCP/README.md +490 -0
  191. package/vendor/MCP/config.json +29 -0
  192. package/vendor/MCP/package.json +23 -0
  193. package/vendor/MCP/scripts/analyze-demo-coverage.cjs +1203 -0
  194. package/vendor/MCP/scripts/analyze-xts-coverage.cjs +1245 -0
  195. package/vendor/MCP/scripts/deveco_docs.js +247 -0
  196. package/vendor/MCP/scripts/extract-interfaces.cjs +1487 -0
  197. package/vendor/MCP/scripts/flutter-analyze-demo-coverage.cjs +666 -0
  198. package/vendor/MCP/scripts/flutter-analyze-xts-coverage.cjs +684 -0
  199. package/vendor/MCP/scripts/flutter-extract-interfaces.cjs +1251 -0
  200. package/vendor/MCP/scripts/flutter-render-spec-doc.cjs +351 -0
  201. package/vendor/MCP/scripts/render-spec-doc.cjs +347 -0
  202. package/vendor/MCP/scripts/rn-analyze-demo-coverage.cjs +645 -0
  203. package/vendor/MCP/scripts/rn-analyze-test-coverage.cjs +614 -0
  204. package/vendor/MCP/scripts/rn-extract-interfaces.cjs +1462 -0
  205. package/vendor/MCP/scripts/rn-render-spec-doc.cjs +327 -0
  206. package/vendor/MCP/scripts/rn-scan-exports.cjs +1336 -0
  207. package/vendor/MCP/src/client/MCPClientPool.js +220 -0
  208. package/vendor/MCP/src/config/ConfigLoader.js +189 -0
  209. package/vendor/MCP/src/executor/ScriptExecutor.js +110 -0
  210. package/vendor/MCP/src/gateway/Gateway.js +451 -0
  211. package/vendor/MCP/src/index.js +87 -0
  212. package/vendor/MCP/src/library/KBToolProvider.js +229 -0
  213. package/vendor/MCP/src/library/logger.js +60 -0
  214. package/vendor/MCP/src/registry/ScriptRegistry.js +238 -0
  215. package/vendor/MCP/src/registry/ToolRegistry.js +111 -0
  216. package/vendor/MCP/src/types.js +115 -0
  217. package/vendor/Server/CLI/cli.js +3 -3
  218. package/vendor/Server/Routes/server.js +3 -3
  219. package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +4 -2
  220. package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +3 -3
  221. package/vendor/Server/Skills/knowledge-import/SKILL.md +1 -1
  222. package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +12 -4
  223. package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +5 -4
  224. package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +2 -2
  225. package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +2 -2
  226. package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +1 -2
  227. package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +1 -1
  228. package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +1 -2
  229. package/vendor/Server/package.json +5 -1
  230. package/vendor/VERSION +3 -3
package/lib/doctor.js CHANGED
@@ -1,21 +1,31 @@
1
1
  /**
2
- * doctor.js —— 环境自检(3rdloop doctor)
2
+ * doctor.js —— 环境自检(3rdloop doctor)+ 引擎前置预检(precheckEnv
3
3
  *
4
- * 复用 check-env.mjs 的检测维度(轻量版,不耦合启动流程):
4
+ * 检查维度(doctor 与预检共用 collectChecks):
5
5
  * 1. Node.js 版本(>=22)
6
- * 2. opencode 是否安装 + 服务是否运行
7
- * 3. .env 配置(项目 Server/.env 或用户 ~/.3lib/.env
8
- * 4. 核心依赖是否可导入(vendor/Server)
6
+ * 2. CLI_TYPE 配置有效性(无效值视为配置错误)
7
+ * 3. AI CLI 可执行文件(按 CLI_TYPE 检测 opencode / deveco
8
+ * 4. LLM 凭据(生效环境 DASHSCOPE_API_KEY;LLM_BASE_URL/LLM_MODEL 引擎有内置默认值,不强制)
9
9
  * 5. Skill 目录可访问
10
- * 6. opencode 端口连通性
10
+ * 6. 数据目录可写
11
+ * 7. serve 服务端口连通性(非致命:未运行时 run/orch/step/workflow 会自动拉起;
12
+ * 端口有响应但异常视为失败)
11
13
  *
12
- * 退出码:全部通过 = 0;存在致命问题 = 1。
14
+ * 每项检查含 fix 字段:不通过时的修复提示(含 3rdloop config set 命令),
15
+ * doctor 与预检失败时均打印,用户照抄即可配置。
16
+ *
17
+ * precheckEnv:run/submit/step run/orch run|start/工作流正式执行前调用,
18
+ * 任一项不通过直接退出码 1(避免跑到一半才因环境问题失败、误报为任务失败退出码 2)。
19
+ *
20
+ * 退出码:doctor 全部通过 = 0;存在致命问题 = 1。
13
21
  */
14
22
 
15
23
  import fs from 'node:fs';
16
24
  import path from 'node:path';
17
25
  import { execSync } from 'node:child_process';
18
- import { C, logLine } from './ui.js';
26
+ import { C } from './ui.js';
27
+ import { resolveCliType } from './config.js';
28
+ import { resolveCliServeConfig } from './opencode.js';
19
29
 
20
30
  /**
21
31
  * 检查命令是否在 PATH 中。
@@ -31,17 +41,39 @@ function which(cmd) {
31
41
  }
32
42
 
33
43
  /**
34
- * 执行环境自检。
35
- *
44
+ * 探测 serve 服务 HTTP /health(2s 超时)。
45
+ * @param {string} baseUrl
46
+ * @returns {Promise<{ state: 'running'|'down'|'error', detail: string }>}
47
+ * running = 服务正常;down = 未运行(执行命令时会自动拉起,非致命);
48
+ * error = 端口有响应但异常(可能是残留的坏进程,视为致命)
49
+ */
50
+ async function probeServe(baseUrl) {
51
+ try {
52
+ const controller = new AbortController();
53
+ const timer = setTimeout(() => controller.abort(), 2000);
54
+ const res = await fetch(`${baseUrl}/health`, { signal: controller.signal });
55
+ clearTimeout(timer);
56
+ return res.ok
57
+ ? { state: 'running', detail: `运行中 (${baseUrl})` }
58
+ : { state: 'error', detail: `响应异常 HTTP ${res.status} (${baseUrl}),可能是残留的异常进程` };
59
+ } catch {
60
+ return { state: 'down', detail: `未运行 (${baseUrl})——执行 run/orch/step/workflow 时会自动拉起` };
61
+ }
62
+ }
63
+
64
+ /**
65
+ * 收集全部检查项(doctor 与 precheckEnv 共用)。
66
+ * 每项:{ name, passed, detail, fix, warning? }——fix 为不通过时的修复提示;
67
+ * warning: true 的项仅 doctor 展示提示,不参与 precheckEnv 阻断(MCP 等增强能力缺失不阻断核心引擎)。
36
68
  * @param {object} opts
37
69
  * @param {string} opts.projectRoot
38
70
  * @param {string} opts.skillDir
39
71
  * @param {string} opts.dataDir
40
- * @returns {Promise<{ ok: boolean, checks: Array<{name: string, passed: boolean, detail?: string}> }>}
72
+ * @param {string} [opts.user3libHome] - ~/.3lib(MCP 装配检查用;缺省按 ~ 推导)
73
+ * @returns {Promise<Array<{name: string, passed: boolean, detail?: string, fix?: string, warning?: boolean}>>}
41
74
  */
42
- export async function runDoctor(opts = {}) {
75
+ async function collectChecks({ projectRoot, skillDir, dataDir, user3libHome = '' }) {
43
76
  const checks = [];
44
- const { projectRoot, skillDir, dataDir } = opts;
45
77
 
46
78
  // 1. Node.js 版本
47
79
  const nodeMajor = Number(process.version.match(/^v(\d+)/)?.[1] || 0);
@@ -49,66 +81,252 @@ export async function runDoctor(opts = {}) {
49
81
  name: 'Node.js >= 22',
50
82
  passed: nodeMajor >= 22,
51
83
  detail: process.version,
84
+ fix: '请升级 Node.js 至 v22+ 后重试(https://nodejs.org)',
52
85
  });
53
86
 
54
- // 2. opencode 可执行文件
55
- const opencodeBin = which('opencode');
87
+ // 2. CLI_TYPE 配置有效性(解析回退发生在 resolveCliType,这里负责显式报告)
88
+ const rawCliType = String(process.env.CLI_TYPE ?? '').trim();
89
+ const cliType = resolveCliType();
90
+ const cliCfg = resolveCliServeConfig(cliType);
91
+ if (!rawCliType) {
92
+ checks.push({
93
+ name: 'CLI_TYPE 配置',
94
+ passed: true,
95
+ detail: '未设置(默认 deveco-code;如需 opencode 可 3rdloop config set CLI_TYPE opencode)',
96
+ });
97
+ } else if (rawCliType === cliType) {
98
+ checks.push({ name: 'CLI_TYPE 配置', passed: true, detail: rawCliType });
99
+ } else {
100
+ checks.push({
101
+ name: 'CLI_TYPE 配置',
102
+ passed: false,
103
+ detail: `"${rawCliType}" 无效,可选值: opencode | deveco-code(当前回退 ${cliType})`,
104
+ fix: '3rdloop config set CLI_TYPE opencode(可选: opencode | deveco-code),或 3rdloop config unset CLI_TYPE 恢复默认',
105
+ });
106
+ }
107
+
108
+ // 3. AI CLI 可执行文件(按 CLI_TYPE 检测对应二进制)
109
+ const cliBin = which(cliCfg.bin);
110
+ const installHint = cliType === 'deveco-code'
111
+ ? '未找到,请 npm i -g @deveco/deveco-code(首次需 deveco auth login)'
112
+ : '未找到,请 npm i -g opencode-ai';
56
113
  checks.push({
57
- name: 'opencode CLI',
58
- passed: !!opencodeBin,
59
- detail: opencodeBin || '未找到,请 npm i -g opencode-ai',
114
+ name: `${cliType} CLI`,
115
+ passed: !!cliBin,
116
+ detail: cliBin || installHint,
117
+ fix: cliType === 'deveco-code'
118
+ ? 'npm i -g @deveco/deveco-code(安装后首次使用需 deveco auth login)'
119
+ : 'npm i -g opencode-ai',
60
120
  });
61
121
 
62
- // 3. .env 配置(项目 Server/.env 或用户 ~/.3lib/.env
63
- const envPaths = [
64
- path.join(projectRoot, 'Server', '.env'),
65
- path.join(process.env.HOME || process.env.USERPROFILE || '', '.3lib', '.env'),
66
- ];
67
- const foundEnv = envPaths.find(p => fs.existsSync(p));
68
- let envOk = false;
69
- let envDetail = '';
70
- if (foundEnv) {
71
- const content = fs.readFileSync(foundEnv, 'utf8');
72
- const required = ['DASHSCOPE_API_KEY', 'LLM_BASE_URL', 'LLM_MODEL'];
73
- const missing = required.filter(k => !new RegExp(`^\\s*${k}\\s*=\\s*(.+)$`, 'm').test(content));
74
- envOk = missing.length === 0;
75
- envDetail = missing.length
76
- ? `缺少: ${missing.join(', ')} (${foundEnv})`
77
- : `配置完整 (${foundEnv})`;
78
- } else {
79
- envDetail = '未找到 .env(项目 Server/.env 或 ~/.3lib/.env)';
80
- }
81
- checks.push({ name: 'LLM 环境变量', passed: envOk, detail: envDetail });
122
+ // 4. LLM 凭据(生效环境检测:loadEnvChain 已注入 系统环境变量 > ~/.3lib/.env > 项目 Server/.env,
123
+ // 任一层配置即生效。仅强制 DASHSCOPE_API_KEY——LLM_BASE_URL/LLM_MODEL 引擎有内置默认值)
124
+ const apiKey = String(process.env.DASHSCOPE_API_KEY ?? '').trim();
125
+ checks.push({
126
+ name: 'LLM 凭据(DASHSCOPE_API_KEY)',
127
+ passed: !!apiKey,
128
+ detail: apiKey
129
+ ? '已配置(系统环境变量 / ~/.3lib/.env / 项目 Server/.env 任一层)'
130
+ : '未配置(系统环境变量 / ~/.3lib/.env / 项目 Server/.env 均未设置,LLM 调用将失败)',
131
+ fix: '3rdloop config set DASHSCOPE_API_KEY <sk-xxxxxxxx>(从 https://bailian.console.aliyun.com/ 获取)',
132
+ });
82
133
 
83
- // 4. Skill 目录可访问
134
+ // 5. Skill 目录可访问
84
135
  const skillOk = skillDir && fs.existsSync(skillDir);
85
136
  checks.push({
86
137
  name: 'SKILL 目录',
87
138
  passed: !!skillOk,
88
- detail: skillOk ? skillDir : 'SKILL 目录不存在',
139
+ detail: skillOk ? skillDir : `SKILL 目录不存在: ${skillDir}`,
140
+ fix: '3rdloop config set 3LIB_SKILL_DIR <SKILL 目录>;发布包缺 SKILL 请重装: npm i -g @ohos-cpf/3rdloop',
89
141
  });
90
142
 
91
- // 5. 数据目录可写
143
+ // 6. 数据目录可写
92
144
  let dataOk = false;
93
145
  try {
94
146
  fs.mkdirSync(dataDir, { recursive: true });
95
147
  dataOk = true;
96
148
  } catch { /* 不可写 */ }
97
- checks.push({ name: '数据目录', passed: dataOk, detail: dataDir });
149
+ checks.push({
150
+ name: '数据目录',
151
+ passed: dataOk,
152
+ detail: dataOk ? dataDir : `不可写: ${dataDir}`,
153
+ fix: '3rdloop config set 3LIB_DATA_DIR <可写目录>,或运行时加 --data-dir <p>',
154
+ });
155
+
156
+ // 7. serve 服务端口连通性(未运行不算失败:执行命令时会自动拉起;
157
+ // 端口有响应但异常则视为失败,提示清理残留进程)
158
+ const serve = await probeServe(`http://${cliCfg.host}:${cliCfg.port}`);
159
+ checks.push({
160
+ name: `${cliType} serve 服务`,
161
+ passed: serve.state !== 'error',
162
+ detail: serve.detail,
163
+ fix: `端口 ${cliCfg.port} 被异常进程占用,请清理后重试(lsof -i :${cliCfg.port} 定位 / 任务管理器结束进程)`,
164
+ });
165
+
166
+ // 8. MCP Gateway 装配(警告级:不阻断核心引擎,仅影响 kb 工具/脚本工具/知识库检索)
167
+ // AI CLI 全局配置中 mcp-gateway 已注册且指向存在的入口脚本 → 通过
168
+ const mcpCheck = await checkMcpRegistration(cliType);
169
+ checks.push({ warning: true, ...mcpCheck });
170
+
171
+ return checks;
172
+ }
173
+
174
+ /**
175
+ * 检查 MCP Gateway 是否已装配(AI CLI 全局配置注册 + 入口脚本存在)。
176
+ * 宽容实现:不 import lib/mcp.js 的完整装配(避免 doctor 依赖装配状态本身),
177
+ * 仅读配置文件判断。
178
+ */
179
+ async function checkMcpRegistration(cliType) {
180
+ const home = process.env['HOME'] || process.env['USERPROFILE'] || '';
181
+ const configRoot = process.env['XDG_CONFIG_HOME'] || path.join(home, '.config');
182
+ const files = [
183
+ path.join(configRoot, 'opencode', 'opencode.json'),
184
+ path.join(configRoot, 'deveco', 'deveco.jsonc'),
185
+ ];
186
+ const details = [];
187
+ let anyRegistered = false;
188
+ for (const file of files) {
189
+ const label = path.basename(path.dirname(file));
190
+ if (!fs.existsSync(file)) {
191
+ details.push(`${label}: 未注册`);
192
+ continue;
193
+ }
194
+ try {
195
+ const raw = fs.readFileSync(file, 'utf8');
196
+ const json = JSON.parse(_stripJsoncComments(raw));
197
+ const entry = json?.mcp?.['mcp-gateway'];
198
+ if (!entry) {
199
+ details.push(`${label}: 未注册`);
200
+ continue;
201
+ }
202
+ // 入口脚本存在性(command 数组第 2 个元素)
203
+ const entryPath = Array.isArray(entry.command) ? entry.command[1] : null;
204
+ if (entryPath && fs.existsSync(entryPath)) {
205
+ details.push(`${label}: 已注册`);
206
+ anyRegistered = true;
207
+ } else {
208
+ details.push(`${label}: 已注册但入口脚本不存在(${entryPath || '未配置'})`);
209
+ }
210
+ } catch {
211
+ details.push(`${label}: 配置解析失败`);
212
+ }
213
+ }
214
+ return {
215
+ name: 'MCP Gateway 装配',
216
+ passed: anyRegistered,
217
+ detail: details.join(';'),
218
+ fix: '3rdloop doctor(自动装配)或 3rdloop mcp install(kb 检索/脚本工具/知识库检索需要)',
219
+ };
220
+ }
221
+
222
+ /** 剥离 JSONC 注释(// 行注释与 /* 块注释)。 */
223
+ function _stripJsoncComments(raw) {
224
+ return raw
225
+ .replace(/\/\*[\s\S]*?\*\//g, '')
226
+ .replace(/(^|[^:"'\\])\/\/.*$/gm, '$1');
227
+ }
228
+
229
+ /**
230
+ * 执行环境自检(3rdloop doctor 命令实现)。
231
+ *
232
+ * 默认自动修复(fix=true):MCP Gateway 未装配时自动执行装配(等价 3rdloop mcp install,
233
+ * 幂等可重跑);--no-fix 仅诊断不修改任何文件。
234
+ *
235
+ * @param {object} opts
236
+ * @param {string} opts.projectRoot
237
+ * @param {string} opts.skillDir
238
+ * @param {string} opts.dataDir
239
+ * @param {string} [opts.user3libHome] - ~/.3lib(自动装配目标)
240
+ * @param {boolean} [opts.quiet] - 静默模式(不打印表格,仅返回结果)
241
+ * @param {boolean} [opts.fix] - 自动修复开关(默认 true)
242
+ * @returns {Promise<{ ok: boolean, checks: Array<{name: string, passed: boolean, detail?: string, fix?: string}> }>}
243
+ */
244
+ export async function runDoctor(opts = {}) {
245
+ const { fix = true } = opts;
246
+ let checks = await collectChecks(opts);
247
+
248
+ // ── 自动修复:MCP Gateway 未装配 → 自动执行装配并复查 ──
249
+ if (fix) {
250
+ const mcpIdx = checks.findIndex(c => c.name === 'MCP Gateway 装配' && !c.passed);
251
+ if (mcpIdx !== -1) {
252
+ if (!opts.quiet) {
253
+ process.stderr.write(`\n${C.yellow}检测到 MCP Gateway 未装配,正在自动装配(3rdloop mcp install)...${C.reset}\n`);
254
+ }
255
+ try {
256
+ const { mcpInstall } = await import('./mcp.js');
257
+ const code = await mcpInstall({ user3libHome: opts.user3libHome || '', rest: [], jsonMode: false });
258
+ if (code === 0) {
259
+ const recheck = await checkMcpRegistration();
260
+ checks[mcpIdx] = { warning: true, ...recheck };
261
+ } else {
262
+ checks[mcpIdx].detail += ';自动装配失败,请手动执行 3rdloop mcp install 查看报错';
263
+ }
264
+ } catch (err) {
265
+ checks[mcpIdx].detail += `;自动装配异常: ${err.message}`;
266
+ }
267
+ }
268
+ }
98
269
 
99
- // 汇总
100
- const ok = checks.every(c => c.passed);
270
+ // 汇总:warning 项不参与通过判定(提示性)
271
+ const ok = checks.every(c => c.passed || c.warning);
101
272
 
102
- // 打印
273
+ // 打印(失败项附加修复提示;警告项用 ⚠ 标记)
103
274
  if (!opts.quiet) {
104
- process.stderr.write(`\n${C.bold}3rdloop doctor 环境自检${C.reset}\n`);
275
+ process.stderr.write(`\n${C.bold}3rdloop doctor 环境自检${C.reset}${C.gray}(AI CLI: ${resolveCliType()})${C.reset}\n`);
105
276
  for (const c of checks) {
106
- const icon = c.passed ? `${C.green}✓${C.reset}` : `${C.red}✗${C.reset}`;
277
+ const icon = c.passed
278
+ ? `${C.green}✓${C.reset}`
279
+ : (c.warning ? `${C.yellow}⚠${C.reset}` : `${C.red}✗${C.reset}`);
107
280
  process.stderr.write(` ${icon} ${c.name}`);
108
281
  if (c.detail) process.stderr.write(` ${C.gray}${c.detail}${C.reset}`);
109
282
  process.stderr.write('\n');
283
+ if (!c.passed && c.fix) {
284
+ process.stderr.write(` ${C.cyan}修复: ${c.fix}${C.reset}\n`);
285
+ }
110
286
  }
111
287
  }
112
288
 
113
289
  return { ok, checks };
114
- }
290
+ }
291
+
292
+ /**
293
+ * 引擎前置预检(run/submit/step run/orch run|start/工作流正式执行前调用)。
294
+ *
295
+ * 与 doctor 同一检查集,语义差异:
296
+ * - serve 未运行不算失败(执行命令时会自动拉起;端口异常仍算失败)
297
+ * - 轻量:仅文件/PATH/端口探测,不拉起任何进程、不触引擎、**不改任何文件**
298
+ * (MCP 装配等修复动作只在 3rdloop doctor 中执行,任务命令保持无副作用)
299
+ * - MCP 未装配为警告级:不阻断,仅 stderr 提示一行
300
+ *
301
+ * @param {object} opts - { projectRoot, skillDir, dataDir }(与 runDoctor 相同)
302
+ * @returns {Promise<{ ok: boolean, failures: Array<{name: string, detail?: string, fix?: string}> }>}
303
+ */
304
+ export async function precheckEnv(opts = {}) {
305
+ const checks = await collectChecks(opts);
306
+ const failures = checks
307
+ .filter(c => !c.passed && !c.warning)
308
+ .map(({ name, detail, fix }) => ({ name, detail, fix }));
309
+
310
+ // 警告级提示(不阻断):MCP 未装配时提醒一次
311
+ const mcpWarn = checks.find(c => c.name === 'MCP Gateway 装配' && !c.passed);
312
+ if (mcpWarn) {
313
+ process.stderr.write(`提示: MCP Gateway 未装配(kb 检索/脚本工具不可用),运行 ${C.cyan}3rdloop doctor${C.reset} 可自动装配\n`);
314
+ }
315
+
316
+ return { ok: failures.length === 0, failures };
317
+ }
318
+
319
+ /**
320
+ * 预检失败信息打印(stderr,供 cli/workflow/step/orch 共用;--json 模式下调用方自行 out())。
321
+ * @param {Array<{name: string, detail?: string, fix?: string}>} failures
322
+ */
323
+ export function reportPrecheckFailures(failures) {
324
+ process.stderr.write(`\n环境预检未通过(${failures.length} 项),已阻止任务执行:\n`);
325
+ for (const f of failures) {
326
+ process.stderr.write(` ${C.red}✗${C.reset} ${f.name}${f.detail ? ` ${C.gray}${f.detail}${C.reset}` : ''}\n`);
327
+ if (f.fix) {
328
+ process.stderr.write(` ${C.cyan}修复: ${f.fix}${C.reset}\n`);
329
+ }
330
+ }
331
+ process.stderr.write('完整环境自检: 3rdloop doctor\n');
332
+ }