# Career Ops Job Search

Evaluates job offers, makes CVs, scans job portals and tracks applications.

- Repository: https://github.com/career-ops-hq/career-ops (79256 stars)
- Category: Business
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add career-ops-hq/career-ops --skill career-ops -g -a claude-code -y`
Codex: `npx skills add career-ops-hq/career-ops --skill career-ops -g -a codex -y`
Cursor: `npx skills add career-ops-hq/career-ops --skill career-ops -g -a cursor -y`
Gemini CLI: `npx skills add career-ops-hq/career-ops --skill career-ops -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add career-ops-hq/career-ops`

## Description

Open-source AI job search agent -- evaluate offers, generate CVs, scan portals, track applications. Use when the user pastes a job URL or JD, asks to scan portals, generate a CV/PDF, track applications, prepare for interviews, draft outreach/emails, or run any career-ops mode.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# career-ops: open-source AI job search agent

career-ops is a multi-CLI AI job search agent. The routing below is shared across supported agent CLIs even when the invocation surface differs.

## Project Root Resolution

Before reading any repo-relative path, derive `PROJECT_ROOT` from this loaded `SKILL.md`: start at the skill file's directory and walk upward until the nearest directory containing both `AGENTS.md` and `modes/`. This is required even when the checkout itself is nested (for example `Development\\career-ops`) or the command starts from a subdirectory. If those two sentinels cannot be found, career-ops itself is not installed next to this skill: follow **Skill installed without career-ops** below before reading or writing any file. Then derive `DATA_ROOT`, where the user's own files live, with the precedence `path-resolver.mjs` uses: `CAREER_OPS_ROOT` or `CAREER_OPS_DATA_DIR` if either is set; otherwise the path written in `PROJECT_ROOT/.career-ops-data` if that file exists and is not empty; otherwise `~/career-ops-data` when `PROJECT_ROOT` is a Claude Code plugin install copy (inside `~/.claude/plugins/cache/`, `marketplaces/` or `synced/`); otherwise `PROJECT_ROOT` itself. A relative value in either place resolves against `PROJECT_ROOT`. Run from `PROJECT_ROOT`, `node -e "import('./path-resolver.mjs').then(m => console.log(m.getCareerOpsRoot()))"` prints the same directory. In a checkout with no override, the two roots are one directory. A plugin install copy never shares its directory with `DATA_ROOT`.

The rest: https://github.com/career-ops-hq/career-ops/blob/HEAD/.agents/skills/career-ops/SKILL.md
