Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/scripts/postprocess-docfx-site.sh
Original file line number Diff line number Diff line change
@@ -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/<html(?![^>]*\blang=)/<html lang="de"/g' "$html_file"
perl -0pi -e 's#<img id="logo" class="svg" src="([^"]+)" alt="InventarWorkerService">#<img id="logo" class="svg" src="$1" alt="" aria-hidden="true">#g' "$html_file"
perl -0pi -e 's#(<a\b[^>]*\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!<a title='\''\$\{L\("changeTheme"\)\}'\'' class='\''btn border-0 dropdown-toggle'\'' data-bs-toggle='\''dropdown'\'' aria-expanded='\''false'\''>!<a title='\''\$\{L\("changeTheme"\)\}'\'' class='\''btn border-0 dropdown-toggle'\'' data-bs-toggle='\''dropdown'\''>!g' "$site_root/public/docfx.min.js"
perl -0pi -e 's!<a class='\''nav-link dropdown-toggle \$\{s\}'\'' href='\''#'\'' role='\''button'\'' data-bs-toggle='\''dropdown'\'' aria-expanded='\''false'\''>!<a class='\''nav-link dropdown-toggle \$\{s\}'\'' href='\''#'\'' role='\''button'\'' data-bs-toggle='\''dropdown'\''>!g' "$site_root/public/docfx.min.js"
fi
34 changes: 31 additions & 3 deletions .github/workflows/docs-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 '<html(?![^>]*\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 '<a[^>]*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
Expand All @@ -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();
Expand All @@ -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'
Expand Down
6 changes: 3 additions & 3 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<LangVersion>14.0</LangVersion>
<Version>1.1.894.28</Version>
<AssemblyVersion>1.1.894.28</AssemblyVersion>
<FileVersion>1.1.894.28</FileVersion>
<Version>1.1.898.28</Version>
<AssemblyVersion>1.1.898.28</AssemblyVersion>
<FileVersion>1.1.898.28</FileVersion>
</PropertyGroup>
</Project>
3 changes: 3 additions & 0 deletions docs/project-statistics.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading