v0.9.0
One memory across your machines, and a store that answers "why".
Added
ygg sync --repo <your-git-repo>— cross-machine memory sync through a repo
YOU own (GitHub private, Gitea, even a bare repo on a USB stick). The store
travels as one byte-deterministic JSON file per memory plus arelations.jsonl
(git union-merge driver); no relay, no account, no cloud in the loop. One
command converges both machines: export → commit → pull → import with a
deterministic merge policy (archive-anywhere-holds-everywhere, longer content
wins, confidence max, pinned OR) → re-export → push. Counters and vectors stay
per-machine by design.- Relation graph — memories can SOLVE, SUPERSEDE, or CONTRADICT each other.
Typed, idempotent edges answer why a memory exists and what replaced it:
ygg remember --solves/--supersedes/--contradictslinks at write time (also
exposed on theygg_rememberMCP tool, so an agent saving a fix can close the
follow-up it resolves);ygg supersede --byrecords the replacement;
ygg reviewdup consolidation now leaves SUPERSEDES edges instead of bare
archives. Inspect withygg relations --id(both directions, with previews). ygg seed --schedule HH:MM— nightly auto-distill. Installs a
calendar-fired LaunchAgent that distills what changed since the last run and
exits;offremoves it,statusreports. Incremental state + dedup keep the
nightly run cheap; a dead Ollama just means those files retry the next night.
Fixed
- Python 3.10 crash in
ygg review/ reports /materialize— the code used
datetime.UTC, an alias that only exists on Python 3.11+. 0.8.0 on PyPI is
affected on 3.10; upgrade. - Windows: explicit UTF-8 everywhere. Text IO carrying memory content relied
on the locale encoding (cp1252), which crashedygg export-nativeon the 🌳 in
the managed block; Codex session routing compared againststr(path)and never
matched Windows backslash paths (as_posix()now). - The release pipeline itself: publishing from a detached HEAD (e.g. a checked-out
tag) no longer fails with "not a full refname" — pushes name the target branch.