weaver-work-cli 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +187 -76
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +160 -55
  7. package/dist/internal/e10/auth/crypto.js +7 -22
  8. package/dist/internal/e10/auth/session.js +1 -1
  9. package/dist/internal/e10/auth/xiaoe.js +268 -0
  10. package/dist/internal/e10/context.js +16 -2
  11. package/dist/internal/e10/index.js +1 -0
  12. package/dist/internal/e10/request-runtime.js +344 -0
  13. package/dist/internal/skills/install.js +48 -6
  14. package/dist/internal/skills/reader.js +27 -0
  15. package/dist/shortcuts/archive/continuation.js +70 -0
  16. package/dist/shortcuts/archive/errors.js +53 -0
  17. package/dist/shortcuts/archive/host.js +197 -0
  18. package/dist/shortcuts/archive/index.js +363 -0
  19. package/dist/shortcuts/archive/manifest.js +45 -0
  20. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  21. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  22. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  23. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  24. package/dist/shortcuts/archive/operations/download.js +238 -0
  25. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  26. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  27. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  28. package/dist/shortcuts/archive/operations/registry.js +43 -0
  29. package/dist/shortcuts/archive/operations/search.js +88 -0
  30. package/dist/shortcuts/archive/operations/shared.js +120 -0
  31. package/dist/shortcuts/archive/operations/types.js +23 -0
  32. package/dist/shortcuts/archive/operations/upload.js +182 -0
  33. package/dist/shortcuts/archive/operations.js +13 -0
  34. package/dist/shortcuts/archive/render/search-format.js +276 -0
  35. package/dist/shortcuts/archive/render/search-view.js +125 -0
  36. package/dist/shortcuts/asset/continuation.js +70 -0
  37. package/dist/shortcuts/asset/errors.js +67 -0
  38. package/dist/shortcuts/asset/host.js +438 -0
  39. package/dist/shortcuts/asset/index.js +255 -0
  40. package/dist/shortcuts/asset/manifest.js +471 -0
  41. package/dist/shortcuts/asset/operations/query.js +249 -0
  42. package/dist/shortcuts/asset/operations/registry.js +85 -0
  43. package/dist/shortcuts/asset/operations/shared.js +100 -0
  44. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  45. package/dist/shortcuts/asset/operations/types.js +1 -0
  46. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  47. package/dist/shortcuts/asset/operations/write.js +435 -0
  48. package/dist/shortcuts/asset/operations.js +9 -0
  49. package/dist/shortcuts/calendar/continuation.js +70 -0
  50. package/dist/shortcuts/calendar/errors.js +53 -0
  51. package/dist/shortcuts/calendar/host.js +148 -0
  52. package/dist/shortcuts/calendar/index.js +125 -0
  53. package/dist/shortcuts/calendar/manifest.js +26 -0
  54. package/dist/shortcuts/calendar/operations/read.js +259 -0
  55. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  56. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  57. package/dist/shortcuts/calendar/operations/types.js +25 -0
  58. package/dist/shortcuts/calendar/operations/write.js +439 -0
  59. package/dist/shortcuts/calendar/operations.js +8 -0
  60. package/dist/shortcuts/ehr/continuation.js +70 -0
  61. package/dist/shortcuts/ehr/errors.js +53 -0
  62. package/dist/shortcuts/ehr/host.js +213 -0
  63. package/dist/shortcuts/ehr/index.js +205 -0
  64. package/dist/shortcuts/ehr/manifest.js +47 -0
  65. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  66. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  67. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  68. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  69. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  70. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  71. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  72. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  73. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  74. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  75. package/dist/shortcuts/ehr/operations/types.js +25 -0
  76. package/dist/shortcuts/ehr/operations.js +25 -0
  77. package/dist/shortcuts/esb/continuation.js +70 -0
  78. package/dist/shortcuts/esb/errors.js +65 -0
  79. package/dist/shortcuts/esb/host.js +187 -0
  80. package/dist/shortcuts/esb/index.js +112 -0
  81. package/dist/shortcuts/esb/manifest.js +91 -0
  82. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  83. package/dist/shortcuts/esb/operations/registry.js +48 -0
  84. package/dist/shortcuts/esb/operations/shared.js +152 -0
  85. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  86. package/dist/shortcuts/esb/operations/types.js +21 -0
  87. package/dist/shortcuts/esb/operations.js +15 -0
  88. package/dist/shortcuts/fna/continuation.js +70 -0
  89. package/dist/shortcuts/fna/errors.js +59 -0
  90. package/dist/shortcuts/fna/host.js +146 -0
  91. package/dist/shortcuts/fna/index.js +111 -0
  92. package/dist/shortcuts/fna/manifest.js +41 -0
  93. package/dist/shortcuts/fna/operations/budget.js +124 -0
  94. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  95. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  96. package/dist/shortcuts/fna/operations/loan.js +195 -0
  97. package/dist/shortcuts/fna/operations/registry.js +35 -0
  98. package/dist/shortcuts/fna/operations/shared.js +210 -0
  99. package/dist/shortcuts/fna/operations/types.js +25 -0
  100. package/dist/shortcuts/fna/operations.js +19 -0
  101. package/dist/shortcuts/hrm/errors.js +38 -0
  102. package/dist/shortcuts/hrm/host.js +156 -0
  103. package/dist/shortcuts/hrm/index.js +111 -0
  104. package/dist/shortcuts/hrm/manifest.js +32 -0
  105. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  106. package/dist/shortcuts/hrm/operations/org.js +110 -0
  107. package/dist/shortcuts/hrm/operations/position.js +176 -0
  108. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  109. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  110. package/dist/shortcuts/hrm/operations/types.js +23 -0
  111. package/dist/shortcuts/hrm/operations.js +19 -0
  112. package/dist/shortcuts/index.js +20 -0
  113. package/dist/shortcuts/invoice/host.js +99 -94
  114. package/dist/shortcuts/invoice/index.js +65 -61
  115. package/dist/shortcuts/invoice/manifest.js +222 -14
  116. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  117. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  118. package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
  119. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  120. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  121. package/dist/shortcuts/invoice/operations/shared.js +271 -6
  122. package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
  123. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  124. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  125. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  126. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  127. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  128. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  131. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  132. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  133. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  134. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  135. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  136. package/dist/shortcuts/mail/continuation.js +70 -0
  137. package/dist/shortcuts/mail/errors.js +53 -0
  138. package/dist/shortcuts/mail/host.js +182 -0
  139. package/dist/shortcuts/mail/index.js +519 -0
  140. package/dist/shortcuts/mail/manifest.js +38 -0
  141. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  142. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  143. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  144. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  145. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  146. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  147. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  148. package/dist/shortcuts/mail/operations/registry.js +41 -0
  149. package/dist/shortcuts/mail/operations/shared.js +64 -0
  150. package/dist/shortcuts/mail/operations/types.js +27 -0
  151. package/dist/shortcuts/mail/operations.js +19 -0
  152. package/dist/shortcuts/plan/continuation.js +70 -0
  153. package/dist/shortcuts/plan/errors.js +70 -0
  154. package/dist/shortcuts/plan/host.js +180 -0
  155. package/dist/shortcuts/plan/index.js +150 -0
  156. package/dist/shortcuts/plan/manifest.js +53 -0
  157. package/dist/shortcuts/plan/operations/link.js +256 -0
  158. package/dist/shortcuts/plan/operations/read.js +259 -0
  159. package/dist/shortcuts/plan/operations/registry.js +33 -0
  160. package/dist/shortcuts/plan/operations/shared.js +246 -0
  161. package/dist/shortcuts/plan/operations/types.js +49 -0
  162. package/dist/shortcuts/plan/operations/version.js +49 -0
  163. package/dist/shortcuts/plan/operations/write.js +710 -0
  164. package/dist/shortcuts/plan/operations.js +8 -0
  165. package/docs/SKILL.md +11 -7
  166. package/docs/_catalog.md +23 -5
  167. package/docs/agent-invoice.md +31 -10
  168. package/docs/agent-skill-install.md +211 -0
  169. package/docs/calendar.md +87 -0
  170. package/docs/e10-auth.md +28 -9
  171. package/docs/ehr.md +186 -0
  172. package/docs/esb.md +64 -0
  173. package/docs/fna.md +72 -0
  174. package/docs/hrm.md +89 -0
  175. package/docs/invoice.md +66 -20
  176. package/docs/jiuchuanhui.md +131 -0
  177. package/docs/operation-manual.md +443 -0
  178. package/docs/plan.md +82 -0
  179. package/docs/wenshuding.md +129 -0
  180. package/docs/ziguanjia.md +89 -0
  181. package/package.json +4 -4
  182. package/scripts/package-skill.mjs +127 -34
  183. package/scripts/postbuild.mjs +13 -0
  184. package/skill-template/business-info.json +13 -2
  185. package/skill-template/domains/calendar.md +15 -0
  186. package/skill-template/domains/esb.md +13 -0
  187. package/skill-template/domains/hrm.md +16 -0
  188. package/skill-template/domains/jiuchuanhui.md +23 -0
  189. package/skill-template/domains/jucailin.md +22 -0
  190. package/skill-template/domains/mail.md +21 -0
  191. package/skill-template/domains/plan.md +17 -0
  192. package/skill-template/domains/qiyecheng.md +17 -0
  193. package/skill-template/domains/shared.md +9 -3
  194. package/skill-template/domains/skill-maker.md +10 -0
  195. package/skill-template/domains/wenshuding.md +22 -0
  196. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  197. package/skill-template/domains/ziguanjia.md +21 -0
  198. package/skill-template/master-skill-template.md +12 -6
  199. package/skill-template/skill-template.md +40 -9
  200. package/skills/weaver-e10-calendar/SKILL.md +101 -0
  201. package/skills/weaver-e10-calendar/product.json +8 -0
  202. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  203. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  204. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  205. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  206. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  207. package/skills/weaver-e10-esb/SKILL.md +102 -0
  208. package/skills/weaver-e10-esb/product.json +8 -0
  209. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  210. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  211. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  212. package/skills/weaver-e10-hrm/SKILL.md +87 -0
  213. package/skills/weaver-e10-hrm/product.json +8 -0
  214. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  215. package/skills/weaver-e10-hrm/references/org.md +95 -0
  216. package/skills/weaver-e10-hrm/references/position.md +95 -0
  217. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  218. package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
  219. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  220. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  221. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  222. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  223. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  224. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  225. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  226. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  227. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  228. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  229. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  230. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  231. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  232. package/skills/weaver-e10-jucailin/SKILL.md +101 -0
  233. package/skills/weaver-e10-jucailin/product.json +8 -0
  234. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  235. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  236. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  237. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  238. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  239. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  240. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  241. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  242. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  243. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  244. package/skills/weaver-e10-mail/SKILL.md +151 -0
  245. package/skills/weaver-e10-mail/product.json +8 -0
  246. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  247. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  248. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  249. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  250. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  251. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  252. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  253. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  254. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  255. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  256. package/skills/weaver-e10-plan/SKILL.md +139 -0
  257. package/skills/weaver-e10-plan/product.json +8 -0
  258. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  259. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  260. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  261. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  262. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  263. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  264. package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
  265. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  266. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  267. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  268. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  269. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  272. package/skills/weaver-e10-shared/SKILL.md +86 -0
  273. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  274. package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
  275. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  276. package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
  277. package/skills/weaver-e10-skill-maker/product.json +8 -0
  278. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  279. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  280. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  281. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  282. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  283. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  284. package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
  285. package/skills/weaver-e10-wenshuding/product.json +8 -0
  286. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  287. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  288. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  289. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  290. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  291. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  292. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  293. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  294. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  295. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  296. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  297. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  298. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
  300. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  301. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  302. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  303. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  304. package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
  305. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
  306. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
  307. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
  308. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  309. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  310. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  311. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
  312. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
  313. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  314. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  315. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  316. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
  317. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  318. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  319. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  320. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  321. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  322. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  323. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  324. package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
  325. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  326. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  327. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  328. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  329. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  330. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  331. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  332. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  333. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  334. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  335. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  336. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  337. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  338. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  339. package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
  340. package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
  341. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  342. package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
  343. package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
  344. package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
  345. package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
  346. package/skills/weaver-work-cli-shared/SKILL.md +0 -53
  347. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
  348. package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
  349. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
  350. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  351. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,110 @@
