Install
$ agentstack add skill-dizhouid-lgtm-liepin-ai-recruiting-pxb-liepin ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Pixboom 搜人筛人作业流程
> ⚠️ 改本 Skill 前先想:这里只放所有岗通用、可复用的作业流程。单一案例/某轮/某岗经验 → 进该岗 JD.md,不进这里。 > 每岗四件:JD.md(对外 JD + 内部备注表,判断只看它)· 去重台账.csv(resume_id,status,仅去重)· 候选人池.md(确认候选人)· 待定/(简历 PDF 中转)。 > 路径:命令里 \… 相对工作区根(本 CLAUDE.md 所在);脚本全在 .claude/skills/pxb-liepin/scripts/,命令都写全路径,原样可跑。机械活全在脚本、跨 Win/mac;判断在本文 + agent。
全流程:两层循环,主 agent 串行自跑
P. 聊全 JD → 0. 体检+抢锁 → 0.5 登录 → 1. 粗筛 → 2. 精筛 → 3. 够一批没(没够回 1)→ 4. 出 PDF 交用户 → 5. 入池 → 6. 迭代回 0;招满/用户喊停 → 7. 结项复盘。
- 不派 subagent:单账号单锁串行,subagent 无并行收益、反而启动慢易卡死;主 agent 从头跑到尾。
- 小循环(1-3,自跑、不打扰用户):搜一页 → 粗筛挑 ~10 → 精筛 → 对口标
待定→ 没攒够回步骤 1,连轮跑到攒够 ~5 个待定。绝不跑一轮就停等用户。 - 大循环(4-6,用户校准 JD):出一批 PDF → 用户复核 → 入池 → 迭代回写 JD(重点是进化关键词)→ 下一批。JD 越调越准、小循环越搜越准。
- 上下文:脚本只输出窄表。看完做完判断后记住结论即可(
待定的 id=标签、方向感、哪个词有效),别把整页窄表一直留着;轮数多了丢旧轮明细。
状态机(去重台账只此 5 值,全程走 dedup.mjs,绝不手改 CSV)
未精筛(捞回来没细看的干净库存)→ 粗筛不合适(卡片就否)/精筛不合适(细看后否,含用户毙掉的)/待定(细看够格、出了 PDF 等复核)→ 入选(用户拍板要了)。
心跳 + 输出纪律(治"闷头静默"和"过程废话/散问打断")
- 边跑边报:每跑完一轮先发一行进度再继续,别让用户 10-20 分钟看不到动静。格式:
第N轮(词:X):搜A/精筛B/新增待定C,累计 D/目标 E,继续…。心跳是单向,不算打扰。 - 心跳就那一行:逐人淘汰理由、本轮发现、推理全留你脑子里 + JD 表,别讲给用户。
- 交付干净:出批消息 = 几份可点 PDF + 问为什么,别夹每轮过程、复盘、SKILL 自测。
- 决策别打断、给推荐、能不问就别问:破例/放宽约束/停搜这类才需用户拍的,优先带推荐先做可逆一步(照推荐先提报、复核可撤),决策点在交付里一句话点出;真要问就攒一处、一次问清、每条附推荐,别过程里东一句西一句、也别没问完就干等。照 JD 能自己判的,别问。
全程红线
① 单账号串行,绝不并发调 liepin。② 反爬宁慢勿封:脚本非零退出即停、别密集连刷(脚本内已带抖动)。③ 原始 JSON 不进上下文(脚本只输出窄表)。④ 隐私:简历只存本地、不外发、不传外部服务。⑤ 只 search/resume,不 greet(沟通归 HR)。⑥ 只走脚本(search/fetch/pdf/jd-round,已强制无头),除用户手动 liepin login 外绝不裸敲 liepin(裸调发布版默认有头会弹窗)。全程不该弹任何浏览器窗口;弹了 = 有人裸调或没登录 → 停手排查、别继续刷(可选安全网:装完跑一次 patch-headless.mjs)。
> 脚本无参运行会打印用法;任一脚本退出码 ≠ 0 = 停手,按报错处置(多半反爬/被踢/未登录)。
P. 开搜前:把 JD + 人员画像聊全(主 agent+用户,不碰 liepin、不抢锁)
搜任何人之前,先把该岗 JD + 人员画像补到能搜的状态——判断全程只看它,补不全 = 瞎搜、多轮返工。在对话里完成。
> 🟢 怎么聊(最重要):像懂行的猎头跟用人方对齐需求,用人话把"要什么样的人、这种人在哪、什么样的看着像其实不是"聊明白。下面的"三锚/锚一二三"是给你对照的内部清单,不是台词——别把这些词、别"锚一锚二"这样列条目念给客户。自然地问、一次一两点。
⓪ 建档(新岗第一次):node .claude/skills/pxb-liepin/scripts/init-role.mjs "" 一键复制模板三件 + 建 待定/、参考简历/(幂等,只补缺不覆盖)。 ① 补事实(填 JD 硬约束行):预算/城市/经验/学历/年龄/目标人数。缺的顺嘴问,别追问"预算够不够"——按预算搜,真枯竭(步骤3)再谈。 ② 聊画像(内部对照"三锚";别问"最看重什么能力/不要哪类人"这种抽象话,客户答不出也喂不进搜索):
- 这种人在哪、叫什么 — JD 不写目标公司,得你配:读
_共享\公司档案.md× 岗位性质,网络检索+判断出"对标/竞品/上下游/相邻行业藏这类人的公司"分类清单,带职位名变体+锚点词,交用户勾选。落 JD「开搜前三锚」块 + 喂第一轮强词。 - 标杆长什么样 — 用户有样板简历就放
\参考简历\,真读(不读=没意义)抽正向画像/出身公司/技能锚点 → 落 JD 正向建议首行。没样板靠上一条兜。 - 什么看着像其实不是 — JD 只说谁合适;自然问"哪些行业/公司/岗位,乍看像这份 JD、其实不对路?"(走量客服像客服、镜头单件像整机结构)→ 落 JD 负向建议首行 + 排除词。
intake 完成判据(逐项勾齐才回写 JD、进步骤0;别用"感觉够了"代替):① 硬约束行填满 ② 目标公司清单已交用户确认 ③ 样板已读或已标"无/欠" ④ 反向锚已问或已标"欠" ⑤ 用户说"就按这个搜"。
- 答不全很正常(真实录取线常要看到拒绝才说清)→ 有样板靠样板三角定位,答不出的标"第一轮校准时确认",照样开搜。
- 快速通道:用户明说"立刻搜、先欠着" → 放行但记一笔欠哪块;第一轮当校准用(出批后按反馈补)。成熟 JD + 画像齐 + 用户直说搜 → 快速过一眼即可。
0. 开工体检 + 排队 + 抢锁(锁的生命周期只此一处,别处只引用)
开工先体检、看现场:
node .claude/skills/pxb-liepin/scripts/doctor.mjs # 环境预检;有 ✗ 先修再开工(--kill 清残留浏览器)
node .claude/skills/pxb-liepin/scripts/dedup.mjs stats "\去重台账.csv" # 看现场
- doctor 报 liepin-cli 落后最新版 → 一句话告知用户并推荐更新,用户点头才动:
npm i -g @viyzhu/liepin-cli→ 再跑一次 doctor 全绿才开工(无头安全网补丁会被覆盖,按 doctor 提示重打)。用户说先不更 → 记一句照旧开工。 待定> 0 = 上批还挂着:先清算(交付复核/催用户拍板,走步骤 4-5),清完再开新搜。- 队列里挂着孤儿
进行中(没有会话在跑它)→ 复位成待办。
搜人先往 _共享/搜索队列.md 追一行 待办;当 worker:抢锁 → 挑最早 待办 → 跑 → 标完成。
node .claude/skills/pxb-liepin/scripts/lock.mjs acquire # 本批第一轮前。退出码 1=别处在搜,排队;0=占到
node .claude/skills/pxb-liepin/scripts/lock.mjs renew # 每轮回搜前续命(顺带打印本轮纪律)
node .claude/skills/pxb-liepin/scripts/lock.mjs release # 步骤4 出 PDF 交用户复核时释放(不是流程最后)
- 一把锁 = 一"批":
acquire(本批首轮前)→ 每轮renew→ 步骤4 出 PDF 时release(复核是纯等待、不碰 liepin,把账号让给别的岗)→ 复核完回来搜下批再acquire。别从头持到尾(饿死别的岗),也别每轮 acquire/release(和排队打架)。 - renew/release 都带岗位名:锁在别岗手里续不动也放不掉(退出码 1 = 重新排队);liepin 每次成功调用会自动续锁,长回合不会中途过期。
- 多岗同招各自在队列排队;靠"批次边界释放锁"自然交错。
0.5 登录:自己探,别问用户登没登
直接拿第一轮 search 当探针:search.mjs 强制无头、不弹窗,跑得通=已登录,连着往下跑;只有脚本报未登录才登录。
- 脚本报未登录/被踢 → 运行(唯一允许有头的命令),让用户扫码:
``bash LIEPIN_HEADLESS=false liepin login # PowerShell: $env:LIEPIN_HEADLESS='false'; liepin login `` 跟用户说「我打开登录页了,扫一下二维码就行」;扫完 → 重跑刚才那条 search。
- 开搜前一次性告诉预期:「开始搜了,每轮约 10–20 分钟(慢是为了别被封),我每轮报你一句,凑够一批叫你看。」
1. 粗筛(脚本自动登 CSV)
node .claude/skills/pxb-liepin/scripts/search.mjs "\去重台账.csv" "关键词" --city 深圳 --experience 5-10年 --salary 20-30K --degree 本科 --age 25-35 --limit 40
- 筛选器前置(防漂移要点):每轮开搜前对照 JD 硬约束行,凡是筛选器能表达的(
--city/--experience/--salary/--degree/--age)全部传参,让服务端先滤——别搜宽了再靠人工一张张砍,更别拖到精筛才发现硬约束不合。JD 没约束的维度不传(别自行加码收窄召回)。经验/薪资/年龄跨档就传宽档或不传,宁可卡片上砍、不错杀。 - "在职-暂无跳槽打算"默认拦在召回外:
search.mjs默认带服务端求职状态过滤(--user-status 1,2,5,6,7,排除"在职,暂无跳槽打算""在校,暂时不找工作"——即通用排除③,零人工、不占召回名额)。用户明确要捞被动候选人时才--user-status 不限。
一步做完:search(带筛选器)→ 去掉台账已召回的 → 新人登记 未精筛 → 打印窄表(id/姓名/现职/年龄/公司/年限/期望薪资/学历/期望职位)。登 CSV 是查重命根,已强制做。
- 卡住保护:search 6 分钟硬超时(resume 2.5 分钟),卡死会强杀报错并自动清掉残留浏览器进程、不静默挂死。报超时 → 告诉用户"搜索卡住已中断",确认已登录、过几分钟再试或临时
--limit调小,别立刻重刷。 - 卡片判不了能力(实做/真伪/方向细节要精筛),粗筛只分三桶:
- 卡面就能判死 →
粗筛不合适:硬约束出局(城市/期望薪资/年限/学历/年龄)、期望职位明显转行、卡面可见的通用排除(见步骤2)。 - ~10 个最对口 → 拉进精筛(别只挑 5、也别宽到 20+)。
- 其余卡面过得去/拿不准 → 留
未精筛(干净库存:召回变稀时直接挑它再精筛,不重搜)。拿不准就留未精筛,别误标粗筛不合适。
``bash node .claude/skills/pxb-liepin/scripts/dedup.mjs set "\去重台账.csv" 粗筛不合适 ``
--limit 40起步(自动翻页,别--page):漏斗要宽,~40-50 里挑 ~10。别为快降到 20。健康比未精筛:精筛 ≈ 4:1,dedup.mjs stats随时自查。
2. 精筛(批量取、按 JD 下判决)
拉粗筛挑的 ~10 份,一个循环拉完 = 1 回合,别开一份判一份:
node .claude/skills/pxb-liepin/scripts/fetch.mjs ... # 逐份打窄字段,内置抖动
- 单份打不开(已删/隐藏类)脚本会跳过并在结尾列出 → 这些 id 直接
set 精筛不合适;登录/反爬/连续失败才整批停(非零退出),处置后用它打印的命令续跑剩余。
每份过三关(对照该岗 JD):
- 硬约束&去向:硬约束粗筛卡片已初筛;精筛复核
want_city(期望城市不在本岗城市=想迁走,慎留)。 - 正/负向建议:命中正向画像几条?命中负向排除信号 → 砍。
- 真伪:实做主看
work_history每段的duty(时间线下那段实际做了啥,精筛主料)——判成色/方向;self_descr作补充(自述,空泛堆技能名词的警惕注水);再叠薪资-成色错配(带队多年要地板价=注水)、方向偏离 → 砍。段头时长/公司看稳定性(跳槽/空窗)。
通用排除(岗位中立,叠在 JD 上,命中即砍):① 简历空洞看不出职责产出;② 频繁跳槽(多段 \去重台账.csv" 待定 node .claude/skills/pxb-liepin/scripts/dedup.mjs set "\去重台账.csv" 精筛不合适
## 3. 够一批没?
跑 `node .claude/skills/pxb-liepin/scripts/dedup.mjs stats "\去重台账.csv"`,**以台账为准、别心算**:`待定` ≥ 5(或到目标人数)没?
- **没够** → 回步骤 1 搜下一页(别停问用户)。
- **够了** → 步骤 4。
- **方向熔断**:本次循环已粗筛 ~100 人(≈2 页)却 **0 进 `待定`** → **停、反馈用户**:搜了 N 人 0 命中,说清都倒在哪关/哪类,多半方向或标准有偏,等校准。别闷头刷。
- **路径枯竭**(召回越来越稀)→ 先挖 `未精筛` 库存;仍无 → 停,报情况 + 换路径建议。
## 4. 出 PDF + 交用户(不开网页)
这批 `待定` 一次性出 PDF 到 `待定/`。**默认不开 Chrome**(占 profile 挡搜索)。
```bash
node .claude/skills/pxb-liepin/scripts/pdf.mjs --dir "\待定" "=张三-大疆" "=李四-影石"
node .claude/skills/pxb-liepin/scripts/lock.mjs release # 出完即释放,复核不碰 liepin,让账号给别的岗
- 脚本非零退出 = 有登录页/坏 PDF:FAIL 的别交付;登录页先
liepin login重登,再用它打印的命令续跑剩余。
交付消息只两样:①把 pdf.mjs 打印的每份路径列成可点链接([姓名·标签](/待定/简历_.pdf),href 用正斜杠,用户点开不必翻文件夹);②问为什么(合适/不合适各带理由——下一轮 JD 收敛的唯一燃料,不能只收"行/不行"): > 「这批 N 份出好了,直接点开看: > 1. [张三 · 大疆](/待定/简历张三-大疆.pdf) > 2. [李四 · 影石](/待定/简历李四-影石.pdf) > > 逐个看完跟我说哪些合适、哪些不合适,各自为什么:对的对在哪(背景/公司/作品/某段经历)、不对的差在哪(方向偏/成色虚/硬约束)。说得越细,下一轮越准。」
- 用户只甩"行/不行"没给理由 → 追问为什么(步骤6 全靠它)。
待定/留删:入选的 PDF 留下(候选人池直链);落选的拍板后删;下批出新 PDF 前清掉上批未入选的。
5. 入池
用户复核拍板后:
- 合适 →
候选人池.md加一行(姓名·现职·经验·薪资·学历·一句判断 +[PDF](待定/简历_.pdf)、[猎聘](https://lpt.liepin.com/cvview/showresumedetail?resIdEncode=)),dedup.mjs set ... 入选,PDF 留下。 - 不合适 →
dedup.mjs set ... 精筛不合适、删 PDF。
6. 迭代:进化下一轮关键词(本流程成败在此)
核心认知:真正改变候选池的只有搜索关键词。 词决定捞来谁(池子),正/负向建议只决定怎么筛。池子捞错,再严的筛也救不回。 别"随便换个词再用更严标准卡一轮"——把上一轮结果当数据、把搜索词当假设来修正。
A. 发动机:扒「入选」简历反推下轮的词(逐个真读,别拍脑袋):
- 职位名变体 ← 他们简历上自称什么?同岗多种叫法都拿来当并列(OR)词。
- 出身公司+当时岗位 ← 来自哪些公司、在那做的什么?某段特别对口往往是那家公司+当时那岗做的事契合 → 开「目标公司」轴,先顺藤摸瓜搜同公司同岗位的人,再扩到其对标/竞品/上下游。
- 技术/工具/项目名词 ← 反复出现的工具/项目/产品词,都是锚点。
B. 诊断本轮每个词、决定怎么调(一次只动一个轴,才看得出哪步起效):
| 本轮表现 | 诊断 | 怎么调 | |---|---|---| | 召回多但大多不对口 | 太宽/有歧义 | 收紧:加硬约束、换更具体职位变体、加排除词 | | 召回太少/快枯竭 | 太窄 | 放宽:同义近义词、职位变体,或扩邻近行业 | | 连 ≥2 轮净入池 0 | 该词判死 | 移进弱搜索词弃用,换锚点 |
关键词轴轮换:① 职位名+变体 ② 目标公司(对标/竞品/上下游)③ 技术/工具名词 ④ 项目/产品名词 ⑤ 邻近行业(本行枯竭时)。公司名别单独当搜索词(召回该公司全职能员工、非本岗位)。
C. 追加一行到 JD 表——用 jd-round.mjs,别手编表格(手编漏个空行就把行甩出表格):
node .claude/skills/pxb-liepin/scripts/jd-round.mjs "\JD.md" "R_(日期)·搜A/筛B/提报C" "" "" "" ""
- 强 ← 本轮有效词 + A 步从入选简历新抽的词。弱 ← 本轮无效/太宽/枯竭的词 + 为什么废。正向 ← 用户说的"为什么合适" + 你真读入选的交叉印证。负向 ← 用户毙掉的人归纳成排除信号。每格要点即可,别散文、别重抄硬约束。
D. 回扫错杀(本轮标准/方向有调整时必做,否则越搜越少):先动手 acquire 重新占锁。按新标准复判已召回的库存,别只往前找新词:
dedup.mjs list 未精筛→ 库存里没细看的,直接精筛(本就是该挖的)。- 标准明显变向时(某硬约束放宽/新增正向信号)→
dedup.mjs list 精筛不合适取近几轮可能受影响的重新 fetch + 复判(要重拉简历、耗调用,只挑相关的、别全表重刷)。 - 翻案的 →
set ... 待定,并入本批。"越搜越少"多半就是只往前搜、不回头捡。
E. 用进化后的关键词回步骤 0 继续,到满额收尾。
收尾自检:召回全登 CSV 了(脚本保证)?待定 都出 PDF 交用户了?未精筛:精筛 ≈ 4:1(dedup.mjs stats)?入选进候选人池了?JD 表用 jd-round.mjs 追加本批行了(强词含入选新抽的词、正向含真读印证)?lock.mjs release 了?
7. 结项复盘:收官时给 SKILL 提通用改进(一岗收官只跑一次)
触发:台账 入选 达到 JD 目标人数,或用户明说本岗"招完了/先暂停"。只复盘流程,不返工候选人。
- 收证据,只认事实不凭印象:本岗 JD 内部备注表全部轮次(哪类词反复失效、哪类负向建议反复补)+
dedup.mjs stats漏斗比例 + 本次全程的返工点(用户纠正过什么、哪步重来过、哪条红线差点破、同一件事问过用户几次)。 - 通用化闸门,逐条过:把每条候选改进改写成不含本岗/本公司/本行业字眼的一句话;改写不出来 = 岗位经验 → 回写该岗
JD.md备注,到此为止、不进 SKILL。 - 改法只限 SKILL 正文:通过闸门的,落成本文件的具体措辞改动(加一句纪律/改一个提示/挪一个步骤);
scripts/*.mjs一律不动——各家模型能力不一,脚本问题只写进 issue 留维护者评审。一次最多 5 条,挑影响最大的,别做成大扫除。 - 交用户拍板:提案列成短清单(每条 = 踩的坑 → 建议措辞,标「正文」或「涉脚本,仅记录」);用户点头的当场改 SKILL 正文,没点头的只进 issue。
- 提 issue 存档(发送前正文给用户过目;候选人信息、公司/岗位名一个字不进 issue):
``bash gh issue create --title "[SKILL复盘] " --body-file ` 正文三段:观察到的问题(通用化描述)→ 建议改法(含已当场改掉的)→ 涉脚本待评审项。没装 gh 或没登录 → 同样内容存 _共享/复盘--.md`,请用户自己去仓库贴 issue。
脚本清单(都在 .claude/skills/pxb-liepin/scripts/,命令写全路径)
| 脚本 | 用法 | 干什么 | |---|---|---| | init-role.mjs | "" | 新岗一键建档:复制模板三件 + 建 待定/、参考简历/;幂等只补缺 | | doctor.mjs | [--kill] | 开工体检:cli 版本(下限+是否最新)/无头补丁/锁/残留浏览器;--kill 顺带清残留 | | lock.mjs | acquire\|renew\|release | 单账号搜索锁,30 分钟过期;校验岗位归属,liepin 成功调用自动续;acquire/renew 打印本轮纪律 | | search.mjs | "" [--city --limit --experience --salary --degree --age --user-status] | 搜(JD 硬约束全传参;默认服务端排除"在职,暂无跳槽打算")+去重+登记 未精筛+打窄表,结尾提示三桶下一步 | | fetch.mjs | ` | 批量拉简历窄字段(含逐段 duty),内置抖动;单份打不开跳过列出,账号级问题才整批停 | | dedup.mjs | seen\|add\|set\|list\|stats [状态] [id...] | 台账查重/改状态(5 值)/按状态列 id(回扫)/比例自查;待定 挂账会提醒 | | jd-round.mjs | "" "" "" "" "" | 往内部备注表**只追加一行**(紧贴上行、转义,免手编甩出表格) | | pdf.mjs | --dir | 整页存 PDF;登录页/坏 PDF 非零退出并打印续跑命令 | | patch-headless.mjs | (装完跑一次,可选) | 发布版默认改无头,免疫裸调用弹窗;幂等,npm update` 后重跑 |
> liepin 命令细节见同目录 liepin-cli skill。环境/安装见仓库根 README.md。
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: dizhouid-lgtm
- Source: dizhouid-lgtm/liepin-ai-loop-recruiting
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.