Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b1e6974
chore: scaffold macOS Python package and archive Linux sources
Apr 9, 2026
68a9d29
chore: clarify stub messages in linkbridge/__main__.py
Apr 9, 2026
d735bfc
feat(settings): add JSON-backed settings store with corrupt-file reco…
Apr 9, 2026
e7fcbb6
fix(settings): handle non-dict JSON and coerce last_device type
Apr 9, 2026
de8ffd1
feat(midi_output): add list/open helpers around mido CoreMIDI ports
Apr 9, 2026
4b8d7fb
test(midi_output): hoist pytest import and assert list type
Apr 9, 2026
0575620
feat(clock_engine): add ClockState shared dataclass with tick_interva…
Apr 9, 2026
aab0bcb
fix(clock_engine): reject non-positive BPM and modernize Optional syntax
Apr 9, 2026
12410ca
feat(clock_engine): implement 24ppqn clock thread with transport sync
Apr 9, 2026
6403e80
refactor(clock_engine): use threading.Event for running flag and fix …
Apr 9, 2026
e67c35c
feat(link_monitor): add aalink callback-based tempo/transport monitor
Apr 9, 2026
41a9fc2
fix(link_monitor): clear _ready on restart, guard tempo callback, log…
Apr 9, 2026
df56f65
feat(app): add rumps menu bar UI with device picker and start/stop to…
Apr 9, 2026
bb1b24e
feat(main): wire Settings, MidiOutput, ClockEngine, LinkMonitor, Menu…
Apr 9, 2026
1fdd329
fix(main): wrap app.run() in try/finally and clarify device fallback …
Apr 9, 2026
6a8c1a3
fix(app): guard device submenu clear() against rumps lazy NSMenu
Apr 9, 2026
d448304
feat(build): add py2app setup and build_app.sh for LinkBridge.app bundle
Apr 9, 2026
fa3d60d
fix(build): correct aalink classification, exclude tkinter, set min m…
Apr 9, 2026
1d92564
feat(build): add app icon and local network permission message
Apr 9, 2026
6b93bb1
docs: rewrite README for macOS menu bar port
Apr 9, 2026
b5da70e
ci: add macOS test and release workflows
Apr 9, 2026
0404ebd
ci: trigger releases via workflow_dispatch with version bump
Apr 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: release

# Trigger model: this workflow is triggered ONLY by manual dispatch.
# Click "Run workflow" in the Actions tab on GitHub.com (or run
# `gh workflow run release.yml -f version=2.0.1`
# from the CLI), enter the new version, and the workflow will:
# 1. Bump version files
# 2. Commit + tag + push to main
# 3. Run the test suite
# 4. Build LinkBridge.app
# 5. Package as a zip with ditto
# 6. Create a draft GitHub Release with auto-generated notes
on:
workflow_dispatch:
inputs:
version:
description: 'New version (e.g. 2.0.1, 2.1.0). Do NOT prefix with "v".'
required: true
type: string

permissions:
contents: write

jobs:
release:
runs-on: macos-latest

steps:
- name: Checkout main
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0 # full history so auto-generated release notes can diff against the previous tag

- name: Configure git identity
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Create venv and install dependencies
run: |
python3.11 -m venv venv
venv/bin/pip install --upgrade pip
venv/bin/pip install -r requirements.txt -r requirements-dev.txt

- name: Run tests (sanity check)
run: venv/bin/pytest -v

- name: Bump version files
run: venv/bin/bump-my-version replace --new-version "${{ inputs.version }}"

- name: Show diff after bump
run: git diff

- name: Commit, tag, push
run: |
git add linkbridge/__init__.py setup.py
git commit -m "chore: release v${{ inputs.version }}"
git tag -a "v${{ inputs.version }}" -m "Release v${{ inputs.version }}"
git push origin main
git push origin "v${{ inputs.version }}"

- name: Build LinkBridge.app
run: ./scripts/build_app.sh

- name: Package .app as a zip with ditto
run: |
cd dist
ditto -c -k --keepParent LinkBridge.app "LinkBridge-v${{ inputs.version }}.zip"
ls -la

- name: Create draft GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "v${{ inputs.version }}" \
--repo "${{ github.repository }}" \
--title "LinkBridge v${{ inputs.version }}" \
--generate-notes \
--draft \
"dist/LinkBridge-v${{ inputs.version }}.zip"
28 changes: 28 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: tests

on:
push:
branches: [main]
pull_request:

jobs:
test:
runs-on: macos-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Create venv and install dependencies
run: |
python3.11 -m venv venv
venv/bin/pip install --upgrade pip
venv/bin/pip install -r requirements.txt -r requirements-dev.txt

- name: Run pytest
run: venv/bin/pytest -v
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
*.so
venv/
TODO
TODO
__pycache__/
*.py[cod]
build/
dist/
assets/LinkBridge.iconset/
assets/icon-1024.png
Loading
Loading