项目简介
利用 Claude Code 自动化求职流程的框架。包括用户画像、搜索职位、评估匹配度、定制简历和求职信,以及面试准备。
README 预览
\n \n\n\n# AI Job Search\n\nAn AI-powered job application framework built on [Claude Code](https://claude.com/claude-code). Fork it, fill in your profile, and let Claude evaluate job postings, tailor your CV, write cover letters, and prepare you for interviews.\n\n> Note: This is an independent open-source project and is not affiliated with, endorsed by, sponsored by, or maintained by Anthropic. Anthropic and Claude Code are referenced only to describe the toolchain this workflow uses.\n\n\n \n \n \n\n\n## What this is\n\nA structured workflow that turns Claude Code into a full-stack job application assistant. The core workflow (self-profiling, fit evaluation, and the drafter-reviewer application pipeline) is **language- and country-agnostic**. The job portal search skills are built for the Danish market (Jobindex, Jobnet, Akademikernes Jobbank, etc.), but the pattern is designed to be swapped for your local job boards.\n\n```\n/setup /scrape /apply \n | | |\n v v v\nFill in Search job Evaluate fit\nyour profile portals Score & recommend\n | | |\n v v v\nProfile Present matches Draft CV + Cover Letter\nfiles ready with fit ratings (LaTeX, tailored)\n | |\n v v\n Pick a match Reviewer agent critiques\n -> /apply -> Revise -> Final output\n```\n\nThe framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking.\n\n## Prerequisites\n\n- [Claude Code](https://claude.com/claude-code) (CLI)\n- Python 3.10+\n- [Bun](https://bun.sh) (for Danish job search CLI tools)\n- LaTeX distribution with `lualatex` and `xelatex`: [TeX Live](https
常见问题 (5)
故障排除当西里尔文或其他非拉丁语标题发生变化时,如何修复同一 Freehire URL 出现重复职位键(job keys)的问题?
重复问题的产生是因为 tools/job_key.py 对 title + url 进行哈希;非拉丁字符的标题在 slug 化后会变成 untitled,而 Freehire 的字母数字 slug 又不符合六位数字的 _JOB_ID 模式。修复该辅助函数:只要存在 URL 就只对 URL 进行哈希,仅在没有 URL 时才将标题作为后备方案。然后验证所有标题变体都会生成同一个键:
U=https://freehire.me/jobs/inzhener-ooo-chen-hlk3qjfg
python3 tools/job_key.py --company "ООО Чен" --title "Инженер" --url "$U"
python3 tools/job_key.py --company "ООО Чен" --title "инженер" --url "$U"
python3 tools/job_key.py --company "ООО Чен" --title "Инженер-механик" --url "$U"
python3 tools/job_key.py --audit
这三条命令应返回相同的键,并且 duplicate_urls 不应再报告该职位发布。应用修复后,请重建 seen_jobs.json 或对其进行去重,以确保旧的重复键不会保留在排除集合中。不要依赖标题 slug 规范化或字母数字 slug ID,因为职位重新发布时 slug 可能会发生变化。
故障排除为什么当 Excel 行包含 500 名员工且同时具有 Count 和 Index 列时,salary_lookup 显示 "too few employees to publish (privacy)"?
出现这种情况是因为 convert_salary_excel.py 不会将不带后缀的表头(如 Count + Index,或丹麦语 Antal + Lønindeks)进行配对。它们派生出的类别名称为空,因此被导出为两个独立的类别,而不是一个 all_employees 类别。
临时解决方法:为两个表头赋予相同的非空类别后缀,然后重新生成 JSON:
Count all | Index all
或使用丹麦语:
Antal alle | Lønindeks alle
然后运行:
python3 tools/convert_salary_excel.py acme.xlsx --output salary_data.json
python3 salary_lookup.py "Acme Corp"
此时查询结果应显示一行合并的数据,其中包含计数、指数和基准差异。
永久性代码修复:修改 tools/convert_salary_excel.py 中的计数/指数配对条件,使其接受相等的派生类别名称(包括空字符串),并为空的配对指定默认类别名称 all_employees。没有匹配指数列的裸 Count/Antal 列必须保留为独立的计数列。
故障排除如何修复 jobdanmark-search detail 在首次收到 HTTP 429 或 5xx 响应时直接失败而不重试的问题?
detail 命令在 .agents/skills/jobdanmark-search/cli/src/commands/detail.ts 中直接调用了 fetch(),绕过了 CLI 的重试封装。修复方法:在 jobdanmark-search/cli/src/helpers.ts 中添加一个 htmlFetch(url) 封装,使其使用与 apiFetch/apiPost 相同的重试/退避循环、超时设置以及导出的 USER_AGENT。让它对 HTTP 404 返回 null,以便 detail 保留其 NOT_FOUND 行为,然后将 detail.ts 中的直接 fetch() 调用替换为 htmlFetch()。扩展重试退避、请求超时和封装相关的测试,并添加一个 handler 级别的测试:将 fetch 打桩为返回 429,并验证按照预期的 500ms 到 5s 的退避计划执行了多次尝试。
故障排除如何修复在 Windows 上打印网页文本时出现的 UnicodeEncodeError 'charmap codec can't encode character' 错误?
崩溃发生的原因是:在 Windows 上,Python 的管道式 stdout 默认使用旧版 ANSI 代码页(cp1252),该代码页无法编码非拉丁字符(例如波兰语 Ż、Ł;丹麦语 Ø;西里尔文/中日韩文字符)。修复方法是在脚本启动时强制使用 UTF-8 输出。在 tools/fetch_page.py 和 tools/robots_check.py 中,在任何 print() 之前调用共享的 _force_utf8_output() 辅助函数——这与 tools/rank_state.py、tools/job_key.py、tools/posting_guard.py、tools/verify_layout.py、tools/verify_pdf.py 和 tools/upstream_triage.py 中已经使用的模式相同。它会将 sys.stdout/sys.stderr 重新配置为 UTF-8(等同于在 Python 3.7+ 上执行 sys.stdout.reconfigure(encoding='utf-8', errors='replace'))。不修改代码的替代解决方案:在运行前设置环境变量 PYTHONIOENCODING=utf-8 或 PYTHONUTF8=1,例如 PYTHONIOENCODING=utf-8 python3 tools/fetch_page.py <url> --text,或者在 Windows 控制台中运行 chcp 65001 将其切换为 UTF-8。
故障排除如何修复 jobdanmark-search detail 在 JSON-LD description 中返回原始 HTML 标签的问题?
在 JSON-LD 分支(detail.ts 中的 fromJsonLd)中,不要原样赋值 jobPosting.description。使用现有的 node-html-parser 依赖对其进行解析,并用 structuredText 解码实体并将块级元素转换为独立的行,然后使用现有的 cleanText 辅助函数规范化每一行。这样可以使 JSON-LD 输出与渲染 HTML 的分支保持一致:标签被剥离,& 和 ø 等实体被解码,段落/列表的换行得以保留。更新 detail-jsonld.test.ts,使其期望纯文本而不是原始的 <p> 标记,并添加一个包含 HTML(如 <p>...</p><ul><li>...</li></ul>)的测试用例。