One protocol. Any domain. Six methods between you and a complete version control system — branching, merging, conflict resolution, time-travel, and typed diffs — for free.
Every domain — MIDI, source code, genomics, 3D spatial, financial models — implements the same six-method protocol. The core engine handles everything else: content-addressed storage, DAG, branches, log, merge base, cherry-pick, revert, stash, tags.
Domains currently registered in this Muse instance. The active domain
is the one used when you run muse commit, muse diff,
and all other commands.
MIDI file versioning with 21-dimension structured merge — notes, CC, pitch bend, tempo, time signatures, and more. Each dimension merges independently…
Source-code versioning with symbol-level operational-transform merge. Tree-sitter parses 11 languages into ASTs; functions, classes, and imports merge…
MIDI and code are the two shipped domains — both fully active with typed
deltas, structured merge, and .museattributes rule control.
These are the domains planned next — and the slot waiting for yours.
The core engine provides four advanced capabilities that any domain plugin can opt into. Implement the protocol — the engine does the rest.
Unlike Git's blob diffs, Muse deltas are typed objects:
InsertOp, ReplaceOp, DeleteOp — each
carrying the address, before/after hashes, and affected dimensions.
Machine-readable with muse show --json.
# muse show --json (any commit, any domain)
{
"commit_id": "b26f3c99",
"message": "Resolve: integrate shared-state (A+B reconciled)",
"operations": [
{
"op_type": "ReplaceOp",
"address": "shared-state.mid",
"before_hash": "a1b2c3d4",
"after_hash": "e5f6g7h8",
"dimensions": ["structural"]
},
{
"op_type": "InsertOp",
"address": "beta-a.mid",
"after_hash": "09ab1234",
"dimensions": ["rhythmic", "dynamic"]
}
],
"summary": {
"inserted": 1,
"replaced": 1,
"deleted": 0
}
}
Each plugin's schema() method declares its dimensions and merge mode.
The engine uses this to select the right diff algorithm per dimension and to
surface only the dimensions that actually conflict.
MIDI file versioning with 21-dimension structured merge — notes, CC, pitch bend, tempo, time signatures, and more. Each dimension merges independently…
Source-code versioning with symbol-level operational-transform merge. Tree-sitter parses 11 languages into ASTs; functions, classes, and imports merge…
Plugins implementing StructuredMergePlugin get operational transformation. Operations at different addresses commute automatically — only operations on the same address with incompatible intent surface a conflict.
Plugins implementing CRDTPlugin get six battle-tested convergent data structures. No coordination required between replicas. The MIDI plugin extends RGA into MidiRGA — a voice-aware variant that orders concurrent note insertions by voice lane (bass → tenor → alto → soprano) before falling back to op-id, preventing voice crossings without human intervention.
The engine selects the algorithm per dimension from your plugin’s
schema(). You declare the shape — the engine handles identity,
diffing, and merge selection automatically.
One command scaffolds the entire plugin skeleton. You fill in six methods. The full VCS follows.
raise NotImplementedError with your domain's
snapshot, diff, merge, drift, apply, and schema logic.
registry.py, then every Muse command works
for your domain out of the box.
muse domains --new genomics producesA fully typed, immediately runnable plugin skeleton. Every method has the correct signature. You replace the stubs — the protocol does the rest.
Full walkthrough → docs/guide/plugin-authoring-guide.md · CRDT extension → docs/guide/crdt-reference.md
Three tiers of distribution — from local prototype to globally searchable registry. Start local, publish when ready.
Works today. Scaffold → implement → register. Your plugin lives alongside the core.
muse domains --new <name>Implement 6 methods in muse/plugins/<name>/plugin.pyRegister in muse/plugins/registry.pymuse init --domain <name>Share your plugin as a standard Python package. Anyone with pip can install and use it.
Package your plugin as a Python modulepip install git+https://github.com/you/muse-plugin-genomicsRegister the entry-point in pyproject.tomlmuse init --domain genomicsMuseHub is a planned centralized registry — npm for Muse plugins. Versioned, searchable, one-command install.
musehub publish muse-plugin-genomicsmusehub search genomicsmuse init --domain @musehub/genomicsBrowse plugins at musehub.ioA centralized, searchable registry for Muse domain plugins — think npm or crates.io, but for any multidimensional versioned state. One command to publish. One command to install.
muse init --domain @musehub/genomics