fix: ship dashboard assets in evo-hq-cli wheel#13
Merged
alokwhitewolf merged 6 commits intomainfrom Apr 16, 2026
Merged
Conversation
Fixes #12, where GET / returned 404 on installed evo-hq-cli 0.2.1. plugins/evo/pyproject.toml did not declare evo/static/* as package data, so setuptools' packages.find skipped the directory (no __init__.py) and the built wheel omitted index.html, app.js, style.css. dashboard.py resolves STATIC_DIR = Path(__file__).parent / "static", which didn't exist after install; /api/stats worked because it didn't touch the filesystem. Adds a regression guard in ci.yml (cli-wheel-assets job) and publish.yml (publish-cli) that unzips the wheel and fails if any of the three static files is missing.
requires-python was ">=3.12,<3.14", blocking installs on Python 3.14 (released October 2025). Runtime deps are flask>=3.0.0 and pyyaml>=6.0.0; both support 3.14. Upper bounds on published packages propagate into downstream resolvers and need another release to lift. Now ">=3.12", matching sdk/python/pyproject.toml's open-ended style.
plugins/evo/src/evo/*.py uses `from __future__ import annotations` throughout. No tomllib, no pattern-matching match statements, no PEP 695 type aliases, no except*, no typing.Self. Runtime deps flask>=3.0.0 and pyyaml>=6.0.0 support 3.8+. The >=3.12 floor was a declared convention, not a technical requirement. >=3.10 matches sdk/python/pyproject.toml. Both published Python packages now share one floor.
cli-wheel-assets and a new sdk-python job run across ["3.10","3.11","3.12","3.13","3.14"] with fail-fast: false, covering every interpreter declared supported by the two pyprojects. cli-wheel-assets gains a smoke step: pip install the built wheel into a fresh venv, run `evo --version`, then import evo.dashboard and assert evo/static/index.html resolves in the installed layout. Catches #12-class regressions per-interpreter, not just on 3.12. sdk-python builds sdk/python, installs the wheel, and runs sdk/python/test/test_run.py against each interpreter.
sdk/node/package.json declares engines: { node: ">=18" }. Matrix
covers the four LTS lines in the declared range (18 EOL April 2025,
20 EOL April 2026, 22 EOL April 2027, 24 EOL April 2028).
fail-fast: false so one interpreter failing doesn't mask the others.
npm test runs the node --test suite on each.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12, where
evo-hq-cli0.2.1 installed viauv tool installserves/api/statsbut returns 404 at/.plugins/evo/pyproject.tomldid not declareevo/static/*as package data, so setuptools'packages.findskipped the directory (no__init__.py) and the built wheel omittedindex.html,app.js,style.css.dashboard.py:26resolvesSTATIC_DIR = Path(__file__).parent / "static", which doesn't exist after install;send_from_directoryraises at/./api/statsworks because it doesn't touch the filesystem.plugins/evo/pyproject.tomlnow declares:The rebuilt wheel contains
evo/static/{app.js,index.html,style.css}; the sdist contains them undersrc/evo/static/.Regression guard
.github/workflows/ci.ymlgains acli-wheel-assetsjob that buildsplugins/evo/on every PR and unzips the wheel, failing if any of the three static files is missing. Same check runs inpublish.yml'spublish-clijob betweentwine checkandtwine upload, so a broken wheel cannot reach PyPI.Tested
uv buildonplugins/evo/: wheel listsevo/static/app.js(30515 B),evo/static/index.html(4375 B),evo/static/style.css(14529 B).python3.12 -m venv+pip installof the rebuilt wheel, thenevo initon an empty git repo:GET /-> 200,text/html, 4375 BGET /static/app.js-> 200,text/javascript, 30515 BGET /static/style.css-> 200,text/css, 14529 BGET /api/stats-> 200 (unchanged)