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)
Scanned 9/9/2026
Install to Claude Code
npx -y skills add brianwestphal/apple-fm --skill prep-major-release --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Prep Major Release?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/brianwestphal-prep-major-release)More formats (shields.io, HTML) on the badges page.
---
name: prep-major-release
description: 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)
allowed-tools: Read, Grep, Glob, Bash, Edit, Write
---
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
1. **Establish the current feature set (source of truth = code + requirements).**
- Read `docs/3-requirements.md` (the FR/NFR table with status markers) and
`docs/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.ts`
`USAGE`) so command/flag examples in the README actually exist.
- Skim recent history for what changed: `git log --oneline -30` and the Hot Sheet
completed tickets. Look specifically for **added** features (new FR, new flag,
new export) and **removed** ones (a `feat!`/`BREAKING CHANGE`, a deleted module).
2. **Review `README.md` against 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 local
`read`/`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.
3. **Upgrade the demo tooling (`domotion-svg`) to the latest, if out of date.** The
demos are rendered with the `domotion` CLI from the `domotion-svg` dev-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) against
`npm view domotion-svg version` (latest — or, if the npm cache is unwritable in this
environment, `curl -s https://registry.npmjs.org/domotion-svg | ...` reads the
`dist-tags.latest`). If they match, skip the rest of this step.
- If out of date, bump it: `npm install --save-dev domotion-svg@latest` (updates
`package.json` + the lockfile).
- **Then re-sync the demo pipeline to the new renderer.** `scripts/lib/window.mjs` and
`scripts/lib/cast.mjs` are **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 for `domotion 0.15`
and similar). A domotion upgrade can change that output shape and silently break the
window-dressing / title-card compositing.
- Run `npm test` — `tests/demo.test.ts` exercises the transforms and is the first
tripwire for shape drift. Fix any breakage in `window.mjs` / `cast.mjs` and 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.
4. **Review the demo modes** in `scripts/demo.mjs` (the `DEMOS` array). Each entry is
a `{ slug, title{eyebrow,headline,subtitle}, cmd, capture }` (the `chat` one 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`/`capture` text.
- **Fewer** — a demo that's redundant or no longer interesting; remove it (and its
`<img>` from the README).
- Edit `scripts/demo.mjs` to make these changes. Keep each demo's `slug` stable
unless you intend to rename the output file (then update the README `<img src>`).
- If you changed `scripts/demo.mjs`, run `npm test` — `tests/demo.test.ts` covers the
pure demo-composition logic (`buildChatFrames` / `parseChatTranscript`).
5. **Verify the non-capture changes.** `npm run lint && npm run typecheck && npm test`
should stay green (README is prose; `demo.mjs` is covered by `demo.test.ts`). Fix any
breakage before handing off.
6. **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 demo` to (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
`modelNotReady` even though `--probe` says available) — so the capture must run
unsandboxed / in a normal terminal.
Then stop and let the user capture. (Only run `npm run demo` yourself 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 — a `feat!:` / `BREAKING CHANGE:`
footer yields a major bump automatically. See
[docs/5-releasing.md](../../../docs/5-releasing.md). (This is separate from the
`domotion-svg` **dev-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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!