From fsnotes
Search, create, edit, and delete notes in the user's FSNotes store. Use whenever the user wants to find a note, jot one down, append to or change an existing note, or remove one ("find my note about X", "make a note", "add to my X note", "delete that note"). Knows FSNotes conventions: `.markdown` files, a `# Title` first line, notebooks as subfolders, inline `#hashtags`, and reserved `Trash/`/`files/` folders.
How this skill is triggered — by the user, by Claude, or both
Slash command
/fsnotes:fsnotesThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You manage the user's FSNotes notes. FSNotes is a macOS/iOS notes app that
You manage the user's FSNotes notes. FSNotes is a macOS/iOS notes app that stores each note as a plain Markdown file in an iCloud folder. This skill wraps that store so you can search and edit it without guessing its layout.
.markdown file (not .md).# Title heading; the filename usually
matches the title.Foo/ belongs to
the Foo notebook. Notebook names are discovered at runtime from the
store — never assume or hardcode any.#hashtags in the body. There is no YAML
frontmatter and no separate tags field.Trash/ (deleted notes) and files/ (attachments)
are never treated as notebooks and are excluded from searches.The scripts below resolve the notes directory themselves (honoring a
FSNOTES_DIR override, otherwise the iCloud path). Always invoke them by
their absolute path under the plugin's scripts dir:
"${CLAUDE_PLUGIN_ROOT}/scripts/<script>.sh"
fsnotes-search subagentFor any "find / look up / which note" request, dispatch the
fsnotes-search subagent via the Task tool rather than searching yourself.
It runs scripts/fsnotes-search.sh <mode> <query> [notebook] and returns a
compact hit list (relative/path:line:text) without dumping note bodies. Pick
the mode from the request — text (body), title (heading/filename),
tag (#hashtag), or folder (restrict a body search to one notebook) —
and pass a notebook when the user scopes the search to one. Open a matched
note with Read only when the user wants its contents.
fsnotes-newpath.sh then Writescripts/fsnotes-newpath.sh <title> [notebook] to get the absolute
target path. It sanitizes the title and refuses to overwrite: a
non-zero exit means a note with that title already exists. Surface that
conflict to the user (offer a different title or to edit the existing
note) — do not force it.Write the note to the returned path. Start the body with a
# Title line matching the requested title. Add #hashtags only if the
user asked for them — never invent tags.Edit in placeFind the note first (use the search subagent if the user named it loosely),
then Edit the file directly to append or change content, preserving the
# Title line. If more than one note could match, confirm which one with
the user before editing.
fsnotes-trash.shRun scripts/fsnotes-trash.sh <note-path> to move the note into the
store's Trash/ (created on demand; collisions get a numeric suffix). This
never hard-deletes, mirroring FSNotes's own delete. Relative paths resolve
against the notes dir; absolute paths must resolve inside it (anything
outside the store is refused).
scripts/fsnotes-search.sh <mode> <query> [notebook] — search.scripts/fsnotes-newpath.sh <title> [notebook] — safe path for a new note.scripts/fsnotes-trash.sh <note-path> — move a note to Trash/.scripts/fsnotes-lib.sh — sourced by the others; not called directly.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub olomix/cc-thingz --plugin fsnotes