ai-job-search深度拆解:Claude Code驱动的全栈求职框架

ai-job-search深度拆解:Claude Code驱动的全栈求职框架

地球物理学家被裁,周末写工具,69 份定制申请、20 次初面、一份入职合同——这就是 36.4k star 项目 ai-job-search 的真实履历。

2026 年 8 月 GitHub Trending 上出现了一个不走寻常路的项目:madslorentzen/ai-job-search,它不训练模型、不做 RAG、不卷 Agent 框架,却在短短几个月内攒下 36.4k Star12.4k Fork

它的卖点只有一个:帮你找工作——而且作者自己就是小白鼠。作者 Mads Lorentzen 原本是地球物理学家,2025 年底被裁员后,用三周时间把自己的求职流程在 Claude Code 里写成了结构化工作流,随后每周用它投递,先后投了 69 份定制化申请,拿到 20 次第一轮面试,最终在 2026 年 6 月以 AI Engineer 身份入职。这份 repo 就是那个工作流的全部源代码——没有 SaaS,没有账号体系,没有 API Key 收费,Fork it and own it

本文提纲

  1. 这到底是什么:不是"套壳投简历",是完整的求职操作手册
  2. 13 条斜杠命令:从 /setup 到 /reset 的全景工作流
  3. 核心引擎 /apply:drafter-reviewer + PDF 校验循环 + ATS 文本层校验
  4. 4 个让它真正管用的工程细节
  5. 三大扩展点:Portal / Template / Criteria
  6. 安全哲学:为什么安装别人写的 Portal Skill 必须手动复制代码
  7. 文件结构与工程化设计
  8. 快速上手:8 步跑通你的第一次投递

这到底是什么:一套"编码在 Markdown 里的求职操作系统"

ai-job-search 的本质是一份可执行的职业咨询手册——它把简历撰写、职位匹配、投递跟踪、面试准备、结果复盘这些分散的动作,编码成一组可在 Claude Code CLI 中直接调用的斜杠命令。每条命令背后是一份 Markdown(放在 .claude/commands/ 里),由 Claude Code 读取并严格按流程执行。

核心三件套:

MERMAID_BLOCK_0

三个鲜明的设计取向:

  • 本地优先,零依赖 SaaS:所有档案、申请记录、简历 PDF 都在你本地;唯一外部调用是招聘网站搜索和 LaTeX 编译。
  • 硬规则优先于 Agent 自由发挥:CV 必须恰好 2 页、Cover Letter 恰好 1 页、PDF 文本层必须能被 ATS 正常提取——这些是硬约束,不通过就循环修正,而不是让 LLM"差不多就行"。
  • 永不编造:所有写入 CV/CL 的能力、项目、成就都会校验候选人档案,不存在的能力永远不会因为 JD 出现就被"塞进去"——只诚实地标记为 Gap。

13 条斜杠命令全景

整个框架通过 13 条 /{command} 驱动,在 Claude Code 中输入即可。

核心三件套

/setup — 档案初始化。三条路径任选其一:
- 读取本地 documents/ 目录(CV PDF、LinkedIn 导出、推荐信、过往申请)
- 直接粘贴一份 CV 文本
- 通过问答形式的 interview 逐步采集

/scrape — 并行搜索所有已启用的招聘站 Skill(丹麦四站 + LinkedIn + freehire.me),自动去重,按匹配度呈现结果。

/apply <URL or JD text> — 跑完整的投递流水线,详见下一节。

追踪与复盘

命令 作用
/interview 根据当前申请归档生成阶段专属备考包:公司调研、面试官背景、问题→STAR 事例映射、Mock Interview 角色扮演
/outcome 记录面试/Offer/Reject/沉默,归档所有材料,生成跟进邮件草稿(最多两次,绝不自动发送),根据真实结果校准 fit 框架
/gmail-sync 读取 Gmail 自动识别面试邀请/测评链接/Offer/拒信,批量提议写入 Tracker,每条都附邮件原文,冲突信号不猜测转人工
/html-report job_search_tracker.csv + 归档生成纯离线 HTML 看板:统计卡片、状态/行业/渠道/漏斗图(内嵌 SVG,零外部依赖)、可筛选表格
/notion-sync 通过 Notion MCP(OAuth,不用 API Key)把管道单向同步成只读 Notion 数据库,每一行附带一个只读简介页

智能辅助

命令 作用
/rank 批量对 /scrape 结果做五维 fit 打分,输出排名短名单,Deal-breaker 一票否决、临近截止加 urgency 标记、失效帖标 expired
/expand 扫描档案里已列出的 GitHub/作品集/Kaggle/Google Scholar 链接 + 课程大纲,自动补充档案里没写的能力项,每项附来源
/upskill 综合已投递、已排名、目标 JD 的差距,输出技能缺口热力图 + 学习计划(资源 + 时间估算),可对单个 JD 单独分析

