AI Job Search — агентный фреймворк для отклика на вакансии
📂 Исходный код на GitHubФреймворк для отклика на вакансии на базе Claude Code: оценка вакансий, адаптация CV, сопроводительные письма и подготовка к интервью
Поиск работы — это процесс, который отлично ложится на агентный пайплайн: собрать вакансии, отсеять нерелевантные, оценить соответствие, сгенерировать документы под конкретную позицию и подготовиться к интервью. AI Job Search — это готовый фреймворк, который делает всё это внутри Claude Code. Не демо и не набор промптов: репозиторий на Python и Bun (MIT, около 44 тысяч звёзд), который нужно форкнуть, заполнить своим профилем и использовать как рабочую машину.
Автор — геофизик, чью позицию сократили в конце 2025 года. Фреймворк он построил для собственного поиска и использовал еженедельно: 69 tailored-откликов, 20 первых интервью и один подписанный контракт, после чего в июне 2026 он начал работать AI-инженером. Проект не связан с Anthropic и не спонсируется ими.
Как устроен основной поток
Ядро фреймворка — три команды, языково и страново независимые от рынка:
/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)
/setup наполняет профиль, /scrape обходит порталы и показывает подходящие вакансии с оценкой, /apply прогоняет полный цикл по одной ссылке. Логика лежит в скиллах — ядро это job-application-assistant с семью файлами-инструкциями: профиль кандидата, поведенческий профиль (PI/DISC), стиль письма, критерии оценки вакансии, шаблоны CV, шаблоны сопроводительных писем и материалы к интервью.
Требования
- Claude Code (CLI) с подпиской Pro/Max/Team либо с кредитами Anthropic API — бесплатного тарифа нет. Фреймворк заточен под этот инструмент, хотя портальные скиллы работают и в других агентах: для Codex, Gemini CLI и прочих точка входа — файл
AGENTS.mdв репозитории. - Python 3.10+ и Bun — для CLI-инструментов поиска вакансий.
- LaTeX-дистрибутив с
lualatexиxelatex: TeX Live, MacTeX, TinyTeX или MiKTeX. CV собираетсяlualatex(на свежих сборках MiKTeXpdflatexпадает наfontawesome5), письмо —xelatex, потому что классcover.clsтребуетfontspec. - Опционально —
pypdfдля проверки читаемости CV силами ATS;pdftotextиз Poppler остаётся запасным вариантом, а без обоих проверка превращается в визуальный просмотр ключевых слов.
Быстрый старт
Форк и клонирование:
gh repo fork MadsLorentzen/ai-job-search --clone
cd ai-job-search
Установка CLI-инструментов порталов:
for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
(cd .agents/skills/$tool/cli && bun install)
done
Далее запускается claude, и внутри — /setup. Команда предлагает три пути: читать папку documents/ с уже готовыми материалами (CV в PDF, выгрузка LinkedIn, дипломы, рекомендательные письма), вставить одно CV прямо в чат или пройти собеседование с агентом. Режим с папкой идемпотентен — его можно перезапускать по мере добавления документов.
Дальше /scrape собирает вакансии, дедуплицирует и сортирует их по соответствию профилю, а /apply запускает полный цикл:
/apply https://jobindex.dk/job/1234567
Часть порталов блокирует автоматический доступ — тогда описание вакансии можно вставить текстом прямо в команду.
Как работает /apply
- Разбор вакансии по URL или из текста.
- Оценка соответствия профилю: навыки, опыт, культура, локация, карьерная траектория.
- Черновик адаптированных CV и сопроводительного письма в LaTeX.
- Спавн отдельного агента-ревьюера со свежим контекстом: изучает компанию и критикует черновики.
- Ревизия по замечаниям ревьюера.
- Компиляция и визуальная проверка PDF: агент читает отрендеренные страницы и итерирует LaTeX, пока CV не станет ровно двумя страницами без висящих заголовков, а письмо — одной страницей с видимой подписью.
- ATS-проверка: текстовый слой PDF извлекается и читается так, как его увидит парсер, — контакты должны быть literal-текстом, порядок чтения — осмысленным, покрытие ключевых слов — посчитанным. Ключевые слова, которых нет в профиле, добавляются только если профиль их правда поддерживает; настоящие пробелы остаются видимыми.
- Финальный вывод с чек-листом проверки.
Отдельная деталь, которой нет у большинства генераторов резюме: cutting по релевантности. Если CV не влезает в две страницы, строки не режутся механически «от самой старой». Каждая кандидатная строка получает оценку по трём осям — релевантность целевой вакансии, уникальность в документе и зависимость от письма, — и первой уходит строка с наименьшим суммарным баллом.
Ещё две особенности. Проверка PDF ловит то, что не видно в исходнике: заголовок должности, уехавший на следующую страницу, письмо на две страницы вместо одной, молчаливый откат шрифтов в буллитах. ATS-проверка читает не страницу, а встроенный текстовый слой, где LaTeX умеет превращать email в иконку, а многоколоночную верстку — в перемешанные строки. И отдельно про честность: ревьюер запускается с чистым контекстом, поэтому общие слова и пропущенные ключевые слова, которые обычно остаются после одного прохода, попадаются на пересмотр.
Остальные команды
Помимо ядра есть ещё десять команд:
| Команда | Что делает |
|---|---|
/interview |
Готовит пакет под конкретный этап: исходная вакансия, то самое CV и письмо, которые читал интервьюер, фидбек с прошлых раундов, вероятные вопросы и STAR-примеры, мок-интервью |
/outcome |
Фиксирует исход отклика, архивирует материалы в documents/applications/, ведёт трекер; followup поднимает «зависшие» отклики и черновит напоминания |
/rank |
Пакетно оценивает свежие вакансии параллельными агентами и отдаёт отсортированный шорт-лист с честными сильными сторонами и пробелами |
/upskill |
Сравнивает профиль с вакансиями и строит приоритетную карту дефицита навыков с учебным планом |
/expand |
Обогащает профиль из уже привязанных публичных источников: репозитории, портфолио, Kaggle, Google Scholar |
/html-report |
Автономный дашборд по job_search_tracker.csv на inline SVG, открывается в браузере офлайн |
/notion-sync |
Односторонний read-only вид пайплайна в базе Notion через официальный MCP-сервер, без API-ключей |
/gmail-sync |
Читает статусы откликов из Gmail и предлагает батч изменений к трекеру, каждое со ссылкой на письмо |
/add-template |
Регистрирует свой шаблон CV или письма вместо стоковых |
/add-portal |
Генерирует скилл поиска вакансий для локального портала |
Свои порталы и шаблоны
Портальные скиллы в .agents/skills/ — это модульная система: шесть поисковых CLI с единым контрактом (search/detail, --format json|table|plain, флаг enabled: в SKILL.md, свои тесты). /scrape находит любой установленный скилл по этому контракту — регистрировать ничего не нужно. Готовые есть для датского рынка (Jobindex, Jobnet, Akademikernes Jobbank, Jobdanmark) плюс два работающих где угодно: linkedin-search на публичных эндпоинтах LinkedIn без авторизации (только для личного использования, объём должен быть небольшим) и freehire-search по публичному REST API freehire.me — с нулевыми рантайм-зависимостями; бэкенд у него MIT-лицензированный и поднимаемый локально.
Свой рынок добавляется одной командой:
/add-portal
На порталы за авторизацией команда рассчитана не будет, а порталы с жёсткими условиями использования получат в сгенерированном скилле заметное предупреждение о личном применении. Порталы, собранные другими форками, лежат в общем треде с форками и адаптациями — но копировать чужой скилл авторы советуют вручную: эти CLI запускаются на вашей машине с предупреждениями в .claude/settings.json и работают с вашими карьерными данными, так что сначала стоит прочитать код, проверить отсутствие зависимостей и lifecycle-скриптов в package.json и прогнать тесты офлайн.
Шаблоны подключаются похожим способом: /add-template с расспросом про расширение исходника, команду компиляции, шрифты, правила стиля и жёсткий лимит страниц, после чего делает обязательный тестовый сбор и встраивает шаблон в /apply. Работает не только LaTeX — подойдёт Typst и любой тулчейн, умеющий собрать PDF из командной строки. Стоковые шаблоны — это moderncv в стиле banking для CV и собственный cover.cls на шрифтах Lato и Raleway для письма.
Ещё одна деталь, которой нет у большинства подобных систем: language gate. /setup собирает все языки, с которыми вы работаете, и ваш уровень — прямо из опроса либо из CV и выгрузки LinkedIn — в отдельную таблицу. Вакансия, требующая языка, которого у вас вообще нет, отбрасывается жёстко; вакансия, требующая более высокого уровня, чем заявленный, только помечается флагом и уходит на ваше усмотрение.
Приватность и безопасность
Форк публичного репозитория всегда публичный, а /setup пишет личные данные — имя, контакты, историю работы, зарплатные ожидания — в отслеживаемые файлы. Если репозиторий нужен для собственного поиска, а не для контрибьюторинга, автор советует завести приватный и добавить этот репозиторий как upstream; рецепт на пару минут лежит в разделе 8 SETUP.md, и все рабочие сценарии обновлений при этом сохраняются. Форкать стоит только ради контрибьюторинга.
Вакансии обрабатываются как недоверенный ввод: воркфлоу не следует инструкциям, вшитым в текст вакансии, и не переходит по ссылкам из её тела. Но защита тут уровня инструкций, а не песочницы, поэтому на незнакомом портале автор советует пролистать результат перед отправкой. Подробности — в SECURITY.md.
Обновления и обратная связь
Upstream движется быстро, и тянуть голый master вслепую автор не советует: форк обновляют до тега релиза — проверенной точки, описанной в CHANGELOG.md. tools/check_upstream_updates.py показывает, какие персонализированные файлы заденет обновление, до того как вы смержите, а tools/upstream_triage.py раскладывает пропущенные коммиты на «стоит смотреть» и «скорее всего пропустить». Начать с нуля можно командами /reset profile, /reset documents или /reset all — /reset сначала показывает, что именно будет удалено, и требует подтверждения вводом. Что попадает в репозиторий, а что остаётся в форках, описано в CONTRIBUTING.md, формат данных для сравнения зарплат — в README Salary Tool; если своих данных по зарплатам нет, шаг с бенчмарком просто пропускается.
Что в этом стоит забрать
Самая переносимая идея здесь — не «AI пишет сопроводительное письмо», а разделение труда между дравтером и ревьюером с чистым контекстом плюс обязательная проверка артефакта, а не исходника: PDF собирается, рендерится и читается агентом, ATS-проверяет текстовый слой, а урезание CV считается по релевантности, а не по дате. Именно этот слой контроля качества отличает фреймворк от промпта, который один раз прошёл и ушёл.