AI

Jak začít s Claude Code?

Claude Code není chat, který umí programovat. Je to agent, který si sám čte soubory, spouští testy a přepisuje vám je. Průvodce pro vývojáře, co zatím kopírují odpovědi z prohlížeče.

> **TL;DR:** Claude Code používá stejný model jako chatovací verze Claude v prohlížeči/aplikaci. Mění se ale jedna věc: model už nejen odpovídá, ale hlavně dokáže sám jednat. Sám si najde soubory, spustí testy i přepíše kód. Z toho plyne to, co je nutné si doplnit ve znalostech: kde má mantinely, co vlastně vidí, jak poznáte, že skončil moc brzo, a kolik to stojí.

Je to pořád ten samý model jako když otevřete chat v prohlížeči, takže když do něj vložíte třídu a zeptáte se, proč vám padá test, tak dostanete přesně tu samou kvalitu odpovědi jako z terminálu. Rozdíl teda není v inteligenci, ale v tom, že v terminálu ta odpověď není nutně jen odpověď. Je to i zásah do vašeho repozitáře.

Píšu to pro kolegu, který mě požádal, abych mu ukázal, jak to používám. Umí pracovat s chatem a o agentovi v terminálu už sice slyšel, ale nevěděl, kde přesně začít. Tak mi přišlo, že dát to ven jako článek i pro ostatní možná dává smysl.

## V čem se liší agent od chatu?

V možnostech. Chatbot odpoví a čeká, co uděláte vy. Agent čte soubory, spouští příkazy, mění soubory na disku a pracuje dokud si nemyslí, že je hotovo. Vás se ptá jen tam, kde jste mu to nastavili (nebo kde mu to přijde vhodné).

Zní to jako drobnost, ale mění to zadání, která mu dáváte. V chatu je vaše práce **popsat problém**. V terminálu je vaše práce **vymezit prostor**, ve kterém se smí pohybovat, a **říct, jak pozná, že je hotovo**. Popis problému je pořád důležitý, jenže sám o sobě nestačí.

Prakticky to vypadá takhle:

„`
V src/Cart/CartCalculator.php oprav výpočet slevy tak, aby se procentní sleva
počítala z ceny po odečtení fixní slevy, ne před ní.
Nesahej na nic v src/Order/ ani na migrace.
Až to budeš mít, pusť `docker compose exec -T app bin/phpunit tests/Cart`
a ukaž mi výstup.
„`

V promptu jsou tři věci: jmenovaný soubor, vyslovený rozsah a ověřovací krok, který si umí spustit sám. V chatu by poslední tři řádky nedávaly smysl, protože nemá jak.

`Esc` uprostřed odpovědi zastaví běžící proces, ale pozor na to, že co už udělal, zůstane. Není to nouzové tlačítko, spíš způsob, jak ho v půlce přesměrovat trochu jiným směrem. Klidně si to vyzkoušejte jako první věc vůbec. Když víte, kde je brzda, pouštíte to s mnohem menším stresem.

Druhou věc, kterou stojí za to vědět hned: `Ctrl+O` přepne zobrazení transkriptu, takže vidíte, co se vlastně dělo. Nejen shrnutí, ale víc informaci o tom co četl a co spustil.

## Co vlastně vidí?

Nevidí váš kompletní repozitář. Vidí jenom to, co se mu vejde do kontextového okna a to co si načte v dané session.

Pusťte si `/context` a podívejte se, co se načetlo: systémový prompt, projektový i uživatelský `CLAUDE.md`, auto memory, popisy skillů, informace o prostředí, jména MCP nástrojů. Podle příkladu v dokumentaci je to dohromady skoro osm tisíc tokenů. A teprve pak přijde vlastní zadání.

Podstatné je, co se s tím oknem děje a jak se plní. Není to tak, že do určité hranice je všechno v pořádku a pak to spadne. Kvalita (a rychlost) klesá průběžně, jak se okno zaplňuje. Model začíná zapomínat dřívější instrukce a dělá víc chyb. I když musím říct, že se to dost zlepšuje.

Milionové kontextové okno u některých modelů fakt existuje, ale degradaci se neubráníte, jen ji posouváte dál. A není to vlastnost nástroje, ale konkrétního modelu na konkrétní platformě, takže se to nedá brát všude stejně.

Z toho plynou dva příkazy, které začnete používat hned první den:

**`/clear`.** Nová konverzace s prázdným kontextem. Používá se mezi nesouvisejícími úkoly a nestojí nic.

