@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
@@ -0,0 +1,451 @@
1
+ /**
2
+ * MCPGateway —— Gateway 核心类
3
+ *
4
+ * 职责:
5
+ * 1. 连接所有下游 MCP Server,拉取并聚合工具列表(加前缀)。
6
+ * 2. 扫描脚本目录,解析 @tool 注释注册为工具。
7
+ * 3. 注册所有工具到 MCP Server(统一暴露给 AI)。
8
+ * 4. 统一调度工具调用:下游工具转发,脚本工具本地执行。
9
+ * 5. 注册内置管理工具(gateway_list_tools / gateway_health 等)。
10
+ * 6. 启动 stdio Server,等待 AI 客户端连接。
11
+ *
12
+ * 设计原则:
13
+ * - 高内聚:Gateway 是工具聚合与调度的核心,协调各子模块但不越权。
14
+ * - 低耦合:依赖注入 MCPClientPool / ScriptRegistry / ScriptExecutor / ToolRegistry,
15
+ * 各子模块独立可测试,Gateway 只做编排。
16
+ * - 错误隔离:单个下游 Server / 脚本崩溃不影响其他工具。
17
+ *
18
+ * 架构:
19
+ * ┌─────────────────────────────────────────────────┐
20
+ * │ MCPGateway (编排核心) │
21
+ * │ ┌──────────────┐ ┌───────────────┐ │
22
+ * │ │ ToolRegistry │ │ MCPClientPool │ │
23
+ * │ │ (工具注册表) │ │ (下游连接池) │ │
24
+ * │ └──────────────┘ └───────────────┘ │
25
+ * │ ┌──────────────┐ ┌───────────────┐ │
26
+ * │ │ScriptRegistry │ │ScriptExecutor │ │
27
+ * │ │ (脚本发现) │ │ (脚本执行) │ │
28
+ * │ └──────────────┘ └───────────────┘ │
29
+ * │ ┌──────────────────────────────────┐ │
30
+ * │ │ McpServer (MCP SDK, stdio) │ │
31
+ * │ └──────────────────────────────────┘ │
32
+ * └─────────────────────────────────────────────────┘
33
+ */
34
+
35
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
36
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
37
+ import {
38
+ ListToolsRequestSchema,
39
+ CallToolRequestSchema
40
+ } from '@modelcontextprotocol/sdk/types.js';
41
+ import MCPClientPool from '../client/MCPClientPool.js';
42
+ import ScriptRegistry from '../registry/ScriptRegistry.js';
43
+ import ScriptExecutor from '../executor/ScriptExecutor.js';
44
+ import ToolRegistry from '../registry/ToolRegistry.js';
45
+ import KBToolProvider from '../library/KBToolProvider.js';
46
+ import { createLogger } from '../library/logger.js';
47
+
48
+ const log = createLogger('Gateway');
49
+
50
+ /** 内置工具前缀 */
51
+ const BUILTIN_PREFIX = 'gateway_';
52
+
53
+ class MCPGateway {
54
+ /**
55
+ * @param {import('../types.js').GatewayConfig} config
56
+ */
57
+ constructor(config) {
58
+ this._config = config;
59
+
60
+ // MCP Server(底层 Server 类,支持直接 setRequestHandler + 原始 JSON Schema)
61
+ // McpServer.registerTool 要求 Zod schema,不适合转发下游原始 JSON Schema,
62
+ // 因此使用底层 Server + 手动注册 ListTools/CallTool handler。
63
+ this._server = new Server(
64
+ { name: config.gateway.name, version: config.gateway.version },
65
+ { capabilities: { tools: { listChanged: true } } }
66
+ );
67
+
68
+ // 子模块实例(高内聚低耦合,各司其职)
69
+ this._clientPool = new MCPClientPool();
70
+ this._scriptRegistry = new ScriptRegistry(
71
+ config.scriptsDir,
72
+ config.scripts.allowedExtensions
73
+ );
74
+ this._scriptExecutor = new ScriptExecutor(config.scripts.timeout);
75
+ this._toolRegistry = new ToolRegistry();
76
+
77
+ // 知识库工具提供者(可选,配置未启用时为 null)
78
+ this._kbProvider = config.knowledgeBase && config.knowledgeBase.enabled
79
+ ? new KBToolProvider(config.knowledgeBase)
80
+ : null;
81
+ }
82
+
83
+ // ─── 生命周期 ──────────────────────────────────────────────────────────────
84
+
85
+ /**
86
+ * 启动 Gateway:
87
+ * 1. 连接下游 MCP Server 并聚合工具
88
+ * 2. 扫描脚本目录并注册脚本工具
89
+ * 3. 启动脚本热加载(如启用)
90
+ * 4. 注册所有工具到 MCP Server
91
+ * 5. 启动 stdio Server
92
+ * @returns {Promise<void>}
93
+ */
94
+ async start() {
95
+ log.info('Gateway 启动中...');
96
+
97
+ // Step 1: 连接下游 Server 并聚合工具
98
+ await this._connectDownstreamServers();
99
+
100
+ // Step 2: 扫描脚本并注册
101
+ if (this._config.scripts.enabled) {
102
+ await this._loadScripts();
103
+ }
104
+
105
+ // Step 2.5: 注册知识库工具(惰性初始化,注册时不启动引擎)
106
+ if (this._kbProvider) {
107
+ this._loadKnowledgeBaseTools();
108
+ }
109
+
110
+ // Step 3: 注册所有工具到 MCP Server
111
+ this._registerAllTools();
112
+
113
+ // Step 4: 启动 stdio Server
114
+ const transport = new StdioServerTransport();
115
+ await this._server.connect(transport);
116
+
117
+ log.info('Gateway 已启动 (stdio)', {
118
+ tools: this._toolRegistry.size(),
119
+ downstream: this._clientPool.getConnectedNames(),
120
+ scripts: this._scriptRegistry.size(),
121
+ knowledgeBase: this._kbProvider ? 'enabled' : 'disabled'
122
+ });
123
+ }
124
+
125
+ /**
126
+ * 关闭 Gateway:停止监听、断开下游、关闭 Server。
127
+ * @returns {Promise<void>}
128
+ */
129
+ async shutdown() {
130
+ log.info('Gateway 关闭中...');
131
+ await this._scriptRegistry.stopWatch();
132
+ if (this._kbProvider) {
133
+ await this._kbProvider.shutdown();
134
+ }
135
+ await this._clientPool.disconnectAll();
136
+ try {
137
+ await this._server.close();
138
+ } catch (err) {
139
+ log.warn('关闭 MCP Server 时出错', { error: err.message });
140
+ }
141
+ log.info('Gateway 已关闭');
142
+ }
143
+
144
+ // ─── 下游 Server 聚合 ───────────────────────────────────────────────────────
145
+
146
+ /**
147
+ * 连接所有配置的下游 MCP Server,拉取工具列表并聚合到注册表。
148
+ * 单个 Server 连接失败不影响其他。
149
+ * @private
150
+ */
151
+ async _connectDownstreamServers() {
152
+ const entries = Object.entries(this._config.downstreamServers);
153
+
154
+ // 并行连接所有下游 Server
155
+ await Promise.allSettled(
156
+ entries.map(async ([name, cfg]) => {
157
+ if (cfg.enabled === false) {
158
+ log.info(`下游 Server "${name}" 已禁用,跳过`);
159
+ return;
160
+ }
161
+ try {
162
+ await this._clientPool.connect(name, cfg);
163
+ const tools = await this._clientPool.listTools(name);
164
+ this._aggregateDownstreamTools(name, tools);
165
+ } catch (err) {
166
+ log.error(`聚合下游 Server "${name}" 工具失败`, { error: err.message });
167
+ }
168
+ })
169
+ );
170
+ }
171
+
172
+ /**
173
+ * 将下游 Server 的工具列表聚合到 ToolRegistry(加前缀)。
174
+ * @param {string} serverName
175
+ * @param {Array<{ name: string, description: string, inputSchema: Object }>} tools
176
+ * @private
177
+ */
178
+ _aggregateDownstreamTools(serverName, tools) {
179
+ for (const tool of tools) {
180
+ const aggregatedName = `${serverName}_${tool.name}`;
181
+ this._toolRegistry.register({
182
+ name: aggregatedName,
183
+ source: 'downstream',
184
+ sourceServer: serverName,
185
+ originalName: tool.name,
186
+ description: `[via ${serverName}] ${tool.description || ''}`,
187
+ inputSchema: tool.inputSchema || { type: 'object', properties: {} }
188
+ });
189
+ }
190
+ log.info(`聚合下游工具: ${serverName}`, { count: tools.length });
191
+ }
192
+
193
+ // ─── 脚本加载 ──────────────────────────────────────────────────────────────
194
+
195
+ /**
196
+ * 扫描脚本目录,注册脚本工具,并启动热加载(如启用)。
197
+ * @private
198
+ */
199
+ async _loadScripts() {
200
+ const metas = await this._scriptRegistry.scanAll();
201
+
202
+ for (const meta of metas) {
203
+ this._toolRegistry.register({
204
+ name: meta.toolName,
205
+ source: 'script',
206
+ description: meta.description,
207
+ inputSchema: _buildScriptInputSchema(meta)
208
+ });
209
+ }
210
+
211
+ if (this._config.scripts.hotReload) {
212
+ this._scriptRegistry.startWatch((meta, action) => {
213
+ if (action === 'add') {
214
+ this._toolRegistry.register({
215
+ name: meta.toolName,
216
+ source: 'script',
217
+ description: meta.description,
218
+ inputSchema: _buildScriptInputSchema(meta)
219
+ });
220
+ } else {
221
+ this._toolRegistry.unregister(meta.toolName);
222
+ }
223
+ this._server.sendToolListChanged();
224
+ });
225
+ }
226
+ }
227
+
228
+ // ─── 知识库工具 ─────────────────────────────────────────────────────────────
229
+
230
+ /**
231
+ * 注册知识库工具到 ToolRegistry。
232
+ * 引擎采用惰性初始化——注册时仅注册工具定义,
233
+ * 首次调用工具时才真正启动 DocSearchEngine。
234
+ * @private
235
+ */
236
+ _loadKnowledgeBaseTools() {
237
+ const tools = this._kbProvider.getTools();
238
+ for (const tool of tools) {
239
+ this._toolRegistry.register(tool);
240
+ }
241
+ log.info(`知识库工具已注册`, { count: tools.length });
242
+ }
243
+
244
+ // ─── 工具注册 ──────────────────────────────────────────────────────────────
245
+
246
+ /**
247
+ * 注册内置管理工具到 ToolRegistry,
248
+ * 并在底层 Server 上注册 tools/list 和 tools/call 请求处理器。
249
+ *
250
+ * 使用底层 Server.setRequestHandler 而非 McpServer.registerTool,
251
+ * 因为后者要求 Zod schema,而下游工具返回的是原始 JSON Schema。
252
+ * @private
253
+ */
254
+ _registerAllTools() {
255
+ // 先注册内置管理工具到 ToolRegistry
256
+ this._registerBuiltinTools();
257
+
258
+ // 注册 tools/list handler — 返回 ToolRegistry 中所有工具
259
+ this._server.setRequestHandler(ListToolsRequestSchema, async () => {
260
+ const tools = this._toolRegistry.getAll().map(t => ({
261
+ name: t.name,
262
+ description: t.description,
263
+ inputSchema: t.inputSchema
264
+ }));
265
+ return { tools };
266
+ });
267
+
268
+ // 注册 tools/call handler — 统一路由到 _handleToolCall
269
+ this._server.setRequestHandler(CallToolRequestSchema, async (request) => {
270
+ const { name, arguments: args } = request.params;
271
+ return this._handleToolCall(name, args || {});
272
+ });
273
+ }
274
+
275
+ /**
276
+ * 统一工具调用处理器。
277
+ * @param {string} toolName
278
+ * @param {Object} args
279
+ * @returns {Promise<Object>} MCP CallToolResult
280
+ * @private
281
+ */
282
+ async _handleToolCall(toolName, args) {
283
+ const tool = this._toolRegistry.get(toolName);
284
+ if (!tool) {
285
+ return _textResult(`未知工具: ${toolName}`);
286
+ }
287
+
288
+ try {
289
+ // 内置管理工具:调用存储的 handler
290
+ if (tool.source === 'builtin' && tool._handler) {
291
+ return await tool._handler(args);
292
+ }
293
+
294
+ if (tool.source === 'downstream') {
295
+ // 转发到下游 MCP Server
296
+ const result = await this._clientPool.callTool(
297
+ tool.sourceServer,
298
+ tool.originalName,
299
+ args
300
+ );
301
+ return result;
302
+ }
303
+
304
+ if (tool.source === 'script') {
305
+ // 本地执行脚本
306
+ const meta = this._scriptRegistry.get(toolName);
307
+ if (!meta) {
308
+ return _textResult(`脚本未找到: ${toolName}`);
309
+ }
310
+ const output = await this._scriptExecutor.execute(
311
+ meta.filePath,
312
+ meta.extension,
313
+ args
314
+ );
315
+ return _textResult(output);
316
+ }
317
+
318
+ return _textResult(`工具类型不支持: ${tool.source}`);
319
+ } catch (err) {
320
+ log.error(`工具调用失败: ${toolName}`, { error: err.message });
321
+ return _textResult(`Error: ${err.message}`);
322
+ }
323
+ }
324
+
325
+ /**
326
+ * 注册内置管理工具到 ToolRegistry(不直接注册到 MCP Server,
327
+ * 由统一的 tools/list handler 从 ToolRegistry 返回)。
328
+ * @private
329
+ */
330
+ _registerBuiltinTools() {
331
+ // gateway_list_tools — 列出所有聚合工具及其来源
332
+ this._registerBuiltin('list_tools', '列出 Gateway 聚合的所有工具及其来源', async () => {
333
+ const tools = this._toolRegistry.getAll().map(t => ({
334
+ name: t.name,
335
+ source: t.source,
336
+ sourceServer: t.sourceServer,
337
+ description: t.description
338
+ }));
339
+ return _textResult(JSON.stringify(tools, null, 2));
340
+ });
341
+
342
+ // gateway_list_servers — 列出下游 Server 连接状态
343
+ this._registerBuiltin('list_servers', '列出下游 MCP Server 连接状态', async () => {
344
+ const statuses = this._clientPool.getStatuses();
345
+ return _textResult(JSON.stringify(statuses, null, 2));
346
+ });
347
+
348
+ // gateway_reload_scripts — 重新扫描脚本目录
349
+ this._registerBuiltin('reload_scripts', '重新扫描脚本目录,更新工具列表', async () => {
350
+ const before = this._scriptRegistry.size();
351
+ await this._scriptRegistry.stopWatch();
352
+ this._toolRegistry.filterBySource('script').forEach(t => {
353
+ this._toolRegistry.unregister(t.name);
354
+ });
355
+ const metas = await this._scriptRegistry.scanAll();
356
+ for (const meta of metas) {
357
+ this._toolRegistry.register({
358
+ name: meta.toolName,
359
+ source: 'script',
360
+ description: meta.description,
361
+ inputSchema: _buildScriptInputSchema(meta)
362
+ });
363
+ }
364
+ if (this._config.scripts.hotReload) {
365
+ this._scriptRegistry.startWatch((meta, action) => {
366
+ if (action === 'add') {
367
+ this._toolRegistry.register({
368
+ name: meta.toolName,
369
+ source: 'script',
370
+ description: meta.description,
371
+ inputSchema: _buildScriptInputSchema(meta)
372
+ });
373
+ } else {
374
+ this._toolRegistry.unregister(meta.toolName);
375
+ }
376
+ this._server.sendToolListChanged();
377
+ });
378
+ }
379
+ const after = this._scriptRegistry.size();
380
+ this._server.sendToolListChanged();
381
+ return _textResult(`脚本重载完成: ${before} → ${after}`);
382
+ });
383
+
384
+ // gateway_health — 健康检查
385
+ this._registerBuiltin('health', 'Gateway 健康检查', async () => {
386
+ const health = {
387
+ downstream: this._clientPool.getStatuses(),
388
+ scripts: this._scriptRegistry.size(),
389
+ totalTools: this._toolRegistry.size(),
390
+ uptime: Math.round(process.uptime()),
391
+ timestamp: new Date().toISOString()
392
+ };
393
+ return _textResult(JSON.stringify(health, null, 2));
394
+ });
395
+ }
396
+
397
+ /**
398
+ * 注册一个内置管理工具到 ToolRegistry。
399
+ * @param {string} action - 操作名(不含前缀)
400
+ * @param {string} desc - 工具描述
401
+ * @param {() => Promise<Object>} handler
402
+ * @private
403
+ */
404
+ _registerBuiltin(action, desc, handler) {
405
+ const name = `${BUILTIN_PREFIX}${action}`;
406
+ this._toolRegistry.register({
407
+ name,
408
+ source: 'builtin',
409
+ description: desc,
410
+ inputSchema: { type: 'object', properties: {} },
411
+ _handler: handler // 存储 handler 供 _handleToolCall 调用
412
+ });
413
+ }
414
+ }
415
+
416
+ // ─── 内部工具函数 ──────────────────────────────────────────────────────────────
417
+
418
+ /**
419
+ * 构建脚本的 JSON Schema inputSchema。
420
+ * @param {import('../types.js').ScriptMeta} meta
421
+ * @returns {Object}
422
+ * @private
423
+ */
424
+ function _buildScriptInputSchema(meta) {
425
+ const properties = {};
426
+ for (const param of meta.params) {
427
+ properties[param.name] = {
428
+ type: param.type,
429
+ description: param.description
430
+ };
431
+ }
432
+ return {
433
+ type: 'object',
434
+ properties,
435
+ required: meta.params.filter(p => p.required).map(p => p.name)
436
+ };
437
+ }
438
+
439
+ /**
440
+ * 构造文本类型的 CallToolResult。
441
+ * @param {string} text
442
+ * @returns {Object}
443
+ * @private
444
+ */
445
+ function _textResult(text) {
446
+ return {
447
+ content: [{ type: 'text', text }]
448
+ };
449
+ }
450
+
451
+ export default MCPGateway;
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * MCP Gateway Server —— 入口
5
+ *
6
+ * 启动流程:
7
+ * 1. 加载配置文件(默认 ./config.json,或通过 --config 指定)
8
+ * 2. 创建 MCPGateway 实例
9
+ * 3. 注册优雅退出(SIGINT / SIGTERM)
10
+ * 4. 启动 Gateway(连接下游 + 加载脚本 + 启动 stdio Server)
11
+ *
12
+ * 用法:
13
+ * node src/index.js # 使用默认 config.json
14
+ * node src/index.js --config /path # 指定配置文件
15
+ * node src/index.js /path/to/config.json # 位置参数(兼容)
16
+ *
17
+ * AI 客户端配置(Claude Desktop / VS Code / Copilot):
18
+ * command: node
19
+ * args: ["/path/to/MCP/src/index.js", "--config", "/path/to/config.json"]
20
+ */
21
+
22
+ import { resolve } from 'node:path';
23
+ import { loadConfig } from './config/ConfigLoader.js';
24
+ import MCPGateway from './gateway/Gateway.js';
25
+ import { createLogger } from './library/logger.js';
26
+
27
+ const log = createLogger('Main');
28
+
29
+ /**
30
+ * 从命令行参数解析配置文件路径。
31
+ * 支持 --config <path> 和位置参数两种形式。
32
+ * @returns {string}
33
+ */
34
+ function _resolveConfigPath() {
35
+ const args = process.argv.slice(2);
36
+
37
+ // --config <path>
38
+ const configFlagIdx = args.indexOf('--config');
39
+ if (configFlagIdx !== -1 && args[configFlagIdx + 1]) {
40
+ return resolve(args[configFlagIdx + 1]);
41
+ }
42
+
43
+ // 位置参数(第一个非 -- 的参数)
44
+ const positional = args.find(a => !a.startsWith('--'));
45
+ if (positional) {
46
+ return resolve(positional);
47
+ }
48
+
49
+ // 默认:当前目录下的 config.json
50
+ return resolve('config.json');
51
+ }
52
+
53
+ /**
54
+ * 主函数:加载配置、创建并启动 Gateway。
55
+ */
56
+ async function main() {
57
+ const configPath = _resolveConfigPath();
58
+ log.info('配置文件路径', { path: configPath });
59
+
60
+ const config = loadConfig(configPath);
61
+ const gateway = new MCPGateway(config);
62
+
63
+ // 优雅退出
64
+ let shuttingDown = false;
65
+ async function shutdown(signal) {
66
+ if (shuttingDown) return;
67
+ shuttingDown = true;
68
+ log.info(`收到 ${signal} 信号,开始优雅退出...`);
69
+ try {
70
+ await gateway.shutdown();
71
+ } catch (err) {
72
+ log.error('退出过程中出错', { error: err.message });
73
+ }
74
+ process.exit(0);
75
+ }
76
+
77
+ process.on('SIGINT', () => shutdown('SIGINT'));
78
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
79
+
80
+ await gateway.start();
81
+ log.info(`[${config.gateway.name}] Gateway 已就绪,等待 AI 客户端连接 (stdio)`);
82
+ }
83
+
84
+ main().catch((err) => {
85
+ log.error('启动失败', { error: err.message, stack: err.stack });
86
+ process.exit(1);
87
+ });