Ludzie pytają jak ogarniam wszystko solo. Krótka odpowiedź to dobre narzędzia. Dłuższa dotyczy asystenta CLI do kodowania z dużą ilością plików konfiguracyjnych.

Przez ostatnie kilka miesięcy konfigurowałem Claude Code jako mojego głównego pomocnika do pracy deweloperskiej. Nie pisaniem frameworka ani budowaniem warstwy abstrakcji. Po prostu dodając pliki do katalogu .claude/, które dają mu kontekst o moich projektach, preferencjach i workflowach. To nadal asystent. Każdą decyzję podejmuję sam. Ale oszczędza mi godziny pisania.

Oto jak wygląda ten setup.

Struktura katalogów

Wszystko żyje w jednym repozytorium Git. Katalog .claude/ to miejsce, gdzie dzieją się ciekawe rzeczy:

1
2
3
4
5
6
.claude/
  commands/     # 48 komend slash, podzielonych na kategorie
  agents/       # 18 wyspecjalizowanych definicji agentów
  rules/        # 22 reguły zachowania (ładowane zawsze)
  hooks/        # 11 skryptów shell wyzwalanych zdarzeniami
  skills/       # 4 pliki wiedzy do ponownego użycia

Komendy to skróty, które wpisuję. /deploy odpalają deployment Trigger.dev. /morning zbiera codzienny briefing. /humanize czyści tekst. /gemini-image generuje obrazki. Jest ich 48 w 11 kategoriach: content, analiza, media, devops, kod, wyszukiwanie, dokumentacja, komunikacja, produktywność i kilka więcej. Napisałem o tym, jak działają oraz o konkretnych kategoriach devops i Toggl.

Reguły to rzeczy, które Claude czyta automatycznie. Każda rozmowa zaczyna się od załadowania 22 plików reguł do kontekstu. Pokrywają wszystko od “nigdy nie edytuj plików .env bezpośrednio” po “zawsze kopiuj komendy do schowka skryptem clip” po “używaj Tavily do pytań faktograficznych, nie polegaj tylko na danych treningowych.” Jeden plik reguł to po prostu lista zakazanych słów i fraz, które sprawiają, że tekst brzmi jakby napisał go AI.

Agenty

Tu zaczyna się zabawa. Mam 18 definicji agentów, które działają jako wyspecjalizowani pomocnicy. Każdy to plik markdown opisujący na czym agent się skupia i jak powinien się zachowywać. Ja mówię co zrobić, oni robią robotę pazerową, ja przeglądam wynik.

Kilka przykładów:

  • enterprise-app-specialist pomaga mi debugować problemy produkcyjne. Wskazuję mu na błąd i kontekst infrastruktury. Przekopuje logi i konfigi, potem daje mi podsumowanie z sugestiami. Ja decyduję co faktycznie naprawić.
  • email-writer draftuje emaile moim głosem. Zna moje preferencje stylu i to, że podpisuję się tomakl. Pokazuje mi pełny tekst, edytuję jeśli trzeba, akceptuję, i kopiuje do schowka.
  • server-command-advisor pomaga mi budować komendy dla zdalnych serwerów. Szuka w dokumentacji, sugeruje odpowiednie flagi i kopiuje komendę do mojego schowka. Sam ją wklejam i odpalam.
  • deploy-verifier sprawdza czy deployment poszedł dobrze. Health kontenerów, endpointy webowe, status workerów.
  • vault-secret-rotator pomaga mi audytować i rotować sekrety w HashiCorp Vault.

Agenty nie współdzielą okna kontekstu głównej rozmowy. Taki jest zamysł. Surowe logi i wyniki wyszukiwania zostają w kontekście agenta. Ja dostaję czyste podsumowanie.

Hooki

Hooki to skrypty shell, które odpalają się na określone zdarzenia. Mam 11.

Hook uprawnień jest najważniejszy. Automatycznie akceptuje operacje odczytu, komendy wyszukiwania i bezpieczne narzędzia. Automatycznie odrzuca rm -rf /, git push --force i git reset --hard. Wszystko inne dostaje manualne potwierdzenie. Dzięki temu mogę pracować szybko bez przypadkowego zniszczenia czegoś.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# permission-auto-approve.sh (uproszczony)
case "$TOOL" in
  Read|Glob|Grep) echo '{"decision":"approve"}' ;;
  Bash)
    case "$COMMAND" in
      *"rm -rf /"*) echo '{"decision":"deny"}' ;;
      *"git push --force"*) echo '{"decision":"deny"}' ;;
      # ... więcej wzorców
    esac ;;
esac

Inne hooki skanują wyjście Bash pod kątem wycieków sekretów, lintują edytowane pliki, zapisują git status przy końcu sesji i wykrywają kiedy coś oceniam (do śledzenia jakości w czasie). Jest też hook pre-commit, który wyłapuje klucze AWS, klucze prywatne i instrukcje debugowania zanim trafią do repo.

