ship

Publish reviewed work, optionally update other branches and prepare a versioned release. Publication and release need separate approval.

For a long-running chat, a fresh session can avoid carrying unrelated context. Ship still discovers pending work and verifies the selected source; changing sessions does not waive checks or approvals.

Start the command

ship

Use the prefix for your app or terminal from Setup.

Start on main/master, an established feature or a confirmed environment branch. Commit pending edits first; on main/master, ship can offer a reviewed safe commit.

Flow

flowchart TD
  Start(["Start ship"]) --> Inspect["Review current work, remote state,<br/>existing PRs and release candidates"]
  Inspect --> Special{"Special publication<br/>handoff identified?"}
  Special -->|Archive| Backup["Approve and verify<br/>private archive backup"]
  Backup --> End(["Report verified results<br/>and any pending actions"])
  Special -->|Normalized history| History["Review private evidence;<br/>approve and verify history publication"]
  Special -->|Ordinary work| Source["Approve source publication<br/>or reuse a verified handoff"]
  History --> Targets["Optionally choose and approve<br/>independent branch updates"]
  Source --> Targets
  Targets --> Ready{"Started on main/master<br/>with a ready release?"}
  Ready -->|No or skip| End
  Ready -->|Yes| Release["Review version and notes;<br/>approve the release plan"]
  Release --> Result["Verify checks, then publish tag<br/>or hand off a metadata PR"]
  Result --> End

Publish the current branch

ship-method selects direct or pr, defaulting to pr. Review the changes, destination, checks and deployment effects before publication.

Starting branch direct pr
main/master Push the reviewed tip. Publish a ship/* source and open/reuse its PR into main/master.
Feature Push the feature branch. Push it; choose PR targets afterward.
Environment Push the reviewed tip. Publish a ship/* source and open/reuse its PR into that environment.

Already-published work needs no duplicate push or empty PR. Protection and required checks still apply. Later source pushes update all open PRs using it; merged PRs need a new handoff for further changes.

Optional branch updates

Choose independent targets or None / Finish:

Starting branch Optional targets
main/master Confirmed environments.
Feature main/master and environments.
Environment main/master and other environments.

direct integrates, checks and pushes each target using the permitted merge strategy, defaulting to squash. pr creates/reuses independent handoffs from the same source. Review each target’s delta and effects; there is no automatic main-first chain.

Ship does not wait for reviews, merge PRs or delete branches. You may also request environment updates from a specific published base or release without publishing unrelated work.

Optional versioned release

A release requires ship to start on main/master with ready integrated work. An open code PR must be merged independently before rerunning.

Version proposals follow Semantic Versioning 2.0.0 and actual public compatibility changes. For stable versions, compatible fixes suggest patch, compatible public additions or deprecations minor, and incompatible changes major. Initial versions, 0.x and prereleases need a suitable explicit choice.

Review the version, tag, metadata, notes, destination and checks. Skip release keeps published code intact. If metadata needs a PR, tagging waits for integration; rerun to continue the same candidate.

Required checks must pass. Published tags and versions stay immutable. Interrupted releases verify completed actions before resuming; no unreleased work or pending action means no new release.

Hosted release creation is optional after Git publication. Packages, assets and deployment are separate work.

Publish normalized history

Ship automatically finds normalize’s local recovery pointers, including across terminal or agent sessions in the same clone. It matches and verifies the actual history before publication approval. Multiple rewrites retain separate evidence; ship never simply picks the newest backup. Missing, invalid or ambiguous required evidence prompts for a path or reconciliation. Another clone/machine needs the recovery files transferred.

Fixed remote expectations and --force-with-lease protect the agreed rewrite; a discovered pointer never approves a push, and a PR cannot replace commit IDs.

Existing tags stay fixed. Rewording released history alone does not create a product release.

After publication, ship reports old/new branch tips and guidance for owners to reconcile their local work. It keeps its exact push approval and does not repeat normalize’s team-readiness question or automatically update other clones.

Publish an archive backup

For a prepared archive, approve an existing private destination. Ship verifies the payload backup, then commits and publishes its completion receipt. Cleanup is optional and separately reviewed.

This route ends without ordinary targets or release tags. Interrupted steps are checked before retrying.

Hosting support and your result

GitHub and GitLab have dedicated PR/MR and release support. Other hosts use Git with manual provider handoffs where needed.

The report separates pushes, target updates, PRs, releases and pending checks. Blocked actions preserve earlier successes. Ship returns to the original branch when safe; publication alone does not prove deployment.