Skip to main content

One-shot multi-registry release publisher for OSS packages (Python port of @p-vbordei/agent-publish)

Project description

agent-publish (Python)

CI Spec License

Idiomatic Python port of @p-vbordei/agent-publish (npm v0.1.2). One-shot multi-registry release publisher for OSS packages. Reads a strict publish.yaml, runs prechecks (clean tree, tag exists, version match), invokes npm publish and gh release create, and emits a canonical (RFC 8785 JCS) JSON release manifest.

What's in the box

  • load_publish_config(path) — strict YAML schema for publish.yaml
  • precheck(cwd, version, *, from_tag=None) — clean tree, tag exists, version match
  • build_manifest(...) + canonical_manifest_bytes(...) — JCS-canonical release manifest
  • npm_publish(...) / github_release(...) — registry adapters
  • CLI: agent-publish manifest | publish [--dry-run] [--from-tag vX.Y.Z]
  • SpawnFn callable injection — tests stub npm / gh without real network

Install

pip install agent-publish

(Python 3.10+.)

Quickstart

# In a tagged repo with package.json + CHANGELOG.md + publish.yaml:
agent-publish manifest               # preview the JSON release manifest
agent-publish publish --dry-run      # full flow, no network writes
agent-publish publish                # real: npm + GH release + manifest

Library example

The runnable version is examples/quickstart.py. It builds a manifest in memory, stubs npm via SpawnFn so nothing hits the network, and prints the canonical JCS bytes:

$ python examples/quickstart.py
{"registries":[{"name":"npm","package":"agent-id","provenance":true,"sha256":"sha512-Ki1ScEwgQ8K0bV2W9k7CWnHFq2x8K3T8sZ3X7K0Ld5g=","url":"https://www.npmjs.com/package/agent-id/v/0.1.0","version":"0.1.0"}],"repo":"p-vbordei/agent-id","schema":"agent-publish/release-manifest/v1","tagged_at":"2025-01-01T00:00:00.000Z","version":"0.1.0"}

Keys are RFC 8785-sorted, no whitespace — byte-identical to the TS and Rust ports on the same input.

How it relates

Repo Language Status
agent-publish TypeScript / Bun (reference) @p-vbordei/agent-publish v0.1.2
agent-publish-py Python (this repo) v0.1.0
agent-publish-rs Rust v0.1.0

All three pass the same C1–C5 conformance clauses on the same fixtures.

Conformance

uv sync --extra dev
uv run pytest -v
  • C1 — manifest JCS bytes are deterministic and byte-identical across ports.
  • C2publish --dry-run performs zero network writes (verified via stubbed SpawnFn).
  • C3 — partial registry failure still emits a manifest with successful results recorded; exit code 3.
  • C4 — manifest matches the v1 schema (schema, version, repo, tagged_at, registries[]).
  • C5publish.yaml rejects unknown keys, missing required fields, and invalid types.

Plus S1–S5 security checks (token leakage, command injection, .npmrc permissions, env scrubbing, dirty-tree guard) embedded in tests/security/.

Architecture

See docs/architecture.md for the module map, dependency choices, and the SpawnFn injection pattern.

Development

git clone https://github.com/p-vbordei/agent-publish-py
cd agent-publish-py
uv sync --extra dev
uv run pytest
uv run python examples/quickstart.py

See CONTRIBUTING.md and CHANGELOG.md.

License

Apache-2.0 — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_publish-0.1.0.tar.gz (40.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_publish-0.1.0-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file agent_publish-0.1.0.tar.gz.

File metadata

  • Download URL: agent_publish-0.1.0.tar.gz
  • Upload date:
  • Size: 40.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_publish-0.1.0.tar.gz
Algorithm Hash digest
SHA256 51553c0fa27079c66d2a83f8c0b0c177534e5609c4bbc156ae24595319a9f8d5
MD5 12dd9ba4fea8ac807845c781d48f8a6e
BLAKE2b-256 fb92152b0f0dc5109e33b8c453196a1cc8a0ad9d4ddf301c62ead1bbbb8ed5dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_publish-0.1.0.tar.gz:

Publisher: publish.yml on p-vbordei/agent-publish-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_publish-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: agent_publish-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 17.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_publish-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8a87ce05c3284f0873f8ba444c4c27837e3a644a83bf98c1151d77b6461f2b8c
MD5 debdc76d55b37a7b407548d99e734547
BLAKE2b-256 14d1820412b20a50aeb32e4c844cc89c75055d782b354dfde4f91724f510bcaa

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_publish-0.1.0-py3-none-any.whl:

Publisher: publish.yml on p-vbordei/agent-publish-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page