weaver-work-cli 0.1.32 → 0.1.33

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 (185) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/{archive-UMGX72K6.js → archive-FVFY6GZN.js} +2 -2
  3. package/dist/chunks/{archive-oa-N2IYBLF3.js → archive-oa-NW3OD4UV.js} +2 -2
  4. package/dist/chunks/{asset-GLEGKFG5.js → asset-7QJKMIDV.js} +2 -2
  5. package/dist/chunks/{attachment-content-AQNX5N3S.js → attachment-content-OSAVA6K3.js} +3 -2
  6. package/dist/chunks/{blog-E44OTVDA.js → blog-I7SDPNW4.js} +2 -2
  7. package/dist/chunks/{caizhilian-DQUFZXZL.js → caizhilian-O37ZIQNY.js} +2 -2
  8. package/dist/chunks/{calendar-JKPIRKFD.js → calendar-7KXE4ED3.js} +2 -2
  9. package/dist/chunks/{chunk-4YC43QQ4.js → chunk-2FLWXFVS.js} +4 -4
  10. package/dist/chunks/{chunk-QWY6PGL6.js → chunk-2LV74IWP.js} +361 -56
  11. package/dist/chunks/chunk-3SO6QL6U.js +73 -0
  12. package/dist/chunks/{chunk-DW6AUUKS.js → chunk-6ATGWRZM.js} +6 -4
  13. package/dist/chunks/chunk-BYATLLEF.js +68 -0
  14. package/dist/chunks/chunk-BYBSCN4X.js +932 -0
  15. package/dist/chunks/{chunk-2GA5ZIQL.js → chunk-D223PTXU.js} +1 -0
  16. package/dist/chunks/{chunk-H7J4DC5R.js → chunk-EEWPQE3O.js} +2 -2
  17. package/dist/chunks/{chunk-6RKD4DRZ.js → chunk-GFPXQIY2.js} +2 -2
  18. package/dist/chunks/{chunk-C6R3B2ML.js → chunk-HEL5XTYI.js} +12 -6
  19. package/dist/chunks/{chunk-CVZ2JOSW.js → chunk-IHUYP6LO.js} +1 -1
  20. package/dist/chunks/{chunk-YRVDW4WN.js → chunk-ILMBNVSG.js} +2 -2
  21. package/dist/chunks/{chunk-G3QJULO2.js → chunk-KAS45KNR.js} +1 -1
  22. package/dist/chunks/{chunk-H6XSTSLM.js → chunk-MEEFGWTM.js} +54 -196
  23. package/dist/chunks/{chunk-GCG2NMWR.js → chunk-MQ2I5AA3.js} +4 -2
  24. package/dist/chunks/chunk-NHA62QD7.js +774 -0
  25. package/dist/chunks/{chunk-WKI2FBIQ.js → chunk-OCU4RLHC.js} +641 -309
  26. package/dist/chunks/{chunk-WSKBSQ2U.js → chunk-PRHJGPMA.js} +2 -2
  27. package/dist/chunks/{chunk-6EFWDL7Y.js → chunk-Q6LWB5HX.js} +2 -2
  28. package/dist/chunks/{chunk-IURUFGZK.js → chunk-RBGOMK4Y.js} +50 -33
  29. package/dist/chunks/chunk-VBCFFFGT.js +226 -0
  30. package/dist/chunks/{ebuilder-form-V5FG2EHC.js → chunk-WRRJ4GG2.js} +22 -1148
  31. package/dist/chunks/{chunk-E4Z23GHM.js → chunk-WY74UBJ6.js} +264 -750
  32. package/dist/chunks/conflict-SFNEVJY5.js +21 -0
  33. package/dist/chunks/continuation-RN6PZN2M.js +11 -0
  34. package/dist/chunks/cowork-CKWYHXYB.js +2508 -0
  35. package/dist/chunks/ebuilder-form-KOLJRVZD.js +121 -0
  36. package/dist/chunks/{ehr-HMFY6VIL.js → ehr-WFOC3B4D.js} +1174 -20
  37. package/dist/chunks/{esb-ZYSVB7SG.js → esb-LJZTN663.js} +4 -4
  38. package/dist/chunks/{fna-B7RKPAZD.js → fna-F7QRIIZC.js} +2 -2
  39. package/dist/chunks/{host-45WED2KK.js → host-BCGUVEWX.js} +3 -3
  40. package/dist/chunks/host-BQBRHVR3.js +23 -0
  41. package/dist/chunks/{host-I4Z6BFYX.js → host-DGE2TZD4.js} +3 -3
  42. package/dist/chunks/{host-KNZ52LJZ.js → host-KXPTEWFS.js} +3 -3
  43. package/dist/chunks/{host-OCH2BCCV.js → host-VQ6JJXGQ.js} +3 -3
  44. package/dist/chunks/{hrm-2KAZGUHI.js → hrm-NI6XAKW5.js} +3 -3
  45. package/dist/chunks/{im-ACJJWH4U.js → im-7TRTF3KT.js} +88 -12
  46. package/dist/chunks/{invoice-ZK3WCX2U.js → invoice-AOXWJKYT.js} +3 -3
  47. package/dist/chunks/{jiuchuanhui-5PQD3IL2.js → jiuchuanhui-7NQWEZAW.js} +2 -2
  48. package/dist/chunks/{lazy-dispatch-JQXBW3GM.js → lazy-dispatch-RNS4EE4S.js} +4 -4
  49. package/dist/chunks/{mail-S2HDDXO2.js → mail-VDHJAB4O.js} +3 -3
  50. package/dist/chunks/{meeting-QVN3I37L.js → meeting-GA7XCNNP.js} +214 -43
  51. package/dist/chunks/{okr-QNG4VC2Q.js → okr-TQIRERPQ.js} +2 -2
  52. package/dist/chunks/operations-5QL3AECO.js +11 -0
  53. package/dist/chunks/{plan-A25EMW6U.js → plan-4RY4LN2P.js} +2 -2
  54. package/dist/chunks/{project-G6XV66DZ.js → project-D6XT2OC5.js} +2 -2
  55. package/dist/chunks/{registry-DC6KR3NH.js → registry-JHRIDQ3A.js} +4 -4
  56. package/dist/chunks/{registry-2VLUAESA.js → registry-OZSMDVPP.js} +2 -2
  57. package/dist/chunks/{registry-TI3CIUXF.js → registry-QKMI43Q6.js} +8 -6
  58. package/dist/chunks/{registry-7C5UMIPL.js → registry-VOGKFFTR.js} +2 -2
  59. package/dist/chunks/{room-recommend-WRTHO6Y2.js → room-recommend-D4EUOOWY.js} +4 -3
  60. package/dist/chunks/{schedule-KFIITGSK.js → schedule-XPFBHPCV.js} +4 -3
  61. package/dist/chunks/{workflow-DJ7SYWAF.js → workflow-HLBZRWIY.js} +172 -6
  62. package/dist/index.js +30 -25
  63. package/dist/internal/e10/auth-recovery.js +14 -4
  64. package/dist/shortcuts/contract/host.js +34 -59
  65. package/dist/shortcuts/cowork/continuation.js +70 -0
  66. package/dist/shortcuts/cowork/errors.js +59 -0
  67. package/dist/shortcuts/cowork/host.js +172 -0
  68. package/dist/shortcuts/cowork/index.js +166 -0
  69. package/dist/shortcuts/cowork/manifest.js +65 -0
  70. package/dist/shortcuts/cowork/operations/discuss-write.js +277 -0
  71. package/dist/shortcuts/cowork/operations/item-write.js +380 -0
  72. package/dist/shortcuts/cowork/operations/member-write.js +283 -0
  73. package/dist/shortcuts/cowork/operations/permission-write.js +286 -0
  74. package/dist/shortcuts/cowork/operations/read.js +423 -0
  75. package/dist/shortcuts/cowork/operations/registry.js +39 -0
  76. package/dist/shortcuts/cowork/operations/review-write.js +157 -0
  77. package/dist/shortcuts/cowork/operations/shared.js +215 -0
  78. package/dist/shortcuts/cowork/operations/types.js +24 -0
  79. package/dist/shortcuts/cowork/operations.js +19 -0
  80. package/dist/shortcuts/ehr/host.js +4 -1
  81. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +757 -0
  82. package/dist/shortcuts/ehr/operations/recruit-position.js +367 -0
  83. package/dist/shortcuts/ehr/operations/recruit-stats.js +133 -0
  84. package/dist/shortcuts/ehr/operations/recruit-write.js +8 -16
  85. package/dist/shortcuts/ehr/operations/recruit.js +35 -10
  86. package/dist/shortcuts/ehr/operations/registry.js +6 -0
  87. package/dist/shortcuts/im/diagnostics.js +97 -0
  88. package/dist/shortcuts/im/host.js +58 -31
  89. package/dist/shortcuts/im/index.js +7 -2
  90. package/dist/shortcuts/im/operations/at-mention.js +127 -0
  91. package/dist/shortcuts/im/operations/file-user.js +10 -2
  92. package/dist/shortcuts/im/operations/group-read.js +26 -5
  93. package/dist/shortcuts/im/operations/group-write.js +35 -28
  94. package/dist/shortcuts/im/operations/msg-sync.js +7 -2
  95. package/dist/shortcuts/im/operations/msg-write.js +76 -10
  96. package/dist/shortcuts/im/operations/quote-mention.js +119 -0
  97. package/dist/shortcuts/im/operations/session.js +1 -1
  98. package/dist/shortcuts/im/operations/shared.js +10 -0
  99. package/dist/shortcuts/im/operations/types.js +13 -0
  100. package/dist/shortcuts/index.js +5 -0
  101. package/dist/shortcuts/mail/host.js +4 -1
  102. package/dist/shortcuts/meeting/host.js +27 -34
  103. package/dist/shortcuts/meeting/operations/create.js +4 -1
  104. package/dist/shortcuts/meeting/operations/eb/catalog.js +5 -0
  105. package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -7
  106. package/dist/shortcuts/meeting/operations/eb/create-flow.js +168 -26
  107. package/dist/shortcuts/meeting/operations/eb/factory.js +69 -1
  108. package/dist/shortcuts/meeting/operations/eb/index.js +16 -3
  109. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +14 -3
  110. package/dist/shortcuts/meeting/operations/eb-fallback.js +159 -0
  111. package/dist/shortcuts/meeting/operations/env.js +93 -46
  112. package/dist/shortcuts/meeting/operations/form-fields.js +110 -0
  113. package/dist/shortcuts/meeting/operations/registry.js +2 -0
  114. package/dist/shortcuts/meeting/operations/standard-guard.js +71 -0
  115. package/dist/shortcuts/meeting/operations.js +16 -0
  116. package/dist/shortcuts/workflow/index.js +110 -1
  117. package/dist/shortcuts/workflow/operations/form.js +24 -3
  118. package/dist/shortcuts/workflow/operations/read.js +104 -23
  119. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +448 -0
  120. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +106 -0
  121. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +47 -0
  122. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +30 -23
  123. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
  124. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +1 -0
  125. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +2 -1
  126. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +2 -4
  127. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +138 -181
  128. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +12 -7
  129. package/docs/e10-auth.md +1 -1
  130. package/docs/im.md +8 -1
  131. package/docs/todo-smart-convert/README.md +1 -1
  132. package/docs/todo-smart-convert/data-contract.md +2 -2
  133. package/docs/todo-smart-convert/subgroup-rules.md +6 -0
  134. package/package.json +1 -1
  135. package/skill-template/domains/yimiaoban.md +3 -3
  136. package/skill-template/skill-template.md +1 -1
  137. package/skills/weaver-e10-blog/SKILL.md +5 -5
  138. package/skills/weaver-e10-caizhilian/SKILL.md +5 -5
  139. package/skills/weaver-e10-calendar/SKILL.md +5 -5
  140. package/skills/weaver-e10-esb/SKILL.md +5 -5
  141. package/skills/weaver-e10-hrm/SKILL.md +5 -5
  142. package/skills/weaver-e10-jinchengda/SKILL.md +2 -2
  143. package/skills/weaver-e10-jiuchuanhui/SKILL.md +5 -5
  144. package/skills/weaver-e10-jucailin/SKILL.md +18 -12
  145. package/skills/weaver-e10-jucailin/references/recruit-create.md +104 -0
  146. package/skills/weaver-e10-mail/SKILL.md +5 -5
  147. package/skills/weaver-e10-meeting/SKILL.md +171 -25
  148. package/skills/weaver-e10-meeting/references/meeting-eb.md +4 -3
  149. package/skills/weaver-e10-meeting/references/meeting-queries.md +9 -6
  150. package/skills/weaver-e10-meeting/references/meeting-verification.md +8 -6
  151. package/skills/weaver-e10-meeting.zip +0 -0
  152. package/skills/weaver-e10-okr/SKILL.md +5 -5
  153. package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
  154. package/skills/weaver-e10-plan/SKILL.md +5 -5
  155. package/skills/weaver-e10-shared/SKILL.md +12 -12
  156. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -4
  157. package/skills/weaver-e10-wenshuding/SKILL.md +5 -5
  158. package/skills/weaver-e10-workflow/SKILL.md +29 -5
  159. package/skills/weaver-e10-workflow/aigroup/default.json +88 -0
  160. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +66 -14
  161. package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +1 -1
  162. package/skills/weaver-e10-workflow/references/workflow-memory.md +1 -1
  163. package/skills/weaver-e10-workflow/references/workflow-query.md +12 -10
  164. package/skills/weaver-e10-workflow/references/workflow-view.md +2 -2
  165. package/skills/weaver-e10-workflow/tools/todo-serve.cjs +239 -0
  166. package/skills/weaver-e10-workflow/{scripts → tools}/todo-summary.cjs +218 -28
  167. package/skills/weaver-e10-yepiaotong/SKILL.md +10 -8
  168. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
  169. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +10 -10
  170. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +40 -37
  171. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -4
  172. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +27 -38
  173. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +4 -4
  174. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +37 -29
  175. package/skills/weaver-e10-yimiaoban/SKILL.md +156 -33
  176. package/skills/weaver-e10-yimiaoban/references/ding-write.md +1 -1
  177. package/skills/weaver-e10-yimiaoban/references/error-codes.md +5 -1
  178. package/skills/weaver-e10-yimiaoban/references/group-read.md +5 -1
  179. package/skills/weaver-e10-yimiaoban/references/group-write.md +6 -4
  180. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -0
  181. package/skills/weaver-e10-yimiaoban/references/msg-write.md +34 -2
  182. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +5 -2
  183. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +79 -58
  184. package/skills/weaver-e10-yimiaoban/references/user-remind.md +2 -2
  185. package/skills/weaver-e10-ziguanjia/SKILL.md +5 -5
