--- name: update_obsidian_note kind: function lang: py domain: obsidian version: "1.0.0" purity: impure signature: "def update_obsidian_note(path: str, body: str = None, set_frontmatter: dict = None, append: str = None) -> str" description: "Actualiza una nota Markdown de Obsidian existente. Lee el estado actual con parse_obsidian_frontmatter, hace merge de claves del frontmatter (set_frontmatter), reemplaza el body (body) o concatena texto al final (append), y reescribe con la funcion pura format_obsidian_note. No depende de la app GUI de Obsidian: solo lee y reescribe el archivo .md plano." tags: [obsidian, markdown, frontmatter, update, write, notes] uses_functions: ["parse_obsidian_frontmatter_py_obsidian", "format_obsidian_note_py_obsidian"] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["os"] params: - name: path desc: "ruta al archivo .md de la nota a actualizar" - name: body desc: "si no es None, reemplaza por completo el cuerpo de la nota" - name: set_frontmatter desc: "dict que se mergea (update de claves) sobre el frontmatter actual; las no mencionadas se conservan" - name: append desc: "texto que se concatena al final del cuerpo (separado por salto de linea); se aplica despues de body" output: "la ruta (str) del archivo actualizado" tested: true tests: - "merge frontmatter conserva claves previas" - "reemplazo de body" - "append concatena al final" - "body y append combinados" - "nota inexistente lanza filenotfounderror" - "directorio lanza isadirectoryerror" test_file_path: "python/functions/obsidian/update_obsidian_note_test.py" file_path: "python/functions/obsidian/update_obsidian_note.py" --- ## Ejemplo ```python import sys, os sys.path.insert(0, os.path.join("python", "functions")) from obsidian import update_obsidian_note # Marcar como hecha y anadir una linea de log al final update_obsidian_note( "/home/me/vault/Tareas/Revisar PR.md", set_frontmatter={"status": "done", "closed": "2026-06-09"}, append="- Cerrada tras revisar [[PR 42]].", ) ``` ## Cuando usarla Cuando necesites modificar una nota existente sin reescribirla entera: cambiar campos del frontmatter (status, fechas, tags), reemplazar el cuerpo, o ir anadiendo entradas a un log/diario al final. El merge de `set_frontmatter` permite tocar solo las claves que cambian sin perder el resto. ## Gotchas - **Lee y reescribe en disco** (I/O impuro): sobreescribe el archivo completo con el contenido reserializado por `format_obsidian_note`. El formato/orden del frontmatter puede normalizarse respecto al original escrito a mano. - **No respeta locks de la app GUI**: si Obsidian tiene la nota abierta con cambios sin guardar, esos cambios en memoria se perderan cuando esta funcion reescriba el archivo (la app puede recargarlo o sobreescribirlo de vuelta). Cierra/guarda en Obsidian antes de editar desde codigo. - `set_frontmatter` hace **merge superficial** (`dict.update`): claves nuevas se anaden, existentes se reemplazan, las demas se conservan. No borra claves. - `append` se aplica **despues** de un eventual reemplazo de `body`, garantizando un salto de linea de separacion. - Lanza `FileNotFoundError` si la nota no existe (no la crea — usa `create_obsidian_note` para eso).