@lark-people/cli 0.0.0-beta.1

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 (78) hide show
  1. package/CHANGELOG.md +324 -0
  2. package/LICENSE +21 -0
  3. package/README.md +232 -0
  4. package/README.zh.md +232 -0
  5. package/bin/people-cli_darwin_amd64 +0 -0
  6. package/bin/people-cli_darwin_arm64 +0 -0
  7. package/bin/people-cli_linux_amd64 +0 -0
  8. package/bin/people-cli_linux_arm64 +0 -0
  9. package/bin/people-cli_windows_amd64.exe +0 -0
  10. package/bin/people-cli_windows_arm64.exe +0 -0
  11. package/package.json +41 -0
  12. package/scripts/install-wizard.js +700 -0
  13. package/scripts/install.js +56 -0
  14. package/scripts/run.js +36 -0
  15. package/skills/people-attendance/SKILL.md +667 -0
  16. package/skills/people-attendance/references/people-attendance-submission.md +426 -0
  17. package/skills/people-attendance/scripts/resolve_date.py +894 -0
  18. package/skills/people-corehr/references/people-corehr-pre-hire-search.md +0 -0
  19. package/skills/people-corehr-employee/SKILL.md +111 -0
  20. package/skills/people-corehr-employee/references/people-corehr-employee-basic-info-query.md +97 -0
  21. package/skills/people-corehr-employee/references/people-corehr-employee-fields-list.md +87 -0
  22. package/skills/people-corehr-employee/references/people-corehr-employee-filter.md +403 -0
  23. package/skills/people-corehr-employee/references/people-corehr-employee-search.md +73 -0
  24. package/skills/people-corehr-job-change/SKILL.md +212 -0
  25. package/skills/people-corehr-job-change/references/people-job-change-business-rules.md +113 -0
  26. package/skills/people-corehr-job-change/references/people-job-change-lookup-filters.md +82 -0
  27. package/skills/people-corehr-job-change/references/people-job-change-output-and-empty.md +207 -0
  28. package/skills/people-corehr-job-change/references/people-job-change-search-advanced.md +226 -0
  29. package/skills/people-corehr-job-change/references/people-job-change-search-fields.md +119 -0
  30. package/skills/people-corehr-job-change/references/people-job-change-search-option.md +72 -0
  31. package/skills/people-corehr-job-change/references/people-job-change-search.md +215 -0
  32. package/skills/people-corehr-offboarding/SKILL.md +188 -0
  33. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-business-knowledge.md +27 -0
  34. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search-option.md +187 -0
  35. package/skills/people-corehr-offboarding/references/people-corehr-offboarding-search.md +54 -0
  36. package/skills/people-corehr-organization/SKILL.md +42 -0
  37. package/skills/people-corehr-organization/references/aggregate.md +11 -0
  38. package/skills/people-corehr-organization/references/detail.md +39 -0
  39. package/skills/people-corehr-organization/references/field-values.md +44 -0
  40. package/skills/people-corehr-organization/references/hierarchy.md +61 -0
  41. package/skills/people-corehr-organization/references/lookup.md +41 -0
  42. package/skills/people-corehr-organization/references/metadata.md +40 -0
  43. package/skills/people-corehr-organization/references/tree.md +45 -0
  44. package/skills/people-corehr-prehire/SKILL.md +160 -0
  45. package/skills/people-corehr-prehire/references/command-resolution.md +48 -0
  46. package/skills/people-corehr-prehire/references/filter-fields.md +151 -0
  47. package/skills/people-corehr-prehire/references/return-fields.md +153 -0
  48. package/skills/people-corehr-prehire/references/templates.md +202 -0
  49. package/skills/people-corehr-prehire/references/troubleshooting.md +93 -0
  50. package/skills/people-corehr-query-id-by-name/SKILL.md +154 -0
  51. package/skills/people-corehr-renewal/SKILL.md +186 -0
  52. package/skills/people-corehr-renewal/references/people-corehr-renewal-fields-query.md +62 -0
  53. package/skills/people-corehr-renewal/references/people-corehr-renewal-routing.md +54 -0
  54. package/skills/people-corehr-renewal/references/people-corehr-renewal-search.md +137 -0
  55. package/skills/people-corehr-renewal/references/people-corehr-renewal.md +39 -0
  56. package/skills/people-corehr-workforce-plan/SKILL.md +52 -0
  57. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-list.md +238 -0
  58. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan-detail-summary.md +221 -0
  59. package/skills/people-corehr-workforce-plan/references/people-corehr-workforce-plan.md +79 -0
  60. package/skills/people-hire/SKILL.md +255 -0
  61. package/skills/people-hire/references/people-hire-application.md +334 -0
  62. package/skills/people-hire/references/people-hire-evaluation-task-list.md +233 -0
  63. package/skills/people-hire/references/people-hire-evaluation.md +127 -0
  64. package/skills/people-hire/references/people-hire-interview-record.md +109 -0
  65. package/skills/people-hire/references/people-hire-interview-task-list.md +250 -0
  66. package/skills/people-hire/references/people-hire-interview.md +146 -0
  67. package/skills/people-hire/references/people-hire-job-process.md +93 -0
  68. package/skills/people-hire/references/people-hire-job-requirement.md +227 -0
  69. package/skills/people-hire/references/people-hire-job.md +277 -0
  70. package/skills/people-hire/references/people-hire-minutes.md +91 -0
  71. package/skills/people-hire/references/people-hire-talent.md +105 -0
  72. package/skills/people-hire/references/people-hire-test.md +197 -0
  73. package/skills/people-overtime/SKILL.md +992 -0
  74. package/skills/people-overtime/references/people-attendance-overtime-apply.md +491 -0
  75. package/skills/people-overtime/references/people-attendance-overtime.md +51 -0
  76. package/skills/people-overtime/references/people-attendance-submission.md +203 -0
  77. package/skills/people-overtime/scripts/resolve_date.py +894 -0
  78. package/skills/people-shared/SKILL.md +94 -0
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: people-corehr-prehire
3
+ version: 3.1.0
4
+ description: "Use when querying CoreHR pre-hire data via people-cli: first inspect option fields, then inspect filter fields/options, then run pre-hire searches with selected return fields and filter conditions."
5
+ metadata:
6
+ requires:
7
+ bins: ["people-cli"]
8
+ cliHelp: "people-cli corehr +prehire-search --help"
9
+ ---
10
+
11
+ # people-corehr-prehire
12
+
13
+ > **调用边界**:本 skill 只覆盖待入职(pre-hire)场景,统一使用 `people-cli corehr +prehire-*` Shortcut。
14
+ >
15
+ > **元数据流程(最严格)**:
16
+ > - 搜索前必须先调用 `+prehire-fields-query` 获取 Option Fields,确定可返回字段及 `--fields` 别名。
17
+ > - 然后调用 `+prehire-filter-options-query` 获取 Filter Fields,确定可筛选字段左值、右值类型和可选值。
18
+ > - 最后基于前两步整理出的返回字段和筛选条件调用 `+prehire-search`。
19
+ >
20
+ > **禁止事项(最严格)**:
21
+ > - **禁止**在 `--fields` 中拼接带点号的嵌套路径(如 `person_id.preferred_name`);必须传 [`references/return-fields.md`](references/return-fields.md) 中的别名。
22
+ > - **禁止**根据经验或猜测拼接 `--common-filters`;必须以 `+prehire-filter-options-query` 返回的字段为准。
23
+
24
+ ## references 索引
25
+
26
+ | 文件 | 用途 |
27
+ | --- | --- |
28
+ | [`return-fields.md`](references/return-fields.md) | Option Fields 的本地参考;实际执行前仍以 `+prehire-fields-query` 返回为准 |
29
+ | [`filter-fields.md`](references/filter-fields.md) | Filter Fields 的本地参考;实际执行前仍以 `+prehire-filter-options-query` 返回为准 |
30
+ | [`command-resolution.md`](references/command-resolution.md) | 命令端内置解析逻辑、`:name` 后缀决策、`option_src` 分流细则 |
31
+ | [`templates.md`](references/templates.md) | 核心命令、`stage_id` 语义、消歧规则、模板、输出规范、搜索构造细则 |
32
+ | [`troubleshooting.md`](references/troubleshooting.md) | 错误速查表、枚举值匹配失败、不支持筛选字段 A/B 分流、多候选 AI 消歧 |
33
+
34
+ ## AI 的三件事
35
+
36
+ `+prehire-search` 的所有「别名展开 / api_name 映射 / name→ID 解析 / option_src 分流」都由命令层完成(细节见 [`command-resolution.md`](references/command-resolution.md))。AI 只需要:
37
+
38
+ 1. **先查返回字段**:调用 `+prehire-fields-query`,根据用户想看的列选择 `--fields` 别名。
39
+ 2. **再查筛选字段和值域**:调用 `+prehire-filter-options-query`,根据用户筛选条件选择 `--common-filters` 左值和右值。
40
+ 3. **选 `:name` 后缀并搜索**:用户给纯数字 ID → 用裸 `api_name`;用户给名称 → 用 `<api_name>:name`;`date_range` / `keyword` / `stage_id` 始终不加后缀。
41
+
42
+ ## 何时使用
43
+
44
+ 只在以下场景使用:
45
+
46
+ - 获取待入职可返回字段或可筛选字段。
47
+ - 按条件搜索待入职数据,并指定返回字段。
48
+
49
+ 不要使用:
50
+
51
+ - 查询正式员工、异动、离职、编制。
52
+ - 用户没有查询意图,只是讨论字段含义或业务规则。
53
+
54
+ ## 标准流程(3 阶段)
55
+
56
+ ### 阶段 1:先获取 Option Fields,确定返回字段
57
+
58
+ 调用:
59
+
60
+ ```bash
61
+ people-cli corehr +prehire-fields-query --accept-language zh-CN --format json
62
+ ```
63
+
64
+ 处理规则:
65
+
66
+ 1. 从返回的 Option Fields 中找用户想看的字段。
67
+ 2. 只把用户明确要求的字段加入 `--fields`,未明确要求时不传 `--fields`,使用命令默认字段。
68
+ 3. `--fields` 只能传别名,禁止传带点号的内部字段路径。
69
+ 4. 本地 [`return-fields.md`](references/return-fields.md) 只作为排错和字段口径参考;实际可用性以本次 Option Fields 返回为准。
70
+ 5. 字段是否可返回以本次 `+prehire-fields-query` 的 Option Fields 为准;如果 Option Fields 返回了对应别名,就可以作为 `--fields` 传入。
71
+
72
+ ### 阶段 2:再获取 Filter Fields,确定筛选左值和右值
73
+
74
+ 调用:
75
+
76
+ ```bash
77
+ people-cli corehr +prehire-filter-options-query --accept-language zh-CN --format json
78
+ ```
79
+
80
+ 处理规则:
81
+
82
+ 1. 从返回的 Filter Fields 中找筛选字段左值,即 `--common-filters[].api_name`。
83
+ 2. 根据字段的 `option_src` / `options` 判断右值来源:
84
+ - `local`:右值必须来自该字段 options;用户给名称时用 `<api_name>:name`,命令端解析为 option ID。
85
+ - 远程数据源:用户给名称时用 `<api_name>:name`,命令端在 `+prehire-search` 内部通过 `query_id_by_name` 解析 ID。
86
+ - `date_range`:右值为 `["YYYY-MM-DD","YYYY-MM-DD"]`,不加 `:name`。
87
+ - `keyword` / `stage_id`:右值透传,不加 `:name`。
88
+ 3. 用户给纯数字 ID 或 option ID 时用裸 `api_name`;用户给名称时用 `<api_name>:name`。
89
+ 4. 不在本次 Filter Fields 中、但在 Option Fields 中的字段,只能作为返回字段,不能直接筛选;按 [`troubleshooting.md`](references/troubleshooting.md) 的“可看不可筛”流程处理。
90
+ 5. 用户未显式指定 `stage_id` 时,依赖命令默认 `["preboarding","day_one"]`;用户显式指定时按用户值覆盖。
91
+
92
+ ### 阶段 3:整理后调用 Search,获取筛选条件下的指定字段
93
+
94
+ 把前两阶段结果整理为:
95
+
96
+ - `--fields "<返回字段别名 CSV>"`
97
+ - `--common-filters '<筛选条件 JSON 数组>'`
98
+
99
+ 调用:
100
+
101
+ ```bash
102
+ people-cli corehr +prehire-search \
103
+ --fields "<csv>" \
104
+ --common-filters '<json>' \
105
+ --accept-language zh-CN \
106
+ --format json
107
+ ```
108
+
109
+ 执行后必须检查输出末尾的 `Has more` 与 `Next page: --page-token <token>`,**仅转述、不主动续拉**。
110
+
111
+ 模板与 `stage_id` 语义见 [`templates.md`](references/templates.md)。
112
+
113
+ ## 解析用户意图
114
+
115
+ 把用户话术拆为三类:
116
+
117
+ - **返回字段**:将出现在表格里的列,由 Option Fields 决定。
118
+ - **筛选左值**:用什么字段筛,由 Filter Fields 决定。
119
+ - **筛选右值**:筛什么值,由 Filter Fields 的 `option_src` / `options` 决定。
120
+
121
+ 含糊就澄清;候选不唯一就澄清;不要猜。
122
+
123
+ ## 搜索约束
124
+
125
+ > **执行前守卫**:用户要按「可看不可筛」字段(如社保城市)筛选时,**必须**走 [`troubleshooting.md` 分支 A](references/troubleshooting.md) 的 `--page-size 1` 探查 + `total_number ≤ 1000` 才拉全量流程;详见 [`templates.md` 「可看不可筛」字段执行守卫](references/templates.md#可看不可筛字段执行守卫)。
126
+ >
127
+ > **单次查询原则(强约束)**:默认**只调用一次** `+prehire-search`(命令默认 `--page-size 20`,即返回 20 条)。**禁止**主动翻页 / 重复调用 / 自行扩大 `--page-size`。仅在用户**显式**说「全部 / 翻页 / 拉完 / 继续 / 第 N 页 / 更多」等意图时才追加 `--page-token` 或调高 `--page-size`。`Has more: true` 时仅原样转述给用户,不主动行动。详见 [`templates.md` 单次查询原则](references/templates.md#单次查询原则强约束)。
128
+
129
+ ## 回复用户的两条铁律
130
+
131
+ 1. **单次查询**:每条用户消息**只发起一次** `+prehire-search`,结果原样汇报;用户显式要「全部 / 翻页 / 继续」时才续拉。
132
+ 2. **默认隐藏过程**:默认不向用户暴露中间思考、字段匹配过程、命令构造草稿、debug 日志、内部 `api_name`、`option_src` 分流逻辑;但用户明确要求“原始数据 / 原始输出 / 可执行命令 / 入参 / 调试信息”时,必须按用户要求给出对应原始内容或最小必要技术细节。详见 [`templates.md` 输出与过程信息](references/templates.md#输出与过程信息)。
133
+
134
+ ## 错误处理(必读:[`troubleshooting.md`](references/troubleshooting.md))
135
+
136
+ 执行 `+prehire-search` 前后必须遵守三条最小约束:
137
+
138
+ - 命令报错或字段不可用时**先查** [`troubleshooting.md`](references/troubleshooting.md),按对应流程处理;禁止自行降级、丢字段或 keyword 替代。
139
+ - 不在本次 Filter Fields 的字段:按「不支持筛选字段的分流处理」走 A/B 分支。
140
+ - `matches multiple options`:按「多候选命中」走「AI 消歧 → 高置信度自动 `:id` 重跑(必须告知用户)→ 低置信度让用户用 ID 选」。
141
+
142
+ ## 最终检查清单
143
+
144
+ - [ ] 已先调用 `+prehire-fields-query` 获取 Option Fields。
145
+ - [ ] 已再调用 `+prehire-filter-options-query` 获取 Filter Fields。
146
+ - [ ] `--fields` 中**只有别名**(`name_zh` / `name_en` / `alias`)。
147
+ - [ ] **`--fields` 仅包含用户显式要求的字段**;未明说的字段一律不追加,命令默认字段不重复传。
148
+ - [ ] 字段是否传入 `--fields` 已以本次 Option Fields 为准;Option Fields 未返回的字段未猜测、未兜底。
149
+ - [ ] 筛选字段:`api_name` 精确匹配;歧义已澄清。
150
+ - [ ] **`:name` 后缀已按用户输入选对**:纯数字 ID 用裸 `api_name`;名称用 `<api_name>:name`。
151
+ - [ ] `--common-filters` 每项都是 `{"api_name": "...", "values": [...]}`。
152
+ - [ ] 用户未指定 `stage_id` 时依赖命令默认值;指定时已确认覆盖默认。
153
+ - [ ] 真实执行后检查了 `has_more` / `page_token`。
154
+ - [ ] **本轮只调用了一次** `+prehire-search`;未自行翻页 / 复跑 / 调大 `--page-size`,除非用户显式要「全部 / 翻页 / 继续」。
155
+ - [ ] 用户**显式**要「导出全部字段 / 所有字段 / `all` / `*`」时,已按 [`return-fields.md` 全字段导出](references/return-fields.md#全字段导出) 把本次 Option Fields 支持且非默认的别名一次性拼到 `--fields`,并配 `--page-size 100`,**未**报告"无法一次导出"。
156
+ - [ ] 默认回复只给最终结论;用户明确要求原始数据、原始输出、可执行命令、入参或调试信息时,已按要求回传对应原始内容或最小必要技术细节。
157
+ - [ ] 响应里出现 `total_number` 时,已在回复正文中**显式告知用户具体数值**(详见 [`templates.md` 输出规范](references/templates.md#必须显式回传给用户的元信息))。
158
+ - [ ] 默认回复中,个人信息对象(如 `direct_manager` / `offer_hr`)只输出 `display_name`/`name` + `employee_number`;仅用户明确要求原始输出时才保留 `avatar` URL、`id` 等原始字段。
159
+ - [ ] 用户要筛「可看不可筛」字段(如社保城市)时:已用 `--page-size 1` 探查 `total_number`,且 `> 1000` 时**立即停止并提示用户**。
160
+ - [ ] 命令报错或出现「字段不支持」「`matches multiple options`」「枚举值未命中」时,已按 [`troubleshooting.md`](references/troubleshooting.md) 处理(禁止丢字段、裸拉全量、随机选候选)。
@@ -0,0 +1,48 @@
1
+ # 命令端解析逻辑(AI 只传别名)
2
+
3
+ > `+prehire-search` 在执行时**自动完成**下列工作,AI 不需要在调用前手工解析 ID。
4
+
5
+ ## 命令端会做的 4 件事
6
+
7
+ 1. **`--fields` 别名展开**:把中文/英文别名(如「部门」「直属上级」)自动展开为对应字段,并合并默认字段(`preferred_name` / `worker_id` / `hire_date`)。
8
+ 2. **`--common-filters` 别名→`api_name` 映射**:把中文/英文字段名(如「部门」「入职日期」)规范化为后端 `api_name`(如 `department_id` / `onboard_date_range`)。
9
+ 3. **`api_name` 后缀决定右值类型**(详见下文 [后缀决策](#后缀决策))。
10
+ 4. **`option_src` 分流**:仅在 `:name` 模式下触发解析(详见下文 [option_src 分流](#option_src-分流))。
11
+
12
+ AI 只需要做两件事:
13
+
14
+ - ① 从 `references/return-fields.md` / `references/filter-fields.md` 挑到正确的别名。
15
+ - ② 根据用户输入是 ID 还是名称,决定是否追加 `:name` 后缀。
16
+
17
+ > 命令输出包含 `unsupported --fields alias` 或 `unsupported common-filter api_name` 时,按错误信息中的 supported list 修正字段名,**不要**再猜测内部字段名或 `api_name`。
18
+
19
+ ## 后缀决策
20
+
21
+ | 用户输入 | `api_name` 写法 | 命令端行为 |
22
+ | --- | --- | --- |
23
+ | 纯数字 / option ID | 不加后缀(等价 `:id`) | `values` 原样透传 |
24
+ | 名称(部门名/姓名/岗位名/枚举中文名) | 加 `:name` | 按 `option_src` 把 name→ID |
25
+ | `date_range` / `keyword` / `stage_id` | 始终不加后缀 | 原样透传 |
26
+
27
+ 判断口径:**纯数字串视为 ID,其他一律视为名称走 `:name`**。命令端不会猜测「这串到底是 ID 还是名称」。
28
+
29
+ 示例:
30
+
31
+ ```json
32
+ // 用户给 ID
33
+ {"api_name":"department_id","values":["7552796827847525896"]}
34
+
35
+ // 用户给名称
36
+ {"api_name":"department_id:name","values":["corehr"]}
37
+ ```
38
+
39
+ ## option_src 分流
40
+
41
+ 仅在 `:name` 模式下触发,由命令端自动选择解析路径:
42
+
43
+ | `option_src` | 典型字段 | 解析方式 |
44
+ | --- | --- | --- |
45
+ | 远程数据源 | `department_id` / `position_id` / `direct_manager_id` / `dotted_line_manager_id` / `offer_hr_id` | 在 `+prehire-search` 内部调用 `POST /open-apis/corehr/v2/common/query_id_by_name`,name→ID |
46
+ | `local` | `work_location_id` / `onboard_method_id` / `company_id` | 调 `GET /pre_hires/filter_field` 取 `options[]`,按中文名/option ID 匹配 |
47
+ | `date_range` | `onboard_date_range` 等 | 固定传 `["YYYY-MM-DD","YYYY-MM-DD"]`,无后缀 |
48
+ | `passthrough` | `keyword` / `stage_id` | 原样透传,无后缀 |
@@ -0,0 +1,151 @@
1
+ # Pre-hire 可筛选字段(filter_field)
2
+
3
+ > 本文件是 `+prehire-filter-options-query` 返回内容的本地参考,用于理解 `+prehire-search --common-filters` 左值(`api_name`)与右值(`values`)解析规则。
4
+ > 实际执行搜索前,应先调用 `+prehire-filter-options-query` 获取实时 Filter Fields;严禁臆造字段。
5
+
6
+ ## 解析规则(强约束)
7
+
8
+ 1. 用户给出的中文/英文字段名,必须先在「字段总览」中找到 `api_name`。
9
+ - 优先精确匹配 `name_zh` / `name_en`;不允许模糊或近义匹配。
10
+ - 同名歧义(如「国籍」对应 `nationality_id` 与 `nationality_v2_id`)必须向用户澄清。
11
+ 2. **`:name` 后缀决定右值类型(ID vs 名称)——AI 必须按用户输入选**:
12
+ - 用户给的是 ID(纯数字 / option ID)→ 用裸 `api_name`(等价 `:id`),命令端**原样透传**,不做解析。
13
+ ```json
14
+ {"api_name":"department_id","values":["7552796827847525896"]}
15
+ ```
16
+ - 用户给的是名称(部门名 / 姓名 / 岗位名 / 本地枚举中文名)→ 必须用 `<api_name>:name`,命令端会按 `option_src` 自动把 name→ID。
17
+ ```json
18
+ {"api_name":"department_id:name","values":["corehr"]}
19
+ ```
20
+ - 命令端**不会**自动猜测「这串到底是 ID 还是名称」;判断口径:纯数字串视为 ID,其他一律视为名称走 `:name`。
21
+ 3. 找到 `api_name`、决定后缀后,按 `option_src` 走以下分流(仅 `:name` 模式触发解析):
22
+ - `local`:命令端调 `GET /open-apis/corehr/v2/pre_hires/filter_field` 拉 `options[]`,按 option ID、精确名称、大小写不敏感名称、子串匹配依次解析;多候选会报错要求用精确 ID 消歧。
23
+ - 远程数据源(`/api/v1/hr/datasources/department` / `position` / `employee`):命令端在 `+prehire-search` 内部调用 `POST /open-apis/corehr/v2/common/query_id_by_name` 把姓名→ID;AI 不单独调用解析命令。
24
+ - `date_range`:用户必须给出 `[start, end]`,格式 `YYYY-MM-DD`;不需要后缀。
25
+ - `passthrough`(`keyword` / `stage_id`):命令直接透传值给后端,不做二次解析;不需要后缀。
26
+ 4. 最终下发到 `--common-filters` 的结构必须为:
27
+ ```json
28
+ {"api_name":"<api_name>[:name]","values":["<id 或 名称 或透传值>"]}
29
+ ```
30
+
31
+ ## 字段总览(按 option_src 分组)
32
+
33
+ ### 0. 内建 passthrough — 关键字 / 阶段(命令直接透传)
34
+
35
+ | api_name | name_zh | name_en | 解析方式 / values 格式 |
36
+ | --- | --- | --- |---------------------------------------------------------------------------------|
37
+ | `keyword` | 关键字 | Keyword | `["<候选人姓名或工号>"]`,命令直接透传;**不要**把它当作除工号/候选人姓名以外的字段筛选 |
38
+ | `stage_id` | 入职阶段 | Stage | 见下方「stage_id 的完整语义」,取值只允许:`preboarding` / `day_one` / `completed` / `withdrawn` |
39
+
40
+ > `stage_id` 属于 Shortcut 内建过滤字段:
41
+ > - 用户**未显式**给 `stage_id` 时,命令默认补 `{"api_name":"stage_id","values":["preboarding","day_one"]}`。
42
+ > - 用户**显式**给 `stage_id` 时,命令**不再**合并默认值,按用户传的值走。
43
+ > - keyword只能筛选候选人姓名和工号,不能筛选其他字段;且只能传一个值。不支持工号和姓名同时查询
44
+
45
+ ### A. 远程数据源 — 部门(`option_src=/api/v1/hr/datasources/department`)
46
+
47
+ | api_name | name_zh | name_en | 解析方式 |
48
+ | --- | --- | --- | --- |
49
+ | `department_id` | 部门 | Department | 由命令端在 `+prehire-search` 内部调用 `query_id_by_name`,`target_object_api_name=department`,`field_api_name=department` |
50
+
51
+ ### B. 远程数据源 — 岗位(`option_src=/api/v1/hr/datasources/position`)
52
+
53
+ | api_name | name_zh | name_en | 解析方式 |
54
+ | --- | --- | --- | --- |
55
+ | `position_id` | 岗位 | Position | 由命令端在 `+prehire-search` 内部调用 `query_id_by_name`,`target_object_api_name=position`,`field_api_name=position` |
56
+
57
+ ### C. 远程数据源 — 人员(`option_src=/api/v1/hr/datasources/employee`)
58
+
59
+ | api_name | name_zh | name_en | 解析方式 |
60
+ | --- | --- | --- | --- |
61
+ | `direct_manager_id` | 直属上级 | Direct leader | 由命令端在 `+prehire-search` 内部调用 `query_id_by_name`,`target_object_api_name=employment`,`field_api_name=direct_manager` |
62
+ | `dotted_line_manager_id` | 虚线上级-工作信息 | Dotted-line leader | 由命令端在 `+prehire-search` 内部调用 `query_id_by_name`,`target_object_api_name=employment`,`field_api_name=dotted_line_manager` |
63
+ | `offer_hr_id` | Offer HR | Offer HR | 由命令端在 `+prehire-search` 内部调用 `query_id_by_name`,`target_object_api_name=employment`,`field_api_name=offer_hr` |
64
+
65
+ > 远程数据源解析后的 ID 直接放进 `values`,不允许把姓名 / 部门名作为 value。
66
+
67
+ ### D. 日期区间字段(`option_src=date_range`)
68
+
69
+ | api_name | name_zh | name_en | values 格式 |
70
+ | --- | --- | --- | --- |
71
+ | `onboard_date_range` | 入职日期 | Hire date | `["YYYY-MM-DD","YYYY-MM-DD"]`([start, end]) |
72
+ | `created_date_range` | 流程发起时间 | Process initiation time | 同上 |
73
+ | `seniority_date_range` | 司龄起算日期 | Seniority date | 同上 |
74
+
75
+ ### E. 本地枚举字段(`option_src=local`)
76
+
77
+ 下表的 `api_name` 在 `--common-filters` 中作为左值;右值是**本地枚举 option**,命令端会在执行前调用 `GET /open-apis/corehr/v2/pre_hires/filter_field` 获取 `options[]`,自动把用户输入的中文名或 option ID 映射为 ID。匹配顺序是:option ID → 精确名称 → 大小写不敏感名称 → 子串匹配;匹配失败或有歧义时命令会直接报错。
78
+
79
+ | api_name | name_zh | name_en |
80
+ | --- | --- | --- |
81
+ | `job_id` | 职务 | Job |
82
+ | `onboard_location_id` | 入职地点 | Onboarding location |
83
+ | `task_status` | 入职任务进展 | Action item status |
84
+ | `job_family_id` | 序列 | Job family |
85
+ | `workforce_type_id` | 人员类型 | Workforce type |
86
+ | `flow_id` | 入职流程 | Onboarding Process |
87
+ | `job_level_id` | 职级 | Job level |
88
+ | `special_intern_id` | 特殊实习生 | Special intern |
89
+ | `reuse_feishu_account` | 是否复用飞书账号 | Whether to reuse Lark account |
90
+ | `onboard_method_id` | 入职方式 | Onboarding method |
91
+ | `company_id` | 合同主体 | Company(「合同主体」与「公司主体」同义,统一走此 api_name) |
92
+ | `pathway_id` | 通道 | Pathway |
93
+ | `work_location_id` | 工作地点 | Work location(「工作城市」与「工作地点」同义,统一走此别名) |
94
+ | `overdue` | 是否逾期 | Overdue |
95
+ | `whether_returnee` | 是否回流 | Whether returnee |
96
+ | `whether_to_pay_social_security_elsewhere` | 是否异地缴纳社保 | Whether pay social security elsewhere |
97
+ | `eligible_for_work_visa` | 是否需要公司支持办理签证 | Eligible for work visa |
98
+ | `chinese_tax_resident` | 是否为中国税务居民 | Chinese tax resident |
99
+ | `rehire` | 是否离职重聘 | Rehire |
100
+ | `whether_the_information_is_abnormal` | 是否信息异常 | Whether the information is abnormal |
101
+ | `additional_nationalities` | 其他国籍 | Additional Nationalities |
102
+ | `nationality_v2_id` | 国籍 | Nationality |
103
+ | `service_company_id` | 任职公司 | Service company(「任职公司」与「所属公司」同义,统一走此 api_name) |
104
+ | `work_shift_id` | 排班 | Work shift |
105
+ | `compensation_type_id` | 薪资类型 | Pay rate type |
106
+ | `job_grade_id` | 职等 | Job grade |
107
+ | `work_country_id` | 工作国家/地区 | Work Country/Region |
108
+
109
+ ## 本地枚举字段值映射
110
+ > AI **不需要、也不允许**把枚举值手工写死在调用里。
111
+ > 用户传中文名(如「校招」「中国大陆」)时命令端会自动匹配为 option ID;匹配失败命令会直接报错并列出支持的选项,AI 据此修正后再执行,**禁止猜测**。
112
+
113
+ ## stage_id 的完整语义(强约束)
114
+
115
+ `stage_id` 代表**入职流程阶段**,`option_src=passthrough`(命令直接透传,不做二次解析)。
116
+
117
+ | 值 | 中文含义 | 英文含义 | 说明 |
118
+ | --- | --- | --- | --- |
119
+ | `preboarding` | 入职进行中 | Pre-boarding / onboarding in progress | 流程已发起、尚未到达 Day One |
120
+ | `day_one` | 入职准备就绪 | Day One / onboarding completed and ready | 但没有入职,也是默认口径 |
121
+ | `completed` | 入职流程已完成 | Onboarding completed / finished | 已经入职 |
122
+ | `withdrawn` | 撤销 / 撤回 | Withdrawn / revoked | 候选人退出 |
123
+
124
+ 语义口径:
125
+ - 查"今年待入职的员工" → 按需扩展到 `["preboarding", "day_one"]`。
126
+ - 没有指定入职阶段,默认 `["preboarding", "day_one"]`。
127
+ - 查"入职流程全部走完" → `stage_id=completed`。
128
+ - 查"已入职的候选人" → `stage_id=completed`。
129
+ - 查"放弃入职 / 撤回" → `stage_id=withdrawn`。
130
+ - 查"入职准备就绪" → `stage_id=day_one`。
131
+
132
+ ## 内置默认(命令自动追加)
133
+
134
+ - 用户**未显式**指定 `stage_id` 时,`+prehire-search` 会自动追加:
135
+ ```json
136
+ {"api_name":"stage_id","values":["preboarding","day_one"]}
137
+ ```
138
+ - 用户**显式**给出 `stage_id` 时,命令**不会**再合并默认值,按用户传的值走。
139
+ - `stage_id` 属于 Shortcut 内建过滤字段,**不在** `filter_field` 元数据接口返回中。
140
+
141
+ ## 易混淆点(必须澄清)
142
+
143
+ | 用户口语 | 候选 api_name | 处置 |
144
+ |----------------------| --- |-------------------|
145
+ | 入职地点 vs 工作地点 | `onboard_location_id` / `work_location_id` | 不可互相兜底,必须按用户原话精确取 |
146
+ | 工作地点 vs 工作城市 | `work_location_id` | **同义**,「工作城市」统一映射到 `work_location_id`,无需澄清 |
147
+ | 社保城市 vs 工作地点 | 「社保城市」**不是**可筛选字段 / `work_location_id` | **两者是完全不同的字段,严禁混淆或互相兜底**。「社保城市」`social_security_city` 仅是可返回字段(见 `return-fields.md`),本文件无对应可筛选 `api_name`;用户要求按社保城市筛选时,必须直接回复"社保城市不支持作为筛选条件",**禁止**改用 `work_location_id` 代替 |
148
+ | 查看北京(没有指定入职地点还是工作地点) | `work_location_id` | 默认使用工作地点 |
149
+ | 任职公司 vs 合同主体 | `service_company_id` / `company_id` | **两者是完全不同的字段,严禁混淆或互相兜底**。「任职公司」与「所属公司」同义 → `service_company_id`;「合同主体」与「公司主体」同义 → `company_id` |
150
+ | 任职公司 vs 所属公司 | `service_company_id` | **同义**,「所属公司」统一映射到 `service_company_id`,无需澄清 |
151
+ | 合同主体 vs 公司主体 | `company_id` | **同义**,「公司主体」统一映射到 `company_id`,无需澄清 |
@@ -0,0 +1,153 @@
1
+ # Pre-hire 可返回字段别名清单
2
+
3
+ > `--fields` 接受的**别名**清单。命令端已硬编码「别名 → 后端字段」映射,AI 只负责挑别名传入。
4
+
5
+ ## 用法(强约束)
6
+
7
+ 1. 用户口语 → 在「字段总览」精确匹配 `name_zh` / `name_en` / `alias` 任一列。
8
+ 2. 把命中行的 **任何一个别名**(推荐用 `name_zh`)追加到 `--fields`,多别名用 `,` 拼接。
9
+ 3. 命令端默认始终携带:`preferred_name` / `worker_id` / `hire_date`,不要重复传。
10
+ 4. **用户没有显式提到的字段,不要追加**——只保留命令默认字段即可,禁止"贴心"扩展。
11
+ 5. **用户显式要全部字段**("所有字段 / 全部字段 / 导出全部 / all / *")时,按 [全字段导出](#全字段导出) 一次性拼齐所有 `name_zh`,禁止以"字段太多"为由拒绝。
12
+ 6. 别名不命中:先以本次 `+prehire-fields-query` 返回为准确认是否可用;仍不命中时直接告知不支持,禁止猜测。
13
+
14
+ ## 字段可用性口径
15
+
16
+ 字段是否可通过 `--fields` 返回,以本次 `+prehire-fields-query` 返回的 Option Fields 和代码内置 alias 为准。不要维护额外的静态拒绝清单;例如当前代码支持 `薪资类型` / `Pay rate type` / `compensation_type` 作为返回字段别名。
17
+
18
+ ## 字段总览(按业务域分组)
19
+
20
+ ### A. 身份与基础信息
21
+
22
+ | name_zh | name_en | alias |
23
+ | --- | --- | --- |
24
+ | 工号 | Employee number | `worker_id` |
25
+ | 法定姓名 | Legal name | `legal_name` |
26
+ | 常用姓名 | Preferred name | `preferred_name` |
27
+ | 性别 | Gender | `gender` |
28
+ | 国籍 | Nationality | `nationality` |
29
+ | 其他国籍 | Additional Nationalities | `additional_nationalities` |
30
+ | 民族 / 种族 | Ethnicity / race | `ethnicity_race` |
31
+ | 出生日期 | Date of birth | `date_of_birth` |
32
+ | 年龄 | Age | `age` |
33
+ | 婚姻状况 | Marital status | `marital_status` |
34
+ | 工龄 | Working years | `working_years` |
35
+ | 上家公司 | Former employer | `former_employer` |
36
+
37
+ ### B. 中国大陆户籍信息
38
+
39
+ | name_zh | name_en | alias |
40
+ | --- | --- | --- |
41
+ | 政治面貌 | Political affiliation | `political_affiliation` |
42
+ | 籍贯 | Native region | `native_region` |
43
+ | 户口类型 | Hukou type | `hukou_type` |
44
+ | 户口所在地 | Hukou location | `hukou_location` |
45
+ | 身份证号码 | National ID number | `national_id_number` |
46
+
47
+ ### C. 联系方式
48
+
49
+ | name_zh | name_en | alias |
50
+ | --- | --- | --- |
51
+ | 邮箱地址 | Email | `work_email` |
52
+ | 个人邮箱 | Personal email | `personal_email` |
53
+ | 个人电话 | Personal Phone | `phone` |
54
+
55
+ ### D. 工作信息(组织、岗位、上级)
56
+
57
+ | name_zh | name_en | alias |
58
+ | --- | --- | --- |
59
+ | 部门 | Department | `department` |
60
+ | 部门全路径 | Full path of department | `department_full_path` |
61
+ | 业务线 | Business Line | `cost_center` |
62
+ | 岗位 | Position | `position` |
63
+ | 职务 | Job | `job` |
64
+ | 序列 | Job family | `job_family` |
65
+ | 职级 | Job level | `job_level` |
66
+ | 人员类型 | Workforce type | `employee_type` |
67
+ | 人员子类型 | Workforce sub type | `employee_subtype` |
68
+ | 直属上级 | Direct leader | `direct_manager` |
69
+ | 虚线上级 | Dotted-line leader | `dotted_line_manager` |
70
+ | 任职公司 | Service company | `service_company`(「任职公司」与「所属公司」同义,统一走此别名) |
71
+ | 排班 | Work shift | `work_shift` |
72
+ | 用工类型 | Worker type | `employment_type` |
73
+ | 招聘类型 | Recruitment type | `recruitment_type` |
74
+
75
+ ### E. 工作地点与办公
76
+
77
+ | name_zh | name_en | alias |
78
+ | --- | --- | --- |
79
+ | 工作地点 | Work location | `work_location`(「工作城市」与「工作地点」同义,统一走此别名) |
80
+ | 工作国家/地区 | Work Country/Region | `work_country` |
81
+ | 办公地点 | Office location | `office_location` |
82
+ | 办公地址 | Office address | `office_address` |
83
+ | 入职地点 | Onboarding location | `onboarding_location` |
84
+ | 入职地址 | Onboarding address | `onboarding_address` |
85
+ | 社保城市 | Social security city | `social_security_city` |
86
+
87
+ ### F. 入职流程与状态
88
+
89
+ | name_zh | name_en | alias |
90
+ | --- | --- | --- |
91
+ | 入职日期 | Hire date | `hire_date` |
92
+ | 入职流程 | Onboarding process | `process_id` |
93
+ | 入职状态 | Onboarding status | `onboarding_status` |
94
+ | 入职方式 | Onboarding method | `onboarding_method` |
95
+ | 签到方式 | Check in method | `check_in_method` |
96
+ | 签到时间 | Check in time | `check_in_time` |
97
+ | 入职任务是否逾期 | Overdue | `is_overdue` |
98
+ | Offer HR | Offer HR | `offer_hr` |
99
+ | 是否离职重聘 | Rehire | `rehire` |
100
+ | 是否变更审批中 | Whether in modify process | `in_modify_process` |
101
+ | 流程发起时间 | Process initiation time | `wk_created_at` |
102
+ | 司龄起算日期 | Seniority date | `seniority_date` |
103
+
104
+ ### G. 工时与薪资
105
+
106
+ | name_zh | name_en | alias |
107
+ | --- | --- | --- |
108
+ | 工时制度 | Working hours | `working_hours_type` |
109
+ | 工作日历 | Working calendar | `working_calendar` |
110
+ | 周工作时长 | Weekly working hours | `weekly_working_hours_v2` |
111
+ | 合同主体 | Company | `company`(「合同主体」与「公司主体」同义,统一走此别名) |
112
+
113
+ ### H. 试用期与合同
114
+
115
+ | name_zh | name_en | alias |
116
+ | --- | --- | --- |
117
+ | 试用期时长 | Probation period | `probation_period` |
118
+ | 试用期开始日期 | Probation start date | `probation_period_start_date` |
119
+ | 试用期预计结束日期 | Probation expected end date | `probation_period_end_date` |
120
+ | 合同类型 | Contract type | `contract_type` |
121
+ | 签订类型 | Signing type | `signing_type` |
122
+ | 期限类型 | Duration type | `duration_type` |
123
+ | 合同开始日期 | Contract start date | `contract_start_date` |
124
+ | 合同预计结束日期 | Contract end date | `contract_end_date` |
125
+
126
+ ## 同名歧义处理
127
+
128
+ | 用户口语 | 候选 | 处置 |
129
+ | --- | --- | --- |
130
+ | 邮箱 | A 域「邮箱地址」 vs C 域「个人邮箱」 | 询问用户要工作邮箱还是个人邮箱 |
131
+ | 入职地点 vs 工作地点 | E 域两行 | 不可互相兜底,必须按用户原话精确取 |
132
+ | 社保城市 vs 工作地点 | E 域「社保城市」`social_security_city` vs「工作地点」`work_location` | **两者是完全不同的字段,严禁混淆或互相兜底**;用户说「社保城市/社保所在地」只取 `social_security_city`,说「工作地点/工作城市」只取 `work_location` |
133
+ | 工作城市 vs 工作地点 | 同为 E 域「工作地点」`work_location` | **同义**,统一映射到 `work_location`,无需澄清 |
134
+ | 任职公司 vs 合同主体 | D 域「任职公司」`service_company` vs G 域「合同主体」`company` | **两者是完全不同的字段,严禁混淆或互相兜底**。「任职公司」与「所属公司」同义 → 只取 `service_company`;「合同主体」与「公司主体」同义 → 只取 `company` |
135
+ | 任职公司 vs 所属公司 | 同为 D 域「任职公司」`service_company` | **同义**,统一映射到 `service_company`,无需澄清 |
136
+ | 合同主体 vs 公司主体 | 同为 G 域「合同主体」`company` | **同义**,统一映射到 `company`,无需澄清 |
137
+
138
+ ## 失败兜底
139
+
140
+ - 字段未出现在本表:直接回复"该字段不在 pre-hire 可返回字段中,请确认是否拼写正确或换一个字段名"
141
+
142
+ ## 全字段导出
143
+
144
+ 用户**显式**要求「全部字段 / 所有字段 / 导出全部 / `all` / `*` / 完整信息」时,按以下步骤一次性拉全:
145
+
146
+ 1. **拼接 `--fields`**:把「字段总览」中**每一行**的 `name_zh`(推荐用中文别名,最稳)以英文逗号拼接成一个字符串。**跳过**:
147
+ - 默认字段(`preferred_name` / `worker_id` / `hire_date`)—— 命令端会自动携带;
148
+ - 本次 Option Fields 未返回且代码 alias 不支持的字段。
149
+ 2. **同时配** `--page-size 100` 与(如需要)`--accept-language zh-CN`。
150
+ 3. 一次调用即可拿到该页全部字段。`Has more: true` 时按 [`templates.md` 单次查询原则](templates.md#单次查询原则强约束) 决定是否续拉。
151
+
152
+ > 不要因为别名清单"看起来太长"就拒绝执行;命令端会自动 alias→sub_field 展开 + 去重 + 合并默认字段,传整列 `name_zh` 是支持的。
153
+ > 若用户只要"主要字段 / 常用字段"等模糊措辞,请反问澄清后再执行,**禁止**自行裁剪。