Multi-registry publishing automation. One config file, one command, every registry your project needs.
pip install simtabi-release-kit
release-kit init
release-kit doctor # green / amber / red per target
release-kit publish --apply # dry-run is the default- Publishes to package registries: PyPI, npm (+ GitHub Packages, GitLab npm), Docker Hub, GHCR, GitLab Container Registry, AWS ECR, Google Artifact Registry, Azure Container Registry, Homebrew tap, Maven Central, RubyGems, crates.io, NuGet, Packagist.
- Automates git hosts: GitHub.com, GitHub Enterprise (Cloud + Server), GitLab.com, GitLab Self-Managed, Bitbucket Cloud, Bitbucket Data Center, Gitea / Forgejo, Azure DevOps.
- OIDC-first: prefers passwordless trusted publishing.
Refuses to fall back to long-lived tokens without
--allow-token-auth. - Dry-run by default: nothing publishes until
--apply. - Pluggable: third parties register custom platforms via
[project.entry-points."release_kit.platforms"]without forking.
# 1. Install
pip install simtabi-release-kit
# 2. Scaffold a config + .env template
release-kit init
# 3. Verify your credentials and connectivity
release-kit doctor
# 4. Dry-run a publish to selected targets
release-kit publish --target pypi --target ghcr
# 5. For real
release-kit publish --target pypi --target ghcr --applyThis repository ships:
- A reference playbook at
docs/playbook/— 33 markdown files covering every supported registry and git host, following an identical 8-section template. Read it standalone even if you never install the package. - The Python automation package under
src/release_kit/— Typer CLI + config-driven runner + per-platform implementations.
| Version | 0.1.0 |
| Python | ≥ 3.11 |
| Platforms (playbook) | 26 platforms documented |
| Platforms (code) | 25 platforms registered (16 registries + 8 git hosts + 1 sub-class via inheritance) |
| Tests | 158 passing, 76% coverage (gate 70%) |
| Type-check | mypy --strict clean on 47 source files |
Three layers, highest wins:
- CLI flags (
--target pypi --apply) - Environment variables (loaded from
.envin dev; from CI secret store in prod) - JSON config (
release.json, validated against the bundled schema)
Example release.json:
{
"$schema": "./schema/release-kit.schema.json",
"project": {
"name": "my-project",
"version_source": "pyproject.toml"
},
"targets": {
"pypi": { "enabled": true, "auth": "oidc" },
"ghcr": { "enabled": true, "auth": "oidc", "image": "ghcr.io/my-org/my-project" },
"github_release": { "enabled": true, "draft": false, "generate_notes": true }
},
"policies": {
"require_clean_git": true,
"require_tag_match": true,
"continue_on_error": false,
"default_dry_run": true
}
}Full schema: docs/configuration.md.
JSON Schema (machine-readable): src/release_kit/schema/release-kit.schema.json.
| Command | Purpose |
|---|---|
release-kit init |
Scaffold release.json + .env-example in the current dir |
release-kit doctor |
Per-target readiness check (green / amber / red) |
release-kit publish [--target NAME ...] [--apply] |
Run the publish flow |
release-kit bootstrap-repo [--apply] |
Apply topics + branch protection per config |
release-kit verify [--target NAME ...] |
Run each target's verify step to confirm artifacts are live |
release-kit rotate-tokens [--platform SLUG ...] [--list] |
Interactive token rotation helper |
release-kit version |
Print version |
Full reference: docs/cli.md.
docs/playbook/ |
The standalone reference for every supported platform |
docs/architecture.md |
How the package is laid out + extension points |
docs/configuration.md |
Full JSON config schema |
docs/cli.md |
Every command, every flag |
docs/security.md |
Token handling, OIDC, rotation cadence |
docs/workflows/ |
End-to-end how-tos (first publish, CI release, OIDC bootstrap) |
docs/recipes/ |
Copy-pasteable example configs |
docs/troubleshooting.md |
Symptom → cause → fix |
Simtabi LLC · MIT license · contributions welcome.