weaver-work-cli 0.1.39 → 0.1.42

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 (197) hide show
  1. package/README.md +4 -2
  2. package/dist/chunks/{archive-ENZYBBME.js → archive-J4I6MCKF.js} +2 -2
  3. package/dist/chunks/{archive-oa-YWLEC5V4.js → archive-oa-BRZKKTO4.js} +2 -2
  4. package/dist/chunks/{asset-OOV6DWPA.js → asset-L7D4FAOZ.js} +2 -2
  5. package/dist/chunks/{asset-idle-RE632MY5.js → asset-idle-DADLLV75.js} +2 -2
  6. package/dist/chunks/{attachment-content-RWN2FCLL.js → attachment-content-K4C7VLWQ.js} +3 -3
  7. package/dist/chunks/{blog-PEPOJAL7.js → blog-BVGQ7NZL.js} +2 -2
  8. package/dist/chunks/{caizhilian-WYIQDVPJ.js → caizhilian-SAADNFD6.js} +2 -2
  9. package/dist/chunks/{calendar-CIARBAOX.js → calendar-Q7NQY5Z2.js} +61 -23
  10. package/dist/chunks/{chunk-F2EQXUEE.js → chunk-3KTFS4IA.js} +397 -159
  11. package/dist/chunks/{chunk-G2JSIUWF.js → chunk-4PD5NWAX.js} +89 -0
  12. package/dist/chunks/{chunk-HJYVHXUQ.js → chunk-4RAE6JXP.js} +1 -1
  13. package/dist/chunks/{chunk-CQHGNCK2.js → chunk-72CKAUAG.js} +41 -8
  14. package/dist/chunks/{chunk-K3RUEEOL.js → chunk-APVFJUQH.js} +2 -2
  15. package/dist/chunks/{chunk-BJGXMFGD.js → chunk-BBKDXQEC.js} +2 -2
  16. package/dist/chunks/chunk-BIPYLLVS.js +501 -0
  17. package/dist/chunks/{chunk-GVPJZXJ2.js → chunk-EKWAQSLU.js} +92 -50
  18. package/dist/chunks/{chunk-XXJOSZTQ.js → chunk-FOAA27U5.js} +381 -57
  19. package/dist/chunks/{chunk-I2HB737U.js → chunk-G4UR6NXN.js} +2 -2
  20. package/dist/chunks/{chunk-YS5DPN4T.js → chunk-GEWYMQME.js} +1 -1
  21. package/dist/chunks/{chunk-P2DAISYW.js → chunk-GHXCDPTM.js} +1 -1
  22. package/dist/chunks/{chunk-L4N7B7ZD.js → chunk-IZ7S7QUS.js} +4 -4
  23. package/dist/chunks/{chunk-NLK2RZKG.js → chunk-JPRO6ER2.js} +122 -2214
  24. package/dist/chunks/{chunk-36DIFZAH.js → chunk-LADPYOWC.js} +2 -2
  25. package/dist/chunks/chunk-LDZQPUIA.js +1238 -0
  26. package/dist/chunks/chunk-NKZRQXST.js +2546 -0
  27. package/dist/chunks/{chunk-EINRJHQ3.js → chunk-QKNKR4RH.js} +3 -3
  28. package/dist/chunks/{chunk-T7JDJJ7H.js → chunk-R4CHUSKC.js} +126 -19
  29. package/dist/chunks/{chunk-EZGFHJFW.js → chunk-SA6VBIHY.js} +88 -15
  30. package/dist/chunks/{chunk-ZXRNHZTE.js → chunk-TTPJJJC4.js} +2 -2
  31. package/dist/chunks/{chunk-KTCB5R5H.js → chunk-W7BEHOSR.js} +2 -2
  32. package/dist/chunks/{chunk-MUQUHKPG.js → chunk-YRSZQUD2.js} +2 -2
  33. package/dist/chunks/{conflict-DRMDOL56.js → conflict-F2OMZRTO.js} +2 -2
  34. package/dist/chunks/{contract-73MERZWN.js → contract-5BETHRSG.js} +2 -2
  35. package/dist/chunks/{cowork-HNGBPD7A.js → cowork-3MN6EQQO.js} +27 -10
  36. package/dist/chunks/create-flow-5FQNNMVO.js +55 -0
  37. package/dist/chunks/{ebuilder-form-OY6DVNRK.js → ebuilder-form-SBHOYBUD.js} +3 -3
  38. package/dist/chunks/{ehr-RAQNEQO7.js → ehr-KMOJULKG.js} +432 -1234
  39. package/dist/chunks/env-LB7NBL2O.js +19 -0
  40. package/dist/chunks/{esb-6XV7C7YV.js → esb-W2PJCFCX.js} +4 -4
  41. package/dist/chunks/factory-6ZFQXQ46.js +30 -0
  42. package/dist/chunks/{fna-XTSRB7G7.js → fna-ZQPCUV4R.js} +2 -2
  43. package/dist/chunks/group-chat-2HHAJN46.js +20 -0
  44. package/dist/chunks/{host-YMBXWFWX.js → host-4CBHGOHT.js} +3 -3
  45. package/dist/chunks/{host-A7J6GDUP.js → host-ATKVNZAT.js} +3 -3
  46. package/dist/chunks/{host-3F5UM5GN.js → host-BQH22NTQ.js} +3 -3
  47. package/dist/chunks/{host-YAQAPYNP.js → host-X2CSLFM6.js} +3 -3
  48. package/dist/chunks/{host-VGPVP7YF.js → host-YTODKMSL.js} +3 -3
  49. package/dist/chunks/{hrm-TLHKC545.js → hrm-FFM4UJFS.js} +4 -4
  50. package/dist/chunks/{im-YOUCFMUK.js → im-VEHKDQPB.js} +8 -8
  51. package/dist/chunks/{invoice-WNBS2B4C.js → invoice-LVIKSIIF.js} +3 -3
  52. package/dist/chunks/{jiuchuanhui-XABWS5RN.js → jiuchuanhui-X6DINO5P.js} +2 -2
  53. package/dist/chunks/{lazy-dispatch-NLZ5UQQI.js → lazy-dispatch-KSWTN5L6.js} +4 -4
  54. package/dist/chunks/{mail-LRYMBFNL.js → mail-VDKRGUD3.js} +9 -4
  55. package/dist/chunks/{meeting-ESXL6MFI.js → meeting-CLC6HP3Z.js} +12 -10
  56. package/dist/chunks/{okr-EOV65SSF.js → okr-CHG4OO3U.js} +2 -2
  57. package/dist/chunks/{plan-YFPVKW6Y.js → plan-XWR75667.js} +2 -2
  58. package/dist/chunks/{project-MDVZUYQW.js → project-5BXOOKMG.js} +40 -23
  59. package/dist/chunks/recruit-stage-DGMFNNDE.js +4507 -0
  60. package/dist/chunks/{registry-VT5Y2HLA.js → registry-7FFOXIAW.js} +4 -4
  61. package/dist/chunks/{registry-QCLZEDAP.js → registry-BKBZPBAJ.js} +10 -8
  62. package/dist/chunks/{registry-YX4CSEMD.js → registry-RHMW6ANW.js} +2 -2
  63. package/dist/chunks/{registry-NYPYMZXG.js → registry-Z43434VG.js} +1 -1
  64. package/dist/chunks/{room-recommend-L3MWH4JW.js → room-recommend-62H7ZQQ6.js} +4 -4
  65. package/dist/chunks/{schedule-UASAVDVD.js → schedule-FNXKH3DQ.js} +4 -4
  66. package/dist/chunks/{workflow-KDGIUCNW.js → workflow-ADHKCAJK.js} +4 -4
  67. package/dist/index.js +33 -28
  68. package/dist/internal/e10/auth/commands.js +110 -56
  69. package/dist/internal/e10/auth/messages.js +6 -0
  70. package/dist/internal/e10/auth/session.js +28 -1
  71. package/dist/internal/e10/auth/xiaoe.js +315 -48
  72. package/dist/internal/e10/auth-recovery.js +36 -5
  73. package/dist/internal/e10/client.js +13 -0
  74. package/dist/internal/e10/context.js +61 -9
  75. package/dist/internal/e10/index.js +1 -1
  76. package/dist/internal/e10/network-error.js +93 -0
  77. package/dist/internal/e10/request-runtime.js +15 -0
  78. package/dist/shortcuts/calendar/operations/read.js +31 -22
  79. package/dist/shortcuts/calendar/operations/write.js +45 -1
  80. package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
  81. package/dist/shortcuts/cowork/operations/item-write.js +5 -3
  82. package/dist/shortcuts/cowork/operations/member-write.js +3 -1
  83. package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
  84. package/dist/shortcuts/cowork/operations/shared.js +7 -0
  85. package/dist/shortcuts/ehr/operations/attend-write.js +43 -1
  86. package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
  87. package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
  88. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +134 -59
  89. package/dist/shortcuts/ehr/operations/recruit-write.js +262 -17
  90. package/dist/shortcuts/ehr/operations/recruit.js +10 -4
  91. package/dist/shortcuts/ehr/operations/shared.js +47 -0
  92. package/dist/shortcuts/hrm/operations/org.js +118 -0
  93. package/dist/shortcuts/index.js +5 -0
  94. package/dist/shortcuts/mail/operations/mail-send.js +8 -2
  95. package/dist/shortcuts/meeting/operations/eb/catalog.js +9 -2
  96. package/dist/shortcuts/meeting/operations/eb/create-flow.js +461 -127
  97. package/dist/shortcuts/meeting/operations/eb/crm-search.js +87 -5
  98. package/dist/shortcuts/meeting/operations/eb/factory.js +33 -0
  99. package/dist/shortcuts/meeting/operations/eb/flow-memory.js +49 -0
  100. package/dist/shortcuts/meeting/operations/eb/group-chat.js +605 -0
  101. package/dist/shortcuts/meeting/operations/eb/index.js +2 -0
  102. package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
  103. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +44 -6
  104. package/dist/shortcuts/meeting/operations/eb/room-summary.js +2 -0
  105. package/dist/shortcuts/meeting/operations/eb/usage-cache.js +99 -0
  106. package/dist/shortcuts/meeting/operations/from-group-chat.js +35 -12
  107. package/dist/shortcuts/project/operations/read.js +6 -25
  108. package/dist/shortcuts/project/operations/shared.js +22 -0
  109. package/dist/shortcuts/project/operations/write.js +28 -2
  110. package/dist/shortcuts/recruit-stage/context.js +119 -0
  111. package/dist/shortcuts/recruit-stage/continuation.js +73 -0
  112. package/dist/shortcuts/recruit-stage/errors.js +65 -0
  113. package/dist/shortcuts/recruit-stage/host.js +109 -0
  114. package/dist/shortcuts/recruit-stage/index.js +115 -0
  115. package/dist/shortcuts/recruit-stage/manifest.js +29 -0
  116. package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
  117. package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
  118. package/dist/shortcuts/recruit-stage/operations/jd-create.js +630 -0
  119. package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
  120. package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
  121. package/dist/shortcuts/recruit-stage/operations/resume-import.js +1198 -0
  122. package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
  123. package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
  124. package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
  125. package/dist/shortcuts/recruit-stage/shared.js +608 -0
  126. package/dist/shortcuts/workflow/operations/form.js +21 -2
  127. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +52 -1
  128. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
  129. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +19 -11
  130. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
  131. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
  132. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +78 -10
  133. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +3 -1
  134. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
  135. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +16 -40
  136. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
  137. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +52 -15
  138. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
  139. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
  140. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
  141. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +53 -16
  142. package/docs/e10-auth.md +22 -1
  143. package/docs/operation-manual.md +8 -0
  144. package/package.json +1 -1
  145. package/scripts/install-skill-to-xiaoe.mjs +105 -0
  146. package/scripts/mcp-meeting.mjs +234 -0
  147. package/scripts/package-skill.mjs +4 -2
  148. package/skill-template/business-info.json +24 -0
  149. package/skill-template/domains/recruit-stage.md +29 -0
  150. package/skills/weaver-e10-calendar/SKILL.md +2 -1
  151. package/skills/weaver-e10-calendar/references/calendar-write.md +54 -0
  152. package/skills/weaver-e10-cowork/SKILL.md +1 -1
  153. package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
  154. package/skills/weaver-e10-jucailin/SKILL.md +1 -1
  155. package/skills/weaver-e10-jucailin/references/attend-write.md +8 -0
  156. package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
  157. package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
  158. package/skills/weaver-e10-jucailin/references/recruit-create.md +2 -2
  159. package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
  160. package/skills/weaver-e10-jucailin/references/recruit-write.md +4 -3
  161. package/skills/weaver-e10-mail/SKILL.md +1 -1
  162. package/skills/weaver-e10-mail/references/mail-send.md +2 -0
  163. package/skills/weaver-e10-meeting/SKILL.md +119 -26
  164. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +25 -11
  165. package/skills/weaver-e10-meeting.zip +0 -0
  166. package/skills/weaver-e10-recruit-stage/SKILL.md +226 -0
  167. package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
  168. package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
  169. package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
  170. package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
  171. package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
  172. package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
  173. package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
  174. package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +73 -0
  175. package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
  176. package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
  177. package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
  178. package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
  179. package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
  180. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
  181. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
  182. package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +438 -0
  183. package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
  184. package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
  185. package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
  186. package/skills/weaver-e10-shared/SKILL.md +2 -2
  187. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -2
  188. package/skills/weaver-e10-shijingran/SKILL.md +3 -2
  189. package/skills/weaver-e10-shijingran/references/operations.md +3 -1
  190. package/skills/weaver-e10-shijingran/references/source-manifest.json +41 -40
  191. package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
  192. package/skills/weaver-e10-workflow/SKILL.md +7 -1
  193. package/skills/weaver-e10-workflow/aigroup/default.json +23 -9
  194. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +37 -21
  195. package/skills/weaver-e10-workflow/tools/todo-summary.cjs +135 -43
  196. package/skills/weaver-e10-yepiaotong/SKILL.md +9 -10
  197. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: recruit-search-candidate
