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.
- package/README.md +187 -76
- package/dist/cmd/setup/index.js +5 -5
- package/dist/cmd/skills/index.js +1 -1
- package/dist/core/hooks.js +7 -0
- package/dist/index.js +0 -0
- package/dist/internal/e10/auth/commands.js +160 -55
- package/dist/internal/e10/auth/crypto.js +7 -22
- package/dist/internal/e10/auth/session.js +1 -1
- package/dist/internal/e10/auth/xiaoe.js +268 -0
- package/dist/internal/e10/context.js +16 -2
- package/dist/internal/e10/index.js +1 -0
- package/dist/internal/e10/request-runtime.js +344 -0
- package/dist/internal/skills/install.js +48 -6
- package/dist/internal/skills/reader.js +27 -0
- package/dist/shortcuts/archive/continuation.js +70 -0
- package/dist/shortcuts/archive/errors.js +53 -0
- package/dist/shortcuts/archive/host.js +197 -0
- package/dist/shortcuts/archive/index.js +363 -0
- package/dist/shortcuts/archive/manifest.js +45 -0
- package/dist/shortcuts/archive/operations/archive-info.js +55 -0
- package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
- package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
- package/dist/shortcuts/archive/operations/confirm.js +46 -0
- package/dist/shortcuts/archive/operations/download.js +238 -0
- package/dist/shortcuts/archive/operations/flow-url.js +240 -0
- package/dist/shortcuts/archive/operations/fonds.js +95 -0
- package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
- package/dist/shortcuts/archive/operations/registry.js +43 -0
- package/dist/shortcuts/archive/operations/search.js +88 -0
- package/dist/shortcuts/archive/operations/shared.js +120 -0
- package/dist/shortcuts/archive/operations/types.js +23 -0
- package/dist/shortcuts/archive/operations/upload.js +182 -0
- package/dist/shortcuts/archive/operations.js +13 -0
- package/dist/shortcuts/archive/render/search-format.js +276 -0
- package/dist/shortcuts/archive/render/search-view.js +125 -0
- package/dist/shortcuts/asset/continuation.js +70 -0
- package/dist/shortcuts/asset/errors.js +67 -0
- package/dist/shortcuts/asset/host.js +438 -0
- package/dist/shortcuts/asset/index.js +255 -0
- package/dist/shortcuts/asset/manifest.js +471 -0
- package/dist/shortcuts/asset/operations/query.js +249 -0
- package/dist/shortcuts/asset/operations/registry.js +85 -0
- package/dist/shortcuts/asset/operations/shared.js +100 -0
- package/dist/shortcuts/asset/operations/type-cache.js +49 -0
- package/dist/shortcuts/asset/operations/types.js +1 -0
- package/dist/shortcuts/asset/operations/viewlink.js +117 -0
- package/dist/shortcuts/asset/operations/write.js +435 -0
- package/dist/shortcuts/asset/operations.js +9 -0
- package/dist/shortcuts/calendar/continuation.js +70 -0
- package/dist/shortcuts/calendar/errors.js +53 -0
- package/dist/shortcuts/calendar/host.js +148 -0
- package/dist/shortcuts/calendar/index.js +125 -0
- package/dist/shortcuts/calendar/manifest.js +26 -0
- package/dist/shortcuts/calendar/operations/read.js +259 -0
- package/dist/shortcuts/calendar/operations/registry.js +31 -0
- package/dist/shortcuts/calendar/operations/shared.js +132 -0
- package/dist/shortcuts/calendar/operations/types.js +25 -0
- package/dist/shortcuts/calendar/operations/write.js +439 -0
- package/dist/shortcuts/calendar/operations.js +8 -0
- package/dist/shortcuts/ehr/continuation.js +70 -0
- package/dist/shortcuts/ehr/errors.js +53 -0
- package/dist/shortcuts/ehr/host.js +213 -0
- package/dist/shortcuts/ehr/index.js +205 -0
- package/dist/shortcuts/ehr/manifest.js +47 -0
- package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
- package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
- package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
- package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
- package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
- package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
- package/dist/shortcuts/ehr/operations/recruit.js +803 -0
- package/dist/shortcuts/ehr/operations/registry.js +43 -0
- package/dist/shortcuts/ehr/operations/salary.js +319 -0
- package/dist/shortcuts/ehr/operations/shared.js +246 -0
- package/dist/shortcuts/ehr/operations/types.js +25 -0
- package/dist/shortcuts/ehr/operations.js +25 -0
- package/dist/shortcuts/esb/continuation.js +70 -0
- package/dist/shortcuts/esb/errors.js +65 -0
- package/dist/shortcuts/esb/host.js +187 -0
- package/dist/shortcuts/esb/index.js +112 -0
- package/dist/shortcuts/esb/manifest.js +91 -0
- package/dist/shortcuts/esb/operations/input-format.js +31 -0
- package/dist/shortcuts/esb/operations/registry.js +48 -0
- package/dist/shortcuts/esb/operations/shared.js +152 -0
- package/dist/shortcuts/esb/operations/trigger.js +76 -0
- package/dist/shortcuts/esb/operations/types.js +21 -0
- package/dist/shortcuts/esb/operations.js +15 -0
- package/dist/shortcuts/fna/continuation.js +70 -0
- package/dist/shortcuts/fna/errors.js +59 -0
- package/dist/shortcuts/fna/host.js +146 -0
- package/dist/shortcuts/fna/index.js +111 -0
- package/dist/shortcuts/fna/manifest.js +41 -0
- package/dist/shortcuts/fna/operations/budget.js +124 -0
- package/dist/shortcuts/fna/operations/expense-center.js +148 -0
- package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
- package/dist/shortcuts/fna/operations/loan.js +195 -0
- package/dist/shortcuts/fna/operations/registry.js +35 -0
- package/dist/shortcuts/fna/operations/shared.js +210 -0
- package/dist/shortcuts/fna/operations/types.js +25 -0
- package/dist/shortcuts/fna/operations.js +19 -0
- package/dist/shortcuts/hrm/errors.js +38 -0
- package/dist/shortcuts/hrm/host.js +156 -0
- package/dist/shortcuts/hrm/index.js +111 -0
- package/dist/shortcuts/hrm/manifest.js +32 -0
- package/dist/shortcuts/hrm/operations/employee.js +338 -0
- package/dist/shortcuts/hrm/operations/org.js +110 -0
- package/dist/shortcuts/hrm/operations/position.js +176 -0
- package/dist/shortcuts/hrm/operations/registry.js +33 -0
- package/dist/shortcuts/hrm/operations/shared.js +143 -0
- package/dist/shortcuts/hrm/operations/types.js +23 -0
- package/dist/shortcuts/hrm/operations.js +19 -0
- package/dist/shortcuts/index.js +20 -0
- package/dist/shortcuts/invoice/host.js +99 -94
- package/dist/shortcuts/invoice/index.js +65 -61
- package/dist/shortcuts/invoice/manifest.js +222 -14
- package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
- package/dist/shortcuts/invoice/operations/issuing.js +198 -0
- package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
- package/dist/shortcuts/invoice/operations/registry.js +17 -0
- package/dist/shortcuts/invoice/operations/reim.js +401 -0
- package/dist/shortcuts/invoice/operations/shared.js +271 -6
- package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
- package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
- package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
- package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
- package/dist/shortcuts/jiuchuanhui/host.js +159 -0
- package/dist/shortcuts/jiuchuanhui/index.js +109 -0
- package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
- package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
- package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
- package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
- package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
- package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
- package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
- package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
- package/dist/shortcuts/mail/continuation.js +70 -0
- package/dist/shortcuts/mail/errors.js +53 -0
- package/dist/shortcuts/mail/host.js +182 -0
- package/dist/shortcuts/mail/index.js +519 -0
- package/dist/shortcuts/mail/manifest.js +38 -0
- package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
- package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
- package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
- package/dist/shortcuts/mail/operations/mail-read.js +508 -0
- package/dist/shortcuts/mail/operations/mail-send.js +474 -0
- package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
- package/dist/shortcuts/mail/operations/mail-template.js +170 -0
- package/dist/shortcuts/mail/operations/registry.js +41 -0
- package/dist/shortcuts/mail/operations/shared.js +64 -0
- package/dist/shortcuts/mail/operations/types.js +27 -0
- package/dist/shortcuts/mail/operations.js +19 -0
- package/dist/shortcuts/plan/continuation.js +70 -0
- package/dist/shortcuts/plan/errors.js +70 -0
- package/dist/shortcuts/plan/host.js +180 -0
- package/dist/shortcuts/plan/index.js +150 -0
- package/dist/shortcuts/plan/manifest.js +53 -0
- package/dist/shortcuts/plan/operations/link.js +256 -0
- package/dist/shortcuts/plan/operations/read.js +259 -0
- package/dist/shortcuts/plan/operations/registry.js +33 -0
- package/dist/shortcuts/plan/operations/shared.js +246 -0
- package/dist/shortcuts/plan/operations/types.js +49 -0
- package/dist/shortcuts/plan/operations/version.js +49 -0
- package/dist/shortcuts/plan/operations/write.js +710 -0
- package/dist/shortcuts/plan/operations.js +8 -0
- package/docs/SKILL.md +11 -7
- package/docs/_catalog.md +23 -5
- package/docs/agent-invoice.md +31 -10
- package/docs/agent-skill-install.md +211 -0
- package/docs/calendar.md +87 -0
- package/docs/e10-auth.md +28 -9
- package/docs/ehr.md +186 -0
- package/docs/esb.md +64 -0
- package/docs/fna.md +72 -0
- package/docs/hrm.md +89 -0
- package/docs/invoice.md +66 -20
- package/docs/jiuchuanhui.md +131 -0
- package/docs/operation-manual.md +443 -0
- package/docs/plan.md +82 -0
- package/docs/wenshuding.md +129 -0
- package/docs/ziguanjia.md +89 -0
- package/package.json +4 -4
- package/scripts/package-skill.mjs +127 -34
- package/scripts/postbuild.mjs +13 -0
- package/skill-template/business-info.json +13 -2
- package/skill-template/domains/calendar.md +15 -0
- package/skill-template/domains/esb.md +13 -0
- package/skill-template/domains/hrm.md +16 -0
- package/skill-template/domains/jiuchuanhui.md +23 -0
- package/skill-template/domains/jucailin.md +22 -0
- package/skill-template/domains/mail.md +21 -0
- package/skill-template/domains/plan.md +17 -0
- package/skill-template/domains/qiyecheng.md +17 -0
- package/skill-template/domains/shared.md +9 -3
- package/skill-template/domains/skill-maker.md +10 -0
- package/skill-template/domains/wenshuding.md +22 -0
- package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
- package/skill-template/domains/ziguanjia.md +21 -0
- package/skill-template/master-skill-template.md +12 -6
- package/skill-template/skill-template.md +40 -9
- package/skills/weaver-e10-calendar/SKILL.md +101 -0
- package/skills/weaver-e10-calendar/product.json +8 -0
- package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
- package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
- package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
- package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
- package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
- package/skills/weaver-e10-esb/SKILL.md +102 -0
- package/skills/weaver-e10-esb/product.json +8 -0
- package/skills/weaver-e10-esb/references/input-format.md +52 -0
- package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
- package/skills/weaver-e10-esb/references/trigger.md +99 -0
- package/skills/weaver-e10-hrm/SKILL.md +87 -0
- package/skills/weaver-e10-hrm/product.json +8 -0
- package/skills/weaver-e10-hrm/references/employee.md +109 -0
- package/skills/weaver-e10-hrm/references/org.md +95 -0
- package/skills/weaver-e10-hrm/references/position.md +95 -0
- package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
- package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
- package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
- package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
- package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
- package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
- package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
- package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
- package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
- package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
- package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
- package/skills/weaver-e10-jucailin/SKILL.md +101 -0
- package/skills/weaver-e10-jucailin/product.json +8 -0
- package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
- package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
- package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
- package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
- package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
- package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
- package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
- package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
- package/skills/weaver-e10-jucailin/references/salary.md +110 -0
- package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
- package/skills/weaver-e10-mail/SKILL.md +151 -0
- package/skills/weaver-e10-mail/product.json +8 -0
- package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
- package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
- package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
- package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
- package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
- package/skills/weaver-e10-mail/references/mail-read.md +76 -0
- package/skills/weaver-e10-mail/references/mail-send.md +43 -0
- package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
- package/skills/weaver-e10-mail/references/mail-template.md +31 -0
- package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
- package/skills/weaver-e10-plan/SKILL.md +139 -0
- package/skills/weaver-e10-plan/product.json +8 -0
- package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
- package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
- package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
- package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
- package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
- package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
- package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
- package/skills/weaver-e10-qiyecheng/product.json +8 -0
- package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
- package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
- package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
- package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
- package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
- package/skills/weaver-e10-shared/SKILL.md +86 -0
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
- package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
- package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
- package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
- package/skills/weaver-e10-skill-maker/product.json +8 -0
- package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
- package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
- package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
- package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
- package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
- package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
- package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
- package/skills/weaver-e10-wenshuding/product.json +8 -0
- package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
- package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
- package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
- package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
- package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
- package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
- package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
- package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
- package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
- package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
- package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
- package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
- package/skills/weaver-e10-ziguanjia/product.json +8 -0
- package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
- package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
- package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
- package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
- package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
- package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
- package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
- package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
- package/skills/weaver-work-cli-shared/SKILL.md +0 -53
- package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
- package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
- package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
- /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
- /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
|
|
125
|
-
|
|
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
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
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.
|
|
262
|
-
throw invoiceValidationError('input_invalid', 'multipart
|
|
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
|
|
247
|
+
const response = await (await runtime()).requestJson({
|
|
248
|
+
module: 'invoice',
|
|
249
|
+
operation,
|
|
278
250
|
method,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
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, () =>
|
|
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
|
|
306
|
-
|
|
307
|
-
|
|
309
|
+
const response = await (await runtime()).requestBinary({
|
|
310
|
+
module: 'invoice',
|
|
311
|
+
operation,
|
|
308
312
|
method: 'GET',
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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('--
|
|
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, {
|