配置与重置

命令 作用
/add-template 注册自定义 CV/CL 模板(LaTeX/Typst/任意命令行可编译到 PDF 的工具链),存储为 PLACEHOLDER 模板,可安全 git commit
/add-portal 给你所在国家/地区的招聘站自动生成 CLI Skill:探测搜索 URL 模式、结果结构、robots 规则、脚手架 + 实测后才注册
/reset 三种擦除粒度:profile / documents / all,明确列出将要删除的文件,必须输入 RESET 才执行

核心引擎 /apply:7 步 drafter-reviewer + 强校验循环

这是整个项目最值得拆开看的部分。/apply 对一份 JD(URL 或原文)执行严格的 7 步流水线,没有任何一步是"交给 LLM 自己发挥":

MERMAID_BLOCK_1

Step 1-2 解析与评估:拆解 JD 硬要求、技能点、公司背景;再与候选人档案在五个维度(技能匹配、经验匹配、文化匹配、地点匹配、职业方向匹配)打分,Deal-breaker 直接 veto。

Step 3-5 Drafter-Reviewer 分离
- Drafter 基于候选人档案写定制 CV(LaTeX moderncv banking 样式)和 Cover Letter(自研 cover.cls)。
- Reviewer 是新启动的独立 Claude 上下文,它拿到的是 JD + Drafter 初稿,没有读过候选人档案,任务是:调研公司、以招聘方视角挑刺(关键词遗漏、措辞泛化、格式问题)。
- Drafter 再按评审意见修订。这一步是整个框架最"不像 AI 套壳"的地方——双 Agent 辩论直接干掉了单次生成里大量的"看起来顺但没击中 JD"的废话。

Step 6 PDF 编译 + 视觉校验循环(最有工程味的一步)
- CV 用 lualatex 编译(pdflatex 在 modern MiKTeX + fontawesome5 组合下会抛字体扩展错误,踩过坑后固定用 lualatex);Cover Letter 用 xelatex(因为 cover.cls 依赖 fontspec)。
- 编译后 Claude 读实际 PDF 渲染页的视觉内容并循环修正:CV 必须恰好 2 页、不能有条目标题孤儿翻页;Cover Letter 必须恰好 1 页、签名可见、字体一致。修的手段不是瞎改,是精准插 \needspace\enlargethispage、列表项字体匹配包装器。
- 这一步是每个求职者都踩过的坑:LaTeX .tex 里看排版没问题,编译出来首页最后一行标题翻到下一页、字体悄悄 fallback 成正文字体——绝大多数"AI 写 CV"工具在这里直接交付,而 ai-job-search 会一直循环到干净为止。

Step 7 ATS 文本层校验
- 用 pdftotext(无则降级 pypdf,再无则降级视觉关键词审查)抽 PDF 真实文本层,按 ATS 解析器的方式审查:
- 联系方式是不是字面文本(不是 icon glyph)
- 阅读顺序是不是人类正常顺序(双栏布局常见问题:左右栏被抽成"左行1 右行1 左行2 右行2"的灾难顺序)
- JD 关键词覆盖度打分
- 关键词覆盖的诚实原则:候选人档案里确实有的,可以补;确实没有的,永远只标 gap,不硬塞。这是作者在 README 里反复强调的红线。

4 个让它真正管用的工程细节

普通项目写到这里通常就结束了。ai-job-search 能帮作者真的拿到 Offer,核心在下面四个反直觉决策。

1. Relevance-Weighted CV 裁剪:不按"时间远近"删,按"相关性+唯一性+被 CL 引用"打分

CV 超 2 页是常态。一般 AI 工具从最老的经历开始机械砍。ai-job-search 的做法是:

每条候选行得分 =
  (a) 对目标 JD 的相关性 × 权重
+ (b) 在整份 CV 里的独特性(重复度低加分)
+ (c) Cover Letter 是否依赖这一条(被 CL 引用加分)

然后按得分从低到高开始删,直到页数刚好。一条老经历的 Bullet 如果正好命中 JD 关键词,会压过一条新经历里泛泛的"参与日常开发"——这是真人 HR 改简历时真正会做的取舍。

2. Token-Efficient Reviewer:初稿 inline 传给 Reviewer,校验清单只跑一次

Reviewer Agent 是整个流程最大的 Token 消耗源,作者专门做了两个优化:
- Reviewer 收到的是 inline 的 Drafter 结果文本,不是重新加载两份 PDF/两份 .tex——避免重复上下文加载。
- PDF 校验、ATS 校验这两个"检查型步骤"只在最后跑一次,而不是 Drafter 和 Reviewer 各自跑一遍——用"更多的 PDF 渲染迭代 Token"换"更少的重复型校验 Token",整体开销更低,且交付到用户手里的 PDF 出错率真实下降。

