notes-export — full local snapshot of Apple Notes
Self-Evolving skill — if export behavior drifts (AE size caps, chunk failures, encoding), fix this SKILL.md and
scripts/notes.tsOSA_EXPORT(+ a test innotes-core.test.tsfor any pure helper change); see the Post-Execution Reflection at the bottom.
One command captures everything Notes holds into a timestamped local snapshot:
NC="$HOME/.claude/plugins/marketplaces/cc-skills/plugins/notes-commander/scripts/notes.ts"
bun "$NC" export # → ~/.local/share/notes-commander/export/<stamp>/
bun "$NC" export --out /path/to/dir # explicit destination
What a snapshot contains:
- One markdown file per note, under
<account>/<folder>/…mirroring the Notes hierarchy. Each file has YAML frontmatter (account,folder,id,modified) and the note body as plain text (decoded viatextutil, UTF-8-safe, CJK-safe). manifest.json— every folder (with counts) and every note (id, name, modified, relative file path, char count). This is the machine-readable index for audits and diffs.- Filenames are sanitized (
safeFilename) and suffixed with the note's core-data id (.p1234.md), so same-titled notes never collide.
Rules
- Run this before any
notes-organizeoperation — it is the undo story. Notes has no API-level undo; a snapshot does. - The default root (
~/.local/share/notes-commander/export/) is deliberately OUTSIDE any git repo so note content can never be accidentally committed. Don't redirect--outinto a repo. - Snapshots are full (not incremental); each run creates a new timestamped dir. Old snapshots are plain dirs — delete them manually when no longer wanted.
Recently Deletedis deliberately skipped (restore a note in the Notes UI first if you want it captured).
MemPalace bridge (if mempalace is on PATH)
After a successful export, re-mine the snapshot into the local MemPalace semantic index so the notes are searchable by meaning (multilingual — verified on 中文 content):
command -v mempalace >/dev/null && mempalace mine "<snapshot-dir>" --wing apple-notes --agent terry
Idempotent (unchanged notes are skipped). Recall then works via mempalace search "<query>" --wing apple-notes. Skip silently when mempalace isn't installed — the bridge is an enhancement, not a dependency.
- A large library takes a few minutes (verified live: 400 notes ≈ 2.5 min) — bodies are fetched in chunks of 20 because one giant Apple Event reply blows the AE size cap (
-1741). A failed chunk degrades to per-note fetches; a still-failing note becomes a warning + exit code 3 (partial export is LOUD, never silent). Transient-600/-1712launch races retry automatically.
Post-Execution Reflection
After an export, check: (1) exit code 0 and note count ≈ live inventory total? Exit 3 means some notes were skipped — read the ⚠ lines and investigate before trusting the snapshot as a backup. (2) Spot-check one CJK/emoji-titled file — mojibake means the <meta charset="utf-8"> textutil prefix or safeFilename drifted. (3) New -1741s despite chunking → shrink the chunk size in OSA_EXPORT. Update this SKILL.md only for real, reproducible drift.