# FabledRulebook-required (agent-authored specs/plans live local only)
docs/superpowers/specs/
docs/superpowers/plans/

# Secrets and environment
.env
.env.*
!.env.example
*.secret
*.key
*.pem

# Python
__pycache__/
*.py[cod]
*$py.class
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
.coverage.*
htmlcov/
.tox/
*.egg-info/
build/
dist/
venv/
.venv/

# Node / Vue / Vite
frontend/node_modules/
frontend/dist/
frontend/.vite/
frontend/coverage/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log

# Firefox extension build artifacts (lands in FC-3)
extension/*.xpi
extension/web-ext-artifacts/

# Runtime volumes (must never be tracked) — anchored to repo root so they
# don't accidentally match Python package dirs like backend/app/models/
/images/
/import/
/downloads/
/models/
/postgres_data/
/redis_data/

# IDE / OS
.vscode/
.idea/
*.swp
*.swo
.DS_Store
Thumbs.db

# Claude Code per-user local overrides (shared .claude/settings.json is OK to commit)
.claude/settings.local.json
# Transient scheduler lock/state (committed by accident in 3f30327)
.claude/scheduled_tasks.lock
.claude/scheduled_tasks*.json

# Alembic / DB scratch
alembic/versions/__pycache__/
*.sqlite
*.sqlite-journal
.superpowers/

# Raw platform captures (milestone 387 C0 and successors). These are real
# authenticated API responses taken from the operator's own account, so they
# carry account data — creator lists, pledge amounts, and (in Patreon's case)
# the account email inside the `card` resources. They are kept locally because
# re-capturing means re-authenticating by hand, and they are the ground truth a
# characterization gets re-checked against.
#
# The whole directory is ignored, not one filename, so a future capture is
# covered by this rule instead of needing a new line somebody has to remember.
#
# SANITIZED fixtures derived from these DO belong in git — put them somewhere
# else (tests/fixtures/, not here), with the account data stripped.
# Ignore the CONTENTS, not the directory: git does not descend into an
# excluded directory, so a negation for a file inside one never takes effect.
# Writing it this way lets README.md be committed while everything else here
# stays out.
tests/fixtures/captures/*
!tests/fixtures/captures/README.md
