Skip to main content

odx logo

odx

PyPI crates.io Tests Documentation License: MIT

Odoo Developer eXtension: a Rust CLI for managing Odoo projects from a single [tool.odx] table in pyproject.toml. The command is odx; the package is odx-cli.

odx aggregates unmerged pull requests on top of upstream Odoo and OCA repositories, pins the result in a lockfile, vaults the pinned commits on a private mirror so they cannot disappear, refuses to follow PR heads whose CI is red, prepares a local development workspace, promotes exactly tested pins between environments, and analyzes the project (migration scripts, dependency drift, upstream merge status, portable fixes on other series, upgrade readiness). The same engine is available as a drop-in replacement for git-aggregator's gitaggregate: odx git-aggregate, or the standalone git-aggregate-rs package.

Status: pre-alpha. Working today: the [tool.odx] configuration, odx import/export/add/drop, odx aggregate, odx lock (with the vault and the force-push guard rail), odx verify, odx vendor, odx build, odx sniff, odx stats, odx dev, odx sync/daemon/cache, odx doctor, odx auth, odx status, odx upgrade, odx check-deps, odx suggest, odx verdict, odx dashboard, odx port and odx migrate, and the gitaggregate drop-in (odx git-aggregate, git-aggregate-rs). Every command not yet implemented (promote, env, bot, lint) names the roadmap phase in which it lands.

Features

  • Aggregate: parallel fetch of PRs, commits and branches into a shared object cache; sequential merges per repository with clean abort on conflict; optional syntax-aware merging through mergiraf.
  • Lock and vault: odx.lock pins every merged commit with its SHA, tree id and patch-id; commits are pushed to content-addressed refs on a private mirror (Forgejo, Gitea, GitLab) so a force-pushed PR cannot break a rebuild.
  • Force-push guard rail: when a tracked PR head changes, odx checks the new head's CI; red heads are not adopted, the vaulted pin is kept and flagged, and dropping a PR is always a human decision.
  • Packages: addons consumed through uv VCS sources are vaulted the same way and written to [tool.uv.sources] (replaces uvault), with a one-command switch to a local editable clone.
  • Dev workspace: generates the Odoo addons_path (and rewrites odoo.conf) and runs PEP 660 editable installs through uv.
  • Verify: one command for CI and pre-commit that proves a checkout matches odx.lock and uv.lock.
  • Sniff: lists database migration scripts introduced by aggregated PRs before they reach production.
  • Check-deps: compares __manifest__.py dependencies with pyproject.toml; reports missing addons, the same addon from two sources, and license conflicts.
  • Status / track: aggregated PRs that were merged upstream, PRs with new commits, orphaned pins, red upstream heads, local modifications on vendored modules.
  • Suggest: a dashboard of PRs and commits on other Odoo series that touch the modules you use, with mutes (reason and expiry) committed to the repo.
  • Upgrade: module availability on the index and the forge for the next Odoo series, plus code readiness from odoo-lint.
  • Port: ports a PR or an addon's missing commits onto another series from the local cache, with a maintainer sweep over a whole repository, patch-id deduplication, oca-port-compatible blacklists, authorship preserved, odoo-lint's upgrade fixes applied, and PRs opened on GitHub, GitLab, Gitea or Forgejo; addons that moved repositories between series are followed through a cross-series addon index.
  • Platform profiles: generic-wheels, vendored-source, odoo-sh and custom define how artefacts are delivered and verified; odx prepares and verifies, the platform deploys. Provided-package sets per platform and series keep requirements that the platform already ships out of the generated requirements file.
  • Build: builds aggregated, unmerged and private addons as wheels with content-derived versions (+odx.<shortsha>) and publishes them to the private index, so wheel-capable platforms install hashes instead of copying source.
  • Vendor: materializes the locked packages of each dependency group into deployable addon directories for source-based platforms, with the manifest version-bump rule, a content-hash manifest and the platform requirements file.
  • Verdicts: a declined forward-port ("not needed on 19.0") is recorded once, keyed by patch-id, addon and target series, shared privately across every environment and every project of the organisation, and re-checked when the target code changes; project-level mutes stay with the project.
  • Promote: copies the exact pins of modules, a feature set or a functional description (--search "invoicing") along a configurable promotion graph between environments (presets for common branch layouts and Odoo.sh), always plan first, detects divergence, optionally carries the project's own commits, and supports rollback; odx env diff shows what differs. Scripts and AI coding agents drive it through --json and --yes.
  • Dashboard: one view of everything beyond Dependabot: pinned PRs and droppable overrides, new upstream PRs touching deployed modules, forward-port suggestions (fixes merged on a lower series and missing on yours), translation-only bumps and promotion drift, in the terminal, as a TUI, as JSON or as Markdown, each entry with actions: include in the project, open a forward-port PR upstream (human-triggered only), or mute with a reason.
  • Bot: a nightly job posts the same dashboard as one rolling issue per series with checkboxes, and opens grouped PRs for merged overrides, green re-pins, translation-only bumps and promotions, on GitHub Actions and Forgejo Actions, inside the private project repository only.
  • Background sync: an opt-in user-level scheduled job prefetches repositories, PR refs, index metadata and wheels into the shared cache within the API budget, mirror first, so aggregate, status, dashboard and port answer from the cache immediately, show data staleness, refresh only what is stale, and keep working offline.
  • Lint: odoo-lint embedded with project context.
  • Stats: lines of code per language via tokei.
  • Import: converts git-aggregator repos.yaml and doodba addons.yaml to [tool.odx].
  • Auto-update: translation-only wheel bumps are re-locked automatically under a configurable policy with a wheel content check.
  • Polite to APIs: tokens from the environment, gh or the keyring; batched GraphQL, ETag caching, per-host rate limiting, --offline.