3
+ description: 按手机号/姓名/邮箱/创建人/创建时间等条件搜索人才库,返回带 talentId 的候选人列表
4
+ ---
5
+
6
+ # 搜索人才(人才库列表)
7
+ > 本文档中的 `${...}` 形参(表单 objId / 列表 listId / EB 页面 viewId·pageId / 应用 appId / 动作流 id / 菜单 id cusMenuId)为**租户相关值**:表单 objId 经 `recruit-resolve-metadata.md` 的 tag 链运行时解析;列表/页面/菜单 id 由部署参数提供(**可经 `allMenus` 菜单树自动发现**,见 `recruit-resolve-metadata.md` §3.1);**字段 id(`field_<id>`)经 `ds/fields` 运行时解析,不写死**(见 `recruit-resolve-metadata.md` §5)。
8
+
9
+ ## 1. 基础信息
10
+ - 接口名称:搜索人才(列表查询)
11
+ - 请求方式:`POST`
12
+ - 去域名路径:`/api/ebuilder/form/list/getListDatas`
13
+ - 所属模块:招聘管理(recruit)
14
+ - 所属分组:人才库 / 查询
15
+
16
+ > 计数接口 `POST /api/ebuilder/form/list/getListDataCount` 复用相同请求体(去掉 `pageSize`),返回 `data.total`,用于"先查数量"。
17
+
18
+ ## 2. 业务用途
19
+ 用户说"找手机号 138xxxx 的应聘者""搜 7 月创建的简历""查招聘专员创建的候选人"时调用。返回精简列表,每条带定位 id(`form_data_id` == `talentId`),供后续查看详情使用。手机号是系统唯一区分应聘者的主键。
20
+
21
+ ## 3. 前置条件
22
+ - 需要 EB 列表的 `listId`(视图 id),部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1);无 tag 反查接口,按租户写死(已知缺口)。
23
+ - 创建人条件需先经"创建人名称→ID"解析为用户 ID(见 recruit-resolve-creator.md)。
24
+ - 渠道值返回裸 ID,经静态字典映射为中文(见 data-dictionary.md)。
25
+
26
+ ## 4. 请求参数
27
+
28
+ ### 4.1 Query 参数
29
+ | 字段 | 位置 | 类型 | 必填 | 约束 | 业务说明 |
30
+ |---|---|---|---|---|---|
31
+ | `passid` | query | string | 是 | EB pass id | 部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) |
32
+ | `cid` | query | string | 是 | EB app id | 部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) |
33
+
34
+ ### 4.2 Header 参数
35
+ | 字段 | 位置 | 类型 | 必填 | 约束 | 业务说明 |
36
+ |---|---|---|---|---|---|
37
+ | `ebBusinessId` | header | string | 是 | EB 业务 id | 列表接口必需,部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) |
38
+
39
+ ### 4.3 Body 参数(key fields)
40
+ | 字段 | 位置 | 类型 | 必填 | 约束 | 业务说明 |
41
+ |---|---|---|---|---|---|
42
+ | `current` | body | int | 是 | 页码,1 基 | 当前页 |
43
+ | `pageSize` | body | int | 是 | 默认 10 | 每页条数 |
44
+ | `tableuid` | body | string | 是 | **每请求随机生成 32 位 hex** | EB 列表缓存键;写死会导致过滤失效 |
45
+ | `listId` | body | string | 是 | 视图 id | 部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) |
46
+ | `searchParamData` | body | object | 是 | 见 4.4(须含 `searchType:"3"`) | 搜索条件 |
47
+ | `searchType` | body | string | 是 | 固定 `"3"` | 列表查询类型,缺失/错值返回 total=0 假空 |
48
+ | `terminal` | body | string | 是 | `PC` | 终端 |
49
+ | `browser` | body | string | 是 | `Chrome` | 浏览器 |
50
+ | `requiredMatch` | body | int | 是 | `1` | 固定,缺失返回假空 |
51
+ | `mapResult` | body | int | 是 | `1` | 固定,缺失返回假空 |
52
+ | `recheckQuery` | body | int | 是 | `1` | 固定,缺失返回假空 |
53
+ | `isFollow` | body | int | 是 | `0` | 固定 |
54
+ | `isShareToMe` | body | int | 是 | `0` | 固定 |
55
+ | `filterCondition` | body | object | 是 | `{}` | 固定 |
56
+ | `selectedId` | body | string | 否 | 部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) `${TALENT_SELECTED_ID}` | 选中上下文 id;**可省略(新环境实测不带也返回数据)** |
57
+ | `cusMenuId` | body | string | 是 | 部署参数(可经 `allMenus` 自动发现,见 resolve-metadata §3.1) `${TALENT_MENU_ID}` | 菜单上下文 |
58
+ | `urlPageTitle` / `menuName` | body | string | 是 | EB 页面标题(如 `人才库`) | 菜单上下文 |
59
+
60
+ ### 4.4 searchParamData 条件(commonSearchFields)
61
+ 每个条件形态:`{ "field_<fieldId>": [ { "field_<fieldId>": <value>, "field_<fieldId>_condition_type": <cond> } ] }`
62
+
63
+ | 业务字段 | EB fieldId(运行时解析) | 默认 cond | 说明 |
64
+ |---|---|---|---|
65
+ | 姓名 `name` | `field_{<按 dataKey=name 解析的字段id>}` | `like` | 模糊;精确用 `eq` |
66
+ | 手机号 `telephone` | `field_{<按 dataKey=telephone 解析的字段id>}` | `like` | 系统唯一主键 |
67
+ | 邮箱 `email` | `field_{<按 dataKey=email 解析的字段id>}` | `like` | |
68
+ | 招聘状态 `recruit_status` | `field_{<按 dataKey=recruit_status 解析的字段id>}` | `like` | 传状态值/id |
69
+ | 简历来源 `channel` | `field_{<按 dataKey=channel 解析的字段id>}` | `like` | |
70
+ | 部门 `department` | `field_{<按 dataKey=department 解析的字段id>}` | `like`/`eq` | 若人才表单含部门字段,可据此按部门筛选;字段 id 经 `ds/fields` 解析,不写死 |
71
+ | 创建人 `creator` | `field_{<按 dataKey=creator 解析的字段id>}`(member 字段,值 `[{id,name,...}]`) | — | 先解析为 ID |
72
+ | 创建时间 `create_time` | `field_{<按 dataKey=create_time 解析的字段id>}` | `between` | 值 `[from, to]`,`YYYY-MM-DD[ HH:mm:ss]` |
73
+
74
+ > 字段 id 不写死:调用前经 `recruit-resolve-metadata.md` §5 的 `ds/fields` 按 `dataKey` 解析出 `fieldId`,再拼 `field_{fieldId}` 作为过滤键。
75
+
76
+ - 多条件组合:`searchParamData.type` = `and` | `or`。
77
+ - 分页:`current` / `pageSize`。
78
+
79
+ ### 4.5 字段级过滤(groupFields,实测,任意表单字段均可过滤)
80
+ 除 `commonSearchFields` 外,EB 列表还接受 `searchParamData.groupFields` 做字段级过滤,形态更简单,实测(需求/职位列表的筛选项即用此机制):
81
+ `"groupFields": { "field_<fieldId>": [<value>] }`
82
+ - `<value>` 形态:下拉/选项类字段传**选项 ID**(如 `840774534427852804`,从 `data-dictionary.md` 或 `ds/fields` 的选项反查);文本类传文本值;日期类传 `[from, to]`。
83
+ - 可过滤字段不限于上面 7 个:人才表单任何字段(含 招聘状态 `recruit_status`、简历来源 `channel`、姓名 `name`、手机号 `telephone`、邮箱 `email`、创建人 `creator`、创建时间 `create_time`)都能作为 `groupFields` 键;字段 id 同样经 `ds/fields` 解析,不写死。
84
+ - 组合:`commonSearchFields` 与 `groupFields` 可并存,最终按 `searchParamData.type`(and/or)合并。
85
+ - 用法示例:"渠道=内推的候选人" → `groupFields: { "field_<简历来源字段id>": ["<内推选项id>"] }`;"招聘状态=候选中的" → `groupFields: { "field_<招聘状态字段id>": ["<候选中选项id>"] }`。选项 ID 不确定时先查 `data-dictionary.md` 或向用户澄清选项。
86
+
87
+ ## 5. 响应数据结构
88
+ | 字段 | 类型 | 说明 |
89
+ |---|---|---|
90
+ | `data.data` | array | 记录数组;每条含 `form_data_id`(== `id` == `rowKey` == `ebrecord_rowkey`)= 该人才的 `talentId` |
91
+ | `data.total` | int | 总数(部分部署返回 0 时,以 `len(data.data)` 兜底) |
92
+ | `data.columns` | array | 列定义 |
93
+
94
+ ## 6. 请求示例
95
+ ```json
96
+ {
97
+ "current": 1,
98
+ "pageSize": 10,
99
+ "tableuid": "<每请求随机生成 32 位 hex>",
100
+ "listId": "${TALENT_LIST_ID}",
101
+ "searchParamData": {
102
+ "searchType": "3",
103
+ "commonSearchFields": {
104
+ "field_<手机号字段id>": [
105
+ { "field_<手机号字段id>": "13800000000", "field_<手机号字段id>_condition_type": "like" }
106
+ ]
107
+ },
108
+ "type": "and"
109
+ },
110
+ "terminal": "PC", "browser": "Chrome",
111
+ "requiredMatch": 1, "mapResult": 1, "recheckQuery": 1,
112
+ "isFollow": 0, "isShareToMe": 0, "filterCondition": {},
113
+ "selectedId": "${TALENT_SELECTED_ID}", "cusMenuId": "${TALENT_MENU_ID}",
114
+ "urlPageTitle": "人才库", "menuName": "人才库"
115
+ }
116
+ ```
117
+
118
+ ## 7. 响应示例
119
+ ```json
120
+ {
121
+ "code": 200, "status": true,
122
+ "data": {
123
+ "total": 1,
124
+ "data": [ { "form_data_id": "1276382457065553922", "talent": "张三", "telephone": "13800000000" } ],
125
+ "columns": [ { "field": "talent", "title": "姓名" } ]
126
+ }
127
+ }
128
+ ```
129
+
130
+ ## 8. 错误码
131
+ | 错误码 | 含义 | AI 处理建议 |
132
+ |---|---|---|
133
+ | 来源文档未提供接口特有错误码 | — | 非 200 / `code!=200` / 重定向 → 提示 认证可能过期(`weaver-work-cli auth status`),引导走 `weaver-work-cli auth login` |
134
+
135
+ ## 9. 调用参考
136
+ - 用户场景:直接表达"搜/找/查 某条件候选人"。
137
+ - 创建人名称需先经 recruit-resolve-creator.md 解析为 ID,再作为 `field_{<创建人字段id>}` 条件(创建人字段 id 经 `ds/fields` 解析,见 `recruit-resolve-metadata.md` §5)。
138
+ - 命中多条时展示列表,每条附 EB 详情链接(拼装规则见 SKILL.md 链接拼装,依赖登录态)。
139
+
140
+ ## 10. 注意事项
141
+ - `tableuid` **必须每请求随机生成**(32 位 hex),不可写死,否则后端返回旧缓存/忽略条件。
142
+ - `total` 可能为 0 但 `data.data` 非空,以记录数兜底。
143
+ - **分页与总量展示**:搜索 pageSize 默认 10。返回行数 <10 → 全部展示;返回行数 =10(可能还有更多)→ 调计数接口 `getListDataCount`(复用相同请求体、去掉 `current`/`pageSize`,返回 `data.total`)取真实总量;`total >10` 时展示前 10 条并在底部提示「共 N 条,已展示前 10 条,还有 N-10 条未展示,可补充手机号/邮箱等条件精确匹配或说"下一页/看更多"继续」。**列表响应的 `data.total` 恒为 0 时不可作为总量依据**(实测),一律以计数接口为准。
144
+ - 列表 `listId`(视图 id)无 tag 反查接口,按租户写死于配置(已知缺口)。
145
+ - 列表查询必带上下文参数(`searchType`/`requiredMatch`/`mapResult`/`recheckQuery`/`isFollow`/`isShareToMe`/`filterCondition`/`selectedId`/`cusMenuId`/`urlPageTitle`/`menuName`)见 `recruit-resolve-metadata.md` §7;缺任一项会返回 `total=0` 假空,**勿据此判「人才库为空」**。
146
+ - 渠道/创建人返回裸 ID,需映射/反查后才可读(见 SKILL.md)。
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: recruit-urge-feedback
3
+ description: 发送消息通知催促面试官填写面试评价(runEsb 动作流)
4
+ ---
5
+
6
+ # 催促面试评价
7
+ > 本文档中的 `${...}` 形参(表单 objId / 列表 listId / EB 页面 viewId·pageId / 应用 appId / 动作流 id)为**租户相关值**:表单 objId 经 `recruit-resolve-metadata.md` 的 tag 链运行时解析;其余由部署参数提供(**可经 `allMenus` 菜单树自动发现**,见 `recruit-resolve-metadata.md` §3.1);字段 ID(field_937…)依当前租户表单而定,详见 `data-dictionary.md`。
8
+
9
+ ## 1. 基础信息
10
+ - 接口名称:催促面试评价(触发动作流 runEsb)
11
+ - 请求方式:`POST`
12
+ - 去域名路径:`/api/ebuilder/form/esb/runEsb`
13
+ - 所属模块:招聘管理(recruit)
14
+ - 所属分组:面试 / 写操作(外部通知)
15
+
16
+ ## 2. 业务用途
17
+ 用户说"催一下面试官填评价""提醒面试官给反馈""催促面试评价"时调用。通过动作流(`runEsb`)向面试官发送系统通知,催促其填写面试反馈。属 **L3 外部通知**,**默认不触发**,需用户明确确认且显式开启(如 `--notify`)后才发送,避免打扰真人。
18
+
19
+ ## 3. 前置条件
20
+ - 已安装招聘服务(第 0 步闸门通过)。
21
+ - **定位前置(必做)**:催评前必须先按手机号(叠加姓名)搜索定位候选人(`recruit-search-candidate`)拿到 `talentId`,再从其人才详情的面试卡片取目标面试记录:命中 0 条→提示未找到、不臆测;命中多条→列出候选清单(姓名/手机/渠道/状态/创建时间/`talentId`)请用户确认,**绝不自动取第一条**(催错人打扰面试官)。消歧规则见 SKILL.md「自然语言 → 参数映射」。
22
+ - 目标面试记录(来自人才详情的面试卡片,取 `interviewFeedBack` 关联的反馈记录 id,作为 `runEsb.dataIds`;动作流 id 见下方 §4 运行时解析,不从卡片取)。
23
+
24
+ ## 4. 请求参数
25
+ | 字段 | 位置 | 类型 | 必填 | 业务说明 |
26
+ |---|---|---|---|---|
27
+ | `objId` | body | string | 是 | 面试反馈列表的 `passid`(=objId,来自 面试列表 allMenus 或列表查询响应);与下方 `getListButtons` 的 `passid` 同值 |
28
+ | `esbActionIds` | body | string | 是 | 催评动作流 id(见 recruit-resolve-metadata.md §4,运行时按钮配置解析,不写死) |
29
+ | `dataIds` | body | string | 是 | 目标面试反馈记录 id(来自人才详情面试卡片 `interviewFeedBack` 关联记录);动作流要通知的具体数据,缺失会 405 / 不触发 |
30
+
31
+ > 注:正式版**不写死** `esbActionIds`;运行时对**面试反馈列表**调 `GET /api/ebuilder/form/list/getListButtons/{listId}?passid={列表passid}`,取 `buttons[].actions[]` 中 `actionType=esb` 且名称含「面试安排催评」(排除「批量催评」)的按钮 `id` 作为 `esbActionIds`(详见 `recruit-resolve-metadata.md` §4),天然跨环境,不依赖部署参数。
32
+
33
+ ## 5. 响应数据结构
34
+ | 字段 | 类型 | 说明 |
35
+ |---|---|---|
36
+ | `code` | int | 200 成功 |
37
+ | `status` | boolean | `true` 正常 |
38
+ | `data` | object | 动作流执行结果 |
39
+
40
+ ## 6. 请求示例
41
+ ```json
42
+ POST /api/ebuilder/form/esb/runEsb
43
+ { "objId": "<面试反馈列表 passid(=objId)>", "dataIds": "<面试反馈记录 id,来自人才详情面试卡片>", "esbActionIds": "<解析:面试反馈列表 getListButtons → 名称含「面试安排催评」的 esb 按钮 id>" }
44
+ ```
45
+
46
+ ## 7. 响应示例
47
+ ```json
48
+ { "code": 200, "status": true, "data": { "success": true } }
49
+ ```
50
+
51
+ ## 8. 错误码
52
+ | 错误码 | 含义 | AI 处理建议 |
53
+ |---|---|---|
54
+ | 非 200 | 认证/动作流错误 | 提示检查认证(`weaver-work-cli auth status`) / `esbActionIds` |
55
+
56
+ ## 9. 调用参考
57
+ - 用户场景:"催一下面试官填评价"。
58
+ - **交互语义(关键)**:用户只说「催评 / 提醒面试官填评价」= 定位候选人 + 展示下方确认摘要并说明「将发送系统通知」,**不实际调用**。必须用户明确说「确认催 / 现在发 / 开启通知」才调用 `runEsb`;用户未明确确认前,回复保持在本摘要,不静默触发,也不提示「已发送」。
59
+ - **确认摘要模板(触发前必展示,必须带出定位键)**:
60
+ > 即将向 **姓名(手机:XXX | `talentId=XXX`)** 的面试官发送「请填写面试评价」系统通知:
61
+ > - 面试主题:XXX | 面试官:XXX
62
+ > 这是外部通知,请确认对象无误——回复「确认催」后我才实际发送。
63
+ - **姓名来源(script 实测防坑)**:确认摘要中「姓名」取人才详情 BaseInfo `talent.hrm.name`(最准),不取面试主题 `subject` 前缀——新建未挂职位的候选人 subject 可能为 `undefined-…`/`null-…`,取前缀会得「undefined」。若 BaseInfo 取不到再回退 subject 前缀并清洗 `^(undefined|null)\s*-`。
64
+
65
+ ## 10. 注意事项
66
+ - **外部通知,默认不触发,且交互上明示**:用户一句话「催评」只到定位+确认摘要;除非用户明确说「确认催/现在发」,否则只说明「可催评」,不实际调用,也不谎报已发。
67
+ - **定位前置**:催评前必须先定位到唯一候选人(见 §3),命中多条先消歧,绝不自动取第一条。
68
+ - 动作流 `esbActionIds` 跨环境会变(迁入/升级后失效),正式版走 §4 按钮配置解析(getListButtons 取 esb 按钮 id),不写死、不依赖部署参数。
69
+ - **L3 不得因超时盲目重试**:若首次 `runEsb` 疑似超时,须先查询该面试评价的反馈状态确认未发送,再决定是否补发;严禁直接重试导致对面试官重复发送通知。
@@ -67,7 +67,7 @@ Token、Cookie、ETEAMSID 和业务凭证**只能由 `weaver-work-cli` 内部读
67
67
 