Sprzęt

NVIDIA Jetson z 8 GB RAM siedzi pod moim biurkiem. ARM64, Ubuntu 22.04. Hostuje:

  • Trigger.dev (10 kontenerów Docker, self-hosted)
  • Runner GitHub Actions (self-hosted, zbiera joby CI/CD)
  • HashiCorp Vault (wszystkie sekrety, auto-unseal przy starcie)
  • AdGuard Home (blokowanie reklam na poziomie DNS dla całego LAN)
  • Privoxy (blokowanie reklam na poziomie HTTP, około 103k reguł filtrowania)
  • Samba (udziały NAS do wymiany plików między PC a serwerem)
  • n8n (automatyzacja workflow)
  • Ten blog (Hugo w kontenerze Docker, nginx na porcie 8090, więcej o tym jak działa)

Wszystko za tunelem Cloudflare. Żadnych portów przekierowanych na routerze. Subdomeny po prostu działają.

Taski Trigger.dev

Self-hostuję Trigger.dev na Jetsonie i używam go do zadań w tle, które muszą chodzić według harmonogramu lub na żądanie. 16 plików z taskami w kilku kategoriach:

  • Automatyzacja bloga (generowanie okładek, cotygodniowy digest newsów, powiadomienia o publikacji)
  • Monitoring incydentów
  • Wiadomości do szkoły (tak, wysyła wiadomości do nauczycieli mojego dziecka)
  • Sprawdzanie terminów na prawo jazdy (scrapuje stronę rządową)
  • Śledzenie produkcji paneli słonecznych
  • Cotygodniowy research AI newsów

Taski są w TypeScript, deployowane przez GitHub Actions na tego samego Jetsona. Mam serwer MCP do Trigger.dev, więc mogę wyzwalać taski, sprawdzać status runów i deployować z sesji Claude Code.

Sekrety

Wszystkie sekrety żyją w Vault. Pliki .env, .mcp.json i .env.local są generowane. Nigdy ich nie edytuję bezpośrednio. Skrypt inject.sh czyta z Vaulta i zapisuje pliki konfiguracyjne. Jeśli potrzebuję nowego klucza API, dodaję go do Vaulta i odpalam skrypt ponownie.

1
2
3
vault kv put secret/services/telegram bot_token=xxx chat_id=yyy
scripts/vault/inject.sh
# .env teraz ma TELEGRAM_BOT_TOKEN i TELEGRAM_CHAT_ID

Sztuczka ze schowkiem

Ta jest mała, ale zmieniła sposób mojej pracy. Skrypt clip wysyła tekst do schowka mojego Windows Terminal za pomocą sekwencji OSC 52. Kiedy asystent sugeruje komendę, kopiuje ją do mojego schowka. Przechodzę alt-tabem do terminala serwera i wklejam. Sam ją odpalam.

Działa, bo jestem połączony przez SSH z Windows Terminal do serwera deweloperskiego. Sekwencja escape wraca przez połączenie SSH i trafia do emulatora terminala, który zapisuje do schowka Windows. Żadnego X11 forwarding, żadnego xclip, żadnej gimnastyki z buforami tmux.

Reguły pisania

Trzymam plik humanizer.md w katalogu reguł. Wymienia każdy wzorzec, który sprawia, że tekst brzmi jak wygenerowany maszynowo. Zakazane słowa jak “delve”, “crucial”, “landscape.” Zakazane konstrukcje jak “Not only…but…” i “It’s not just about…” Zakazane formatowanie jak nadużywanie em dash i pogrubianie etykiet w każdym punkcie listy.

Każdy tekst, który produkuję z pomocą AI, niezależnie czy to email, ticket czy post na blogu, przechodzi przez te reguły. Celem nie jest ukrycie, że AI asystowało. Chodzi o produkowanie tekstu, od którego nie szklistą się oczy. Ja nadal piszę pomysły. Asystent pomaga z pisaniem.

Ile to kosztuje

Jestem na planie Claude Max. Żadnego liczenia tokenów, żadnego routowania do tańszych modeli. Generowanie obrazków Gemini jest na darmowym tierze. Vault jest darmowy. Jetson to jednorazowy zakup sprzętu. Trigger.dev jest self-hosted więc nie ma opłaty SaaS. Jedyne koszty cykliczne to subskrypcja Claude i domena.

Czy to się opłaca

Katalog .claude/ ma około 120 plików. To dużo konfiguracji jak na asystenta kodowania. Ale każdy plik istnieje, bo natrafiłem na problem i rozwiązałem go raz. Hook uprawnień istnieje bo przypadkowo odpaliłem destrukcyjną komendę. Humanizer istnieje bo miałem dość edytowania “delve” z każdego emaila. Definicje agentów istnieją bo surowe wyjście logów zjadało moje okno kontekstu.

To nie jest produkt. To warsztat. I jak każdy dobry warsztat, narzędzia są tam, gdzie je zostawiłem.