3. Language Gate:唯一带结构化硬处理的 Deal-breaker

Fit 评估的绝大部分 Deal-breaker 是自由文本("强陪产假条款""公会薪资级别 X""不带 oncall"),但语言是例外:

  • /setup 专门采集所有工作语言及等级(直接问,或从 CV/LinkedIn 导出推断),写入独立的 Languages 表格。
  • 04-job-evaluation.md 里的 Language Gate
  • JD 要求的语言候选人完全没声明 → 硬拒绝(不浪费大家时间)
  • 候选人声明了但等级低于 JD 要求(比如你写 B1/B2,JD 要 fluent)→ 标 warning,不自动拒,留给你人判断这个 border case

4. 职位描述是"不可信输入",不是指令

这是一个容易被忽略但极其重要的安全设计:
- /apply 拿到 JD 后,JD 中的任何"指令"、"链接"、"内嵌 prompt 注入"全部忽略,系统只提取结构化要求,不 follow JD body 里的任何外链或操作。
- Agent 级防御(不是沙箱):陌生招聘站上,建议你在点 Send 前快速过一眼系统实际抓取到的 JD 文本与实际写入内容。详见 SECURITY.md

三大扩展点 + 借用其他 Fork 的安全流程

框架显式声明了 3 个扩展点,全部不需要动 upstream 代码

MERMAID_BLOCK_2

1. Portal Skills:招聘站的模块系统

每个 *-search Skill 是 .agents/skills/ 下的独立自包含文件夹,遵守统一合同:
- search / detail 子命令
- --format json|table|plain
- SKILL.md 里有 enabled: 开关
- 自带本地测试
- /scrape自动扫描所有符合合同的 Skill,注册/接线一律不需要写代码

非丹麦用户的两个开箱即用选项:
- linkedin-search:用 LinkedIn 公开 guest endpoint,无运行时依赖,纯 bun 跑,地点显式传 -l "北京"/-l "Remote" 即可。README 明写:仅供个人用,自动化访问违反 LinkedIn ToS,保持低流量。
- freehire-search:调 freehire.me 的公开 REST API(JSON,免 Key),聚焦 software/data/engineering/DevOps/Remote,可用 --region / --country / --remote 切 facet;后端 MIT 可自托管,设置 FREEHIRE_API_URL 指向自己的实例。

2. Document Templates:你自己的 CV/CL 工具链

/add-template 注册,支持 LaTeX/Typst/任何能命令行编译到 PDF 的工具链,流程:
1. 指向你的源文件(.tex + .cls/.sty + 字体;或 .typ + 本地包;或等价物)
2. 交互式问答录入:源扩展名、编译命令、字体路径、样式保留规则、硬页数限制
3. 强制测试编译通过后才存入 templates/ 并激活 /apply
4. 模板存为 [PLACEHOLDER] 占位而非真实个人信息 → 可安全 git commit / 分享

配套命令:/add-template --list 列出所有已注册,/add-template --use <name> 切换,--use default 还原 stock moderncv + cover.cls。

3. Evaluation Criteria:你的红线,不用写代码

候选人档案里的 Deal-breaker 和 Preference 完全自由文本:"需要父母假政策""薪资 ≥ 公会 X 级""不带 oncall"——每条就是一个 profile line,不需要改代码,直接被 /rank/apply 的 Fit Rubric 用起来,权重和其他标准一致。

从其他 Fork 借 Portal Skill:故意做成手动复制