1
+ import { hrmValidationError } from '../errors.js';
2
+ import { READ, SCHEMA_ID, SCHEMA_PAGE, hrmSuccess, schemaOf, } from './types.js';
3
+ import { browserBaseBody, orgLink, toNumber, toPositiveInt, toStringIdList, } from './shared.js';
4
+ const ORG_TYPES = ['subcompany', 'department'];
5
+ /**
6
+ * 组织浏览接口(分部 subcompany / 部门 department)统一入口。
7
+ * 两者 Body 结构一致,仅父级条件键不同:
8
+ * - department 支持 parent(上级部门)/ subcompany(上级分部)
9
+ * - subcompany 支持 supSubDepartment(上级分部)
10
+ */
11
+ const orgQuery = {
12
+ name: 'hrm.org.query',
13
+ resource: 'org',
14
+ method: 'org.query',
15
+ action: 'hrm.org.query',
16
+ summary: '按名称/编号/上级组织查询分部或部门(type 区分;不传 type 时默认部门,可用 type 切分部分部)',
17
+ risk: READ,
18
+ inputSchema: schemaOf({
19
+ type: { type: 'string', enum: [...ORG_TYPES], description: 'subcompany 分部 / department 部门;不传默认 department' },
20
+ name: { type: 'string', description: '名称(模糊包含匹配)' },
21
+ code: { type: 'string', description: '编号(模糊包含匹配)' },
22
+ parent: { type: 'array', items: SCHEMA_ID, description: '上级部门 id 数组(部门挂在部门下,department)' },
23
+ subcompany: { type: 'array', items: SCHEMA_ID, description: '上级分部 id 数组(部门挂在分部下,department)' },
24
+ supSubDepartment: { type: 'array', items: SCHEMA_ID, description: '上级分部 id 数组(分部挂在分部下,subcompany)' },
25
+ ...SCHEMA_PAGE,
26
+ }),
27
+ handler: async (args, { host }) => {
28
+ const type = args.type === undefined ? 'department' : String(args.type);
29
+ if (!ORG_TYPES.includes(type)) {
30
+ throw hrmValidationError('enum_invalid', `type 取值必须是 ${ORG_TYPES.join(' / ')} 之一`);
31
+ }
32
+ const name = args.name === undefined ? '' : String(args.name).trim();
33
+ const code = args.code === undefined ? '' : String(args.code).trim();
34
+ const parentIds = toStringIdList(args.parent, 'parent');
35
+ const subcompanyIds = toStringIdList(args.subcompany, 'subcompany');
36
+ const supSubDepartmentIds = toStringIdList(args.supSubDepartment, 'supSubDepartment');
37
+ const hasText = name !== '' || code !== '';
38
+ const hasOrg = Boolean(parentIds?.length || subcompanyIds?.length || supSubDepartmentIds?.length);
39
+ if (!hasText && !hasOrg) {
40
+ throw hrmValidationError('empty_condition', '组织查询必须携带至少一个收敛条件:name / code / parent / subcompany / supSubDepartment');
41
+ }
42
+ const formDatas = {};
43
+ if (name)
44
+ formDatas.name = [{ nameCondition: { id: 'in', content: '包含', disabled: false }, name }];
45
+ if (code)
46
+ formDatas.code = [{ codeCondition: { id: 'in', content: '包含', disabled: false }, code }];
47
+ if (parentIds?.length) {
48
+ formDatas.parent = [{ parentCondition: { id: 'eq', content: '等于', disabled: false }, parent: parentIds.map((id) => ({ id })) }];
49
+ }
50
+ if (subcompanyIds?.length) {
51
+ formDatas.subcompany = [{ subcompanyCondition: { id: 'eq', content: '等于', disabled: false }, subcompany: subcompanyIds.map((id) => ({ id })) }];
52
+ }
53
+ if (supSubDepartmentIds?.length) {
54
+ formDatas.supSubDepartment = [{ supSubDepartmentCondition: { id: 'eq', content: '等于', disabled: false }, supSubDepartment: supSubDepartmentIds.map((id) => ({ id })) }];
55
+ }
56
+ const body = {
57
+ ...browserBaseBody(),
58
+ virtualType: 'ALL',
59
+ cmd: 'list',
60
+ formDatas,
61
+ quickSearchDatas: {},
62
+ type: 'and',
63
+ stopDepartment: false,
64
+ };
65
+ // 组织浏览接口(subcompany/department)后端要求 current/pageSize 非空,
66
+ // 不传会 500(`current is null`),故与 meta 默认值一致地补齐默认分页。
67
+ const current = toPositiveInt(args.current, 'current') ?? 1;
68
+ const pageSize = toNumber(args.pageSize, 'pageSize') ?? 200;
69
+ body.current = current;
70
+ body.pageSize = pageSize;
71
+ const path = type === 'subcompany'
72
+ ? '/api/hrm/common/browser/data/subcompany'
73
+ : '/api/hrm/common/browser/data/department';
74
+ const resp = await host.request({ method: 'POST', path, body });
75
+ const d = resp?.data ?? {};
76
+ const rawRows = Array.isArray(d.data) ? d.data : [];
77
+ const session = await host.getSession();
78
+ const baseUrl = session.baseUrl.replace(/\/+$/, '');
79
+ const rows = rawRows.map((r) => ({ ...r, link: orgLink(baseUrl, r.id) }));
80
+ return hrmSuccess('hrm.org.query', { rows, total: Number(d.total ?? rows.length), type }, { current, pageSize });
81
+ },
82
+ };
83
+ const orgDetail = {
84
+ name: 'hrm.org.detail',
85
+ resource: 'org',
86
+ method: 'org.detail',
87
+ action: 'hrm.org.detail',
88
+ summary: '按组织节点 id 取部门/分部详情表单(类型由服务端按记录自动判断;含全路径 fullPath 与人员统计)',
89
+ risk: READ,
90
+ inputSchema: schemaOf({ id: SCHEMA_ID }, { required: ['id'] }),
91
+ handler: async (args, { host }) => {
92
+ const id = String(args.id).trim();
93
+ if (!id)
94
+ throw hrmValidationError('id_required', 'id 必填');
95
+ const session = await host.getSession();
96
+ const baseUrl = session.baseUrl.replace(/\/+$/, '');
97
+ const resp = await host.request({
98
+ method: 'GET',
99
+ path: '/api/bs/hrm/organization/getForm',
100
+ query: { id, readOnly: true, includeSub: true, quote: true, isMobile: false },
101
+ headers: { Referer: `${baseUrl}/sp/hrm/orgCard/${id}` },
102
+ });
103
+ const data = resp?.data ?? {};
104
+ return hrmSuccess('hrm.org.detail', { ...data, link: orgLink(baseUrl, id) });
105
+ },
106
+ };
107
+ export const hrmOrgOperations = [
108
+ orgQuery,
109
+ orgDetail,
110
+ ];
@@ -0,0 +1,176 @@
1
+ import { hrmValidationError } from '../errors.js';
2
+ import { READ, SCHEMA_ID, hrmSuccess, schemaOf, } from './types.js';
3
+ import { positionLink, toNumber, } from './shared.js';
4
+ /** 岗位浏览按钮 formDatas 7 字段默认算子声明(录制原样;快捷搜索时保持占位)。 */
5
+ function positionFormDatas() {
6
+ const d = {};
7
+ for (const f of ['name', 'full_name', 'code', 'parent', 'department', 'jobsetid', 'grade_id']) {
8
+ d[f] = [{ [`${f}Opt`]: { id: 'in', content: '包含', disabled: false } }];
9
+ }
10
+ return d;
11
+ }
12
+ /** 岗位浏览按钮轻量行。 */
13
+ function formatPosRow(r, baseUrl) {
14
+ return {
15
+ id: r.id,
16
+ name: r.name || r.content || '',
17
+ code: r.code || '',
18
+ title: r.title || '',
19
+ leaf: r.leaf !== false,
20
+ link: positionLink(baseUrl, r.id),
21
+ };
22
+ }
23
+ /** 岗位批量列表(queryListByOrgTree)结构化行。 */
24
+ function formatPosListItem(r, baseUrl) {
25
+ return {
26
+ id: r.id,
27
+ name: r.name,
28
+ fullName: r.fullName || '',
29
+ code: r.code || '',
30
+ parent: r.parent || '',
31
+ parentId: r.parentId || '',
32
+ department: r.department || '',
33
+ userCount: r.userCount || '0',
34
+ partTimeCount: r.partTimeCount || '0',
35
+ cancelStatus: r.cancelStatus,
36
+ jobsetid: r.jobsetid || '',
37
+ link: positionLink(baseUrl, r.id),
38
+ };
39
+ }
40
+ const positionQuery = {
41
+ name: 'hrm.position.query',
42
+ resource: 'position',
43
+ method: 'position.query',
44
+ action: 'hrm.position.query',
45
+ summary: '按名称/编号查岗位(快捷搜索名称编号合一;显式 name/code 走高级条件)',
46
+ risk: READ,
47
+ inputSchema: schemaOf({
48
+ keyword: { type: 'string', description: '快捷搜索关键词,名称与编号合一匹配' },
49
+ name: { type: 'string', description: '岗位名称(包含匹配)' },
50
+ code: { type: 'string', description: '岗位编号(精确匹配)' },
51
+ }),
52
+ handler: async (args, { host }) => {
53
+ const name = args.name === undefined ? '' : String(args.name).trim();
54
+ const code = args.code === undefined ? '' : String(args.code).trim();
55
+ const keyword = args.keyword === undefined ? '' : String(args.keyword).trim();
56
+ if (!name && !code && !keyword) {
57
+ throw hrmValidationError('empty_condition', '岗位查询必须携带至少一个收敛条件:keyword 或 name / code');
58
+ }
59
+ const formDatas = positionFormDatas();
60
+ const quickSearchDatas = {};
61
+ if (name) {
62
+ formDatas.name = [{ nameOpt: { id: 'in', content: '包含', disabled: false } }, { nameInput: name }];
63
+ }
64
+ else if (code) {
65
+ formDatas.code = [{ codeOpt: { id: 'eq', content: '等于', disabled: false } }, { codeInput: code }];
66
+ }
67
+ else {
68
+ quickSearchDatas.name = keyword;
69
+ }
70
+ const resp = await host.request({
71
+ method: 'POST',
72
+ path: '/api/app/hrm/common/browser/data/position',
73
+ body: { cmd: 'list', current: 1, pageSize: 200, formDatas, quickSearchDatas, type: 'and' },
74
+ });
75
+ const d = resp?.data ?? {};
76
+ const rawRows = Array.isArray(d.data) ? d.data : [];
77
+ const session = await host.getSession();
78
+ const baseUrl = session.baseUrl.replace(/\/+$/, '');
79
+ const rows = rawRows.map((r) => formatPosRow(r, baseUrl));
80
+ return hrmSuccess('hrm.position.query', { rows, total: Number(d.total ?? rows.length) });
81
+ },
82
+ };
83
+ const positionDetail = {
84
+ name: 'hrm.position.detail',
85
+ resource: 'position',
86
+ method: 'position.detail',
87
+ action: 'hrm.position.detail',
88
+ summary: '按岗位 id 取岗位详情表单(只读 type=info,含职务/职级名称)',
89
+ risk: READ,
90
+ inputSchema: schemaOf({ id: SCHEMA_ID }, { required: ['id'] }),
91
+ handler: async (args, { host }) => {
92
+ const id = String(args.id).trim();
93
+ if (!id)
94
+ throw hrmValidationError('id_required', 'id 必填');
95
+ const session = await host.getSession();
96
+ const baseUrl = session.baseUrl.replace(/\/+$/, '');
97
+ const resp = await host.request({
98
+ method: 'GET',
99
+ path: '/api/bs/hrm/post/getEditOrAddPostForm',
100
+ query: { id, type: 'info' },
101
+ headers: { Referer: `${baseUrl}/sp/hrm/positionCard/${id}` },
102
+ });
103
+ const data = resp?.data ?? {};
104
+ return hrmSuccess('hrm.position.detail', { ...data, link: positionLink(baseUrl, id) });
105
+ },
106
+ };
107
+ const positionList = {
108
+ name: 'hrm.position.list',
109
+ resource: 'position',
110
+ method: 'position.list',
111
+ action: 'hrm.position.list',
112
+ summary: '按组织/名称/编号批量查询岗位(岗位地址簿,一次性 + 自动翻页;无过滤需显式 all=true)',
113
+ risk: READ,
114
+ inputSchema: schemaOf({
115
+ org: SCHEMA_ID,
116
+ name: { type: 'string', description: '岗位名称过滤(与 code 二选一)' },
117
+ code: { type: 'string', description: '岗位编号过滤(与 name 二选一)' },
118
+ all: { type: 'boolean', description: '显式确认全量拉取(无 org/name/code 过滤时必填 true)' },
119
+ pageSize: SCHEMA_ID,
120
+ }),
121
+ handler: async (args, { host }) => {
122
+ const hasFilter = args.org !== undefined || args.name !== undefined || args.code !== undefined;
123
+ if (!hasFilter && args.all !== true) {
124
+ throw hrmValidationError('full_pull_blocked', '禁止无条件全量拉取岗位(当前环境岗位可达数千条)。请提供 org(组织 id)或 name / code 过滤;确需全量请显式传 all=true');
125
+ }
126
+ const body = {
127
+ moduleType: 'positionAddressBook',
128
+ leftOrgId: args.org !== undefined ? String(args.org) : '',
129
+ tableType: 'none',
130
+ isContainBlock: '0',
131
+ includeSub: true,
132
+ saCondition: {
133
+ name: [{ name_condition: 'in' }],
134
+ fullName: [{ fullName_condition: 'in' }],
135
+ code: [{ code_condition: 'in' }],
136
+ department: [{ department_condition: 'in' }],
137
+ },
138
+ saMatchType: 'and',
139
+ };
140
+ if (args.name !== undefined || args.code !== undefined) {
141
+ body.keyword = String(args.name ?? args.code);
142
+ body.keywordMatchFieldList = args.name !== undefined ? ['name'] : ['code'];
143
+ }
144
+ else {
145
+ body.keyword = '';
146
+ body.keywordMatchFieldList = [];
147
+ }
148
+ const pageSize = toNumber(args.pageSize, 'pageSize') ?? 100;
149
+ // 翻页收集:循环 current 直到累计行数 >= total 或空行;加安全预算防死循环。
150
+ const collected = [];
151
+ let total = 0;
152
+ const maxPages = 500;
153
+ for (let current = 1; current <= maxPages; current++) {
154
+ const resp = await host.request({
155
+ method: 'POST',
156
+ path: '/api/bs/hrm/position/queryListByOrgTree',
157
+ body: { ...body, current, pageSize },
158
+ });
159
+ const d = resp?.data ?? {};
160
+ const rows = Array.isArray(d.data) ? d.data : [];
161
+ collected.push(...rows);
162
+ total = Number(d.total ?? total);
163
+ if (!rows.length || collected.length >= total)
164
+ break;
165
+ }
166
+ const session = await host.getSession();
167
+ const baseUrl = session.baseUrl.replace(/\/+$/, '');
168
+ const list = collected.map((r) => formatPosListItem(r, baseUrl));
169
+ return hrmSuccess('hrm.position.list', { rows: list, total: total || list.length }, { pageSize });
170
+ },
171
+ };
172
+ export const hrmPositionOperations = [
173
+ positionQuery,
174
+ positionDetail,
175
+ positionList,
176
+ ];
@@ -0,0 +1,33 @@
1
+ import { hrmValidationError } from '../errors.js';
2
+ import { hrmEmployeeOperations } from './employee.js';
3
+ import { hrmOrgOperations } from './org.js';
4
+ import { hrmPositionOperations } from './position.js';
5
+ function buildRegistry() {
6
+ const registry = new Map();
7
+ const definitions = [
8
+ ...hrmEmployeeOperations,
9
+ ...hrmOrgOperations,
10
+ ...hrmPositionOperations,
11
+ ];
12
+ for (const definition of definitions) {
13
+ if (registry.has(definition.name)) {
14
+ throw new Error(`duplicate hrm operation: ${definition.name}`);
15
+ }
16
+ registry.set(definition.name, definition);
17
+ }
18
+ return registry;
19
+ }
20
+ const hrmOperationRegistry = buildRegistry();
21
+ export function hrmOperationDefinitions() {
22
+ return [...hrmOperationRegistry.values()];
23
+ }
24
+ export function getHrmOperation(operation) {
25
+ const definition = hrmOperationRegistry.get(operation);
26
+ if (!definition) {
27
+ throw hrmValidationError('operation_unknown', `组织管理不支持操作:${operation}`);
28
+ }
29
+ return definition;
30
+ }
31
+ export function hasHrmOperation(operation) {
32
+ return hrmOperationRegistry.has(operation);
33
+ }
@@ -0,0 +1,143 @@
1
+ import { hrmValidationError } from '../errors.js';
2
+ /** 原型污染防护:禁止出现在输入对象中的键。 */
3
+ const FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
4
+ export function asObject(value) {
5
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
6
+ throw hrmValidationError('input_not_object', '输入必须是 JSON 对象');
7
+ }
8
+ return value;
9
+ }
10
+ export function assertNoForbiddenKeys(input) {
11
+ for (const key of Object.keys(input)) {
12
+ if (FORBIDDEN_KEYS.has(key)) {
13
+ throw hrmValidationError('forbidden_key', `输入包含非法字段:${key}`);
14
+ }
15
+ }
16
+ }
17
+ export function toNumber(value, field) {
18
+ if (value === undefined || value === null || value === '')
19
+ return undefined;
20
+ const numeric = Number(value);
21
+ if (!Number.isFinite(numeric)) {
22
+ throw hrmValidationError('number_invalid', `${field} 必须是数字`);
23
+ }
24
+ return numeric;
25
+ }
26
+ export function toPositiveInt(value, field) {
27
+ if (value === undefined || value === null || value === '')
28
+ return undefined;
29
+ const numeric = Number(value);
30
+ if (!Number.isFinite(numeric)) {
31
+ throw hrmValidationError('number_invalid', `${field} 必须是数字`);
32
+ }
33
+ const truncated = Math.trunc(numeric);
34
+ if (truncated !== numeric || truncated <= 0) {
35
+ throw hrmValidationError('number_invalid', `${field} 必须是正整数`);
36
+ }
37
+ return truncated;
38
+ }
39
+ /** ID 归一化为字符串数组。长整型 id 一律按字符串传递,避免精度丢失。 */
40
+ export function toStringIdList(value, field) {
41
+ if (value === undefined || value === null)
42
+ return undefined;
43
+ const list = Array.isArray(value) ? value : [value];
44
+ if (list.length === 0)
45
+ return undefined;
46
+ return list.map((item, index) => {
47
+ if (item === undefined || item === null || item === '') {
48
+ throw hrmValidationError('id_list_invalid', `${field}[${index}] 不能为空`);
49
+ }
50
+ const text = String(item);
51
+ if (!/^\d+$/.test(text)) {
52
+ throw hrmValidationError('id_list_invalid', `${field}[${index}] 必须是数字 ID`);
53
+ }
54
+ return text;
55
+ });
56
+ }
57
+ export function pickDefined(value, keys) {
58
+ const result = {};
59
+ for (const key of keys) {
60
+ if (value[key] !== undefined)
61
+ result[key] = value[key];
62
+ }
63
+ return result;
64
+ }
65
+ /** 移除值为 undefined 的键,避免把空值写进请求体。 */
66
+ export function compact(body) {
67
+ for (const key of Object.keys(body)) {
68
+ if (body[key] === undefined)
69
+ delete body[key];
70
+ }
71
+ return body;
72
+ }
73
+ /** 校验枚举取值。 */
74
+ export function assertEnum(value, allowed, field) {
75
+ const text = typeof value === 'string' ? value : String(value);
76
+ if (!allowed.includes(text)) {
77
+ throw hrmValidationError('enum_invalid', `${field} 取值必须是 ${allowed.join(' / ')} 之一`);
78
+ }
79
+ return text;
80
+ }
81
+ /** 通用「浏览按钮」请求体固定字段(HRM browser/data 接口录制原样)。 */
82
+ export function browserBaseBody() {
83
+ return {
84
+ browserMultiple: true,
85
+ authWecahtBook: false,
86
+ wxDepNeedConvertCount: 0,
87
+ wxEmpNeedConvertCount: 0,
88
+ wxTotalNeedConvertCount: 0,
89
+ };
90
+ }
91
+ /** 详情页卡片链接(SPA 页面路由,非 API;baseUrl 取自会话,禁止写死域名)。 */
92
+ export function personLink(baseUrl, id) {
93
+ return `${baseUrl}/sp/hrm/profileInfo/${String(id)}`;
94
+ }
95
+ export function orgLink(baseUrl, id) {
96
+ return `${baseUrl}/sp/hrm/orgCard/${String(id)}`;
97
+ }
98
+ export function positionLink(baseUrl, id) {
99
+ return `${baseUrl}/sp/hrm/positionCard/${String(id)}`;
100
+ }
101
+ /**
102
+ * 员工浏览接口字段自动推断(与 hrm-cli.mjs 一致):
103
+ * @ → 邮箱;11 位纯数字 → 手机;纯数字或字母开头含数字 → 工号;其余 → 姓名。
104
+ */
105
+ export function inferEmployeeField(target) {
106
+ if (/@/.test(target))
107
+ return { key: 'email', value: target };
108
+ if (/^\d{11}$/.test(target))
109
+ return { key: 'mobile', value: target };
110
+ if (/^\d+$/.test(target) || /^[A-Za-z][A-Za-z0-9]*\d[A-Za-z0-9]*$/.test(target)) {
111
+ return { key: 'job_num', value: target };
112
+ }
113
+ return { key: 'username', value: target };
114
+ }
115
+ /**
116
+ * 按部门名称精确定位部门节点 id(部门浏览接口 name 条件 eq)。
117
+ * 未找到抛 dept_not_found,重名抛 dept_ambiguous(要求改用 id)。
118
+ */
119
+ export async function resolveDepartmentIdByName(host, name) {
120
+ const resp = await host.request({
121
+ method: 'POST',
122
+ path: '/api/hrm/common/browser/data/department',
123
+ body: {
124
+ ...browserBaseBody(),
125
+ virtualType: 'ALL',
126
+ cmd: 'list',
127
+ current: 1,
128
+ pageSize: 200,
129
+ formDatas: { name: [{ nameCondition: { id: 'eq', content: '等于', disabled: false }, name }] },
130
+ quickSearchDatas: {},
131
+ type: 'and',
132
+ stopDepartment: false,
133
+ },
134
+ });
135
+ const rows = resp?.data?.data ?? [];
136
+ if (rows.length === 0) {
137
+ throw hrmValidationError('dept_not_found', `未找到部门:${name}(请确认部门名称)`);
138
+ }
139
+ if (rows.length > 1) {
140
+ throw hrmValidationError('dept_ambiguous', `部门重名(${rows.length} 个候选):${rows.map((x) => x.name).join('、')},请改用部门 id`);
141
+ }
142
+ return rows[0];
143
+ }
@@ -0,0 +1,23 @@
1
+ export const READ = 'read';
2
+ export function hrmSuccess(action, data, meta) {
3
+ const payload = { ok: true, action, data };
4
+ if (meta && Object.keys(meta).length > 0)
5
+ payload.meta = meta;
6
+ return payload;
7
+ }
8
+ /** 构造「对象类型 + 严格禁止额外字段」的 JSON Schema。 */
9
+ export function schemaOf(properties, options = {}) {
10
+ return {
11
+ type: 'object',
12
+ additionalProperties: false,
13
+ properties,
14
+ ...(options.required?.length ? { required: options.required } : {}),
15
+ ...(options.description ? { description: options.description } : {}),
16
+ };
17
+ }
18
+ export const SCHEMA_ID = { oneOf: [{ type: 'integer' }, { type: 'string', pattern: '^\\d+$' }] };
19
+ export const SCHEMA_ID_LIST = { type: 'array', items: SCHEMA_ID };
20
+ export const SCHEMA_PAGE = {
21
+ current: SCHEMA_ID,
22
+ pageSize: SCHEMA_ID,
23
+ };
@@ -0,0 +1,19 @@
1
+ import { getHrmOperation } from './operations/registry.js';
2
+ import { assertNoForbiddenKeys, asObject } from './operations/shared.js';
3
+ export async function executeHrmOperation(operation, rawInput, context) {
4
+ const definition = getHrmOperation(operation);
5
+ const input = asObject(rawInput);
6
+ assertNoForbiddenKeys(input);
7
+ const host = {
8
+ request(request) {
9
+ return context.host.request({
10
+ ...request,
11
+ operation: request.operation || operation,
12
+ });
13
+ },
14
+ getSession() {
15
+ return context.host.getSession();
16
+ },
17
+ };
18
+ return definition.handler(input, { ...context, host });
19
+ }
@@ -1,4 +1,24 @@
1
+ import { archiveShortcut } from './archive/index.js';
2
+ import { calendarShortcut } from './calendar/index.js';
3
+ import { ehrShortcut } from './ehr/index.js';
4
+ import { esbShortcut } from './esb/index.js';
5
+ import { fnaShortcut } from './fna/index.js';
6
+ import { hrmShortcut } from './hrm/index.js';
1
7
  import { invoiceShortcut } from './invoice/index.js';
8
+ import { mailShortcut } from './mail/index.js';
9
+ import { planShortcut } from './plan/index.js';
10
+ import { jiuchuanhuiShortcut } from './jiuchuanhui/index.js';
11
+ import { assetShortcut } from './asset/index.js';
2
12
  export const builtinShortcuts = [
3
13
  invoiceShortcut,
14
+ ehrShortcut,
15
+ archiveShortcut,
16
+ calendarShortcut,
17
+ fnaShortcut,
18
+ hrmShortcut,
19
+ mailShortcut,
20
+ planShortcut,
21
+ esbShortcut,
22
+ jiuchuanhuiShortcut,
23
+ assetShortcut,
4
24
  ];