Files
mission-control-v2/frontend/src/views/GuideView.tsx
T
Hitonabi 2360ad173a Feat: Anleitung-Tab -> allgemeine AI-Bibel (Stand Juni 2026)
Kompletter Rework von GuideView: statt veralteter Editor-Setups +
KI-Wissensdatenbank jetzt ein allgemeines AI-Nachschlagewerk mit
14 Sektionen (Grundlagen, MoE/Quant, lokal betreiben, Modell-Landschaft,
Gateway-Trick, MCP, Skills, Gedaechtnis/RAG, Agenten, IDE, Tricks/Kniffe,
Sicherheit/Wartung, kuratierte Ressourcen, Troubleshooting) + Sprung-Nav.

Allgemein gehalten; Stack-Spezifika nur als "Bei dir konkret"-Callouts,
wo eine echte Einschraenkung sie rechtfertigt.

Tote Verweise entfernt: AnythingLLM, hermes-webui/ChatUI :8787,
reasoning-Rolle. Neuer Stand drin: Mem0 (auto-lernend/semantisch/graph,
4-Typen-Taxonomie, Hermes-Onboarding), Terminal (ttyd), Backup+restore.sh,
git-basierter Update-Check + Hermes-Update + Gehirn-Check.

Live gegen die Box verifiziert; Frontend gebaut, dist committed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 22:38:40 +02:00

