VisCommandsvis release

vis release

Per-command reference for the vis release subsystem — what each subcommand does, when to reach for it, and every flag.

vis release

The release subsystem ships package versions, changelogs, git tags, and registry uploads from change files committed alongside your code. The mental model and recipes live in the release guide — this page is the per-command reference.

Unstable. Set release.acknowledgeUnstable: true in vis.config.ts (or VIS_RELEASE_SUPPRESS_UNSTABLE=1) to silence the warning.

Which command do I need?

You want to…Command
Set up vis release for the first timevis release init
Record a version bump for a change you just madevis release add
Auto-generate the change file from your commit historyvis release generate
See what's about to releasevis release status
See just the next version of each packagevis release next-version
Override individual bumps before shippingvis release plan -i
Preview changelog entries without writingvis release changelog
Gate that every changed package has a change filevis release check
Diagnose a broken setupvis release doctor
Apply pending bumps to disk (run locally — rare)vis release version
Publish to npm (run locally — rare)vis release publish
Ship an ephemeral PR preview installvis release snapshot
Enter / exit a prerelease sprint modevis release pre
Manage npm staged-publish recordsvis release stage
Dry-run a configured notification destinationvis release notifications
Run the whole pipeline in CIvis release ci release
Publish snapshots from CI and comment on the PRvis release ci snapshot
Sticky-comment the release plan on a PRvis release ci check
Branch a workflow on whether anything is about to shipvis release ci plan
Get the secrets / permissions checklist for CIvis release ci setup
Keep an open version-PR rebased on its base branchvis release ci rebase-pr

💡 Tip: Most release commands accept --print-config[=debug] to dump the resolved config and exit. Use it when something looks wrong and you want to see exactly what merged config CI sees. The flag is available on every command except init, add, pre, stage, notifications, ci setup, and ci rebase-pr.


vis release init

vis release init [flags]

Scaffold .vis/release/ and migrate from an existing tool when detected.

When to use. Once per repo, after installing @visulima/vis. Re-run with --workflows if you add a new CI provider later.

vis release init
vis release init --from-semantic-release
vis release init --from-changesets
vis release init --fresh
vis release init --dry-run
vis release init --from-semantic-release --apply
vis release init --workflows

What it does

  1. Auto-detects an existing release tool (changesets / semantic-release / multi-semantic-release / bumpy) and copies / converts artefacts.
  2. Creates .vis/release/ with a sample change file and .gitignore entries.
  3. With --workflows, generates a GitHub Actions or GitLab CI workflow for the active provider.

Options

OptionTypeDescription
--from-semantic-releasebooleanForce migration from semantic-release / multi-semantic-release
--from-changesetsbooleanForce migration from changesets
--from-bumpybooleanForce migration from bumpy
--freshbooleanSkip migration; start clean
--dry-runbooleanPrint what would happen without writing files (default for migration runs)
--applybooleanActually perform the migration writes (opt out of the implicit dry-run)
--yes, -ybooleanAuto-confirm prompts (CI-safe)
--workflowsbooleanGenerate CI workflow files for the active provider
--package-manager <name>stringOverride the package manager used in generated workflows (npm / pnpm / yarn / bun)

vis release add

vis release add [flags]

Author a change file — interactive by default, scriptable with --packages.

When to use. Every time you change a package. Run it before committing, and commit the resulting file alongside your code change.

vis release add
vis release add --packages '@scope/cerebro:minor,@scope/string:patch' --message 'Add tab completion'
vis release add --empty
vis release add --name fix-tab-completion
vis release add --from-bot-pr

Options

OptionTypeDescription
--packages <csv>string@scope/a:minor,@scope/b:patch — non-interactive package + bump pairs
--message <text>stringChangelog body
--name <slug>stringFilename slug (default: random animal name)
--emptybooleanAuthor an empty change file (satisfies non-strict check)
--nonebooleanAuthor a none-bump file (acknowledged but no direct bump)
--from-bot-prbooleanInspect the current PR via gh pr view and author a change file from its Dependabot / Renovate title

