# Rozpisky — pokyny pro Claude Code WPF desktopová aplikace (.NET 10, `net10.0-windows`, AnyCPU) — generátor výkresových rohových razítek („rozpisek") pro Správu železnic. Náhrada původního excelového nástroje „Rozpisky 1.0.8". ## Příkazy ```powershell dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q dotnet run --project "Rozpisky\Rozpisky.csproj" ``` Baseline: build bez chyb a varování, **119 testů zelených**. Před hlášením hotovo obojí spustit (nebo použít `/overit`). Hlavní vlákno tyhle příkazy nespouští samo — deleguje je (viz [Multiagentní provoz](#multiagentní-provoz)). ## Architektura — jediné pravidlo, které se nesmí porušit Veškerá kresba jde přes jedno rozhraní [`IProfileRenderer`](Rozpisky/Rendering/IProfileRenderer.cs). Tatáž kresba teče na obrazovku, do PNG, do PDF i do DXF. **Nový výstupní formát = nová implementace `IProfileRenderer`, nikdy nový kreslicí kód.** Čtečka [`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs) jen čte DXF šablonu a „přehrává" ji do tohoto rozhraní. Z toho plyne druhé pravidlo: **co má přežít cestu DXF → model → DXF, musí protéct rozhraním.** Zdrojové soubory jsou zapsané indexovanými barvami AutoCADu, takže stav kresby ([`KresliciStav`](Rozpisky/Rendering/KresliciStav.cs)) nese barvu **i s původem** (ACI index / true color / ByLayer / ByBlock), název textového stylu a vzor šrafy — ne jen výsledné RGB. Nová vlastnost, kterou má export zachovat, patří do rozhraní; obcházet ho stranou (sáhnout z rendereru zpátky na `CadDocument` šablony) je porušení prvního pravidla. Podrobnosti (vrstvy, NuGet API, pravidla zápisu DXF, tabulka čtených entit a známá omezení) — [`ROZPISKY.md`](docs/ROZPISKY.md). Nečíst celý, jen relevantní kapitolu. ## Konvence - **Kód, komentáře, commity i názvy typů jsou česky** (`BoundsTesty`, `PlaceholderHladiny`, `NajdiKoren`). Držet se toho, nepřejmenovávat do angličtiny. - MVVM bez frameworku: znovupoužít [`RelayCommand`](Rozpisky/ViewModels/RelayCommand.cs) a [`ObservableObject`](Rozpisky/Models/ObservableObject.cs) — nepsat vlastní ani nepřidávat NuGet (CommunityToolkit apod.). - XAML: barvy a rozměry **jen** z `Rozpisky/Themes/Colors.Dark.xaml` a `Metrics.xaml` (WPF-DarkTheme-Kit). Žádné hardcoded `#RRGGBB` ani natvrdo zadané odsazení. - `Nullable` a `ImplicitUsings` jsou zapnuté v obou projektech. - COM (CAD, MS Excel) jde přes pozdní vazbu (`dynamic`) — nepřidávat interop assembly. - Uživatelská data (číselníky, výběr CADu, logy) jdou přes [`UzivatelskaData`](Rozpisky/Data/UzivatelskaData.cs) do `%APPDATA%\Rozpisky`. Do složky u `.exe` se **nezapisuje** — může být jen pro čtení a přeinstalace ji přepíše. Číselníky navíc žijí ve dvou vrstvách ([`CiselnikyStore`](Rozpisky/Data/CiselnikyStore.cs)) a loga ve dvou složkách ([`LogaResolver`](Rozpisky/Dxf/LogaResolver.cs)): dodávané + uživatelské navrch. **Při konfliktu vyhrává uživatelská vrstva** — jinak by se jeho úprava tiše neprojevila. Výjimka jsou data, která drží správnost výstupu (`mapovani.json`, `Rozpiska.dxf`) — tam vyhrává program. Změnu slučování vždy pokrýt testem: chyba tam se projeví tichou ztrátou dat. ## Rozvržení složky — tři druhy podkladů | Kde | Co to je | |---|---| | `docs/` | Podklady **jen pro tvorbu programu** — architektura, datový model, normativní manuál SŽ v `.md`. Nedodává se uživateli. | | `Rozpisky/Podklady/` | Podklady **nutné k běhu** — kopírují se vedle `.exe` (plochá struktura + `loga\`, řídí `Link` v `.csproj`). Aplikace je **jen čte**. | | `%APPDATA%\Rozpisky` | Podklady **vznikající za běhu** — vše, co píše uživatel. V repu nejsou a nemají tam co dělat. | | `vzorky/` | Cizí vstupy pro ruční zkoušení (`schema.dxf`). Nedodává se. | Nové dodávané datum = do `Rozpisky/Podklady/` **a** řádek v `.csproj` s `Link`, ať výstup zůstane plochý. Nový zapisovaný soubor = přes `UzivatelskaData.Cesta(...)`, nikdy `AppContext.BaseDirectory`. ## Kam nesahat - `Rozpisky/Podklady/Rozpiska.dxf`, `vzorky/schema.dxf` — produkční DXF šablony. - `Rozpisky/Podklady/loga/*.dxf` — dodávaná loga (9 ks, testy je renderují). - `Rozpisky/Podklady/SEZNAM.xlsx` — mustr „Seznam příloh". - `docs/SZ_SM011_P10_Manual_v6.md`, `Rozpisky/Podklady/SZ_SM011_P10_Manual_v6.pdf` — normativní podklad SŽ, jen ke čtení. ## Multiagentní provoz Repo běží jako tým agentů. `.claude/settings.json` nastavuje `"agent": "orchestrator"`, takže **hlavní session *je* orchestrátor** — má jen `Agent`, `TodoWrite`, `AskUserQuestion` a `Skill`, žádné nástroje na soubory ani na spouštění příkazů. | Role | Model | Nástroje | Práce | |---|---|---|---| | `orchestrator` (hlavní session) | Opus, high | Agent, TodoWrite, AskUserQuestion, Skill, SendUserFile | Plánuje a deleguje. **Nemá žádné souborové nástroje** (`SendUserFile` jen na cesty nahlášené subagentem). | | `scout` | Haiku | Read, Grep, Glob | Zjišťuje fakta o kódu. Read-only. | | `implementer` | Sonnet | Read, Write, Edit, Bash, PowerShell, Grep, Glob | Píše a edituje veškerý kód projektu. | | `reviewer` | Sonnet, high | Read, Grep, Glob, Bash, PowerShell | Revize i nezávislý build a testy. PROŠLO / POTŘEBUJE ZMĚNY. Read-only. | ### Pravidla - Hlavní vlákno nečte, nepíše, nehledá ani nespouští. Chceš-li se podívat do souboru, pošli `scout`. - **Nejdřív fakta, pak plán:** nech si od `scout` potvrdit, že soubor, metoda nebo konvence existuje, dřív než kolem toho plánuješ. - Veškerou implementaci dělá `implementer`. Změna přes víc vrstev (kreslicí jádro, UI, data...) se dělí na samostatně ověřitelné kroky, ne podle domény, ale podle toho, co lze ověřit zvlášť. - Každý prompt pro subagenta musí stát sám o sobě — absolutní cesty, úplná specifikace, znovu vypsaná zjištění. Subagent z konverzace nevidí nic. - Nic není hotové bez PROŠLO od `reviewer`. - Když je požadavek nejednoznačný natolik, že dvě čtení dají jinou práci, spusť skill `upresni`. ### Ověřování - Žádný hook build nespouští. **Ověřené je jen to, co agent skutečně spustil.** - `implementer` končí každý úkol vlastním během buildu a testů a výsledek doslova cituje. Dokud je build červený, úkol není hotový. - `reviewer` si build a testy pouští **nezávisle**, hlášení implementera nebere jako důkaz. - Orchestrátor musí požadavek na ověření napsat explicitně do každého promptu pro implementera i revizora — subagent tahle pravidla automaticky nedědí. ## Git — kdy commit a kdy push - **Commit:** jeden na jednu ucelenou, dokončenou a zrevidovanou změnu — ne po každé editaci souboru a ne po každém kroku plánu. Commituje se až po zeleném buildu a testech a po `PROŠLO` od `reviewer`. Rozdělaná práce, červený build ani „průběžný stav" se necommitují. - Zpráva commitu je **česky**, v duchu historie repa: `Oblast: co se změnilo a proč` (`Šrafy: rozvinout vzor na čáry místo plné výplně`). Popisuje účinek, ne seznam souborů. - **Push jen na vyžádání.** `git push` se nespouští sám od sebe — ani po commitu, ani na konci session. Čeká se, až o něj uživatel výslovně požádá. `git push` proto **není** a nemá být v `permissions.allow`; každý push projde promptem. - Když je v pracovním stromu hotová práce a session končí, orchestrátor v závěru jednou větou řekne, co je scommitované a kolik commitů čeká na push. Nenabízí push jako akci, kterou už provedl. - Commit spouští subagent, který má `Bash` (typicky ten, který změnu udělal); orchestrátor git nespouští, jen ho zadá jako samostatný krok po revizi. ## Další dokumentace [`ROZHRANI.md`](docs/ROZHRANI.md) — obrazovky, pole a datový model. [`PODKLAD_CAD_Layout_Tisk.md`](docs/PODKLAD_CAD_Layout_Tisk.md) — CAD, layouty a tisk přes COM.