initial commit of project

generated by OpenCode and MiniMax M3.1 Flash Free
This commit is contained in:
2026-10-20 14:11:56 +02:00
parent 354a83d651
commit 5b4bfd928d
9 changed files with 3964 additions and 1 deletions
+85
View File
@@ -0,0 +1,85 @@
# AGENTS.md — JSON DevTools
Statická jednostránková aplikácia (vanilla ES6+, HTML/CSS/JS). Bez frameworkov,
bez npm, bez build procesu, bez backendu, bez CDN. Bez CI, `package.json` ani
lint konfigurácie — repozitár je hotový, nič sa nekompiluje.
## ZákAZ KONTROL V PREHLIADAČOCH
**V prehliadačoch sa nesú overovanie aplikácie – používateľ to robí sám.**
Neotváraj Chrome/Chromium ani iný prehliadač, neautomatizuj ich, nescreenshotuj
cez prehliadač. Trvalé používateľské nariadenie, zapísané aj v globálnej pamäti
`~/.config/opencode/AGENTS.md`.
Povolené: statická kontrola (`node --check`), testy logiky v Node.js, `curl`/`python`.
Nepridávaj do repozitára testy ani nástroje založené na prehliadači.
## Štruktúra
```
src/index.html src/style.css src/app.js # aplikácia – musia zostať v jednej zložke
tests/logic.test.js # Node testy (bez prehliadača)
docs/ # screenshoty pre README
```
* `src/index.html` načítava `style.css` a `app.js` **relatívnou cestou** → všetky
tri súbory musia zostať v `src/`. Presun do rootu rozbije načítanie aj testy.
* Aplikácia sa otvára ako **`src/index.html`** (relatívne cesty), nie cez root.
* Repo hostuje **Gitea**, nie GitHub — nepridávaj GitHub Actions/Pages šablóny.
## Príkazy
```bash
node --check src/app.js # rýchla syntax kontrola
node tests/logic.test.js # testy logiky – 93 assertov, exit 1 pri chybe
python -m http.server 8080 --directory src # lokálne spustenie (voliteľné)
```
Nie je čo `npm install`ovať ani buildovať – po úprave `src/*.js|css|html` stačí
reload stránky.
## Ako funguje `tests/logic.test.js`
* `src/app.js` sa načíta do `vm` sandboxu s **ručným DOM stubom** (žiadne jsdom).
Aplikácia sa musí vedieť načítať bez reálneho DOM.
* Stub vracia **nový generický element pri každom `querySelector()`** → DOM
interakcie (tlačidlá, eventy, fokus) sa v Node testoch **neoverujú**. Overuj
logiku cez `window.JSONDevTools`, nie cez DOM.
* `src/app.js` musí na konci exportovať **`window.JSONDevTools`** (objekt s
modulmi `Utils, Toast, Theme, Splitter, Highlighter, Doc, Formatter, FileIO,
Tree, Diff, Api, History, App`) — bez neho testy skončí chybou.
* Testy čítajú `../src/app.js` a `../src/index.html` → pri presunu súborov treba
upraviť cesty v `tests/logic.test.js`.
* Pomocníci: `ok(name, cond, extra)`, `eq(name, a, b)`, `deepEq(...)`, `section(t)`.
* Testy obsahujú aj statické kontroly konzistencie: každé `$('#id')` v `app.js`
musí existovať v `index.html`, každé `<button id>` musí mať handler, `id` v HTML
nesmie byť duplicitné. **Nové `id` v HTML pridaj aj do `app.js`**, inak test
zfailuje.
## Architektúra `src/app.js`
Jeden IIFE, vnútri moduly: `Utils`, `LS`, `Toast`, `Theme`, `Splitter`,
`Highlighter`, `Doc`, `Formatter`, `FileIO`, `Tree`, `Diff`, `Api`, `History`,
`App`. Bez tried, bez DI – moduly sú plain objekty.
Nároky, ktoré treba rešpektovať:
* **`Doc` je zdieľaný stav** medzi Formatter a Tree – oba textareas sú synchro
cez `Doc.set(text, origin)`. Nový JSON pohľad pripoj cez `Doc.onChange()`,
nie vlastnou kopírou textu.
* **`localStorage` len cez `Utils.store`** (prefix `jsondevtools.*`). Wrapper
zachytáva prekročenie kvóty a vyhodí toast – nepristupuj k `localStorage`
priamo.
* **Bezpečnostná invariant:** do historie sa nikdy nesmie uložiť `Authorization`,
`Cookie` ani `X-Api-Key` – prechádza to cez `sanitizeHeaders()` v `Api`.
Tokeny žijú iba v pamäti stránky.
* CSS motívy sú CSS custom properties v `html[data-theme="dark"|"light"]` –
nové farby pridávaj ako premenné, nie ako hardcoded hodnoty.
* UI texty v slovenčine, JSON hodnoty v angličtine.
## Ostatné
* Screenshoty v `docs/` sú v README vložené relatívnou cestou (`docs/...`) –
pri presúvaní ich treba aktualizovať aj v `README.md`.
* `src/index.html?theme=light|dark` prepne motív **len pre dané načítanie** – uloženú
preferenciu v `localStorage` neprepíše (prepíše ju až prepínač v hlavičke).