ai-job-search-cn

agent
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 9 GitHub stars
Code Fail
  • exec() — Shell command execution in .agents/skills/liepin-search/cli/src/helpers.ts
  • network request — Outbound network request in .agents/skills/liepin-search/cli/src/helpers.ts
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

一条命令跑完国内求职:猎聘 BOSS 智联前程一起搜,学历户口外包这些硬门筛掉陪跑岗,打招呼话术和中文简历备好,你只管点发送。数据不出本机,Claude Code / Codex / Gemini CLI 都能跑。

README.md

AI 求职助手(中文版)

本机运行的 AI 求职助手:搜岗、按国内维度评分、出投递话术与中文简历,数据不上传

License: MIT 365 开源计划 #029

⬇ 克隆开始 · ⌨ 全部命令 · 🔒 数据在哪

求职总览页:可以投的岗位并排给出总分、技能分、折算年包,并直接标出下一步该敲什么

截图为仓库自带的虚构演示数据(公司名与职位都是编的)——真实运行时读的是你本机的数据。

和通用的「AI 改简历」不同,它按国内招聘的实际门槛判断:学历、户口、外包还是自有编制、要不要执业资格——这些不满足就直接筛掉,不浪费你的时间去投。评分之外还替你把话术和简历备好,但从不代你点发送


要装什么

一个 AI 编码工具 + Node 22.18+,就能开始。 不用装别的——搜职位的 CLI 直接跑在 Node 上(零依赖、无编译步骤)。你的 AI 工具要是 npm install -g 装的(Claude Code、Codex CLI、Gemini CLI 都是),Node 就已经在了。

本文命令示例按 Claude Code 的斜杠形式(如 /job-auto)书写。在 Antigravity CLI (agy)、Gemini CLI、Cursor、Codex 等其它 AI 工具中,去掉开头的斜杠输入(如 job-auto)或直接说人话(如「自动跑一轮」)即可触发完全相同的工作流,详见「不用 Claude Code 也行」。

所以第一次用是零额外依赖的:一个 AI 编码工具加 Node,/job-setup/job-auto 就能拿到真实的排序名单和投递材料。

其余都是按需要再装,缺哪个只影响对应的那个命令,其它照常工作:

