Skip to content
Merged
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
251 changes: 251 additions & 0 deletions docs/design/feature-spec-admin-hub.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,251 @@
# Feature-Spec: Admin-Hub (Dashboard-Erweiterung)
## Sidebar-Links, Brave-VerknΓΌpfung, Quick Notes, Dateimanager, Systemmonitor

> Status: Spezifikation Β· Ziel-Release: v0.8 Β· Baut auf: Sidebar-UI v0.7.1
> (visuelle Baseline), `MintYColors` ThemeExtension, Fork-Services (`lib/services/`)
> Design-Regeln: `docs/design/linux-assistant-design-system.md`

---

## 1. Konzept

Das Dashboard wird vom β€žStatus-Viewer" zum **Admin-Hub**: hΓ€ufige
Administrations-Werkzeuge direkt in der Sidebar, ohne Kontextwechsel zu
Terminal oder externen Apps.

```
Sidebar (v0.7.1) Sidebar (v0.8 Admin-Hub)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LA v0.7.1 β”‚ β”‚ LA v0.8 β”‚
β”‚ ──────────────── β”‚ β”‚ ──────────────── β”‚
β”‚ ⊞ Dashboard β”‚ β”‚ ⊞ Dashboard β”‚
β”‚ πŸ” Suche β”‚ β”‚ πŸ” Suche β”‚
β”‚ ☰ Speicher β”‚ β”‚ ☰ Speicher β”‚
β”‚ β™₯ Linux-Gesundh.β”‚ β”‚ β™₯ Linux-Gesundh.β”‚
β”‚ πŸ›‘ Sicherheit β”‚ β”‚ πŸ›‘ Sicherheit β”‚
β”‚ β”‚ β”‚ ── WERKZEUGE ── β”‚
β”‚ β”‚ β”‚ 🌐 Browser β”‚
β”‚ β”‚ β”‚ πŸ“ Quick Notes β”‚
β”‚ β”‚ β”‚ πŸ“ Dateimanager β”‚
β”‚ β”‚ β”‚ πŸ“Š Systemmonitor β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ βš™ Einstellungen β”‚ β”‚ βš™ Einstellungen β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

Neue Sektion **β€žWerkzeuge"** zwischen Haupt-Navigation und Einstellungen –
visuell abgesetzt (Sektions-Label in `textDim`, 12px, uppercase, wie
β€žEINGEBUNDENE DATENTRΓ„GER" im Speicher-Screen).

---

## 2. Feature 1: Browser-VerknΓΌpfung (Brave)

### Verhalten
- Klick auf β€žBrowser" β†’ ΓΆffnet Brave als externen Prozess
- Fallback-Kette: `brave` β†’ `brave-browser` β†’ `xdg-open https://`
- Nicht installiert β†’ Nav-Item deaktiviert + Tooltip β€žBrave nicht gefunden"

### Implementierung

```dart
// lib/services/app_launcher.dart
class AppLauncher {
static Future<bool> launchBrowser() async {
for (final bin in ['brave', 'brave-browser']) {
final result = await Process.run('which', [bin]);
if (result.exitCode == 0) {
await Process.start(bin, [], mode: ProcessStartMode.detached);
return true;
}
}
// Fallback: Standard-Browser
await Process.start('xdg-open', ['https://'],
mode: ProcessStartMode.detached);
return false; // signalisiert: Fallback genutzt
}
}
```

### Design
- Icon: `Icons.public` (oder Brave-Logo via `SystemIcon`, wenn im Icon-Theme)
- Kein eigener Screen – reine Launch-Aktion, kein `route`
- **Konfigurierbar machen:** In Einstellungen β€žStandard-Browser" wΓ€hlbar
(Brave/Firefox/Chromium/Custom) β†’ ConfigHandler-Key `preferred_browser`

---

## 3. Feature 2: Quick Notes

### Verhalten
- Einfacher Markdown-Notizblock, persistent, ohne App zu verlassen
- Autosave (debounced, 500 ms), keine Speichern-Buttons
- Mehrere Notizen als Liste links, Editor rechts (Master-Detail)

### Dateien & Storage

```
lib/layouts/tools/quick_notes.dart β†’ Screen
lib/services/notes_service.dart β†’ CRUD + Persistenz
~/.local/share/linux-assistant/notes/ β†’ eine .md pro Notiz
```

