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

# Virtual environments
.venv
.venv/

# Tool caches
.pytest_cache/
.ruff_cache/
.mypy_cache/
.hypothesis/
.idea/
.skylos/
.oneiric_cache/
.complexipy_cache/
.cache/
.lycheecache
.lycheecache/
.pyscn/
.pyscn

# Coverage reports
.coverage
.coverage*
.coverage.*
coverage.xml
coverage.json
# coverage*.json catches filenames like coverage__20261014-104911.json
# (double-underscore date-stamped test artifacts) that `coverage.json`
# (exact) misses. The 2026-10-14 oneiric fast hook failure was caused by
# a coverage JSON in docs/archive/test-artifacts/ escaping this ignore.
coverage*.json
htmlcov/

# Logs
logs/
crackerjack-ai-debug-*.log
crackerjack-debug-*.log

# Crackerjack
.crackerjack-*
.crackerjack/

# XDG - State directories
.claude/
# Shared team content (whitelisted — decisions, agents, workflows, skills).
# Directory entries MUST come before the `**` recursive entries so git's
# pattern matching re-includes the directory before evaluating the recursive
# pattern. Pattern matches mahavishnu's allowlist style. Per
# oneiric/docs/adr/0001-deployability-discipline.md.
!.claude/decisions/
!.claude/decisions/**
!.claude/agents/
!.claude/agents/**
!.claude/workflows/
!.claude/workflows/**
!.claude/skills/
!.claude/skills/**
.session-buddy/

# XDG - DELETE candidates
.obsidian/

# Misc root files (anchored to repo root)
/NOTES.md
/.mcp_test_results.md
/.jbeval/
/.benchmarks/
/.smart-env/

# Archive directories
.archive/
.archives/
.backup/
.backups/
# Defensive: docs/archive/ (no leading dot) is the LEGACY archive
# path. The 2026-10-14 oneiric fast hook failure was caused by
# test artifacts re-staging under this name; the migration untracked
# the legacy dir (files now live under docs/.archive/, which is
# itself gitignored). This rule prevents a regression — if anyone
# re-introduces docs/archive/X, the same check-added-large-files
# hook would flag large files there.
docs/archive/

# Backup Files (added by gitignore audit)
# ============================================================================
*.backup
*.bak
*.backup.json
.worktrees/
# Timestamped .gitignore backups created by the gitignore audit tool
# (e.g. .gitignore.bak.20260926T152807Z). The leading `.gitignore.bak.`
# prefix is required because the wildcard `*.bak` only matches files whose
# last extension is `.bak`; timestamped backups put the timestamp AFTER
# `.bak`, so this prefix-aware pattern is the only one that excludes them.
# Placed outside the `>>> bodai-shared-gitignore <<<` block so a future
# `crackerjack gitignore sync` does not overwrite the prefix rule.
.gitignore.bak.*

# ============================================================================
# Node.js - Wave-11 mermaid CI guard
# ============================================================================
# jsdom is the dev dep for the wave-11 mermaid CI guard (see
# oneiric/tools/mermaid_validator/validate_mermaid.mjs). The package.json
# + package-lock.json ARE committed; only the resolved artifacts are excluded.
node_modules/
# Allow the empty placeholder so a fresh clone gets a usable `npm install`.
!node_modules/.gitkeep

# ============================================================================
# Bodai-wide gitignore patterns (added 2026-09-07; cross-repo cleanup sweep)
# ============================================================================
# Editor / pre-edit backups (foo.py.backup, foo.py.backup.json)
*.backup
*.backup.*
*.bak
*.tmpl
# XDG mistake dirs (env var expansion failed; literal names)
~
[{]HOME[}]
[{]XDG_DATA_HOME:-$HOME
# pytest-benchmark autosave cache (sibling of the tracked `benchmarks/` test suite)
.benchmarks/
# Vitest config timestamp cache
vitest.config.js.timestamp-*.mjs
# Playwright output cruft
playwright-junit.xml
playwright-report/
playwright-results.json
test-results/


# Superpowers Skill Artifacts (local-only, per-project runtime)
# ============================================================================
# All `.superpowers/` content is scratch: SDD controller workspace
# (briefs, reports, ledger, review packages) keyed by plan-basename, and
# the brainstorm visual-companion's mockup HTML + server-state JSON.
# Plans and specs live at `docs/plans/` and `docs/specs/` instead — they
# are committed under their canonical paths, never under `.superpowers/`.
.superpowers/

!docs/plans/.archive/
!docs/plans/.archive/**
!docs/specs/.archive/
!docs/specs/.archive/**


# >>> bodai-shared-gitignore >>>
# Source of truth: crackerjack/templates/GITIGNORE_BODAI.md
# Enforced by: crackerjack check `gitignore-conformance`
# Fleet list: /Users/les/Projects/mahavishnu/BODAI_REPO_REGISTRY.md
# Do NOT remove the marker line above — `crackerjack gitignore sync` uses it
# to detect already-applied state.

# Local configuration overlay (per-machine / per-developer; never commit)
# Patterns mirror mahavishnu/.gitignore §Local Configuration so all Bodai
# repos ignore the same overlay set. The four files are: developer-local
# overrides (`local.yaml`), the legacy repo catalog (`repos.yaml`),
# the orchestrator-managed catalog (`ecosystem.yaml`), and the per-machine
# fleet registry overlay (`registry_metadata.local.yaml`, sibling of the
# tracked `registry_metadata.yaml`).
settings/local.yaml
settings/repos.yaml
settings/ecosystem.yaml
settings/registry_metadata.local.yaml

# Editor / pre-edit backups (foo.py.backup, foo.py.backup.json)
*.backup
*.backup.*
*.bak
# `.bak.` infix (e.g. `.gitignore.bak.20261004T104858Z`,
# `foo.py.bak.20261004T104858Z`) — `*.bak` only matches a SUFFIX and silently
# misses timestamped backups where `.bak` is followed by `.` + suffix.
# Added 2026-10-05 after a session-buddy tool modifier wrote
# `.gitignore.bak.20261004T104858Z` to the working tree and the existing
# `*.bak` pattern failed to catch it on the next `git add`.
*.bak.*
.gitignore.bak.*
*.tmpl
# XDG mistake dirs (env var expansion failed; literal names)
# Note: both `{` and `}` are escaped (`{` -> `[{]`, `}` -> `[}]`)
# because gitignore parsers interpret `${...}` as a brace-expansion
# alternate group; escaping only the open brace leaves a stray `}`.
~
[{]HOME[}]
[{]XDG_DATA_HOME:-$HOME[}]
# pytest-benchmark autosave cache (sibling of the tracked `benchmarks/` test suite)
.benchmarks/
# Vitest config timestamp cache
vitest.config.js.timestamp-*.mjs
# Playwright output cruft
playwright-junit.xml
playwright-report/
playwright-results.json
test-results/
# Superpowers skill artifacts (local-only, per-project runtime).
# All `.superpowers/` content is scratch: SDD controller workspace
# (briefs, reports, ledger, review packages) and the brainstorm
# visual-companion's mockup HTML+server-state. Plans and specs live
# at docs/plans/ and docs/specs/ — committed under their canonical
# paths, never under .superpowers/.
.superpowers/

# === Bodai `.claude/` policy ===
# Default-deny the entire .claude/ tree, then narrow allowlist for the
# canonical durable subtrees. Settings.local.json + runtime artifacts
# stay untracked. Converges the fleet on a single shape (was divergent:
# oneiric/mcp-common used blanket+allowlist, mahavishnu used targeted
# blocks, akosha/session-buddy/crackerjack used .claude/* + allowlist).
#
# After `crackerjack gitignore sync` runs fleet-wide, per-repo cleanup
# is still required for files already tracked that this block would
# un-track (most notably mahavishnu's .claude/settings.local.json) —
# gitignore changes don't un-track existing entries. Those require
# `git rm --cached <path>` per file per repo.
.claude/*
!.claude/CLAUDE.md
!.claude/settings.json
# Canonical durable subtrees — track everywhere (empty dirs allowed
# so future content lands without a gitignore edit):
!.claude/decisions/
!.claude/decisions/**
!.claude/agents/
!.claude/agents/**
!.claude/commands/
!.claude/commands/**
!.claude/hooks/
!.claude/hooks/**
!.claude/skills/
!.claude/skills/**
!.claude/workflows/
!.claude/workflows/**
# Runtime artifacts — never track. Surface as first-class rules so
# every contributor sees the policy at a glance:
.claude/settings.local.json
.claude/agents/.a2a_enrollment/
.claude/agents/.archive/
.claude/skills/*/.archive/
.claude/workflows/.archive/
.claude/backups/
.claude/handoff/
.claude/worktrees/
.claude/worktree-snapshots/
.claude/__pycache__/
.claude/**/__pycache__/
.claude/**/*~.tmp
.claude/**/test_hook_*.txt
.claude/**/hook_test_marker.txt
# <<< bodai-shared-gitignore <<<
