README.md— what this package is, install, quickstartdocs/architecture.md— module boundaries and how a new platform plugs indocs/security.md— token handling rules
# bash
git clone https://github.com/simtabi/release-kit
cd release-kit
uv venv && source .venv/bin/activate
uv pip install -e '.[dev,all]'
pre-commit install
make test
make lintAll four (pytest, ruff, mypy, pre-commit) must be green on every PR. CI runs the same on Linux + macOS + Windows × Python 3.11 / 3.12 / 3.13.
- One class per platform. New AI-agent target adds a class to
src/release_kit/platforms/registries/orsrc/release_kit/platforms/git_hosts/and registers it inpyproject.toml::[project.entry-points."release_kit.platforms"]. - No simtabi-specific defaults. The package is generic. Every URL, namespace, env-var name is config-driven.
- Dry-run is the master safety. Any operation that mutates an
external service defaults to dry-run;
--apply(orapply=Truein the fluent API) is required to mutate. - Token resolution chain, in order: explicit param → env var →
.env→ OS keyring → fail. Never silently fall back from OIDC to a long-lived token without--allow-token-auth. - No shell strings. Every subprocess invocation uses
subprocess.run([...], shell=False). Noshell=True. No string-interpolating user input. - TLS verification on. No
verify=Falseanywhere. - No global state. Every config flows through explicit parameters; no module-level singletons.
mypy --strictclean. PreferSelfover forward-string types.ruffclean with the selected ruleset.- Tests live in
tests/mirroring the source tree. - Every public class + method has a Laravel-style docblock:
def publish(self, *, dry_run: bool = True) -> "PublishResult": """ Publish the configured artifacts to all selected targets. Iterates each registered target, runs preflight, then executes the upload. Aborts on the first failure unless ``continue_on_error`` is set. @param dry_run When True, no network calls are made. @return PublishResult Aggregated per-target outcome. @throws AuthenticationError When credentials are invalid. """
- Conventional Commits (
feat:,fix:,docs:,chore:,refactor:). - Imperative subject ≤ 72 chars.
- Body explains the why, not the what.
- No emoji, no
Co-Authored-Bytrailers. - AI-tells (
leverage,seamless,essentially,note that,simply,,comprehensive,robust,delve into,let's dive) are blocked.
- Implement the class under
src/release_kit/platforms/registries/orgit_hosts/, subclassingRegistryorGitHost(seeplatforms/base.py). - Set
automation_levelandsupported_auth_methodsas class attributes. - Register in
pyproject.toml:[project.entry-points."release_kit.platforms"] my-platform = "release_kit.platforms.registries.my_platform:MyPlatform"
- Add unit tests under
tests/platforms/registries/. - Add the platform's playbook page under
docs/playbook/registries/(template indocs/playbook/README.md). - Add a thin per-package doc at
docs/platforms/<name>.mdthat links to the playbook.
Issues at https://github.com/simtabi/release-kit/issues. Include:
release-kit --version- Python version + OS
- Minimum reproduction (config + command + output)
See SECURITY.md. Don't open a public issue.