Grundgerüst-Assistent: alle fehlenden Kanäle auf einmal
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Der Einzelknopf war der Anfang; wer frisch startet, klickt sich damit
sechzehnmal durch. Der Assistent macht das in einem Durchlauf.

Erst eine Vorschau, bevor irgendetwas passiert: was neu entsteht, was schon
existiert und nur verknüpft wird, welche Kanäle privat werden und in welche
Kategorie alles kommt. Die Kategorie heißt wie die Marke und wird
wiederverwendet, wenn es sie schon gibt.

Der Plan ist nach Einstellung entdoppelt — Devlogs und Wochen-Rückblick
brauchen denselben Kanal, der soll nicht zweimal auftauchen. Rollen kommen
ohne Kategorie, die gibt es dort nicht.

Zwischen zwei Anlagen liegen 350 ms. Discord verträgt ein Dutzend
Kanal-Erstellungen am Stück schlecht, und ein Rate-Limit mitten im Lauf
wäre die unangenehmste Art zu scheitern.

Scheitert ein Schritt, laufen die übrigen weiter und das Ergebnis zeigt pro
Zeile, was passiert ist. Vorher hätte ein einzelner Fehler den Rest
verschluckt.

Im Test: 19 offene Punkte, Vorschau zeigt 16, danach bleiben 2 — die beiden
ohne Vorlage (Gitea-Token und Watchdog-Adressen), die sich nicht anlegen
lassen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 21:17:36 +02:00
co-authored by Claude Fable 5
parent 684573b88c
commit 01fadadcd8
5 changed files with 263 additions and 4 deletions
+24
View File
@@ -226,6 +226,30 @@ export function registerApiRoutes(app, client) {
}
});
// Grundgerüst: Vorschau, was der Assistent anlegen würde
app.get('/api/setup/plan', async (request, reply) => {
if (requireScope(request, reply, 'settings')) return;
const { setupPlan } = await import('../bot/server-setup.js');
return { schritte: setupPlan(client), kategorie: brandName() };
});
// … und ausführen
app.post('/api/setup/run', async (request, reply) => {
if (requireScope(request, reply, 'settings')) return;
const kategorie = String(request.body?.kategorie ?? '').trim() || undefined;
try {
const { runSetup } = await import('../bot/server-setup.js');
const ergebnisse = await runSetup(client, { kategorie });
const neu = ergebnisse.filter((r) => r.ok && !r.wiederverwendet).length;
logAudit(getSessionUser(request), 'grundgerüst angelegt', `${neu} neu, ${ergebnisse.length} gesamt`);
request.log.info(`Grundgerüst: ${neu} neu von ${ergebnisse.length} Schritten`);
return { ok: true, ergebnisse, modules: moduleStates(), settings: currentSettings() };
} catch (error) {
request.log.error({ err: error }, 'Grundgerüst fehlgeschlagen');
return reply.code(400).send({ error: error.message || 'Fehlgeschlagen' });
}
});
// --- Stellwerte: Zahlen, die vorher fest im Code standen ---
app.get('/api/tuning', async (request, reply) => {