Skip to content

v0.10.0

Choose a tag to compare

@zekaizer zekaizer released this 06 Sep 18:10
· 7 commits to main since this release

A note created as … I/O ….md landed as folder … I and note O ….md, and nothing could refuse it: with a string path, a/b.md and a title holding / are the same bytes. Every path the tools carry is now an array of segments (ADR-0029), so a separator inside a name is an error at the write that caused it, not a surprise at a later read — and the contract no longer states a separator character at all.

Breaking

  • A path is ["dir", "note.md"], root to leaf; [] is the vault root. Requests, responses and error details alike, on every tool. A string path is refused at the schema. A segment that is empty, ., .., or holds /, \ or NUL is rejected as SEGMENT, naming the segment; a title such as I/O needs I∕O (U+2215) or IO.
  • move_notes names its target with exactly one of dest or into. dest is the full destination path including the new basename; into is a directory to move into keeping the basename ([] for the root). The trailing-/ convention that carried this distinction is gone; both or neither rejects the item as MISSING_CONTENT.
  • list_notes items carry kind (note | dir). Directory paths no longer end in /; kind is how a directory is told apart. A directory item's path is exactly what move_notes.into takes.
  • A transfer PUT never creates a directory. A URL cannot tell a separator from a / in a title, so PUT /api/notes/{path} under a missing parent answers 409 Conflict (RFC 4918 §9.7) with the way out in the body: make the directory through the note tools (create_notes with a path under it), then put again. The recipe says so on its PUT line.

Notes

  • Markdown links inside note bodies and the transfer API's URL paths stay strings — each has a path syntax of its own. On disk, in the event journal and in git commit subjects nothing changed.
  • The server instructions state the array form up front, and name the intro note as the array read_notes takes.
  • A mistyped directory segment still creates that directory silently: this release catches separators, not typos. A create_dirs guard stays a compatible follow-up if that failure shows up.