vis release generate

vis release generate [flags]

Auto-derive a change file from branch commits.

When to use. If you'd rather not hand-write change files. Uses the conventional-commits parser with a path-based fallback for repos that don't enforce them.

vis release generate
vis release generate --from origin/main
vis release generate --dry-run

Options

OptionTypeDescription
--from <ref>stringGit ref to compare against (default: merge-base with release.baseBranch)
--name <slug>stringFilename slug (default: random animal name)
--dry-runbooleanPrint the would-be content without writing
--print-config[=debug]stringPrint the resolved release config and exit

vis release status

vis release status [flags]

Print the pending plan in a human-readable table.

When to use. Anytime you want to check "what's queued up to release?". Safe to run on any branch — read-only.

vis release status
vis release status --json
vis release status --bump major,minor
vis release status --filter '@scope/*'

Options

OptionTypeDescription
--jsonbooleanMachine-readable JSON
--filter <glob>stringFilter by package name (single glob)
--bump <levels>stringFilter by bump level (major,minor,patch)
--channel <name>stringOverride branch-detected channel
--print-config[=debug]stringPrint the resolved release config and exit

vis release next-version

vis release next-version [flags]

Print just the next computed version for each package in the plan. Read-only; no mutations.

When to use. When a downstream script only needs pkg → newVersion and the full status output is too verbose, or when you want to assert a specific package's next version in a hook.

vis release next-version
vis release next-version --package=@scope/a
vis release next-version --json

Options

OptionTypeDescription
--package <name>stringLimit output to a single package
--jsonbooleanEmit a { name: { from, to } } map instead of pretty pkg old -> new lines
--channel <name>stringOverride branch-detected channel
--first-releasebooleanBootstrap mode: preview without registry / tag lookups (matches version --first-release)
--print-config[=debug]stringPrint the resolved release config and exit

vis release plan

vis release plan [flags]

Programmatic plan output and, with --interactive, a walkthrough that lets you override each bump.

When to use. When you need to override a specific bump (e.g. promote a patch to a minor) before CI ships it.

vis release plan                       # JSON
vis release plan --interactive         # Walk each release, accept or override
vis release plan -i --write            # Same, plus persist overrides as a new change file

Options

OptionTypeDescription
--filter <glob>stringFilter by package name
--channel <name>stringOverride branch-detected channel
-i, --interactivebooleanStep through pending releases; accept or override each bump
--writebooleanWith --interactive, write the chosen overrides to .vis/release/<id>.md
--print-config[=debug]stringPrint the resolved release config and exit

vis release changelog

vis release changelog [flags]

Render the would-be changelog entries without writing to disk.

When to use. To preview what the next CHANGELOG.md will look like, or to pipe into release-notes tooling.

vis release changelog
vis release changelog --json
vis release changelog --filter '@scope/*'

Options

OptionTypeDescription
--jsonbooleanEmit ChangelogResult JSON
--filter <glob>stringFilter by package name (CSV)
--channel <name>stringOverride branch-detected channel
--print-config[=debug]stringPrint the resolved release config and exit

vis release check

vis release check [flags]

Verify that pending change files cover the packages that changed.

When to use. As a pre-commit / pre-push hook, or as a CI gate that fails the PR if someone forgot a change file.

vis release check
vis release check --strict             # Every changed package must have its own file
vis release check --hook pre-commit    # Run as a husky hook
vis release check --no-fail            # Warnings only, exit 0

Options

OptionTypeDescription
--strictbooleanRequire every changed package to have its own non-empty change file
--hook <name>stringHook context (pre-commit, pre-push) — affects which file states are counted
--no-failbooleanAlways exit 0; warnings still print to stderr
--print-config[=debug]stringPrint the resolved release config and exit

vis release doctor

vis release doctor [flags]

Run read-only preflight diagnostics: config-loads, workspace-discovered, pm-version, branch-channel, gh-cli-available, oidc-available, and per-package napi-* checks (sidecar platforms + version alignment + optionalDependencies wiring).