```dart
// lib/services/notes_service.dart (Skelett)
class NotesService {
static final _dir = Directory(
'${Platform.environment['HOME']}/.local/share/linux-assistant/notes');

Future<List<Note>> list() async { /* *.md lesen, mtime sortiert */ }
Future<Note> save(Note n) async { /* atomic write: tmp + rename */ }
Future<void> delete(Note n) async { /* mit Confirm-Dialog! */ }
}
```

### Design-Tokens
- Editor: `MintYText.mono` (Monospace-Fallback-Stack βœ… bereits im Token-Set)
- Editor-FlΓ€che: `colors.canvas`, Liste: `colors.surface`
- Aktive Notiz: HermesNavItem-Pattern (Akzent-Balken links)
- LΓΆschen = **destructive** β†’ Confirm-Dialog (β€žNotiz β€šX' wird gelΓΆscht")
gemÀß Roadmap-Vorschlag B.4

### Scope-Grenzen (bewusst NICHT)
- ❌ Kein Markdown-Preview (v1) – nur Plaintext-Editor
- ❌ Kein Sync, keine Cloud – lokale Dateien reichen
- βœ… SpΓ€ter erweiterbar: `notes_service` ist Interface, Sync = neuer Provider

---

## 4. Feature 3: Integrierter Dateimanager

### Verhalten
- Eingebetteter Datei-Browser (kein externer Prozess)
- Breadcrumb-Navigation, Liste mit Icon/Name/Grâße/Γ„nderungsdatum
- Aktionen: Γ–ffnen (`xdg-open`), Ordnerwechsel, LΓΆschen (mit Confirm),
Im Terminal ΓΆffnen (optional)
- Start: `$HOME`, Schnellzugriff-Leiste: Home, /, /mnt, Downloads, Desktop

### Implementierung

```
lib/layouts/tools/file_manager.dart β†’ Screen
lib/services/file_browser_service.dart β†’ dart:io Directory-Listing
```

```dart
// Kern: dart:io, kein Shell-Out nΓΆtig
Stream<FileSystemEntity> listDir(String path) =>
Directory(path).list(followLinks: false);
```

| Aktion | Umsetzung |
|---|---|
| Γ–ffnen | `Process.start('xdg-open', [path])` |
| LΓΆschen | `File/Directory.delete(recursive:)` + **Confirm-Dialog mit Pfad** |
| Berechtigungen lesen | `FileStat.stat(path)` β†’ modeString |
| Grâßen | rekursiv nur auf Klick (Performance!) |

### Design-Tokens
- Zeilen: `colors.surface`, Hover: `colors.surfaceRaised`, Radius `MintYRadius.md`
- Ordner-Icon in `colors.accent`, Dateien in `colors.textDim`
- Versteckte Dateien (`.`-Prefix): Toggle in Top-Bar des Screens
- **Sicherheit:** Symlinks nicht folgen (Loop-Gefahr), Systempfade
(`/proc`, `/sys`, `/dev`) ausgrauen + Warnung

### Scope-Grenzen
- ❌ Kein Copy/Move/Rename in v1 (nur Lesen + Γ–ffnen + LΓΆschen)
- ❌ Keine Thumbnails (Icon nach Extension reicht)
- βœ… v2-Kandidat: Drag & Drop, Tabs

---

## 5. Feature 4: Systemmonitor (detailliert)

### Verhalten
Der große Bruder der Dashboard-Karten: Echtzeit-Detailansicht aller
Systemmetriken mit 1-Sekunden-Refresh (pausierbar).

### Datenquellen (CLI-first, keine neuen Dependencies)

| Metrik | Quelle | Parser existiert? |
|---|---|---|
| CPU gesamt + per Core | `/proc/stat` | teilweise (`system_parsers_test.dart` existiert) |
| RAM/Swap Details | `/proc/meminfo` | βœ… (memory_status nutzt es) |
| Prozesse (sortierbar) | `ps aux --sort=-%cpu` | βœ… (linux_health) |
| Disks + I/O | `df -h` + `/proc/diskstats` | βœ… / neu |
| Netzwerk | `/proc/net/dev` (RX/TX pro Interface) | neu |
| GPU (NVIDIA) | `nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader` | neu, optional |
| Temperaturen | `/sys/class/thermal/thermal_zone*/temp` | neu |
| Uptime/Boot | `/proc/uptime` | βœ… (Laufzeit-Badge) |

### Layout

```
β”Œβ”€ Systemmonitor ──────────────────── [⏸ Pausieren] ─┐
β”‚ β”Œβ”€CPU──────────┐ β”Œβ”€RAM──────────┐ β”Œβ”€GPU──────────┐ β”‚
β”‚ β”‚ 19 % ▁▃▅▂ β”‚ β”‚ 10.4/15.3 GB β”‚ β”‚ 34 % 61 Β°C β”‚ β”‚
β”‚ β”‚ 16 Cores β–“β–“β–‘ β”‚ β”‚ Swap 10.1 GB β”‚ β”‚ VRAM 2.1/8 GBβ”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”Œβ”€Disks────────┐ β”Œβ”€Netzwerk─────┐ β”Œβ”€Thermal──────┐ β”‚
β”‚ β”‚ / 88 % β”‚ β”‚ ↓ 12 Mbit/s β”‚ β”‚ CPU 52 Β°C β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ Prozesse (sortierbare Tabelle, Suche) β”‚
β”‚ CPU % β”‚ RAM % β”‚ PID β”‚ Name β”‚ [Beenden] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Design-Tokens
- Stat-Kacheln: HermesStatTile-Pattern (existiert in `lib/widgets/hermes/`
auf main – Nutzung OK, nur Weiterentwicklung ist Backlog)
- Sparklines: HermesSparkline fΓΌr CPU/RAM-Verlauf (Ringpuffer, 60 Werte)
- Prozess-Tabelle: `MintYTable` erweitern um Sortierung, oder DataTable
- β€žBeenden"-Aktion: `colors.statusDanger` + Confirm (SIGTERM, dann SIGKILL)
- Refresh-Indikator: HaloDot pulsiert (dezent, 1s-Takt)

### Performance-Budget
- Refresh 1 s, Parser < 50 ms pro Zyklus (alles `/proc`-Reads, kein Fork-Exec
außer optional `nvidia-smi` – das nur alle 5 s)
- Pausieren, wenn Screen nicht sichtbar (Route-Awareness)

---

## 6. Integration: Sidebar & Routing

```dart
// In der Fork-Sidebar (v0.7.1, HermesNavItem-basiert) neue Sektion:
NavSection(label: 'Werkzeuge'),
HermesNavItem(icon: Icons.public, label: l10n.browser,
onTap: AppLauncher.launchBrowser), // kein Route-Wechsel
HermesNavItem(icon: Icons.edit_note, label: l10n.quickNotes,
route: QuickNotesPage()),
HermesNavItem(icon: Icons.folder_open, label: l10n.fileManager,
route: FileManagerPage()),
HermesNavItem(icon: Icons.monitor_heart, label: l10n.systemMonitor,
route: SystemMonitorPage()),
```

### i18n (l10n existiert, `l10n.yaml`)
Neue Keys: `tools`, `browser`, `quickNotes`, `fileManager`, `systemMonitor`
+ alle Screen-Texte (de/en).

---

## 7. Aufwand & Reihenfolge

| # | Feature | Aufwand | AbhΓ€ngigkeiten | PR-Vorschlag |
|---|---|---|---|---|
| 1 | Browser-VerknΓΌpfung | Β½ Tag | – | PR E1 (klein, sofort) |
| 2 | Quick Notes | 1–2 Tage | Confirm-Dialog-Pattern | PR E2 |
| 3 | Systemmonitor | 3–4 Tage | Parser-Erweiterungen, Ringpuffer | PR E3 |
| 4 | Dateimanager | 2–3 Tage | Destructive-Confirm, Symlink-Policy | PR E4 |

**Empfohlene Reihenfolge:** E1 β†’ E2 β†’ E4 β†’ E3 (Systemmonitor zuletzt,
weil er am meisten Parser-/Performance-Arbeit braucht und von den
Dashboard-Erfahrungen aus PR B profitiert).

## 8. AbhΓ€ngigkeit zum laufenden Track

- PR B (#10, Dashboard-Token-Migration) bleibt **Voraussetzung** – alle
neuen Screens nutzen von Tag 1 `context.mintY.*`, keine Hardcodes
- Neue Screens bekommen sofort Golden-Tests (Baseline-Setup aus #11)
- Sidebar-Sektion β€žWerkzeuge" wird im Komponenten-Katalog nachgetragen
Loading