68
68
  下述 `auth xiaoe` 流程仅适用于上述已确认的 XiaoE 智能体环境;其他智能体不执行宿主脚本检测,直接进入浏览器 OAuth 流程。`auth xiaoe` 命令本身就是认证方式的显式选择;`hasXiaoEEnv` 使用桌面的 `--runtime-agent xiaoe` 或任意 `XIAOE_*` 环境变量识别运行环境。
69
69
 
70
- 首次缺少本地会话时,已识别为 XiaoE 的业务命令会在 CLI 公共会话加载层自动获取登录信息;如需提前登录,只运行 `weaver-work-cli auth xiaoe`。CLI 内部按「平台凭证 Node 换票 → CLI 自带 `xiaoe_env.py` 兼容换票 → 宿主 `tokens.py` → 桌面 XiaoE 客户端会话 → `WEAVER_XIAOE_*` 环境映射」顺序取凭据;其中 `XIAOE_DOMAIN` 是 XiaoE/erpa 换票服务地址,不是 E10 地址。`xiaoe_env.py` 属于 CLI npm 包,不放入 shared Skill,且只能由 CLI 内部执行和解析。已有 XiaoE 会话被接口明确拒绝为失效时,CLI 根据会话元数据在公共请求层静默恢复并重放一次;这个流程绕开 shared Skill,Agent 不参与,也不得再补跑登录或原业务命令。失败时 CLI 返回最终结构化错误。
70
+ 首次缺少本地会话时,已识别为 XiaoE 的业务命令会在 CLI 公共会话加载层自动获取登录信息;如需提前登录,只运行 `weaver-work-cli auth xiaoe`。CLI 内部按「平台凭证 Node 换票 → CLI 自带 `xiaoe_env.py` 兼容换票 → 宿主 `tokens.py` → 桌面 XiaoE 客户端会话 → `WEAVER_XIAOE_*` 环境映射」顺序取凭据;其中 `XIAOE_DOMAIN` 是 XiaoE/erpa 换票服务地址,不是 E10 地址。`xiaoe_env.py` 属于 CLI npm 包,不放入 shared Skill,且只能由 CLI 内部执行和解析。已有 XiaoE 会话达到换票结果的 `expiryTimes` 时,CLI 会在业务请求发出前静默换票;已有 XiaoE 会话被接口明确拒绝为失效时,CLI 根据会话元数据在公共请求层静默恢复并重放一次。这个流程绕开 shared Skill,Agent 不参与,也不得再补跑登录或原业务命令。失败时 CLI 返回最终结构化错误。
71
71
 
72
72
  1. 首次无本地登录态、需要在业务命令之前显式建立 E10 会话时,可运行:
73
73
  ```text
@@ -76,7 +76,7 @@ Token、Cookie、ETEAMSID 和业务凭证**只能由 `weaver-work-cli` 内部读
76
76
  2. 不得因为本地存在旧 profile、`auth profile current` 指向旧环境,或 `auth profile list` 里只有旧环境,就跳过 XiaoE 统一登录;也不得先要求用户选择旧 profile 或输入域名。
77
77
  3. XiaoE 统一登录由 CLI 按序取凭证:① 平台注入的 `XIAOE_USER_TOKEN` + `XIAOE_DOMAIN`,先走 Node 换票,再由 CLI npm 包自带的标准库 `xiaoe_env.py` 作兼容回退;② 宿主 `xiaoeUserData/tokens.py`(仅桌面宿主,CLI 在 macOS/Windows 都会先自动发现 XiaoE 客户端内置 Python,再回退到系统 Python);③ 内置原生实现读取桌面 XiaoE 客户端会话换取 `eteamId`,依次查找 `XIAOE_USER_SETTINGS_PATH`、`XIAOE_ROBOT_DATA_ROOT` / `XIAOE_ROBOT_ROOT` 和默认 `XiaoE/Robots/<id>/user_settings.json`,因此会话有效时不要求存在 `tokens.py`;④ `WEAVER_XIAOE_*` 环境映射。宿主只注入 `XIAOE_DOMAIN`、`XIAOE_USER_TOKEN` 等平台变量,不会注入 ETEAMSID 环境变量,CLI 也不读取 `XIAOE_ETEAMSID`。Agent 不要打印、转述、索取或要求用户手动设置这些凭证,也不要直接执行任一脚本或因为脚本报缺依赖就让用户安装 Python 包——凭据链内部的兼容回退由 CLI 完成。
78
78
  4. `auth xiaoe` 是 XiaoE 认证方式的显式入口:CLI 不再判断当前宿主,只检查并消费可用凭据源。E10 目标地址按「显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置/映射 → 当前 profile → CLI 内置默认值」解析,绝不能把 `XIAOE_DOMAIN` 当作 E10 地址。Token、Cookie、ETEAMSID 仍属于凭证,禁止在回复中展示。
79
- 5. XiaoE 统一登录走不通时,无论 macOS、Windows、Linux 或 Web,CLI 都返回 `authentication/xiaoe_credential_unavailable`,绝不自动打开浏览器或降级到 `auth login`;本任务必须停止,不得另行调用其他登录 Skill 或登录命令。
79
+ 5. XiaoE 统一登录走不通时,无论 macOS、Windows、Linux 或 Web,CLI 都返回 `authentication/xiaoe_credential_unavailable`,绝不自动打开浏览器或降级到 `auth login`;本任务必须停止,不得另行调用其他登录 Skill 或登录命令。网页端若带 `details.reason=host_credential_not_injected`,只反馈「网页技能沙箱未获得宿主登录凭据」,该问题由宿主/沙箱启动层修复,不要让用户重新登录或手动提供凭据。若失败全程都是网络错误(连不上 E10,登录态根本没被验证过),子类型是 `authentication/xiaoe_network_unavailable`、`retryable: true`,文案为「暂时无法连接 E10,请稍后重试」——此时只反馈并建议稍后重试,不要引导用户重新登录。
80
80
  6. `auth status --no-check` 不会触发 XiaoE 统一登录;业务命令加载到 `agentType=XiaoE` 或 `loginSource=xiaoe-unified` 的会话并被 E10 明确拒绝为失效时,即使没有 `XIAOE_*` 或 `--runtime-agent xiaoe`,也会静默触发一次统一登录并重放该请求一次。无可读取的本地会话时,则需要当前 `XIAOE_*` 或 `--runtime-agent xiaoe` 等宿主标记才能自动获取;显式 `--auth` 不触发自动替换。具体读取 [`e10-auth-and-session.md`](references/e10-auth-and-session.md)。
81
81
 
82
82
  ### 认证错误只报告状态,不指定登录命令
@@ -29,7 +29,7 @@ weaver-work-cli auth whoami
29
29
  - 业务命令失败,stderr JSON 中 `error.type === "authentication"`(如 `E10 auth not found`)
30
30
  - 业务命令返回 `error.subtype === "session_expired"`(E10 登录态 401/302 失效)
31
31
 
32
- CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话过期时,公共请求层会根据持久化会话的 `agentType` / `loginSource` 自动恢复,不依赖 `XIAOE_*`、`--runtime-agent xiaoe`、shared Skill 或 Agent。业务命令无可读取的本地会话时,若当前 `XIAOE_*`、`--runtime-agent xiaoe` 等标记已识别为 XiaoE,公共会话加载层也会先静默获取登录信息。失败时返回 `xiaoe_credential_unavailable`,提示已尝试自动获取,Agent 只反馈并停止;不要再次登录或重跑。需要在业务命令之前主动建立会话时,可按下述流程显式登录。
32
+ CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话达到换票结果的 `expiryTimes` 时,CLI 会在业务请求发出前静默换票;被接口判定过期时,公共请求层会根据持久化会话的 `agentType` / `loginSource` 自动恢复,不依赖 `XIAOE_*`、`--runtime-agent xiaoe`、shared Skill 或 Agent。业务命令无可读取的本地会话时,若当前 `XIAOE_*`、`--runtime-agent xiaoe` 等标记已识别为 XiaoE,公共会话加载层也会先静默获取登录信息。失败时返回 `xiaoe_credential_unavailable`,提示已尝试自动获取,Agent 只反馈并停止;不要再次登录或重跑。该错误的 `details` 会带 `attemptedSteps`(按序评估过的凭证通道及结果,如 `platform_token:missing`、`e10_session:failed`)、`lastError`(最后一条真实原因)与 `baseUrl`,另有 `failures` 记录每一次失败的阶段(`platform_token` / `bundled_env_script` / `token_script` / `client_session` / `teams_check` / `e10_session`)、类别(`network` / `http` / `credential`)以及网络错误的 `causeCode`(如 `ECONNREFUSED`、`ETIMEDOUT`)和 HTTP 的 `httpStatus`,原样转述给用户即可说明卡在哪一步;需要过程日志时由用户在业务命令上加 `--verbose`。失败全程都是网络错误时,子类型改为 `xiaoe_network_unavailable`、`retryable: true`,文案为「暂时无法连接 E10,请稍后重试」:这不是凭据问题,只提示稍后重试,不要让用户去重新登录。需要在业务命令之前主动建立会话时,可按下述流程显式登录。
33
33
 
34
34
  此时**禁止**:
35
35
 
@@ -69,7 +69,7 @@ CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话
69
69
 
70
70
  `auth login` 会在本机 `127.0.0.1:19800` 监听浏览器回调,最长等待 5 分钟。Agent 沙箱/托管环境中的外部浏览器无法回调容器内地址。`auth xiaoe` 不会进入这条浏览器流程。执行规则:
71
71
 
72
- 1. 任意系统运行 `auth xiaoe` 时,收到 `xiaoe_credential_unavailable` 即反馈并停止;不要自动改跑 `auth login`。
72
+ 1. 任意系统运行 `auth xiaoe` 时,收到 `xiaoe_credential_unavailable` 即反馈并停止;不要自动改跑 `auth login`。收到 `xiaoe_network_unavailable` 同样是停止,但按「暂时无法连接 E10」反馈并建议稍后重试。
73
73
  2. 仅非 XiaoE 环境在用户确认真实 E10 域名且确认 CLI 与浏览器同机后执行 `auth login`;仍须限时等待,超时未完成即终止并反馈。
74
74
  3. 仅非 XiaoE 环境在用户无法完成浏览器登录、且明确要求并同意人工录入时,才可使用保底方式 `weaver-work-cli auth set --eteamsid "<ETEAMSID>" --base-url "<用户确认的登录域名>"`;它不是业务认证错误的默认恢复路径。ETEAMSID 由用户从已登录浏览器主动提供,Agent 不得索取、展示或转述该值。
75
75
  4. 严禁不加限制地前台运行 `auth xiaoe` / `auth login` 并等待 OAuth 回调。
@@ -139,6 +139,8 @@ weaver-work-cli --profile PROFILE_NAME auth status --no-check
139
139
 
140
140
  宿主不会注入 ETEAMSID 环境变量,CLI 也不读取 `XIAOE_ETEAMSID`;ETEAMSID 一律由登录链路换取。CLI 支持两类宿主格式:平台注入的 `XIAOE_DOMAIN` + `XIAOE_USER_TOKEN`,以及 `WEAVER_XIAOE_*` 域名映射。这些格式属于宿主集成细节,不作为用户操作步骤;Agent 不要打印、转述、要求用户手动填写或将其导出到当前 shell。
141
141
 
142
+ 小 e 网页端若返回 `details.reason=host_credential_not_injected`,表示当前沙箱仅保留了网页端运行时标记,宿主平台凭据未透传给 CLI。Agent 只反馈“网页技能沙箱未获得宿主登录凭据”并停止;不要要求用户手动提供环境变量、Token 或 ETEAMSID,也不要改走浏览器 OAuth。该问题必须由宿主/沙箱启动层保留原有凭据注入来修复;隔离认证目录时只覆盖 `WEAVER_WORK_CLI_AUTH_ROOT`,不得清空整个进程环境。
143
+
142
144
  ## XiaoE 凭据由 CLI 独占处理
143
145
 
144
146
  运行 `auth xiaoe`,或已登录的 XiaoE 业务请求被 E10 明确拒绝为会话失效时,CLI 按以下顺序自行取凭据,Agent **不参与、也不得复现**。后者全程静默、合并同一 profile 的并发恢复,并最多重放原请求 1 次;流式请求、网络错误、`partial` / `write_uncertain` 均不触发重放:
@@ -5,7 +5,7 @@ display_name: 泛微E10事井然项目管理
5
5
  display_name_en: Weaver E10 Shijingran Project Management
6
6
  description_zh: 泛微E10事井然项目管理助手,封装项目和任务的创建、查询、修改、删除操作,并提供项目/任务类型、紧急程度、状态等字典查询能力。适用于在对话中通过 Agent 创建、查询、修改、删除项目或任务等场景。
7
7
  description_en: Weaver E10 Shijingran project management assistant. Covers CRUD operations for projects and tasks, and provides dictionary queries for project/task types, priorities, and statuses. Used when an Agent needs to create, query, modify, or delete projects or tasks in conversation.
8
- version: 1.0.8
8
+ version: 1.0.9
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -79,7 +79,7 @@ Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求
79
79
  1. 判断用户目标对象和最小必要条件,按路由读取最小必要 reference;已知出厂字段直接使用 `operations.md` 的字段 quick reference。
80
80
  2. 名称条件先解析为 ID;0 个匹配要告知,多个匹配必须让用户选择,不得猜。
81
81
  3. 查询默认第 1 页 10 条;返回条数等于 pageSize 时提示可能还有更多,等待用户要求再翻页。
82
- 4. 列表和详情中不要单独输出 `detail_url` 列;将 `task_name` / `proj_name` 渲染为 Markdown 链接(方括号内为记录名称,紧跟的圆括号内为 `detail_url` 的取值)。链接不可用时名称保持纯文本并如实说明,不得编造 URL。
82
+ 4. 列表、详情和新建结果的记录名称都不要单独输出 `detail_url` / `detail_urls` 列;将 `task_name` / `proj_name` 渲染为 Markdown 链接(方括号内为记录名称,圆括号内为链接取值:列表/详情取 `detail_url`,新建取 `detail_urls[i]`)。链接不可用时名称保持纯文本并如实说明,不得编造 URL。
83
83
  5. 写操作先 `prepare`,向用户摘要目标、差异、风险、默认值和不可逆性;用户明确确认后才 `apply`。
84
84
  6. `partial/write_uncertain`、登录失效、回查失败或网络中断时停止写流程,不自动重试。
85
85
 
@@ -88,6 +88,7 @@ Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求
88
88
  - 列表和详情默认只给摘要:记录数 + 下方固定展示列,不粘贴完整 JSON,不罗列全部原始字段;完整响应过长时先落本地 UTF-8 文件再给摘要与路径。
89
89
  - 默认展示列以 [`operations.md`](references/operations.md) 的「输出处理」为准:任务列表 `task_name / task_type / plan_start_time / plan_finish_time / manager / task_status / progress / create_time`;项目列表把 `task_*` 换成 `proj_*`;详情在此基础上补 `project`/`priority` 与描述、创建时间。用户明确指定字段时以用户为准。
90
90
  - 记录名称列(`task_name` / `proj_name`)渲染为 Markdown 链接 `[名称](detail_url)`,**不单独输出 `detail_url` 列**;`detail_url_warning` 时名称保持纯文本并如实说明,不得编造 URL。
91
+ - 新建成功(`project.task.create.apply` / `project.project.create.apply`)的返回默认带 `data.detail_urls`,与 `data.dataIds` 同序;用 `detail_urls[i]` 把第 i 条记录的 `task_name` / `proj_name` 渲染为 `[名称](url)`,不得只回复一串 ID 或一句"创建成功"。
91
92
  - 关联字段(`manager`、`participant(s)`、`task_type`、`proj_status` 等)只展示 `name`,不展示内部 ID;字典 ID、对象 ID、`groupId` 只用于入参。
92
93
  - 未指定状态时先说明默认口径「只查未开始 + 进行中」(默认系统状态口径见 [`operations.md`](references/operations.md));返回条数等于 `pageSize` 时提示可能还有下一页。
93
94
 
@@ -93,7 +93,8 @@ weaver-work-cli --json project run project.task.list --input-json '{"pageNo":1,"
93
93
  - `project.task.list`、`project.project.list`、`project.task.detail`、`project.project.detail` 默认为有记录 ID 的业务数据补充 `detail_url`;传 `fields` 且不包含 `detail_url` 时,CLI 不生成链接,也不调用对象 ID 接口。
94
94
  - 任务列表用 `data.datas[].mainTable[].detail_url` 把 `task_name` 渲染为 `[名称](detail_url)`;项目列表用同一位置渲染 `proj_name`。
95
95
  - 任务详情用 `data.datas[0].mainTable.detail_url` 把 `task_name` 渲染为 `[名称](detail_url)`;项目详情用同一位置渲染 `proj_name`。
96
- - 若返回 `detail_url_warning`,说明主查询已成功但链接暂不可用;如实提示,不重试主查询,不编造 URL。
96
+ - **新建成功后的返回值同样带链接**:`project.task.create.apply` / `project.project.create.apply` 默认在 `data.detail_urls` 返回详情页地址,与 `data.dataIds` **一一对应且同序**。展示新建结果时用 `detail_urls[i]` 把第 i 条记录的 `task_name` / `proj_name` 渲染为 `[名称](url)`,只报 ID 不算完成任务。
97
+ - 若返回 `detail_url_warning`,说明主查询或写入已成功但链接暂不可用;如实提示,不重试主操作,不编造 URL。
97
98
  - 需要最高执行效率时(只做摘要、计数、筛选或名称转 ID),传 `withDetailUrl:false`,或在 `fields` 中不包含 `detail_url`;仅当用户会点开详情或明确要链接时保留默认的详情链接。
98
99
 
99
100
  ## 字典查询
@@ -143,6 +144,7 @@ weaver-work-cli --json project run project.form.fields --input-json '{"table":"t
143
144
  - 任务详情必须且仅默认展示 `task_name`、`task_type`、`project`、`manager`、`task_status`、`progress`、`plan_start_time`、`plan_finish_time`、`task_desc`、`create_time`;`task_name` 渲染为 `[名称](detail_url)`,不单独输出 `detail_url` 列。
144
145
  - 项目列表必须且仅默认展示 `proj_name`、`proj_type`、`plan_start_time`、`plan_finish_time`、`manager`、`proj_status`、`progress`、`create_time`;`proj_name` 渲染为 `[名称](detail_url)`,不单独输出 `detail_url` 列。
145
146
  - 项目详情必须且仅默认展示 `proj_name`、`proj_type`、`priority`、`manager`、`proj_status`、`progress`、`plan_start_time`、`plan_finish_time`、`proj_desc`、`create_time`;`proj_name` 渲染为 `[名称](detail_url)`,不单独输出 `detail_url` 列。
147
+ - 新建成功(`project.task.create.apply` / `project.project.create.apply`)必须给出记录名称并渲染为 `[名称](detail_urls[i])`:第 i 条取 `data.detail_urls[i]`,与 `data.dataIds[i]` 同序对应;不得只回复一串 ID 或一句"创建成功"。
146
148
  - 用户明确指定展示字段时,以用户指定为准,但仍不要罗列全部原始字段。
147
149
  - 关联字段返回 `[{name,id}]` 时展示 `name`,不展示内部 ID。
148
150
  - 明确说明默认状态口径;返回条数等于 `pageSize` 时提示可能有下一页。
@@ -1241,13 +1241,13 @@
1241
1241
  }
1242
1242
  },
1243
1243
  "artifactBaseline": {
1244
- "aggregateSha256": "eb2413bba08ce89d006615d49d08ef5967ba2220d11481e674dafd78680100c8",
1244
+ "aggregateSha256": "9a7a1911d6baf2b992e9ec10b05547d161725f146c3c267b39e9d6bc73d998b3",
1245
1245
  "files": [
1246
1246
  {
1247
1247
  "path": "docs/_catalog.md",
1248
1248
  "role": "generated-doc",
1249
- "size": 5332,
1250
- "sha256": "a81903939aea5bf1196d1e3243709d2facf50d9bdcf74d8a6ca731061310dbbe"
1249
+ "size": 5903,
1250
+ "sha256": "9c1ea787068498c443d3ed758ba02180000a213f8fb2ffcc04a465ab1be93c8f"
1251
1251
  },
1252
1252
  {
1253
1253
  "path": "docs/project.md",
@@ -1258,14 +1258,14 @@
1258
1258
  {
1259
1259
  "path": "skill-template/business-info.json",
1260
1260
  "role": "generated-template",
1261
- "size": 8216,
1262
- "sha256": "370a45e86c6b7e33869c5df1bf08d9f22bd98fa8b157b49716e13bca0e7b63c3"
1261
+ "size": 10132,
1262
+ "sha256": "30b4b6827ad8d4a7b6cd04fc67df396597d6260a02e790b19aa0749c62357dcf"
1263
1263
  },
1264
1264
  {
1265
1265
  "path": "skill-template/domains/shijingran.md",
1266
1266
  "role": "generated-template",
1267
- "size": 531,
1268
- "sha256": "6312bffbae22b9f5b0ed8508db8ac36f1de6a8c706d88df53df18e4e4eec7c53"
1267
+ "size": 534,
1268
+ "sha256": "853f73687d75a82e21f9518aaac057889fa91e8d934be6a989e8cc60a8d90366"
1269
1269
  },
1270
1270
  {
1271
1271
  "path": "skills/weaver-e10-shijingran/references/field-resolution.md",
@@ -1276,98 +1276,98 @@
1276
1276
  {
1277
1277
  "path": "skills/weaver-e10-shijingran/references/operations.md",
1278
1278
  "role": "generated-reference",
1279
- "size": 11290,
1280
- "sha256": "72d106a12c7ed8c1f418112bc032eb2acd72224771101e6877603d4b2b81fc3c"
1279
+ "size": 11933,
1280
+ "sha256": "05cc6fb5059261757d65c47d043f4aee16a4b28e5676f1c13f9e36da4743ed78"
1281
1281
  },
1282
1282
  {
1283
1283
  "path": "skills/weaver-e10-shijingran/references/write-operations.md",
1284
1284
  "role": "generated-reference",
1285
- "size": 3859,
1286
- "sha256": "3d4a6625eea85716b9718cf64df18728aef9463ab0b88f2e57d2b7a897adde5c"
1285
+ "size": 4216,
1286
+ "sha256": "6d9c6dece8de31dcea481bff38b41ddf3bc2b9f80f3511c4db4a6e68917ae066"
1287
1287
  },
1288
1288
  {
1289
1289
  "path": "skills/weaver-e10-shijingran/SKILL.md",
1290
1290
  "role": "generated-skill-entry",
1291
- "size": 14475,
1292
- "sha256": "4d92d0dda6c2f30b7501dcbc2e5d1b9e42b69a22d73b2df8d0c6a61326821154"
1291
+ "size": 14859,
1292
+ "sha256": "544ac1c52f02fae1629864bdbd9e325a71ecd778837582a5c62dcb50225814da"
1293
1293
  },
1294
1294
  {
1295
1295
  "path": "src/shortcuts/index.ts",
1296
1296
  "role": "generated-cli",
1297
- "size": 1420,
1298
- "sha256": "569bef374df2d86b511150a0c609ce1abee63f8317994513bce6241276b5be40"
1297
+ "size": 8160,
1298
+ "sha256": "f9af49e21204417077166eb1510b368b605b8c3ab11a94f72cc99a4dd471d24a"
1299
1299
  },
1300
1300
  {
1301
1301
  "path": "src/shortcuts/project/continuation.ts",
1302
1302
  "role": "generated-cli",
1303
- "size": 3290,
1304
- "sha256": "2cb027c038c2bd9d7ee350df2f1380b28b0e0400bfeb9d5507debf4a08ee4cb1"
1303
+ "size": 3366,
1304
+ "sha256": "6663706182a5bdd5a38774d415f86cb9c9a09e40f0e7d69e65017fc70c2cd2b8"
1305
1305
  },
1306
1306
  {
1307
1307
  "path": "src/shortcuts/project/errors.ts",
1308
1308
  "role": "generated-cli",
1309
- "size": 2199,
1310
- "sha256": "811a9df01daed2aca8b0f1e7f3788c66fa0225666a3711ad166cc925232e2ec9"
1309
+ "size": 2275,
1310
+ "sha256": "60e810cbce79d1eddaf0a2d71a2b396dcb59b3c9c8111ae972cbfb8e46e0acc8"
1311
1311
  },
1312
1312
  {
1313
1313
  "path": "src/shortcuts/project/host.ts",
1314
1314
  "role": "generated-cli",
1315
- "size": 7147,
1316
- "sha256": "7f01ff757dcb05b0ea4a7346810a8ab6f203fcde45f3ba5362f3ffbfb4df2c95"
1315
+ "size": 7481,
1316
+ "sha256": "8004f455e679a9b26ac8d717bd0712dbd5d4c1715c69eb03b5b1212811014473"
1317
1317
  },
1318
1318
  {
1319
1319
  "path": "src/shortcuts/project/index.ts",
1320
1320
  "role": "generated-cli",
1321
- "size": 4396,
1322
- "sha256": "f8006888fb5c4da422c9584cf867be729b3b375d82208748f891c5662711eda8"
1321
+ "size": 4514,
1322
+ "sha256": "ca49682ceba69ba8a0356ea021f749415190a46e531955419968a48cfb3f112d"
1323
1323
  },
1324
1324
  {
1325
1325
  "path": "src/shortcuts/project/manifest.ts",
1326
1326
  "role": "generated-cli",
1327
- "size": 1396,
1328
- "sha256": "20defdc2d1c349f9395e4ca331706a1311fe9258638bca76e61c5de6994f1143"
1327
+ "size": 1435,
1328
+ "sha256": "faf46784f6371458c8e20be6b1975dea1db74986196a35243ff4ed99df826386"
1329
1329
  },
1330
1330
  {
1331
1331
  "path": "src/shortcuts/project/operations.ts",
1332
1332
  "role": "generated-cli",
1333
- "size": 631,
1334
- "sha256": "b5e61dc31da158456a1ad67850ea66c4f11bd87f2ef00af7c0f33c00db34ebee"
1333
+ "size": 647,
1334
+ "sha256": "8b4f86d3535310b09d05ee6c59d33c6d63235e5e0bc638f8d3f8dfefcff93ee0"
1335
1335
  },
1336
1336
  {
1337
1337
  "path": "src/shortcuts/project/operations/read.ts",
1338
1338
  "role": "generated-cli",
1339
- "size": 24404,
1340
- "sha256": "3b803ae1c0ca6731575cc003b1de996b6ba4cedd7336940ce7c7ace183357ba2"
1339
+ "size": 24518,
1340
+ "sha256": "09c5a231cf9f6d63eea6675f63367c3f834e93fc014b320e1d83f79a9adcef35"
1341
1341
  },
1342
1342
  {
1343
1343
  "path": "src/shortcuts/project/operations/registry.ts",
1344
1344
  "role": "generated-cli",
1345
- "size": 1317,
1346
- "sha256": "643e326fea47b63593d926e55e2f2cd554f2259d2a5d3a2317f25dc306c1991a"
1345
+ "size": 1354,
1346
+ "sha256": "3406fd9458cbd169f95cc75bac803ff437b12b02b1efd40600d8875bea213893"
1347
1347
  },
1348
1348
  {
1349
1349
  "path": "src/shortcuts/project/operations/shared.ts",
1350
1350
  "role": "generated-cli",
1351
- "size": 2961,
1352
- "sha256": "935def605c99d9c6d5b4eeab2bab62baf28dffb10f36514392a7e13499d91084"
1351
+ "size": 4249,
1352
+ "sha256": "91a777c9c849ac8f682dfd23bf6e1ca09cb3f44fc5340dbaec2ba28b8fe1f001"
1353
1353
  },
1354
1354
  {
1355
1355
  "path": "src/shortcuts/project/operations/types.ts",
1356
1356
  "role": "generated-cli",
1357
- "size": 2968,
1358
- "sha256": "0459bdf2e484679ccc917ed212abb7334129402cd4dc88e61c76edcba82ac744"
1357
+ "size": 3053,
1358
+ "sha256": "ca57f63bf41417a178da1585194a2df008d36f7f8f0e0eb67a4f71a5169e7213"
1359
1359
  },
1360
1360
  {
1361
1361
  "path": "src/shortcuts/project/operations/write.ts",
1362
1362
  "role": "generated-cli",
1363
- "size": 12903,
1364
- "sha256": "795e803156480b2bbcf4d27a5a36915e955c64e88737b3f4f222d7a6f1ce03bb"
1363
+ "size": 14495,
1364
+ "sha256": "a8ea08cb7e86054d0c1cc3b41c0e4b2a46b80ae13ff60d6b449655b60b2da24b"
1365
1365
  },
1366
1366
  {
1367
1367
  "path": "test/business/project-operations.test.ts",
1368
1368
  "role": "generated-test",
1369
- "size": 15966,
1370
- "sha256": "27abe41e8c6819d48c926fc10ebfaee7653defc8672c3634d0e838d42cde7f35"
1369
+ "size": 18719,
1370
+ "sha256": "317d795ac9825566aaa5a9aadd0f7abb341ddae2fcd4221e46b70e1b6820b738"
1371
1371
  },
1372
1372
  {
1373
1373
  "path": "skills/weaver-e10-shijingran/references/disabled-capabilities.md",
@@ -1383,6 +1383,7 @@
1383
1383
  "源资料版本为 1.0.4,覆盖 25 个接口文档、1 个目录文档和 1 个字段解析流程指引。",
1384
1384
  "project.attachment.upload 与 project.field.auto-resolve 因源资料缺少安全实现契约而保留为 withheldOperations。",
1385
1385
  "2026-09-24:刷新本技能包内产物指纹(SKILL.md / references),新增 references/disabled-capabilities.md;行尾统一为 LF。",
1386
- "2026-10-08:SKILL.md 的「登录与请求头凭证契约」改为请求头声明表格(Cookie / eteamsid / User-Agent),刷新本包产物指纹。"
1386
+ "2026-10-08:SKILL.md 的「登录与请求头凭证契约」改为请求头声明表格(Cookie / eteamsid / User-Agent),刷新本包产物指纹。",
1387
+ "2026-11-04:新建项目/任务后的返回值补充 detail_urls(详情链接),写入文档与展示契约同步;整体重建产物基线指纹。"
1387
1388
  ]
1388
1389
  }
@@ -50,6 +50,8 @@ weaver-work-cli --json project run project.task.create.prepare --input-json '{"r
50
50
  {"continuation":"PREPARE_CONTINUATION","confirm":true}
51
51
  ```
