# Chemenu - .gitignore
#
# Rule for this file: `raw/`, `kb/` and `work/` are the repository's content, and
# a pattern that silently excludes one of their files is a data-loss bug - the
# wiki keeps reporting the file as covered while `publish` never commits it.
# So:
#   1. Anything repo-local (build output, toolchain state) is anchored with a
#      leading `/` so it only matches at the repo root.
#   2. Directory patterns (`foo/`) must ALWAYS be anchored: git cannot
#      re-include a file whose parent directory is excluded, so the negation
#      block at the bottom cannot rescue it.
#   3. The negation block at the bottom is the backstop for file patterns.
#   4. `reports/` is the exception in the other direction: it holds derived
#      output that must stay OUT of git, so its rule is required rather than
#      forbidden.
# `tools/wikitool docs verify` enforces all of this with canary probes in both
# directions.

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Editor directories and files
/.idea/
/.vscode/
*.swp
*.swo

# Temporary files
*.tmp
*.temp
*~

# Logs (but keep kb/log.md)
*.log
!kb/log.md

# Local environment files
.env
.env.local
.env.*.local

# Build artifacts
*.exe
*.dll
*.so
*.o
*.a
__pycache__/
*.pyc
*.pyo
*.pyd

# Node.js
/node_modules/
/package-lock.json
npm-debug.log*

# Python
/venv/
/.venv/
/env/
/.env/
/tools/.venv/
/tools/.pytest_cache/

# wikitool session-scoped iteration/cost budget state (see AGENTS.md
# "Gates") - local, per-session, never committed
/tools/.wikitool_session/

# Go
/go.mod
/go.sum
/bin/

# IDE
*.iml
*.ipr
*.iws

# Obsidian (if used locally)
/.obsidian/

# Backup files
*.bak
*.backup
*.orig

# System files
/core
/tags
/TAGS

# Generated lint reports. Derived output: the structural half is recomputable
# from the tree at any commit, so committing it would create a second, drifting
# copy. The contract explaining that is the one file that must survive.
/reports/*
!/reports/CONTRACT.md

# Per-checkout environment notes (harness, skills, MCP servers, connectors,
# remotes - see AGENTS.md "Environment"). Optional, and specific to one
# working copy: two clones of this repo are two different environments, so
# committing one clone's answers would hand the other a file that is wrong
# rather than missing. The `.template` beside it is tracked and ships with
# `dist export`; this anchored pattern deliberately does not match it.
/ENVIRONMENT.md

# Publish-Remote Gate allowlist (see instructions/gates.md). Names the push
# URLs *this* checkout may publish to, so it is per-checkout for exactly the
# reason ENVIRONMENT.md above is: a committed copy would tell a private clone
# that the public upstream is a legitimate target for its own content. Absent
# means unrestricted; `doctor` reports which.
/.wikitool-remotes.json

# Coverage output from `pytest --cov` (see .gitea/workflows/ci.yml). Derived,
# like reports/: recomputable from any commit, and `publish` runs `git add -A`,
# so an unignored htmlcov/ would commit itself on the next content publish.
/tools/.coverage
/tools/.coverage.*
/tools/coverage.xml
/tools/htmlcov/

# Published skills. `instructions/<name>/SKILL.md` is the source; these two
# directories are copies made by `wikitool instructions sync` for the harnesses
# that read them (`.agents/` for Copilot/Codex/Vibe, `.claude/` for Claude
# Code). Committing a copy would create the same drifting second copy the
# reports rule exists to prevent. A fresh clone publishes them once - see
# instructions/bootstrap.md.
/.agents/skills/
/.claude/skills/

# Content backstop - keep this block last. Nothing under raw/, kb/ or work/ may
# be excluded by a pattern above; see the header note for why directory patterns
# still have to be anchored rather than relying on these negations.
!raw/**
!kb/**
!work/**
