weaver-work-cli 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +187 -76
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +160 -55
  7. package/dist/internal/e10/auth/crypto.js +7 -22
  8. package/dist/internal/e10/auth/session.js +1 -1
  9. package/dist/internal/e10/auth/xiaoe.js +268 -0
  10. package/dist/internal/e10/context.js +16 -2
  11. package/dist/internal/e10/index.js +1 -0
  12. package/dist/internal/e10/request-runtime.js +344 -0
  13. package/dist/internal/skills/install.js +48 -6
  14. package/dist/internal/skills/reader.js +27 -0
  15. package/dist/shortcuts/archive/continuation.js +70 -0
  16. package/dist/shortcuts/archive/errors.js +53 -0
  17. package/dist/shortcuts/archive/host.js +197 -0
  18. package/dist/shortcuts/archive/index.js +363 -0
  19. package/dist/shortcuts/archive/manifest.js +45 -0
  20. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  21. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  22. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  23. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  24. package/dist/shortcuts/archive/operations/download.js +238 -0
  25. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  26. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  27. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  28. package/dist/shortcuts/archive/operations/registry.js +43 -0
  29. package/dist/shortcuts/archive/operations/search.js +88 -0
  30. package/dist/shortcuts/archive/operations/shared.js +120 -0
  31. package/dist/shortcuts/archive/operations/types.js +23 -0
  32. package/dist/shortcuts/archive/operations/upload.js +182 -0
  33. package/dist/shortcuts/archive/operations.js +13 -0
  34. package/dist/shortcuts/archive/render/search-format.js +276 -0
  35. package/dist/shortcuts/archive/render/search-view.js +125 -0
  36. package/dist/shortcuts/asset/continuation.js +70 -0
  37. package/dist/shortcuts/asset/errors.js +67 -0
  38. package/dist/shortcuts/asset/host.js +438 -0
  39. package/dist/shortcuts/asset/index.js +255 -0
  40. package/dist/shortcuts/asset/manifest.js +471 -0
  41. package/dist/shortcuts/asset/operations/query.js +249 -0
  42. package/dist/shortcuts/asset/operations/registry.js +85 -0
  43. package/dist/shortcuts/asset/operations/shared.js +100 -0
  44. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  45. package/dist/shortcuts/asset/operations/types.js +1 -0
  46. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  47. package/dist/shortcuts/asset/operations/write.js +435 -0
  48. package/dist/shortcuts/asset/operations.js +9 -0
  49. package/dist/shortcuts/calendar/continuation.js +70 -0
  50. package/dist/shortcuts/calendar/errors.js +53 -0
  51. package/dist/shortcuts/calendar/host.js +148 -0
  52. package/dist/shortcuts/calendar/index.js +125 -0
  53. package/dist/shortcuts/calendar/manifest.js +26 -0
  54. package/dist/shortcuts/calendar/operations/read.js +259 -0
  55. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  56. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  57. package/dist/shortcuts/calendar/operations/types.js +25 -0
  58. package/dist/shortcuts/calendar/operations/write.js +439 -0
  59. package/dist/shortcuts/calendar/operations.js +8 -0
  60. package/dist/shortcuts/ehr/continuation.js +70 -0
  61. package/dist/shortcuts/ehr/errors.js +53 -0
  62. package/dist/shortcuts/ehr/host.js +213 -0
  63. package/dist/shortcuts/ehr/index.js +205 -0
  64. package/dist/shortcuts/ehr/manifest.js +47 -0
  65. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  66. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  67. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  68. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  69. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  70. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  71. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  72. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  73. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  74. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  75. package/dist/shortcuts/ehr/operations/types.js +25 -0
  76. package/dist/shortcuts/ehr/operations.js +25 -0
  77. package/dist/shortcuts/esb/continuation.js +70 -0
  78. package/dist/shortcuts/esb/errors.js +65 -0
  79. package/dist/shortcuts/esb/host.js +187 -0
  80. package/dist/shortcuts/esb/index.js +112 -0
  81. package/dist/shortcuts/esb/manifest.js +91 -0
  82. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  83. package/dist/shortcuts/esb/operations/registry.js +48 -0
  84. package/dist/shortcuts/esb/operations/shared.js +152 -0
  85. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  86. package/dist/shortcuts/esb/operations/types.js +21 -0
  87. package/dist/shortcuts/esb/operations.js +15 -0
  88. package/dist/shortcuts/fna/continuation.js +70 -0
  89. package/dist/shortcuts/fna/errors.js +59 -0
  90. package/dist/shortcuts/fna/host.js +146 -0
  91. package/dist/shortcuts/fna/index.js +111 -0
  92. package/dist/shortcuts/fna/manifest.js +41 -0
  93. package/dist/shortcuts/fna/operations/budget.js +124 -0
  94. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  95. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  96. package/dist/shortcuts/fna/operations/loan.js +195 -0
  97. package/dist/shortcuts/fna/operations/registry.js +35 -0
  98. package/dist/shortcuts/fna/operations/shared.js +210 -0
  99. package/dist/shortcuts/fna/operations/types.js +25 -0
  100. package/dist/shortcuts/fna/operations.js +19 -0
  101. package/dist/shortcuts/hrm/errors.js +38 -0
  102. package/dist/shortcuts/hrm/host.js +156 -0
  103. package/dist/shortcuts/hrm/index.js +111 -0
  104. package/dist/shortcuts/hrm/manifest.js +32 -0
  105. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  106. package/dist/shortcuts/hrm/operations/org.js +110 -0
  107. package/dist/shortcuts/hrm/operations/position.js +176 -0
  108. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  109. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  110. package/dist/shortcuts/hrm/operations/types.js +23 -0
  111. package/dist/shortcuts/hrm/operations.js +19 -0
  112. package/dist/shortcuts/index.js +20 -0
  113. package/dist/shortcuts/invoice/host.js +99 -94
  114. package/dist/shortcuts/invoice/index.js +65 -61
  115. package/dist/shortcuts/invoice/manifest.js +222 -14
  116. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  117. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  118. package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
  119. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  120. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  121. package/dist/shortcuts/invoice/operations/shared.js +271 -6
  122. package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
  123. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  124. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  125. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  126. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  127. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  128. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  131. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  132. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  133. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  134. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  135. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  136. package/dist/shortcuts/mail/continuation.js +70 -0
  137. package/dist/shortcuts/mail/errors.js +53 -0
  138. package/dist/shortcuts/mail/host.js +182 -0
  139. package/dist/shortcuts/mail/index.js +519 -0
  140. package/dist/shortcuts/mail/manifest.js +38 -0
  141. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  142. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  143. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  144. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  145. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  146. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  147. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  148. package/dist/shortcuts/mail/operations/registry.js +41 -0
  149. package/dist/shortcuts/mail/operations/shared.js +64 -0
  150. package/dist/shortcuts/mail/operations/types.js +27 -0
  151. package/dist/shortcuts/mail/operations.js +19 -0
  152. package/dist/shortcuts/plan/continuation.js +70 -0
  153. package/dist/shortcuts/plan/errors.js +70 -0
  154. package/dist/shortcuts/plan/host.js +180 -0
  155. package/dist/shortcuts/plan/index.js +150 -0
  156. package/dist/shortcuts/plan/manifest.js +53 -0
  157. package/dist/shortcuts/plan/operations/link.js +256 -0
  158. package/dist/shortcuts/plan/operations/read.js +259 -0
  159. package/dist/shortcuts/plan/operations/registry.js +33 -0
  160. package/dist/shortcuts/plan/operations/shared.js +246 -0
  161. package/dist/shortcuts/plan/operations/types.js +49 -0
  162. package/dist/shortcuts/plan/operations/version.js +49 -0
  163. package/dist/shortcuts/plan/operations/write.js +710 -0
  164. package/dist/shortcuts/plan/operations.js +8 -0
  165. package/docs/SKILL.md +11 -7
  166. package/docs/_catalog.md +23 -5
  167. package/docs/agent-invoice.md +31 -10
  168. package/docs/agent-skill-install.md +211 -0
  169. package/docs/calendar.md +87 -0
  170. package/docs/e10-auth.md +28 -9
  171. package/docs/ehr.md +186 -0
  172. package/docs/esb.md +64 -0
  173. package/docs/fna.md +72 -0
  174. package/docs/hrm.md +89 -0
  175. package/docs/invoice.md +66 -20
  176. package/docs/jiuchuanhui.md +131 -0
  177. package/docs/operation-manual.md +443 -0
  178. package/docs/plan.md +82 -0
  179. package/docs/wenshuding.md +129 -0
  180. package/docs/ziguanjia.md +89 -0
  181. package/package.json +4 -4
  182. package/scripts/package-skill.mjs +127 -34
  183. package/scripts/postbuild.mjs +13 -0
  184. package/skill-template/business-info.json +13 -2
  185. package/skill-template/domains/calendar.md +15 -0
  186. package/skill-template/domains/esb.md +13 -0
  187. package/skill-template/domains/hrm.md +16 -0
  188. package/skill-template/domains/jiuchuanhui.md +23 -0
  189. package/skill-template/domains/jucailin.md +22 -0
  190. package/skill-template/domains/mail.md +21 -0
  191. package/skill-template/domains/plan.md +17 -0
  192. package/skill-template/domains/qiyecheng.md +17 -0
  193. package/skill-template/domains/shared.md +9 -3
  194. package/skill-template/domains/skill-maker.md +10 -0
  195. package/skill-template/domains/wenshuding.md +22 -0
  196. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  197. package/skill-template/domains/ziguanjia.md +21 -0
  198. package/skill-template/master-skill-template.md +12 -6
  199. package/skill-template/skill-template.md +40 -9
  200. package/skills/weaver-e10-calendar/SKILL.md +101 -0
  201. package/skills/weaver-e10-calendar/product.json +8 -0
  202. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  203. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  204. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  205. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  206. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  207. package/skills/weaver-e10-esb/SKILL.md +102 -0
  208. package/skills/weaver-e10-esb/product.json +8 -0
  209. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  210. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  211. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  212. package/skills/weaver-e10-hrm/SKILL.md +87 -0
  213. package/skills/weaver-e10-hrm/product.json +8 -0
  214. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  215. package/skills/weaver-e10-hrm/references/org.md +95 -0
  216. package/skills/weaver-e10-hrm/references/position.md +95 -0
  217. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  218. package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
  219. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  220. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  221. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  222. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  223. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  224. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  225. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  226. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  227. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  228. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  229. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  230. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  231. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  232. package/skills/weaver-e10-jucailin/SKILL.md +101 -0
  233. package/skills/weaver-e10-jucailin/product.json +8 -0
  234. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  235. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  236. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  237. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  238. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  239. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  240. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  241. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  242. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  243. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  244. package/skills/weaver-e10-mail/SKILL.md +151 -0
  245. package/skills/weaver-e10-mail/product.json +8 -0
  246. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  247. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  248. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  249. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  250. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  251. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  252. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  253. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  254. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  255. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  256. package/skills/weaver-e10-plan/SKILL.md +139 -0
  257. package/skills/weaver-e10-plan/product.json +8 -0
  258. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  259. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  260. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  261. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  262. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  263. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  264. package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
  265. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  266. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  267. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  268. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  269. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  272. package/skills/weaver-e10-shared/SKILL.md +86 -0
  273. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  274. package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
  275. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  276. package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
  277. package/skills/weaver-e10-skill-maker/product.json +8 -0
  278. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  279. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  280. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  281. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  282. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  283. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  284. package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
  285. package/skills/weaver-e10-wenshuding/product.json +8 -0
  286. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  287. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  288. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  289. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  290. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  291. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  292. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  293. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  294. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  295. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  296. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  297. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  298. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
  300. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  301. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  302. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  303. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  304. package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
  305. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
  306. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
  307. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
  308. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  309. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  310. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  311. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
  312. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
  313. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  314. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  315. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  316. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
  317. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  318. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  319. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  320. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  321. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  322. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  323. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  324. package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
  325. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  326. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  327. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  328. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  329. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  330. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  331. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  332. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  333. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  334. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  335. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  336. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  337. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  338. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  339. package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
  340. package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
  341. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  342. package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
  343. package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
  344. package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
  345. package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
  346. package/skills/weaver-work-cli-shared/SKILL.md +0 -53
  347. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
  348. package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
  349. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
  350. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  351. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -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,28 +32,42 @@ 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;
