weaver-work-cli 0.1.2 → 0.1.5

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 (405) hide show
  1. package/README.md +176 -78
  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 +159 -54
  7. package/dist/internal/e10/auth/xiaoe.js +268 -0
  8. package/dist/internal/e10/context.js +16 -2
  9. package/dist/internal/e10/index.js +1 -0
  10. package/dist/internal/e10/request-runtime.js +345 -0
  11. package/dist/internal/skills/install.js +48 -6
  12. package/dist/internal/skills/reader.js +27 -0
  13. package/dist/shortcuts/archive/continuation.js +70 -0
  14. package/dist/shortcuts/archive/errors.js +53 -0
  15. package/dist/shortcuts/archive/host.js +197 -0
  16. package/dist/shortcuts/archive/index.js +363 -0
  17. package/dist/shortcuts/archive/manifest.js +45 -0
  18. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  19. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  20. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  21. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  22. package/dist/shortcuts/archive/operations/download.js +238 -0
  23. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  24. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  25. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  26. package/dist/shortcuts/archive/operations/registry.js +43 -0
  27. package/dist/shortcuts/archive/operations/search.js +88 -0
  28. package/dist/shortcuts/archive/operations/shared.js +120 -0
  29. package/dist/shortcuts/archive/operations/types.js +23 -0
  30. package/dist/shortcuts/archive/operations/upload.js +182 -0
  31. package/dist/shortcuts/archive/operations.js +13 -0
  32. package/dist/shortcuts/archive/render/search-format.js +276 -0
  33. package/dist/shortcuts/archive/render/search-view.js +125 -0
  34. package/dist/shortcuts/asset/continuation.js +70 -0
  35. package/dist/shortcuts/asset/errors.js +67 -0
  36. package/dist/shortcuts/asset/host.js +438 -0
  37. package/dist/shortcuts/asset/index.js +255 -0
  38. package/dist/shortcuts/asset/manifest.js +471 -0
  39. package/dist/shortcuts/asset/operations/query.js +249 -0
  40. package/dist/shortcuts/asset/operations/registry.js +85 -0
  41. package/dist/shortcuts/asset/operations/shared.js +100 -0
  42. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  43. package/dist/shortcuts/asset/operations/types.js +1 -0
  44. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  45. package/dist/shortcuts/asset/operations/write.js +435 -0
  46. package/dist/shortcuts/asset/operations.js +9 -0
  47. package/dist/shortcuts/calendar/continuation.js +70 -0
  48. package/dist/shortcuts/calendar/errors.js +53 -0
  49. package/dist/shortcuts/calendar/host.js +148 -0
  50. package/dist/shortcuts/calendar/index.js +125 -0
  51. package/dist/shortcuts/calendar/manifest.js +26 -0
  52. package/dist/shortcuts/calendar/operations/read.js +259 -0
  53. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  54. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  55. package/dist/shortcuts/calendar/operations/types.js +25 -0
  56. package/dist/shortcuts/calendar/operations/write.js +439 -0
  57. package/dist/shortcuts/calendar/operations.js +8 -0
  58. package/dist/shortcuts/ehr/continuation.js +70 -0
  59. package/dist/shortcuts/ehr/errors.js +53 -0
  60. package/dist/shortcuts/ehr/host.js +213 -0
  61. package/dist/shortcuts/ehr/index.js +205 -0
  62. package/dist/shortcuts/ehr/manifest.js +47 -0
  63. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  64. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  65. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  66. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  67. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  68. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  69. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  70. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  71. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  72. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  73. package/dist/shortcuts/ehr/operations/types.js +25 -0
  74. package/dist/shortcuts/ehr/operations.js +25 -0
  75. package/dist/shortcuts/esb/continuation.js +70 -0
  76. package/dist/shortcuts/esb/errors.js +65 -0
  77. package/dist/shortcuts/esb/host.js +187 -0
  78. package/dist/shortcuts/esb/index.js +112 -0
  79. package/dist/shortcuts/esb/manifest.js +91 -0
  80. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  81. package/dist/shortcuts/esb/operations/registry.js +48 -0
  82. package/dist/shortcuts/esb/operations/shared.js +152 -0
  83. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  84. package/dist/shortcuts/esb/operations/types.js +21 -0
  85. package/dist/shortcuts/esb/operations.js +15 -0
  86. package/dist/shortcuts/fna/continuation.js +70 -0
  87. package/dist/shortcuts/fna/errors.js +59 -0
  88. package/dist/shortcuts/fna/host.js +146 -0
  89. package/dist/shortcuts/fna/index.js +111 -0
  90. package/dist/shortcuts/fna/manifest.js +41 -0
  91. package/dist/shortcuts/fna/operations/budget.js +124 -0
  92. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  93. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  94. package/dist/shortcuts/fna/operations/loan.js +195 -0
  95. package/dist/shortcuts/fna/operations/registry.js +35 -0
  96. package/dist/shortcuts/fna/operations/shared.js +210 -0
  97. package/dist/shortcuts/fna/operations/types.js +25 -0
  98. package/dist/shortcuts/fna/operations.js +19 -0
  99. package/dist/shortcuts/hrm/errors.js +38 -0
  100. package/dist/shortcuts/hrm/host.js +156 -0
  101. package/dist/shortcuts/hrm/index.js +111 -0
  102. package/dist/shortcuts/hrm/manifest.js +32 -0
  103. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  104. package/dist/shortcuts/hrm/operations/org.js +110 -0
  105. package/dist/shortcuts/hrm/operations/position.js +176 -0
  106. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  107. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  108. package/dist/shortcuts/hrm/operations/types.js +23 -0
  109. package/dist/shortcuts/hrm/operations.js +19 -0
  110. package/dist/shortcuts/index.js +24 -0
  111. package/dist/shortcuts/invoice/host.js +99 -94
  112. package/dist/shortcuts/invoice/index.js +58 -59
  113. package/dist/shortcuts/invoice/manifest.js +200 -3
  114. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  115. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  116. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  117. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  118. package/dist/shortcuts/invoice/operations/shared.js +247 -0
  119. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  120. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  121. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  122. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  123. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  124. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  125. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  126. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  127. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  128. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  131. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  132. package/dist/shortcuts/mail/continuation.js +70 -0
  133. package/dist/shortcuts/mail/errors.js +53 -0
  134. package/dist/shortcuts/mail/host.js +182 -0
  135. package/dist/shortcuts/mail/index.js +519 -0
  136. package/dist/shortcuts/mail/manifest.js +38 -0
  137. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  138. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  139. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  140. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  141. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  142. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  143. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  144. package/dist/shortcuts/mail/operations/registry.js +41 -0
  145. package/dist/shortcuts/mail/operations/shared.js +64 -0
  146. package/dist/shortcuts/mail/operations/types.js +27 -0
  147. package/dist/shortcuts/mail/operations.js +19 -0
  148. package/dist/shortcuts/meeting/continuation.js +70 -0
  149. package/dist/shortcuts/meeting/errors.js +63 -0
  150. package/dist/shortcuts/meeting/host.js +167 -0
  151. package/dist/shortcuts/meeting/index.js +123 -0
  152. package/dist/shortcuts/meeting/manifest.js +64 -0
  153. package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
  154. package/dist/shortcuts/meeting/operations/change.js +242 -0
  155. package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
  156. package/dist/shortcuts/meeting/operations/create.js +349 -0
  157. package/dist/shortcuts/meeting/operations/env.js +191 -0
  158. package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
  159. package/dist/shortcuts/meeting/operations/meetings.js +73 -0
  160. package/dist/shortcuts/meeting/operations/receipts.js +195 -0
  161. package/dist/shortcuts/meeting/operations/registry.js +47 -0
  162. package/dist/shortcuts/meeting/operations/rooms.js +132 -0
  163. package/dist/shortcuts/meeting/operations/shared.js +112 -0
  164. package/dist/shortcuts/meeting/operations/signs.js +41 -0
  165. package/dist/shortcuts/meeting/operations/types.js +25 -0
  166. package/dist/shortcuts/meeting/operations.js +19 -0
  167. package/dist/shortcuts/plan/continuation.js +70 -0
  168. package/dist/shortcuts/plan/errors.js +70 -0
  169. package/dist/shortcuts/plan/host.js +180 -0
  170. package/dist/shortcuts/plan/index.js +150 -0
  171. package/dist/shortcuts/plan/manifest.js +53 -0
  172. package/dist/shortcuts/plan/operations/link.js +256 -0
  173. package/dist/shortcuts/plan/operations/read.js +259 -0
  174. package/dist/shortcuts/plan/operations/registry.js +33 -0
  175. package/dist/shortcuts/plan/operations/shared.js +246 -0
  176. package/dist/shortcuts/plan/operations/types.js +49 -0
  177. package/dist/shortcuts/plan/operations/version.js +49 -0
  178. package/dist/shortcuts/plan/operations/write.js +710 -0
  179. package/dist/shortcuts/plan/operations.js +8 -0
  180. package/dist/shortcuts/yimiaoban/continuation.js +70 -0
  181. package/dist/shortcuts/yimiaoban/errors.js +61 -0
  182. package/dist/shortcuts/yimiaoban/host.js +469 -0
  183. package/dist/shortcuts/yimiaoban/index.js +271 -0
  184. package/dist/shortcuts/yimiaoban/manifest.js +28 -0
  185. package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
  186. package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
  187. package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
  188. package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
  189. package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
  190. package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
  191. package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
  192. package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
  193. package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
  194. package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
  195. package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
  196. package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
  197. package/dist/shortcuts/yimiaoban/operations.js +8 -0
  198. package/docs/SKILL.md +11 -7
  199. package/docs/_catalog.md +28 -5
  200. package/docs/agent-invoice.md +19 -9
  201. package/docs/agent-skill-install.md +141 -22
  202. package/docs/calendar.md +87 -0
  203. package/docs/e10-auth.md +28 -9
  204. package/docs/ehr.md +186 -0
  205. package/docs/esb.md +64 -0
  206. package/docs/fna.md +72 -0
  207. package/docs/hrm.md +89 -0
  208. package/docs/invoice.md +61 -20
  209. package/docs/jiuchuanhui.md +131 -0
  210. package/docs/meeting.md +48 -0
  211. package/docs/operation-manual.md +443 -0
  212. package/docs/plan.md +82 -0
  213. package/docs/wenshuding.md +129 -0
  214. package/docs/yimiaoban.md +86 -0
  215. package/docs/ziguanjia.md +89 -0
  216. package/package.json +4 -4
  217. package/scripts/package-skill.mjs +127 -34
  218. package/scripts/postbuild.mjs +13 -0
  219. package/skill-template/business-info.json +16 -2
  220. package/skill-template/domains/calendar.md +15 -0
  221. package/skill-template/domains/esb.md +13 -0
  222. package/skill-template/domains/hrm.md +16 -0
  223. package/skill-template/domains/jiuchuanhui.md +23 -0
  224. package/skill-template/domains/jucailin.md +22 -0
  225. package/skill-template/domains/mail.md +21 -0
  226. package/skill-template/domains/meeting.md +3 -0
  227. package/skill-template/domains/plan.md +17 -0
  228. package/skill-template/domains/qiyecheng.md +17 -0
  229. package/skill-template/domains/shared.md +5 -3
  230. package/skill-template/domains/skill-maker.md +10 -0
  231. package/skill-template/domains/wenshuding.md +22 -0
  232. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  233. package/skill-template/domains/yimiaoban.md +21 -0
  234. package/skill-template/domains/ziguanjia.md +21 -0
  235. package/skill-template/master-skill-template.md +12 -6
  236. package/skill-template/skill-template.md +26 -10
  237. package/skills/weaver-e10-calendar/SKILL.md +102 -0
  238. package/skills/weaver-e10-calendar/product.json +8 -0
  239. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  240. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  241. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  242. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  243. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  244. package/skills/weaver-e10-esb/SKILL.md +103 -0
  245. package/skills/weaver-e10-esb/product.json +8 -0
  246. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  247. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  248. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  249. package/skills/weaver-e10-hrm/SKILL.md +88 -0
  250. package/skills/weaver-e10-hrm/product.json +8 -0
  251. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  252. package/skills/weaver-e10-hrm/references/org.md +95 -0
  253. package/skills/weaver-e10-hrm/references/position.md +95 -0
  254. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  255. package/skills/weaver-e10-jiuchuanhui/SKILL.md +175 -0
  256. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  257. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  258. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  259. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  260. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  261. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  262. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  263. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  264. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  265. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  266. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  267. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  268. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  269. package/skills/weaver-e10-jucailin/SKILL.md +102 -0
  270. package/skills/weaver-e10-jucailin/product.json +8 -0
  271. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  272. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  273. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  274. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  275. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  276. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  277. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  278. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  279. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  280. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  281. package/skills/weaver-e10-mail/SKILL.md +152 -0
  282. package/skills/weaver-e10-mail/product.json +8 -0
  283. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  284. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  285. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  286. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  287. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  288. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  289. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  290. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  291. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  292. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  293. package/skills/weaver-e10-meeting/SKILL.md +106 -0
  294. package/skills/weaver-e10-meeting/product.json +8 -0
  295. package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
  296. package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
  297. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
  298. package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
  299. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
  300. package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
  301. package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
  302. package/skills/weaver-e10-plan/SKILL.md +140 -0
  303. package/skills/weaver-e10-plan/product.json +8 -0
  304. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  305. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  306. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  307. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  308. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  309. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  310. package/skills/weaver-e10-qiyecheng/SKILL.md +119 -0
  311. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  312. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  313. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  314. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  315. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  316. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  317. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  318. package/skills/weaver-e10-shared/SKILL.md +90 -0
  319. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  320. package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/json-output-contract.md +34 -0
  321. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  322. package/skills/weaver-e10-skill-maker/SKILL.md +78 -0
  323. package/skills/weaver-e10-skill-maker/product.json +8 -0
  324. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  325. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  326. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  327. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  328. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  329. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  330. package/skills/weaver-e10-wenshuding/SKILL.md +158 -0
  331. package/skills/weaver-e10-wenshuding/product.json +8 -0
  332. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  333. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  334. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  335. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  336. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  337. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  338. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  339. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  340. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  341. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  342. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  343. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  344. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  345. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-agent-entry.md +16 -9
  346. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  347. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  348. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  349. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  350. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-download.md +9 -2
  351. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-enterprise-list.md +12 -4
  352. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +9 -2
  353. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-import.md +16 -7
  354. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  355. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  356. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  357. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +12 -4
  358. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-personal-list.md +12 -4
  359. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  360. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  361. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  362. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +9 -2
  363. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  364. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  365. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  366. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  367. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  368. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  369. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  370. package/skills/weaver-e10-yimiaoban/SKILL.md +104 -0
  371. package/skills/weaver-e10-yimiaoban/product.json +8 -0
  372. package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
  373. package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
  374. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
  375. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
  376. package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
  377. package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
  378. package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
  379. package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
  380. package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
  381. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
  382. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
  383. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
  384. package/skills/weaver-e10-ziguanjia/SKILL.md +163 -0
  385. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  386. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  387. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  388. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  389. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  390. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  391. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  392. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  393. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  394. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  395. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  396. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  397. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  398. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  399. package/skills/weaver-work-cli-invoice/SKILL.md +0 -122
  400. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  401. package/skills/weaver-work-cli-shared/SKILL.md +0 -63
  402. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -90
  403. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -73
  404. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  405. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,112 @@
