Build artifacts
The three Python distributions use Hatchling and share one explicit Conda recipe:
pixi run -e build release-build-python # three wheels under dist/pypi/<runtime|tools|kit>/pixi run -e build release-build-python --scope tools # one distributionpixi run -e bun bun run --filter qgis-sdk-python build # wheels + the Conda outputs (needs rattler-build)release.py build-python writes one directory per distribution and checks every wheel with Twine; release.yml publishes each directory from its own step. The recipe builds qgis-sdk-runtime, qgis-sdk-tools and qgis-sdk under dist/conda/; only the outputs a tag’s scope ships are uploaded.
Release scopes, tags and the pins a release moves
Section titled “Release scopes, tags and the pins a release moves”One tag releases one scope; release.py classify --scoped turns the tag
into the flags release.yml gates its jobs on, stamp --scope <s> moves
every manifest of that scope and verify-versions --scope <s> refuses a
release whose manifests disagree.
| Scope | Tag prefix | Stamps | Publishes |
|---|---|---|---|
python |
python-v |
the kit, runtime and tools pyproject.toml, the recipe contexts, the kit pins, the example’s windows |
three wheels (PyPI), three Conda outputs (prefix.dev) |
runtime, tools |
runtime-v, tools-v |
that distribution alone (the tools’ runtime range follows the runtime at HEAD) | its wheel and Conda output |
typescript |
ts-v |
packages/qgis-sdk-typescript/package.json, the qgis-sdk alias and its exact pin, SDK_NPM_VERSION in scaffold/web.py |
@archont561/qgis-sdk and qgis-sdk (npm, GitHub Packages for the scoped name) |
ui |
ui-v |
packages/qgis-sdk-ui/package.json, the qgis-sdk-ui alias (packages/qgis-sdk-ui-alias) and its exact pin, UI_NPM_VERSION in scaffold/web.py |
@archont561/qgis-sdk-ui and qgis-sdk-ui (npm, GitHub Packages for the scoped name) |
all |
v |
everything the python and typescript scopes stamp; never the ui train |
both |
The ui train (decision-47, TASK-110) is deliberate: plan never picks it
up from an alignment release, detect_scope_from_files reports ui only
when the components or their alias are the one package that changed, and
verify-versions --scope ui additionally refuses a peer range on
@archont561/qgis-sdk that excludes the bridge at HEAD. release.yml’s
ui job builds the bridge and the components, runs npm pack --dry-run
and fails when the tarball holds anything but dist/, package.json,
README.md and LICENSE, packs the alias, installs the pair from the
tarballs next to the bridge built in the same run and checks the alias
mirrors the scoped exports and @imports the scoped stylesheets, then
publishes the scoped package and the alias after it under trusted
publishing. After the ui job succeeds, github-packages-ui publishes the
same qualified scoped tarball to GitHub Packages; the unscoped alias remains
npm-only. An -rc.N tag dry-runs the npm and GitHub Packages publishes under
the next dist-tag. The GitHub Release waits for the GitHub Packages job as
well as the npm job. The two
scaffold pins are the versions qgis-sdk new writes for a page (decision-41
for the bridge, --ui-dependency for the components), so a tools release
offers the newest of each it was qualified with; the committed pins are
tested to equal the manifests at HEAD.