job-agent-skills

extensionmaintained

Job-search workflow for coding agents, North American edition: ten skills (fit analysis, resume + cover letter files, form filling, pipeline tracking, interview drills, open-source contribution, project deep-dives) plus jobs-mcp for scanning Greenhouse /

by — · v0.1.0 · published 1w ago

$ pi install npm:job-agent-skills
downloads/mo
168
stars
2
last push
1w ago
open issues
0

Signals

license: MITtestspi manifest: missinginstall size: —deps: 0peer deps: 0

Download trend

No downloads in the last 12 weeks.

README

job-agent-skills

CI

A job-search workflow for coding agents, built for the US and Canadian market. Ten skills for Claude Code and pi (and any agent that reads SKILL.md) plus jobs-mcp, an MCP server that scans Greenhouse, Lever, Ashby and LinkedIn for new postings.

It is built around one rule: every line that goes out traces to a fact you wrote down. The agent tailors, formats, fills forms, tracks, and drills you for interviews — it never invents a title, a number, or an ownership claim.

What you get

Apply track

SkillDoes
/career-initScaffolds your private career/ workspace and interviews you for facts.md and answers.yaml.
/job-matchJD → requirement–evidence matrix, hard constraints (work authorization, location, years, band), APPLY / SKIP.
/great-resumePositioning, summary, bullet rewrites, LinkedIn note / cold email / referral ask.
/make-resumeOne-page Letter resume + cover letter for one role, exported to PDF with a one-page gate.
/job-applyFills the application in your browser from answers.yaml, stops before Submit (or not — your policy), records it.
/offerPipeline in tracker.md; mailbox triage; daily scan of your target boards via jobs-mcp.
/interviewPredict → grill (one question at a time, scoring contracts) → review → retry. NA round structure.

Build track

SkillDoes
/contributorFinds real, unclaimed issues in maintained repos, prepares a verified diff, and only after per-item confirmation forks / pushes / opens the PR.
/project-guideTurns a repo into a lesson-by-lesson course, or your project into guide- + interview- files (pillar bullets, 15–25 questions, STAR answers).
/evidence-recapTurns an AI coding session into a nine-part evidence chain; confirmed facts flow into facts.md.

jobs-mcp — list_board_jobs, get_job, linkedin_search, scan. No API keys; these are the public endpoints the career pages use.

Evals (evals/) — 21 claude plugin eval cases, two per skill, that check the behaviours that matter (facts never invented, stage never inflated, nothing submitted without confirmation) against a no-plugin baseline. See evals/README.md.

Tracker web app (web/) — a kanban over the same career/tracker.md the skills write, plus a scan page that runs jobs-mcp against targets.yaml. Next.js + FastAPI + Postgres, docker compose up. See web/README.md.

Install

As a Claude Code plugin

claude plugin marketplace add comedianhhh/job-agent-skills
claude plugin install job-agent-skills

jobs-mcp starts through uvx (install uv if you do not have it).

As a pi package

pi install git:github.com/comedianhhh/job-agent-skills

Skills load as /skill:job-match, /skill:offer, … (or the model picks them up on its own). pi has no MCP support by design, so the bundled extension (extensions/jobs-mcp.ts) starts jobs-mcp over stdio at session start and registers its four tools natively — list_board_jobs, get_job, linkedin_search, scan. It needs uv on PATH; set JOBS_MCP_COMMAND=jobs-mcp to use a pip install -e mcp/jobs-mcp install instead. If the server cannot start, pi shows a warning and the skills still load.

Manual

Copy skills/* into .claude/skills/ of any project (or ~/.claude/skills/), and add jobs-mcp to your MCP config:

{ "mcpServers": { "jobs-mcp": { "command": "uvx", "args": ["--from", "/path/to/job-agent-skills/mcp/jobs-mcp", "jobs-mcp"] } } }

or pip install -e mcp/jobs-mcp and use "command": "jobs-mcp".

Quick start

/career-init                       # creates career/, walks you through facts.md and answers.yaml
/job-match <paste a JD or link>    # worth applying? what are the gaps?
/make-resume                       # tailor + export PDFs for that role
/job-apply <application URL>       # fill the form from your standing answers
/offer                             # record it; later: "scan for new jobs"
/interview grill                   # when a screen lands

Typical day: /offer scan in the morning → /job-match on anything promising → /make-resume → /job-apply → /offer. Evenings: /contributor or a project, then /evidence-recap so the work becomes resume evidence.

Tracker web app

cp .env.example .env    # TRACKER_TOKEN + CAREER_DIR
docker compose up -d    # http://localhost:3000 — paste the token once

Drag a card between columns and the status cell of that one row in tracker.md changes — nothing else in the file is touched. "Scan now" calls jobs-mcp with your targets.yaml, marks postings already in the tracker, appends the rest to career/SCAN-<date>.md (the same table /offer writes), and "track" turns a posting into a DRAFT row for /job-match to pick up. Postgres only holds what markdown shouldn't: status-change history (for the 10-business-day follow-up flag) and scan history. Details and the no-Docker dev setup are in web/README.md.

The career/ workspace

Private. Keep it out of public repos (.gitignore here already excludes it).

FilePurpose
facts.mdSingle source of truth. TODO: marks what you have not confirmed; those never go out.
blocks.mdFinished bullets — resumes are assembled, not rewritten.
stories.mdSTAR stories by question type, [fact] vs [draft — confirm].
rules.mdYour resume standard.
answers.yamlStanding form answers and your submit policy.
targets.yamlBoards and filters for scanning.
tracker.mdThe pipeline.
application/Template for each role folder: resume, letter, JD analysis, interview prep.

See templates/career/README.md.

Design notes

  • Facts before prose. job-match refuses to score on keywords; great-resume refuses to add facts; interview treats the resume as claims to be defended.
  • External writes are confirmed. Submitting an application, opening a PR, sending a message — each is shown and confirmed unless your answers.yaml policy says otherwise.
  • NA specifics. Letter paper, one page, no photo or personal-data block; hard constraints are work authorization / sponsorship / location / years / band; pipeline is APPLIED → SCREEN → OA → TECH → ONSITE → OFFER; outreach is LinkedIn notes and cold email, not chat openers.
  • No agent framework. Skills are Markdown; the MCP server is ~300 lines of Python on httpx.
  • One skill set, two hosts. The same skills/ load as a Claude Code plugin and as a pi package; the pi extension (~100 lines, @modelcontextprotocol/sdk) is the only host-specific code. npm run check type-checks it, npm run test:pi loads it against a fake ExtensionAPI and round-trips a scan call.

License

MIT — see LICENSE.