diff --git a/.github/scripts/postprocess-docfx-site.sh b/.github/scripts/postprocess-docfx-site.sh new file mode 100644 index 0000000..621cfbb --- /dev/null +++ b/.github/scripts/postprocess-docfx-site.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -euo pipefail + +site_root="${1:-_site}" + +if [[ ! -d "$site_root" ]]; then + echo "DocFX site directory '$site_root' does not exist." >&2 + exit 1 +fi + +while IFS= read -r -d '' html_file; do + perl -0pi -e 's/]*\blang=)/##g' "$html_file" + perl -0pi -e 's#(]*\bclass="[^"]*\bdropdown-toggle\b[^"]*"[^>]*?)\saria-expanded="false"([^>]*>)#$1$2#g' "$html_file" +done < <(find "$site_root" -type f -name '*.html' -print0) + +if [[ -f "$site_root/public/docfx.min.js" ]]; then + perl -0pi -e 's!!!g' "$site_root/public/docfx.min.js" + perl -0pi -e 's!!!g' "$site_root/public/docfx.min.js" +fi diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml index 65c2cff..aed31a6 100644 --- a/.github/workflows/docs-pages.yml +++ b/.github/workflows/docs-pages.yml @@ -66,6 +66,31 @@ jobs: - name: Build DocFX site run: docfx docfx.json + - name: Post-process DocFX HTML for accessibility + run: bash .github/scripts/postprocess-docfx-site.sh _site + + - name: Verify DocFX accessibility patches + run: | + if rg -n --pcre2 ']*\blang=)' _site/**/*.html _site/index.html; then + echo "Found HTML documents without lang attribute." >&2 + exit 1 + fi + + if rg -n 'id="logo".*alt="InventarWorkerService"' _site/**/*.html _site/index.html; then + echo "Found redundant logo alt text after post-processing." >&2 + exit 1 + fi + + if rg -n ']*dropdown-toggle[^>]*aria-expanded=' _site/**/*.html _site/index.html; then + echo "Found unsupported aria-expanded on DocFX theme links after post-processing." >&2 + exit 1 + fi + + if rg -n "dropdown-toggle[^\\n]*aria-expanded='false'|dropdown-toggle[^\\n]*aria-expanded=\\\"false\\\"" _site/public/docfx.min.js; then + echo "Found unsupported aria-expanded in generated DocFX JavaScript after post-processing." >&2 + exit 1 + fi + - name: Text-browser smoke check run: | test -f _site/index.html @@ -76,12 +101,13 @@ jobs: python3 -m http.server 8080 --directory _site >/tmp/docfx-http.log 2>&1 & server_pid=$! trap 'kill $server_pid' EXIT - cat > /tmp/docfx-axe-smoke.mjs <<'EOF' + cat > ./docfx-axe-smoke.mjs <<'EOF' import { chromium } from '@playwright/test'; import AxeBuilder from '@axe-core/playwright'; const browser = await chromium.launch({ headless: true }); - const page = await browser.newPage(); + const context = await browser.newContext(); + const page = await context.newPage(); await page.goto('http://127.0.0.1:8080/'); const results = await new AxeBuilder({ page }).analyze(); @@ -90,9 +116,11 @@ jobs: process.exitCode = 1; } + await context.close(); await browser.close(); EOF - node /tmp/docfx-axe-smoke.mjs + node ./docfx-axe-smoke.mjs + rm -f ./docfx-axe-smoke.mjs - name: Setup GitHub Pages if: github.event_name != 'pull_request' diff --git a/Directory.Build.props b/Directory.Build.props index 592e199..ecc6800 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,8 +1,8 @@ 14.0 - 1.1.894.28 - 1.1.894.28 - 1.1.894.28 + 1.1.898.28 + 1.1.898.28 + 1.1.898.28 diff --git a/docs/project-statistics.md b/docs/project-statistics.md index 7ff4082..234e3f6 100644 --- a/docs/project-statistics.md +++ b/docs/project-statistics.md @@ -286,6 +286,9 @@ und auf explizite Anforderung fortgeschrieben. | 2026-04-19 | Coverage-Luecke fuer `T046` geschlossen | Fuer den im Plan definierten PostgreSQL-/SQLite-Paritaets-Scope wurde die Coverage-Messung von der Gesamtbibliothek auf den Feature-relevanten Codepfad fokussiert (`PgSqlDbService`, `SqliteDbService`, Status-, Settings- und Initialize-Fluss). Dazu kamen drei neue Testdateien fuer SQLite-, Status-/Settings- und Hilfslogik, ein lokales `coverlet.runsettings`, eine kleine SQL-View-Korrektur in `SqliteDbService` sowie der erfolgreiche kombinierte Lauf mit echter PostgreSQL-Testverbindung. Ergebnis: `71/71` Tests gruen, Cobertura `line-rate=0.8872` bzw. `88.72 %` und ein HTML-Report unter `TestResults/CoverageReport/index.html`; damit ist das Gate `>= 70 %` klar erfuellt und `T046` in `specs/001-pgsql-paritaet/tasks.md` geschlossen. Sichtbares Zusatzvolumen dieser Runde: ca. `+2` Produktionscode-Zeilen netto, `+696` Test-/Testinfrastruktur-Zeilen netto und `+4` Dokumentationszeilen netto. Konservative Manualreferenz: grob `702 / 80 = 8.8` Arbeitstage bzw. `68.4` Stunden und `0.4` Arbeitsmonate; Thorsten-Solo-Referenz: `702 / 100 = 7.0` Arbeitstage bzw. `54.8` Stunden und `0.3` Arbeitsmonate. Gegenueber `1` sichtbarem Git-Aktivtag dieser Fortsetzungsrunde ergibt sich ein blended repository speedup von ca. `8.8x` zur 80-Zeilen-Referenz und `7.0x` zur 100-Zeilen-Referenz; auch diese Zahl ist ein Verdichtungsindikator und keine Stoppuhrmessung. | | 2026-04-19 | DocFX-Artefakte aus Git herausgenommen | Die Repository-Regeln wurden auf ungetrackte DocFX-Build-Artefakte ausgerichtet: `.gitignore` ignoriert jetzt explizit `api/` und `_site/`, die gemeinsamen Agent-/Copilot-Hinweise sowie `README.md` und `docs/README.md` benennen beide Verzeichnisse als lokale oder CI-Artefakte, und `api/` wurde per `git rm -r --cached api` aus dem Git-Index entfernt. Zusaetzlich kam mit `.github/workflows/docfx-docs-proposal.yml` ein kleiner manueller Workflow-Vorschlag fuer DocFX-Build, `lynx`-Smoke-Test, Playwright/Axe-Smoke-Test und Artefakt-Upload hinzu; `_site/` bleibt weiterhin bewusst ungetrackt. Sichtbares Zusatzvolumen dieser Runde: ca. `+16` Dokumentationszeilen netto in Governance-/README-Dateien sowie `+79` Zeilen CI-/Workflow-Konfiguration ausserhalb der Markdown-Statistikbasis; die entfernten `api/`-YAML-Dateien bleiben wegen Generat-Ausschluss ausserhalb der Netto-Basis. Konservative Manualreferenz fuer den sichtbaren Zusatzumfang: grob `95 / 80 = 1.2` Arbeitstage bzw. `9.3` Stunden; Thorsten-Solo-Referenz: `95 / 100 = 1.0` Arbeitstage bzw. `7.4` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. | | 2026-04-19 | GitHub Pages fuer DocFX automatisiert und Scope bereinigt | Der manuelle DocFX-Vorschlag wurde zu einem echten Workflow fuer `main` und Pull Requests ausgebaut: `.github/workflows/docs-pages.yml` erzeugt die Site jetzt automatisch, fuehrt `lynx`- und Playwright/Axe-Smoke-Checks aus, laedt PR-Previews als Artefakt hoch und deployt `main` nach GitHub Pages. Gleichzeitig wurde `docfx.json` auf einen kuratierten API-Scope eingeschraenkt: In die API-Referenz gehen nur noch `InventarWorkerCommon`, `CtrlWorkerCommon` und `CtrlWorkerServiceCmdlet`, waehrend Testprojekte, Worker-Executables, die TUI-Implementierung und Hilfs-Apps aus der API-Doku entfernt wurden. Die Landing-Page `index.md`, `toc.yml`, `README.md`, `docs/README.md`, `docs/einleitung.md` und `docs/erste-schritte.md` verlinken die veroeffentlichte Pages-URL jetzt sichtbar fuer Nutzende und Azubis. Sichtbares Zusatzvolumen dieser Runde: ca. `+63` Dokumentations-/Konfigurationszeilen netto in `docfx.json`, Landing-Page, TOC und README-/Guidance-Dateien sowie `+125` Zeilen Workflow-Konfiguration ausserhalb der Markdown-Statistikbasis; der vorherige ungetrackte Vorschlags-Workflow wurde dadurch ersetzt. Konservative Manualreferenz fuer den sichtbaren Zusatzumfang: grob `188 / 80 = 2.4` Arbeitstage bzw. `18.3` Stunden; Thorsten-Solo-Referenz: `188 / 100 = 1.9` Arbeitstage bzw. `14.7` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. | +| 2026-04-19 | Dritter Docs-Hotfix fuer DocFX-Theme-A11Y | Der Pages-Workflow bekam einen gezielten Nachbearbeitungsschritt fuer generierte DocFX-Ausgabe: `.github/scripts/postprocess-docfx-site.sh` setzt ein `lang="de"` auf allen HTML-Seiten, markiert das Navbar-Logo als dekorativ statt mit redundantem Alternativtext und entfernt das unzulaessige `aria-expanded` sowohl aus statischem HTML als auch aus dem generierten `public/docfx.min.js`, das den Theme-Dropdown zur Laufzeit rendert. Direkt danach prueft der Workflow mit `rg`, dass weder in `_site` noch im ausgelieferten DocFX-JavaScript ungepatchte Muster verbleiben, bevor `lynx` und Playwright/Axe laufen. Sichtbares Zusatzvolumen dieser Runde: ca. `+20` Workflow-/Skriptzeilen sowie `+1` Statistikzeile netto. Konservative Manualreferenz: grob `21 / 80 = 0.3` Arbeitstage bzw. `2.0` Stunden; Thorsten-Solo-Referenz: `21 / 100 = 0.2` Arbeitstage bzw. `1.6` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. | +| 2026-04-19 | Pages-Hotfix und Auto-Merge aktiviert | Nach dem Merge von PR `#19` schlug der neue Docs-Workflow im Schritt `Axe smoke check` fehl, weil das temporaer unter `/tmp` abgelegte Node-Skript die lokal installierten Pakete `@playwright/test` und `@axe-core/playwright` nicht aufloesen konnte. Der Workflow wurde deshalb so nachgebessert, dass das Smoke-Skript im Repository-Workspace erzeugt und nach dem Lauf wieder entfernt wird. Parallel wurde die globale Repository-Einstellung `allow_auto_merge` per GitHub-API auf `true` gesetzt, damit kuenftige PRs bei passenden Schutzregeln automatisch gemerged werden koennen. Sichtbares Zusatzvolumen dieser Runde: ca. `+5` Produktions-/Konfigurationszeilen netto im Workflow plus `+1` Dokumentationszeile netto in diesem Ledger. Konservative Manualreferenz: grob `6 / 80 = 0.1` Arbeitstage bzw. `0.6` Stunden; Thorsten-Solo-Referenz: `6 / 100 = 0.1` Arbeitstage bzw. `0.5` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. | +| 2026-04-19 | Zweiter Docs-Hotfix fuer Axe/Playwright-Kontext | Der erste Workflow-Hotfix beseitigte zwar das Paketauflösungsproblem, der folgende Lauf scheiterte aber erneut daran, dass `@axe-core/playwright` nicht mit `browser.newPage()` betrieben werden darf. Der Smoke-Test verwendet jetzt explizit `browser.newContext()` und erzeugt die Seite daraus, bevor `AxeBuilder` ausgeführt wird. Sichtbares Zusatzvolumen dieser Runde: ca. `+3` Produktions-/Konfigurationszeilen netto im Workflow plus `+1` Dokumentationszeile netto in diesem Ledger. Konservative Manualreferenz: grob `4 / 80 = 0.1` Arbeitstage bzw. `0.4` Stunden; Thorsten-Solo-Referenz: `4 / 100 = 0.0` Arbeitstage bzw. `0.3` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. | ## Gesamtstatistik