🔥 MadsLorentzen/ai-job-search:基于 Claude Code 的 AI 求职应用框架
英文标题:🔥 MadsLorentzen/ai-job-search
这是一个开源 AI 求职工作流框架,建立在 Claude Code 之上,帮助求职者自动完成职位评估、定制简历、撰写求职信和面试准备。核心流程(自我画像、匹配度评估及起草-审核双代理管道)与语言和地区无关,内置的搜索技能默认面向丹麦市场,但可自行替换为本地求职平台。系统强调 PDF 验证和 ATS 文本层检查,避免排版与解析陷阱,并采用相关性裁剪确保简历精简而不丢失关键信息。项目为开发者提供了可复用的命令行工具链和全套 LaTeX 模板,适合将其形成为个人求职助手或二次开发基础。
265.0 KB
4.0 KB
77.5 KB
中文
一个基于 Claude Code 的 AI 驱动求职应用框架。Fork 本仓库,填写你的个人资料,让 Claude 评估职位、定制你的简历、撰写求职信并为你准备面试。
注意:这是一个独立的开源项目,与 Anthropic 无关,亦未经其背书、赞助或维护。提及 Anthropic 和 Claude Code 仅用于描述本工作流使用的工具链。
一套结构化的流程,将 Claude Code 转变为全栈求职申请助手。核心工作流(自我画像、匹配度评估以及起草-审核申请管道)与语言和地区无关。职位门户搜索技能是为丹麦市场构建的(Jobindex、Jobnet、Akademikernes Jobbank 等),但设计模式允许你替换为本地求职平台。
/setup /scrape /apply | | | v v v 填写 搜索职位 评估匹配度 你的资料 门户网站 打分与推荐 | | | v v v 资料文件 展示匹配结果 草拟简历与求职信 准备就绪 带匹配评分 (LaTeX,量身定制) | | v v 选择一个岗位 审核代理提出批评 -> /apply -> 修订 -> 最终输出
该框架融入了职业指导最佳实践,包括结构化的评估标准、面向未来的求职信框架以及可选的薪酬基准。
系统要求
- Claude Code(CLI)
- Python 3.10+
- Bun(用于丹麦求职搜索 CLI 工具)
- 包含
lualatex和xelatex的 LaTeX 发行版:TeX Live 或 MiKTeX。简历使用lualatex编译(在现代 MiKTeX 安装中pdflatex常因fontawesome5字体扩展错误失败);求职信使用xelatex编译,因为cover.cls需要fontspec。 - 可选:
pdftotext(来自 poppler)(macOS:brew install poppler,Debian/Ubuntu:apt install poppler-utils,Windows:choco install poppler)——/apply对编译后的简历进行 ATS 可解析性检查时使用。若缺少,检查将降级为可视关键词审查。
快速开始
1. Fork 并克隆
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 Code 并运行 setup
claude
然后在 Claude Code 内:
/setup
/setup 提供三种路径:如果你已经填充了 documents/ 文件夹(简历 PDF、LinkedIn 导出、学位证、推荐信、过往申请),则读取该文件夹;导入在聊天中粘贴的单份简历;或通过一次对话引导完成。它会自动检测你拥有哪些资料并提问。文件夹模式是幂等的,随着你添加更多材料可安全重新运行;关于布局请参见 documents/README.md。
4. 抓取职位
这会从多个职位门户搜索与你的资料匹配的职位,去除重复结果,并按匹配度排序展示。选择一个岗位即可直接对其运行 /apply——或者当抓取返回的职位过多,你不想逐个细看时,先运行 /rank 批量对它们进行匹配度打分,得到一个排序后的短名单。
5. 申请一个职位
/apply https://jobindex.dk/job/1234567
如果无法获取 URL(某些职位门户禁止自动化访问),可直接粘贴职位描述:
/apply <在此粘贴完整的职位描述>
这会运行完整工作流:评估匹配度、草拟简历+求职信、由第二个代理审查、修订并呈现最终输出。
命令参考
/setup、/scrape 和 /apply 构成核心工作流。一旦你的资料就位,另有六个命令可扩展流程:
/outcome记录申请结果——面试环节、录用、拒绝、无音信。它将提交的简历、求职信和职位描述文本归档到documents/applications/<company>_<role>/,以/setup路径A 可解析的格式保存outcome.md,并更新跟踪器。当有若干申请有了结果后,它会提示你返回/setup,根据实际获得面试的情况校准匹配度框架。/rank连接/scrape和/apply:它批量对所有新抓取的职位按照匹配度框架打分(并行代理获取每个职位,并对五个评估维度打分),返回一个排好序的短名单,并诚实列出每个岗位的优势和差距。硬伤项直接否决,截止日期标为紧急,过期职位标为已失效。选择一个序号即可进入完整的/apply工作流。/expand通过扫描你已在资料中链接的公开来源(GitHub 仓库、作品集网站、Kaggle、Google Scholar)以及查找已列出的课程和证书大纲,来丰富你的个人资料。发现的技能会带上来源标签添加到资料中。很适合在/setup之后立即使用,以发现仅凭文档未能显式表露的技能。/upskill分析你与已跟踪职位(或通过/upskill <URL>对单个职位)之间的技能差距,生成按优先级排序的技能差距热力图以及附带网络搜索学习资源和时间预估的学习计划。适用于两次申请之间的职业规划。/add-template让你注册自己的 LaTeX 简历或求职信模板,替代内置模板。它会记录模板的指令(编译引擎、字体、样式规则、页数限制),进行强制测试编译,然后将模板接入/apply。详见下面的 LaTeX 模板部分。/add-portal为你所在市场的求职平台生成一个职位门户搜索技能。它先探查门户(搜索 URL 模式、结果结构、访问规则),然后以与内置工具相同的结构搭建 CLI 技能,并在注册前进行实时查询测试。详见求职搜索工具部分。
/reset 也可用,参见下方的“重新开始”部分。
目录结构
ai-job-search/ ├── CLAUDE.md # 主候选人资料 + 工作流规则 ├── .claude/ │ ├── commands/ │ │ ├── apply.md # /apply 工作流(起草-审查) │ │ ├── setup.md # /setup 入门引导(文档文件夹、CV 导入或面试) │ │ ├── expand.md # /expand 从文档和在线存在中丰富技能 │ │ ├── add-template.md # /add-template 注册自定义 LaTeX 模板 │ │ ├── add-portal.md # /add-portal 为你所在市场生成职位门户搜索技能 │ │ ├── rank.md # /rank 对抓取的职位进行筛选并排序 │ │ ├── outcome.md # /outcome 记录申请结果、归档材料 │ │ └── reset.md # /reset 清除资料数据或文档文件夹 │ ├── skills/ │ │ ├── job-application-assistant/ # 核心申请技能 │ │ │ ├── SKILL.md # 技能定义 │ │ │ ├── 01-candidate-profile.md # 你的教育、经验、技能 │ │ │ ├── 02-behavioral-profile.md# PI/DISC/性格评估 │ │ │ ├── 03-writing-style.md # 语气、结构、注意事项 │ │ │ ├── 04-job-evaluation.md # 职位匹配度评分框架 │ │ │ ├── 05-cv-templates.md # LaTeX 简历结构与定制规则 │ │ │ ├── 06-cover-letter-templates.md # LaTeX 求职信模板 │ │ │ └── 07-interview-prep.md # STAR 案例 + 面试框架 │ │ ├── job-scraper/ # 职位搜索协调 │ │ └── upskill/ # /upskill 技能差距分析和学习计划 │ └── settings.json # Claude Code 权限设置(共享,限定范围) ├── .agents/skills/ # 职位门户 CLI 工具 │ ├── jobbank-search/ # Akademikernes Jobbank(丹麦) │ ├── jobdanmark-search/ # Jobdanmark.dk(丹麦) │ ├── jobindex-search/ # Jobindex.dk(丹麦) │ ├── jobnet-search/ # Jobnet.dk(丹麦,政府门户) │ └── linkedin-search/ # LinkedIn 公开职位列表(跨国) ├── cv/ │ └── main_example.tex # moderncv LaTeX 模板 ├── cover_letters/ │ ├── cover.cls # 自定义求职信 LaTeX 文档类 │ └── OpenFonts/ # Lato + Raleway 字体 ├── templates/ # 通过 /add-template 注册的自定义模板 │ └── README.md # 文件夹布局说明 ├── documents/ # /setup 路径A 和 /expand 用到的职业资料 │ ├── README.md # 文件夹布局说明 │ ├── cv/ # 主简历(PDF 或 .tex) │ ├── linkedin/ # LinkedIn 资料导出(PDF) │ ├── diplomas/ # 学位证和成绩单 │ ├── references/ # 推荐信 │ └── applications/ # 过往申请记录(<公司>_<职位>/) ├── salary_lookup.py # 薪酬基准工具(需自备数据) ├── tools/ │ ├── convert_salary_excel.py # 将薪酬 Excel 转换为 JSON │ └── README_SALARY_TOOL.md # 薪酬工具安装说明 ├── job_scraper/ # 抓取器状态(已见职位、结果) ├── upskill/ # /upskill 报告输出(每次运行生成 markdown 报告) ├── job_search_tracker.csv # 申请跟踪电子表格 └── SETUP.md # 详细安装指南
/apply 工作流
/apply 命令运行起草-审查工作流并强制进行 PDF 编译:
- 解析职位信息(URL 或文字)
- 评估与你的资料匹配度(技能、经验、文化、地点、职业方向)
- 起草一份量身定制的 LaTeX 简历和求职信
- 启动一个审查代理,该代理会研究目标公司并对草稿提出批评
- 根据审查反馈进行修订
- 编译并检查两个 PDF:简历使用
lualatex,求职信使用xelatex。Claude 会阅读渲染后的页面并反复调整 LaTeX,直到简历精确为 2 页且无孤立的条目标题,求职信精确为 1 页且签名可见、字体一致。 - 对简历进行 ATS 检查:提取 PDF 的文本层(
pdftotext,可选依赖),并以 ATS 解析器所见的方式验证——联系信息以纯文本形式存在,无乱码字符,阅读顺序合理——然后将职位描述的关键词覆盖率与提取结果对照评分。资料确实支持的关键词会加入,真正的差距则保持可见,绝不堆砌。 - 呈现最终输出并附验证清单
所有简历和求职信中的声明均依据你的真实资料验证。系统从不编造技能或经历。
该工作流的独特之处
- PDF 验证循环。 大多数 LaTeX 简历模板会在 PDF 中出现“.tex 里看没问题”的输出问题:职位标题孤行到下一页、求职信溢出到第2页、列表符号字体悄然退化为正文字体。
/apply命令会编译并可视检查每个 PDF,并采用针对性修复(\needspace、\enlargethispage、列表项字体匹配包裹等),直到版式整洁为止。每次申请时都会自动执行。 - 针对 PDF 文本层的 ATS 验证。 ATS 读取的是 PDF 内嵌的文字,而非渲染后的页面——而 LaTeX 可能静默生成文字提取结果如同乱码的 PDF(本该是邮箱的位置却成了图标字符,多栏布局的行交错出现)。
/apply使用pdftotext提取编译后简历的文本层,并验证联系信息、阅读顺序以及职位描述关键词覆盖在解析器实际所见层面的情况。坚持诚实原则:如果某个关键词资料并不支持,就标记为差距,绝不强行堆砌。 - 相关性加权的简历裁剪。 当简历超出 2 页时,工作流不会机械地从“最旧”板块删除。它依据(a)与目标职位的相关性,(b)在文档中的唯一性,以及(c)求职信是否依赖于它,对每一候选行打分,并优先删除总分最低的行。某段较早职位中命中岗位关键词的描述会比近期但无关的描述更容易被保留。
- 起草-审查分离。 由起草者撰写;第二个带有全新上下文的 Claude 代理则研究公司并审查草稿。起草者随后进行修订。这能捕捉到单次处理常常会遗漏的缺失关键词、薄弱的表达和泛泛的语言。
English / 原文
An AI-powered job application framework built on 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.
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.
A 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.
/setup /scrape /apply <url>
| | |
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
The framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking.
-
Claude Code (CLI)
-
Python 3.10+
-
Bun (for Danish job search CLI tools)
-
LaTeX distribution with
lualatexandxelatex: TeX Live or MiKTeX. The CV compiles withlualatex(pdflatex often fails on modern MiKTeX installs withfontawesome5font-expansion errors); the cover letter compiles withxelatexbecausecover.clsrequiresfontspec. -
Optional:
pdftotextfrom poppler (macOS:brew install poppler, Debian/Ubuntu:apt install poppler-utils, Windows:choco install poppler) — used by/apply's ATS parseability check on the compiled CV. If missing, the check degrades gracefully to a visual keyword review.gh repo fork MadsLorentzen/ai-job-search --clone cd ai-job-search
2. Install job search tools
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 ../../../..
For linkedin-search the install is optional: it has zero runtime dependencies and runs with plain bun; bun install only pulls TypeScript dev types.
claude
# Then inside Claude Code:
/setup
/setup offers three paths: read your documents/ folder if you have one populated (CV PDF, LinkedIn export, diplomas, reference letters, past applications), import a single CV pasted in chat, or walk through an interview. It auto-detects what you have and asks. Documents-folder mode is idempotent and safe to re-run as you add more material; see documents/README.md for the layout.
This searches multiple job portals for positions matching your profile, deduplicates results, and presents them sorted by fit. Pick a match to run /apply on it directly — or, when a scrape returns more jobs than you want to eyeball, run /rank to batch-score them all against the fit framework and get a ranked shortlist first.
/apply https://jobindex.dk/job/1234567
If the URL can't be fetched (some job portals block automated access), you can paste the job description directly instead:
/apply <paste the full job description here>
This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output.
/setup, /scrape, and /apply form the core workflow. Six more commands extend it once your profile is in place:
/outcomerecords what happened to an application - interview stages, offers, rejections, silence. It archives the submitted CV, cover letter, and posting text intodocuments/applications/<company>_<role>/, keepsoutcome.mdin the format/setupPath A parses, and updates the tracker. Once a few applications resolve, it points you back to/setupto calibrate the fit framework from what actually got interviews./rankbridges/scrapeand/apply: it batch-scores all newly scraped postings against the fit framework (parallel agents fetch each posting and score the five evaluation dimensions) and returns a ranked shortlist with honest per-job strengths and gaps. Deal-breakers veto, deadlines get urgency flags, dead postings get marked expired. Pick a number and it hands off to the full/applyworkflow./expandenriches your profile by scanning public sources you've already linked in it (GitHub repos, portfolio site, Kaggle, Google Scholar) and looking up syllabi for named courses and certifications. Discovered competencies are added to your profile with a source tag. Useful right after/setupto surface skills that documents alone don't make explicit./upskillanalyzes the gap between your profile and your tracked job postings (or a single posting via/upskill <URL>). Produces a prioritized heatmap of skill gaps and a learning plan with web-searched study resources and time estimates. Useful for career planning between applications./add-templateregisters your own LaTeX CV or cover letter template in place of the stock ones. It captures the template's instructions (compile engine, fonts, style rules, page limit), runs a mandatory test compile, and wires the template into/apply. See LaTeX templates below./add-portalgenerates a job-portal search skill for a job board in your market. It investigates the portal (search URL pattern, result structure, access rules), scaffolds the CLI skill from the same structure as the shipped ones, and test-runs a live query before registering. See Job search tools below.
/reset is also available, see Starting over below.
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
│ │ ├── rank.md # /rank triage scraped jobs into a ranked shortlist
│ │ ├── outcome.md # /outcome record application results, archive materials
│ │ └── 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 (<company>_<role>/)
├── 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
The /apply command runs a drafter-reviewer workflow with mandatory PDF compilation:
- Parse the job posting (URL or text)
- Evaluate fit against your profile (skills, experience, culture, location, career alignment)
- Draft a tailored CV and cover letter in LaTeX
- Spawn a reviewer agent that researches the company and critiques the drafts
- Revise based on the reviewer's feedback
- Compile and inspect both PDFs: lualatex for the CV, xelatex for the cover letter. Claude reads the rendered pages and iterates on the LaTeX until the CV is exactly 2 pages with no orphaned entry titles, and the cover letter is exactly 1 page with the signature visible and fonts consistent.
- ATS-check the CV : extract the PDF's text layer (
pdftotext, optional dependency) and verify it the way an ATS parser sees it — contact details present as literal text, no garbled glyphs, sane reading order — then score the posting's keyword coverage against the extraction. Keywords the profile genuinely supports get added; genuine gaps stay visible, never stuffed. - Present the final output with a verification checklist
All claims in the CV and cover letter are verified against your actual profile. The system never fabricates skills or experience.
What makes this workflow different
- PDF verification loop. Most LaTeX-resume templates produce "looks fine in the .tex" output that breaks in the PDF: job titles orphan to the next page, cover letters spill onto page 2, bullet fonts silently fall back to the body font. The
/applycommand compiles and visually inspects every PDF and applies targeted fixes (\needspace,\enlargethispage, font-matching wrappers for list items) until the layout is clean. This runs automatically on every application. - ATS verification on the PDF text layer. An ATS reads the PDF's embedded text, not the rendered page — and LaTeX can silently produce PDFs whose text extracts as garbage (icon glyphs where the email should be, interleaved lines from multi-column layouts).
/applyextracts the compiled CV's text layer withpdftotextand verifies contact details, reading order, and the posting's keyword coverage against what a parser actually sees. Honesty rule enforced: a keyword the profile doesn't support is acknowledged as a gap, never stuffed in. - Relevance-weighted CV cutting. When a CV overflows 2 pages, the workflow does not cut mechanically from the "oldest" section. It scores each candidate line by (a) relevance to the target posting, (b) uniqueness in the document, and (c) whether the cover letter depends on it, and cuts the lowest-total-score line first. An older-role bullet that hits posting keywords survives ahead of a recent-role bullet that does not.
- Drafter-reviewer separation. The drafter writes; a second Claude agent, spawned with a fresh context, researches the company and critiques the drafts. The drafter then revises. This catches missed keywords, weak framing, and generic language that a single pass often leaves in.
- Token-efficient reviewer dispatch. The reviewer agent receives drafts inline rather than re-reading them, and the verification checklist runs once at the end of the workflow rather than being duplicated by both agents. Note: the new compile-and-inspect step in Step 5 spends some of those savings on PDF rendering and layout iteration — the workflow trades some end-to-end token cost for a real reduction in broken PDFs reaching the user.
Which files to edit manually
If you prefer editing files directly instead of using /setup:
| File | What to change |
|---|---|
CLAUDE.md |
Your full profile (name, education, experience, skills, goals) |
01-candidate-profile.md |
Structured version of your CV data |
02-behavioral-profile.md |
Your behavioral assessment or self-assessment |
04-job-evaluation.md |
Skill match areas, career goals, motivation filters |
05-cv-templates.md |
Profile statement templates for different role types |
07-interview-prep.md |
Your STAR examples from actual experience |
search-queries.md |
Job search queries for your skills and location |
Updating your search queries
As your priorities evolve, you can reconfigure just the job search without re-running the full profile setup:
This re-runs the search configuration interview: which roles to target, which skills to search for, which locations, and which portals. It also suggests role types you may not have considered based on your profile.
The CV uses moderncv (banking style). The cover letter uses a custom cover.cls with Lato/Raleway fonts.
To use your own template instead, run:
Point it at your .tex file (plus any .cls/.sty files or bundled fonts). The command interviews you for the template's instructions — compile engine, fonts and where they live, style rules to preserve, hard page limit — stores everything under templates/, runs a mandatory test compile, and activates the template so /apply drafts from it. Templates are stored with [PLACEHOLDER] tokens instead of personal data, so they're safe to commit and share.
/add-template --listshows registered templates/add-template --use <name>switches between them/add-template --use defaultreverts to the stock moderncv / cover.cls templates
If you prefer doing it by hand, the manual route still works: update the guidance in 05-cv-templates.md and 06-cover-letter-templates.md.
The four Danish CLI tools in .agents/skills/ (Jobbank, Jobdanmark, Jobindex, Jobnet) demonstrate the pattern for building a job-portal integration for a specific market. If you're in a different country, run:
Give it your local job board's URL. The command investigates the portal (search-URL pattern, result-page structure, robots.txt/access rules), scaffolds a CLI skill with the same structure, commands, and output contract as the shipped ones, and test-runs a live query before registering anything. Auth-walled portals are declined, and portals with restrictive terms get a prominent personal-use-only warning in the generated skill. The generated skill is market-specific and lives in your fork; the generator itself is the universal part.
For a country-agnostic starting point, the repo also includes linkedin-search — a job-search skill built on LinkedIn's public, unauthenticated jobs-guest endpoints. It is field-agnostic, has zero runtime dependencies (runs with just bun), and takes the search location as an explicit flag, so it works for any market out of the box (-l "Berlin, Germany", -l "Mumbai, Maharashtra, India", -l "Remote", …). It is intended for personal use only — automated access is against LinkedIn's Terms of Service, so keep volume low. See .agents/skills/linkedin-search/SKILL.md.
The salary tool works with any salary data you provide (union statistics, Glassdoor exports, personal research, etc.). See tools/README_SALARY_TOOL.md for the expected format and setup. If you don't have salary data, the salary step is simply skipped.
To wipe your profile data and start fresh:
/reset profile # clears skill files, preserves framework rules
/reset documents # deletes files from documents/ folder
/reset all # both
/reset shows exactly what will be deleted and requires you to type RESET to confirm. Nothing is deleted until you do.
The single biggest factor in output quality is how much detail you put into your profile. A thin profile produces generic applications; a detailed one enables genuinely tailored results.
- Role descriptions: Don't just list job titles. Describe what you actually did in each position: specific projects, tools used, responsibilities, and measurable achievements. The more material you provide, the more precisely the system can reframe your experience for different roles.
- Skills in context: Instead of listing "Python" or "project management," describe how and where you applied them. "Built ML pipelines for customer churn prediction in Python using scikit-learn" gives the system far more to work with than "Python, machine learning."
- All onboarding paths work: Whether you point
/setupat yourdocuments/folder, paste a single CV, or walk through the interview, the principle is the same: richer input produces sharper output.
The framework supports two distinct modes of job searching:
- Explicit targeting: You know which roles or sectors you want. The system helps refine and prioritize based on fit.
- Latent opportunity discovery: By analyzing your full history (not just job titles, but the actual work you did), the system can surface career paths you haven't considered. Transferable skills that map to unexpected industries, patterns in what you enjoyed or excelled at, or emerging roles that combine your domain expertise with new technology.
To get the most from this, invest time during /setup in describing not just your experience, but what energized you, what drained you, and what you'd want more of. This context directly shapes how the system evaluates fit and which roles it surfaces during /scrape.
MIT