想用什么 需要装 不装会怎样
日常主线全程:填资料、搜职位、打分、出评估与打招呼话术、记投递、面试准备、学习计划(具体命令见表下) 一个 AI 编码工具 + Node 22.18+
生成简历 PDF /job-cv(定制版)与 /job-resume 的校验 + Typst 0.13+ 只产出 .typ 源文件,不编译 PDF。/job-apply 不出简历——它发主简历,定制走 /job-cv
求职总览页 /job-dashboard、四个检查脚本,以及另外七条命令各自的一环(见表下) + Python 3.10+(流水线全程只用标准库;四个检查脚本里只有 lint_skills.pypip install pyyaml),总览页还要一次性构建前端:cd web && npm install && npm run build 总览页跑不了;那七条仍能跑,各少一环。/job-setup/job-apply 完全不受影响
简历 ATS 文本层校验 + pdftotext(poppler) 跳过校验并说明,PDF 照样产出
BOSS 直聘 / 智联 / 前程无忧 让你的 AI 工具能开浏览器(Claude Code 装 Claude 浏览器扩展即可,不用装本仓库以外的东西 这三家退到 site: 网络搜索兜底
Gmail 状态同步 / Notion 看板 + 对应的 MCP 连接器 这两个命令整体跳过并说明原因
改 CLI 代码、跑它的测试 + Bun(只有开发才需要) 用不了 bun test;日常使用完全不影响

主线那一行的命令:/job-setup/job-scrape/job-rank/job-apply/job-outcome/job-interview/job-upskill。Python 那一行说的七条:/job-rank 的预筛淘汰与详情库、/job-scrape 的 JD 存库、/job-outcome 的催进度判定、/job-upskill 的缺口分格、/job-add-template 的模板撞名检查、/job-auto 的词表写回、/job-refresh 的刷新记录(哪几家今天刷过),以及 /job-rank//job-outcome//job-gmail-sync//job-interview//job-user//job-cv//job-reset//job-scrape --no-rank 收尾刷新面板数据。

逐步安装命令(含 Windows/macOS 差异、浏览器渠道怎么开、常见报错)见 SETUP.md 环境到底缺什么,跑 python tools/doctor.py 会直接告诉你。

它能做什么

  • /job-setup — 填写你的求职资料(城市、目标岗位、薪资、硬性条件等),并问清你明确不做、不会的那些事(以及作品的真实用户体量分层),让后续所有材料诚实、不注水

  • /job-scrape — 搜索职位,跨轮次去重,快速呈现新岗位

  • /job-rank — 按国内评估框架(学历/户口/外包/执业资格等硬性条件 + 技能·薪资·强度·发展四项评分 + 待核实的信息)批量打分,产出带理由的排序名单。不给参数就一直评到队列排空

  • /job-auto — 把上面三段接成循环:抓 → 评 → 给能投的出材料,一直跑到挖不动为止。要限量加 --target N

  • /job-apply <职位URL> — 针对这一个岗做深度评估(会真的去查这家公司),然后产出:

    • 三渠道话术:打招呼开场白(≤200 字,聊天框直接用)、邮件正文、网申自评。自动区分猎头和 HR 直招,两者策略不同
    • 简历发你的主简历,本命令不做定制——对方点名要针对性版本等特殊情况才走 /job-cv
    • 求职信:只在需要的场景出(校招网申、体制内、外企、传统行业),直聊场景不出
  • /job-interview [公司] — 拿到面试之后的准备:按国内面试阶段生成阶段化准备包,用你的 STAR 案例库对题,可选 AI 模拟面陪练。

    • 覆盖面试之前那几关:在线测评 / 笔试·机试 / 群面·无领导 / 演练·实操·试讲 / HR 初面 / 专业面·业务面 / 交叉面 / 总监面·终面 / 谈薪 / 背调——每关考点不同、备的东西也不同
  • /job-outcome — 记投递结果与跟进(面试邀约、各轮进展、最终结果),也负责给久无回应的投递起草跟进短信

  • /job-dashboard — 打开本地求职总览页(python tools/serve.py,只监听本机)。这一页能做的事:

    在页面上 说明
    记状态 点「我投了 / 约面了 / 挂了 / 没下文 / 拿到 offer / 不投」直接写回投递记录,可撤销。按当前状态给下一步,不摆一个八选一的下拉框
    记拒绝原因 标「挂了」之后出现一排可选原因(没说原因 / 简历没过 / 年限不符 / 薪资谈不拢…)。点一下就存,不填也没关系——多数拒信本来就不说理由
    查招聘站与简历刷新 首屏直观查看猎聘、BOSS直聘、智联、前程无忧的抓取状态与简历刷新时间。特别提醒:BOSS直聘与前程无忧网页端无刷新入口,总览页明确提示「需开手机端 APP 刷新」,避免简历沉底降低曝光
    岗位偏好与类型过滤 支持外包、驻场、未公开公司一键过滤开关;配合按公司名、职位关键词筛选,快速清爽视野,只看心仪岗位
    一键复制开场白 逐岗展开看详情、评分明细、打招呼开场白——「复制开场白」是这一块唯一带字的按钮,粘进聊天框就能发
    看投后统计与命令手册 首屏卡片速查环境依赖与常用命令;「投出去的那些怎么样了」:回复率、约面率、按分数段的回复率(它回答「这套打分准不准」)、拒绝原因分布。「大概率没戏」是按投递日期算出来的,不用你去点
    看被挡下的岗 「不投的岗位」列出你自己标的、已下线的、按规则判掉的(这几类都能点「放回可以投」);硬性条件没过的那一大批只报个数,不铺出来卡死浏览器

    投过的公司会在它的其它岗上标「这家投过」——不藏起来,同一家的另一个岗可能正是更合适的那个,要不要投由你定。

    更深的投后分析(哪类岗回复率高、卡在哪一环)走 /job-html-report;页面本身的说明见 web/README.md

  • /job-upskill — 从你已排名/已投的职位里挖技能差距,产出带真实学习资源的补齐计划

投出去之后这一段收益最大,工具是接着的:

什么时候 命令 会发生什么
投之前 /job-resume 审一遍基简历:数字与你的资料对不对得上、有没有写到你自己说过做不了的事、结构与页数合不合规。不改数字,只报问题
十来天没动静 /job-outcome followup 算清哪些该催(从上次跟进日算起,最多两次),起草跟进话术
拿到 offer /job-offer <公司> 算可守区间与解耦话术、过一遍背调红线(报的数字要和个税记录对得上)、多个 offer 按你的权重横向比较、接之前的离职过渡清单

随时可以跑 /job-dashboard 看总览,或 /job-user 在多个求职者之间切换。

简历照片可选——互联网/大厂投递通常可略,体制内、传统行业常要。放 users/<你>/resume/photo.jpg与你自己那份 main.typ 同目录,不是仓库根的 resume/——Typst 不允许引用入口目录之外的文件),再在 main.typ 里用 照片: "photo.jpg" 启用,详见 SETUP.md

