dsh-crwu-workbench 0.0.10

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 (479) hide show
  1. package/CHANGELOG.md +1516 -0
  2. package/LICENSE +26 -0
  3. package/README.en.md +204 -0
  4. package/README.md +521 -0
  5. package/SECURITY.md +39 -0
  6. package/bin/darwin-arm64/crwu +0 -0
  7. package/bin/darwin-arm64/dws +0 -0
  8. package/bin/darwin-arm64/ossutil +0 -0
  9. package/bin/manifest.json +82 -0
  10. package/bin/win32-x64/crwu.exe +0 -0
  11. package/bin/win32-x64/dws.exe +4 -0
  12. package/bin/win32-x64/ossutil.exe +0 -0
  13. package/common/skills/.synced.json +8 -0
  14. package/common/skills/crwu-dws/SKILL.md +208 -0
  15. package/common/skills/crwu-dws/references/00-/347/233/256/345/275/225/345/277/253/347/205/247schema.md +113 -0
  16. package/common/skills/crwu-dws/references/01-/345/256/241/346/240/270/344/270/213/350/275/275/344/270/216manifest/350/247/204/350/214/203.md +115 -0
  17. package/common/skills/crwu-dws/references/02-/347/274/223/345/255/230/344/270/216/345/205/234/345/272/225/346/237/245/346/211/276/350/247/204/350/214/203.md +119 -0
  18. package/common/skills/crwu-dws/scripts/test_dws_source_contract.py +493 -0
  19. package/common/skills/crwu-h3yun-login/SKILL.md +130 -0
  20. package/common/skills/crwu-h3yun-query/SKILL.md +192 -0
  21. package/config/crwu-workbench.yml +26 -0
  22. package/cordis.patch.yml +46 -0
  23. package/lib/client.js +10346 -0
  24. package/lib/index.js +11584 -0
  25. package/package.json +119 -0
  26. package/scripts/prepare.mjs +59 -0
  27. package/skills/README.md +26 -0
  28. package/skills/crwu/crwu-audit/SKILL.md +152 -0
  29. package/skills/crwu/crwu-audit/references/00-input-and-route-profile.md +232 -0
  30. package/skills/crwu/crwu-audit/references/01-report-id-resolution.md +13 -0
  31. package/skills/crwu/crwu-audit/references/02-scope-classification.md +25 -0
  32. package/skills/crwu/crwu-audit/references/03-asset-classification.md +27 -0
  33. package/skills/crwu/crwu-audit/references/04-business-classification.md +63 -0
  34. package/skills/crwu/crwu-audit/references/05-method-classification.md +66 -0
  35. package/skills/crwu/crwu-audit/references/06-overlay-classification.md +42 -0
  36. package/skills/crwu/crwu-audit/references/07-skill-registry.md +57 -0
  37. package/skills/crwu/crwu-audit/references/08-union-dispatch-rules.md +142 -0
  38. package/skills/crwu/crwu-audit/references/09-review-risk-classification.md +85 -0
  39. package/skills/crwu/crwu-audit/references/10-capability-gap-proposal.md +68 -0
  40. package/skills/crwu/crwu-audit/references/11-html-delivery-spec.md +881 -0
  41. package/skills/crwu/crwu-audit/references/12-leaf-common-contract.md +202 -0
  42. package/skills/crwu/crwu-audit/references/13-dingtalk-result-publish.md +88 -0
  43. package/skills/crwu/crwu-audit/references/14-orchestration-workflow.md +52 -0
  44. package/skills/crwu/crwu-audit/references/99-maintenance.md +62 -0
  45. package/skills/crwu/crwu-audit/scripts/README.md +157 -0
  46. package/skills/crwu/crwu-audit/scripts/audit_delivery.py +2736 -0
  47. package/skills/crwu/crwu-audit/scripts/audit_result.schema.json +1659 -0
  48. package/skills/crwu/crwu-audit/scripts/examples/audit-result.sample.json +739 -0
  49. package/skills/crwu/crwu-audit/scripts/fetch_review_records.py +85 -0
  50. package/skills/crwu/crwu-audit/scripts/media_extract.py +513 -0
  51. package/skills/crwu/crwu-audit/scripts/prepare_materials.py +1252 -0
  52. package/skills/crwu/crwu-audit/scripts/test_audit_delivery.py +1678 -0
  53. package/skills/crwu/crwu-audit/scripts/test_audit_multiaxis_router.py +1339 -0
  54. package/skills/crwu/crwu-audit/scripts/test_fetch_review_records.py +77 -0
  55. package/skills/crwu/crwu-audit/scripts/test_media_extract.py +332 -0
  56. package/skills/crwu/crwu-audit/scripts/test_prepare_materials.py +1081 -0
  57. package/skills/crwu/crwu-audit/template/audit-report.html +435 -0
  58. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/SKILL.md +38 -0
  59. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/00-applicability.md +28 -0
  60. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/01-kb-assembly.md +31 -0
  61. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/02-review-focus.md +21 -0
  62. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/03-common-contract.md +202 -0
  63. package/skills/crwu/crwu-audit-asset-debt/SKILL.md +38 -0
  64. package/skills/crwu/crwu-audit-asset-debt/references/00-applicability.md +40 -0
  65. package/skills/crwu/crwu-audit-asset-debt/references/01-kb-assembly.md +41 -0
  66. package/skills/crwu/crwu-audit-asset-debt/references/02-review-focus.md +54 -0
  67. package/skills/crwu/crwu-audit-asset-debt/references/03-common-contract.md +202 -0
  68. package/skills/crwu/crwu-audit-asset-enterprise-value/SKILL.md +38 -0
  69. package/skills/crwu/crwu-audit-asset-enterprise-value/references/00-applicability.md +31 -0
  70. package/skills/crwu/crwu-audit-asset-enterprise-value/references/01-kb-assembly.md +35 -0
  71. package/skills/crwu/crwu-audit-asset-enterprise-value/references/02-review-focus.md +33 -0
  72. package/skills/crwu/crwu-audit-asset-enterprise-value/references/03-common-contract.md +202 -0
  73. package/skills/crwu/crwu-audit-asset-equipment/SKILL.md +38 -0
  74. package/skills/crwu/crwu-audit-asset-equipment/references/00-applicability.md +40 -0
  75. package/skills/crwu/crwu-audit-asset-equipment/references/01-kb-assembly.md +39 -0
  76. package/skills/crwu/crwu-audit-asset-equipment/references/02-review-focus.md +52 -0
  77. package/skills/crwu/crwu-audit-asset-equipment/references/03-common-contract.md +202 -0
  78. package/skills/crwu/crwu-audit-asset-intangible/SKILL.md +38 -0
  79. package/skills/crwu/crwu-audit-asset-intangible/references/00-applicability.md +36 -0
  80. package/skills/crwu/crwu-audit-asset-intangible/references/01-kb-assembly.md +40 -0
  81. package/skills/crwu/crwu-audit-asset-intangible/references/02-review-focus.md +68 -0
  82. package/skills/crwu/crwu-audit-asset-intangible/references/03-common-contract.md +202 -0
  83. package/skills/crwu/crwu-audit-asset-inventory/SKILL.md +38 -0
  84. package/skills/crwu/crwu-audit-asset-inventory/references/00-applicability.md +28 -0
  85. package/skills/crwu/crwu-audit-asset-inventory/references/01-kb-assembly.md +31 -0
  86. package/skills/crwu/crwu-audit-asset-inventory/references/02-review-focus.md +21 -0
  87. package/skills/crwu/crwu-audit-asset-inventory/references/03-common-contract.md +202 -0
  88. package/skills/crwu/crwu-audit-asset-mining-right/SKILL.md +38 -0
  89. package/skills/crwu/crwu-audit-asset-mining-right/references/00-applicability.md +31 -0
  90. package/skills/crwu/crwu-audit-asset-mining-right/references/01-kb-assembly.md +35 -0
  91. package/skills/crwu/crwu-audit-asset-mining-right/references/02-review-focus.md +33 -0
  92. package/skills/crwu/crwu-audit-asset-mining-right/references/03-common-contract.md +202 -0
  93. package/skills/crwu/crwu-audit-asset-other/SKILL.md +38 -0
  94. package/skills/crwu/crwu-audit-asset-other/references/00-applicability.md +28 -0
  95. package/skills/crwu/crwu-audit-asset-other/references/01-kb-assembly.md +31 -0
  96. package/skills/crwu/crwu-audit-asset-other/references/02-review-focus.md +21 -0
  97. package/skills/crwu/crwu-audit-asset-other/references/03-common-contract.md +202 -0
  98. package/skills/crwu/crwu-audit-asset-portfolio/SKILL.md +38 -0
  99. package/skills/crwu/crwu-audit-asset-portfolio/references/00-applicability.md +28 -0
  100. package/skills/crwu/crwu-audit-asset-portfolio/references/01-kb-assembly.md +31 -0
  101. package/skills/crwu/crwu-audit-asset-portfolio/references/02-review-focus.md +21 -0
  102. package/skills/crwu/crwu-audit-asset-portfolio/references/03-common-contract.md +202 -0
  103. package/skills/crwu/crwu-audit-asset-realestate/SKILL.md +38 -0
  104. package/skills/crwu/crwu-audit-asset-realestate/references/00-applicability.md +43 -0
  105. package/skills/crwu/crwu-audit-asset-realestate/references/01-kb-assembly.md +75 -0
  106. package/skills/crwu/crwu-audit-asset-realestate/references/02-review-focus.md +93 -0
  107. package/skills/crwu/crwu-audit-asset-realestate/references/03-common-contract.md +202 -0
  108. package/skills/crwu/crwu-audit-asset-scrap-materials/SKILL.md +38 -0
  109. package/skills/crwu/crwu-audit-asset-scrap-materials/references/00-applicability.md +28 -0
  110. package/skills/crwu/crwu-audit-asset-scrap-materials/references/01-kb-assembly.md +31 -0
  111. package/skills/crwu/crwu-audit-asset-scrap-materials/references/02-review-focus.md +21 -0
  112. package/skills/crwu/crwu-audit-asset-scrap-materials/references/03-common-contract.md +202 -0
  113. package/skills/crwu/crwu-audit-asset-transport-equipment/SKILL.md +38 -0
  114. package/skills/crwu/crwu-audit-asset-transport-equipment/references/00-applicability.md +31 -0
  115. package/skills/crwu/crwu-audit-asset-transport-equipment/references/01-kb-assembly.md +35 -0
  116. package/skills/crwu/crwu-audit-asset-transport-equipment/references/02-review-focus.md +33 -0
  117. package/skills/crwu/crwu-audit-asset-transport-equipment/references/03-common-contract.md +202 -0
  118. package/skills/crwu/crwu-audit-biz-asset-operation/SKILL.md +38 -0
  119. package/skills/crwu/crwu-audit-biz-asset-operation/references/00-applicability.md +30 -0
  120. package/skills/crwu/crwu-audit-biz-asset-operation/references/01-kb-assembly.md +32 -0
  121. package/skills/crwu/crwu-audit-biz-asset-operation/references/02-review-focus.md +42 -0
  122. package/skills/crwu/crwu-audit-biz-asset-operation/references/03-common-contract.md +202 -0
  123. package/skills/crwu/crwu-audit-biz-consulting-review/SKILL.md +38 -0
  124. package/skills/crwu/crwu-audit-biz-consulting-review/references/00-applicability.md +30 -0
  125. package/skills/crwu/crwu-audit-biz-consulting-review/references/01-kb-assembly.md +32 -0
  126. package/skills/crwu/crwu-audit-biz-consulting-review/references/02-review-focus.md +40 -0
  127. package/skills/crwu/crwu-audit-biz-consulting-review/references/03-common-contract.md +202 -0
  128. package/skills/crwu/crwu-audit-biz-financial-reporting/SKILL.md +38 -0
  129. package/skills/crwu/crwu-audit-biz-financial-reporting/references/00-applicability.md +41 -0
  130. package/skills/crwu/crwu-audit-biz-financial-reporting/references/01-kb-assembly.md +40 -0
  131. package/skills/crwu/crwu-audit-biz-financial-reporting/references/02-review-focus.md +64 -0
  132. package/skills/crwu/crwu-audit-biz-financial-reporting/references/03-common-contract.md +202 -0
  133. package/skills/crwu/crwu-audit-biz-financing-debt/SKILL.md +38 -0
  134. package/skills/crwu/crwu-audit-biz-financing-debt/references/00-applicability.md +31 -0
  135. package/skills/crwu/crwu-audit-biz-financing-debt/references/01-kb-assembly.md +34 -0
  136. package/skills/crwu/crwu-audit-biz-financing-debt/references/02-review-focus.md +47 -0
  137. package/skills/crwu/crwu-audit-biz-financing-debt/references/03-common-contract.md +202 -0
  138. package/skills/crwu/crwu-audit-biz-investment-capital/SKILL.md +38 -0
  139. package/skills/crwu/crwu-audit-biz-investment-capital/references/00-applicability.md +31 -0
  140. package/skills/crwu/crwu-audit-biz-investment-capital/references/01-kb-assembly.md +34 -0
  141. package/skills/crwu/crwu-audit-biz-investment-capital/references/02-review-focus.md +47 -0
  142. package/skills/crwu/crwu-audit-biz-investment-capital/references/03-common-contract.md +202 -0
  143. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/SKILL.md +38 -0
  144. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/00-applicability.md +30 -0
  145. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/01-kb-assembly.md +32 -0
  146. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/02-review-focus.md +40 -0
  147. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/03-common-contract.md +202 -0
  148. package/skills/crwu/crwu-audit-biz-tax-history/SKILL.md +38 -0
  149. package/skills/crwu/crwu-audit-biz-tax-history/references/00-applicability.md +29 -0
  150. package/skills/crwu/crwu-audit-biz-tax-history/references/01-kb-assembly.md +30 -0
  151. package/skills/crwu/crwu-audit-biz-tax-history/references/02-review-focus.md +33 -0
  152. package/skills/crwu/crwu-audit-biz-tax-history/references/03-common-contract.md +202 -0
  153. package/skills/crwu/crwu-audit-biz-transaction-disposal/SKILL.md +38 -0
  154. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/00-applicability.md +31 -0
  155. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/01-kb-assembly.md +34 -0
  156. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/02-review-focus.md +47 -0
  157. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/03-common-contract.md +202 -0
  158. package/skills/crwu/crwu-audit-datacheck/SKILL.md +59 -0
  159. package/skills/crwu/crwu-audit-datacheck/references/00-KB/350/243/205/351/205/215/350/241/250.md +25 -0
  160. package/skills/crwu/crwu-audit-datacheck/references/01-runtime-and-check-catalog.md +139 -0
  161. package/skills/crwu/crwu-audit-datacheck/scripts/recalc_check.py +521 -0
  162. package/skills/crwu/crwu-audit-datacheck/scripts/test_recalc_check.py +419 -0
  163. package/skills/crwu/crwu-audit-datacheck/scripts/test_skill_self_containment.py +44 -0
  164. package/skills/crwu/crwu-audit-external-data/SKILL.md +73 -0
  165. package/skills/crwu/crwu-audit-external-data/references/00-KB/350/243/205/351/205/215/350/241/250.md +38 -0
  166. package/skills/crwu/crwu-audit-external-data/references/01-connector-access.md +116 -0
  167. package/skills/crwu/crwu-audit-external-data/references/02-verification-workflow.md +78 -0
  168. package/skills/crwu/crwu-audit-external-data/scripts/connector_probe.py +374 -0
  169. package/skills/crwu/crwu-audit-external-data/scripts/test_connector_probe.py +264 -0
  170. package/skills/crwu/crwu-audit-output-filter/SKILL.md +34 -0
  171. package/skills/crwu/crwu-audit-output-filter/references/00-applicability.md +7 -0
  172. package/skills/crwu/crwu-audit-output-filter/references/01-kb-assembly.md +11 -0
  173. package/skills/crwu/crwu-audit-output-filter/references/02-review-focus.md +25 -0
  174. package/skills/crwu/crwu-audit-public-general-standards/SKILL.md +46 -0
  175. package/skills/crwu/crwu-audit-public-general-standards/references/00-applicability.md +41 -0
  176. package/skills/crwu/crwu-audit-public-general-standards/references/01-kb-assembly.md +66 -0
  177. package/skills/crwu/crwu-audit-public-general-standards/references/02-review-focus.md +111 -0
  178. package/skills/crwu/crwu-audit-public-general-standards/references/03-execution-contract.md +89 -0
  179. package/skills/crwu/crwu-dev-audit-optimize/SKILL.md +98 -0
  180. package/skills/crwu/crwu-dev-audit-optimize/references/00-/344/274/230/345/214/226/350/247/204/350/214/203/344/270/216/346/226/207/344/273/266/350/220/275/347/202/271.md +132 -0
  181. package/skills/crwu/crwu-dev-audit-optimize/references/01-/345/217/215/351/246/210/345/256/232/344/275/215/344/270/216/347/224/273/345/203/217/346/265/201/347/250/213.md +108 -0
  182. package/skills/crwu/crwu-dev-audit-optimize/references/02-/346/226/271/346/241/210/346/250/241/346/235/277/344/270/216/347/241/256/350/256/244/351/227/250/347/246/201.md +92 -0
  183. package/skills/crwu/crwu-dev-audit-optimize/references/03-AI/344/272/272/345/267/245/345/267/256/350/267/235/345/210/206/346/236/220/346/265/201/347/250/213.md +95 -0
  184. package/skills/crwu/crwu-dev-audit-optimize/scripts/examples/gap-analysis.sample.json +116 -0
  185. package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis.schema.json +33 -0
  186. package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis_delivery.py +475 -0
  187. package/skills/crwu/crwu-dev-audit-optimize/scripts/test_gap_analysis_delivery.py +855 -0
  188. package/skills/crwu/crwu-dev-audit-optimize/template/NOTICE.echarts.txt +7 -0
  189. package/skills/crwu/crwu-dev-audit-optimize/template/echarts.min.js +45 -0
  190. package/skills/crwu/crwu-dev-audit-optimize/template/gap-analysis-report.html +71 -0
  191. package/skills/crwu/crwu-dev-audit-skill-maintainer/SKILL.md +74 -0
  192. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/00-responsibility-and-modes.md +62 -0
  193. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/01-kb-source-discovery.md +89 -0
  194. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/02-child-skill-contract.md +99 -0
  195. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/03-review-item-execution-contract.md +51 -0
  196. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/04-registry-and-mapping-update.md +73 -0
  197. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/05-validation-and-delivery.md +127 -0
  198. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/06-live-routing-reconciliation.md +136 -0
  199. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/07-kb-skill-map.md +411 -0
  200. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/README.md +200 -0
  201. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/check_audit_skill_mappings.py +2477 -0
  202. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/kb_tool.py +577 -0
  203. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/test_audit_skill_maintainer.py +5097 -0
  204. package/skills/dws/LICENSE +178 -0
  205. package/skills/dws/NOTICE +17 -0
  206. package/skills/dws/dingtalk-aisearch/SKILL.md +83 -0
  207. package/skills/dws/dingtalk-aisearch/references/aisearch.md +249 -0
  208. package/skills/dws/dingtalk-aisearch/references/intent-guide.md +15 -0
  209. package/skills/dws/dingtalk-aisearch/references/lite-recipes.md +31 -0
  210. package/skills/dws/dingtalk-aitable/SKILL.md +139 -0
  211. package/skills/dws/dingtalk-aitable/references/06-data-analytics.md +11 -0
  212. package/skills/dws/dingtalk-aitable/references/aitable/aitable-advperm.md +251 -0
  213. package/skills/dws/dingtalk-aitable/references/aitable/aitable-attachment.md +49 -0
  214. package/skills/dws/dingtalk-aitable/references/aitable/aitable-best-practices.md +48 -0
  215. package/skills/dws/dingtalk-aitable/references/aitable/aitable-cell-value.md +346 -0
  216. package/skills/dws/dingtalk-aitable/references/aitable/aitable-dashboard-chart.md +46 -0
  217. package/skills/dws/dingtalk-aitable/references/aitable/aitable-data-analysis-sop.md +131 -0
  218. package/skills/dws/dingtalk-aitable/references/aitable/aitable-datasource.md +272 -0
  219. package/skills/dws/dingtalk-aitable/references/aitable/aitable-error-recovery.md +128 -0
  220. package/skills/dws/dingtalk-aitable/references/aitable/aitable-export-import.md +113 -0
  221. package/skills/dws/dingtalk-aitable/references/aitable/aitable-field-properties.md +238 -0
  222. package/skills/dws/dingtalk-aitable/references/aitable/aitable-field.md +186 -0
  223. package/skills/dws/dingtalk-aitable/references/aitable/aitable-filter-sort.md +135 -0
  224. package/skills/dws/dingtalk-aitable/references/aitable/aitable-form.md +130 -0
  225. package/skills/dws/dingtalk-aitable/references/aitable/aitable-formula-guide.md +224 -0
  226. package/skills/dws/dingtalk-aitable/references/aitable/aitable-primary-doc.md +58 -0
  227. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-create.md +52 -0
  228. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-delete.md +20 -0
  229. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-history.md +97 -0
  230. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-name-key.md +47 -0
  231. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-query.md +120 -0
  232. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-share.md +54 -0
  233. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-stats.md +59 -0
  234. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-update.md +66 -0
  235. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-upsert.md +89 -0
  236. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-config.md +140 -0
  237. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-extras.md +195 -0
  238. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-types.md +95 -0
  239. package/skills/dws/dingtalk-aitable/references/aitable/aitable-workflow.md +384 -0
  240. package/skills/dws/dingtalk-aitable/references/aitable-record-ops.md +80 -0
  241. package/skills/dws/dingtalk-aitable/references/aitable-section.md +30 -0
  242. package/skills/dws/dingtalk-aitable/references/aitable.md +59 -0
  243. package/skills/dws/dingtalk-aitable/references/field-rules.md +17 -0
  244. package/skills/dws/dingtalk-aitable/references/intent-guide.md +17 -0
  245. package/skills/dws/dingtalk-aitable/references/recipes/conventions.md +44 -0
  246. package/skills/dws/dingtalk-aitable/references/url-patterns.md +144 -0
  247. package/skills/dws/dingtalk-aitable/scripts/aitable_export_via_task.py +210 -0
  248. package/skills/dws/dingtalk-aitable/scripts/aitable_import_via_task.py +173 -0
  249. package/skills/dws/dingtalk-aitable/scripts/bulk_add_fields.py +273 -0
  250. package/skills/dws/dingtalk-aitable/scripts/import_records.py +333 -0
  251. package/skills/dws/dingtalk-aitable/scripts/upload_attachment.py +190 -0
  252. package/skills/dws/dingtalk-calendar/SKILL.md +137 -0
  253. package/skills/dws/dingtalk-calendar/references/03-meeting.md +56 -0
  254. package/skills/dws/dingtalk-calendar/references/calendar.md +760 -0
  255. package/skills/dws/dingtalk-calendar/references/intent-guide.md +9 -0
  256. package/skills/dws/dingtalk-calendar/references/lite-recipes.md +25 -0
  257. package/skills/dws/dingtalk-calendar/scripts/calendar_free_slot_finder.py +199 -0
  258. package/skills/dws/dingtalk-calendar/scripts/calendar_schedule_meeting.py +233 -0
  259. package/skills/dws/dingtalk-calendar/scripts/calendar_today_agenda.py +139 -0
  260. package/skills/dws/dingtalk-chat/SKILL.md +127 -0
  261. package/skills/dws/dingtalk-chat/references/01-messaging.md +103 -0
  262. package/skills/dws/dingtalk-chat/references/card/callback.md +10 -0
  263. package/skills/dws/dingtalk-chat/references/card/create.md +27 -0
  264. package/skills/dws/dingtalk-chat/references/card/schema.md +14 -0
  265. package/skills/dws/dingtalk-chat/references/card/update.md +13 -0
  266. package/skills/dws/dingtalk-chat/references/chat/chat-bot.md +187 -0
  267. package/skills/dws/dingtalk-chat/references/chat/chat-conversation.md +165 -0
  268. package/skills/dws/dingtalk-chat/references/chat/group-admin.md +144 -0
  269. package/skills/dws/dingtalk-chat/references/chat/group-discovery.md +121 -0
  270. package/skills/dws/dingtalk-chat/references/chat/message-actions.md +132 -0
  271. package/skills/dws/dingtalk-chat/references/chat/message-media.md +76 -0
  272. package/skills/dws/dingtalk-chat/references/chat/message-query.md +135 -0
  273. package/skills/dws/dingtalk-chat/references/chat/thread.md +46 -0
  274. package/skills/dws/dingtalk-chat/references/chat-emoji-list.md +216 -0
  275. package/skills/dws/dingtalk-chat/references/chat.md +140 -0
  276. package/skills/dws/dingtalk-chat/references/contracts.md +70 -0
  277. package/skills/dws/dingtalk-chat/references/intent-guide.md +56 -0
  278. package/skills/dws/dingtalk-contact/SKILL.md +122 -0
  279. package/skills/dws/dingtalk-contact/references/08-directory.md +51 -0
  280. package/skills/dws/dingtalk-contact/references/contact.md +595 -0
  281. package/skills/dws/dingtalk-contact/references/intent-guide.md +14 -0
  282. package/skills/dws/dingtalk-contact/references/lite-recipes.md +30 -0
  283. package/skills/dws/dingtalk-contact/references/recipes/conventions.md +44 -0
  284. package/skills/dws/dingtalk-contact/scripts/contact_dept_members.py +130 -0
  285. package/skills/dws/dingtalk-doc/SKILL.md +112 -0
  286. package/skills/dws/dingtalk-doc/references/04-document.md +57 -0
  287. package/skills/dws/dingtalk-doc/references/contracts.md +40 -0
  288. package/skills/dws/dingtalk-doc/references/doc/doc-block.md +39 -0
  289. package/skills/dws/dingtalk-doc/references/doc/doc-comment.md +29 -0
  290. package/skills/dws/dingtalk-doc/references/doc/doc-create.md +54 -0
  291. package/skills/dws/dingtalk-doc/references/doc/doc-export.md +30 -0
  292. package/skills/dws/dingtalk-doc/references/doc/doc-import.md +28 -0
  293. package/skills/dws/dingtalk-doc/references/doc/doc-info.md +12 -0
  294. package/skills/dws/dingtalk-doc/references/doc/doc-media.md +46 -0
  295. package/skills/dws/dingtalk-doc/references/doc/doc-read.md +56 -0
  296. package/skills/dws/dingtalk-doc/references/doc/doc-update.md +87 -0
  297. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-cookbook.md +469 -0
  298. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.json +526 -0
  299. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.md +711 -0
  300. package/skills/dws/dingtalk-doc/references/doc/style/doc-create-workflow.md +414 -0
  301. package/skills/dws/dingtalk-doc/references/doc/style/doc-style-guideline.md +404 -0
  302. package/skills/dws/dingtalk-doc/references/doc/style/doc-update-workflow.md +316 -0
  303. package/skills/dws/dingtalk-doc/references/doc.md +82 -0
  304. package/skills/dws/dingtalk-doc/references/intent-guide.md +20 -0
  305. package/skills/dws/dingtalk-drive/SKILL.md +128 -0
  306. package/skills/dws/dingtalk-drive/references/drive.md +126 -0
  307. package/skills/dws/dingtalk-drive/references/folder-sync.md +40 -0
  308. package/skills/dws/dingtalk-drive/references/intent-guide.md +22 -0
  309. package/skills/dws/dingtalk-drive/references/lite-recipes.md +39 -0
  310. package/skills/dws/dingtalk-event/SKILL.md +106 -0
  311. package/skills/dws/dingtalk-event/references/event-im-keys.md +54 -0
  312. package/skills/dws/dingtalk-event/references/event-im-lifecycle.md +35 -0
  313. package/skills/dws/dingtalk-event/references/event-im-operations.md +52 -0
  314. package/skills/dws/dingtalk-event/references/event-im-output.md +39 -0
  315. package/skills/dws/dingtalk-event/references/event-im.md +58 -0
  316. package/skills/dws/dingtalk-event/references/event-oa.md +155 -0
  317. package/skills/dws/dingtalk-event/references/event-todo.md +50 -0
  318. package/skills/dws/dingtalk-event/references/event-voip.md +69 -0
  319. package/skills/dws/dingtalk-mail/SKILL.md +113 -0
  320. package/skills/dws/dingtalk-mail/references/09-mail.md +45 -0
  321. package/skills/dws/dingtalk-mail/references/intent-guide.md +8 -0
  322. package/skills/dws/dingtalk-mail/references/lite-recipes.md +45 -0
  323. package/skills/dws/dingtalk-mail/references/mail.md +1889 -0
  324. package/skills/dws/dingtalk-mail/references/recipes/conventions.md +44 -0
  325. package/skills/dws/dingtalk-mail/scripts/mail_send_with_cc.py +122 -0
  326. package/skills/dws/dingtalk-mail/scripts/mail_unread_summary.py +114 -0
  327. package/skills/dws/dingtalk-minutes/SKILL.md +116 -0
  328. package/skills/dws/dingtalk-minutes/references/07-minutes.md +149 -0
  329. package/skills/dws/dingtalk-minutes/references/10-minutes-speaker-match.md +32 -0
  330. package/skills/dws/dingtalk-minutes/references/11-minutes-speaker-correct.md +40 -0
  331. package/skills/dws/dingtalk-minutes/references/intent-guide.md +79 -0
  332. package/skills/dws/dingtalk-minutes/references/lite-recipes.md +25 -0
  333. package/skills/dws/dingtalk-minutes/references/minutes.md +210 -0
  334. package/skills/dws/dingtalk-minutes/references/recipes/conventions.md +33 -0
  335. package/skills/dws/dingtalk-minutes/scripts/minutes_recent_summary.py +196 -0
  336. package/skills/dws/dingtalk-minutes/scripts/test_minutes_scripts.py +222 -0
  337. package/skills/dws/dingtalk-misc/SKILL.md +55 -0
  338. package/skills/dws/dingtalk-misc/references/05-reporting.md +29 -0
  339. package/skills/dws/dingtalk-misc/references/agoal.md +302 -0
  340. package/skills/dws/dingtalk-misc/references/attendance-intent-guide.md +7 -0
  341. package/skills/dws/dingtalk-misc/references/attendance-report.md +109 -0
  342. package/skills/dws/dingtalk-misc/references/attendance-schedule.md +115 -0
  343. package/skills/dws/dingtalk-misc/references/attendance-vacation.md +129 -0
  344. package/skills/dws/dingtalk-misc/references/attendance.md +149 -0
  345. package/skills/dws/dingtalk-misc/references/dev/app.md +42 -0
  346. package/skills/dws/dingtalk-misc/references/dev/connect.md +108 -0
  347. package/skills/dws/dingtalk-misc/references/dev/credentials.md +26 -0
  348. package/skills/dws/dingtalk-misc/references/dev/dev-index.md +13 -0
  349. package/skills/dws/dingtalk-misc/references/dev/event.md +47 -0
  350. package/skills/dws/dingtalk-misc/references/dev/mcp.md +106 -0
  351. package/skills/dws/dingtalk-misc/references/dev/member.md +19 -0
  352. package/skills/dws/dingtalk-misc/references/dev/permission.md +56 -0
  353. package/skills/dws/dingtalk-misc/references/dev/recipes.md +58 -0
  354. package/skills/dws/dingtalk-misc/references/dev/robot.md +74 -0
  355. package/skills/dws/dingtalk-misc/references/dev/security.md +21 -0
  356. package/skills/dws/dingtalk-misc/references/dev/version.md +99 -0
  357. package/skills/dws/dingtalk-misc/references/dev/webapp.md +22 -0
  358. package/skills/dws/dingtalk-misc/references/devapp.md +148 -0
  359. package/skills/dws/dingtalk-misc/references/devdoc-intent-guide.md +7 -0
  360. package/skills/dws/dingtalk-misc/references/devdoc.md +42 -0
  361. package/skills/dws/dingtalk-misc/references/ding.md +184 -0
  362. package/skills/dws/dingtalk-misc/references/hrbrain.md +67 -0
  363. package/skills/dws/dingtalk-misc/references/live.md +23 -0
  364. package/skills/dws/dingtalk-misc/references/markdown.md +167 -0
  365. package/skills/dws/dingtalk-misc/references/oa/oa-form-components.md +345 -0
  366. package/skills/dws/dingtalk-misc/references/oa/oa-process-nodes.md +374 -0
  367. package/skills/dws/dingtalk-misc/references/oa.md +1014 -0
  368. package/skills/dws/dingtalk-misc/references/openapi-explorer.md +47 -0
  369. package/skills/dws/dingtalk-misc/references/pat.md +52 -0
  370. package/skills/dws/dingtalk-misc/references/profile.md +41 -0
  371. package/skills/dws/dingtalk-misc/references/recruit.md +89 -0
  372. package/skills/dws/dingtalk-misc/references/report-conventions.md +44 -0
  373. package/skills/dws/dingtalk-misc/references/report-intent-guide.md +11 -0
  374. package/skills/dws/dingtalk-misc/references/report-lite-recipes.md +25 -0
  375. package/skills/dws/dingtalk-misc/references/report.md +109 -0
  376. package/skills/dws/dingtalk-misc/references/sheet/sheet-batch-operations.md +104 -0
  377. package/skills/dws/dingtalk-misc/references/sheet/sheet-chart.md +69 -0
  378. package/skills/dws/dingtalk-misc/references/sheet/sheet-comment.md +166 -0
  379. package/skills/dws/dingtalk-misc/references/sheet/sheet-conditional-format.md +59 -0
  380. package/skills/dws/dingtalk-misc/references/sheet/sheet-dimension-operations.md +60 -0
  381. package/skills/dws/dingtalk-misc/references/sheet/sheet-dropdown.md +103 -0
  382. package/skills/dws/dingtalk-misc/references/sheet/sheet-export.md +135 -0
  383. package/skills/dws/dingtalk-misc/references/sheet/sheet-filter-view.md +51 -0
  384. package/skills/dws/dingtalk-misc/references/sheet/sheet-filter.md +181 -0
  385. package/skills/dws/dingtalk-misc/references/sheet/sheet-formula.md +192 -0
  386. package/skills/dws/dingtalk-misc/references/sheet/sheet-import.md +76 -0
  387. package/skills/dws/dingtalk-misc/references/sheet/sheet-media-image.md +263 -0
  388. package/skills/dws/dingtalk-misc/references/sheet/sheet-pivot-table.md +292 -0
  389. package/skills/dws/dingtalk-misc/references/sheet/sheet-range-operations.md +161 -0
  390. package/skills/dws/dingtalk-misc/references/sheet/sheet-read-data.md +60 -0
  391. package/skills/dws/dingtalk-misc/references/sheet/sheet-revision-changeset.md +46 -0
  392. package/skills/dws/dingtalk-misc/references/sheet/sheet-search-replace.md +120 -0
  393. package/skills/dws/dingtalk-misc/references/sheet/sheet-style-format.md +71 -0
  394. package/skills/dws/dingtalk-misc/references/sheet/sheet-version.md +84 -0
  395. package/skills/dws/dingtalk-misc/references/sheet/sheet-workbook.md +59 -0
  396. package/skills/dws/dingtalk-misc/references/sheet/sheet-write-data.md +93 -0
  397. package/skills/dws/dingtalk-misc/references/sheet-conventions.md +44 -0
  398. package/skills/dws/dingtalk-misc/references/sheet-intent-guide.md +12 -0
  399. package/skills/dws/dingtalk-misc/references/sheet.md +166 -0
  400. package/skills/dws/dingtalk-misc/references/skill.md +98 -0
  401. package/skills/dws/dingtalk-misc/references/unsupported-scripts.md +49 -0
  402. package/skills/dws/dingtalk-misc/references/url-patterns.md +144 -0
  403. package/skills/dws/dingtalk-misc/references/whiteboard/compose.md +200 -0
  404. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/01-overview.md +57 -0
  405. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/02-query.md +288 -0
  406. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/03-update.md +249 -0
  407. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/04-text-style.md +395 -0
  408. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/05-shape-frame-group-connector.md +186 -0
  409. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/06-vector-icon-path.md +313 -0
  410. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/07-examples-errors-write-support.md +270 -0
  411. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/08-catalogs.md +61 -0
  412. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1.md +54 -0
  413. package/skills/dws/dingtalk-misc/references/whiteboard/replace.md +41 -0
  414. package/skills/dws/dingtalk-misc/references/whiteboard/vector.md +51 -0
  415. package/skills/dws/dingtalk-misc/references/whiteboard.md +115 -0
  416. package/skills/dws/dingtalk-misc/scripts/aiapp_create_and_poll.py +138 -0
  417. package/skills/dws/dingtalk-misc/scripts/attendance_my_record.py +91 -0
  418. package/skills/dws/dingtalk-misc/scripts/attendance_report_checkin.py +440 -0
  419. package/skills/dws/dingtalk-misc/scripts/attendance_report_common.py +1698 -0
  420. package/skills/dws/dingtalk-misc/scripts/attendance_report_daily.py +558 -0
  421. package/skills/dws/dingtalk-misc/scripts/attendance_report_detail.py +809 -0
  422. package/skills/dws/dingtalk-misc/scripts/attendance_report_monthly.py +758 -0
  423. package/skills/dws/dingtalk-misc/scripts/attendance_report_record.py +947 -0
  424. package/skills/dws/dingtalk-misc/scripts/attendance_schedule_export.py +344 -0
  425. package/skills/dws/dingtalk-misc/scripts/attendance_schedule_import.py +498 -0
  426. package/skills/dws/dingtalk-misc/scripts/attendance_team_shift.py +89 -0
  427. package/skills/dws/dingtalk-misc/scripts/attendance_vacation_balance.py +617 -0
  428. package/skills/dws/dingtalk-misc/scripts/finance_daily_cashflow.py +70 -0
  429. package/skills/dws/dingtalk-misc/scripts/finance_expense_flow.py +138 -0
  430. package/skills/dws/dingtalk-misc/scripts/oa_batch_approve.py +158 -0
  431. package/skills/dws/dingtalk-misc/scripts/oa_pending_review.py +132 -0
  432. package/skills/dws/dingtalk-misc/scripts/report_received_today.py +315 -0
  433. package/skills/dws/dingtalk-misc/scripts/yida_custom_page_update.py +401 -0
  434. package/skills/dws/dingtalk-misc/scripts/yida_form_builder.py +526 -0
  435. package/skills/dws/dingtalk-misc/scripts/yida_form_fields.py +315 -0
  436. package/skills/dws/dingtalk-misc/scripts/yida_form_inspector.py +311 -0
  437. package/skills/dws/dingtalk-misc/scripts/yida_form_update.py +185 -0
  438. package/skills/dws/dingtalk-misc/scripts/yida_jsx_pipeline.py +1588 -0
  439. package/skills/dws/dingtalk-misc/scripts/yida_page_compiler.py +1441 -0
  440. package/skills/dws/dingtalk-misc/scripts/yida_page_generate.py +514 -0
  441. package/skills/dws/dingtalk-misc/scripts/yida_page_schema.py +519 -0
  442. package/skills/dws/dingtalk-misc/scripts/yida_page_self_check.py +398 -0
  443. package/skills/dws/dingtalk-misc/scripts/yida_process_flow.py +1478 -0
  444. package/skills/dws/dingtalk-misc/scripts/yida_process_update.py +589 -0
  445. package/skills/dws/dingtalk-misc/scripts/yida_report_builder.py +494 -0
  446. package/skills/dws/dingtalk-misc/scripts/yida_report_charts.py +1434 -0
  447. package/skills/dws/dingtalk-misc/scripts/yida_report_update.py +244 -0
  448. package/skills/dws/dingtalk-misc/scripts/yida_schema_common.py +340 -0
  449. package/skills/dws/dingtalk-shared/SKILL.md +83 -0
  450. package/skills/dws/dingtalk-shared/references/capability-limits.md +31 -0
  451. package/skills/dws/dingtalk-shared/references/channel-login.md +26 -0
  452. package/skills/dws/dingtalk-shared/references/confirmation.md +59 -0
  453. package/skills/dws/dingtalk-shared/references/error-codes.md +155 -0
  454. package/skills/dws/dingtalk-shared/references/global-reference.md +122 -0
  455. package/skills/dws/dingtalk-shared/references/intent-guide.md +537 -0
  456. package/skills/dws/dingtalk-shared/references/recipes/conventions.md +45 -0
  457. package/skills/dws/dingtalk-shared/references/recipes/lite-catalog.md +275 -0
  458. package/skills/dws/dingtalk-shared/references/recipes/meta.md +67 -0
  459. package/skills/dws/dingtalk-shared/references/routing.md +52 -0
  460. package/skills/dws/dingtalk-shared/references/runtime-contract.md +11 -0
  461. package/skills/dws/dingtalk-shared/references/schema-usage.md +88 -0
  462. package/skills/dws/dingtalk-shared/references/url-patterns.md +144 -0
  463. package/skills/dws/dingtalk-shared/references/workflow-routing.md +45 -0
  464. package/skills/dws/dingtalk-todo/SKILL.md +119 -0
  465. package/skills/dws/dingtalk-todo/references/02-task.md +70 -0
  466. package/skills/dws/dingtalk-todo/references/intent-guide.md +15 -0
  467. package/skills/dws/dingtalk-todo/references/lite-recipes.md +68 -0
  468. package/skills/dws/dingtalk-todo/references/recipes/conventions.md +44 -0
  469. package/skills/dws/dingtalk-todo/references/todo.md +517 -0
  470. package/skills/dws/dingtalk-todo/scripts/todo_batch_create.py +354 -0
  471. package/skills/dws/dingtalk-todo/scripts/todo_daily_summary.py +153 -0
  472. package/skills/dws/dingtalk-todo/scripts/todo_overdue_check.py +101 -0
  473. package/skills/dws/dingtalk-wiki/SKILL.md +117 -0
  474. package/skills/dws/dingtalk-wiki/references/intent-guide.md +14 -0
  475. package/skills/dws/dingtalk-wiki/references/lite-recipes.md +44 -0
  476. package/skills/dws/dingtalk-wiki/references/wiki-members.md +32 -0
  477. package/skills/dws/dingtalk-wiki/references/wiki-node-ops.md +46 -0
  478. package/skills/dws/dingtalk-wiki/references/wiki.md +65 -0
  479. package/skills/dws/provenance.json +27 -0
