From 0f38fe21a5aec3bcba63df3cdfc7ea78d1537121 Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Thu, 14 May 2026 21:34:07 +0200 Subject: [PATCH 1/6] ci: Implement new CI and release workflow --- .github/actions/setup-pio/action.yml | 27 ++++ .github/workflows/changelog.yml | 21 --- .github/workflows/ci.yml | 58 +++++++ .github/workflows/code_format.yml | 2 +- .github/workflows/platformio.yml | 35 ----- .github/workflows/platformio_unit_tests.yml | 35 ----- .github/workflows/release-please.yml | 20 +++ .release-please-manifest.json | 3 + RELEASE.md | 88 +++++++++++ release-please-config.json | 16 ++ requirements_version_check.txt | 4 - version_check.py | 163 -------------------- 12 files changed, 213 insertions(+), 259 deletions(-) create mode 100644 .github/actions/setup-pio/action.yml delete mode 100644 .github/workflows/changelog.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/platformio.yml delete mode 100644 .github/workflows/platformio_unit_tests.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .release-please-manifest.json create mode 100644 RELEASE.md create mode 100644 release-please-config.json delete mode 100644 requirements_version_check.txt delete mode 100755 version_check.py diff --git a/.github/actions/setup-pio/action.yml b/.github/actions/setup-pio/action.yml new file mode 100644 index 00000000..ad369f76 --- /dev/null +++ b/.github/actions/setup-pio/action.yml @@ -0,0 +1,27 @@ +name: 'Setup PlatformIO' +description: 'Sets up Python and PlatformIO for build and test jobs' + +inputs: + install-matrix-deps: + description: 'Install matrix build dependencies from requirements_matrix_build.txt' + required: false + default: 'false' + +runs: + using: 'composite' + steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install PlatformIO + shell: bash + run: | + python -m pip install --upgrade pip + pip install wheel platformio + - name: Install matrix build dependencies + if: inputs.install-matrix-deps == 'true' + shell: bash + run: pip install -r requirements_matrix_build.txt + - name: Install unit test dependencies + shell: bash + run: pip install gcovr diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml deleted file mode 100644 index 16603003..00000000 --- a/.github/workflows/changelog.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Check changelog and version are matching - -on: - pull_request: - branches: - - '*' - -jobs: - check: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up Python - uses: actions/setup-python@v1 - - name: Install dependencies - run: | - python3 -m pip install --upgrade pip - python3 -m pip install -r requirements_version_check.txt - - name: Run version check script - run: python3 version_check.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..a934e51e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,58 @@ +name: CI + +on: + pull_request: + branches: + - '*' + +jobs: + pr-title-lint: + name: PR Title (Conventional Commits) + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-pio + with: + install-unit-test-deps: 'true' + - name: Run unit tests + run: pio test -e native -v + - name: Publish Coverage Summary + if: always() + run: | + echo "## Native Unit Test Coverage" >> "$GITHUB_STEP_SUMMARY" + echo >> "$GITHUB_STEP_SUMMARY" + if [ -f .pio/coverage.md ]; then + cat .pio/coverage.md >> "$GITHUB_STEP_SUMMARY" + else + echo "Coverage report was not generated." >> "$GITHUB_STEP_SUMMARY" + fi + + build: + name: Build (${{ matrix.board }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + board: + - mksgenlv21 + - mksgenlv2 + - mksgenlv1 + - esp32 + - ramps + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-pio + with: + install-matrix-deps: 'true' + - name: Build ${{ matrix.board }} + run: python matrix_build.py -b ${{ matrix.board }} diff --git a/.github/workflows/code_format.yml b/.github/workflows/code_format.yml index ca5754db..70ac1229 100644 --- a/.github/workflows/code_format.yml +++ b/.github/workflows/code_format.yml @@ -12,7 +12,7 @@ jobs: check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/platformio.yml b/.github/workflows/platformio.yml deleted file mode 100644 index be725707..00000000 --- a/.github/workflows/platformio.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: PlatformIO CI - -on: - push: - branches: - - develop - pull_request: - branches: - - '*' - -jobs: - build: - name: BOARD=${{ matrix.board }} - runs-on: ubuntu-latest - continue-on-error: true - strategy: - matrix: - board: [ mksgenlv21, - mksgenlv2, - mksgenlv1, - esp32, - ramps ] - - steps: - - uses: actions/checkout@v1 - - name: Set up Python - uses: actions/setup-python@v2 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install wheel - pip install platformio - pip install -r requirements_matrix_build.txt - - name: Run PlatformIO - run: python matrix_build.py -b ${{ matrix.board }} diff --git a/.github/workflows/platformio_unit_tests.yml b/.github/workflows/platformio_unit_tests.yml deleted file mode 100644 index 4c447d8b..00000000 --- a/.github/workflows/platformio_unit_tests.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: PlatformIO Unit Tests - -on: - pull_request: - branches: - - '*' - -jobs: - native_unit_tests: - runs-on: ubuntu-latest - continue-on-error: true - - steps: - - uses: actions/checkout@v6 - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.13' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install platformio - pip install gcovr - - name: Run Unit Tests - run: pio test -e native -v - - name: Publish Coverage Summary - if: always() - run: | - echo "## Native Unit Test Coverage" >> "$GITHUB_STEP_SUMMARY" - echo >> "$GITHUB_STEP_SUMMARY" - if [ -f .pio/coverage.md ]; then - cat .pio/coverage.md >> "$GITHUB_STEP_SUMMARY" - else - echo "Coverage report was not generated." >> "$GITHUB_STEP_SUMMARY" - fi diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..876dc1e1 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,20 @@ +name: Release Please + +on: + push: + branches: + - develop + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + config-file: release-please-config.json + manifest-file: .release-please-manifest.json diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..29cdc59d --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "1.13.19" +} \ No newline at end of file diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..e147327a --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,88 @@ +# Release Process + +This document describes how releases are managed for OpenAstroTracker-Firmware. It is intended for project developers with write access to the repository. + +## Overview + +Releases are fully automated via [release-please](https://github.com/googleapis/release-please). The process requires no manual version bumping or changelog editing — both are driven by PR titles following the [Conventional Commits](https://www.conventionalcommits.org/) specification. + +``` +PR merged → release-please updates its Release PR → maintainer merges Release PR → tag + GitHub Release created automatically +``` + +## Conventional Commits (required for all PRs) + +Every PR title **must** follow this format: + +``` +: +``` + +CI will reject PR titles that do not conform. + +| Type | Triggers | Example | +|------|----------|---------| +| `feat` | minor version bump | `feat: add AZ/ALT steps-per-degree Meade command` | +| `fix` | patch version bump | `fix: correct sidereal rate after meridian flip` | +| `feat!` or `BREAKING CHANGE:` footer | major version bump | `feat!: remove legacy serial protocol` | +| `chore` | no version bump | `chore: update platformio dependencies` | +| `docs` | no version bump | `docs: clarify wiring diagram for RAMPS` | +| `refactor` | no version bump | `refactor: extract stepper configuration logic` | +| `test` | no version bump | `test: add unit tests for DayTime rollover` | +| `ci` | no version bump | `ci: update clang-format action version` | +| `perf` | no version bump | `perf: reduce interrupt latency in stepper ISR` | + +The description becomes the changelog entry, so write it as a user-facing statement of what changed — not what you did internally. + +## How release-please Works + +After each PR is merged into `develop`, the `release-please` GitHub Action updates an open **Release PR**. This PR: + +- Accumulates all `feat`, `fix`, and other notable commits since the last release +- Proposes the next semantic version (patch / minor / major based on commit types) +- Updates `Changelog.md` with categorised entries linked to PRs +- Updates `Version.h` with the new version string + +The Release PR stays open and self-updates as more PRs are merged. When you are ready to cut a release, simply **merge the Release PR**. + +## Cutting a Release + +1. Review the open Release PR (titled `chore(main): release V`) — check the proposed version and changelog entries. +2. Merge it into `develop`. +3. `release-please` automatically: + - Creates a git tag `V` (e.g. `V1.14.0`) + - Publishes a GitHub Release with the generated changelog + +No manual tag pushing, no manual `Version.h` edits. + +## Version Semantics + +Versions follow [Semantic Versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`): + +| Change | Bump | +|--------|------| +| Breaking change in Meade protocol or configuration | **Major** | +| New feature, new board support, new Meade command | **Minor** | +| Bug fix, performance improvement, documentation | **Patch** | +| Chore, CI, refactor, test | **None** | + +## CI Checks on Every PR + +All of the following must pass before a PR can be merged: + +| Check | What it validates | +|-------|------------------| +| **PR Title (Conventional Commits)** | PR title follows `: ` format | +| **Unit Tests** | `pio test -e native` passes | +| **Build (mksgenlv21)** | Firmware compiles for MKS Gen L V2.1 | +| **Build (mksgenlv2)** | Firmware compiles for MKS Gen L V2 | +| **Build (mksgenlv1)** | Firmware compiles for MKS Gen L V1 | +| **Build (esp32)** | Firmware compiles for ESP32 | +| **Build (ramps)** | Firmware compiles for RAMPS | +| **clang-format** | Code formatting matches `.clang-format`; auto-fixed on same-repo branches | + +## Firmware Binaries + +Pre-built binaries are **not** published in GitHub Releases. Because the firmware is configured via generated header files (stepper drivers, sensors, display type, etc.), a generic binary would not be usable without recompilation. Users must build the firmware for their specific hardware configuration using PlatformIO. + + diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..6cf6bcb5 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "simple", + "tag-prefix": "V", + "packages": { + ".": { + "release-type": "simple", + "extra-files": [ + { + "type": "generic", + "path": "Version.h" + } + ] + } + } +} \ No newline at end of file diff --git a/requirements_version_check.txt b/requirements_version_check.txt deleted file mode 100644 index 946fde90..00000000 --- a/requirements_version_check.txt +++ /dev/null @@ -1,4 +0,0 @@ -mistune~=2.0.0rc1 -robotpy-cppheaderparser~=5.0.14 -semver~=2.13.0 -GitPython~=3.1.17 \ No newline at end of file diff --git a/version_check.py b/version_check.py deleted file mode 100755 index 74fe2a32..00000000 --- a/version_check.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import argparse -import fnmatch -from typing import Optional, Dict - -import mistune -import CppHeaderParser -import semver -import git - -parser = argparse.ArgumentParser(description='''Check that the versioning of the repo has been correctly changed. -Intended to run in a PR CI''') -parser.add_argument('branchspec', default='origin/develop', nargs='?', - help='Git branch specification for previous file versions (default: %(default)s)') - - -def die(*args, error_code=1, **kwargs): - print('ERROR: ', end='', file=sys.stderr) - print(*args, **kwargs, file=sys.stderr) - exit(error_code) - - -class SemVerWithVPrefix(semver.VersionInfo): - @classmethod - def parse(cls, version): - if version[0] != 'V': - raise ValueError(f"{version}: not a valid semantic version tag. Must start with 'v' or 'V'") - self = super(SemVerWithVPrefix, cls).parse(version[1:]) - return self - - def __str__(self): - return 'V' + super(SemVerWithVPrefix, self).__str__() - - -def only_changed_non_fw_files(refspec: str) -> bool: - print('Checking if the files changed impact the firmware...') - repo = git.Repo('.') - index = repo.index - origin_develop_commit = repo.commit(refspec) - - # index vs working copy (unstaged files) - changed_but_not_staged = [item.a_path for item in index.diff(None)] - # index vs current HEAD tree (staged files) - changed_and_staged = [item.a_path for item in index.diff('HEAD')] - # origin vs current HEAD tree (files changed in the branch) - branch_files_changed = [item.a_path for item in origin_develop_commit.diff('HEAD')] - - print(f'Unstaged changes: {changed_but_not_staged}') - print(f'Staged changes: {changed_and_staged}') - print(f'Changed in branch: {branch_files_changed}') - - all_changed_filenames = changed_but_not_staged + changed_and_staged + branch_files_changed - print(f'Total changed files: {all_changed_filenames}') - - non_fw_globs = [ - # non-build Python scripts (pre/post Platformio scripts still affect the build process) - 'matrix_build*.py', 'version_check.py', 'scripts/MeadeCommandParser.py', - # prose text files - '*.md', 'LICENSE', '.mailmap', - # build system - '.github/*.yml', 'requirements_*.txt', - # misc tooling files - '.gitignore', '.git-blame-ignore-revs', - ] - for changed_filename in all_changed_filenames: - if not any(fnmatch.fnmatch(changed_filename, non_fw_glob) for non_fw_glob in non_fw_globs): - # If the changed file isn't a non-FW file (==> is a FW file) - # then we need to do the full version check - print(f"Changed file {changed_filename} will affect firmware ({non_fw_globs})") - return False - return True - - -def get_header_defines(header_contents: str) -> Dict[str, str]: - defines_detail = CppHeaderParser.CppHeader(header_contents, argType='string').defines_detail - return dict(d['value'].split(' ', maxsplit=1) for d in defines_detail) - - -def find_child_text(node: dict) -> Optional[str]: - if 'children' in node.keys(): - if node['children'] and isinstance(node['children'], list): - return find_child_text(node['children'][0]) - elif 'text' in node.keys(): - return node['text'] - return None - - -def get_header_version(version_header_contents: str) -> semver.VersionInfo: - version_defines = get_header_defines(version_header_contents) - try: - version_str = next(v.strip('"') for k, v in version_defines.items() if 'version' in k.lower()) - except StopIteration: - die(f'Could not find version define in\n{version_header_contents}: {version_defines}') - try: - version = SemVerWithVPrefix.parse(version_str) - except ValueError as e: - die(f'SemVer error: {e}') - - print(f'Version is {version}') - return version - - -def get_changelog_version(changelog_markdown_path: str) -> str: - markdown = mistune.create_markdown(renderer=mistune.AstRenderer()) - with open(changelog_markdown_path, 'r') as f: - changelog_lines = f.read() - changelog_ast = markdown(changelog_lines) - - first_heading_has_list = (changelog_ast[1]['type'] == 'list') - if not first_heading_has_list: - die(f'Latest changelog entry does not include a _list_ of what has changed') - - first_heading_str = find_child_text(changelog_ast[0]) - if not first_heading_str: - die(f'Could not find the latest changelog heading: {changelog_ast[0]}') - print(f'Latest changelog heading: {first_heading_str}') - - return first_heading_str - - -def get_previous_header_version(version_header_path: str, refspec: str) -> semver.VersionInfo: - repo = git.Repo('.') - previous_header_contents = repo.git.show(f'{refspec}:{version_header_path}') - print(f'Checking previous header version from {refspec}:{version_header_path}') - previous_version = get_header_version(previous_header_contents) - print(f'Read previous header version: {previous_version}') - return previous_version - - -def main(): - if only_changed_non_fw_files(args.branchspec): - print('No FW files changed, not checking version.') - return - version_header_path = './Version.h' - # Get the current version from the header - print(f'Checking current header version from {version_header_path}') - with open(version_header_path, 'r') as fp: - version_header_contents = fp.read() - header_version = get_header_version(version_header_contents) - - # Get the previous version (using git) - previous_header_version = get_previous_header_version(version_header_path, args.branchspec) - - # Check that the version has been increased - if header_version <= previous_header_version: - die(f'Header version must be greater than the previous version {header_version} <= {previous_header_version}') - - changelog_markdown_path = './Changelog.md' - # Get a string from the changelog, should have a version in the latest entry - changelog_version = get_changelog_version(changelog_markdown_path) - - # Check that the header and the changelog match - if str(header_version).lower() not in changelog_version.lower(): - die(f'Header version ("{header_version}" in {version_header_path}) does \ -not match changelog version ("{changelog_version}" in {changelog_markdown_path})') - - -if __name__ == '__main__': - args = parser.parse_args() - main() - print('Finished version check!') From 1a857377458fb61d9f9351d4053c45f1e95fd755 Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Fri, 15 May 2026 08:07:18 +0200 Subject: [PATCH 2/6] ci: Update action versions in workflows for consistency and improvements --- .github/actions/setup-pio/action.yml | 7 ++++++- .github/workflows/ci.yml | 6 +++--- .github/workflows/code_format.yml | 2 +- .github/workflows/release-please.yml | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/actions/setup-pio/action.yml b/.github/actions/setup-pio/action.yml index ad369f76..03b8d52d 100644 --- a/.github/actions/setup-pio/action.yml +++ b/.github/actions/setup-pio/action.yml @@ -6,11 +6,15 @@ inputs: description: 'Install matrix build dependencies from requirements_matrix_build.txt' required: false default: 'false' + install-unit-test-deps: + description: 'Install unit test dependencies (gcovr)' + required: false + default: 'false' runs: using: 'composite' steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: '3.x' - name: Install PlatformIO @@ -23,5 +27,6 @@ runs: shell: bash run: pip install -r requirements_matrix_build.txt - name: Install unit test dependencies + if: inputs.install-unit-test-deps == 'true' shell: bash run: pip install gcovr diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a934e51e..95cb5747 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: permissions: pull-requests: read steps: - - uses: amannn/action-semantic-pull-request@v5 + - uses: amannn/action-semantic-pull-request@v6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -20,7 +20,7 @@ jobs: name: Unit Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-pio with: install-unit-test-deps: 'true' @@ -50,7 +50,7 @@ jobs: - esp32 - ramps steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-pio with: install-matrix-deps: 'true' diff --git a/.github/workflows/code_format.yml b/.github/workflows/code_format.yml index 70ac1229..412f4279 100644 --- a/.github/workflows/code_format.yml +++ b/.github/workflows/code_format.yml @@ -12,7 +12,7 @@ jobs: check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 876dc1e1..05f194cc 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -13,7 +13,7 @@ jobs: release-please: runs-on: ubuntu-latest steps: - - uses: googleapis/release-please-action@v4 + - uses: googleapis/release-please-action@v5 with: token: ${{ secrets.GITHUB_TOKEN }} config-file: release-please-config.json From eef4b855637a3924e61ddff1a66e9f54784eca24 Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Fri, 15 May 2026 08:10:31 +0200 Subject: [PATCH 3/6] ci: updated release-please-manifest to current version Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .release-please-manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 29cdc59d..3a3b3b9d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.13.19" + ".": "1.13.20" } \ No newline at end of file From 83e50c56ef4ab648db30bb2736060a4b755bfa8c Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Fri, 15 May 2026 08:13:38 +0200 Subject: [PATCH 4/6] ci: renamed Changelog.md to CHANGELOG.md to match release-please defaults --- Changelog.md => CHANGELOG.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Changelog.md => CHANGELOG.md (100%) diff --git a/Changelog.md b/CHANGELOG.md similarity index 100% rename from Changelog.md rename to CHANGELOG.md From 94875da22cde5ef4acd8faa9abc15bfaf4ccaaab Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Fri, 15 May 2026 09:10:28 +0200 Subject: [PATCH 5/6] doc: adjusted mention of CHANGELOG.md Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index e147327a..254837d9 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -40,7 +40,7 @@ After each PR is merged into `develop`, the `release-please` GitHub Action updat - Accumulates all `feat`, `fix`, and other notable commits since the last release - Proposes the next semantic version (patch / minor / major based on commit types) -- Updates `Changelog.md` with categorised entries linked to PRs +- Updates `CHANGELOG.md` with categorised entries linked to PRs - Updates `Version.h` with the new version string The Release PR stays open and self-updates as more PRs are merged. When you are ready to cut a release, simply **merge the Release PR**. From 9ad670ba8bdb38fd1270dc44489774432983bf01 Mon Sep 17 00:00:00 2001 From: Andre Stefanov Date: Fri, 15 May 2026 09:32:37 +0200 Subject: [PATCH 6/6] docs: update release process documentation for clarity and consistency --- RELEASE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 254837d9..cd1e0832 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -22,15 +22,15 @@ CI will reject PR titles that do not conform. | Type | Triggers | Example | |------|----------|---------| +| `feat!` or `BREAKING CHANGE:` footer | major version bump | `feat!: remove legacy serial protocol` | | `feat` | minor version bump | `feat: add AZ/ALT steps-per-degree Meade command` | | `fix` | patch version bump | `fix: correct sidereal rate after meridian flip` | -| `feat!` or `BREAKING CHANGE:` footer | major version bump | `feat!: remove legacy serial protocol` | +| `perf` | patch version bump | `perf: reduce interrupt latency in stepper ISR` | | `chore` | no version bump | `chore: update platformio dependencies` | | `docs` | no version bump | `docs: clarify wiring diagram for RAMPS` | | `refactor` | no version bump | `refactor: extract stepper configuration logic` | | `test` | no version bump | `test: add unit tests for DayTime rollover` | | `ci` | no version bump | `ci: update clang-format action version` | -| `perf` | no version bump | `perf: reduce interrupt latency in stepper ISR` | The description becomes the changelog entry, so write it as a user-facing statement of what changed — not what you did internally. @@ -63,8 +63,8 @@ Versions follow [Semantic Versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`) |--------|------| | Breaking change in Meade protocol or configuration | **Major** | | New feature, new board support, new Meade command | **Minor** | -| Bug fix, performance improvement, documentation | **Patch** | -| Chore, CI, refactor, test | **None** | +| Bug fix, performance improvement | **Patch** | +| Chore, CI, refactor, test, docs | **None** | ## CI Checks on Every PR