# Python virtual environment
venv/
__pycache__/
*.pyc

# Python build artifacts (from `pip install -e .` or `python -m build`)
*.egg-info/
build/
dist/

# IDE
.idea/
.vscode/
*.swp

# Logs
*.log

# OS
.DS_Store
sessions/

# Runtime worktrees
.painapple-code-worktrees/

# Review metadata (per-project, not committed)
.code-meta/

# Test results
test-results/

# Node.js (root package.json is for claude CLI only, not committed)
node_modules/
package.json
package-lock.json

# But tools/ has its own tracked package.json & lockfile
!tools/package.json
!tools/package-lock.json

# And tauri-app/ has its own tracked package.json & lockfile (native app shell)
!tauri-app/package.json
!tauri-app/package-lock.json

# Secrets / local data
.env*
*.duckdb

# Stray screenshot dumps
screenshots/

# Internal agent / personal infra (not for public)
.claude/
CLAUDE.md
deploy.fish
start-server.sh
TODO.md
TODO-PROD.md
bugs/
claude-stats.fish
docs/
docs-ai/
ideas/
tests/

# Devcontainer CLI build artifact
.devcontainer/devcontainer-lock.json

# Generated by setuptools-scm at build time — derived from git tag.
src/painapple_code/_version.py

# Local tao fork carrying the iOS scene-delegate UAF patch
# (see tauri-app/src-tauri/Cargo.toml [patch.crates-io]).
tao/

# Generated by tools/bundle-feature-source.sh — mirror of features/src/painapple-code/
# (the canonical Feature) plus the bundled bridge source. Regenerated by the
# initializeCommand in .devcontainer/devcontainer.json on every build.
.devcontainer/painapple-code/
features/src/painapple-code/bridge-source/

# MkDocs build output
site/
