Alle wesentlichen Änderungen an diesem Projekt werden hier dokumentiert. Format basiert auf Keep a Changelog.
build_exe.batfür reproduzierbare lokale Windows-EXE-Builds außerhalb von OneDrive mit Build-venv und Build-Exclude-Scanner- README-Suchbegriffe, Companion-Screenshot-Platz und Web/PWA-Metadaten für bessere GitHub- und Web-Auffindbarkeit
llms.txtals maschinenlesbaren Projektkontext für Crawler und LLM-Tools- Portierungsplan für Windows Desktop, macOS/Linux-Smokes und Web/PWA-Companion
- Geplantes redigiertes Austauschformat
docsgrabber-library-v1.json - Statischer Web/PWA-Companion unter
web_companion/mit Import, Profil-/Kategorienübersicht, Dokumentsuche, Detailansicht, Demo-Export, Manifest, Service Worker und Node-Smokes - Redigierter Desktop-Export
docsgrabber-library-v1.jsonmit Account-Refs, Profilen, Kategorien, Dokumentmetadaten und Profilstatistiken - Tests für Export-Payload und UTF-8-JSON ohne BOM
- Reproduzierbarer Source-Smoke
tests/source_platform_smoke.pyfür Offscreen-Start, Config-Roundtrip, nicht-Windows-Word-Pfad und optionale OCR-Stacks - GitHub-Workflow
.github/workflows/source-platform-smoke.ymlfürubuntu-latestundmacos-latest - Privacy-/Gitignore-Hinweise für lokale App-Daten in README.md und README-DE.md
.gitattributesfür stabile Zeilenenden im Repository- CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md (GitHub-Policy Compliance)
- CHANGELOG.md mit Versionshistorie
- 15 pytest-Tests für
GrabberWorker._auto_categorize(disabled-shortcut, custom rules nach Subject/Sender, custom > default, alle 8 Default-Kategorien: Rechnungen, Versand, Verträge, Kündigungen, Steuer, Versicherung, Bewerbungen, Bank, plus no-match) - 12 statische + 1 Runtime-Tests für den Web/PWA-Companion (
web_companion/tests/pwa_smoke.test.mjs) - PWA-Icons (192/512 px, standard + maskable) in
web_companion/icons/ - Regressionstests für Body-zu-PDF-Fallback, Profil-Drag&Drop und Batch-Ausführung aktiver Profile
- Regressionstests für Gmail-Raw-Suche mit IMAP-Fallback sowie klar beschriftete Navigation/Löschaktionen im UI
START.batstartet bevorzugt eine frische lokale EXE und fällt erst danach auf den Python-Source-Start zurück- README.md und README-DE.md dokumentieren den lokalen Windows-EXE-Build und den bevorzugten Startpfad
.gitignoreignoriert jetztLOCK*.txt, damit temporäre Projekt-Sperren nicht versehentlich im öffentlichen Repo landen- README.md, README-DE.md und
llms.txtum Startpunkte, Suchphrasen und Abgrenzung zu generischen Dokumentenviewern, RAG-Parsern, Cloud-OCR-Diensten und Dokumentationsgeneratoren ergänzt - Community- und Security-Dateien von Template-Resten, Fake-Mail-Kontakt und veralteten Repo-URLs bereinigt
- Sichtbare deutsche Endnutzertexte auf echte Umlaute normalisiert
- process_email() in 3 Untermethoden aufgeteilt (_parse_email_metadata, _save_attachment, _convert_body_to_pdf)
- 6 verbleibende bare except-Blöcke durch spezifische Exceptions ersetzt
- README.md und README-DE.md mit Profil-Sortierung und Batch-Ausführung synchronisiert
- README.md und README-DE.md um lokale Datenschutz-Hinweise ergänzt
- CONTRIBUTING.md, SECURITY.md und CODE_OF_CONDUCT.md auf GitHub-Policy-Stand gebracht
- IMAP-Suche nutzt bei Gmail jetzt
X-GM-RAWplus Standardfilter und fällt auf klassische IMAP-Kriterien zurück, wenn die Server-Erweiterung fehlt - Tabs, Löschbuttons und Ordnerauswahl im UI tragen jetzt klare Beschriftungen, Tooltips und Accessible Names
- Einstellungen-Tab bietet jetzt einen Companion-Export-Button für den redigierten Plattform-Bridge-JSON-Export
- README, README-DE,
PORTIERUNGSPLAN.md,AUFGABEN.txtundweb_companion/README.mdauf den umgesetzten Companion-Stand synchronisiert - README, README-DE,
PORTIERUNGSPLAN.mdundAUFGABEN.txtauf den verifizierten macOS-/Linux-Source-Smoke-Stand synchronisiert
UniversalDocsGrabberV1.py: IMAP-Suche und Fetch nutzen jetzt UIDs statt Sequenznummern (MSN) —conn.uid('search', ...)/conn.uid('fetch', ...)stattconn.search()/conn.fetch(). Schützt vor MSN-Verschiebung durch parallele Expunge-Operationen anderer IMAP-Sessions (U4).UniversalDocsGrabberV1.py: NIL-Guards in_convert_body_to_pdf()—get_payload(decode=True)kann bei malformed Multipart-Teilen None zurückgeben; ohne Guard entstandAttributeError: 'NoneType' has no attribute 'decode'(U5).UniversalDocsGrabberV1.py: NIL-Guard inprocess_email()— nachuid('fetch', ...)kanndata[0]None sein wenn die Nachricht zwischen Search und Fetch gelöscht wurde (U6).UniversalDocsGrabberV1.py: Sentinels (pisa = None,pytesseract = SimpleNamespace(...),PdfReader = None,PdfWriter = None,convert_from_path = None) bei fehlendem Optionalpaket — ermöglicht Monkeypatching in Tests auch ohne installierte Abhängigkeiten (U7).UniversalDocsGrabberV1.py: Office-zu-PDF-Fallback entkoppelt; fehlendeswin32comblockiert den vorhandenendocx2pdf-Pfad nicht mehrweb_companion/app.js:escHtml()hinzugefügt und in alleninnerHTML-Interpolationen (renderProfiles,renderCategories,renderDocuments,renderDocumentDetail) eingesetzt — XSS-Schutz für Library-Datenweb_companion/app.js:document-Parameter-Shadowing inrenderDocuments-forEach behoben (docstattdocument), DOM-Global bleibt unberührtweb_companion/sw.js:self.skipWaiting()im install-Handler,self.clients.claim()im activate-Handler undignoreSearch: trueincaches.match()für stabiles Offline-Verhalten ergänzt- Deutsche Kategorien und Scheduler-Log verwenden echte Umlaute
- Veraltete Template-Mailadresse aus dem Verhaltenskodex entfernt
- Drag&Drop-Profil-Sortierung im Profil-Tree
- Gmail Query Builder Dialog für IMAP- und Gmail-Suchabfragen
- E-Mail-Body-zu-PDF-Konvertierung (HTML + Plaintext-Fallback via xhtml2pdf)
- gmail_query Feld in SearchProfile für gespeicherte Queries
- IMAP-Verbindung mit Multi-Account-Support
- Download von E-Mail-Anhängen (PDF, DOCX, XLSX, Bilder)
- Automatische PDF-Konvertierung (DOCX, XLSX, Bilder -> PDF)
- OCR-Erkennung für bildbasierte PDFs (Tesseract)
- Suchprofile mit Query-Builder
- Duplikat-Erkennung via SHA256-Hash
- PyQt6-GUI mit Dark Theme
- Fortschrittsanzeige für Downloads
- README.md mit vollständiger Dokumentation
- POPPLER_PATH konfigurierbar (Auto-Detect + Umgebungsvariable)
- sanitize_filename() mit Input-Validierung (None/Empty Check)
- Type Hints für Helper-Funktionen
- Docstrings für alle 4 Datenklassen
- Error Handling: Exceptions werden geloggt statt silent fail
- APP_NAME Versionsinkonzistenz korrigiert (V7 -> V1)
- Bare except in calculate_file_hash() und decode_header_str()