Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.15.1] - 2026-05-13¶
Fixed¶
oops readme update: addons are now listed alphabetically in the generated table
[0.15.0] - 2026-05-11¶
Changed¶
oops requirements check/oops requirements update: import names are now normalized to pip package names before comparison (e.g.dateutil→python-dateutil,PIL→Pillow)oops requirements update: duplicate entries are removed from the generatedrequirements.txtoops requirements: version constraints from multiple addons are merged intelligently — highest floor wins, lowest ceil wins, conflicting==pins are flagged for human arbitration; output is alphabetically sortedoops requirements check: no longer crashes whenrequirements.txtdoes not yet exist (treated as empty)
[0.14.0] - 2026-05-11¶
Added¶
oops misc build-kb(experimental): build the global Odoo KB once per Odoo version, stored at~/.cache/oops/kb/<version>.db.oops addons refactor(experimental): apply canonical section headers and Google-style docstring skeletons to custom module files, with automatic project KB rebuild when stale.oops addons analyze(experimental): print a structured text or JSON summary of an Odoo module via the project KB.oops addons refactor --refresh: force a project KB rebuild before running, even if the KB looks fresh.installed_modules.txtrepo convention (one module per line, optional# generated_at:header). Required when the project KB is missing or stale.- Automatic project KB rebuild on
oops addons refactorwhen the KB is stale (older thaninstalled_modules.txtor older than the global KB).
Documentation¶
- Reorganized documentation layout
[0.13.0] - 2026-05-04¶
Added¶
oops project init: add default admin password
Fixed¶
- Update
oopssubmodule reference
[0.12.3] - 2026-04-27¶
Fixed¶
oops addons: migration command is now only printed when the manifest is actually saved
[0.12.2] - 2026-04-27¶
Fixed¶
release-prepskill: changelog section headers now correctly preserve thevprefix in version numbers
Documentation¶
- Package version in the documentation index is now injected automatically via a MkDocs hook
[0.12.1] - 2026-04-23¶
Fixed¶
oops submodules add: corrected staged file paths when adding a new submodule
[0.12.0] - 2026-04-16¶
Added¶
oops requirements check: new--no-failflag to exit 0 even when changes are detected
Changed¶
oops project exclude: renamed--hookto--failfor consistency
Fixed¶
oops project init: corrected Docker Compose volume mount path from./configto./.config
[0.11.0] - 2026-04-16¶
Added¶
oops misc create-workspace,oops project init: new--include-sourcesflag to include the Odoo source directories as workspace folders (useful for navigation and go-to-definition)
Changed¶
oops submodules add: branch is now a required positional argument (before the URL); added-y/--yesto skip the confirmation prompt, automatic URL scheme normalisation fromsubmodules.force_scheme, and pre-flight check for stale.git/modulesdirectoriesoops submodules add: symlink creation extracted to a reusablecreate_symlinkhelper inio/file.py- CLI documentation and entry points renamed from
oops-group-cmdhyphenated format tooops group cmdsubcommand format; shortcut binaries (oops-check-manifest,oops-fix-manifest, etc.) updated accordingly
Fixed¶
oops odoo show: removed the--base-diroption; the sources directory is now always resolved fromodoo.sources_dirin config
[0.10.0] - 2026-04-14¶
Added¶
oops-req-check: new pre-commit hook (check-requirements) to validate Python requirements- Usage tracking: each command invocation is appended as a JSON event to
~/.local/share/oops/stats.jsonl; events are flushed to a configured endpoint every 7 days (opt-in viastats.enabledin.oops.yaml) oops-misc-usage: display per-command invocation counters from the local stats file, sorted by most used, with oldest entry date
[0.9.0] - 2026-04-14¶
Added¶
oops-misc-create-workspace: new--without-downloadflag to skip automatic Odoo source download when sources are missing
Changed¶
oops-misc-create-workspace: automatically invokesoops-odoo-downloadto fetch missing Odoo sources before generating the workspace file; use--without-downloadto opt outoops-misc-create-workspace: workspace Python analysis paths now reflect the project edition (community-only vs enterprise)oops-misc-create-workspace,oops-odoo-download,oops-odoo-update: removed--base-diroption; source directory is now always resolved fromodoo.sources_dirviaget_odoo_sources_dirsoops-addons-download: replaced GitHub API ZIP download with SSHgit clone(depth=1, no token required)oops-addons-download: gitignore entries now managed with afile_updatertagged block (# oops:addons:start/# oops:addons:end), accumulating entries across runs
Fixed¶
oops-addons-download:update_gitignoresilently corrupted.gitignoreby writing a comma-joined string instead of line-by-line entries
[0.8.0] - 2026-04-13¶
Added¶
oops --version: display the installed package versionoops-sub-remove: remove a submodule via an indexed interactive menuoops-misc-new-project: create a new GitHub repository from a template, clone locally, and trigger the update workflowoops-misc-edit-config: open the global or local.oops.yamlin the default editoroops-pro-exclude:--hookflag raises an error when the exclusion list was updated, prompting pre-commit to re-runoops-man-check: accepts addon names, manifest file paths, or addon directories — unified CLI and pre-commit entry point;--namesoption and separateoops-man-precommitentry point removed
Changed¶
oops-pro-check: output now usesprint_warning/print_error/print_successhelpers instead of a table
Fixed¶
oops-sub-check: fixed false positive on PR submodule placement check
Documentation¶
- Hooks page updated with remote repo config and corrected
pass_filenamesexamples - Command reference: fixed stale
--namesexample foroops-man-checkand added--hookexample foroops-pro-exclude
[0.7.0] - 2026-04-10¶
Added¶
oops-pro-init: scaffold a Docker Compose stack andodoo.conffor a new project; supports optional maildev and SFTP services (--with-maildev,--with-sftp), port override (--port), and dev-mode toggle (--no-dev)oops-pro-sync:--branch/-band--files/-FCLI overrides to target a specific remote branch or a custom file list at runtime
Changed¶
io/file.py:file_updaternow accepts and propagates adry_runparameter; callers no longer need manual if/else branchingio/file.py: extractedget_excluded_addon_namesandget_filtered_addon_nameshelpers (with docstrings and unit tests) fromexclude.py
Fixed¶
oops-pro-exclude: content formatting crashed when the addon list was non-iterable (e.g. a generator); added explicit list conversionoops-pro-exclude: overhauled installable filtering, per-lineaddon/|format, and ensured changes are always committedoops-pro-show: packages and requirements rows removed from the display (they duplicated data shown elsewhere)- CLI commands: switched to the shared
@commanddecorator for consistent repo resolution and error handling
[0.6.2] - 2026-04-10¶
Documentation¶
- Command pages: each group now shows its module docstring as an intro blurb (via mkdocstrings)
- Command entries sorted alphabetically within all command pages
[0.6.1] - 2026-04-10¶
Changed¶
- Package source tree moved to
src/layout
Fixed¶
- Coverage
omitpattern foroops/commands/*no longer matched after thesrc/move — restored with a wildcard prefix file_updaterdocstring:append_positiondescription was a run-on sentence; rewritten with clear per-value explanations
Documentation¶
docs/commands/misc.md: corrected module path foroops-misc-create-workspaceand added missingoops-misc-view-docentry
[0.6.0] - 2026-04-09¶
Added¶
oops-sub-init: initialize and update all submodules recursively with configurable parallel jobs (-j/--jobs, default: 4)oops-pro-exclude: generate the pre-commit exclusion list for third-party addonsoops-req-check: comparerequirements.txtagainst addon manifest dependencies and exit non-zero on differencesoops-req-update: updaterequirements.txtfrom addon manifestexternal_dependenciesoops-readme-update: generate the addon table in README.md with version, maintainer avatars, and summary
Fixed¶
oops-sub-fix,oops-sub-check: URL scheme detection always triggered becauseparse_repository_urlreturns a canonical URL string, not the scheme — switched to_parse_urloops-sub-fix: removed dead deprecated-repo replacement code; added--dry-run; replacedclick.Abort()withUsageError; added completion messagesoops-pro-exclude: hardcoded.pre-commit-config.yamlpath ignored the configured valueoops-readme-update:--no-commitflag default was inverted, preventing commits in all cases
[0.5.0] - 2026-04-08¶
Added¶
oops-misc-view-doc: open the oops documentation site in the default browseroops-misc-create-workspace: generate a VSCode workspace file for the current Odoo project- CLI auto-discovers command groups at startup from the package structure
- CLI group descriptions sourced from
__init__.pymodule docstrings addons materialize: redesigned to include all addons by default, with--include/--excludefilters
Changed¶
parse_odoo_versionnow returns anImageInfoobjectnormalize_versionmoved toutils/helpers
Fixed¶
remove_and_addnow usesrepo.git.add()to correctly stage directories
[0.4.0] - 2026-04-07¶
Added¶
oops-odoo-download: clone Odoo Community and Enterprise source repositories via SSH into a shared team directory configured in~/.oops.yamloops-odoo-update: update an existing checkout to the latest commit, or snapshot it at a given date (--date YYYY-MM-DD)oops-odoo-show: list all local Odoo source checkouts with their current commit hash and date, grouped by versionManifestVersionBumplint rule: enforces version bump on modified manifests; supportsstrictandtrunkstrategies (configurable viamanifest.version_bump_strategy)OdooConfigsection in~/.oops.yaml:sources_dir,community_url,enterprise_url
Fixed¶
- Config
_apply()now correctly convertsOptional[Path]fields (previously failed when the default wasNone); also expands~in path values
Documentation¶
- Added command reference page for the new
odoocommand group - Added manifest configuration section, lint rules page, and pre-commit hooks guide
[0.3.1] - 2026-04-07¶
Fixed¶
- Eliminate spurious
UserWarning: Unknown config key ignored: 'version'by addingversionas an accepted field in the rootConfigdataclass
[0.3.0] - 2026-04-06¶
Added¶
manifest checkandmanifest fixcommands backed by configurable fixit lint rules: required keys, author/maintainers/summary validation (with autofix), version format enforced perodoo_versionconfig (digit-typo autofix O→0/l→1), canonical key orderingrelease createandrelease showcommands for semver release managementproject synccommand: sparse-clones a remote repository and copies configured files into the local project tree- Lazy Config singleton: configuration is loaded on first access; a clear error is raised immediately when no
.oops.yamlis found instead of crashing later sub checknow warns when submodules point to a PR branch (detected viapull_request_dirconfig)find_addon_dirs()helper inio/file.py;pull_request_dirfield inProjectConfig- Shared CST helpers in
rules/_helpers.pyfor reuse across future lint rule modules - YAML config support for
~/.oops.yamland.oops.yamlwithversionkey validation
Changed¶
- All commands unified under a shared
OopsCommandbase class with consistent repo resolution and error handling - Removed legacy
oops/git/module; all git operations consolidated intoservices/git.py - File I/O reorganized into
oops/io/(file.py,manifest.py,tools.py)
[0.2.0] - 2026-04-03¶
Added¶
addons comparecommand to compare addons between two sourcessub replacecommand for in-place submodule replacementsub fixcommand for submodule repair
Changed¶
- Migrated internals to GitPython library
- Reorganized module structure; decoupled git operations from commands
Fixed¶
- Fixed
addons diffcommand to correctly find modified addons - Fixed logic errors and improved error handling across commands
- Fixed entry points and imports after module restructuring
- Fixed
sub adderror path handling - Made addon migrate script executable
[v0.1.0] - 2025-11-19¶
Added¶
- First release version with initial features for addons, projects, and submodules.