DSH Recruitment Bundle: 7 skills for job analysis, dual-channel sourcing on Boss Zhipin and Liepin, resume evaluation, and interview scheduling, with a built-in browser panel on the right side of the web for remotely operating the recruitment station.
- Language
- JavaScript
- License
- MIT
- Branch
- master
Install
$ dsh plugin --profile web add github:Viy1204/recruiting-copilotRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
Install via your agent
Install the DeepSeek Harness plugin Viy1204/recruiting-copilot for me: review the repository at https://github.com/Viy1204/recruiting-copilot first, then run the install command and verify the plugin loads successfully.
Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.
One-Line Positioning
This is an AI recruitment copilot for HR / headhunters: organizes job requirements, daily sourcing & initial screening with greetings on Boss Zhipin + Liepin dual channels, resume evaluation, scheduling interviews, candidate ledger & daily reports into an AI workflow, and embeds a ready-to-use recruitment browser panel in the right side of the DSH Web interface.
Core Capabilities
- Provides 7 recruitment skills covering the entire recruiting chain: "initialize workspace → organize job → daily sourcing greetings → resume evaluation → schedule interview → market inventory → daily Q&A"
- Uses AI copilot to turn vague "I need a XX" into executable initial screening standards, producing external JD, internal notes, and target company lists
- One-sentence trigger for daily sourcing on Boss Zhipin + Liepin dual channels: check unread, search candidates, initial screening, greet after confirmation, update ledger, generate daily report
- Resume evaluation supports both local PDF/images and optionally receiving Liepin/BOSS resumes from Lark email for deduplication and archiving
- When scheduling interviews, automatically checks interviewer availability, creates calendar events with video conference links, invites interviewers, and syncs interview files
- Renders a remotely operable browser in the right dock column of DSH Web UI, reusing login states from boss-cli / liepin-cli
Technical Implementation
- Language: JavaScript (ES Module, zero third-party dependencies)
- Key Dependencies: Node built-in
fetch/WebSocket/child_process(lib/index.js:29-32); host@deepseek-ai/dsh-skill-filesystemanddsh-host-webserver; external CLIboss-cli(Viy1204 fork) - Architecture Pattern: Dual identity - both a profile bundle (enables host skill-filesystem via
dsh/cordis.patch.ymland registersskills/as global custom skill root) and a cordis plugin + client module pair (lib/index.jsmounts/plugins/recruiting-view/*routes,client.jsregisters intoshell.overlayslot) - Entry Files:
lib/index.js(host plugin, exportsapply(ctx, rawConfig)) /client.js(browser-side panel) /dsh/cordis.patch.yml(profile patch layer)
Use Cases
HR or headhunters who need to handle large volumes of Boss / Liepin communications and candidate filing daily. Want AI to help search, screen per established criteria, generate greeting messages and sync to ledger, while directly viewing recruitment site within DSH interface without switching windows. Also usable for one-time deep market talent structure analysis for a position, or batch evaluation of resumes freshly received from Lark email.
Prerequisites & Compatibility
| Dependency | Min Version | Description |
|---|---|---|
| DSH | Not declared | Depends on host dsh-skill-filesystem and dsh-host-webserver; right browser panel only appears in web profile, headless and other profiles without webServer only register skills |
| Node.js | >=22 | package.json engines.node; install script minimum requires >=20, but lib/index.js uses Node 22+ built-in fetch/WebSocket |
| Chrome / Edge | Installed locally | Used to drive real browser in panel; can specify via CHROME_PATH or PUPPETEER_EXECUTABLE_PATH when not found |
| boss-cli (fork) | >=0.7.0 | Auto-installed by skills/recruit-init/scripts/install-dependencies.sh as git+https://github.com/Viy1204/boss-cli.git#main, old versions can't connect panel with random ports |
| liepin-cli | >=0.2.0 | Also auto-installed by install script as @viyzhu/liepin-cli, old versions clearly prompt when panel is empty with random ports |
| lark-cli | Optional | Without it, daily reports output local Markdown, interview scheduling gives manual meeting creation list, resumes need to be provided locally; sourcing and local resume evaluation unaffected |
| Platform | Cross-platform | macOS / Windows / Linux; startup parameters determined from process.platform, all three platforms covered |
Installation
dsh plugin --profile web add github:Viy1204/recruiting-copilot
Configuration Options
| Config | Type | Description | Default |
|---|---|---|---|
sources | Array | Which sources to mirror in recruitment browser panel (boss / liepin), each with name / port / match / homeUrl / userDataDir / defaultHidden; only write differences in patch, rest supplemented from built-in defaults | [boss:53470, liepin:53471] |
frameIntervalMs / watchdogIntervalMs | Number | Frame interval (ms), too small increases bandwidth, too large increases delay; clamped to 200~30000 range | 700 |
jpegQuality | Number | JPEG quality for MJPEG frame push, clamped to 10~100 range | 80 |
maxFrameWidth | Number | Max single frame width, clamped to 320~4096 range | 1800 |
RECRUIT_BROWSER_HIDDEN env var | String | Shared three-way override: set true force headless, force force headed, unset uses each source's own defaultHidden (BOSS headed, Liepin headless) | Not set |
BOSS_BROWSER_REMOTE_DEBUGGING_PORT / LIEPIN_BROWSER_REMOTE_DEBUGGING_PORT env vars | Number | Override boss-cli / liepin-cli's fixed CDP debugging port; if env vars changed, sources[].port in patch must also follow | 53470 / 53471 |
CHROME_PATH / PUPPETEER_EXECUTABLE_PATH env vars | Path | Manually specify executable path when local Chrome/Edge not found | Auto-detect |
BOSS_CLI_SOURCE / LIEPIN_CLI_SOURCE env vars | URL/package name | Source for installing boss-cli / liepin-cli (read by script) | git+https://github.com/Viy1204/boss-cli.git#main / @viyzhu/liepin-cli |
FAQ
Q: What else needs to be done after installation?
A: Need Node ≥20, Chrome/Edge installed locally, and run skills/recruit-init/scripts/install-dependencies.sh once to install boss-cli (Viy1204 fork) and liepin-cli, then scan QR once for each to save login state. Optionally install lark-cli to make daily reports output to Lark cloud docs, interview scheduling auto-create calendars.
Q: What to do when BOSS in recruitment browser panel shows "Account Restricted"?
A: Usually triggered BOSS risk control - page text says "Detected your account using third-party recruitment management systems, plugins,外挂, software and other auxiliary tools". Plugin already defaults by source (BOSS headed, Liepin headless), don't set RECRUIT_BROWSER_HIDDEN to true or it will drag BOSS into headless too. During restriction period only web is limited, Boss Zhipin APP and PC client work normally.
Q: Will not installing lark-cli affect core functions?
A: No. lark-cli only affects three optional scenarios: daily reports to Lark cloud docs, interview scheduling creates calendar, receiving resumes from Lark email; sourcing, local resume evaluation, ledger, panel all unaffected, will output as local Markdown or manual operation checklist.
Q: How to uninstall or rollback?
A: Use dsh plugin --profile web remove recruiting-copilot to uninstall, use update subcommand to pull latest commit. If you manually operated old version in panel before, restarting DSH session lets new version take effect - panel defaults to collapsed and read-only, headless/headed toggle button removed.
Q: What does empty panel prompt "Please update liepin-cli" mean?
A: Old liepin-cli used puppeteer.launch() to assign random CDP ports, panel can't detect at fixed port 53471. Need upgrade to @viyzhu/liepin-cli ≥0.2.0, boss-cli also requires fork version ≥0.7.0, otherwise panel can't connect that browser.
Q: Will automation trigger recruitment platform risk control?
A: Irreversible external actions like greeting, clicking "Not Suitable", notifying candidates default require user confirmation first, AI doesn't automatically reject people. Plugin has built-in risk control circuit breaker: when page hits 403/verify/security-check, stops all auto actions and shows red prompt at panel top, requires manual confirmation to release.
Learning Curve
Advanced — requires understanding DSH profile bundle's dual identity (patch enables skill + host plugin takes over browser), and running initialization flow once in workspace; panel mode related env vars (RECRUIT_BROWSER_HIDDEN / port override) have platform experience threshold, but daily use only needs to say "Process today's recruiting".
Known Issues & Limitations
- BOSS browser defaults headed, Liepin browser defaults headless: observed same account got BOSS web login restricted for 24h due to headless UA, so two sources no longer unified headless (README.md:9-46)
- Don't set
RECRUIT_BROWSER_HIDDEN=true: will drag BOSS into headless too, is observed accident path (README.md:22-23) - Button to switch headless/headed mode in same session removed: UA switching between
HeadlessChromeandChrome= 24h account ban; host'ssetModeimplementation kept but no UI entry (dsh/README.md:140-142) - liepin-cli old versions use random ports, panel can't take over: requires
@viyzhu/liepin-cli ≥0.2.0,@viyzhu/boss-cli-fork ≥0.7.0(README.md:144-146) - Changing
RECRUIT_BROWSER_HIDDENdoesn't take effect when port already has instance: need to firstboss shutdown/liepin quitto close that one (README.md:142-143) - Browser panel defaults collapsed, defaults read-only (input dispatch off): need to explicitly open via toolbar 🔒; collapse state persisted in
localStorage(dsh/README.md:144-146) - Fit (pinning page viewport to panel size) failure retry max 3 times: prevents being triggered by second-level resize to trigger risk control, after exceeding limit stops and writes reason to
state.error(lib/index.js:185-191) - Risk control/verification page circuit breaker: URL matching
RISK_URL_RE(403 / verify / security-check forms) stops self-healing restart, fit retry and all control actions (exceptwatch/clear-risk/set-target), requires human to click prompt bar to release (lib/index.js:165-174) - Risk control detection intentionally excludes
about:blank: that's new tab initial state, including would lock the panel itself (lib/index.js:159-163) - When external CLI unavailable, panel can launch browser, but boss-cli's anti-detection protection only attaches to CLI process's CDP session, expires when process exits: so during cross-command persistent period, browser seen in panel is completely naked (README.md:27-29)
- boss-cli / liepin-cli / lark-cli are all prerequisites: install script reports missing but doesn't block workspace creation; panel takeover only effective in web profile (README.md:58-74)
给 HR / 猎头用的一套 AI 招聘工作流:逼问式梳理岗位真实要求 → Boss直聘 + 猎聘双通道每日寻源初筛 → 打招呼 → 约面试 → 候选人台账 → 日报。 另有市场人才盘点、简历评估,以及从飞书邮箱按需收取猎聘 / BOSS 的简历附件。
配合任意 AI 编程助手使用:Claude Code、Codex、workbuddy、qoderwork、MiniMax Code、Z code 等——
只要你的工具能读工作区里的 AGENTS.md,就能跑这套流程。
⚠️ 账号安全须知(2026-08-19 更新,务必读)
两条规则:不要给 BOSS 开无头;日常招聘动作走 CLI 命令,别在「招聘浏览器」面板里手动点操作。
关于无头:BOSS 现在默认有头(真窗口,启动时会抢一次键盘焦点),猎聘仍默认无头。 两家按证据分别定,不强求一致:
- BOSS 之前默认无头,2026-08-19 改回来了——一个账号被 限制 web 端登录 24 小时,页面文案 写明「检测到您的账号存在使用第三方招聘管理系统、插件、外挂、软件等辅助工具」;另一个团队 用上游版(默认有头)长期无事,他们的 AI 擅自改走无头之后当天封号。无头 Chrome 的 UA 自报
HeadlessChrome,而 Client Hints 仍说Google Chrome,这个自相矛盾是零误报的信号。- 猎聘的风控形态一次都没观测过,没有证据支持翻它的默认,而不抢焦点是实打实的好处。
别设
RECRUIT_BROWSER_HIDDEN=true——它是统一覆盖开关,会把 BOSS 一起拖进无头。 抢焦点是体验问题,被限 web 端登录是业务问题。顺便:被限期间只有 web 端受限,BOSS直聘 APP 和 PC 客户端照常能用,不必停工。
原因:boss-cli 的反检测保护(拦风控 SDK、把上报端点用 204 假装成功、注入页面守卫等四层) 全部挂在 CLI 进程自己的 CDP session 上,进程一退出就全部失效。已实测确认。所以浏览器 跨命令常驻期间是完全裸奔的,面板操作和面板发起的导航都在这个裸奔时段里,不受任何保护。
同一个测试账号在 2026-08-18 被限制两次:一次是排查时并挂第二个 host 加反复切贴合(页面秒级 反复 resize),限制几小时;一次是点面板的有头/无头切换(同一会话内 UA 在
HeadlessChrome与Chrome之间突变),限制 24 小时。本版本已做的加固:
- 摘掉有头/无头切换按钮——默认已经是有头,正常不需要切模式;同一会话内切模式会造成 UA 突变,那正是第二次被限的原因。
- 面板默认折叠、默认只读,且折叠状态持久化。展开会让 host 持续订阅画面并开启崩溃自愈; 要手动操作需按工具栏 🔒 显式打开。
- 风控页熔断:一旦页面落到 403 / verify / security-check,host 立刻停掉自愈重启、停掉 贴合重发、拒绝一切导航与启动,面板顶部显示红色提示条,需人工确认后才解除。 (被限期间继续访问会把恢复时间一路延长。)
如果你之前装过旧版本并在面板里手动操作过,建议
git pull更新后重启 DSH 会话。 细节与后续计划见 #33。
它帮你做什么
- 岗位梳理:一次一问的访谈,把「我要一个厉害的 XX」问成一份可执行的初筛标准——硬门槛、命脉技能、排除信号、目标公司、搜索词。同时产出对外 JD 与对内寻源笔记。
- 每日招聘:说一句「处理今天的招聘」,AI 就去查两个平台的未读、按你的标准主动搜人、初筛、经你确认后打招呼,然后补台账、出日报。
- 市场盘点:某个岗到底好不好招?一次深度调研说清市场供给、薪资水位、目标公司的人挖不挖得动,并附可推进名单。
- 简历收取与评估:直接丢本地简历,或让 AI 去飞书邮箱翻近期的猎聘 / BOSS 简历邮件,去重下载附件后走同一套 review、台账与面试档案流程。
- 约面试:查面试官忙闲、建带视频会议链接的日历日程、拉面试官进会、生成候选人邀约话术,面试档案自动同步。
- 越用越准:每轮从命中的真实简历反向提取搜索词,回填关键词迭代表,下一轮搜索更准。
- 安全红线:对外不可逆的动作(打招呼、点「不合适」、通知候选人)默认先经你确认,绝不自动拒人。
前置条件(所有工具通用)
- Node.js ≥ 20,本机装有 Chrome。
- 运行下方「安装与使用」里的依赖安装脚本。脚本装的 Boss CLI 是
Viy1204/boss-cli维护版——它跟着 Boss 前端改版走, 带着当前的兼容与安全基线。macOS 上如果 npm 全局命令不在PATH,脚本会幂等地改一次当前 shell 的配置文件(zsh 写~/.zprofile,bash 写~/.bash_profile)。 - 两个平台各扫码登录一次(登录态存在浏览器的 user-data-dir 里,一次能管很久):
boss login liepin loginlogin一定是可见窗口(扫码必须看得见)。BOSS 平时跑的也是有头窗口;猎聘平时无头,liepin login会先关掉无头实例再以有头拉起,登录态不会丢。 - 可选:飞书用户装 lark-cli 并配置凭证 → 日报出飞书云文档、约面试直接建日历日程和视频会议, 还能从飞书邮箱收取猎聘 / BOSS 简历附件;不装则日报输出本地 Markdown、约面试给你一份手动建会清单、 简历需本地提供。寻源、本地简历 review 和台账功能都不受影响。
安装与使用
方式一:通用(Codex / workbuddy / qoderwork / MiniMax Code / Z code / 任何 agent 工具)
git clone <本仓库地址>
cd recruiting-copilot
sh skills/recruit-init/scripts/install-dependencies.sh
用你的 AI 工具打开这个目录,说:「帮我初始化招聘工作区」。 AI 会检查依赖、在你指定的位置建好工作区、注册各工具认得的项目级 skill, 然后逐个岗位跟你梳理招聘要求。
补充:用
~/.agents/skills约定的工具,也可以npx skills add Viy1204/recruiting-copilot把这套 skill 装成全局。不装也没关系——工作区里已经带了一份。
之后每天:用 AI 工具打开你自己的工作区目录,说 「处理今天的招聘」。 任何时候不确定该干什么,说一句 「这套工具怎么用」,AI 会按总目录带你走。
方式二:Claude Code 插件(额外获得 slash 命令与自动触发)
claude plugin marketplace add <本仓库地址>
claude plugin install recruiting-copilot
然后:
/recruit-init—— 初始化工作区(首次一次)/recruit-grill <岗位>—— 梳理某个岗位的要求/recruit-daily—— 处理今天的招聘(日常也可以直接说「处理今天的招聘」)/recruit-mapping <岗位>—— 深度盘点某岗的市场人才/resume-review—— 评估本地简历,或收取飞书邮箱的猎聘 / BOSS 简历附件后评估/interview-schedule—— 约面试:日历 + 视频会议 + 拉面试官,档案台账同步/ask-viy—— 不知道该用哪个?问它
方式三:DeepSeek Harness 插件(任意工作区都能用这套招聘 skill)
DeepSeek Harness(dsh)用户,
在任意目录执行:
dsh plugin --profile web add git+https://github.com/Viy1204/recruiting-copilot.git
(web 是 Web 界面 profile;headless 等其他 profile 同理,把 web 换成名字即可。)
安装后重启 DSH 会话,本仓库 skills/ 下的 7 个 skill 就会出现在任意工作区的
skill 目录里(不必把仓库克隆成工作区):
ask-viy、recruit-init、recruit-grill、recruit-daily、resume-review、
interview-schedule、market-talent-mapping。
附带功能——Web UI 右侧「招聘浏览器」面板:DSH Web 界面右侧是一只能直接上手操作的浏览器,
鼠标、滚轮、键盘、中文输入法、粘贴全都直通。BOSS 和猎聘都是可用的源,面板顶部一键切换;
浏览器没起时在面板里点一下就能拉起——用的是两个 CLI 各自的 user-data-dir 和固定调试端口,
登录态通用,之后跑 boss / liepin 命令会直连同一只,不会另开一只。
两个源的默认模式不同:BOSS 有头(真窗口,抢一次键盘焦点),猎聘无头。
不要为了不被打扰把 BOSS 改成无头——无头的 HeadlessChrome UA 已实测招来 web 端登录限制,
见开头的安全须知。面板的价值在于不用切窗口就能看到页面:它默认开着「贴合」,把页面视口固定成
按源写死的尺寸(BOSS 958×1149、猎聘 1440×1149),所以面板里的文字是原生大小,
而不是整页缩小后的糊图。
RECRUIT_BROWSER_HIDDEN 是统一覆盖开关(本插件 / boss-cli / liepin-cli 三方共读):
不设时两边各用自己的默认,显式设了才拉平两家——所以 =true 会把 BOSS 一起拖进无头,别这么用。
端口上已经有实例在跑时改这个变量不生效(那只会被直接复用),得先 boss shutdown /
liepin quit 关掉它。
面板接管需要 @viyzhu/boss-cli-fork ≥ 0.7.0、@viyzhu/liepin-cli ≥ 0.2.0:更早的版本要么用随机调试端口,
要么命令跑完就关浏览器,面板连不上。装旧版时面板的空态文案会直接告诉你是版本问题。
更新 / 卸载:
dsh plugin --profile web update recruiting-copilot # 拉到最新提交
dsh plugin --profile web remove recruiting-copilot # 卸载
原理与本地验证见
dsh/README.md:仓库根package.json声明dsh.bundle,装好后作为 profile 的 patch 层,启用宿主 skill-filesystem 并把本仓库skills/注册为全局自定义 skill 根;同一个包还带 host 插件(CDP 抓帧) 与客户端模块(右侧面板)。
工作区长什么样
初始化后你会得到一个自足的招聘工作区(换任何 AI 工具打开都能接着干活):
你的工作区/
├── CONTEXT.md ← 唯一事实源:初筛硬规则、在招岗位与优先级、术语表、决策记录
├── AGENTS.md ← 告诉 AI 工具在这里怎么干活(路由 + 红线)
├── skills/ ← 工作流文档的唯一内容源(随工作区走)
├── .agents/skills/ ← Codex / Agent Skills 项目级自动发现入口
├── .claude/skills/ ← Claude Code 项目级自动发现入口
├── .qoder/skills/ ← Qoder 项目级自动发现入口
├── 01-jd/ ← 对外 JD + _internal/ 对内寻源笔记(不外发)
├── 02-sourcing/ ← dedup-ledger.csv 候选人台账(唯一事实源)+ shortlist
├── 03-interview/ ← 面试档案(一人一文件)
├── 04-offer/ 05-onboarding/
├── _shared/templates/ ← 新岗位/新面试的模板
└── runtime/
├── reports/ ← 本地日报与 review 汇总
└── resumes/ ← 邮件简历附件 + 导入去重索引
三个隐藏目录里只放指向 skills/ 的链接,不会复制出三套内容。其他工具即使没有自己的
skill 注册目录,也能从根目录 AGENTS.md 路由到同一套流程。ZCode 可以直接读 AGENTS.md;
想让技能出现在 ZCode 面板里,可在 Settings → Skills 中从 Codex 或 Claude Code 来源导入到当前 Project。
设计原则(为什么长这样)
- 本地文件是唯一事实源:台账、JD、面试档案都是你目录里的纯文本。AI 换了、工具换了,数据都还在。
- 标准与执行分离:筛选标准全在
CONTEXT.md(你的),工作流文档不写死任何数字(通用的)——改标准只改一处。 - 对内对外分离:寻源策略、排除信号、薪资带宽放
_internal/不外发;对外 JD 干净到可以直接发布。 - 不可逆动作必经确认:AI 可以帮你筛一千份简历,但拒绝一个人、联系一个人,默认由你拍板。
- 邮箱只是输入渠道:只读收取,不标已读、不移动 / 删除、不回复 / 转发;风险邮件和不可信附件不自动下载。
想了解这些取舍背后的原因,读 设计思路与理念。
绝活日资料包
Read the usage guide →
Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.
Listing badge
[](https://deepseek-plugin.org/plugins/Viy1204/recruiting-copilot)Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.