494 lines
30 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState, type ReactNode } from "react"
import {
BookOpen, Boxes, Cpu, Layers, Plug, Bot,
Wrench, Shield, Compass, Code, Network, Database, Sparkles, Gauge,
Lock, Lightbulb, Server, Zap, ArrowUpRight, LifeBuoy, Puzzle,
type LucideIcon,
} from "lucide-react"
import { cn } from "@/lib/utils"
/* ------------------------------------------------------------------ *
* Anleitung = Allgemeine AI-Bibel (Stand Juni 2026).
* Allgemeines Nachschlagewerk für lokale & agentische AI.
* Stack-Spezifika nur als "Bei dir konkret"-Callouts, wo eine echte
* Einschränkung sie relevant macht — sonst bewusst allgemein gehalten.
* ------------------------------------------------------------------ */
const SECTIONS: { id: string; label: string }[] = [
{ id: "grundlagen", label: "Grundlagen" },
{ id: "moe", label: "MoE & Quant" },
{ id: "lokal", label: "Lokal betreiben" },
{ id: "modelle", label: "Modell-Landschaft" },
{ id: "gateway", label: "Gateway-Trick" },
{ id: "mcp", label: "MCP" },
{ id: "skills", label: "Skills" },
{ id: "memory", label: "Gedächtnis & RAG" },
{ id: "agents", label: "Agenten" },
{ id: "ide", label: "IDE anbinden" },
{ id: "tricks", label: "Tricks & Kniffe" },
{ id: "wartung", label: "Sicherheit & Wartung" },
{ id: "ressourcen", label: "Ressourcen" },
{ id: "troubleshooting", label: "Troubleshooting" },
]
function scrollToId(id: string) {
document.getElementById(id)?.scrollIntoView({ behavior: "smooth", block: "start" })
}
/* ---- kleine Bausteine ---- */
function Card({ id, icon: Icon, color, title, kicker, children, wide }: {
id?: string
icon: LucideIcon
color: string
title: string
kicker?: string
children: ReactNode
wide?: boolean
}) {
return (
<section
id={id}
className={cn(
"scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",
wide && "md:col-span-2"
)}
>
<div className="flex items-center gap-2.5 border-b border-border/20 pb-3">
<Icon className={cn("h-5 w-5 shrink-0", color)} />
<div>
<h3 className="text-xs font-bold uppercase tracking-wider text-foreground">{title}</h3>
{kicker && <span className={cn("text-[9px] font-mono", color)}>{kicker}</span>}
</div>
</div>
<div className="text-xs text-muted-foreground space-y-2.5 leading-relaxed">{children}</div>
</section>
)
}
/* "Bei dir konkret" — Stack-Einschub, nur wo eine Einschränkung es rechtfertigt */
function Stack({ children }: { children: ReactNode }) {
return (
<div className="mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed">
<div className="flex items-center gap-1.5 font-bold text-primary mb-1">
<Sparkles className="h-3 w-3" /> Bei dir konkret
</div>
<div className="text-muted-foreground space-y-1">{children}</div>
</div>
)
}
function Pill({ children }: { children: ReactNode }) {
return (
<code className="rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground">
{children}
</code>
)
}
function LinkItem({ href, name, note }: { href: string; name: string; note: string }) {
return (
<li className="leading-relaxed">
<a
href={href}
target="_blank"
rel="noopener"
className="text-primary hover:underline font-semibold inline-flex items-center gap-0.5"
>
{name}
<ArrowUpRight className="h-3 w-3 opacity-60" />
</a>
<span className="text-muted-foreground"> {note}</span>
</li>
)
}
export function GuideView() {
const [showAllNav, setShowAllNav] = useState(false)
return (
<div className="space-y-7">
{/* Hero */}
<div className="rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4">
<div className="h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0">
<BookOpen className="h-6 w-6 text-primary" />
</div>
<div className="space-y-1">
<h1 className="text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent">
Die AI-Bibel
</h1>
<p className="text-sm text-muted-foreground leading-relaxed max-w-2xl">
Allgemeines Nachschlagewerk für lokale &amp; agentische AI Konzepte, Tricks, Kniffe und
kuratierte Quellen. <span className="font-semibold text-foreground">Stand Juni 2026.</span>{" "}
Das meiste gilt überall; <span className="text-primary font-semibold">Bei dir konkret"</span>-Kästen
zeigen, was dein Stack daraus macht.
</p>
</div>
</div>
{/* Sprung-Navigation (sticky) */}
<div className="sticky top-0 z-10 -mx-1 px-1">
<div className="rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20">
<div className="flex items-center gap-1.5 flex-wrap">
<Compass className="h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0" />
{(showAllNav ? SECTIONS : SECTIONS.slice(0, 9)).map((s) => (
<button
key={s.id}
onClick={() => scrollToId(s.id)}
className="rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer"
>
{s.label}
</button>
))}
<button
onClick={() => setShowAllNav((v) => !v)}
className="rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer"
>
{showAllNav ? "weniger" : "+ mehr"}
</button>
</div>
</div>
</div>
<div className="grid gap-5 md:grid-cols-2">
{/* 1 — Grundlagen */}
<Card id="grundlagen" icon={Cpu} color="text-cyan-400" title="1. Wie LLMs ticken" kicker="Grundlagen">
<p>
Ein LLM ist im Kern ein <strong>Wahrscheinlichkeits-Rechner für das nächste Token</strong> (Wortteil).
Es „weiß" nichts es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.
</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Tokens</strong> sind die Einheit ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt.</li>
<li><strong>Kontextfenster</strong> = wie viele Tokens das Modell gleichzeitig sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.</li>
<li><strong>Parameter</strong> = die trainierten Gewichte. Training ist einmalig, <strong>Inferenz</strong> ist jede Antwort.</li>
<li><strong>Temperatur / Sampling</strong> steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ.</li>
<li><strong>Halluzination</strong> ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation.</li>
<li><strong>Reasoning-/Thinking-Modelle</strong> „denken" in unsichtbaren Tokens vor der Antwort besser bei Logik, langsamer/teurer.</li>
</ul>
</Card>
{/* 2 — MoE & Quant */}
<Card id="moe" icon={Layers} color="text-violet-400" title="2. MoE & Quantisierung" kicker="Mehr Modell, weniger Last">
<p>
<strong>Mixture of Experts (MoE):</strong> Statt für jedes Token das ganze Netz zu aktivieren, wählt ein
<em> Router</em> nur ein paar spezialisierte <em>Experts</em> aus. So läuft ein 100B-Modell mit der aktiven
Rechenlast eines viel kleineren (z.B. 122B total / 10B aktiv").
</p>
<p>
<strong>Quantisierung:</strong> Gewichte von FP16 auf weniger Bits eindampfen — kleiner &amp; schneller bei
minimalem Qualitätsverlust. Faustregel:
</p>
<ul className="list-disc pl-4 space-y-1">
<li><Pill>Q8</Pill> nahezu verlustfrei, größter Footprint</li>
<li><Pill>Q6_K</Pill> sehr gut, guter Mittelweg</li>
<li><Pill>Q4_K_M</Pill> der Sweet-Spot für lokal — viel Modell pro GB</li>
</ul>
<Stack>
VRAM/RAM ist die harte Grenze — <strong>darum</strong> ist beides hier zentral: MoE lässt 100B+ überhaupt
laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg <Pill>Q4_K_M</Pill>/<Pill>Q6_K</Pill>.
</Stack>
</Card>
{/* 3 — Lokal betreiben */}
<Card id="lokal" icon={Server} color="text-emerald-400" title="3. Lokal betreiben: Engines & Backends" kicker="llama.cpp, vLLM & Co." wide>
<div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2">
<p><strong>Inference-Engines</strong> — was die Modelle ausführt:</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>llama.cpp / GGUF</strong> — der De-facto-Standard für lokal, CPU+GPU, läuft überall.</li>
<li><strong>Ollama / LM Studio</strong> — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI).</li>
<li><strong>vLLM / TGI</strong> — Server-Engines für maximalen Durchsatz auf dicken GPUs.</li>
<li><strong>llama-swap</strong> — Proxy, der <em>mehrere</em> Modelle hinter <em>einem</em> Port hält und je nach Anfrage automatisch ein-/aussattelt.</li>
</ul>
</div>
<div className="space-y-2">
<p><strong>GPU-Backends</strong> — wie gerechnet wird:</p>
<ul className="list-disc pl-4 space-y-1">
<li><Pill>CUDA</Pill> NVIDIA · <Pill>ROCm</Pill> AMD · <Pill>Vulkan</Pill> herstellerübergreifend · <Pill>Metal</Pill> Apple</li>
</ul>
<p className="pt-1"><strong>Begriffe, die immer wiederkommen:</strong> Kontext (<Pill>-c</Pill>), Slots/Parallel, KV-Cache, Modell-TTL/Swap, <strong>Speculative Decoding</strong> (kleines Draft-Modell rät voraus → schneller).</p>
</div>
</div>
<Stack>
Deine Box hat eine AMD-APU (gfx1151). <strong>Einschränkung &amp; Trick:</strong> dort schlägt <Pill>Vulkan/RADV</Pill> das
offizielle <Pill>ROCm</Pill> bei Token-Generierung um ~1222 % — darum läuft die Engine auf Vulkan.
<Pill>llama-swap</Pill> hält die Alltags-Hirne dauerwarm; <Pill>coder</Pill> nutzt Spec-Decoding.
</Stack>
</Card>
{/* 4 — Modell-Landschaft */}
<Card id="modelle" icon={Boxes} color="text-sky-400" title="4. Modell-Landschaft" kicker="Stand Juni 2026" wide>
<div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2">
<p><strong>Open-Weight (lokal nutzbar):</strong></p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Qwen</strong> (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE.</li>
<li><strong>Llama</strong> (Meta), <strong>Gemma</strong> (Google), <strong>Phi</strong> (Microsoft) — solide Open-Familien.</li>
<li><strong>DeepSeek</strong>, <strong>Mistral/Mixtral</strong> — kräftige MoE-/Reasoning-Modelle.</li>
</ul>
</div>
<div className="space-y-2">
<p><strong>Frontier (Cloud-API):</strong></p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Claude</strong> (Anthropic), <strong>GPT</strong> (OpenAI), <strong>Gemini</strong> (Google) — die stärksten Allrounder, aber nicht lokal.</li>
</ul>
<p className="pt-1"><strong>Modellwahl nach Aufgabe:</strong> schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis.</p>
</div>
</div>
<p className="text-[11px] italic">
Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe.
Vorsicht vor „Benchmaxxing".
</p>
<Stack>
Dein Line-up via llama-swap: <Pill>fast</Pill> (Alltag/Vision/MoE) · <Pill>heavy</Pill> (schwere Logik) ·
<Pill>coder</Pill> · <Pill>scout</Pill> · <Pill>vision</Pill> · <Pill>embed</Pill> (fürs Gedächtnis) ·
<Pill>hermes</Pill> (Agent-Hirn). Verwalten/tauschen im <strong>Modell-Manager</strong>-Tab.
</Stack>
</Card>
{/* 5 — Gateway-Trick */}
<Card id="gateway" icon={Network} color="text-amber-400" title="5. Der Gateway-Trick" kicker="OpenAI-kompatibel = überall andocken">
<p>
Fast jedes AI-Tool spricht heute das <strong>OpenAI-Format</strong> (<Pill>/v1/chat/completions</Pill>). Ein
<strong> Gateway</strong> davor gibt dir <em>einen</em> Endpunkt für alles: zentrales Key-Management, Logging
und transparentes <strong>Routing</strong> der Client merkt nicht, welches Modell tatsächlich antwortet.
</p>
<p>
Die <Pill>model:auto</Pill>-Idee: du sagst auto", das Gateway wählt das passende Modell je nach Anfrage und
lädt es bei Bedarf.
</p>
<Stack>
Dein Gateway: <Pill>http://192.168.178.151:9001/v1</Pill>, Model <Pill>auto</Pill>, API-Key beliebig.
Fertige Configs erzeugt dir der <strong>Verbinden</strong>-Tab live — eine Wahrheit, kein Abtippen.
</Stack>
</Card>
{/* 6 — MCP */}
<Card id="mcp" icon={Plug} color="text-violet-400" title="6. MCP Werkzeuge für Agenten" kicker="USB-C für AI-Tools">
<p>
Das <strong>Model Context Protocol</strong> (offen, von Anthropic initiiert) standardisiert, wie ein
AI-Client mit externen Tools &amp; Datenquellen spricht. Ein <strong>MCP-Server</strong> bringt Fähigkeiten:
Dateien, Web-Fetch, Git, Datenbanken, eigene APIs.
</p>
<p>Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an.</p>
<div className="flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]">
<Lock className="h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5" />
<span><strong>Sicherheit:</strong> ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen.</span>
</div>
</Card>
{/* 7 — Skills */}
<Card id="skills" icon={Puzzle} color="text-emerald-400" title="7. Agent Skills" kicker="Wiederverwendbare Fähigkeiten">
<p>
Ein <strong>Skill</strong> ist ein Ordner mit einer <Pill>SKILL.md</Pill> (YAML-Kopf + Anleitung, optional
Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design.
</p>
<pre className="p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre">
{`---
name: tdd-pro
description: Treibt Entwicklung mit strikter TDD-Praxis
---
# Instructions
...`}
</pre>
<p>
Suchen &amp; installieren über die <strong>skills.sh</strong>-Registry: <Pill>npx skills find</Pill> /
<Pill>npx skills add owner/repo</Pill>. Skills liegen projektweit (vom Agent beim Start gelesen) oder global.
</p>
</Card>
{/* 8 — Gedächtnis & RAG */}
<Card id="memory" icon={Database} color="text-indigo-400" title="8. Gedächtnis & RAG" kicker="Modelle vergessen du nicht" wide>
<div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2">
<p>LLMs sind <strong>zustandslos</strong>: ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern.</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Embeddings</strong> wandeln Text in Vektoren; ein <strong>Vektor-Store</strong> (Chroma, …) findet semantisch Ähnliches.</li>
<li><strong>RAG</strong> = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten.</li>
<li><strong>Long-Context vs. RAG:</strong> riesige Fenster sind bequem, aber teuer &amp; „lost in the middle" gezieltes Abrufen skaliert besser.</li>
</ul>
</div>
<div className="space-y-2">
<p><strong>Auto-lernendes Gedächtnis</strong> ist die nächste Stufe:</p>
<ul className="list-disc pl-4 space-y-1">
<li>extrahiert Fakten <em>selbst</em> aus Gesprächen, statt nur abzuspeichern</li>
<li>dedupliziert semantisch (kein 10× derselbe Fakt)</li>
<li><strong>Graph-Sicht</strong> = Fakten <em>plus</em> ihre Beziehungen, nicht nur eine flache Liste</li>
</ul>
</div>
</div>
<Stack>
Dein Gedächtnis (Tab <strong>Gedächtnis</strong>) ist <strong>Mem0</strong>-basiert: auto-lernend &amp;
semantisch, <strong>graph-first</strong> dargestellt, mit 4-Typen-Taxonomie
(<Pill>Identität</Pill> · <Pill>Wissen</Pill> · <Pill>Regeln</Pill> · <Pill>Ereignisse</Pill>). Einstieg über
ein kurzes <strong>Hermes-Onboarding-Gespräch</strong> im Terminal der Agent lernt im Hintergrund nach jedem Turn.
<br /><strong>Gotcha:</strong> ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion).
</Stack>
</Card>
{/* 9 — Agenten */}
<Card id="agents" icon={Bot} color="text-rose-400" title="9. Autonome Agenten betreiben" kicker="LLM in der Schleife" wide>
<div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2">
<p>
Ein <strong>Agent</strong> ist ein LLM in einer Schleife mit Tools:
<em> denken Tool aufrufen Ergebnis beobachten weiter</em>, bis das Ziel erreicht ist.
</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Guardrails</strong> (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt.</li>
<li><strong>Kontext-Hygiene</strong> ist die wichtigste Disziplin: frische Sessions starten vollgemüllte Historien werden langsam, driften und halluzinieren.</li>
<li><strong>Kanäle:</strong> CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API.</li>
</ul>
</div>
<div className="space-y-2">
<p><strong>Least Privilege:</strong> gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe.</p>
<p><strong>Was sich vollautomatisch lohnt:</strong> Modell-Routing, Hintergrund-Gedächtnis, Recherche. <strong>Was Freigabe braucht:</strong> Systembefehle, Updates/Reboots, permanentes Löschen.</p>
</div>
</div>
<Stack>
<strong>Hermes</strong> ist dein Box-Agent (Hirn = <Pill>fast</Pill>). Reden tust du mit ihm im
<strong> Terminal</strong>-Tab (Web-Terminal via ttyd) oder per <strong>Telegram</strong>. Er hat MCP-Server für
Gedächtnis, Stack-Steuerung, Web-Fetch und <strong>PC-Steuerung</strong> (Executor auf deinem Windows-PC).
Status &amp; Verdrahtung im <strong>Hermes</strong>-Tab.
</Stack>
</Card>
{/* 10 — IDE anbinden */}
<Card id="ide" icon={Code} color="text-cyan-400" title="10. IDE / Editor anbinden" kicker="Vibe-Coding lokal">
<p>
Jede <strong>OpenAI-kompatible</strong> IDE oder Extension lässt sich auf einen lokalen Server umbiegen
Base-URL + Model eintragen, fertig:
</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Cline</strong> &amp; <strong>Roo Code</strong> (VS-Code-Extensions, voller Agent + MCP)</li>
<li><strong>Cursor</strong> (VS-Code-Fork mit Top-Autocomplete)</li>
<li><strong>Continue</strong>, <strong>aider</strong> (CLI), <strong>OpenCode</strong> (Desktop)</li>
</ul>
<Stack>
Tipp den Kram nicht ab: der <strong>Verbinden</strong>-Tab generiert die fertige Config (inkl. MCP-Gedächtnis)
pro Tool zum Kopieren. Essenz: Base <Pill>:9001/v1</Pill>, Model <Pill>auto</Pill>, Key beliebig.
</Stack>
</Card>
{/* 11 — Tricks & Kniffe */}
<Card id="tricks" icon={Lightbulb} color="text-amber-400" title="11. Tricks & Kniffe" kicker="Was im Alltag wirklich spart" wide>
<div className="grid md:grid-cols-3 gap-3">
{[
["Kontext sauber halten", "Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],
["Plan-then-Act", "Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],
["Gezielte Edits", "Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],
["Non-interaktive Befehle", "Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],
["DevTools koppeln", "Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],
["Richtige Modellwahl", "Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],
["Akzeptanzkriterien", "Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],
["Verifizieren statt vertrauen", "Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],
["Regeln ins Gedächtnis", "Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."],
].map(([t, d]) => (
<div key={t} className="space-y-1 p-3 bg-background/10 rounded-xl border border-border/30">
<div className="flex items-center gap-1.5 font-bold text-foreground text-[11px]">
<Zap className="h-3 w-3 text-amber-400" /> {t}
</div>
<p className="text-[11px]">{d}</p>
</div>
))}
</div>
</Card>
{/* 12 — Sicherheit & Wartung */}
<Card id="wartung" icon={Shield} color="text-emerald-400" title="12. Sicherheit & Wartung" kicker="Damit's auch morgen noch läuft" wide>
<div className="grid md:grid-cols-2 gap-4">
<div className="space-y-2">
<p className="flex items-center gap-1.5 font-bold text-foreground"><Gauge className="h-3.5 w-3.5 text-emerald-400" /> Goldene Regeln</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Ein ungetesteter Restore ist kein Backup.</strong> Wiederherstellung mindestens einmal echt durchspielen.</li>
<li><strong>Updates können Dinge still zerschießen</strong> gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check.</li>
<li><strong>Least Privilege</strong> für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe.</li>
</ul>
</div>
<div className="space-y-2">
<p className="flex items-center gap-1.5 font-bold text-foreground"><Wrench className="h-3.5 w-3.5 text-emerald-400" /> Bei dir im SystemDrawer</p>
<ul className="list-disc pl-4 space-y-1">
<li><strong>Backup:</strong> tägliches Voll-Zustands-Backup, getesteter <Pill>restore.sh</Pill> (Doku in <Pill>docs/BACKUP.md</Pill>).</li>
<li><strong>Updates:</strong> git-basierter Update-Check; <strong>Hermes-Update-Button</strong> mit anschließendem <strong>Gehirn-Check</strong> (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update.</li>
<li><strong>Dienste &amp; Gefahrenzone:</strong> Restart/Logs pro Dienst, kritische Eingriffe getrennt.</li>
</ul>
<p className="text-[10px] italic">Erreichbar über das System-Icon Tab Wartung".</p>
</div>
</div>
</Card>
{/* 13 — Ressourcen */}
<section id="ressourcen" className="scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4">
<div className="flex items-center gap-2.5 border-b border-border/20 pb-3">
<Compass className="h-5 w-5 text-primary" />
<div>
<h3 className="text-xs font-bold uppercase tracking-wider text-foreground">13. Kuratierte Ressourcen &amp; Links</h3>
<span className="text-[9px] font-mono text-primary">Sauber geordnet — die guten Quellen</span>
</div>
</div>
<div className="grid md:grid-cols-2 gap-5 text-xs">
<div className="space-y-2">
<div className="font-bold text-foreground flex items-center gap-1.5"><Boxes className="h-3.5 w-3.5 text-sky-400" /> Modelle &amp; Engines</div>
<ul className="list-disc pl-4 space-y-1.5">
<LinkItem href="https://huggingface.co/models" name="Hugging Face" note="das Repository für offene Modelle (GGUF, Embeddings, Datasets)." />
<LinkItem href="https://github.com/ggml-org/llama.cpp" name="llama.cpp" note="die Referenz-Engine für lokale Inferenz." />
<LinkItem href="https://github.com/mostlygeek/llama-swap" name="llama-swap" note="mehrere Modelle hinter einem Port, Auto-Swap." />
<LinkItem href="https://ollama.com" name="Ollama" note="einfachster Einstieg, One-Command-Modelle." />
<LinkItem href="https://lmstudio.ai" name="LM Studio" note="lokale GUI zum Stöbern, Laden &amp; Chatten." />
<LinkItem href="https://github.com/vllm-project/vllm" name="vLLM" note="Hochdurchsatz-Serving auf dicken GPUs." />
</ul>
</div>
<div className="space-y-2">
<div className="font-bold text-foreground flex items-center gap-1.5"><Plug className="h-3.5 w-3.5 text-violet-400" /> MCP &amp; Skills</div>
<ul className="list-disc pl-4 space-y-1.5">
<LinkItem href="https://modelcontextprotocol.io" name="MCP — offizielle Doku" note="Spezifikation &amp; Einstieg." />
<LinkItem href="https://github.com/modelcontextprotocol/servers" name="Offizielle MCP-Server" note="filesystem, git, postgres, fetch &amp; mehr." />
<LinkItem href="https://smithery.ai" name="Smithery" note="Registry zum Suchen &amp; Auto-Installieren von MCP-Servern." />
<LinkItem href="https://glama.ai/mcp/servers" name="Glama MCP Registry" note="kuratierte Community-Datenbank." />
<LinkItem href="https://skills.sh" name="skills.sh" note="Registry &amp; CLI für Agent-Skills." />
</ul>
</div>
<div className="space-y-2">
<div className="font-bold text-foreground flex items-center gap-1.5"><Bot className="h-3.5 w-3.5 text-rose-400" /> Agenten &amp; Frameworks</div>
<ul className="list-disc pl-4 space-y-1.5">
<LinkItem href="https://github.com/NousResearch/hermes-agent" name="Hermes Agent (Nous)" note="der Agent, der auf deiner Box läuft." />
<LinkItem href="https://docs.claude.com" name="Anthropic / Claude Docs" note="API, Tool-Use, Agent SDK, MCP." />
<LinkItem href="https://github.com/cline/cline" name="Cline" note="autonomer Coding-Agent für VS Code." />
<LinkItem href="https://aider.chat" name="aider" note="AI-Pair-Programming im Terminal, git-nativ." />
<LinkItem href="https://continue.dev" name="Continue" note="Open-Source-Autopilot für IDEs." />
</ul>
</div>
<div className="space-y-2">
<div className="font-bold text-foreground flex items-center gap-1.5"><BookOpen className="h-3.5 w-3.5 text-amber-400" /> Lernen &amp; Community</div>
<ul className="list-disc pl-4 space-y-1.5">
<LinkItem href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview" name="Prompt-Engineering (Anthropic)" note="die beste praktische Anleitung." />
<LinkItem href="https://github.com/anthropics/anthropic-cookbook" name="Anthropic Cookbook" note="lauffähige Rezepte für Tools, RAG, Agenten." />
<LinkItem href="https://www.promptingguide.ai" name="Prompt Engineering Guide" note="herstellerneutrales Nachschlagewerk." />
<LinkItem href="https://github.com/mem0ai/mem0" name="Mem0" note="die auto-lernende Memory-Schicht hinter deinem Gedächtnis." />
<LinkItem href="https://www.reddit.com/r/LocalLLaMA/" name="r/LocalLLaMA" note="der Puls der lokalen-LLM-Szene." />
</ul>
</div>
</div>
</section>
{/* 14 — Troubleshooting */}
<Card id="troubleshooting" icon={LifeBuoy} color="text-rose-400" title="14. Troubleshooting" kicker="Wenn's hakt" wide>
<ul className="space-y-2 list-disc pl-4">
<li><strong>Keine Verbindung?</strong> Selbes LAN wie die Box? IP/Port stimmen (<Pill>:9001</Pill>)? Backend-Status in der <strong>Zentrale</strong> prüfen.</li>
<li><strong>Modell antwortet nicht / langsam?</strong> In der <strong>Zentrale Dienste</strong> schauen, ob <Pill>llama-swap</Pill> grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt).</li>
<li><strong>Agent dreht durch / halluziniert?</strong> Frische Session im <strong>Terminal</strong> starten meist ist es vollgemüllter Kontext.</li>
<li><strong>Gedächtnis findet nichts?</strong> Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis Hermes-Onboarding starten.</li>
<li><strong>Update hat etwas zerschossen?</strong> Genau dafür gibt es Backup &amp; <Pill>restore.sh</Pill> den getesteten Restore fahren, dann Ursache suchen.</li>
</ul>
</Card>
</div>
<p className="text-center text-[10px] text-muted-foreground/50 pt-2">
Mission Control 2 · AI-Bibel · Stand Juni 2026 lebendes Dokument, wächst mit dem Stack.
</p>
</div>
)
}