@lark-people/cli 0.0.15-beta.1 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/people-cli_darwin_amd64 +0 -0
- package/bin/people-cli_darwin_arm64 +0 -0
- package/bin/people-cli_linux_amd64 +0 -0
- package/bin/people-cli_linux_arm64 +0 -0
- package/bin/people-cli_windows_amd64.exe +0 -0
- package/bin/people-cli_windows_arm64.exe +0 -0
- package/package.json +1 -1
- package/skills/people-cli/SKILL.md +74 -21
- package/skills/people-cli/references/people-corehr-job-change/SKILL.md +12 -10
- package/skills/people-cli/references/people-corehr-job-change/references/people-job-change-lookup-filters.md +2 -2
- package/skills/people-cli/references/people-corehr-job-change/references/people-job-change-output-and-empty.md +10 -10
- package/skills/people-cli/references/people-corehr-job-change/references/people-job-change-search-advanced.md +8 -8
- package/skills/people-cli/references/people-corehr-job-change/references/people-job-change-search.md +16 -16
- package/skills/people-cli/references/people-corehr-offboarding/SKILL.md +8 -8
- package/skills/people-cli/references/people-corehr-offboarding/references/people-corehr-offboarding-search.md +4 -3
- package/skills/people-cli/references/people-shared/SKILL.md +3 -2
- package/skills/people-cli.zip +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ version: 1.0.0
|
|
|
4
4
|
description: "当用户需要处理飞书人事或飞书招聘数据时使用;覆盖 CoreHR 员工、组织(部门、成本中心和自定义组织)、入职流程、异动、离职、续约/续签、编制/HC,以及 Hire 职位、招需、投递、候选人、面试、评估、人才查询;也适用于 CLI 安装、升级、登录授权、Permission denied 和 scope 权限问题。"
|
|
5
5
|
metadata:
|
|
6
6
|
requires:
|
|
7
|
-
bins: ["people-cli"]
|
|
7
|
+
bins: [ "people-cli" ]
|
|
8
8
|
cliHelp: "people-cli --help"
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -12,9 +12,12 @@ metadata:
|
|
|
12
12
|
|
|
13
13
|
飞书 People 全能套件,通过 `people-cli` 命令行工具查询飞书人事、CoreHR 和招聘数据。
|
|
14
14
|
|
|
15
|
-
主入口只做标准化前置检查、用户身份合规约束和业务域分发。下方 Step 5 是路由表:判断用户意图属于哪个业务域,然后读取该域对应的嵌入子
|
|
15
|
+
主入口只做标准化前置检查、用户身份合规约束和业务域分发。下方 Step 5 是路由表:判断用户意图属于哪个业务域,然后读取该域对应的嵌入子
|
|
16
|
+
Skill,再按子 Skill 的参数规范构造命令;构造完成后必须过 Step 6 确认单批拉取的数据量才能执行。重点关注:
|
|
17
|
+
|
|
16
18
|
1. 嵌入子 Skill 要求继续加载 reference 时,必须加载该子 Skill 自己目录下的 reference。
|
|
17
19
|
2. 严禁凭路由表描述或自身记忆猜测参数、字段、分页、元数据校准或输出格式。
|
|
20
|
+
3. 每条取数命令执行前应过 Step 6 的自检,尽量按推荐值显式指定单批拉取的数据量。
|
|
18
21
|
|
|
19
22
|
## ⚠️ 标准执行流程 - 使用任何业务命令前必须执行
|
|
20
23
|
|
|
@@ -32,7 +35,8 @@ people-cli --version
|
|
|
32
35
|
npx @lark-people/cli install
|
|
33
36
|
```
|
|
34
37
|
|
|
35
|
-
安装流程会安装 `people-cli` 二进制命令、People 官方 Skills,并引导配置飞书应用和用户授权。安装完成后必须重新执行
|
|
38
|
+
安装流程会安装 `people-cli` 二进制命令、People 官方 Skills,并引导配置飞书应用和用户授权。安装完成后必须重新执行
|
|
39
|
+
`people-cli --version`;仍失败时停止业务操作并把错误告知用户。
|
|
36
40
|
|
|
37
41
|
如 npm registry 导致无法安装,可先执行:
|
|
38
42
|
|
|
@@ -52,8 +56,7 @@ people-cli update --check --json
|
|
|
52
56
|
判断规则:
|
|
53
57
|
|
|
54
58
|
- `update_available=true`:必须立即执行 `people-cli update`,不能继续 Step 3 或任何业务命令。
|
|
55
|
-
- `
|
|
56
|
-
- 只有 `update_available=false`,且 `skills_status.in_sync` 不为 `false` 时,才能继续 Step 3。
|
|
59
|
+
- 只有 `update_available=false` 时,才能继续 Step 3。
|
|
57
60
|
- 命令失败、输出不是合法 JSON、或缺少 `update_available` 字段:改用文本检查兜底。
|
|
58
61
|
|
|
59
62
|
文本检查兜底:
|
|
@@ -68,11 +71,15 @@ people-cli update --check
|
|
|
68
71
|
people-cli update
|
|
69
72
|
```
|
|
70
73
|
|
|
71
|
-
更新完成后必须重新执行 `people-cli --version` 和 `people-cli update --check --json`。只有确认 `update_available=false
|
|
74
|
+
更新完成后必须重新执行 `people-cli --version` 和 `people-cli update --check --json`。只有确认 `update_available=false`
|
|
75
|
+
后,才能继续 Step 3 或业务命令。
|
|
72
76
|
|
|
73
|
-
如果 `people-cli update` 失败、更新后版本仍不是最新,或检查结果仍显示 `update_available=true
|
|
77
|
+
如果 `people-cli update` 失败、更新后版本仍不是最新,或检查结果仍显示 `update_available=true`,停止业务操作,并把错误信息和
|
|
78
|
+
CLI 返回的 hint 告知用户。
|
|
74
79
|
|
|
75
|
-
例外:如果 `people-cli update` 返回 `update_error`,且 `hint` 是明确的 `npm install -g @lark-people/cli@...` 或
|
|
80
|
+
例外:如果 `people-cli update` 返回 `update_error`,且 `hint` 是明确的 `npm install -g @lark-people/cli@...` 或
|
|
81
|
+
`pnpm add -g @lark-people/cli@...` 安装命令,可以按该 hint 执行一次手动安装兜底。兜底完成后仍必须重新执行
|
|
82
|
+
`people-cli --version` 和 `people-cli update --check --json`;复查不通过时停止业务操作。
|
|
76
83
|
|
|
77
84
|
### Step 3: 检查用户身份和授权
|
|
78
85
|
|
|
@@ -85,10 +92,12 @@ people-cli auth status --verify
|
|
|
85
92
|
只有确认用户身份可用后,才能继续业务命令。判断规则:
|
|
86
93
|
|
|
87
94
|
- 输出 `identity=user`,且没有 token 不存在、过期或 server rejected 等错误:继续。
|
|
88
|
-
- 如果未配置应用,使用 `people-cli config init --new` 配置应用,但要尤其注意:`people-cli config init --new
|
|
95
|
+
- 如果未配置应用,使用 `people-cli config init --new` 配置应用,但要尤其注意:`people-cli config init --new`
|
|
96
|
+
是长阻塞命令,会一直等待用户在浏览器完成配置。所以必须后台运行该命令,启动后立即读取 stdout/stderr
|
|
97
|
+
或日志里的配置链接,拿到链接后立刻原样发给用户;禁止前台阻塞等待命令结束,禁止使用 `TaskOutput block=true` 等待完成,禁止用
|
|
98
|
+
`| head`/管道截断输出。
|
|
89
99
|
- 未登录、token 不存在、token 过期或服务端拒绝:先根据业务域执行用户授权。
|
|
90
100
|
|
|
91
|
-
|
|
92
101
|
```bash
|
|
93
102
|
people-cli auth login --domain all
|
|
94
103
|
```
|
|
@@ -100,7 +109,8 @@ people-cli auth login --domain all
|
|
|
100
109
|
People CLI 在本 Skill 体系中只能使用用户身份。
|
|
101
110
|
|
|
102
111
|
- 在拼接业务命令必须使用或保持 `--as user`,严禁使用 `--as bot`。
|
|
103
|
-
- 即使发现当前是 bot 身份,也不要重新执行登录授权流程,因为 Step3 你已经确认过了,只需要保证在执行命令的时候保持
|
|
112
|
+
- 即使发现当前是 bot 身份,也不要重新执行登录授权流程,因为 Step3 你已经确认过了,只需要保证在执行命令的时候保持
|
|
113
|
+
`--as user` 即可。
|
|
104
114
|
|
|
105
115
|
### Step 5: 根据用户 query 确认实际业务域
|
|
106
116
|
|
|
@@ -108,13 +118,15 @@ People CLI 在本 Skill 体系中只能使用用户身份。
|
|
|
108
118
|
|
|
109
119
|
#### 👤 员工信息查询 (employee)
|
|
110
120
|
|
|
111
|
-
|
|
121
|
+
搜索员工、查询当前登录员工基本信息、查询员工可筛选字段、按条件筛选员工。适用于员工搜索、按姓名找人、查我自己、员工列表、部门员工、职级员工、员工字段、
|
|
122
|
+
`employee search`、`employee filter`。不覆盖待入职、入职名单、入职记录、入职流程、异动、离职、任职历史、审批、导出。
|
|
112
123
|
|
|
113
124
|
→ 详见 [people-corehr-employee](references/people-corehr-employee/SKILL.md)
|
|
114
125
|
|
|
115
126
|
#### 🔁 异动管理 (job-change)
|
|
116
127
|
|
|
117
|
-
|
|
128
|
+
搜索员工异动记录、按员工/部门/状态/时间/异动类型/异动原因筛选异动、获取异动筛选项与字段信息。适用于异动、调动、转岗、晋升、异动查询、异动记录、人员异动、
|
|
129
|
+
`job change`。不覆盖离职、编制、员工信息、审批操作、数据导出。
|
|
118
130
|
|
|
119
131
|
→ 详见 [people-corehr-job-change](references/people-corehr-job-change/SKILL.md)
|
|
120
132
|
|
|
@@ -138,19 +150,22 @@ People CLI 在本 Skill 体系中只能使用用户身份。
|
|
|
138
150
|
|
|
139
151
|
#### 🧭 名称换 ID (query-id-by-name)
|
|
140
152
|
|
|
141
|
-
把 CoreHR 对象名称解析为下游业务命令需要的 ID,例如部门、地点、职级、序列等。通常不是用户业务查询的主入口,只在用户明确要求名称换
|
|
153
|
+
把 CoreHR 对象名称解析为下游业务命令需要的 ID,例如部门、地点、职级、序列等。通常不是用户业务查询的主入口,只在用户明确要求名称换
|
|
154
|
+
ID,或选定的业务子 Skill 明确需要先解析 ID 时使用。
|
|
142
155
|
|
|
143
156
|
→ 详见 [people-corehr-query-id-by-name](references/people-corehr-query-id-by-name/SKILL.md)
|
|
144
157
|
|
|
145
158
|
#### 📄 续约/续签 (renewal)
|
|
146
159
|
|
|
147
|
-
|
|
160
|
+
查询续约/续签记录与字段,覆盖合同到期名单、续约状态与流程进展、签署状态、续延、原合同与续签后合同对比、异常冲突排查、数量与分布统计。用户提到续约、续签、不续签、续延、合同到期、合同快到期、到期名单、签署状态、续签评估、
|
|
161
|
+
`renewal` 时走这里。
|
|
148
162
|
|
|
149
163
|
→ 详见 [people-corehr-renewal](references/people-corehr-renewal/SKILL.md)
|
|
150
164
|
|
|
151
165
|
#### 📊 编制规划 (workforce-plan)
|
|
152
166
|
|
|
153
|
-
查询 CoreHR 编制规划:编制方案、当前生效方案、编制 HC、在职人数、预增、预减、缺编数、满编率、编制汇总、维度分组、Top
|
|
167
|
+
查询 CoreHR 编制规划:编制方案、当前生效方案、编制 HC、在职人数、预增、预减、缺编数、满编率、编制汇总、维度分组、Top
|
|
168
|
+
N、编制明细和原始行数据。普通员工人数走员工;涉及计划、预算、HC 口径才走这里。
|
|
154
169
|
|
|
155
170
|
→ 详见 [people-corehr-workforce-plan](references/people-corehr-workforce-plan/SKILL.md)
|
|
156
171
|
|
|
@@ -166,8 +181,10 @@ People CLI 在本 Skill 体系中只能使用用户身份。
|
|
|
166
181
|
- 用户最终想查入职名单、入职记录、入职流程、入职进度或待入职人员时,路由到 `prehire`。
|
|
167
182
|
- 用户最终想查员工、员工名单、员工花名册、员工档案或在职人员时,路由到 `employee`。
|
|
168
183
|
- 用户最终想查投递、候选人、面试、职位或招聘需求时,路由到 `hire`;想查调动、晋升、转岗或异动记录时,路由到 `job-change`。
|
|
169
|
-
- 用户最终想查组织对象的字段、节点、是否存在、上下级关系、路径、组织树或聚合时,路由到 `organization`;具体组织家族和租户配置的组织类型由子
|
|
170
|
-
|
|
184
|
+
- 用户最终想查组织对象的字段、节点、是否存在、上下级关系、路径、组织树或聚合时,路由到 `organization`;具体组织家族和租户配置的组织类型由子
|
|
185
|
+
Skill 根据真实元数据确认。
|
|
186
|
+
- 用户最终想查编制方案、HC、预增、预减、缺编数、满编率、方案维度、编制汇总或明细时,路由到 `workforce-plan`;组织只作为编制规划的筛选或分组维度时仍走
|
|
187
|
+
`workforce-plan`。
|
|
171
188
|
- 一个词同时可能是业务域提示和实体名称的一部分时,不得拆词触发;必须以用户最终要求返回的对象或指标判定业务域。
|
|
172
189
|
- 续约、离职等其他对象继续按上方各业务域定义路由。描述中的话术是可判别示例,不是需要穷举的关键词白名单。
|
|
173
190
|
- 如果多个业务对象都成立且无法确定主对象,问一个简短澄清问题。
|
|
@@ -175,13 +192,49 @@ People CLI 在本 Skill 体系中只能使用用户身份。
|
|
|
175
192
|
- 子 Skill 的命令结构互不通用。不能把 A Skill 的命令、字段、分页、search-option、schema 或元数据流程套到 B Skill。
|
|
176
193
|
- 选定业务域后读取对应子 Skill 的 `SKILL.md`,再按该子 Skill 执行。如果对应子 Skill 不可用,停止并说明缺失,不要自行拼接命令。
|
|
177
194
|
- 子 Skill 加载后发现其能力与主业务对象不匹配时,可以携带明确的不匹配原因回到本路由表重新判定一次。空结果、权限错误或字段不可筛选不代表路由错误,禁止因此跨业务域试探;重新判定后仍有歧义时必须询问用户。
|
|
178
|
-
- 读取嵌入子 Skill 后,子 Skill 内的相对 reference 路径必须以该子 Skill 的 `SKILL.md` 所在目录为基准解析。例如
|
|
179
|
-
|
|
195
|
+
- 读取嵌入子 Skill 后,子 Skill 内的相对 reference 路径必须以该子 Skill 的 `SKILL.md` 所在目录为基准解析。例如
|
|
196
|
+
`references/foo.md` 应解析为 `references/<child-skill>/references/foo.md`,不是主 Skill 的 `references/foo.md`。
|
|
197
|
+
- 嵌入子 Skill 要求读取 reference 时,必须读取该子 Skill 自己的 reference 文件。例如 `people-corehr-employee/SKILL.md` 中的
|
|
198
|
+
`references/people-corehr-employee-search.md` 必须解析到
|
|
199
|
+
`people-corehr-employee/references/people-corehr-employee-search.md`。
|
|
200
|
+
|
|
201
|
+
### Step 6:拼接业务命令前确认单批拉取的数据量(防限流)
|
|
202
|
+
|
|
203
|
+
**读取子 Skill 后、真正执行任何取数命令前,先过这一步。** 拼命令时对照下表确认该业务域**用哪个参数控制单批拉取的数据量**、以及
|
|
204
|
+
**推荐拉多大一批**,并尽量在命令里显式写上;不要依赖 CLI 默认值或自身记忆省略此步。注意控制单批数据量的参数名各接口**不统一
|
|
205
|
+
**(有的是 `--limit`,有的是 `--page-size`,有的要写进 `--params` 里的 `page_size`),务必按下表「参数」列构造,不要一律猜成
|
|
206
|
+
`--page-size`。
|
|
207
|
+
|
|
208
|
+
**执行前自检(每条取数命令都过一遍)**:
|
|
209
|
+
|
|
210
|
+
1. 命令里是否已**显式**指定了单批拉取的数据量?(尽量不靠 CLI 默认值)
|
|
211
|
+
2. 用的参数名是否正确?(见下表「参数」列)
|
|
212
|
+
3. 取值是否等于该业务域的推荐值(取 Max)?
|
|
213
|
+
|
|
214
|
+
有任一为否,尽量先补齐再执行。
|
|
215
|
+
|
|
216
|
+
**核心原则:用「一批多拉 + 少翻页」,不要用「一批少拉 + 多翻页」。** 限流卡的是请求数 /
|
|
217
|
+
频率,单批拉得越少翻页越多、请求越多,越容易触发限流。所以每次取数都按下表用该接口允许的最大单批数据量,一批多取、少翻页。
|
|
218
|
+
|
|
219
|
+
| 业务域 / 接口 | 参数 | 推荐值(取 Max) |
|
|
220
|
+
|--------------------------------------------------------------------------|-------------------------------------------|------------|
|
|
221
|
+
| employee 筛选 | `--limit`(游标 `--search_after`) | 100 |
|
|
222
|
+
| job-change search | `--page-size`(或 `--params` 内 `page_size`) | 100 |
|
|
223
|
+
| prehire search | `--page-size` | 100 |
|
|
224
|
+
| offboarding search | `--params` 内 `page_size` | 50 |
|
|
225
|
+
| renewal search(含合同到期名单) | `--page-size` | 200 |
|
|
226
|
+
| workforce-plan | `--page-size` | 2000 |
|
|
227
|
+
| hire application / evaluation / interview / test / minutes / job-process | `--page-size` | 100 |
|
|
228
|
+
| hire job / job-requirement / evaluation-task / interview-task | `--page-size` | 20 |
|
|
229
|
+
|
|
230
|
+
遇到限流(报错含 `rate limit`、`频率`、`too many`、`429` 等):先退避再重试,不要高频重发。参数名、默认值、上限与铁律最终以对应子
|
|
231
|
+
Skill 为准,冲突时服从子 Skill。
|
|
180
232
|
|
|
181
233
|
## 输出约束
|
|
182
234
|
|
|
183
235
|
- 禁止输出 appSecret、access token、refresh token、authorization header 或本地凭证内容。
|
|
184
|
-
- 默认不向用户暴露内部 ID,例如
|
|
236
|
+
- 默认不向用户暴露内部 ID,例如
|
|
237
|
+
employee_id、department_id、job_id、application_id、talent_id、cursor、next_cursor;优先展示姓名、部门名、职位名、状态、日期、数量和可读链接。
|
|
185
238
|
- 如果 CLI 返回 `log_id`,可以保留用于排障。
|
|
186
239
|
- 写入、更新、删除、提交申请或发起流程前必须向用户确认关键字段;能 dry-run 时先 dry-run。
|
|
187
240
|
- 工具、登录、授权、权限或网络失败时,如实说明失败类型和下一步动作,不编造 People 数据。
|
|
@@ -19,7 +19,7 @@ metadata:
|
|
|
19
19
|
## Required Flow
|
|
20
20
|
|
|
21
21
|
1. **意图判定**:确认是 job_change 查询;否则拒答,不调用 CLI。
|
|
22
|
-
2. **短路径执行**:A) 最多 1 次 `search-option --as user --jq ...`;B) 名称型 lookup 用 `--lookup-filters`;C) 1 次真实 `+job-change-search`;D) 仅在用户明确翻页/全部,或属于统计/汇总/分组等全量才准确场景时按分页策略有界翻页;E) 输出最终答案。禁止用 shell 管道/临时文件/脚本处理校准或搜索结果。
|
|
22
|
+
2. **短路径执行**:A) 最多 1 次 `search-option --as user --jq ...`;B) 名称型 lookup 用 `--lookup-filters`;C) 1 次真实 `+job-change-search`,普通查询默认 `--page-size 20`,未显式指定 page size 的全量模式首请求使用 `--page-size 100`;D) 仅在用户明确翻页/全部,或属于统计/汇总/分组等全量才准确场景时按分页策略有界翻页;E) 输出最终答案。禁止用 shell 管道/临时文件/脚本处理校准或搜索结果。
|
|
23
23
|
3. **有界校准**:`search-option` 必须带内置 `--jq`,在一个 JSON 对象里同时返回本题需要的筛选字段和返回列;不要 dump 全量。
|
|
24
24
|
4. **最终搜索**:条件可执行后必须真实执行 `+job-change-search ... --format json --as user`。一旦返回合法 `data.total/items`,立即回答;缺少非关键字段写“未返回”。`search-option` / `help` / `schema` 都不是终点。
|
|
25
25
|
5. **完成态校验并回答**:答案必须来自最后一次成功搜索(或不可完成原因)。非空给数量+摘要,空给空结果说明+条件,解析/工具失败给失败类别+已执行条件;禁止空输出、过程句结尾或无搜索结果时编造人数/名单。
|
|
@@ -36,7 +36,7 @@ metadata:
|
|
|
36
36
|
| 调入/调出 + 另一字段发生变化 | 部门分支(含目标/来源部门 lookup + `details=department`)与另一变更内容分支(同时间/状态/lookup + 对应 details)分别搜索后按 `job_change_id` 取交集 |
|
|
37
37
|
| 当前所属/员工部门 | `--lookup-filters field_name="employment.department"` |
|
|
38
38
|
| 新/旧工作地点 | `target_work_location` / `original_work_location` 走 `--lookup-filters` |
|
|
39
|
-
| 都去了哪些/汇总/统计/数量/分组 | 必要返回字段 + 最多按 `page_token` 聚合 200 条;仍有更多说明部分统计 |
|
|
39
|
+
| 都去了哪些/汇总/统计/数量/分组 | 必要返回字段 + 未显式指定时使用 `--page-size 100` + 最多按 `page_token` 聚合 200 条;仍有更多说明部分统计 |
|
|
40
40
|
| 异动异常没处理完/异常类型 | 校准异常处理状态=未处理,并同时校准/返回异常类型字段;缺异常类型字段时说明未返回,禁止用异动状态或异动变更内容替代 |
|
|
41
41
|
| 自定义字段有值/不为空 | 先校准该字段;能服务端筛选才搜索;不能筛选时不可完成,禁止省略该条件后宽搜 |
|
|
42
42
|
| 职位描述/岗位描述变化 | 按职位描述语义校准字段或变更内容;禁止改成职务/职位变更 |
|
|
@@ -55,8 +55,8 @@ metadata:
|
|
|
55
55
|
- 字段/枚举校准为空、候选多且无法唯一判断、或运行时拒绝字段时必须停止并按不可完成输出;禁止猜字段名/枚举值,禁止删除失败条件后宽搜,禁止用相邻字段兜底(如用异动状态代替异常处理状态、用异动变更内容代替异常类型/异常处理状态),禁止全量搜索后本地过滤来模拟服务端筛选。
|
|
56
56
|
- 禁止命令形态:`head`、`tail`、`wc`、`grep`、临时 `/tmp/*.json`、临时 Python/脚本解析、`people-cli schema`、`+job-change-search --help`、`search-option --format json`。`+job-change-search --format json` 的返回也必须由模型直接读取 `data.items/total/has_more`,禁止再 pipe 给脚本提取字段。若已经误用这些探索命令,下一步只能输出基于已返回 JSON 的答案或不可完成原因,不能继续探索。
|
|
57
57
|
- `filter_str` 中除日期区间外所有字段值必须是数组。
|
|
58
|
-
-
|
|
59
|
-
- 最终 search 必须加 `--format json`;只读 `data.items[]` / `data.has_more` / `data.page_token` / `data.total`。"总数/共有/一共"必须来自 `data.total`;本页数量写"本页返回 N 条",分页聚合写"已聚合 N 条"。`data.total` 缺失时写"接口未返回总数"。只要能可靠读取到非空 `items
|
|
58
|
+
- `--page-size` 的有效范围是 `20–100`,按以下优先级确定:用户显式指定范围内的值时原样使用;否则,用户明确要求“所有/全部/全量/完整列表/都列出来/拉完”,或属于统计、汇总、数量、分组、多分支交集等必须遍历完整结果才准确的场景时,固定用最大值 `100`;其它查询固定用 `20`。单次用户请求最多返回/聚合 200 条。不要通过超过范围的 page size、重复首屏、`grep/head` 或脚本截断模拟翻页;分页时必须保持首次查询的 page size 和全部查询条件不变。
|
|
59
|
+
- 最终 search 必须加 `--format json`;只读 `data.items[]` / `data.has_more` / `data.page_token` / `data.total`。"总数/共有/一共"必须来自 `data.total`;本页数量写"本页返回 N 条",分页聚合写"已聚合 N 条"。`data.total` 缺失时写"接口未返回总数"。只要能可靠读取到非空 `items`,最终答案不能只输出总数;普通查询展示当前页全部记录明细(默认 `page_size=20`),全量/翻页/聚合场景展示本次已聚合的全部记录,除非工具输出截断导致无法可靠读取。
|
|
60
60
|
- 最终 search 默认不要加 `--jq`。若为避免大输出必须加 `--jq`,只能做元信息包装并原样保留 `items:.data.items`(可另带 `total/has_more/page_token/page_count/reject_export`),禁止只返回 total/has_more、只返回 groups、或把 `items` 投影成少数字段。若已因 `--jq` 裁剪导致 `total>0` 但没有原始 `items`,该搜索结果不可作为最终答案,必须用相同筛选条件重新执行一次保留原始 `items` 的最终 search;禁止基于 meta-only 结果回答“只有总数”。
|
|
61
61
|
- 异动详情基础展示字段强制契约:凡最终答案展示任意异动记录明细,必须逐条展示姓名、工号、头像、生效日期、异动类型、异动状态。用户额外要求的业务字段(如原/新人员类型、原/新部门、原因、是否调薪)只能追加,不能替代这 6 个基础字段;字段在原始 `items` 中存在就必须展示,确实缺失或无权限时写"未返回/无权限",禁止省略列、禁止用 ID 替代工号。纯统计且不列记录明细时不适用;只要列代表记录/样例/当前页明细就适用。
|
|
62
62
|
- 用户未指定返回字段时默认展示:姓名、工号、头像、生效日期、异动类型、状态。命令层优先不传 `--select-fields`;若用户点名额外字段,`--select-fields` 只负责追加业务字段,不能让最终答案丢失基础展示字段。普通查询不传 `--user-id-type open_id`,保持默认 `people_corehr_id`。
|
|
@@ -91,7 +91,7 @@ metadata:
|
|
|
91
91
|
- 用户说"有值/不为空"时,先校准字段;enum/tree/select 有候选则把全部合法候选放进 `values` 数组;无候选且无非空操作符时停止。自定义字段的"有值"是必需条件,禁止省略该条件后只按部门、状态或变更内容宽搜。
|
|
92
92
|
- 自定义字段不得写死:作筛选先校准 `system_filters`;作返回先校准 `system_columns`;不可返回时按 §5 输出不可完成。
|
|
93
93
|
- 多候选必须澄清;必需条件解析失败时停止并输出不可用结果。禁止删条件后宽搜、自动选第一个、把类型改原因、先拉全量再本地文本匹配。
|
|
94
|
-
-
|
|
94
|
+
- 分页策略:未明确翻页且不属于全量准确场景时不翻页,使用 `--page-size 20` 返回当前页并说明 `total/has_more/page_size`;未显式指定 page size 时,用户要全部的请求从首请求开始使用 `--page-size 100`,统计/汇总类同样使用 `--page-size 100`,两者默认最多聚合 200 条;后续页复用首次查询的 page size 和全部条件。任一页失败/缺 `page_token`/JSON 异常 → §5。
|
|
95
95
|
- 最终答案只能是结果摘要、空结果说明或结构化不可完成原因;禁止输出推理过程、执行计划、推荐命令、runner JSON 或"让我/现在/下一步/将要/我将要"等过程文本(与 §2 一致)。
|
|
96
96
|
|
|
97
97
|
## Command Patterns
|
|
@@ -102,7 +102,7 @@ people-cli corehr job_change search-option --as user --jq '{filters:[.data.syste
|
|
|
102
102
|
|
|
103
103
|
# 通用搜索(按需替换/组合 dynamic-filters / lookup-filters / 日期 / select-fields;标准 lookup 字段可省略 target_object_api_name)
|
|
104
104
|
people-cli corehr +job-change-search \
|
|
105
|
-
--page-size
|
|
105
|
+
--page-size 20 --format json \
|
|
106
106
|
--effective-date-start '<DATE_START>' --effective-date-end '<DATE_END>' \
|
|
107
107
|
--dynamic-filters '[{"field_name":"<FIELD_API_NAME>","values":["<VAL>"]}]' \
|
|
108
108
|
--lookup-filters '[{"field_name":"<FIELD>","values":["<NAME>"]}]' \
|
|
@@ -135,7 +135,7 @@ people-cli corehr +job-change-search \
|
|
|
135
135
|
|
|
136
136
|
1. 用 `search-option` 校准每个变更内容的运行时合法 value(如 `department` / `job_level` / `direct_manager` / `work_location`)。
|
|
137
137
|
2. 只有多个条件都属于 `details_of_job_status_change` 变更内容时才分支;普通字段/自定义字段取值 + 一个变更内容发生,直接放在同一次 `--dynamic-filters` 数组里表达 AND,不要拆两支。需要分支时按语义组建分支:普通单项变更每组 1 个 value;合同变更组固定用父节点 `contract`,不要展开合同子项;试用期等集合型变更按运行时父节点优先。保持其它筛选条件完全一致,对每个语义组发起一次 `+job-change-search` 后按组间 `job_change_id` 取 AND 交集,禁止把组内每个子项都拆成独立分支,禁止为了提取 ID 重跑同一分支。
|
|
138
|
-
3. 保守交集优先:用户未明确要求完整列表/继续翻页时,默认只用每个分支当前页 `items`
|
|
138
|
+
3. 保守交集优先:用户未明确要求完整列表/继续翻页时,默认只用每个分支当前页 `items` 求交集,不主动翻页,避免大输出截断后编造。只有用户明确要求全部,才在未显式指定 page size 时从每个分支首请求开始使用 `--page-size 100`,按 `page_token` 有界翻页,最多 200 条;若从既有分页结果继续,则保持该结果首次查询的 page size。
|
|
139
139
|
4. 只读每个分支原始 JSON 响应里的 `data.items[].job_change_id`(缺失用 `wk_id` 兜底),在回答逻辑中按 `job_change_id` 取**交集**。禁止对最终搜索结果使用管道、`python3`、`grep`、`head`、`wc`、临时文件或静默重跑来提取 ID;如果当前上下文无法可靠读取 JSON,就按不可完成说明输出。
|
|
140
140
|
5. 答案的"同时变更"数量写"当前页交集命中 N 条 / 已聚合交集 N 条";**禁止**把任一分支 `data.total`、本页数量、单次多值 OR 的 `data.total` 当成"同时发生"的总数。若当前页交集为空但任一分支 `has_more=true`,禁止回答"没有符合条件";只能写"当前已返回记录内未发现交集,但仍有更多记录,不能确认全量为空",并给出各分支 `data.total`、本页数量和 `has_more`。
|
|
141
141
|
6. 分支搜索后必须立即收口成最终答案:输出交集命中数、名单/明细和分支完整性口径;禁止以"发起两个分支搜索"、"正在聚合"、"下一步取交集"等过程文本结尾,禁止再用任何 shell 命令加工已返回的 JSON。
|
|
@@ -143,13 +143,15 @@ people-cli corehr +job-change-search \
|
|
|
143
143
|
|
|
144
144
|
骨架:
|
|
145
145
|
|
|
146
|
+
以下是普通当前页骨架,使用 `--page-size 20`;用户明确要求全部且未显式指定 page size 时,各分支从首请求开始改用 `--page-size 100`。
|
|
147
|
+
|
|
146
148
|
```bash
|
|
147
149
|
# 分支 A:部门变更
|
|
148
|
-
people-cli corehr +job-change-search --page-size
|
|
150
|
+
people-cli corehr +job-change-search --page-size 20 --format json \
|
|
149
151
|
--effective-date-start '<S>' --effective-date-end '<E>' \
|
|
150
152
|
--dynamic-filters '[{"field_name":"details_of_job_status_change","values":["department"]}]' --as user
|
|
151
153
|
# 分支 B:职级变更(其它条件完全相同)
|
|
152
|
-
people-cli corehr +job-change-search --page-size
|
|
154
|
+
people-cli corehr +job-change-search --page-size 20 --format json \
|
|
153
155
|
--effective-date-start '<S>' --effective-date-end '<E>' \
|
|
154
156
|
--dynamic-filters '[{"field_name":"details_of_job_status_change","values":["job_level"]}]' --as user
|
|
155
157
|
# 回答逻辑:直接读取两个响应的 data.items[].job_change_id,取 setA ∩ setB;不要再运行 shell 提取 ID。
|
|
@@ -164,7 +166,7 @@ people-cli corehr +job-change-search --page-size 10 --format json \
|
|
|
164
166
|
- **最终结论**:直接给出用户问的数量、名单或分组结果。
|
|
165
167
|
- **聚合表**:按用户要的维度(状态/异动类型/目标部门等)成表,列每组数量与代表记录;多维度并列各一张表。
|
|
166
168
|
- **数据口径**:列已执行查询条件(时间、部门字段、状态集合、变更字段、是否含自定义字段)。
|
|
167
|
-
- **完整性说明**:写 `data.total`、本页/已聚合数量、`has_more
|
|
169
|
+
- **完整性说明**:写 `data.total`、本页/已聚合数量、`has_more`;未显式指定 page size 的全量模式从首请求开始使用 `--page-size 100`,任一分支聚合到 200 条仍 `has_more=true` 时,标"前 200 条的部分统计 / 部分口径"并询问是否继续;不得把首屏当全量。
|
|
168
170
|
|
|
169
171
|
多目标 lookup 分组题(如多个目标部门/地点)用同一个 `--lookup-filters.values` 表达 OR;搜索后按返回的目标字段分组,不能停在临时文件、`wc` 或"准备聚合"。用户要求"标注是否变更"时,基于原/新字段或 `details_of_job_status_change` 给每条记录打标,不把该变更项追加为筛选条件;字段缺失写未返回/无法判断,不能继续查 schema/help。
|
|
170
172
|
|
|
@@ -60,7 +60,7 @@ people-cli corehr +job-change-search \
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
people-cli corehr +job-change-search \
|
|
63
|
-
--page-size
|
|
63
|
+
--page-size 20 \
|
|
64
64
|
--format json \
|
|
65
65
|
--lookup-filters '[{"field_name":"original_job_level","values":["L6"]},{"field_name":"target_job_level","values":["L2"]}]' \
|
|
66
66
|
--select-fields '["effective_date","status","transform_type","original_job_level","target_job_level"]' \
|
|
@@ -73,7 +73,7 @@ people-cli corehr +job-change-search \
|
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
75
|
people-cli corehr +job-change-search \
|
|
76
|
-
--page-size
|
|
76
|
+
--page-size 20 \
|
|
77
77
|
--format json \
|
|
78
78
|
--lookup-filters '[{"field_name":"target_work_location","values":["北京"]}]' \
|
|
79
79
|
--dynamic-filters '[{"field_name":"details_of_job_status_change","values":["work_location"]},{"field_name":"status","values":["Transformed"]}]' \
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
- 若本轮没有成功的真实搜索结果,禁止输出具体人数、姓名、工号、部门、日期;只能继续执行搜索或输出运行时解析/搜索失败模板。
|
|
20
20
|
- 若模型准备输出空文本、过程句、命令计划或“搜索成功待聚合”,必须改为最终结论;无法形成结论时输出不可完成原因,不能让最终答案为空。
|
|
21
21
|
- 目标侧变更查询一旦完成运行时校准并执行最终搜索,必须立即输出数量和明细;不要继续尝试同义词、英文名、`--help`、宽搜样本或本地 original/target 验证。只有用户明确"从 X 到 Y"或要求复杂统计时,才做有界后处理。
|
|
22
|
-
- 搜索后允许按用户目标做分页、聚合、去重或轻量格式化;但分页只能使用返回的 `page_token
|
|
22
|
+
- 搜索后允许按用户目标做分页、聚合、去重或轻量格式化;但分页只能使用返回的 `page_token`。用户未明确要求翻页/全部/完整列表/继续翻页,且问题不依赖完整数据时,不翻页,只用 `page_size=20` 返回当前页并说明 `total`、`has_more`、`page_size` 和本页数量。用户明确要求所有数据,或问题属于“有哪些/都去了哪些/汇总/统计/数量/分组”等全量才准确场景时,未显式指定 page size 则从首请求开始使用 `page_size=100`,最多先处理前 200 条;若仍有更多,说明这是部分统计,不代表全量,并询问是否继续。
|
|
23
23
|
- CLI 结果按 `--format json` 的固定对象读取,只读取 `data.items[]`、`data.has_more`、`data.page_token`、`data.total`;答案中的“总数/共有/一共”只能来自 `data.total`。禁止把本页数量当总数,禁止把样例数量、已聚合数量或前 200 条部分结果写成全量总数;不要判断 NDJSON/多 JSON,不要用 `grep`/`head` 截取 search 结果。若 JSON 形态不符合固定对象、`has_more=true` 但缺 `page_token`、任一页失败或分页解析失败,输出结构化不可完成原因,不要调 help/schema、写临时脚本或继续重试到超时。
|
|
24
|
-
- 最终答案必须包含以下之一:`data.total` 总数 + 本次返回/已聚合记录数量 + 关键记录摘要、没有符合条件的记录 + 已执行查询条件、必需 lookup / enum / option 解析失败 + 失败条件、搜索失败 + 错误类别。若接口未返回 `data.total
|
|
24
|
+
- 最终答案必须包含以下之一:`data.total` 总数 + 本次返回/已聚合记录数量 + 关键记录摘要、没有符合条件的记录 + 已执行查询条件、必需 lookup / enum / option 解析失败 + 失败条件、搜索失败 + 错误类别。若接口未返回 `data.total`,必须写“接口未返回总数”,只能说明本页数量或已聚合数量。普通非全量明细查询默认展示当前页全部记录(默认 `page_size=20`);全量准确场景展示本次按全量模式 page size 已聚合的全部记录,不能只给统计表。
|
|
25
25
|
- 最终 search 的输出必须保留原始 `items`。默认不要加 `--jq`;若为了稳定展示 `total/has_more/page_token` 使用 `--jq`,必须同时返回完整 `items:.data.items`,不能只返回元信息、统计分组或裁剪后的少数字段。`total>0` 但没有可读原始 `items` 时,不能回答“只查到总数”;应把该结果视为被投影破坏,使用同一筛选条件重新搜索一次并保留原始 `items`。只有重搜失败或工具输出截断且无法可靠读取记录明细时,才说明无法列出明细。
|
|
26
26
|
- Bash 命令只能包含可执行 CLI 及其参数;若混入自然语言、shell syntax error、unknown flag、校验失败或命令污染,必须按运行时搜索失败/解析失败输出,禁止继续生成业务答案。
|
|
27
27
|
- 若工具输出被 persisted/truncated:优先从可见的固定 JSON 中读取 `data.total/has_more/items`;只要能可靠读取到完整当前页 `items`,就默认展示当前页全部记录明细。若只能可靠读取部分 `items`,展示已可靠读取的记录并提示“输出较大,本次仅展示可可靠读取的记录,完整数据需继续分页/缩小范围”。禁止只抽取总数后丢弃 `items`。若无法可靠读取固定 JSON 或任何完整记录,才说明输出被截断、无法可靠列出明细;禁止基于零散预览补全名单、字段或统计。
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
- 多字段变化标注明细必须逐项输出用户点名维度,至少包含原值、新值、是否变化;常见维度包括职务、序列、职级、人员类型、工作地点。若用户要求异动原因和是否调薪,必须展示运行时原因字段与 `is_adjust_salary`,缺失时写"未返回",不能整列省略。
|
|
35
35
|
- 合同/试用期/司龄/协议标签类输出必须包含运行时可返回的原/新字段:合同公司、合同类型、合同编号、开始/预计结束日期、签订/期限类型;试用期预计结束日期;"异动后有新试用期"必须包含"是否有试用期"并仅 true 算命中;司龄起算日期;属地协议标签。缺字段时说明缺失。
|
|
36
36
|
- 用户要求展示合同/试用期变更信息时,不能只写"包含合同变更/包含试用期变更";必须展示具体返回值,未返回则逐项写未返回。
|
|
37
|
-
- 简单时间范围查询返回 `has_more=true`
|
|
37
|
+
- 简单时间范围查询返回 `has_more=true` 时,若用户未明确要求翻页/全部/完整列表,只展示 `page_size=20` 的当前页并说明 `total`/`has_more`/`page_size`。用户明确要求全部且未显式指定 page size 时,从首请求开始使用 `page_size=100`,最多先返回/聚合 200 条后询问是否继续。用户明确要求统计、汇总、分组、数量且未显式指定 page size 时同样使用 `page_size=100`,最多先按 `page_token` 有界分页聚合 200 条;仍有更多时必须标注部分统计。
|
|
38
38
|
- 非空结果只能使用 CLI 返回字段渲染人员、日期、部门、地点、状态、类型、原因等;字段缺失时写“未返回”,不得补全。
|
|
39
39
|
- 空结果、能力边界、多匹配澄清使用本文模板。
|
|
40
40
|
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
- 若 `+job-change-search` 返回非空,改写为记录数量 + 当前页全部记录明细;输出被截断时只展示可可靠读取的完整记录,并说明不是全量明细。凡展示记录明细,是否逐条包含姓名、工号、头像、生效日期、异动类型、异动状态;用户点名字段是否只做追加而未替换基础字段?
|
|
62
62
|
- 非空查询最终答案必须同时包含三类信息:接口返回总数、分页状态(是否还有更多/分页标记是否返回)、异动详细记录。缺任一项都不能交付;若接口未返回总数或分页标记,必须明确写“接口未返回总数/分页标记未返回”。
|
|
63
63
|
- 若答案里出现“总数/共有/一共”,必须确认该数字来自 `data.total`;否则改写为“本页返回 N 条”或“已聚合 N 条”,并说明接口未返回总数。
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
64
|
+
- 若用户未明确要求翻页/全部/完整列表/继续翻页,且问题不依赖完整数据,不能自动翻页;使用 `page_size=20`,改写为当前页数量 + 当前页记录明细 + `total`/`has_more`/`page_size`。
|
|
65
|
+
- 若用户目标需要统计/汇总/分组/数量/有哪些/都去了哪些,未显式指定 page size 时从首请求开始使用 `page_size=100`,最多先按 `page_token` 处理前 200 条;若仍有更多,必须标注部分统计并询问是否继续。若分页失败,输出不可完成原因而不是首屏结论。
|
|
66
|
+
- 若是普通明细类“所有/全部”,未显式指定 page size 时从首请求开始使用 `page_size=100`,最多先返回 200 条;若仍有更多,说明仍有更多分页未展示并询问是否继续。
|
|
67
67
|
- 若最后一次 `+job-change-search` 返回空,改写为空结果模板。
|
|
68
68
|
- 若最后一次 `+job-change-search` 报错,改写为运行时搜索失败模板;不要继续调试、改参重试、查源码/配置/版本或切换二进制路径。
|
|
69
69
|
- 若命令链只有 `search-option`、`help` 或 `schema`,不能交付业务结果;继续执行最终 search,或在必需条件无法解析时输出不可完成原因。
|
|
@@ -163,7 +163,7 @@ CLI 返回 `data.items` 为空或 `total=0` 时,使用以下模板之一:
|
|
|
163
163
|
| 返回字段不足 | 基于 `system_columns` 最多补查一次;"为什么/原因"展示异动原因字段 | 反复试 `--help`、nested path 或相近字段到超时 |
|
|
164
164
|
| 搜索命令报错 | 输出运行时搜索失败模板和已执行条件 | 查源码、配置、版本、二进制路径或继续改参 |
|
|
165
165
|
| 第一人称 | 先判断是否需要解析当前用户 | 直接传 `query_name="我"` |
|
|
166
|
-
| `page_size`
|
|
166
|
+
| `page_size` | 有效范围 `20–100`;显式指定范围内的值原样使用,否则普通查询默认 `20`、全量模式固定 `100` | 写死为其它值、未显式指定时全量模式仍使用默认 `20` 或传出范围 |
|
|
167
167
|
| `status` 使用 | 纯生效日期查询不追加状态;“已生效/生效的异动”追加首步 `search-option` 校准后的已生效状态 | 生效日期查询默认追加状态、漏掉“生效的异动”状态、只取首个匹配或写死单一状态 |
|
|
168
168
|
| 最终答案 | 执行最终搜索后输出结果正文 | 输出推理过程、计划、命令建议、runner JSON |
|
|
169
169
|
| 最后命令 | 以最后一次 `+job-change-search` 结果生成记录数/空结果 | 搜索已执行却返回旧的探索句 |
|
|
@@ -188,7 +188,7 @@ CLI 返回 `data.items` 为空或 `total=0` 时,使用以下模板之一:
|
|
|
188
188
|
- [ ] 异动类型/原因是否已通过 `search-option` 校准后写入 `--dynamic-filters`,且没有混用?
|
|
189
189
|
- [ ] 是否已把 `details_of_job_status_change` 当作门禁检查:筛"发生某字段变更/异动到/调入调出/从 X 到 Y/转为/同步变"时已追加对应 value;仅要求"是否变更"输出标注时未误加过滤?
|
|
190
190
|
- [ ] 用户要求多个维度是否变化/标注原因/是否调薪时,`--select-fields` 是否已包含每个维度的 original/target 字段、原因字段和 `is_adjust_salary`?
|
|
191
|
-
- [ ]
|
|
191
|
+
- [ ] 是否已添加有效范围为 `20–100` 的 `page_size`(用户未显式指定时,普通查询默认 `20`、全量模式固定 `100`),且已区分“生效日期”与“已生效/生效的异动”状态语义?
|
|
192
192
|
- [ ] 相对时间结束日期是否为当前日期?
|
|
193
193
|
- [ ] `filter_str` 所有字段值是否都是数组?
|
|
194
194
|
- [ ] 返回记录是否与筛选条件一致,是否需要去重?
|
|
@@ -198,8 +198,8 @@ CLI 返回 `data.items` 为空或 `total=0` 时,使用以下模板之一:
|
|
|
198
198
|
- [ ] 若输出“总数/共有/一共”,数字是否来自 `data.total`,且没有把本页数量、样例数量、已聚合数量当总数?
|
|
199
199
|
- [ ] 非空查询最终答案是否同时包含接口返回总数、分页状态(是否还有更多/分页标记是否返回)和异动详细记录?
|
|
200
200
|
- [ ] 若用户未明确要求翻页/全部/完整列表/继续翻页,是否未自动翻页,并已说明 `total`、`has_more`、`page_size`?
|
|
201
|
-
- [ ]
|
|
202
|
-
- [ ]
|
|
201
|
+
- [ ] 若用户要求全部/完整列表且未显式指定 page size,是否从首请求开始使用 `page_size=100`、最多先返回或聚合 200 条;仍有更多时是否询问继续?
|
|
202
|
+
- [ ] 若用户要求有哪些/都去了哪些/汇总/统计/数量/分组且未显式指定 page size,是否从首请求开始使用 `page_size=100`、最多先处理前 200 条;仍有更多时是否说明部分统计不代表全量并询问继续?
|
|
203
203
|
- [ ] 是否只按固定 JSON 对象读取 `data.items[]`、`data.has_more`、`data.page_token`、`data.total`?
|
|
204
204
|
- [ ] 最终 search 是否没有用 `--jq` 裁剪明细;如用了 `--jq`,是否保留完整原始 `items` 而不是只保留 meta/groups?
|
|
205
205
|
- [ ] 若字段不足、搜索报错或分页失败,是否输出结构化不可完成原因,而不是首屏业务结论?
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
|
|
30
30
|
1. 先从 `search-option` 校准 A、B 各自的运行时合法 value(不要用"X变更"等带后缀的字符串)。
|
|
31
31
|
2. 只有多个条件都属于 `details_of_job_status_change` 变更内容时才分支;普通字段/自定义字段取值 + 一个变更内容发生,直接放在同一次 `--dynamic-filters` 数组里表达 AND,不要拆两支。需要分支时按语义组建分支:普通单项变更每组 1 个 value;合同组固定用父节点 `contract`,不要展开合同子项;试用期等集合型变更按运行时父节点优先。保持日期、部门、员工、状态、原因等其它筛选条件**完全一致**,分别搜索每个语义组;不要把组内每个子项拆成独立分支,也不要为了提取 ID 重跑同一分支。
|
|
32
|
-
3. 保守交集优先:用户未明确要求完整列表/继续翻页时,默认只用每个分支当前页 `items`
|
|
32
|
+
3. 保守交集优先:用户未明确要求完整列表/继续翻页时,默认只用每个分支当前页 `items` 求交集,不主动翻页,避免大输出截断后编造。只有用户明确要求全部,才在未显式指定 page size 时从每个分支首请求开始使用 `--page-size 100`,按 `page_token` 有界翻页,最多 200 条;若从既有分页结果继续,则保持该结果首次查询的 page size。
|
|
33
33
|
4. 只读每个分支原始 JSON 响应里的 `data.items[].job_change_id` 取交集;缺失 `job_change_id` 时用 `wk_id` 作为兜底稳定键。禁止对最终搜索结果使用管道、`python3`、`grep`、`head`、`wc`、临时文件或静默重跑来提取 ID。
|
|
34
|
-
5.
|
|
34
|
+
5. 分支搜索遵守分页上限:未显式指定 page size 的全量模式下,每个分支使用 `--page-size 100`、最多先聚合 200 条;任一分支仍有 `has_more=true` 时,交集结果只能标为已聚合范围内的部分口径,并询问是否继续。
|
|
35
35
|
6. 答案里的"同时发生"数量写"当前页交集命中 N 条/已聚合交集 N 条",**禁止**使用任一分支或单次 OR 查询的 `data.total` 作为"同时发生"的总数。若当前页交集为空但任一分支 `has_more=true`,禁止回答"没有符合条件";只能写"当前已返回记录内未发现交集,但仍有更多记录,不能确认全量为空",并给出各分支 `data.total`、本页数量和 `has_more`。
|
|
36
36
|
7. 分支搜索完成后必须输出最终交集结果和明细;如果已拿到两个分支的 `items`,下一步只能在回答逻辑中求交集并回答,不能再读 `search-option`、写脚本、查字段、管道加工或重跑同一分支。
|
|
37
37
|
8. 三个及以上变更内容同样按上述方式逐个搜索后取多集合交集;变更内容个数过多导致总搜索次数会超过分页预算时,提前说明无法在单次会话内完成并请求用户缩小变更项范围。
|
|
@@ -114,9 +114,9 @@
|
|
|
114
114
|
- **最终结论**(一句话回答用户问题数量/名单/分组结果)。
|
|
115
115
|
- **聚合表**:按用户要求的每个维度各出一张表;状态分布单独成表,异动类型分布单独成表,目标部门分布单独成表。
|
|
116
116
|
- **数据口径**:列出已执行查询条件(时间、部门字段方向、状态集合、变更字段、是否使用了自定义字段)。
|
|
117
|
-
- **完整性说明**:写明每个分支的 `data.total`、本页/已聚合数量、`has_more
|
|
117
|
+
- **完整性说明**:写明每个分支的 `data.total`、本页/已聚合数量、`has_more`;未显式指定 page size 的全量模式从每个分支首请求开始使用 `--page-size 100`,任一分支聚合到 200 条仍 `has_more=true` 时标"前 200 条的部分统计/部分口径"并询问是否继续。
|
|
118
118
|
|
|
119
|
-
多状态全景执行模式:对"已生效/审批中/已撤销/已拒绝"等多个状态分桶,必须**对每个状态各发一次** `+job-change-search
|
|
119
|
+
多状态全景执行模式:对"已生效/审批中/已撤销/已拒绝"等多个状态分桶,必须**对每个状态各发一次** `+job-change-search`(其它条件相同);未显式指定 page size 时,每个状态首请求使用 `--page-size 100`,分别记录 `data.total`,再合并出表。一次无 status 搜索 + 客户端分桶**不可代替**,因为单次最多聚合 200 条不能覆盖每个状态真实的 `total`。
|
|
120
120
|
|
|
121
121
|
## 按异动类型分类
|
|
122
122
|
|
|
@@ -167,13 +167,13 @@
|
|
|
167
167
|
```bash
|
|
168
168
|
# 按异动记录 ID 查询,并返回工作地点变化字段
|
|
169
169
|
people-cli corehr +job-change-search \
|
|
170
|
-
--params '{"page_size":
|
|
170
|
+
--params '{"page_size":20,"department_id_type":"people_corehr_department_id"}' \
|
|
171
171
|
--data '{"filter_str":"{\"wk_id\":[\"<JOB_CHANGE_ID>\"]}","select_fields":["status","effective_date","original_work_location","target_work_location"]}' \
|
|
172
172
|
--as user
|
|
173
173
|
|
|
174
174
|
# 查询本月按生效日期命中的异动
|
|
175
175
|
people-cli corehr +job-change-search \
|
|
176
|
-
--page-size
|
|
176
|
+
--page-size 20 \
|
|
177
177
|
--effective-date-start '<DATE_START>' \
|
|
178
178
|
--effective-date-end '<DATE_END>' \
|
|
179
179
|
--select-fields '["status","effective_date","transform_type","transform_reason","original_department","target_department"]' \
|
|
@@ -181,14 +181,14 @@ people-cli corehr +job-change-search \
|
|
|
181
181
|
|
|
182
182
|
# 按目标部门名称筛选,名称由 --lookup-filters 内部解析
|
|
183
183
|
people-cli corehr +job-change-search \
|
|
184
|
-
--page-size
|
|
184
|
+
--page-size 20 \
|
|
185
185
|
--lookup-filters '[{"field_name":"target_department","target_object_api_name":"department","values":["<DEPARTMENT_NAME>"]}]' \
|
|
186
186
|
--select-fields '["status","effective_date","original_department","target_department"]' \
|
|
187
187
|
--as user
|
|
188
188
|
|
|
189
189
|
# 分页仅在用户明确要求继续时作为新的查询轮次
|
|
190
190
|
people-cli corehr +job-change-search \
|
|
191
|
-
--page-size
|
|
191
|
+
--page-size 20 \
|
|
192
192
|
--page-token '<PAGE_TOKEN>' \
|
|
193
193
|
--select-fields '["status","effective_date","original_department","target_department"]' \
|
|
194
194
|
--as user
|
package/skills/people-cli/references/people-corehr-job-change/references/people-job-change-search.md
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
| 变更内容门禁 | 凡是筛"发生某字段变更/调入调出/异动到/从 X 到 Y/转为/同步变"都判断并追加对应 `details_of_job_status_change`;只做"是否变更"输出标注时不追加 | search |
|
|
28
28
|
| 自定义筛选字段 | 只校准当前字段是否在 `system_filters` | `--dynamic-filters` 后 search |
|
|
29
29
|
| 自定义返回字段 | 只校准当前字段是否在 `system_columns` | `--select-field-names` 后 search |
|
|
30
|
-
| 都去了哪些/汇总/统计/数量/分组 | search
|
|
30
|
+
| 都去了哪些/汇总/统计/数量/分组 | search 带必要返回字段,未显式指定 page size 时使用 `--page-size 100`;最多先按 `page_token` 聚合 200 条 | 输出部分或完整聚合结果;若仍有更多,询问是否继续 |
|
|
31
31
|
|
|
32
32
|
## Field Mapping
|
|
33
33
|
|
|
@@ -89,10 +89,10 @@
|
|
|
89
89
|
- 若接口未返回 `data.total`,写“接口未返回总数”;此时只能说明本页数量或已聚合数量。
|
|
90
90
|
|
|
91
91
|
分页策略:
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
- 用户明确说继续时,再按下一批最多 200
|
|
92
|
+
- 用户没有明确指定需要翻页、全部、完整列表、继续翻页,且问题不依赖完整数据时,不翻页;使用 `--page-size 20` 返回当前页,并说明 `total`、`has_more`、`page_size` 和本页数量。
|
|
93
|
+
- 用户要求全部信息且未显式指定 page size 时,从首请求开始使用 `--page-size 100`,默认最多返回/聚合 200 条;若 `has_more=true`,说明仍有更多并询问是否继续,不要无限翻到 `has_more=false`。
|
|
94
|
+
- 汇总类问题(有哪些、都去了哪些、汇总、统计、数量、分组)属于全量准确场景,未显式指定 page size 时从首请求开始使用 `--page-size 100`,最多先处理前 200 条;若仍有更多,必须说明这是前 200 条的部分统计,不代表全量,并询问是否继续。
|
|
95
|
+
- 用户明确说继续时,再按下一批最多 200 条继续;后续页只追加返回的 `page_token`,并保持首次查询的 page size、日期、筛选条件和返回字段不变。
|
|
96
96
|
- 任一页请求失败、`has_more=true` 但缺 `data.page_token`、或 JSON 解析异常时,输出结构化不可完成原因,不得调 `help` / `schema`、写临时脚本或反复重试到超时。
|
|
97
97
|
|
|
98
98
|
聚合规则:
|
|
@@ -112,7 +112,7 @@ people-cli corehr job_change search-option --as user
|
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
114
|
people-cli corehr +job-change-search \
|
|
115
|
-
--page-size
|
|
115
|
+
--page-size 20 \
|
|
116
116
|
--format json \
|
|
117
117
|
--effective-date-start '<DATE_START>' \
|
|
118
118
|
--effective-date-end '<DATE_END>' \
|
|
@@ -124,7 +124,7 @@ people-cli corehr +job-change-search \
|
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
126
|
people-cli corehr +job-change-search \
|
|
127
|
-
--page-size
|
|
127
|
+
--page-size 20 \
|
|
128
128
|
--format json \
|
|
129
129
|
--lookup-filters '[{"field_name":"target_department","values":["<DEPARTMENT_NAME>"]}]' \
|
|
130
130
|
--as user
|
|
@@ -134,7 +134,7 @@ people-cli corehr +job-change-search \
|
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
136
|
people-cli corehr +job-change-search \
|
|
137
|
-
--page-size
|
|
137
|
+
--page-size 20 \
|
|
138
138
|
--format json \
|
|
139
139
|
--lookup-filters '[{"field_name":"employment.department","values":["<DEPARTMENT_NAME>"]}]' \
|
|
140
140
|
--as user
|
|
@@ -144,7 +144,7 @@ people-cli corehr +job-change-search \
|
|
|
144
144
|
|
|
145
145
|
```bash
|
|
146
146
|
people-cli corehr +job-change-search \
|
|
147
|
-
--page-size
|
|
147
|
+
--page-size 20 \
|
|
148
148
|
--format json \
|
|
149
149
|
--lookup-filters '[{"field_name":"employment","values":["<EMPLOYEE_NAME>"]}]' \
|
|
150
150
|
--as user
|
|
@@ -154,7 +154,7 @@ people-cli corehr +job-change-search \
|
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
156
|
people-cli corehr +job-change-search \
|
|
157
|
-
--page-size
|
|
157
|
+
--page-size 20 \
|
|
158
158
|
--format json \
|
|
159
159
|
--lookup-filters '[{"field_name":"<JOB_CHANGE_FIELD_API_NAME>","values":["<OBJECT_NAME>"]}]' \
|
|
160
160
|
--as user
|
|
@@ -164,7 +164,7 @@ people-cli corehr +job-change-search \
|
|
|
164
164
|
|
|
165
165
|
```bash
|
|
166
166
|
people-cli corehr +job-change-search \
|
|
167
|
-
--page-size
|
|
167
|
+
--page-size 20 \
|
|
168
168
|
--format json \
|
|
169
169
|
--select-field-names '["<SUPPORTED_FIELD_NAME>"]' \
|
|
170
170
|
--as user
|
|
@@ -174,7 +174,7 @@ people-cli corehr +job-change-search \
|
|
|
174
174
|
|
|
175
175
|
```bash
|
|
176
176
|
people-cli corehr +job-change-search \
|
|
177
|
-
--page-size
|
|
177
|
+
--page-size 20 \
|
|
178
178
|
--format json \
|
|
179
179
|
--dynamic-filters '[{"field_name":"details_of_job_status_change","values":["<运行时合法变更内容枚举值>"]}]' \
|
|
180
180
|
--select-fields '["effective_date","status","transform_type","original_job_family","target_job_family","original_direct_manager","target_direct_manager"]' \
|
|
@@ -185,7 +185,7 @@ people-cli corehr +job-change-search \
|
|
|
185
185
|
|
|
186
186
|
```bash
|
|
187
187
|
people-cli corehr +job-change-search \
|
|
188
|
-
--page-size
|
|
188
|
+
--page-size 20 \
|
|
189
189
|
--format json \
|
|
190
190
|
--dynamic-filters '[{"field_name":"<FIELD_API_NAME>","values":["<候选1>","<候选2>","<候选N>"]},{"field_name":"details_of_job_status_change","values":["<运行时合法变更内容枚举值>"]}]' \
|
|
191
191
|
--select-field-names '["<字段展示名>"]' \
|
|
@@ -195,7 +195,7 @@ people-cli corehr +job-change-search \
|
|
|
195
195
|
|
|
196
196
|
## Constraints
|
|
197
197
|
|
|
198
|
-
-
|
|
198
|
+
- `--page-size` 有效范围为 `20–100`;用户显式指定范围内的值时原样使用,否则普通查询默认 `20`,全量模式固定使用最大值 `100`。
|
|
199
199
|
- 单次用户请求最多返回/聚合 200 条;用户明确继续时,再取下一批最多 200 条。
|
|
200
200
|
- 最终 search 必须加 `--format json`,只读取 `data.items[]`、`data.has_more`、`data.page_token`、`data.total`;不要用 `--jq` 裁掉原始 `items`,需要元信息时也必须保留 `items:.data.items`。
|
|
201
201
|
- 不传 `--user-id-type open_id`;保持默认 `people_corehr_id`。
|
|
@@ -206,8 +206,8 @@ people-cli corehr +job-change-search \
|
|
|
206
206
|
- 用户问"涉及 X 变更"时,若 `search-option` 暴露"异动变更内容"筛选项,必须先用该枚举筛选,再用 `--select-fields` 返回对应 original/target 字段;不要先拉全量后本地判断是否变更。异动类型/状态/原因/自定义字段等普通筛选 + 一个变更内容发生,可在同一次 `--dynamic-filters` 数组内表达 AND;只有多个条件都属于 `details_of_job_status_change` 变更内容时,才按每个语义组分别搜索后按 `job_change_id` 取交集。
|
|
207
207
|
- 用户问“字段有值/不为空”时,如果该字段在 `search-option` 中有枚举候选,用全量候选表达“有值”;如果没有候选或非空操作符,不要用 `"有值"` 猜测,按无法安全表达处理。
|
|
208
208
|
- 所有 raw `filter_str` 字段值必须是数组,日期区间字段除外。
|
|
209
|
-
- 翻页只能使用返回的 `page_token
|
|
210
|
-
-
|
|
209
|
+
- 翻页只能使用返回的 `page_token`;不要在首屏后临时调大 page size、重复首屏查询、`grep/head` 或判断 NDJSON 来模拟解析/翻页。
|
|
210
|
+
- 用户问“有哪些/都去了哪些/汇总/统计/数量/分组”且未显式指定 page size 时,首请求使用 `--page-size 100`;若返回 `has_more=true` 或 `page_token`,最多先处理前 200 条。分页失败时输出不可完成原因,不得把首屏当完整答案。
|
|
211
211
|
- 部门、lookup、枚举多候选时必须澄清;必需条件失败时不执行宽搜。最终搜索报错时直接按不可用结果回答,不在同一 case 内调 help/schema 或反复改参调试。`search-option` / `--help` 只用于校准或解析,不得作为终点;最终答案必须来自最后一次真实 `+job-change-search` 或等价搜索结果。
|
|
212
212
|
|
|
213
213
|
## Output
|
|
@@ -20,7 +20,7 @@ metadata:
|
|
|
20
20
|
- 主业务查询只能用:`people-cli corehr +offboarding-search --as user`,禁止编造数据和模拟查询。
|
|
21
21
|
- 每次查询前必须先调用一次 `people-cli corehr offboarding search-option --as user --jq '<single bounded jq object>'` 获取本题需要的字段与筛选项元数据(system_filters / system_columns),用于确认 canonical key、筛选项是否存在、候选展示名;它不是业务结果,最多调用一次,不能进入 final。`--jq` 必须在一个对象里同时裁剪本题需要的 filters、columns 与枚举候选,具体模板见 [search-option](references/people-corehr-offboarding-search-option.md) 第 2 节;禁止无 `--jq` 调用、禁止输出完整元数据、禁止为补字段第二次调用。
|
|
22
22
|
- 只允许 `--as user`;禁止 `--as bot`、禁止主动 auth login、禁止 MCP、禁止把飞书文档操作混入主流程。若必须操作飞书文档,只能用 `lark-cli`。
|
|
23
|
-
- 参数硬约束:每次业务查询(含重试和分页)的 `--params` 都必须显式包含 `"page_size":"
|
|
23
|
+
- 参数硬约束:每次业务查询(含重试和分页)的 `--params` 都必须显式包含 `"page_size":"<PAGE_SIZE>"`、`"user_id_type":"people_corehr_id"`、`"department_id_type":"people_corehr_department_id"`。`PAGE_SIZE` 的有效范围是 `20–100`,按以下优先级确定:用户显式指定范围内的值时原样使用;否则,用户明确要求“所有/全部/全量/完整列表/都列出来/拉完”,或当前任务按规则必须遍历完整结果才能准确计算时,固定用最大值 `100`;其它查询固定用 `20`。默认基础形态为 `--params '{"page_size":"20","user_id_type":"people_corehr_id","department_id_type":"people_corehr_department_id"}'`,全量基础形态为 `--params '{"page_size":"100","user_id_type":"people_corehr_id","department_id_type":"people_corehr_department_id"}'`。分页时只追加 `page_token`,并保持首次查询的 `page_size`、ID 类型、筛选条件和返回字段不变。`--search-filter-by-name` 必须是 JSON 对象;`--select-fields` 必须是 JSON 数组,基线固定为 `["status","offboarding_date","expected_offboarding_date","employment","employment.employee_number"]`,禁止传 CSV 或散乱字符串;所有名单/标准查询都从该基线追加目标字段;完成时间类最小字段见 [search](references/people-corehr-offboarding-search.md) 第 2 节。
|
|
24
24
|
- 执行前自检:`search-option` 与业务命令若包含 shell 管道、`2>&1`、`head`、`tail`、`grep`、`python`、临时文件、输出重定向、自然语言注释或 `--help`,必须丢弃并重写为裸 `people-cli` 调用;分页命令也必须保持裸 JSON 参数,不得用截断输出拼 final。
|
|
25
25
|
- 跨平台命令规则:所有代码块换行仅用于阅读;真实执行时必须作为一条裸 `people-cli` 命令传递参数,不使用 Bash `\`、PowerShell反引号、CMD `^` 续行,也不套 `sh -c` / `powershell -Command`。JSON 与 jq 表达式各自作为单个参数传入,避免由 shell 二次解析。
|
|
26
26
|
- `search-option` 调用约束:命令固定为 `people-cli corehr offboarding search-option --as user --jq '<single bounded jq object>'`,禁止臆造 `--fields/--field` 等参数。`--jq` 必须先按 [search-option](references/people-corehr-offboarding-search-option.md) 第 2 节的固定 alias 逻辑从完整 query 生成 `alias_fields`,再只保留本题需要的字段、候选与返回列;不得跳过 alias 映射仅凭模型猜 canonical field。query 必须做 JSON string escaping,关键词正则必须来自已归一的业务语义/同义词并转义正则元字符,禁止直接拼入未经处理的用户原文。档案字段失败最多一次同 canonical key 原文/完整展示值重试,之后必须非空收口。
|
|
@@ -38,7 +38,7 @@ metadata:
|
|
|
38
38
|
6. 若一次入口调用未产生任何真实业务命令,或只停在读文件/理解 skill/候选探索,立即补齐第二步 `+offboarding-search`(模板见 [search](references/people-corehr-offboarding-search.md) 第 1 节);仍失败才输出工具错误。
|
|
39
39
|
7. 不写死租户元数据:不记录具体组织、人员、公司、地点、枚举候选、原因候选、自定义字段展示名或评测答案;只写通用语义规则和运行时解析算法。
|
|
40
40
|
8. 组织核心词抽取先于候选解析:去掉"我所在的/我管理的/我支持的/我负责的"等权限前缀,仅剥离"大部门/部门/团队/组织"等通用尾词,不写死任何组织别名;若剥离后为空或只剩泛称,不构造 `employment.department`,也不得自行扩散到相似子组织/实验室/项目组候选。第二步业务命令必须继承已确认的组织归一值,禁止追加 `head/tail/grep/python`。部门多候选时只围绕 `employment.department` 同字段精确候选确认或收口,不得改成相似子组织;重试必须保留日期、状态等全部主条件。
|
|
41
|
-
9. 筛选字段决策树:先用 search-option 确认 canonical field 在 `system_filters` 还是 `system_columns`。**只要用户对该字段提出筛选条件,且该字段存在于 `system_filters`,必须构造 `--search-filter-by-name`,并把同一个 canonical field 追加到 `--select-fields` 供结果回显;不得忽略该字段后改成本地过滤/排序。比较、范围、枚举、多值也先按同一 field 进入 `--search-filter-by-name`,失败后只允许同字段修正一次或字段未生效收口。** 服务端筛选已经成功返回的记录不得因为部分行未返回目标字段展示值而被过滤掉,final 中保留该记录并把该列写成“字段未返回”。只有字段不在 `system_filters`、但在 `system_columns` 可展示时,才允许不写入 filter,把该字段加入 `select-fields`,先按其它主条件查出完整可分页数据,再基于返回 display/code 做本地过滤或排序;columns-only 本地过滤时,目标字段缺失的记录不能被判定为命中,但也不能用主范围 total 冒充目标结果。若字段同时不在 filters 和 columns,或全部返回值只有 wk_id/内部 id、display 缺失且没有 applied/resolved filter 证明,立即字段未生效,不得继续多轮探查或用主范围 total 冒充目标结果。本地过滤/排序完成后,final
|
|
41
|
+
9. 筛选字段决策树:先用 search-option 确认 canonical field 在 `system_filters` 还是 `system_columns`。**只要用户对该字段提出筛选条件,且该字段存在于 `system_filters`,必须构造 `--search-filter-by-name`,并把同一个 canonical field 追加到 `--select-fields` 供结果回显;不得忽略该字段后改成本地过滤/排序。比较、范围、枚举、多值也先按同一 field 进入 `--search-filter-by-name`,失败后只允许同字段修正一次或字段未生效收口。** 服务端筛选已经成功返回的记录不得因为部分行未返回目标字段展示值而被过滤掉,final 中保留该记录并把该列写成“字段未返回”。只有字段不在 `system_filters`、但在 `system_columns` 可展示时,才允许不写入 filter,把该字段加入 `select-fields`,先按其它主条件查出完整可分页数据,再基于返回 display/code 做本地过滤或排序;columns-only 本地过滤时,目标字段缺失的记录不能被判定为命中,但也不能用主范围 total 冒充目标结果。若字段同时不在 filters 和 columns,或全部返回值只有 wk_id/内部 id、display 缺失且没有 applied/resolved filter 证明,立即字段未生效,不得继续多轮探查或用主范围 total 冒充目标结果。本地过滤/排序完成后,final 必须逐条展示命中记录的离职字段与对应值详情(姓名、工号、离职日期、期望离职日期、离职申请状态及全部筛选字段的实际值);普通查询默认最多展示 CLI 返回顺序前 10 条,明确要求所有数据时最多展示 1000 条,禁止只聚合成总结/数量结论后直接返回。
|
|
42
42
|
|
|
43
43
|
## 2. 执行模板
|
|
44
44
|
|
|
@@ -48,8 +48,8 @@ metadata:
|
|
|
48
48
|
- `select-fields` 必须以 JSON 数组 `[]` 传参,按“基线字段 + 全部查询条件 canonical field + 用户要求的展示字段”做去重并集。基线固定为 `["status","offboarding_date","expected_offboarding_date","employment","employment.employee_number"]`,不得传 CSV 或散乱字符串;部门、日期、状态、原因、员工方向等凡参与 `--search-filter-by-name` 的 field 都必须追加,不能只追加所谓目标字段。`--search-filter-by-id` 使用 native ID key 时,追加其在 search-option 中对应的 canonical 展示字段,例如 `department_ids -> employment.department`、`employment_ids -> employment`;不得把 `department_ids/employment_ids` 这类传输 key 当 select field。另按需追加标注字段、`minor_reason`、`initiator_id`、`apply_finish_time`、`checklist_*`、`non_compete` 或对应 `employment.<field>`。
|
|
49
49
|
- 发起/申请/流转/单人进度场景必须补齐展示字段:姓名、工号、`offboarding_date`、`expected_offboarding_date`、离职申请 `status`,并按口径补 `initiating_time/apply_date/apply_finish_time/checklist_status/checklist_start_time/checklist_finish_time/initiator_id`;发起类固定明细顺序为姓名、工号、离职日期、期望离职日期、离职申请状态、发起时间,不得只展示姓名和状态。单人“离职进度/状态”默认以离职申请 `status` 为进度,只有用户说“流程/流转/交接进度”才追加 checklist 字段。
|
|
50
50
|
- 档案字段筛选必须 select 目标字段与 `expected_offboarding_date`;职务/序列/员工方向/地点/人员类型/子类型/职级/合同主体/任职公司/合同状态等服务端筛选成功后,部分记录未展示目标字段或只展示内部 id 时仍保留该记录,目标字段列写“字段未返回/仅返回内部 id”。只有完全无法证明服务端 filter 生效,或 columns-only 本地过滤无法读取目标字段时,才按字段未生效收口。用户说“具有/带有某字段信息”但未给具体字段值时,该字段只是展示字段,不构造空值、exists、通配符或“有”过滤;展示字段缺失的记录仍展示并标记“字段未返回”。
|
|
51
|
-
-
|
|
52
|
-
-
|
|
51
|
+
- 统计/名单查询的 `page_size` 有效范围为 `20–100`。用户未指定 page size 时,普通查询固定用 `20`;用户明确要求所有数据,或比较、派生、复合统计、columns-only 后处理等按规则必须遍历完整结果时,首请求固定用 `100`,后续页保持 `100` 并按 CLI 返回的翻页 token/下一页参数继续。普通名单默认只展示首批最多 10 条,不为扩大展示量自动翻页;全量名单循环到 `has_more=false` 或达到现有 1000 条展示上限,其它完整数据任务循环到各场景既有终止条件。不能翻完时只可输出派生待确认/工具错误,写明已处理 M 条,禁止输出最终 K。后台 `has_more` 仅用于决定是否继续取数,不得直接当作用户侧“是否已展示全部”的结论。
|
|
52
|
+
- 名单类输出门禁:用户问“有哪些人/名单/同事/人员/记录”但未明确要求所有数据时,默认展示上限为 10 条;用户明确要求“所有/全部/全量/完整列表/都列出来/拉完”时,展示上限为 1000 条,并按 CLI 返回顺序输出。固定字段优先为姓名、工号、离职日期、期望离职日期、离职申请状态以及每个筛选字段的实际值;发起类加发起时间;流转类必须同时列离职申请状态、发起时间、`checklist_status`、`checklist_start_time/checklist_finish_time`,不得把流转状态写成申请状态。只有实际列出的结构化记录数等于 `total` 时才能说“已全部展示”;只要 `total>已展示条数`,无论原始 `has_more` 是 true 还是 false,都必须写“共 N 条,本次展示 M 条,仍有更多记录未展示”;普通名单 M 默认最多 10,全量名单 M 默认最多 1000。禁止在这种情况下用 `has_more=false` 暗示已经完整展示。
|
|
53
53
|
- “主范围中的子条件/其中/离职人员中某字段为某值”属于复合统计:必须执行两条业务查询,先查主范围 total,再查主范围+子条件 total;final 同时输出两者。主范围或子条件若 `has_more=true`,不能用当前页 items 数、截断片段、样例数或过滤页局部 total 当最终总量;若只完成子条件查询,必须说明缺少主范围 total,不得把子条件 total 当全量;若字段/applied filter 无法确认,用字段未生效/工具错误收口。
|
|
54
54
|
- “离职人员中/其中/其中字段为”即使子条件查询已成功,也必须补主范围 A;A 必须来自稳定 `total` 或翻页到 `has_more=false`,不能用当前页 10/items 数。final 固定写 `主范围 total=A;其中 ... total=B`;若 A 取不到或后台分页无法翻完,必须写“子条件 total=B;主范围 total 无法稳定确认,未完成复合统计”,禁止向用户回显 raw `has_more`、声明错误 A 或只答 B。
|
|
55
55
|
- 若用户只是问“某范围中字段为某值的有哪些”,目标查询成功后可直接输出子条件 total 与明细;不要为了补主范围再执行仅部门主范围查询覆盖目标结果。只有用户明确问“其中/占比/主范围共有多少”时才补主范围。
|
|
@@ -123,7 +123,7 @@ Owner 切分:本矩阵只负责把用户语义路由到 canonical key。候选
|
|
|
123
123
|
字段组合规则:同一 `--search-filter-by-name` 对象内不同 key 是 AND;同一 key 的数组值表示该字段 OR/多值候选,不要拆多次查询后手工并集,除非 CLI 明确不支持数组且必须说明口径。
|
|
124
124
|
计数口径:默认报告 `+offboarding-search` 返回的离职单据 `total`。除非用户明确问“去重人数/多少个人”,不要按员工去重覆盖 total;如需补充去重,只能作为附加说明。
|
|
125
125
|
字段语义锁定:已确定的部门、人员、状态、日期、自定义字段和档案字段都是主条件;任何候选归一、字段修正或重试必须继承全部主条件,只替换出错字段的 key/value,不得丢日期、不改人员为部门全量、不把合同主体和任职公司互换。
|
|
126
|
-
字段展示值门禁:P1/P2 字段命中答案必须能从目标查询的 `select-fields`、items 或 applied/resolved filter 证明字段生效;所有查询条件 field 必须已加入 `select-fields`。若 applied/resolved filter 已证明服务端命中,部分记录的目标字段展示缺失或只返回内部 id/wk_id,不得过滤该记录,明细中标记“字段未返回/仅返回内部 id
|
|
126
|
+
字段展示值门禁:P1/P2 字段命中答案必须能从目标查询的 `select-fields`、items 或 applied/resolved filter 证明字段生效;所有查询条件 field 必须已加入 `select-fields`。若 applied/resolved filter 已证明服务端命中,部分记录的目标字段展示缺失或只返回内部 id/wk_id,不得过滤该记录,明细中标记“字段未返回/仅返回内部 id”。只有完全没有字段生效证明、配置错误、或样例反证目标字段时,才按字段未生效收口。字段可信时,普通查询按默认上限逐条列出最多 10 条明细;明确要求所有数据时最多列出 1000 条。
|
|
127
127
|
枚举/引用计数口径:P1 枚举/引用字段必须以运行时完整展示值或同字段可接受 code 作为过滤值;候选不确定或字段未生效时,不能把主范围 total/样例当成目标字段结果。
|
|
128
128
|
|
|
129
129
|
## 5. 最终输出契约(最高优先级)
|
|
@@ -136,7 +136,7 @@ Owner 切分:本矩阵只负责把用户语义路由到 canonical key。候选
|
|
|
136
136
|
- 不能完成业务查询时不得空答:字段/候选无法确认用“字段未生效”,派生或分页无法稳定完成用“派生待确认”,工具/API/解析失败用“工具错误”,拒答命中则直接用拒答模板;无权限错误始终优先使用“无权限”模板。
|
|
137
137
|
- 高风险字段(`employment.workforce_type/company/service_company/work_location/job_level/job_family/employment_status/direct_manager` 等)必须能由可读 display、applied/resolved filter、或同字段候选证明生效后才输出命中;否则按字段未生效/工具错误收口,不得把主范围 total 或样例当作目标字段结果。
|
|
138
138
|
- final 前必须做结构化自检:状态逐条中文归一且不得泄露 raw enum;工号只能来自 `employment.employee_number`,禁止用 employment_id/wk_id/internal id 冒充,缺失时写“工号缺失”;日期筛选字段的返回值必须落在用户要求的窗口内,样例反证窗口或字段口径时必须重试同字段一次,仍失败按字段未生效/工具错误;P1/P2 目标字段必须能展示目标值或由 applied/resolved filter 证明。若业务结果中只有部分记录缺少某个展示字段,保留这些记录并在对应列写“字段未返回”,不得从明细或 total 中剔除。
|
|
139
|
-
- `total>0`
|
|
139
|
+
- `total>0` 的表格/明细禁止只有表头没有数据行;普通查询默认展示最多 10 条,明确要求所有数据时展示已完整获取的记录、最多 1000 条,且每个筛选字段都要作为明细列展示实际值。任何明细列只能来自本次 `select-fields` 或业务结果真实字段,禁止凭空加“实际离职公司”等未查询字段;若某字段只在部分记录缺失,保留记录并写“字段未返回”;若结构化结果无法抽取姓名/工号/状态/日期,先用基线字段重查一次,仍无法抽取则输出工具错误,不得用空表收口。
|
|
140
140
|
- final 不输出内部执行物:命令文本、trace、工具调用片段、原始 `search-option` 内容、内部候选 ID、未替换占位符。必要的业务 ID 只有在用户明确提供或结果展示需要时才可出现。
|
|
141
141
|
- 展示完整性只能由 `total` 与实际列出的结构化记录数判断,不能由原始 `has_more=false` 判断。`total<=10` 且实际列出 N=`total` 条时写“已展示全部 N 条”;`total>10` 或实际列出 M<`total` 条时写“共 N 条,本次展示 M 条,仍有更多记录未展示”。
|
|
142
142
|
|
|
@@ -161,7 +161,7 @@ Owner 切分:本矩阵只负责把用户语义路由到 canonical key。候选
|
|
|
161
161
|
- 入职不到一年/司龄:
|
|
162
162
|
1. 先执行部门+`status=已离职` 的 `+offboarding-search`,select `status,offboarding_date,expected_offboarding_date,employment,employment.employee_number,employment.effective_time`,禁止只查部门主范围。
|
|
163
163
|
2. 若返回 `has_more=true` 且有 page_token,必须继续翻页到 `has_more=false`;只用 `employment.effective_time` 和实际 `offboarding_date`,任一缺失则该条排除并说明不可比较,不得用期望离职日期替代。
|
|
164
|
-
3. “不到一年”按自然周年:离职日期早于入职日期下一周年才命中;等于或晚于一周年不命中。默认输出去重人员 `total_person`,同时保留离职记录 total
|
|
164
|
+
3. “不到一年”按自然周年:离职日期早于入职日期下一周年才命中;等于或晚于一周年不命中。默认输出去重人员 `total_person`,同时保留离职记录 total;普通查询最多前 10 条按 CLI 返回顺序或明确稳定排序输出,明确要求所有数据时最多输出 1000 条,禁止用“主范围 total - 超过一年数”反推最终 K。
|
|
165
165
|
4. 派生待确认必须绑定真实业务查询的 `total/后台分页状态/已处理 M 条`,不得凭空给 total 或把 page_size 当 total;final 只写已处理数量和是否仍有数据未处理,不回显 raw `has_more`。
|
|
166
166
|
- 实际离职早于/晚于期望离职:先按主条件强制加明确终态 `status` 拉取基线字段 `status,offboarding_date,expected_offboarding_date,employment,employment.employee_number`;若 `has_more=true` 且有 page_token 必须翻页;必须构建结构化命中列表,只从命中列表计数和展示,任一日期缺失则跳过并说明,不得用自然语言记忆、总数减排除数或当前页 K 反推。无法核验已处理数/命中 K 时输出派生待确认。
|
|
167
167
|
- 职级范围(如某级及以上):固定 `employment.job_level`;“离职同学/离职员工/离职人员/哪些人”只是人员/名单展示口径,不自动加 `status`,只有用户明确“已离职/完成离职/离职完成/已完成”才加离职单终态;用户说“离职记录/单据/申请”时保留单据口径;按 [business-knowledge](references/people-corehr-offboarding-business-knowledge.md) 第 1 节判定职级体系并按全序展开,取值用运行时同字段 options 完整展示值校准,一次性数组 OR 目标查询;禁止跨体系混排、先查主范围采样、逐级命名试探或用部分候选收口。成功时固定输出 `total_person` 与离职记录 `total`;失败后字段未生效/字段无匹配,不能输出探索过程。
|
|
@@ -170,7 +170,7 @@ Owner 切分:本矩阵只负责把用户语义路由到 canonical key。候选
|
|
|
170
170
|
## 9. 收尾模板
|
|
171
171
|
|
|
172
172
|
- 命中且全量展示:`已按 <查询口径> 查询,total=N;已展示全部 N 条。明细:<姓名/工号/中文状态/离职日期/期望离职日期/全部筛选字段实际值>。`
|
|
173
|
-
- 命中但截断展示:`已按 <查询口径> 查询,total=N;本次展示 M 条,仍有更多记录未展示。明细:<姓名/工号/中文状态/离职日期/期望离职日期/全部筛选字段实际值>。`
|
|
173
|
+
- 命中但截断展示:`已按 <查询口径> 查询,total=N;本次展示 M 条,仍有更多记录未展示。明细:<姓名/工号/中文状态/离职日期/期望离职日期/全部筛选字段实际值>。` 普通查询默认 `M=min(N,10)`,明确要求所有数据时默认 `M=min(N,1000)`;若工具实际只提供更少结构化记录,M 必须写真实展示数。
|
|
174
174
|
- 空结果:`已按 <查询口径> 查询,total=0;无数据。`
|
|
175
175
|
- 单人进度:`已按 <查询口径> 查询,离职进度为<中文状态/状态分布>,共 N 条记录;<已展示全部 N 条/本次展示 M 条,仍有更多记录未展示>。明细:<每条的姓名/工号/中文状态/离职日期/期望离职日期/筛选字段实际值>。` 若 N>0 必须列出记录,禁止空表;状态不一致时写状态分布,不强行合成单一状态。
|
|
176
176
|
- 字段未生效:`未完成 <主条件+目标字段> 联合过滤;<目标字段>候选未确认/字段未生效/工具配置错误,主范围 total 不是该字段过滤数量。total=0。` 若有可信主查询且需要交代背景,可追加 `主范围 total=N`,但不能把它放在句首或当目标结果。
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 1. CLI 与参数硬约束
|
|
6
6
|
|
|
7
|
-
- 通用硬约束(`--as user`、禁止 `--as bot`/auth login、执行前自检禁止 `|`/`2>&1`/`head/tail/grep/python`/`/tmp`/`--help`/管道截断、固定 params ID
|
|
7
|
+
- 通用硬约束(`--as user`、禁止 `--as bot`/auth login、执行前自检禁止 `|`/`2>&1`/`head/tail/grep/python`/`/tmp`/`--help`/管道截断、固定 params ID 类型、未显式指定时普通查询 `page_size=20`、全量查询 `page_size=100`、`--search-filter-by-name` 必须是 JSON 对象、`--select-fields` 必须是 JSON 数组)统一以 SKILL.md 第 0 节为准,本节只列 `+offboarding-search` 专属细节。
|
|
8
8
|
- 命令:`people-cli corehr +offboarding-search --as user`。
|
|
9
9
|
- `--search-filter-by-name` 的 key 约束:除时间类字段(如 `offboarding_date/expected_offboarding_date/initiating_time/apply_date/checklist_start_time/checklist_finish_time/apply_finish_time`)外,key 必须是 `search-option` 返回的 `system_filters` 对应的 `field`,不得臆造或用 `system_columns` 字段。
|
|
10
10
|
- `--search-filter-by-name` 的 value 约束:value 必须是筛选条件的名称/中文展示名(由 shortcut 在运行时解析为 ID/枚举 value),不得直接传 ID;若已知 ID 才用 `--search-filter-by-id`。层级展示名若包含制表符/换行等字符,JSON 参数中必须写成 `\t`/`\n` escape,禁止放 literal tab、用空格替代或只取叶子值。
|
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
- 标准模板:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
people-cli corehr +offboarding-search --as user --params '{"page_size":"
|
|
16
|
+
people-cli corehr +offboarding-search --as user --params '{"page_size":"20","user_id_type":"people_corehr_id","department_id_type":"people_corehr_department_id"}' \
|
|
17
17
|
--search-filter-by-name '{"employment.department":"<组织核心词>","<key>":"<展示名或日期区间>"}' \
|
|
18
18
|
--select-fields '["status","offboarding_date","expected_offboarding_date","employment","employment.employee_number","employment.department","<key>"]'
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
+
- 用户未显式指定 page size,且明确要求所有数据或当前任务按规则必须遍历完整结果时,首请求把 `page_size` 设为 `"100"`;若 `has_more=true`,后续请求只追加返回的 `page_token`,并保持首次查询的 page size、ID 类型、筛选条件和返回字段不变。普通查询仍使用上述 `page_size="20"` 模板。
|
|
21
22
|
- 用户语义到 canonical key 的完整映射、字段组合规则、计数口径、字段语义锁定、字段展示值门禁、枚举/引用计数口径,统一以 SKILL.md 第 4 节「字段优先级矩阵」为准。
|
|
22
23
|
- 前置拒答/澄清(越权/高敏/流程节点先拒答,命中后禁止 search-option 与业务查询)统一以 SKILL.md 第 6 节为准。
|
|
23
24
|
- 授权组织短语先抽核心词:先去权限前缀,再剥离“大部门/部门/团队/组织”等泛称后缀;只有剩余具体业务组织名时才作为 `employment.department`。若只剩“我管理的部门/我负责的团队/我所在组织”等授权泛称,不构造部门 filter,不把整句或猜测组织写入 `employment.department`,也不把短词扩散为相似子组织/实验室/项目组候选;只能让 `--as user` 可见范围生效,或澄清/字段未生效。
|
|
@@ -50,5 +51,5 @@ people-cli corehr +offboarding-search --as user --params '{"page_size":"10","use
|
|
|
50
51
|
|
|
51
52
|
- 字段稳定性(原因字段决策、引用/字符串字段透传、职级范围展开、自定义字段/数字阈值、竞业启动、人员类型/合同主体/任职公司/工作地点/员工方向/直属上级等档案字段取值与失败收口)、高风险字段失败重试、字段未生效/字段无匹配判定,统一以 [search-option](people-corehr-offboarding-search-option.md) 第 4/4.1/5 节为准。
|
|
52
53
|
- 复合统计(“其中/主范围中的子条件”分别查主范围 total 与子条件 total)、名单门禁、分页翻完口径,统一以 SKILL.md 第 2 节为准。
|
|
53
|
-
- 最终输出契约(必含 `total
|
|
54
|
+
- 最终输出契约(必含 `total=`、普通查询默认最多展示 10 条、明确要求所有数据时最多展示 1000 条、超过实际展示数必须提示仍有更多、成功响应 `data.total=0` 明确写“无数据”、无权限 `msg` 必须业务化且不泄露原始错误、禁止用原始 `has_more=false` 暗示展示完整、禁止泄露内部执行物、收尾模板),统一以 SKILL.md 第 5/9 节为准。
|
|
54
55
|
- 通用底线:返回样例反证目标过滤未生效(目标日期外、主条件全量特征、完全没有 applied/resolved filter 证明且字段全量缺失/仅 wk_id)时,按正确字段重试一次仍失败即字段未生效;不能把主条件 total 当目标字段过滤结果;不得空 final。若服务端筛选已生效但部分记录未返回展示字段,仍保留记录,在该字段列写“字段未返回/仅返回内部 id”,不得从明细中过滤掉。
|
|
@@ -79,11 +79,12 @@ people-cli 命令执行后,如果检测到新版本,JSON 输出中会包含
|
|
|
79
79
|
**当你在输出中看到 `_notice.update` 时,完成用户当前请求后,主动提议帮用户更新**:
|
|
80
80
|
|
|
81
81
|
1. 告知用户当前版本和最新版本号
|
|
82
|
-
2.
|
|
82
|
+
2. 提议执行 CLI 更新:
|
|
83
83
|
```bash
|
|
84
84
|
people-cli update
|
|
85
85
|
```
|
|
86
|
-
|
|
86
|
+
|
|
87
|
+
`people-cli update` 只更新 CLI,不安装或同步 Skills。Skills 的安装与更新由独立的 Skill 管理流程负责。
|
|
87
88
|
|
|
88
89
|
**规则**:不要静默忽略更新提示。即使当前任务与更新无关,也应在完成用户请求后补充告知。
|
|
89
90
|
|
package/skills/people-cli.zip
DELETED
|
Binary file
|