社区维护了一个 portal index 索引帖(#78)。你看到某个国家的招聘站 Skill 写得好,做法是:

  1. 读代码,全部读完。确认网络调用只去它声称的招聘站、package.json 没有 dependenciespostinstall 等生命周期脚本、读写不出自己的文件夹——因为 settings.json 已经把它们加到白名单,它们会不经询问就执行、并接触你的职业数据。
  2. 离线跑它的测试(Skill 的 cli/ 目录下 bun test),优秀 Skill 的测试在无网络下也能全过。
  3. 检查 enabled: 开关和 Skill 自己的 ToS 说明。
  4. 手动复制整个文件夹到你的 .agents/skills/

"故意做成手动复制"在 README 里写得非常直白:如果框架自带一个"一键安装第三方 Skill"的安装器,就会跳过最关键的那一步检查——你亲自读代码。这不是功能缺失,这是安全决策。

文件结构与工程化

ai-job-search/
├── CLAUDE.md                          # 候选人总档案 + 工作流规则入口
├── .claude/
   ├── commands/                      # 13 条 /{command} 定义
      ├── setup.md  apply.md  rank.md  scrape.md  outcome.md
      ├── interview.md  gmail-sync.md  html-report.md
      ├── notion-sync.md  expand.md  upskill.md
      ├── add-template.md  add-portal.md  reset.md
   ├── skills/
      ├── job-application-assistant/  # 核心 Skill 7 份资料
         ├── 01-candidate-profile.md   学历/经验/技能
         ├── 02-behavioral-profile.md  PI/DISC/性格自评
         ├── 03-writing-style.md       语气 + do/don't
         ├── 04-job-evaluation.md      Fit 评分框架 + Language Gate
         ├── 05-cv-templates.md        CV 裁剪 + 定制规则
         ├── 06-cover-letter-templates.md CL 模板
         └── 07-interview-prep.md      STAR 事例库 + Mock 协议
      ├── job-scraper/  upskill/
      └── settings.json               # Claude Code 权限白名单
├── .agents/skills/                    # 招聘站 CLI Tools
   ├── jobbank-search  jobdanmark-search  jobindex-search  jobnet-search
   ├── linkedin-search  freehire-search
├── cv/main_example.tex                # moderncv 样例
├── cover_letters/                     # cover.cls + 字体
├── templates/  documents/             # 自定义模板 / 原始资料
├── tools/                             # 10 个 Python 小工具
   ├── check_framework_version.py  # CI:skill 改了 framework_version 必须 +1
   ├── check_upstream_updates.py   # 合入上游前预览哪些个人文件会被碰
   ├── lint_skills.py              # skill / command / settings.json lint
   ├── security_guards.py          # CI 级安全守卫:allowlist + gitignore + manifest
   ├── upstream_triage.py          # 把落后 commit 分成"值得看/可跳过"
   ├── robots_check.py  verify_pdf.py  convert_salary_excel.py ...
├── .github/workflows/ci.yml           # LaTeX 烟雾编译 + skill lint + TS typecheck
├── salary_lookup.py                   # 薪资基准(BYO 数据)
├── job_scraper/  gmail_sync/  upskill/ # 状态目录
├── job_search_tracker.csv             # 申请追踪总表
└── SETUP.md / CONTRIBUTING.md / CHANGELOG.md / SECURITY.md

几个值得点出的工程化:
- framework_version 检查check_framework_version.py 在 CI 里跑——任何 skill 文件改动必须同时 bump 框架版本,避免"文件改了但调用方不知道版本差异"的灾难。
- LaTeX CI 烟雾编译cover_example.tex 自带一个样例,ci.yml 每次 push 都真刀真枪编译一次——上游改了模板不至于到用户投简历时才发现编译不通过。
- Security Guardssettings.json 权限、.gitignore 规则、每个 skill 的 manifest 一致性都在 CI 里有守卫。
- 私有 Fork 友好:README 明确提醒——因为个人信息会被写进 tracked files,个人用途不要用公 Fork(GitHub 不允许把公库 Fork 变私有),要建一个以本仓库为 upstream 的私有仓库,SETUP.md §8 有两分钟配置食谱,所有上游更新流程完全一致。
- 上游更新不盲追:永远追打 tag 的 release(vetted checkpoint,CHANGELOG 里写过),不要直接追 master。check_upstream_updates.py 先预览哪些个人文件会被碰到,upstream_triage.py 把你落后的 commit 分类,适合每周跑一次贴到滚动 issue 里。

快速上手:8 步跑通你的第一次投递

# 1.(推荐)建私有仓库 + 设为 upstream;或直接 gh fork(仅贡献用途)
gh repo fork MadsLorentzen/ai-job-search --clone
cd ai-job-search

# 2. 安装 6 个招聘站 CLI(linkedin/freehire 无运行时依赖,仅装 TS dev 类型)
for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
  (cd .agents/skills/$tool/cli && bun install)
done

# 3. 前置环境就绪:Claude Code CLI、Python 3.10+、Bun、LaTeX(含 lualatex/xelatex)
#    可选:pip install pypdf 或系统装 poppler-utils(更稳的 ATS 文本层抽取)

# 4. 启动 Claude Code,跑档案初始化(三条路径里最推荐 documents/ 模式)
claude
/setup

# 5. 跑职位抓取,从列表里挑感兴趣的直接 /apply
/scrape

# 6. 或先批量排名再挑编号投递(大量结果时推荐)
/rank
/apply 3   # 例如第 3 条

# 7. 面试后记录结果;想复盘整体漏斗则生成离线看板
/outcome
/html-report

# 8. 定期拉取上游发布的安全修复/新特性
python3 tools/check_upstream_updates.py
python3 tools/upstream_triage.py

作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/
关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

posted @ 2026-08-27 08:14  iTech  阅读(21)  评论(0)    收藏  举报