Lekcja 25 · Faza 3 · Planowanie wieloetapowe

wizard: skrypty prowadzące człowieka, nie AI

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.

Polecane źródło Lokalne pliki .agents/skills/wizard/{SKILL.md,template.sh} w tym repo.

Po co w ogóle skrypt, skoro jest Claude?

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.

Biblioteka w template.sh — nie dotykaj ręcznie

UX 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.

FunkcjaRobi
stage "Nazwa" minCzyści ekran, ogłasza etap, pokazuje postęp i pozostały czas
say / stepZwykła instrukcja / konkretna czynność do wykonania w przeglądarce
open_urlOtwiera URL w przeglądarce człowieka, cross-platformowo
ask / ask_secretWczytuje wartość jawnie / w trybie ukrytym (dla sekretów)
write_envZapisuje parę KLUCZ=WARTOŚĆ do .env, idempotentnie
set_secret / set_varZapisuje sekret / zmienną repo przez gh secret/gh variable
pause / confirmCzeka na Enter / zadaje pytanie tak-nie przed nieodwracalną akcją

Przykład wprost z template.sh: konfiguracja Stripe

Wbudowany 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.

Cztery kroki procesu

  1. Zakres procedury — przeczytaj repo, zanim zapytasz na zimno: .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.
  2. Ścieżka każdego etapu — dokładna trasa człowieka: który URL, co tam zrobić, gdzie pokazuje się wartość. Tam, gdzie nie znasz dokładnego UI albo komendy — powiedz to i zapytaj, nigdy nie zmyślaj kroków, które mogą nie istnieć.
  3. Napisanie wizardu — kopiujesz template.sh, zamieniasz przykładowy etap na własne, jeden stage na krok, ustawiasz TOTAL_STAGES/TOTAL_MINUTES uczciwie.
  4. Weryfikacja i przekazaniebash -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.

Efemeryczny domyślnie — ale inaczej niż prototype

Kluczowy wniosek: wizard jest domyślnie jednorazowy — zapisywany do katalogu roboczego albo 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.

Zadanie praktyczne — jeden wizard na realną, powtarzalną procedurę

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:

  1. Sprawdź, czy Claude faktycznie przeczytał repo (.env.example, CI) zamiast pytać Cię o wszystko od zera.
  2. Zweryfikuj wygenerowany skrypt statycznie — czy każda wartość z kroku 1 rzeczywiście ląduje tam, gdzie powinna?
  3. Zdecyduj świadomie: czy to jednorazowy skrypt do wyrzucenia po użyciu, czy wart commitowania do scripts/ i zalinkowania z README?

Sprawdź się

1. Czym dokładnie jest "wizard" w rozumieniu tego skilla?

Wizard to skrypt bash, który sam, krok po kroku, prowadzi człowieka przez ręczną procedurę — otwiera URL-e, zbiera wartości, zapisuje je i potwierdza każdy etap.

2. Kiedy warto sięgnąć po wizard zamiast tłumaczyć procedurę Claude za każdym razem?

Sam skill nazywa dokładnie ten problem: procedura żmudna do zrobienia ręcznie i żmudna do wytłumaczenia AI za każdym razem od nowa — to właśnie wizard rozwiązuje raz na zawsze.

3. Jaka jest zasada dotycząca biblioteki w template.sh, nad znacznikiem STAGES?

Biblioteka jest identyczna w każdym wizardzie — to właśnie ta spójność jest jej sensem. Praca autora to wyłącznie opisanie procedury i etapów poniżej znacznika.

4. Czego skill wyraźnie zabrania na etapie "Verify and hand off"?

Wizard blokuje na wejściu człowieka i otwiera przeglądarki, więc nie uruchamia się go end-to-end samemu — weryfikacja jest statyczna: śledzenie, czy każda wartość trafia tam, gdzie powinna.

5. W przykładzie Stripe: dlaczego open_url wywoływane jest ZAWSZE przed odpowiadającym mu ask?

Kolejność otwórz-URL-potem-zapytaj jest częścią dyscypliny wizardu: człowiek musi najpierw zobaczyć, gdzie dana wartość się znajduje, zanim zostanie o nią poproszony.
Coś niejasne? Zapytaj mnie wprost — mogę pomóc ocenić, czy konkretna procedura z Twojego projektu jest wystarczająco powtarzalna, żeby zasłużyć na własny wizard.
← Lekcja 24: loop-me Następna lekcja: cztery narzędzia deweloperskie →