Career-Ops -- AI Job Search Pipeline
Based on santifer/career-ops. Extended with hh.ru, LinkedIn, and Russian market support.
Что понадобится
| Нужно |
Платно? |
Без этого |
~/career-ops/config/profile.yml — твой профиль (кто ты, какие роли, вилка) |
— |
навык не запустится: все оценки считаются относительно ТВОИХ целей |
~/career-ops/cv.md — твоё резюме |
— |
не будет Block B (CV match) и PDF |
| hh.ru API |
бесплатно, без ключа |
нет российского рынка |
| LinkedIn cookies в браузере |
бесплатно |
scan linkedin и contact деградируют до WebSearch |
Adzuna app_id + app_key — https://developer.adzuna.com |
free tier 250 запросов/день |
нет scan adzuna (16 стран) |
Gmail OAuth (~/.claude/tools/gmail_search.py) |
бесплатно |
нет track — статусы заявок обновляешь руками |
Node + npm i puppeteer |
бесплатно |
нет генерации PDF |
Всё личное живёт вне навыка — в ~/career-ops/. Сам навык твоих данных не хранит,
поэтому его можно обновлять поверх, не боясь потерять резюме.
Commands
| Command |
What it does |
/career-ops |
Show this help |
/career-ops evaluate <url-or-text> |
Full A-F evaluation + report + PDF + tracker |
/career-ops scan |
Scan all enabled portals in parallel (10 сканеров, включаются в portals.yml) |
/career-ops scan hh |
hh.ru (Russia + CIS, API) |
/career-ops scan linkedin |
LinkedIn (global, cookies required) |
/career-ops scan remoteok |
RemoteOK (JSON API, global remote) |
/career-ops scan wwr |
We Work Remotely (RSS, global remote) |
/career-ops scan wellfound |
Wellfound / AngelList (startups, AI-first) |
/career-ops scan yc |
YC Work at a Startup (YC companies) |
/career-ops scan aijobs |
ai-jobs.net (pure AI/ML focus) |
/career-ops scan adzuna |
Adzuna API (16 countries incl. BR+RU, free tier) |
/career-ops scan hiringcafe |
Hiring Cafe (remote-first) |
/career-ops scan startupjobs |
startup.jobs (EU startups) |
/career-ops track |
Gmail auto-update статусов заявок (interview/rejected/offer) |
/career-ops pipeline |
Process pending URLs from pipeline.md |
/career-ops batch |
Batch process multiple offers |
/career-ops pdf <company> |
Generate ATS-optimized PDF for a specific offer |
/career-ops apply |
Live form-filling assistant (Playwright) |
/career-ops contact <company> |
LinkedIn/hh.ru outreach message generation |
/career-ops compare |
Side-by-side comparison of 2+ offers (modes/ofertas.md) |
/career-ops analyze-skills |
Частотный анализ требований по роли — какими словами её ищут |
/career-ops deep <company> |
Deep company research |
/career-ops tracker |
Show application status overview |
/career-ops training <url> |
Evaluate a course/certification |
/career-ops project <url> |
Evaluate a portfolio project idea |
/career-ops interview <company> |
Interview prep with STAR stories |
/career-ops setup |
Initial onboarding (CV, profile, portals) |
Working Directory
All career-ops data lives in: ~/career-ops/
~/career-ops/
cv.md # Canonical CV (source of truth)
article-digest.md # Proof points and case studies
portals.yml # Portal scanner config (hh.ru + LinkedIn + global)
config/
profile.yml # Candidate identity, targets, salary
data/
applications.md # Application tracker
pipeline.md # Inbox of pending URLs
scan-history.tsv # Scanner dedup history
reports/ # Evaluation reports
output/ # Generated PDFs (gitignored)
jds/ # Saved job descriptions
interview-prep/
story-bank.md # STAR+R stories across evaluations
batch/
tracker-additions/ # TSV files for merge
First Run
If ~/career-ops/ doesn't exist or is missing key files, enter onboarding —
пошагово он расписан в modes/setup.md, начинай оттуда (там же готовые cp для
примеров конфигов и разбор, какой из двух portals.example.yml брать). Коротко:
- Create directory structure
- Ask for CV (paste, LinkedIn URL, or dictate)
- Fill
config/profile.yml (name, targets, salary, location) — из config/profile.example.yml
- Configure
portals.yml — из config/portals.example.yml (не из templates/, см. modes/setup.md)
- Create empty tracker
- Get to know the user for better evaluations
Portal Strategy (3 tiers)
Tier 1: hh.ru (Russian market)
API-based scanning via hh.ru public API:
GET https://api.hh.ru/vacancies?text={query}&area={area_id}&salary={min}&only_with_salary=true
- Area IDs: 1 (Moscow), 2 (SPb), 113 (Russia), 1001 (Remote)
- Filters: experience, schedule (remote/flexible), salary
- Returns JSON with structured data (title, company, salary, requirements)
Playwright scanning for full JD extraction:
- Navigate to
hh.ru/vacancy/{id} for complete description
- Extract: requirements, responsibilities, conditions, skills, salary
hh.ru specific fields in profile.yml (значения — твои, из config/profile.yml):
hh:
area_ids: [113, 1001] # Russia + Remote
experience: "moreThan6" # noExperience, between1And3, between3And6, moreThan6
schedule: ["remote", "flexible"]
search_queries: # 3-5 формулировок ТВОЕЙ роли, как её пишут в вакансиях
- "<твоя роль>"
- "<синоним роли>"
- "<роль на уровень выше — для стретч-вакансий>"
salary_from: <нижняя граница вилки> # в валюте ниже
currency: "RUR"
only_with_salary: false
Формулировки берутся не из головы: прогони /career-ops analyze-skills, он соберёт
частотный словарь требований по твоей роли с hh.ru и покажет, какими словами её ищут.
Tier 2: LinkedIn (Global + Russia)
Scanning strategy:
- WebSearch with
site:linkedin.com/jobs + role keywords
- Playwright for authenticated browsing (if logged in)
- LinkedIn skill
linkedin for profile enrichment and outreach
LinkedIn-specific features:
- Generate connection request messages (300 char limit)
- Find hiring managers and recruiters
- Profile optimization suggestions per JD
- Easy Apply form assistance
Tier 3: Global ATS (Ashby, Greenhouse, Lever, Wellfound, Workable)
Same as original career-ops. See modes/scan.md for details.
Evaluation Pipeline (Blocks A-F)
When user pastes a JD or URL:
- Extract JD (Playwright > WebFetch > WebSearch > ask user)
- Block A -- Role Summary (archetype, domain, function, seniority, remote, TL;DR)
- Block B -- CV Match (requirements vs cv.md, gap analysis with mitigation)
- Block C -- Level & Strategy (detected vs natural level, up/down-level plan)
- Block D -- Comp & Demand (WebSearch for salary data, market trends)
- Block E -- Personalization Plan (CV changes, LinkedIn changes)
- Block F -- Interview Plan (6-10 STAR+R stories mapped to JD requirements)
- Block G -- Draft Application Answers (if score >= 4.0)
- Save report to
reports/
- Generate PDF (ATS-optimized, keyword-injected)
- Update tracker
Language Rules
- JD in English -> evaluation in English, CV in English
- JD in Russian -> evaluation in Russian, CV in Russian (separate template)
- hh.ru -> always Russian evaluation, but English CV option if company is international
- LinkedIn -> follow JD language
- Code and technical terms: always English
Scoring
Score 1-5 based on:
- Role-archetype match (weight: 30%)
- Technical requirements match (weight: 25%)
- Seniority alignment (weight: 15%)
- Comp vs target (weight: 15%)
- Remote/location fit (weight: 10%)
- Growth potential (weight: 5%)
| Score |
Recommendation |
| 4.5-5.0 |
Strong match -- auto-generate draft answers |
| 4.0-4.4 |
Good match -- recommend applying |
| 3.5-3.9 |
Decent -- apply if strategic reasons |
| 3.0-3.4 |
Weak -- probably skip |
| < 3.0 |
Skip -- don't waste time |
PDF Generation
Uses generate-pdf.mjs (Puppeteer HTML->PDF):
node ~/.claude/skills/career-ops/generate-pdf.mjs input.html output.pdf --format=a4
Fonts: Space Grotesk (headings) + DM Sans (body). Single-column ATS layout.
Ethical Rules
- NEVER submit without user review -- fill forms, draft answers, generate PDFs, but STOP before Submit
- Discourage low-fit applications (score < 3.5)
- Quality over quantity -- 5 targeted > 50 generic
- NEVER invent experience or metrics
- NEVER modify cv.md without explicit permission
Integration with Existing Skills
| Need |
Use |
| LinkedIn research |
Skill linkedin (ScrapeCreators) |
| Company research |
Skill account-research |
| Deep web research |
Command /deep-research (Perplexity) / Skill last30days |
| Interview prep video |
Skill heygen (avatar practice) |
| Outreach emails |
Skill draft-outreach |
| Telegram job channels |
python ~/.claude/tools/tg_client.py search "<запрос>" |
Этот навык — про твоё трудоустройство: ты кандидат. Обратная задача (искать
кандидатов, читать чужие резюме) в пак не входит — там чужие персональные данные.
Files Reference
| File |
Purpose |
modes/_shared.md |
Shared context, archetypes, scoring |
modes/oferta.md |
Full A-F evaluation |
modes/scan.md |
Portal scanner |
modes/apply.md |
Live form-filling |
modes/contacto.md |
LinkedIn outreach |
modes/pdf.md |
PDF generation |
modes/auto-pipeline.md |
Auto-detect and run full pipeline |
modes/batch.md |
Batch processing |
modes/pipeline.md |
Process pending URLs |
modes/deep.md |
Company deep research |
modes/tracker.md |
Tracker management |
modes/ofertas.md |
Compare multiple offers |
modes/training.md |
Evaluate courses |
modes/project.md |
Evaluate portfolio projects |
modes/analyze-skills.md |
Частотный анализ требований по роли (что писать в CV) |
modes/interview.md |
Interview prep, STAR+R story bank |
modes/setup.md |
Первый запуск: создать ~/career-ops/, CV, профиль, порталы |
templates/cv-template.html |
HTML CV template |
templates/portals.example.yml |
Portal config example |
templates/states.yml |
Canonical application states |
1---2name: career-ops3description: Поиск работы: скан hh.ru/LinkedIn/ATS, резюме под вакансию, оценка офферов, подготовка к собесу. Триггеры: «вакансии». НЕ поиск кандидатов → headhunter.4---56# Career-Ops -- AI Job Search Pipeline78> Based on [santifer/career-ops](https://github.com/santifer/career-ops). Extended with hh.ru, LinkedIn, and Russian market support.910## Что понадобится1112| Нужно | Платно? | Без этого |13|---|---|---|14| `~/career-ops/config/profile.yml` — твой профиль (кто ты, какие роли, вилка) | — | навык не запустится: все оценки считаются относительно ТВОИХ целей |15| `~/career-ops/cv.md` — твоё резюме | — | не будет Block B (CV match) и PDF |16| hh.ru API | бесплатно, без ключа | нет российского рынка |17| LinkedIn cookies в браузере | бесплатно | `scan linkedin` и `contact` деградируют до WebSearch |18| Adzuna `app_id` + `app_key` — https://developer.adzuna.com | free tier 250 запросов/день | нет `scan adzuna` (16 стран) |19| Gmail OAuth (`~/.claude/tools/gmail_search.py`) | бесплатно | нет `track` — статусы заявок обновляешь руками |20| Node + `npm i puppeteer` | бесплатно | нет генерации PDF |2122Всё личное живёт **вне навыка** — в `~/career-ops/`. Сам навык твоих данных не хранит,23поэтому его можно обновлять поверх, не боясь потерять резюме.2425## Commands2627| Command | What it does |28|---------|-------------|29| `/career-ops` | Show this help |30| `/career-ops evaluate <url-or-text>` | Full A-F evaluation + report + PDF + tracker |31| `/career-ops scan` | Scan all enabled portals in parallel (10 сканеров, включаются в `portals.yml`) |32| `/career-ops scan hh` | hh.ru (Russia + CIS, API) |33| `/career-ops scan linkedin` | LinkedIn (global, cookies required) |34| `/career-ops scan remoteok` | RemoteOK (JSON API, global remote) |35| `/career-ops scan wwr` | We Work Remotely (RSS, global remote) |36| `/career-ops scan wellfound` | Wellfound / AngelList (startups, AI-first) |37| `/career-ops scan yc` | YC Work at a Startup (YC companies) |38| `/career-ops scan aijobs` | ai-jobs.net (pure AI/ML focus) |39| `/career-ops scan adzuna` | Adzuna API (16 countries incl. BR+RU, free tier) |40| `/career-ops scan hiringcafe` | Hiring Cafe (remote-first) |41| `/career-ops scan startupjobs` | startup.jobs (EU startups) |42| `/career-ops track` | Gmail auto-update статусов заявок (interview/rejected/offer) |43| `/career-ops pipeline` | Process pending URLs from pipeline.md |44| `/career-ops batch` | Batch process multiple offers |45| `/career-ops pdf <company>` | Generate ATS-optimized PDF for a specific offer |46| `/career-ops apply` | Live form-filling assistant (Playwright) |47| `/career-ops contact <company>` | LinkedIn/hh.ru outreach message generation |48| `/career-ops compare` | Side-by-side comparison of 2+ offers (`modes/ofertas.md`) |49| `/career-ops analyze-skills` | Частотный анализ требований по роли — какими словами её ищут |50| `/career-ops deep <company>` | Deep company research |51| `/career-ops tracker` | Show application status overview |52| `/career-ops training <url>` | Evaluate a course/certification |53| `/career-ops project <url>` | Evaluate a portfolio project idea |54| `/career-ops interview <company>` | Interview prep with STAR stories |55| `/career-ops setup` | Initial onboarding (CV, profile, portals) |5657## Working Directory5859All career-ops data lives in: `~/career-ops/`6061```62~/career-ops/63 cv.md # Canonical CV (source of truth)64 article-digest.md # Proof points and case studies65 portals.yml # Portal scanner config (hh.ru + LinkedIn + global)66 config/67 profile.yml # Candidate identity, targets, salary68 data/69 applications.md # Application tracker70 pipeline.md # Inbox of pending URLs71 scan-history.tsv # Scanner dedup history72 reports/ # Evaluation reports73 output/ # Generated PDFs (gitignored)74 jds/ # Saved job descriptions75 interview-prep/76 story-bank.md # STAR+R stories across evaluations77 batch/78 tracker-additions/ # TSV files for merge79```8081## First Run8283If `~/career-ops/` doesn't exist or is missing key files, enter onboarding —84**пошагово он расписан в `modes/setup.md`, начинай оттуда** (там же готовые `cp` для85примеров конфигов и разбор, какой из двух `portals.example.yml` брать). Коротко:86871. Create directory structure882. Ask for CV (paste, LinkedIn URL, or dictate)893. Fill `config/profile.yml` (name, targets, salary, location) — из `config/profile.example.yml`904. Configure `portals.yml` — из `config/portals.example.yml` (не из `templates/`, см. `modes/setup.md`)915. Create empty tracker926. Get to know the user for better evaluations9394## Portal Strategy (3 tiers)9596### Tier 1: hh.ru (Russian market)9798**API-based scanning** via hh.ru public API:99- `GET https://api.hh.ru/vacancies?text={query}&area={area_id}&salary={min}&only_with_salary=true`100- Area IDs: 1 (Moscow), 2 (SPb), 113 (Russia), 1001 (Remote)101- Filters: experience, schedule (remote/flexible), salary102- Returns JSON with structured data (title, company, salary, requirements)103104**Playwright scanning** for full JD extraction:105- Navigate to `hh.ru/vacancy/{id}` for complete description106- Extract: requirements, responsibilities, conditions, skills, salary107108**hh.ru specific fields in profile.yml** (значения — твои, из `config/profile.yml`):109```yaml110hh:111 area_ids: [113, 1001] # Russia + Remote112 experience: "moreThan6" # noExperience, between1And3, between3And6, moreThan6113 schedule: ["remote", "flexible"]114 search_queries: # 3-5 формулировок ТВОЕЙ роли, как её пишут в вакансиях115 - "<твоя роль>"116 - "<синоним роли>"117 - "<роль на уровень выше — для стретч-вакансий>"118 salary_from: <нижняя граница вилки> # в валюте ниже119 currency: "RUR"120 only_with_salary: false121```122123> Формулировки берутся не из головы: прогони `/career-ops analyze-skills`, он соберёт124> частотный словарь требований по твоей роли с hh.ru и покажет, какими словами её ищут.125126### Tier 2: LinkedIn (Global + Russia)127128**Scanning strategy:**1291. WebSearch with `site:linkedin.com/jobs` + role keywords1302. Playwright for authenticated browsing (if logged in)1313. LinkedIn skill `linkedin` for profile enrichment and outreach132133**LinkedIn-specific features:**134- Generate connection request messages (300 char limit)135- Find hiring managers and recruiters136- Profile optimization suggestions per JD137- Easy Apply form assistance138139### Tier 3: Global ATS (Ashby, Greenhouse, Lever, Wellfound, Workable)140141Same as original career-ops. See `modes/scan.md` for details.142143## Evaluation Pipeline (Blocks A-F)144145When user pastes a JD or URL:1461471. **Extract JD** (Playwright > WebFetch > WebSearch > ask user)1482. **Block A** -- Role Summary (archetype, domain, function, seniority, remote, TL;DR)1493. **Block B** -- CV Match (requirements vs cv.md, gap analysis with mitigation)1504. **Block C** -- Level & Strategy (detected vs natural level, up/down-level plan)1515. **Block D** -- Comp & Demand (WebSearch for salary data, market trends)1526. **Block E** -- Personalization Plan (CV changes, LinkedIn changes)1537. **Block F** -- Interview Plan (6-10 STAR+R stories mapped to JD requirements)1548. **Block G** -- Draft Application Answers (if score >= 4.0)1559. **Save report** to `reports/`15610. **Generate PDF** (ATS-optimized, keyword-injected)15711. **Update tracker**158159## Language Rules160161- **JD in English** -> evaluation in English, CV in English162- **JD in Russian** -> evaluation in Russian, CV in Russian (separate template)163- **hh.ru** -> always Russian evaluation, but English CV option if company is international164- **LinkedIn** -> follow JD language165- Code and technical terms: always English166167## Scoring168169Score 1-5 based on:170- Role-archetype match (weight: 30%)171- Technical requirements match (weight: 25%)172- Seniority alignment (weight: 15%)173- Comp vs target (weight: 15%)174- Remote/location fit (weight: 10%)175- Growth potential (weight: 5%)176177| Score | Recommendation |178|-------|---------------|179| 4.5-5.0 | Strong match -- auto-generate draft answers |180| 4.0-4.4 | Good match -- recommend applying |181| 3.5-3.9 | Decent -- apply if strategic reasons |182| 3.0-3.4 | Weak -- probably skip |183| < 3.0 | Skip -- don't waste time |184185## PDF Generation186187Uses `generate-pdf.mjs` (Puppeteer HTML->PDF):188```bash189node ~/.claude/skills/career-ops/generate-pdf.mjs input.html output.pdf --format=a4190```191192Fonts: Space Grotesk (headings) + DM Sans (body). Single-column ATS layout.193194## Ethical Rules195196- **NEVER submit without user review** -- fill forms, draft answers, generate PDFs, but STOP before Submit197- **Discourage low-fit applications** (score < 3.5)198- **Quality over quantity** -- 5 targeted > 50 generic199- **NEVER invent experience or metrics**200- **NEVER modify cv.md without explicit permission**201202## Integration with Existing Skills203204| Need | Use |205|------|-----|206| LinkedIn research | Skill `linkedin` (ScrapeCreators) |207| Company research | Skill `account-research` |208| Deep web research | Command `/deep-research` (Perplexity) / Skill `last30days` |209| Interview prep video | Skill `heygen` (avatar practice) |210| Outreach emails | Skill `draft-outreach` |211| Telegram job channels | `python ~/.claude/tools/tg_client.py search "<запрос>"` |212213> Этот навык — про **твоё** трудоустройство: ты кандидат. Обратная задача (искать214> кандидатов, читать чужие резюме) в пак не входит — там чужие персональные данные.215216## Files Reference217218| File | Purpose |219|------|---------|220| `modes/_shared.md` | Shared context, archetypes, scoring |221| `modes/oferta.md` | Full A-F evaluation |222| `modes/scan.md` | Portal scanner |223| `modes/apply.md` | Live form-filling |224| `modes/contacto.md` | LinkedIn outreach |225| `modes/pdf.md` | PDF generation |226| `modes/auto-pipeline.md` | Auto-detect and run full pipeline |227| `modes/batch.md` | Batch processing |228| `modes/pipeline.md` | Process pending URLs |229| `modes/deep.md` | Company deep research |230| `modes/tracker.md` | Tracker management |231| `modes/ofertas.md` | Compare multiple offers |232| `modes/training.md` | Evaluate courses |233| `modes/project.md` | Evaluate portfolio projects |234| `modes/analyze-skills.md` | Частотный анализ требований по роли (что писать в CV) |235| `modes/interview.md` | Interview prep, STAR+R story bank |236| `modes/setup.md` | Первый запуск: создать `~/career-ops/`, CV, профиль, порталы |237| `templates/cv-template.html` | HTML CV template |238| `templates/portals.example.yml` | Portal config example |239| `templates/states.yml` | Canonical application states |