52
52
 
53
+ apply 成功后,`data.dataIds` 是新记录 ID 列表,`data.detail_urls` 是对应的详情页地址(与 `dataIds` 同序)。展示新建结果时按索引把记录名称渲染为 `[名称](detail_urls[i])`,不要只给 ID;若返回 `detail_url_warning`,说明写入已成功但链接暂不可用,如实说明即可,不要重试 apply。
54
+
53
55
  ## 修改
54
56
 
55
57
  - `project.task.update.prepare` / `project.project.update.prepare` 输入 `id` 和 `fields`。
@@ -100,7 +100,11 @@ cliHelp: "weaver-work-cli workflow --help"
100
100
  - 两类词**同时出现** → 按 `workflow.todoSmartConvert`(归拢优先;`todoStat` 只服务纯统计诉求)。
101
101
  - 三类词**都没有**(只是"有哪些待办 / 列出来 / 多少条")→ `workflow.search`,不要调 `workflow.todoStat`。
102
102
  - **例外**:「批量处理待办」后面跟了明确写动作(提交 / 置已读 / 催办 / 共享 / 转发 / 退回)时,仍走 `workflow.batch*`,不要因为出现"批量处理"就转成汇总。
103
+ - **汇总范围的小分类(2026-11-02)**:用户原话出现小分类词(待处理 / 待阅 / 超时 / 未读 / 被退回 / 草稿 / 抄送 / 转发…)时,`prep`/`run` 要传 `--sub-category <词>`(或 `--tabid <tabid>`,显式 tabid 优先;todo 词表:待处理=7、待阅=5、超时=6、被退回=8、草稿=14、全部=0),否则「汇总下我的待处理」会静默取回全部(tabid=0)。未表达小分类时不传。仅影响汇总取数,`workflow.search` 不受影响。
104
+ - **参与身份默认口径(2026-11-03,generalRules)**:汇总取数是否默认排除/包含抄送类身份,以 `default.json` 的 `generalRules` **现行内容为准**(该文件用户可直接编辑,配置可能随时调整),取数 warning 会提示实际生效口径。**用户提示词显式提到抄送/包含抄送/只要抄送/指定身份时,必须显式传 `--isremarks` 覆盖默认值**(全量=全部 23 个身份码;只要抄送=`30,31,33,70,71`)。
105
+ - **缓存与规则口径的纪律(2026-11-03 用户定稿)**:①汇总缓存文件缺失、被清理或条目 miss ⇒ 一律按「冷缓存、从未生成过」处理,直接走待写摘要流程,**不追溯原因、不从备份恢复、不当异常上报**;②`aigroup/default.json` 是用户本机可编辑的规则文件,改动是常态,**只管读并按现行内容执行**——不与仓库版本比对、不覆盖恢复、不探究谁改的。
103
106
  - **不要**为了"先看一眼有哪些"去调 `workflow.todoStat` / `workflow.search` 再回头走汇总链路——那会多花一轮,且交付形态会被带偏。
