Career Ops

career-ops-hq/career-ops/.agents/skills/career-ops

by career-ops-hqd9c7868690470acb5caaa11bea4fb8d0ce73bb21MIT73K starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated today

AI job search command center -- 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.

AI-generated overview

Job-search command center that routes requests to modes for evaluating offers, generating CVs, scanning portals and tracking applications.

What it does
This skill acts as a router for a multi-mode job-search command center. It maps a requested mode or a pasted job description or URL to one of many workflows, such as offer evaluation, CV and cover-letter generation, ATS checks, portal scanning, application tracking, interview preparation and outreach drafting. It also defines which context files to load per mode and how to delegate certain modes to subagents.
When to use it
Use it when a user pastes a job URL or job description, or asks to scan job portals, generate a CV or PDF, track applications, prepare for interviews, or draft application emails. It is intended as the entry point for any career-ops mode.
Requirements
Instructions only; no scripts are shipped. It expects a career-ops checkout containing AGENTS.md and a modes/ directory, plus optional config/profile.yml and data files such as data/pipeline.md. Some modes reference subagents, Playwright and external job portals.

career-ops -- Router

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:

text
Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123Run 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
intakeintake
eu-sweregional/eu-swe
interview/planinterview/plan
interview/practiceinterview/practice
interview/debriefinterview/debrief
pdfpdf
atsats
texttext
latexlatex
latex-texlatex-tex
emailemail
addadd
expandexpand
trainingtraining
projectproject
trackertracker
agent-inboxagent-inbox
inboxagent-inbox
pipelinepipeline
applyapply
scanscan
discoverdiscover
triagetriage
batchbatch
patternspatterns
calibratecalibrate
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:

text
/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 intake    → Build or enrich your profile from documents/ (master CV, LinkedIn export; nothing written without confirm)  /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 ats       → ATS-friendliness check of a generated CV (score + fixable issues)  /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 triage    → Fast first-pass go/no-go score from modes/_brief.md (writes no files)  /career-ops batch     → Batch processing with parallel workers  /career-ops patterns  → Analyze rejection patterns and improve targeting  /career-ops calibrate → Check whether evaluation scores predict your real outcomes (advisory only)  /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 pipelineOr 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, intake, ats, calibrate

Modes that load only their mode file

Read modes/{mode}.md only. Do not preload _shared.md, _profile.md or _custom.md: the mode file names the one context file it reads and the ones it must not. Values it takes from config/profile.yml (language.output, pipeline.triage_threshold) are resolved here and injected; the mode never reads that file itself.

Applies to: triage

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:

python
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.

Source and attribution

Source:career-ops-hq/career-opsin.agents/skills/career-opsat commitd9c7868

License: MIT

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal