munin/templates/keys.html
Thomas Adamek cf35c3f5db Verwandte Einträge, Aktualität, Importer (Ausbaustufen 3.7, 3.5, 3.2)
- 3.7: MCP-Werkzeug "related" liefert Nachbarn im Verweisgraphen in beide
  Richtungen, bis zur zweiten Reihe (store.RelatedEntries).
- 3.5: Einträge, die seit über einem Jahr unverändert sind, tragen in
  recall/get/list/related "stale": true; get und recall geben einen
  Hinweis, die Eintragsseite eine Marke. instructions erklären das Feld.
- 3.2: Import von Markdown-Dateien als ZIP unter /p/{projekt}/import
  (Rolle admin), mit Vorschau, überspringen/überschreiben, Erkennung von
  Unverändertem und Papierkorb. Neue Einträge behalten Autor, Herkunft,
  Prüfvermerk und Zeitstempel aus dem Export.

Nebenbei behoben: Das 1-MB-Body-Limit für Formulare lag über dem ganzen
Mux und begrenzte damit auch /mcp auf 1 MB statt MAX_API_BODY_BYTES.
LimitBodies wählt die Grenze jetzt einmal außen je Route.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 08:18:47 +02:00

142 lines
5.4 KiB
HTML

{{template "kopf" .}}
<div class="seitenkopf">
<div class="seitenkopf-titel">
<h1>Zugänge {{template "hilfelink" "zugaenge"}}</h1>
<span class="hilfe">Ein eigener Key je Mensch und je Agent. Nur so steht im
Protokoll, wer etwas geschrieben hat — und ein einzelner Zugang lässt
sich zurückziehen, ohne alle anderen zu stören.</span>
</div>
</div>
{{if .Data.NewKey}}
<div class="karte key-anzeige">
<strong>Key für „{{.Data.NewKeyName}}“</strong>
<code class="key-wert">{{.Data.NewKey}}</code>
<span class="hilfe">Wird nur jetzt angezeigt — gespeichert ist nur eine Prüfsumme.
Geht der Key verloren, muss ein neuer erzeugt werden.</span>
{{/* Drei Clients, drei Schreibweisen für denselben Endpunkt. Der Block steht
hier ausgeschrieben, weil der Klartext-Key nur auf dieser Seite ein
einziges Mal zu sehen ist — wer ihn erst aus dem README zusammensetzen
müsste, hätte ihn dann schon nicht mehr. */}}
<details class="key-anleitung">
<summary>MCP-Client einrichten</summary>
<strong>Claude Code</strong>
<pre><code>claude mcp add --transport http munin-{{.Project.Slug}} {{.Data.ServerURL}}/mcp \
--header "Authorization: Bearer {{.Data.NewKey}}"</code></pre>
<strong>Cline</strong> <span class="hilfe">(<code>cline_mcp_settings.json</code>)</span>
<pre><code>{
"mcpServers": {
"munin-{{.Project.Slug}}": {
"type": "streamableHttp",
"url": "{{.Data.ServerURL}}/mcp",
"headers": { "Authorization": "Bearer {{.Data.NewKey}}" },
"autoApprove": ["recall", "get", "list", "related"]
}
}
}</code></pre>
<strong>OpenCode</strong> <span class="hilfe">(<code>opencode.json</code>)</span>
<pre><code>{
"mcp": {
"munin-{{.Project.Slug}}": {
"type": "remote",
"url": "{{.Data.ServerURL}}/mcp",
"enabled": true,
"headers": { "Authorization": "Bearer {{.Data.NewKey}}" }
}
}
}</code></pre>
</details>
</div>
{{end}}
{{if .Data.Ungenutzt}}
<div class="meldung fehler">
{{if eq .Data.Ungenutzt 1}}Ein aktiver Zugang wurde{{else}}{{.Data.Ungenutzt}} aktive Zugänge wurden{{end}}
seit über 90 Tagen nicht benutzt. Jeder davon ist ein offener Zugang zu diesem
Projekt. Wenn niemand mehr weiß, wofür ein Key da ist, ist Zurückziehen meist
die richtige Wahl — ein neuer ist schnell angelegt.
</div>
{{end}}
{{if .Data.Keys}}
<div class="tabelle-huelle">
<table class="tabelle">
<thead>
<tr>
<th>Name</th>
<th>Rolle</th>
<th>Angelegt</th>
<th>Zuletzt benutzt</th>
<th>Status</th>
<th class="schmal rechts"></th>
</tr>
</thead>
<tbody>
{{$csrf := .CSRFToken}}{{$slug := .Project.Slug}}{{$jetzt := .Data.Jetzt}}
{{range .Data.Keys}}
<tr {{if .Revoked}}class="gedaempft"{{end}}>
<td>{{.Name}}</td>
<td><code>{{.Role}}</code></td>
<td>{{datum .CreatedAt}}</td>
<td>{{if .LastUsedAt.IsZero}}<span class="hilfe">nie</span>{{else}}{{datum .LastUsedAt}}{{end}}</td>
<td>
{{if .Revoked}}zurückgezogen{{else}}aktiv{{end}}
{{if .Unused $jetzt}}<span class="marke warnung" title="Seit über 90 Tagen nicht benutzt">ungenutzt</span>{{end}}
</td>
<td class="schmal rechts">
{{if not .Revoked}}
<form method="POST" action="/p/{{$slug}}/keys/revoke" class="reihe"
data-confirm="Key „{{.Name}}“ zurückziehen? Alle Clients, die ihn benutzen, verlieren sofort den Zugang.">
<input type="hidden" name="csrf_token" value="{{$csrf}}">
<input type="hidden" name="id" value="{{.ID}}">
<button type="submit" class="warnung">Zurückziehen</button>
</form>
{{end}}
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{else}}
<div class="leer">
<p>Noch kein Zugang angelegt.</p>
<p class="hilfe">Ohne Key kann sich niemand mit diesem Projekt verbinden.</p>
</div>
{{end}}
<section class="abschnitt">
<h2>Neuer Zugang</h2>
<div class="karte">
<form method="POST" action="/p/{{.Project.Slug}}/keys/create" class="formular">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<div class="feld mittel">
<label for="name">Name</label>
<span class="hilfe">Wer oder was benutzt diesen Key?</span>
<input type="text" id="name" name="name" required placeholder="z.B. tom-cline oder ci-pipeline">
</div>
<div class="feld kurz">
<label for="role">Rolle</label>
<select id="role" name="role">
<option value="read">read — nur lesen und suchen</option>
<option value="write" selected>write — zusätzlich schreiben</option>
<option value="admin">admin — zusätzlich Zugänge verwalten</option>
</select>
</div>
<div class="formular-aktionen">
<button type="submit">Key erzeugen</button>
</div>
</form>
</div>
</section>
{{template "fuss" .}}