完整命令清单(含 /job-expand/job-gmail-sync/job-notion-sync/job-add-portal/job-add-template/job-user/job-reset)见 AGENTS.md 的「工作流索引」。

为什么是「国内维度」

上游是丹麦求职工具,评估维度是欧盟劳动力市场(work authorization、通勤半径)。本项目把它换成了国内真实约束:学历院校硬卡(211/985/双一流/统招)、户口落户、应届生与三方协议、外包/驻场/劳务派遣;薪资按「几薪」折算年包;公司性质(外企/国企/上市民企/创业)与工作强度(996/大小周);行业周期风险。


快速开始

git clone https://github.com/rockbenben/ai-job-search-cn.git
cd ai-job-search-cn
python tools/doctor.py   # ← 不知道该干什么就跑这条,它会告诉你

doctor.py 是你的导航。 只用 Python 标准库、只读不写、任何状态下都能跑。它报三件事:环境哪几项就绪、你的流水线走到哪、下一步该做什么(只给一条)。卡住了随时再跑一次——它会按你当前的进度给出不同的下一步。

没装 Python 就先跳过这一步——它只是个导航,不是流水线的一环,直接敲 /job-setup 就行。装它的收益不止总览页,见上面「要装什么」里 Python 那一行。

--- 下一步做什么 ------------------------------------------------------
你是第一次用。下一步:

    claude          # 在这个目录启动 Claude Code
    /job-setup          # 然后输入这条,它会问你一串问题

/job-setup 不必一次答完。 它分四轮问,每轮问完停下来告诉你现在能做什么:答完第一轮(目标城市 + 岗位关键词,约 3 分钟)就够搜岗了,第二轮够排序打分,最费神的「你明确不做/不会什么」留到出投递材料时才问 —— 这三档都由 /job-auto 一条命令跑,它会按你资料填到哪一档跑到哪一步。跑一次 python tools/doctor.py 就知道现在卡在哪一轮、缺哪几项。

已经有简历的话,先放进去,能省掉大半问答。 /job-setup 会先读它,再只问缺的那些:

users/<你的名字>/documents/cv/     ← 简历放这里(<你的名字> 见 .active_user)

格式:PDF 最省事.md / .txt / .tex 也行。Word(.doc/.docx)读不了——先在 Word 里「另存为 → PDF」。学历证书放 diplomas/、领英导出放 linkedin/、推荐信放 references/,都不是必须的。完整说明见 documents/README.md

目录要等 /job-setup 建好用户之后才有。没有简历也能开始——那时它改成直接问你。

启动 Claude Code 之后,它自己也会先跑一次自检并把下一步告诉你,所以你不必记这条命令。日常只有三条命令,中间夹着全流程唯一要你自己做的那一步:

顺序 命令 会发生什么 大概多久
1 /job-setup 会问你一串问题(城市、目标岗位、薪资期望、学历、硬性条件、明确不做什么),答完写进 users/<你的名字>/profile/分四轮,答完第一轮就能往下走 第一轮约 3 分钟;全部答完 15-30 分钟
2 /job-auto 抓岗 → 打分排序 → 给能投的出深评和打招呼话术,一直跑到挖不动为止,中途不用盯着。全部落到 users/<你>/documents/applications/<公司>_<岗位>/ 十几分钟到一小时,看抓到多少
你自己去招聘网站把材料发出去 全流程唯一要人的一步。话术和简历都备好了,点发送的是你——框架不发邮件、不提交表单 看你投几个
3 /job-outcome <公司> 投完记一笔:约面了 / 挂了 / 没下文。后面的催进度、备面、谈薪全从这一笔长出来,不记就都起不来 每个岗几秒

中间三段(找岗、打分、出材料)也可以单独敲:/job-scrape/job-rank/job-apply全部命令)。但接缝已经焊死,默认路径就是上面这条

之后就是「/job-auto 补货 → 你自己发 → /job-outcome 记账」的循环。另外三条按需加:猎头或 HR 直接把一个岗发给你时/job-apply <职位链接>(把链接、或他发来的那整段职位描述粘进来,只评这一个,不用等下一轮抓取);约到面试加一条 /job-interview <公司>,拿到 offer 加一条 /job-offer <公司>;其余见下面「它能做什么」。

