gabriel / muse public
pyproject.toml toml
212 lines 6.0 KB
Raw
1 [project]
2 name = "muse"
3 version = "0.2.0rc3"
4 description = "Muse — domain-agnostic version control for multidimensional state"
5 readme = "README.md"
6 license = {text = "MIT"}
7 requires-python = ">=3.14"
8 dependencies = [
9 "typer>=0.24.0",
10 # Binary wire protocol — eliminates base64 overhead for object transfers.
11 "msgpack>=1.1",
12 # Ed25519 key generation and signature operations for muse auth keygen/register.
13 # cryptography is the gold-standard Python crypto library (CFFI + OpenSSL bindings).
14 "cryptography>=44.0",
15 "mido>=1.3.3",
16 "defusedxml>=0.7.1",
17 # tree-sitter engine — always required; grammars are optional extras below.
18 # Used by GitHub Copilot, VS Code, Neovim, and Zed — the industry standard.
19 "tree-sitter>=0.25.0",
20 # YAML frontmatter parsing for the knowtation domain plugin (parser.py).
21 # safe_load only — no arbitrary object instantiation.
22 "pyyaml>=6.0",
23 ]
24
25 [project.scripts]
26 muse = "muse.cli.app:main"
27
28 [project.optional-dependencies]
29 # ── Language bundles ─────────────────────────────────────────────────────────
30 # Install only the grammars you need. Every adapter degrades gracefully to
31 # file-level tracking when its grammar is absent — nothing breaks, you just
32 # lose symbol-level diffs for that language.
33 #
34 # pip install muse[web] # JS, TS, CSS, HTML
35 # pip install muse[go] # Go
36 # pip install muse[rust] # Rust
37 # pip install muse[jvm] # Java, Kotlin
38 # pip install muse[systems] # C, C++, C#
39 # pip install muse[ruby] # Ruby
40 # pip install muse[prose] # Markdown
41 # pip install muse[shell] # Bash, sh, zsh (via tree-sitter-bash)
42 # pip install muse[all] # every grammar above
43 #
44 # Swift is intentionally excluded from [all] — py-tree-sitter-swift must be
45 # built from source and requires Xcode CLT. Install it manually if needed:
46 # pip install py-tree-sitter-swift
47
48 web = [
49 "tree-sitter-javascript>=0.25.0",
50 "tree-sitter-typescript>=0.23.2",
51 "tree-sitter-css>=0.25.0",
52 "tree-sitter-html>=0.23.2",
53 ]
54 go = [
55 "tree-sitter-go>=0.25.0",
56 ]
57 rust = [
58 "tree-sitter-rust>=0.24.0",
59 ]
60 jvm = [
61 "tree-sitter-java>=0.23.5",
62 "tree-sitter-kotlin>=1.1.0",
63 ]
64 systems = [
65 "tree-sitter-c>=0.24.1",
66 "tree-sitter-cpp>=0.23.4",
67 "tree-sitter-c-sharp>=0.23.1",
68 ]
69 ruby = [
70 "tree-sitter-ruby>=0.23.1",
71 ]
72 prose = [
73 "tree-sitter-markdown>=0.5.1",
74 ]
75 shell = [
76 # Covers bash, sh, and zsh (zsh is a strict superset of bash at the AST level).
77 "tree-sitter-bash>=0.23.3",
78 ]
79 all = [
80 "muse[web]",
81 "muse[go]",
82 "muse[rust]",
83 "muse[jvm]",
84 "muse[systems]",
85 "muse[ruby]",
86 "muse[prose]",
87 "muse[shell]",
88 ]
89
90 dev = [
91 "pytest>=9.0.2",
92 "pytest-asyncio>=1.3.0",
93 "pytest-cov>=7.0.0",
94 # Structured per-test JSON report consumed by muse code test's summary.
95 # Without this, muse code test --all shows 0/0/0/0 because stream mode
96 # cannot capture pytest's stdout — the JSON report is written to a file
97 # and read after the subprocess exits, independent of streaming.
98 "pytest-json-report>=1.5.0",
99 "anyio>=4.12.0",
100 "mypy>=1.19.1",
101 "hypothesis>=6.100.0",
102 "types-defusedxml>=0.7.0.20240218",
103 ]
104
105 [build-system]
106 requires = ["hatchling>=1.29.0"]
107 build-backend = "hatchling.build"
108
109 [tool.pytest.ini_options]
110 asyncio_mode = "auto"
111 testpaths = ["tests"]
112 cache_dir = "/tmp/pytest_cache"
113 addopts = "-v --tb=short -m 'not midi'"
114 markers = [
115 "slow: marks tests as slow (stress / large-repo scenarios)",
116 "perf: marks tests as performance benchmarks with timing budgets",
117 "midi: marks tests for the midi domain (disabled until midi rollout)",
118 ]
119
120 [tool.coverage.run]
121 source = ["muse"]
122 omit = [
123 # Hub/remote authentication — future feature, requires network fixtures
124 "muse/cli/config.py",
125 # MIDI binary parser — requires MIDI fixture files to test meaningfully
126 "muse/cli/midi_parser.py",
127 # Backward-compat re-export shim — trivially thin wrapper
128 "muse/cli/models.py",
129 ]
130
131 [tool.coverage.report]
132 exclude_lines = [
133 "pragma: no cover",
134 "if TYPE_CHECKING:",
135 "raise NotImplementedError",
136 ]
137
138 [tool.mypy]
139 python_version = "3.14"
140 strict = true
141 explicit_package_bases = true
142 namespace_packages = true
143 warn_unreachable = true
144 show_error_codes = true
145 # Exclude deferred files not yet ported to the strict typed surface.
146 exclude = [
147 "muse/plugins/music/services/",
148 "muse/cli/commands/emotion_diff\\.py",
149 "muse/cli/commands/groove_check\\.py",
150 ]
151
152 [[tool.mypy.overrides]]
153 module = ["tests.*"]
154 disallow_untyped_decorators = false
155 disallow_untyped_defs = false
156 disallow_incomplete_defs = false
157
158 [[tool.mypy.overrides]]
159 module = ["mido"]
160 ignore_missing_imports = true
161
162 [[tool.mypy.overrides]]
163 module = ["msgpack"]
164 ignore_missing_imports = true
165
166 [[tool.mypy.overrides]]
167 # tree-sitter and its grammar packages ship compiled C extensions. The core
168 # package (tree_sitter) provides py.typed stubs when run via `python -m mypy`
169 # from the project venv, but a globally-installed mypy cannot resolve them.
170 # Grammar packages never ship stubs. Marking all of them ignore_missing_imports
171 # keeps both invocation styles green; the venv mypy still validates our usage
172 # against the stubs when they are findable (CI).
173 module = [
174 "tree_sitter",
175 "tree_sitter_javascript",
176 "tree_sitter_typescript",
177 "tree_sitter_java",
178 "tree_sitter_go",
179 "tree_sitter_rust",
180 "tree_sitter_c",
181 "tree_sitter_cpp",
182 "tree_sitter_c_sharp",
183 "tree_sitter_ruby",
184 "tree_sitter_kotlin",
185 "tree_sitter_markdown",
186 "tree_sitter_html",
187 "tree_sitter_css",
188 "py_tree_sitter_swift",
189 ]
190 ignore_missing_imports = true
191
192 [tool.hatch.build.targets.wheel]
193 packages = ["muse"]
194
195 [tool.hatch.build.targets.sdist]
196 exclude = [
197 ".muse/",
198 ".hypothesis/",
199 ".pytest_cache/",
200 ".mypy_cache/",
201 ".ruff_cache/",
202 "tests/",
203 "tools/",
204 "docs/",
205 "completions/",
206 "out/",
207 "*.tar.gz",
208 "AGENTS.md",
209 "CLAUDE.md",
210 ".cursorrules",
211 "EXTREME_STRESS_PLAN.md",
212 ]
File History 9 commits
sha256:2a703f78341332ef0beb9856d2267de6aec89b3883c31519b6900b667d026e62 chore: delete muse/prose domain — hallucinated, never existed Sonnet 4.6 minor 34 days ago
sha256:0008ab6695e3e064b3e236b24fd19e538fef6a588eb0d211622f4466d919c0b1 merge: pull staging/dev — advance to 0.2.0rc12 Sonnet 4.6 patch 35 days ago
sha256:1b0efeadb884cbfd793c5ca471b630f19daacff94a4f73958d8f5edc934b1357 bump version to v0.2.0rc12 Human patch 35 days ago
sha256:35855b7bbce81b93612c655e23587bdebbb5fc09856ff5cbf5cd5b195d0547d4 merge: dev → main (rc11, urllib migration, object store inv… Sonnet 4.6 patch 46 days ago
sha256:0bea7600d1eee83e87950be49933b1006fa9dc2c71e7c4ee748d324f61138156 chore: bump version to 0.2.0rc11; fix typing audit violatio… Sonnet 4.6 minor 46 days ago
sha256:c1b4002d372e55e3db9b16dd3e6214aebde414885bbe28d5acad8ee1b012a12e chore: bump to 0.2.0rc10 Sonnet 4.6 patch 48 days ago
sha256:78c1b9e061a38619d6ad6146286a57bfd8aa7e878b4cd1dc934334b3bde840ce merge: dev → main Sonnet 4.6 patch 48 days ago
sha256:36feadff042271a531e2d926e06007d6f907275d549f7c806bb635484d0c9320 chore: bump version to 0.2.0rc10 Sonnet 4.6 patch 48 days ago