# Claude Code runtime files (auto-generated, machine-specific)
.last-cleanup
daemon.lock
daemon.log
daemon.status.json
daemon-auth-cooldown
daemon-auth-status.json
daemon/
debug/
file-history/
gh-pr-status-cache.json
history.jsonl
ide/
jobs/
# plans/
policy-limits.json*
remote-settings.json
scratchpad/
settings.json.doctor-backup-*
session-env/
shell-snapshots/
state/
stats-cache.json
.last-update-result.json
statsig/
teams/
telemetry/
tasks/
todos/

# Claude Code project runtime is huge. Track only per-project memory folders.
projects/*
!projects/*/
projects/*/*
!projects/*/memory/
!projects/*/memory/**
projects/*/memory/.snapshots/
projects/*/memory/.staging/
projects/*/memory/.nf-dream-handoff-decisions.json

# Backups
backups/
backup.log

# Data recovery
photorec.se2

# Runtime state (machine-specific)
security/
sessions/
channels/telegram/bot.pid

# Plugin cache (auto-generated)
plugins/cache/
plugins/synced/
skills/synced/
plugins/installed_plugins.json
cache/model-catalog/
cache/changelog.md
feedback/drafts/

# nf_ws ttyd share state (PID/URL/log per workspace, machine-specific)
tmux-workspaces/.share/

# nf_ws bg-session name counters (high-water marks, machine-specific)
tmux-workspaces/.state/

# OS files
.DS_Store

# Python bytecode
__pycache__/
*.py[cod]

# Local/personal settings
# settings.local.json
# CLAUDE.local.md
.claude/
.local/

# Chrome extension
chrome/

# Downloads (temporary)
downloads/
uploads/

# Plugin cache (auto-updated timestamps)
plugins/known_marketplaces.json
paste-cache/
file-history/
image-cache/

# Secrets / per-machine state (never commit)
.credentials.json
mcp-needs-auth-cache.json
.envrc

# Catch-all: never commit any env files (templates explicitly allowed)
*.env
!*.env.example
.gitignore.bak

# Per-machine compiled binaries (built locally on each machine)
skills/*/bin/
scripts/*/bin/
#   EXCEPTION — skills shipped with prebuilt binaries so a clone runs with no
#   toolchain installed. Only the PLATFORM-SUFFIXED builds are committed; the
#   bare `nf-ignore` is this machine's local build and must stay ignored, or a
#   Linux clone would find a macOS binary at the path the shim tries first.
!skills/nf-ignore/bin/
skills/nf-ignore/bin/nf-ignore
skills/nf-ignore/bin/nf-ignore.exe
#   EXCEPTION -- nf-musecode's bin/ holds no binary at all: it is a ~1KB bash
#   dispatcher that execs the bun scripts, so it is SOURCE, not a build artifact.
#   Without it a clone has no entry point and every path in SKILL.md is dead.
!skills/nf-musecode/bin/
!skills/nf-musecode/bin/nf-musecode
#   Same for nf-fal-ai: bin/nf-fal-ai is a single Bun script, no build step and
#   no compiled artifact anywhere in the skill, so it is SOURCE. Ignoring it
#   leaves a clone with a SKILL.md whose every command points at nothing.
!skills/nf-fal-ai/bin/
!skills/nf-fal-ai/bin/nf-fal-ai
#   Same rule for the hooks binary: commit the platform builds, ignore the local one.
hooks/bin/nf-hooks
hooks/bin/nf-hooks.exe
!skills/nf-memory/bin/
skills/nf-memory/bin/nf-memory
skills/nf-memory/bin/nf-memory.exe
!skills/nf-respondio/bin/
skills/nf-respondio/bin/nf-respondio
skills/nf-respondio/bin/nf-respondio.exe
#   Same rule for the statusline binary: the bar renders on every prompt and
#   must not depend on jq or a Go toolchain, so ship the platform builds.
!scripts/statusline-json/bin/
scripts/statusline-json/bin/statusline-json
scripts/statusline-json/bin/statusline-json.exe
!skills/nf-kt-lark/bin/
skills/nf-kt-lark/bin/nf-lark
skills/nf-kt-lark/bin/nf-lark.exe
!skills/wordpress-site-hardening/bin/
skills/wordpress-site-hardening/bin/nf-wp
skills/wordpress-site-hardening/bin/nf-wp.exe
!skills/cisgenx-pr/bin/
skills/cisgenx-pr/bin/nf-pr
skills/cisgenx-pr/bin/nf-pr.exe
!skills/cisgenx-jira/bin/
skills/cisgenx-jira/bin/nf-cjira
skills/cisgenx-jira/bin/nf-cjira.exe
!skills/fibre-load/bin/
skills/fibre-load/bin/nf-fjira
skills/fibre-load/bin/nf-fjira.exe
!skills/nf-polar/bin/
skills/nf-polar/bin/nf-polarjson
skills/nf-polar/bin/nf-polarjson.exe
!skills/nf-payment-creem/bin/
skills/nf-payment-creem/bin/nf-creemjson
skills/nf-payment-creem/bin/nf-creemjson.exe
!skills/nf-cloudflare/bin/
skills/nf-cloudflare/bin/nf-cf
skills/nf-cloudflare/bin/nf-cf.exe
!skills/cisgenx-load/bin/
skills/cisgenx-load/bin/nf-portainer
skills/cisgenx-load/bin/nf-portainer.exe

# Go test capture binaries (transient, built during golden tests)
skills/*/scripts/go/_capturebin
skills/*/scripts/**/_capturebin

# Skill-local Python venvs (regenerated by each skill's ensure-env script)
skills/*/.venv/

# nf-tasks dev symlink -> ~/WORK/AI/nf-tasks (real source there)
skills/nf-tasks

# machine-local availability symlink (canonical lives in XDG_STATE_HOME)
skills/nf-opencode/availability.json

# contextq dev symlink -> ~/WORK/AI/shared-context-server/skills/contextq (real source there; renamed from ctq-brain 2026-09-13)
skills/contextq

# .contextq/ — ctq plugin opt-in store; removed 2026-09-12, never track it here again
.contextq/

# cyberine-dispatch dev symlink -> ~/WORK/AI/ai-agent-solution/skills/cyberine-dispatch (real source there)
skills/cyberine-dispatch
.wrangler/
node_modules/
.claude/evolve/

# Codex CLI project config — per-machine local state (config.toml holds an
# absolute path override). Team-shared command policy in rules/ stays tracked.
# Same shape as skills/nf-ignore/assets/ai-tools.gitignore prescribes.
.codex/*
!.codex/rules/
!.codex/rules/*.rules

# iTerm2 layout tool: per-machine python env (rebuild with iterm/setup.sh)
iterm/.venv/

# Key material — nf-ignore ships these patterns only in its devops block, which
# is applied to IaC repos and never to this one.
*.pem
*.key
!*.pub.key
id_rsa*
id_ed25519*
id_ecdsa*
id_dsa*
*.p12
*.pfx
*.jks
*.keystore
age.key
*.age

# Env variants the `*.env` suffix pattern above does not reach (.env.local, .env.production)
.env.*
!.env.example
!.env.sample
