# ESP-IDF build output -- regenerated by `idf.py build`. sdkconfig itself
# is regenerated from sdkconfig.defaults + Kconfig.projbuild's `default`
# choices, so the repo's checked-in default combination doesn't depend on
# it; dependencies.lock (pinned component versions -- like
# package-lock.json) IS committed, only the fetched sources aren't.
firmware/build/
firmware/sdkconfig
firmware/sdkconfig.old
firmware/managed_components/

# Release artifacts -- regenerated by flashing/build_release.py
dist/

# firmware/main/generated/ (content_data.h + fonts/*.c) IS committed --
# deterministic output from content/moves.json and assets/fonts/*.ttf,
# both also committed, and a clone can't build without it. Regenerate with
# tools/generate-qr.mjs and tools/generate-fonts.sh after editing either
# input; tools/check-generated-fresh.sh fails the build (not a warning) if
# you forget -- wired into both sim/CMakeLists.txt and
# firmware/main/CMakeLists.txt.

# Simulator screenshot output -- regenerated by sim/build/magic8_screenshot
sim/out/

# Vendored standalone esptool: both macOS builds (arm64 for Apple Silicon,
# amd64 for Intel) ARE committed, executable bit preserved -- 150 Bond's
# machine architecture is unknown, and flash_one_unit.command already
# checks both, so this covers either without anyone needing to know which
# one they have. A clone can flash with nothing fetched. Windows/Linux
# stay gitignored until we know 150 Bond needs them; fetch with
# flashing/vendor/fetch_esptool.*.
flashing/vendor/esptool-*/
!flashing/vendor/esptool-macos-arm64/
!flashing/vendor/esptool-macos-amd64/

# Desktop simulator's LVGL checkout -- fetched by sim/fetch_lvgl.sh, pinned
# by tag there, not committed (same reasoning as the vendored esptool).
sim/third_party/
sim/build/

# Content-pipeline npm dependency (qrcode-generator) -- reinstall with
# `npm install`, package-lock.json is the pinned source of truth.
node_modules/

# Editor/OS cruft
.DS_Store
*.swp

# Python bytecode from flashing/test_build_release.py
__pycache__/
