Files
Mind-o-Mat/tests/stale.test.ts
T
Jannik a47bfffe9b Phase 2: Wiki-Schema + Suchleiter + Veraltet-Erkennung (2.1, 2.2, 2.6)
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.
2026-09-05 11:45:07 +02:00

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);
});
});