curupira 0.3.0.dev0__py3-none-win_amd64.whl
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.
- curupira/__init__.py +12 -0
- curupira/__main__.py +23 -0
- curupira-0.3.0.dev0.data/scripts/curu.exe +0 -0
- curupira-0.3.0.dev0.data/scripts/curupira.exe +0 -0
- curupira-0.3.0.dev0.dist-info/METADATA +361 -0
- curupira-0.3.0.dev0.dist-info/RECORD +8 -0
- curupira-0.3.0.dev0.dist-info/WHEEL +4 -0
- curupira-0.3.0.dev0.dist-info/sboms/curupira.cyclonedx.json +7127 -0
curupira/__init__.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Curupira Python distribution layer.
|
|
2
|
+
|
|
3
|
+
The CLI implementation is the Rust binary installed by this package. Only
|
|
4
|
+
``__version__`` is a supported programmatic export.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from importlib.metadata import version
|
|
8
|
+
|
|
9
|
+
__all__ = ["__version__"]
|
|
10
|
+
|
|
11
|
+
# Read from the installed distribution, whose version comes from the release tag.
|
|
12
|
+
__version__ = version("curupira")
|
curupira/__main__.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""``python -m curupira`` delegates to the installed ``curupira`` binary."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def main() -> None:
|
|
11
|
+
"""Exec the Rust CLI with the same argv."""
|
|
12
|
+
binary = shutil.which("curupira")
|
|
13
|
+
if binary is None:
|
|
14
|
+
print(
|
|
15
|
+
"curupira binary not found on PATH; reinstall the curupira package",
|
|
16
|
+
file=sys.stderr,
|
|
17
|
+
)
|
|
18
|
+
raise SystemExit(1)
|
|
19
|
+
os.execvp(binary, [binary, *sys.argv[1:]])
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if __name__ == "__main__":
|
|
23
|
+
main()
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: curupira
|
|
3
|
+
Version: 0.3.0.dev0
|
|
4
|
+
Classifier: Development Status :: 3 - Alpha
|
|
5
|
+
Classifier: Environment :: Console
|
|
6
|
+
Classifier: Intended Audience :: Developers
|
|
7
|
+
Classifier: Operating System :: OS Independent
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
12
|
+
Classifier: Programming Language :: Rust
|
|
13
|
+
Classifier: Typing :: Typed
|
|
14
|
+
Requires-Dist: curupira-plugins>=0.1.0.dev0 ; extra == 'azure'
|
|
15
|
+
Requires-Dist: curupira-plugins>=0.1.0.dev0 ; extra == 'extensions'
|
|
16
|
+
Requires-Dist: curupira-plugins>=0.1.0.dev0 ; extra == 'github'
|
|
17
|
+
Requires-Dist: curupira-plugins>=0.1.0.dev0 ; extra == 'monday'
|
|
18
|
+
Requires-Dist: curupira-plugins>=0.1.0.dev0 ; extra == 'trello'
|
|
19
|
+
Provides-Extra: azure
|
|
20
|
+
Provides-Extra: extensions
|
|
21
|
+
Provides-Extra: github
|
|
22
|
+
Provides-Extra: monday
|
|
23
|
+
Provides-Extra: trello
|
|
24
|
+
Summary: Dispatch GitHub and cron tasks to local AI coding agents
|
|
25
|
+
Keywords: github,automation,coding-agents,cli,cron
|
|
26
|
+
Author: Mario Taddeucci
|
|
27
|
+
License-Expression: MIT
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
30
|
+
Project-URL: Changelog, https://github.com/caipora-labs/curupira/blob/main/CHANGELOG.md
|
|
31
|
+
Project-URL: Homepage, https://github.com/caipora-labs/curupira
|
|
32
|
+
Project-URL: Issues, https://github.com/caipora-labs/curupira/issues
|
|
33
|
+
Project-URL: Repository, https://github.com/caipora-labs/curupira
|
|
34
|
+
|
|
35
|
+
# Curupira
|
|
36
|
+
|
|
37
|
+
**Curupira** (by Caipora Labs) is the product name. The PyPI project, primary console script, and Python import are `curupira`. The short command `curu` is the same entry point.
|
|
38
|
+
|
|
39
|
+
Curupira runs automations on your machine. It takes a GitHub issue or pull request, a Trello card, a monday.com item, or a local cron occurrence, and hands it to a coding-agent CLI you already have.
|
|
40
|
+
|
|
41
|
+
Each automation in the settings TOML watches one source (issues, pull requests, Trello
|
|
42
|
+
cards, monday.com items, or a cron schedule) and carries its own prompt. All automations share one discovery,
|
|
43
|
+
scheduling, and execution pipeline: `run` drains currently available tasks, while
|
|
44
|
+
`run --watch` polls every automation continuously.
|
|
45
|
+
|
|
46
|
+
## Requirements
|
|
47
|
+
|
|
48
|
+
- A supported platform wheel from PyPI (the CLI is a Rust binary; Python 3.11+ is
|
|
49
|
+
used for packaging and optional official trigger extras)
|
|
50
|
+
- [`gh`](https://cli.github.com/) installed and authenticated (`gh auth login`) when
|
|
51
|
+
using GitHub automations
|
|
52
|
+
- Only the CLIs used by the configured profiles need to be installed:
|
|
53
|
+
[`claude`](https://code.claude.com/docs/en/cli-reference),
|
|
54
|
+
[`codex`](https://developers.openai.com/codex/cli/), the Cursor CLI (`agent`),
|
|
55
|
+
[`gemini`](https://github.com/google-gemini/gemini-cli),
|
|
56
|
+
[GitHub Copilot CLI (`copilot`)](https://docs.github.com/en/copilot/how-tos/copilot-cli/set-up-copilot-cli/install-copilot-cli),
|
|
57
|
+
[`kilo`](https://kilo.ai/docs/code-with-ai/platforms/cli),
|
|
58
|
+
[`opencode`](https://opencode.ai/), [`pi`](https://pi.dev/docs/latest), or
|
|
59
|
+
[`qwen`](https://github.com/QwenLM/qwen-code)
|
|
60
|
+
- For Trello automations, install and authenticate the
|
|
61
|
+
[Scale-Flow `trello-cli`](https://github.com/Scale-Flow/trello-cli).
|
|
62
|
+
- For monday.com automations, set a personal API token in `MONDAY_API_TOKEN` (or the
|
|
63
|
+
environment variable named by `token_env`); see the
|
|
64
|
+
[monday.com task source guide](https://caipora-labs.github.io/curupira/monday/).
|
|
65
|
+
|
|
66
|
+
## Installation
|
|
67
|
+
|
|
68
|
+
Install the published package from PyPI (ships the Rust CLI only):
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uv tool install curupira
|
|
72
|
+
# or
|
|
73
|
+
pip install curupira
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Official triggers (`curupira-plugins`) and `curupira-sdk` are optional. Install them when
|
|
77
|
+
you need forge task sources:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pip install 'curupira[extensions]' # installs curupira-plugins (+ curupira-sdk)
|
|
81
|
+
pip install 'curupira[github]' # same package; forge-named extras are aliases
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
To pin a specific version, use `uv tool install "curupira==X.Y.Z"`.
|
|
85
|
+
|
|
86
|
+
The project is [caipora-labs/curupira](https://github.com/caipora-labs/curupira).
|
|
87
|
+
`curupira --version` and the short alias `curu --version` report the installed version.
|
|
88
|
+
Task-source extensions (except built-in cron) are separate processes; coding agents are
|
|
89
|
+
built into the Rust CLI. See
|
|
90
|
+
[Process extensions](https://caipora-labs.github.io/curupira/extensions/).
|
|
91
|
+
|
|
92
|
+
## Documentation
|
|
93
|
+
|
|
94
|
+
See the [full guide in Portuguese](https://caipora-labs.github.io/curupira/) for
|
|
95
|
+
installation, automation configuration, providers, and operational commands. Newcomers
|
|
96
|
+
can start with the
|
|
97
|
+
[automations reference](https://caipora-labs.github.io/curupira/automations/)
|
|
98
|
+
(triggers, minimal TOML examples, first-run commands, and common errors).
|
|
99
|
+
|
|
100
|
+
## Configuration
|
|
101
|
+
|
|
102
|
+
The default settings file is `~/.curupira/settings.toml`. Download the example
|
|
103
|
+
configuration directly to that location, then adjust repositories, paths, queries, and
|
|
104
|
+
prompts:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
mkdir -p ~/.curupira
|
|
108
|
+
curl -fsSL https://raw.githubusercontent.com/caipora-labs/curupira/main/packages/curupira-core/curupira.example.toml \
|
|
109
|
+
-o ~/.curupira/settings.toml
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The `~/.curupira` directory is created automatically when the default file is first
|
|
113
|
+
loaded. Pass `--config path/to/settings.toml` to use a different file; relative workspace,
|
|
114
|
+
state, and automation paths are resolved from that file's directory.
|
|
115
|
+
|
|
116
|
+
```toml
|
|
117
|
+
[settings]
|
|
118
|
+
max_active_tasks = 1
|
|
119
|
+
workspace_dir = "~/.curupira/workspaces"
|
|
120
|
+
state_db_path = "~/.curupira/state.sqlite3"
|
|
121
|
+
log_level = "INFO"
|
|
122
|
+
# Optional OTLP/HTTP trace endpoint; omit it to disable telemetry.
|
|
123
|
+
# otlp_endpoint = "http://localhost:4318/v1/traces"
|
|
124
|
+
|
|
125
|
+
[settings.polling]
|
|
126
|
+
poll_interval_seconds = 30
|
|
127
|
+
batch_size = 100
|
|
128
|
+
cron_poll_interval_seconds = 1
|
|
129
|
+
|
|
130
|
+
[repositories.api]
|
|
131
|
+
remote = "https://github.com/acme/api.git"
|
|
132
|
+
# setup_script = "scripts/bootstrap.sh"
|
|
133
|
+
|
|
134
|
+
[agents.defaults]
|
|
135
|
+
profile = "opencode-default"
|
|
136
|
+
timezone = "UTC"
|
|
137
|
+
|
|
138
|
+
[agents.profiles.opencode-default]
|
|
139
|
+
provider = "opencode"
|
|
140
|
+
|
|
141
|
+
[automations.resolve-ready-issues]
|
|
142
|
+
trigger_type = "plugins-py/github-issues"
|
|
143
|
+
repository = "api"
|
|
144
|
+
repo = "acme/api"
|
|
145
|
+
labels = ["agent-ready"]
|
|
146
|
+
linked_pull_request = false
|
|
147
|
+
prompt = "Resolve issue ${issue_number}: ${issue_title}\n\n${issue_body}"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Automations
|
|
151
|
+
|
|
152
|
+
For a newcomer-oriented map of every built-in trigger (minimal TOML, placeholders, and
|
|
153
|
+
first-run commands), see the
|
|
154
|
+
[automations reference](https://caipora-labs.github.io/curupira/automations/).
|
|
155
|
+
|
|
156
|
+
`[automations.<name>]` is a keyed map; the map key is the automation ID and is carried
|
|
157
|
+
into every task identity. `repository` selects a `[repositories.<alias>]` checkout with a
|
|
158
|
+
full Git `remote` URL (and optional `path` / `setup_script`). `trigger_type` selects the
|
|
159
|
+
source:
|
|
160
|
+
|
|
161
|
+
- `"plugins-py/github-issues"` / `"plugins-py/github-pull-requests"` — discover matching GitHub issues and pull
|
|
162
|
+
requests; see the
|
|
163
|
+
[GitHub task source guide](https://caipora-labs.github.io/curupira/github/)
|
|
164
|
+
- `"azure_cli_pull_requests"` — lists Azure DevOps pull requests with `az repos pr list`
|
|
165
|
+
- `"trello_cli_cards"` — discovers cards from a configured board with Scale-Flow's `trello-cli`
|
|
166
|
+
- `"monday_items"` — discovers board items through the monday.com GraphQL API; see the
|
|
167
|
+
[monday.com task source guide](https://caipora-labs.github.io/curupira/monday/)
|
|
168
|
+
- `"cron"` — produces occurrences from `schedule` instead of querying a forge
|
|
169
|
+
|
|
170
|
+
Every automation requires `repository` and `prompt`. GitHub/Azure triggers also require
|
|
171
|
+
forge `repo` identity; cron requires `schedule`. Trello automations require `board_id` and
|
|
172
|
+
optionally accept `list_ids`; see the
|
|
173
|
+
[Trello task source guide](https://caipora-labs.github.io/curupira/trello/).
|
|
174
|
+
monday.com automations require `board_id` and a token in `token_env` (default
|
|
175
|
+
`MONDAY_API_TOKEN`), and optionally accept `group_ids`.
|
|
176
|
+
For Azure DevOps, forge `repo` uses `organization/project/repository` (organization name,
|
|
177
|
+
not a full URL). Optional `status` (`active` by default), `source_branch`, and
|
|
178
|
+
`target_branch` filter the Azure list. Optional `profile` selects a named CLI profile;
|
|
179
|
+
otherwise the default profile applies. Relative paths resolve from the TOML directory.
|
|
180
|
+
Different repository aliases cannot share one workspace path. Automations keep file order,
|
|
181
|
+
and one-shot selection follows that order.
|
|
182
|
+
|
|
183
|
+
### Providers and native options
|
|
184
|
+
|
|
185
|
+
Curupira supports these coding-agent CLIs, selected with `provider` in a profile:
|
|
186
|
+
|
|
187
|
+
- Claude Code (`claude`)
|
|
188
|
+
- Codex (`codex`)
|
|
189
|
+
- Cursor (`cursor`)
|
|
190
|
+
- Kilo CLI (`kilo`)
|
|
191
|
+
- Gemini CLI (`gemini`)
|
|
192
|
+
- GitHub Copilot CLI (`copilot`)
|
|
193
|
+
- OpenCode (`opencode`)
|
|
194
|
+
- [pi (`pi`)](https://caipora-labs.github.io/curupira/providers/pi/)
|
|
195
|
+
- [Qwen Code (`qwen`)](https://caipora-labs.github.io/curupira/providers/qwen/)
|
|
196
|
+
|
|
197
|
+
How `model`, `effort`, `agent`, and permission options map to each CLI's native
|
|
198
|
+
arguments is documented on the
|
|
199
|
+
[Providers page](https://caipora-labs.github.io/curupira/providers/).
|
|
200
|
+
|
|
201
|
+
### Prompts and placeholders
|
|
202
|
+
|
|
203
|
+
Placeholders use `${name}` syntax and are validated when the configuration loads.
|
|
204
|
+
Common fields: `${repo}`, `${repository}`, `${automation_id}`, `${task_type}`,
|
|
205
|
+
`${task_number}`, `${task_title}`, `${task_body}`, `${task_url}`. Trello cards add `${card_id}`,
|
|
206
|
+
`${card_title}`, `${card_body}`, `${card_url}`, `${card_list_id}`. monday.com items add
|
|
207
|
+
`${item_id}`, `${item_name}`, `${item_url}`, and related fields listed in the
|
|
208
|
+
[monday.com task source guide](https://caipora-labs.github.io/curupira/monday/).
|
|
209
|
+
GitHub issue and pull-request placeholders are listed in the
|
|
210
|
+
[GitHub task source guide](https://caipora-labs.github.io/curupira/github/).
|
|
211
|
+
For cron tasks, `${task_number}` is the occurrence timestamp.
|
|
212
|
+
|
|
213
|
+
### Discovery, concurrency, and cron semantics
|
|
214
|
+
|
|
215
|
+
GitHub discovery compiles typed filters into Search queries and runs them through GraphQL
|
|
216
|
+
with a token from `gh auth token`; see the
|
|
217
|
+
[GitHub task source guide](https://caipora-labs.github.io/curupira/github/) for filters,
|
|
218
|
+
deduplication, scopes, and prompt fields. Polls fetch up to `batch_size` items (default 100,
|
|
219
|
+
up to 1000). When a full cycle finds nothing, the shared poller waits
|
|
220
|
+
`poll_interval_seconds` (default 30s); consecutive empty cycles double the wait up to
|
|
221
|
+
5 minutes, and any discovery resets it. Each automation deduplicates its own items, so
|
|
222
|
+
two automations may process the same forge item with different prompts.
|
|
223
|
+
|
|
224
|
+
Other task sources can be added as trigger plugins registered under the
|
|
225
|
+
`curupira.triggers` entry-point group; see the
|
|
226
|
+
[plugins guide](https://github.com/caipora-labs/curupira/blob/main/docs/en/plugins.md).
|
|
227
|
+
|
|
228
|
+
`max_active_tasks` bounds concurrently running coding agents (default 1). By default,
|
|
229
|
+
each task runs in a new worktree beside its base checkout, so tasks for the same repository
|
|
230
|
+
can run concurrently without sharing edits. The worktree branch is created from the
|
|
231
|
+
fetched remote default branch and is not pushed. Set `checkout = "main"` to use the
|
|
232
|
+
shared checkout instead (this means the shared checkout, not a branch named `main`, and
|
|
233
|
+
restores the previous exclusive behavior). `path` continues to select the base checkout.
|
|
234
|
+
With `checkout = "main"`, the agent runs on the shared checkout exactly as it is: Curupira does not fetch, pull, or switch branches there.
|
|
235
|
+
Checkouts are created on demand with `git clone <remote>` under
|
|
236
|
+
`workspace_dir/<repository-alias>` (or the alias `path`).
|
|
237
|
+
|
|
238
|
+
An optional `setup_script` on the repository alias is a repository-relative executable
|
|
239
|
+
path (no absolute paths or `..`). It runs directly, with the checkout root as its working
|
|
240
|
+
directory, only when the base checkout has just been cloned. It does not run for an
|
|
241
|
+
existing checkout or in the task worktree. Use `checkout = "main"` when the agent must run
|
|
242
|
+
where setup wrote files. A nonzero setup exit prevents the agent from starting; the newly
|
|
243
|
+
cloned checkout is removed, while an existing checkout is preserved. `validate` checks the
|
|
244
|
+
path syntax but does not require the script to exist. `run --dry-run` does not fetch, clone,
|
|
245
|
+
create a worktree, or run setup.
|
|
246
|
+
|
|
247
|
+
Each cron automation coalesces overdue ticks into a single pending occurrence; the same
|
|
248
|
+
automation never runs concurrently with itself. `schedule` is a five-field cron
|
|
249
|
+
expression, `timezone` is IANA (defaulting to `agents.defaults.timezone`), and
|
|
250
|
+
`start_date`/`end_date` form an optional inclusive window interpreted in that timezone.
|
|
251
|
+
Without `start_date`, the window starts when the automation is first recorded.
|
|
252
|
+
|
|
253
|
+
### OpenTelemetry
|
|
254
|
+
|
|
255
|
+
Set `settings.otlp_endpoint` to an OTLP/HTTP trace endpoint (for example,
|
|
256
|
+
`http://localhost:4318/v1/traces`) to export one span for each dispatched issue, pull
|
|
257
|
+
request, or cron occurrence. Each span includes the repository, type, identifier, and
|
|
258
|
+
result (success or failure); failures also include `error.message`. The endpoint must
|
|
259
|
+
accept OTLP over HTTP/protobuf. If the field is omitted, no telemetry is exported.
|
|
260
|
+
|
|
261
|
+
### State files
|
|
262
|
+
|
|
263
|
+
Running sessions and cron schedule state live in `state_db_path` (default
|
|
264
|
+
`~/.curupira/state.sqlite3`). The per-user dispatch lock is stored in
|
|
265
|
+
`~/.curupira/dispatch.lock`, and the dedicated log directory is
|
|
266
|
+
`~/.curupira/logs`. Only one `run` or `tui` process can dispatch at a time; a second
|
|
267
|
+
process exits with an error rather than running tasks in parallel. Session records are
|
|
268
|
+
removed when the agent process ends; `run` and `run --watch` resume saved sessions after
|
|
269
|
+
a restart. If the file exists but is not a compatible database, the application exits with
|
|
270
|
+
an error instead of deleting it — delete or move the file yourself to start fresh.
|
|
271
|
+
|
|
272
|
+
### Log file
|
|
273
|
+
|
|
274
|
+
The `run` and `run --watch` commands append records to
|
|
275
|
+
`~/.curupira/logs/curupira.log`; restarting the process does not erase existing
|
|
276
|
+
content. Each task records its start and completion time, repository, type, and
|
|
277
|
+
identifier. If a task fails, the record includes the error. Set
|
|
278
|
+
`[settings].log_level` (or pass `--log-level`) to `DEBUG` for more internal detail.
|
|
279
|
+
Uncaught crashes write separate reports under `~/.curupira/logs/crashes/`.
|
|
280
|
+
|
|
281
|
+
## Usage
|
|
282
|
+
|
|
283
|
+
Validate configuration without calling external CLIs or writing state:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
curupira validate
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Drain currently available tasks through the shared scheduler:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
curupira run
|
|
293
|
+
curupira run --size 5
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Preview one selected task without reserving, persisting, cloning, or executing:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
curupira run --dry-run
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Poll all automations with the shared bounded scheduler until interrupted:
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
curupira run --watch
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Run the same continuous scheduler inside an interactive Textual dashboard:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
curupira tui
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The short alias `curu` accepts the same subcommands (`curu validate`, `curu run`,
|
|
315
|
+
`curu run --watch`, `curu tui`).
|
|
316
|
+
|
|
317
|
+
`validate` exits `0` when the configuration is valid and `2` on configuration errors.
|
|
318
|
+
`run`, `run --watch`, and `tui` exit `1` when any executed task failed, otherwise `0`.
|
|
319
|
+
`run --dry-run` never reserves or persists cron occurrences and does not perform checkout,
|
|
320
|
+
worktree, or setup operations.
|
|
321
|
+
|
|
322
|
+
`run --watch` runs every CLI non-interactively so concurrent workers never contend for the
|
|
323
|
+
terminal UI. `tui` is the interactive alternative. Editing the configuration file while
|
|
324
|
+
either is running hot-reloads settings after in-flight tasks finish. Transient `gh`
|
|
325
|
+
failures are retried with backoff; authentication, configuration, output-format, and
|
|
326
|
+
agent-task failures are not retried automatically.
|
|
327
|
+
|
|
328
|
+
## Public interface
|
|
329
|
+
|
|
330
|
+
Curupira is CLI-first. The only supported programmatic surface is
|
|
331
|
+
`curupira.__version__`; all other modules are internal implementation details that
|
|
332
|
+
may change without notice.
|
|
333
|
+
|
|
334
|
+
## Development and validation
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
uv sync --dev
|
|
338
|
+
uv run --no-sync prek install
|
|
339
|
+
uv run --no-sync pytest
|
|
340
|
+
uv run --no-sync ruff check .
|
|
341
|
+
uv run --no-sync ruff format --check .
|
|
342
|
+
uv run --no-sync pyrefly check
|
|
343
|
+
uv build
|
|
344
|
+
uv run --no-sync twine check dist/*
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
`uv sync` installs the pure-Python package. `uv run --no-sync prek install` registers
|
|
348
|
+
Git pre-commit hooks; Ruff and Pyrefly run through `uv` so they use the locked project
|
|
349
|
+
environment. `uv build` produces a `py3-none-any` wheel and sdist with no compiler
|
|
350
|
+
toolchain required.
|
|
351
|
+
|
|
352
|
+
To inspect branch coverage locally, run `uv run --no-sync pytest --cov --cov-report=term-missing`;
|
|
353
|
+
the configured minimum is 85%.
|
|
354
|
+
|
|
355
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for environment setup and the exact verification
|
|
356
|
+
commands, and [CHANGELOG.md](CHANGELOG.md) for release notes.
|
|
357
|
+
|
|
358
|
+
## License
|
|
359
|
+
|
|
360
|
+
MIT — see [LICENSE](LICENSE).
|
|
361
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
curupira/__init__.py,sha256=ZTINK9tGJNK3FjsOQ3QSEuMLtjux89psYTv-tjYA6G0,366
|
|
2
|
+
curupira/__main__.py,sha256=FR38ts89RZ8gGq2GnhjJut-SUJspT5mtQwk7KriZ1YM,553
|
|
3
|
+
curupira-0.3.0.dev0.data/scripts/curu.exe,sha256=_xH5hVvURr-kfc7OspKVIaXlEBDqCs-MdIBzALLRjUo,5785088
|
|
4
|
+
curupira-0.3.0.dev0.data/scripts/curupira.exe,sha256=1fv5SpxM6ucH9QkPWjaPZZWXaJPFzESBL80Aabplgtc,5785088
|
|
5
|
+
curupira-0.3.0.dev0.dist-info/METADATA,sha256=NBV_pCh4Xkh2SlAaCQa8vi_tclF6PF14x07HzKmCSR4,16548
|
|
6
|
+
curupira-0.3.0.dev0.dist-info/WHEEL,sha256=8Aej0W0a6Cz6apA3IzJrTnxLRVLAt-w0Oh8SA3Con_c,94
|
|
7
|
+
curupira-0.3.0.dev0.dist-info/sboms/curupira.cyclonedx.json,sha256=WZGzcIDwDDAGUIJFYUwXjHcd0tZ0XBstGn0_2PYp5O8,227294
|
|
8
|
+
curupira-0.3.0.dev0.dist-info/RECORD,,
|