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,354 @@
1
+ #!/usr/bin/env python3
2
+ """Create up to 30 Todo tasks, preserve every task ID, and verify each task."""
3
+
4
+ import argparse
5
+ import hashlib
6
+ import json
7
+ import subprocess
8
+ import sys
9
+ from datetime import datetime, timedelta, timezone
10
+ from pathlib import Path
11
+ from typing import Any, Dict, Iterable, List, Optional
12
+
13
+
14
+ TIMEZONE = timezone(timedelta(hours=8), name="Asia/Shanghai")
15
+ MAX_ITEMS = 30
16
+ MAX_FILE_SIZE = 10 * 1024 * 1024
17
+ ALLOWED_PRIORITIES = {10, 20, 30, 40}
18
+ PLAN_DIGEST_DOMAIN = b"dws-todo-batch-plan-v1\x00"
19
+ MIN_EPOCH_MILLISECONDS = 1_000_000_000_000
20
+ MAX_EPOCH_MILLISECONDS = 9_999_999_999_999
21
+
22
+
23
+ class ScriptError(RuntimeError):
24
+ def __init__(self, message: str, *, commit_unknown: bool = False):
25
+ super().__init__(message)
26
+ self.commit_unknown = commit_unknown
27
+
28
+
29
+ def run_dws_json(
30
+ args: List[str], dws: str = "dws", *, write_started: bool = False
31
+ ) -> Dict[str, Any]:
32
+ try:
33
+ result = subprocess.run(
34
+ [dws, *args],
35
+ capture_output=True,
36
+ text=True,
37
+ stdin=subprocess.DEVNULL,
38
+ timeout=120,
39
+ )
40
+ except subprocess.TimeoutExpired as exc:
41
+ raise ScriptError("dws timed out", commit_unknown=write_started) from exc
42
+ except FileNotFoundError as exc:
43
+ raise ScriptError(str(exc), commit_unknown=False) from exc
44
+
45
+ payload: Optional[Dict[str, Any]] = None
46
+ if result.stdout.strip():
47
+ try:
48
+ decoded = json.loads(result.stdout)
49
+ if isinstance(decoded, dict):
50
+ payload = decoded
51
+ except json.JSONDecodeError:
52
+ payload = None
53
+
54
+ if result.returncode != 0:
55
+ error = payload.get("error", {}) if payload else {}
56
+ started = error.get("execution_started") if isinstance(error, dict) else None
57
+ message = ""
58
+ if isinstance(error, dict):
59
+ message = str(error.get("message") or error.get("hint") or "")
60
+ message = message or result.stderr.strip() or f"dws exited {result.returncode}"
61
+ raise ScriptError(
62
+ message,
63
+ commit_unknown=write_started and started is not False,
64
+ )
65
+ if payload is None:
66
+ raise ScriptError("dws returned non-object or invalid JSON", commit_unknown=write_started)
67
+ if payload.get("ok") is False or payload.get("success") is False:
68
+ error = payload.get("error", {})
69
+ started = error.get("execution_started") if isinstance(error, dict) else None
70
+ message = str(error.get("message") if isinstance(error, dict) else payload)
71
+ raise ScriptError(message, commit_unknown=write_started and started is not False)
72
+ if payload.get("outcome") == "pending":
73
+ raise ScriptError("create outcome is pending", commit_unknown=write_started)
74
+ return payload
75
+
76
+
77
+ def response_objects(value: Dict[str, Any], depth: int = 0) -> Iterable[Dict[str, Any]]:
78
+ if depth > 4:
79
+ return
80
+ yield value
81
+ for key in ("result", "data"):
82
+ child = value.get(key)
83
+ if isinstance(child, dict):
84
+ yield from response_objects(child, depth + 1)
85
+
86
+
87
+ def first_string(payload: Dict[str, Any], keys: Iterable[str]) -> str:
88
+ for obj in response_objects(payload):
89
+ for key in keys:
90
+ value = obj.get(key)
91
+ if isinstance(value, str) and value.strip():
92
+ return value.strip()
93
+ return ""
94
+
95
+
96
+ def require_todo_detail(payload: Dict[str, Any]) -> Dict[str, Any]:
97
+ for obj in response_objects(payload):
98
+ for key in ("todoDetailModel", "todo", "task"):
99
+ if key not in obj:
100
+ continue
101
+ detail = obj[key]
102
+ if not isinstance(detail, dict):
103
+ raise ScriptError(f"readback {key} is not an object")
104
+ return detail
105
+ raise ScriptError("readback response did not contain a Todo detail object")
106
+
107
+
108
+ def normalize_due(value: Any) -> Optional[str]:
109
+ if value in (None, ""):
110
+ return None
111
+ raw = str(value).strip()
112
+ if raw.isdigit():
113
+ milliseconds = int(raw)
114
+ if not MIN_EPOCH_MILLISECONDS <= milliseconds <= MAX_EPOCH_MILLISECONDS:
115
+ raise ScriptError(
116
+ "epoch-millisecond due time must be a 13-digit value "
117
+ f"between {MIN_EPOCH_MILLISECONDS} and {MAX_EPOCH_MILLISECONDS}: "
118
+ f"{raw}"
119
+ )
120
+ try:
121
+ return datetime.fromtimestamp(milliseconds / 1000, TIMEZONE).isoformat()
122
+ except (OSError, OverflowError, ValueError) as exc:
123
+ raise ScriptError(f"invalid epoch-millisecond due time: {raw}") from exc
124
+ if len(raw) == 10:
125
+ try:
126
+ day = datetime.strptime(raw, "%Y-%m-%d").replace(
127
+ hour=23, minute=59, second=59, tzinfo=TIMEZONE
128
+ )
129
+ return day.isoformat()
130
+ except ValueError as exc:
131
+ raise ScriptError(f"invalid due date: {raw}") from exc
132
+ try:
133
+ parsed = datetime.fromisoformat(raw.replace("Z", "+00:00"))
134
+ except ValueError as exc:
135
+ raise ScriptError(
136
+ f"due must be YYYY-MM-DD, epoch milliseconds, or ISO-8601: {raw}"
137
+ ) from exc
138
+ if parsed.tzinfo is None:
139
+ raise ScriptError(f"ISO due time must include a timezone: {raw}")
140
+ return parsed.isoformat()
141
+
142
+
143
+ def validate(items: Any) -> List[Dict[str, Any]]:
144
+ if not isinstance(items, list) or not items:
145
+ raise ScriptError("input must be a non-empty JSON array")
146
+ if len(items) > MAX_ITEMS:
147
+ raise ScriptError(f"a batch may contain at most {MAX_ITEMS} tasks")
148
+ validated: List[Dict[str, Any]] = []
149
+ for index, item in enumerate(items, 1):
150
+ if not isinstance(item, dict):
151
+ raise ScriptError(f"item {index} must be an object")
152
+ title = str(item.get("title") or "").strip()
153
+ executors = str(item.get("executors") or "").strip()
154
+ if not title or not executors:
155
+ raise ScriptError(f"item {index} requires non-empty title and executors")
156
+ priority = item.get("priority")
157
+ if priority is not None:
158
+ try:
159
+ priority = int(priority)
160
+ except (TypeError, ValueError) as exc:
161
+ raise ScriptError(f"item {index} has invalid priority") from exc
162
+ if priority not in ALLOWED_PRIORITIES:
163
+ raise ScriptError(
164
+ f"item {index} priority must be one of {sorted(ALLOWED_PRIORITIES)}"
165
+ )
166
+ due = normalize_due(item.get("due"))
167
+ recurrence = item.get("recurrence")
168
+ if recurrence and not due:
169
+ raise ScriptError(f"item {index} recurrence requires due")
170
+ validated.append(
171
+ {
172
+ "title": title,
173
+ "executors": executors,
174
+ "priority": priority,
175
+ "due": due,
176
+ "recurrence": (
177
+ str(recurrence).replace("\\n", "\n") if recurrence else None
178
+ ),
179
+ }
180
+ )
181
+ return validated
182
+
183
+
184
+ def batch_plan_digest(items: List[Dict[str, Any]]) -> str:
185
+ canonical = json.dumps(
186
+ items,
187
+ ensure_ascii=False,
188
+ sort_keys=True,
189
+ separators=(",", ":"),
190
+ allow_nan=False,
191
+ ).encode("utf-8")
192
+ digest = hashlib.sha256(PLAN_DIGEST_DOMAIN + canonical).hexdigest()
193
+ return f"sha256:{digest}"
194
+
195
+
196
+ def run(argv: Optional[List[str]] = None) -> int:
197
+ parser = argparse.ArgumentParser(description=__doc__)
198
+ parser.add_argument("input", type=Path)
199
+ parser.add_argument("--dws", default="dws")
200
+ parser.add_argument("--dry-run", action="store_true")
201
+ parser.add_argument(
202
+ "--yes",
203
+ action="store_true",
204
+ help="confirm execution of the exact validated batch after user approval",
205
+ )
206
+ parser.add_argument(
207
+ "--confirm-digest",
208
+ help="planDigest from the user-approved dry-run output",
209
+ )
210
+ args = parser.parse_args(argv)
211
+
212
+ try:
213
+ if not args.input.is_file():
214
+ raise ScriptError(f"input file not found: {args.input}")
215
+ if args.input.stat().st_size > MAX_FILE_SIZE:
216
+ raise ScriptError(f"input exceeds {MAX_FILE_SIZE} bytes")
217
+ items = validate(json.loads(args.input.read_text(encoding="utf-8")))
218
+ except (OSError, json.JSONDecodeError, ScriptError) as exc:
219
+ print(json.dumps({"complete": False, "error": str(exc)}, ensure_ascii=False))
220
+ return 2
221
+
222
+ plan_digest = batch_plan_digest(items)
223
+ if not args.dry_run and (not args.yes or not args.confirm_digest):
224
+ print(
225
+ json.dumps(
226
+ {
227
+ "complete": False,
228
+ "dryRun": False,
229
+ "reason": "confirmation_required",
230
+ "executionStarted": False,
231
+ "error": (
232
+ "preview the exact batch with --dry-run; after the user "
233
+ "confirms that planDigest, rerun with --yes and "
234
+ "--confirm-digest <planDigest>"
235
+ ),
236
+ },
237
+ ensure_ascii=False,
238
+ )
239
+ )
240
+ return 2
241
+ if not args.dry_run and args.confirm_digest != plan_digest:
242
+ print(
243
+ json.dumps(
244
+ {
245
+ "complete": False,
246
+ "dryRun": False,
247
+ "reason": "plan_mismatch",
248
+ "executionStarted": False,
249
+ "confirmedPlanDigest": args.confirm_digest,
250
+ "actualPlanDigest": plan_digest,
251
+ "error": (
252
+ "the validated batch differs from the confirmed dry-run; "
253
+ "preview again and obtain confirmation for the new planDigest"
254
+ ),
255
+ },
256
+ ensure_ascii=False,
257
+ )
258
+ )
259
+ return 2
260
+
261
+ ledger: List[Dict[str, Any]] = []
262
+ for item in items:
263
+ create = [
264
+ "todo",
265
+ "task",
266
+ "create",
267
+ "--title",
268
+ item["title"],
269
+ "--executors",
270
+ item["executors"],
271
+ ]
272
+ if item["priority"] is not None:
273
+ create.extend(["--priority", str(item["priority"])])
274
+ if item["due"]:
275
+ create.extend(["--due", item["due"]])
276
+ if item["recurrence"]:
277
+ create.extend(["--recurrence", item["recurrence"]])
278
+ create.extend(["--format", "json"])
279
+ if args.dry_run:
280
+ ledger.append({"title": item["title"], "command": [args.dws, *create]})
281
+ continue
282
+
283
+ # The script-level confirmation covers this exact validated batch. Pass the
284
+ # Runtime bypass only to the writes; readback remains an ordinary read.
285
+ create.append("--yes")
286
+
287
+ entry: Dict[str, Any] = {"title": item["title"], "status": "unknown"}
288
+ try:
289
+ created = run_dws_json(create, args.dws, write_started=True)
290
+ identifier = first_string(created, ("taskId", "todoTaskId"))
291
+ if not identifier:
292
+ raise ScriptError(
293
+ "create response did not contain a stable taskId",
294
+ commit_unknown=True,
295
+ )
296
+ entry["taskId"] = identifier
297
+ try:
298
+ detail = run_dws_json(
299
+ [
300
+ "todo",
301
+ "task",
302
+ "get",
303
+ "--task-id",
304
+ identifier,
305
+ "--format",
306
+ "json",
307
+ ],
308
+ args.dws,
309
+ )
310
+ detail_object = require_todo_detail(detail)
311
+ actual_identifier = first_string(
312
+ detail_object, ("taskId", "todoTaskId")
313
+ )
314
+ if actual_identifier != identifier:
315
+ raise ScriptError(
316
+ f"readback taskId mismatch: expected {identifier!r}, "
317
+ f"got {actual_identifier!r}"
318
+ )
319
+ actual_title = first_string(detail_object, ("subject", "title"))
320
+ if actual_title != item["title"]:
321
+ raise ScriptError(
322
+ f"readback title mismatch: expected {item['title']!r}, "
323
+ f"got {actual_title!r}"
324
+ )
325
+ entry["status"] = "verified"
326
+ except ScriptError as exc:
327
+ entry.update({"status": "unverified", "error": str(exc)})
328
+ except ScriptError as exc:
329
+ entry.update(
330
+ {
331
+ "status": "unknown" if exc.commit_unknown else "failed",
332
+ "error": str(exc),
333
+ }
334
+ )
335
+ ledger.append(entry)
336
+
337
+ complete = args.dry_run or all(item.get("status") == "verified" for item in ledger)
338
+ output = {
339
+ "complete": complete,
340
+ "dryRun": args.dry_run,
341
+ "planDigest": plan_digest,
342
+ "requestedCount": len(items),
343
+ "verifiedCount": sum(item.get("status") == "verified" for item in ledger),
344
+ "failedCount": sum(item.get("status") == "failed" for item in ledger),
345
+ "unverifiedCount": sum(item.get("status") == "unverified" for item in ledger),
346
+ "unknownCount": sum(item.get("status") == "unknown" for item in ledger),
347
+ "ledger": ledger,
348
+ }
349
+ print(json.dumps(output, ensure_ascii=False, indent=2))
350
+ return 0 if complete else 2
351
+
352
+
353
+ if __name__ == "__main__":
354
+ sys.exit(run())
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env python3
2
+ """Return open Todo tasks due today, tomorrow, or this week."""
3
+
4
+ import argparse
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ from datetime import datetime, timedelta, timezone
9
+ from typing import Any, Dict, List, Optional, Tuple
10
+
11
+
12
+ TIMEZONE = timezone(timedelta(hours=8), name="Asia/Shanghai")
13
+ MAX_PAGES = 40
14
+
15
+
16
+ class ScriptError(RuntimeError):
17
+ pass
18
+
19
+
20
+ def run_dws_json(args: List[str], dws: str = "dws") -> Dict[str, Any]:
21
+ try:
22
+ result = subprocess.run(
23
+ [dws, *args], capture_output=True, text=True, timeout=120
24
+ )
25
+ except (subprocess.TimeoutExpired, FileNotFoundError) as exc:
26
+ raise ScriptError(str(exc)) from exc
27
+ if result.returncode != 0:
28
+ raise ScriptError(result.stderr.strip() or f"dws exited {result.returncode}")
29
+ try:
30
+ payload = json.loads(result.stdout)
31
+ except json.JSONDecodeError as exc:
32
+ raise ScriptError("dws returned non-JSON output") from exc
33
+ if not isinstance(payload, dict):
34
+ raise ScriptError("dws returned a non-object JSON payload")
35
+ if payload.get("ok") is False or payload.get("success") is False:
36
+ error = payload.get("error", {})
37
+ raise ScriptError(str(error.get("message") if isinstance(error, dict) else payload))
38
+ return payload
39
+
40
+
41
+ def date_range(scope: str, now: Optional[datetime] = None) -> Tuple[datetime, datetime]:
42
+ current = now.astimezone(TIMEZONE) if now else datetime.now(TIMEZONE)
43
+ today = current.replace(hour=0, minute=0, second=0, microsecond=0)
44
+ if scope == "today":
45
+ return today, today + timedelta(days=1)
46
+ if scope == "tomorrow":
47
+ start = today + timedelta(days=1)
48
+ return start, start + timedelta(days=1)
49
+ start = today - timedelta(days=today.weekday())
50
+ return start, start + timedelta(days=7)
51
+
52
+
53
+ def extract_cards(payload: Dict[str, Any]) -> List[Dict[str, Any]]:
54
+ data: Any = payload.get("data", payload)
55
+ if not isinstance(data, dict) or data.get("complete") is not True:
56
+ raise ScriptError("Todo traversal did not prove endpoint exhaustion")
57
+ value = data.get("todos")
58
+ if not isinstance(value, list) or not all(isinstance(item, dict) for item in value):
59
+ raise ScriptError("Todo response is missing a valid todos[] collection")
60
+ return value
61
+
62
+
63
+ def due_millis(item: Dict[str, Any]) -> Optional[int]:
64
+ value = item.get("dueTime") or item.get("planFinishDate") or item.get("due")
65
+ if value in (None, ""):
66
+ return None
67
+ try:
68
+ return int(value)
69
+ except (TypeError, ValueError) as exc:
70
+ raise ScriptError(f"invalid due time for task {task_id(item)!r}: {value!r}") from exc
71
+
72
+
73
+ def task_id(item: Dict[str, Any]) -> str:
74
+ value = item.get("taskId") or item.get("id") or item.get("todoTaskId")
75
+ return value.strip() if isinstance(value, str) else ""
76
+
77
+
78
+ def run(argv: Optional[List[str]] = None) -> int:
79
+ parser = argparse.ArgumentParser(description=__doc__)
80
+ parser.add_argument(
81
+ "scope", nargs="?", choices=("today", "tomorrow", "week"), default="today"
82
+ )
83
+ parser.add_argument("--dws", default="dws")
84
+ parser.add_argument("--dry-run", action="store_true")
85
+ args = parser.parse_args(argv)
86
+
87
+ start, end = date_range(args.scope)
88
+ start_ms, end_ms = int(start.timestamp() * 1000), int(end.timestamp() * 1000)
89
+ command = [
90
+ "todo",
91
+ "+get-my-tasks",
92
+ "--status",
93
+ "false",
94
+ "--plan-finish-start",
95
+ str(start_ms),
96
+ "--plan-finish-end",
97
+ str(end_ms),
98
+ "--all",
99
+ "--max-pages",
100
+ str(MAX_PAGES),
101
+ "--format",
102
+ "json",
103
+ ]
104
+ if args.dry_run:
105
+ print(json.dumps({"command": [args.dws, *command]}, ensure_ascii=False))
106
+ return 0
107
+
108
+ try:
109
+ cards = extract_cards(run_dws_json(command, args.dws))
110
+ selected = []
111
+ for item in cards:
112
+ due = due_millis(item)
113
+ if due is None or due < start_ms or due >= end_ms:
114
+ continue
115
+ identifier = task_id(item)
116
+ if not identifier:
117
+ raise ScriptError("Todo item is missing a stable taskId")
118
+ selected.append(
119
+ {
120
+ "taskId": identifier,
121
+ "title": item.get("subject") or item.get("title") or "",
122
+ "priority": item.get("priority"),
123
+ "dueTime": due,
124
+ "dueTimeISO": datetime.fromtimestamp(
125
+ due / 1000, TIMEZONE
126
+ ).isoformat(),
127
+ }
128
+ )
129
+ print(
130
+ json.dumps(
131
+ {
132
+ "complete": True,
133
+ "scope": args.scope,
134
+ "timezone": str(TIMEZONE),
135
+ "range": {
136
+ "start": start.isoformat(),
137
+ "endExclusive": end.isoformat(),
138
+ },
139
+ "count": len(selected),
140
+ "todos": selected,
141
+ },
142
+ ensure_ascii=False,
143
+ indent=2,
144
+ )
145
+ )
146
+ return 0
147
+ except ScriptError as exc:
148
+ print(json.dumps({"complete": False, "error": str(exc)}, ensure_ascii=False))
149
+ return 2
150
+
151
+
152
+ if __name__ == "__main__":
153
+ sys.exit(run())
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env python3
2
+ """Return overdue open Todo tasks through the bounded Todo Shortcut."""
3
+
4
+ import argparse
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ from datetime import datetime, timedelta, timezone
9
+ from typing import Any, Dict, List, Optional
10
+
11
+
12
+ TIMEZONE = timezone(timedelta(hours=8), name="Asia/Shanghai")
13
+
14
+
15
+ class ScriptError(RuntimeError):
16
+ pass
17
+
18
+
19
+ def run_dws_json(args: List[str], dws: str = "dws") -> Dict[str, Any]:
20
+ try:
21
+ result = subprocess.run(
22
+ [dws, *args], capture_output=True, text=True, timeout=120
23
+ )
24
+ except (subprocess.TimeoutExpired, FileNotFoundError) as exc:
25
+ raise ScriptError(str(exc)) from exc
26
+ if result.returncode != 0:
27
+ raise ScriptError(result.stderr.strip() or f"dws exited {result.returncode}")
28
+ try:
29
+ payload = json.loads(result.stdout)
30
+ except json.JSONDecodeError as exc:
31
+ raise ScriptError("dws returned non-JSON output") from exc
32
+ if not isinstance(payload, dict):
33
+ raise ScriptError("dws returned a non-object JSON payload")
34
+ if payload.get("ok") is False or payload.get("success") is False:
35
+ error = payload.get("error", {})
36
+ raise ScriptError(str(error.get("message") if isinstance(error, dict) else payload))
37
+ return payload
38
+
39
+
40
+ def extract_overdue(payload: Dict[str, Any]) -> List[Dict[str, Any]]:
41
+ data: Any = payload.get("data", payload)
42
+ value = data.get("overdue") if isinstance(data, dict) else None
43
+ if not isinstance(value, list) or not all(isinstance(item, dict) for item in value):
44
+ raise ScriptError("Todo response is missing a valid overdue[] collection")
45
+ return value
46
+
47
+
48
+ def run(argv: Optional[List[str]] = None) -> int:
49
+ parser = argparse.ArgumentParser(description=__doc__)
50
+ parser.add_argument("--dws", default="dws")
51
+ parser.add_argument("--dry-run", action="store_true")
52
+ args = parser.parse_args(argv)
53
+ command = ["todo", "+overdue", "--format", "json"]
54
+ if args.dry_run:
55
+ print(json.dumps({"command": [args.dws, *command]}, ensure_ascii=False))
56
+ return 0
57
+
58
+ try:
59
+ now = datetime.now(TIMEZONE)
60
+ items = []
61
+ for item in extract_overdue(run_dws_json(command, args.dws)):
62
+ task = item.get("taskId")
63
+ due = item.get("dueTime")
64
+ if not isinstance(task, str) or not task.strip() or due in (None, ""):
65
+ raise ScriptError("overdue item is missing taskId or dueTime")
66
+ try:
67
+ due_ms = int(due)
68
+ due_at = datetime.fromtimestamp(due_ms / 1000, TIMEZONE)
69
+ except (OSError, TypeError, ValueError) as exc:
70
+ raise ScriptError(f"invalid overdue dueTime: {due!r}") from exc
71
+ items.append(
72
+ {
73
+ "taskId": task.strip(),
74
+ "title": item.get("subject") or item.get("title") or "",
75
+ "dueTime": due_ms,
76
+ "dueTimeISO": due_at.isoformat(),
77
+ "daysOverdue": max(0, (now.date() - due_at.date()).days),
78
+ }
79
+ )
80
+ items.sort(key=lambda item: item["dueTime"])
81
+ print(
82
+ json.dumps(
83
+ {
84
+ "complete": True,
85
+ "timezone": str(TIMEZONE),
86
+ "checkedAt": now.isoformat(),
87
+ "count": len(items),
88
+ "todos": items,
89
+ },
90
+ ensure_ascii=False,
91
+ indent=2,
92
+ )
93
+ )
94
+ return 0
95
+ except ScriptError as exc:
96
+ print(json.dumps({"complete": False, "error": str(exc)}, ensure_ascii=False))
97
+ return 2
98
+
99
+
100
+ if __name__ == "__main__":
101
+ sys.exit(run())