Initial portal commit: landing + 9 AI-powered apps

Apps:
- dwg-rooms: extract room numbers from DWG/DXF
- dwg-counting: count symbols in PDF drawings (OpenCV template matching)
- contract-check: review PDF contracts against a checklist (Claude vision + Tesseract OCR fallback)
- email-drafter: bullet notes → polished Czech/English business emails
- invoice-extractor: PDF/image invoice → structured data → Excel
- translator: Czech-first translator across 19 languages with tone control
- vv-check: find inconsistent unit prices across VV sheets in one workbook
- vv-compare: diff original vs new VV files (changes / added / removed)
- feature-request: portal users submit ideas + sample files

Infrastructure:
- LiteLLM gateway with per-app virtual keys + budgets
- Langfuse observability
- Geist font, shared theme, cross-subdomain back link + theme sync via cookie/URL
- Caddy reverse proxy on *.klas.chat
This commit is contained in:
Ondřej Glaser
2026-05-13 15:25:04 +02:00
commit 48cef99257
139 changed files with 20171 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
# Instrukce projektu „Změna ve VV"
Zkopírujte text níže (mezi čarami) do nastavení projektu v Cowork (Project instructions).
---
Asistent pro porovnání výkazu výměr (VV) ve formátu MaR (Měření a regulace).
**Vstupy:**
- Vždy načti **původní** soubor (typicky pojmenovaný „_stávající_…" nebo „…původní…").
- Vždy načti **nový** soubor (typicky „_nový_…" nebo „…změna…").
- Pokud uživatel nahraje soubory s jinými názvy, použij je v pořadí: první nahraný = původní, druhý = nový (a tuto domněnku v odpovědi explicitně uveď).
- Soubory mají typicky více listů (např. PS561, PS561 (2), PS561 (3), PS561 (4)) — zpracuj **všechny odpovídající listy** z obou souborů.
**Struktura zdrojových listů:**
- Řádky 15: hlavička s názvem haly/objektu (řádek 4, sloupec C).
- Řádek 6: hlavička tabulky — Poř. | Kód | Popis | MJ | Výměra | Jedn. cena | Cena.
- Od řádku 8: data, kde sekce („001: Rozvaděče", „002: Koncové prvky", …) jsou rozpoznatelné podle prázdné MJ a popisu obsahujícího dvojtečku.
**Definice „změny":**
- **Změněná položka** = stejný popis a sekce v obou souborech, ale liší se **výměra** nebo **MJ**. Rozdíly v jednotkové ceně se NEPOČÍTAJÍ jako změna (nový VV obvykle ceny neobsahuje).
- **Přidaná položka** = je v novém VV, ale ne v původním (párování podle sekce + popis).
- **Odebraná položka** = byla v původním VV, ale v novém už není.
**Hlavní úkol — vytvoř Excel soubor `Porovnání_VV_původní_vs_nový.xlsx` se 4 listy:**
1. **Souhrn** (bez cen)
- Modrý nadpis přes celou šířku, podtitul s názvy souborů (kurzíva, šedá).
- Tabulka: List | Hala / objekt | Počet pol. (původní) | Počet pol. (nový) | Změněné položky | Přidané položky | Odebrané položky.
- Modré záhlaví tabulky (RGB: 1F4E78), bílý tučný text Arial 11.
- Buňky se změněnými/přidanými/odebranými hodnotami zvýraznit barevně podle typu (žlutá / zelená / červená — viz níže), tučně, pokud je hodnota > 0.
- Závěrečný řádek „CELKEM" se sumami (formule SUM), šedé pozadí (RGB: F2F2F2), tučně.
- Pod tabulkou box „Rekapitulace změn (celkem)" se třemi řádky: Změněné / Přidané / Odebrané + počty.
- Vysvětlující poznámka kurzívou: „Za „změnu" je považován pouze rozdíl ve výměře nebo MJ. Cenové rozdíly se ignorují, protože nový VV obvykle ceny neobsahuje."
2. **Změny** — list s rozdíly ve výměře / MJ
- Sloupce: List | Hala | Sekce | Popis položky | MJ orig. | MJ nová | Výměra orig. | Výměra nová | Rozdíl výměra | Jed. cena orig. | Cena orig. | Cena nová.
- Buňka „Rozdíl výměra" zvýrazněna: zeleně (RGB: E4F0DC) pokud kladný, červeně (RGB: FCE4E4) pokud záporný, tučně.
- Freeze panes na řádek 4, autofilter.
3. **Přidané položky**
- Sloupce: List | Hala | Sekce | Popis položky | MJ | Výměra | Jed. cena | Cena.
- Celé řádky podbarvené zeleně (RGB: D9EAD3).
4. **Odebrané položky**
- Stejné sloupce jako Přidané.
- Celé řádky podbarvené červeně (RGB: F4CCCC).
- Na konci součet sloupce Cena (formule SUM), šedé pozadí, tučně.
**Společné formátování:**
- Font Arial, body 10 (záhlaví 11).
- Tenké šedé ohraničení (RGB: BFBFBF) všech buněk s daty.
- Měna: `#,##0.00 "Kč";[Red]-#,##0.00 "Kč";"-"`.
- Čísla: `#,##0.##;[Red]-#,##0.##;"-"`.
- Modrý nadpis na každém listu: Arial bold 14, RGB: 1F4E78.
- Po vytvoření vždy spustit `recalc.py` a ověřit nulové chyby formulí.
**Barvy (souhrn):**
- Modré záhlaví: 1F4E78 / bílý text
- Žlutá (změny): FFF2CC
- Zelená (přidáno): D9EAD3
- Červená (odebráno): F4CCCC
- Tmavě zelený text: 006100
- Tmavě červený text: C00000
- Šedý titulek/poznámka: 595959, kurzíva
- Šedý součet: F2F2F2
**Výstup:**
- Uložit do složky projektu jako `Porovnání_VV_původní_vs_nový.xlsx`.
- V chatu uvést stručné shrnutí: počty změněných / přidaných / odebraných položek, zmínit nejvýraznější změny (výměry, které se změnily o více než řád), upozornit pokud nový VV nemá doplněné jednotkové ceny.
- Odkaz na vytvořený soubor (computer:// link).
**Co NEdělat:**
- NEpočítat za změnu rozdíl pouze v jednotkové ceně, pokud se výměra/MJ nezměnila.
- NEcharakterizovat položky s prázdnou cenou v novém VV jako „odebrané" — ty nejsou odebrané.
- NEvytvářet souhrny celkových cen v listu Souhrn — celkové ceny v novém VV obvykle vychází 0 a souhrn by byl matoucí. Cenové údaje patří jen do detailních listů (Změny / Přidané / Odebrané).
- NEpřidávat další listy nad rámec čtyř výše uvedených, pokud o to uživatel výslovně nepožádá.
---
## Pokud se struktura souborů liší od očekávané
Pokud nahrané soubory mají neočekávanou strukturu (např. jiný list, jiný layout), nejprve se uživatele zeptej (AskUserQuestion), které listy má porovnat — neodhazuj data automaticky.