107
+ - **禁止复用上一轮快照(2026-11-04 用户定稿,2026-11-04 复盘踩坑)**:汇总请求(原话含「汇总待办」/「摘要」等归拢说法)一律**重新执行 `run`(collect 取数)**,**禁止**因为"数据刚取过 / 快照没过期 / 省一轮调用"而复用上一轮的快照 URL 或原样重发旧 `<browsertool>` 块。理由:汇总输出不只取决于待办数据,还取决于**本地规则文件**(`aigroup/default.json`、用户意图)——数据没变 ≠ 输入口径没变,规则改动(如 `needSummary`、`requestSummaryPrompt`)必须靠重新取数才会生效;本地 serve 的快照本身不校验规则新鲜度,复用它等于静默输出旧口径。仅当用户明确说"把刚才的链接再发一次"才允许原样重发。`finish` 的 `ruleFp` 拦截只在真正走到导出时生效,**不能**作为跳过取数的借口。
104
108
 
105
109
 
106
110
  ### 用户意图 → JSON(2026-10-28 新增,模型负责理解、CLI 负责落盘)
@@ -123,7 +127,7 @@ weaver-work-cli --json workflow aigroup set --input-json '{"workflowName":["费
123
127
  | 名词 | 含义 |
124
128
  | --- | --- |