When to use. First port of call when something looks broken. Each check is tagged error / warn / info; exits non-zero on any error.

vis release doctor
vis release doctor --json
vis release doctor --first-release

Options

OptionTypeDescription
--jsonbooleanEmit a machine-readable report
--first-releasebooleanBootstrap mode: assert the workspace has no release tags and no package is published
--print-config[=debug]stringPrint the resolved release config and exit

vis release version

vis release version [flags]

Apply the plan to disk: write package.json bumps, rewrite workspace: / catalog: ranges, prepend CHANGELOG.md entries, sync the lockfile, delete consumed change files.

When to use. Rarely run by hand — vis release ci release calls it for you. Run it locally only when you want to inspect the diff before pushing.

vis release version
vis release version --dry-run
vis release version --channel alpha
vis release version --commit
vis release version --first-release    # Greenfield monorepo, no prior tags

Options

OptionTypeDescription
--dry-runbooleanPrint the diff and exit; no writes
--channel <name>stringOverride branch-detected channel
--filter <glob>stringLimit to packages matching the glob (CSV)
--commitbooleanAuto-commit after applying
--check-onlybooleanRun preflight checks (config + workspace + plan) and exit. No mutations.
--first-releasebooleanBootstrap mode: force currentVersionResolver=disk and skip remote tag-collision checks
--print-config[=debug]stringPrint the resolved release config and exit

vis release publish

vis release publish [flags]

Pack each managed package, publish the tarball, create + push git tags, then create GitHub / GitLab releases.

When to use. Rarely run by hand — vis release ci release calls it. Run locally only for emergency manual releases or when recovering from a failed CI run with --resume.

vis release publish
vis release publish --dry-run
vis release publish --tag alpha
vis release publish --filter '@scope/*'
vis release publish --resume

Options

OptionTypeDescription
--dry-runbooleanSkip uploads; print what would happen
--tag <name>stringOverride the npm dist-tag
--filter <glob>stringLimit to packages matching the glob (CSV)
--no-pushbooleanSkip git push --tags after publish
--otp <code>string2FA token
--channel <name>stringOverride branch-detected channel
--resumebooleanResume from a previous run's state file (skips already-published packages)
--check-onlybooleanPreflight checks (config + workspace + plan + auth) and exit. No mutations.
--first-releasebooleanBootstrap mode: force currentVersionResolver=disk and skip remote tag-collision checks
--print-config[=debug]stringPrint the resolved release config and exit

vis release snapshot

vis release snapshot --tag <name> [flags]

Publish ephemeral 0.0.0-<tag>-<sha> versions of every affected package. Defaults to the active npm registry; point at pkg-pr-new or another preview host via --registry or release.snapshot.registry.

When to use. Locally when you want a colleague to try a branch without merging — share the install command and they install it like any other version.

vis release snapshot --tag pr-1234
vis release snapshot --tag canary --filter '@scope/*'
vis release snapshot --tag pr-1234 --dry-run

Options

OptionTypeDescription
--tag <name>stringRequired: dist-tag for the snapshot release
--registry <url>stringOverride the registry (falls back to release.snapshot.registry)
--filter <glob>stringLimit to packages matching the glob (CSV)
--dry-runbooleanPrint what would publish without uploading
--print-config[=debug]stringPrint the resolved release config and exit

vis release pre

vis release pre <enter|exit|status> [flags]

Enter / exit a prerelease sprint mode. Changesets-compatible — while active, every vis release version produces a prerelease bump (1.2.0-alpha.0, 1.2.0-alpha.1, …) instead of the usual stable bump. Independent of channel-derived prerelease handling.

When to use. When you need to sustain an alpha / RC line on a branch where channels don't naturally produce one (e.g. on main for a few weeks while a major feature stabilises).

vis release pre enter alpha     # snapshot every package's version; future bumps are prerelease
vis release pre status          # check whether pre-mode is on / exit-pending / off
vis release pre exit            # mark for exit; the NEXT `version` consolidates + deletes pre.json

