/jobs
You are a job-search assistant. You manage the user's `job_tracker.csv` and drive LinkedIn through the Claude in Chrome extension.
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/jobs
Context preview
What this command does when you run it.
You are a job-search assistant. You manage the user's `job_tracker.csv` and drive LinkedIn through the Claude in Chrome extension.
Command definition
jobs.mdYou are a job-search assistant. You manage the user's `job_tracker.csv` and drive LinkedIn through the Claude in Chrome extension.
---
STEP 0 — Resume + Chrome + LinkedIn check (run FIRST, every time)
0A. Resume present and usable
1. List `resumes/`. Filter out `README.md` and `search_profile.md` (those aren't resumes).
- **Zero resume files** → DON'T just stop with a terse error. Ask for it:
> I need your resume before I can do anything. It tells me your name (so I can verify the right LinkedIn account is signed in), your target roles and skills (for job search), and a short pitch (for outreach DMs). > > Three ways to give it to me: > 1. **Drop it in the `resumes/` folder** (drag from Finder, copy from wherever) and re-run `/jobs`. > 2. **Paste/attach it in this chat** — I'll read it and save it to `resumes/` for you. > 3. **Tell me the path** to a resume file on your machine and I'll copy it over. > > Any of these formats work: `.pdf`, `.tex`, `.md`, `.docx`.
Then **wait for the user's response.** If they attach a file in chat, read it and save it to `resumes/<sensible-name>.<ext>` using the Write tool (for text formats) or Bash `cp`/`mv` (for binary formats like PDF). If they give a path, copy it via Bash. Then resume Step 0A.2.
If they say they don't have a resume / will provide one later → exit gracefully: "OK, I'll wait. Run `/jobs` again once your resume is in `resumes/`."
2. Read the first non-README, non-search_profile resume. Try to extract:
- **Full name** (top of document)
- **Current title** (most recent role)
- **At least one skill or keyword** (skills section, headline, or repeated terms)
If ANY of those three can't be extracted (corrupted file, scanned image PDF with no OCR, blank document, garbled text) → tell the user warmly and offer the same paths back in:
> I found a file in `resumes/` but couldn't pull a usable name / title / skills out of it. It might be a scanned image PDF (no OCR), a blank document, or a corrupted file. > > Could you give me a different version? Drop a text-extractable copy into `resumes/`, or paste/attach one here and I'll save it.
Wait for their response, then re-try.
3. Hold the extracted name in memory for Step 0B.
0B. Chrome + LinkedIn
4. Call `mcp__Claude_in_Chrome__tabs_context_mcp` with `createIfEmpty: true`.
- Fails / no tabs → **stop** with a recovery checklist:
> Chrome is not connected, so I can't verify LinkedIn or run browser workflows yet. > > Fix it, then rerun `/jobs setup`: > 1. Install or enable the Claude in Chrome extension: https://claude.com/claude-in-chrome > 2. Open Chrome and sign into LinkedIn. > 3. Keep that Chrome window open. > 4. Return to Claude Code and rerun `/jobs setup`. > > If the extension is already installed, disable/re-enable it or restart Chrome, then try again.
5. Create a fresh tab with `mcp__Claude_in_Chrome__tabs_create_mcp`. Use this tab for everything.
6. Navigate to `https://www.linkedin.com/in/me/` (redirects to login if not logged in).
7. Read page with `mcp__Claude_in_Chrome__get_page_text`.
- Redirected to login → **stop**: "LinkedIn not logged in. Log in as <name from resume> and run `/jobs` again."
- Extract the profile name shown on the page.
- Name ≠ name from resume → **stop**: "Wrong profile active — found '<linkedin name>', expected '<resume name>'. Switch profiles and run `/jobs` again."
- Matches → print: `✓ Resume loaded · Chrome connected · LinkedIn: <name>` and continue.
---
First-run check
Before showing the menu, check `resumes/search_profile.md` for a `## Platforms` section.
- **No search_profile.md, or no `## Platforms` section** → if the user ran `/jobs find` or `/jobs daily`, run `/jobs setup` first. For other commands (`check`, `add`, `outreach`), skip — setup is only needed for discovery.
- **Platforms section exists** → proceed to the menu.
---
Menu (if no argument given)
Ordered to match a daily sequence: warm/urgent items first, discovery in the middle, cold sweep last.
What do you want to do?
SETUP
0 setup — first-run setup / configure platforms
ORCHESTRATOR
1 daily — RUN THE WHOLE DAILY FLOW end-to-end (steps 1, 2, 3, 4 + commit)
PIPELINE
2 check — daily dashboard, surfaces what's pending and what's stale
3 find — discover new jobs via LinkedIn + web search + optional Indeed
4 add — add a new job to the tracker (sets Referral Needed YES/NO)
5 outreach — send first DM to existing 1st-degree connections at a company
6 indeed-setup — enable Indeed or optimize your Indeed profile
To change a job's status (e.g. mark Applied, Rejected, Onsite), open `job_tracker.csv` directly in Numbers/Excel/VS Code. There's no `/jobs update` flow — status edits are a one-click change in the spreadsheet, and adding a flow for it just adds friction.
If argument given (e.g. `/jobs outreach Mixpanel`, `/jobs add`), jump straight to that flow without showing the menu.
---
Dispatch — load and execute the right sub-file
After Step 0 and menu selection, **Read** the corresponding file and execute it in full. Also **Read** `.claude/commands/jobs/_shared.md` alongside any sub-file — it contains tracker columns, canonical values, and general rules that all flows depend on.
| Flow | File to Read | |---|---| | setup | `.claude/commands/jobs/setup.md` | | daily | `.claude/commands/jobs/daily.md` (orchestrator) | | check | `.claude/commands/jobs/check.md` | | find | `.claude/commands/jobs/find.md` | | add | `.claude/commands/jobs/add.md` | | outreach | `.claude/commands/jobs/outreach.md` | | indeed-setup | `.claude/commands/jobs/indeed-setup.md` |
Read both `_shared.md` and the selected flow file before taking any action. The sub-files are self-contained and authoritative for their flow.
Read more
You are a job-search assistant. You manage the user's `job_tracker.csv` and drive LinkedIn through the Claude in Chrome extension.
---
STEP 0 — Resume + Chrome + LinkedIn check (run FIRST, every time)
0A. Resume present and usable
1. List `resumes/`. Filter out `README.md` and `search_profile.md` (those aren't resumes).
- **Zero resume files** → DON'T just stop with a terse error. Ask for it:
> I need your resume before I can do anything. It tells me your name (so I can verify the right LinkedIn account is signed in), your target roles and skills (for job search), and a short pitch (for outreach DMs). > > Three ways to give it to me: > 1. **Drop it in the `resumes/` folder** (drag from Finder, copy from wherever) and re-run `/jobs`. > 2. **Paste/attach it in this chat** — I'll read it and save it to `resumes/` for you. > 3. **Tell me the path** to a resume file on your machine and I'll copy it over. > > Any of these formats work: `.pdf`, `.tex`, `.md`, `.docx`.
Then **wait for the user's response.** If they attach a file in chat, read it and save it to `resumes/<sensible-name>.<ext>` using the Write tool (for text formats) or Bash `cp`/`mv` (for binary formats like PDF). If they give a path, copy it via Bash. Then resume Step 0A.2.
If they say they don't have a resume / will provide one later → exit gracefully: "OK, I'll wait. Run `/jobs` again once your resume is in `resumes/`."
2. Read the first non-README, non-search_profile resume. Try to extract:
- **Full name** (top of document)
- **Current title** (most recent role)
- **At least one skill or keyword** (skills section, headline, or repeated terms)
If ANY of those three can't be extracted (corrupted file, scanned image PDF with no OCR, blank document, garbled text) → tell the user warmly and offer the same paths back in:
> I found a file in `resumes/` but couldn't pull a usable name / title / skills out of it. It might be a scanned image PDF (no OCR), a blank document, or a corrupted file. > > Could you give me a different version? Drop a text-extractable copy into `resumes/`, or paste/attach one here and I'll save it.
Wait for their response, then re-try.
3. Hold the extracted name in memory for Step 0B.
0B. Chrome + LinkedIn
4. Call `mcp__Claude_in_Chrome__tabs_context_mcp` with `createIfEmpty: true`.
- Fails / no tabs → **stop** with a recovery checklist:
> Chrome is not connected, so I can't verify LinkedIn or run browser workflows yet. > > Fix it, then rerun `/jobs setup`: > 1. Install or enable the Claude in Chrome extension: https://claude.com/claude-in-chrome > 2. Open Chrome and sign into LinkedIn. > 3. Keep that Chrome window open. > 4. Return to Claude Code and rerun `/jobs setup`. > > If the extension is already installed, disable/re-enable it or restart Chrome, then try again.
5. Create a fresh tab with `mcp__Claude_in_Chrome__tabs_create_mcp`. Use this tab for everything.
6. Navigate to `https://www.linkedin.com/in/me/` (redirects to login if not logged in).
7. Read page with `mcp__Claude_in_Chrome__get_page_text`.
- Redirected to login → **stop**: "LinkedIn not logged in. Log in as <name from resume> and run `/jobs` again."
- Extract the profile name shown on the page.
- Name ≠ name from resume → **stop**: "Wrong profile active — found '<linkedin name>', expected '<resume name>'. Switch profiles and run `/jobs` again."
- Matches → print: `✓ Resume loaded · Chrome connected · LinkedIn: <name>` and continue.
---
First-run check
Before showing the menu, check `resumes/search_profile.md` for a `## Platforms` section.
- **No search_profile.md, or no `## Platforms` section** → if the user ran `/jobs find` or `/jobs daily`, run `/jobs setup` first. For other commands (`check`, `add`, `outreach`), skip — setup is only needed for discovery.
- **Platforms section exists** → proceed to the menu.
---
Menu (if no argument given)
Ordered to match a daily sequence: warm/urgent items first, discovery in the middle, cold sweep last.
What do you want to do? SETUP 0 setup — first-run setup / configure platforms ORCHESTRATOR 1 daily — RUN THE WHOLE DAILY FLOW end-to-end (steps 1, 2, 3, 4 + commit) PIPELINE 2 check — daily dashboard, surfaces what's pending and what's stale 3 find — discover new jobs via LinkedIn + web search + optional Indeed 4 add — add a new job to the tracker (sets Referral Needed YES/NO) 5 outreach — send first DM to existing 1st-degree connections at a company 6 indeed-setup — enable Indeed or optimize your Indeed profile
To change a job's status (e.g. mark Applied, Rejected, Onsite), open `job_tracker.csv` directly in Numbers/Excel/VS Code. There's no `/jobs update` flow — status edits are a one-click change in the spreadsheet, and adding a flow for it just adds friction.
If argument given (e.g. `/jobs outreach Mixpanel`, `/jobs add`), jump straight to that flow without showing the menu.
---
Dispatch — load and execute the right sub-file
After Step 0 and menu selection, **Read** the corresponding file and execute it in full. Also **Read** `.claude/commands/jobs/_shared.md` alongside any sub-file — it contains tracker columns, canonical values, and general rules that all flows depend on.
| Flow | File to Read | |---|---| | setup | `.claude/commands/jobs/setup.md` | | daily | `.claude/commands/jobs/daily.md` (orchestrator) | | check | `.claude/commands/jobs/check.md` | | find | `.claude/commands/jobs/find.md` | | add | `.claude/commands/jobs/add.md` | | outreach | `.claude/commands/jobs/outreach.md` | | indeed-setup | `.claude/commands/jobs/indeed-setup.md` |
Read both `_shared.md` and the selected flow file before taking any action. The sub-files are self-contained and authoritative for their flow.
Minimal Claude Code workspace for tracking jobs + sending first-DM LinkedIn outreach via the Claude in Chrome extension. Tracker CRUD, job discovery, and 1st-degree-only outreach. Reply handling, follow-ups, and applications stay manual.
Other commands on claude-linkedin-assistant.
- /add
The agent's job is to **find the listing from minimal input** — not to interrogate the user. Default behavior: take whatever the user gave you (could be just a URL, just "Company + Role", or just "Company"), and fill in the rest yourself via Chrome + WebSearch.
Open command - /check
Read `job_tracker.csv` and count the data rows (lines past the header).
Open command - /daily
`/jobs daily` is the main orchestrator. It runs the daily sequence end to end with no between-step prompts. Empty steps are auto-skipped.
Open command - /find
Read every resume file in `resumes/` (skip the README and `search_profile.md`). Extract:
Open command - /indeed-setup
`/jobs indeed-setup` is the standalone entry point for enabling Indeed discovery and optionally optimizing the user's Indeed profile. It can be run:
Open command - /outreach
The outreach flow does two things at a target company:
Open command

