| name | career-ops |
| description | AI job search agent — find jobs, evaluate offers, generate CVs, track applications |
| user_invocable | true |
| args | mode |
| argument-hint | [search | run | setup | evaluate | pdf | tracker | deep] |
career-ops — Job Search Command Center
CRITICAL: When this skill is activated, you MUST immediately take action. Do NOT just say "search in progress" or "I will notify you." You must USE TOOLS NOW — read files, call GoogleSearch, fetch URLs. Every response must contain tool calls and concrete output.
If {{mode}} is empty or no arguments were provided:
IMMEDIATELY print this menu — do not ask anything, just show it:
╔══════════════════════════════════════════════════════════════╗
║ career-ops — Job Search Agent ║
╚══════════════════════════════════════════════════════════════╝
/career-ops setup → Set up profile (parse resume PDF + preferences)
/career-ops search → Search the internet for matching jobs
/career-ops run → Full pipeline: search → evaluate → save to Excel
/career-ops evaluate → Evaluate a specific job (paste URL or JD text)
/career-ops pdf → Generate ATS-optimized CV for a specific job
/career-ops tracker → View your Excel job tracker
/career-ops deep → Deep company research
/career-ops contacto → LinkedIn outreach: find contacts + draft message
Or just paste a job URL / JD text directly to auto-evaluate it.
⚠️ First time? Run: /career-ops setup
Then check if cv.md and config/profile.yml exist. If either is missing, add:
"It looks like you haven't set up your profile yet. Run /career-ops setup to get started."
Stop here. Wait for the user's next command.
If {{mode}} is "search" or "run":
YOU MUST EXECUTE ALL STEPS BELOW RIGHT NOW. Use tools at every step. Never stop to ask — just keep going through the entire pipeline.
STEP 1 — READ FILES (use ReadFile tool NOW)
Read ALL of these files immediately:
config/profile.yml
config/portals.yml
config/resume.yml
cv.md
If any file is missing, tell user to run /career-ops setup.
After reading, print:
━━━ career-ops search ━━━
Profile: {name} | {target_roles} | {location}
Skills: {top 5 skills from resume}
Portals: {preferred_portals from profile}
━━━━━━━━━━━━━━━
STEP 2 — GENERATE & EXECUTE BATCH 1 (3 site-targeted queries)
Generate 3 GoogleSearch queries. EVERY query MUST start with site:{portal_domain}.
Query formula:
site:{portal} {keyword} {optional: fresher | India | city}
GOOD queries (copy these patterns):
site:naukri.com AI ML engineer fresher
site:indeed.co.in data scientist India
site:instahyre.com machine learning engineer
site:linkedin.com/jobs deep learning India
BAD queries (NEVER use):
Junior AI ML Engineer Mumbai ← NO site: = 0 results
Data Scientist fresher India ← NO site: = 0 results
Print queries, then execute ONE AT A TIME:
Batch 1:
Q1: site:naukri.com AI ML engineer fresher → Naukri
Q2: site:indeed.co.in data scientist India → Indeed
Q3: site:linkedin.com/jobs ML engineer India → LinkedIn
Searching...
Q1: ✓ {N} results
Q2: ✓ {N} results
Q3: ✓ {N} results
STEP 3 — BATCH 2 (3 more, different portals/keywords)
Use portals NOT used in Batch 1. Use secondary keywords from profile.yml.
STEP 4 — DIRECT PORTAL FETCH (use web_fetch)
Fetch these URLs directly for additional listings:
https://www.naukri.com/ai-ml-engineer-jobs?experience=0-2
https://www.indeed.co.in/jobs?q=AI+ML+engineer&l=India
https://www.naukri.com/data-scientist-jobs?experience=0-2
Extract job listings (title, company, location, URL) from the fetched HTML.
STEP 5 — DEDUPLICATE & FILTER
- Merge all results from Batches 1+2 and direct fetches
- Deduplicate by URL
- Remove companies in
search_preferences.excluded_companies from profile.yml
- Print:
After dedup + filter: {N} unique jobs
STEP 6 — DEEP RESEARCH VIA SUBAGENTS
For the top 10 jobs, use subagents to do deep research. This is the key step.
For each job (up to 10), run TWO subagent calls:
6a. JD Research — call jd_researcher subagent
Only if you have a real, specific job URL (not a generic portal URL like "naukri.com"):
@jd_researcher Fetch the job posting at {job_url} and extract the JD details.
Write the result as JSON to data/research/jd-{n}.json
The subagent will fetch the URL, extract JD details, and write a JSON file.
If the job URL is generic (e.g., just "naukri.com" or "indeed.co.in"), skip this subagent and set jd_text to "JD not available — generic URL".
6b. Company Research — call company_researcher subagent
@company_researcher Research {company_name} for the role {role_title} in India.
Write the result as JSON to data/research/company-{n}.json
The subagent will search for company reviews, ratings, and salary data.
6c. Read results
After each subagent finishes, read the JSON files it produced:
data/research/jd-{n}.json → jd_text, experience_required, skills
data/research/company-{n}.json → company_rating, company_reviews, package_range
Print progress after each job:
Deep research (subagents):
[1/10] {Company} — {Role}
📋 JD: {first 60 chars of jd_text}...
⭐ Rating: {company_rating}
💰 Package: {package_range}
[2/10] {Company} — {Role}
...
IF subagents are not available (e.g., model doesn't support them), fall back to inline research:
- Use
google_web_search for "{company} reviews glassdoor India" and "{company} salary {role} India"
- Use
web_fetch on the job URL
STEP 7 — SCORE EACH JOB
Score each job 1-5 using all collected data:
| Dimension | Weight |
|---|
| Skills Match | 30% |
| Experience Fit | 25% |
| Role Alignment | 20% |
| Location/Remote Fit | 15% |
| Comp Fit | 10% |
Scoring:
1. {Company} — {Role}: {score}/5 ({reason}) [{portal}]
2. {Company} — {Role}: {score}/5 ({reason}) [{portal}]
STEP 8 — SAVE TO EXCEL
IMPORTANT: Do NOT pass JSON as a CLI argument. Write JSON to a file, then use --from.
Step 8a — Write JSON file at data/jobs-batch.json using WriteFile tool:
[{
"company": "Cisco",
"role": "Data Scientist",
"score": 4.2,
"portal": "LinkedIn",
"reliability": "B",
"url": "https://...",
"location": "Bangalore",
"salary": "Not disclosed",
"package_range": "12-18 LPA",
"experience_required": "0-2 years",
"status": "New",
"key_matches": "Python, ML, TensorFlow",
"gaps": "Requires SQL experience",
"jd_text": "Build ML models for network analytics... (full jd text)",
"company_rating": "4.2/5 (Glassdoor)",
"company_reviews": "Great engineering culture.",
"notes": ""
}]
Step 8b — Run:
node save-to-excel.mjs --from data/jobs-batch.json
Print final summary:
━━━ Results ━━━
Saved {N} jobs to data/job-tracker.xlsx
⭐ 4.0+ (apply): {N}
⚠️ 3.5-3.9 (maybe): {N}
❌ Below 3.5 (skip): {N}
Top matches:
1. [{score}] {Company} — {Role} | {package_range} | {company_rating}
2. [{score}] {Company} — {Role} | {package_range} | {company_rating}
━━━━━━━━━━━━━━━
RULES — CRITICAL
- EVERY GoogleSearch query MUST use
site: operator — bare queries return 0 results
- Max 6 GoogleSearch for job search (Batch 1 + Batch 2)
- Use subagents for deep research — jd_researcher and company_researcher
- Max 3 web_fetch calls for direct portal URLs
- NEVER say "in progress" or "I'll notify you" — execute NOW with tools
- Print progress after EVERY tool call
- NEVER pass JSON as CLI arg — write to file, use
--from
- NEVER fabricate data — only report what tools returned
- ALWAYS write JSON file before running save-to-excel — main agent writes data/jobs-batch.json using WriteFile
If {{mode}} matches another sub-command:
{{mode}} | Action |
|---|
setup | Read and follow modes/setup.md |
evaluate | Read modes/_shared.md + modes/_profile.md (if exists) + modes/oferta.md, then execute |
pdf | Read modes/_shared.md + modes/_profile.md (if exists) + modes/pdf.md, then execute |
tracker | Read modes/tracker.md, then execute |
deep | Read modes/deep.md, then execute |
contacto | Read modes/_shared.md + modes/_profile.md (if exists) + modes/contacto.md, then execute |
If {{mode}} is NOT a known sub-command:
Check if it looks like a JD or URL:
- If JD or URL → Read
modes/_shared.md + modes/auto-pipeline.md, then execute
- Otherwise → Show the menu and say "I didn't recognize that command."