Release & readiness coordinator — an AI-first Rust CLI that takes any repository to open-source release quality and cuts releases from it, safely and reproducibly.
ossctl is the deterministic engine behind a family of /oss-* Claude Code skills. It
owns the parts that must be exact and identical for every caller:
ossctl contract show | validate— the single reader/validator of a project'sOSS-RELEASE.mdrelease contract (normalizes, materializes defaults, enforces floors).ossctl facts— deterministic repo-fact detection (ecosystems, packages, CI, tags, maturity).ossctl audit— readiness scoring against the gated core (README + LICENSE + CI) and the tier-scaled canon.ossctl release plan | cut | resume | verify | show | list | abandon— a resumable, journaled, per-ecosystem release-cut state machine with a sealed content-addressed approval plan.ossctl skill | doctor | version— companion-skill installer, self-diagnostics, and the version/schema surface.
The prose /oss-* skills (README/LICENSE authoring, CI, changelog, contributing,
security policy, architecture docs, and the orchestrator) ship bundled with the binary
and are thin callers of it. The binary is the source of truth.
ossctl runs on macOS and Linux (arm64 and x86_64). Pick whichever path fits:
-
Cargo (source build, all platforms) — always current with the latest crates.io release:
cargo install ossctl
-
Homebrew (macOS and Linuxbrew):
brew install jarimustonen/ossctl/ossctl
The current release (v0.1.0) is published to crates.io
and the jarimustonen/ossctl Homebrew tap — so cargo install and brew install are the
always-works paths today.
Prebuilt cross-platform binaries and a one-line shell installer are wired up via cargo-dist and ship with the next tagged release (v0.1.1). From that release on, the binary-download path will be:
curl -LsSf https://github.com/jarimustonen/ossctl/releases/latest/download/ossctl-installer.sh | shand prebuilt archives will be attached to each GitHub Release
for macOS (arm64 / x86_64) and Linux (statically-linked musl, arm64 / x86_64).
Public and shipping. The founding architecture is recorded in
docs/adr/. v0.1.0 is released — on
crates.io (ossctl + ossctl-core), as GitHub
Release v0.1.0, and via
the jarimustonen/ossctl Homebrew tap. See CHANGELOG.md for the
release history.
The /oss-* skills ship inside the binary and pin to its version (§17). Manage them
with ossctl skill:
ossctl skill list # enumerate the bundled catalog
ossctl skill print oss-init # stream one rendered SKILL.md to stdout
ossctl skill install # install the whole catalog (add a NAME to scope to one)skill install dual-homes each skill by default — the same SKILL.md is written
into both agent-runtime homes so it is discoverable whether you drive ossctl
from Claude Code or from pi.dev:
~/.claude/skills/<name>/SKILL.md— Claude Code~/.pi/agent/skills/<name>/SKILL.md— pi.dev (discovered as/skill:<name>)
Narrow the target with --agent:
--agent |
Writes to |
|---|---|
| (omitted) | Claude Code and pi.dev (dual-home — the default) |
claude |
~/.claude/skills only |
pi |
~/.pi/agent/skills only |
codex |
~/.codex/prompts/<name>.md (flat prompt file) |
all |
every known runtime (Claude + pi.dev + Codex) |
Installs are idempotent and version-guarded: a re-install of the same version
re-writes byte-identical content and emits no drift warning, and an on-disk copy
newer than the running binary is refused unless you pass --force (§17). --dest <PATH> overrides the root directory (the per-runtime file shape still applies); when
several selected runtimes share a shape and that root — Claude and pi.dev both write
<name>/SKILL.md — they resolve to the same file, so the write collapses to one
file while the report still lists each requested runtime. The --json envelope
reports one installed[] row per requested target
({name, agent, dest_path, cli_version, schema_version}) — the same field shape as
before; dual-home is additive to that shape, though note the default now writes two
targets (Claude + pi.dev) where it previously wrote one.