.mcp.json

# Runtime logs — regenerated by the poller, never version them
logs/*.log
.worktrees/

# Python build byproducts — regenerated by `python -m build`. A stale wheel
# from an old version once got tracked here; if dist/ isn't ignored, every
# future build step's dist/ starts non-empty and the release/publish steps
# ship whatever was left behind alongside the real, current version.
dist/
build/
*.egg-info/

# Local/machine-specific config — never track: direnv exports (could grow a
# literal secret), the Python venv (vendored library bloat, unrelated to the
# ts/ runtime), and personal Claude settings (symlinked to an absolute path
# on the operator's machine — dangling for anyone else who clones the repo,
# and fatal to `python -m build`: tarfile's `filter="data"` safety check
# refuses to package any tar member that is a symlink to an absolute path).
.envrc
.venv/
**/settings.local.json
**/settings.json
**/skills/secret
**/bin/general/rename.sh

# Scratch / local-notes dirs that MUST NOT be published — this is a PUBLIC repo.
# Both names PROMISED exclusion and neither was actually ignored, so the
# pre-stop autosave-rescue (git add -A) committed scratch here, and the
# operator's own instruction to save private notes under ./GITIGNORE/ would have
# published them (card cct-gitignored-dir-is-not-gitignored-name-lies). Ignoring
# both spellings makes the name honest: scratch and any restored
# standing-instructions file stay local. NOTE: already-tracked files under
# GITIGNORED/ stay tracked (gitignore never untracks); untracking those is a
# separate, deliberate call — not a side effect of this rule.
/GITIGNORE/
/GITIGNORED/

# Python bytecode. This repo had NO bytecode rule at all — the ts/ runtime is
# the headline, but src/claude_code_telegrammer/ is a real Python package and
# importing it leaves __pycache__ behind. Regenerated on every import; never
# source.
__pycache__/
*.py[cod]

# Hook scratch. The pre-tool-use hooks write per-invocation staging files into a
# `.pending/` dir next to themselves. That is machine scratch, never source; a
# batch of it under docs/to_claude/ was committed by accident, and this rule
# keeps it from coming back.
.pending/

# Hook logs. Hook scripts log to `LOG_PATH="$THIS_DIR/.$(basename "$0").log"`,
# i.e. a hidden `.<script>.sh.log` beside themselves; 12 of them under
# docs/to_claude/hooks/ were committed. Unanchored on purpose: the naming
# belongs to the scripts, not to that directory, and the same scripts also live
# in .claude/hooks/ and docs/to_claude/bin/. A hidden *.sh.log is never source.
.*.sh.log
