From 500d44e969dc8bb8595910c8c794fdf813403230 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 13:32:04 -0400 Subject: [PATCH 1/8] chore: keep internal design/plan docs out of the public repo Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f4e72dc..c7ba27a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ htmlcov/ # Regenerated by the opencode CLI opencode.json + +# Internal design/plan docs (Spanish, local only — never in the public repo) +/docs/superpowers/ From 6b036e5e5af2dc7485d264e69c89a4b862e03c27 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 14:43:53 -0400 Subject: [PATCH 2/8] build: derive version from git via setuptools-scm --- pyproject.toml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 275ea57..d44584b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openpodgo" -version = "0.1.0" +dynamic = ["version"] description = "Open-source editor for the Line 6 POD Go on Linux (a POD Go Edit clone)" readme = "README.md" requires-python = ">=3.10" @@ -34,7 +34,7 @@ dev = ["pytest>=7"] openpodgo = "openpodgo.app:main" [build-system] -requires = ["setuptools>=61"] +requires = ["setuptools>=61", "setuptools-scm>=8"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] @@ -43,3 +43,9 @@ where = ["src"] [tool.pytest.ini_options] pythonpath = ["src"] testpaths = ["tests"] + +[tool.setuptools_scm] +# Versión derivada de los tags git (vX.Y.Z). Sin tag => versión .devN+g. +version_scheme = "guess-next-dev" +local_scheme = "node-and-date" +fallback_version = "0.0.0" From dcad8c6c0fe35ee2a84ca1347b14af069509df8b Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 14:46:29 -0400 Subject: [PATCH 3/8] ci: add git-cliff config for auto changelog --- cliff.toml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 cliff.toml diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..dddfde8 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,31 @@ +# Config de git-cliff para notas de release de openpodgo. +# Agrupa por el prefijo de scope usado en el repo (catalog:, openpodgo:, docs:, ci:). +[changelog] +header = "" +body = """ +{% for group, commits in commits | group_by(attribute="group") %} +### {{ group }} +{% for commit in commits %} +- {{ commit.message | split(pat="\n") | first | trim }}{% endfor %} +{% endfor %} +""" +trim = true + +[git] +conventional_commits = false +filter_unconventional = false +split_commits = false +commit_parsers = [ + { message = "^catalog", group = "Catálogo" }, + { message = "^openpodgo", group = "Core" }, + { message = "^ui", group = "UI" }, + { message = "^build", group = "Build" }, + { message = "^ci", group = "CI" }, + { message = "^docs", group = "Documentación" }, + { message = "^test", group = "Tests" }, + { message = "^fix", group = "Fixes" }, + { message = ".*", group = "Otros" }, +] +filter_commits = false +tag_pattern = "v[0-9]*" +sort_commits = "newest" From 9f04a163836dfad1583b99b94da1f7c1d73ddd70 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 14:49:38 -0400 Subject: [PATCH 4/8] ci: extract reusable tests workflow; ci.yml runs on PRs only --- .github/workflows/ci.yml | 30 +----------------------------- .github/workflows/tests.yml | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bd6771..de4c00f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,36 +1,8 @@ name: CI on: - push: - branches: [main] pull_request: jobs: test: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - python-version: ["3.10", "3.11", "3.12"] - - steps: - - uses: actions/checkout@v4 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - # PySide6 needs a few native libs to load headlessly (offscreen Qt). - - name: Install Qt runtime libraries - run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 - - - name: Install package - run: pip install -e '.[dev,ui]' - - # The suite is fully offline. No proprietary res/ or captures/ are present - # in CI, so the hardware/resource-dependent tests skip automatically. - - name: Run tests - env: - QT_QPA_PLATFORM: offscreen - run: python -m pytest -q + uses: ./.github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..78059ca --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,37 @@ +name: Tests + +on: + workflow_call: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + # PySide6 needs a few native libs to load headlessly (offscreen Qt). + - name: Install Qt runtime libraries + run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 + + - name: Install package + run: pip install -e '.[dev,ui]' + + # The suite is fully offline. No proprietary res/ or captures/ are present + # in CI, so the hardware/resource-dependent tests skip automatically. + - name: Run tests + env: + QT_QPA_PLATFORM: offscreen + run: python -m pytest -q From 5ff6577b1705bbbfcc2fd49e295b208b5021aa28 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 14:52:28 -0400 Subject: [PATCH 5/8] ci: add release pipeline (rolling latest + stable tags) --- .github/workflows/release.yml | 85 +++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7e03b22 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,85 @@ +name: Release + +on: + push: + branches: [main] + tags: ['v*'] + +permissions: + contents: write + +jobs: + test: + uses: ./.github/workflows/tests.yml + + build: + needs: test + runs-on: ubuntu-latest + outputs: + version: ${{ steps.ver.outputs.version }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Build sdist + wheel + run: | + pip install build + python -m build + + - name: Capture version + id: ver + run: | + pip install setuptools-scm + echo "version=$(python -m setuptools_scm)" >> "$GITHUB_OUTPUT" + + - name: Generate changelog notes + run: | + pip install git-cliff + if [ "${GITHUB_REF_TYPE}" = "tag" ]; then + git-cliff --current -o NOTES.md + else + git-cliff --unreleased -o NOTES.md + fi + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: dist + path: | + dist/* + NOTES.md + + release: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + + - name: Publish stable release (tag) + if: github.ref_type == 'tag' + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.ref_name }} + name: ${{ github.ref_name }} + body_path: NOTES.md + prerelease: false + files: dist/* + + - name: Publish rolling 'latest' (main) + if: github.ref_type == 'branch' + uses: softprops/action-gh-release@v2 + with: + tag_name: latest + name: "latest (nightly del trunk)" + body_path: NOTES.md + prerelease: true + make_latest: false + files: dist/* From 6546ea9532112653cc0ff2460f8a9a5c5c305f36 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 14:59:13 -0400 Subject: [PATCH 6/8] docs: document release download and TBD release runbook Add a Download section to README.md pointing users at the sdist/wheel tarballs attached to GitHub Releases (rolling `latest` vs stable tags), and a Releases (TBD) section to CONTRIBUTING.md describing the trunk-based tagging flow that drives release.yml. --- CONTRIBUTING.md | 20 ++++++++++++++++++++ README.md | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2a62a63..4c00349 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,3 +43,23 @@ USB vendor interface. By contributing you agree that your contributions are licensed under the project's [MIT License](LICENSE). + +## Releases (TBD) + +El proyecto usa Trunk-Based Development. La versión se deriva del git con +setuptools-scm; no se edita a mano. + +- **Cada push a `main`** dispara `release.yml`: corre los tests, arma sdist+wheel + y **pisa** el pre-release rodante `latest` con notas generadas de los commits. +- **Cortar un estable:** desde `main` actualizado, + + ```bash + git tag v0.2.0 + git push origin v0.2.0 + ``` + + El pipeline crea el Release permanente `0.2.0` con sdist+wheel y el changelog + del rango desde el tag anterior. + +El changelog sale de los mensajes de commit (`cliff.toml`); no hay `CHANGELOG.md` +versionado en el repo. diff --git a/README.md b/README.md index b51cb24..9768e6c 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,24 @@ not: Linux. - A POD Go connected over USB - For the UI: a Qt-capable desktop (PySide6 is installed via the `ui` extra) +## Download + +Prebuilt tarballs are attached to each GitHub Release: + +- **Latest (nightly del trunk):** the rolling `latest` pre-release always tracks + the freshest commit on `main`. +- **Estables:** numbered releases (`X.Y.Z`) cut from the trunk. + +Grab `openpodgo-.tar.gz` from +[Releases](https://github.com/agarat/openpodgo/releases) and install it: + +```bash +python3 -m venv .venv && . .venv/bin/activate +pip install "openpodgo-.tar.gz[ui]" # incluye la UI +``` + +Para USB sin sudo, ver la sección "USB access without sudo" más abajo. + ## Install ```bash From e8c05fdcd01cd4b779df35dad3f1a77b9dadc69f Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 15:03:32 -0400 Subject: [PATCH 7/8] docs: translate release download/runbook sections to English --- CONTRIBUTING.md | 21 +++++++++++---------- README.md | 10 +++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4c00349..a2e712c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,22 +44,23 @@ USB vendor interface. By contributing you agree that your contributions are licensed under the project's [MIT License](LICENSE). -## Releases (TBD) +## Releases -El proyecto usa Trunk-Based Development. La versión se deriva del git con -setuptools-scm; no se edita a mano. +The project uses Trunk-Based Development. The version is derived from git with +setuptools-scm; it is never edited by hand. -- **Cada push a `main`** dispara `release.yml`: corre los tests, arma sdist+wheel - y **pisa** el pre-release rodante `latest` con notas generadas de los commits. -- **Cortar un estable:** desde `main` actualizado, +- **Every push to `main`** triggers `release.yml`: it runs the tests, builds the + sdist+wheel, and overwrites the rolling `latest` pre-release with notes + generated from the commits. +- **Cutting a stable release:** from an up-to-date `main`, ```bash git tag v0.2.0 git push origin v0.2.0 ``` - El pipeline crea el Release permanente `0.2.0` con sdist+wheel y el changelog - del rango desde el tag anterior. + The pipeline creates the permanent `0.2.0` Release with the sdist+wheel and the + changelog for the range since the previous tag. -El changelog sale de los mensajes de commit (`cliff.toml`); no hay `CHANGELOG.md` -versionado en el repo. +The changelog comes from commit messages (`cliff.toml`); there is no `CHANGELOG.md` +tracked in the repo. diff --git a/README.md b/README.md index 9768e6c..b229cca 100644 --- a/README.md +++ b/README.md @@ -51,19 +51,19 @@ not: Linux. Prebuilt tarballs are attached to each GitHub Release: -- **Latest (nightly del trunk):** the rolling `latest` pre-release always tracks - the freshest commit on `main`. -- **Estables:** numbered releases (`X.Y.Z`) cut from the trunk. +- **Latest (nightly build of the trunk):** the rolling `latest` pre-release always + tracks the freshest commit on `main`. +- **Stable:** numbered releases (`X.Y.Z`) cut from the trunk. Grab `openpodgo-.tar.gz` from [Releases](https://github.com/agarat/openpodgo/releases) and install it: ```bash python3 -m venv .venv && . .venv/bin/activate -pip install "openpodgo-.tar.gz[ui]" # incluye la UI +pip install "openpodgo-.tar.gz[ui]" # includes the UI ``` -Para USB sin sudo, ver la sección "USB access without sudo" más abajo. +For USB access without sudo, see "USB access without sudo" below. ## Install From b30adcf0c98edfd8662399bacfa6416ef50309c6 Mon Sep 17 00:00:00 2001 From: Arnaldo Garat Date: Wed, 15 Jul 2026 18:32:56 -0400 Subject: [PATCH 8/8] ci: harden release workflow (pin action, move latest tag, concurrency, least-privilege) and tidy cliff config --- .github/workflows/release.yml | 23 +++++++++++------------ cliff.toml | 8 +++++--- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e03b22..353d2c7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,11 @@ on: tags: ['v*'] permissions: - contents: write + contents: read + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false jobs: test: @@ -15,8 +19,6 @@ jobs: build: needs: test runs-on: ubuntu-latest - outputs: - version: ${{ steps.ver.outputs.version }} steps: - uses: actions/checkout@v4 with: @@ -32,12 +34,6 @@ jobs: pip install build python -m build - - name: Capture version - id: ver - run: | - pip install setuptools-scm - echo "version=$(python -m setuptools_scm)" >> "$GITHUB_OUTPUT" - - name: Generate changelog notes run: | pip install git-cliff @@ -58,6 +54,8 @@ jobs: release: needs: build runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/download-artifact@v4 with: @@ -65,7 +63,7 @@ jobs: - name: Publish stable release (tag) if: github.ref_type == 'tag' - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2 with: tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} @@ -75,11 +73,12 @@ jobs: - name: Publish rolling 'latest' (main) if: github.ref_type == 'branch' - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2 with: tag_name: latest - name: "latest (nightly del trunk)" + name: "latest (nightly build of the trunk)" body_path: NOTES.md prerelease: true make_latest: false + target_commitish: ${{ github.sha }} files: dist/* diff --git a/cliff.toml b/cliff.toml index dddfde8..dfa2119 100644 --- a/cliff.toml +++ b/cliff.toml @@ -1,7 +1,10 @@ -# Config de git-cliff para notas de release de openpodgo. -# Agrupa por el prefijo de scope usado en el repo (catalog:, openpodgo:, docs:, ci:). +# git-cliff config for openpodgo's release notes. +# Groups commits by the scope prefix used in this repo (catalog:, openpodgo:, docs:, ci:, ...). [changelog] header = "" +# NOTE: inside this TOML triple-quoted body, a \n is already a literal newline by the +# time Tera parses the template, so split(pat="\n") below splits on real newlines. +# Do not "escape" it to \\n — that would break the first-line truncation. body = """ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group }} @@ -13,7 +16,6 @@ trim = true [git] conventional_commits = false -filter_unconventional = false split_commits = false commit_parsers = [ { message = "^catalog", group = "Catálogo" },