weaver-work-cli 0.1.2 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -78
- 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 +159 -54
- 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 +345 -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 +24 -0
- package/dist/shortcuts/invoice/host.js +99 -94
- package/dist/shortcuts/invoice/index.js +58 -59
- package/dist/shortcuts/invoice/manifest.js +200 -3
- package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
- package/dist/shortcuts/invoice/operations/issuing.js +198 -0
- 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 +247 -0
- 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/meeting/continuation.js +70 -0
- package/dist/shortcuts/meeting/errors.js +63 -0
- package/dist/shortcuts/meeting/host.js +167 -0
- package/dist/shortcuts/meeting/index.js +123 -0
- package/dist/shortcuts/meeting/manifest.js +64 -0
- package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
- package/dist/shortcuts/meeting/operations/change.js +242 -0
- package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
- package/dist/shortcuts/meeting/operations/create.js +349 -0
- package/dist/shortcuts/meeting/operations/env.js +191 -0
- package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
- package/dist/shortcuts/meeting/operations/meetings.js +73 -0
- package/dist/shortcuts/meeting/operations/receipts.js +195 -0
- package/dist/shortcuts/meeting/operations/registry.js +47 -0
- package/dist/shortcuts/meeting/operations/rooms.js +132 -0
- package/dist/shortcuts/meeting/operations/shared.js +112 -0
- package/dist/shortcuts/meeting/operations/signs.js +41 -0
- package/dist/shortcuts/meeting/operations/types.js +25 -0
- package/dist/shortcuts/meeting/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/dist/shortcuts/yimiaoban/continuation.js +70 -0
- package/dist/shortcuts/yimiaoban/errors.js +61 -0
- package/dist/shortcuts/yimiaoban/host.js +469 -0
- package/dist/shortcuts/yimiaoban/index.js +271 -0
- package/dist/shortcuts/yimiaoban/manifest.js +28 -0
- package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
- package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
- package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
- package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
- package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
- package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
- package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
- package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
- package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
- package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
- package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
- package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
- package/dist/shortcuts/yimiaoban/operations.js +8 -0
- package/docs/SKILL.md +11 -7
- package/docs/_catalog.md +28 -5
- package/docs/agent-invoice.md +19 -9
- package/docs/agent-skill-install.md +141 -22
- 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 +61 -20
- package/docs/jiuchuanhui.md +131 -0
- package/docs/meeting.md +48 -0
- package/docs/operation-manual.md +443 -0
- package/docs/plan.md +82 -0
- package/docs/wenshuding.md +129 -0
- package/docs/yimiaoban.md +86 -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 +16 -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/meeting.md +3 -0
- package/skill-template/domains/plan.md +17 -0
- package/skill-template/domains/qiyecheng.md +17 -0
- package/skill-template/domains/shared.md +5 -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/yimiaoban.md +21 -0
- package/skill-template/domains/ziguanjia.md +21 -0
- package/skill-template/master-skill-template.md +12 -6
- package/skill-template/skill-template.md +26 -10
- package/skills/weaver-e10-calendar/SKILL.md +102 -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 +103 -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 +88 -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 +175 -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 +102 -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 +152 -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-meeting/SKILL.md +106 -0
- package/skills/weaver-e10-meeting/product.json +8 -0
- package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
- package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
- package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
- package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
- package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
- package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
- package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
- package/skills/weaver-e10-plan/SKILL.md +140 -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 +119 -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 +90 -0
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
- package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/json-output-contract.md +34 -0
- package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
- package/skills/weaver-e10-skill-maker/SKILL.md +78 -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 +158 -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-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-agent-entry.md +16 -9
- 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-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-download.md +9 -2
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-enterprise-list.md +12 -4
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +9 -2
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-import.md +16 -7
- 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 +12 -4
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-personal-list.md +12 -4
- 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 +9 -2
- 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-yimiaoban/SKILL.md +104 -0
- package/skills/weaver-e10-yimiaoban/product.json +8 -0
- package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
- package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
- package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
- package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
- package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
- package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
- package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
- package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
- package/skills/weaver-e10-ziguanjia/SKILL.md +163 -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 -122
- package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
- package/skills/weaver-work-cli-shared/SKILL.md +0 -63
- package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -90
- package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -73
- /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,22 +32,31 @@ 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;
|
|
@@ -96,20 +111,18 @@ export const invoiceShortcut = {
|
|
|
96
111
|
.action(action((ctx) => {
|
|
97
112
|
ctx.output.write(invoiceManifest, { json: true });
|
|
98
113
|
}));
|
|
99
|
-
invoice.command('run')
|
|
114
|
+
withJsonInputOptions(invoice.command('run')
|
|
100
115
|
.description('Run an invoice operation with JSON input')
|
|
101
|
-
.argument('<operation>', 'operation name, e.g. invoice.list')
|
|
102
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
116
|
+
.argument('<operation>', 'operation name, e.g. invoice.list'))
|
|
103
117
|
.action(action(async (ctx, operation, options) => {
|
|
104
118
|
await executeAndPrint(ctx, String(operation), await inputFrom(options));
|
|
105
119
|
}));
|
|
106
|
-
invoice.command('list')
|
|
120
|
+
withJsonInputOptions(invoice.command('list')
|
|
107
121
|
.description('List personal invoice folder entries')
|
|
108
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
109
122
|
.option('--content <keyword>', 'keyword search')
|
|
110
123
|
.option('--page-size <size>', 'page size')
|
|
111
124
|
.option('--start-pos <offset>', 'start position')
|
|
112
|
-
.option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable')
|
|
125
|
+
.option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable'))
|
|
113
126
|
.action(action(async (ctx, options) => {
|
|
114
127
|
const opts = asOptions(options);
|
|
115
128
|
await executeAndPrint(ctx, 'invoice.list', await inputFrom(options, {
|
|
@@ -120,13 +133,12 @@ export const invoiceShortcut = {
|
|
|
120
133
|
}));
|
|
121
134
|
}));
|
|
122
135
|
const enterprise = invoice.command('enterprise').description('Enterprise invoice folder commands');
|
|
123
|
-
enterprise.command('list')
|
|
136
|
+
withJsonInputOptions(enterprise.command('list')
|
|
124
137
|
.description('List enterprise invoice folder entries')
|
|
125
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
126
138
|
.option('--content <keyword>', 'keyword search')
|
|
127
139
|
.option('--page-size <size>', 'page size')
|
|
128
140
|
.option('--start-pos <offset>', 'start position')
|
|
129
|
-
.option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable')
|
|
141
|
+
.option('--sreim <status>', 'reimbursement status: 0 all, 1 in reimbursement, 2 reimbursed, 3 unreimbursed, 4 non-reimbursable'))
|
|
130
142
|
.action(action(async (ctx, options) => {
|
|
131
143
|
const opts = asOptions(options);
|
|
132
144
|
await executeAndPrint(ctx, 'invoice.enterprise.list', await inputFrom(options, {
|
|
@@ -136,11 +148,10 @@ export const invoiceShortcut = {
|
|
|
136
148
|
sreim: stringOption(opts.sreim),
|
|
137
149
|
}));
|
|
138
150
|
}));
|
|
139
|
-
invoice.command('get')
|
|
151
|
+
withJsonInputOptions(invoice.command('get')
|
|
140
152
|
.description('Get invoice detail by fid or number')
|
|
141
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
142
153
|
.option('--fid <fid>', 'invoice fid')
|
|
143
|
-
.option('--number <number>', 'invoice number')
|
|
154
|
+
.option('--number <number>', 'invoice number'))
|
|
144
155
|
.action(action(async (ctx, options) => {
|
|
145
156
|
const opts = asOptions(options);
|
|
146
157
|
await executeAndPrint(ctx, 'invoice.get', await inputFrom(options, {
|
|
@@ -148,11 +159,10 @@ export const invoiceShortcut = {
|
|
|
148
159
|
number: opts.number,
|
|
149
160
|
}));
|
|
150
161
|
}));
|
|
151
|
-
invoice.command('upload')
|
|
162
|
+
withJsonInputOptions(invoice.command('upload')
|
|
152
163
|
.description('Upload an invoice file for OCR')
|
|
153
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
154
164
|
.option('--file <path>', 'local invoice file')
|
|
155
|
-
.option('--url <url>', 'server-accessible file URL')
|
|
165
|
+
.option('--url <url>', 'server-accessible file URL'))
|
|
156
166
|
.action(action(async (ctx, options) => {
|
|
157
167
|
const opts = asOptions(options);
|
|
158
168
|
await executeAndPrint(ctx, 'invoice.upload', await inputFrom(options, {
|
|
@@ -161,11 +171,10 @@ export const invoiceShortcut = {
|
|
|
161
171
|
}));
|
|
162
172
|
}));
|
|
163
173
|
const ocr = invoice.command('ocr').description('Invoice OCR commands');
|
|
164
|
-
ocr.command('preview')
|
|
174
|
+
withJsonInputOptions(ocr.command('preview')
|
|
165
175
|
.description('Preview OCR result without saving an invoice')
|
|
166
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
167
176
|
.option('--file <path>', 'local invoice file')
|
|
168
|
-
.option('--url <url>', 'server-accessible file URL')
|
|
177
|
+
.option('--url <url>', 'server-accessible file URL'))
|
|
169
178
|
.action(action(async (ctx, options) => {
|
|
170
179
|
const opts = asOptions(options);
|
|
171
180
|
await executeAndPrint(ctx, 'invoice.ocr.preview', await inputFrom(options, {
|
|
@@ -174,11 +183,10 @@ export const invoiceShortcut = {
|
|
|
174
183
|
}));
|
|
175
184
|
}));
|
|
176
185
|
const validate = invoice.command('validate').description('Invoice validation commands');
|
|
177
|
-
validate.command('preview')
|
|
186
|
+
withJsonInputOptions(validate.command('preview')
|
|
178
187
|
.description('Validate an existing invoice without saving validation result')
|
|
179
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
180
188
|
.option('--fid <fid>', 'invoice fid')
|
|
181
|
-
.option('--scope <scope>', 'personal or enterprise')
|
|
189
|
+
.option('--scope <scope>', 'personal or enterprise'))
|
|
182
190
|
.action(action(async (ctx, options) => {
|
|
183
191
|
const opts = asOptions(options);
|
|
184
192
|
await executeAndPrint(ctx, 'invoice.validate.preview', await inputFrom(options, {
|
|
@@ -187,14 +195,13 @@ export const invoiceShortcut = {
|
|
|
187
195
|
}));
|
|
188
196
|
}));
|
|
189
197
|
const importCommand = invoice.command('import').description('Invoice file import commands');
|
|
190
|
-
importCommand.command('prepare')
|
|
198
|
+
withJsonInputOptions(importCommand.command('prepare')
|
|
191
199
|
.description('Prepare a confirmed invoice file import')
|
|
192
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
193
200
|
.option('--file <path>', 'local invoice file')
|
|
194
201
|
.option('--validate', 'request validation before import')
|
|
195
202
|
.option('--no-validate', 'skip validation before import')
|
|
196
203
|
.option('--sync-to-oa', 'sync imported invoice to OA where supported')
|
|
197
|
-
.option('--no-sync-to-oa', 'do not sync imported invoice to OA where supported')
|
|
204
|
+
.option('--no-sync-to-oa', 'do not sync imported invoice to OA where supported'))
|
|
198
205
|
.action(action(async (ctx, options) => {
|
|
199
206
|
const opts = asOptions(options);
|
|
200
207
|
await executeAndPrint(ctx, 'invoice.import.prepare', await inputFrom(options, {
|
|
@@ -203,12 +210,11 @@ export const invoiceShortcut = {
|
|
|
203
210
|
syncToOa: typeof opts.syncToOa === 'boolean' ? opts.syncToOa : undefined,
|
|
204
211
|
}));
|
|
205
212
|
}));
|
|
206
|
-
importCommand.command('apply')
|
|
213
|
+
withJsonInputOptions(importCommand.command('apply')
|
|
207
214
|
.description('Apply a prepared invoice file import')
|
|
208
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
209
215
|
.option('--file <path>', 'local invoice file')
|
|
210
216
|
.option('--continuation <token>', 'continuation token from prepare')
|
|
211
|
-
.option('--yes', 'confirm the write operation')
|
|
217
|
+
.option('--yes', 'confirm the write operation'))
|
|
212
218
|
.action(action(async (ctx, options) => {
|
|
213
219
|
const opts = asOptions(options);
|
|
214
220
|
await executeAndPrint(ctx, 'invoice.import.apply', await inputFrom(options, {
|
|
@@ -218,19 +224,17 @@ export const invoiceShortcut = {
|
|
|
218
224
|
}));
|
|
219
225
|
}));
|
|
220
226
|
const add = invoice.command('add').description('Manual invoice add commands');
|
|
221
|
-
add.command('prepare')
|
|
227
|
+
withJsonInputOptions(add.command('prepare')
|
|
222
228
|
.description('Prepare a confirmed manual invoice add')
|
|
223
|
-
.option('--
|
|
224
|
-
.option('--scope <scope>', 'personal or enterprise')
|
|
229
|
+
.option('--scope <scope>', 'personal or enterprise'))
|
|
225
230
|
.action(action(async (ctx, options) => {
|
|
226
231
|
const opts = asOptions(options);
|
|
227
232
|
await executeAndPrint(ctx, 'invoice.add.prepare', await inputFrom(options, { scope: opts.scope }));
|
|
228
233
|
}));
|
|
229
|
-
add.command('apply')
|
|
234
|
+
withJsonInputOptions(add.command('apply')
|
|
230
235
|
.description('Apply a prepared manual invoice add')
|
|
231
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
232
236
|
.option('--continuation <token>', 'continuation token from prepare')
|
|
233
|
-
.option('--yes', 'confirm the write operation')
|
|
237
|
+
.option('--yes', 'confirm the write operation'))
|
|
234
238
|
.action(action(async (ctx, options) => {
|
|
235
239
|
const opts = asOptions(options);
|
|
236
240
|
await executeAndPrint(ctx, 'invoice.add.apply', await inputFrom(options, {
|
|
@@ -239,11 +243,10 @@ export const invoiceShortcut = {
|
|
|
239
243
|
}));
|
|
240
244
|
}));
|
|
241
245
|
const update = invoice.command('update').description('Invoice update commands');
|
|
242
|
-
update.command('prepare')
|
|
246
|
+
withJsonInputOptions(update.command('prepare')
|
|
243
247
|
.description('Prepare an invoice update')
|
|
244
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
245
248
|
.option('--fid <fid>', 'invoice fid')
|
|
246
|
-
.option('--scope <scope>', 'personal or enterprise')
|
|
249
|
+
.option('--scope <scope>', 'personal or enterprise'))
|
|
247
250
|
.action(action(async (ctx, options) => {
|
|
248
251
|
const opts = asOptions(options);
|
|
249
252
|
await executeAndPrint(ctx, 'invoice.update.prepare', await inputFrom(options, {
|
|
@@ -251,11 +254,10 @@ export const invoiceShortcut = {
|
|
|
251
254
|
scope: opts.scope,
|
|
252
255
|
}));
|
|
253
256
|
}));
|
|
254
|
-
update.command('apply')
|
|
257
|
+
withJsonInputOptions(update.command('apply')
|
|
255
258
|
.description('Apply a prepared invoice update')
|
|
256
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
257
259
|
.option('--continuation <token>', 'continuation token from prepare')
|
|
258
|
-
.option('--yes', 'confirm the write operation')
|
|
260
|
+
.option('--yes', 'confirm the write operation'))
|
|
259
261
|
.action(action(async (ctx, options) => {
|
|
260
262
|
const opts = asOptions(options);
|
|
261
263
|
await executeAndPrint(ctx, 'invoice.update.apply', await inputFrom(options, {
|
|
@@ -263,12 +265,11 @@ export const invoiceShortcut = {
|
|
|
263
265
|
confirm: opts.yes === true ? true : undefined,
|
|
264
266
|
}));
|
|
265
267
|
}));
|
|
266
|
-
invoice.command('download')
|
|
268
|
+
withJsonInputOptions(invoice.command('download')
|
|
267
269
|
.description('Download an invoice attachment after verifying ownership')
|
|
268
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
269
270
|
.option('--fid <fid>', 'invoice fid')
|
|
270
271
|
.option('--file-id <id>', 'invoice file id')
|
|
271
|
-
.option('--output <path>', 'output file path')
|
|
272
|
+
.option('--output <path>', 'output file path'))
|
|
272
273
|
.action(action(async (ctx, options) => {
|
|
273
274
|
const opts = asOptions(options);
|
|
274
275
|
await executeAndPrint(ctx, 'invoice.download', await inputFrom(options, {
|
|
@@ -278,11 +279,10 @@ export const invoiceShortcut = {
|
|
|
278
279
|
}));
|
|
279
280
|
}));
|
|
280
281
|
const del = invoice.command('delete').description('Invoice delete commands');
|
|
281
|
-
del.command('prepare')
|
|
282
|
+
withJsonInputOptions(del.command('prepare')
|
|
282
283
|
.description('Prepare an invoice soft delete')
|
|
283
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
284
284
|
.option('--fid <fid>', 'invoice fid')
|
|
285
|
-
.option('--scope <scope>', 'personal or enterprise')
|
|
285
|
+
.option('--scope <scope>', 'personal or enterprise'))
|
|
286
286
|
.action(action(async (ctx, options) => {
|
|
287
287
|
const opts = asOptions(options);
|
|
288
288
|
await executeAndPrint(ctx, 'invoice.delete.prepare', await inputFrom(options, {
|
|
@@ -290,11 +290,10 @@ export const invoiceShortcut = {
|
|
|
290
290
|
scope: opts.scope,
|
|
291
291
|
}));
|
|
292
292
|
}));
|
|
293
|
-
del.command('apply')
|
|
293
|
+
withJsonInputOptions(del.command('apply')
|
|
294
294
|
.description('Apply a prepared invoice soft delete')
|
|
295
|
-
.option('--input <path>', 'JSON input file, or - for stdin')
|
|
296
295
|
.option('--continuation <token>', 'continuation token from prepare')
|
|
297
|
-
.option('--yes', 'confirm the write operation')
|
|
296
|
+
.option('--yes', 'confirm the write operation'))
|
|
298
297
|
.action(action(async (ctx, options) => {
|
|
299
298
|
const opts = asOptions(options);
|
|
300
299
|
await executeAndPrint(ctx, 'invoice.delete.apply', await inputFrom(options, {
|