odx-cli 0.0.4__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.
|
Binary file
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: odx-cli
|
|
3
|
+
Version: 0.0.4
|
|
4
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
5
|
+
Classifier: Environment :: Console
|
|
6
|
+
Classifier: Framework :: Odoo
|
|
7
|
+
Classifier: Intended Audience :: Developers
|
|
8
|
+
Classifier: Programming Language :: Rust
|
|
9
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Summary: Rust-native workspace manager for Odoo projects
|
|
12
|
+
Keywords: odoo,oca,git,workspace,cli
|
|
13
|
+
Home-Page: https://github.com/getfluvo/odx
|
|
14
|
+
Author: Strategic Efficiency B.V.
|
|
15
|
+
License-Expression: MIT
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
18
|
+
Project-URL: Documentation, https://odx.readthedocs.io/
|
|
19
|
+
Project-URL: Homepage, https://github.com/getfluvo/odx
|
|
20
|
+
Project-URL: Issues, https://github.com/getfluvo/odx/issues
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<img src="https://raw.githubusercontent.com/getfluvo/odx/main/docs/_static/logo.svg" alt="odx logo" width="160">
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<h1 align="center">odx</h1>
|
|
27
|
+
|
|
28
|
+
<p align="center">
|
|
29
|
+
<a href="https://pypi.org/project/odx-cli/"><img src="https://img.shields.io/pypi/v/odx-cli?style=flat-square&logo=pypi&logoColor=white&label=PyPI&color=ef662f" alt="PyPI"></a>
|
|
30
|
+
<a href="https://crates.io/crates/odx-cli"><img src="https://img.shields.io/crates/v/odx-cli?style=flat-square&logo=rust&logoColor=white&label=crates.io&color=ef662f" alt="crates.io"></a>
|
|
31
|
+
<a href="https://github.com/getfluvo/odx/actions/workflows/tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/getfluvo/odx/tests.yml?branch=main&style=flat-square&logo=githubactions&logoColor=white&label=tests" alt="Tests"></a>
|
|
32
|
+
<a href="https://odx.readthedocs.io/"><img src="https://img.shields.io/readthedocs/odx?style=flat-square&logo=readthedocs&logoColor=white&label=docs" alt="Documentation"></a>
|
|
33
|
+
<a href="https://github.com/getfluvo/odx/blob/main/LICENSE"><img src="https://img.shields.io/github/license/getfluvo/odx?style=flat-square&color=7e5a8c" alt="License: MIT"></a>
|
|
34
|
+
</p>
|
|
35
|
+
|
|
36
|
+
<!-- start-docs -->
|
|
37
|
+
|
|
38
|
+
**Odoo Developer eXtension**: a Rust CLI for managing Odoo projects from a
|
|
39
|
+
single `[tool.odx]` table in `pyproject.toml`. The command is `odx`; the
|
|
40
|
+
package is `odx-cli`.
|
|
41
|
+
|
|
42
|
+
odx aggregates unmerged pull requests on top of upstream Odoo and OCA
|
|
43
|
+
repositories, pins the result in a lockfile, vaults the pinned commits on a
|
|
44
|
+
private mirror so they cannot disappear, refuses to follow PR heads whose CI
|
|
45
|
+
is red, prepares a local development workspace, promotes exactly tested pins
|
|
46
|
+
between environments, and analyzes the project (migration scripts, dependency
|
|
47
|
+
drift, upstream merge status, portable fixes on other series, upgrade
|
|
48
|
+
readiness). The same engine is available as a drop-in replacement for
|
|
49
|
+
git-aggregator's `gitaggregate`: `odx git-aggregate`, or the standalone
|
|
50
|
+
`git-aggregate-rs` package.
|
|
51
|
+
|
|
52
|
+
> Status: pre-alpha. Working today: the `[tool.odx]` configuration,
|
|
53
|
+
> `odx import`/`export`/`add`/`drop`, `odx aggregate`, `odx lock` (with the vault and the
|
|
54
|
+
> force-push guard rail), `odx verify`, `odx vendor`, `odx build`, `odx sniff`, `odx stats`,
|
|
55
|
+
> `odx dev`, `odx sync`/`daemon`/`cache`, `odx doctor`, `odx auth`, `odx status`,
|
|
56
|
+
> `odx upgrade`, `odx check-deps`, `odx suggest`, `odx verdict`, `odx dashboard`,
|
|
57
|
+
> `odx port` and `odx migrate`, and the gitaggregate drop-in (`odx git-aggregate`,
|
|
58
|
+
> `git-aggregate-rs`). Every command not yet implemented (`promote`, `env`, `bot`,
|
|
59
|
+
> `lint`) names the roadmap phase in which it lands.
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
- **Aggregate**: parallel fetch of PRs, commits and branches into a shared
|
|
64
|
+
object cache; sequential merges per repository with clean abort on conflict;
|
|
65
|
+
optional syntax-aware merging through [mergiraf](https://mergiraf.org).
|
|
66
|
+
- **Lock and vault**: `odx.lock` pins every merged commit with its SHA, tree id
|
|
67
|
+
and patch-id; commits are pushed to content-addressed refs on a private
|
|
68
|
+
mirror (Forgejo, Gitea, GitLab) so a force-pushed PR cannot break a rebuild.
|
|
69
|
+
- **Force-push guard rail**: when a tracked PR head changes, odx checks the
|
|
70
|
+
new head's CI; red heads are not adopted, the vaulted pin is kept and
|
|
71
|
+
flagged, and dropping a PR is always a human decision.
|
|
72
|
+
- **Packages**: addons consumed through `uv` VCS sources are vaulted the same
|
|
73
|
+
way and written to `[tool.uv.sources]` (replaces uvault), with a one-command
|
|
74
|
+
switch to a local editable clone.
|
|
75
|
+
- **Dev workspace**: generates the Odoo `addons_path` (and rewrites
|
|
76
|
+
`odoo.conf`) and runs PEP 660 editable installs through `uv`.
|
|
77
|
+
- **Verify**: one command for CI and pre-commit that proves a checkout matches
|
|
78
|
+
`odx.lock` and `uv.lock`.
|
|
79
|
+
- **Sniff**: lists database migration scripts introduced by aggregated PRs
|
|
80
|
+
before they reach production.
|
|
81
|
+
- **Check-deps**: compares `__manifest__.py` dependencies with
|
|
82
|
+
`pyproject.toml`; reports missing addons, the same addon from two sources,
|
|
83
|
+
and license conflicts.
|
|
84
|
+
- **Status / track**: aggregated PRs that were merged upstream, PRs with new
|
|
85
|
+
commits, orphaned pins, red upstream heads, local modifications on vendored
|
|
86
|
+
modules.
|
|
87
|
+
- **Suggest**: a dashboard of PRs and commits on other Odoo series that touch
|
|
88
|
+
the modules you use, with mutes (reason and expiry) committed to the repo.
|
|
89
|
+
- **Upgrade**: module availability on the index and the forge for the next
|
|
90
|
+
Odoo series, plus code readiness from odoo-lint.
|
|
91
|
+
- **Port**: ports a PR or an addon's missing commits onto another series from
|
|
92
|
+
the local cache, with a maintainer sweep over a whole repository,
|
|
93
|
+
patch-id deduplication, oca-port-compatible blacklists, authorship
|
|
94
|
+
preserved, odoo-lint's upgrade fixes applied, and PRs opened on GitHub,
|
|
95
|
+
GitLab, Gitea or Forgejo; addons that moved repositories between series
|
|
96
|
+
are followed through a cross-series addon index.
|
|
97
|
+
- **Platform profiles**: `generic-wheels`, `vendored-source`, `odoo-sh` and
|
|
98
|
+
`custom` define how artefacts are delivered and verified; odx prepares
|
|
99
|
+
and verifies, the platform deploys. Provided-package sets per platform and
|
|
100
|
+
series keep requirements that the platform already ships out of the
|
|
101
|
+
generated requirements file.
|
|
102
|
+
- **Build**: builds aggregated, unmerged and private addons as wheels with
|
|
103
|
+
content-derived versions (`+odx.<shortsha>`) and publishes them to the
|
|
104
|
+
private index, so wheel-capable platforms install hashes instead of
|
|
105
|
+
copying source.
|
|
106
|
+
- **Vendor**: materializes the locked packages of each dependency group into
|
|
107
|
+
deployable addon directories for source-based platforms, with the
|
|
108
|
+
manifest version-bump rule, a content-hash manifest and the platform
|
|
109
|
+
requirements file.
|
|
110
|
+
- **Verdicts**: a declined forward-port ("not needed on 19.0") is recorded
|
|
111
|
+
once, keyed by patch-id, addon and target series, shared privately across
|
|
112
|
+
every environment and every project of the organisation, and re-checked
|
|
113
|
+
when the target code changes; project-level mutes stay with the project.
|
|
114
|
+
- **Promote**: copies the exact pins of modules, a feature set or a
|
|
115
|
+
functional description (`--search "invoicing"`) along a configurable
|
|
116
|
+
promotion graph between environments (presets for common branch layouts
|
|
117
|
+
and Odoo.sh), always plan first, detects divergence, optionally carries
|
|
118
|
+
the project's own commits, and supports rollback; `odx env diff` shows
|
|
119
|
+
what differs. Scripts and AI coding agents drive it through `--json` and
|
|
120
|
+
`--yes`.
|
|
121
|
+
- **Dashboard**: one view of everything beyond Dependabot: pinned PRs and
|
|
122
|
+
droppable overrides, new upstream PRs touching deployed modules,
|
|
123
|
+
forward-port suggestions (fixes merged on a lower series and missing on
|
|
124
|
+
yours), translation-only bumps and promotion drift, in the terminal, as a
|
|
125
|
+
TUI, as JSON or as Markdown, each entry with actions: include in the
|
|
126
|
+
project, open a forward-port PR upstream (human-triggered only), or mute
|
|
127
|
+
with a reason.
|
|
128
|
+
- **Bot**: a nightly job posts the same dashboard as one rolling issue per
|
|
129
|
+
series with checkboxes, and opens grouped PRs for merged overrides, green
|
|
130
|
+
re-pins, translation-only bumps and promotions, on GitHub Actions and
|
|
131
|
+
Forgejo Actions, inside the private project repository only.
|
|
132
|
+
- **Background sync**: an opt-in user-level scheduled job prefetches
|
|
133
|
+
repositories, PR refs, index metadata and wheels into the shared cache
|
|
134
|
+
within the API budget, mirror first, so `aggregate`, `status`, `dashboard`
|
|
135
|
+
and `port` answer from the cache immediately, show data staleness, refresh
|
|
136
|
+
only what is stale, and keep working offline.
|
|
137
|
+
- **Lint**: [odoo-lint](https://github.com/bosd/odoo-lint) embedded with
|
|
138
|
+
project context.
|
|
139
|
+
- **Stats**: lines of code per language via `tokei`.
|
|
140
|
+
- **Import**: converts git-aggregator `repos.yaml` and doodba `addons.yaml`
|
|
141
|
+
to `[tool.odx]`.
|
|
142
|
+
- **Auto-update**: translation-only wheel bumps are re-locked automatically
|
|
143
|
+
under a configurable policy with a wheel content check.
|
|
144
|
+
- **Polite to APIs**: tokens from the environment, `gh` or the keyring;
|
|
145
|
+
batched GraphQL, ETag caching, per-host rate limiting, `--offline`.
|
|
146
|
+
|
|
147
|
+
## Example configuration
|
|
148
|
+
|
|
149
|
+
```toml
|
|
150
|
+
[tool.odx]
|
|
151
|
+
odoo_version = "17.0"
|
|
152
|
+
merge_strategy = "rebase" # or "merge" for merge commits
|
|
153
|
+
mergiraf = "auto"
|
|
154
|
+
on_head_change = "follow-if-green"
|
|
155
|
+
|
|
156
|
+
[tool.odx.mirror]
|
|
157
|
+
url = "ssh://git@forgejo.internal/odoo/vault.git" # private
|
|
158
|
+
|
|
159
|
+
[[tool.odx.repositories]]
|
|
160
|
+
url = "https://github.com/OCA/pos.git"
|
|
161
|
+
target_dir = "vendor/pos"
|
|
162
|
+
addons = ["pos_discount", "pos_loyalty*"]
|
|
163
|
+
merges = [
|
|
164
|
+
{ pr = 123, track_upstream = true },
|
|
165
|
+
{ sha = "a1b2c3d4e5f67890123456789012345678901234" },
|
|
166
|
+
]
|
|
167
|
+
|
|
168
|
+
[tool.odx.packages]
|
|
169
|
+
"odoo-addon-pos-vouchers" = { repo = "OCA/pos", pr = 45, subdirectory = "pos_vouchers" }
|
|
170
|
+
|
|
171
|
+
[tool.odx.features.pos-loyalty]
|
|
172
|
+
modules = ["pos_loyalty", "pos_loyalty_reports"]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Everything else in `pyproject.toml` (`[project]`, `[build-system]`, other
|
|
176
|
+
`[tool.*]` tables) is left alone.
|
|
177
|
+
|
|
178
|
+
## CLI
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
odx aggregate [--locked | --update | --fetch-only] [-c repos.yaml]
|
|
182
|
+
odx lock [--check] [--update] [--auto-update] [--no-push]
|
|
183
|
+
odx vendor [--requirements] | odx build [--publish --index private]
|
|
184
|
+
odx verify [--vendored | --installed .venv | --requirements | --deployed <dir>]
|
|
185
|
+
odx dev [<package> --branch <name>] [--restore]
|
|
186
|
+
odx add <url | owner/repo#pr> [--package <dist>] | odx drop <repo>#<pr>
|
|
187
|
+
odx import repos.yaml [addons.yaml] [--write] | odx export repos.yaml
|
|
188
|
+
odx dashboard [--format table|markdown|tui] [--checkboxes] | odx dashboard act <id> --include|--drop|--follow|--mute|--port
|
|
189
|
+
odx status [--fail-on-merged]
|
|
190
|
+
odx suggest [--env uat] [--check-apply] [--show-suppressed]
|
|
191
|
+
odx verdict add OCA/contract#1480 --addon contract --kind not-applicable --reason "..." | odx verdict upstream <id> --public-reason "..."
|
|
192
|
+
odx check-deps [--licenses] [--fix]
|
|
193
|
+
odx sniff | odx stats | odx upgrade --target 18.0
|
|
194
|
+
odx port pr OCA/sale-workflow#1234 --to 17.0 [--open-pr]
|
|
195
|
+
odx port addon sale_x --from 18.0 --to 19.0 | odx port blacklist sale_x OCA/x#12 --reason "..."
|
|
196
|
+
odx port sweep --to 19.0 --from 16.0,17.0,18.0 [--write-blacklist --open-pr]
|
|
197
|
+
odx migrate plan --to 19.0 | odx migrate addon sale_x --to 19.0 [--open-pr] | odx migrate own
|
|
198
|
+
odx migrate update [OCA/server-tools#3631] [--push] | odx migrate pin | odx migrate unpin [--push] [--merge]
|
|
199
|
+
odx lint [--only-changed] [--fix] [--output-format github]
|
|
200
|
+
odx sync [--all] | odx daemon install --interval 30m | odx cache gc
|
|
201
|
+
odx doctor | odx auth login <host> | odx completions <shell>
|
|
202
|
+
|
|
203
|
+
# planned
|
|
204
|
+
odx promote <module>... | --feature pos-loyalty | --search "invoicing" --to prod [--open-pr] [--yes --json]
|
|
205
|
+
odx env diff test prod
|
|
206
|
+
odx bot run --apply
|
|
207
|
+
|
|
208
|
+
odx git-aggregate -c repos.yaml -j 4 # gitaggregate drop-in
|
|
209
|
+
git-aggregate-rs -c repos.yaml -j 4 # same, standalone package
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Every command supports `--json`.
|
|
213
|
+
|
|
214
|
+
## Installation (planned)
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
uv tool install odx-cli # binary wheel from PyPI, no Rust toolchain needed
|
|
218
|
+
cargo install odx-cli # from crates.io
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Static binaries will also be published on GitHub Releases.
|
|
222
|
+
|
|
223
|
+
## Quality
|
|
224
|
+
|
|
225
|
+
The codebase is held to a fixed set of gates enforced in CI behind one
|
|
226
|
+
required `all-checks` status on `main`: `rustfmt`, `clippy` with `pedantic`
|
|
227
|
+
and selected restriction lints as errors, `unsafe_code = "forbid"`,
|
|
228
|
+
`missing_docs = "deny"`, 100% line coverage with `cargo llvm-cov`, doc tests,
|
|
229
|
+
`cargo doc` and the Sphinx documentation with warnings denied, `cargo deny`,
|
|
230
|
+
`cargo machete`, an MSRV check, `typos` and Conventional Commits.
|
|
231
|
+
|
|
232
|
+
Rust edition 2024, MSRV 1.97, MIT license.
|
|
233
|
+
|
|
234
|
+
<!-- github-only -->
|
|
235
|
+
|
|
236
|
+
## Documentation
|
|
237
|
+
|
|
238
|
+
User documentation is published on [Read the Docs](https://odx.readthedocs.io/).
|
|
239
|
+
|
|
240
|
+
## Contributing
|
|
241
|
+
|
|
242
|
+
Contributions are welcome. Read [CONTRIBUTING.md](CONTRIBUTING.md) for the
|
|
243
|
+
development setup, the quality gates and the Contributor License Agreement.
|
|
244
|
+
This project follows the [Contributor Covenant](CODE_OF_CONDUCT.md).
|
|
245
|
+
|
|
246
|
+
## License
|
|
247
|
+
|
|
248
|
+
MIT. See [LICENSE](LICENSE).
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
Maintained by Strategic Efficiency B.V. under the
|
|
253
|
+
[getfluvo](https://github.com/getfluvo) organization.
|
|
254
|
+
|
|
255
|
+
Built with Rust & AI-accelerated engineering
|
|
256
|
+
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
odx_cli-0.0.4.data/scripts/odx.exe,sha256=0bkXrpydNMXR7xHW11D0QFqcuTzx5vYh9urfGWnRiQg,21802496
|
|
2
|
+
odx_cli-0.0.4.dist-info/METADATA,sha256=y7RfeVRn9nn0UOgFYzwLXtSYdhDeEtyTN0F3U9mlrHA,12754
|
|
3
|
+
odx_cli-0.0.4.dist-info/WHEEL,sha256=8Aej0W0a6Cz6apA3IzJrTnxLRVLAt-w0Oh8SA3Con_c,94
|
|
4
|
+
odx_cli-0.0.4.dist-info/licenses/LICENSE,sha256=jz1Axaa45Wz8dcPm9e6RJmL0uJTuGs5FnyNMVcaEU6E,1062
|
|
5
|
+
odx_cli-0.0.4.dist-info/sboms/odx-cli.cyclonedx.json,sha256=5fryvXoVjQOqXc4u_rVsTGaTxblwjCivYCCLIc__bpM,428616
|
|
6
|
+
odx_cli-0.0.4.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fluvo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|