# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
env/
.venv/

# Node
node_modules/
.next/
out/
npm-debug.log*
.source/
# Next.js incremental type-check cache — regenerated on every `tsc` run,
# churns on every branch, adds noise to diffs. Keep out of the tree.
frontend/tsconfig.tsbuildinfo
*.tsbuildinfo

# Playwright / test artifacts (browser traces, screenshots, runs)
.playwright-mcp/
**/test-results/
**/playwright-report/

# Environment
.env
.env.local
.env.prod
secrets.txt

# Skills / local agent files
.agents/
# Skills stay ignored EXCEPT the three that define the owner's posting voice:
# backend/app/services/social_voices.py reads them at runtime from a bind
# mount (/data/skills), so they must reach prod via `git pull`. Git cannot
# re-include a child of an ignored DIRECTORY, hence the `/*` form.
.claude/skills/*
!.claude/skills/post/
!.claude/skills/telegram-update-post/
!.claude/skills/twitter-algorithm-optimizer/
.claude/settings.local.json
skills-lock.json
backend/skills-lock.json

# Windows artifacts
nul
backend/nul

# Local files
SALES_PITCH.md
video/

# IDE
.vscode/
.idea/
*.swp
*.swo

# Database
*.db
*.sqlite

# OS
.DS_Store
Thumbs.db

# Docker
*.log

# Scratch that a `git add -A` would otherwise sweep into a commit.
# opps.json is a 3.5 MB aggregator dump; the stackdump is a Git-Bash crash
# artifact; graphify-out/ is a regenerable AST index (`graphify update .`).
opps.json
*.stackdump
graphify-out/