**`/compact`.** Shrne dosavadní konverzaci a uvolní místo, ale pokračujete tam, kde jste byli. Pozor akorát na to, že sám o sobě je to velký request, protože shrnout velký kontext něco stojí.

A jedna rada, která mi ušetřila víc času než všechny ostatní dohromady. Když jste model dvakrát upozornili na chybu na tom samém místě a pořád to nejde podle představ, nepište třetí opravu. Dejte `/clear` a napište zadání znovu, líp. Hádáním se ním nikam moc nevede. Dokumentace to formuluje takhle: *„A clean session with a better prompt almost always outperforms a long session with accumulated corrections.“*

### Jak to mít stále na očích

Průběžný ukazatel zaplnění tam vestavěný sám o sobě není – `/context` je jednorázový výpis. Dokumentace pro sledování stavu odkazuje na vlastní statusline, což zní sice jako práce na večer, ale není. Napíšete jen tohle:

„`
/statusline ukaž model a procento zaplnění kontextu s progress barem
„`

Claude si ten skript napíše sám, uloží ho do `~/.claude/` a sám si ho vloží do nastavení. Data o sezení, včetně zaplnění kontextu, mu chodí na stdin jako JSON.

Je to drobnost, ale zvyknout si uklízet kontext co nejdřív (než dojde ke znatelnému zaplnění), se jinak dost dobře nedá.

## Jak se hlídá kam sáhne?

Claude Code má šest režimů oprávnění a přepínají se `Shift+Tab`. Status řádek dole ukazuje, ve kterém režimu aktuálně jste.

| Režim | Co běží bez ptaní |
|—|—|
| **Manual** | jen čtení |
| **acceptEdits** | čtení, editace souborů, souborové příkazy `mkdir`, `touch`, `rm`, `rmdir`, `mv`, `cp` a `sed` |
| **plan** | čtení, plus příkazy schválené klasifikátorem |
| **auto** | všechno, s kontrolami na pozadí |
| **dontAsk** | jen předschválené nástroje |
| **bypassPermissions** | všechno, bez kontrol |

V řádku `acceptEdits` si všimněte toho `rm` a `sed`. Ten režim není tedy jen o zapisování (jak by mohl název napovídat), ale mažou se v něm i soubory, a to jsou věci, které vám `/rewind` nevrátí . Platí to jen uvnitř pracovního adresáře a `rm` na se sice na kritickou cestu pořád ptá, ale na `rm` nějakých souborů ne.

### Plan mode

Nejužitečnější režim pro začátek. Model čte soubory, prozkoumává, napíše plán, ale **do zdrojáků nesahá**, dokud ten plán neschválíte.

Klíčová klávesa je `Ctrl+G`. Otevře navržený plán ve vašem editoru, kde ho můžete upravit, než ho pustíte dál. Opravit odstavec v plánu je mnohem rychlejší (a levnější na kredity/limity) než opravovat kód potom co doběhnou úpravy.

### Co se nedá vynutit

To co napíšete do `CLAUDE.md`, je jen **prosba**. Co dáte do deny pravidla nebo hooku, je pak opravdu **pravidlo**.

Dokumentace to přitom sama nijak neskrývá:

> *„Permission rules are enforced by Claude Code, not by the model. Instructions in your prompt or `CLAUDE.md` shape what Claude tries to do, but they don’t change what Claude Code allows.“*

Jedna nuance, ať to není černobílejší, než to je: v auto módu klasifikátor `CLAUDE.md` **čte** a hranici vyslovenou v konverzaci („nepushuj“) bere jako blok. Jenže se neukládá jako pravidlo, čte se pokaždé znovu z transkriptu, a když ji kompakce vyhodí, přestane platit. Tvrdá záruka zůstává jedna: deny.

Praktický důsledek: `.claudeignore` **neexistuje**. Ani `.gitignore` se pro čtení automaticky neuplatní. Tajemství se blokují deny pravidlem v `.claude/settings.json`:

„`json
{
„permissions“: {
„deny“: [
„Read(.env)“,
„Read(.env.*)“,
„Read(var/dumps/**)“,
„Read(secrets/**)“
]
}
}
„`

Cesty se uvádějí jako v gitignore, takže holé jméno matchne v libovolné hloubce, kdežto `Read(./.env)` (forma, kterou najdete i v dokumentaci) je relativní ke cwd a v monorepu se tam sestane `apps/api/.env`. A dobrá zpráva na závěr: od `v2.1.228` kryje `Read` deny i editace a zápis na té samé cestě, takže stačí jedno pravidlo.

