Schichtung: Regeln (zod-Schemas, Status-Ableitung) framework-frei in src/lib/hosts.ts;
Services src/server/services/hosts.ts / hostgruppen.ts, Lesemodelle src/server/queries/hosts.ts, Aktionen src/server/actions/hosts.ts / hostgruppen.ts
(gemeinsame Hilfen in actions/formular.ts, ohne "use server"). Die Action prüft vorab für
Feldmeldungen, der Service prüft erneut (Seed, Skripte, spätere Assistenten).
Archivieren statt Löschen (archiviertAm). Dabei fallen die Gruppenmitgliedschaften weg
(im Protokoll festgehalten), damit Zuweisungen an Gruppen nie einen archivierten Host
treffen. Archivierte Hosts sind schreibgeschützt und erscheinen in keiner Liste; der Name
bleibt belegt, damit das Protokoll eindeutig bleibt. Wiederherstellen gibt es noch nicht.
Hostgruppen löschen bewusst noch nicht: PublicVerwendung hängt per Cascade an der
Gruppe; das Löschen klärt #016 zusammen mit den Verwendungen.
Kunde per Name: unbekannter Name legt den Kunden an (kunde.angelegt im Protokoll),
leer = kein Kunde. Gruppen- und Kundennamen erlauben Leerzeichen/Umlaute (reine Anzeige).
Protokoll:host.angelegt, host.geaendert (nur geänderte Felder als { vorher, nachher }, ohne Änderung kein Eintrag), host.archiviert, hostgruppe.angelegt, hostgruppe.geaendert (Mitglieder als hinzu/entfernt), kunde.angelegt. Demo-Seed schreibt bewusst keine Einträge.
Status in der Liste: nicht erreichbar > Drift (auch bei offenen Abweichungen) >
synchron > unbekannt. Host-Key: ein ausstehender Key geht vor einem vertrauten, damit ein
geänderter Key nicht hinter „bestätigt“ verschwindet.
Formulare senden per onSubmit + startTransition statt <form action>: sonst setzt
React das Formular nach jeder Antwort zurück und Eingaben gingen bei Feldfehlern verloren. Feld hat dafür fehler bekommen; neu sind Textbereich, Auswahlliste, Ankreuzfeld, Feldgruppe.
Mobil: Hostliste unter md als Kartenliste statt Tabelle (Status und Host-Key ohne
seitliches Wischen sichtbar); Gruppenliste zeigt die Beschreibung unter dem Namen.
Platzhalter für Folge-Issues:src/app/(app)/hosts/[id]/HostKeyAktionen.tsx
(hostId, darfEntscheiden, status: HostKeyZusammenfassung, #009) im Kopf der Karte
„Host-Key“ und BootstrapAktionen.tsx (hostId, darfVerwalten, eingerichtet, hostKeyVertraut, #010) unter der Info-Leiste – beide geben vorerst null zurück.
Demo-Daten:SSHKV_SEED_DEMO=1 pnpm db:seed legt 6 Hosts, 3 Gruppen und einen Kunden an
(Upsert nach Name, idempotent).
Screenshots:scripts/screenshots.ts kennt hosts und host-detail (folgt dem ersten
Host der Liste).
Quelle: docs/issues/008-hosts-gruppen.md – dort wird dieses Issue gepflegt.
## Ziel
Hosts und Hostgruppen anlegen, bearbeiten, archivieren; Kunden und Tags.
## Aufgaben
- [x] Liste mit Status (erreichbar, letzter Abgleich, Drift)
- [x] Formular: Name, Adresse, Port, Gruppen, Tags, Beschreibung, Kunde, Anmeldebenutzer (`sshkv`/`root`)
- [x] Hostgruppen mit Mitgliedern
- [x] Hostdetail-Gerüst
## Akzeptanzkriterien
- [x] Leser sieht, Operator/Admin bearbeiten
## Abhängigkeiten
#004
## Notizen / Entscheidungen
- **Schichtung:** Regeln (zod-Schemas, Status-Ableitung) framework-frei in `src/lib/hosts.ts`;
Services `src/server/services/hosts.ts` / `hostgruppen.ts`, Lesemodelle
`src/server/queries/hosts.ts`, Aktionen `src/server/actions/hosts.ts` / `hostgruppen.ts`
(gemeinsame Hilfen in `actions/formular.ts`, ohne `"use server"`). Die Action prüft vorab für
Feldmeldungen, der Service prüft erneut (Seed, Skripte, spätere Assistenten).
- **Archivieren statt Löschen** (`archiviertAm`). Dabei fallen die Gruppenmitgliedschaften weg
(im Protokoll festgehalten), damit Zuweisungen an Gruppen nie einen archivierten Host
treffen. Archivierte Hosts sind schreibgeschützt und erscheinen in keiner Liste; der Name
bleibt belegt, damit das Protokoll eindeutig bleibt. Wiederherstellen gibt es noch nicht.
- **Hostgruppen löschen** bewusst noch nicht: `PublicVerwendung` hängt per Cascade an der
Gruppe; das Löschen klärt #016 zusammen mit den Verwendungen.
- **Kunde** per Name: unbekannter Name legt den Kunden an (`kunde.angelegt` im Protokoll),
leer = kein Kunde. Gruppen- und Kundennamen erlauben Leerzeichen/Umlaute (reine Anzeige).
- **Protokoll:** `host.angelegt`, `host.geaendert` (nur geänderte Felder als
`{ vorher, nachher }`, ohne Änderung kein Eintrag), `host.archiviert`,
`hostgruppe.angelegt`, `hostgruppe.geaendert` (Mitglieder als `hinzu`/`entfernt`),
`kunde.angelegt`. Demo-Seed schreibt bewusst keine Einträge.
- **Status in der Liste:** nicht erreichbar > Drift (auch bei offenen Abweichungen) >
synchron > unbekannt. Host-Key: ein ausstehender Key geht vor einem vertrauten, damit ein
geänderter Key nicht hinter „bestätigt“ verschwindet.
- **Formulare** senden per `onSubmit` + `startTransition` statt `<form action>`: sonst setzt
React das Formular nach jeder Antwort zurück und Eingaben gingen bei Feldfehlern verloren.
`Feld` hat dafür `fehler` bekommen; neu sind `Textbereich`, `Auswahlliste`, `Ankreuzfeld`,
`Feldgruppe`.
- **Mobil:** Hostliste unter `md` als Kartenliste statt Tabelle (Status und Host-Key ohne
seitliches Wischen sichtbar); Gruppenliste zeigt die Beschreibung unter dem Namen.
- **Platzhalter für Folge-Issues:** `src/app/(app)/hosts/[id]/HostKeyAktionen.tsx`
(`hostId`, `darfEntscheiden`, `status: HostKeyZusammenfassung`, #009) im Kopf der Karte
„Host-Key“ und `BootstrapAktionen.tsx` (`hostId`, `darfVerwalten`, `eingerichtet`,
`hostKeyVertraut`, #010) unter der Info-Leiste – beide geben vorerst `null` zurück.
- **Demo-Daten:** `SSHKV_SEED_DEMO=1 pnpm db:seed` legt 6 Hosts, 3 Gruppen und einen Kunden an
(Upsert nach Name, idempotent).
- **Screenshots:** `scripts/screenshots.ts` kennt `hosts` und `host-detail` (folgt dem ersten
Host der Liste).
---
Quelle: `docs/issues/008-hosts-gruppen.md` – dort wird dieses Issue gepflegt.
florian.wilde
added this to the v0.1.0 milestone 2026-10-12 15:12:36 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ziel
Hosts und Hostgruppen anlegen, bearbeiten, archivieren; Kunden und Tags.
Aufgaben
sshkv/root)Akzeptanzkriterien
Abhängigkeiten
#004
Notizen / Entscheidungen
src/lib/hosts.ts;Services
src/server/services/hosts.ts/hostgruppen.ts, Lesemodellesrc/server/queries/hosts.ts, Aktionensrc/server/actions/hosts.ts/hostgruppen.ts(gemeinsame Hilfen in
actions/formular.ts, ohne"use server"). Die Action prüft vorab fürFeldmeldungen, der Service prüft erneut (Seed, Skripte, spätere Assistenten).
archiviertAm). Dabei fallen die Gruppenmitgliedschaften weg(im Protokoll festgehalten), damit Zuweisungen an Gruppen nie einen archivierten Host
treffen. Archivierte Hosts sind schreibgeschützt und erscheinen in keiner Liste; der Name
bleibt belegt, damit das Protokoll eindeutig bleibt. Wiederherstellen gibt es noch nicht.
PublicVerwendunghängt per Cascade an derGruppe; das Löschen klärt #016 zusammen mit den Verwendungen.
kunde.angelegtim Protokoll),leer = kein Kunde. Gruppen- und Kundennamen erlauben Leerzeichen/Umlaute (reine Anzeige).
host.angelegt,host.geaendert(nur geänderte Felder als{ vorher, nachher }, ohne Änderung kein Eintrag),host.archiviert,hostgruppe.angelegt,hostgruppe.geaendert(Mitglieder alshinzu/entfernt),kunde.angelegt. Demo-Seed schreibt bewusst keine Einträge.synchron > unbekannt. Host-Key: ein ausstehender Key geht vor einem vertrauten, damit ein
geänderter Key nicht hinter „bestätigt“ verschwindet.
onSubmit+startTransitionstatt<form action>: sonst setztReact das Formular nach jeder Antwort zurück und Eingaben gingen bei Feldfehlern verloren.
Feldhat dafürfehlerbekommen; neu sindTextbereich,Auswahlliste,Ankreuzfeld,Feldgruppe.mdals Kartenliste statt Tabelle (Status und Host-Key ohneseitliches Wischen sichtbar); Gruppenliste zeigt die Beschreibung unter dem Namen.
src/app/(app)/hosts/[id]/HostKeyAktionen.tsx(
hostId,darfEntscheiden,status: HostKeyZusammenfassung, #009) im Kopf der Karte„Host-Key“ und
BootstrapAktionen.tsx(hostId,darfVerwalten,eingerichtet,hostKeyVertraut, #010) unter der Info-Leiste – beide geben vorerstnullzurück.SSHKV_SEED_DEMO=1 pnpm db:seedlegt 6 Hosts, 3 Gruppen und einen Kunden an(Upsert nach Name, idempotent).
scripts/screenshots.tskennthostsundhost-detail(folgt dem erstenHost der Liste).
Quelle:
docs/issues/008-hosts-gruppen.md– dort wird dieses Issue gepflegt.