check-skill-updates
Say nothing unless there is something to say. This skill exists to mention a waiting update once, at a moment when the user is not busy — and to be invisible the rest of the time.
Run it
node <repo>/tools/freshness/check.mjs
<repo> is the clone the skills are linked from. Resolve it from this file's real path, not
from the working directory: ~/.claude/skills/check-skill-updates is a link, so its target's
../../tools/freshness/check.mjs is the script. The working directory is whatever the user
happens to be editing, which is usually a different repo entirely.
The script prints one line of JSON and nothing else. Flags: --force (the user asked directly,
ignore the rate limit), --update (pull and re-link), --decline (remember this was turned down).
What each verdict means
| Verdict | What you say |
|---|---|
fresh |
Nothing. Silence is the correct output. |
too-soon |
Nothing. Already checked within the day. |
offline |
Nothing. A failed fetch is not the user's problem to hear about. |
not-installed |
Nothing, unless the user asked directly — then say the clone could not be found. |
unsafe |
Nothing, unless the user asked directly — then say the clone is on <branch> or has uncommitted changes, so it is not safe to pull for them. |
behind |
One line. See below. |
updated |
One line: what was applied. If refreshed is false, say the pull worked but the re-link did not, and name node <repo>/install.mjs --refresh. |
When the user invoked this skill directly, report every verdict plainly — being asked a question
is licence to answer it. When another skill called you, only behind earns any words at all.
Mentioning an update
One line, at the very end of whatever the calling skill was already saying, never in the middle:
Skills update available — 3 commits behind (
feat(are-we-done): add close-out gate). Update now?
Then honour the answer:
- Yes → run with
--update, then say in one line what was applied. The pull is safe mid-session: it changes the text of skills you already have, adds and removes nothing, and anything already running finishes on the version it started with. - No → run with
--declineand drop it. That version is never raised again, however long it sits there. Do not re-ask tomorrow; the answer has not expired. - No answer → drop it. An ignored offer is a no.
Never mention an update next to a failure. If the calling skill is reporting blockers, a broken build, or anything the user has to act on, stay silent — an update offer stapled to bad news dilutes both, and this is the one thing here that can always wait.
Who calls this
/are-we-done on a clean close, /ship-it once the release is out and verified, /brief-me when
re-entering a session. All of them skip this silently if it is not installed; none of them treat it
as a prerequisite. The rule they share is that the work has to be finished first — this is a
footnote to a natural close, never an interruption of one.