1
+ /** 保留凭据头:输入里出现即拒绝(认证由 E10 runtime 托管)。 */
2
+ const FORBIDDEN_KEYS = new Set([
3
+ 'cookie',
4
+ 'eteamsid',
5
+ 'eteam_sid',
6
+ 'token',
7
+ 'authorization',
8
+ 'appkey',
9
+ 'app_secret',
10
+ 'appsecret',
11
+ ]);
12
+ export function asObject(value) {
13
+ return value && typeof value === 'object' && !Array.isArray(value)
14
+ ? { ...value }
15
+ : {};
16
+ }
17
+ export function assertNoForbiddenKeys(input) {
18
+ for (const key of Object.keys(input)) {
19
+ if (FORBIDDEN_KEYS.has(key.toLowerCase())) {
20
+ throw meetingValidationError('forbidden_input_key', `输入不允许携带认证字段:${key}`);
21
+ }
22
+ }
23
+ }
24
+ import { meetingValidationError } from '../errors.js';
25
+ /** 校验 yyyy-MM-dd HH:mm(标准版 @DateTimeFormat 契约),返回原串。 */
26
+ export function assertDateTimeMinute(value, label) {
27
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(value)) {
28
+ throw meetingValidationError('datetime_invalid', `${label} 必须是 yyyy-MM-dd HH:mm 格式`);
29
+ }
30
+ return value;
31
+ }
32
+ /** 校验 yyyy-MM-dd,返回原串。 */
33
+ export function assertDate(value, label) {
34
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value)) {
35
+ throw meetingValidationError('date_invalid', `${label} 必须是 yyyy-MM-dd 格式`);
36
+ }
37
+ return value;
38
+ }
39
+ /** 长 id 一律转字符串(超 2^53 数字会失真)。 */
40
+ export function toIdString(value, label) {
41
+ if (typeof value === 'number') {
42
+ if (!Number.isSafeInteger(value)) {
43
+ throw meetingValidationError('id_invalid', `${label} 超过安全整数范围,必须用字符串传`);
44
+ }
45
+ return String(value);
46
+ }
47
+ if (typeof value === 'string' && /^\d+$/.test(value))
48
+ return value;
49
+ throw meetingValidationError('id_invalid', `${label} 必须是数字 id(超长 id 用字符串)`);
50
+ }
51
+ /** 逗号分隔 id 串:接受数组或字符串,输出字符串。 */
52
+ export function toIdCsv(value, label) {
53
+ if (value === undefined || value === null || value === '')
54
+ return undefined;
55
+ const parts = Array.isArray(value)
56
+ ? value
57
+ : String(value).split(',');
58
+ return parts.map((item) => toIdString(item, label).trim()).filter(Boolean).join(',');
59
+ }
60
+ /** 标准版列表响应归一化:提取 rows/displayData/data 数组。 */
61
+ export function extractRows(value) {
62
+ const data = value?.data ?? value;
63
+ if (Array.isArray(data?.displayData)) {
64
+ return { rows: data.displayData, total: data.total };
65
+ }
66
+ if (Array.isArray(data?.data?.rows)) {
67
+ return { rows: data.data.rows, total: data.data.count ?? data.total };
68
+ }
69
+ if (Array.isArray(data?.rows)) {
70
+ return { rows: data.rows, total: data.count ?? data.total };
71
+ }
72
+ if (Array.isArray(data?.data)) {
73
+ return { rows: data.data, total: data.total };
74
+ }
75
+ if (Array.isArray(data?.datas)) {
76
+ return { rows: data.datas, total: data.total };
77
+ }
78
+ return { rows: [], total: 0 };
79
+ }
80
+ /** 冲突接口返回归一化:提取 cansub(是否可提交)与冲突描述。 */
81
+ export function extractConflict(value) {
82
+ const payload = value?.data ?? value ?? {};
83
+ const cansubRaw = payload.cansub ?? payload.canSub;
84
+ const cansub = typeof cansubRaw === 'boolean' ? cansubRaw : undefined;
85
+ const message = [payload.conflictMsg, payload.conflictmsg, payload.message, payload.msg]
86
+ .find((item) => typeof item === 'string' && item.trim()) || '';
87
+ return { cansub, message };
88
+ }
89
+ /**
90
+ * 回查会议是否存在且可读(getMeetingDetailField)。
91
+ *
92
+ * 注意:**权限判定不在 CLI 侧做**。源码依据:
93
+ * - MeetingPermissionEvent 用 MeetingBaseServiceUtils.getShowButtons(会议, operateType, tenant, user)
94
+ * 按会议状态 + 会议基础设置 + 权限判定按钮,并在不通过时返回本地化提示
95
+ * (如"您没有变更权限!"/"您没有取消权限!"/"您没有提前结束权限!");
96
+ * - getMeetingDetailField 返回的 showButtons 是页面新建按钮配置(实测为 ["save","submit"]),
97
+ * 其中 canChange/canCancel/canDel 等键并不存在,不能作为权限依据。
98
+ * 因此 CLI 只确认目标存在,权限交给服务端,并把服务端返回的提示原样透传给用户。
99
+ */
100
+ export async function assertMeetingExists(id, host, operation) {
101
+ try {
102
+ await host.request({
103
+ method: 'GET',
104
+ path: '/api/meeting/detail/getMeetingDetailField',
105
+ operation,
106
+ query: { id },
107
+ });
108
+ }
109
+ catch (error) {
110
+ throw meetingValidationError('meeting_not_operable', `未能确认会议 ${id} 存在或可读(getMeetingDetailField 查询失败):${error instanceof Error ? error.message : String(error)}`);
111
+ }
112
+ }
@@ -0,0 +1,41 @@
1
+ import { meetingSuccess, SCHEMA_ID } from './types.js';
2
+ import { extractRows, toIdString } from './shared.js';
3
+ // ---------------------------------------------------------------------------
4
+ // 签到列表(getMeetingSignInfoList)
5
+ // ---------------------------------------------------------------------------
6
+ const meetingSignList = {
7
+ name: 'meeting.sign.list',
8
+ resource: 'sign',
9
+ method: 'sign.list',
10
+ action: 'meeting.sign.list',
11
+ summary: '查询会议签到记录(getMeetingSignInfoList)并输出已签/未签统计',
12
+ capability: 'sign',
13
+ risk: 'read',
14
+ inputSchema: {
15
+ type: 'object',
16
+ additionalProperties: false,
17
+ properties: {
18
+ mtId: { ...SCHEMA_ID, description: '会议 id(必填)' },
19
+ },
20
+ required: ['mtId'],
21
+ },
22
+ handler: async (args, { host }) => {
23
+ // 源码依据(MeetingSignController.getMeetingSignInfoList):body 是 Map,
24
+ // 方法体读取的键名是 "meetingid"(不是 mtId);缺失会 Long.parseLong("") 抛异常。
25
+ // 对外 CLI 参数保持 mtId 统一,此处仅做键名适配。
26
+ const response = await host.request({
27
+ method: 'POST',
28
+ path: '/api/meeting/sign/getMeetingSignInfoList',
29
+ operation: 'meeting.sign.list',
30
+ body: { meetingid: toIdString(args.mtId, 'mtId') },
31
+ });
32
+ const { rows, total } = extractRows(response);
33
+ const signed = rows.filter((row) => row?.signtime !== undefined && row?.signtime !== null && row?.signtime !== '').length;
34
+ return meetingSuccess('meeting.sign.list', {
35
+ total,
36
+ summary: { total: rows.length, signed, unsigned: Math.max(rows.length - signed, 0) },
37
+ signs: rows,
38
+ });
39
+ },
40
+ };
41
+ export const meetingSignOperations = [meetingSignList];
@@ -0,0 +1,25 @@
1
+ export function meetingSuccess(action, data, options = {}) {
2
+ const payload = { ok: true, action, data };
3
+ if (options.meta && Object.keys(options.meta).length > 0)
4
+ payload.meta = options.meta;
5
+ if (options.warnings && options.warnings.length > 0)
6
+ payload.warnings = options.warnings;
7
+ return payload;
8
+ }
9
+ /** 构造「对象类型 + 严格禁止额外字段」的 JSON Schema。 */
10
+ export function schemaOf(properties, options = {}) {
11
+ return {
12
+ type: 'object',
13
+ additionalProperties: false,
14
+ properties,
15
+ ...(options.required?.length ? { required: options.required } : {}),
16
+ ...(options.description ? { description: options.description } : {}),
17
+ };
18
+ }
19
+ /** E10 长 ID:源资料返回字符串,请求也接受数字或数字字符串(超 2^53 必须字符串)。 */
20
+ export const SCHEMA_ID = { oneOf: [{ type: 'integer' }, { type: 'string', pattern: '^\\d+$' }] };
21
+ export const SCHEMA_ID_LIST = { type: 'array', items: SCHEMA_ID };
22
+ /** 会议时间格式 yyyy-MM-dd HH:mm(标准版 @DateTimeFormat 契约)。 */
23
+ export const SCHEMA_DATETIME_MINUTE = { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$' };
24
+ /** 日期格式 yyyy-MM-dd。 */
25
+ export const SCHEMA_DATE = { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' };
@@ -0,0 +1,19 @@
1
+ import { getMeetingOperation } from './operations/registry.js';
2
+ import { assertNoForbiddenKeys, asObject } from './operations/shared.js';
3
+ export async function executeMeetingOperation(operation, rawInput, context) {
4
+ const definition = getMeetingOperation(operation);
5
+ const input = asObject(rawInput);
6
+ assertNoForbiddenKeys(input);
7
+ const host = {
8
+ request(request) {
9
+ return context.host.request({
10
+ ...request,
11
+ operation: request.operation || operation,
12
+ });
13
+ },
14
+ getSession() {
15
+ return context.host.getSession();
16
+ },
17
+ };
18
+ return definition.handler(input, { ...context, host });
19
+ }
@@ -0,0 +1,70 @@
1
+ import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { homedir } from 'node:os';
5
+ import { resolve } from 'node:path';
6
+ import { planValidationError } from './errors.js';
7
+ export function planStateRoot(ctx) {
8
+ const configured = ctx?.config?.path();
9
+ if (configured)
10
+ return resolve(configured, '..');
11
+ return process.env.WEAVER_WORK_CLI_HOME || process.env.WORK_CLI_HOME || resolve(homedir(), '.weaver-work-cli');
12
+ }
13
+ async function loadKey(ctx) {
14
+ const keysDir = resolve(planStateRoot(ctx), 'keys');
15
+ const filename = resolve(keysDir, 'plan-continuation.key');
16
+ await mkdir(keysDir, { recursive: true, mode: 0o700 });
17
+ if (existsSync(filename))
18
+ return readFile(filename);
19
+ const key = randomBytes(32);
20
+ try {
21
+ await writeFile(filename, key, { flag: 'wx', mode: 0o600 });
22
+ if (process.platform !== 'win32')
23
+ await chmod(filename, 0o600).catch(() => undefined);
24
+ return key;
25
+ }
26
+ catch {
27
+ return readFile(filename);
28
+ }
29
+ }
30
+ function encode(value) {
31
+ return Buffer.from(JSON.stringify(value)).toString('base64url');
32
+ }
33
+ function signature(payload, key) {
34
+ return createHmac('sha256', key).update(payload).digest('base64url');
35
+ }
36
+ export function createPlanContinuationSigner(ctx) {
37
+ return {
38
+ async issue(payload, ttlMs = 10 * 60_000) {
39
+ const issuedAt = Date.now();
40
+ const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
+ const sig = signature(body, await loadKey(ctx));
42
+ return `${body}.${sig}`;
43
+ },
44
+ async verify(token, expectedOperation) {
45
+ if (typeof token !== 'string' || !token.includes('.')) {
46
+ throw planValidationError('continuation_invalid', 'continuation 无效');
47
+ }
48
+ const [body, provided] = token.split('.');
49
+ const expected = signature(body, await loadKey(ctx));
50
+ const valid = provided.length === expected.length
51
+ && timingSafeEqual(Buffer.from(provided), Buffer.from(expected));
52
+ if (!valid)
53
+ throw planValidationError('continuation_invalid', 'continuation 签名校验失败');
54
+ let value;
55
+ try {
56
+ value = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
57
+ }
58
+ catch {
59
+ throw planValidationError('continuation_invalid', 'continuation 内容无法解析');
60
+ }
61
+ if (value.operation !== expectedOperation) {
62
+ throw planValidationError('continuation_mismatch', 'continuation 不属于当前操作');
63
+ }
64
+ if (!Number.isSafeInteger(value.expiresAt) || value.expiresAt < Date.now()) {
65
+ throw planValidationError('continuation_expired', 'continuation 已过期');
66
+ }
67
+ return value;
68
+ },
69
+ };
70
+ }
@@ -0,0 +1,70 @@
1
+ import { CliError, ExitCode } from '../../core/errors.js';
2
+ export class PlanCliError extends CliError {
3
+ type;
4
+ subtype;
5
+ code;
6
+ retryable;
7
+ stage;
8
+ details;
9
+ partialData;
10
+ constructor(type, subtype, message, options = {}) {
11
+ super(message, options.exitCode ?? ExitCode.InternalError);
12
+ this.name = 'PlanCliError';
13
+ this.type = type;
14
+ this.subtype = subtype;
15
+ this.code = options.code;
16
+ this.retryable = options.retryable ?? false;
17
+ this.stage = options.stage;
18
+ this.details = options.details;
19
+ this.partialData = options.partialData;
20
+ }
21
+ }
22
+ export function planValidationError(subtype, message, details) {
23
+ return new PlanCliError('validation', subtype, message, {
24
+ details,
25
+ exitCode: ExitCode.UsageError,
26
+ });
27
+ }
28
+ export function planAuthError(subtype, message, details) {
29
+ return new PlanCliError('authentication', subtype, message, {
30
+ details,
31
+ exitCode: ExitCode.AuthError,
32
+ });
33
+ }
34
+ export function planNetworkError(subtype, message, options = {}) {
35
+ return new PlanCliError('network', subtype, message, {
36
+ ...options,
37
+ retryable: options.retryable ?? true,
38
+ exitCode: ExitCode.NetworkError,
39
+ });
40
+ }
41
+ export function planApiError(subtype, message, details) {
42
+ return new PlanCliError('api', subtype, message, {
43
+ details,
44
+ exitCode: ExitCode.GeneralError,
45
+ });
46
+ }
47
+ export function planConfirmationError(action, details) {
48
+ return new PlanCliError('confirmation', 'required', '该操作需要明确确认', {
49
+ details: { action, ...details },
50
+ exitCode: ExitCode.ConfirmationRequired,
51
+ });
52
+ }
53
+ /** 当前接口链路不支持该能力:不是输入错误,而是源资料未提供该链路的实现依据。 */
54
+ export function planUnsupportedError(subtype, message, details) {
55
+ return new PlanCliError('policy', subtype, message, {
56
+ details,
57
+ exitCode: ExitCode.PolicyError,
58
+ });
59
+ }
60
+ export function planPartialError(message, partialData, details) {
61
+ return new PlanCliError('partial', 'write_uncertain', message, {
62
+ details,
63
+ partialData,
64
+ exitCode: ExitCode.Partial,
65
+ });
66
+ }
67
+ /** 按结构化错误的 type 判定类型(不依赖类实例,兼容包装过的错误对象)。 */
68
+ export function isPlanErrorType(error, type) {
69
+ return Boolean(error && typeof error === 'object' && error.type === type);
70
+ }
@@ -0,0 +1,180 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { resolve } from 'node:path';
5
+ import { getActiveProfile } from '../../internal/e10/auth/session.js';
6
+ import { requireE10Session } from '../../internal/e10/context.js';
7
+ import { E10ApiError, createE10RequestRuntime } from '../../internal/e10/request-runtime.js';
8
+ import { planStateRoot } from './continuation.js';
9
+ import { PlanCliError, planAuthError, planNetworkError, planValidationError } from './errors.js';
10
+ function inferProfile(ctx) {
11
+ const options = ctx.getGlobalOptions();
12
+ return options.profile || getActiveProfile();
13
+ }
14
+ function cacheFilename(root, key) {
15
+ const digest = createHash('sha256').update(key).digest('hex').slice(0, 40);
16
+ return resolve(root, 'cache', 'plan', `${digest}.json`);
17
+ }
18
+ async function readCacheFile(root, key) {
19
+ const file = cacheFilename(root, key);
20
+ if (!existsSync(file))
21
+ return undefined;
22
+ try {
23
+ const parsed = JSON.parse(await readFile(file, 'utf8'));
24
+ if (parsed.key !== key)
25
+ return undefined;
26
+ if (typeof parsed.expiresAt === 'number' && parsed.expiresAt < Date.now())
27
+ return undefined;
28
+ return parsed.value;
29
+ }
30
+ catch {
31
+ return undefined;
32
+ }
33
+ }
34
+ async function writeCacheFile(root, key, value, ttlMs) {
35
+ const file = cacheFilename(root, key);
36
+ await mkdir(resolve(file, '..'), { recursive: true });
37
+ const payload = {
38
+ key,
39
+ value,
40
+ expiresAt: ttlMs === undefined ? null : Date.now() + ttlMs,
41
+ updatedAt: new Date().toISOString(),
42
+ };
43
+ await writeFile(file, `${JSON.stringify(payload)}\n`, 'utf8');
44
+ }
45
+ /** 统一业务错误消息提取。 */
46
+ export function businessMessage(value) {
47
+ if (!value || typeof value !== 'object')
48
+ return '泛微接口返回业务失败';
49
+ const candidates = [
50
+ value.msg,
51
+ value.message,
52
+ value.resultMsg,
53
+ value.datajson?.message,
54
+ value.datajson?.msg,
55
+ ];
56
+ for (const item of candidates) {
57
+ if (typeof item === 'string' && item.trim())
58
+ return item;
59
+ }
60
+ return '泛微接口返回业务失败';
61
+ }
62
+ /** ebuilder datajson 结构成功判定:`datajson.status === true`(兼容字符串 "true")。 */
63
+ export function isDatajsonSuccess(value) {
64
+ const status = value?.datajson?.status;
65
+ return status === true || status === 'true';
66
+ }
67
+ /** 标准版标记型成功判定:`status` 为 "1" / 1 / true。 */
68
+ export function isFlagSuccess(value) {
69
+ const status = value?.status;
70
+ return status === '1' || status === 1 || status === true;
71
+ }
72
+ /** 提醒类接口成功判定:`code === 200` 且非 `status === false`。 */
73
+ export function isWeaverCodeSuccess(value) {
74
+ if (!value || typeof value !== 'object')
75
+ return false;
76
+ if (Number(value.code) !== 200)
77
+ return false;
78
+ return value.status !== false && value.status !== 'false';
79
+ }
80
+ function assertPath(requestPath) {
81
+ if (typeof requestPath !== 'string' || !requestPath.startsWith('/') || requestPath.startsWith('//')) {
82
+ throw planValidationError('path_invalid', '请求路径必须是相对绝对路径');
83
+ }
84
+ if (/^https?:/i.test(requestPath) || /[\r\n]/.test(requestPath) || requestPath.includes('/../')) {
85
+ throw planValidationError('path_invalid', '请求路径不允许跨域或路径逃逸');
86
+ }
87
+ if (!requestPath.startsWith('/api/')) {
88
+ throw planValidationError('path_not_allowed', '计划报告模块只能调用 /api/ 路径');
89
+ }
90
+ }
91
+ function omitEmptyQueryValues(query) {
92
+ if (!query)
93
+ return undefined;
94
+ return Object.fromEntries(Object.entries(query).filter(([, value]) => value !== '' && value !== undefined && value !== null));
95
+ }
96
+ function mapRuntimeNetworkError(error) {
97
+ if (error instanceof E10ApiError && error.type === 'network') {
98
+ throw planNetworkError(error.subtype, error.message, {
99
+ retryable: error.retryable,
100
+ details: error.details,
101
+ });
102
+ }
103
+ throw error;
104
+ }
105
+ export function createPlanHost(ctx, dependencies = {}) {
106
+ let e10Session = null;
107
+ let sessionContext = null;
108
+ const requireSession = dependencies.requireSession || requireE10Session;
109
+ const cacheRoot = planStateRoot(ctx);
110
+ async function ensureSession() {
111
+ if (!e10Session) {
112
+ e10Session = await requireSession(ctx);
113
+ sessionContext = {
114
+ baseUrl: e10Session.getBaseUrl(),
115
+ profile: inferProfile(ctx),
116
+ userId: e10Session.userId,
117
+ tenantKey: e10Session.tenantKey,
118
+ eteamsId: e10Session.eteamsId,
119
+ };
120
+ }
121
+ return e10Session;
122
+ }
123
+ async function getSession() {
124
+ await ensureSession();
125
+ return sessionContext;
126
+ }
127
+ async function runtime() {
128
+ return createE10RequestRuntime(ctx, await ensureSession(), {
129
+ interceptors: dependencies.interceptors,
130
+ fetch: dependencies.fetch,
131
+ });
132
+ }
133
+ async function request(request) {
134
+ const { method, path, query, body, operation, timeoutMs = 30_000 } = request;
135
+ assertPath(path);
136
+ let response;
137
+ try {
138
+ response = await (await runtime()).requestJson({
139
+ module: 'plan',
140
+ operation,
141
+ method: (method || 'POST').toUpperCase(),
142
+ path,
143
+ query: omitEmptyQueryValues(query),
144
+ body,
145
+ headers: { 'X-Requested-With': 'XMLHttpRequest' },
146
+ timeoutMs,
147
+ });
148
+ }
149
+ catch (error) {
150
+ mapRuntimeNetworkError(error);
151
+ }
152
+ if (response.status === 401 || response.status === 302) {
153
+ throw planAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> 完成登录', { httpStatus: response.status });
154
+ }
155
+ if (response.parseError) {
156
+ throw planNetworkError('protocol', `接口返回不是合法 JSON(HTTP ${response.status})`, { retryable: false });
157
+ }
158
+ if (response.status === 404) {
159
+ throw new PlanCliError('api', 'endpoint_not_found', `接口返回 404,当前环境可能未安装「计划报告」相关应用或接口(${path})`, {
160
+ code: response.status,
161
+ details: { path },
162
+ exitCode: 1,
163
+ });
164
+ }
165
+ if (response.status < 200 || response.status >= 300) {
166
+ throw new PlanCliError('api', 'http_error', `泛微接口 HTTP ${response.status}`, {
167
+ code: response.status,
168
+ details: { status: response.status, message: businessMessage(response.value) },
169
+ exitCode: 1,
170
+ });
171
+ }
172
+ return response.value;
173
+ }
174
+ return {
175
+ request,
176
+ getSession,
177
+ getCache: (key) => readCacheFile(cacheRoot, key),
178
+ setCache: (key, value, ttlMs) => writeCacheFile(cacheRoot, key, value, ttlMs),
179
+ };
180
+ }
@@ -0,0 +1,150 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { createPlanContinuationSigner } from './continuation.js';
4
+ import { planValidationError } from './errors.js';
5
+ import { createPlanHost } from './host.js';
6
+ import { planManifest } from './manifest.js';
7
+ import { executePlanOperation } from './operations.js';
8
+ function asOptions(value) {
9
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
10
+ }
11
+ async function readStdin() {
12
+ const chunks = [];
13
+ for await (const chunk of process.stdin) {
14
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
15
+ }
16
+ return Buffer.concat(chunks).toString('utf8');
17
+ }
18
+ function stripBom(value) {
19
+ return value.replace(/^\uFEFF+/, '');
20
+ }
21
+ export async function inputFrom(options, extra = {}) {
22
+ const opts = asOptions(options);
23
+ let input = {};
24
+ if (opts.input && opts.inputJson) {
25
+ throw planValidationError('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 planValidationError('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 planValidationError('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 executePlanOperation(operation, input, {
79
+ ctx,
80
+ host: createPlanHost(ctx),
81
+ continuation: createPlanContinuationSigner(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 planShortcut = {
91
+ name: 'plan',
92
+ description: '泛微E10计划报告 CLI(查询/新建/修改/发布/撤回/提交提醒/评论)',
93
+ category: 'shortcut',
94
+ register({ program, action }) {
95
+ const plan = program.command('plan').description('泛微E10计划报告(报告详情/列表/新建/修改/发布/撤回/提交提醒/评论)');
96
+ plan.command('schema')
97
+ .description('Print plan operation manifest for agents')
98
+ .action(action((ctx) => {
99
+ ctx.output.write(planManifest, { json: true });
100
+ }));
101
+ plan.command('run')
102
+ .description('Run a plan operation with JSON input')
103
+ .argument('<operation>', 'operation name, e.g. plan.report.get')
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
+ // 高频便捷命令
110
+ plan.command('route')
111
+ .description('判定当前租户报告接口链路(plan.version.check 薄包装)')
112
+ .option('--refresh', '忽略 1 天租户缓存,强制重新判定')
113
+ .action(action(async (ctx, options) => {
114
+ const opts = asOptions(options);
115
+ await executeAndPrint(ctx, 'plan.version.check', opts.refresh ? { refresh: true } : {});
116
+ }));
117
+ plan.command('get')
118
+ .description('查询单份报告详情(plan.report.get 薄包装)')
119
+ .option('--input <path>', 'JSON input file, or - for stdin')
120
+ .option('--input-json <json>', 'inline JSON input object')
121
+ .option('--id <id>', '报告 id')
122
+ .option('--year <year>', '报告年份')
123
+ .option('--type <type>', '报告类型:week/month/season/halfYear/year')
124
+ .option('--serial-number <n>', '报告周期')
125
+ .option('--creator-user-id <id>', '报告创建人 id')
126
+ .action(action(async (ctx, options) => {
127
+ const opts = asOptions(options);
128
+ await executeAndPrint(ctx, 'plan.report.get', await inputFrom(options, {
129
+ id: opts.id,
130
+ year: opts.year,
131
+ type: opts.type,
132
+ serialNumber: opts.serialNumber,
133
+ creatorUserId: opts.creatorUserId,
134
+ }));
135
+ }));
136
+ plan.command('list')
137
+ .description('分页查询报告列表(plan.report.page 薄包装)')
138
+ .option('--input <path>', 'JSON input file, or - for stdin')
139
+ .option('--input-json <json>', 'inline JSON input object')
140
+ .option('--page-no <n>', '页码')
141
+ .option('--page-size <n>', '每页条数')
142
+ .action(action(async (ctx, options) => {
143
+ const opts = asOptions(options);
144
+ await executeAndPrint(ctx, 'plan.report.page', await inputFrom(options, {
145
+ pageNo: opts.pageNo,
146
+ pageSize: opts.pageSize,
147
+ }));
148
+ }));
149
+ },
150
+ };