125
129
  | `workflowName` | 工作流名称。**第一次分组 = 按 `workflowName` 分组**,得到的每组叫「工作流分组」 |
126
- | **ai二次分组** | 工作流分组之后、在组内再切子组的过程。**只有这一步需要 AI 计划(`aiGroups`)** |
130
+ | **ai二次分组** | 在组内再切子组的过程。**只有这一步需要 AI 计划(`aiGroups`)**;**排在单条摘要之后**(2026-11-03:分组与摘要不耦合,摘要阶段不再被 `aiGroups` 阻塞) |
127
131
  | **原始列表数据** | `/getTodoListData` 返回的待办条目集合,整条链路的唯一数据源 |
128
132
  | **流程标题** | 条目字段 `requestNameTitle`;没有流程详情数据时 AI 只能靠它判断语义 |
129
133
  | **流程详情数据** | `/getWorkflowRequest` 返回的表单字段 + 基础信息(分组素材 / 摘要素材 / 阈值指标都取它) |
@@ -209,6 +213,8 @@ weaver-work-cli --json workflow aigroup set --input-json '{"workflowName":["费
209
213
  ### 5) 命令输出读取纪律(禁止截断、禁止重复取数)
210
214
 
211
215
  - **禁止对命令输出做管道截断**:不要用 `| head`、`| tail`、`| more` 等处理 `weaver-work-cli --json ...` 的 stdout。截断会破坏 JSON,并且必然导致重复执行同一条命令(实测最常见的一条命令被执行 2 次,就是 `| head` 引起的)。
