From job-hunt-toolkit
Use when the user asks to "prepare to send", "final check", "ready to send", "pre-send checklist", "is this ready", "is this clean", "can I attach this", "run the checklist", "verify the CV", or "check before sending". Runs the complete pre-send audit — filename sanity, HTML↔PDF parity, metadata scrub, visible content scan, sensitive file presence, content correctness, final sanity — and fails loudly on any issue. Nothing ships with warnings.
How this skill is triggered — by the user, by Claude, or both
Slash command
/job-hunt-toolkit:prepare-to-send [pdf-file] (optional; defaults to most recently modified CV PDF in current company folder)[pdf-file] (optional; defaults to most recently modified CV PDF in current company folder)This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
The last gate before a PDF goes out. This skill drives the checklist section-by-section, delegates metadata scrubbing to `scrub-pdf-metadata`, collects results, and refuses to declare "ready" unless every gate passes.
The last gate before a PDF goes out. This skill drives the checklist section-by-section, delegates metadata scrubbing to scrub-pdf-metadata, collects results, and refuses to declare "ready" unless every gate passes.
export-pdf and before the user hits "send"$1): the PDF to audit. Resolution order:
$1 is passed → use it directly.company.md (i.e. CWD is a per-company folder) → pick the *_CV.pdf in CWD; if multiple, take the one with the most recent mtime..pdf → .html on the same stem in the same directory.Derive the workspace root from the environment:
workspace="${JOB_HUNT_WORKSPACE:-$HOME/Documents/job_seeking}"
Use ls -1 "$workspace" to enumerate company folders when needed (e.g. cross-company leak checks).
Hard-require exiftool up front. Do NOT degrade; a partial audit is worse than no audit because it creates false confidence.
command -v exiftool >/dev/null 2>&1 || { echo "ERROR: exiftool not installed (brew install exiftool)"; exit 1; }
If missing, stop immediately. Do not run any section.
Run each section top to bottom and record PASS/FAIL. ANY fail = stop, report the failing section, do not proceed to the next. Do not issue warnings — everything is either pass or fail.
Validate the PDF filename against ${PLUGIN_ROOT}/references/naming-rules.md.
Checklist:
<First>_<Last>_<Role>_<DocType>.pdf|, commas, slashes, emojis, or non-ASCII characters in the filename (hyphens are allowed).pdf exactlyChecklist:
if [[ "$(stat -f%m "$html")" -gt "$(stat -f%m "$pdf")" ]]; then
echo 'FAIL: HTML edited after PDF exported. Re-run $job-hunt-toolkit:export-pdf.'
exit 1
fi
Invoke the scrub-pdf-metadata skill on the PDF; do not inline exiftool commands here.
If the skill cannot be invoked as a skill, fall back to the exact commands from ${PLUGIN_ROOT}/skills/scrub-pdf-metadata/references/exiftool-commands.md under "One-liner: scrub + set + verify" — never improvise.
After scrub, verify with:
exiftool -Title -Author -Producer -Creator -CreatorTool -CreateDate -Keywords -Subject "$pdf"
Checklist:
Title = "CV" (generic)Author = clean legal nameProducer / Creator empty or "exiftool" onlyKeywords emptySubject emptyFail if Title ≠ "CV", if Keywords or Subject are non-empty, or if any field contains a path or another company name.
Use the Read tool on the PDF to extract its text. Scan the extracted content for:
TODO, FIXME, XXX, [placeholder], {{, <role>draft, v1, v2, v3, final as standalone markers/Users/, /home/, C:\, file://Cross-company leak check:
current_company="$(basename "$(dirname "$pdf")")"
other_companies="$(ls -1 "$workspace" 2>/dev/null | grep -v "^${current_company}$" | grep -v '^\.' || true)"
Fail on ANY hit for another company name in the PDF text.
@page CSS path leak: Some HTML templates embed source paths in headers/footers via @page CSS. When scanning PDF text, also look for file:, /Users/, /home/, or the workspace basename from $(basename "${JOB_HUNT_WORKSPACE:-$HOME/Documents/job_seeking}"). Any match means the @page rule leaked the build path into the rendered output.
Rasterized PDF check: After reading the PDF, verify extracted text is at least 200 characters long (configurable via JOB_HUNT_MIN_PDF_TEXT_CHARS). If it fails, report: "FAIL: PDF text extraction yielded fewer than $min_chars chars. Likely rasterized. Re-export."
Checklist:
TODO, FIXME, XXX, [placeholder], {{)grep -oE '<!--[^>]*-->' "$html" || true
Block HTML comments that reference another company; commented-out prior-application bullets are high-risk because some PDF indexers parse comments.
Checklist:
<!-- ... --> comments referencing other companiesCheck for sensitive files in the workspace that should not travel with the application.
Checklist:
.env, *.key, id_rsa, *.local.md, secrets.*, or salary_notes.md in the application folder (unless user has explicitly confirmed their presence is intentional)find "$(dirname "$pdf")" -maxdepth 2 \( \
-name '.env' -o -name '*.key' -o -name 'id_rsa' \
-o -name '*.local.md' -o -name 'secrets.*' -o -name 'salary_notes.md' \
\) 2>/dev/null
If any are found, stop and report them. Do not proceed.
Use the Read tool on the PDF and verify:
Reuse Section 4a's JOB_HUNT_MIN_PDF_TEXT_CHARS threshold; if it passed there, record PASS here.
The assistant must read both the PDF text and accompanying company.md / job_description.*, then verify:
Also read the master HTML. Any discrepancy = fail with a specific line-level finding.
Verify the per-company file exists and has been updated beyond template defaults.
company_md="$(dirname "$pdf")/company.md"
[[ -f "$company_md" ]] || { echo "FAIL: company.md missing in application folder."; exit 1; }
Checklist:
company.md exists in the application folderstatus field reflects current reality (valid values: drafting | applied | screening | interview | offer | signed | rejected | withdrew)If status is still drafting, surface it as informational so the user can update it after sending; do not fail.
Ask the user to confirm these judgment calls via AskUserQuestion; they are not automated gates.
Only print the full summary if all automated sections pass:
Pre-send audit: <pdf-filename>
[PASS] Filename sanity
[PASS] HTML/PDF pair in sync
[PASS] Metadata scrubbed (Title=CV, Author=<clean name>)
[PASS] Visible content — 0 leaks
[PASS] Sensitive file presence
[PASS] PDF rendering (<chars> text chars)
[PASS] Content correctness (name / dates / companies / no hallucinations)
[PASS] company.md present
Judgment-call gates (confirm with user):
- Alternate renderer preview OK?
- First-bullet fit signal strong?
- 6-second scan surfaces best angle?
Ready to send.
Attach: <absolute-path-to-pdf>
If any automated section fails, print ONLY the failing section's diagnostic and stop. Do not continue.
scrub-pdf-metadata in Section 3. Never skip even if the user says they "just scrubbed" — HTML edits invalidate prior scrubs.scrub-pdf-metadata and its references. If you need to fall back, use EXACT commands from exiftool-commands.md — never improvise.npx claudepluginhub alex-kopylov/zweihander --plugin job-hunt-toolkitGuides reception of code review feedback: verify before implementing, avoid performative agreement, push back with technical reasoning when needed.
Design banners for social media, ads, website heroes, and print with multiple art direction options and AI-generated visuals.