---
name: create_obsidian_note
kind: function
lang: py
domain: obsidian
version: "1.0.0"
purity: impure
signature: "def create_obsidian_note(vault_dir: str, rel_path: str, body: str = '', frontmatter: dict = None, overwrite: bool = False) -> str"
description: "Crea una nota Markdown nueva en un vault de Obsidian. Anade extension .md si falta, crea directorios padre, serializa frontmatter YAML + body con la funcion pura format_obsidian_note. Falla si la nota existe salvo overwrite=True. No depende de la app GUI de Obsidian: solo escribe un archivo .md plano en disco."
tags: [obsidian, markdown, frontmatter, create, write, notes]
uses_functions: ["format_obsidian_note_py_obsidian"]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["os"]
params:
  - name: vault_dir
    desc: "directorio raiz del vault de Obsidian donde se crea la nota"
  - name: rel_path
    desc: "ruta relativa de la nota dentro del vault; se le anade .md si no lo trae"
  - name: body
    desc: "cuerpo Markdown de la nota sin frontmatter (default cadena vacia)"
  - name: frontmatter
    desc: "dict con el frontmatter YAML a escribir; None se trata como {}"
  - name: overwrite
    desc: "si False (default) y la nota existe lanza FileExistsError; True sobreescribe"
output: "ruta absoluta (str) del archivo .md escrito"
tested: true
tests:
  - "crea nota con frontmatter y body"
  - "anade extension md si falta"
  - "crea directorios padre"
  - "existente sin overwrite lanza fileexistserror"
  - "overwrite true sobreescribe"
  - "destino directorio lanza isadirectoryerror"
test_file_path: "python/functions/obsidian/create_obsidian_note_test.py"
file_path: "python/functions/obsidian/create_obsidian_note.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from obsidian import create_obsidian_note

path = create_obsidian_note(
    vault_dir="/home/me/vault",
    rel_path="Inbox/Idea rapida",          # se convierte en Inbox/Idea rapida.md
    body="Primer apunte. Ver [[Proyecto X]].",
    frontmatter={"title": "Idea rapida", "tags": ["inbox", "wip"]},
)
print(path)   # /home/me/vault/Inbox/Idea rapida.md
```

## Cuando usarla

Cuando quieras crear una nota nueva en un vault de Obsidian desde codigo o un agente: capturar una idea en el Inbox, generar notas a partir de datos, o materializar plantillas. Crea automaticamente los directorios padre, asi que sirve para sembrar estructuras de carpetas nuevas.

## Gotchas

- **Escribe en disco** (I/O impuro): crea el archivo y los directorios padre que falten (`os.makedirs(..., exist_ok=True)`).
- **No respeta locks de la app GUI**: si Obsidian esta abierto, el archivo nuevo aparecera en el vault, pero crear una nota cuyo nombre choque con una abierta y sin guardar puede provocar conflictos de version en el editor.
- Por defecto **no sobreescribe**: lanza `FileExistsError` si la nota ya existe. Pasa `overwrite=True` para reemplazar.
- Lanza `IsADirectoryError` si el destino resuelto es un directorio existente.
- El nombre de archivo se respeta tal cual (incluidos espacios); Obsidian admite espacios en nombres de nota.
