Ship
This skill takes finished work from the working tree to production. It commits in small pieces, pushes, merges, watches checks and confirms the result is live.
Push means push
When the user says push, ship or merge, do every step to the end. Handing a command back to the user is a finding unless it needs their credentials or their approval. A secret in a commit is always
.
Checking the change itself runs in
before this skill starts.
1. Check the tree
Run
and read every changed file. Name any file you did not change in this task and ask before committing it. Committing a stray file is
. Scan the diff for keys, tokens, passwords and
files. A committed secret is
.
2. Commit per change
Make one commit per logical change. One commit for a feature, a fix and a rename is
. Write every message as a Conventional Commit:
in the imperative, lowercase and with no full stop. Use
,
,
,
,
or another standard type, and mark a breaking change with
after the type. A message like "Remove the archive." is
ship-conventional-commits
. In a package that publishes releases, add the changeset with the change. A release-bound change with no changeset is
ship-changeset-for-packages
.
3. Push, merge and tidy
Push the branch. When asked to merge, merge it, delete the branch and switch back to the default branch. A merged branch left behind is
. Open one pull request per bug or feature. A pull request bundling three fixes is
. A pull request that changes UI carries a screenshot. That is
.
4. Watch the checks
Wait for CI and fix what fails. Reporting "pushed" while checks are red or still running is
.
5. Close the loop
When the change fixes an issue, link it, close it and reply where it was raised. A fixed bug with its issue left open is
. When the change deploys, open the live URL or the published version and check it. "Deployed" with no look at production is
.
6. Hand back only what needs the user
Do every step you can run yourself. Ask only for a login, a two-factor code or an approval. Say exactly which. A list of commands for the user to run is
.
The pair
Every check is a pair. The broken line sits beside the line that replaces it.
| Rule | Broken | Replacement |
|---|
| with someone else's file in the tree | The file named, then a question |
| committed | ignored, the secret flagged for rotation |
| One commit for a feature, a fix and a rename | Three commits, one per change |
ship-conventional-commits
| | chore: remove the archive
|
ship-changeset-for-packages
| A package fix with no changeset | The changeset in the same commit |
| Merged, the branch still checked out | Merged, deleted, back on |
| One pull request for three bugs | Three pull requests |
| A UI pull request with no image | A screenshot in the description |
| "Pushed" while CI runs | "Pushed, all checks pass" |
| The fix merged, the issue open | The issue linked, closed and answered |
| "Deployed" | "Live at the production URL, checked" |
| "Run when ready" | Published, or "needs your two-factor code" |
Reporting
Severity. is a committed secret, a stray file committed or a release with failing checks.
is a bundled commit or pull request, an open issue after the fix or steps handed back that could have run.
is a message that is not a Conventional Commit, a missing screenshot or a branch left after merge.
Format. One finding per root cause, citing the step when no file applies:
file:line - [rule-id] what is wrong
step 3 - [rule-id] what is wrong
Then a
summary.
when any
remains,
otherwise. Mark every check you could not watch to the end as
.