sharness.ai / the CLI

The CLI: sharness-ai

A Python package, sharness-ai, that will carry the SHarness launcher and components. Its command is sharness-ai. Source: SHarness-AI/SHarness-AI__CLI.

Install & use

$ pip install sharness-ai
$ sharness-ai --version
sharness-ai v0.1.0
$ sharness-ai
usage: sharness-ai [-h] [--version]

Requires Python 3.11 or later. No runtime dependencies. The release shown is the first one, as of 24 Oct 2026.

What it does today: report its version and print its help. That is the whole surface of the first release. It exists to claim the name, prove the release pipeline end to end, and give the design a place to be built.

Why sharness-ai, not sharness

Plain sharness is the Debian, pkgsrc and OpenBSD package name of an unrelated shell test library, so SHarness does not use it as a command. sharness-ai matches the PyPI distribution. The first release, v0.1.0, also installed a sharness shorthand; it is removed on the CLI's dev branch and goes with the next release. Environment variables will use the prefix SHARNESS_AI_ (proposed).

Where the version lives

One file owns it: sharness_ai/version. sharness-ai --version reads that file at import time; CI writes it, together with the version in pyproject.toml, on every release. The same convention as sgit.

How it is released

Day-to-day work lands on dev, the default branch. Merging dev into main cuts a release: every push to main runs .github/workflows/workflow.yml in the CLI repository:

JobWhat it does
Run Unit Testspytest tests/unit with coverage. A failure stops the release.
Increment TagBumps the middle number (v0.N.0 → v0.N+1.0), writes it to the version file, pyproject.toml and the README badge, commits, and tags.
Publish to: PYPIBuilds with Poetry and uploads with twine through Trusted Publishing: GitHub's OIDC token is exchanged for a short-lived PyPI token, so no API key is stored anywhere.
Why one workflow file: PyPI's trusted publisher for sharness-ai is bound to the repository and the workflow filename (workflow.yml). The publish job therefore lives in that file, not in a reusable workflow it calls. Renaming the file breaks publishing until the PyPI configuration is updated to match.