career-ops -- Router

SkillAI & models

career-ops is a skill that turns an AI agent into a job-search assistant. It runs many modes: evaluating a pasted job description or URL, generating CVs and cover letters as PDF or LaTeX, scanning portals for matches, tracking application status, and running interview practice. You trigger it by pasting a job posting or asking for a mode by name, and it reads and writes files in its own project folder to keep records.

Then ask your AI: use the career-ops -- Router skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Have the career-ops checkout available with its AGENTS.md and modes folder present.

What your AI can do with it

  • Evaluate a pasted job description or URL
  • Generate CVs and cover letters as PDF or LaTeX
  • Scan portals for job matches
  • Track application status
  • Run interview practice and prep
  • Draft outreach and emails

Getting started

  1. Have the career-ops checkout available with its AGENTS.md and modes folder present.
  2. Add or configure the skill so your agent can discover it.
  3. Paste a job posting or URL, or ask for a mode by name to trigger it.
  4. Let the skill read and write files in its project folder to keep records.

What this skill tells your AI

The instructions your AI receives, as published by santifer/career-ops in .grok/skills/career-ops/SKILL.md and read by Ahel’s review.

career-ops is a multi-CLI job-search command center. 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/. Resolve every path in this router (modes/, config/, data/, scripts, templates, and output paths) against PROJECT_ROOT, never against the process's current working directory. 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, stop and locate the career-ops checkout before reading or writing files.

Invocation Notes

  • CLIs with slash-command registration can expose this router as /career-ops.
  • In Cursor, this skill lives at .cursor/skills/career-ops/ and is auto-discovered; ask for a mode by name, or paste a JD/URL to trigger auto-pipeline.
  • In Pi, this skill is auto-discovered from .agents/skills/career-ops/ and exposed as /skill:career-ops; AGENTS.md loads from the repo root as project context, so there is no wrapper file. Headless Pi workers use pi -p "prompt". Project skill discovery follows Pi's per-folder trust decision: /trust applies to future Pi processes, so restart pi before invoking /skill:career-ops (-a trusts a single run and needs no restart).
  • Interactive Codex sessions use codex in the repo root. Slash commands are not guaranteed in Codex, so ask Codex to run the same mode by name if /career-ops is unavailable.
  • Headless Codex workers use codex exec "prompt".
  • The routing semantics below stay the same regardless of whether the entrypoint is a slash command or a natural-language prompt.

Codex prompt examples that map to the same router semantics:

Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123
Run the career-ops scan mode and summarize new matches.
Run the career-ops pipeline mode for data/pipeline.md.
Run the career-ops pdf mode for the latest evaluated role.
Run the career-ops tracker mode and summarize the current statuses.

Mode Routing

Determine the mode from $mode:

InputMode
(empty / no args)discovery -- Show command menu
JD text or URL (no sub-command)auto-pipeline
ofertaoferta
ofertasofertas
contactocontacto
deepdeep
interview-prepinterview-prep
interviewinterview
master-profilemaster-profile
eu-sweregional/eu-swe
interview/planinterview/plan
interview/practiceinterview/practice
interview/debriefinterview/debrief
pdfpdf
texttext
latexlatex
latex-texlatex-tex
emailemail
addadd
expandexpand
trainingtraining
projectproject
trackertracker
agent-inboxagent-inbox
inboxagent-inbox
pipelinepipeline
applyapply
scanscan
discoverdiscover
batchbatch
patternspatterns
offer-prepoffer-prep
titlestitles
upskillupskill
followupfollowup
reply-watchreply-watch
outcomeoutcome
interview-redflaginterview-redflag
updateupdate
covercover

Auto-pipeline detection: If $mode is not a known sub-command AND contains JD text (keywords: "responsibilities", "requirements", "qualifications", "about the role", "we're looking for", company name + role) or a URL to a JD, execute auto-pipeline.

If $mode is not a sub-command AND doesn't look like a JD, show discovery.


Output Language Directive

