prep-major-release
Prep apple-fm for a major release — refresh the README so it advertises the current feature set, and review/revise the demo modes (the user captures the screenshots)
Install
mkdir -p .claude/skills/prep-major-release && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16479" && unzip -o skill.zip -d .claude/skills/prep-major-release && rm skill.zipInstalls to .claude/skills/prep-major-release
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Prep apple-fm for a major release — refresh the README so it advertises the current feature set, and review/revise the demo modes (the user captures the screenshots)About this skill
Get apple-fm's public-facing material ready for a release: make the README compelling and accurate to the current feature set, and review the demo modes so the screenshots are the right ones. You do not capture the demos — you prepare everything and hand off; the user runs the capture.
What "ready for release" means
The README and demos are the first thing a prospective user sees. After a batch of changes they drift in two directions: a new headline feature ships but isn't advertised, or a removed feature is still being sold. Both are bugs here. The goal is a README that honestly and compellingly reflects what apple-fm does today.
Steps
-
Establish the current feature set (source of truth = code + requirements).
- Read
docs/3-requirements.md(the FR/NFR table with status markers) anddocs/ai/requirements-summary.md. Shipped FR/NFRs are what's advertisable; Partial ones can be mentioned with honest framing; Dropped/Removed ones must not appear in the README. - Read the public API (
src/index.ts) and the CLI surface (src/cliArgs.tsUSAGE) so command/flag examples in the README actually exist. - Skim recent history for what changed:
git log --oneline -30and the Hot Sheet completed tickets. Look specifically for added features (new FR, new flag, new export) and removed ones (afeat!/BREAKING CHANGE, a deleted module).
- Read
-
Review
README.mdagainst that set. Read it top to bottom and check:- Headline / tagline still true (e.g. the on-device / no-network claim — if a networked feature was added or removed, this line changes).
- "Why apple-fm" bullets cover the most important and interesting shipped
features. As of this writing those are: on-device & private (no key/cloud/network),
one-binary-three-shapes (
probe/generate/chat), guaranteed structured output (guided generation), long coherent chat (persistent session + auto-compaction + Esc interrupt), tool calling (permission-gated localread/bash), zero runtime deps, and future-proof (runtime model resolution). Add a bullet for any shipped headline feature that's missing; delete any that no longer ship. - CLI / Library examples match real flags and API (no removed flags, no invented ones).
- Every
<img>alt text still describes what the demo shows. - Install / platform-support / disclaimer / license still accurate.
- Tighten prose so it stays compelling and scannable — lead with the benefit, not the mechanism. Don't pad with an imageless section if a bullet does the job.
-
Upgrade the demo tooling (
domotion-svg) to the latest, if out of date. The demos are rendered with thedomotionCLI from thedomotion-svgdev-dependency, so a release should capture on the current renderer. Do this before reviewing/capturing demos so the review reflects what will actually ship.- Compare installed vs. latest:
npm ls domotion-svg(installed) againstnpm view domotion-svg version(latest — or, if the npm cache is unwritable in this environment,curl -s https://registry.npmjs.org/domotion-svg | ...reads thedist-tags.latest). If they match, skip the rest of this step. - If out of date, bump it:
npm install --save-dev domotion-svg@latest(updatespackage.json+ the lockfile). - Then re-sync the demo pipeline to the new renderer.
scripts/lib/window.mjsandscripts/lib/cast.mjsare pure string transforms keyed off domotion's output shape (a frame is<g class="f f-N">; the cast frame wraps a nested<svg>), and both are pinned by comment to a specific domotion version (search fordomotion 0.15and similar). A domotion upgrade can change that output shape and silently break the window-dressing / title-card compositing.- Run
npm test—tests/demo.test.tsexercises the transforms and is the first tripwire for shape drift. Fix any breakage inwindow.mjs/cast.mjsand their tests. - Update the version references in the docstrings/comments (
scripts/demo.mjs,scripts/lib/*.mjs, and this skill's examples) to the new version so they don't lie about which renderer they target. - Because the transform coupling is fragile and demo output is only truly verifiable against the real on-device model (the user's capture step), flag in your hand-off report that domotion was upgraded from X→Y and that the recaptured SVGs should be eyeballed for regressions.
- Run
- Compare installed vs. latest:
-
Review the demo modes in
scripts/demo.mjs(theDEMOSarray). Each entry is a{ slug, title{eyebrow,headline,subtitle}, cmd, capture }(thechatone is composed turn-by-turn). For each, decide: does it still showcase a current, compelling capability? Consider new / different / fewer:- New — a shipped feature with no demo that would demo well. Note that demos run the real on-device model (non-deterministic output), so a good demo is one whose value shows even with varying wording. Be wary of demos that depend on the model reliably doing something specific (e.g. calling a tool on cue) — those make flaky, embarrassing assets. Prefer prose in the README for those.
- Different — an existing demo's prompt/title/subtitle is stale or undersells the
feature; revise the
title/cmd/capturetext. - Fewer — a demo that's redundant or no longer interesting; remove it (and its
<img>from the README). - Edit
scripts/demo.mjsto make these changes. Keep each demo'sslugstable unless you intend to rename the output file (then update the README<img src>). - If you changed
scripts/demo.mjs, runnpm test—tests/demo.test.tscovers the pure demo-composition logic (buildChatFrames/parseChatTranscript).
-
Verify the non-capture changes.
npm run lint && npm run typecheck && npm testshould stay green (README is prose;demo.mjsis covered bydemo.test.ts). Fix any breakage before handing off. -
Hand off the capture — do NOT run it yourself. The demos are captured by
npm run demo(build +node scripts/demo.mjs), which runs the real on-device model and drives headless Chromium via domotion. Summarize for the user:- what you changed in the README and in the demo modes (added/removed/revised demos),
- whether you upgraded
domotion-svg(from X→Y) — if so, call it out so the user watches the recaptured SVGs for renderer regressions, - that they should now run
npm run demoto (re)capture all demo SVGs (always all — minor rendering details drift between captures), - the capture requirements: macOS 26+ Apple Silicon with the model ready, and
that model-loading is blocked by the command sandbox (it surfaces as
modelNotReadyeven though--probesays available) — so the capture must run unsandboxed / in a normal terminal.
Then stop and let the user capture. (Only run
npm run demoyourself if the user explicitly asks you to in this invocation.)
Don't
- Don't bump the project version in
package.json. The release flow (npm run release) derives the bump from conventional commits — afeat!:/BREAKING CHANGE:footer yields a major bump automatically. See docs/5-releasing.md. (This is separate from thedomotion-svgdev-dependency bump in step 3, which you should do.) - Don't capture demos unless explicitly asked — that's the user's step (it needs the on-device model + an unsandboxed run).
- Don't invent features. Everything advertised must trace to a Shipped FR/NFR or a real export/flag.
Report
End with: the README edits made (and why), any domotion-svg upgrade (X→Y, plus
any window.mjs / cast.mjs transform fixes it required), the demo-mode changes (added /
revised / removed, with the reasoning for any new-vs-prose call), the verify result
(lint/typecheck/test), and a clear "ready to capture — run npm run demo (unsandboxed)"
hand-off line.