MadsLorentzen/ai-job-search

GitHub: MadsLorentzen/ai-job-search

一个基于 Claude Code 的全栈 AI 求职框架,通过结构化工作流自动完成职位匹配、简历定制、求职信撰写和面试准备。

Stars: 22620 | Forks: 7029

Claude Job Search Assistant

# AI 求职 一个基于 [Claude Code](https://claude.com/claude-code) 构建的 AI 驱动的求职申请框架。Fork 它,填入你的个人简介,让 Claude 评估职位发布、量身定制你的简历、撰写求职信,并为你准备面试。

Buy me a coffee at ko-fi.com

## 这是什么 这是一个结构化的工作流,将 Claude Code 变成一个全栈求职助手。核心工作流(自我简介构建、匹配度评估以及起草者-审阅者申请流水线)是**与语言和国家无关的**。求职门户搜索技能是为丹麦市场(Jobindex、Jobnet、Akademikernes Jobbank 等)构建的,但这种模式设计为可以替换为你本地的招聘网站。 ``` /setup /scrape /apply | | | v v v Fill in Search job Evaluate fit your profile portals Score & recommend | | | v v v Profile Present matches Draft CV + Cover Letter files ready with fit ratings (LaTeX, tailored) | | v v Pick a match Reviewer agent critiques -> /apply -> Revise -> Final output ``` 该框架融入了职业指导的最佳实践,包括结构化的评估标准、具有前瞻性的求职信框架以及可选的薪酬基准测试。 ## 前置条件 - [Claude Code](https://claude.com/claude-code) (CLI) - Python 3.10+ - [Bun](https://bun.sh)(用于丹麦求职 CLI 工具) - 带有 `lualatex` 和 `xelatex` 的 LaTeX 发行版:[TeX Live](https://tug.org/texlive/) 或 [MiKTeX](https://miktex.org/)。简历使用 `lualatex` 编译(pdflatex 在现代 MiKTeX 安装中通常会因为 `fontawesome5` 字体扩展错误而失败);求职信使用 `xelatex` 编译,因为 `cover.cls` 需要 `fontspec`。 - 可选:来自 [poppler](https://poppler.freedesktop.org/) 的 `pdftotext`(macOS:`brew install poppler`,Debian/Ubuntu:`apt install poppler-utils`,Windows:`choco install poppler`)——由 `/apply` 用于对编译后的简历进行 ATS 可解析性检查。如果缺少,该检查会优雅降级为视觉关键字审查。 ## 快速开始 ### 1. Fork 并 clone ``` gh repo fork MadsLorentzen/ai-job-search --clone cd ai-job-search ``` ### 2. 安装求职工具 ``` cd .agents/skills/jobbank-search/cli && bun install && cd ../../../.. cd .agents/skills/jobdanmark-search/cli && bun install && cd ../../../.. cd .agents/skills/jobindex-search/cli && bun install && cd ../../../.. cd .agents/skills/jobnet-search/cli && bun install && cd ../../../.. cd .agents/skills/linkedin-search/cli && bun install && cd ../../../.. ``` 对于 `linkedin-search`,安装是可选的:它没有运行时依赖,直接用普通的 `bun` 运行即可;`bun install` 只会拉取 TypeScript 开发类型。 ### 3. 设置你的个人简介 ``` claude # 然后在 Claude Code 内部: /setup ``` `/setup` 提供了三种方式:读取你的 `documents/` 文件夹(如果你已经填充了内容,如简历 PDF、LinkedIn 导出文件、文凭、推荐信、过去的申请材料),导入粘贴在聊天中的单个简历,或者通过一次访谈来完成。它会自动检测你拥有的内容并进行询问。documents 文件夹模式是幂等的,当你添加更多材料时可以安全地重新运行;关于布局请参见 `documents/README.md`。 ### 4. 搜索工作 ``` /scrape ``` 这会搜索多个求职门户网站,寻找与你个人简介匹配的职位,对结果进行去重,并按匹配度排序呈现。选择一个匹配项即可直接对其运行 `/apply`。 ### 5. 申请工作 ``` /apply https://jobindex.dk/job/1234567 ``` 如果 URL 无法获取(某些求职门户网站会阻止自动访问),你可以直接粘贴职位描述: ``` /apply ``` 这将运行完整的工作流:评估匹配度、起草简历 + 求职信、使用第二个 agent 进行审阅、修改,并呈现最终输出。 ## 其他命令 `/setup`、`/scrape` 和 `/apply` 构成了核心工作流。一旦你的个人简介建立完成,还有四个命令可以对其进行扩展: - **`/expand`** 通过扫描你已经链接到其中的公开来源(GitHub 仓库、作品集网站、Kaggle、Google Scholar)并查找指定课程和认证的教学大纲来丰富你的个人简介。发现的技能会带有来源标签并添加到你的个人简介中。在运行 `/setup` 后立即使用非常有用,可以挖掘出仅凭文档无法明确体现的技能。 - **`/upskill`** 分析你的个人简介与你追踪的职位发布之间的差距(或通过 `/upskill ` 分析单个职位发布)。生成一个按优先级排序的技能差距热力图,以及一个包含通过网络搜索到的学习资源和时间估算的学习计划。可用于在求职申请之间进行职业规划。 - **`/add-template`** 注册你自己的 LaTeX 简历或求职信模板,以替代内置模板。它会捕获模板的说明(编译引擎、字体、样式规则、页面限制),运行一次强制的测试编译,并将模板接入 `/apply`。请参阅下方的 [LaTeX 模板](#latex-templates)。 - **`/add-portal`** 为你所在市场的招聘网站生成求职门户搜索技能。它会调查该门户网站(搜索 URL 模式、结果结构、访问规则),使用与内置技能相同的结构、命令和输出约定搭建 CLI 技能的脚手架,并在注册前试运行一次实时查询。请参阅下方的 [求职工具](#job-search-tools)。 还提供了 `/reset` 命令,请参阅下方的 [重新开始](#starting-over)。 ## 文件结构 ``` ai-job-search/ ├── CLAUDE.md # Main candidate profile + workflow rules ├── .claude/ │ ├── commands/ │ │ ├── apply.md # /apply workflow (drafter-reviewer) │ │ ├── setup.md # /setup onboarding (documents folder, CV import, or interview) │ │ ├── expand.md # /expand competency enrichment from documents and online presence │ │ ├── add-template.md # /add-template register custom LaTeX templates │ │ ├── add-portal.md # /add-portal generate a job-portal search skill for your market │ │ └── reset.md # /reset wipe profile data or documents folder │ ├── skills/ │ │ ├── job-application-assistant/ # Core application skill │ │ │ ├── SKILL.md # Skill definition │ │ │ ├── 01-candidate-profile.md # Your education, experience, skills │ │ │ ├── 02-behavioral-profile.md# PI/DISC/personality assessment │ │ │ ├── 03-writing-style.md # Tone, structure, do's and don'ts │ │ │ ├── 04-job-evaluation.md # Scoring framework for job fit │ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules │ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates │ │ │ └── 07-interview-prep.md # STAR examples + interview framework │ │ ├── job-scraper/ # Job search orchestration │ │ └── upskill/ # /upskill skill gap analysis and learning plan │ └── settings.json # Claude Code permissions (shared, scoped) ├── .agents/skills/ # Job portal CLI tools │ ├── jobbank-search/ # Akademikernes Jobbank (Denmark) │ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark) │ ├── jobindex-search/ # Jobindex.dk (Denmark) │ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal) │ └── linkedin-search/ # LinkedIn public job listings (country-agnostic) ├── cv/ │ └── main_example.tex # moderncv LaTeX template ├── cover_letters/ │ ├── cover.cls # Custom cover letter LaTeX class │ └── OpenFonts/ # Lato + Raleway fonts ├── templates/ # Custom templates registered via /add-template │ └── README.md # Folder layout instructions ├── documents/ # Career source materials for /setup Path A and /expand │ ├── README.md # Folder layout instructions │ ├── cv/ # Master CV (PDF or .tex) │ ├── linkedin/ # LinkedIn profile export (PDF) │ ├── diplomas/ # Degree certificates and transcripts │ ├── references/ # Reference letters │ └── applications/ # Past application records (_/) ├── salary_lookup.py # Salary benchmarking tool (BYO data) ├── tools/ │ ├── convert_salary_excel.py # Convert salary Excel to JSON │ └── README_SALARY_TOOL.md # Salary tool setup instructions ├── job_scraper/ # Scraper state (seen jobs, results) ├── upskill/ # /upskill report output (markdown reports per run) ├── job_search_tracker.csv # Application tracking spreadsheet └── SETUP.md # Detailed setup guide ``` ## `/apply` 的工作原理 `/apply` 命令运行一个带有强制 PDF 编译步骤的**起草者-审阅者工作流**: 1. **解析**职位发布(URL 或文本) 2. 根据你的个人简介**评估匹配度**(技能、经验、文化、地点、职业契合度) 3. 用 LaTeX **起草**量身定制的简历和求职信 4. **生成审阅者 agent**,研究公司并对草稿提出批评意见 5. 根据审阅者的反馈进行**修改** 6. **编译并检查**两个 PDF 文件:简历用 `lualatex`,求职信用 `xelatex`。Claude 会阅读渲染后的页面并迭代 LaTeX,直到简历恰好为 2 页且没有孤立的条目标题,同时求职信恰好为 1 页,且签名可见、字体一致。 7. **对简历进行 ATS 检查**:提取 PDF 的文本层(`pdftotext`,可选依赖项),并像 ATS 解析器看到的那样验证它——联系方式以纯文本形式存在、没有乱码符号、阅读顺序正常——然后根据提取结果对职位发布的关键字覆盖率进行评分。个人简介真正支持的关键字会被添加;真正的差距会保持可见,绝不盲目堆砌。 8. 带有验证清单地**呈现**最终输出 简历和求职信中的所有声明都会根据你真实的个人简介进行验证。系统绝不捏造技能或经验。 ### 此工作流的独特之处 - **PDF 验证循环。** 大多数 LaTeX 简历模板生成的输出“在 `.tex` 文件中看起来没问题”,但在 PDF 中却出问题:职位标题孤立到下一页、求职信溢出到第 2 页、列表项字体静默回退到正文字体。`/apply` 命令会编译并视觉检查每一个 PDF,并应用针对性的修复(列表项的 `\needspace`、`\enlargethispage`、字体匹配包装器),直到布局整洁。这会在每次申请时自动运行。 - **对 PDF 文本层进行 ATS 验证。** ATS 阅读的是 PDF 嵌入的文本,而不是渲染后的页面——而 LaTeX 可能会静默产生文本提取后乱码的 PDF(本应是邮箱的地方变成了图标符号、多列布局导致的交错行)。`/apply` 使用 `pdftotext` 提取编译后的简历文本层,并根据解析器实际看到的内容验证联系方式、阅读顺序以及职位发布的关键字覆盖率。严格执行诚实规则:个人简介不支持的关键字会被视为差距承认,绝不强行塞入。 - **基于相关性加权的简历裁剪。** 当简历超过 2 页时,工作流不会机械地从“最旧”的部分开始裁剪。它会根据以下方面对每一行候选项进行评分: 与目标职位发布的相关性, 在文档中的独特性,以及 求职信是否依赖于它,并首先裁剪总分最低的行。命中职位发布关键字的较早职位的条目,会比未命中关键字的较新职位的条目保留得更久。 - **起草者-审阅者分离。** 起草者负责撰写;另一个使用全新上下文生成的 Claude agent 负责研究公司并对草稿提出批评。然后由起草者进行修改。这可以捕获单次处理中经常遗留的遗漏关键字、薄弱的框架和泛泛而谈的语言。 - **Token 高效的审阅者调度。** 审阅者 agent 直接内联接收草稿,而不是重新阅读它们,并且验证清单在工作流结束时只运行一次,而不是由两个 agent 重复运行。注意:第 5 步中新的编译和检查步骤将这些节省的部分 token 花费在了 PDF 渲染和布局迭代上——该工作流以增加部分端到端 Token 成本为代价,真正减少了到达用户手中的损坏的 PDF。 ## 自定义 ### 手动编辑哪些文件 如果你更喜欢直接编辑文件而不是使用 `/setup`: | 文件 | 修改内容 | |------|---------------| | `CLAUDE.md` | 你的完整个人简介(姓名、教育背景、经验、技能、目标) | | `01-candidate-profile.md` | 你的简历数据的结构化版本 | | `02-behavioral-profile.md` | 你的行为评估或自我评估 | | `04-job-evaluation.md` | 技能匹配领域、职业目标、动机筛选器 | | `05-cv-templates.md` | 针对不同职位类型的个人简介声明模板 | | `07-interview-prep.md` | 来源于你真实经验的 STAR 法则示例 | | `search-queries.md` | 针对你技能和地点的求职查询 | ### 更新你的搜索查询 随着你优先事项的改变,你可以仅重新配置求职搜索,而无需重新运行完整的个人简介设置: ``` /setup --section search ``` 这会重新运行搜索配置访谈:目标职位、搜索的技能、地点以及门户网站。它还会根据你的个人简介建议你可能未曾考虑过的职位类型。 ### LaTeX 模板 简历使用 [moderncv](https://ctan.org/pkg/moderncv)(banking 风格)。求职信使用带有 Lato/Raleway 字体的自定义 `cover.cls`。 要使用你自己的模板,请运行: ``` /add-template ``` 将其指向你的 `.tex` 文件(以及任何 `.cls`/`.sty` 文件或打包的字体)。该命令会通过访谈获取模板的说明——编译引擎、字体及其位置、需要保留的样式规则、严格的页面限制——将所有内容存储在 `templates/` 下,运行一次强制的测试编译,并激活该模板,以便 `/apply` 根据它进行起草。模板存储时使用 `[PLACEHOLDER]` 标记代替个人数据,因此可以安全地提交和分享。 - `/add-template --list` 显示已注册的模板 - `/add-template --use ` 在它们之间切换 - `/add-template --use default` 恢复为内置的 moderncv / cover.cls 模板 如果你更喜欢手动操作,手动途径仍然有效:更新 `05-cv-templates.md` 和 `06-cover-letter-templates.md` 中的指导说明。 ### 求职工具 `.agents/skills/` 中的四个丹麦 CLI 工具(Jobbank、Jobdanmark、Jobindex、Jobnet)展示了为特定市场构建求职门户集成的模式。如果你在其他国家/地区,请运行: ``` /add-portal ``` 提供你本地招聘网站的 URL。该命令会调查该门户网站(搜索 URL 模式、结果页面结构、robots.txt/访问规则),使用与内置工具相同的结构、命令和输出约定搭建 CLI 技能的脚手架,并在注册任何内容之前试运行一次实时查询。带有认证墙的门户网站会被拒绝,而条款限制严格的门户网站会在生成的技能中收到显眼的“仅供个人使用”警告。生成的技能是特定于市场的,保留在你的 fork 中;生成器本身是通用部分。 作为**与国家无关的**起点,仓库还包含 **`linkedin-search`**——这是一个基于 LinkedIn 公开的、无需身份验证的 `jobs-guest` 端点构建的求职技能。它是字段无关的,**没有运行时依赖**(仅使用 `bun` 运行),并将搜索位置作为显式参数接收,因此开箱即适用于任何市场(`-l "Berlin, Germany"`、`-l "Mumbai, Maharashtra, India"`、`-l "Remote"`,……)。它仅限**个人使用**——自动访问违反了 LinkedIn 的服务条款,因此请保持低频访问。请参阅 `.agents/skills/linkedin-search/SKILL.md`。 ### 薪酬基准测试 薪酬工具适用于你提供的任何薪酬数据(工会统计数据、Glassdoor 导出文件、个人研究等)。有关预期的格式和设置,请参见 `tools/README_SALARY_TOOL.md`。如果你没有薪酬数据,薪酬步骤将被直接跳过。 ### 重新开始 要清除你的个人简介数据并重新开始: ``` /reset profile # clears skill files, preserves framework rules /reset documents # deletes files from documents/ folder /reset all # both ``` `/reset` 会确切显示将要删除的内容,并要求你输入 `RESET` 进行确认。在你执行此操作之前,不会删除任何内容。 ## 获得更好结果的提示 个人简介深度至关重要 影响输出质量的最大因素在于你在个人简介中填入的细节程度。单薄的个人简介会产生通用的求职申请;而详细的简介则能实现真正的量身定制。 - **职位描述:** 不要仅仅列出职位头衔。描述你在每个职位上实际所做的工作:具体项目、使用的工具、职责以及可衡量的成就。你提供的材料越丰富,系统就能越准确地为不同的职位重塑你的经验。 - **结合语境的技能:** 与其仅仅列出“Python”或“项目管理”,不如描述你是如何以及在哪里应用它们的。“使用 Python 和 scikit-learn 构建了用于客户流失预测的 ML pipeline”比“Python,机器学习”为系统提供了更多可处理的信息。 - **所有上手路径都有效:** 无论你是将 `/setup` 指向你的 `documents/` 文件夹、粘贴单个简历,还是通过访谈完成,原则都是一样的:更丰富的输入产生更敏锐的输出。 ### 职业路径发现 该框架支持两种不同的求职模式: - **明确目标定位:** 你知道自己想要哪些职位或行业。系统根据匹配度帮助细化和排序优先级。 - **潜在机会发现:** 通过分析你的完整历史(不仅是职位头衔,还有你实际做过的工作),系统可以发现你未曾考虑过的职业路径。映射到意想不到的行业的可迁移技能、你喜欢或擅长的领域的模式,或者是将你的领域专业知识与新技术结合的新兴职位。 为了充分利用这一点,请在 `/setup` 期间花时间不仅描述你的经验,还要描述什么让你充满干劲、什么让你感到消耗,以及你希望在未来获得更多什么。这种背景直接影响系统如何评估匹配度,以及在 `/scrape` 期间会为你呈现哪些职位。 ## 鸣谢 - [Mikkel Krogholm](https://github.com/mikkelkrogsholm)([技能仓库](https://github.com/mikkelkrogsholm/skills))提供的求职 CLI 技能 - 由 [Anthropic](https://anthropic.com) 使用 [Claude Code](https://claude.com/claude-code) 构建 ## 许可证 MIT
标签:AI 助手, Claude Code, LaTeX, Python, 提示词工程, 无后门, 求职自动化, 策略决策点, 自动化攻击, 逆向工具