Skip to content

chore(packaging): pin venvstacks as dev dep + auto-detect driver#1355

Merged
jundot merged 1 commit into
jundot:mainfrom
popfido:chore/venvstacks-pin
May 27, 2026
Merged

chore(packaging): pin venvstacks as dev dep + auto-detect driver#1355
jundot merged 1 commit into
jundot:mainfrom
popfido:chore/venvstacks-pin

Conversation

@popfido

@popfido popfido commented May 22, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR is raised for the reason someone wants to build App locally.

packaging/build.py currently invokes venvstacks via pipx run venvstacks … in three places. That works, but the version of venvstacks that produces the macOS app bundle is whatever PyPI release happens to be current on a given contributor's machine the day they build — there's no lockfile discipline on the tool that produces the artifact. Two of us can build "the same" commit and get subtly different output if venvstacks shipped a release in between.

This PR pins venvstacks the same way we pin every other dep that affects the bundle:

  • pyproject.toml: venvstacks>=0.7.0 added to both [project.optional-dependencies].dev (pip-managed venvs) and [dependency-groups].dev (PEP 735 / uv sync --dev), matching the existing pair-maintained pattern for pytest/black/ruff.

  • packaging/build.py: a new _venvstacks_driver() helper auto-detects an available driver in priority order:

    1. venvstacks directly on PATH (installed via the dev extra — fastest path, no tool-runner startup overhead)
    2. uvx venvstacks (uv's pipx run equivalent)
    3. pipx run venvstacks (historical default — backwards compatible)

    Exits with an actionable remediation hint when none are present.

  • README.md: updated the macOS build prerequisites paragraph to point at the dev extra as the canonical install path. Translated READMEs intentionally not touched — kept for the next translation-sync pass.

Why this matters

The .app bundle ships to end users is the contract; venvstacks is what produces it. Making the producer reproducible is a small but load-bearing step toward the broader distribution story.

Compatibility

  • pip-only workflows: unchanged. pip install -e ".[dev]" brings venvstacks into the active venv, and the driver-detection helper finds it via the direct-on-PATH branch.
  • pipx-only workflows (status quo): still work via the third fallback — no behavior change for anyone who hasn't switched.
  • uv-only workflows: uv sync --dev installs venvstacks; same direct-on-PATH branch picks it up. uvx venvstacks is also available as a fallback for cases where someone runs build.py outside an active venv.
  • End-user .app: byte-identical. This is purely a build-time-reproducibility + host-dependency-footprint change.

Make the venvstacks version that produces the macOS app bundle
reproducible across contributors by declaring it as a dev dependency
in pyproject.toml. Today `pipx run venvstacks` silently picks up
whatever PyPI release happens to be current on the day a given
contributor builds — two of us can build the same commit and get
subtly different output if venvstacks shipped a release in between.

Changes:

- pyproject.toml: add `venvstacks>=0.7.0` to both
  `[project.optional-dependencies].dev` (pip path) and
  `[dependency-groups].dev` (PEP 735 / uv path), matching the
  existing pair-maintained pattern for pytest/black/etc.

- packaging/build.py: replace the three hardcoded `pipx run venvstacks`
  invocations with a `_venvstacks_driver()` helper that picks
  whichever is available, in priority order:
    1. `venvstacks` directly on PATH (installed via the dev extra)
    2. `uvx venvstacks` (uv's pipx-equivalent)
    3. `pipx run venvstacks` (historical default)
  Bails with an actionable remediation hint when none are present.

- README.md: update the macOS build prerequisites paragraph to point
  at the dev extra as the canonical install path. Translated READMEs
  not touched — kept for Jun's regular translation-sync pass.

End-user `.app` bundle is byte-identical; this is purely a build-time
reproducibility + host-dependency-footprint change. Contributors using
pip-only workflows are unaffected (pip resolves the dev extra and the
direct-on-PATH branch takes over); pipx-only setups remain functional
via the third fallback.
@jundot

jundot commented May 27, 2026

Copy link
Copy Markdown
Owner

Thanks. Pinning the producer alongside everything else it ships removes a real source of "works on my machine" drift, and the three-tier driver fallback keeps the existing pipx workflow working without any contributor churn.

Merging now.

@jundot jundot merged commit 4addb93 into jundot:main May 27, 2026
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 27, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 28, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 28, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 28, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 29, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 29, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
@popfido popfido deleted the chore/venvstacks-pin branch May 29, 2026 10:36
cfbraun added a commit to cfbraun/omlx that referenced this pull request May 30, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 1, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 2, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 2, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 3, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 3, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 5, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 5, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
cfbraun added a commit to cfbraun/omlx that referenced this pull request Jun 6, 2026
After jundot#1355 retired packaging/build.py's .app + DMG pipeline, nothing
in the repo creates a .dmg — apps/omlx-mac/Scripts/build.sh produces
oMLX.app directly. The packaging README still told developers to
"Open the DMG produced by the Swift build", which doesn't exist.

For local builds the .app is sufficient: drag it to /Applications or
open it in-place. No wrapper needed. The Releases DMGs come from a
maintainer-side pipeline not present in this tree; that's a separate
distribution concern and explicitly called out.

Closes jundot#1456.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants