.gitea/workflows/publish.yml triggered only on push: tags: v*, and the repo has zero tags. Merging to main never created a tag, so the publish workflow never ran and no package was ever built. The build/publish steps and the REGISTRY_TOKEN + github.actor credentials were already proven working by docker.yml, which pushes images to the same Gitea registry.
Changes
ci: — rewrite publish.yml to publish on merge
Trigger changed from v* tags to push on dev and main.
dev push → aegis-gitea-mcp-dev at X.Y.Z.dev<run_number> (CI run number is monotonic, so every dev build is unique).
main push → stable aegis-gitea-mcp at X.Y.Z. Uses uv publish --check-url, so a main push that did not bump the version is a clean no-op (already-published files are skipped) instead of a hard 409.
Package name + version are patched into pyproject.tomlat build time only — the committed file keeps aegis-gitea-mcp / 0.2.0.
Lint + test gates still run before publish; REGISTRY_TOKEN is required (fail-closed) so the job never publishes anonymously.
docs: — document both channels
docs/packaging.md now describes the stable vs dev channels, install commands for each, that both ship the same aegis_gitea_mcp module (install one or the other per environment), and the merge-driven release flow (bump version → PR into dev → promote dev → main).
Verified locally
uv build produces both wheel + sdist.
Committed pyproject.toml still parses; name/version unchanged.
CI sed-patch dry-run yields valid TOML.
publish.yml parses as YAML.
ruff check src tests clean; pytest green at 84% coverage (>80% gate).
Deviations
None. No astral-sh/setup-uv@v5 fallback was needed (kept as-is, consistent with docker.yml's use of third-party actions).
After merge
Merging this into dev is itself the test — it should publish aegis-gitea-mcp-dev 0.2.0.dev<run> to the Gitea package registry. Stable aegis-gitea-mcp appears once dev is promoted to main. Pre-flight: a runner with the ubuntu-latest label must be online and the REGISTRY_TOKEN secret's owning user must match github.actor on dev/main pushes.
## Root cause
`.gitea/workflows/publish.yml` triggered only on `push: tags: v*`, and the repo has **zero tags**. Merging to `main` never created a tag, so the publish workflow never ran and no package was ever built. The build/publish steps and the `REGISTRY_TOKEN` + `github.actor` credentials were already proven working by `docker.yml`, which pushes images to the same Gitea registry.
## Changes
**`ci:` — rewrite publish.yml to publish on merge**
- Trigger changed from `v*` tags to `push` on `dev` and `main`.
- `dev` push → `aegis-gitea-mcp-dev` at `X.Y.Z.dev<run_number>` (CI run number is monotonic, so every dev build is unique).
- `main` push → stable `aegis-gitea-mcp` at `X.Y.Z`. Uses `uv publish --check-url`, so a `main` push that did **not** bump the version is a clean no-op (already-published files are skipped) instead of a hard 409.
- Package name + version are patched into `pyproject.toml` **at build time only** — the committed file keeps `aegis-gitea-mcp` / `0.2.0`.
- Lint + test gates still run before publish; `REGISTRY_TOKEN` is required (fail-closed) so the job never publishes anonymously.
**`docs:` — document both channels**
- `docs/packaging.md` now describes the stable vs dev channels, install commands for each, that both ship the same `aegis_gitea_mcp` module (install one or the other per environment), and the merge-driven release flow (bump version → PR into `dev` → promote `dev` → `main`).
## Verified locally
- `uv build` produces both wheel + sdist.
- Committed `pyproject.toml` still parses; name/version unchanged.
- CI sed-patch dry-run yields valid TOML.
- `publish.yml` parses as YAML.
- `ruff check src tests` clean; `pytest` green at 84% coverage (>80% gate).
## Deviations
None. No `astral-sh/setup-uv@v5` fallback was needed (kept as-is, consistent with docker.yml's use of third-party actions).
## After merge
Merging this into `dev` is itself the test — it should publish `aegis-gitea-mcp-dev 0.2.0.dev<run>` to the Gitea package registry. Stable `aegis-gitea-mcp` appears once `dev` is promoted to `main`. Pre-flight: a runner with the `ubuntu-latest` label must be online and the `REGISTRY_TOKEN` secret's owning user must match `github.actor` on dev/main pushes.
Replace the tag-only publish trigger (no v* tags ever existed, so the
package was never built) with branch-push publishing:
- dev push -> aegis-gitea-mcp-dev at X.Y.Z.dev<run_number> (always unique)
- main push -> aegis-gitea-mcp at X.Y.Z, a clean no-op via uv --check-url
if that version is already in the registry
Name + version are patched into pyproject.toml at build time only; the
committed file keeps aegis-gitea-mcp / X.Y.Z. Lint + test gates still run
before publish, and the REGISTRY_TOKEN secret is required (fail-closed).
Document the two publish channels (aegis-gitea-mcp from main,
aegis-gitea-mcp-dev from dev), install commands for each, that both share
the aegis_gitea_mcp module so only one installs per environment, and the
merge-driven stable release flow (bump version -> PR into dev -> promote
dev to main; re-pushing main at the same version is a --check-url no-op).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Root cause
.gitea/workflows/publish.ymltriggered only onpush: tags: v*, and the repo has zero tags. Merging tomainnever created a tag, so the publish workflow never ran and no package was ever built. The build/publish steps and theREGISTRY_TOKEN+github.actorcredentials were already proven working bydocker.yml, which pushes images to the same Gitea registry.Changes
ci:— rewrite publish.yml to publish on mergev*tags topushondevandmain.devpush →aegis-gitea-mcp-devatX.Y.Z.dev<run_number>(CI run number is monotonic, so every dev build is unique).mainpush → stableaegis-gitea-mcpatX.Y.Z. Usesuv publish --check-url, so amainpush that did not bump the version is a clean no-op (already-published files are skipped) instead of a hard 409.pyproject.tomlat build time only — the committed file keepsaegis-gitea-mcp/0.2.0.REGISTRY_TOKENis required (fail-closed) so the job never publishes anonymously.docs:— document both channelsdocs/packaging.mdnow describes the stable vs dev channels, install commands for each, that both ship the sameaegis_gitea_mcpmodule (install one or the other per environment), and the merge-driven release flow (bump version → PR intodev→ promotedev→main).Verified locally
uv buildproduces both wheel + sdist.pyproject.tomlstill parses; name/version unchanged.publish.ymlparses as YAML.ruff check src testsclean;pytestgreen at 84% coverage (>80% gate).Deviations
None. No
astral-sh/setup-uv@v5fallback was needed (kept as-is, consistent with docker.yml's use of third-party actions).After merge
Merging this into
devis itself the test — it should publishaegis-gitea-mcp-dev 0.2.0.dev<run>to the Gitea package registry. Stableaegis-gitea-mcpappears oncedevis promoted tomain. Pre-flight: a runner with theubuntu-latestlabel must be online and theREGISTRY_TOKENsecret's owning user must matchgithub.actoron dev/main pushes.