# Local triage without auto-committing the tracked pre.json:
vis release pre enter alpha --no-commit
vis release pre exit --no-push

Positional

  • <enter|exit|status> — the action (default: status)
  • <tag> — required for enter; the prerelease tag (e.g. alpha, beta, rc)

Options

OptionTypeDefaultDescription
--no-commitbooleancommitSkip auto-committing pre.json after writing
--no-pushbooleanpushSkip pushing the commit

State lives in .vis/release/pre.json (tracked in git so CI sees the same mode across runs). Auto-committed with [skip ci] on every transition.


vis release stage

vis release stage <list|approve|reject> [stage-ids...] [flags]

List, approve, or reject npm staged-publish records. approve and reject require 2FA on the npm side.

When to use. When you use npm staged publishes (publish-then-promote) and need to confirm a stage from the command line instead of the npm UI. list is also useful for auditing — it merges the local .vis/release/staged.json registry with the live npm staging endpoint.

vis release stage list                          # All staged versions (npm + local registry)
vis release stage list @scope/pkg               # Staged versions for one package
vis release stage list --json                   # Machine-readable
vis release stage approve <stage-id>            # Promote + drain from staged.json, commit + push
vis release stage approve --all                 # Approve every pending stage in staged.json
vis release stage reject <stage-id>             # Permanent — re-stage to retry
vis release stage approve <stage-id> --no-push  # Approve, commit locally, skip the push
vis release stage approve <stage-id> --no-commit # Approve and update registry only

Positional

  • <list|approve|reject> — the action (default: list)
  • <stage-ids...> — one or more stage IDs (only meaningful for approve / reject)

Options

OptionTypeDefaultDescription
--allbooleanApprove every pending stage tracked in .vis/release/staged.json
--filter <name>stringPackage name filter for list
--jsonbooleanEmit machine-readable JSON
--no-commitbooleancommitUpdate staged.json but skip the auto-commit
--no-pushbooleanpushSkip pushing the registry commit to the remote

vis release notifications

vis release notifications test [flags]

Dry-run the configured notification channels (slack / discord / webhook / plugins) with a synthetic release context. Lets operators verify a destination is wired up before relying on it for a real release.

When to use. Once after configuring release.notifications in vis.config.ts, and again whenever you rotate a webhook secret.

vis release notifications test                                  # All configured channels
vis release notifications test --channel=slack                  # Every Slack channel only
vis release notifications test --channel=slack:eng              # The Slack channel with id=eng only
vis release notifications test --custom-context=./fake.json     # Use an operator-supplied context
vis release notifications test --json                           # Machine-readable results

Positional

  • <test> — the action (default: test; only test is implemented today)

Options

OptionTypeDescription
--channel <kind[:id]>stringRestrict dispatch to a single channel kind (slack, discord, webhook) or an id'd channel (slack:eng)
--custom-context <file>stringPath to a JSON file containing a NotificationContext to use instead of the synthetic default
--jsonbooleanEmit machine-readable JSON instead of a per-channel report

Exit 0 iff every dispatched channel succeeded.


vis release ci release

vis release ci release [flags]

The main CI driver. Behaviour depends on the channel's mode:

  • version-pr (default for main / next) — open or update a rolling "Versioned release" PR; publish only when the PR merges.
  • auto-publish (default for alpha / beta) — version + publish inline on every push.

Force the auto-publish path with --auto-publish regardless of channel config.

When to use. In your release workflow's main job step. This is the command CI calls; you almost never invoke it by hand.

vis release ci release
vis release ci release --auto-publish

Options

OptionTypeDescription
--auto-publishbooleanSkip the version-PR; version + publish inline
--branch <name>stringOverride the version-PR branch (default: vis-release/version-packages)
--channel <name>stringOverride branch-detected channel
--first-releasebooleanBootstrap mode: force currentVersionResolver=disk and skip remote tag checks
--print-config[=debug]stringPrint the resolved release config and exit

