# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv

# Secrets & tokens
.env
schwab_token.json

# Personal directory contains PII (snapshots, journals, CSV exports)
personal/

# Journal entries contain real position data — keep local, not in git
# (canonical location is personal/journal/ but guard the old path too)
journal/

# IDE
.vscode/
.idea/
.DS_Store

# Claude Code per-user permissions cache (machine-specific, do not commit)
.claude/settings.local.json

# Claude Code agent worktrees (full repo checkouts, may contain personal/ PII)
.claude/worktrees/

# Personal-tuned local slash commands — opinionated thresholds, watchlists,
# decision trees that don't belong in the shared project. Conventions:
#   `.claude/commands/<name>.local.md`        → flat-file form
#   `.claude/commands/<name>.local/SKILL.md`  → folder form (with *.py helpers, etc.)
# Both invoked as `/<name>.local` by the harness.
.claude/commands/*.local.md
.claude/commands/*.local/

# Registry-installed skills (`thetabook skills install`). The bytes folder is
# always gitignored regardless of scope; installer state is split into two
# files so the *committed* baseline can be reviewed in PRs while per-user
# installs stay out of git, mirroring the settings.json / settings.local.json
# pattern above.
#   `.claude/skills/`                         → all installed skill bytes
#   `.claude/skills-installed.toml`           → committed (shared scope baseline)
#   `.claude/skills-installed.local.toml`     → gitignored (per-user installs)
.claude/skills/
.claude/skills-installed.local.toml
