cgcardona / muse public
app.py python
162 lines 8.8 KB
0590ede7 feat(code): Phase 2 — query v2 predicate grammar + muse query-history Gabriel Cardona <gabriel@tellurstori.com> 1d ago
1 """Muse CLI — entry point for the ``muse`` console script.
2
3 Core VCS commands::
4
5 init status log commit diff
6 show branch checkout merge reset
7 revert stash cherry-pick tag domains
8
9 Music-domain semantic commands (impossible in Git)::
10
11 notes list every note in a MIDI track as musical notation
12 note-log note-level commit history for a track
13 note-blame per-bar attribution — which commit wrote these notes?
14 harmony chord analysis and key detection
15 piano-roll ASCII piano roll visualization
16 note-hotspots bar-level churn leaderboard
17 velocity-profile dynamic range and velocity histogram
18 transpose transpose all notes by N semitones (agent command)
19 mix combine two MIDI tracks into one (agent command)
20
21 Code-domain semantic commands — Phase 1 (impossible in Git)::
22
23 symbols list every semantic symbol in a snapshot
24 symbol-log track a single symbol through commit history
25 detect-refactor report semantic refactoring operations across commits
26
27 Code-domain semantic commands — Phase 2 (paradigm shift)::
28
29 grep search the symbol graph by name / kind / language
30 blame show which commit last touched a specific symbol
31 hotspots symbol churn leaderboard — which functions change most
32 stable symbol stability leaderboard — your bedrock
33 coupling file co-change analysis — hidden dependencies
34 compare semantic comparison between any two historical snapshots
35 languages language and symbol-type breakdown
36 patch surgical semantic patch — modify exactly one symbol (all-language validation)
37 query symbol graph predicate DSL — SQL for your codebase (--all-commits mode)
38
39 Code-domain semantic commands — Phase 3 (gap-closers)::
40
41 deps import graph + Python call-graph with --reverse
42 find-symbol cross-commit, cross-branch content_id / name search
43
44 Code-domain semantic commands — Phase 4 (call-graph tier)::
45
46 impact transitive blast-radius — what breaks if this function changes?
47 dead dead code detection — symbols with no callers and no importers
48 coverage class interface call-coverage — which methods are actually used?
49
50 Code-domain semantic commands — Phase 5 (query v2 + temporal)::
51
52 query predicate DSL v2 — OR, NOT, grouping, new fields, schema_version
53 query-history temporal symbol search across a commit range
54 """
55 from __future__ import annotations
56
57 import typer
58
59 from muse.cli.commands import (
60 attributes,
61 blame,
62 branch,
63 cherry_pick,
64 checkout,
65 commit,
66 compare,
67 coupling,
68 coverage,
69 dead,
70 deps,
71 detect_refactor,
72 diff,
73 domains,
74 find_symbol,
75 grep,
76 harmony,
77 hotspots,
78 impact,
79 init,
80 languages,
81 log,
82 merge,
83 mix,
84 note_blame,
85 note_hotspots,
86 note_log,
87 notes,
88 patch,
89 piano_roll,
90 query,
91 query_history,
92 reset,
93 revert,
94 show,
95 stable,
96 stash,
97 status,
98 symbol_log,
99 symbols,
100 tag,
101 transpose,
102 velocity_profile,
103 )
104
105 cli = typer.Typer(
106 name="muse",
107 help="Muse — domain-agnostic version control for multidimensional state.",
108 no_args_is_help=True,
109 )
110
111 # Core VCS
112 cli.add_typer(attributes.app, name="attributes", help="Display .museattributes merge-strategy rules.")
113 cli.add_typer(init.app, name="init", help="Initialise a new Muse repository.")
114 cli.add_typer(commit.app, name="commit", help="Record the current working tree as a new version.")
115 cli.add_typer(status.app, name="status", help="Show working-tree drift against HEAD.")
116 cli.add_typer(log.app, name="log", help="Display commit history.")
117 cli.add_typer(diff.app, name="diff", help="Compare working tree against HEAD, or two commits.")
118 cli.add_typer(show.app, name="show", help="Inspect a commit: metadata, diff, files.")
119 cli.add_typer(branch.app, name="branch", help="List, create, or delete branches.")
120 cli.add_typer(checkout.app, name="checkout", help="Switch branches or restore working tree from a commit.")
121 cli.add_typer(merge.app, name="merge", help="Three-way merge a branch into the current branch.")
122 cli.add_typer(reset.app, name="reset", help="Move HEAD to a prior commit.")
123 cli.add_typer(revert.app, name="revert", help="Create a new commit that undoes a prior commit.")
124 cli.add_typer(cherry_pick.app, name="cherry-pick", help="Apply a specific commit's changes on top of HEAD.")
125 cli.add_typer(stash.app, name="stash", help="Shelve and restore uncommitted changes.")
126 cli.add_typer(tag.app, name="tag", help="Attach and query semantic tags on commits.")
127 cli.add_typer(domains.app, name="domains", help="Domain plugin dashboard — list capabilities and scaffold new domains.")
128
129 # Music-domain commands
130 cli.add_typer(notes.app, name="notes", help="[music] List every note in a MIDI track as musical notation.")
131 cli.add_typer(note_log.app, name="note-log", help="[music] Note-level commit history — which notes were added or removed in each commit.")
132 cli.add_typer(note_blame.app, name="note-blame", help="[music] Per-bar attribution — which commit introduced the notes in this bar?")
133 cli.add_typer(harmony.app, name="harmony", help="[music] Chord analysis and key detection from MIDI note content.")
134 cli.add_typer(piano_roll.app, name="piano-roll", help="[music] ASCII piano roll visualization of a MIDI track.")
135 cli.add_typer(note_hotspots.app, name="note-hotspots", help="[music] Bar-level churn leaderboard — which bars change most across commits.")
136 cli.add_typer(velocity_profile.app, name="velocity-profile", help="[music] Dynamic range and velocity histogram for a MIDI track.")
137 cli.add_typer(transpose.app, name="transpose", help="[music] Transpose all notes in a MIDI track by N semitones.")
138 cli.add_typer(mix.app, name="mix", help="[music] Combine notes from two MIDI tracks into a single output track.")
139
140 # Code-domain commands
141 cli.add_typer(symbols.app, name="symbols", help="[code] List every semantic symbol (function, class, method…) in a snapshot.")
142 cli.add_typer(symbol_log.app, name="symbol-log", help="[code] Track a single symbol through the full commit history.")
143 cli.add_typer(detect_refactor.app, name="detect-refactor", help="[code] Detect semantic refactoring operations (renames, moves, extractions) across commits.")
144 cli.add_typer(grep.app, name="grep", help="[code] Search the symbol graph by name, kind, or language — not file text.")
145 cli.add_typer(blame.app, name="blame", help="[code] Show which commit last touched a specific symbol (function, class, method).")
146 cli.add_typer(hotspots.app, name="hotspots", help="[code] Symbol churn leaderboard — which functions change most often.")
147 cli.add_typer(stable.app, name="stable", help="[code] Symbol stability leaderboard — the bedrock of your codebase.")
148 cli.add_typer(coupling.app, name="coupling", help="[code] File co-change analysis — discover hidden semantic dependencies.")
149 cli.add_typer(compare.app, name="compare", help="[code] Deep semantic comparison between any two historical snapshots.")
150 cli.add_typer(languages.app, name="languages", help="[code] Language and symbol-type breakdown of a snapshot.")
151 cli.add_typer(patch.app, name="patch", help="[code] Surgical semantic patch — modify exactly one named symbol (all-language syntax validation).")
152 cli.add_typer(query.app, name="query", help="[code] Symbol graph predicate DSL v2 — OR/NOT/grouping, --all-commits temporal search.")
153 cli.add_typer(query_history.app, name="query-history", help="[code] Temporal symbol search — first seen, last seen, change count across a commit range.")
154 cli.add_typer(deps.app, name="deps", help="[code] Import graph + Python call-graph; --reverse for callers/importers.")
155 cli.add_typer(find_symbol.app, name="find-symbol", help="[code] Cross-commit, cross-branch symbol search by hash, name, or kind.")
156 cli.add_typer(impact.app, name="impact", help="[code] Transitive blast-radius — every caller affected if this symbol changes.")
157 cli.add_typer(dead.app, name="dead", help="[code] Dead code candidates — symbols with no callers and no importers.")
158 cli.add_typer(coverage.app, name="coverage", help="[code] Class interface call-coverage — which methods are actually called?")
159
160
161 if __name__ == "__main__":
162 cli()