- Added a new command to fix findings in the current section of a markdown file, enhancing user experience by automating issue resolution. - Introduced settings for configuring actions related to missing notes and headings, allowing for customizable behavior during the fixing process. - Enhanced the chain inspector to support template matching, providing users with insights into template utilization and potential gaps in their content. - Updated the analysis report to include detailed metadata about edges and role matches, improving the clarity and usefulness of inspection results. - Improved error handling and user notifications for fixing findings and template matching processes, ensuring better feedback during execution.
9.8 KiB
Chain Inspector v0.2 - Implementierungsbericht
Status: ✅ Vollständig implementiert und getestet
Datum: 2025-01-XX
Version: v0.2.0
Basiert auf: Chain Inspector v0.1.0
Übersicht
Chain Inspector v0.2 erweitert v0 um drei wichtige Features für höhere ROI:
- Alias-aware Role Classification - Interne Mapping von Edge-Aliases zu canonical types für präzisere Rollen-Erkennung
- Dangling Target Detection - Erkennung von fehlenden Dateien und Headings in Edge-Links
- Analysis Meta - Zusätzliche Metriken für einfacheres Debugging und Coverage-Analyse
Neue Features
1. Alias-aware Role Classification
Zweck: Verbesserte Erkennung von "causal-ish" Rollen auch wenn Vault Aliases verwendet.
Implementierung:
- Lädt
edge_vocabulary.mdviaVocabularyLoader(wennedgeVocabularyPathin Settings konfiguriert) resolveCanonicalEdgeType(rawEdgeType, edgeVocabulary)Funktion:- Prüft ob
rawEdgeTypebereits canonical ist - Prüft ob
rawEdgeTypeein Alias ist (case-insensitive lookup) - Gibt
{ canonical?, matchedBy: "canonical" | "alias" | "none" }zurück
- Prüft ob
no_causal_rolesFinding verwendet jetzt canonical types:- Zuerst Prüfung mit canonical type (falls verfügbar)
- Fallback auf raw type (permissiv)
- Funktioniert auch wenn
chain_roles.yamlnur canonical types listet
Beispiel:
- Vault verwendet:
ausgelöst_durch(Alias) edge_vocabulary.mdmappt:ausgelöst_durch→caused_by(canonical)chain_roles.yamllistet nur:caused_by(canonical)- Ergebnis:
no_causal_rolesFinding wird NICHT generiert (korrekt erkannt)
2. Dangling Target Finding
Zweck: Erkennung von fehlerhaften Links in Edge-Targets.
Implementierung:
- Prüft alle outgoing edges von aktueller Section (respektiert
includeNoteLinks/includeCandidatesToggles) dangling_target(Severity:error):- Prüft ob Target-Datei existiert via
app.metadataCache.getFirstLinkpathDest() - Wenn Datei nicht gefunden → Finding mit
errorSeverity
- Prüft ob Target-Datei existiert via
dangling_target_heading(Severity:warn):- Wenn Target Heading angegeben (
[[file#Heading]]):- Prüft ob Heading in existierender Datei vorhanden ist
- Nutzt
app.metadataCache.getFileCache()für Heading-Liste - Wenn Heading fehlt → Finding mit
warnSeverity
- Wenn Target Heading angegeben (
- Evidence enthält:
file: Source file (aktuelle Datei)sectionHeading: Source section heading
Beispiel:
> [!edge] causes
> [[MissingNote]] → dangling_target (error)
> [!edge] causes
> [[ExistingNote#MissingHeading]] → dangling_target_heading (warn)
3. Analysis Meta
Zweck: Zusätzliche Metriken für Debugging und Coverage-Analyse.
Implementierung:
- Wird zu jedem
ChainInspectorReporthinzugefügt - Enthält:
edgesTotal: Gesamtanzahl gefilterter Edges (nachincludeNoteLinks/includeCandidates)edgesWithCanonical: Anzahl Edges mit erfolgreichem canonical mappingedgesUnmapped: Anzahl Edges ohne mapping (weder canonical noch alias)roleMatches: Anzahl Matches pro Role (deterministisch sortiert)
- Deterministische Sortierung:
roleMatchesKeys werden alphabetisch sortiert- Konsistente Ausgabe für Golden Tests
Beispiel Output:
"analysisMeta": {
"edgesTotal": 13,
"edgesWithCanonical": 13,
"edgesUnmapped": 0,
"roleMatches": {
"causal": 3,
"influences": 2,
"structural": 6
}
}
Technische Implementierung
Geänderte Dateien
src/analysis/chainInspector.ts
- Neue Funktion:
resolveCanonicalEdgeType() - Erweiterte Funktion:
computeFindings()- Parameter:
edgeVocabulary: EdgeVocabulary | null,app: Apphinzugefügt - Implementierung:
dangling_targetunddangling_target_headingChecks - Update:
no_causal_rolesverwendet canonical types
- Parameter:
- Erweiterte Funktion:
inspectChains()- Parameter:
edgeVocabularyPath?: stringhinzugefügt - Lädt Edge Vocabulary wenn Path bereitgestellt
- Berechnet
analysisMetamit deterministischer Sortierung
- Parameter:
- Erweitertes Interface:
ChainInspectorReport- Neues Feld:
analysisMeta?: { edgesTotal, edgesWithCanonical, edgesUnmapped, roleMatches }
- Neues Feld:
src/commands/inspectChainsCommand.ts
- Erweiterte Funktion:
formatReport()- Zeigt
analysisMetaSektion im Pretty-Print
- Zeigt
- Erweiterte Funktion:
executeInspectChains()- Parameter:
settings: MindnetSettingshinzugefügt - Übergibt
settings.edgeVocabularyPathaninspectChains()
- Parameter:
src/main.ts
- Update: Aufruf von
executeInspectChains()erweitert umsettingsParameter
src/tests/analysis/chainInspector.test.ts
- 4 neue Tests:
should use canonical types for causal role detection when aliases are usedshould detect dangling_target for missing fileshould detect dangling_target_heading for missing headingshould produce deterministic analysisMeta ordering
- Mock-Erweiterungen:
VocabularyLoadergemocktmetadataCacheMethoden erweitert
Neue Abhängigkeiten
edge_vocabulary.md: Wird für canonical mapping verwendet (optional, aber empfohlen)VocabularyLoader: Lädt Edge Vocabulary TextparseEdgeVocabulary: Parst Edge Vocabulary Markdown
Test-Ergebnisse
Erfolgreiche Tests (11/11)
✅ Alias-aware Role Classification:
- Test: Verwendet Alias
ausgelöst_durch, chain_roles nur canonicalcaused_by - Ergebnis:
no_causal_rolesFinding wird NICHT generiert (korrekt) analysisMeta.edgesWithCanonical> 0
✅ Dangling Target Detection:
- Test: Link auf
[[MissingNote]](Datei existiert nicht) - Ergebnis:
dangling_targetFinding miterrorSeverity korrekt erkannt
✅ Dangling Target Heading Detection:
- Test: Link auf
[[ExistingNote#MissingHeading]](Datei existiert, Heading fehlt) - Ergebnis:
dangling_target_headingFinding mitwarnSeverity korrekt erkannt
✅ Deterministic Analysis Meta:
- Test: Zwei identische Aufrufe mit gemischten Aliases
- Ergebnis:
analysisMetaidentisch,roleMatchesKeys sortiert
Beispiel-Output (aus realem Vault)
=== Chain Inspector Report ===
Context: 03_Experiences/Clusters/Wendepunkte/Ereignisse die mein Leben verändert haben.md
Section: 28.11.2007 und 30.01.2011 Geburt unserer beiden Söhne
Zone: content
Settings:
- Include Note Links: true
- Include Candidates: false
- Max Depth: 3
- Direction: both
Neighbors:
Incoming: 1
- part_of -> 03_Experiences/persönliche Erfahrungen.md#Zentrale Prägungen [section]
Outgoing: 2
- basiert_auf -> Geburt unserer Kinder Rouven und Rohan [section]
- wirkt_auf -> Rolle Vater von zwei Söhnen [section]
Paths:
Forward: 2
- ... -> Geburt unserer Kinder Rouven und Rohan (1 edges)
- ... -> Rolle Vater von zwei Söhnen (1 edges)
Backward: 1
- 03_Experiences/persönliche Erfahrungen.md#Zentrale Prägungen -> ... (1 edges)
Gap Heuristics (Findings): 1
❌ [ERROR] dangling_target: Target file does not exist: Geburt unserer Kinder Rouven und Rohan
Analysis Meta:
- Edges Total: 13
- Edges With Canonical: 13
- Edges Unmapped: 0
- Role Matches:
- causal: 3
- influences: 2
- structural: 6
Bekannte Einschränkungen
- Trash Detection: Dateien im
.trashOrdner werden als "nicht existierend" erkannt (korrektes Verhalten) - Heading Cache: Wenn
metadataCache.getFileCache()nicht verfügbar ist, wird Heading-Check übersprungen (akzeptabel, da Cache später aktualisiert wird) - Case Sensitivity: Alias-Matching ist case-insensitive, aber File-Matching kann case-sensitive sein (abhängig von Obsidian-Konfiguration)
Verwendung
In Obsidian
- Öffnen Sie eine Markdown-Datei mit Edges
- Positionieren Sie den Cursor in einer Section
- Öffnen Sie die Command Palette (Strg+P / Cmd+P)
- Wählen Sie: "Mindnet: Inspect Chains (Current Section)"
- Prüfen Sie die Console (Strg+Shift+I / Cmd+Option+I) für den Report
Erwartete Ausgabe:
analysisMetaSektion zeigt Mapping-Coveragedangling_targetFindings für fehlende Dateien/Headingsno_causal_rolessollte nicht triggern wenn Aliases zu canonical causal types gemappt werden
Programmatisch
import { executeInspectChains } from "./commands/inspectChainsCommand";
await executeInspectChains(
app,
editor,
filePath,
chainRoles, // ChainRolesConfig | null
settings, // MindnetSettings (für edgeVocabularyPath)
{
includeNoteLinks: true,
includeCandidates: false,
maxDepth: 3,
direction: "both"
}
);
Konfiguration
Erforderliche Settings
edgeVocabularyPath: Pfad zuedge_vocabulary.md(Standard:"_system/dictionary/edge_vocabulary.md")chainRolesPath: Pfad zuchain_roles.yaml(Standard:"_system/dictionary/chain_roles.yaml")
Optional
chainTemplatesPath: Wird noch nicht verwendet (für zukünftige Features)
Vergleich v0.1 vs v0.2
| Feature | v0.1 | v0.2 |
|---|---|---|
| Neighbors (incoming/outgoing) | ✅ | ✅ |
| Forward/Backward Paths | ✅ | ✅ |
| Gap Heuristics (basic) | ✅ | ✅ |
| Alias-aware Role Classification | ❌ | ✅ |
| Dangling Target Detection | ❌ | ✅ |
| Analysis Meta | ❌ | ✅ |
| Edge Vocabulary Integration | ❌ | ✅ |
Zusammenfassung
Chain Inspector v0.2 erweitert v0 erfolgreich um:
✅ Alias-aware Role Classification - Präzisere Rollen-Erkennung auch bei Alias-Verwendung
✅ Dangling Target Detection - Automatische Erkennung fehlerhafter Links
✅ Analysis Meta - Zusätzliche Metriken für Debugging und Coverage-Analyse
Alle Tests bestehen (11/11)
TypeScript kompiliert ohne Fehler
Keine Linter-Fehler
Production Ready ✅
Die Implementierung bildet eine solide Grundlage für weitere Chain Intelligence Features in Phase 2.
Erstellt: 2025-01-XX
Autor: Cursor AI Agent
Status: ✅ Production Ready