Skip to content

Configuration

oops reads configuration from YAML files. Two locations are supported and merged in order — the local file takes precedence over the global one:

File Scope
~/.oops.yaml Global (user-wide defaults)
.oops.yaml Local (per-repository, overrides global)

Every file must declare a version key (currently only 1 is supported). Unknown keys emit a warning and are ignored.

Tip

Run any command without a config file to get a clear error listing every required field that is missing.

Minimal example

version: 1

images:
  source:
    repository: <organization>/<repository>
    file: versions.json

submodules:
  current_path: .third-party

Full reference

images

Controls Odoo image discovery and validation.

images:
  source:
    repository: <organization>/<repository>   # required — GitHub repository (owner/repo)
    file: versions.json                       # required — path to the versions file in the repo
  collections:
    - "19.0"
    - "18.0"
    - "17.0"
  release_warn_age_days: 30                   # warn if the current image is older than N days
  registries:
    recommended:
      - <name>
    deprecated:
      - <name>
    warn:
      - <name>
Key Type Default Description
source.repository str required GitHub owner/repo hosting the versions file
source.file str required Path to the JSON versions file inside the repo
collections list[str] [] Odoo version labels to consider (e.g. "18.0")
release_warn_age_days int 30 Warn when the active image is older than this many days
registries.recommended list[str] [] Registry prefixes considered up-to-date
registries.deprecated list[str] [] Registry prefixes that trigger a deprecation warning
registries.warn list[str] [] Registry prefixes that trigger a generic warning

submodules

Controls how git submodules are organised and validated.

submodules:
  current_path: .third-party
  old_paths:
    - third-party
  force_scheme: ssh
  deprecated_repositories:
    OCA/old-repo: OCA/new-repo
  checks:
    - check_path
    - check_branch
    - check_symlink
    - check_url_scheme
    - check_deprecated_repo
    - check_broken_symlink
Key Type Default Description
current_path path .third-party Expected submodule root directory
old_paths list[path] [third-party] Legacy paths that trigger a migration warning
force_scheme str ssh URL scheme enforced on all submodules (ssh or https)
deprecated_repositories dict {} Map of old-repo: new-repo redirects
checks list[str] (all) Checks to run with oops-sub-check (remove entries to skip)

Available checks: check_path, check_branch, check_symlink, check_url_scheme, check_deprecated_repo, check_broken_symlink, check_pr.


project

File-name conventions used by project-level commands.

project:
  mandatory_files:
    - requirements.txt
    - odoo_version.txt
    - packages.txt
  recommended_files:
    - README.md
    - CODEOWNERS
    - CHANGELOG.md
    - .gitignore
  file_packages: packages.txt
  file_requirements: requirements.txt
  file_odoo_version: odoo_version.txt
  file_migrate: migrate.sh
  pre_commit_exclude_file: .pre-commit-exclusions
Key Type Default Description
mandatory_files list[str] [requirements.txt, odoo_version.txt, packages.txt] Files whose absence is reported as an error by oops-pro-check
recommended_files list[str] [README.md, CODEOWNERS, CHANGELOG.md, .gitignore] Files whose absence is reported as a warning
file_packages str packages.txt APT packages file
file_requirements str requirements.txt Python requirements file
file_odoo_version str odoo_version.txt File containing the active Odoo version string
file_migrate str migrate.sh Migration script written by oops-addons-diff --save and oops-release-create
pre_commit_exclude_file str .pre-commit-exclusions Exclusion pattern file written by oops-pro-exclude

sync

Source repository for oops-pro-sync.

sync:
  remote_url: https://github.com/<organization>/<project-template>.git
  branch: main
  files:
    - .pre-commit-config.yaml
    - .github/workflows/ci.yml
Key Type Default Description
remote_url str null URL of the remote repository to sync from
branch str null Branch to check out in the remote
files list[str] [] Paths to copy from the remote into the local repo

manifest

Controls lint rules applied by oops-man-check and oops-man-fix to __manifest__.py files.

manifest:
  author: AAcmek                        # required — expected value for the 'author' field
  odoo_version: "19.0"                  # optional — enforces version prefix (e.g. 19.0.x.y.z)
  version_bump_strategy: trunk          # optional — version bump check strategy (default: off)
  allowed_maintainers:
    - alice
    - bob
  required_keys:
    - name
    - version
    - summary
    - website
    - author
    - maintainers
    - depends
    - data
    - license
    - auto_install
    - installable
  key_order:
    - name
    - summary
    - version
    - category
    - author
    - maintainers
    - website
    - depends
    - data
    - assets
    - demo
    - application
    - auto_install
    - installable
    - license
Key Type Default Description
author str required Expected value for the manifest author field; autofixed by oops-man-fix
odoo_version str null When set, enforces the version prefix (e.g. "19.0"19.0.x.y.z). Addons from another series are validated against the generic 5-part pattern
version_bump_strategy str off When to require a version bump on staged manifests: off (disabled), strict (every commit), trunk (once per release, relative to last tag)
allowed_maintainers list[str] [] GitHub handles accepted in the maintainers list; empty list disables the check
required_keys list[str] (see above) Keys that must be present in every manifest; reported individually if missing
key_order list[str] (see above) Canonical key order enforced by ManifestKeyOrder; also used as the allowed-key list by ManifestNoExtraKeys

version_bump_strategy

strict enforces a bump on every commit that touches an addon — suitable for granular per-commit changelogs. trunk only requires the version to exceed the last git tag — better for squash/rebase workflows where a single bump per release cycle is enough.