Skip to content

neo release

Publish releases: a tag, its notes, and downloadable assets.

neo release create v1.2.0 dist/* creates the release as a draft, uploads every file as an asset, then publishes it, so readers never see a release with half its files. If an upload fails, the release stays a draft and the command prints the neo release upload and neo release publish lines that finish it. The tag must already exist in the repository; push it first.

Every verb finds its repository from --repo, else from a checkout remote pointing at this host, else from $NEOSOURCE_REPOSITORY. Every neosource CI job sets that variable, plus NEOSOURCE_API and NEOSOURCE_TOKEN (the job’s own token), and ships neo in its image, so publishing from a tag push is one workflow step: - run: neo release create "$GITHUB_REF_NAME" dist/*.

neo release [OPTIONS] <COMMAND>

Create a release, upload its assets, and publish it.

Three steps in one command: create the release as a draft, upload each file in order (named by its basename), then publish. Every file is checked before anything is sent: it must be a regular file of at most 2 GiB, its basename must be a valid asset name, and no two files may share one. If an upload fails, nothing after it is sent, the release stays a draft (invisible to readers), the command exits 1, and it prints the neo release upload and neo release publish lines that finish the job.

neo release create [OPTIONS] <TAG> [FILES]...
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
<TAG> yes The git tag to release. It must already exist in the repository and point at a commit
<FILES> no Files to upload as assets, in order
--title <TITLE> no Release title. Defaults to none; readers then see the tag
--notes <NOTES> no Release notes, as Markdown
--notes-from <FILE> no Read the release notes from a file, or from stdin with -
--draft no Upload the assets but stop before publishing. Publish later with neo release publish
--prerelease no Mark it a prerelease, so it never resolves as latest
--rolling no Create the repository’s single rolling release: a moving pointer whose assets are replaced in place and which never resolves as latest. It is published at once (a rolling release cannot be a draft), then the assets are uploaded. Creating it again on the same tag is refused; refresh its assets with neo release upload instead
--json no Print the release as JSON, with its assets

Upload assets to an existing release.

The same checks and the same stop-at-first-failure as create. A published release that is not rolling may refuse new assets; the server’s message says so.

neo release upload [OPTIONS] <TAG> <FILES>...
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
<TAG> yes The release’s tag
<FILES> yes Files to upload, in order, each named by its basename
--json no Print the uploaded assets as a JSON array

Publish a draft release

neo release publish [OPTIONS] <TAG>
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
<TAG> yes The draft’s tag
--json no Print the published release as JSON

List releases, newest first.

Drafts are listed only when you can write to the repository.

neo release list [OPTIONS]
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
--json no Print the raw response as JSON

Show one release with its assets

neo release view [OPTIONS] <TAG>
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
<TAG> yes The release’s tag
--json no Print the raw response as JSON

Delete a release and its assets.

The git tag is left alone. Needs a signed-in account with write access; a CI job token cannot delete releases. On a terminal it asks you to type the tag back; anywhere else it refuses and sends nothing unless --yes is given.

neo release delete [OPTIONS] <TAG>
Option Value Required Default Env Values Description
--repo, -R <OWNER/REPO> no <owner>/<repo> or bare <repo>. Inferred from a checkout remote pointing at this host when omitted, else read from $NEOSOURCE_REPOSITORY, which every neosource CI job sets
<TAG> yes The release’s tag
--yes no Delete without asking — required when stdin is not a terminal