unclecatvn/odoo-code-review
Review Odoo code for correctness, security, performance, and version-specific standards (Odoo 16, 17, 18, or 19). Use when reviewing Odoo modules, diffs, or pull requests; produce a scored report with weighted criteria.
npx skills add https://github.com/unclecatvn/agent-skills --skill odoo-code-review
Review Odoo code changes against clear criteria, identify risks, and score using a weighted scale from an Odoo-expert perspective — using the reference pack that matches the target Odoo version.
Before reviewing, resolve ODOO_VERSION (one of 16.0, 17.0, 18.0, 19.0) in this order. Stop at the first one that succeeds:
odoo_version: "19.0")..odoo-version file at the repo root (contents: e.g. 19.0).odoo_version key in .claude/odoo.json.odoo.version key in package.json or tool.odoo.version in pyproject.toml.__manifest__.py files for the 'version' key. Use the dominant major version (e.g. 18.0.1.0.0 → 18.0).19.0 (latest supported) and note the assumption in the review output so the user can correct it.Derive ODOO_MAJOR from ODOO_VERSION by stripping .0 (e.g. 18.0 → 18). All guide paths below use these placeholders.
Supported versions: 16.0, 17.0, 18.0, 19.0. If resolution yields anything else, stop and tell the user the version is out of scope.
skills/odoo-${ODOO_VERSION}/SKILL.md as the master index for the resolved version's guides.skills/odoo-${ODOO_VERSION}/references/api-highlights.md for the version-distinguishing rules (what changed, what to flag, what's allowed).skills/odoo-${ODOO_VERSION}/references/ based on change scope:odoo-${ODOO_MAJOR}-model-guide.mdodoo-${ODOO_MAJOR}-field-guide.mdodoo-${ODOO_MAJOR}-decorator-guide.mdodoo-${ODOO_MAJOR}-performance-guide.mdodoo-${ODOO_MAJOR}-view-guide.mdodoo-${ODOO_MAJOR}-security-guide.mdodoo-${ODOO_MAJOR}-controller-guide.mdodoo-${ODOO_MAJOR}-transaction-guide.mdodoo-${ODOO_MAJOR}-mixins-guide.md (mail.thread, activities)odoo-${ODOO_MAJOR}-testing-guide.mdodoo-${ODOO_MAJOR}-migration-guide.mdodoo-${ODOO_MAJOR}-actions-guide.mdodoo-${ODOO_MAJOR}-data-guide.mdodoo-${ODOO_MAJOR}-manifest-guide.mdapi-highlights.md (e.g. <tree> vs <list>, group_operator= vs aggregator=, optional _name in v19, etc.).@api.depends, @api.constrains, @api.ondelete, @api.model_create_multiUniqueViolation, serializationapi-highlights.md)sudo() usage10. Mixins: mail.thread, mail.activity.mixin, mail.alias.mixin usage
11. Testing: Test coverage, proper test cases, @tagged decorators
12. Migration: Migration scripts, data migration patterns
13. Actions: Window actions, server actions, cron jobs
14. Data Files: XML/CSV data structure, noupdate, shortcuts
15. Manifest: Dependencies, external deps, hooks, assets
Rules below are version-neutral unless they reference api-highlights.md. Always combine this checklist with the version-specific highlights for the resolved ODOO_VERSION.
search() inside a loop (N+1 anti-pattern)search_read() when dict output neededread_group() for aggregate queriesIN domain instead of search in loop: [('order_id', 'in', orders.ids)]create([{...}, {...}]) for multiple recordsrecordset.write() instead of looprecordset.unlink() instead of loop@api.model_create_multi on create() overrides (see api-highlights.md for version-specific enforcement)ODOO_VERSION (see api-highlights.md: <tree> in 16/17, <list> in 18+).ODOO_VERSION: legacy attrs= / states= are valid in 16, but rejected in 17+ where direct expressions are required.xpath / position — the nested list tag must match the version.name= attributes in records.Monetary with currency_fieldMany2one with ondeletestore=True if filtered/searchedgroup_operator= (v16/17) vs aggregator= (v18+) — see api-highlights.md.@api.depends with complete dotted paths@api.constrains for invariants@api.ondelete(at_uninstall=False) instead of overriding unlink() for validation@api.model_create_multi for batch createread_group() / search_read() over per-record fetchesprefetch_fields thoughtfullysavepoint around recoverable failuresUniqueViolation explicitlyUserError, ValidationError, AccessErrorexcept Exceptionsudo() used narrowly with justificationauth= (user, public, none)csrf=False only with justificationtype='json' vs type='http' matches the clientmail.thread with proper tracking fieldsmail.activity.mixin for activitiesmail.alias.mixin with alias fields@taggednoupdate="1" for reference dataWeight each section per the percentages above. Total out of 100. Report:
ODOO_VERSION at the top of the report.When reviewing, thoroughly check (references below use ${ODOO_MAJOR} — substitute the resolved value):
@api.depends have complete dependencies?partner_id.email instead of just partner_idskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-decorator-guide.mdsearch(), browse(), read() insidesearch_read() with IN domain or read_group()skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-performance-guide.mdcreate(), write(), unlink() in loopskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-performance-guide.mdUniqueViolation handling without savepointskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-transaction-guide.md_name (v19).skills/odoo-${ODOO_VERSION}/references/api-highlights.md + odoo-${ODOO_MAJOR}-view-guide.mdMonetary with currency_fieldMany2one with ondeletestore=True if neededskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-field-guide.mdUserError, ValidationError, AccessErrorExceptionskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-security-guide.mdmail.thread with proper tracking fieldsmail.activity.mixin for activitiesmail.alias.mixin with alias fieldsskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-mixins-guide.md@tagged decoratorsskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-testing-guide.md10. Are migrations handled correctly?
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-migration-guide.md11. Are actions properly defined?
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-actions-guide.md12. Are data files correct?
noupdate="1" for reference dataskills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-data-guide.md13. Is manifest correct?
skills/odoo-${ODOO_VERSION}/references/odoo-${ODOO_MAJOR}-manifest-guide.mdTake unclecatvn/odoo-code-review from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.