weaver-work-cli 0.1.1 → 0.1.4

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 (351) hide show
  1. package/README.md +187 -76
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +160 -55
  7. package/dist/internal/e10/auth/crypto.js +7 -22
  8. package/dist/internal/e10/auth/session.js +1 -1
  9. package/dist/internal/e10/auth/xiaoe.js +268 -0
  10. package/dist/internal/e10/context.js +16 -2
  11. package/dist/internal/e10/index.js +1 -0
  12. package/dist/internal/e10/request-runtime.js +344 -0
  13. package/dist/internal/skills/install.js +48 -6
  14. package/dist/internal/skills/reader.js +27 -0
  15. package/dist/shortcuts/archive/continuation.js +70 -0
  16. package/dist/shortcuts/archive/errors.js +53 -0
  17. package/dist/shortcuts/archive/host.js +197 -0
  18. package/dist/shortcuts/archive/index.js +363 -0
  19. package/dist/shortcuts/archive/manifest.js +45 -0
  20. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  21. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  22. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  23. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  24. package/dist/shortcuts/archive/operations/download.js +238 -0
  25. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  26. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  27. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  28. package/dist/shortcuts/archive/operations/registry.js +43 -0
  29. package/dist/shortcuts/archive/operations/search.js +88 -0
  30. package/dist/shortcuts/archive/operations/shared.js +120 -0
  31. package/dist/shortcuts/archive/operations/types.js +23 -0
  32. package/dist/shortcuts/archive/operations/upload.js +182 -0
  33. package/dist/shortcuts/archive/operations.js +13 -0
  34. package/dist/shortcuts/archive/render/search-format.js +276 -0
  35. package/dist/shortcuts/archive/render/search-view.js +125 -0
  36. package/dist/shortcuts/asset/continuation.js +70 -0
  37. package/dist/shortcuts/asset/errors.js +67 -0
  38. package/dist/shortcuts/asset/host.js +438 -0
  39. package/dist/shortcuts/asset/index.js +255 -0
  40. package/dist/shortcuts/asset/manifest.js +471 -0
  41. package/dist/shortcuts/asset/operations/query.js +249 -0
  42. package/dist/shortcuts/asset/operations/registry.js +85 -0
  43. package/dist/shortcuts/asset/operations/shared.js +100 -0
  44. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  45. package/dist/shortcuts/asset/operations/types.js +1 -0
  46. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  47. package/dist/shortcuts/asset/operations/write.js +435 -0
  48. package/dist/shortcuts/asset/operations.js +9 -0
  49. package/dist/shortcuts/calendar/continuation.js +70 -0
  50. package/dist/shortcuts/calendar/errors.js +53 -0
  51. package/dist/shortcuts/calendar/host.js +148 -0
  52. package/dist/shortcuts/calendar/index.js +125 -0
  53. package/dist/shortcuts/calendar/manifest.js +26 -0
  54. package/dist/shortcuts/calendar/operations/read.js +259 -0
  55. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  56. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  57. package/dist/shortcuts/calendar/operations/types.js +25 -0
  58. package/dist/shortcuts/calendar/operations/write.js +439 -0
  59. package/dist/shortcuts/calendar/operations.js +8 -0
  60. package/dist/shortcuts/ehr/continuation.js +70 -0
  61. package/dist/shortcuts/ehr/errors.js +53 -0
  62. package/dist/shortcuts/ehr/host.js +213 -0
  63. package/dist/shortcuts/ehr/index.js +205 -0
  64. package/dist/shortcuts/ehr/manifest.js +47 -0
  65. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  66. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  67. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  68. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  69. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  70. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  71. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  72. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  73. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  74. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  75. package/dist/shortcuts/ehr/operations/types.js +25 -0
  76. package/dist/shortcuts/ehr/operations.js +25 -0
  77. package/dist/shortcuts/esb/continuation.js +70 -0
  78. package/dist/shortcuts/esb/errors.js +65 -0
  79. package/dist/shortcuts/esb/host.js +187 -0
  80. package/dist/shortcuts/esb/index.js +112 -0
  81. package/dist/shortcuts/esb/manifest.js +91 -0
  82. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  83. package/dist/shortcuts/esb/operations/registry.js +48 -0
  84. package/dist/shortcuts/esb/operations/shared.js +152 -0
  85. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  86. package/dist/shortcuts/esb/operations/types.js +21 -0
  87. package/dist/shortcuts/esb/operations.js +15 -0
  88. package/dist/shortcuts/fna/continuation.js +70 -0
  89. package/dist/shortcuts/fna/errors.js +59 -0
  90. package/dist/shortcuts/fna/host.js +146 -0
  91. package/dist/shortcuts/fna/index.js +111 -0
  92. package/dist/shortcuts/fna/manifest.js +41 -0
  93. package/dist/shortcuts/fna/operations/budget.js +124 -0
  94. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  95. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  96. package/dist/shortcuts/fna/operations/loan.js +195 -0
  97. package/dist/shortcuts/fna/operations/registry.js +35 -0
  98. package/dist/shortcuts/fna/operations/shared.js +210 -0
  99. package/dist/shortcuts/fna/operations/types.js +25 -0
  100. package/dist/shortcuts/fna/operations.js +19 -0
  101. package/dist/shortcuts/hrm/errors.js +38 -0
  102. package/dist/shortcuts/hrm/host.js +156 -0
  103. package/dist/shortcuts/hrm/index.js +111 -0
  104. package/dist/shortcuts/hrm/manifest.js +32 -0
  105. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  106. package/dist/shortcuts/hrm/operations/org.js +110 -0
  107. package/dist/shortcuts/hrm/operations/position.js +176 -0
  108. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  109. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  110. package/dist/shortcuts/hrm/operations/types.js +23 -0
  111. package/dist/shortcuts/hrm/operations.js +19 -0
  112. package/dist/shortcuts/index.js +20 -0
  113. package/dist/shortcuts/invoice/host.js +99 -94
  114. package/dist/shortcuts/invoice/index.js +65 -61
  115. package/dist/shortcuts/invoice/manifest.js +222 -14
  116. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  117. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  118. package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
  119. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  120. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  121. package/dist/shortcuts/invoice/operations/shared.js +271 -6
  122. package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
  123. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  124. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  125. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  126. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  127. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  128. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  131. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  132. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  133. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  134. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  135. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  136. package/dist/shortcuts/mail/continuation.js +70 -0
  137. package/dist/shortcuts/mail/errors.js +53 -0
  138. package/dist/shortcuts/mail/host.js +182 -0
  139. package/dist/shortcuts/mail/index.js +519 -0
  140. package/dist/shortcuts/mail/manifest.js +38 -0
  141. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  142. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  143. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  144. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  145. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  146. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  147. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  148. package/dist/shortcuts/mail/operations/registry.js +41 -0
  149. package/dist/shortcuts/mail/operations/shared.js +64 -0
  150. package/dist/shortcuts/mail/operations/types.js +27 -0
  151. package/dist/shortcuts/mail/operations.js +19 -0
  152. package/dist/shortcuts/plan/continuation.js +70 -0
  153. package/dist/shortcuts/plan/errors.js +70 -0
  154. package/dist/shortcuts/plan/host.js +180 -0
  155. package/dist/shortcuts/plan/index.js +150 -0
  156. package/dist/shortcuts/plan/manifest.js +53 -0
  157. package/dist/shortcuts/plan/operations/link.js +256 -0
  158. package/dist/shortcuts/plan/operations/read.js +259 -0
  159. package/dist/shortcuts/plan/operations/registry.js +33 -0
  160. package/dist/shortcuts/plan/operations/shared.js +246 -0
  161. package/dist/shortcuts/plan/operations/types.js +49 -0
  162. package/dist/shortcuts/plan/operations/version.js +49 -0
  163. package/dist/shortcuts/plan/operations/write.js +710 -0
  164. package/dist/shortcuts/plan/operations.js +8 -0
  165. package/docs/SKILL.md +11 -7
  166. package/docs/_catalog.md +23 -5
  167. package/docs/agent-invoice.md +31 -10
  168. package/docs/agent-skill-install.md +211 -0
  169. package/docs/calendar.md +87 -0
  170. package/docs/e10-auth.md +28 -9
  171. package/docs/ehr.md +186 -0
  172. package/docs/esb.md +64 -0
  173. package/docs/fna.md +72 -0
  174. package/docs/hrm.md +89 -0
  175. package/docs/invoice.md +66 -20
  176. package/docs/jiuchuanhui.md +131 -0
  177. package/docs/operation-manual.md +443 -0
  178. package/docs/plan.md +82 -0
  179. package/docs/wenshuding.md +129 -0
  180. package/docs/ziguanjia.md +89 -0
  181. package/package.json +4 -4
  182. package/scripts/package-skill.mjs +127 -34
  183. package/scripts/postbuild.mjs +13 -0
  184. package/skill-template/business-info.json +13 -2
  185. package/skill-template/domains/calendar.md +15 -0
  186. package/skill-template/domains/esb.md +13 -0
  187. package/skill-template/domains/hrm.md +16 -0
  188. package/skill-template/domains/jiuchuanhui.md +23 -0
  189. package/skill-template/domains/jucailin.md +22 -0
  190. package/skill-template/domains/mail.md +21 -0
  191. package/skill-template/domains/plan.md +17 -0
  192. package/skill-template/domains/qiyecheng.md +17 -0
  193. package/skill-template/domains/shared.md +9 -3
  194. package/skill-template/domains/skill-maker.md +10 -0
  195. package/skill-template/domains/wenshuding.md +22 -0
  196. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  197. package/skill-template/domains/ziguanjia.md +21 -0
  198. package/skill-template/master-skill-template.md +12 -6
  199. package/skill-template/skill-template.md +40 -9
  200. package/skills/weaver-e10-calendar/SKILL.md +101 -0
  201. package/skills/weaver-e10-calendar/product.json +8 -0
  202. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  203. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  204. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  205. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  206. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  207. package/skills/weaver-e10-esb/SKILL.md +102 -0
  208. package/skills/weaver-e10-esb/product.json +8 -0
  209. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  210. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  211. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  212. package/skills/weaver-e10-hrm/SKILL.md +87 -0
  213. package/skills/weaver-e10-hrm/product.json +8 -0
  214. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  215. package/skills/weaver-e10-hrm/references/org.md +95 -0
  216. package/skills/weaver-e10-hrm/references/position.md +95 -0
  217. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  218. package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
  219. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  220. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  221. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  222. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  223. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  224. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  225. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  226. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  227. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  228. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  229. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  230. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  231. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  232. package/skills/weaver-e10-jucailin/SKILL.md +101 -0
  233. package/skills/weaver-e10-jucailin/product.json +8 -0
  234. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  235. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  236. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  237. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  238. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  239. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  240. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  241. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  242. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  243. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  244. package/skills/weaver-e10-mail/SKILL.md +151 -0
  245. package/skills/weaver-e10-mail/product.json +8 -0
  246. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  247. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  248. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  249. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  250. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  251. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  252. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  253. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  254. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  255. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  256. package/skills/weaver-e10-plan/SKILL.md +139 -0
  257. package/skills/weaver-e10-plan/product.json +8 -0
  258. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  259. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  260. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  261. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  262. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  263. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  264. package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
  265. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  266. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  267. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  268. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  269. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  272. package/skills/weaver-e10-shared/SKILL.md +86 -0
  273. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  274. package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
  275. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  276. package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
  277. package/skills/weaver-e10-skill-maker/product.json +8 -0
  278. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  279. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  280. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  281. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  282. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  283. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  284. package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
  285. package/skills/weaver-e10-wenshuding/product.json +8 -0
  286. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  287. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  288. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  289. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  290. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  291. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  292. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  293. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  294. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  295. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  296. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  297. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  298. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
  300. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  301. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  302. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  303. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  304. package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
  305. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
  306. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
  307. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
  308. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  309. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  310. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  311. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
  312. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
  313. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  314. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  315. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  316. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
  317. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  318. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  319. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  320. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  321. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  322. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  323. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  324. package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
  325. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  326. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  327. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  328. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  329. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  330. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  331. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  332. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  333. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  334. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  335. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  336. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  337. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  338. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  339. package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
  340. package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
  341. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  342. package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
  343. package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
  344. package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
  345. package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
  346. package/skills/weaver-work-cli-shared/SKILL.md +0 -53
  347. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
  348. package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
  349. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
  350. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  351. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,519 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { createMailContinuationSigner } from './continuation.js';
