← Zpět na blog AI & LLM

Claude Code v cloudu: zadám z mobilu, dopíšu v terminálu

V pondělí jsem si pustil skript, co stahuje týdenní statistiky webu, a týden, co právě skončil, v datech chyběl. Hledal jsem proč a zjistil, že to není chyba: skript schválně čeká dva dny, protože Search Console dodává data se zpožděním. Sám jsem si to tam dal a zapomněl. Chtěl jsem na to testy, ať se příště nedivím — úkol malý, ohraničený, bez tokenů, ale já zrovna neseděl u počítače. Tak jsem ho zadal Claude Code z mobilu, nechal běžet v cloudu a k terminálu si sedl až na kontrolu a merge.

(Jak přenáším práci mezi Windows a Macem přes jedno privátní repo, popisuje článek o synchronizaci mezi stanicemi. Cloud session je vlastně třetí stroj — jen ho nemusím syncovat, repo si klonuje přímo z GitHubu. A ten skript, co dostal testy, si tahá čísla z Analytics a Search Console — jak vznikl, je v článku o GA přes MCP.)

Co to vlastně je

Cloud sessions jsou Claude Code běžící na stroji Anthropicu místo na mém. V mobilní appce je záložka Code, na webu totéž: vyberu repo připojené přes GitHub, napíšu zadání a session se rozjede v sandboxu — čerstvá VM s Ubuntu 24.04, naklonuje si repo a pracuje. Výsledek pushuje na vlastní claude/* branch, na main nesáhne.

Dvě věci, které mě zajímaly nejdřív: platí se to? Ne zvlášť — žádné API kredity, cloud běhy jedou v rámci předplatného a sdílí rate limity s ostatním používáním (research preview pro Pro, Max i Team účty). A co ten stroj vidí? Jen repo. CLAUDE.md a .claude/ z repa ano, můj lokální ~/.claude, necommitnutou práci ani secrets ne. Síť má defaultně na allowlistu jen balíčkové registry.

Jak běh vypadal

Zadání šlo z mobilu česky:

Přidej testy pro scripts/analytics_snapshot.py — funkce iso_week_id, week_range a closed_weeks. Hlavně pohlídej chování closed_weeks: poslední bezpečná neděle je today minus 2 dny (v pondělí ještě nesmí vzít týden, co skončil včera; od úterý už jo). Ve skriptu jsou doctesty — rozhodni sám, jestli je stačí pustit doctest runnerem, nebo napsat unittest, a zapoj to do npm skriptů, ať se to pouští jedním příkazem. Na síťové funkce nesahej, testuj jen datumovou logiku bez tokenů.

Session si naklonovala repo, přečetla CLAUDE.md i paměťové soubory a pustila se do práce. První zádrhel nebyl v mém kódu: node testy jí spadly na chybějící node_modules. Čerstvý stroj, žádný můj lokální stav — musela si nejdřív udělat npm install. Sama to pak v shrnutí poctivě uvedla s poznámkou, že to se změnou nesouviselo.

V zadání jsem schválně nechal jedno rozhodnutí otevřené: doctest runner, nebo unittest? Vybrala si unittest, který doctesty pohltí přes load_tests — a zdůvodnila proč: doctesty ve skriptu jsou tři jednořádkové příklady, fungují jako dokumentace, ale nepohlídají to nejkřehčí — že se něco nestane (v pondělí se včerejší neděle nebere). To mě potěšilo víc než samotný kód.

Výsledkem je 19 testů. Projdou týden den po dni a hlídají, kdy se který týden smí vzít, to samé zkontrolují přes celý rok 2026 a nevynechají přelom roku ani zarovnání začátku stahování na pondělí. Session si navíc ověřila, že testy opravdu chytnou regresi: přepsala ty dva dny čekání na jeden a čtyři testy spadly. K tomu pár věcí okolo — npm test teď pouští node i python testy jedním příkazem, __pycache__ přibylo do .gitignore a v CLAUDE.md je aktualizovaná sekce o testech. Všechno pushnuté na claude/analytics-snapshot-tests-pczh5n.

Commit z cloudu má na konci zprávy řádek Claude-Session: s odkazem na session, která ho vytvořila — v git log pak jde kdykoli dohledat, odkud se ta změna vzala. A PR session sama nezaložila: zeptala se, jestli ho má otevřít. Merge zůstává na mně, a to je dobře.

K diffu jdou psát inline komentáře přímo z mobilu a session na ně reaguje. Tentokrát jsem to nevyužil — diff jsem si stejně chtěl projít až u terminálu.

Teleport do terminálu

Doma pak stačí v terminálu:

cd cesta/k/repu
claude --teleport

Příkaz nabídne seznam cloud sessions k převzetí, Enter — a session pokračuje lokálně: stáhne branch, checkoutne ji a naváže konverzaci i s celým kontextem. Na obrazovce se objevilo kompletní shrnutí cloud běhu, jako bych u něj celou dobu seděl. Příkazy jsou stejné na Windows i Macu.

Pak už klasika: projít diff, pustit testy lokálně — 155 node + 19 python, vše zelené — a merge do main. Jedna věc na Windows: npm run test:py volá python3, který tam typicky není; pouštím python -m unittest discover -s tests/analytics -p "test_*.py" přímo.

Pasti a mantinely

  • Teleport chce vlastní terminál. Uvnitř běžící Claude session nejde spustit — je to interaktivní příkaz. Nové okno, cd do repa, pak claude --teleport.
  • Teleport přepne branch. Checkoutne branch cloud session — a když má to samé repo otevřené jiná session nebo druhé okno, změní se jim pracovní strom pod rukama. Mně se soubory „vrátily v čase" o den, protože branch vycházela ze staršího main. Commitům se nic nestalo, git switch main po zavření session všechno vrátí — jen je dobré vědět, co se právě děje.
  • Dvě sessions, stejný název. Picker mi nabídl dvě položky „Testy pro analytics_snapshot.py", obě stejně staré — a neukazuje session ID ani branch. Která je ta pravá, se pozná až uvnitř podle checkoutnuté branche a historie; jinak Esc a druhá. Pomůže i řádek Claude-Session: na konci commit message.
  • Push jen na vlastní branch. Git credentials do VM nikdy nedoputují — pushe jdou přes proxy a projdou jen na branch dané session. Cloud na main nic nenapíše.
  • Čerstvý stroj pokaždé. Sandbox startuje z čistého klonu a závislosti si instaluje sám — proto ta zastávka na node_modules. Setup script má limit zhruba pět minut; prostředí se cachuje jako snapshot a po týdnu expiruje. Session to přežije — naváže na čerstvé VM.
  • Žádný trezor na secrets. Env proměnné prostředí si přečte každý, kdo ho používá. Úkoly pro cloud vybírám tak, aby tokeny nepotřebovaly — proto testy čisté datumové logiky a ne něco, co sahá na API.

Kdy ano, kdy ne

Po jednom běhu si netroufám na velké soudy, ale pár věcí je vidět už teď. Dává smysl: malý, jasně ohraničený úkol bez lokálního stavu a bez secrets — testy, dokumentace, izolovaný refaktor — a hlavně ve chvíli, kdy nesedím u počítače. Zadání z mobilu zabralo dvě minuty a večer na mě čekala hotová branch. Nedává smysl: cokoli, co potřebuje lokální prostředí nebo tokeny, a větší zásahy, které chci řídit průběžně — tam session pojede dlouho sama a diff na konci je příliš velké sousto.

Paralelní práci na víc úkolech lokálně řeším jinak — přes git worktrees, o tom připravuju samostatný článek. A existuje ještě třetí varianta, @claude v GitHub PR přes Actions — ta se na rozdíl od cloud sessions platí přes API.

Závěr

Malý úkol prošel celým kolečkem bez jediného zásahu: zadání z mobilu, sandbox, promyšlené rozhodnutí unittest vs. doctest, push na vlastní branch, teleport, zelené testy, merge. Kontrola a merge zůstávají na mně — cloud si je ani nebere.

Co si odnáším: dobré zadání je půlka výsledku (napsat přesně, co mají testy pohlídat, a co nechat na rozhodnutí), sandbox si všechno instaluje od nuly a teleport funguje spolehlivě — jen chce vlastní terminál a je dobré vědět, že přepne branch. Na úkoly typu „napiš na tohle testy" je to přesně ono. Zadám z mobilu, mergnu doma.

Spolupráce

S čím vám můžu pomoci?

Máte projekt, nápad nebo jen otázku? Pište, volejte, posílejte poštovní holuby... Rád to s vámi proberu. Nezávazně. Jdeme na to?

Pojďme na to!