"""Built-in obsidian-wiki skill templates. Mirrors the key intent of ``ar9av/obsidian-wiki`` skills so the backend can write vault content that stays compatible with the original tooling without shelling out to its CLI: - ``wiki-capture`` — how a conversation becomes a *declarative* knowledge note (frontmatter schema + Context/Finding/Reasoning/Implications/Related body). - ``wiki-query`` — layered retrieval (hot.md → index.md → frontmatter → body). - ``wiki-export`` — graph artifacts (graph.json / graph.html / graphml / cypher). These are intentionally lightweight: the structures here are what :mod:`deerflow.knowledge.markdown_vault` and :mod:`deerflow.knowledge.extractor` produce, and what the first-release LLM prompt (future enhancement) should target. """ from __future__ import annotations # Category → vault sub-directory (wiki-capture page taxonomy, §8 of the dev doc). CATEGORY_DIRS = { "synthesis": "synthesis", "concepts": "concepts", "concept": "concepts", "references": "references", "reference": "references", "source": "references", "decision": "synthesis", "journal": "journal", "session": "journal", } # Body section headings (wiki-capture). Declarative knowledge, never a chat log. BODY_SECTIONS = ("Context", "Finding / Decision", "Reasoning", "Implications", "Related") # Inline provenance markers reused from wiki-capture. INFERRED_MARKER = "^[inferred]" AMBIGUOUS_MARKER = "^[ambiguous]" WIKI_CAPTURE_GUIDANCE = """\ Capture *declarative* knowledge, not a chat transcript. Classify the note as one of: synthesis, concept, source, decision, session. Prefer at least two [[wikilinks]]. Mark inferred content with ^[inferred] and uncertain/conflicting content with ^[ambiguous]. Project-specific knowledge belongs under projects//... """ def category_to_dir(category: str | None) -> str: """Map a wiki-capture category to its vault sub-directory.""" return CATEGORY_DIRS.get((category or "").strip().lower(), "synthesis")