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,333 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 从 CSV / JSON 批量导入记录到钉钉 AI 表格(新版 schema)
4
+
5
+ 用法:
6
+ python import_records.py <baseId> <tableId> data.csv [batch_size]
7
+ python import_records.py <baseId> <tableId> data.json [batch_size]
8
+
9
+ 说明:
10
+ - CSV 表头默认视为 fieldId
11
+ - JSON 支持两种格式:
12
+ 1. [{"cells": {"fldxxx": "value"}}, ...]
13
+ 2. [{"fldxxx": "value"}, ...] # 会自动包装成 cells
14
+
15
+ ⚠️ CSV 自动类型转换风险:
16
+ CSV 读入的所有 cell 都是 string,本脚本会尝试自动识别 'true'/'false'/数字
17
+ 并转成对应类型(避免 text 字段塞入纯文本数字)。但当 fieldId 对应的字段是
18
+ text / telephone / idCard / barcode 这类"字符串形数字"字段时,自动转 int / float
19
+ 会让 server 拒绝(字段类型不匹配)。这种情况建议改用 JSON 格式(自己显式控制类型),
20
+ 或在 CSV 写入前给字段值前缀加引号 / 改为非纯数字。
21
+ """
22
+
23
+ import sys
24
+ import csv
25
+ import json
26
+ import subprocess
27
+ import os
28
+ import re
29
+ from pathlib import Path
30
+ from typing import Union, List, Dict, Any, Optional, Tuple
31
+
32
+ JsonData = Union[List[Any], Dict[str, Any]]
33
+ RecordDict = Dict[str, str]
34
+
35
+ MAX_FILE_SIZE = 50 * 1024 * 1024
36
+ ALLOWED_CSV_EXTENSIONS = ['.csv']
37
+ ALLOWED_JSON_EXTENSIONS = ['.json']
38
+ RESOURCE_ID_PATTERN = re.compile(r'^[A-Za-z0-9_-]{8,128}$')
39
+ MAX_RECORDS_PER_BATCH = 100
40
+ DEFAULT_BATCH_SIZE = 50
41
+
42
+
43
+ def resolve_safe_path(
44
+ path: str, allowed_root: Optional[str] = None
45
+ ) -> Path:
46
+ if allowed_root is None:
47
+ allowed_root = os.environ.get('OPENCLAW_WORKSPACE', os.getcwd())
48
+ allowed_root = Path(allowed_root).resolve()
49
+ target_path = (
50
+ Path(path).resolve()
51
+ if Path(path).is_absolute()
52
+ else (Path.cwd() / path).resolve()
53
+ )
54
+ try:
55
+ target_path.relative_to(allowed_root)
56
+ return target_path
57
+ except ValueError:
58
+ raise ValueError(
59
+ f"路径超出允许范围:{path}\n"
60
+ f"目标路径:{target_path}\n"
61
+ f"允许根目录:{allowed_root}\n"
62
+ f"提示:设置 OPENCLAW_WORKSPACE 环境变量或确保文件在工作目录内"
63
+ )
64
+
65
+
66
+ def validate_resource_id(resource_id: str) -> bool:
67
+ return bool(
68
+ resource_id and RESOURCE_ID_PATTERN.match(resource_id.strip())
69
+ )
70
+
71
+
72
+ def validate_file_extension(
73
+ filename: str, allowed_extensions: list
74
+ ) -> bool:
75
+ return any(filename.lower().endswith(ext) for ext in allowed_extensions)
76
+
77
+
78
+ def safe_csv_load(
79
+ file_path: Path, max_size: int = MAX_FILE_SIZE
80
+ ) -> List[RecordDict]:
81
+ file_size = file_path.stat().st_size
82
+ if file_size > max_size:
83
+ raise ValueError(
84
+ f"文件过大:{file_size:,} 字节 (限制:{max_size:,} 字节)"
85
+ )
86
+ with open(file_path, 'r', encoding='utf-8', newline='') as f:
87
+ return list(csv.DictReader(f))
88
+
89
+
90
+ def safe_json_load(
91
+ file_path: Path, max_size: int = MAX_FILE_SIZE
92
+ ) -> JsonData:
93
+ file_size = file_path.stat().st_size
94
+ if file_size > max_size:
95
+ raise ValueError(
96
+ f"文件过大:{file_size:,} 字节 (限制:{max_size:,} 字节)"
97
+ )
98
+ with open(file_path, 'r', encoding='utf-8') as f:
99
+ return json.load(f)
100
+
101
+
102
+ def sanitize_record_value(
103
+ value: Any,
104
+ ) -> Optional[Union[str, int, float, bool, list, dict]]:
105
+ if value is None:
106
+ return None
107
+ if isinstance(value, (bool, int, float, list, dict)):
108
+ return value
109
+ if not isinstance(value, str):
110
+ return value
111
+ if not value.strip():
112
+ return None
113
+
114
+ value = value.strip()
115
+ if value.lower() == 'true':
116
+ return True
117
+ if value.lower() == 'false':
118
+ return False
119
+
120
+ try:
121
+ if '.' in value:
122
+ return float(value)
123
+ return int(value)
124
+ except ValueError:
125
+ return value
126
+
127
+
128
+ def normalize_record(record: Dict[str, Any]) -> Dict[str, Any]:
129
+ if 'cells' in record and isinstance(record['cells'], dict):
130
+ cells = record['cells']
131
+ else:
132
+ cells = record
133
+ normalized = {}
134
+ for key, value in cells.items():
135
+ sanitized = sanitize_record_value(value)
136
+ if sanitized is not None:
137
+ normalized[key] = sanitized
138
+ return {'cells': normalized}
139
+
140
+
141
+ def validate_record(record: Dict[str, Any]) -> Tuple[bool, str]:
142
+ if not isinstance(record, dict):
143
+ return False, '记录必须是对象'
144
+ normalized = normalize_record(record)
145
+ cells = normalized.get('cells', {})
146
+ if not cells or not isinstance(cells, dict):
147
+ return False, '记录必须包含非空 cells 对象'
148
+ return True, ''
149
+
150
+
151
+ def run_dws(args: List[str]) -> Optional[Dict[str, Any]]:
152
+ if not args:
153
+ print('错误:空命令')
154
+ return None
155
+ cmd = ['dws'] + args
156
+ try:
157
+ result = subprocess.run(
158
+ cmd, capture_output=True, text=True, timeout=120
159
+ )
160
+ if result.returncode != 0:
161
+ print(f"错误:{result.stderr.strip()}")
162
+ return None
163
+ try:
164
+ return json.loads(result.stdout)
165
+ except json.JSONDecodeError as e:
166
+ print(f"无法解析响应:{result.stdout[:200]}...")
167
+ print(f"JSON 解析错误:{e}")
168
+ return None
169
+ except subprocess.TimeoutExpired:
170
+ print('错误:命令执行超时(120 秒)')
171
+ return None
172
+ except FileNotFoundError:
173
+ print('错误:未找到 dws 命令,请确认已安装')
174
+ return None
175
+
176
+
177
+ def import_from_csv(
178
+ base_id: str, table_id: str, csv_file: str,
179
+ batch_size: int = DEFAULT_BATCH_SIZE,
180
+ ) -> bool:
181
+ try:
182
+ safe_path = resolve_safe_path(csv_file)
183
+ except ValueError as e:
184
+ print(f"路径验证失败:{e}")
185
+ return False
186
+
187
+ if not validate_file_extension(csv_file, ALLOWED_CSV_EXTENSIONS):
188
+ print(f"错误:只允许 {', '.join(ALLOWED_CSV_EXTENSIONS)} 文件")
189
+ return False
190
+ if not safe_path.exists():
191
+ print(f"错误:文件不存在:{safe_path}")
192
+ return False
193
+
194
+ try:
195
+ rows = safe_csv_load(safe_path)
196
+ except ValueError as e:
197
+ print(f"错误:{e}")
198
+ return False
199
+ except csv.Error as e:
200
+ print(f"错误:CSV 格式无效:{e}")
201
+ return False
202
+
203
+ if not rows:
204
+ print('错误:CSV 文件为空或没有有效数据行')
205
+ return False
206
+
207
+ records = [
208
+ normalize_record(row)
209
+ for row in rows
210
+ if normalize_record(row)['cells']
211
+ ]
212
+ return import_records(base_id, table_id, records, batch_size)
213
+
214
+
215
+ def import_from_json(
216
+ base_id: str, table_id: str, json_file: str,
217
+ batch_size: int = DEFAULT_BATCH_SIZE,
218
+ ) -> bool:
219
+ try:
220
+ safe_path = resolve_safe_path(json_file)
221
+ except ValueError as e:
222
+ print(f"路径验证失败:{e}")
223
+ return False
224
+
225
+ if not validate_file_extension(json_file, ALLOWED_JSON_EXTENSIONS):
226
+ print(f"错误:只允许 {', '.join(ALLOWED_JSON_EXTENSIONS)} 文件")
227
+ return False
228
+ if not safe_path.exists():
229
+ print(f"错误:文件不存在:{safe_path}")
230
+ return False
231
+
232
+ try:
233
+ records = safe_json_load(safe_path)
234
+ except ValueError as e:
235
+ print(f"错误:{e}")
236
+ return False
237
+ except json.JSONDecodeError as e:
238
+ print(f"错误:JSON 格式无效:{e}")
239
+ return False
240
+
241
+ if not isinstance(records, list) or not records:
242
+ print('错误:JSON 文件必须是非空数组')
243
+ return False
244
+
245
+ for i, record in enumerate(records):
246
+ valid, error = validate_record(record)
247
+ if not valid:
248
+ print(f"错误:记录 #{i+1} 格式无效:{error}")
249
+ return False
250
+
251
+ return import_records(
252
+ base_id, table_id,
253
+ [normalize_record(r) for r in records], batch_size,
254
+ )
255
+
256
+
257
+ def import_records(
258
+ base_id: str, table_id: str,
259
+ records: List[Dict[str, Any]], batch_size: int,
260
+ ) -> bool:
261
+ if batch_size <= 0:
262
+ print('错误:batch_size 必须大于 0')
263
+ return False
264
+ if batch_size > MAX_RECORDS_PER_BATCH:
265
+ batch_size = MAX_RECORDS_PER_BATCH
266
+
267
+ total_batches = (len(records) + batch_size - 1) // batch_size
268
+ success = True
269
+
270
+ for i in range(0, len(records), batch_size):
271
+ batch = records[i:i + batch_size]
272
+ batch_num = (i // batch_size) + 1
273
+ records_json = json.dumps(batch, ensure_ascii=False)
274
+ result = run_dws([
275
+ 'aitable', 'record', 'create',
276
+ '--base-id', base_id,
277
+ '--table-id', table_id,
278
+ '--records', records_json,
279
+ '--format', 'json',
280
+ ])
281
+ if result:
282
+ print(
283
+ f"[{batch_num}/{total_batches}] "
284
+ f"✓ 已提交 {len(batch)} 条记录"
285
+ )
286
+ else:
287
+ print(f"[{batch_num}/{total_batches}] ✗ 导入失败")
288
+ success = False
289
+
290
+ return success
291
+
292
+
293
+ def main():
294
+ if len(sys.argv) < 4 or len(sys.argv) > 5:
295
+ print(__doc__)
296
+ print('用法示例:')
297
+ print(
298
+ ' python import_records.py basexxx tablexxx data.csv 50'
299
+ )
300
+ sys.exit(1)
301
+
302
+ base_id = sys.argv[1]
303
+ table_id = sys.argv[2]
304
+ input_file = sys.argv[3]
305
+ batch_size = (
306
+ int(sys.argv[4]) if len(sys.argv) == 5
307
+ else DEFAULT_BATCH_SIZE
308
+ )
309
+
310
+ if not validate_resource_id(base_id):
311
+ print('错误:无效的 baseId 格式')
312
+ sys.exit(1)
313
+ if not validate_resource_id(table_id):
314
+ print('错误:无效的 tableId 格式')
315
+ sys.exit(1)
316
+
317
+ if input_file.lower().endswith('.csv'):
318
+ success = import_from_csv(
319
+ base_id, table_id, input_file, batch_size
320
+ )
321
+ elif input_file.lower().endswith('.json'):
322
+ success = import_from_json(
323
+ base_id, table_id, input_file, batch_size
324
+ )
325
+ else:
326
+ print('错误:仅支持 .csv 或 .json 文件')
327
+ sys.exit(1)
328
+
329
+ sys.exit(0 if success else 1)
330
+
331
+
332
+ if __name__ == '__main__':
333
+ main()
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 上传附件到钉钉 AI 表格 attachment 字段
4
+
5
+ 完整流程(内部自动执行 3 步):
6
+ 1. dws aitable attachment upload → 获取 uploadUrl + fileToken
7
+ 2. HTTP PUT 上传文件到 OSS
8
+ 3. 返回 fileToken,可直接用于 record create/update
9
+
10
+ 用法:
11
+ python upload_attachment.py <baseId> <filePath>
12
+
13
+ 输出 (JSON):
14
+ { "fileToken": "ft_xxx", "fileName": "report.pdf", "size": 204800 }
15
+
16
+ 然后在 record create/update 中使用:
17
+ dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \
18
+ --records '[{"cells":{"fldAttachId":[{"fileToken":"ft_xxx"}]}}]' --format json
19
+ """
20
+
21
+ import sys
22
+ import json
23
+ import subprocess
24
+ import os
25
+ import mimetypes
26
+ import re
27
+ from pathlib import Path
28
+ from typing import Optional, Dict, Any
29
+ from urllib.request import Request, urlopen
30
+ from urllib.error import HTTPError, URLError
31
+
32
+ RESOURCE_ID_PATTERN = re.compile(r'^[A-Za-z0-9_-]{8,128}$')
33
+ MAX_FILE_SIZE = 100 * 1024 * 1024 # 100MB
34
+
35
+
36
+ def validate_resource_id(resource_id: str) -> bool:
37
+ return bool(resource_id and RESOURCE_ID_PATTERN.match(resource_id.strip()))
38
+
39
+
40
+ def detect_mime_type(file_path: Path) -> str:
41
+ """根据文件扩展名推断 MIME type。"""
42
+ mime_type, _ = mimetypes.guess_type(str(file_path))
43
+ return mime_type or 'application/octet-stream'
44
+
45
+
46
+ def run_dws(args: list) -> Optional[Dict[str, Any]]:
47
+ """调用 dws 命令并返回解析后的 JSON 结果。"""
48
+ cmd = ['dws'] + args
49
+ try:
50
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
51
+ if result.returncode != 0:
52
+ print(f"错误:dws 命令失败: {result.stderr.strip()}", file=sys.stderr)
53
+ return None
54
+ try:
55
+ return json.loads(result.stdout)
56
+ except json.JSONDecodeError:
57
+ print(f"错误:无法解析 dws 响应: {result.stdout[:300]}", file=sys.stderr)
58
+ return None
59
+ except subprocess.TimeoutExpired:
60
+ print('错误:dws 命令超时(60 秒)', file=sys.stderr)
61
+ return None
62
+ except FileNotFoundError:
63
+ print('错误:未找到 dws 命令,请确认已安装并在 PATH 中', file=sys.stderr)
64
+ return None
65
+
66
+
67
+ def upload_to_oss(upload_url: str, file_path: Path, mime_type: str) -> bool:
68
+ """通过 HTTP PUT 上传文件到 OSS。"""
69
+ file_data = file_path.read_bytes()
70
+ req = Request(upload_url, data=file_data, method='PUT')
71
+ req.add_header('Content-Type', mime_type)
72
+
73
+ try:
74
+ with urlopen(req, timeout=120) as resp:
75
+ if resp.status == 200:
76
+ return True
77
+ print(f"错误:OSS 上传失败,HTTP {resp.status}", file=sys.stderr)
78
+ return False
79
+ except HTTPError as e:
80
+ print(f"错误:OSS 上传 HTTP 错误 {e.code}: {e.reason}", file=sys.stderr)
81
+ return False
82
+ except URLError as e:
83
+ print(f"错误:OSS 上传网络错误: {e.reason}", file=sys.stderr)
84
+ return False
85
+
86
+
87
+ def upload_attachment(base_id: str, file_path_str: str) -> Optional[Dict[str, Any]]:
88
+ """
89
+ 执行完整的附件上传流程:
90
+ 1. prepare_attachment_upload → uploadUrl + fileToken
91
+ 2. PUT 文件到 OSS
92
+ 3. 返回 fileToken 信息
93
+ """
94
+ # 验证文件
95
+ file_path = Path(file_path_str).resolve()
96
+ if not file_path.exists():
97
+ print(f"错误:文件不存在: {file_path}", file=sys.stderr)
98
+ return None
99
+ if not file_path.is_file():
100
+ print(f"错误:不是文件: {file_path}", file=sys.stderr)
101
+ return None
102
+
103
+ file_size = file_path.stat().st_size
104
+ if file_size <= 0:
105
+ print("错误:文件为空", file=sys.stderr)
106
+ return None
107
+ if file_size > MAX_FILE_SIZE:
108
+ print(f"错误:文件过大 ({file_size:,} 字节,限制 {MAX_FILE_SIZE:,} 字节)", file=sys.stderr)
109
+ return None
110
+
111
+ file_name = file_path.name
112
+ mime_type = detect_mime_type(file_path)
113
+
114
+ # 步骤 1: prepare_attachment_upload
115
+ print(f"步骤 1/3: 准备上传 {file_name} ({file_size:,} 字节, {mime_type})...", file=sys.stderr)
116
+ dws_args = [
117
+ 'aitable', 'attachment', 'upload',
118
+ '--base-id', base_id,
119
+ '--file-name', file_name,
120
+ '--size', str(file_size),
121
+ '--mime-type', mime_type,
122
+ '--format', 'json',
123
+ ]
124
+ result = run_dws(dws_args)
125
+ if not result:
126
+ return None
127
+
128
+ status = result.get('status', '')
129
+ if status != 'success':
130
+ error = result.get('error', {})
131
+ print(f"错误:准备上传失败: {error.get('message', json.dumps(error, ensure_ascii=False))}", file=sys.stderr)
132
+ return None
133
+
134
+ data = result.get('data', {})
135
+ upload_url = data.get('uploadUrl', '')
136
+ file_token = data.get('fileToken', '')
137
+
138
+ if not upload_url or not file_token:
139
+ print(f"错误:返回数据缺少 uploadUrl 或 fileToken: {json.dumps(data, ensure_ascii=False)}", file=sys.stderr)
140
+ return None
141
+
142
+ # 步骤 2: PUT 文件到 OSS
143
+ print(f"步骤 2/3: 上传文件到 OSS...", file=sys.stderr)
144
+ if not upload_to_oss(upload_url, file_path, mime_type):
145
+ return None
146
+
147
+ # 步骤 3: 返回 fileToken
148
+ print(f"步骤 3/3: 上传完成!", file=sys.stderr)
149
+ output = {
150
+ "fileToken": file_token,
151
+ "fileName": file_name,
152
+ "size": file_size,
153
+ "mimeType": mime_type,
154
+ }
155
+
156
+ return output
157
+
158
+
159
+ def main():
160
+ if len(sys.argv) != 3:
161
+ print(__doc__)
162
+ print('用法:')
163
+ print(' python upload_attachment.py <baseId> <filePath>')
164
+ print()
165
+ print('示例:')
166
+ print(' python upload_attachment.py G1DKw2zgV2bEk6PMSBooNxlEVB5r9YAn ./report.pdf')
167
+ print()
168
+ print('然后在 record create 中使用返回的 fileToken:')
169
+ print(' dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> \\')
170
+ print(' --records \'[{"cells":{"fldAttachId":[{"fileToken":"ft_xxx"}]}}]\' --format json')
171
+ sys.exit(1)
172
+
173
+ base_id = sys.argv[1]
174
+ file_path = sys.argv[2]
175
+
176
+ if not validate_resource_id(base_id):
177
+ print('错误:无效的 baseId 格式', file=sys.stderr)
178
+ sys.exit(1)
179
+
180
+ result = upload_attachment(base_id, file_path)
181
+ if result is None:
182
+ sys.exit(1)
183
+
184
+ # 正常输出到 stdout(JSON 格式,方便解析)
185
+ print(json.dumps(result, ensure_ascii=False, indent=2))
186
+ sys.exit(0)
187
+
188
+
189
+ if __name__ == '__main__':
190
+ main()
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: dingtalk-calendar
3
+ description: 钉钉日历与会议室。Use when 用户说 约会议/查日程/订会议室/查闲忙/加参会人/改期/取消会议/今天的日程/本周日程/共同空闲。不做视频会议发起/邀请入会/会中控制(走 dingtalk-misc)、AI 听记(走 dingtalk-minutes)、待办任务(走 dingtalk-todo)。命令前缀:dws calendar。
4
+ metadata:
5
+ cli_version: ">=0.2.14"
6
+ category: product
7
+ requires:
8
+ bins:
9
+ - dws
10
+ ---
11
+
12
+ # 钉钉日历 Skill
13
+
14
+ ## 前置条件 — 执行操作前必读
15
+
16
+ > **CRITICAL — 执行任何 `dws` 操作前,MUST 先用 Read 工具完整读取 [`dingtalk-shared`](../dingtalk-shared/SKILL.md)。**该轻量文件包含全局执行契约、安全底线及 shared references 的按需加载导航;不要预加载其全部 references。
17
+
18
+ > 常用路径直接按本文件执行,不要预读大而全的 [calendar.md](references/calendar.md)。仅在循环日程、响应邀请、共享/ACL、附件、日历本或低频参数无法由本文件定位时按需读取对应小节;订会议室的范围与失败收束才读取 [03-meeting.md](references/03-meeting.md)。
19
+
20
+ <!-- VISIBLE_SHORTCUTS_START -->
21
+ ## Shortcuts(无专用脚本/recipe 时优先)
22
+
23
+ 以下 shortcut 同时进入公开 catalog 与 Runtime Schema。先按本 skill 的意图表、脚本和 recipe 路由:存在精确覆盖该场景的专用脚本/recipe 时按其执行;否则用户意图命中时,shortcut 优先于手写原子命令。命令已选中时直接执行;只在参数或安全语义不确定时读取 Agent leaf Schema(例如 `dws schema --cli-path "calendar +<shortcut>" --compact --format json`),在当前 Cobra flags 不确定时读取 `dws calendar <shortcut> --help`。只有参数映射、接口绑定或 provenance 审计才省略 `--compact`。仅当现有路由和 reference 都无法定位低频能力时,才用 `dws shortcut list --service calendar --format json` 批量发现。
24
+
25
+ | Shortcut | 风险 | 适用场景 |
26
+ |---|---|---|
27
+ | `dws calendar +agenda` | read | 查询日程列表(不传时间默认查询今天) |
28
+ | `dws calendar +attendee-list` | read | 查看日程参会人 |
29
+ | `dws calendar +book` | write | 创建日程,并可按姓名邀请参会人(自动解析 userId,失败自动回滚删除日程) |
30
+ | `dws calendar +book-list` | read | 查询用户的日历本列表 |
31
+ | `dws calendar +book-search` | read | 按名称模糊搜索日历本 |
32
+ | `dws calendar +cancel-event` | high-risk-write | 取消(删除)一个已有日程(删除前先确认它真实存在) |
33
+ | `dws calendar +conflicts` | read | 检测我某天日程的时间冲突(重叠/双重预订,默认今天) |
34
+ | `dws calendar +free` | read | 按姓名查询某人在指定时间段内的忙闲状态(自动解析 userId) |
35
+ | `dws calendar +free-slots` | read | 找我某天工作时段内的空闲时间段(默认今天 09:00-18:00) |
36
+ | `dws calendar +freebusy` | read | 查询用户 / 会议室闲忙状态(--users 与 --rooms 至少其一) |
37
+ | `dws calendar +invite` | write | 按姓名把参会人加入已有日程(自动解析 userId 后批量添加) |
38
+ | `dws calendar +my-free` | read | 查我自己在某时间段的忙闲(默认今天,无需输入姓名) |
39
+ | `dws calendar +next-event` | read | 查看接下来最近的一个日程(默认扫描未来 7 天) |
40
+ | `dws calendar +reschedule` | write | 改一个已有日程的时间(只动开始/结束时间,其他字段不变) |
41
+ | `dws calendar +room-find` | read | 按时间段搜索可用会议室(不传时间默认当前起 1 小时) |
42
+ | `dws calendar +room-groups` | read | 会议室分组列表 |
43
+ | `dws calendar +room-search` | read | 按名称模糊搜索会议室(不检查可用性) |
44
+ | `dws calendar +suggest-time` | read | 按姓名解析多位参与者,推荐大家都有空的可开会时间段(自动解析 userId) |
45
+ | `dws calendar +today` | read | 列出我今天的日程(自动计算今天的起止时间,无需手动填时间范围) |
46
+ | `dws calendar +tomorrow` | read | 列出我明天的日程(自动计算明天的起止时间,无需手动填时间范围) |
47
+ | `dws calendar +week` | read | 列出我本周的日程(自动按周一为周首计算本周起止时间,无需手动填时间范围) |
48
+ <!-- VISIBLE_SHORTCUTS_END -->
49
+
50
+ ## 意图表
51
+
52
+ | 用户说 | 命令 |
53
+ |--------|------|
54
+ | "今天 / 明天 / 本周日程" | `python scripts/calendar_today_agenda.py [today\|tomorrow\|week]` |
55
+ | "约会议(含参会人 + 会议室)" | 先搜房取 `roomId`,再一次 `event create --attendees <ids> --rooms <roomId>`;复杂降级才用 `calendar_schedule_meeting.py` |
56
+ | "多人共同空闲" | `python scripts/calendar_free_slot_finder.py --users <ids> --date <yyyy-MM-dd>` |
57
+ | "查闲忙" | `dws calendar busy search --users <userIds> --start "<ISO>" --end "<ISO>"` |
58
+ | "加参会人" / "订房" / "取消" | `dws calendar attendee add` / `room add` / `event delete` |
59
+
60
+ ## 常用快路径(省略 Help / Reference)
61
+
62
+ 以下参数已确定时直接执行,**不要**再调用 `--help`、Schema 或读取 `calendar.md`:
63
+
64
+ | 意图 | 直接命令 |
65
+ |---|---|
66
+ | 按姓名推荐共同时间 | `dws calendar +suggest-time --with "姓名1,姓名2" --start "<ISO>" --end "<ISO>" --duration <分钟> --format json` |
67
+ | 按姓名创建会议(无会议室) | `dws calendar +book --title "<主题>" --start "<ISO>" --end "<ISO>" --with "姓名1,姓名2" --format json`;Runtime 要求确认后才精确重放并加 `--yes` |
68
+ | 检查第 N 天冲突 | `dws calendar +conflicts --in-days <N> --format json`(今天 `N=0`) |
69
+ | 查第 N 天空闲窗口 | `dws calendar +free-slots --from <开始小时> --to <结束小时> --in-days <N> --format json` |
70
+ | 搜索空闲会议室 | `dws calendar room search --start "<ISO>" --end "<ISO>" [--group-id <ID>] --available --format json` |
71
+ | 日程详情/参会人 | `dws calendar event get --id <EVENT_ID> --format json` / `dws calendar attendee list --event <EVENT_ID> --format json` |
72
+
73
+ 同一状态下,相同命令和相同参数只调用一次;只有发生写操作、拿到新游标,或首次结果明确不完整时才允许重查。按标题寻找日程时,从最可能且最窄的时间窗开始;一旦得到唯一匹配立即停止,不继续扫描其他月份。
74
+
75
+ ## 标准 SOP(必遵流程)
76
+
77
+ > 命中以下意图**必须**按对应 SOP 顺序执行;**禁止**跳步、替换命令、编造 userId/eventId。每条命令必须带 `--format json`,时间参数**必须**是 ISO-8601(如 `2026-07-03T14:00:00+08:00`)。
78
+
79
+ ### SOP-1 查日程(list-events)
80
+
81
+ **触发**:今天/明天/本周日程/我有什么会/某时段日程。
82
+
83
+ 1. **首选脚本(必须)**:`python scripts/calendar_today_agenda.py today|tomorrow|week`(聚合今日议程)。
84
+ 2. **降级 CLI(必须)**:脚本不可用时 `dws calendar event list --start "<起始ISO>" --end "<结束ISO>" --format json`;不传 `--start/--end` 默认查今天(00:00:00~23:59:59)。返回 `nextCursor` 时必须继续翻页,直到游标为空;不能把“单页成功”当成完整查询。
85
+ 3. **解析(必须)**:取真实 `eventId`、`attendees[]`、`start/end`;按需抽取,**禁止**把整段 JSON 原样贴出。用户要汇总或计数时,在本地完成聚合,只输出各分组计数和必要明细,避免逐条铺满答复导致后半段被截断。
86
+
87
+ **禁止**:用 `event list` 替代闲忙查询(查闲忙走 SOP-3)、编造时间窗口、用非 ISO 时间格式。
88
+
89
+ ### SOP-2 建日程(create-event)
90
+
91
+ **触发**:建日程/约会议/加日程。
92
+
93
+ 1. **解析与会人(必须)**:对每个姓名 `dws aisearch person --query "<姓名>" --dimension name --format json` 取 `userId`,多人逗号拼接。
94
+ 2. **执行(必须)**:`dws calendar event create --title "<主题>" --start "<ISO>" --end "<ISO>" --attendees <userId1,userId2> --format json`(按需加 `--location`/`--desc`/`--rooms`)。
95
+ 3. **验证(按需一次)**:从创建返回 `result.id` 取日程 ID(下游参数语义称 `eventId`)。创建返回已包含用户要求的标题、描述和时段时直接复用,不为“再看一遍”额外 list;只有返回缺字段、用户明确要求回查,或后续状态发生变化时才执行一次 `event get`/窄时间窗 `event list`。
96
+
97
+ **禁止**:跳过与会人 userId 解析直接传姓名、编造会议室 roomId。
98
+
99
+ ### SOP-3 查闲忙(check-busy)
100
+
101
+ **触发**:某人/会议室是否有空/找空闲时段/避免冲突。
102
+
103
+ 1. **解析对象(必须)**:姓名 → `dws aisearch person --query "<姓名>" --dimension name --format json` 取 `userId`;会议室用 `roomId`。
104
+ 2. **收敛时段(必须)**:`--start`/`--end` **必须**由用户给出或明确收敛;时段不明确**必须先追问**,**禁止**默认全天窗口。
105
+ 3. **执行(必须)**:`dws calendar busy search --users <userId1,userId2> --start "<ISO>" --end "<ISO>" --format json`(查会议室换 `--rooms <roomId...>`,可同时传)。**禁止**用 `event list` 扫日程替代闲忙查询。
106
+ 4. **空闲时段(必须)**:找共同空闲用 `python scripts/calendar_free_slot_finder.py`。
107
+
108
+ 若指定窗口内确实没有满足时长的共同空闲,明确给出最长共同空闲窗口并询问是否缩短时长、扩大时间范围或换日期;未经用户确认不得擅自改时间,也不得声称已安排会议。
109
+
110
+ **禁止**:用 `event list` 冒充 `busy search`、未确认时段就默认全天查询。
111
+
112
+ ## 执行硬约束
113
+
114
+ - **先核对诉求,再清理资源**:把用户要求看到的详情、冲突对、参会人、会议室和验证结论先从结构化返回中提取并暂存;即使随后删除临时资源,最终答复仍必须逐项呈现这些结果。工具调用成功不等于已经向用户交付结果。
115
+ - **目标验证必须点名结论**:冲突/忙闲/搜索返回很多记录或输出被截断时,必须按当前 case 的标题、`eventId`、人员或资源 ID 收敛核对;不能只说“运行了检查”。例如冲突任务需明确指出目标 A/B 的重叠起止时间,以及首尾相接是否被排除。
116
+ - **新日程 + 新会议室优先两步完成**:用户从一开始就要求创建日程并订房,且没有依赖已创建 `eventId` 的中间操作时,先 `room search` 取得真实 `roomId`,再用一次 `event create ... --rooms <ROOM_ID>` 完成创建和预订;参会人也可同时用 `--attendees` 带入。只有日程已存在、用户要求先看日程再订房,或一步创建失败时,才使用 `room add`,禁止无故走“create → room add”两次写入。
117
+ - 多轮日程任务必须保留 `eventId`,后续加人、移人、订房、换房、改描述、删除都基于同一个 `eventId` 执行;不要重新创建重复日程。
118
+ - 用户明确说"帮我订一个空闲会议室"时,`room search` 返回可用会议室后直接选择第一个可预订且不需要自定义审批的 `roomId` 执行 `room add`;不要把选择权抛回用户导致任务停住。
119
+ - 已有日程订房:`dws calendar room search --start ... --end ... --format json` → `dws calendar room add --event <EVENT_ID> --rooms <ROOM_ID> --format json` → `event get` 或 `room/busy` 验证。
120
+ - 换会议室:先 `room delete --event <EVENT_ID> --rooms <OLD_ROOM_ID>`,再 `room add --event <EVENT_ID> --rooms <NEW_ROOM_ID>`,最后回查;不要只更新 `--location`。
121
+ - 参会人变化用 `attendee add/delete`,日程描述变化用 `event update --desc`,删除日程用 `event delete --id`。用户当前消息已明确要求删除/取消时可直接执行;否则先确认。
122
+ - **删除终态按需回查一次**:用户明确要求“确认删除/没有残留”时,`event delete` 成功后用原 `eventId`、标题、日历本和原始起止时间做一次窄窗活跃列表核对;普通“办完后取消”以结构化删除成功为终态,不额外 get/list。`event get` 仍可能返回历史对象或墓碑;除非返回里真实存在 `status=cancelled`,不得声称“状态已变为 cancelled”。
123
+ - 脚本失败或参数不完整时,立即降级到明确的 `dws calendar event/attendee/room` 命令,不要停在"我要查看用法"。
124
+ - 所有 dws 命令带 `--format json`;查询时间必须显式 `--start` / `--end`。
125
+
126
+ ## 跨产品协作
127
+
128
+ - 视频会议发起 / 入会链接 / 邀请入会 / 会中控制 → 当前 CLI **不支持**;请在钉钉客户端完成
129
+ - 会后摘要 / 待办 → 切到 `dingtalk-minutes`
130
+ - 参会人按人名 → 先用 `dingtalk-aisearch` 解析
131
+
132
+ ## 注意
133
+
134
+ 普通“给定时段 + 任意空闲会议室”直接走本文件两步快路径;只有用户限定楼宇/楼层/具体会议室、搜索为空或需要放宽范围时,才读取 [03-meeting.md](references/03-meeting.md) 的范围早停与失败门禁。任何路径都禁止假设 `roomId`。
135
+ ## 局部意图与短流程
136
+
137
+ - [局部意图消歧](references/intent-guide.md);[短流程](references/lite-recipes.md)。