Przenośność setupu — repo dotfiles + bootstrap script
Q23 · Operations & hygiene Jak przenosisz swój setup (CLAUDE.md, hooks, skills) między maszynami?
Maksymalna odpowiedź: “Repo dotfiles obejmujące ~/.claude, ~/.codex, ~/.agents, ~/.cursor + bootstrap script.”
Dlaczego to ważne: Twój setup to twoja produktywność. Traktowanie go jak coś jednorazowego to traktowanie swojej przewagi jak coś jednorazowego.
Dlaczego to ważne w 2026
Dział zatytułowany „Dlaczego to ważne w 2026”Czas życia maszyny developera w 2026 jest krótszy niż kiedykolwiek. MacBook kupiony w lutym idzie na wymianę na korporacyjny sprzęt w maju; europejski reset firmowych laptopów wprowadzony pod regułami higieny urządzeń zgodnymi z DORA wymusza ponowny image co dwanaście miesięcy; twój domowy Linux pada; cloud workspace w Codespaces lub Coder jest odbudowywany każdej nocy; uruchamiasz microVM Vercel Sandbox na jeden run agenta i niszczysz go cztery godziny później. W każdym z tych momentów jedyną rzeczą stojącą między tobą a produktywną pierwszą godziną na nowej maszynie jest to, czy twój setup — CLAUDE.md, hooks, skills, konfiguracje MCP, aliasy shellowe, reguły Cursor, profil Codex — wędruje razem z tobą, czy musisz odtwarzać go z pamięci.
Dla mediany developera w 2024 “przenoszenie setupu” oznaczało .zshrc i .gitconfig. Dla developera wspomaganego AI w 2026 oznacza to rząd wielkości więcej stanu: 600-liniowy ~/.claude/CLAUDE.md z trudno wypracowanymi regułami obowiązującymi we wszystkich projektach, katalog ~/.claude/hooks/ z pięcioma czy sześcioma skryptami bash, które gatekeepują commity i triggerują tworzenie PR-ów, drzewo ~/.claude/skills/ z dwudziestoma plus folderami skillów, które sam napisałeś lub sforkowałeś, ~/.codex/config.toml z profilami providerów i politykami zatwierdzania, ~/.cursor/rules.json i ustawienia .cursor-tutor, katalog ~/.agents/ z konfiguracjami MCP per agent i allowlistami narzędzi, oraz ~/.config/claude-code/ z nadpisaniami telemetrii i feature flagami. Odtwarzanie tego ręcznie na każdej nowej maszynie to nie kilka godzin — to dni powolnej rekonstrukcji, z najgorszym rodzajem tarcia “wiem, że miałem na to regułę” za każdym razem, gdy uderza w ciebie znajomy bug, który twój stary setup obsługiwał po cichu.
To dlatego Q23 siedzi w sekcji Operations & hygiene i dlatego maksymalna odpowiedź jest bezkompromisowa: nie “mam repo dotfiles z moim zshrc”, ale wersjonowane repo dotfiles obejmujące każdy katalog narzędzi AI, sparowane z bootstrap scriptem, który doprowadza świeżo zaimagowaną maszynę do “gotowa do pracy” jedną komendą. Cokolwiek mniej to zostawianie produktywności na stole, oraz — coraz częściej — zostawianie wiedzy instytucjonalnej na stole, gdy onboardujesz osobę z zespołu, która skorzystałaby z twojego CLAUDE.md i skillów.
Jak naprawdę wygląda maksymalny wynik
Dział zatytułowany „Jak naprawdę wygląda maksymalny wynik”Setup z maksymalnym wynikiem w Q23 ma jedno repozytorium na GitHubie (prywatne lub publiczne — twoja decyzja), z deterministycznym layoutem, idempotentnym bootstrap scriptem i zerem sekretów w commitach. Świeża maszyna — macOS, Linux albo Codespace — uruchamia jednolinijkowy bootstrap, a dziesięć minut później piszesz w Claude Code z pełnym CLAUDE.md, twoje hooks odpalają, twoje skills są dostępne, twoje profile Codex są skonfigurowane, twoje reguły Cursor zaaplikowane, a twój shell zachowuje się dokładnie tak, jak na każdej innej maszynie, którą posiadasz.
Oto layout, który wygrywa:
~/dotfiles/├── README.md # jak zbootstrapować, plus manifest tego, co śledzone├── bootstrap.sh # idempotentny installer — bezpieczny do uruchomienia dwa razy├── home/ # pliki mirrorowane do $HOME│ ├── .zshrc│ ├── .gitconfig│ ├── .gitignore_global│ ├── .config/│ │ ├── claude-code/ # feature flagi, telemetria│ │ ├── ghostty/│ │ └── starship.toml│ ├── .claude/│ │ ├── CLAUDE.md # twoje globalne instrukcje dla agenta│ │ ├── settings.json # model, hooks, allowlist (bez sekretów)│ │ ├── hooks/ # *.sh — pre-commit, stop-hooks, itd.│ │ ├── skills/ # twoje autorskie skills (jeden folder każdy)│ │ └── commands/ # slash commands│ ├── .codex/│ │ ├── config.toml # approval_policy, model_provider, profiles│ │ ├── instructions.md # globalne instrukcje Codex│ │ └── prompts/ # nazwane prompty│ ├── .cursor/│ │ ├── rules.json # globalne reguły Cursor│ │ └── mcp.json # serwery MCP (tylko op:// references)│ └── .agents/│ ├── mcp/ # współdzielone konfiguracje serwerów MCP│ └── allowlists/ # allowlisty narzędzi per agent├── machine-overrides/ # szablonowane delty per host (chezmoi/yadm)│ ├── default.yaml│ ├── work-laptop.yaml│ └── home-linux.yaml└── .gitignore # blokuje *.key, *.pem, .env, sessions/Towarzyszący bootstrap.sh jest głupi z premedytacją — płaski skrypt bash, który każde przyszłe ty przeczyta w 30 sekund:
#!/usr/bin/env bashset -euo pipefail
# 1. Zainstaluj package managery + podstawowe narzędziaif [[ "$OSTYPE" == "darwin"* ]]; then command -v brew >/dev/null || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew bundle --file=./Brewfileelse sudo apt-get update && sudo apt-get install -y zsh git curl ripgrep fd-find fzffi
# 2. Zainstaluj tooling agenta (idempotentnie — re-runs bezpieczne)curl -fsSL https://claude.ai/install.sh | bashcurl -fsSL https://openai.com/codex/install.sh | bashcommand -v cursor-agent >/dev/null || npm install -g @cursor/cli
# 3. Linkuj lub kopiuj śledzone pliki do $HOME (chezmoi obsługuje to, jeśli go używasz)chezmoi init --apply --source="$(pwd)/home"
# 4. Uwierzytelnij się w secret managerze (NIGDY nie zapisuj tutaj sekretu)op signin || echo "Uruchom 'op signin' raz interaktywnie po zakończeniu bootstrapu."
# 5. Trigger jednorazowego sanity checkclaude doctor || truecodex --versioncursor-agent --versionecho "Bootstrap zakończony. Otwórz nowy shell."To wszystko. Bez magii, bez własnościowej warstwy instalacyjnej, bez 800-liniowego provisionera. Zasada brzmi: “jeśli skrypt wywali się w połowie, masz przeczytać i naprawić linijkę, która padła.” Wszystko, co chce być sprytne — templatowanie, szyfrowanie, delty per maszyna — żyje wewnątrz dotfile managera (chezmoi lub yadm), a nie wewnątrz bootstrapu.
Aktualny krajobraz (zweryfikowany przez web search)
Dział zatytułowany „Aktualny krajobraz (zweryfikowany przez web search)”chezmoi (templatowany, machine-specific)
Dział zatytułowany „chezmoi (templatowany, machine-specific)”chezmoi to konsensusowy zwycięzca w 2026 dla każdego, kto ma więcej niż jedną maszynę. Śledzi katalog source w gicie, renderuje szablony Go (z OS, hostname i arch jako wejściami) do twojego $HOME i wspiera natywne szyfrowanie z age lub gpg dla tych nielicznych plików, które muszą być w repo, ale nie w plaintekście. Pliki są śledzone po ich nazwie docelowej — dot_claude/CLAUDE.md w source staje się ~/.claude/CLAUDE.md po apply — co utrzymuje repo przeglądalne na GitHubie. Pisemny przewodnik z 2026 roku na Zenn Standardizing AI Agent Instructions and Permission Management with chezmoi and Hooks prowadzi przez użycie chezmoi konkretnie do zarządzania konfigami Claude Code i Codex z szablonami, które interpolują nazwę maszyny w allowlisty i skrypty hooków. Jednolinijkowy bootstrap (sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply your-github-handle) klonuje, templatuje i aplikuje w jednym kroku — i jest rerunnable.
Kiedy wybrać chezmoi: masz więcej niż jedną maszynę, maszyny różnią się w realny sposób (praca vs osobiste, macOS vs Linux, x86 vs Apple Silicon) i chcesz, by niektóre pliki (jak ~/.claude/CLAUDE.md) były w 90% identyczne z deltami per maszyna na górze.
yadm (git-based)
Dział zatytułowany „yadm (git-based)”yadm to cienki wrapper wokół gita, który operuje bezpośrednio na $HOME. Tam, gdzie chezmoi ma podział source-target, yadm śledzi pliki w miejscu — yadm add ~/.claude/CLAUDE.md dodaje żywy plik do zarządzanego przez yadm bare repo w ~/.local/share/yadm/repo.git. Wspiera nadpisania per host przez sufiksy w nazwach plików (.zshrc##os.Darwin, .zshrc##hostname.work-mbp), pliki szyfrowane gpg przez yadm encrypt i bootstrap hooks przez ~/.config/yadm/bootstrap. Jest lżejszy niż chezmoi koncepcyjnie — jeśli już mówisz płynnie po gicie, yadm wydaje się 30-sekundową krzywą uczenia — ale historia templatowania jest słabsza. Nie ma szablonów Go; wszystko per-maszyna to alternatywny plik.
Kiedy wybrać yadm: masz jedną lub dwie maszyny, znasz git bardzo dobrze, a twoje delty per maszyna są na tyle małe, że da się je wyrazić jako alternatywy.
Plain git symlinking (np. stow, własnoręczny)
Dział zatytułowany „Plain git symlinking (np. stow, własnoręczny)”Najstarszy wzorzec: zwykłe repo gitowe, z plikami w ich śledzonej strukturze, symlinkowane do $HOME przez stow, dotbot lub ręczny skrypt. To najprostsza rzecz, która działa i ma najniższy overhead mentalny — to, co widzisz w repo, to to, co jest na dysku. Kosztem jest to, że delty per maszyna zamieniają się w branche, warunkowy sourcing w .zshrc lub copy-paste między podobnymi plikami. Dla czystych konfiguracji narzędzi AI, które są w 100% identyczne między maszynami (twój ~/.claude/CLAUDE.md, twój ~/.codex/instructions.md, twój folder skillów), plain symlinking jest w porządku i daje maksymalną przenośność — twoje repo działa z lub bez jakiegokolwiek konkretnego narzędzia dotfile zainstalowanego. natelandau/dotfiles to dobre repo referencyjne w tym stylu.
Kiedy wybrać plain git: masz jedną maszynę albo wszystkie twoje maszyny mają identyczny OS / arch i nie potrzebujesz delt per host, a wolisz transparentne narzędzia niż feature-rich.
Co uwzględnić z narzędzi AI
Dział zatytułowany „Co uwzględnić z narzędzi AI”Śledź te w swoich dotfiles, w tej kolejności priorytetu:
~/.claude/CLAUDE.md— twoje globalne instrukcje dla Claude Code. Najbardziej wartościowy pojedynczy plik w całym twoim setupie developera w 2026. Jeśli masz trudno wypracowane reguły typu “zawsze czytaj plik przed edycją”, “nigdy nie uruchamiaj destrukcyjnych komend gita bez zgody”, “auto-PR po znaczącej pracy”, żyją one tutaj.~/.claude/settings.json— preferencja modelu, allowlisty, rejestracja hooków. Usuń najpierw sekrety; używaj referencjiop://dla wszystkiego wrażliwego.~/.claude/hooks/— każdy skrypt shellowy, który gatekeepuje lub augmentuje twoje sesje Claude Code. Stop hookauto-pr-watch.sh, twoje pre-edit hooks, twoje file-saved hooks. To jest executable code i absolutnie powinien być wersjonowany.~/.claude/skills/— twoje autorskie skills, jeden folder każdy zSKILL.md+ plikami wspierającymi. To twoja osobista ekspertyza zakodowana dla agenta.~/.claude/commands/— twoje slash commands.~/.codex/config.tomli~/.codex/instructions.md— profile providerów Codex, polityki zatwierdzania i twoje globalne instrukcje.~/.codex/prompts/— nazwane szablony promptów.~/.cursor/rules.json— reguły Cursor (globalne reguły dla edycji inline i trybu agenta).~/.cursor/mcp.json— rejestr serwerów MCP w Cursor, z referencjamiop://dla wszelkich tokenów.~/.agents/— współdzielone konfiguracje serwerów MCP, allowlisty narzędzi i inny cross-agent state.~/.config/claude-code/— nadpisania telemetrii, feature flagi, beta opt-iny.- Szablony
.mcp.json— trzymaj startowy.mcp.jsonwdotfiles/templates/, żeby nowe projekty bootstrapowały serwery MCP z znanej-dobrej bazy.
Czego NIE uwzględniać
Dział zatytułowany „Czego NIE uwzględniać”Tak samo ważne. To kategorie, które psują się w momencie, gdy trafią do publicznego lub nawet prywatnego repo:
- Sekrety w jakiejkolwiek formie. Żadnego
OPENAI_API_KEY=sk-..., żadnych tokenów GitHub wsettings.json, żadnych admin keys Anthropic w konfigach MCP. Jeśli plik referencjuje sekret, powinien referencjowaćop://Personal/openai/credential(lub odpowiednik twojego secret managera), a secret manager obsługuje rozwiązywanie w runtime. Zobacz Q22 dla pełnego wzorca. - Cookies i session tokens. Żadnego
.config/gh/hosts.yml, jeśli zawiera session token. Żadnego~/.claude/sessions/. Żadnego.cursor-tutor, jeśli przechowuje auth. - Stan specyficzny dla maszyny. Katalogi cache (
~/.claude/cache/), logi (~/.claude/logs/), ID telemetrii (~/.config/claude-code/machine-id), historia runów Codex. Nic z tego nie powinno za tobą podążać między maszynami — to szum w najlepszym wypadku, fingerprinting w najgorszym. - Tożsamość osobista różna per maszyna. Klucze hostowe SSH (per maszyna), nazwy hostów systemowych, aliasy mDNS.
- Wszystko, czego nie chciałbyś, żeby teammate znalazł, jeśli udostępnisz mu URL repo jutro. Uruchom
gitleaks detectitrufflehog filesystem .na repo przed pushem.
.gitignore, który łapie typowych winowajców dla drzewa narzędzi AI:
# Narzędzia AI — nigdy nie śledź tych**/sessions/**/cache/**/logs/**/.history/**/auth.json**/credentials.json**/*.key**/*.pem.env.env.localWdrożenie krok po kroku
Dział zatytułowany „Wdrożenie krok po kroku”-
Utwórz repo, zdecyduj o managerze. Stwórz nowe repo GitHub o nazwie
dotfiles(prywatne, jeśli zawiera cokolwiek, czego wolałbyś nie pokazywać, publiczne, jeśli chcesz mieć je jako portfolio — większość ludzi wybiera prywatne). Zdecyduj międzychezmoi(templatowanie),yadm(git-in-$HOME) lub plainstow-style symlinking. Jeśli niepewny, wybierz chezmoi. -
Audytuj swój obecny
$HOMEpod kątem narzędzi AI. Uruchomls -la ~/ | grep -E '(claude|codex|cursor|agent)'ifind ~/.config -maxdepth 2 -name '*claude*' -o -name '*codex*' -o -name '*cursor*', żeby wiedzieć, co realnie jest na dysku. Nie pomijaj tego — większość ludzi jest zaskoczona tym, co znajduje. -
Pobierz śledzone pliki do katalogu source. Z chezmoi:
chezmoi add ~/.claude/CLAUDE.md, potemchezmoi add ~/.claude/settings.json, potemchezmoi add ~/.claude/hooks/, i tak dalej. Z yadm:yadm add ~/.claude/CLAUDE.mdi reszta. Z plain git: przenieś pliki do repo i zastąp je symlinkami. -
Usuń sekrety i zastąp je referencjami. Otwórz każdy śledzony plik i znajdź wszystko wrażliwe — API keys, tokeny OAuth, ID kont, wewnętrzne hostnames. Zastąp każdy referencją do secret managera (
op://Personal/...dla 1Password,${DOPPLER_TOKEN}dla Doppler, itd.). Przetestuj ponownie, że narzędzie nadal działa przez wrapper managera (op run -- claude). -
Napisz
bootstrap.sh. Zacznij od szkieletu z sekcji Jak naprawdę wygląda maksymalny wynik i dostosuj do swojego stosu — Homebrew na macOS, apt na Linuksie, twoja konkretna metoda instalacji Codex, npm globals, których chcesz. Przetestuj go dwa razy: raz na świeżym VM (UTM, OrbStack lub GitHub Codespace), raz na istniejącej maszynie, żeby potwierdzić, że jest idempotentny i nie nadpisuje stanu. -
Dodaj
.gitignorei pre-commit secret scan. Skopiuj.gitignorez góry. Zainstalujgitleaksi dodaj pre-commit hook (gitleaks protect --staged). Uruchomgitleaks detect --source .raz nad całym drzewem przed pierwszym pushem. -
Pushuj i zbootstrapuj drugą maszynę. Pushuj na GitHub, potem na innej maszynie (lub świeżym VM) uruchom jednolinijkowiec chezmoi (
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply YOUR-HANDLE) lub swój odpowiednik. Zmierz czas. Jeśli to ponad 10 minut do “gotowa do pracy”, przytnij bootstrap. -
Udokumentuj README. Dwa akapity: jak zbootstrapować i co jest śledzone. Drugi to manifest — kiedy przyszłe-ty zastanawia się “gdzie wsadziłem moje hooks Claude?”, README odpowiada w pięć sekund.
-
Ustaw rutynę odświeżania. Raz w miesiącu,
chezmoi re-add(lubyadm addponownie) nad twoimi śledzonymi plikami, żeby wciągnąć drift. Raz na kwartał, uruchom pełny bootstrap na jednorazowym VM, żeby potwierdzić, że nadal działa end-to-end. -
Onboarduj jednego teammate’a. Daj mu URL repo. Jeśli jest w “gotowy do pracy” w ciągu godziny, ci się udało. Jeśli uderza w pięć nieudokumentowanych prerequisitów, napraw bootstrap, aż te pięć będzie zautomatyzowanych.
Częste pułapki
Dział zatytułowany „Częste pułapki”Commitowanie sekretów. Pojedynczy najczęstszy błąd — ~/.claude/settings.json z inline’owym API key, .codex/config.toml z kluczem providera, mcp.json z bearer tokenem. Zawsze pipuj wszystko przez swojego secret managera (Q22) i dodaj gitleaks do pre-commit. Jeśli pushniesz sekret przez przypadek, rotuj go natychmiast — załóż, że repo jest publiczne od momentu pusha, nawet jeśli jest prywatne, ponieważ API secret-scanningowe GitHuba już je widziały.
Brak bootstrap scriptu. Repo z plikami, ale bez installera. Kończysz z 14-krokowym README, które wymaga uważnego czytania za każdym razem, gdy onboardujesz nową maszynę. Sens dotfiles to automatyzacja — jeśli musisz myśleć za każdym razem, pominiesz to na następnym evencie provisioningu. Nawet 20-liniowy skrypt bash jest nieskończenie lepszy niż markdown checklista.
Hardcodowane ścieżki absolutne specyficzne dla maszyny. Wpisanie na sztywno /Users/yourname/... do CLAUDE.md lub settings.json to bug przenośności czekający, żeby ugryźć w momencie, gdy twoja nazwa użytkownika na nowej maszynie jest inna (Codespaces używa vscode; korporacyjny macOS często używa firstname.lastname). Używaj $HOME, ~ lub szablonu chezmoi {{ .chezmoi.homeDir }}.
Śledzenie cache i logów. ~/.claude/cache/, ~/.claude/logs/, ~/.config/claude-code/machine-id — pęcznieją repo, leakują fingerprinty maszyn i tworzą merge konflikty. Gitignoruj je agresywnie.
Zapominanie o obsłudze driftu. Edytujesz ~/.claude/CLAUDE.md bezpośrednio, nigdy nie uruchamiasz chezmoi re-add, a miesiąc później twoje repo jest nieaktualne. Albo zobowiąż się do edycji source (chezmoi edit ~/.claude/CLAUDE.md), albo ustaw miesięczne przypomnienie, żeby re-addować śledzone pliki.
Brak drugiej maszyny. Repo dotfiles, które nigdy nie było zbootstrapowane na drugiej maszynie, to teatr — realnie nie wiesz, czy działa. Odpal Codespace raz na kwartał i uruchom bootstrap end-to-end jako fire drill.
Mieszanie dotfiles z regułami projektowymi. Instrukcje specyficzne dla projektu żyją w CLAUDE.md projektu (commitowane do repo projektu). Globalne, cross-project reguły żyją w ~/.claude/CLAUDE.md (twoje dotfiles). Nie mieszaj ich — globalna powinna być użyteczna niezależnie od tego, w którym projekcie jesteś.
Jak sprawdzić, czy już tam jesteś
Dział zatytułowany „Jak sprawdzić, czy już tam jesteś”Przejdź przez tę checklistę. Każdy odhaczony box = maksymalny wynik. Pominięte boxy = action itemy.
- Repo GitHub o nazwie
dotfiles(prywatne lub publiczne), które posiadam i do którego pushowałem w ciągu ostatnich 30 dni. - Repo zawiera
~/.claude/CLAUDE.md,settings.json,hooks/,skills/icommands/(lub odpowiedniki chezmoi/yadm). - Repo zawiera
~/.codex/config.toml,instructions.mdiprompts/. - Repo zawiera
~/.cursor/rules.jsonimcp.json. - Repo zawiera
~/.agents/ze współdzielonymi konfigami MCP i allowlistami. -
bootstrap.shistnieje, jest wykonywalny i idempotentny (bezpieczny do uruchomienia dwa razy). - Uruchomienie bootstrapu na świeżym VM doprowadza mnie do “otwórz Claude Code z pełnym setupem” w mniej niż 10 minut.
-
gitleaks detect --source .zwraca clean nad całym repo. - Brak plaintekstowych sekretów gdziekolwiek w drzewie — tylko referencje
op://(lub odpowiednik). -
.gitignoreblokujesessions/,cache/,logs/,.env,*.key,*.pem. - README ma jednolinijkową komendę bootstrap i manifest tego, co śledzone.
- Zbootstrapowałem co najmniej jedną maszynę poza moją podstawową w ciągu ostatnich 90 dni.
- Istnieje miesięczne przypomnienie kalendarzowe “re-add drift” lub edytuję wyłącznie przez
chezmoi edit.
Jeśli wszystkie dwanaście jest odhaczonych, jesteś na maksymalnym wyniku w Q23. Jeśli jesteś na ośmiu do jedenastu, jesteś na 3 lub 4 i jedno skoncentrowane popołudnie od maksimum. Poniżej ośmiu, traktuj to jako swoją najwyższej dźwigni inwestycję Operations & hygiene na ten kwartał — kompoundujący zwrot z “każda nowa maszyna jest gotowa w 10 minut” jest ogromny.