# 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_<company>_<role>.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/**
documents/applications/**
documents/postings/**
# Interview prep and experience records: these name the employers applied to,
# quote what was submitted, and set out the candidate's weak points.
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/