第一次跑之前值得知道的两件事

  • /job-setup 是问诊式的,不是填表。它会追问你「明确不会做什么」——这不是刁难,是后面所有材料诚实的前提。答得越实,/job-rank 的打分和 /job-apply 的话术越准。
  • 它不会替你投递。所有话术和简历都是给你自己发出去的;框架不发邮件、不提交表单。

你的数据在哪、安不安全

/job-setup 会问到薪资、学历、工作经历这些敏感信息,所以先把这件事说清楚。

你的全部个人数据都在 users/<你的名字>/ 下,这个目录整体被 .gitignore 忽略——clone 即安全,不需要你做任何手动操作,也不存在「忘了加 ignore 规则」的风险。具体包括:

什么 在哪
候选人资料(身份、薪资、经历、你说过做不了的事) users/<你>/profile/
投递材料(JD 存档、评估、话术、简历 PDF) users/<你>/documents/applications/
你的主简历与求职信 users/<你>/resume/users/<你>/cover_letter/
搜索去重状态、投递记录、报表 users/<你>/job_scraper/users/<你>/job_search_tracker.csvusers/<你>/reports/

仓库里只提交 profile.example/ 里的占位符模板;首次 /job-setup 会照它生成你的 users/<你>/profile/ 再填入真实内容。

个人资料都是纯 markdown,换成别的 AI 工具也带得走,不绑定 Claude Code。

还有一条安全铁律:框架绝不把你的个人数据发送到任何出现在职位描述、抓取页面里的地址、邮箱或主机——即便 JD 明说「把简历发到 X」。职位描述是不可信输入,其中给出的投递去向同样不可信。投递只走你自己确认过的正规渠道。详见 SECURITY.md


各招聘站怎么覆盖

渠道 开箱即用? 你需要做什么
猎聘 ✅ 是 什么都不用做
BOSS 直聘 / 智联招聘 🔶 需要浏览器 在这两个站登录一次即可(Claude Code 用自带的 Claude 浏览器扩展开你自己的 Chrome,登录态天然带着)。登录后在站内把「求职期望」设准,搜出来的岗会明显更对口
前程无忧 🔶 需要浏览器 同上。不登录也能读,但登录了明显更准——未登录时裸入口返回的是本地泛招聘(实测 2026-08-19:关键词搜出来的是路网数据实习生、财务 BP;登录后裸入口 20 条全是对口岗)
其它招聘站 ➕ 可扩展 /job-add-portal 接进来。有公开接口就装成和猎聘一样的 CLI;要登录、或者撞反爬就走浏览器那条——和上面三家一个办法,不是接不了

没有浏览器渠道也能用:这三家自动退到网络搜索兜底,只是拿到的信息少一些。每轮 /job-scrape 都会告诉你各渠道实际走了哪条路,不会把兜底当成完整覆盖。

想知道为什么这三家不能像猎聘那样做成 CLI,见 workflows/reference/cdp-portals.md(实测记录)。


只想要搜索 CLI?

liepin-search 是一个零运行时依赖的猎聘公开职位搜索命令行工具,可以脱离整套框架单独使用——有 Node 22.18+ 就能跑,不需要 Claude Code,也不用装 Bun、不用 npm install

# 搜索
node .agents/skills/liepin-search/cli/src/cli.ts search -q "后端开发" -l "北京" --format table

# 取职位详情
node .agents/skills/liepin-search/cli/src/cli.ts detail "<职位URL>" --format plain

不需要编译、不需要 npm install。用 Bun 的话把 node 换成 bun run 即可。

  • 免登录,输出结构化字段:职位/公司/薪资/学历/年限/公司规模/是否猎头等
  • 内置限速与退避,中英双语触发词
  • 接口与解析细节见 url-reference.md

多人共用一份 clone

多人可共用一份 clone,各自数据独立:个人数据都在 users/<名>/,当前用户记录在仓库根的 .active_user。首次 /job-setup 新建你的用户;/job-user 查看/切换/新建/删除用户;所有命令都对当前活动用户生效,/job-dashboard 顶部会显示当前是谁、并可复制 /job-user <名> 切换。

命名空间隔离,非加密。 同一操作系统账号下,任何能读这些文件的人都能看到所有用户的明文简历与资料。要真正互相保密,请用不同的操作系统账号,或各自 clone 一份。


不用 Claude Code 也行

本仓库不绑定单一 AI 工具。任何 agent(Claude Code、Antigravity CLI、Codex CLI、Gemini CLI、Cursor 等)从根目录 AGENTS.md 进入:那里有角色定义、多用户路径解析、安全铁律、全部工作流的索引,以及「能力 → 各工具」对照表。