Before executing any mode, read config/profile.yml if it exists and resolve:

  • language.output → ISO language code for human-facing output. Default: en.
  • language.modes_dir → optional market-mode directory. This controls market vocabulary and local evaluation rules only. It may be a single string (one declared market, the historical default) or a list of declared candidate markets for a candidate genuinely running parallel campaigns in more than one market at once (#3793), e.g. modes_dir: [modes/de, modes/zh]. When a list is given, the FIRST entry is primary and supplies the evaluation-mode file (Block A-F rules can only run from one market's file at a time); EVERY declared market's _shared.md is loaded into context. modes itself is a valid declared candidate for markets without a localized directory; when first it supplies modes/oferta.md, and its baseline modes/_shared.md is loaded once. Per posting, judge which declared market actually applies from the JD's own MARKET signals (hiring-entity jurisdiction, currency, benefits/legal vocabulary) — never from the JD's language alone. If genuinely ambiguous, an interactive session asks and stops before persistence; an unattended worker uses the primary market and records that fallback in the report header or Block G.

Inject this directive after loading the mode instructions and before producing any user-visible content:

Write all human-facing output in {language.output} regardless of the language of these instructions or of the job description. This includes reports, tracker notes, PDFs, cover letters, outreach, interview prep, form answers, and summaries. If language.modes_dir supplies market-specific vocabulary (one market, or several declared at once), keep the market logic but explain terms in {language.output} when needed.

language.output is authoritative for prose. modes_dir is market context; it must not force the prose language.


Discovery Mode (no arguments)

If your CLI supports /career-ops, show this menu. In Codex, surface the same options in plain text and map the requested mode the same way.

Concrete equivalents for Codex prompt-driven sessions:

/career-ops {JD}           ↔ "Evaluate this JD with career-ops auto-pipeline: {JD or URL}"
/career-ops scan           ↔ "Run the career-ops scan mode and summarize new matches."
/career-ops pipeline       ↔ "Run the career-ops pipeline mode for data/pipeline.md."
/career-ops pdf            ↔ "Run the career-ops pdf mode for the latest evaluated role."
/career-ops email          ↔ "Run the career-ops email mode for the latest evaluated role."
/career-ops tracker        ↔ "Run the career-ops tracker mode and summarize the current statuses."

Show this menu:

career-ops -- Command Center

Available commands:
  /career-ops {JD}      → AUTO-PIPELINE: evaluate + report + PDF + tracker (paste text or URL)
  /career-ops pipeline  → Process pending URLs from inbox (data/pipeline.md)
  /career-ops oferta    → Evaluation only A-F (no auto PDF)
  /career-ops ofertas   → Compare and rank multiple offers
  /career-ops contacto  → LinkedIn power move: find contacts + draft message
  /career-ops deep      → Deep research prompt about company
  /career-ops interview-prep → Generate company-specific interview prep doc
  /career-ops interview    → Interactive profile/CV onboarding interview
  /career-ops master-profile → Import, review, and validate your Master Career Profile
  /career-ops eu-swe    → Calibrate a European SWE application before CV/apply/interview
  /career-ops interview/plan → Time-blocked prep plan for an upcoming interview
  /career-ops interview/practice → Practice interview, one question at a time with feedback
  /career-ops interview/debrief → Post-interview debrief: close gaps, predict next round
  /career-ops pdf       → PDF only, ATS-optimized CV
  /career-ops text      → Tailored markdown CV (mirrors cv.md, no PDF)
  /career-ops latex     → Export CV as LaTeX/Overleaf .tex
  /career-ops latex-tex → Tailor your own resume.tex in place (opt-in; cv.md stays default)
  /career-ops cover     → Cover letter: standalone JD paste or /career-ops cover {slug}
  /career-ops email     → Formal application email draft (draft-only; never sends, submits, or clicks)
  /career-ops add       → Add a project/paper/role to your CV (fetch + preview + confirm)
  /career-ops expand    → Auto-discover and add missing competencies from profile links
  /career-ops training  → Evaluate course/cert against North Star
  /career-ops project   → Evaluate portfolio project idea
  /career-ops tracker   → Application status overview
  /career-ops agent-inbox → Queue/drain requests for the next session (data/agent-inbox.md)
  /career-ops apply     → Live application assistant (reads form + generates answers)
  /career-ops scan      → Scan portals and discover new offers
  /career-ops discover  → Resolve a company list to scannable ATS boards + append to portals.yml (zero-token)
  /career-ops batch     → Batch processing with parallel workers
  /career-ops patterns  → Analyze rejection patterns and improve targeting
  /career-ops offer-prep → Read a received offer/contract with the candidate: clause walk + lawyer questions (not legal advice)
  /career-ops titles    → Suggest adjacent job titles from your CV to broaden the search
  /career-ops upskill   → Aggregate skill-gap analysis from your evaluated reports
  /career-ops followup  → Follow-up cadence tracker: flag overdue, generate drafts
  /career-ops outcome   → Record application outcome & archive artifacts
  /career-ops update    → Update career-ops system files with diff preview + compat check

Inbox: add URLs to data/pipeline.md → /career-ops pipeline
Or paste a JD directly to run the full pipeline.

Context Loading by Mode

After determining the mode, load the necessary files before executing:

If modes/_custom.md exists, read it after modes/_profile.md and before the selected mode file. It contains user house rules and procedural preferences. It may override workflow/style defaults, but it never adds factual claims about the candidate.

Resolve language.modes_dir before applying the path shorthand below. With no setting, use modes. With a scalar directory, preserve the existing behavior: use that directory's _shared.md and localized mode file when it provides one. With a list, load every declared directory's _shared.md exactly once (including the baseline modes/_shared.md when modes appears), but use only the FIRST entry's evaluation-mode file for Blocks A-F; later entries contribute context, never a competing evaluation file. User-layer _profile.md and _custom.md remain under modes/.

Modes that require _shared.md + their mode file

Read the resolved shared context (default modes/_shared.md) + modes/_profile.md (if exists) + modes/_custom.md (if exists) + the resolved selected mode file (default modes/{mode}.md). For an A-F evaluation, that selected file is the primary directory's evaluation mode; do not also load an evaluation file from a secondary directory.

Applies to: auto-pipeline, oferta, ofertas, pdf, text, contacto, apply, pipeline, scan, batch

Standalone modes with profile and custom context

Read modes/_profile.md (if exists) + modes/_custom.md (if exists) + modes/{mode}.md

Applies to: tracker, agent-inbox, deep, interview-prep, interview, master-profile, regional/eu-swe, interview/plan, interview/practice, interview/debrief, latex, latex-tex, training, project, patterns, titles, upskill, followup, reply-watch, outcome, cover, email, add, offer-prep, discover

Modes delegated to subagent

For scan, apply (with Playwright), and pipeline (3+ URLs): launch as a worker/subagent with the resolved shared context + _profile.md (if exists) + _custom.md (if exists) + the resolved selected mode file injected into the worker prompt. If your CLI exposes an Agent(...) primitive, the call looks like this:

Agent(
  subagent_type="general-purpose",
  prompt="[output language directive]\n\n[content of modes/_shared.md, or resolved shared context: every declared _shared.md once]\n\n[content of modes/_profile.md if exists]\n\n[content of modes/_custom.md if exists]\n\n[content of modes/{mode}.md, or resolved selected mode file; primary evaluation file for Blocks A-F]\n\n[invocation-specific data]",
  description="career-ops {mode}"
)

Execute the instructions from the loaded mode file.

Signals

GitHub stars
74k
Forks
14k
Last commit
Oct 2026
Hacker News mentions
2

Questions

What is career ops claude skill?
It is a skill that turns an agent into a job-search assistant. It evaluates job posts, generates CVs and cover letters, scans portals, tracks applications, and runs interview practice, keeping records in its own project folder.
How do I trigger it?
Paste a job posting or URL, or ask for a mode by name. Modes include scan, pdf, latex, cover, tracker, and interview-prep.
Where does it keep my records?
It reads and writes files in its own project folder, resolved from the skill file location rather than the current working directory.
Can it generate a CV as a PDF?
Yes. It can generate CVs and cover letters as PDF or LaTeX.
Does it track applications?
Yes. It can track application status and keep records in its project folder.
Advanced
Item type
skill
Key
career-ops-santifer
Source
github.com/santifer/career-ops