*
!tests/
!tests/**
!README.md
!AGENTS.md
!QUICKGUIDE.md
!MILESTONE*.md
!TESTS*.md
!CHANGELOG.md
!AUDIT*.md
!REF*.md
!AUDIT*.json
!LICENSE
!conftest.py
!CONTRIBUTING.md
!CODE_OF_CONDUCT.md
!SECURITY.md
!GOVERNANCE.md
!pyproject.toml
!uv.lock
!docker-compose.yml
!.env.example
!.importlinter
!Makefile
!docker-compose.test.yml
!lexigram.yaml.example
!.github/
!.github/workflows/
!.github/workflows/**
!.github/dependabot.yml
!.devcontainer/
!.devcontainer/**
!tools/
!tools/**
!*example.yaml

# Lexigram Packages
!lexigram*/
!lexigram*/pyproject.toml
!lexigram*/CHANGELOG.md
!lexigram*/README.md
!lexigram*/alembic.ini
!lexigram*/mypy.ini
!lexigram*/*.yaml.example
!lexigram*/src/
!lexigram*/src/**
!lexigram*/docs/
!lexigram*/docs/**
!lexigram*/tests/
!lexigram*/tests/**

# Keep lexigram docs - this is automatically being parse and use in https://docs.lexigram.dev/ and we want to make sure it is included in the repo
!/docs/
!docs/**

# Keep demo files for README examples
!/demos/
!/demos/**

# Re-ignore these AFTER negations (last match wins)
*.tape
demos/*/runs/
__pycache__/
*.pyc
*.pyo
*.egg-info/
dist/
build/
.eggs/
*.egg
.pytest_cache/
.mypy_cache/
.ruff_cache/
htmlcov/
.coverage
coverage.xml
test.db
!lexigram*/tests/fixtures/test.db
*.log
*.tmp

# Company-specific files (keep private, do not commit)
.company/
COMPANY_*.md
company-config/
internal-docs/
example*/
!example/
!example/**
demos*/
!demos/
!demos/**
# Demo runtime output (regenerated by the notebook/CLI)
demos/*/runs/
demos/*/__pycache__/
demos/*/.ipynb_checkpoints/
# Editor swap files
*.swp

# Tiered package layout (core/, packages/, experimental/<family>/)
!core/
!packages/
!experimental/
!experimental/*/
!core/lexigram*/
!packages/lexigram*/
!experimental/*/lexigram*/
!core/lexigram*/pyproject.toml
!packages/lexigram*/pyproject.toml
!experimental/*/lexigram*/pyproject.toml
!core/lexigram*/CHANGELOG.md
!packages/lexigram*/CHANGELOG.md
!experimental/*/lexigram*/CHANGELOG.md
!core/lexigram*/README.md
!packages/lexigram*/README.md
!experimental/*/lexigram*/README.md
!core/lexigram*/alembic.ini
!packages/lexigram*/alembic.ini
!experimental/*/lexigram*/alembic.ini
!core/lexigram*/mypy.ini
!packages/lexigram*/mypy.ini
!experimental/*/lexigram*/mypy.ini
!core/lexigram*/*.yaml.example
!packages/lexigram*/*.yaml.example
!experimental/*/lexigram*/*.yaml.example
!core/lexigram*/src/
!core/lexigram*/src/**
!packages/lexigram*/src/
!packages/lexigram*/src/**
!experimental/*/lexigram*/src/
!experimental/*/lexigram*/src/**
!core/lexigram*/tests/
!core/lexigram*/tests/**
!packages/lexigram*/tests/
!packages/lexigram*/tests/**
!experimental/*/lexigram*/tests/
!experimental/*/lexigram*/tests/**
!core/lexigram*/docs/
!core/lexigram*/docs/**
!packages/lexigram*/docs/
!packages/lexigram*/docs/**
!experimental/*/lexigram*/docs/
!experimental/*/lexigram*/docs/**

# dev/ (was scripts/ until Task 18)
!dev/
!dev/**

# Re-exclude private content under the tiered paths.
# MUST come after the !...docs/** negations above — last match wins.
core/lexigram*/docs/plans/
packages/lexigram*/docs/plans/
experimental/*/lexigram*/docs/plans/
core/lexigram*/docs/**/
packages/lexigram*/docs/**/
experimental/*/lexigram*/docs/**/

# Re-exclude tooling artifacts under the tiered paths (the allowlist
# above re-admits them — last match wins).
__pycache__/
*.pyc
*.pyo
*.egg-info/
.pytest_cache/
.mypy_cache/
.ruff_cache/
htmlcov/
.coverage
coverage.xml
test.db
*.tmp
*.log
!core/lexigram*/tests/fixtures/test.db
!packages/lexigram*/tests/fixtures/test.db
!experimental/*/lexigram*/tests/fixtures/test.db

# Allow the generated demo gifs to be tracked (README hero images).
!core/lexigram*/docs/gifs/
!core/lexigram*/docs/gifs/**
!packages/*/lexigram*/docs/gifs/
!packages/*/lexigram*/docs/gifs/**
!experimental/*/lexigram*/docs/gifs/
!experimental/*/lexigram*/docs/gifs/**demos/feedback-loop/.runs/