@@ -0,0 +1,116 @@
1
+ # references/01 · 取数路径发现与调用规程(crwu-audit-external-data)
2
+
3
+ > 本文件只规定**怎么找到并调用**同花顺 iFinD 的取数入口,以及找不到时怎么办。
4
+ > 本技能不启用万得。要核哪些数据项、每项的口径要求与结论档位由知识库
5
+ > `06-规则库/M-外部数据核验/01-模块-外部数据核验`(表 A / 表 B / 表 C)规定,本文件不复制;
6
+ > 库内表 D 为取数失败与降级口径(单源),双源复核不适用(见 §6)。
7
+
8
+ ## 1 唯一数据源 = 同花顺 iFinD,但入口随宿主而异
9
+
10
+ 同花顺 iFinD 在不同宿主以不同形态提供,**不要用一个宿主的事实推断另一个宿主**:
11
+
12
+ | 宿主 | 取数路径 | 形态与调用 | 凭据归属 |
13
+ | --- | --- | --- | --- |
14
+ | WorkBuddy | 宿主内置连接器 | MCP 服务,连接器 id `ifind-mcp`(服务端授权);会话可能直接暴露其 MCP 工具,否则读宿主连接器声明 | 宿主托管 |
15
+ | DeepSeek Harness | 结构化 Tool `crwu_audit_ifind_query` | 由 Host 执行固定 iFinD MCP HTTP 协议;`operation=list_tools` 查权益内工具清单、`operation=query` 取数 | Host 按环境清单声明的固定位置读取(模型不可提交、不可读取、不可见) |
16
+
17
+ - 两条宿主入口取的是**同一上游 iFinD 服务**,取回值可视为同一数据源;进入 `sources[]` 时统一写
18
+ `同花顺 iFinD`,本次实际走哪条路径写进 `note`。
19
+ - DeepSeek Harness 侧**不再**调用任何第三方技能脚本:取数入口是宿主的结构化 Tool
20
+ `crwu_audit_ifind_query`(注册、审批、超时、取消、脱敏都在 DSH 的工具链里)。
21
+ 服务地址与 `serverType` 映射是 Host 的内部固定表,模型只提交 `operation` / `serverType` /
22
+ `toolName` / `params`。**不得**搜索技能根(`~/.agents`、`~/.dsh`、`~/.codebuddy`、`~/.claude` 等)、
23
+ **不得**执行任何第三方技能自带的调用脚本、**不得**在第三方技能目录写临时脚本、
24
+ **不得**读取任何第三方技能的凭据配置文件。
25
+ - 禁止把万得列为数据源,也禁止声称已做双源复核(本环境无万得)。
26
+
27
+ ## 2 发现顺序(逐级降级,不得跳级)
28
+
29
+ | 级 | 动作 | 判据 |
30
+ | --- | --- | --- |
31
+ | L1 | 使用**当前会话已暴露的取数入口** | WorkBuddy:会话已暴露同花顺 iFinD 的 MCP 工具;DeepSeek Harness:`crwu_audit_ifind_query` 对当前 Agent 可见 |
32
+ | L2 | 读**宿主声明**(仅 WorkBuddy;L1 未暴露时) | 见 §3(WorkBuddy 连接器声明);命令:`<WorkBuddy 宿主可用的绝对 Python 路径> scripts/connector_probe.py --format json`。**DeepSeek Harness 无此级**——入口就是结构化 Tool 的可见性,不读宿主声明、也不运行本探测脚本 |
33
+ | L3 | 入口存在但**未启用 / 未认证** | 按 §5 降级并在交付件声明 |
34
+ | L4 | 完全不存在 | 按 §5 降级并在交付件声明 |
35
+
36
+ **逐宿主判定,不得跨宿主推断。** WorkBuddy:L1 未暴露**不等于**数据源不可用——必须继续走 L2 读宿主声明,
37
+ 不得直接判"无数据源"。DeepSeek Harness:只有 L1(结构化 Tool 对当前 Agent 的可见性),
38
+ 没有 L2,也没有任何可读的声明文件。
39
+
40
+ ## 3 WorkBuddy:宿主连接器声明位置
41
+
42
+ 默认根 = 环境变量 `CRWU_CONNECTOR_ROOT`;未设置时 = `~/.workbuddy`(WorkBuddy 连接器宿主目录)。
43
+ **本仓不提供这些连接器,也不随本技能安装**——它们是宿主侧外部工具。
44
+
45
+ | 位置(相对根) | 内容 |
46
+ | --- | --- |
47
+ | `mcp.json` | 宿主 MCP 服务清单(`mcpServers`:连接器 id → 端点 / 启用标记) |
48
+ | `connectors/*/mcp.json` | 按账号态分目录的连接器声明 |
49
+ | `connectors/*/connector-states.json`、`connector-states.v3.json` | 启用状态(`enabled` 列表、`userDisabled` 映射、`everConnected`)与凭据引用(`headerOverrides` 的**键名**) |
50
+ | `connectors-marketplace/.codebuddy-connector/connectors.json` | 连接器目录(id / 中英文名 / 是否需要授权),**不作为"已声明"依据** |
51
+
52
+ 已知连接器标识:同花顺 iFinD = `ifind-mcp`(服务端授权,宿主托管,无需本技能处理凭据)。
53
+
54
+ ## 4 DeepSeek Harness:结构化 Tool `crwu_audit_ifind_query`
55
+
56
+ DeepSeek Harness 没有 WorkBuddy 连接器目录,**也不允许脚本例外**。同花顺 iFinD 取数统一走宿主注册的
57
+ 结构化 Tool `crwu_audit_ifind_query`:
58
+
59
+ - **入口可见性**:`operation` 的「列工具」取值能返回工具清单即视为入口可用(枚举字面量见 Tool schema,本文件不复述);Tool 不在本 Agent 的可见集里
60
+ → 按 §5 降级(记 capability gap 并写交付声明)。
61
+ - **参数**:只有 `operation`(列工具 / 查询两个取值)、`serverType`(固定八元:`stock` / `fund` /
62
+ `edb` / `news` / `bond` / `global_stock` / `index` / `future`)、`toolName`(查询时必填)、
63
+ `params`(JSON 对象)。**没有** URL / token / 脚本路径 / 沙箱模式这类字段。
64
+ - **凭据**:由 Host 从环境清单声明的固定位置读取;本技能**不读取、不输出、不落盘**任何令牌,
65
+ 也**不**读取任何第三方技能的凭据配置文件。
66
+ - **`toolName` 校验**:Host 会先用 MCP「列工具」方法的真实返回校验 `toolName`,不在清单里的名字不会被发出。
67
+ - **失败语义**:未授权读凭据 → `policy`;缺令牌 → `capability-gap`;HTTP / 协议错误 → `infrastructure`;
68
+ 服务端 JSON-RPC 错误 → `cli`;取消 → `cancelled`。一律按 §5 降级,**不得静默跳过**、
69
+ 也不得把能力缺口写成被审件缺陷。
70
+ - **禁止**(自包含安全边界):搜索任何技能根、执行任何第三方技能自带的调用脚本、
71
+ 在第三方技能目录写临时脚本、读取任何第三方技能的配置文件、用 `subprocess` / `child_process` 起进程。
72
+
73
+ ## 5 兜底:入口不可用时怎么办
74
+
75
+ 1. **不得静默跳过**,也不得事后补写结论。
76
+ 2. 按库内降级口径降级:命中关键参数 / 高风险的条目降为"单源 + 请说明";其余记未检查项与能力缺口。
77
+ 本环境无万得副源,**所有条目一律单源**,不得声称已复核。
78
+ 3. **在交付 HTML 的《外部数据核验》区显式声明**(字段 `externalDataVerification.sources[]`,
79
+ 数据源统一写 `同花顺 iFinD`):
80
+
81
+ | 情形 | `configured` | `authenticated` | 必须在 `note` 写明 |
82
+ | --- | --- | --- | --- |
83
+ | 所有宿主入口都不存在 | `false` | `false` | 未配置同花顺 iFinD 取数入口;相关条目未经外部数据核验 |
84
+ | 入口存在但未启用 | `false` | `false` | 取数入口未启用;相关条目未经外部数据核验 |
85
+ | 入口启用但未完成授权 | `true` | `false` | 取数入口未认证;相关条目未经外部数据核验 |
86
+ | 可用 | `true` | `true` | 本次取数路径(WorkBuddy 连接器 / 结构化 Tool `crwu_audit_ifind_query`)与取数时点、口径 |
87
+
88
+ 4. 声明措辞统一为:"本次未配置 / 未认证 同花顺 iFinD,相关条目未经外部数据核验。"
89
+ 5. 降级不影响其他检查项与轴:外部数据核验失败不得短路方法判断、披露检查或表格勾稽。
90
+
91
+ ## 6 调用与留痕契约
92
+
93
+ 每次取数必须记录并回执:
94
+
95
+ ```yaml
96
+ data_point:
97
+ metric: 【数据项名称】 # 与知识库表 B 的数据项一致
98
+ metric_key: EXT_【…】 # 可选,与库内稳定键一致
99
+ base_date: 【报告基准日】 # 全部取数的锚点
100
+ as_of_date: 【本次取数时点】 # 与基准日不同的必须说明
101
+ source: 同花顺 iFinD
102
+ access_path: 宿主连接器 / 结构化 Tool crwu_audit_ifind_query
103
+ query_params: # 口径参数,按库内表 B 要求的必填项逐项填
104
+ term / window / frequency / benchmark / adjustment / unit / …
105
+ value: 【取回值】
106
+ source_note: 【可选】取数路径(宿主连接器 / 结构化 Tool)或口径变更说明
107
+ snapshot_digest: 【快照摘要】 # 对取回内容做规范化摘要,供事后核验
108
+ ```
109
+
110
+ - **基准日纪律**:`query_params` 的区间与窗口一律由 `base_date` 推导;禁止"截止最新 / 最近 N 周"这类
111
+ 以取数时点为准的滚动窗口。
112
+ - **单源纪律**:本环境不启用万得,数据源一律为同花顺 iFinD,**不得声称双源复核**;
113
+ 取数路径与口径变更在 `source_note` 如实登记。
114
+ - **凭据纪律**:只读连接器声明的**键名与启用状态**;不读取、不输出、不落盘任何令牌、Authorization 头
115
+ 或含 token 的 URL。WorkBuddy 侧的 `scripts/connector_probe.py` 已按此实现(URL 只输出主机名)。
116
+ - **快照纪律**:外部数据快照按本次审核工作目录落盘并登记摘要,供交付层引用;不写入知识库缓存。
@@ -0,0 +1,78 @@
1
+ # 02 · 核验流程与交付字段(crwu-audit-external-data)
2
+
3
+ > 本文件是 external-data **前置适用性门禁、基准日锚定三档、核验步骤 0–7、口径与结论边界、
4
+ > `externalDataVerification` 字段契约与详细禁止事项**的唯一落点。入口 `SKILL.md` 只保留调用
5
+ > 门禁、输入三项、单源声明、宿主入口安全边界与必读导航。
6
+ >
7
+ > - **取数入口发现与调用**以 `01-connector-access.md` 为准;本文件不复制宿主连接器声明位置、
8
+ > Tool schema 或凭据规则。
9
+ > - **要核哪些数据项、每项的口径要求与结论档位**仍以本次经 `crwu-dws` 实时下载的知识库正文为准。
10
+ > - 唯一外部数据源仍为**同花顺 iFinD**,不启用万得、不声称双源复核。
11
+ >
12
+ > **导航**:§1 前置适用性门禁 → §2 核验步骤 0–7(含基准日锚定三档) → §3 交付层字段 → §4 禁止事项
13
+
14
+ ## 1. 前置适用性门禁
15
+
16
+ 前置适用性门禁:先按知识库表 A 核对业务线、资产线、方法线。三条未同时成立时,直接回执
17
+ `applicability.status=not_applicable`、原因和表 A 依据;不探测连接器、不填写不可用声明,也不形成未检查项或 capability gap。
18
+ 只有三条同时成立时才执行以下取数流程,并回执 `applicability.status=required`。
19
+
20
+ ## 2. 核验步骤(0–7)
21
+
22
+ 0. **基准日锚定(先做)**:从 `route_profile.record_context` 取 `base_date` 与其状态,作为本次全部取数的
23
+ 时点锚。**所有区间与窗口由基准日推导**(如"基准日前 2 年");禁止"截止最新/最近 N 周"这类
24
+ 以取数时点为准的滚动窗口——否则同一项目不同日期复跑结果不同,比对与回归都不成立。
25
+ 按基准日状态**分三档**处理(不得整线停载):
26
+
27
+ | 基准日状态 | 取数行为 |
28
+ | --- | --- |
29
+ | 唯一确定 | 正常取数;全部时点参数由该基准日推导 |
30
+ | 多候选(ROUTE003 挂起,存在 2 个及以上候选日) | **条件性取数**:对每个候选日分别取数(或取覆盖全部候选日的区间段)。候选日结论一致 → 可出结论并注明"已在候选基准日下逐一核验,结论一致";结论不一致 → 出"请说明"的**条件性结论**(注明取决于基准日确认),**不得判"不符合"**,转人工 |
31
+ | 缺失 / 不可解析 | 只核验**不依赖基准日**的数据项(公司属性事实、报告期已固定的财报数、政策文件现行有效性);依赖时点的项记"未检查"并写明原因 |
32
+
33
+ 本档只**消费** router 已给出的 `base_date` / `base_date_status`,**不自行判定 ROUTE 冲突**
34
+ (判定权在 `06-overlay-classification.md`);也**不因基准日挂起而整线停载**——按
35
+ `08-union-dispatch-rules.md`,不依赖冲突字段的规则仍须执行。
36
+ 1. **抽取**:真实读取报告、评估说明与测算明细表,抽取"报告引用了哪些外部数据"——数据项、报告值、
37
+ 报告位置、上下文(用途、方法章节)。**只针对报告实际引用的外部数据**,不凭空扩展核验范围。
38
+ 2. **定源**:按库内表 B(数据项触及表)与表 C(组合映射表)确定**要核哪些数据项、每项的口径要求**。
39
+ 本环境唯一数据源为同花顺 iFinD,**不启用万得**:数据源一律按同花顺 iFinD 取数,
40
+ 并如实留痕取数路径与口径变更。
41
+ 表内未覆盖的数据项按库内 §9 员工补录机制登记后仍按默认规则核验,不跳过。
42
+ 3. **取数入口发现**:按 `references/01-connector-access.md` 的顺序逐宿主判定,**不得跨宿主推断**——
43
+ WorkBuddy 先看会话是否已暴露 iFinD MCP 工具,未暴露才读宿主连接器声明
44
+ (`<WorkBuddy 宿主可用的绝对 Python 路径> scripts/connector_probe.py --format json`,只读、不读凭据值);
45
+ DeepSeek Harness 不读任何声明、也不运行 `connector_probe.py`,只看结构化 Tool
46
+ `crwu_audit_ifind_query` 对当前 Agent 是否可见,可见后以一次真实的 `operation=list_tools`
47
+ 成功返回为准。
48
+ 4. **取数**:对每个数据项按报告声明的口径(期限、窗口、频率、基准、复权、单位)取数;
49
+ 报告**未声明口径**的参数,只做披露检查(输出"请说明"),不取数比对。
50
+ 5. **口径标准化后比对**:把外部取值与报告值归一到同一口径再比;**口径无法统一时禁止作数值判定**,
51
+ 只记录口径差异。事实型数据可判"不符合";模型型数据只出"请说明"。
52
+ 6. **输出**:逐项 EXT 意见(结构以库内 §8 意见条目格式为准),并产出交付层
53
+ `externalDataVerification`(供 HTML《外部数据核验》区渲染)。
54
+ 7. **留痕**:每条核验记录保留库内 §6 要求的全部字段(数据项、数值、来源、取数时点、口径、单位、参数)。
55
+
56
+ ## 3. 交付层字段(供 HTML 体现)
57
+
58
+ 本技能向编排层回执 `externalDataVerification`(写入 AuditResult),结构见
59
+ `crwu-audit/references/11-html-delivery-spec.md` 的《外部数据核验》区定义:
60
+
61
+ - `applicability`:必填,含 `status`(`required` / `not_applicable`)、`reason` 与知识库表 A `basis`;
62
+ - `baseDate`:本次基准日(全部核验的锚点时点);
63
+ - `sources[]`:数据源的可用性事实(`source` / `configured` / `authenticated` / `note`)——
64
+ 本技能只申报**同花顺 iFinD** 一条(两条取数路径合并为同一数据源),并在 `note` 里写明本次走的是
65
+ 哪条路径;**仅在 `applicability.status=required` 且取数路径不可用时**显式声明,并给出“相关条目未经外部数据核验”的措辞;
66
+ - `checks[]`:逐项核验(数据项、报告值、各源取值与取数时点口径、`deviationAgainst`(与本项目报告值
67
+ 出入较大的数据源)、`decision`、报告证据位置、说明);
68
+ - 只要有 `checks` 就**逐项写明正确与不正确**:判定为"符合"的条目同样入表,不得只列问题。
69
+
70
+ ## 4. 禁止事项
71
+
72
+ 1. 禁止用取数时点的滚动窗口代替基准日推导区间;
73
+ 2. 禁止在口径不一致时判"数据错误",或仅凭外部取值与报告值的差异否定报告参数;
74
+ 3. 禁止未留痕取数口径即出数值判定;
75
+ 4. 禁止把外部数据用作规则依据(外部数据只进报告证据,不进 `rule_source`);
76
+ 5. 禁止下方法适用性、参数合理性等专业判断(交方法轴技能与人工);
77
+ 6. 禁止混淆“不适用”与“能力不可用”:不适用时不得探测或告警;需要核验但取数路径缺失/未认证时不得静默跳过,必须按库内降级口径降级并在交付件中显式声明;
78
+ 7. 禁止声称已做双源复核,或把万得列为本次数据源(本环境不启用万得)。
@@ -0,0 +1,374 @@
1
+ #!/usr/bin/env python3
2
+ """外部数据源只读探测:同花顺 iFinD 的 WorkBuddy 宿主连接器(crwu-audit-external-data)。
3
+
4
+ 背景:本技能的唯一外部数据源是同花顺 iFinD,但不同宿主的取数入口不同——
5
+
6
+ - **WorkBuddy**:宿主把同花顺 iFinD 做成内置连接器(MCP,连接器 id `ifind-mcp`,服务端授权);
7
+ 会话可能直接暴露对应 MCP 工具;未暴露时读宿主连接器声明。
8
+ - **DeepSeek Harness**:取数入口是宿主的结构化 Tool `crwu_audit_ifind_query`,对当前 Agent 可见
9
+ 即可用。它是宿主能力,**不表现为技能目录**,因此 Harness 侧没有可读的声明文件:本脚本不为它
10
+ 搜索任何技能根,也不判断任何技能目录。
11
+
12
+ 所以本脚本只在会话未直接暴露取数入口时,读 WorkBuddy 宿主连接器的**声明**,回答"同花顺 iFinD
13
+ 是否存在、是否启用、有没有可核实的授权证据"。万得不在本技能范围内,不探测、不作为数据源。
14
+
15
+ 只读纪律:
16
+ - 只读连接器声明的**键名与启用状态**;
17
+ - 不读取、不输出任何令牌 / Authorization 值;URL 只输出主机名(去掉路径与查询串);
18
+ - 不发起任何网络请求。
19
+
20
+ 判定口径(重要):
21
+ - **只有宿主声明(`mcp.json` / `connectors/*/mcp.json`)才算"已声明"**;连接器市场目录
22
+ (`connectors-marketplace/.../connectors.json`)列出全部可安装连接器,**不作为已声明依据**。
23
+ - 连接器声明只给出**预检**结论,**不断言凭据有效**;真正的判据是**运行时调用是否返回授权错误**。
24
+ - 若运行时调用失败,按知识库表 D 降级并在交付件中声明(见 references/01-connector-access.md §4)。
25
+
26
+ 宿主侧外部工具说明:WorkBuddy 连接器由宿主提供,本仓库不提供、不随本技能安装。
27
+
28
+ 用法:
29
+ python3 scripts/connector_probe.py [--root <dir>] [--format json|text]
30
+
31
+ 退出码:0 = WorkBuddy 宿主连接器预检可用;2 = 未发现可用入口(仍输出 JSON 说明)。
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import argparse
36
+ import json
37
+ import os
38
+ import re
39
+ import sys
40
+ from pathlib import Path
41
+
42
+ SCHEMA = "crwu.external-data.connector-probe.v3"
43
+ DEFAULT_ROOT_ENV = "CRWU_CONNECTOR_ROOT"
44
+ DEFAULT_ROOT = "~/.workbuddy"
45
+
46
+ IFIND_LABEL = "同花顺 iFinD"
47
+ # 只在宿主已声明的连接器里匹配;id 命中权重高于名称。
48
+ IFIND_ID_KEYS = ("ifind",)
49
+ IFIND_NAME_KEYS = ("ifind", "同花顺")
50
+ TOKEN_AUTH_MODES = ("token", "oauth", "apikey")
51
+
52
+ _SECRET_KEY = re.compile(r"(?i)(authorization|token|secret|password|cookie|api[_-]?key)")
53
+ # 宿主 mcp.json 用带命名空间前缀的 id(connector:ifind-mcp),状态文件用裸 id(ifind-mcp)——
54
+ # 必须归一化,否则会误判为"未启用"。
55
+ _ID_PREFIX = re.compile(r"^(?:connector|custom-mcp):")
56
+ _URL_HOST = re.compile(r"^[a-z][a-z0-9+.-]*://([^/?#]+)")
57
+ _TOKEN_QUERY = re.compile(r"(?i)([?&](?:token|access_token|api_key|apikey|key)=)[^&\s]+")
58
+ CATALOG_REL = "connectors-marketplace/.codebuddy-connector/connectors.json"
59
+
60
+
61
+ def normalize_id(name) -> str:
62
+ """去掉宿主的命名空间前缀,使 `connector:ifind-mcp` 与 `ifind-mcp` 归一到同一连接器。"""
63
+ return _ID_PREFIX.sub("", str(name or "").strip())
64
+
65
+
66
+ def declaration_scope(rel: str) -> str:
67
+ """声明文件所属作用域:`connectors/<账号态>/…` → `connectors/<账号态>`;顶层文件 → ``。"""
68
+ parts = str(rel).split("/")
69
+ if len(parts) >= 2 and parts[0] == "connectors":
70
+ return parts[0] + "/" + parts[1]
71
+ return ""
72
+
73
+
74
+ def redact_url(value: str) -> str:
75
+ """只保留主机名;去掉路径、查询串与任何 token。"""
76
+ if not isinstance(value, str) or not value:
77
+ return ""
78
+ match = _URL_HOST.match(value.strip())
79
+ host = match.group(1) if match else ""
80
+ host = host.rsplit("@", 1)[-1] # 去掉 user:pass@
81
+ return host.split(":", 1)[0]
82
+
83
+
84
+ def redact_text(value: str) -> str:
85
+ return _TOKEN_QUERY.sub(r"\1***", str(value))
86
+
87
+
88
+ def load_json(path: Path):
89
+ try:
90
+ with path.open(encoding="utf-8") as handle:
91
+ return json.load(handle)
92
+ except (OSError, ValueError):
93
+ return None
94
+
95
+
96
+ def _blank_entry(connector_id: str) -> dict:
97
+ return {
98
+ "connectorId": connector_id,
99
+ "displayName": connector_id,
100
+ "declaredAs": [],
101
+ "declaredIn": [],
102
+ "hostDeclared": False,
103
+ "catalogListed": False,
104
+ "endpointHost": "",
105
+ "disabledScopes": {},
106
+ "enabled": None,
107
+ "userDisabled": None,
108
+ "everConnected": None,
109
+ "authMode": None,
110
+ "hasStoredAuthorization": False,
111
+ }
112
+
113
+
114
+ def collect(root: Path):
115
+ """返回 (connectors, declarations, active_scope)。只读键名与状态,不读取任何凭据值。
116
+
117
+ active_scope = 提供 `enabled` 列表的那个账号态目录(优先 connector-states.v3.json);
118
+ 只有该作用域的 disabled / enabled 事实参与判定,避免多账号态互相覆盖。
119
+ """
120
+ connectors: dict[str, dict] = {}
121
+ declarations: list[str] = []
122
+ active_scope = ""
123
+
124
+ def entry_for(connector_id: str) -> dict:
125
+ return connectors.setdefault(connector_id, _blank_entry(connector_id))
126
+
127
+ def note_declaration(connector_id, rel, raw):
128
+ entry = entry_for(normalize_id(connector_id))
129
+ entry["hostDeclared"] = True
130
+ if str(connector_id) not in entry["declaredAs"]:
131
+ entry["declaredAs"].append(str(connector_id))
132
+ if rel not in entry["declaredIn"]:
133
+ entry["declaredIn"].append(rel)
134
+ if isinstance(raw, dict):
135
+ url = raw.get("url") or raw.get("endpoint") or ""
136
+ if url:
137
+ entry["endpointHost"] = redact_url(url)
138
+ if isinstance(raw.get("disabled"), bool):
139
+ # disabled 是**账号态作用域**内的事实:connectors/<态>/mcp.json 与顶层 mcp.json 分开记,
140
+ # 否则另一账号态的 disabled=true 会覆盖当前态。
141
+ entry["disabledScopes"][declaration_scope(rel)] = raw["disabled"]
142
+ for key in raw:
143
+ if _SECRET_KEY.search(str(key)):
144
+ entry["hasStoredAuthorization"] = True
145
+
146
+ # 1) 宿主 MCP 清单(顶层)
147
+ top = root / "mcp.json"
148
+ data = load_json(top)
149
+ if isinstance(data, dict) and isinstance(data.get("mcpServers"), dict):
150
+ declarations.append("mcp.json")
151
+ for name, raw in data["mcpServers"].items():
152
+ note_declaration(str(name), "mcp.json", raw)
153
+
154
+ # 2) 按账号态分目录的声明与状态
155
+ connectors_dir = root / "connectors"
156
+ if connectors_dir.is_dir():
157
+ for child in sorted(p for p in connectors_dir.iterdir() if p.is_dir()):
158
+ manifest = child / "mcp.json"
159
+ data = load_json(manifest)
160
+ if isinstance(data, dict) and isinstance(data.get("mcpServers"), dict):
161
+ rel = str(manifest.relative_to(root))
162
+ declarations.append(rel)
163
+ for name, raw in data["mcpServers"].items():
164
+ note_declaration(str(name), rel, raw)
165
+ for state_name in ("connector-states.v3.json", "connector-states.json"):
166
+ state_path = child / state_name
167
+ state = load_json(state_path)
168
+ if not isinstance(state, dict):
169
+ continue
170
+ rel = str(state_path.relative_to(root))
171
+ if rel not in declarations:
172
+ declarations.append(rel)
173
+ enabled_list = state.get("enabled")
174
+ if active_scope == "" and isinstance(enabled_list, list):
175
+ # 当前生效账号态 = 提供 enabled 列表的那个目录;只认第一个(v3 优先)。
176
+ active_scope = declaration_scope(rel)
177
+ user_disabled = state.get("userDisabled") if isinstance(state.get("userDisabled"), dict) else {}
178
+ ever_list = state.get("everConnected") if isinstance(state.get("everConnected"), list) else []
179
+ overrides = state.get("headerOverrides") if isinstance(state.get("headerOverrides"), dict) else {}
180
+ names = {
181
+ normalize_id(item)
182
+ for item in list(connectors)
183
+ + list(enabled_list or [])
184
+ + list(user_disabled)
185
+ + list(overrides)
186
+ + list(ever_list)
187
+ }
188
+ for name in names:
189
+ entry = entry_for(name)
190
+ if isinstance(enabled_list, list):
191
+ entry["enabled"] = name in enabled_list
192
+ elif name in user_disabled:
193
+ entry["enabled"] = not bool(user_disabled.get(name))
194
+ if name in user_disabled:
195
+ entry["userDisabled"] = bool(user_disabled.get(name))
196
+ if ever_list:
197
+ entry["everConnected"] = name in ever_list
198
+ if name in overrides:
199
+ entry["hasStoredAuthorization"] = True
200
+
201
+ # 3) 连接器市场目录(仅补名称与授权形态,不作为"已声明"依据)
202
+ catalog = load_json(root / CATALOG_REL)
203
+ if catalog is not None:
204
+ declarations.append(CATALOG_REL)
205
+ items = catalog.get("connectors") if isinstance(catalog, dict) else catalog
206
+ if isinstance(items, list):
207
+ for item in items:
208
+ if not isinstance(item, dict):
209
+ continue
210
+ cid = str(item.get("id") or "")
211
+ if not cid:
212
+ continue
213
+ entry = entry_for(cid)
214
+ entry["catalogListed"] = True
215
+ if CATALOG_REL not in entry["declaredIn"]:
216
+ entry["declaredIn"].append(CATALOG_REL)
217
+ entry["displayName"] = str(item.get("name_zh") or item.get("name") or entry["displayName"])
218
+ if item.get("auth_mode"):
219
+ entry["authMode"] = str(item["auth_mode"])
220
+
221
+ for entry in connectors.values():
222
+ if not entry.get("displayName"):
223
+ entry["displayName"] = entry["connectorId"]
224
+ entry["authEvidence"] = _auth_evidence(entry)
225
+ return list(connectors.values()), declarations, active_scope
226
+
227
+
228
+ def _auth_evidence(entry) -> str:
229
+ if entry.get("hasStoredAuthorization"):
230
+ return "stored_authorization"
231
+ if (entry.get("authMode") or "").lower() == "server-side":
232
+ return "server_side"
233
+ if entry.get("everConnected"):
234
+ return "ever_connected"
235
+ return "none"
236
+
237
+
238
+ def match_target(connectors, id_keys, name_keys):
239
+ """只在宿主已声明的连接器里匹配;目录条目仅作后备名称信息。"""
240
+ best, best_score, best_declared = None, 0, False
241
+ for entry in connectors:
242
+ cid = (entry.get("connectorId") or "").lower()
243
+ name = (entry.get("displayName") or "").lower()
244
+ score = 0
245
+ for key in id_keys:
246
+ if key in cid:
247
+ score += 3
248
+ for key in name_keys:
249
+ if key.lower() in name:
250
+ score += 2
251
+ if score == 0:
252
+ continue
253
+ declared = bool(entry.get("hostDeclared"))
254
+ if (declared, score) > (best_declared, best_score):
255
+ best, best_score, best_declared = entry, score, declared
256
+ return best
257
+
258
+
259
+ def scoped_disabled(entry, active_scope: str):
260
+ """取当前账号态作用域的 disabled 事实;当前态没有该键时退回顶层 mcp.json。"""
261
+ scopes = entry.get("disabledScopes") or {}
262
+ if active_scope and active_scope in scopes:
263
+ return scopes[active_scope]
264
+ return scopes.get("")
265
+
266
+
267
+ def classify_connector(entry, active_scope: str = ""):
268
+ """由宿主声明事实推连接器状态;不断言凭据有效性(见模块 docstring 判定口径)。"""
269
+ if entry is None:
270
+ return {"state": "not_declared", "reason": "宿主未声明同花顺 iFinD 连接器"}
271
+ if not entry.get("hostDeclared"):
272
+ return {
273
+ "state": "not_declared",
274
+ "reason": "同花顺 iFinD 仅出现在连接器市场目录中,宿主未声明该连接器",
275
+ }
276
+ if (
277
+ entry.get("userDisabled") is True
278
+ or entry.get("enabled") is False
279
+ or scoped_disabled(entry, active_scope) is True
280
+ ):
281
+ return {"state": "declared_disabled", "reason": "宿主已声明同花顺 iFinD 连接器但未启用"}
282
+ evidence = entry.get("authEvidence")
283
+ if (entry.get("authMode") or "").lower() in TOKEN_AUTH_MODES and evidence == "none":
284
+ return {
285
+ "state": "likely_unauthenticated",
286
+ "reason": "已声明且启用,但未见授权证据且从未连接成功;需在宿主侧完成授权",
287
+ }
288
+ return {
289
+ "state": "available",
290
+ "reason": "已声明且启用" + ("(授权证据:%s)" % evidence if evidence != "none" else ""),
291
+ }
292
+
293
+
294
+ def probe(root: Path) -> dict:
295
+ """探测 WorkBuddy 宿主连接器声明。只接连接器根——不接收、也不推导任何技能根。"""
296
+ root_exists = root.is_dir()
297
+ if root_exists:
298
+ connectors, declarations, active_scope = collect(root)
299
+ entry = match_target(connectors, IFIND_ID_KEYS, IFIND_NAME_KEYS)
300
+ verdict = classify_connector(entry, active_scope)
301
+ else:
302
+ connectors, declarations, active_scope = [], [], ""
303
+ entry = None
304
+ verdict = {"state": "not_declared", "reason": "宿主连接器根目录不存在"}
305
+
306
+ target = {
307
+ "label": IFIND_LABEL,
308
+ "state": verdict["state"],
309
+ "reason": verdict["reason"],
310
+ "accessPath": "host_connector" if verdict["state"] == "available" else "",
311
+ "connectorId": entry.get("connectorId") if entry else None,
312
+ "displayName": entry.get("displayName") if entry else None,
313
+ "enabled": entry.get("enabled") if entry else None,
314
+ "userDisabled": entry.get("userDisabled") if entry else None,
315
+ "everConnected": entry.get("everConnected") if entry else None,
316
+ "authMode": entry.get("authMode") if entry else None,
317
+ "authEvidence": entry.get("authEvidence") if entry else None,
318
+ "endpointHost": entry.get("endpointHost") if entry else None,
319
+ "declaredIn": entry.get("declaredIn") if entry else [],
320
+ "connectorVerdict": verdict,
321
+ }
322
+
323
+ notes = []
324
+ if not root_exists:
325
+ notes.append("宿主连接器根目录不存在:未从宿主侧发现同花顺 iFinD 连接器")
326
+ return {
327
+ "schema": SCHEMA,
328
+ "root": str(root),
329
+ "rootExists": root_exists,
330
+ "activeStateScope": active_scope,
331
+ "declarations": declarations,
332
+ "connectors": connectors,
333
+ "targets": {"ifind": target},
334
+ "notes": notes,
335
+ }
336
+
337
+
338
+ def render_text(result: dict) -> str:
339
+ lines = ["外部数据源探测(只读)· 同花顺 iFinD", "宿主连接器根:" + redact_text(result["root"])]
340
+ if result.get("rootExists"):
341
+ lines.append("声明文件:" + ("、".join(redact_text(d) for d in result["declarations"]) or "无"))
342
+ else:
343
+ lines.append("声明文件:无(宿主连接器根目录不存在)")
344
+ info = result["targets"]["ifind"]
345
+ lines.append("")
346
+ lines.append("状态:%s(取数路径:%s)" % (info.get("state") or "", info.get("accessPath") or "无可用路径"))
347
+ lines.append("说明:%s" % (info.get("reason") or ""))
348
+ for note in result.get("notes") or []:
349
+ lines.append("· " + note)
350
+ lines.append("提示:预检结论只作可用性提示;最终以运行时调用结果为准,失败时按表 D 降级并在交付件中声明。")
351
+ return "\n".join(lines)
352
+
353
+
354
+ def main(argv=None) -> int:
355
+ parser = argparse.ArgumentParser(description="同花顺 iFinD 取数路径只读探测(不读取凭据值)")
356
+ parser.add_argument(
357
+ "--root",
358
+ default=os.environ.get(DEFAULT_ROOT_ENV) or DEFAULT_ROOT,
359
+ help="宿主连接器根目录(默认 $%s 或 %s)" % (DEFAULT_ROOT_ENV, DEFAULT_ROOT),
360
+ )
361
+ parser.add_argument("--format", choices=("json", "text"), default="json")
362
+ args = parser.parse_args(argv)
363
+
364
+ root = Path(os.path.expanduser(args.root))
365
+ result = probe(root)
366
+ if args.format == "text":
367
+ print(render_text(result))
368
+ else:
369
+ print(json.dumps(result, ensure_ascii=False, indent=2))
370
+ return 0 if result["targets"]["ifind"]["state"] == "available" else 2
371
+
372
+
373
+ if __name__ == "__main__":
374
+ sys.exit(main())