agentsclimarketplace

Pxb liepin

Skill dizhouid-lgtm/liepin-ai-loop-recruiting/.claude/skills/pxb-liepin

一款 LOOP 自动化筛选简历的 SKILL,基于猎聘 CLI。AI 根据你的判断和评价,半小时助你从 1000 份简历中找到最对口的那一个。

Install
npx -y skills add dizhouid-lgtm/liepin-ai-loop-recruiting --skill pxb-liepin

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Pixboom 招聘搜人筛人作业流程(猎聘 liepin-cli),为任一岗位搜候选人、筛简历、提报、 维护候选人池/去重台账/JD 记录。当用户说"搜人""下一轮""继续搜""筛简历""提报候选人" "开简历给我看""出 PDF""更新候选人池",或要为某岗找人/筛人时使用;岗位招满或用户说 "这个岗招完了/先暂停"时,走本流程的收官复盘(步骤 7)。岗位标准看该岗 JD,本流程岗位中立。

SKILL.md

21.8 KB, as published. Nobody here has run it

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 强制无头、不弹窗,跑得通=已登录,连着往下跑;只有脚本报未登录才登录。

  • 脚本报未登录/被踢 → 运行(唯一允许有头的命令),让用户扫码:
    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 调小,别立刻重刷。
  • 卡片判不了能力(实做/真伪/方向细节要精筛),粗筛只分三桶:
    1. 卡面就能判死粗筛不合适:硬约束出局(城市/期望薪资/年限/学历/年龄)、期望职位明显转行、卡面可见的通用排除(见步骤2)。
    2. ~10 个最对口 → 拉进精筛(别只挑 5、也别宽到 20+)。
    3. 其余卡面过得去/拿不准 → 留 未精筛(干净库存:召回变稀时直接挑它再精筛,不重搜)。拿不准就留未精筛,别误标粗筛不合适
    node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 粗筛不合适 <卡面否的id...>
    
  • --limit 40 起步(自动翻页,别 --page):漏斗要宽,~40-50 里挑 ~10。别为快降到 20。健康比 未精筛:精筛 ≈ 4:1,dedup.mjs stats 随时自查。

2. 精筛(批量取、按 JD 下判决)

拉粗筛挑的 ~10 份,一个循环拉完 = 1 回合,别开一份判一份:

node .claude/skills/pxb-liepin/scripts/fetch.mjs <id1> <id2> ...   # 逐份打窄字段,内置抖动
  • 单份打不开(已删/隐藏类)脚本会跳过并在结尾列出 → 这些 id 直接 set 精筛不合适;登录/反爬/连续失败才整批停(非零退出),处置后用它打印的命令续跑剩余。

每份过三关(对照该岗 JD):

  1. 硬约束&去向:硬约束粗筛卡片已初筛;精筛复核 want_city(期望城市不在本岗城市=想迁走,慎留)。
  2. 正/负向建议:命中正向画像几条?命中负向排除信号 → 砍。
  3. 真伪:实做主看 work_history 每段的 duty(时间线下那段实际做了啥,精筛主料)——判成色/方向;self_descr 作补充(自述,空泛堆技能名词的警惕注水);再叠薪资-成色错配(带队多年要地板价=注水)、方向偏离 → 砍。段头时长/公司看稳定性(跳槽/空窗)。

通用排除(岗位中立,叠在 JD 上,命中即砍):① 简历空洞看不出职责产出;② 频繁跳槽(多段 <1 年且无任何 ≥2 年稳定段);③ 在职+暂无跳槽打算(work_status"在职,暂无跳槽打算"——约不动、议价难,统一砍;"离职找工作/在职急寻"保留。搜索已默认在服务端排除这档,精筛这里只兜底:发现漏网的照砍并跑 doctor.mjs 查 CLI 版本);④ 近一年无工作(末段结束超 1 年)。①卡片看不出留精筛,②④卡片能初判的粗筛就先排。

归档:过三关、值得给用户看 → 待定;其余 → 精筛不合适("够得着但不对"直接砍)。

node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 待定     <过关id...>
node .claude/skills/pxb-liepin/scripts/dedup.mjs set "<岗位>\去重台账.csv" 精筛不合适 <淘汰id...>

3. 够一批没?

node .claude/skills/pxb-liepin/scripts/dedup.mjs stats "<岗位>\去重台账.csv",以台账为准、别心算:待定 ≥ 5(或到目标人数)没?

  • 没够 → 回步骤 1 搜下一页(别停问用户)。
  • 够了 → 步骤 4。
  • 方向熔断:本次循环已粗筛 ~100 人(≈2 页)却 0 进 待定停、反馈用户:搜了 N 人 0 命中,说清都倒在哪关/哪类,多半方向或标准有偏,等校准。别闷头刷。
  • 路径枯竭(召回越来越稀)→ 先挖 未精筛 库存;仍无 → 停,报情况 + 换路径建议。