Tři pravidla, která k tomu patří:

**Pořadí je deny -> ask -> allow a rozhoduje první shoda.** Specifičnost pravidla na tom nic nemění.

**Deny se nedá prodírkovat výjimkou.** Široké `Bash(aws *)` v deny zablokuje i to, co má užší allow. Když chcete výjimku, napište užší deny.

**Cestová pravidla se konzultují jen u `Read` a `Edit`.** Napíšete-li pravidlo pro `Write` nebo `Glob`, Claude Code ho přijme, nikdy nepoužije a při startu na to upozorní.

Aby to nebylo jednoduchý, tak to má jeden problém: deny pravidla platí na vestavěné souborové nástroje a na příkazy, které Claude Code v bashi rozpozná (`cat`, `head`, `tail`, `sed`). Neplatí na skript, který si ten soubor otevře sám.

Na to je pak sandbox, samostatná vrstva pod oprávněními, kterou zapnete přes `/sandbox`. Od té chvíle hranici na soubory a síť vynucuje operační systém, pro každý bash příkaz **i pro jeho potomky**, takže je jedno, jestli soubor otevře `cat`, nebo skript, který jste nikdy neviděli. Běží na macOS, Linuxu a ve WSL2, nativně ve Windows ne.

### Past, na kterou narazíte s Dockerem

Tohle se týká každého, komu aplikace běží v kontejneru.

„`jsonc
// ❌ díra: matchne cokoli za „exec“, včetně „docker exec app rm -rf .“
„allow“: [„Bash(docker exec *)“]

// ✅ jedno pravidlo na jeden vnitřní příkaz
„allow“: [
„Bash(docker compose exec -T app bin/phpunit)“,
„Bash(docker compose exec -T app vendor/bin/phpstan analyse)“
]
„`

## Co mu říct o projektu?

`CLAUDE.md` v kořeni repozitáře. Načte se do každého sezení automaticky a je to místo pro věci, které si model nemá odkud přečíst.

Oficiální filtr na každý řádek je jediná otázka: způsobilo by smazání téhle věty, že model udělá chybu? Když ne, škrtněte to.

| Patří tam | Nepatří tam |
|—|—|
| Příkazy, které sám neuhodne (`docker compose exec app bin/phpunit`) | Cokoli, co si přečte z kódu |
| Konvence, které se liší od defaultu | Standardní konvence jazyka |
| Etiketa repa (větve, PR) | Detailní API dokumentace |
| Architektonická rozhodnutí specifická pro projekt | Popis souboru po souboru |
| Zvláštnosti prostředí a pasti | Samozřejmosti typu „piš čistý kód“ |

Cíl je **pod dvě stě řádků**. Delší soubor spotřebuje víc kontextu a přitom **sníží** dodržování, protože se důležitá pravidla ztratí v šumu. Můj vlastní má na tomhle webu padesát řádků a necelých pět set slov a je to spíš moc než málo.

Po vytvoření se vyplatí pusti:

– **`/context`** a v něm sekce **Memory files** – ověříte, že se ten soubor vůbec načetl. Bez toho hádáte.
– **`/doctor`** navrhne, co škrtnout. U mě skoro vždycky vyhodí popis adresářové struktury, tedy něco, co si model přečte sám.

Ještě jedna past, specifická pro monorepo: **podadresáře se načítají lazy**. Pravidlo v `apps/api/CLAUDE.md` neplatí, dokud model nesáhne na soubor v `apps/api/`. Když se divíte, proč „to nedodržel“, tohle bývá odpověď.

A rozhodovací tabulka, která vám ušetří dost tápání. Je přímo z dokumentace:

| Když… | …tak |
|—|—|
| model dvakrát splete konvenci nebo příkaz | `CLAUDE.md` |
| pořád píšete ten samý prompt na začátek úkolu | skill |
| potřetí vkládáte do chatu ten samý postup | skill |
| chcete, aby se něco stalo pokaždé a bez ptaní | hook |
| pořád kopírujete data z okna, do kterého nevidí | MCP server |

## Jak poznám, že skončil moc brzo?

Z celé dokumentace si pamatuju hlavně tuhle větu:

> *„Claude stops when the work looks done. Without a check it can run, ‚looks done‘ is the only signal available, and you become the verification loop: every mistake waits for you to notice it.“*

Když mu nedáte kontrolu, kterou si umí spustit sám, jste tou kontrolou vy. A každá chyba čeká, až si jí všimnete.

