2.1 Wiki-Schema: - src/templates/_Schema.md als Vorlage - Wird beim init-vault nach 10_Wiki/_Schema.md kopiert - Definiert: Pflichtfelder, 5 Status-Werte, 3 Konflikt-Booleans, Callout-Format, Quellen-Liste 2.2 CLAUDE.md (Suchleiter): - src/templates/CLAUDE.md als Vorlage - Wird beim init-vault nach CLAUDE.md kopiert - Konkreter Prompt: Lese-Reihenfolge, Antwort-Format (nummeriert, max 3 Quellen), Token-Budget-Hinweis - Konflikt-/Veraltet-Markierungen automatisch - Wiki > QMD Priorisierung 2.6 Veraltet-Erkennung: - Schwelle aus 99_System/Konfig.md (veraltet_schwellwert_monate, Default 12) - isStale(): boolean, Wiki-Seiten ausgenommen - aktualisiert hat Vorrang vor created - In landkarte.json: veraltet=true|false pro Node - In 99_System/Index.md: ⚠️ vor veralteten Notizen - 8 Unit-Tests (alle gruen): Wiki, frisch, alt, aktualisiert-Prioritaet, fehlende Daten, ungueltiges Datum, Schwelle=0, genaue Schwelle init-vault aktualisiert: - Laedt Templates aus src/templates/ via loadTemplate() - Schreibt 10_Wiki/_Schema.md zusaetzlich zu CLAUDE.md Verifiziert: 13-Monate-alte Notiz wird mit ⚠️ markiert, frische ohne.
59 lines
2.3 KiB
TypeScript
59 lines
2.3 KiB
TypeScript
// Tests fuer 2.6 Veraltet-Erkennung
|
|
// Phase 2.6
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { isStale } from '../src/cli/index-cmd.js';
|
|
|
|
const NOW = new Date('2026-09-05T00:00:00Z');
|
|
|
|
function monthsAgo(months: number): string {
|
|
// Direkt-Konstruktion statt setMonth (das mit Schaltjahr/30-Tage-Monaten schief geht)
|
|
const d = new Date(NOW.getFullYear(), NOW.getMonth() - months, NOW.getDate());
|
|
return d.toISOString().slice(0, 10);
|
|
}
|
|
|
|
describe('isStale', () => {
|
|
it('Wiki ist nie veraltet', () => {
|
|
expect(isStale('wiki', monthsAgo(24), null, 12, NOW)).toBe(false);
|
|
expect(isStale('wiki', monthsAgo(36), monthsAgo(36), 12, NOW)).toBe(false);
|
|
});
|
|
|
|
it('frische Notiz (< threshold) ist nicht veraltet', () => {
|
|
expect(isStale('inbox', monthsAgo(1), null, 12, NOW)).toBe(false);
|
|
expect(isStale('inbox', monthsAgo(11), null, 12, NOW)).toBe(false);
|
|
});
|
|
|
|
it('alte Notiz (>= threshold) ist veraltet', () => {
|
|
expect(isStale('inbox', monthsAgo(12), null, 12, NOW)).toBe(true);
|
|
expect(isStale('inbox', monthsAgo(15), null, 12, NOW)).toBe(true);
|
|
expect(isStale('daily', monthsAgo(24), null, 12, NOW)).toBe(true);
|
|
});
|
|
|
|
it('aktualisiert-Feld hat Vorrang vor created', () => {
|
|
// created alt, aber aktualisiert frisch
|
|
expect(isStale('inbox', monthsAgo(24), monthsAgo(1), 12, NOW)).toBe(false);
|
|
// created frisch, aktualisiert alt
|
|
expect(isStale('inbox', monthsAgo(1), monthsAgo(15), 12, NOW)).toBe(true);
|
|
});
|
|
|
|
it('fehlende Daten fuehren zu "nicht veraltet" (kein False-Positive)', () => {
|
|
expect(isStale('inbox', null, null, 12, NOW)).toBe(false);
|
|
expect(isStale('project', null, null, 12, NOW)).toBe(false);
|
|
});
|
|
|
|
it('ungueltiges Datum wird ignoriert', () => {
|
|
expect(isStale('inbox', 'kein-datum', null, 12, NOW)).toBe(false);
|
|
expect(isStale('inbox', null, 'auch-keins', 12, NOW)).toBe(false);
|
|
});
|
|
|
|
it('Schwelle = 0 macht alles veraltet (ausser Wiki)', () => {
|
|
expect(isStale('inbox', monthsAgo(1), null, 0, NOW)).toBe(true);
|
|
expect(isStale('wiki', monthsAgo(1), null, 0, NOW)).toBe(false);
|
|
});
|
|
|
|
it('genaue Schwelle: 12.0 Monate = veraltet', () => {
|
|
expect(isStale('inbox', monthsAgo(12), null, 12, NOW)).toBe(true);
|
|
expect(isStale('inbox', monthsAgo(11), null, 12, NOW)).toBe(false);
|
|
});
|
|
});
|