# AGENTS — GitCover.WebStaticBuilder Guidelines für KI-Agenten, die an diesem Tool (nicht an einer der GCC/GCBoK-Websites) arbeiten. ## Wesen des Projekts - Eigenständiger **Static-Site-Generator** (C# / .NET 10, kompilierte Konsolen-App, Assembly `webstatic`). - Früher: Submodul `OSS/build_webstatic` innerhalb der GCBoK-Website (`www/build/`). Seit 2026-07 eigenständiges OSS-Tool (per-user-Install unter `~/.local/share/GitCover/webstatic`, optionale System-Installation unter `/opt/GitCover/webstatic`; KMU-fähig). - **Kein Python.** Einzige externe Build-Abhängigkeit: `npx pagefind` (Suchindex, optional). - Lizenz: **Apache-2.0** (`LICENSE.md`, `NOTICE`) — explizite Patentlizenz §3 + Retorsionsklausel. ## Build & Verify (kanonisch) ```bash dotnet build -c Release # kompiliert src/ -> bin/Release/net10.0/webstatic.dll dotnet bin/Release/net10.0/webstatic.dll build --env work --verbose # Beispiel in webstatic.example/ dotnet bin/Release/net10.0/webstatic.dll serve --port 8000 # lokale Vorschau ``` ## Konventionen - **Namespace:** `GitCover.WebStaticBuilder` (jede `.cs` in `src/` deklariert ihn; `Program.cs` nutzt `using GitCover.WebStaticBuilder;`). - **Packages:** `Markdig`, `YamlDotNet` (Versionen **explizit** gepinnt — CPM ist deaktiviert via `false`). - **Keine unversionierten `PackageReference`** (führt zu NU1015). - **Config-Priorität:** CLI-Flags > `webstatic.json` > eingebaute Defaults (`BuildConfig.Defaults()`). - **Pfade generisch:** nie hartkodiert auf `www/` — alles über `Directories` (aus `BuildConfig.Paths` relativ zum Site-Root). - **i18n:** UI-Texte über `{{ i18n.. }}` in Templates; Daten in `i18n.json`; Substitution via `I18n.cs` (Fallback Englisch). ### Author & Urheberschaft (Axel Druschel) - **Alle Development-Arbeit wird von Axel Druschel ausgeführt** — bei jeder Änderung ist er als **Author** zu benennen (Entwickler-Attribution in Artefakten). - **Git-Identität (commit author):** immer `gc-dev-afjd` / `axel.druschel@gitcover.de` (Handle, **nicht** der Klarname). Also: `git -c user.name=gc-dev-afjd -c user.email=axel.druschel@gitcover.de commit`. Im Repo vorkonfiguriert via `git config user.name/user.email`. - **Quelldatei-Header `Author:`** nennt den **Klarnamen** `Axel Druschel` (Attribution des Urhebers); das steht unabhängig von der Git-Handle-Identität. - **Apache-2.0-konform:** Die `Copyright`-Zeile in `LICENSE.md`/`NOTICE` und den Quelldatei-Headern nennt den **Rechteinhaber** `GitCover Commons gUG (haftungsbeschränkt)` (die juristische Person). `Author: Axel Druschel` benennt zusätzlich den Urheber/Entwickler — das widerspricht Apache-2.0 nicht (die Lizenz regelt nur die Rechtegewährung durch den Rechteinhaber, nicht die Urheberbenennung). - Quelldatei-Header (kanonisch in `docs/license-header.md`) enthalten daher: `Copyright 2026 GitCover Commons gUG (haftungsbeschränkt)` + `Author: Axel Druschel` + `SPDX-License-Identifier: Apache-2.0`. ## Verzeichnisstruktur `plans/` (Pläne), `docs/` (Anleitungen), `diary/` (Dev-Tagebuch), `src/` (Code), `tests/` (Tests), `webstatic.example/` (KMU-Vorlage), `install.sh`, `LICENSE.md`. ## Guardrails - Umlaute in Prosa verwenden (`ä ö ü ß`), nicht `ae/oe/ue`. - `§` (nicht ausgeschrieben) für Gesetzesparagraphen. - **Kein Commit ohne expliziten Wunsch.** Bei Release: signierte Commits. - `dist/`, `bin/`, `obj/`, `.translation-drafts/` sind gitignored. - Machine-Translation liefert nur **Entwürfe** (`.translation-drafts/`), nie Auto-Überschreibung. ## Versions-Definition (Definition of Done für Releases) Die Versionsnummer wird an **drei Stellen synchron** gehalten — ein Release-Commit muss alle drei aktualisieren, andernfalls warnt `webstatic --version` vor einem Mismatch: 1. **`README.md`** — Block-Quote `> **Version: X.Y.Z**` direkt unter dem Titel (kanonisch; per `git show origin/main:README.md` remote sichtbar) 2. **`GitCover.WebStaticBuilder.csproj`** — `X.Y.Z` (Assembly) 3. **`webstatic --version`** — gibt Assembly-Version aus, vergleicht mit README und remote Commit-Hash (`git ls-remote origin HEAD`) Vor einem Release sind lokal und remote die Version feststellbar, ohne die CLI aufzurufen: ```bash git show HEAD:README.md | head -3 # lokal git show origin/main:README.md | head -3 # remote ```