diff --git a/CLAUDE.md b/CLAUDE.md index 4688af1..03ce682 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -117,6 +117,15 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal root are never moved; the new path syncs cross-machine via the `location` newest-wins merge in `conflict_resolver`). Nothing else may move or rewrite music files. The library JSON is the source of truth for everything else. +- **Versioning & self-update:** `__version__` in `lintunes/__init__.py` is + the single source of truth (`setup.py` regex-reads it, never imports the + package). Claude bumps minor for feature rounds and patch for fix-only + rounds as part of each round's final commit; trav decides major bumps. The + status-bar version button (`gui/version_button.py` + `lintunes/updater.py`) + checks `origin` shortly after launch and every 4 h, and a click runs + `git pull --ff-only` then re-execs the app — pushing `master` is + effectively releasing to the other machines (a new pip dependency still + needs a manual `pip install -e .` there). - `scripts/` holds one-off maintenance tools (`audit_artwork.py`, `recover_artwork.py`, `clear_computed_ratings.py`) run manually against a data dir; most default to dry-run and need `--write` to mutate files. diff --git a/TASKS.md b/TASKS.md index 487b78b..02d00ab 100644 --- a/TASKS.md +++ b/TASKS.md @@ -3,7 +3,44 @@ Legend: `[ ]` todo · `[~]` in progress · `[x]` done. When a round closes, move its finished items to `tasks-done.md`. -## Round 18 (current) — the 2026-07-02 backlog batch +## Round 19 (current) — version display, git self-update, BPM fix + +Plan reference: `~/.claude/plans/some-fixes-features-for-lintues-merry-journal.md`. +Tests land in `tests/test_round19.py`. First versioned release: **0.1.0**. + +- [x] Version number bottom-left in the status bar: `__version__` in + `lintunes/__init__.py` is the single source of truth (setup.py + regex-reads it); shown by the new `gui/version_button.py`; tooltip + carries the git short hash so two machines on the same version but + different commits are distinguishable. +- [x] Git self-update: new `lintunes/updater.py` fetches upstream ~10 s + after launch and every 4 h (daemon threads, lastfm.py pattern). Commits + behind → a `*` on the version button; click → confirm dialog → + `git pull --ff-only` → clean quit (flush + player shutdown) → + `os.execv` relaunch on the new code (positional file args stripped so + they don't re-import). Pull failures (offline / conflicting local + edits) surface in the status bar and leave the running app untouched. + Not a git checkout / no upstream → button is just a static label. + Limitation: a round that adds a pip dependency still needs a manual + `pip install -e .` per machine. Pushing `master` is now effectively + "releasing" to the other machines. +- [x] Status-bar bug found while verifying: the totals label was added with + `addPermanentWidget(…, stretch=1)`, which squeezed the transient + message area to zero width — every `showMessage` (scrobbles, tag-write + errors, import status, sync notices) has been invisible since the + label landed in Round 5. Both readouts are now non-permanent widgets: + a transient message temporarily replaces them, then they return. +- [x] BPM tap button: whole-session averaging — removed the 8-tap rolling + window in `tap_tempo.py` (trav's "no rhythm" suspicion was the window, + not him). All taps since the session started are averaged; a >2.5 s + gap still begins a new session. Verified live under Xvfb: 8 fast + + 8 slow taps read the blended overall average, not just the recent 8. +- [ ] **verify by eye in the running app**: version reads bottom-left; + after the next `git push`, machine 2 shows the `*` within ~10 s of + launch and click-to-update pulls + restarts; tap out a real song's + BPM and sanity-check the number. + +## Round 18 — the 2026-07-02 backlog batch Plan reference: `~/.claude/plans/can-you-knock-out-synthetic-horizon.md`. Tests land in `tests/test_round18.py`. (The equalizer backlog item moved to