Skip to content

fix(release): bundle dashboard assets in published wheels and sdist#142

Merged
pratyush618 merged 5 commits into
masterfrom
fix/release-bundle-dashboard
May 6, 2026
Merged

fix(release): bundle dashboard assets in published wheels and sdist#142
pratyush618 merged 5 commits into
masterfrom
fix/release-bundle-dashboard

Conversation

@pratyush618
Copy link
Copy Markdown
Collaborator

Summary

0.12.0 wheels on PyPI shipped without the compiled dashboard — running taskito dashboard against an installed wheel returns "Dashboard assets not bundled". Two compounding bugs:

  1. Maturin packaging. [tool.maturin].python-source = "py_src" only auto-packages .py/.pyi/py.typed — static SPA assets need explicit opt-in via include. Without it, even local maturin build against a built dashboard tree drops the assets.
  2. Release pipeline. publish.yml ran maturin build directly across 5 wheel/sdist jobs without ever running pnpm --dir dashboard build first. py_src/taskito/static/ is gitignored, so a clean CI checkout had nothing for maturin to package even before bug (1) silently dropped them.

Fix

  • pyproject.toml: explicit include = [{ path = "py_src/taskito/static/dashboard/**/*", format = ["wheel", "sdist"] }] so the dashboard ships in both wheel and sdist.
  • .github/actions/dashboard-build/: composite action — single source of truth for pnpm 10.30.3 / Node 22 / install / tsr generate / vite build / output verification. Consumed by both publish.yml (release) and dashboard.yml (CI), so wheels ship the exact build path CI tests.
  • .github/workflows/publish.yml: new build-dashboard job builds the dashboard once and uploads as artifact. All 5 wheel/sdist jobs needs: it, download the artifact, and run a test -f index.html verification step before invoking maturin. A missing dashboard now fails CI loudly instead of shipping silently.
  • .github/workflows/dashboard.yml: refactored to use the same composite action.
  • Version bump 0.12.0 → 0.12.1, changelog entry.

Local verification

  • Clean rebuild from scratch (rm -rf py_src/taskito/static/dashboard then full pipeline).
  • maturin build --release --features extension-module,postgres,redis,native-async,workflows → wheel contains taskito/static/dashboard/{index.html, assets/*}.
  • maturin sdist → tarball contains the dashboard tree.
  • Wheel installed into a clean throwaway venv: importlib.resources.files('taskito').joinpath('static/dashboard/index.html').is_file()True; StaticAssets.from_package() returns a valid object — the runtime probe at py_src/taskito/dashboard/static.py:106-108 that produced the original error now passes.
  • cargo check --workspace clean across all 4 crates at 0.12.1.

Test plan

  • CI green across the matrix
  • Per-job verification step appears in each wheel/sdist job log and asserts index.html exists
  • After merging and tagging 0.12.1, inspect a published wheel: unzip -l taskito-0.12.1-*.whl | grep static/dashboard shows index.html + assets

`python-source` only auto-packages .py/.pyi/py.typed; static SPA assets
need explicit opt-in. Without this, every wheel since 0.12.0 shipped an
empty static/ and `taskito dashboard` returned "Dashboard assets not
bundled" at runtime.
Adds a composite action consumed by both publish.yml (release) and
dashboard.yml (CI) so pnpm/Node versions and the build pipeline have a
single source of truth. publish.yml gains a build-dashboard job whose
output every wheel/sdist job downloads and checks for index.html before
invoking maturin — a missing dashboard now fails CI loudly instead of
shipping silently.
Removed comments about the dashboard build tooling versions.
Removed comments about the composite action in the dashboard workflow.
@pratyush618 pratyush618 merged commit 976d54c into master May 6, 2026
23 checks passed
@pratyush618 pratyush618 deleted the fix/release-bundle-dashboard branch May 6, 2026 18:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant