# Conventional Commit Message Template
# =====================================
#
# Format: <type>(<scope>): <subject>
#
# Type:
#   feat:     A new feature
#   fix:      A bug fix
#   docs:     Documentation only changes
#   style:    Code style changes (formatting, semicolons, etc)
#   refactor: A code change that neither fixes a bug nor adds a feature
#   test:     Adding or correcting tests
#   chore:    Chores like build process, dependency updates
#   perf:     A code change that improves performance
#
# Scope:
#   The module/component affected (e.g., gui, flash, config, serial)
#
# Subject:
#   A short description in present tense, imperative mood
#   - No period at the end
#   - Max 72 characters
#
# Body (optional):
#   - Explains the "what" and "why" not the "how"
#   - Use imperative mood
#   - Wrap at 72 characters
#   - Separate from subject with a blank line
#
# Footer (optional):
#   - References issues (Closes #123)
#   - Breaking changes (BREAKING CHANGE: ...)
#
# ── Examples ─────────────────────────────────────────────────
#
# feat(gui): add per-step run buttons to workflow panel
#
# feat(flash): implement CRC32 verification for flash programming
#
# fix(gui): resolve step status not updating on worker thread
#
# refactor(config): extract path resolution to Config.resolve_path()
#
# docs: update README with installation instructions
#
# chore: update requirements.txt with darkdetect dependency
#
# perf(serial): reduce serial read timeout from 10s to 5s
#
# ── Multi-scope changes ──────────────────────────────────────
# Use multiple scopes when a change affects multiple modules:
#
# feat(gui,widgets): enhance StepHeader with run/re-run buttons
#
# ── Breaking changes ─────────────────────────────────────────
# feat(gui)!: change step execution model to async
#
# BREAKING CHANGE: Step callbacks now receive index instead of step object
