opencommand 0.1.4__tar.gz → 0.1.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. opencommand-0.1.5/PKG-INFO +207 -0
  2. opencommand-0.1.5/README.md +183 -0
  3. {opencommand-0.1.4 → opencommand-0.1.5}/pyproject.toml +2 -2
  4. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/cli.py +613 -509
  5. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/agent.py +91 -91
  6. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/config.py +116 -116
  7. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/errors.py +23 -23
  8. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/logging.py +65 -65
  9. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/supervisor.py +81 -81
  10. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/core/tools.py +136 -136
  11. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/engine/__init__.py +87 -87
  12. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/engine/runner.py +303 -303
  13. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/knowledge.py +85 -85
  14. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/memory/MEMORY.md +14 -14
  15. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/bash.md +14 -14
  16. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/desktop_linux.md +41 -41
  17. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/desktop_macos.md +42 -42
  18. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/desktop_windows.md +44 -44
  19. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/powershell.md +15 -15
  20. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/python.md +20 -20
  21. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/skills/system.md +38 -38
  22. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/system/automatic.py +178 -178
  23. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/system/cron.py +212 -212
  24. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/system/notify.py +85 -85
  25. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/system/platform.py +209 -209
  26. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/templates.py +227 -227
  27. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/desktop.py +202 -202
  28. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/desktop_safety.py +162 -162
  29. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/files.py +82 -82
  30. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/instructions.py +163 -163
  31. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/memory.py +78 -78
  32. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/playwright.py +61 -61
  33. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/research.py +46 -46
  34. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/system.py +285 -285
  35. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/terminal.py +53 -53
  36. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/modules/tools/yara_rules/default.yar +61 -61
  37. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/providers/provider.py +157 -157
  38. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/swarm/agents/commander.py +549 -549
  39. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/swarm/agents/worker.py +26 -26
  40. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/tui/dashboard.py +41 -41
  41. opencommand-0.1.4/PKG-INFO +0 -92
  42. opencommand-0.1.4/README.md +0 -68
  43. {opencommand-0.1.4 → opencommand-0.1.5}/src/opencommand/__init__.py +0 -0