Tokens

  • GH_TOKEN / GITHUB_TOKEN — comments and reads (default ${{ github.token }}).
  • VIS_GH_TOKEN — force-push the version-PR branch (the default github.token is anti-recursion-locked so it can't trigger downstream workflows).

See the CI guide for end-to-end workflow examples.


vis release ci snapshot

vis release ci snapshot [flags]

Publish snapshots in CI and post a sticky PR comment with the install snippet.

When to use. In a PR workflow. The default tag is pr-<PR_NUMBER>; override only if you want a different naming scheme (e.g. canary for main-targeted PRs).

vis release ci snapshot                # tag defaults to pr-<PR_NUMBER>
vis release ci snapshot --tag canary
vis release ci snapshot --on-close     # Clean up the snapshot when the PR closes (where supported)

Options

OptionTypeDescription
--tag <name>stringOverride the dist-tag (default: pr-<PR_NUMBER>)
--on-closebooleanPR-close cleanup mode — enumerates the closed PR's commit SHAs (via gh api, GitHub-only) and removes their snapshot tags from the registry (when the backend supports DELETE)
--print-config[=debug]stringPrint the resolved release config and exit

vis release ci check

vis release ci check [flags]

Sticky-comment with the pending release plan for the PR. Same logic as vis release check, but posts the result instead of failing the build.

When to use. In a PR workflow when you want reviewers to see what's about to release in a comment rather than just a build status.

vis release ci check
vis release ci check --strict

Options

OptionTypeDescription
--strictbooleanRequire every changed package to be covered by a change file
--no-failbooleanAlways exit 0 (warnings still print)
--print-config[=debug]stringPrint the resolved release config and exit

vis release ci plan

vis release ci plan [flags]

Emit a JSON plan and write { mode, packages, json } to $GITHUB_OUTPUT so downstream workflow steps can gate on whether anything is about to release.

When to use. When you want a workflow step to run only if a release is queued — e.g. preparing release notes, notifying Slack, smoke-testing the bumped packages.

vis release ci plan
- id: plan
  run: pnpm exec vis release ci plan

- if: steps.plan.outputs.packages != ''
  run: pnpm run prepare-release-notes

Options

OptionTypeDescription
--print-config[=debug]stringPrint the resolved release config and exit

vis release ci setup

vis release ci setup

Print the recommended secrets, OIDC trust, and workflow-permission checklist for your detected provider.

When to use. After vis release init --workflows, to make sure the runtime side (secrets in Settings → Secrets, OIDC trust on the npm package page, etc.) is configured.

vis release ci setup

This command takes no flags.


vis release ci rebase-pr

vis release ci rebase-pr [flags]

Fetch base, rebase the version-PR branch on top, and force-push. Idempotent — when the PR branch is already up to date, the command exits 0 without pushing.

When to use. As a scheduled CI job (cron / schedule: trigger) when the version-PR stays open for long periods and other PRs land on the base branch in the meantime. Without periodic rebases the version-PR's diff drifts and eventually merges with unrelated noise.

Rebase conflicts abort cleanly — the working tree is restored and the command exits non-zero. Resolve manually or rerun vis release ci release to recompute the PR from scratch.

vis release ci rebase-pr                       # rebase onto release.baseBranch
vis release ci rebase-pr --base develop        # override base
vis release ci rebase-pr --branch release/version  # override the version-PR branch

Options

OptionTypeDescription
--branch <name>stringOverride the version-PR branch (default: vis-release/version-packages)
--base <name>stringOverride the base branch (default: release.baseBranch)

Where to next

Support

Contribute to our work and keep us going

Community is the heart of open source. The success of our packages wouldn't be possible without the incredible contributions of users, testers, and developers who collaborate with us every day.Want to get involved? Here are some tips on how you can make a meaningful impact on our open source projects.

Ready to help us out?

Be sure to check out the package's contribution guidelines first. They'll walk you through the process on how to properly submit an issue or pull request to our repositories.

Submit a pull request

Found something to improve? Fork the repo, make your changes, and open a PR. We review every contribution and provide feedback to help you get merged.

Good first issues

Simple issues suited for people new to open source development, and often a good place to start working on a package.
View good first issues