K chybám taky přistupuje trochu jinak než jak je vnímáme jako lidi. Halucinovaná metoda na `EntityManager`, která neexistuje, spadne na PHPStanu za dvě vteřiny. Je to očividné naprvní pohled a chytí ji každý nástroj v pipeline. Kdežto implementace, která neošetří okrajový případ, projde vším, co máte, protože je sama o sobě validní. Jenom dělá něco jiného, než jste chtěli. To pro agenta není na první pohled vidět. Dokumentace pro to má vlastní jméno, **trust-then-verify gap**, a doporučení k tomu jednou větou: co neumíte ověřit, to neposílejte dál.

Kontrolu jde postavit ve čtyřech stupních:

1. **Ověřovací krok přímo v zadání.** Nejlevnější a překvapivě účinné.
2. **Podmínka v `/goal`.**
3. **Stop hook.** Deterministická brána, která nepustí konec tahu. S výhradou: po osmi po sobě jdoucích blocích ho Claude Code přebije a tah ukončí.
4. **Ověřovací subagent.** Druhý názor z čistého kontextu.

### `/goal`

Cíl si napíšete jednou větou:

„`
/goal všechny testy v tests/Cart projdou a phpstan analyse je na nule chyb
„`

Po každém běhu malý rychlý model posoudí, jestli podmínka platí. Když ne, Claude začne další běh místo toho, aby skončil. `/goal` bez argumentu ukáže stav, `/goal clear` ho zruší, jeden goal na sezení.

Zrušit se to ale umí i samo: když hodnotitel usoudí, že podmínka je **nesplnitelná**, a při chybě, kterou musíte opravit vy – vypadlé přihlášení, došlý kredit, přetečení kontextu, nedostupný model. Po rate limitu nebo přetíženém serveru běží dál. A `/clear` ho smete taky.

Dvě omezení, bez kterých z toho budete zklamaní:

– **Hodnotitel nespouští příkazy ani nečte soubory.** Soudí jen z toho, co Claude vypsal do konverzace. „Testy projdou“ funguje, „kód je čistý“ ne.
– **`/goal` nemění režim oprávnění.** Aby běhy běžely bez ptaní, potřebuje auto mode.

### Co se dá vrátit

`Esc` už znáte. Dvojité `Esc` na prázdném vstupu (nebo `/rewind`) otevře menu, ze kterého se dá vrátit kód, konverzace, nebo obojí.

Ale to není záloha. Checkpointy podle dokumentace **nesledují soubory změněné bash příkazy**, takže co přepsal `sed` nebo smazal `rm`, to nevrátí. Náhrada verzování to opravdu není. Commitněte si vše vždy dřív, než ho pustíte na něco většího.

## Co si k tomu přidat?

Odpověď pro první měsíc zní: **skoro nic**. Rozhodovací tabulka o dvě sekce výš říká, kdy je čas, a dokud vás žádný její řádek netrefí, nepotřebujete nic. Čtyři věty, ať víte, co ta jména znamenají, až na ně narazíte.

**Skill** je adresář s `SKILL.md`, který se vyvolá jako `/jmeno`. Rozdíl proti `CLAUDE.md` je celý v načítání: tělo skillu se načte, teprve když ho použijete, takže dlouhý referenční postup do té doby nestojí skoro nic. Proto tam patří všechno, co potřebujete jednou za čas. **Plugin** je balík, který umí obsahovat skills, subagenty, hooky, MCP servery i spustitelné soubory. **MCP server** připojí nástroj mimo vestavěnou sadu (issue tracker, databázi); než po něm sáhnete, zkuste CLI. Nástroje jako `gh`, `aws` nebo `gcloud` jsou podle výrobce ke kontextu šetrnější, protože nepřidávají výčet nástrojů do každého tahu. **Subagent** běží ve vlastním kontextovém okně a startuje načisto, což se hodí na upovídané úlohy i na review, protože čerstvý kontext není zaujatý kódem, který právě napsal.

Jedna věc z toho ale patří do prvního měsíce, protože se týká bezpečnosti, ne pohodlí. Věta z dokumentace k pluginům:

> *„Plugins and marketplaces are highly trusted components that can execute arbitrary code on your machine with your user privileges.“*

Plugin může nainstalovat hook. Tedy psát přesně tu vrstvu, kterou jste zaváděli proto, aby vás chránila. A MCP servery třetích stran Anthropic **bezpečnostně neaudituje**. Konektory v adresáři procházejí kritérii pro zařazení, ne auditem.

