feat(projects): Aktivitaetsverlauf je Projekt
Was ist hier eigentlich passiert - eine Zeitleiste auf der Projektseite beantwortet das jetzt: Statuswechsel, Notizen, Aufgaben, neue Commits. Der Verlauf soll erzaehlen, nicht protokollieren. Deshalb bekommen Status und Repo-Verknuepfung einen eigenen Eintrag, waehrend alle uebrigen Felder zu einem zusammengefasst werden - sonst ertraenkt eine Feinjustage der Farbe alles Wichtige. Ein Titel, der sich aendert, kommt gar nicht vor. Beim Abgleich ist Zurueckhaltung noch wichtiger: er laeuft im Zweifel stuendlich. Vermerkt wird nur, wenn der letzte Commit ein anderer ist als beim letzten Mal, und beim ersten Abgleich gar nicht - dass ein Repo Commits hat, ist keine Neuigkeit. Fehlschlaege stehen nur beim Uebergang in den Fehlerzustand drin, sonst schlaegt ein abgelaufenes Token stuendlich neu auf. Der Text wird beim Schreiben formuliert, nicht beim Anzeigen. Ein Eintrag soll auch dann lesbar bleiben, wenn es die Notiz, um die es ging, laengst nicht mehr gibt. Zweihundert Eintraege je Projekt bleiben erhalten, der taegliche Durchgang stutzt den Rest. Der Export nimmt den Verlauf nicht mit - er beschriebe, was in dieser Instanz passiert ist, und verwiese auf Konten, die es anderswo nicht gibt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import type { Prisma } from "@prisma/client";
|
||||
import { pruneActivities } from "@/lib/activity";
|
||||
import { getAppSettings } from "@/lib/auth/settings";
|
||||
import { prisma } from "@/lib/db";
|
||||
import { runStaleCheck } from "@/lib/notify/stale";
|
||||
@@ -76,19 +77,19 @@ async function tick() {
|
||||
}
|
||||
}
|
||||
|
||||
// Unabhaengig vom Abgleich: der Stillstand ergibt sich aus dem
|
||||
// gespeicherten Stand, dafuer muss nichts geholt werden.
|
||||
await maybeCheckStale();
|
||||
// Unabhaengig vom Abgleich: beides ergibt sich aus dem gespeicherten
|
||||
// Stand, dafuer muss nichts geholt werden.
|
||||
await dailyChores();
|
||||
} catch (error) {
|
||||
console.error("[nebula] Automatischer Abgleich fehlgeschlagen:", error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stillstandspruefung, hoechstens einmal am Tag. Laeuft nur, wenn ueberhaupt
|
||||
* jemand darauf hoert – sonst waere es reine Datenbanklast.
|
||||
* Was hoechstens einmal am Tag zu tun ist: den Verlauf stutzen und nach
|
||||
* stillstehenden Projekten sehen.
|
||||
*/
|
||||
async function maybeCheckStale() {
|
||||
async function dailyChores() {
|
||||
const settings = await getAppSettings();
|
||||
const last = settings.lastStaleCheckAt?.getTime() ?? 0;
|
||||
if (Date.now() - last < STALE_CHECK_INTERVAL_MS) return;
|
||||
@@ -104,6 +105,17 @@ async function maybeCheckStale() {
|
||||
data: { lastStaleCheckAt: new Date() },
|
||||
});
|
||||
|
||||
// Der Verlauf waechst mit jeder Aenderung; einmal am Tag zurueckschneiden
|
||||
// reicht, um ihn beschraenkt zu halten.
|
||||
try {
|
||||
const entfernt = await pruneActivities();
|
||||
if (entfernt > 0) console.log(`[nebula] Verlauf gestutzt: ${entfernt} Eintraege entfernt.`);
|
||||
} catch (error) {
|
||||
console.error("[nebula] Verlauf konnte nicht gestutzt werden:", error);
|
||||
}
|
||||
|
||||
// Die Stillstandspruefung laeuft nur, wenn jemand zuhoert – sonst waere sie
|
||||
// reine Datenbanklast.
|
||||
if (zuhoerer === 0) return;
|
||||
|
||||
const report = await runStaleCheck(Math.max(1, settings.staleAfterDays));
|
||||
|
||||
Reference in New Issue
Block a user