AI Job Search — агентный фреймворк для отклика на вакансии

· 2 мин чтения
claude-code agent-skills workflow automation productivity
📂 Исходный код на GitHub

Фреймворк для отклика на вакансии на базе Claude Code: оценка вакансий, адаптация CV, сопроводительные письма и подготовка к интервью

AI Job Search — агентный фреймворк для отклика на вакансии

Поиск работы — это процесс, который отлично ложится на агентный пайплайн: собрать вакансии, отсеять нерелевантные, оценить соответствие, сгенерировать документы под конкретную позицию и подготовиться к интервью. 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 (на свежих сборках MiKTeX pdflatex падает на 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

  1. Разбор вакансии по URL или из текста.
  2. Оценка соответствия профилю: навыки, опыт, культура, локация, карьерная траектория.
  3. Черновик адаптированных CV и сопроводительного письма в LaTeX.
  4. Спавн отдельного агента-ревьюера со свежим контекстом: изучает компанию и критикует черновики.
  5. Ревизия по замечаниям ревьюера.
  6. Компиляция и визуальная проверка PDF: агент читает отрендеренные страницы и итерирует LaTeX, пока CV не станет ровно двумя страницами без висящих заголовков, а письмо — одной страницей с видимой подписью.
  7. ATS-проверка: текстовый слой PDF извлекается и читается так, как его увидит парсер, — контакты должны быть literal-текстом, порядок чтения — осмысленным, покрытие ключевых слов — посчитанным. Ключевые слова, которых нет в профиле, добавляются только если профиль их правда поддерживает; настоящие пробелы остаются видимыми.
  8. Финальный вывод с чек-листом проверки.

Отдельная деталь, которой нет у большинства генераторов резюме: 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 считается по релевантности, а не по дате. Именно этот слой контроля качества отличает фреймворк от промпта, который один раз прошёл и ушёл.

Источник: https://github.com/MadsLorentzen/ai-job-search