换工具后功能不变,只是有些能力(比如驱动浏览器)各家实现不同,届时会退到能用的那条路并告诉你。

在不同 AI 工具中怎么执行命令(避免 Unknown command)

  • 在 Claude Code 中:支持带斜杠的快捷命令(如 /job-auto/job-rank/job-apply <职位链接>),输入时支持 Tab 自动补全。
  • 在 Antigravity CLI (agy)、Gemini CLI、Cursor、Codex 等终端工具中
    • 去掉开头的斜杠输入:直接输入 job-autojob-rankjob-apply <职位链接> 即可。

      为什么不要带斜杠? 许多终端命令行客户端(如 agy)将开头的 / 默认为客户端自身内置命令(如 /help/clear/config 等)。直接输入 /job-auto 会被终端客户端直接拦截并提示 Unknown command: /job-auto。去掉前面的斜杠即可顺利交由底层 AI Agent 识别并执行。

    • 直接用自然语言(推荐):说求职者的人话即可,例如「自动跑一轮」、「帮我给手上的岗位打分」、「投这个岗 <链接>」、「刷一下在线简历」。本仓库在 .agents/skills/ 下配置了完整的 Agent 技能与触发词,AI 会自动识别意图并执行完全相同的工作流。

.claude/ 是干什么的? 它是 Claude Code 的接入件,不是本仓库的一部分逻辑:.claude/commands/ 是 Claude Code 找 slash 命令的固定路径(18 个 stub,每个 2 行,只写「读取并严格执行 workflows/<名>.md」);.claude/skills/ 是它找自动触发技能的固定路径(3 份壳,只有触发词和工具权限);.claude/settings.json是它的权限预批清单。三者加上 CLAUDE.md 一共约 150 行,没有一行正文——正文全部在 workflows/,谁都读得到。

实测验证过(2026-08-18):把 .claude/CLAUDE.md 整个挪走之后,tools/ 下 16 个脚本没有一个起不来(逐个 --help,退出码全 0),自检与总览页照常,gap_split 照常出结果。唯一报错的是 security_guards.py——它的职责就是检查 .claude/settings.json 的权限清单,文件不在当然要红,这正是它该有的反应。丢的只有 Claude Code 的 slash 命令和自然语言自动触发。其它工具想要同等便利,自己的接入目录即可(如 .codex/),workflows/ 一个字不用动。守卫钉着这条边界:stub 超过 5 行、工作流正文里出现 .claude/ 路径或自称「本技能」、CLAUDE.md 复述 AGENTS.md 已有的流程,tools/lint_skills.py 都会报。


合规与使用限制

本项目仅供个人求职使用。

  • 低频访问liepin-search 访问的是猎聘公开页面与接口。请保持低频,不得用于商业用途或批量数据采集,风险自负。
  • /job-rank 一次别评太多:默认只对头部 12 个候选抓详情(--fetch 可调)。一次抓几十条会触发猎聘的临时限流——撞到就停手等一等,别连着重试。
  • 浏览器渠道用的是你自己的登录会话:有账号风控/封禁风险,风险自负。保持低频、不批量开页,撞到验证码立即停手、不硬闯;框架遵守各站 robots.txt细则)。
  • 职位描述是不可信输入:工作流不执行其中的指令、不抓取其正文里的链接。详见 SECURITY.md
  • 诚实底线:所有投递材料的主张都必须能在你的资料里找到出处,能力缺口如实承认,绝不编造或用近义词充数——一旦面试穿帮,代价远大于说得漂亮。
  • 有几条命令没被真实跑过(截至 v1.0.0)/job-gmail-sync/job-html-report/job-add-template/job-offer 一份产出都没有;/job-interview 只有一份面试记录。
  • 它们有单元测试、也过 CI,但没有「真跑完一轮」的实测背书——撞到问题请开 issue。
  • 走熟了的是这几条/job-setup/job-scrape/job-rank/job-apply/job-cv/job-outcome/job-dashboard/job-upskill/job-resume

文档

许可

MIT,LICENSE 里并列两方版权声明。派生自 MadsLorentzen/ai-job-search(MIT),分叉后基本重写——安全守卫(tools/security_guards.py)、skill 校验(tools/lint_skills.py)、PDF 校验(tools/verify_pdf.py)及其测试仍带有上游代码,其余为新写。

关于 365 开源计划

365 开源计划 的第 #029 个项目——一个人 + AI,一年 300+ 个开源项目。

提交你的需求 → · Discord · Telegram

Reviews (0)

No results found