## Kolik to stojí a kdo za to ručí?

Jediná tvrdá čísla, která výrobce zveřejnil, jsou z enterprise nasazení: v průměru kolem 13 dolarů na vývojáře a aktivní den, 150 až 250 dolarů měsíčně, a u devadesáti procent lidí to zůstává pod třiceti dolary za aktivní den. Je to průměr a dokumentace hned vedle varuje, že rozptyl je velký.

Zajímavější je mechanismus, protože ten si můžete ohlídat. Model si mezi requesty nic nepamatuje, takže se celý kontext posílá znovu při každém běhu. Důsledek je nečekaně praktický: jednořádková otázka v sezení, které máte otevřené celý den, vám ukousne limit za celou tu konverzaci. Proto je nutný `/clear` mezi úkoly. Ten nestojí nic.

Limity běží ve dvou souběžných oknech, klouzavém pětihodinovém a týdenním, a sdílejí se s Claude chatem. Session a týdenní limit platí napříč modely (přepnutí modelu tedy nepomůže), zatímco limity na Opus a Sonnet jsou per rodina, takže tam přepnutí pomůže. Spotřebu ukáže `/usage` (`/cost` a `/stats` jsou jeho aliasy) a ta dolarová částka je lokální odhad podle ceníku, ne fakturace.

Poslední věc, a je to ta, kterou byste měli vyřešit dřív, než tam pustíte firemní repozitář. **Na Pro a Max plánu si volíte, jestli se vaše data smí použít na trénink**, a když je to zapnuté, používají se. Na Team, Enterprise a API se podle dokumentace na kódu a promptech netrénuje, pokud si to zákazník sám nezvolí. Retence je 30 dní standardně, pět let na Pro/Max s povoleným tréninkem. Transkripty navíc leží lokálně v plain textu v `~/.claude/projects/`.

A odpovědnost? Dokumentace k ní má jedinou explicitní větu a je docela jasná:

> Claude Code má jen ta oprávnění, která mu dáte. Za to, že navržený kód a příkazy před schválením posoudíte, odpovídáte vy.

## Co si z toho odnést

Když to zkrátím na to, co bych chtěl, aby si kolega pamatoval za měsíc:

– **`Esc` je brzda**, `/rewind` zpátečka (ale není to git).
– **`/context` ukáže, co model vidí**, statusline to ukazuje pořád.
– **Dvě neúspěšné opravy = `/clear`** a lepší zadání. Ne třetí oprava.
– **`CLAUDE.md` je prosba, deny pravidlo je pravidlo.** Tajemství se blokují přes `Read(.env)` bez `./`, žádný `.claudeignore` neexistuje.
– **Dobré zadání jmenuje soubory, říká, co je mimo rozsah, a končí ověřovacím krokem.**
– **Bez kontroly, kterou si umí spustit sám, jste tou kontrolou vy.**

Zbytek (pluginy, MCP, subagenti, hooky) si počká, až budete mít odpracovaných pár týdnů a budete vědět, co vám vlastně chybí. Nastavovat to dopředu podle článku na internetu je docela spolehlivý způsob, jak si zaneřádit kontext věcmi, které nepoužíváte.

Ono to celé stojí na tom zvyknout si, že na druhé straně není někdo, kdo odpovídá, ale něco, co jedná.

**Platí k 7. 9. 2026, dokumentace po `v2.1.259`.**

## Zdroje

– [Claude Code – nastavení a instalace](https://code.claude.com/docs/en/setup)
– [Claude Code – best practices](https://code.claude.com/docs/en/best-practices)
– [Claude Code – kontextové okno](https://code.claude.com/docs/en/context-window)
– [Claude Code – oprávnění](https://code.claude.com/docs/en/permissions)
– [Claude Code – režimy oprávnění](https://code.claude.com/docs/en/permission-modes)
– [Claude Code – sandbox](https://code.claude.com/docs/en/sandboxing)
– [Claude Code – `/goal`](https://code.claude.com/docs/en/goal)
– [Claude Code – skills](https://code.claude.com/docs/en/skills)
– [Claude Code – pluginy](https://code.claude.com/docs/en/discover-plugins)
– [Claude Code – náklady](https://code.claude.com/docs/en/costs)
– [Claude Code – práce s daty](https://code.claude.com/docs/en/data-usage)

Michal Katuščák
Michal Katuščák

Navrhuji a vyvíjím aplikace nad Symfony a Reactem, zajímám se architekturu softwaru. Žiju v Českých Budějovicích.