Example configuration

[tool.odx]
odoo_version = "17.0"
merge_strategy = "rebase"   # or "merge" for merge commits
mergiraf = "auto"
on_head_change = "follow-if-green"

[tool.odx.mirror]
url = "ssh://git@forgejo.internal/odoo/vault.git"   # private

[[tool.odx.repositories]]
url = "https://github.com/OCA/pos.git"
target_dir = "vendor/pos"
addons = ["pos_discount", "pos_loyalty*"]
merges = [
  { pr = 123, track_upstream = true },
  { sha = "a1b2c3d4e5f67890123456789012345678901234" },
]

[tool.odx.packages]
"odoo-addon-pos-vouchers" = { repo = "OCA/pos", pr = 45, subdirectory = "pos_vouchers" }

[tool.odx.features.pos-loyalty]
modules = ["pos_loyalty", "pos_loyalty_reports"]

Everything else in pyproject.toml ([project], [build-system], other [tool.*] tables) is left alone.

CLI

odx aggregate [--locked | --update | --fetch-only] [-c repos.yaml]
odx lock [--check] [--update] [--auto-update] [--no-push]
odx vendor [--requirements] | odx build [--publish --index private]
odx verify [--vendored | --installed .venv | --requirements | --deployed <dir>]
odx dev [<package> --branch <name>] [--restore]
odx add <url | owner/repo#pr> [--package <dist>] | odx drop <repo>#<pr>
odx import repos.yaml [addons.yaml] [--write] | odx export repos.yaml
odx dashboard [--format table|markdown|tui] [--checkboxes] | odx dashboard act <id> --include|--drop|--follow|--mute|--port
odx status [--fail-on-merged]
odx suggest [--env uat] [--check-apply] [--show-suppressed]
odx verdict add OCA/contract#1480 --addon contract --kind not-applicable --reason "..." | odx verdict upstream <id> --public-reason "..."
odx check-deps [--licenses] [--fix]
odx sniff | odx stats | odx upgrade --target 18.0
odx port pr OCA/sale-workflow#1234 --to 17.0 [--open-pr]
odx port addon sale_x --from 18.0 --to 19.0 | odx port blacklist sale_x OCA/x#12 --reason "..."
odx port sweep --to 19.0 --from 16.0,17.0,18.0 [--write-blacklist --open-pr]
odx migrate plan --to 19.0 | odx migrate addon sale_x --to 19.0 [--open-pr] | odx migrate own
odx migrate update [OCA/server-tools#3631] [--push] | odx migrate pin | odx migrate unpin [--push] [--merge]
odx lint [--only-changed] [--fix] [--output-format github]
odx sync [--all] | odx daemon install --interval 30m | odx cache gc
odx doctor | odx auth login <host> | odx completions <shell>

# planned
odx promote <module>... | --feature pos-loyalty | --search "invoicing" --to prod [--open-pr] [--yes --json]
odx env diff test prod
odx bot run --apply

odx git-aggregate -c repos.yaml -j 4     # gitaggregate drop-in
git-aggregate-rs -c repos.yaml -j 4      # same, standalone package

Every command supports --json.

Installation (planned)

uv tool install odx-cli      # binary wheel from PyPI, no Rust toolchain needed
cargo install odx-cli        # from crates.io

Static binaries will also be published on GitHub Releases.

Quality

The codebase is held to a fixed set of gates enforced in CI behind one required all-checks status on main: rustfmt, clippy with pedantic and selected restriction lints as errors, unsafe_code = "forbid", missing_docs = "deny", 100% line coverage with cargo llvm-cov, doc tests, cargo doc and the Sphinx documentation with warnings denied, cargo deny, cargo machete, an MSRV check, typos and Conventional Commits.

Rust edition 2024, MSRV 1.97, MIT license.

Documentation

User documentation is published on Read the Docs.

Contributing

Contributions are welcome. Read CONTRIBUTING.md for the development setup, the quality gates and the Contributor License Agreement. This project follows the Contributor Covenant.

License

MIT. See LICENSE.


Maintained by Strategic Efficiency B.V. under the getfluvo organization.

Built with Rust & AI-accelerated engineering

Metadata

Release files for odx-cli 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for odx-cli 0.0.4
File Size Uploaded Provenance
odx_cli-0.0.4.tar.gz 657.8 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for odx-cli 0.0.4
File
odx_cli-0.0.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
odx_cli-0.0.4-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
odx_cli-0.0.4-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
odx_cli-0.0.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
odx_cli-0.0.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
odx_cli-0.0.4-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
odx_cli-0.0.4-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 62.6 MB

Release files / odx_cli-0.0.4.tar.gz

Download URL odx_cli-0.0.4.tar.gz
Size 657.8 kB
Tags Source
SHA-256 checksum
How to use checksums
553c4aba9cca201f2651e542ad7e0b19b1a6df448971e311b45041b05c7224a7
BLAKE2b-256 checksum
How to use checksums
d861af399418367bc7c8cb2971d5754da0d8a701a905ab2ddeb20f22ea207719
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-win_amd64.whl

Download URL odx_cli-0.0.4-py3-none-win_amd64.whl
Size 9.0 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
32cab80821ab4d73c7b4cb03150ebf90266ed6a1b46f642a5bc441893b752580
BLAKE2b-256 checksum
How to use checksums
45af9aebdf55655143d554d3bfcb769df4af2b57ec4474f913d88dc33a2839fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-musllinux_1_2_x86_64.whl

Download URL odx_cli-0.0.4-py3-none-musllinux_1_2_x86_64.whl
Size 9.6 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
412819e973b993706982ff7ff27400ed840208942e01de5679db22dc3f2e3298
BLAKE2b-256 checksum
How to use checksums
5e3653cc8d567749aee4da95d72b044bf153b309b6498f420afe414c7b54b2eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-musllinux_1_2_aarch64.whl

Download URL odx_cli-0.0.4-py3-none-musllinux_1_2_aarch64.whl
Size 8.9 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
1643c046487968e4cc1b4a6734520b734d6bf130a53161949d602b0dec6902f8
BLAKE2b-256 checksum
How to use checksums
dc5822d9f5ab9c295699f4aa56deca0a12e9f06008826a6251928d7e221d5ffa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL odx_cli-0.0.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 9.5 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
0cc304ec467bcef6ebb7e5bed7f179dad299e25544905a4f26aeb25c3b11db5c
BLAKE2b-256 checksum
How to use checksums
8bc121e2497b398d8ba3ffb13553ef49982316b68bcae62b3b56c941b0cac919
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL odx_cli-0.0.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 8.9 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
e15227ace7179d9732121fc3acd82b988bc677ac17b13d771f0988e7e20a593f
BLAKE2b-256 checksum
How to use checksums
143d98d8c9e94bc67aec43d3962b4427888c22d53b41d52a2b5d44eab45e0a57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-macosx_11_0_arm64.whl

Download URL odx_cli-0.0.4-py3-none-macosx_11_0_arm64.whl
Size 7.8 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ca3a6fcb195d33814126a4afce231212231bad23af95335acb533ac0068113b0
BLAKE2b-256 checksum
How to use checksums
97d89a629e1d34bdaed781b288acd2b0150014a45b5bc466471b1ac86dc7d919
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / odx_cli-0.0.4-py3-none-macosx_10_12_x86_64.whl

Download URL odx_cli-0.0.4-py3-none-macosx_10_12_x86_64.whl
Size 8.3 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
57bdd8052be6e6b592d5e381fb7544a4982412a45feae8df7ff9f5d98759c738
BLAKE2b-256 checksum
How to use checksums
b30ecd39170273f7299fb290f7fdfba6c98d8de7b853965f0a8b570f7136e372
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Security for odx-cli 0.0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 8 files in this release have been uploaded with provenance metadata.

Select from 8 files

Attestation for odx_cli-0.0.4.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page