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
@@ -2,6 +2,7 @@ import { createHash } from 'node:crypto';
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import { requireE10Session } from '../../internal/e10/context.js';
4
4
  import { getActiveProfile } from '../../internal/e10/auth/session.js';
5
+ import { createE10RequestRuntime } from '../../internal/e10/request-runtime.js';
5
6
  import { InvoiceCliError, invoiceAuthError, invoiceNetworkError, invoiceValidationError, } from './errors.js';
6
7
  const MAX_DOWNLOAD_BYTES = 50 * 1024 * 1024;
7
8
  const TOKEN_SERVICE = 'cn.weaver.weaver-work-cli.invoice-token';
@@ -17,38 +18,6 @@ function assertPath(requestPath) {
17
18
  throw invoiceValidationError('path_not_allowed', '业票通只能调用 /api/ 路径');
18
19
  }
19
20
  }
20
- function withQuery(baseUrl, requestPath, query = {}) {
21
- const url = new URL(`${baseUrl}${requestPath}`);
22
- for (const [key, value] of Object.entries(query)) {
23
- if (value === undefined || value === null)
24
- continue;
25
- if (Array.isArray(value)) {
26
- for (const item of value)
27
- url.searchParams.append(key, String(item));
28
- }
29
- else {
30
- url.searchParams.set(key, String(value));
31
- }
32
- }
33
- return url;
34
- }
35
- async function fetchWithTimeout(url, options, timeoutMs) {
36
- const controller = new AbortController();
37
- const timer = setTimeout(() => controller.abort(), timeoutMs);
38
- try {
39
- return await fetch(url, { ...options, signal: controller.signal });
40
- }
41
- catch (error) {
42
- if (error instanceof Error && error.name === 'AbortError') {
43
- throw invoiceNetworkError('timeout', `请求超时(${timeoutMs}ms)`, { retryable: false });
44
- }
45
- const message = error instanceof Error ? error.message : String(error);
46
- throw invoiceNetworkError('transport', `请求失败:${message}`, { retryable: true });
47
- }
48
- finally {
49
- clearTimeout(timer);
50
- }
51
- }
52
21
  function responseRoot(value) {
53
22
  return value?.res_base || value?.data?.res_base || value;
54
23
  }
@@ -121,17 +90,8 @@ function inferProfile(ctx) {
121
90
  const options = ctx.getGlobalOptions();
122
91
  return options.profile || getActiveProfile();
123
92
  }