@@ -1,10 +1,15 @@
1
+ import { activeRuleFor } from './aigroupRules.js';
1
2
  import { workflowValidationError } from '../../errors.js';
2
3
  import { asRecord, readBoundedInt } from './todoSmartConvert.core.js';
3
4
  import { orderGroupsByIntent, readGroupOrder } from './todoSmartConvert.group.js';
4
- import { detectBusinessKind, needsRequestSummary, usesTitleSummary } from './businessRules.js';
5
+ import { detectBusinessKind, needsRequestSummary } from './businessRules.js';
5
6
  import { openSummaryCache } from './summaryCache.js';
6
7
  import { loadDetailContextProvider, stampsOfRows } from './todoSmartConvert.detail.js';
7
8
  import { requestItemsOf, rowsOfGroup, runSmartGroup, totalTodoCount, } from './todoSmartConvert.smartGroup.js';
9
+ /** 该组是否需要 AI 生成单条摘要(规则 needSummary 决定,默认需要)。 */
10
+ function needAiSummary(workflowName) {
11
+ return activeRuleFor(workflowName)?.needSummary ?? true;
12
+ }
8
13
  const DEFAULT_MAX_CHARS_PER_BATCH = 24_000;
9
14
  const DEFAULT_MAX_ITEMS_PER_BATCH = 100;