@@ -0,0 +1,207 @@
1
+ Metadata-Version: 2.3
2
+ Name: opencommand
3
+ Version: 0.1.5
4
+ Summary: Local-first swarm agent framework: a Commander plans and dispatches a swarm of Workers that research, code, test, and interactively drive the computer to complete long-horizon codebase goals.
5
+ Author: DSiENT
6
+ Author-email: DSiENT <w.caskey7@gmail.com>
7
+ Requires-Dist: asciimatics>=1.15.0
8
+ Requires-Dist: click>=8.4.2
9
+ Requires-Dist: playwright>=1.61.0
10
+ Requires-Dist: pyautogui>=0.9.54
11
+ Requires-Dist: pynput>=1.8.2
12
+ Requires-Dist: requests>=2.34.2
13
+ Requires-Dist: mss>=9.0.0
14
+ Requires-Dist: pillow>=11.0.0
15
+ Requires-Dist: llama-cpp-python>=0.3.33
16
+ Requires-Dist: huggingface-hub>=0.30.0
17
+ Requires-Dist: watchdog>=6.0.0
18
+ Requires-Dist: ntfy>=2.7.1
19
+ Requires-Dist: yara-python>=4.5.0
20
+ Requires-Python: >=3.14
21
+ Project-URL: Homepage, https://github.com/D5-Interactive/OpenCommand
22
+ Project-URL: Repository, https://github.com/D5-Interactive/OpenCommand
23
+ Description-Content-Type: text/markdown
24
+
25
+ # OpenCommand
26
+
27
+ Local-first swarm agent framework. A **Commander** model plans and dispatches a
28
+ swarm of **Workers** that research, code, test, and interactively drive the
29
+ computer (mouse, keyboard, screen) to complete long-horizon codebase goals.
30
+
31
+ Everything runs **embedded** — models are GGUF files loaded directly with
32
+ `llama-cpp-python` (no API servers, no network at runtime). Designed for
33
+ **Python 3.14** (free-threaded).
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ # Run without installing (ephemeral):
39
+ uv tool run opencommand --help
40
+
41
+ # Or install globally:
42
+ uv tool install opencommand
43
+ playwright install # optional, for the playwright tool
44
+ ```
45
+
46
+ > **Note:** the `llama-cpp-python` prebuilt CPU wheel may crash on older CPUs
47
+ > (illegal-instruction). If so, rebuild from source with AVX2:
48
+ > ```bat
49
+ > call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
50
+ > set CMAKE_ARGS=-DGGML_AVX2=ON
51
+ > uv pip install --no-binary llama-cpp-python --no-cache llama-cpp-python
52
+ > ```
53
+
54
+ ## Usage
55
+
56
+ ```bash
57
+ opencommand models list # list built-in embedded models
58
+ opencommand models pull all # download GGUF models into ./models
59
+ opencommand config # interactive menu: workers, batch size, GPU, etc.
60
+ opencommand run "Add unit tests for the engine module."
61
+ opencommand run --goal-file Goal.md # run from a Goal.md spec (intended state)
62
+ opencommand run "Build a Panda3D FPS" --pipeline advanced --verify "uv run pytest -q"
63
+ opencommand tui # live swarm dashboard
64
+ opencommand cron add healthcheck "every 1h" "echo ok"
65
+ ```
66
+
67
+ ### Goal.md spec
68
+
69
+ Instead of an inline goal, point `run` at a `Goal.md` file that defines the
70
+ intended end state / requirements for the session. Its contents become the goal
71
+ fed to the swarm (and the advanced pipeline's review gate checks against it):
72
+
73
+ ```bash
74
+ opencommand run --goal-file Goal.md
75
+ ```
76
+
77
+ The file name is configurable via `opencommand config` (default `Goal.md`).
78
+
79
+ ## Built-in models
80
+
81
+ | Role | Model |
82
+ |---------------|----------------------------------------|
83
+ | commander | `deepreinforce-ai/Ornith-1.0-9B-GGUF` |
84
+ | worker | `unsloth/Qwen3-4B-Instruct-2507-GGUF` |
85
+ | vision | `unsloth/Qwen3-VL-4B-Instruct-GGUF` |
86
+ | vision_small | `openbmb/MiniCPM-V-4.6-gguf` |
87
+
88
+ ## Links
89
+
90
+ - `DESIGN.md` — full architecture & research notes
91
+ - `TODO.md` — roadmap tracker
92
+
93
+ ## Micro-wiki: running & configuring OpenCommand on any system
94
+
95
+ OpenCommand is **local-first** and **cross-platform** (Windows, Linux, macOS).
96
+ Everything runs embedded — no API keys, no external servers. The only hard
97
+ requirement is **Python 3.14+** and enough RAM for the GGUF models.
98
+
99
+ ### 1. Install
100
+
101
+ ```bash
102
+ # Ephemeral (no install):
103
+ uv tool run opencommand --help
104
+
105
+ # Global install (recommended):
106
+ uv tool install opencommand
107
+ playwright install # optional, only for the playwright tool
108
+ ```
109
+
110
+ > **CPU illegal-instruction crash?** The `llama-cpp-python` prebuilt wheel is
111
+ > built with a newer ISA than some CPUs (e.g. Zen 3 / Ryzen 5000). Rebuild
112
+ > from source with your ISA flags:
113
+ > ```bat
114
+ > call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
115
+ > set CMAKE_ARGS=-DGGML_AVX2=ON
116
+ > uv pip install --no-binary llama-cpp-python --no-cache llama-cpp-python
117
+ > ```
118
+
119
+ ### 2. Scaffold a workspace
120
+
121
+ ```bash
122
+ opencommand init # creates README.md, TODO.md, .opencommand/ + GOAL.md
123
+ ```
124
+ `init` is **idempotent** — it never overwrites existing files, so re-running it
125
+ is safe. Fill out `.opencommand/GOAL.md` with the intended end state, then run
126
+ the full advanced pipeline against it:
127
+
128
+ ```bash
129
+ opencommand run --goal-file .opencommand/GOAL.md --pipeline advanced
130
+ ```
131
+
132
+ ### 3. Configure (interactive menu)
133
+
134
+ ```bash
135
+ opencommand config
136
+ ```
137
+ Sets: vision on/off, vision model (`vision` = Qwen3-VL-4B, `vision_small` =
138
+ MiniCPM-V-4.6 0.8B for low-RAM), max workers, batch size, retries,
139
+ pipeline, live-verify, GPU layers, goal file, **desktop safety policy**, and
140
+ **per-role device placement**.
141
+
142
+ ### 4. Device placement (low-VRAM hosts)
143
+
144
+ Models can be pinned per role to **GPU** (offload all layers) or **CPU+RAM**
145
+ (RAM only) via `opencommand config` → "Model device placement". Roles:
146
+ `commander`, `worker`, `vision`, `vision_small`. Example for an 8 GB VRAM /
147
+ 32 GB RAM machine:
148
+
149
+ | Role | Device | Why |
150
+ |------------|--------|--------------------------------------------------|
151
+ | commander | GPU | Small planner; keep it fast & resident on GPU |
152
+ | worker | CPU | Heavy pool; scales with RAM, not VRAM |
153
+ | vision | GPU | VL desktop agent needs the GPU for screen理解 |
154
+ | vision_small | GPU | Lightweight fallback for the desktop agent |
155
+
156
+ Roles you don't pin fall back to the legacy global `n_gpu_layers`
157
+ (`-1` = all GPU, `0` = CPU). During live-verify the Commander is
158
+ **unloaded from the GPU** while the VL desktop agent runs (freeing VRAM), then
159
+ **re-loaded** to review the agent's report and continue the loop.
160
+
161
+ ### 5. Run modes
162
+
163
+ ```bash
164
+ opencommand run "Add unit tests for the engine module." # inline goal
165
+ opencommand run --goal-file .opencommand/GOAL.md # from spec
166
+ opencommand run "Build a Panda3D FPS" --pipeline advanced \
167
+ --verify "uv run pytest -q" # verify gate
168
+ opencommand run "..." --live-verify # interactive desktop check
169
+ opencommand tui # live dashboard
170
+ ```
171
+
172
+ - **standard** pipeline: plan → research → workers.
173
+ - **advanced** pipeline: scaffold → research loop (until accurate) → workers →
174
+ test+debug loop → Commander review gate → optional live-verify.
175
+
176
+ ### 6. Desktop safety
177
+
178
+ The desktop agent drives the real mouse/keyboard, so it is the most dangerous
179
+ capability. `opencommand config` exposes a **safety policy** that the Commander
180
+ enforces before every action: allow/deny mouse, keyboard, typing; require
181
+ confirmation for risky-but-permitted actions; max steps; pause between actions; and
182
+ a built-in deny-list of destructive actions (restart/shutdown), dangerous key
183
+ combos (`win+r`, `ctrl+alt+del`), and typed tokens (`rm -rf`, `sudo`,
184
+ `curl | sh`). OS-specific safe-operation skills ship for Windows / Linux / macOS.
185
+
186
+ ### 7. Scheduling
187
+
188
+ ```bash
189
+ opencommand cron add healthcheck "every 1h" "echo ok" # shell command
190
+ opencommand cron add build "daily 09:00" "uv run pytest -q" # cron expr
191
+ opencommand cron edit healthcheck --schedule "every 30m" # change without remove+add
192
+ opencommand cron list / remove / status / start
193
+ ```
194
+ Persisted jobs auto-boot with `run` / `cron start` and dispatch goals through
195
+ the Commander or run shell commands.
196
+
197
+ ### 8. Security tooling
198
+
199
+ ```bash
200
+ opencommand run "Scan the workspace for stray scripts" --goal-file Goal.md
201
+ ```
202
+ The `system` tool lists processes, watches paths (watchdog), and scans files /
203
+ directories / live processes with **YARA** (`yara-python`, with a bundled
204
+ default ruleset detecting stray agent loops, obfuscation, suspicious PowerShell,
205
+ and known malware markers). Falls back to the `yara` CLI if the binding is absent.
206
+
207
+
@@ -0,0 +1,183 @@
1
+ # OpenCommand
2
+
3
+ Local-first swarm agent framework. A **Commander** model plans and dispatches a
4
+ swarm of **Workers** that research, code, test, and interactively drive the
5
+ computer (mouse, keyboard, screen) to complete long-horizon codebase goals.
6
+
7
+ Everything runs **embedded** — models are GGUF files loaded directly with
8
+ `llama-cpp-python` (no API servers, no network at runtime). Designed for
9
+ **Python 3.14** (free-threaded).
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ # Run without installing (ephemeral):
15
+ uv tool run opencommand --help
16
+
17
+ # Or install globally:
18
+ uv tool install opencommand
19
+ playwright install # optional, for the playwright tool
20
+ ```
21
+
22
+ > **Note:** the `llama-cpp-python` prebuilt CPU wheel may crash on older CPUs
23
+ > (illegal-instruction). If so, rebuild from source with AVX2:
24
+ > ```bat
25
+ > call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
26
+ > set CMAKE_ARGS=-DGGML_AVX2=ON
27
+ > uv pip install --no-binary llama-cpp-python --no-cache llama-cpp-python
28
+ > ```
29
+
30
+ ## Usage
31
+
32
+ ```bash
33
+ opencommand models list # list built-in embedded models
34
+ opencommand models pull all # download GGUF models into ./models
35
+ opencommand config # interactive menu: workers, batch size, GPU, etc.
36
+ opencommand run "Add unit tests for the engine module."
37
+ opencommand run --goal-file Goal.md # run from a Goal.md spec (intended state)
38
+ opencommand run "Build a Panda3D FPS" --pipeline advanced --verify "uv run pytest -q"
39
+ opencommand tui # live swarm dashboard
40
+ opencommand cron add healthcheck "every 1h" "echo ok"
41
+ ```
42
+
43
+ ### Goal.md spec
44
+
45
+ Instead of an inline goal, point `run` at a `Goal.md` file that defines the
46
+ intended end state / requirements for the session. Its contents become the goal
47
+ fed to the swarm (and the advanced pipeline's review gate checks against it):
48
+
49
+ ```bash
50
+ opencommand run --goal-file Goal.md
51
+ ```
52
+
53
+ The file name is configurable via `opencommand config` (default `Goal.md`).
54
+
55
+ ## Built-in models
56
+
57
+ | Role | Model |
58
+ |---------------|----------------------------------------|
59
+ | commander | `deepreinforce-ai/Ornith-1.0-9B-GGUF` |
60
+ | worker | `unsloth/Qwen3-4B-Instruct-2507-GGUF` |
61
+ | vision | `unsloth/Qwen3-VL-4B-Instruct-GGUF` |
62
+ | vision_small | `openbmb/MiniCPM-V-4.6-gguf` |
63
+
64
+ ## Links
65
+
66
+ - `DESIGN.md` — full architecture & research notes
67
+ - `TODO.md` — roadmap tracker
68
+
69
+ ## Micro-wiki: running & configuring OpenCommand on any system
70
+
71
+ OpenCommand is **local-first** and **cross-platform** (Windows, Linux, macOS).
72
+ Everything runs embedded — no API keys, no external servers. The only hard
73
+ requirement is **Python 3.14+** and enough RAM for the GGUF models.
74
+
75
+ ### 1. Install
76
+
77
+ ```bash
78
+ # Ephemeral (no install):
79
+ uv tool run opencommand --help
80
+
81
+ # Global install (recommended):
82
+ uv tool install opencommand
83
+ playwright install # optional, only for the playwright tool
84
+ ```
85
+
86
+ > **CPU illegal-instruction crash?** The `llama-cpp-python` prebuilt wheel is
87
+ > built with a newer ISA than some CPUs (e.g. Zen 3 / Ryzen 5000). Rebuild
88
+ > from source with your ISA flags:
89
+ > ```bat
90
+ > call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
91
+ > set CMAKE_ARGS=-DGGML_AVX2=ON
92
+ > uv pip install --no-binary llama-cpp-python --no-cache llama-cpp-python
93
+ > ```
94
+
95
+ ### 2. Scaffold a workspace
96
+
97
+ ```bash
98
+ opencommand init # creates README.md, TODO.md, .opencommand/ + GOAL.md
99
+ ```
100
+ `init` is **idempotent** — it never overwrites existing files, so re-running it
101
+ is safe. Fill out `.opencommand/GOAL.md` with the intended end state, then run
102
+ the full advanced pipeline against it:
103
+
104
+ ```bash
105
+ opencommand run --goal-file .opencommand/GOAL.md --pipeline advanced
106
+ ```
107
+
108
+ ### 3. Configure (interactive menu)
109
+
110
+ ```bash
111
+ opencommand config
112
+ ```
113
+ Sets: vision on/off, vision model (`vision` = Qwen3-VL-4B, `vision_small` =
114
+ MiniCPM-V-4.6 0.8B for low-RAM), max workers, batch size, retries,
115
+ pipeline, live-verify, GPU layers, goal file, **desktop safety policy**, and
116
+ **per-role device placement**.
117
+
118
+ ### 4. Device placement (low-VRAM hosts)
119
+
120
+ Models can be pinned per role to **GPU** (offload all layers) or **CPU+RAM**
121
+ (RAM only) via `opencommand config` → "Model device placement". Roles:
122
+ `commander`, `worker`, `vision`, `vision_small`. Example for an 8 GB VRAM /
123
+ 32 GB RAM machine:
124
+
125
+ | Role | Device | Why |
126
+ |------------|--------|--------------------------------------------------|
127
+ | commander | GPU | Small planner; keep it fast & resident on GPU |
128
+ | worker | CPU | Heavy pool; scales with RAM, not VRAM |
129
+ | vision | GPU | VL desktop agent needs the GPU for screen理解 |
130
+ | vision_small | GPU | Lightweight fallback for the desktop agent |
131
+
132
+ Roles you don't pin fall back to the legacy global `n_gpu_layers`
133
+ (`-1` = all GPU, `0` = CPU). During live-verify the Commander is
134
+ **unloaded from the GPU** while the VL desktop agent runs (freeing VRAM), then
135
+ **re-loaded** to review the agent's report and continue the loop.
136
+
137
+ ### 5. Run modes
138
+
139
+ ```bash
140
+ opencommand run "Add unit tests for the engine module." # inline goal
141
+ opencommand run --goal-file .opencommand/GOAL.md # from spec
142
+ opencommand run "Build a Panda3D FPS" --pipeline advanced \
143
+ --verify "uv run pytest -q" # verify gate
144
+ opencommand run "..." --live-verify # interactive desktop check
145
+ opencommand tui # live dashboard
146
+ ```
147
+
148
+ - **standard** pipeline: plan → research → workers.
149
+ - **advanced** pipeline: scaffold → research loop (until accurate) → workers →
150
+ test+debug loop → Commander review gate → optional live-verify.
151
+
152
+ ### 6. Desktop safety
153
+
154
+ The desktop agent drives the real mouse/keyboard, so it is the most dangerous
155
+ capability. `opencommand config` exposes a **safety policy** that the Commander
156
+ enforces before every action: allow/deny mouse, keyboard, typing; require
157
+ confirmation for risky-but-permitted actions; max steps; pause between actions; and
158
+ a built-in deny-list of destructive actions (restart/shutdown), dangerous key
159
+ combos (`win+r`, `ctrl+alt+del`), and typed tokens (`rm -rf`, `sudo`,
160
+ `curl | sh`). OS-specific safe-operation skills ship for Windows / Linux / macOS.
161
+
162
+ ### 7. Scheduling
163
+
164
+ ```bash
165
+ opencommand cron add healthcheck "every 1h" "echo ok" # shell command
166
+ opencommand cron add build "daily 09:00" "uv run pytest -q" # cron expr
167
+ opencommand cron edit healthcheck --schedule "every 30m" # change without remove+add
168
+ opencommand cron list / remove / status / start
169
+ ```
170
+ Persisted jobs auto-boot with `run` / `cron start` and dispatch goals through
171
+ the Commander or run shell commands.
172
+
173
+ ### 8. Security tooling
174
+
175
+ ```bash
176
+ opencommand run "Scan the workspace for stray scripts" --goal-file Goal.md
177
+ ```
178
+ The `system` tool lists processes, watches paths (watchdog), and scans files /
179
+ directories / live processes with **YARA** (`yara-python`, with a bundled
180
+ default ruleset detecting stray agent loops, obfuscation, suspicious PowerShell,
181
+ and known malware markers). Falls back to the `yara` CLI if the binding is absent.
182
+
183
+
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "opencommand"
3
- version = "0.1.4"
3
+ version = "0.1.5"
4
4
  description = "Local-first swarm agent framework: a Commander plans and dispatches a swarm of Workers that research, code, test, and interactively drive the computer to complete long-horizon codebase goals."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -31,7 +31,7 @@ Homepage = "https://github.com/D5-Interactive/OpenCommand"
31
31
  Repository = "https://github.com/D5-Interactive/OpenCommand"
32
32
 
33
33
  [dependency-groups]
34
- dev = ["pytest>=8.0"]
34
+ dev = ["pytest>=8.0", "ruff>=0.11.0"]
35
35
 
36
36
  [tool.uv]
37
37
  package = true