feat: Inhaltsinventar in SQLite — KI-Inhaltsangabe je Objekt (URL + Hash)

Vereinheitlicht den bisherigen JSON-Ledger zu EINEM abfragbaren SQLite-Store
pro Site (data/content_inventory.db): jedes geprüfte Objekt mit Inhalts-Hash,
URL(s), Sicherheits-Verdikt UND neutraler KI-Inhaltsangabe.

- baseline.py: load/save_ai_ledger jetzt SQLite-gestützt (Dict-Schnittstelle
  bleibt → Analyzer unverändert). Tabellen objects + object_urls. Einmalige
  Migration eines vorhandenen ai_ledger.json → SQLite (.migrated). UPSERT mit
  first_seen-Erhalt; object_urls transaktional ersetzt. Neu: query_inventory,
  export_inventory_csv (beide migrieren failsafe).
- ai_analyzer.py: Antwort-Schema + Prompt um neutrales Feld 'description'
  erweitert (im selben Call, keine Extrakosten); _make_entry speichert es.
- __main__.py: neues Kommando 'inventory' (Übersicht, --search, --kind, --csv).
- Doku: README + Bedienungsanleitung.

Audio/Video sind im Schema (kind) vorbereitet (Phase 2: Extractor + Modalitäten).
bredelar.info real migriert: 245 Objekte (200 Bilder, 45 Texte).

Tests: 266 grün (+6: Round-Trip mit description, Migration, first_seen-Erhalt,
invalidate, Suche/CSV-Export, description landet im Ledger).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-13 05:12:19 +02:00
commit 989f5a933f
7 changed files with 262 additions and 22 deletions

View file

@ -215,6 +215,9 @@ Globale Optionen: `--config path/to/config.yaml`, `--verbose` (`-v`).
| `report` | Letzten Report im Terminal anzeigen |
| `report --diff-only` | Nur Textdiffs geänderter Seiten — farbig, kompakt |
| `report --format json` | Letzten Report als JSON anzeigen |
| `inventory` | KI-Inhaltsinventar (jedes Objekt: URL, Hash, Inhaltsangabe) anzeigen |
| `inventory --search <text>` | Inventar nach Inhaltsangabe/URL/Kategorie durchsuchen |
| `inventory --csv <pfad>` | Inventar als CSV exportieren |
| `status` | Baseline-Datum, letzter Scan, aktueller Risk-Level |
| `cloak-check` | Doppel-Crawl: Browser-UA vs. Googlebot (Cloaking-Erkennung) |
| `check-ext-links` | Externe Links auf Erreichbarkeit prüfen (4xx/5xx) |
@ -1050,3 +1053,24 @@ python -m scanner https://ihre-website.de status
```
zeigt bei aktivierter KI, wie viele Inhalte im Cache liegen und wie viele offene Funde es gibt.
### Inhaltsinventar (SQLite)
Jedes geprüfte Objekt (Seitentext, Bild; später Audio/Video) wird mit **Inhalts-Hash, URL(s),
Sicherheits-Verdikt und einer neutralen KI-Inhaltsangabe** in `data/content_inventory.db`
(SQLite) gespeichert — eine durchsuchbare Quelle der Wahrheit pro Site.
```bash
python -m scanner https://ihre-website.de inventory # Übersicht
python -m scanner https://ihre-website.de inventory --search kloster # Volltextsuche
python -m scanner https://ihre-website.de inventory --kind image # nur Bilder
python -m scanner https://ihre-website.de inventory --csv inventar.csv
```
Die Datenbank lässt sich auch direkt mit jedem SQLite-Werkzeug abfragen (Tabellen `objects`
und `object_urls`). Ein bereits vorhandenes `ai_ledger.json` (Vorgängerformat) wird beim ersten
Zugriff automatisch nach SQLite migriert und als `ai_ledger.json.migrated` abgelegt.
Hinweis: Das `description`-Feld füllt sich erst, wenn ein Objekt (neu/geändert) analysiert wird.
Objekte, die vor Einführung der Inhaltsangabe geprüft wurden, haben zunächst eine leere
Beschreibung; sie wird beim nächsten Re-Check des jeweiligen Inhalts ergänzt.