feat: complete MuseDomainPlugin integration — apply(), incremental checkout
revert.py: reuse parent commit's snapshot_id directly; eliminates the post-restore re-scan and redundant write_object_from_path calls. Objects are already in the content-addressed store.
cherry_pick.py: use merged_manifest from plugin.merge() directly; objects sourced from existing snapshots need no re-write.
checkout.py: replace full wipe+restore with incremental delta checkout via plugin.diff() + plugin.apply(). Only files that actually changed are touched — deleted paths are removed, added/modified paths are restored from the object store. plugin.apply() serves as the domain-level post-checkout hook.
plugin.py: fix apply() — split the Path and dict code paths clearly. Path case rescans the workdir after physical changes (correct). Dict case applies removals in-memory and documents the limitation that added/modified hashes require target-side data not carried by the delta.
All 5 MuseDomainPlugin methods are now wired into CLI commands: snapshot() → commit, stash diff() → diff, checkout (new) merge() → merge, cherry-pick drift() → status apply() → checkout (new)
279 tests / 279 passing · 91% coverage