# Dependencies node_modules/ bun.lock # Python __pycache__/ *.pyc *.pyo .venv/ venv/ # Compiled documents *.pdf *.aux *.log *.out *.synctex.gz *.fls *.fdb_latexmk # Personal data (never commit these) salary_data.json # Match at any depth: the job-scraper skill resolves `job_scraper/` relative to # its own directory, so these land at .claude/skills/job-scraper/job_scraper/*. # A rooted `job_scraper/...` pattern silently fails to match them. **/job_scraper/seen_jobs.json **/job_scraper/notion_sync.json **/job_scraper/*.md *_BehavioralReport.pdf linkedin_Profile.pdf # Secrets. A portal skill generated by /add-portal may need an API token for a # fetching service; the .env holding it must never be committed. .env .env.* # Personal photos and signatures *.jpg *.jpeg *.png !cover_letters/OpenFonts/fonts/** # OS files .DS_Store Thumbs.db # Editor .vscode/ .idea/ # Memory files (Claude Code user-specific) .claude/projects/ # Skills lock (auto-generated) skills-lock.json # Personal application output files (generated by /apply — do not share) # Extension-agnostic on the ignore side: a custom template registered via # /add-template (e.g. Typst) writes main__.typ instead of # .tex, and it must be ignored just as reliably as the stock LaTeX output. # The negations stay .tex-only - the stock example files are always LaTeX, # and a wildcard negation (!cv/main_example.*) would also re-include build # artifacts like main_example.pdf/.aux. cv/main_*.* !cv/main_example.tex cv/*.txt cover_letters/cover_*.* cover_letters/Cover_*.* !cover_letters/cover_example.tex # documents/ subfolder contents are personal — only README and folder structure are tracked documents/cv/** documents/linkedin/** documents/diplomas/** documents/references/** # Also where /interview saves its prep packs (interview_prep_.md): these # name the employers applied to, quote what was submitted, and set out the # candidate's weak points. documents/applications/** documents/postings/** # Belt-and-braces, not the primary guard: nothing writes here. Prep packs land # in documents/applications/_/, covered above. Kept because # tools/security_guards.py pins it in REQUIRED_IGNORE_RULES. documents/interview/** !documents/**/.gitkeep # Personal job search tracking job_search_tracker.csv # Gmail sync state (message IDs, subjects - personal data) gmail_sync/ # Generated reports (personal output from /html-report) reports/ # Upskill reports (personal output). Depth-independent like the job_scraper # rules above: the upskill skill resolves `upskill/` relative to its own # directory, so a report can land at .claude/skills/upskill/upskill/*.md # where the rooted rule cannot see it. `**/upskill/*.md` is not usable here - # the skill directory shares the `upskill` name, so it would also ignore the # skill's own SKILL.md - hence the report-file prefix is pinned instead. upskill/*.md **/upskill/report-*.md # Company research cache (/apply Step 3, /interview Step 2 - personal search # history). Referenced from commands, not a skill, so it resolves against the # repo root normally - a plain rooted pattern is correct here, unlike the # **/-prefixed job_scraper/upskill rules above. company_research/*.json # Agent skills: track the source, ignore only deps and logs. # (A blanket `.agents/` ignore silently drops the job-search CLI skills from the repo.) .agents/**/node_modules/ .agents/**/*.log .agents/usage/ # Brainstorm mockups (superpowers visual companion) - never ship .superpowers/