4. 出 PDF + 交用户(不开网页)

这批 待定 一次性出 PDF 到 待定/默认不开 Chrome(占 profile 挡搜索)。

node .claude/skills/pxb-liepin/scripts/pdf.mjs --dir "<岗位>\待定" "<id1>=张三-大疆" "<id2>=李四-影石"
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=<id>)),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 <csv> 未精筛 → 库存里没细看的,直接精筛(本就是该挖的)。
  • 标准明显变向时(某硬约束放宽/新增正向信号)→ dedup.mjs list <csv> 精筛不合适 取近几轮可能受影响的重新 fetch + 复判(要重拉简历、耗调用,只挑相关的、别全表重刷)。
  • 翻案的 → set ... 待定,并入本批。"越搜越少"多半就是只往前搜、不回头捡。

E.进化后的关键词回步骤 0 继续,到满额收尾。

收尾自检:召回全登 CSV 了(脚本保证)?待定 都出 PDF 交用户了?未精筛:精筛 ≈ 4:1(dedup.mjs stats)?入选进候选人池了?JD 表用 jd-round.mjs 追加本批行了(强词含入选新抽的词、正向含真读印证)?lock.mjs release <岗位> 了?

7. 结项复盘:收官时给 SKILL 提通用改进(一岗收官只跑一次)

触发:台账 入选 达到 JD 目标人数,或用户明说本岗"招完了/先暂停"。只复盘流程,不返工候选人。

  1. 收证据,只认事实不凭印象:本岗 JD 内部备注表全部轮次(哪类词反复失效、哪类负向建议反复补)+ dedup.mjs stats 漏斗比例 + 本次全程的返工点(用户纠正过什么、哪步重来过、哪条红线差点破、同一件事问过用户几次)。
  2. 通用化闸门,逐条过:把每条候选改进改写成不含本岗/本公司/本行业字眼的一句话;改写不出来 = 岗位经验 → 回写该岗 JD.md 备注,到此为止、不进 SKILL。
  3. 改法只限 SKILL 正文:通过闸门的,落成本文件的具体措辞改动(加一句纪律/改一个提示/挪一个步骤);scripts/*.mjs 一律不动——各家模型能力不一,脚本问题只写进 issue 留维护者评审。一次最多 5 条,挑影响最大的,别做成大扫除。
  4. 交用户拍板:提案列成短清单(每条 = 踩的坑 → 建议措辞,标「正文」或「涉脚本,仅记录」);用户点头的当场改 SKILL 正文,没点头的只进 issue。
  5. 提 issue 存档(发送前正文给用户过目;候选人信息、公司/岗位名一个字不进 issue):
    gh issue create --title "[SKILL复盘] <一句话概括>" --body-file <临时md>
    
    正文三段:观察到的问题(通用化描述)→ 建议改法(含已当场改掉的)→ 涉脚本待评审项。没装 gh 或没登录 → 同样内容存 _共享/复盘-<岗位>-<日期>.md,请用户自己去仓库贴 issue。

脚本清单(都在 .claude/skills/pxb-liepin/scripts/,命令写全路径)

脚本用法干什么
init-role.mjs"<岗位>"新岗一键建档:复制模板三件 + 建 待定/参考简历/;幂等只补缺
doctor.mjs[--kill]开工体检:cli 版本(下限+是否最新)/无头补丁/锁/残留浏览器;--kill 顺带清残留
lock.mjsacquire|renew|release <岗位>单账号搜索锁,30 分钟过期;校验岗位归属,liepin 成功调用自动续;acquire/renew 打印本轮纪律
search.mjs<csv> "<词>" [--city --limit --experience --salary --degree --age --user-status]搜(JD 硬约束全传参;默认服务端排除"在职,暂无跳槽打算")+去重+登记 未精筛+打窄表,结尾提示三桶下一步
fetch.mjs<id...>批量拉简历窄字段(含逐段 duty),内置抖动;单份打不开跳过列出,账号级问题才整批停
dedup.mjsseen|add|set|list|stats <csv> [状态] [id...]台账查重/改状态(5 值)/按状态列 id(回扫)/比例自查;待定 挂账会提醒
jd-round.mjs<JD.md> "<轮次>" "<强>" "<弱>" "<正>" "<负>"往内部备注表只追加一行(紧贴上行、转义,免手编甩出表格)
pdf.mjs--dir <目录> <id=标签...>整页存 PDF;登录页/坏 PDF 非零退出并打印续跑命令
patch-headless.mjs(装完跑一次,可选)发布版默认改无头,免疫裸调用弹窗;幂等,npm update 后重跑

liepin 命令细节见同目录 liepin-cli skill。环境/安装见仓库根 README.md

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.