Development and release
The product implementation lives in davinci/product. The standalone UI is ui/; the existing website is web/. Both import the product gallery component. Archived study scripts and beta tools are separate from the product execution path.
uv sync --extra studies
npm ci
npm run build:ui
uv run pytest -m 'not integration' -q
DAVINCI_INTEGRATION=1 uv run pytest tests/product/test_cad.py -q
npm run build
uv build --no-build-isolation
The static Next.js export is copied into package resources before wheel/sdist generation. Building the wheel is a contributor operation; running it requires no Node.js. Do not include workspace .env, .davinci, public demo assets, or runtime results in release artifacts.
Pytest explicitly adds the checkout root to its import path so archived study tests can import scripts.* with either pytest or python -m pytest. These scripts are not part of the installed product. The separate fresh-environment wheel check runs outside the checkout to verify installed imports.
The API is under /api/v1: tasks, validation, object list/detail, run creation/detail/stop/resume/YAML/events, candidate detail, and artifact access. POST bodies use JSON; run creation and validation receive {"yaml": "..."}. CLI and UI submit through this same path.
Run the product browser checks with npm run test:product. They start a temporary replay workspace and exercise real local geometry. Existing website tests remain under tests/browser and expect the website on port 3215.
Before release, install the wheel in a fresh environment outside the checkout, run all baseline adapters, run replay and continuation tests, inspect the package contents, and verify notices. CI builds wheel and sdist as downloadable artifacts; it does not publish to PyPI or deploy a public website.
Public release requires a final review of third-party solver and dataset redistribution terms, especially XFOIL and the UIUC propeller data. Project code is Apache-2.0; that does not relicense third-party dependencies or measurements.
Use Git commits for coherent changes. Never modify frozen archived evaluator files in place to reinterpret published results. Product adapter updates create new task hashes and new run baselines.
First PyPI release
The existing product.yml workflow tests and builds downloadable artifacts; it does not publish them. A missing PyPI release cannot cause a checkout test to fail to import scripts.
- Get both CI jobs passing for the exact release commit. Complete the redistribution review described in
THIRD_PARTY_NOTICES.md, including the bundled UIUC measurements and solver notices. - Choose an unused release version in
pyproject.tomland updateuv.lockif the version changes. Build the UI, wheel, and source distribution with the commands above. Runuvx twine check dist/*, inspect the archive contents, and install the wheel in a clean Python 3.11 environment outside the checkout. Exercise the localhost UI, packaged docs, and a replay CAD run. Check that the source distribution can rebuild a wheel with the bundled UI. - Create PyPI and TestPyPI accounts and configure two-factor authentication. Configure a pending Trusted Publisher for package
da-vinci-harness, GitHub ownerCobeml, repositoryDa-Vinci, proposed workflow filenamerelease.yml, and environmentpypi(ortestpypifor TestPyPI). A pending publisher does not reserve the package name. See creating a project with Trusted Publishing. - Add
.github/workflows/release.ymlwith a release or manual trigger, build/test gates, and separate publishing jobs. Configure matching GitHub environments. Give only the publishing jobsid-token: write; usepypa/gh-action-pypi-publish@release/v1to upload the tested artifacts. No long-lived PyPI API key is needed. See the PyPI publishing setup. - Publish to TestPyPI first using
repository-url: https://test.pypi.org/legacy/. Install that exact test artifact in a fresh environment, obtain its dependencies from normal PyPI, and repeat the installed-package smoke check. Then publish the same tested distributions to PyPI. See packaging and TestPyPI verification. - Verify
pip install da-vinci-harness==<version>from PyPI and thedavincicommand, then update the installation docs and README with the published version.
The publishing workflow and account setup above are future release steps; they are not enabled by the current CI workflow.