4
+ import { createMailHost } from './host.js';
5
+ import { mailManifest } from './manifest.js';
6
+ import { executeMailOperation } from './operations.js';
7
+ import { mailValidationError } from './errors.js';
8
+ function asOptions(value) {
9
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
10
+ }
11
+ function stripBom(value) {
12
+ return value.replace(/^\uFEFF+/, '');
13
+ }
14
+ async function readStdin() {
15
+ const chunks = [];
16
+ for await (const chunk of process.stdin) {
17
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
18
+ }
19
+ return Buffer.concat(chunks).toString('utf8');
20
+ }
21
+ export async function inputFrom(options, extra = {}) {
22
+ const opts = asOptions(options);
23
+ let input = {};
24
+ if (opts.input && opts.inputJson) {
25
+ throw mailValidationError('input_conflict', '不能同时传 --input 和 --input-json');
26
+ }
27
+ if (opts.inputJson) {
28
+ input = parseJsonInput(String(opts.inputJson), '--input-json');
29
+ }
30
+ if (opts.input) {
31
+ let raw;
32
+ try {
33
+ raw = stripBom(opts.input === '-' ? await readStdin() : await readFile(String(opts.input), 'utf8'));
34
+ }
35
+ catch {
36
+ throw mailValidationError('input_unreadable', `无法读取 --input:${String(opts.input)}`);
37
+ }
38
+ input = parseJsonInput(raw, '--input');
39
+ }
40
+ return {
41
+ ...input,
42
+ ...Object.fromEntries(Object.entries(extra).filter(([, value]) => value !== undefined && value !== '')),
43
+ };
44
+ }
45
+ function parseJsonInput(raw, label) {
46
+ try {
47
+ const parsed = JSON.parse(stripBom(raw));
48
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
49
+ throw new Error('input must be an object');
50
+ }
51
+ return parsed;
52
+ }
53
+ catch {
54
+ throw mailValidationError('input_invalid', `${label} 不是合法 JSON 对象`);
55
+ }
56
+ }
57
+ export function successEnvelope(operation, result) {
58
+ return {
59
+ schemaVersion: 1,
60
+ ok: true,
61
+ operation,
62
+ data: result.data === undefined ? null : result.data,
63
+ ...(result.meta ? { meta: result.meta } : {}),
64
+ warnings: [],
65
+ };
66
+ }
67
+ function failureEnvelope(error) {
68
+ const structured = error;
69
+ return {
70
+ schemaVersion: 1,
71
+ ok: false,
72
+ ...(structured?.partialData === undefined ? {} : { data: structured.partialData }),
73
+ error: toErrorEnvelope(error),
74
+ };
75
+ }
76
+ async function executeAndPrint(ctx, operation, input) {
77
+ try {
78
+ const result = await executeMailOperation(operation, input, {
79
+ ctx,
80
+ host: createMailHost(ctx),
81
+ continuation: createMailContinuationSigner(ctx),
82
+ });
83
+ ctx.output.write(successEnvelope(operation, result), { json: true });
84
+ }
85
+ catch (error) {
86
+ console.error(JSON.stringify(failureEnvelope(error), null, 2));
87
+ process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
88
+ }
89
+ }
90
+ export const mailShortcut = {
91
+ name: 'mail',
92
+ description: '泛微E10邮件管理 CLI',
93
+ category: 'shortcut',
94
+ register({ program, action }) {
95
+ const mail = program.command('mail').description('泛微E10邮件管理(查询/发送/管理)');
96
+ mail.command('schema')
97
+ .description('Print mail operation manifest for agents')
98
+ .action(action((ctx) => {
99
+ ctx.output.write(mailManifest, { json: true });
100
+ }));
101
+ mail.command('run')
102
+ .description('Run a mail operation with JSON input')
103
+ .argument('<operation>', 'operation name, e.g. mail.list')
104
+ .option('--input <path>', 'JSON input file, or - for stdin')
105
+ .option('--input-json <json>', 'inline JSON input object')
106
+ .action(action(async (ctx, operation, options) => {
107
+ await executeAndPrint(ctx, String(operation), await inputFrom(options));
108
+ }));
109
+ const withJson = (command) => command.option('--input <path>', 'JSON input file, or - for stdin').option('--input-json <json>', 'inline JSON input object');
110
+ // ---- 查询 ----
111
+ mail.command('list')
112
+ .description('查询邮件列表(支持文件夹/关键字/未读/附件/时间过滤)')
113
+ .option('--folder <id>', '文件夹:0收件箱 -1已发送 -2草稿箱 -3垃圾箱 -4已删除 -10全部')
114
+ .option('--keyword <kw>', '主题关键字')
115
+ .option('--from <name>', '发件人')
116
+ .option('--to <name>', '收件人')
117
+ .option('--unread', '仅未读')
118
+ .option('--star', '仅星标')
119
+ .option('--todo', '仅待办')
120
+ .option('--attach', '仅带附件')
121
+ .option('--date <range>', '时间范围 起始,结束 (YYYY-MM-DD)')
122
+ .option('--page <n>', '页码')
123
+ .option('--size <n>', '每页条数')
124
+ .action(action(async (ctx, options) => {
125
+ const opts = asOptions(options);
126
+ const extra = {
127
+ folder: opts.folder,
128
+ keyword: opts.keyword,
129
+ from: opts.from,
130
+ to: opts.to,
131
+ unread: opts.unread === true ? true : undefined,
132
+ star: opts.star === true ? true : undefined,
133
+ todo: opts.todo === true ? true : undefined,
134
+ hasFile: opts.attach === true ? true : undefined,
135
+ page: opts.page,
136
+ size: opts.size,
137
+ };
138
+ if (opts.date) {
139
+ const [s, e] = String(opts.date).split(',');
140
+ extra.startDate = s?.trim();
141
+ extra.endDate = e?.trim();
142
+ }
143
+ await executeAndPrint(ctx, 'mail.list', await inputFrom(options, extra));
144
+ }));
145
+ mail.command('contact')
146
+ .description('往来邮件(对方发来 + 我发给对方)')
147
+ .option('--name <name>', '人员姓名/工号')
148
+ .action(action(async (ctx, options) => {
149
+ const opts = asOptions(options);
150
+ await executeAndPrint(ctx, 'mail.contact.list', await inputFrom(options, { name: opts.name }));
151
+ }));
152
+ mail.command('view')
153
+ .description('查看邮件详情(含正文/附件)')
154
+ .option('--id <id>', '邮件 id')
155
+ .action(action(async (ctx, options) => {
156
+ const opts = asOptions(options);
157
+ await executeAndPrint(ctx, 'mail.view.info', await inputFrom(options, { id: opts.id }));
158
+ }));
159
+ mail.command('content')
160
+ .description('查看邮件正文')
161
+ .option('--id <id>', '邮件 id')
162
+ .action(action(async (ctx, options) => {
163
+ const opts = asOptions(options);
164
+ await executeAndPrint(ctx, 'mail.view.content', await inputFrom(options, { id: opts.id }));
165
+ }));
166
+ mail.command('unread')
167
+ .description('未读邮件统计(收件箱/已删除/垃圾箱/待办/星标)')
168
+ .action(action(async (ctx, options) => {
169
+ await executeAndPrint(ctx, 'mail.unread.count', await inputFrom(options));
170
+ }));
171
+ mail.command('config')
172
+ .description('获取邮件配置(发送开关/附件限制)')
173
+ .action(action(async (ctx, options) => {
174
+ await executeAndPrint(ctx, 'mail.config.get', await inputFrom(options));
175
+ }));
176
+ // ---- 收件人解析(Agent 辅助)----
177
+ const search = mail.command('search').description('收件人解析命令');
178
+ withJson(search.command('person')
179
+ .description('内部人员/部门搜索')
180
+ .option('--keyword <kw>', '姓名/工号')
181
+ .action(action(async (ctx, options) => {
182
+ const opts = asOptions(options);
183
+ await executeAndPrint(ctx, 'mail.person.search', await inputFrom(options, { keyword: opts.keyword }));
184
+ })));
185
+ withJson(search.command('dep')
186
+ .description('部门树定位')
187
+ .option('--keyword <kw>', '部门名')
188
+ .action(action(async (ctx, options) => {
189
+ const opts = asOptions(options);
190
+ await executeAndPrint(ctx, 'mail.dep.search', await inputFrom(options, { keyword: opts.keyword }));
191
+ })));
192
+ withJson(search.command('address')
193
+ .description('外部邮箱搜索')
194
+ .option('--keyword <kw>', '邮箱关键字')
195
+ .action(action(async (ctx, options) => {
196
+ const opts = asOptions(options);
197
+ await executeAndPrint(ctx, 'mail.address.search', await inputFrom(options, { keyword: opts.keyword }));
198
+ })));
199
+ // ---- 发送(prepare/apply)----
200
+ const send = mail.command('send').description('发送/回复/转发/存草稿(prepare→apply)');
201
+ withJson(send.command('prepare')
202
+ .description('准备发送(组装请求 + 安全预检 + 输出摘要,不发送)')
203
+ .option('--flag <flag>', '新建 -1 / 回复 1 / 转发 3 / 编辑草稿 4')
204
+ .option('--id <id>', '原邮件 id(回复/转发/编辑草稿)')
205
+ .option('--to <names>', '收件人(姓名/工号/部门 --to-dep)')
206
+ .option('--cc <names>', '抄送')
207
+ .option('--bcc <names>', '密送')
208
+ .option('--to-dep <deps>', '部门收件人')
209
+ .option('--to-id <ids>', '精确收件人 id')
210
+ .option('--cc-id <ids>', '精确抄送 id')
211
+ .option('--bcc-id <ids>', '精确密送 id')
212
+ .option('--external', '外部邮件')
213
+ .option('--subject <subject>', '主题')
214
+ .option('--content <content>', '正文')
215
+ .option('--timing <datetime>', '定时发送 YYYY-MM-DD HH:mm:ss')
216
+ .option('--files <ids>', '附件 fileid(逗号)')
217
+ .option('--filesizes <sizes>', '附件大小(逗号)')
218
+ .option('--draft', '存草稿(不发送)')
219
+ .action(action(async (ctx, options) => {
220
+ const o = asOptions(options);
221
+ await executeAndPrint(ctx, 'mail.send.prepare', await inputFrom(options, {
222
+ flag: o.flag, id: o.id, to: o.to, cc: o.cc, bcc: o.bcc,
223
+ toDep: o.toDep, ccDep: o.ccDep, bccDep: o.bccDep,
224
+ toId: o.toId, ccId: o.ccId, bccId: o.bccId,
225
+ external: o.external === true ? true : undefined,
226
+ subject: o.subject, content: o.content, timing: o.timing,
227
+ files: o.files, filesizes: o.filesizes, draft: o.draft === true ? true : undefined,
228
+ }));
229
+ })));
230
+ withJson(send.command('apply')
231
+ .description('执行发送(需 --continuation 与 --yes)')
232
+ .option('--continuation <token>', 'prepare 返回的 continuation')
233
+ .option('--yes', '确认发送')
234
+ .action(action(async (ctx, options) => {
235
+ const o = asOptions(options);
236
+ await executeAndPrint(ctx, 'mail.send.apply', await inputFrom(options, {
237
+ continuation: o.continuation,
238
+ confirm: o.yes === true ? true : undefined,
239
+ }));
240
+ })));
241
+ // ---- 标记 / 待办 / 移动 / 删除 ----
242
+ withJson(mail.command('star')
243
+ .description('标星/取消标星')
244
+ .option('--id <id>', '邮件 id')
245
+ .option('--star <0|1>', '1 标星 / 0 取消')
246
+ .action(action(async (ctx, options) => {
247
+ const o = asOptions(options);
248
+ await executeAndPrint(ctx, 'mail.star', await inputFrom(options, { id: o.id, star: o.star }));
249
+ })));
250
+ withJson(mail.command('read-status')
251
+ .description('标记单封已读/未读')
252
+ .option('--id <id>', '邮件 id')
253
+ .option('--read <0|1>', '1 已读 / 0 未读')
254
+ .action(action(async (ctx, options) => {
255
+ const o = asOptions(options);
256
+ await executeAndPrint(ctx, 'mail.read.status', await inputFrom(options, { id: o.id, read: o.read }));
257
+ })));
258
+ withJson(mail.command('read-all')
259
+ .description('标记全部已读')
260
+ .option('--folder <id>', '文件夹 id(默认全部)')
261
+ .action(action(async (ctx, options) => {
262
+ const o = asOptions(options);
263
+ await executeAndPrint(ctx, 'mail.read.all', await inputFrom(options, { folder: o.folder }));
264
+ })));
265
+ withJson(mail.command('wait')
266
+ .description('创建待办/提醒')
267
+ .option('--id <id>', '邮件 id')
268
+ .option('--title <title>', '待办标题')
269
+ .option('--enddate <date>', '截止日期')
270
+ .action(action(async (ctx, options) => {
271
+ const o = asOptions(options);
272
+ await executeAndPrint(ctx, 'mail.wait.add', await inputFrom(options, { id: o.id, title: o.title, endDate: o.enddate }));
273
+ })));
274
+ withJson(mail.command('move')
275
+ .description('移动邮件至文件夹')
276
+ .option('--id <id>', '邮件 id')
277
+ .option('--folder <id>', '目标文件夹 id')
278
+ .action(action(async (ctx, options) => {
279
+ const o = asOptions(options);
280
+ await executeAndPrint(ctx, 'mail.move.folder', await inputFrom(options, { id: o.id, folder: o.folder }));
281
+ })));
282
+ mail.command('delete')
283
+ .description('删除邮件(默认逻辑删除移至已删除)')
284
+ .option('--id <id>', '邮件 id 或逗号分隔多个')
285
+ .option('--permanent', '永久删除(WITHHELD,未实现)')
286
+ .action(action(async (ctx, options) => {
287
+ const o = asOptions(options);
288
+ if (o.permanent === true) {
289
+ throw mailValidationError('operation_withheld', '永久删除(mail.delete.batch)已暂缓实现,不可逆且无法撤销');
290
+ }
291
+ await executeAndPrint(ctx, 'mail.delete.move', await inputFrom(options, { id: o.id }));
292
+ }));
293
+ // ---- 文件夹 ----
294
+ const folder = mail.command('folder').description('文件夹管理');
295
+ withJson(folder.command('create')
296
+ .description('新建邮件文件夹')
297
+ .option('--name <name>', '文件夹名')
298
+ .action(action(async (ctx, options) => {
299
+ const o = asOptions(options);
300
+ await executeAndPrint(ctx, 'mail.folder.create', await inputFrom(options, { name: o.name }));
301
+ })));
302
+ withJson(folder.command('delete')
303
+ .description('删除邮件文件夹')
304
+ .option('--id <id>', '文件夹 id')
305
+ .action(action(async (ctx, options) => {
306
+ const o = asOptions(options);
307
+ await executeAndPrint(ctx, 'mail.folder.delete', await inputFrom(options, { id: o.id }));
308
+ })));
309
+ // ---- 联系人 / 分组 ----
310
+ const contacts = mail.command('contacts').description('联系人管理');
311
+ withJson(contacts.command('list')
312
+ .description('联系人列表/搜索')
313
+ .option('--keyword <kw>', '关键字')
314
+ .option('--page <n>', '页码')
315
+ .option('--size <n>', '每页条数')
316
+ .action(action(async (ctx, options) => {
317
+ const o = asOptions(options);
318
+ await executeAndPrint(ctx, 'mail.contacts.list', await inputFrom(options, { keyword: o.keyword, page: o.page, size: o.size }));
319
+ })));
320
+ withJson(contacts.command('save')
321
+ .description('新增/编辑联系人(GET 全量 + 保存,prepare→apply)')
322
+ .option('--prepare', '准备(查全量 + 输出摘要)')
323
+ .option('--apply', '执行保存(需 --continuation 与 --yes)')
324
+ .option('--continuation <token>', 'prepare 返回的 continuation')
325
+ .option('--yes', '确认')
326
+ .action(action(async (ctx, options) => {
327
+ const o = asOptions(options);
328
+ const op = o.prepare === true ? 'mail.contacts.save.prepare' : 'mail.contacts.save.apply';
329
+ await executeAndPrint(ctx, op, await inputFrom(options, {
330
+ continuation: o.continuation,
331
+ confirm: o.yes === true ? true : undefined,
332
+ }));
333
+ })));
334
+ withJson(contacts.command('delete')
335
+ .description('删除联系人')
336
+ .option('--id <id>', '联系人 id')
337
+ .action(action(async (ctx, options) => {
338
+ const o = asOptions(options);
339
+ await executeAndPrint(ctx, 'mail.contacts.delete', await inputFrom(options, { id: o.id }));
340
+ })));
341
+ const group = contacts.command('group').description('联系人分组');
342
+ withJson(group.command('list')
343
+ .description('分组列表')
344
+ .action(action(async (ctx, options) => {
345
+ await executeAndPrint(ctx, 'mail.contacts.group.list', await inputFrom(options));
346
+ })));
347
+ withJson(group.command('detail')
348
+ .description('分组详情(含统计)')
349
+ .option('--id <id>', '分组 id')
350
+ .action(action(async (ctx, options) => {
351
+ const o = asOptions(options);
352
+ await executeAndPrint(ctx, 'mail.contacts.group.detail', await inputFrom(options, { id: o.id }));
353
+ })));
354
+ withJson(group.command('save')
355
+ .description('新增/编辑分组(prepare→apply)')
356
+ .option('--prepare', '准备')
357
+ .option('--apply', '执行(需 --continuation 与 --yes)')
358
+ .option('--continuation <token>', 'continuation')
359
+ .option('--yes', '确认')
360
+ .action(action(async (ctx, options) => {
361
+ const o = asOptions(options);
362
+ const op = o.prepare === true ? 'mail.contacts.group.save.prepare' : 'mail.contacts.group.save.apply';
363
+ await executeAndPrint(ctx, op, await inputFrom(options, { continuation: o.continuation, confirm: o.yes === true ? true : undefined }));
364
+ })));
365
+ withJson(group.command('delete')
366
+ .description('删除分组')
367
+ .option('--id <id>', '分组 id')
368
+ .action(action(async (ctx, options) => {
369
+ const o = asOptions(options);
370
+ await executeAndPrint(ctx, 'mail.contacts.group.delete', await inputFrom(options, { id: o.id }));
371
+ })));
372
+ // ---- 模板 ----
373
+ const template = mail.command('template').description('模板管理');
374
+ withJson(template.command('list')
375
+ .description('模板列表')
376
+ .action(action(async (ctx, options) => {
377
+ await executeAndPrint(ctx, 'mail.template.list', await inputFrom(options));
378
+ })));
379
+ withJson(template.command('save')
380
+ .description('新增模板(prepare→apply)')
381
+ .option('--prepare', '准备')
382
+ .option('--apply', '执行(需 --continuation 与 --yes)')
383
+ .option('--continuation <token>', 'continuation')
384
+ .option('--yes', '确认')
385
+ .action(action(async (ctx, options) => {
386
+ const o = asOptions(options);
387
+ const op = o.prepare === true ? 'mail.template.save.prepare' : 'mail.template.save.apply';
388
+ await executeAndPrint(ctx, op, await inputFrom(options, { continuation: o.continuation, confirm: o.yes === true ? true : undefined }));
389
+ })));
390
+ withJson(template.command('update')
391
+ .description('编辑模板(GET 全量 + 保存)')
392
+ .option('--id <id>', '模板 id')
393
+ .action(action(async (ctx, options) => {
394
+ const o = asOptions(options);
395
+ await executeAndPrint(ctx, 'mail.template.update', await inputFrom(options, { id: o.id }));
396
+ })));
397
+ withJson(template.command('delete')
398
+ .description('删除模板')
399
+ .option('--id <id>', '模板 id')
400
+ .action(action(async (ctx, options) => {
401
+ const o = asOptions(options);
402
+ await executeAndPrint(ctx, 'mail.template.delete', await inputFrom(options, { id: o.id }));
403
+ })));
404
+ withJson(template.command('default')
405
+ .description('设为默认模板')
406
+ .option('--id <id>', '模板 id')
407
+ .action(action(async (ctx, options) => {
408
+ const o = asOptions(options);
409
+ await executeAndPrint(ctx, 'mail.template.default', await inputFrom(options, { id: o.id }));
410
+ })));
411
+ // ---- 签名 ----
412
+ const sign = mail.command('sign').description('签名管理');
413
+ withJson(sign.command('list')
414
+ .description('签名列表')
415
+ .action(action(async (ctx, options) => {
416
+ await executeAndPrint(ctx, 'mail.sign.list', await inputFrom(options));
417
+ })));
418
+ withJson(sign.command('save')
419
+ .description('新增签名(prepare→apply)')
420
+ .option('--prepare', '准备')
421
+ .option('--apply', '执行(需 --continuation 与 --yes)')
422
+ .option('--continuation <token>', 'continuation')
423
+ .option('--yes', '确认')
424
+ .action(action(async (ctx, options) => {
425
+ const o = asOptions(options);
426
+ const op = o.prepare === true ? 'mail.sign.save.prepare' : 'mail.sign.save.apply';
427
+ await executeAndPrint(ctx, op, await inputFrom(options, { continuation: o.continuation, confirm: o.yes === true ? true : undefined }));
428
+ })));
429
+ withJson(sign.command('update')
430
+ .description('编辑签名')
431
+ .option('--id <id>', '签名 id')
432
+ .action(action(async (ctx, options) => {
433
+ const o = asOptions(options);
434
+ await executeAndPrint(ctx, 'mail.sign.update', await inputFrom(options, { id: o.id }));
435
+ })));
436
+ withJson(sign.command('delete')
437
+ .description('删除签名')
438
+ .option('--id <id>', '签名 id')
439
+ .action(action(async (ctx, options) => {
440
+ const o = asOptions(options);
441
+ await executeAndPrint(ctx, 'mail.sign.delete', await inputFrom(options, { id: o.id }));
442
+ })));
443
+ withJson(sign.command('default')
444
+ .description('设为默认签名')
445
+ .option('--id <id>', '签名 id')
446
+ .action(action(async (ctx, options) => {
447
+ const o = asOptions(options);
448
+ await executeAndPrint(ctx, 'mail.sign.default', await inputFrom(options, { id: o.id }));
449
+ })));
450
+ withJson(sign.command('qrcode')
451
+ .description('生成二维码名片')
452
+ .option('--id <id>', '签名 id')
453
+ .action(action(async (ctx, options) => {
454
+ const o = asOptions(options);
455
+ await executeAndPrint(ctx, 'mail.sign.qrcode', await inputFrom(options, { id: o.id }));
456
+ })));
457
+ // ---- 黑名单 ----
458
+ const blacklist = mail.command('blacklist').description('黑名单管理');
459
+ withJson(blacklist.command('list')
460
+ .description('黑名单列表')
461
+ .action(action(async (ctx, options) => {
462
+ await executeAndPrint(ctx, 'mail.blacklist.list', await inputFrom(options));
463
+ })));
464
+ withJson(blacklist.command('operate')
465
+ .description('新增/删除黑名单(prepare→apply)')
466
+ .option('--prepare', '准备')
467
+ .option('--apply', '执行(需 --continuation 与 --yes)')
468
+ .option('--continuation <token>', 'continuation')
469
+ .option('--yes', '确认')
470
+ .action(action(async (ctx, options) => {
471
+ const o = asOptions(options);
472
+ const op = o.prepare === true ? 'mail.blacklist.operate.prepare' : 'mail.blacklist.operate.apply';
473
+ await executeAndPrint(ctx, op, await inputFrom(options, { continuation: o.continuation, confirm: o.yes === true ? true : undefined }));
474
+ })));
475
+ // ---- 附件中心 ----
476
+ const attachment = mail.command('attachment').description('附件中心');
477
+ withJson(attachment.command('center')
478
+ .description('附件中心列表/搜索')
479
+ .option('--keyword <kw>', '关键字')
480
+ .option('--page <n>', '页码')
481
+ .option('--size <n>', '每页条数')
482
+ .action(action(async (ctx, options) => {
483
+ const o = asOptions(options);
484
+ await executeAndPrint(ctx, 'mail.attachment.center', await inputFrom(options, { keyword: o.keyword, page: o.page, size: o.size }));
485
+ })));
486
+ withJson(attachment.command('upload')
487
+ .description('上传附件(三步:预检→上传→绑定,返回 fileid)')
488
+ .option('--file <path>', '本地文件路径')
489
+ .option('--name <name>', '附件名')
490
+ .action(action(async (ctx, options) => {
491
+ const o = asOptions(options);
492
+ await executeAndPrint(ctx, 'mail.attachment.upload', await inputFrom(options, { file: o.file, name: o.name }));
493
+ })));
494
+ withJson(attachment.command('download')
495
+ .description('批量下载附件')
496
+ .option('--ids <ids>', '附件 id(逗号)')
497
+ .option('--output <dir>', '输出目录')
498
+ .action(action(async (ctx, options) => {
499
+ const o = asOptions(options);
500
+ await executeAndPrint(ctx, 'mail.attachment.download', await inputFrom(options, { ids: o.ids, output: o.output }));
501
+ })));
502
+ // ---- 清理日志 / 撤回 ----
503
+ withJson(mail.command('clearlog')
504
+ .description('邮件清理日志列表')
505
+ .option('--page <n>', '页码')
506
+ .option('--size <n>', '每页条数')
507
+ .action(action(async (ctx, options) => {
508
+ const o = asOptions(options);
509
+ await executeAndPrint(ctx, 'mail.clearlog.list', await inputFrom(options, { page: o.page, size: o.size }));
510
+ })));
511
+ withJson(mail.command('recall')
512
+ .description('撤回已发送的内部邮件')
513
+ .option('--id <id>', '邮件 id')
514
+ .action(action(async (ctx, options) => {
515
+ const o = asOptions(options);
516
+ await executeAndPrint(ctx, 'mail.recall', await inputFrom(options, { id: o.id }));
517
+ })));
518
+ },
519
+ };
@@ -0,0 +1,38 @@
1
+ import { mailOperationDefinitions } from './operations/registry.js';
2
+ /**
3
+ * 邮件模块禁用边界(破坏性/缺口操作,与招聘 entry.cancel 同策略):
4
+ * - mail.delete.batch:物理永久删除,不可逆、无法撤销,破坏性最强,暂缓实现。
5
+ * - mail.resend:重发依赖「邮件发送日志 id」(mailRemindLogId),源技能未封装日志查询接口,
6
+ * 无法获得该 id 时如实提示,不臆造;暂缓实现。
7
+ * 其余读操作与写操作(发送/回复/转发/存草稿、标星、已读、待办、移动、逻辑删除、文件夹、
8
+ * 联系人、分组、模板、签名、黑名单、附件上传/下载、撤回)均已可用。不得编造或绕过。
9
+ */
10
+ const MAIL_WITHHELD = ['mail.delete.batch', 'mail.resend'];
11
+ function buildOperations() {
12
+ return mailOperationDefinitions().map((definition) => ({
13
+ name: definition.name,
14
+ resource: definition.resource,
15
+ summary: definition.summary,
16
+ ...(definition.capability ? { capability: definition.capability } : {}),
17
+ risk: definition.risk,
18
+ ...(definition.requiresConfirmation ? { requiresConfirmation: true } : {}),
19
+ inputSchema: definition.inputSchema,
20
+ }));
21
+ }
22
+ export const mailManifest = {
23
+ schemaVersion: 1,
24
+ name: 'mail',
25
+ title: '泛微E10邮件管理',
26
+ version: '0.1.0',
27
+ host: 'e10-mail',
28
+ status: 'builtin',
29
+ sourceSkill: 'weaver-e10-mail',
30
+ capabilities: ['mail'],
31
+ operations: buildOperations(),
32
+ withheldOperations: MAIL_WITHHELD.map((name) => ({
33
+ name,
34
+ reason: name === 'mail.delete.batch'
35
+ ? '物理永久删除(deleteMailResourceBatch)不可逆、无法撤销,破坏性最强;如确需执行,请在确认风险后以单独授权方式处理,不在常规 CLI 提供。'
36
+ : '重发邮件(resendMail)依赖「邮件发送日志 id」(mailRemindLogId),源技能未封装日志查询接口,无法获得该 id 时如实提示,不臆造;暂缓实现。',
37
+ })),
38
+ };
@@ -0,0 +1,79 @@
1
+ import { mailValidationError } from '../errors.js';
2
+ import { WRITE, mailSuccess, schemaOf, SCHEMA_STRING } from './types.js';
3
+ const CONTINUATION_TTL_MS = 600_000;
4
+ const BLACKLIST_SCHEMA = schemaOf({
5
+ operateType: { type: 'string', description: 'add / delete' },
6
+ mailAddress: SCHEMA_STRING,
7
+ id: SCHEMA_STRING,
8
+ confirm: { type: 'boolean' },
9
+ continuation: SCHEMA_STRING,
10
+ }, { description: '黑名单操作(prepare/apply)' });
11
+ function buildBlacklistBody(args) {
12
+ const operateType = String(args.operateType || 'add').toLowerCase();
13
+ if (operateType !== 'add' && operateType !== 'delete')
14
+ throw new Error('operateType 必须是 add 或 delete');
15
+ const body = { operateType };
16
+ if (operateType === 'add') {
17
+ const mailAddress = String(args.mailAddress || '').trim();
18
+ if (!mailAddress)
19
+ throw new Error('add 操作必须提供 mailAddress(邮箱地址)');
20
+ body.mailAddress = mailAddress;
21
+ }
22
+ else {
23
+ const id = String(args.id || '').trim();
24
+ if (!id)
25
+ throw new Error('delete 操作必须提供 id(黑名单记录 id)');
26
+ body.id = id;
27
+ }
28
+ return body;
29
+ }
30
+ const opBlacklistOperatePrepare = {
31
+ name: 'mail.blacklist.operate.prepare',
32
+ resource: 'mail/base/setting/blacklist/operateUserMailBlacklist',
33
+ method: 'POST',
34
+ action: 'mail.blacklist.operate.prepare',
35
+ summary: '新增/删除黑名单(prepare,不执行)',
36
+ risk: WRITE,
37
+ requiresConfirmation: true,
38
+ inputSchema: BLACKLIST_SCHEMA,
39
+ async handler(args, env) {
40
+ const body = buildBlacklistBody(args);
41
+ const session = await env.host.getSession();
42
+ const continuation = await env.continuation.issue({
43
+ operation: 'mail.blacklist.operate.apply',
44
+ baseUrl: session.baseUrl,
45
+ profile: session.profile,
46
+ userId: session.userId,
47
+ body,
48
+ }, CONTINUATION_TTL_MS);
49
+ return mailSuccess('mail.blacklist.operate.prepare', {
50
+ operateType: body.operateType,
51
+ target: body.mailAddress || body.id,
52
+ tip: '确认后以 mail blacklist operate --apply --continuation <token> --yes 执行',
53
+ }, { continuation });
54
+ },
55
+ };
56
+ const opBlacklistOperateApply = {
57
+ name: 'mail.blacklist.operate.apply',
58
+ resource: 'mail/base/setting/blacklist/operateUserMailBlacklist',
59
+ method: 'POST',
60
+ action: 'mail.blacklist.operate.apply',
61
+ summary: '执行黑名单新增/删除',
62
+ risk: WRITE,
63
+ requiresConfirmation: true,
64
+ inputSchema: BLACKLIST_SCHEMA,
65
+ async handler(args, env) {
66
+ if (args.confirm !== true)
67
+ throw new Error('mail.blacklist.operate.apply 必须传入 confirm=true 与 prepare 返回的 continuation');
68
+ if (!args.continuation)
69
+ throw new Error('mail.blacklist.operate.apply 必须传入 prepare 返回的 continuation');
70
+ const lease = await env.continuation.verify(String(args.continuation), 'mail.blacklist.operate.apply');
71
+ const session = await env.host.getSession();
72
+ if (lease.baseUrl !== session.baseUrl || lease.profile !== session.profile || lease.userId !== session.userId) {
73
+ throw mailValidationError('context_mismatch', '确认上下文已变化(租户或登录账号不同),请重新执行 prepare');
74
+ }
75
+ const value = (await env.host.request({ path: '/api/mail/base/setting/blacklist/operateUserMailBlacklist', method: 'POST', body: lease.body }));
76
+ return mailSuccess('mail.blacklist.operate.apply', value?.data ?? 'SUCCESS', { operateType: lease.body?.operateType, target: lease.body?.mailAddress || lease.body?.id });
77
+ },
78
+ };
79
+ export const mailBlacklistOperations = [opBlacklistOperatePrepare, opBlacklistOperateApply];