release-status
Diagnose the
release-please pipeline and report why a release did or didn't
fire —
read-only. The skill gathers four independent signals via
and
, prints a structured report, and surfaces the remediation for each. It
writes nothing: no commits, no labels, no PR edits, no releases.
Relationship to
This is a
sibling of , not invoked by it.
is the pre-merge
ship flow — it stops at
In Review (opens the PR, transitions the Linear
issue).
picks up
after merge: it inspects the state of
, the release PR, and the tags to explain what the release machinery is
doing. The two never call each other. This skill may reference
in prose
(e.g. "the PR title
composed is the bump signal"), but it never runs it.
What it inspects
| Signal | What it answers | How to read / fix it |
|---|
| Version preview | What bump and version would the merged Conventional-Commit PR titles since the last tag produce? | →minor, //→patch, /→major; //////→none. The strongest wins. means nothing release-triggering has merged since the last tag — no release will cut. |
| Release PR | Is the release-please--branches--main
PR open, and is its required check () green? | If open and green, the orchestrator can squash-merge it. If the check is pending/red, the merge is blocked — chase that check. If none is open, release-please hasn't opened one (often because nothing release-triggering merged, or the pipeline is stalled — see below). |
| Stale | Does the last merged release PR still carry the label? | This is the recurring stall: when a merged release PR keeps that label, release-please aborts the next release and the pipeline silently stops firing. Remediation: remove the label from that PR, then re-run the orchestrator (or wait for its cron tick). |
| Tag-vs-version parity | Does a tag already exist? | This is the version-vs-tag gate. Tag exists → clean no-op (this version is already published). Tag missing → publishing is pending for that version (the gate would run the publish path on the next push). |
Configuration
Four knobs live in
beside this file, vendored from the tracked
template (the runtime
is generated per consumer and is not itself tracked). Read
at the
start of a run and use its values throughout. Edit your copied
to
match the consuming repo.
| Key | Meaning | Default |
|---|
| The trunk release-please releases from. | |
| The branch release-please opens its release PR on. | release-please--branches--main
|
| The exact name (incl. emoji) of the required status check the orchestrator polls before merging the release PR. | |
| The label release-please applies to a release PR while a release is in flight; stale when it lingers on a merged PR. | |
Usage
Run the bundled helper. Its path is
relative to this skill's own directory
(the one holding this
and
) — resolve it from there, not
from the consuming repo's root, or the run fails with
.
Human-readable report — the default:
bash
node scripts/release-status.mjs
Machine-readable JSON — for piping into another step:
bash
node scripts/release-status.mjs --json
Explicit repo — when not run from inside the target checkout:
bash
node scripts/release-status.mjs --repo acme-skunkworks/agent-skills
Self-test — run the bundled offline assertions (no network, no
); a quick
way to confirm the script is healthy after install:
bash
node scripts/release-status.mjs --self-test
(alias
) prints the full usage.
Process
Step 1 — Confirm prerequisites
must pass, and you must be inside (or pass
for) the target
repository. The helper reads the root
version, the local tags, and
queries
for the release PR and merged PRs.
Step 2 — Run the helper and read the four signals
bash
node scripts/release-status.mjs
Read each block in order:
version preview,
release PR,
stale
,
tag-vs-version parity. The helper only fetches and
prints — running it never changes anything.
Step 3 — Interpret and advise (do not act)
Map the signals to a diagnosis. The common shapes:
- "A release should have fired but didn't." Check the stale-pending block
first — a lingering on the last merged release PR is the
usual culprit (release-please aborts). If that's clear, check whether the version
preview is (nothing release-triggering merged) or whether the release PR
is open-but-its-check-is-red (blocked at the gate).
- "What version cuts next?" Read the version-preview block: the bump and the
resulting version. means no release.
- "Is publishing pending?" Read the parity block: a missing tag
means the next push runs the publish path; a present tag means a clean
no-op.
Step 4 — Report, with remediation
Summarise the diagnosis and surface the remediation the helper prints, but
do not perform it — this skill is advisory. For the stale-pending stall, the
fix is to remove the label from the merged release PR and re-run the orchestrator;
state that as the recommended next action and leave it to the human (or a
write-capable skill) to carry out.
Important rules
- Read-only / advisory. Never remove a label, edit a PR, push a tag, or
trigger a release. Gather, diagnose, and recommend — the human or a
write-capable tool acts.
- Not a step. This skill is never invoked by and never
invokes it. It inspects post-merge ; stops at In Review.
- Evidence, not guesses. Report what the helper actually returned. If
fails (auth, rate limit, permissions), report the failure — never treat
"couldn't fetch" as "no release PR" or "no stall".
- Mirror, don't import. The bump rules are re-implemented here to keep the
bundle standalone (ADR-0001 self-containment); they mirror 's
and CLAUDE.md but never reach into a sibling skill.
Error handling
- fails → stop and tell the user to run .
- The helper exits non-zero (rate limit, permissions, GraphQL/REST error) → report
it; do not fabricate signals. Fall back to a manual
gh pr list --state merged --head <releaseBranch> --json labels
to inspect the stale-pending label by hand.
- No tags yet (a never-released repo) → the version preview counts all merged
PRs, and the parity block reports the first tag as pending. That is
expected for the bootstrap release.
Arguments
$ARGUMENTS