career-ops

Installation
SKILL.md

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.

Resolve every path in this router against one of these two roots, never against the process's current working directory. User Layer paths resolve against DATA_ROOT. They include cv.md, article-digest.md, portals.yml, config/ (except the shipped *.example.* files), data/, reports/, output/, interview-prep/, modes/_profile.md, modes/_custom.md, modes/_brief.md, batch/tracker-additions/, and every other User Layer path in DATA_CONTRACT.md. Everything else (the other modes/ files, scripts, templates, the config/*.example.* files) resolves against PROJECT_ROOT.

Skill installed without career-ops

A skills catalog, or the career-ops plugin from a plugin directory (Claude or OpenAI), installs only this SKILL.md. The modes, scripts and AGENTS.md it routes to live in the career-ops repository, so no mode can run until career-ops is installed. Never improvise a mode from this file alone: an evaluation without the repo's modes and the user's CV is not a career-ops evaluation.

  1. Look for an existing install before offering a new one: the directory in CAREER_OPS_ROOT if it is set, then ./career-ops, then ~/career-ops. The first one that contains both AGENTS.md and modes/ is PROJECT_ROOT; tell the user which one you are using, read PROJECT_ROOT/AGENTS.md in full, and continue with their request.
  2. If there is none, tell the user in a few lines that career-ops runs from its own folder, and offer to set it up with npx @santifer/career-ops@1.38.0 init. It needs Node.js, downloads the latest release from https://github.com/career-ops-hq/career-ops into ./career-ops and installs its dependencies. Ask before running it: it downloads and installs software.
  3. With a yes, run it from the current directory (or the folder the user picks). Then treat the new career-ops folder as PROJECT_ROOT: read its AGENTS.md in full, run every script from it, and pick up the user's original request (a pasted job URL or JD included). If their CV and profile are not there yet, the first-run setup in AGENTS.md comes first: it walks them through it by chatting. Tell them that next time they can open their AI CLI inside that folder.
  4. If they prefer to install it themselves, give the one command (npx @santifer/career-ops@1.38.0 init, then cd career-ops and open the AI CLI there) and, for Claude Code, the plugin alternative: /plugin marketplace add career-ops-hq/career-ops then /plugin install career-ops@career-ops. Then stop.
Installs
940
GitHub Stars
79.6K
First Seen
Apr 6, 2026