216
+ - **`tools/` 脚本(`todo-summary.cjs` 等)的输出同样禁止截断、禁止重跑**(2026-11-02 用户定稿,实测踩坑):这类输出是**纯文本素材**而不是 JSON——截断不会报错,只会让素材**悄悄缺条**。实测 `build` 的「待写摘要」一节共 17.6 KB / 9 条,用 `| head -c 9000` 只看得到前 5 条,且此时缓存已经写过、重跑 `build` 也补不回被跳过的那几条,最后只能把整套链路重跑一遍(同一任务 12 轮 → 1 轮,脚本耗时 71.9s → 3.0s)。因此:**脚本输出一律整段直读,不 `head` / `head -c` / `tail` / `grep` 过滤正文**;确需留存时用 `> <out>/xxx.log` 一次落盘、再用 Read **一次**读完(只允许这种"整段落盘",不许分段看、不许先截断看一眼再重跑)。`prep` / `build` / `finish` 的 stdout 已包含下一步所需的全部内容(组/行/序号、待写摘要素材、最终结构、自检、载荷),**不需要、也不允许**为了"确认一下"再去翻中间产物。
217
+ - **中间产物不要重复探查**:`<out>/` 下的 `items.json` / `state.json` / `smartgroup.json` / `build.log` / `finish.log` 是脚本自己的中间态;不要 `ls` 输出目录、不要读 `state.json` 核对、不要翻日志找已完成的信息——每次探查≈1 轮≈20s(实测一次任务这样白花 3 轮、约 25s)。只有 stdout 里确实缺、且下一步**必须**用的字段(如某条 `requestId`)才去读,读就一次读完。
212
218
  - **一律直读 stdout(失败时读 stderr,见下条),不要落盘、不要写脚本回读**:`--json` 输出是**多行 pretty JSON**,且已按体积做过控制(`workflow.todoStat` 约 20 KB/400 余行;`workflow.search` 的条目已收窄到必要字段、泛化待办查询实测约 **14 KB**;`workflow.detail` 只有几 KB;`workflow.createForm` / `editLoad` 遇到大表单会落盘、stdout 只回提示)——都在宿主单次输出上限以内——**直接读即可**。注意 `workflow.createForm` 的 `fields` / `historyRequestData` / `systemFields` 三个键是**压成单行**输出的(只去缩进、内容一字不改),其中 `fields` 那一行字段多时可能上万字符——**这属正常,不是被截断**,照常按 JSON 解析。**禁止**把 stdout 重定向到文件(`> /tmp/xxx.json`)再写脚本解析回读:它不会带来任何新信息,只会白白多出一次工具往返(实测多一轮约 +7s,占整轮耗时可观)。
213
219
  - **`workflow.search` 的体积纪律(别等被截断)**:泛化待办按要求走 `planJson` 分组(各组独立渲染、各 10 条,体积天然分散);要看更多用 `current` 分页续查;**不要靠加大 `pageSize` 一次拉全**。CLI 侧已按 **24 KB(美化口径)** 设体积守卫:超线时自动把完整结果落盘,并在结果**最前面**给出 `resultFile`(结构化 JSON)+ `resultMdFile`(纯 `finalMarkdown`),**stdout 仍保留全量 `finalMarkdown`** ⇒ 正常渲染**直接用 stdout 即可、不需要读文件**;只有需要完整结构化明细(如逐条 `requestId`)时才从 `resultFile` 按需提取,并一次读完(不要 `| head`/`| tail`)。宿主把输出截成一小段预览时:**不要重跑同一条命令**(结果一样、白烧一轮),改用更小页或 `planJson` 分组重取;宿主提示的落盘副本(`~/.workbuddy/projects/**/tool-results/**`)**不能用 Read 工具读**(会拿 `Permission … has been denied`),确实要用时以 shell 命令读取并只提取需要的字段。
214
220
  - **失败出口在 stderr(stdout 为空即失败)**:命令失败时退出码非 0、**错误 JSON 只出现在 stderr**(`{ok:false, error:{type,subtype,message,retryable}}`),**stdout 是空的**。因此:**stdout 为空 → 一律视为失败并去读 stderr**,按 `error.subtype` 决定下一步(如 `todo_stat_requires_smart_mode` → 不要重试 todoStat,改走 `workflow.search`;`plan_requires_smart_mode` → 去掉 `planJson` 重查);判断成败**以 `ok` 字段为准**,宿主界面把命令显示成"运行成功"只代表进程结束,不代表业务成功。