124
- function requestHeaders(session, invoiceToken) {
125
- const headers = {
126
- Accept: 'application/json, text/plain, */*',
127
- Cookie: session.cookieHeader(),
128
- eteamsid: session.eteamsId,
129
- 'User-Agent': session.uaHeader(),
130
- Origin: session.getBaseUrl(),
131
- };
132
- if (invoiceToken)
133
- headers.token = invoiceToken;
134
- return headers;
93
+ function trustedInvoiceHeaders(invoiceToken) {
94
+ return invoiceToken ? { token: invoiceToken } : {};
135
95
  }
136
96
  export function createInvoiceHost(ctx, dependencies = {}) {
137
97
  let e10Session = null;
@@ -196,6 +156,12 @@ export function createInvoiceHost(ctx, dependencies = {}) {
196
156
  invoiceToken = null;
197
157
  await tokenStore?.clear().catch(() => false);
198
158
  }
159
+ async function runtime() {
160
+ return createE10RequestRuntime(ctx, await ensureSession(), {
161
+ interceptors: dependencies.interceptors,
162
+ fetch: dependencies.fetch,
163
+ });
164
+ }
199
165
  function businessError(value) {
200
166
  const code = responseCode(value);
201
167
  return new InvoiceCliError('api', 'business_error', responseMessage(value), {
@@ -212,32 +178,28 @@ export function createInvoiceHost(ctx, dependencies = {}) {
212
178
  await clearCachedInvoiceToken();
213
179
  if (canRetry)
214
180
  return retry();
215
- throw invoiceAuthError('invoice_session_expired', '发票业务登录态已失效,已清理本地发票 Token;请重新运行 weaver-work-cli auth login --base-url <域名> 后再试', { ret: code });
181
+ throw invoiceAuthError('invoice_session_expired', '发票业务登录态已失效,已清理本地发票 Token;请重新运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 后再试', { ret: code });
216
182
  }
217
183
  throw businessError(value);
218
184
  }
219
185
  async function invoiceRequest(request, canRetryExpiredToken = true) {
220
- const { method = 'POST', path, query, body, needsInvoiceToken = true, timeoutMs = 30_000, } = request;
186
+ const { method = 'POST', path, query, body, operation, needsInvoiceToken = true, timeoutMs = 30_000, } = request;
221
187
  assertPath(path);
222
188
  const token = await ensureContext(needsInvoiceToken, timeoutMs, path);
223
- const session = await ensureSession();
224
- const url = withQuery(session.getBaseUrl(), path, query);
225
- const headers = requestHeaders(session, token);
226
- const init = { method, headers, redirect: 'manual' };
227
- if (body !== undefined) {
228
- headers['Content-Type'] = 'application/json;charset=UTF-8';
229
- init.body = JSON.stringify(body);
230
- }
231
- const response = await fetchWithTimeout(url, init, timeoutMs);
232
- const text = await response.text();
189
+ const response = await (await runtime()).requestJson({
190
+ module: 'invoice',
191
+ operation,
192
+ method,
193
+ path,
194
+ query,
195
+ body,
196
+ timeoutMs,
197
+ trustedHeaders: trustedInvoiceHeaders(token),
198
+ });
233
199
  if (response.status === 401 || response.status === 302) {
234
- throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> 完成登录', { httpStatus: response.status });
235
- }
236
- let value = {};
237
- try {
238
- value = text ? JSON.parse(text) : {};
200
+ throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 完成登录', { httpStatus: response.status });
239
201
  }
240
- catch {
202
+ if (response.parseError) {
241
203
  if (response.status < 200 || response.status >= 300) {
242
204
  throw new InvoiceCliError('api', 'http_error', `泛微接口 HTTP ${response.status}`, {
243
205
  code: response.status,
@@ -250,20 +212,28 @@ export function createInvoiceHost(ctx, dependencies = {}) {
250
212
  if (response.status < 200 || response.status >= 300) {
251
213
  throw new InvoiceCliError('api', 'http_error', `泛微接口 HTTP ${response.status}`, {
252
214
  code: response.status,
253
- details: { status: response.status, message: responseMessage(value) },
215
+ details: { status: response.status, message: responseMessage(response.value) },
254
216
  exitCode: 1,
255
217
  });
256
218
  }
219
+ let value = response.value;
220
+ if (request.rewriteJsonText && response.text) {
221
+ try {
222
+ value = JSON.parse(request.rewriteJsonText(response.text));
223
+ }
224
+ catch {
225
+ value = response.value;
226
+ }
227
+ }
257
228
  return handleBusinessResponse(value, () => invoiceRequest(request, false), canRetryExpiredToken && Boolean(token));
258
229
  }
259
230
  async function invoiceMultipartRequest(request, canRetryExpiredToken = true) {
260
- const { method = 'POST', path, query, fields = {}, file, needsInvoiceToken = true, timeoutMs = 30_000, } = request;
261
- if (!file && !fields.url) {
262
- throw invoiceValidationError('input_invalid', 'multipart 请求需要文件或 URL');
231
+ const { method = 'POST', path, query, fields = {}, file, operation, needsInvoiceToken = true, timeoutMs = 30_000, } = request;
232
+ if (!file && !Object.values(fields).some((value) => value !== undefined && value !== null && value !== '')) {
233
+ throw invoiceValidationError('input_invalid', 'multipart 请求需要文件、URL 或表单字段');
263
234
  }
264
235
  assertPath(path);
265
236
  const token = await ensureContext(needsInvoiceToken, timeoutMs, path);
266
- const session = await ensureSession();
267
237
  const form = new FormData();
268
238
  for (const [key, value] of Object.entries(fields)) {
269
239
  if (value === undefined || value === null)
@@ -274,53 +244,87 @@ export function createInvoiceHost(ctx, dependencies = {}) {
274
244
  const content = await readFile(file.path);
275
245
  form.append('file', new Blob([content], { type: file.mimeType || 'application/octet-stream' }), file.name);
276
246
  }
277
- const response = await fetchWithTimeout(withQuery(session.getBaseUrl(), path, query), {
247
+ const response = await (await runtime()).requestJson({
248
+ module: 'invoice',
249
+ operation,
278
250
  method,
279
- headers: requestHeaders(session, token),
280
- body: form,
281
- redirect: 'manual',
282
- }, timeoutMs);
283
- const text = await response.text();
251
+ path,
252
+ query,
253
+ formData: form,
254
+ timeoutMs,
255
+ trustedHeaders: trustedInvoiceHeaders(token),
256
+ });
284
257
  if (response.status === 401 || response.status === 302) {
285
- throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> 完成登录', { httpStatus: response.status });
258
+ throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 完成登录', { httpStatus: response.status });
259
+ }
260
+ if (response.parseError) {
261
+ throw invoiceNetworkError('protocol', `接口返回不是合法 JSON(HTTP ${response.status})`, { retryable: false });
262
+ }
263
+ if (response.status < 200 || response.status >= 300) {
264
+ throw new InvoiceCliError('api', 'http_error', `泛微接口 HTTP ${response.status}`, {
265
+ code: response.status,
266
+ details: { status: response.status, message: responseMessage(response.value) },
267
+ exitCode: 1,
268
+ });
269
+ }
270
+ return handleBusinessResponse(response.value, () => invoiceMultipartRequest(request, false), canRetryExpiredToken && Boolean(token));
271
+ }
272
+ async function invoiceFormRequest(request, canRetryExpiredToken = true) {
273
+ const { method = 'POST', path, query, fields = {}, operation, needsInvoiceToken = true, timeoutMs = 30_000, } = request;
274
+ assertPath(path);
275
+ const token = await ensureContext(needsInvoiceToken, timeoutMs, path);
276
+ const form = new URLSearchParams();
277
+ for (const [key, value] of Object.entries(fields)) {
278
+ if (value === undefined || value === null)
279
+ continue;
280
+ form.set(key, typeof value === 'string' ? value : JSON.stringify(value));
286
281
  }
287
- let value = {};
288
- try {
289
- value = text ? JSON.parse(text) : {};
282
+ const response = await (await runtime()).requestJson({
283
+ module: 'invoice',
284
+ operation,
285
+ method,
286
+ path,
287
+ query,
288
+ form,
289
+ timeoutMs,
290
+ trustedHeaders: trustedInvoiceHeaders(token),
291
+ });
292
+ if (response.status === 401 || response.status === 302) {
293
+ throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 完成登录', { httpStatus: response.status });
290
294
  }
291
- catch {
295
+ if (response.parseError) {
292
296
  throw invoiceNetworkError('protocol', `接口返回不是合法 JSON(HTTP ${response.status})`, { retryable: false });
293
297
  }
294
298
  if (response.status < 200 || response.status >= 300) {
295
299
  throw new InvoiceCliError('api', 'http_error', `泛微接口 HTTP ${response.status}`, {
296
300
  code: response.status,
297
- details: { status: response.status, message: responseMessage(value) },
301
+ details: { status: response.status, message: responseMessage(response.value) },
298
302
  exitCode: 1,
299
303
  });
300
304
  }
301
- return handleBusinessResponse(value, () => invoiceMultipartRequest(request, false), canRetryExpiredToken && Boolean(token));
305
+ return handleBusinessResponse(response.value, () => invoiceFormRequest(request, false), canRetryExpiredToken && Boolean(token));
302
306
  }
303
- async function invoiceDownload({ id, fid, needLog = false, timeoutMs = 30_000 }, canRetryExpiredToken = true) {
307
+ async function invoiceDownload({ id, fid, needLog = false, operation, timeoutMs = 30_000 }, canRetryExpiredToken = true) {
304
308
  const token = await ensureContext(true, timeoutMs, '/api/inc/file/download');
305
- const session = await ensureSession();
306
- const url = withQuery(session.getBaseUrl(), '/api/inc/file/download', { id, fid, needLog });
307
- const response = await fetchWithTimeout(url, {
309
+ const response = await (await runtime()).requestBinary({
310
+ module: 'invoice',
311
+ operation,
308
312
  method: 'GET',
309
- headers: {
310
- ...requestHeaders(session, token),
311
- Accept: 'application/octet-stream, application/pdf, */*',
312
- },
313
- redirect: 'manual',
314
- }, timeoutMs);
313
+ path: '/api/inc/file/download',
314
+ query: { id, fid, needLog },
315
+ headers: { Accept: 'application/octet-stream, application/pdf, */*' },
316
+ timeoutMs,
317
+ trustedHeaders: trustedInvoiceHeaders(token),
318
+ });
315
319
  if (response.status === 401 || response.status === 302) {
316
- throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> 完成登录', { httpStatus: response.status });
320
+ throw invoiceAuthError('session_expired', 'E10 登录态已失效,请先向用户确认 E10 登录域名,再运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 完成登录', { httpStatus: response.status });
317
321
  }
318
- const contentType = response.headers.get('content-type') || 'application/octet-stream';
322
+ const contentType = response.contentType;
319
323
  const declaredLength = Number(response.headers.get('content-length'));
320
324
  if (Number.isFinite(declaredLength) && declaredLength > MAX_DOWNLOAD_BYTES) {
321
325
  throw invoiceNetworkError('response_too_large', `下载文件超过 ${MAX_DOWNLOAD_BYTES} 字节限制`, { retryable: false });
322
326
  }
323
- const content = Buffer.from(await response.arrayBuffer());
327
+ const content = response.content;
324
328
  const looksLikeJson = /^[\s\r\n]*[\[{]/u.test(content.subarray(0, 64).toString('utf8'));
325
329
  if (response.status < 200 || response.status >= 300 || contentType.includes('json') || looksLikeJson) {
326
330
  let value = {};
@@ -333,8 +337,8 @@ export function createInvoiceHost(ctx, dependencies = {}) {
333
337
  if (isInvoiceSessionExpired(value)) {
334
338
  await clearCachedInvoiceToken();
335
339
  if (canRetryExpiredToken && token)
336
- return invoiceDownload({ id, fid, needLog, timeoutMs }, false);
337
- throw invoiceAuthError('invoice_session_expired', '发票业务登录态已失效,已清理本地发票 Token;请重新运行 weaver-work-cli auth login --base-url <域名> 后再试', { ret: responseCode(value), status: response.status });
340
+ return invoiceDownload({ id, fid, needLog, operation, timeoutMs }, false);
341
+ throw invoiceAuthError('invoice_session_expired', '发票业务登录态已失效,已清理本地发票 Token;请重新运行 weaver-work-cli auth login --base-url <域名> --agent_type <当前智能体名称> 后再试', { ret: responseCode(value), status: response.status });
338
342
  }
339
343
  throw new InvoiceCliError('api', 'download_failed', responseMessage(value) || `下载失败(HTTP ${response.status})`, {
340
344
  code: response.status,
@@ -353,6 +357,7 @@ export function createInvoiceHost(ctx, dependencies = {}) {
353
357
  return {
354
358
  invoiceRequest,
355
359
  invoiceMultipartRequest,
360
+ invoiceFormRequest,
356
361
  invoiceDownload,
357
362
  getSession,
358
363
  invalidateToken() {
@@ -15,9 +15,15 @@ async function readStdin() {
15
15
  }
16
16
  return Buffer.concat(chunks).toString('utf8');
17
17
  }
18
- async function inputFrom(options, extra = {}) {
18
+ export async function inputFrom(options, extra = {}) {
19
19
  const opts = asOptions(options);
20
20
  let input = {};
21
+ if (opts.input && opts.inputJson) {
22
+ throw invoiceValidationError('input_conflict', '不能同时传 --input 和 --input-json');
23
+ }
24
+ if (opts.inputJson) {
25
+ input = parseJsonInput(String(opts.inputJson), '--input-json');
26
+ }
21
27
  if (opts.input) {
22
28
  let raw;
23
29
  try {
@@ -26,22 +32,31 @@ async function inputFrom(options, extra = {}) {
26
32
  catch {
27
33
  throw invoiceValidationError('input_unreadable', `无法读取 --input:${String(opts.input)}`);
28
34
  }
29
- try {
30
- const parsed = JSON.parse(raw);
31
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
32
- throw new Error('input must be an object');
33
- }
34
- input = parsed;
35
- }
36
- catch {
37
- throw invoiceValidationError('input_invalid', '--input 不是合法 JSON 对象');
38
- }
35
+ input = parseJsonInput(raw, '--input');
39
36
  }
40
37
  return {
41
38
  ...input,
42
39
  ...Object.fromEntries(Object.entries(extra).filter(([, value]) => value !== undefined && value !== '')),
43
40
  };
44
41
  }
42
+ function parseJsonInput(raw, label) {
43
+ try {
44
+ const parsed = JSON.parse(raw.replace(/^\uFEFF/u, ''));
45
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
46
+ throw new Error('input must be an object');
47
+ }
48
+ return parsed;
49
+ }
50
+ catch {
51
+ throw invoiceValidationError('input_invalid', `${label} 不是合法 JSON 对象`);
52
+ }
53
+ }
54
+ function withJsonInputOptions(command) {
55
+ command
56
+ .option('--input <path>', 'JSON input file, or - for stdin')
57
+ .option('--input-json <json>', 'inline JSON input object');
58
+ return command;
59
+ }
45
60
  function intOption(value) {
46
61
  if (value === undefined || value === null || value === '')
47
62
  return undefined;
@@ -96,20 +111,18 @@ export const invoiceShortcut = {
96
111
  .action(action((ctx) => {
97
112
  ctx.output.write(invoiceManifest, { json: true });
98
113
  }));
99
- invoice.command('run')
114
+ withJsonInputOptions(invoice.command('run')
100
115
  .description('Run an invoice operation with JSON input')
101
- .argument('<operation>', 'operation name, e.g. invoice.list')
102
- .option('--input <path>', 'JSON input file, or - for stdin')
116
+ .argument('<operation>', 'operation name, e.g. invoice.list'))
103
117
  .action(action(async (ctx, operation, options) => {
104
118
  await executeAndPrint(ctx, String(operation), await inputFrom(options));
105
119
  }));
106
- invoice.command('list')
120
+ withJsonInputOptions(invoice.command('list')
107
121
  .description('List personal invoice folder entries')
108
- .option('--input <path>', 'JSON input file, or - for stdin')
109
122
  .option('--content <keyword>', 'keyword search')
110
123
  .option('--page-size <size>', 'page size')
111
124
  .option('--start-pos <offset>', 'start position')
112
- .option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable')
125
+ .option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable'))
113
126
  .action(action(async (ctx, options) => {
114
127
  const opts = asOptions(options);
115
128
  await executeAndPrint(ctx, 'invoice.list', await inputFrom(options, {
@@ -120,13 +133,12 @@ export const invoiceShortcut = {
120
133
  }));
121
134
  }));
122
135
  const enterprise = invoice.command('enterprise').description('Enterprise invoice folder commands');
123
- enterprise.command('list')
136
+ withJsonInputOptions(enterprise.command('list')
124
137
  .description('List enterprise invoice folder entries')
125
- .option('--input <path>', 'JSON input file, or - for stdin')
126
138
  .option('--content <keyword>', 'keyword search')
127
139
  .option('--page-size <size>', 'page size')
128
140
  .option('--start-pos <offset>', 'start position')
129
- .option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable')
141
+ .option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable'))
130
142
  .action(action(async (ctx, options) => {
131
143
  const opts = asOptions(options);
132
144
  await executeAndPrint(ctx, 'invoice.enterprise.list', await inputFrom(options, {
@@ -136,11 +148,10 @@ export const invoiceShortcut = {
136
148
  sreim: stringOption(opts.sreim),
137
149
  }));
138
150
  }));
139
- invoice.command('get')
151
+ withJsonInputOptions(invoice.command('get')
140
152
  .description('Get invoice detail by fid or number')
141
- .option('--input <path>', 'JSON input file, or - for stdin')
142
153
  .option('--fid <fid>', 'invoice fid')
143
- .option('--number <number>', 'invoice number')
154
+ .option('--number <number>', 'invoice number'))
144
155
  .action(action(async (ctx, options) => {
145
156
  const opts = asOptions(options);
146
157
  await executeAndPrint(ctx, 'invoice.get', await inputFrom(options, {
@@ -148,11 +159,10 @@ export const invoiceShortcut = {
148
159
  number: opts.number,
149
160
  }));
150
161
  }));
151
- invoice.command('upload')
162
+ withJsonInputOptions(invoice.command('upload')
152
163
  .description('Upload an invoice file for OCR')
153
- .option('--input <path>', 'JSON input file, or - for stdin')
154
164
  .option('--file <path>', 'local invoice file')
155
- .option('--url <url>', 'server-accessible file URL')
165
+ .option('--url <url>', 'server-accessible file URL'))
156
166
  .action(action(async (ctx, options) => {
157
167
  const opts = asOptions(options);
158
168
  await executeAndPrint(ctx, 'invoice.upload', await inputFrom(options, {
@@ -161,11 +171,10 @@ export const invoiceShortcut = {
161
171
  }));
162
172
  }));
163
173
  const ocr = invoice.command('ocr').description('Invoice OCR commands');
164
- ocr.command('preview')
174
+ withJsonInputOptions(ocr.command('preview')
165
175
  .description('Preview OCR result without saving an invoice')
166
- .option('--input <path>', 'JSON input file, or - for stdin')
167
176
  .option('--file <path>', 'local invoice file')
168
- .option('--url <url>', 'server-accessible file URL')
177
+ .option('--url <url>', 'server-accessible file URL'))
169
178
  .action(action(async (ctx, options) => {
170
179
  const opts = asOptions(options);
171
180
  await executeAndPrint(ctx, 'invoice.ocr.preview', await inputFrom(options, {
@@ -174,11 +183,10 @@ export const invoiceShortcut = {
174
183
  }));
175
184
  }));
176
185
  const validate = invoice.command('validate').description('Invoice validation commands');
177
- validate.command('preview')
186
+ withJsonInputOptions(validate.command('preview')
178
187
  .description('Validate an existing invoice without saving validation result')
179
- .option('--input <path>', 'JSON input file, or - for stdin')
180
188
  .option('--fid <fid>', 'invoice fid')
181
- .option('--scope <scope>', 'personal or enterprise')
189
+ .option('--scope <scope>', 'personal or enterprise'))
182
190
  .action(action(async (ctx, options) => {
183
191
  const opts = asOptions(options);
184
192
  await executeAndPrint(ctx, 'invoice.validate.preview', await inputFrom(options, {
@@ -187,14 +195,13 @@ export const invoiceShortcut = {
187
195
  }));
188
196
  }));
189
197
  const importCommand = invoice.command('import').description('Invoice file import commands');
190
- importCommand.command('prepare')
198
+ withJsonInputOptions(importCommand.command('prepare')
191
199
  .description('Prepare a confirmed invoice file import')
192
- .option('--input <path>', 'JSON input file, or - for stdin')
193
200
  .option('--file <path>', 'local invoice file')
194
201
  .option('--validate', 'request validation before import')
195
202
  .option('--no-validate', 'skip validation before import')
196
203
  .option('--sync-to-oa', 'sync imported invoice to OA where supported')
197
- .option('--no-sync-to-oa', 'do not sync imported invoice to OA where supported')
204
+ .option('--no-sync-to-oa', 'do not sync imported invoice to OA where supported'))
198
205
  .action(action(async (ctx, options) => {
199
206
  const opts = asOptions(options);
200
207
  await executeAndPrint(ctx, 'invoice.import.prepare', await inputFrom(options, {
@@ -203,12 +210,11 @@ export const invoiceShortcut = {
203
210
  syncToOa: typeof opts.syncToOa === 'boolean' ? opts.syncToOa : undefined,
204
211
  }));
205
212
  }));
206
- importCommand.command('apply')
213
+ withJsonInputOptions(importCommand.command('apply')
207
214
  .description('Apply a prepared invoice file import')
208
- .option('--input <path>', 'JSON input file, or - for stdin')
209
215
  .option('--file <path>', 'local invoice file')
210
216
  .option('--continuation <token>', 'continuation token from prepare')
211
- .option('--yes', 'confirm the write operation')
217
+ .option('--yes', 'confirm the write operation'))
212
218
  .action(action(async (ctx, options) => {
213
219
  const opts = asOptions(options);
214
220
  await executeAndPrint(ctx, 'invoice.import.apply', await inputFrom(options, {
@@ -218,19 +224,17 @@ export const invoiceShortcut = {
218
224
  }));
219
225
  }));
220
226
  const add = invoice.command('add').description('Manual invoice add commands');
221
- add.command('prepare')
227
+ withJsonInputOptions(add.command('prepare')
222
228
  .description('Prepare a confirmed manual invoice add')
223
- .option('--input <path>', 'JSON input file, or - for stdin')
224
- .option('--scope <scope>', 'personal or enterprise')
229
+ .option('--scope <scope>', 'personal or enterprise'))
225
230
  .action(action(async (ctx, options) => {
226
231
  const opts = asOptions(options);
227
232
  await executeAndPrint(ctx, 'invoice.add.prepare', await inputFrom(options, { scope: opts.scope }));
228
233
  }));
229
- add.command('apply')
234
+ withJsonInputOptions(add.command('apply')
230
235
  .description('Apply a prepared manual invoice add')
231
- .option('--input <path>', 'JSON input file, or - for stdin')
232
236
  .option('--continuation <token>', 'continuation token from prepare')
233
- .option('--yes', 'confirm the write operation')
237
+ .option('--yes', 'confirm the write operation'))
234
238
  .action(action(async (ctx, options) => {
235
239
  const opts = asOptions(options);
236
240
  await executeAndPrint(ctx, 'invoice.add.apply', await inputFrom(options, {
@@ -239,11 +243,10 @@ export const invoiceShortcut = {
239
243
  }));
240
244
  }));
241
245
  const update = invoice.command('update').description('Invoice update commands');
242
- update.command('prepare')
246
+ withJsonInputOptions(update.command('prepare')
243
247
  .description('Prepare an invoice update')
244
- .option('--input <path>', 'JSON input file, or - for stdin')
245
248
  .option('--fid <fid>', 'invoice fid')
246
- .option('--scope <scope>', 'personal or enterprise')
249
+ .option('--scope <scope>', 'personal or enterprise'))
247
250
  .action(action(async (ctx, options) => {
248
251
  const opts = asOptions(options);
249
252
  await executeAndPrint(ctx, 'invoice.update.prepare', await inputFrom(options, {
@@ -251,11 +254,10 @@ export const invoiceShortcut = {
251
254
  scope: opts.scope,
252
255
  }));
253
256
  }));
254
- update.command('apply')
257
+ withJsonInputOptions(update.command('apply')
255
258
  .description('Apply a prepared invoice update')
256
- .option('--input <path>', 'JSON input file, or - for stdin')
257
259
  .option('--continuation <token>', 'continuation token from prepare')
258
- .option('--yes', 'confirm the write operation')
260
+ .option('--yes', 'confirm the write operation'))
259
261
  .action(action(async (ctx, options) => {
260
262
  const opts = asOptions(options);
261
263
  await executeAndPrint(ctx, 'invoice.update.apply', await inputFrom(options, {
@@ -263,12 +265,11 @@ export const invoiceShortcut = {
263
265
  confirm: opts.yes === true ? true : undefined,
264
266
  }));
265
267
  }));
266
- invoice.command('download')
268
+ withJsonInputOptions(invoice.command('download')
267
269
  .description('Download an invoice attachment after verifying ownership')
268
- .option('--input <path>', 'JSON input file, or - for stdin')
269
270
  .option('--fid <fid>', 'invoice fid')
270
271
  .option('--file-id <id>', 'invoice file id')
271
- .option('--output <path>', 'output file path')
272
+ .option('--output <path>', 'output file path'))
272
273
  .action(action(async (ctx, options) => {
273
274
  const opts = asOptions(options);
274
275
  await executeAndPrint(ctx, 'invoice.download', await inputFrom(options, {
@@ -278,11 +279,10 @@ export const invoiceShortcut = {
278
279
  }));
279
280
  }));
280
281
  const del = invoice.command('delete').description('Invoice delete commands');
281
- del.command('prepare')
282
+ withJsonInputOptions(del.command('prepare')
282
283
  .description('Prepare an invoice soft delete')
283
- .option('--input <path>', 'JSON input file, or - for stdin')
284
284
  .option('--fid <fid>', 'invoice fid')
285
- .option('--scope <scope>', 'personal or enterprise')
285
+ .option('--scope <scope>', 'personal or enterprise'))
286
286
  .action(action(async (ctx, options) => {
287
287
  const opts = asOptions(options);
288
288
  await executeAndPrint(ctx, 'invoice.delete.prepare', await inputFrom(options, {
@@ -290,11 +290,10 @@ export const invoiceShortcut = {
290
290
  scope: opts.scope,
291
291
  }));
292
292
  }));
293
- del.command('apply')
293
+ withJsonInputOptions(del.command('apply')
294
294
  .description('Apply a prepared invoice soft delete')
295
- .option('--input <path>', 'JSON input file, or - for stdin')
296
295
  .option('--continuation <token>', 'continuation token from prepare')
297
- .option('--yes', 'confirm the write operation')
296
+ .option('--yes', 'confirm the write operation'))
298
297
  .action(action(async (ctx, options) => {
299
298
  const opts = asOptions(options);
300
299
  await executeAndPrint(ctx, 'invoice.delete.apply', await inputFrom(options, {