---
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).
