Skip to content

Commit 2b16c1c

Browse files
committed
merge: resolve merge conflicts between bugsweep/2026-06-23-desktop and origin/master
2 parents bbe0e8c + 6e028e0 commit 2b16c1c

31 files changed

Lines changed: 612 additions & 175 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,6 @@ DECISIONS.md
9292
PORTIERUNGSPLAN.md
9393
TODO.md
9494
DONE.md
95+
96+
# Laptop-OneDrive-Konfliktkopien (ASUS-GEI) nicht committen
97+
*-ASUS-GEI.py

CHANGELOG.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
99
- **UX-002 / Welle-1 U1** (`MethodenAnalyser3.py`, `locales/translations.json`): Sichtbarer Sprachschalter in der Menüleiste („Sprache / Language" → „Deutsch" / „English"). Menü, Schaltflächen, Tastaturhinweis und Willkommenstext stellen sich sofort um; die Auswahl wird pro Benutzer in `%APPDATA%\MethodenAnalyser\config.json` (bzw. `~/.config/MethodenAnalyser/config.json`) persistiert und beim nächsten Start wiederhergestellt. Das bisher ungenutzte `translator.py` / `locales/translations.json` ist damit im UI erreichbar. Regressionstests in `tests/test_language_switch.py`.
1010

1111
### Build / Packaging
12+
- `releases/v3.0.0/PROVENANCE.md` dokumentiert den tatsächlichen lokalen Artefaktstand. Das historische v3.0.0-Bundle ist wegen fehlender Commitkette und einer vom gespeicherten Wert abweichenden EXE-SHA-256 bis zu einem reproduzierbaren Neubuild gesperrt; es wurde weder gelöscht noch durch eine neue Version ersetzt.
1213
- `build_exe.bat` ergänzt einen reproduzierbaren PyInstaller-Build mit lokalem Workpath (lokales Build-Verzeichnis), zentralem Build-Exclude-Scanner und Kopie der fertigen EXE nach `dist\MethodenAnalyser.exe` sowie `MethodenAnalyser.exe`.
1314
- `START.bat` startet unter Windows bevorzugt die gebaute EXE und fällt erst danach auf den Python-Start zurück.
1415
- `MethodenAnalyser.spec` nutzt relative Projektpfade, bündelt Icon und `locales/` und deaktiviert UPX.
1516
- GitHub-Actions-Smoke-Matrix pinnt Windows auf `windows-2025-vs2026` und macOS auf `macos-26`, damit die 2026-Runner-Migration vor dem Stichtag validiert wird.
1617

1718
### Fehlerbehebungen / Bug Fixes
18-
- `webapp/server.py`: Statische Dateien werden nur noch über strikt normalisierte
19-
Pfade unterhalb der erlaubten Roots ausgeliefert; Content-Types kommen aus
20-
einer festen Endungs-Whitelist statt aus frei abgeleiteten Pfadwerten.
19+
- `webapp/server.py`: Statische Dateien werden nur noch über strikt normalisierte Pfade unterhalb der erlaubten Roots ausgeliefert; Content-Types kommen aus einer festen Endungs-Whitelist statt aus frei abgeleiteten Pfadwerten.
20+
- **A11Y-002** (`webapp/static/index.html`, `webapp/static/app.js`): Die Quelltyp-Umschaltung im Web Companion (`Snippet`, `Datei`, `ZIP`) markiert den aktiven Modus jetzt zusätzlich mit `aria-pressed`; Screenreader können den Segmentzustand damit erkennen, ohne dass die kompakte Oberfläche sichtbare Zusatzbeschriftungen braucht. Regressionstest in `tests/test_webapp_server.py`.
21+
- **BS27-1** (`MethodenAnalyser3.py`): `run_project_analysis()` rief `output_widget.update()` auf (Zeilen 1529 + 1534), wodurch User-Events (z. B. Button-Klicks) während der laufenden Projektanalyse verarbeitet wurden — re-entranter Aufruf der Funktion war möglich. Fix: beide Aufrufe auf `update_idletasks()` geändert (verarbeitet nur Render-/Layout-Jobs, keine User-Events). Regressionstests in `tests/test_bugsweep_gui_threading_export_20260627.py`.
22+
- **BS27-2** (`MethodenAnalyser3.py`): `analyze_project()` ignorierte `UnicodeDecodeError` in der `total_lines`-Zählschleife kommentarlos (kein Latin-1-Fallback) — Zeilenzahl für Latin-1-kodierte `.py`-Dateien wurde als 0 gezählt. Fix: Latin-1-Fallback konsistent mit `analyze_file()` ergänzt. Regressionstest in `tests/test_bugsweep_gui_threading_export_20260627.py`.
23+
- **BS27-3** (`MethodenAnalyser3.py`): `run_analysis()` verwendete das Emoji `📄` im Widget-Insert für den Datei-Header (Zeile 1095) — inkonsistent mit dem vorherigen Emoji-Cleanup in `get_summary()`. Fix: `📄` durch `[DATEI]` ersetzt.
2124
- **UX-001** (`MethodenAnalyser3.py`): Die Hauptaktionen der Tkinter-GUI hatten keine sichtbaren Tastaturhinweise und keine direkten Shortcuts. Fix: kompakte Shortcut-Zeile (`Alt+D`, `Alt+P`, `Alt+F`, `F1`) ergänzt, globale Tastaturkürzel gebunden und die Initialansicht auf Tastaturnutzung vorbereitet. Regressionstests in `tests/test_cli.py` sichern Hinweistext und Shortcut-Bindings ab.
2225
- **B-004** (`MethodenAnalyser3.py`): `auto_fix_unused_imports` las Dateien ausschließlich als UTF-8, was bei Latin-1-kodierten Quellcode-Dateien zu `UnicodeDecodeError` führte. Fix: UTF-8-First mit `latin-1`-Fallback via `readlines()` (Zeilennummern bleiben mit `ast.lineno` synchron). 9 Regressionstests in `tests/test_cli.py` ergänzt.
2326
- **B-005** (`MethodenAnalyser3.py`): `analyze_project` fing nur `IOError`/`OSError`, nicht `UnicodeDecodeError` — Latin-1-Dateien brachen den gesamten Projekt-Scan ab. Fix: `UnicodeDecodeError` in denselben `except`-Block aufgenommen.
@@ -44,6 +47,8 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
4447
- `releases/windowsstore/store_settings.json`, `BUILD.md` und die DE/EN-Store-Listings sind auf den realen Projektstand, aktuelle GitHub-URLs und den dokumentierten Pretest-Workflow synchronisiert.
4548

4649
### Hinzugefügt / Added
50+
- `tests/test_webapp_server.py` sichert jetzt die HTTP-Request-Grenze (413), ungültiges Base64, beschädigte und Python-lose ZIPs, Einzeldatei-/Gesamtgrößen, Dateianzahl sowie Windows-Backslash-Traversal ab.
51+
- Die lokale Web-Runtime weist für den bewussten LAN-Testmodus auf lokales HTTP ohne Authentifizierung/TLS hin. WEBAPP, README-Paar, Portierungsplan und Privacy-Policy halten den Loopback-Standard, die vertrauenswürdige-LAN-Grenze und den Nicht-Ziel-Status der Mobile-Produktlinie konsistent fest.
4752
- GitHub-Actions-Smoke-Matrix prüft den Quellstand jetzt auf Windows (Python 3.10-3.12) sowie zusätzlich auf Ubuntu und macOS (Python 3.11), inklusive Compile-, Tkinter-Import- und `unittest`-Smoke.
4853
- Lokaler Web/PWA-Companion unter `webapp/` mit Snippet-/Einzeldatei-Analyse über den bestehenden Python-Analyse-Kern.
4954
- Web/PWA-Companion kann jetzt auch kleine ZIP-Archive mit `.py`-Dateien lokal hochladen, temporär entpacken und als Mini-Projekt analysieren.

MethodenAnalyser.ico

-93.8 KB
Binary file not shown.

MethodenAnalyser.png

81.6 KB
Loading

MethodenAnalyser3.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,16 @@ def analyze_source(code: str, source_name: str = "<snippet>") -> AnalysisResult:
755755
unused_defs = analyzer.defs - calls # Nur echte Definitionen, nicht Imports
756756

757757
# VERBESSERT: Nur tatsächliche Import-Namen vergleichen
758-
unused_imports = analyzer.import_names - analyzer.used_names
758+
# FIX: Namen, die NUR als String-Literal vorkommen (z.B. __all__ = ["Foo"] oder
759+
# String-/Forward-Ref-Annotationen "Bar" / "List[Bar]"), erfasst die AST-Name-Analyse
760+
# NICHT als 'used' -> sie wuerden faelschlich als ungenutzt gemeldet und vom Auto-Fix
761+
# aus der echten Datei geloescht (NameError / fehlendes __all__-Public-API). Daher
762+
# alle in String-Literalen vorkommenden Bezeichner als genutzt behandeln (konservativ).
763+
_string_refs: Set[str] = set()
764+
for _n in ast.walk(tree):
765+
if isinstance(_n, ast.Constant) and isinstance(_n.value, str):
766+
_string_refs.update(re.findall(r"[A-Za-z_][A-Za-z0-9_]*", _n.value))
767+
unused_imports = analyzer.import_names - analyzer.used_names - _string_refs
759768

760769
# Whitelist und False-Positive-Checks
761770
whitelist = build_stdlib_whitelist()
@@ -1170,7 +1179,7 @@ def run_analysis(output_widget: scrolledtext.ScrolledText) -> None:
11701179

11711180
# Ergebnisse anzeigen
11721181
output_widget.delete("1.0", tk.END)
1173-
output_widget.insert(tk.END, f"📄 Analysierte Datei: {os.path.basename(path)}\n\n")
1182+
output_widget.insert(tk.END, f"[DATEI] Analysierte Datei: {os.path.basename(path)}\n\n")
11741183
output_widget.insert(tk.END, generate_report(result))
11751184

11761185
# Export mit Bestätigung
@@ -1345,7 +1354,13 @@ def analyze_project(folder_path: str, progress_callback=None) -> ProjectAnalysis
13451354
try:
13461355
with open(file_path, 'r', encoding='utf-8') as f:
13471356
total_lines += len(f.readlines())
1348-
except (IOError, OSError, UnicodeDecodeError):
1357+
except UnicodeDecodeError:
1358+
try:
1359+
with open(file_path, 'r', encoding='latin-1') as f:
1360+
total_lines += len(f.readlines())
1361+
except (IOError, OSError):
1362+
pass
1363+
except (IOError, OSError):
13491364
pass
13501365
rel_path = os.path.relpath(file_path, folder_path)
13511366
if result.unused_imports:
@@ -1604,12 +1619,12 @@ def run_project_analysis(output_widget: scrolledtext.ScrolledText) -> None:
16041619

16051620
output_widget.delete("1.0", tk.END)
16061621
output_widget.insert(tk.END, f"Analysiere: {folder_path}\n\n")
1607-
output_widget.update()
1608-
1622+
output_widget.update_idletasks() # nur Render-Jobs, keine User-Events (Re-entranz-Schutz)
1623+
16091624
def progress_cb(cur, tot, fp):
16101625
output_widget.insert(tk.END, f"[{cur}/{tot}] {os.path.basename(fp)}\n")
16111626
output_widget.see(tk.END)
1612-
output_widget.update()
1627+
output_widget.update_idletasks() # nur Render-Jobs, keine User-Events (Re-entranz-Schutz)
16131628

16141629
try:
16151630
result = analyze_project(folder_path, progress_cb)

PRIVACY_POLICY.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Privacy Policy — MethodenAnalyser
22

3-
**Last updated:** March 13, 2026
3+
**Last updated:** July 22, 2026
44
**Publisher:** Geiger
55

66
## Overview
@@ -21,6 +21,10 @@ The application analyzes Python source files that you choose to open or scan. Al
2121

2222
MethodenAnalyser does not connect to any external services or the internet. It is a fully offline application.
2323

24+
## Optional Local Web Helper
25+
26+
The optional browser helper listens on `127.0.0.1` by default and processes uploaded code only in the local Python process. An explicit `--host 0.0.0.0` start is a technical LAN test mode, not a cloud service or mobile product. It uses local HTTP without authentication or TLS; use it only on a trusted private network and do not submit sensitive code from an untrusted network.
27+
2428
## Local Storage
2529

2630
The application may store user preferences (e.g., window size, last opened directory) locally on your device. No data is synced to external servers.
@@ -43,7 +47,7 @@ For questions about this privacy policy:
4347

4448
# Datenschutzrichtlinie — MethodenAnalyser
4549

46-
**Zuletzt aktualisiert:** 13. März 2026
50+
**Zuletzt aktualisiert:** 22. Juli 2026
4751
**Herausgeber:** Geiger
4852

4953
## Überblick
@@ -64,6 +68,10 @@ Die Anwendung analysiert Python-Quelldateien, die Sie öffnen oder scannen möch
6468

6569
MethodenAnalyser stellt keine Verbindung zu externen Diensten oder dem Internet her. Es handelt sich um eine vollständig offline nutzbare Anwendung.
6670

71+
## Optionaler lokaler Web-Hilfsmodus
72+
73+
Der optionale Browser-Hilfsmodus bindet standardmäßig an `127.0.0.1` und verarbeitet hochgeladenen Code nur im lokalen Python-Prozess. Ein expliziter Start mit `--host 0.0.0.0` ist ein technischer LAN-Testmodus, kein Cloud-Dienst und keine Mobile-Produktlinie. Er nutzt lokales HTTP ohne Authentifizierung oder TLS; deshalb nur in einem vertrauenswürdigen privaten Netz verwenden und keinen sensitiven Code aus einem fremden/offenen Netz übermitteln.
74+
6775
## Lokale Speicherung
6876

6977
Die Anwendung kann Benutzereinstellungen (z. B. Fenstergröße, zuletzt geöffnetes Verzeichnis) lokal auf Ihrem Gerät speichern. Es werden keine Daten mit externen Servern synchronisiert.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ Or double-click `START_WEBAPP.bat` on Windows. The server runs at `http://127.0.
114114
```bash
115115
python webapp/server.py --host 0.0.0.0 --port 8765
116116
```
117-
For further details, consult [WEBAPP.md](WEBAPP.md).
117+
This deliberate LAN test mode uses local HTTP without authentication or TLS. Use it only on a trusted private network; it is neither a cloud service nor a mobile product line. For further details, consult [WEBAPP.md](WEBAPP.md).
118118

119119
### 5. macOS and Linux Source Verification
120120
While the GUI is optimized for Windows (using Tkinter), the codebase is fully verified to run from source on macOS and Linux. You can run unit tests and compile checks with:
@@ -172,7 +172,7 @@ WINDOW_GEOMETRY = "1200x700" # Desktop window dimensions
172172

173173
## Data & Privacy
174174

175-
MethodenAnalyser operates 100% locally. Your Python code, local file paths, and analysis results are never sent over the internet. There are no analytics, cloud integrations, telemetry features, or third-party tracking scripts.
175+
MethodenAnalyser operates 100% locally. Your Python code, local file paths, and analysis results are never sent over the internet. There are no analytics, cloud integrations, telemetry features, or third-party tracking scripts. The optional web helper binds to `127.0.0.1` by default. Its explicit `--host 0.0.0.0` LAN test mode has no authentication or TLS and must be used only in a trusted private network.
176176

177177
Build, packaging, and sign-related files are configured in `.gitignore` to stay outside of the version control system.
178178

README_de.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ python webapp/server.py --host 0.0.0.0 --port 8765
115115
```
116116

117117
Die lokale Weboberfläche kann LAN-URLs anzeigen, falls der Server bewusst im Netzwerk freigegeben wird. Das bleibt ein technischer Testpfad, kein geplantes Android-/iOS-Produkt.
118+
Dieser bewusste LAN-Testmodus nutzt lokales HTTP ohne Authentifizierung oder TLS und gehört ausschließlich in ein vertrauenswürdiges privates Netz. Er ist weder ein Cloud-Dienst noch eine Mobile-Produktlinie. Details stehen in [WEBAPP.md](WEBAPP.md).
118119
Zusätzlich bündelt die **PWA-Testkarte** Install-Status, Service-Worker-, Speicher- und Viewport-Diagnostik in einer kopierbaren Kurzfassung für lokale Browser-Smokes.
119120

120121
### macOS- und Linux-Smoke
@@ -171,7 +172,7 @@ WINDOW_GEOMETRY = "1200x700" # Fenstergröße
171172

172173
## Datenschutz / Privacy
173174

174-
MethodenAnalyser arbeitet vollständig lokal. Der ausgewählte Python-Code, Dateipfade und Analyseergebnisse werden nicht an den Entwickler oder externe Dienste übertragen.
175+
MethodenAnalyser arbeitet vollständig lokal. Der ausgewählte Python-Code, Dateipfade und Analyseergebnisse werden nicht an den Entwickler oder externe Dienste übertragen. Der optionale Web-Hilfsmodus bindet standardmäßig an `127.0.0.1`; sein expliziter LAN-Testmodus `--host 0.0.0.0` hat keine Authentifizierung und kein TLS und darf nur in einem vertrauenswürdigen privaten Netz verwendet werden.
175176

176177
Release-Artefakte wie EXE-Dateien, lokale Builds und Store-Pakete bleiben außerhalb des Git-Repositorys und gehören in lokale `releases/`-Ordner oder GitHub Releases.
177178

RELEASES.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# RELEASES - MethodenAnalyser
22

3-
Stand: 2026-05-01
4-
Aktuelles lokales EXE-Bundle: `v3.0.0`
3+
Stand: 2026-07-22
4+
Direktdownload-Bundle `v3.0.0`: **gesperrter Legacy-Stand, nicht aktuell freigegeben**.
55

66
## Struktur
77

@@ -16,15 +16,23 @@ releases/
1616
`-- ...
1717
```
1818

19-
## Aktueller Stand
19+
## Aktueller Stand und Abgrenzung
2020

21-
- `dist/MethodenAnalyser.exe` ist der frische lokale Build aus dem aktuellen Quellstand.
22-
- `releases/v3.0.0/` enthält die lokalen GitHub-/Direktdownload-Artefakte.
21+
- `releases/v3.0.0/` enthält historische lokale GitHub-/Direktdownload-Artefakte. Ihr genauer Auditstand steht in [`releases/v3.0.0/PROVENANCE.md`](releases/v3.0.0/PROVENANCE.md).
22+
- `dist/MethodenAnalyser.exe` ist derzeit nicht vorhanden. Ein Root-EXE oder ein historisches v3.0.0-EXE darf deshalb nicht als frischer `dist`-Build ausgegeben werden.
23+
- Das v3.0.0-EXE weicht von der gespeicherten SHA-256-Zeile ab; Source-ZIP und Changelog haben keinen belegten Quellcommit. Bis zu einem sauberen Neubuild mit Commit- und Hashnachweis ist das Bundle nicht für Direktdownload oder Promotion freigegeben.
2324
- `releases/windowsstore/` bleibt getrennt für den MSIX-/Store-Workflow.
25+
- Das MSIX-/WACK-Gate ist ein eigener Ablauf und ersetzt keine Direktdownload-Provenienz.
2426
- Der Ordner `releases/` ist absichtlich per `.gitignore` ausgeschlossen. Verteilbare Binärartefakte gehören in lokale Release-Ordner oder GitHub Releases, nicht in den Git-Quellbaum.
2527

28+
## Nächster freigegebener Buildablauf
29+
30+
1. Einen konkreten, geprüften Quellcommit und die Buildumgebung festhalten.
31+
2. EXE, Source-ZIP und Changelog aus genau diesem Stand erzeugen und ihren Start-/Inhaltscheck dokumentieren.
32+
3. Erst dann `SHA256SUMS.txt` ausschließlich aus diesem vollständigen Artefaktsatz erzeugen, gegenlesen und eine neue Aktualitätsentscheidung treffen.
33+
4. Store/MSIX nur als separaten, zusätzlich zu belegenden Gate-Schritt behandeln.
34+
2635
## Letzte Pflege
2736

28-
- 2026-04-29: Lokales EXE-Bundle, Source-ZIP und Checksummen aus dem aktuellen Arbeitsstand aktualisiert.
37+
- 2026-07-22: Provenienz-Audit: v3.0.0 wegen fehlender Commit-Kette und abweichender EXE-Checksumme gesperrt; keine Dateien gelöscht, keine neue Version oder neue Checksumme erzeugt.
2938
- 2026-05-01: Release-Dokumentation an die GitHub-Policy angepasst: Artefakte bleiben lokal oder in GitHub Releases.
30-
- 2026-05-16: GitHub-Hygiene geprüft; Build-, Cache-, Coverage- und Signierartefakte bleiben ignoriert, verteilbare Dateien weiterhin außerhalb des Quellbaums.

WEBAPP.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# MethodenAnalyser Lokale Weboberfläche
22

3-
Stand: 2026-05-24
3+
Stand: 2026-07-22
44

55
Die lokale Weboberfläche ist ein Hilfs-/Demo-Modus für schnelle Snippet-, Einzeldatei- und kleine ZIP-Analysen auf demselben Rechner. Sie ersetzt nicht die Desktop-App für ganze Projektordner, ist keine Companion-App und keine eigene Mobile-Produktlinie. Sie nutzt denselben Analysekern und dasselbe JSON-Format wie CLI und GUI.
66

@@ -30,7 +30,7 @@ Für Android-/iOS-Tests im selben WLAN:
3030
python webapp/server.py --host 0.0.0.0 --port 8765
3131
```
3232

33-
Die Oberfläche kann dann erkannte LAN-URLs anzeigen. Das ist nur ein technischer Testpfad für lokale Browser-Smokes, kein geplanter Android-/iOS-Releasepfad.
33+
Die Oberfläche kann dann erkannte LAN-URLs anzeigen. Das ist nur ein technischer Testpfad für lokale Browser-Smokes, kein geplanter Android-/iOS-Releasepfad. Der LAN-Modus nutzt bewusst nur lokales HTTP: Es gibt keine Authentifizierung und kein TLS. Deshalb nur in einem vertrauenswürdigen, eigenen Netz starten und keinen Quellcode oder Bericht über fremde/offene Netze senden.
3434

3535
## Funktionen
3636

@@ -83,12 +83,14 @@ Response:
8383
}
8484
```
8585

86-
## Datenschutz
86+
## Datenschutz und LAN-Grenze
8787

88-
Der Web Companion läuft auf `127.0.0.1`. Code wird an den lokalen Python-Prozess gesendet, nicht an externe Dienste. Es gibt keine Telemetrie, keine Cloud-Synchronisierung und keine externen CDN-Abhängigkeiten.
88+
Der Standardstart bindet ausschließlich an `127.0.0.1`; damit ist die Oberfläche nur auf diesem Rechner erreichbar. Code wird an den lokalen Python-Prozess gesendet, nicht an externe Dienste. Es gibt keine Telemetrie, keine Cloud-Synchronisierung und keine externen CDN-Abhängigkeiten.
89+
90+
`--host 0.0.0.0` oder eine andere LAN-Adresse ist eine bewusste Ausnahme für einen technischen Test im selben vertrauenswürdigen Netz. Der Server bietet dabei weder Authentifizierung noch TLS und ist kein Internet-Deployment. Alle Clients, die die LAN-URL erreichen, können die lokale Analyse-API verwenden; keine sensitiven Dateien oder Berichte über ein fremdes/offenes Netz übertragen.
8991

9092
## Grenzen
9193

9294
- Große Projektordner bleiben Aufgabe der Desktop-/CLI-Version.
9395
- ZIP-Uploads sind bewusst klein gehalten: nur `.py`-Dateien, begrenzte Archivgröße und keine beliebigen Binärdateien.
94-
- Android und iOS sollen über dieselbe PWA-Linie getestet werden; native Apps sind weiterhin kein Ziel.
96+
- Android und iOS können nur über diesen technischen PWA-/Browser-Smoke im selben WLAN geprüft werden; native Apps und eine Mobile-Produktlinie sind weiterhin Nicht-Ziele.

0 commit comments

Comments
 (0)