Guidance for any agent working in this repo. Also read PLAN.md, PRD.md, TODO.md if present —
local planning docs, gitignored (not in fresh clones).
A Claude Code plugin that assists job applications: extract the JD, score fit, fill the form via Playwright, and stop before Submit for the human. Not a standalone agent — Claude Code is the runtime; this repo is the skill/knowledge layer. (Phase 3 later adds a real daemon.)
AI understands; code + the browser execute. The LLM reads pages, fields, JD, matching, cover letters. Playwright does open/click/type/wait. Never make the LLM the hands.
.claude-plugin/plugin.json·marketplace.json— plugin + marketplace (dhm, hosted on GitHub).mcp.json— bundles Playwright MCP (@playwright/mcp)commands/— thin entry points (/dear-hiring-manager:onboard,:apply)skills/onboarding/SKILL.md— interview →profile.md, parse resume, seedanswers.mdskills/apply/SKILL.md— the assisted-apply procedure (the core logic)templates/—profile/answers/applicationstemplates (copied to user data dir)PLAN.md(phases) ·PRD.md(design + traceability) ·TODO.md(backlog) — local planning docs, gitignored (not shipped)
~/.dear-hiring-manager/: profile.md, answers.md (append-only Q&A "RAG"), applications.md
(tracker), resume.*. Flat Markdown — human-readable, no DB, no extra API keys.
- Never click Submit. Human owns the last click.
- Never solve/evade CAPTCHA. Hit one → stop, hand to human.
- Portal accounts (Workday/iCIMS/etc.): agent may auto-create/login with the profile email + a
unique generated password stored in the macOS Keychain (
securityCLI) — never a password in a file, never reused across portals. Email-verification + signup CAPTCHA/2FA → pause for the human. - Multi-page wizards: fill each page, click Next, stop only at the FINAL Submit.
- Never auto-attest unconfirmed legal answers (non-compete/felony/etc.). Blank in profile → flag, don't fill. Legal defaults are written only after explicit onboarding confirmation.
- Voluntary EEO blank → "prefer not to answer" (never flag, never block).
- Work authorization is per role country — answer for the role's country, not the profile's raw yes/no (NL+EU auth + US role → authorized No, sponsorship Yes).
- Fit score is the FIRST FILTER — below the profile's
Minimum fit score to apply(default 50) or hard-ineligible → stop before filling anything. - Fill or flag every required field — never leave one silently blank.
- answers.md is append-only — human edits win by being newer, never overwrite.
- Tracker status lifecycle:
in-progress(JD extracted) →skipped(gated) /filled(parked at Submit) →submitted.
- Skills reference bundled files via
${CLAUDE_PLUGIN_ROOT}/.... - Plugin commands are namespaced
/dear-hiring-manager:<command>. - Playwright MCP sandboxes file reads to the workspace root — stage
~/.dear-hiring-manager/resume.*into.playwright-mcp/(gitignored) before upload, then delete the staged copy. Keep the sandbox; do not use--allow-unrestricted-file-access. - After each tested increment: commit AND
git pushon the working branch (Conventional Commits). Work on a branch, notmaindirectly; merge tomainwhen Phase 1 is complete.
/plugin marketplace add extrasmall0/dear-hiring-manager→/plugin install dear-hiring-manager@dhm→ restart/dear-hiring-manager:onboard(profile exists → offers edit)/dear-hiring-manager:apply <real-job-url>→ drive Playwright, verify fill/flag/gate, stop before Submit