Browser-Extension
Struktur
- Framework: Vue 3 + Vuetify, Pinia, vue-router (Auto-Routes).
- Build-System: Vite 7 (separate Bundles für Popup/Sidepanel, Background, Content Script).
- Skripte (siehe
apps/extension/package.json):dev,dev-firefox,dev:*– Dev-Server + Background-/Content-Builds.build,build-firefox– Produktions-Build (apps/extension/extension/).pack:zip,pack:crx,pack:xpi– Distributionspakete.start:chromium,start:firefox–web-ext runmit gebauten Artefakten.
Lokaler Build & Laden
bash
pnpm --filter @source-taster/extension dev # Chromium
pnpm --filter @source-taster/extension dev-firefox- Dev-Modus erzeugt
apps/extension/extension/manifest.jsonund Stub-HTML für HMR. - Chrome/Edge:
chrome://extensions→ Entwicklermodus → „Entpackte Erweiterung laden“ →apps/extension/extension. - Firefox:
about:debugging#/runtime/this-firefox→ „Temporäre Add-ons laden“ →apps/extension/extension/manifest.json.
Produktionsbuild & Packaging
bash
pnpm --filter @source-taster/extension build
pnpm --filter @source-taster/extension pack:zip # Chrome Web Store
pnpm --filter @source-taster/extension pack:xpi # Firefox Add-on (web-ext build)pack:crxerzeugt eine lokal signierte CRX (nur für Tests).- Versionierung via
pnpm --filter @source-taster/extension release(bumpp). Manifest-Version mitpackage.jsonsynchron halten.
Manifest (MV3)
manifest_version: 3, Iconsassets/icon*.png.- Popup (
dist/popup/index.html) und Options (dist/options/index.html). - Sidepanel:
- Chromium:
side_panel.default_path - Firefox:
sidebar_action.default_panel
- Chromium:
- Background:
- Chromium: Service Worker
dist/background/index.mjs - Firefox: Modul-Skript
dist/background/index.mjs
- Chromium: Service Worker
- Rechte:
storage,activeTab,contextMenus, optionalsidePanel(Chromium).- Host-Permissions:
http://*/*,https://*/*.
- Content Script:
dist/contentScripts/index.global.js, Stylesdist/contentScripts/style.css. - CSP: Dev erlaubt Vite-HMR (
script-src self http://localhost:3303). default_locale: "en", Übersetzungen insrc/locales/en.json&de.json.
Manifest wird durch scripts/prepare.ts generiert (esno scripts/manifest.ts). Anpassungen dort vornehmen.
Funktionen & Flows
- Kontextmenüs (
background/main.ts)check-bibliography: öffnet das Sidepanel und füllt markierten Text vor.openSidePanel: Sidepanel manuell öffnen; deaktiviert, solange das Panel sichtbar ist.
- Sidepanel-/Popup-Auswahl: gespeichert in
browser.storage.sync(displayOption), steuerbar über die Options-UI. - WebExtension-Storage:
useWebExtensionStorageabstrahiertstorage.localinkl. Cross-Context-Sync. - PDF-Import:
extractTextFromPdfFile(unpdf) extrahiert Plaintext aus PDFs. - Verifikation:
useVerificationorchestriert AnyStyle-Konvertierung → Suche → Matching inklusive Early Termination. - Settings: Pinia-Store
settings(WebExtension Storage) nutztDEFAULT_UI_SETTINGSaus den Shared Types.
Kommunikation
webext-bridgewird aktuell nur inbackground/main.tsgenutzt (z. B. Sichtbarkeitsmeldungen des Sidepanels).- Sidepanel sendet
SIDE_PANEL_OPENED/CLOSEDan das Background-Skript, um Kontextmenüs zu aktualisieren.
QA & Tests
- Lint:
pnpm --filter @source-taster/extension lint - Typecheck:
pnpm --filter @source-taster/extension typecheck - TODO: Automatisierte UI-Tests (Cypress/Playwright) ergänzen.
Release-Checkliste
- Version erhöhen (
pnpm --filter @source-taster/extension release). - Produktionsbuild (
pnpm --filter @source-taster/extension build). - Artefakte erstellen (
pack:zip,pack:xpi). - Upload in Chrome Web Store / AMO.
- Release-Tag (
git tag vX.Y.Z, push) → GitHub-Workflowrelease.ymlerzeugt Changelog.
Sicherheit & Datenschutz
- API-Keys werden nicht lokal gespeichert, sondern verschlüsselt über
/api/user/ai-secretsabgelegt. - Alle Requests laufen gegen
VITE_API_BASE_URL(env.ts, Defaulthttp://localhost:8000). - TODO: CSP/Permissions prüfen, sobald neue Provider oder APIs hinzukommen.