$npx -y skills add mattpocock/skills --skill wizardGenerate an interactive bash wizard that walks a human through a manual procedure — third-party setup, a one-off migration, an A→B state transition — opening URLs, capturing values, confirming each step, and writing .env files and GitHub Actions secrets.
| 1 | # Wizard |
| 2 | |
| 3 | A **wizard** is a bash script that walks a human, step by step, through a manual procedure that's tedious to do by hand and tedious to re-explain to an AI every time. It opens each URL, says exactly what to click and copy, captures the values, writes them where they belong (`.env`, GitHub secrets), confirms at every stage, and shows how much is left. It might configure third-party services, run a one-off migration, or move the project from one state to another. |
| 4 | |
| 5 | The delightful UX is already solved by [template.sh](template.sh) — progress with time-remaining, confirmation gates, cross-platform URL opening (including WSL), hidden secret entry, idempotent `.env` upserts, `gh secret`/`gh variable` writes, and a closing summary. **Your job is only to scope the procedure and author its stages.** The library above the `STAGES` marker is identical in every wizard; that consistency is the point — never hand-edit it. |
| 6 | |
| 7 | A wizard is ephemeral by default — built for one run, saved to a scratch or `scripts/` path, deleted when the job's done. Commit it only when the user wants a repeatable setup path that should live in the repo. |
| 8 | |
| 9 | ## Process |
| 10 | |
| 11 | ### 1. Scope the procedure |
| 12 | |
| 13 | Work out every manual step the human must take and every value that gets captured along the way. Read the repo first — don't ask cold: |
| 14 | |
| 15 | - For setup: `.env`, `.env.example`, `.env.*`, `README`, `docker-compose*`, framework config, and `.github/workflows/*` (every `secrets.*` / `vars.*` reference is a value the wizard must produce). |
| 16 | - For a migration or transition: the current state, the target state, and the irreversible actions between them. |
| 17 | |
| 18 | Then show the user the ordered list of stages and the values each produces, and confirm — they may add, drop, or reorder. |
| 19 | |
| 20 | **Done when:** every stage is named in order, and for each captured value you know (a) where the human gets it, (b) where it's written (`.env`, a GitHub secret, both, or nowhere — some stages are pure actions), and (c) whether it's secret (hidden entry) or public. |
| 21 | |
| 22 | ### 2. Map each stage's journey |
| 23 | |
| 24 | For each stage, write the precise path a human follows: which URL to open, what to do there, where a value is shown, which variable it fills — e.g. "Dashboard → Developers → API keys → Reveal test key → copy". Where you don't actually know the current UI or the exact command, say so and ask the user or check the docs — never invent steps that may not exist. |
| 25 | |
| 26 | **Done when:** every stage traces to concrete instructions a stranger could follow. |
| 27 | |
| 28 | ### 3. Author the wizard |
| 29 | |
| 30 | Copy `template.sh` to the target path. Replace the example stage with one `stage` per step, in dependency order. Use the library helpers — `stage`, `say`/`step`, `open_url`, `ask`/`ask_secret`, `write_env`, `set_secret`/`set_var`, `pause`/`confirm` — and set `TOTAL_STAGES` and `TOTAL_MINUTES` to honest estimates (this drives the time-remaining display). |
| 31 | |
| 32 | Hold the bar the template sets: open the URL before asking for its value, use `ask_secret` for anything secret, `write_env` every persisted value, `set_secret` only the values CI actually needs, and `confirm` before any irreversible action. Each `stage` clears the screen so only the current step is visible — keep a stage to one focused task so nothing the human needs scrolls away. Don't touch the library above the marker. |
| 33 | |
| 34 | ### 4. Verify and hand off |
| 35 | |
| 36 | - `bash -n <script>`; run `shellcheck` if available. |
| 37 | - `chmod +x <script>`. |
| 38 | - Don't run it end-to-end yourself — it opens browsers and blocks on human input. Trace it statically instead: every value from step 1 is captured and lands where step 1 said, and every `set_secret` name exactly matches a `secrets.*` reference in CI. |
| 39 | - Tell the user how to run it. If it's a repeatable setup path, commit it and link it from the README so the next person runs the script instead of asking an AI. |