Lekcja 25 · Faza 3 · Planowanie wieloetapowe
Kolejny zwrot. Wszystko dotąd zakładało, że to Claude wykonuje pracę. /wizard odwraca role: Claude pisze skrypt bash, który potem, samodzielnie, prowadzi człowieka krok po kroku przez żmudną, ręczną procedurę — konfigurację usługi trzeciej, jednorazową migrację, przejście projektu ze stanu A do B.
.agents/skills/wizard/{SKILL.md,template.sh} w tym repo.
Sam skill nazywa problem wprost: procedura bywa żmudna do zrobienia ręcznie i żmudna do tłumaczenia AI za każdym razem od nowa. Wizard rozwiązuje to raz — otwiera każdy URL, mówi dokładnie co kliknąć i skopiować, zapisuje wartości tam, gdzie mają trafić (.env, sekrety GitHub Actions), potwierdza na każdym etapie i pokazuje, ile jeszcze zostało.
template.sh — nie dotykaj ręcznieUX jest już rozwiązany: pasek postępu z szacowanym czasem, bramki potwierdzenia, otwieranie URL działające cross-platformowo (włącznie z WSL), ukryte wpisywanie sekretów, idempotentne zapisy do .env, zapisy sekretów/zmiennych przez gh, i końcowe podsumowanie. Wszystko to leży nad znacznikiem STAGES w template.sh — ta część jest identyczna w każdym wizardzie i nigdy nie edytujesz jej ręcznie. Twoja jedyna praca to opisać procedurę i napisać jej etapy poniżej znacznika.
| Funkcja | Robi |
|---|---|
stage "Nazwa" min | Czyści ekran, ogłasza etap, pokazuje postęp i pozostały czas |
say / step | Zwykła instrukcja / konkretna czynność do wykonania w przeglądarce |
open_url | Otwiera URL w przeglądarce człowieka, cross-platformowo |
ask / ask_secret | Wczytuje wartość jawnie / w trybie ukrytym (dla sekretów) |
write_env | Zapisuje parę KLUCZ=WARTOŚĆ do .env, idempotentnie |
set_secret / set_var | Zapisuje sekret / zmienną repo przez gh secret/gh variable |
pause / confirm | Czeka na Enter / zadaje pytanie tak-nie przed nieodwracalną akcją |
template.sh: konfiguracja StripeWbudowany przykład w repo pokazuje wzorzec, który powtarzasz w każdym własnym etapie:
stage "Stripe — API keys" 5
say "We'll grab your Stripe test keys and store them for local dev + CI."
open_url "https://dashboard.stripe.com/test/apikeys"
step "On the API keys page, copy the Publishable key (starts pk_test_)."
ask STRIPE_PUBLISHABLE_KEY "Paste the publishable key:"
step "Click 'Reveal test key' on the Secret key row, then copy it."
ask_secret STRIPE_SECRET_KEY "Paste the secret key:"
write_env STRIPE_PUBLISHABLE_KEY "$STRIPE_PUBLISHABLE_KEY"
write_env STRIPE_SECRET_KEY "$STRIPE_SECRET_KEY"
set_secret STRIPE_SECRET_KEY "$STRIPE_SECRET_KEY" # CI needs this one
Zauważ kolejność: open_url zawsze przed ask — człowiek najpierw widzi, gdzie znaleźć wartość, dopiero potem jest o nią proszony. Klucz publiczny idzie przez ask (widoczny), sekret przez ask_secret (ukryty). Do CI trafia tylko STRIPE_SECRET_KEY przez set_secret — klucz publiczny nie musi tam być, bo nie jest tajny.
.env/.env.example, README, konfigurację frameworka, .github/workflows/* (każde odwołanie secrets.*/vars.* to wartość, którą wizard musi wyprodukować). Gotowe, gdy dla każdej przechwytywanej wartości wiadomo: skąd ją wziąć, gdzie ją zapisać, i czy jest tajna.template.sh, zamieniasz przykładowy etap na własne, jeden stage na krok, ustawiasz TOTAL_STAGES/TOTAL_MINUTES uczciwie.bash -n, shellcheck jeśli dostępny, chmod +x. Nigdy nie uruchamiasz go end-to-end samodzielnie — otwiera przeglądarki i czeka na człowieka. Zamiast tego prześledź go statycznie: każda wartość z kroku 1 jest przechwycona i trafia tam, gdzie miała, a każdy set_secret pasuje dokładnie do nazwy z secrets.* w CI.scripts/, usuwany po zrobieniu zadania. To ta sama rodzina dyscypliny co "nie zaśmiecaj repo" z prototype (Lekcja 16) i raport HTML z improve-codebase-architecture (Lekcja 19) — ale z inną granicą decyzji. Przy prototype zawsze zostaje tylko wniosek, nigdy kod. Przy wizard sam skrypt może zostać na stałe — commitujesz go, gdy użytkownik chce powtarzalną ścieżkę setupu, żeby następna osoba uruchomiła skrypt zamiast tłumaczyć tę samą procedurę AI po raz kolejny.
W swoim prawdziwym projekcie firmowym znajdź procedurę, którą tłumaczyłeś AI (albo nowej osobie w zespole) więcej niż raz — konfigurację usługi trzeciej, migrację, onboarding nowego środowiska. Wpisz /wizard:
.env.example, CI) zamiast pytać Cię o wszystko od zera.scripts/ i zalinkowania z README?1. Czym dokładnie jest "wizard" w rozumieniu tego skilla?
2. Kiedy warto sięgnąć po wizard zamiast tłumaczyć procedurę Claude za każdym razem?
3. Jaka jest zasada dotycząca biblioteki w template.sh, nad znacznikiem STAGES?
4. Czego skill wyraźnie zabrania na etapie "Verify and hand off"?
5. W przykładzie Stripe: dlaczego open_url wywoływane jest ZAWSZE przed odpowiadającym mu ask?