- Md (yaml+toml): tags now marshal as ["tag1", "tag2"] (quoted)
- Txt: tags now marshal as double-space-separated (tag1 tag2)
- Add parseTags() to Unmarshal: accepts any delimiter format and
normalizes each tag to [a-z0-9]+, enabling lenient frontmatter
input on body writes
- Fix results tests to use UnmarshalStrict where errors were expected
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The pubsub event endpoint was only used for physical file sync, which is
no longer needed now that reads/writes go directly through 9P. Removed
the /event file, pubsub message bus, and all Publish calls.
Added renameNote helper that renames the physical file and updates
note.Path whenever title, keywords, signature, or body frontmatter
changes, keeping the denote filename in sync with in-memory metadata.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
readDir was slicing the serialized dir entry bytes at the raw byte
boundary, splitting entries mid-stream. The plan9 client's dirUnpack
stops on a truncated entry, so 9pfuse received nothing usable.
Fix readDir to return only complete entries per read, as required by
the 9P spec. Also warn-and-skip on ExtractMetadata errors in LoadAll
instead of aborting the entire directory walk.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add /event file for pub/sub event notifications
- Events: n (new), u (update), r (rename), d (delete)
- Format: '<type> <identifier>' per line
- Blocking read with 30s timeout