10
15
  const DEFAULT_REQUEST_SUMMARY_MAX = 50;
@@ -101,7 +106,7 @@ export function validateFinalGroups(value) {
101
106
  const count = displayItems.reduce((sum, item) => sum + (item.type === 'group' ? item.requestDatas.length : 1), 0);
102
107
  return topPriority
103
108
  ? { id, topPriority: true, title, count, defaultExpanded: true, displayItems }
104
- : { id, topPriority: false, title, count, defaultExpanded: false, displayItems };
109
+ : { id, topPriority: false, title, count, defaultExpanded: true, displayItems };
105
110
  });
106
111
  }
107
112
  /**
@@ -129,7 +134,7 @@ export function collectSummaryUnits(groups) {
129
134
  const units = [];
130
135
  for (const group of groups) {
131
136
  if (group.topPriority) {
132
- if (!needsRequestSummary(detectBusinessKind(group.title)))
137
+ if (!needAiSummary(group.title))
133
138
  continue;
134
139
  units.push({
135
140
  groupId: group.id,
@@ -185,7 +190,7 @@ export async function runSummaryContext(args, env, prefetched) {
185
190
  const groups = await readFinalGroups(args, env);
186
191
  const units = collectSummaryUnits(groups);
187
192
  const skippedSatisfaction = groups
188
- .filter((group) => usesTitleSummary(detectBusinessKind(group.title)))
193
+ .filter((group) => !needAiSummary(group.title))
189
194
  .reduce((sum, group) => sum + rowsOfGroup(group).length, 0);
190
195
  // 优先组是叠加视图 ⇒ 同一条待办会在两个位置各出现一次,统计口径必须去重。
191
196
  const requestIds = [...new Set(units.flatMap((unit) => unit.rows.map((row) => row.requestId)))].filter(Boolean);
@@ -394,7 +399,7 @@ export async function runSummary(args, env) {
394
399
  // 满意度类不走 AI、也不读缓存:直接用标题当摘要,保证 `summary` 不为空。
395
400
  let titleSummary = 0;
396
401
  for (const group of groups) {
397
- if (usesTitleSummary(detectBusinessKind(group.title))) {
402
+ if (!needAiSummary(group.title)) {
398
403
  for (const row of rowsOfGroup(group)) {
399
404
  if ((row.summary ?? '').trim())
400
405
  continue;
@@ -470,7 +475,7 @@ export async function runSummary(args, env) {
470
475
  }
471
476
  };
472
477
  for (const group of groups) {
473
- if (!needsRequestSummary(detectBusinessKind(group.title)))
478
+ if (!needAiSummary(group.title))
474
479
  continue;
475
480
  if (group.topPriority) {
476
481
  applyAll(rowsOfGroup(group));
@@ -499,7 +504,7 @@ export async function runSummary(args, env) {
499
504
  warnings.push(`有 ${prefilledKept} 条沿用本地摘要缓存(未重新生成)`);
500
505
  }
501
506
  const titleSummaryCount = groups
502
- .filter((group) => usesTitleSummary(detectBusinessKind(group.title)))
507
+ .filter((group) => !needAiSummary(group.title))
503
508
  .reduce((sum, group) => sum + rowsOfGroup(group).length, 0);
504
509
  if (titleSummaryCount > 0) {
505
510
  warnings.push(`有 ${titleSummaryCount} 条满意度类待办不调用 AI,summary 直接使用条目标题(保证非空)`);
package/docs/e10-auth.md CHANGED
@@ -69,7 +69,7 @@ E10 目标地址按“显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置
69
69
 
70
70
  `auth xiaoe` 会先打印不含凭证的 preflight 摘要,给出 `authMode=xiaoe`、`credentialSourceDetected`、`attempted`、各凭据源检测结果和目标 `baseUrl`。进入脚本分支时会打印 `Trying XiaoE token script credential...`;进入内置 Node 会话分支时会打印 `Trying built-in XiaoE client session credential...`。成功结果和后续 `auth status` 会显示 `credentialSourceStep`、`credentialSourceType`、`credentialSourceLabel`。
71
71
 
72
- 业务命令不会在缺少本地会话时主动建立 XiaoE 登录态,首次使用仍需显式执行 `auth xiaoe`。已有会话被 E10 接口明确拒绝为失效时,公共请求运行时会静默换票并重放原请求一次;不会打印中间登录步骤,不会自动打开浏览器,也不会对流式请求、网络错误、`partial` / `write_uncertain` 做重放。桌面客户端需要 XiaoE 专属业务行为时,Agent 必须显式传全局参数,例如 `weaver-work-cli --runtime-agent xiaoe workflow ...`;网页端由原有环境变量规则自动识别,不要求补这个参数。`--runtime-agent` 只控制运行时行为,不携带也不选择凭据。WorkBuddy、Codex 及其他智能体使用 `auth login --base-url <url> --agent_type <agent_type>` 的浏览器 OAuth 流程。
72
+ 业务命令不会在缺少本地会话时主动建立 XiaoE 登录态,首次使用仍需显式执行 `auth xiaoe`。已有 XiaoE 会话被 E10 接口明确拒绝为失效时,公共请求运行时会根据持久化会话的 `agentType` / `loginSource` 静默换票并重放原请求一次;这条路径不依赖 shared Skill、Agent、`XIAOE_*` 或 `--runtime-agent xiaoe`。它不会打印中间登录步骤,不会自动打开浏览器,也不会对流式请求、网络错误、`partial` / `write_uncertain` 做重放。`--runtime-agent xiaoe` 仅用于其他 XiaoE 专属业务行为,不携带也不选择凭据。WorkBuddy、Codex 及其他智能体首次认证使用 `auth login --base-url <url> --agent_type <agent_type>` 的浏览器 OAuth 流程。
73
73
 
74
74
  无法使用浏览器回调时,可以用 `auth set` 直接写入浏览器中复制到的
75
75
  `ETEAMSID`。命令会调用 `teamsCheck` 解析当前用户、租户和组织信息,并写入
package/docs/im.md CHANGED
@@ -26,7 +26,7 @@ weaver-work-cli --json im run <operation> --input-json '{"key":"value"}'
26
26
 
27
27
  ## 认证
28
28
 
29
- 复用 `src/internal/e10` 的 E10 会话(`requireE10Session`),请求自动携带 `Cookie`、`eteamsid` 与 `X-Requested-With: XMLHttpRequest`。IM 接口前缀 `/api/em/msg/executeIm`,必达例外走 `/api/em/msg/createDing`。业务代码不接触认证目录,路径强制以 `/api/` 开头。
29
+ 复用 `src/internal/e10` 的 E10 会话(`requireE10Session`),请求自动携带 `Cookie`、`eteamsid`、`User-Agent: AgentType=<agentType>,IsAgent=true`(由 `request-runtime` 与 `session.uaHeader()` 统一注入,`RESERVED_HEADERS` 禁止业务侧覆盖),IM 另加 `X-Requested-With: XMLHttpRequest`。IM 接口前缀 `/api/em/msg/executeIm`,必达例外走 `/api/em/msg/createDing`。业务代码不接触认证目录,路径强制以 `/api/` 开头。
30
30
 
31
31
  ## 红线(模块内强制)
32
32
 
@@ -39,6 +39,13 @@ weaver-work-cli --json im run <operation> --input-json '{"key":"value"}'
39
39
  - 全空白文本不算内容(拒绝发送空白消息);普通请求 15 秒超时即失败不重试(上传 15/60 秒)。
40
40
  - 媒体只给需登录态的 URL,真要看内容用 `im.file.download` 落地到本地(父目录须存在、拒绝覆盖)。
41
41
  - 消息内容完整透出,不截断;展示规则见 Skill `references/safety-boundaries.md`。
42
+ - **群创建者 ≠ 群主**:`group.info` 的 `creatorUid`/`creatorCid`(服务端 `host_uid`/`host_cid`)只表示建群的人,转让群主后不变;群主只认 `group.users` 的 `role=3`(或 `group.admins`)。
43
+ - **系统成员(`cid=10002`)不是真实员工**:服务端建群时可能自动补 1 个(租户可选能力,群内系统消息载体)。`group.users` 标 `isSystem:true` 并给出排除它的 `personNum`;退群护栏的「最后一个成员」判定与成员统计都必须排除它。
44
+ - **文件上传支持秒传**:`preUploadCheck` 命中同 MD5 已有文件时服务端只返回 `uploadType:"second"` + `fileObj`(没有 `preUploadId`),`host.uploadFile` 直接复用该 `fileObj` 并跳过 `valid/upload`,同一图片/文件可反复发送。
45
+ - **群聊 @ 提及**(`src/shortcuts/im/operations/at-mention.ts`):只能通过 `sendGroupMsg` 的 **`msg` 字段**(完整原生 msg JSON)携带 `txt.aus`(@具体人 `t=1`,@所有人固定 `{cid:'10000',id:'88',nm:'全体成员',t:'2'}`),`txt.v` 中 @ 位置写 `:@<id>;` 占位符。**`txt` 字段传 JSON 字符串是错的**——服务端会原样塞进 `dt[0].txt.v`,客户端直接显示 JSON 原文(实测踩坑)。CLI 入参:`txt` 写 `@<姓名>` + `atUids`/`atAll`;@具体人 prepare 阶段经 `getGroupUsers`(member_mask=6)逐个核实在群,姓名一律走 hrm 解析。
46
+ - **群聊引用/回复**(`src/shortcuts/im/operations/quote-mention.ts`):与 @ 同款承载方式——msg JSON 顶层挂 `ref`(引用)或 `rmsg`(回复,多一个 `oid`):`{id:<被引消息id>, t:<被引type>, f:'0', time:<被引毫秒时间戳>, fname:<被引人>, fuser:{cid,uid}, rcon:<被引内容纯文本>, display:''}`。CLI 入参 `quoteMsgId`/`replyMsgId`(互斥),prepare 阶段用 `syncGroupMsg`(`start=<id+1e9>, end=<id-1e9>`,开边界)单条定位被引消息后自动组装;**单聊仅支持引用**(`im.msg.send.single` 接受 `quoteMsgId`,定位走 `syncSingleMsg`;`replyMsgId` 报 `reply_not_supported`),单聊发送同样把 msg JSON 放 `msg` 字段。发送者信息(suid/sname)服务端自动补全。拉取侧原始 msg JSON 顶层即含 ref/rmsg,CLI 已解析为行内 `quote` 摘要。
47
+ - **失败信封双写**:`ok:false` 的 JSON 同时写 stdout 与 stderr(stdout 为主通道,stderr 兼容历史判断),调用方只读 stdout 也不会丢错误。
48
+ - **请求级追踪**:`im --trace`(或 `WEAVER_WORK_CLI_TRACE=1`)在 stderr 逐请求打 `[trace] METHOD path op=... status=... 耗时`,不含 Cookie/eteamsid,用于排障与接口计数(实现位于 `src/shortcuts/im/diagnostics.ts`,不改公共 runtime)。
42
49
 
43
50
  ## 消息拉取与展示
44
51
 
@@ -116,7 +116,7 @@ collect 输出的 `groupingBrief` 使用组内 1-based `idx`。模型生成 `aiG
116
116
  }
117
117
  ```
118
118
 
119
- `totalCount` = **按 `requestId` 去重后的条数**(= collect 取到的全部条数),**不是** `wfIdGroup[].count` 之和(优先组是叠加视图)。只有优先组 `defaultExpanded=true`;普通组先放汇总项,再放单条。
119
+ `totalCount` = **按 `requestId` 去重后的条数**(= collect 取到的全部条数),**不是** `wfIdGroup[].count` 之和(优先组是叠加视图)。大分组(优先组与普通组)`defaultExpanded=true`,只有汇总项(`type:"group"`)为 `false`;普通组先放汇总项,再放单条。
120
120
 
121
121
  ## 5. 详情、单条摘要和组摘要
122
122
 
@@ -57,7 +57,7 @@ CLI 输出信封 { schemaVersion, ok, operation, data, meta, warnings }
57
57
  | `topPriority` | boolean | 只有「建议优先处理的流程」为 `true` |
58
58
  | `title` | string | 优先组固定文案;普通组 = `workflowName` |
59
59
  | `count` | number | **= 该组 `displayItems` 摊平后的条数**(回灌时会重算,不采信输入里的值) |
60
- | `defaultExpanded` | boolean | 只有优先组 `true`;普通组与汇总项恒 `false` |
60
+ | `defaultExpanded` | boolean | 大分组(优先组与普通组)恒 `true`;只有汇总项(`type:"group"` 的 ai二次分组)是 `false` |
61
61
  | `displayItems` | array | 混合数组:汇总项(`type:"group"`)在前,单条(`type:"request"`)在后 |
62
62
 
63
63
  优先组是**叠加视图**:入选优先组的条目**仍保留在各自工作流组里**(优先组只是置顶入口)。因此 Σ`count` > `totalCount` 是正常现象,差值 = 优先组条数。
@@ -112,7 +112,7 @@ CLI 输出信封 { schemaVersion, ok, operation, data, meta, warnings }
112
112
  | 3 | 每条待办在**一个组内**只出现一次;优先组的条目会同时出现在其工作流组(叠加视图) | `used` 集合 / `selectPriorityRows()` |
113
113
  | 4 | 组内 <3 条一律平铺单条,**不产生任何汇总项**(给了 `aiGroups` 也忽略) | `GROUP_MIN_ITEMS_FOR_SUBGROUP = 3` |
114
114
  | 5 | 汇总项 `id` = `父组id-序号`,序号从 1 起且仅在组内唯一 | `groupItemsOf()` |
115
- | 6 | 只有优先组 `defaultExpanded = true`;汇总项恒 `false` | `runSmartGroup()` 返回处 |
115
+ | 6 | 大分组(优先组 + 普通组)`defaultExpanded = true`;只有汇总项恒 `false` | `runSmartGroup()` / `validateFinalGroups()` |
116
116
  | 7 | 业务对象只有三个键;诊断信息只能在 `meta` | `finish()` + `planTodoOutput()` |
117
117
  | 8 | 所有 ID 一律 string;除计数类(`count`/`totalCount`)与标记类(`isremark`/`requestLevel`)外不得是 number | `readAiGroups()` 等校验 |
118
118
  | 9 | 子组至少 2 条(<2 解散后条目平铺);不存在 `other` 兜底汇总项 | `runSmartGroup()` 子组收口 |
@@ -4,6 +4,12 @@
4
4
  > 源码:`todoSmartConvert.smartGroup.ts`、`businessRules.ts`、`todoSmartConvert.group.ts`
5
5
  > 核对日期:2026-10-27(ai二次分组改造后定稿:删除 `other` 汇总项、<3 条硬门槛不再被计划覆盖、意图表驱动、详情缓存)
6
6
 
7
+ > **⚠️ 2026-10-28 起:分组规则已外置到 JSON,代码不再按业务类型分支。**
8
+ > 唯一真源是 `skills/weaver-e10-workflow/aigroup/default.json`(`{defaults, rules[]}`,随 skill 分发、只读),用户意图另存 **CLI 状态目录**下的 `aigroup/user-intents.json`(`weaver-work-cli aigroup set` 写入,刻意不落 skill 目录,避免被打包带走)。
9
+ > 现行规则要点:①没有 `aiGroup` ⇒ 全平铺;②`focus:true` ⇒ 按 `focusKeyword`(`[指标, 算子, 值]`,十种算子)确定性成一组,`groupTitle` 为组名,`sysArg` 指明指标取自列表属性还是流程详情;③`focus:false` ⇒ `aiContext`(流程标题/流程详情)交 AI 分组,**必须**给 `aiGroups`;④`focus:true` 收到多个计划子组时**只保留条数最多的一个**,其余平铺;⑤`aiGroups.seq` 已删除,只认 `requestIds`;⑥组摘要 `groupSummary.needAI:false` 时由 CLI 按 JSON `template` 渲染,`true` 时交 AI;⑦单条摘要由 `needSummary` 决定(false ⇒ 用标题)。
10
+ > 下面各节是按类型描述的**历史口径**,仅作背景参考;与本节冲突时以本节与 `default.json` 为准。
11
+
12
+
7
13
  ## 0. 一句话
8
14
 
9
15
  大组是否做 ai二次分组、怎么分,由 **「业务类型」+「用户意图是否适用本组」+「有没有给本组计划」+「组内条数门槛」** 四个因素决定;CLI 负责判定与兜底,AI 只提供「子组怎么切、叫什么名」。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weaver-work-cli",
3
- "version": "0.1.32",
3
+ "version": "0.1.33",
4
4
  "description": "面向泛微工作工具链的可扩展 TypeScript CLI 基础框架(E10 业票通等能力)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,11 +1,11 @@
1
1
  本业务域用于泛微 E10 易秒办即时通讯(消息/群组/会话/系统消息),包括读与写;Skill 名是 `weaver-e10-yimiaoban`,CLI 命令后缀是 `im`(`weaver-work-cli im run im.<capability>.<action>`)。
2
2
 
3
- 入口 `SKILL.md` 先路由到 `weaver-e10-shared/SKILL.md`,再给出 Reference 路由表、关键差异(消息行已解析且标注「我」、人名走 hrm、本人 cid/uid 只用于本机组装、uid/cid 字符串化、有界区间自动翻页且边界去重、时间范围转 id 区间并强制收敛 7 天、1303 空页说明、媒体需下载落地、展示完整不截断)与写操作 prepare→apply 协议。具体用法按「一个能力一个文档」拆到 `references/`:
3
+ 入口 `SKILL.md` 先路由到 `weaver-e10-shared/SKILL.md`,再按标准结构给出:路由优先级(高优先级语义 + 判定规则 + 常见误用)、选哪个命令(想做什么 / 命令 / reference 三列)、处理链(拉记录/发消息/必达/建群/免打扰/取附件/查系统消息的常见多步链路)、执行原则(最小必要信息、大结果摘要、已知对象直达、错误语义驱动、附件与文件解析确认)、关键差异(消息行已解析且标注「我」、人名走 hrm、本人 cid/uid 只用于本机组装、uid/cid 字符串化、有界区间自动翻页且边界去重、时间范围转 id 区间并强制收敛 7 天、1303 空页说明、媒体需下载落地、展示完整不截断)、写操作 prepare→apply 决策树、输出与展示规则、失败处理与禁用边界。请求头三件套只做一行指针指向 `weaver-e10-shared` 的「请求头契约」,不复制代码块。具体用法按「一个能力一个文档」拆到 `references/`:
4
4
 
5
5
  - `person.md`:姓名/工号/手机/邮箱解析、uid 批量解析(人名唯一合法来源,走 hrm)。
6
6
  - `field-resolution.md`:名称 → ID 判定、同名消歧、未匹配处理、接口间上下文传递契约。
7
7
  - `msg-read.md`:单聊/群聊消息拉取、群置顶、阅读状态(只读;每页 50、有界区间自动翻页、无界单页续拉、7 天收敛、1303 按空处理)。
8
- - `msg-write.md`:发单聊/群聊(文本/图片/文件)、撤回、群消息置顶的 prepare→apply 写入协议。
8
+ - `msg-write.md`:发单聊/群聊(文本/图片/文件,群聊文本支持 @ 提及:`txt` 写 `@<姓名>` + `atUids`/`atAll`,@具体人 prepare 核实在群;引用/回复:`quoteMsgId`/`replyMsgId` 传被引消息 id,**单聊仅支持引用**)、撤回、群消息置顶的 prepare→apply 写入协议。
9
9
  - `ding-write.md`:普通必达与转必达(createDing)、仅未读/指定接收人的 prepare→apply 写入协议。
10
10
  - `group-read.md`:群搜索/信息/成员/群主管理员/存在性/公告(只读)。
11
11
  - `group-write.md`:建群/邀请/踢/退/解散/申请入群/改群属性/群名/群公告的 prepare→apply 写入协议。
@@ -21,4 +21,4 @@
21
21
  - `weaver-work-cli im schema` 是 operation 合约第一信息源;所有 operation 名与 `inputSchema` 以它为准。
22
22
  - 人名/群成员姓名一律由 CLI 走 hrm 解析;媒体展示用 `[图片]名称`/`[文件]名称`/`[视频]名称`、必达加 `[必达]`,预览/下载 URL 需登录态,真正查看用 `im.file.download` 落地。
23
23
  - 消息正文完整展示不截断、最新在前;`|` 转义、换行保留提示;禁止把长文缩成摘要后再展示。
24
- - 写操作只接受 CLI 签发的 continuation;`apply` 不确定结果时先只读回查,不自动重试。
24
+ - 写操作只接受 CLI 签发的 continuation;`apply` 返回 `ok:true` 即成功并直接汇报,**不做二次校验**(不拉群成员/群消息/群信息/会话列表去证明);仅在结果未知时说明情况,是否回查由用户决定,不自动重试。
@@ -15,7 +15,7 @@ cliHelp: "weaver-work-cli {{command}} --help"
15
15
 
16
16
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若共享规则不存在、CLI 未安装或读取失败,说明本技能的必需依赖缺失,必须调用宿主提供的提问/确认弹框,向用户说明必须补齐 `weaver-work-cli` 与共享 skill `weaver-e10-shared`(不补齐本技能无法执行)及补齐计划,并把下面两条待执行命令原样完整展示在确认信息中;Agent 不能在未确认时自行安装。用户明确确认后,Agent 必须直接代为按顺序执行且每条仅执行一次,不得要求或引导用户手动执行:① 缺 CLI 时执行 `npm install -g weaver-work-cli`;② 再执行 `weaver-work-cli skills install shared --target-dir <SKILLS_ROOT>` 装回共享 skill,`<SKILLS_ROOT>` 取本 SKILL.md 所在目录的上一级绝对目录(即与本技能同级的 skills 根目录),不要省略 `--target-dir`——省略会装进默认目录,导致本技能依然读不到共享规则。安装或读取失败时必须停止执行;命令均成功后重新读取共享规则,仍读不到就停止并把结果报告用户,不得凭猜测继续。**
17
17
  认证和登录态只能按共享规则通过 `weaver-work-cli auth ...` 命令判断;禁止直接读取、列出、打印或解析用户主目录下的旧 `.e10-cli`、auth、config 或 Keychain 数据。
18
- 业务命令返回 `authentication` / `session_expired` 时必须停止并读取共享认证规则:Agent 复用任务开始时的宿主判定且禁止调用任何其他登录 Skill;明确为 XiaoE 时只执行 `weaver-work-cli auth xiaoe`,返回 `xiaoe_credential_unavailable` 时停止且不自动改用浏览器登录;非 XiaoE 时取得用户确认的真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。登录恢复后读操作可重放,写操作必须重新 prepare 和确认,`partial` / `write_uncertain` 必须先只读回查。
18
+ 业务命令返回 `session_expired` 且已有会话来自 XiaoE 时,CLI 已在底层自动换票并重放一次;Agent 不得再执行登录命令、调用其他登录 Skill 或重复业务命令,只反馈最终结构化错误。仅首次无会话或明确的 `auth not found` 才读取共享认证规则:明确为 XiaoE 时执行一次 `weaver-work-cli auth xiaoe`,若返回 `xiaoe_credential_unavailable` 则停止;非 XiaoE 时取得用户确认的真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。显式登录后写操作必须重新 prepare 和确认,`partial` / `write_uncertain` 必须先只读回查。
19
19
  所有命令通过 `weaver-work-cli --json {{command}} run <operation>` 执行:简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli {{command}} schema` 是 operation、字段和风险等级的合约来源。
20
20
  若 `schema` 或 reference 提供 `inputExamples`,优先复用其中和当前意图最接近的样例并只替换用户明确给出的值;标记为 `synthetic` 的样例需要业务复核,不能当作源资料事实。若 operation 标记了 `missingExamples` 或参数覆盖矩阵中的 `needs-confirmation` 字段,先向用户说明缺少哪些入参事实并索取补充,不要通过反复尝试不同 JSON 格式来猜。
21
21
  生成或改写的 docs、reference、提示词和命令示例必须同时兼容 Windows 和 macOS/Linux。凡涉及 JSON 输入、用户目录、路径分隔符、Python 启动器、文件删除、目录查看或文件比对,必须同时给出 Windows PowerShell 与 macOS/Linux(bash/zsh)两套示例;Agent 先根据当前系统和 shell 选择对应示例,不确定时用 `node -p "process.platform"` 判断。Windows/PowerShell 示例不要使用 `printf`、`$HOME/...`、`~/...`、bash 反斜杠续行、`rm/ls/diff/python3` 等 Unix-only 写法。
@@ -102,11 +102,11 @@ weaver-work-cli --json blog run blog.query --input-json '{"user_type":"myFollow"
102
102
  2. `target_changed` / `publish_already_exists` → 重新 prepare,再向用户确认。
103
103
  3. `partial/write_uncertain` → 停止,不做任何写重试;用 `blog.query_user` 只读回查后向用户报告。
104
104
  4. `authentication/session_expired` → 立即停止当前操作并读取 shared 认证规则。
105
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
106
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
107
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
108
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
109
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
105
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
106
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
107
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
108
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
109
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
110
110
 
111
111
  ## 不在范围
112
112
 
@@ -141,11 +141,11 @@ Windows/PowerShell 下不要使用 `printf`、`$HOME/...`、`~/...`、bash 反
141
141
  - **除非错误明确提示可恢复或需要补充参数,否则不要重复刷同一个 operation。**
142
142
  - 写请求已经发出后遇到结果不确定必须停止;不要把 `.apply` 当成可重试的读操作。
143
143
  - **错误为 `authentication` 或 `session_expired` 时:立即停止当前操作,不要用示例占位域名或自行猜域名登录,也不要盲目重试。** 先读取同级 `weaver-e10-shared` 的认证规则。
144
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
145
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
146
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
147
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
148
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
144
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
145
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
146
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
147
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
148
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
149
149
  - 共享规则不可用时停止并告知用户,不在业务 Skill 中猜测登录方式。
150
150
  - `continuation_*` / `plan_changed` / `file_changed` 一律重新 prepare,不要试图修改票据或只改 apply 入参。
151
151
  - **明确的业务错误直接转达,不要深挖**:服务端返回的业务提示(如「该附件不支持转为 PDF」「无该文档的共享权限」)是权威结论,直接转述给用户并给出应对建议;不要翻查源码、写调试脚本或追查原始响应找「为什么」。只有错误提示本身含糊(空 message、`INTERNAL_ERROR`)时才进一步诊断。
@@ -80,11 +80,11 @@ weaver-work-cli --json calendar run <operation> --input-json '{"key":"value"}'
80
80
 
81
81
  - 遇到 `partial`、`write_uncertain`、登录失效、回查失败或网络中断,立即停止当前写流程,不自动重试写入。
82
82
  - 认证类错误(`authentication`/`session_expired`):停止当前操作并读取 `weaver-e10-shared` 的认证规则。
83
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
84
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
85
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
86
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
87
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
83
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
84
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
85
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
86
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
87
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
88
88
  - 接口返回 404 或提示「找不到动作流」:日程应用可能未安装,先运行 `calendar.app.check` 检测,再决定是否停止。
89
89
  - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`。
90
90
 
@@ -73,11 +73,11 @@ weaver-work-cli --json esb run <operation> --input-json '<json>'
73
73
 
74
74
  认证类错误(`authentication` / `session_expired`)必须立即停止当前操作并读取 `weaver-e10-shared` 的认证规则:
75
75
 
76
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
77
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
78
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
79
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
80
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
76
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
77
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
78
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
79
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
80
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
81
81
 
82
82
  ## 安全边界
83
83
 
@@ -159,11 +159,11 @@ weaver-work-cli --json hrm run hrm.org.resolve --input-json '{"virtual":"1号维
159
159
  ## 失败处理
160
160
 
161
161
  - `code=302` 或认证类错误:停止当前操作并读取 `weaver-e10-shared` 的认证规则。
162
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
163
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
164
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
165
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
166
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
162
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
163
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
164
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
165
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
166
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
167
167
  - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。
168
168
  - 常见业务错误:`empty_condition`(空条件拉取被拦截)、`full_pull_blocked`(岗位全量需 `all=true`)、`dept_not_found`/`dept_ambiguous`(组织未找到或重名,改用 id)、`enum_invalid`(枚举取值非法)、`permission_denied`(接口开关未开启)、`virtual_required`/`name_required`(`hrm.org.resolve` 缺多维或多维名称参数)。
169
169
  - `hrm.org.resolve` 的「没找到 / 命中多个」**不是错误**:命令仍退出 0、`ok: true`,判定以 `data.status` 为准,不要把 `not_found` 当异常重试。
@@ -17,7 +17,7 @@ cliHelp: "weaver-work-cli contract --help"
17
17
 
18
18
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若共享规则不存在、CLI 未安装或读取失败,说明本技能的必需依赖缺失,必须调用宿主提供的提问/确认弹框,向用户说明必须补齐 `weaver-work-cli` 与共享 skill `weaver-e10-shared`(不补齐本技能无法执行)及补齐计划,并把下面两条待执行命令原样完整展示在确认信息中;Agent 不能在未确认时自行安装。用户明确确认后,Agent 必须直接代为按顺序执行且每条仅执行一次,不得要求或引导用户手动执行:① 缺 CLI 时执行 `npm install -g weaver-work-cli`;② 再执行 `weaver-work-cli skills install shared --target-dir <SKILLS_ROOT>` 装回共享 skill,`<SKILLS_ROOT>` 取本 SKILL.md 所在目录的上一级绝对目录(即与本技能同级的 skills 根目录),不要省略 `--target-dir`——省略会装进默认目录,导致本技能依然读不到共享规则。命令均成功后重新读取共享规则;仍读不到就停止并把结果报告用户,不得凭猜测继续。**
19
19
  认证和登录态只能按共享规则通过 `weaver-work-cli auth ...` 命令判断;禁止直接读取、列出、打印或解析用户主目录下的旧 `.e10-cli`、auth、config 或 Keychain 数据。
20
- 业务命令返回 `authentication` / `session_expired` 时必须停止并读取共享认证规则:Agent 复用任务开始时的宿主判定且禁止调用任何其他登录 Skill;明确为 XiaoE 时只执行 `weaver-work-cli auth xiaoe`,返回 `xiaoe_credential_unavailable` 时停止且不自动改用浏览器登录;非 XiaoE 时取得用户确认的真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。登录恢复后读操作可重放,写操作不得复用旧 continuation,必须重新 prepare 和确认,`partial` / `write_uncertain` 必须先只读回查。
20
+ 已有 XiaoE 会话返回 `session_expired` 时,CLI 已在底层自动换票并重放一次;Agent 不得再执行登录命令、调用其他登录 Skill 或重复业务命令,只反馈最终错误。仅首次无会话或明确的 `auth not found` 才读取共享认证规则:XiaoE 执行一次 `weaver-work-cli auth xiaoe`,若返回 `xiaoe_credential_unavailable` 则停止;非 XiaoE 在取得真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。显式登录后写操作不得复用旧 continuation,必须重新 prepare 和确认。
21
21
  所有命令通过 `weaver-work-cli --json contract run <operation>` 执行:简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli contract schema` 是 operation、字段和风险等级的合约来源。
22
22
  命令示例、提示词和临时说明必须同时兼容 Windows 和 macOS/Linux;涉及 JSON 输入、用户目录、路径分隔符、Python 启动器、文件删除、目录查看或文件比对时,同时给 Windows PowerShell 与 macOS/Linux(bash/zsh)两套示例。Agent 先根据当前系统和 shell 选择对应示例,不确定时用 `node -p "process.platform"` 判断。Windows/PowerShell 下不要使用 `printf`、`$HOME/...`、`~/...`、bash 反斜杠续行、`rm/ls/diff/python3` 等 Unix-only 写法。
23
23
  涉及合同正文、附件、图片、本地文件或远程 URL 文件的操作,执行前必须提醒用户:文件内容可能被上传到 E10 今承达,并可能进入当前大模型上下文用于理解和处理;必须等待用户明确确认后才继续。
@@ -183,7 +183,7 @@ cliHelp: "weaver-work-cli contract --help"
183
183
  - 写请求超时或断线时不得盲目重试,先用查询接口确认是否已生效
184
184
  - `submitRequest` 返回 `1200301`(当前 userid 为空):停止并诊断会话状态,不自动切换接口
185
185
  - `submitRequest` 返回 `1200306`(服务端必填校验):解析缺失字段列表,逐字段补全后重试(最多 3 轮),不切换接口
186
- - 错误为 `authentication` 或 `session_expired` 时立即停止,先读取共享规则 `../weaver-e10-shared/references/e10-auth-and-session.md` 让用户完成登录
186
+ - 错误为 `session_expired` 时立即停止;XiaoE 的底层自动恢复已执行,Agent 不再登录或重试。首次认证缺失才读取共享规则 `../weaver-e10-shared/references/e10-auth-and-session.md`
187
187
 
188
188
  ### 8) 智能助手的三个高频误伤
189
189
 
@@ -134,11 +134,11 @@ cliHelp: "weaver-work-cli jiuchuanhui --help"
134
134
  - **除非错误明确提示可恢复或需要补充参数,否则不要重复刷同一个 operation**
135
135
  - 写请求已经发出后,遇到结果不确定必须停止;不要把 `.apply` 当成可重试读操作
136
136
  - **错误为 `authentication`(未登录,如 `E10 auth not found`)或 `session_expired`(登录态失效)时:立即停止当前操作,不要用示例占位域名或自行猜域名登录,也不要盲目重试**。先读取共享规则 `../weaver-e10-shared/references/e10-auth-and-session.md`。
137
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
138
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
139
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
140
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
141
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
137
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
138
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
139
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
140
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
141
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
142
142
 
143
143
  ### 4) 文件处理确认
144
144
 
@@ -1,13 +1,18 @@
1
1
  ---
2
2
  name: weaver-e10-jucailin
3
- display_name: 泛微聚才林人事云
4
- display_name_en: Weaver Jucailin HR Cloud
5
- description: 泛微聚才林(人事档案、出勤管理、薪酬管理)的 E10 查询与出勤写操作能力,通过 weaver-work-cli ehr 命令执行。
6
- description_zh: 泛微聚才林(人事档案、出勤管理、薪酬管理)的 E10 查询与出勤写操作能力,通过 weaver-work-cli ehr 命令执行。
7
- description_en: Weaver Jucailin HR capabilities for E10, covering HR profile, attendance and salary queries plus attendance write operations, delivered through the weaver-work-cli ehr command.
8
- version: 1.0.0
9
- author: 泛微网络科技股份有限公司
10
3
  agent_created: true
4
+ display_name: 泛微E10聚才林人事管理
5
+ display_name_en: Weaver E10 Jucailin HR Management Skill
6
+ description: 泛微E10聚才林人事管理,帮您处理人事日常事宜:[出勤]-查考勤数据做报表统计、考勤打卡(PC端签到签退)、发考勤流程处理考勤异常;[薪酬]-查工资、社保公积金、调薪记录;[招聘]-帮您找人才、管招聘需求、生成职位JD、导入简历建人才、查应聘者台账、安排面试、发Offer、办入职、看招聘统计;[人事基础]-查员工信息、组织编制及从不同维度汇总人事报表。
7
+ description_zh: 泛微E10聚才林人事管理,帮您处理人事日常事宜:[出勤]-查考勤数据做报表统计、考勤打卡(PC端签到签退)、发考勤流程处理考勤异常;[薪酬]-查工资、社保公积金、调薪记录;[招聘]-帮您找人才、管招聘需求、生成职位JD、导入简历建人才、查应聘者台账、安排面试、发Offer、办入职、看招聘统计;[人事基础]-查员工信息、组织编制及从不同维度汇总人事报表。
8
+ description_en: "Weaver E10 Jucailin HR Management: your assistant for daily HR tasks. [Attendance] Check attendance data, generate reports & statistics, clock in/out on PC, and start attendance workflows to handle attendance exceptions. [Payroll] View pay slips, social security & housing fund, and salary adjustment records. [Recruitment] Find candidates, manage recruitment requisitions, generate job descriptions (JD), import resumes to build candidate profiles, view candidate pipeline records, arrange interviews, send offers, handle onboarding, and view recruitment statistics. [HR Basics] Look up employee information, organizational headcount, and compile HR reports from various dimensions."
9
+ category: business
10
+ version: 1.0.27
11
+ author: 泛微网络科技股份有限公司
12
+ permissions: [network]
13
+ execution:
14
+ entry_mode: file
15
+ profile: node-readonly
11
16
  requires:
12
17
  bins: ["weaver-work-cli"]
13
18
  cliHelp: "weaver-work-cli ehr --help"
@@ -48,6 +53,7 @@ weaver-work-cli --json ehr run <operation> --input -
48
53
  | 部门/岗位/职务/职类人数、流失离职、占编人员、人员流动明细、属性合计 | [`references/hr-report.md`](references/hr-report.md) |
49
54
  | 人才库搜索、招聘需求/职位/入职/录用列表、人才详情卡片 | [`references/recruit-read.md`](references/recruit-read.md) |
50
55
  | 新建人才、安排面试、发送 Offer、办理入职、面试反馈编辑/催评(写,prepare→apply) | [`references/recruit-write.md`](references/recruit-write.md) |
56
+ | 生成职位 JD 并建职位、简历导入建人才(含附件与标签)、招聘统计 | [`references/recruit-create.md`](references/recruit-create.md) |
51
57
  | 招聘撤销类写操作、移动端打卡、能力边界与禁止项 | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
52
58
 
53
59
  ## 跨子系统差异(必须先知道)
@@ -81,11 +87,11 @@ weaver-work-cli --json ehr run <operation> --input -
81
87
 
82
88
  - 遇到 `partial`、`write_uncertain`、登录失效、回查失败或网络中断,立即停止当前写流程,不自动重试写入,先做一次只读回查再决定。
83
89
  - `code=302` 或认证类错误:停止当前操作并读取 `weaver-e10-shared` 的认证规则。
84
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
85
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
86
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
87
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
88
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
90
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
91
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
92
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
93
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
94
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
89
95
  - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。
90
96
 
91
97
  ## 平台兼容
@@ -0,0 +1,104 @@
1
+ # 招聘创建类能力:职位 JD 建职位 / 简历导入建人才 / 招聘统计
2
+
3
+ > 三个能力都基于已注册的 CLI operation,命令统一为 `weaver-work-cli ehr run <operation>`。
4
+ > 认证与请求头由 `weaver-e10-shared` 托管,本文件不涉及凭证。
5
+
6
+ ## 何时使用
7
+
8
+ | 用户说 | 用哪个 |
9
+ |---|---|
10
+ | 「帮我写个 XX 岗位的 JD 并建到招聘职位列表」「生成职位」 | `ehr.recruit.position.create.prepare` → `apply` |
11
+ | 「把这份简历录入人才库」「导入简历建人才」「建档并打标签」 | `ehr.recruit.candidate.import.prepare` → `apply` |
12
+ | 「招聘现在有多少人才/需求/职位/入职/Offer」「招聘统计」 | `ehr.recruit.stats`(只读) |
13
+
14
+ ---
15
+
16
+ ## 1. 职位 JD 建职位
17
+
18
+ 两步,与页面「保存」等价:① `saveFormData`(职位管理表单)→ ② `addPosition` 生成职位。
19
+
20
+ ```powershell
21
+ # Windows PowerShell
22
+ weaver-work-cli ehr run ehr.recruit.position.create.prepare --input-json '{"positionName":"Java开发工程师","duty":"负责后端服务设计与开发","requirement":"3年以上Java经验,熟悉Spring Cloud"}'
23
+ ```
24
+ ```bash
25
+ # macOS/Linux
26
+ weaver-work-cli ehr run ehr.recruit.position.create.prepare --input-json '{"positionName":"Java开发工程师","duty":"负责后端服务设计与开发","requirement":"3年以上Java经验,熟悉Spring Cloud"}'
27
+ ```
28
+
29
+ prepare 返回 `preview`(字段填充情况、沿用的在册职位默认值、显式覆盖被跳过的项)与 `continuation`。
30
+ 把 preview 摘给用户确认后:
31
+
32
+ ```bash
33
+ weaver-work-cli ehr run ehr.recruit.position.create.apply --input-json '{"positionName":"Java开发工程师","confirm":true,"continuation":"<prepare 返回的 continuation>"}'
34
+ ```
35
+
36
+ **要点**
37
+
38
+ - JD 正文由你(大模型)写:`duty` 写岗位职责、`requirement` 写任职要求,各写入对应的多行文本字段。
39
+ - 可选覆盖:`education` / `workYears` / `jobCategory` / `positionNature`(按**数据字典名称**)、`salaryType` / `recruitType`(按枚举名称)、`recruitCount` / `salaryMin` / `salaryMax` / `numberOfPayMonths`(数字)、`recruitPrincipal` / `employManager` / `interviewer` / `recruitHelper`(按**姓名**)。
40
+ - 字典同名多项或找不到 → 该字段**跳过**并在 `preview.explicitSkipped` 列明,不会写脏值;不要为了"凑齐"而换别的名称重试。
41
+ - 未指定的关联型字段(职位属性/序列/学历/工作年限/工作地点/薪酬上下限/招聘流程)沿用**环境内在册职位的现值**,保证引用有效;`preview.noReferenceValue` 列出没取到值的字段。
42
+ - apply 成功返回 `formDataId`、`positionPostId`、`cardUrl`(职位单页)、`listLocateUrl`(职位列表定位)。`rpaChecked=false` 时把 `rpaValidMsg` 如实转告。
43
+
44
+ ---
45
+
46
+ ## 2. 简历导入建人才
47
+
48
+ **解析是你的责任,落库是 CLI 的责任**:不要指望 CLI 调 OCR。
49
+
50
+ ```
51
+ ① 你读懂简历(对话里已解析的内容 / 原件文本)→ 按下面 schema 整理成 JSON
52
+ ② prepare:手机号查重 + 主表映射 + 6 张明细行数 + 标签核验(不写入)
53
+ ③ 摘给用户确认
54
+ ④ apply:主表+明细一次写入 → 人才批次 → 智能标签 → 平台标签 → 双链接
55
+ ```
56
+
57
+ ```bash
58
+ weaver-work-cli ehr run ehr.recruit.candidate.import.prepare --input-json '{"candidateName":"张三","telephone":"13800000000","email":"zhangsan@example.test","genderName":"男","highestDegreeName":"本科","college":"天津科技大学","academicInformations":[{"school":"天津科技大学","edu_major":"软件工程","edu_education":"本科","start_date":"2022.09","end_date":"2026.06"}],"tags":["本科","Java"]}'
59
+ ```
60
+
61
+ ```bash
62
+ weaver-work-cli ehr run ehr.recruit.candidate.import.apply --input-json '{"candidateName":"张三","telephone":"13800000000","confirm":true,"continuation":"<continuation>"}'
63
+ ```
64
+
65
+ **入参要点**
66
+
67
+ | 类别 | 字段 |
68
+ |---|---|
69
+ | 主表必填 | `candidateName`、`telephone` |
70
+ | 主表可选 | `email`、`genderName`、`birthday`、`age`、`highestDegreeName`、`college`、`graduateDate`、`joinworkdate`、`intendPosition`、`intendedWorkplace`、`selfDesc`(长文本)、`workAbility`(长文本)、`channel`(来源渠道名称) |
71
+ | 明细 6 表 | `academicInformations`(教育)、`jobInformations`(工作)、`internshipExperiences`(实习)、`projectExperiences`(项目)、`awardExperiences`(获奖)、`languageAbilities`(语言) |
72
+ | 附件 | `resumeFile`:简历原件**本地绝对路径**,提供则上传到「原始简历」附件字段 |
73
+ | 标签 | `tags`:平台标签**名称**数组,须为本环境已有标签(同名优先公共),不自动创建 |
74
+
75
+ **明细行日期**:教育/工作/项目用 `start_date` + `end_date`(如 `2022.09` / `2026.06`),CLI 会按布局拆成开始/结束两个物理列;只给一半会跳过该行区间。
76
+
77
+ **字典类值**(`edu_education`、`degree`、`work_type`、`sx_work_type`、`mastery`、`ls_ability`、`literacy`、性别、最高学历、渠道)一律传**名称**,CLI 按本环境数据字典唯一命中反查;歧义或不存在则跳过并写进 `preview.warnings`。不要传序号或猜测的 id。
78
+
79
+ **以下不会发生**(看到这些现象不是 bug):
80
+ - 手机号已存在 → apply 直接阻断,`preview.duplicate` 会带出已存在的人才 id;**不要重复建档**,改为告知用户走更新或在人才卡片补充。
81
+ - 明细表在 `getTableMapping` 中无对应节点 → 该表整表跳过(主表照常建档),`preview.warnings` 会写明。
82
+ - 批次初始化失败 → 人才仍已建档,`batch.note` 说明原因,不要重试建档。
83
+ - 平台标签不在本环境清单 → `tagsSkipped` 列出,**不要自动新建标签**。
84
+ - apply 返回 `partial/write_uncertain` → 先用人才库按手机号核对是否已建档,**禁止直接重试**。
85
+
86
+ **产物**:`talentCardUrl`(人才卡片单页)+ `talentListLocateUrl`(人才库列表并滑出该人才)。两个都以 Markdown 链接放回答正文;自用系统会自动追加 `recruitType=useSelf`,不要手拼。
87
+
88
+ ---
89
+
90
+ ## 3. 招聘统计(只读)
91
+
92
+ ```bash
93
+ weaver-work-cli ehr run ehr.recruit.stats --input-json '{"modules":["talent","demand","position","entry","offer"]}'
94
+ ```
95
+
96
+ - 默认统计 5 个模块;可加 `interview`(面试安排,页面可能只显示近期记录,仅供量级参考)。
97
+ - `pageSize`(默认 100)、`maxPages`(默认 5)控制「计数接口不可用时的分页实探」深度。
98
+ - **三态计数,绝不输出假值**:
99
+ - `total` 为数字且 `totalExact=true` → 精确;
100
+ - `total=null` → 总数不可知(`note` 说明原因),**不要把它当 0 或估算值转述**;
101
+ - `available=false` → 该模块在本环境未启用。
102
+ - `summary.knownTotal` 只累加精确值;`unknownModules` / `unavailableModules` 要如实说明。
103
+
104
+ **边界**:这是「各模块各有多少条」;用户要「各阶段通过率/漏斗图」时,本命令不提供(需看板配置),如实说明不要编造。
@@ -105,11 +105,11 @@ cliHelp: "weaver-work-cli mail --help"
105
105
  - **除非错误明确提示可恢复或需要补充参数,否则不要重复刷同一个 operation**
106
106
  - 写请求已经发出后,遇到结果不确定必须停止;不要把 `.apply` 当成可重试读操作
107
107
  - **错误为 `authentication`(未登录,如 `E10 auth not found`)或 `session_expired`(登录态失效)时:立即停止当前操作,不要用示例占位域名或自行猜域名登录,也不要盲目重试**。先读取共享规则 `../weaver-e10-shared/references/e10-auth-and-session.md`。
108
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
109
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
110
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
111
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
112
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
108
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
109
+ - 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
110
+ - 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
111
+ - 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
112
+ - 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
113
113
 
114
114
  ### 4) 附件、图片和文件解析确认
115
115