48
63
  const parsed = Number(value);
49
64
  return Number.isInteger(parsed) ? parsed : undefined;
50
65
  }
66
+ function stringOption(value) {
67
+ if (value === undefined || value === null || value === '')
68
+ return undefined;
69
+ return String(value);
70
+ }
51
71
  function successEnvelope(operation, result) {
52
72
  return {
53
73
  schemaVersion: 1,
@@ -91,51 +111,47 @@ export const invoiceShortcut = {
91
111
  .action(action((ctx) => {
92
112
  ctx.output.write(invoiceManifest, { json: true });
93
113
  }));
94
- invoice.command('run')
114
+ withJsonInputOptions(invoice.command('run')
95
115
  .description('Run an invoice operation with JSON input')
96
- .argument('<operation>', 'operation name, e.g. invoice.list')
97
- .option('--input <path>', 'JSON input file, or - for stdin')
116
+ .argument('<operation>', 'operation name, e.g. invoice.list'))
98
117
  .action(action(async (ctx, operation, options) => {
99
118
  await executeAndPrint(ctx, String(operation), await inputFrom(options));
100
119
  }));
101
- invoice.command('list')
120
+ withJsonInputOptions(invoice.command('list')
102
121
  .description('List personal invoice folder entries')
103
- .option('--input <path>', 'JSON input file, or - for stdin')
104
122
  .option('--content <keyword>', 'keyword search')
105
123
  .option('--page-size <size>', 'page size')
106
124
  .option('--start-pos <offset>', 'start position')
107
- .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'))
108
126
  .action(action(async (ctx, options) => {
109
127
  const opts = asOptions(options);
110
128
  await executeAndPrint(ctx, 'invoice.list', await inputFrom(options, {
111
129
  content: opts.content,
112
130
  page_size: intOption(opts.pageSize),
113
131
  start_pos: intOption(opts.startPos),
114
- sreim: intOption(opts.sreim),
132
+ sreim: stringOption(opts.sreim),
115
133
  }));
116
134
  }));
117
135
  const enterprise = invoice.command('enterprise').description('Enterprise invoice folder commands');
118
- enterprise.command('list')
136
+ withJsonInputOptions(enterprise.command('list')
119
137
  .description('List enterprise invoice folder entries')
120
- .option('--input <path>', 'JSON input file, or - for stdin')
121
138
  .option('--content <keyword>', 'keyword search')
122
139
  .option('--page-size <size>', 'page size')
123
140
  .option('--start-pos <offset>', 'start position')
124
- .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'))
125
142
  .action(action(async (ctx, options) => {
126
143
  const opts = asOptions(options);
127
144
  await executeAndPrint(ctx, 'invoice.enterprise.list', await inputFrom(options, {
128
145
  content: opts.content,
129
146
  page_size: intOption(opts.pageSize),
130
147
  start_pos: intOption(opts.startPos),
131
- sreim: intOption(opts.sreim),
148
+ sreim: stringOption(opts.sreim),
132
149
  }));
133
150
  }));
134
- invoice.command('get')
151
+ withJsonInputOptions(invoice.command('get')
135
152
  .description('Get invoice detail by fid or number')
136
- .option('--input <path>', 'JSON input file, or - for stdin')
137
153
  .option('--fid <fid>', 'invoice fid')
138
- .option('--number <number>', 'invoice number')
154
+ .option('--number <number>', 'invoice number'))
139
155
  .action(action(async (ctx, options) => {
140
156
  const opts = asOptions(options);
141
157
  await executeAndPrint(ctx, 'invoice.get', await inputFrom(options, {
@@ -143,11 +159,10 @@ export const invoiceShortcut = {
143
159
  number: opts.number,
144
160
  }));
145
161
  }));
146
- invoice.command('upload')
162
+ withJsonInputOptions(invoice.command('upload')
147
163
  .description('Upload an invoice file for OCR')
148
- .option('--input <path>', 'JSON input file, or - for stdin')
149
164
  .option('--file <path>', 'local invoice file')
150
- .option('--url <url>', 'server-accessible file URL')
165
+ .option('--url <url>', 'server-accessible file URL'))
151
166
  .action(action(async (ctx, options) => {
152
167
  const opts = asOptions(options);
153
168
  await executeAndPrint(ctx, 'invoice.upload', await inputFrom(options, {
@@ -156,11 +171,10 @@ export const invoiceShortcut = {
156
171
  }));
157
172
  }));
158
173
  const ocr = invoice.command('ocr').description('Invoice OCR commands');
159
- ocr.command('preview')
174
+ withJsonInputOptions(ocr.command('preview')
160
175
  .description('Preview OCR result without saving an invoice')
161
- .option('--input <path>', 'JSON input file, or - for stdin')
162
176
  .option('--file <path>', 'local invoice file')
163
- .option('--url <url>', 'server-accessible file URL')
177
+ .option('--url <url>', 'server-accessible file URL'))
164
178
  .action(action(async (ctx, options) => {
165
179
  const opts = asOptions(options);
166
180
  await executeAndPrint(ctx, 'invoice.ocr.preview', await inputFrom(options, {
@@ -169,11 +183,10 @@ export const invoiceShortcut = {
169
183
  }));
170
184
  }));
171
185
  const validate = invoice.command('validate').description('Invoice validation commands');
172
- validate.command('preview')
186
+ withJsonInputOptions(validate.command('preview')
173
187
  .description('Validate an existing invoice without saving validation result')
174
- .option('--input <path>', 'JSON input file, or - for stdin')
175
188
  .option('--fid <fid>', 'invoice fid')
176
- .option('--scope <scope>', 'personal or enterprise')
189
+ .option('--scope <scope>', 'personal or enterprise'))
177
190
  .action(action(async (ctx, options) => {
178
191
  const opts = asOptions(options);
179
192
  await executeAndPrint(ctx, 'invoice.validate.preview', await inputFrom(options, {
@@ -182,14 +195,13 @@ export const invoiceShortcut = {
182
195
  }));
183
196
  }));
184
197
  const importCommand = invoice.command('import').description('Invoice file import commands');
185
- importCommand.command('prepare')
198
+ withJsonInputOptions(importCommand.command('prepare')
186
199
  .description('Prepare a confirmed invoice file import')
187
- .option('--input <path>', 'JSON input file, or - for stdin')
188
200
  .option('--file <path>', 'local invoice file')
189
201
  .option('--validate', 'request validation before import')
190
202
  .option('--no-validate', 'skip validation before import')
191
203
  .option('--sync-to-oa', 'sync imported invoice to OA where supported')
192
- .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'))
193
205
  .action(action(async (ctx, options) => {
194
206
  const opts = asOptions(options);
195
207
  await executeAndPrint(ctx, 'invoice.import.prepare', await inputFrom(options, {
@@ -198,12 +210,11 @@ export const invoiceShortcut = {
198
210
  syncToOa: typeof opts.syncToOa === 'boolean' ? opts.syncToOa : undefined,
199
211
  }));
200
212
  }));
201
- importCommand.command('apply')
213
+ withJsonInputOptions(importCommand.command('apply')
202
214
  .description('Apply a prepared invoice file import')
203
- .option('--input <path>', 'JSON input file, or - for stdin')
204
215
  .option('--file <path>', 'local invoice file')
205
216
  .option('--continuation <token>', 'continuation token from prepare')
206
- .option('--yes', 'confirm the write operation')
217
+ .option('--yes', 'confirm the write operation'))
207
218
  .action(action(async (ctx, options) => {
208
219
  const opts = asOptions(options);
209
220
  await executeAndPrint(ctx, 'invoice.import.apply', await inputFrom(options, {
@@ -213,19 +224,17 @@ export const invoiceShortcut = {
213
224
  }));
214
225
  }));
215
226
  const add = invoice.command('add').description('Manual invoice add commands');
216
- add.command('prepare')
227
+ withJsonInputOptions(add.command('prepare')
217
228
  .description('Prepare a confirmed manual invoice add')
218
- .option('--input <path>', 'JSON input file, or - for stdin')
219
- .option('--scope <scope>', 'personal or enterprise')
229
+ .option('--scope <scope>', 'personal or enterprise'))
220
230
  .action(action(async (ctx, options) => {
221
231
  const opts = asOptions(options);
222
232
  await executeAndPrint(ctx, 'invoice.add.prepare', await inputFrom(options, { scope: opts.scope }));
223
233
  }));
224
- add.command('apply')
234
+ withJsonInputOptions(add.command('apply')
225
235
  .description('Apply a prepared manual invoice add')
226
- .option('--input <path>', 'JSON input file, or - for stdin')
227
236
  .option('--continuation <token>', 'continuation token from prepare')
228
- .option('--yes', 'confirm the write operation')
237
+ .option('--yes', 'confirm the write operation'))
229
238
  .action(action(async (ctx, options) => {
230
239
  const opts = asOptions(options);
231
240
  await executeAndPrint(ctx, 'invoice.add.apply', await inputFrom(options, {
@@ -234,11 +243,10 @@ export const invoiceShortcut = {
234
243
  }));
235
244
  }));
236
245
  const update = invoice.command('update').description('Invoice update commands');
237
- update.command('prepare')
246
+ withJsonInputOptions(update.command('prepare')
238
247
  .description('Prepare an invoice update')
239
- .option('--input <path>', 'JSON input file, or - for stdin')
240
248
  .option('--fid <fid>', 'invoice fid')
241
- .option('--scope <scope>', 'personal or enterprise')
249
+ .option('--scope <scope>', 'personal or enterprise'))
242
250
  .action(action(async (ctx, options) => {
243
251
  const opts = asOptions(options);
244
252
  await executeAndPrint(ctx, 'invoice.update.prepare', await inputFrom(options, {
@@ -246,11 +254,10 @@ export const invoiceShortcut = {
246
254
  scope: opts.scope,
247
255
  }));
248
256
  }));
249
- update.command('apply')
257
+ withJsonInputOptions(update.command('apply')
250
258
  .description('Apply a prepared invoice update')
251
- .option('--input <path>', 'JSON input file, or - for stdin')
252
259
  .option('--continuation <token>', 'continuation token from prepare')
253
- .option('--yes', 'confirm the write operation')
260
+ .option('--yes', 'confirm the write operation'))
254
261
  .action(action(async (ctx, options) => {
255
262
  const opts = asOptions(options);
256
263
  await executeAndPrint(ctx, 'invoice.update.apply', await inputFrom(options, {
@@ -258,12 +265,11 @@ export const invoiceShortcut = {
258
265
  confirm: opts.yes === true ? true : undefined,
259
266
  }));
260
267
  }));
261
- invoice.command('download')
268
+ withJsonInputOptions(invoice.command('download')
262
269
  .description('Download an invoice attachment after verifying ownership')
263
- .option('--input <path>', 'JSON input file, or - for stdin')
264
270
  .option('--fid <fid>', 'invoice fid')
265
271
  .option('--file-id <id>', 'invoice file id')
266
- .option('--output <path>', 'output file path')
272
+ .option('--output <path>', 'output file path'))
267
273
  .action(action(async (ctx, options) => {
268
274
  const opts = asOptions(options);
269
275
  await executeAndPrint(ctx, 'invoice.download', await inputFrom(options, {
@@ -273,11 +279,10 @@ export const invoiceShortcut = {
273
279
  }));
274
280
  }));
275
281
  const del = invoice.command('delete').description('Invoice delete commands');
276
- del.command('prepare')
282
+ withJsonInputOptions(del.command('prepare')
277
283
  .description('Prepare an invoice soft delete')
278
- .option('--input <path>', 'JSON input file, or - for stdin')
279
284
  .option('--fid <fid>', 'invoice fid')
280
- .option('--scope <scope>', 'personal or enterprise')
285
+ .option('--scope <scope>', 'personal or enterprise'))
281
286
  .action(action(async (ctx, options) => {
282
287
  const opts = asOptions(options);
283
288
  await executeAndPrint(ctx, 'invoice.delete.prepare', await inputFrom(options, {
@@ -285,11 +290,10 @@ export const invoiceShortcut = {
285
290
  scope: opts.scope,
286
291
  }));
287
292
  }));
288
- del.command('apply')
293
+ withJsonInputOptions(del.command('apply')
289
294
  .description('Apply a prepared invoice soft delete')
290
- .option('--input <path>', 'JSON input file, or - for stdin')
291
295
  .option('--continuation <token>', 'continuation token from prepare')
292
- .option('--yes', 'confirm the write operation')
296
+ .option('--yes', 'confirm the write operation'))
293
297
  .action(action(async (ctx, options) => {
294
298
  const opts = asOptions(options);
295
299
  await executeAndPrint(ctx, 'invoice.delete.apply', await inputFrom(options, {