skills/odoo-17.0/SKILL.md
Odoo 17.0 full-stack development skill for AI agents. Covers backend module architecture, ORM models and fields, API decorators, recordset operations, actions, performance patterns, testing, and built-in mixins. Use when building, extending, or debugging Odoo 17.0 custom modules. Triggers on tasks involving __manifest__.py, models.Model, @api decorators, XML views, ir.actions, ir.cron, mail.thread, or any Odoo 17.0 framework pattern.
npx skillsauth add alessandrorlm/agent-skills odoo-17.0Install this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A comprehensive skill set for building production-quality Odoo 17.0 custom modules. Covers the full development lifecycle: module structure, ORM, views, actions, performance, and testing — following official Odoo coding guidelines.
Reference these rules when:
@api decorators, constraints, or onchange handlers| Priority | Category | Impact | Prefix |
| -------- | ------------------- | ------ | -------------- |
| 1 | Module Manifest | HIGH | manifest- |
| 2 | ORM Models | HIGH | models- |
| 3 | ORM Fields | HIGH | fields- |
| 4 | API Decorators | HIGH | decorators- |
| 5 | Recordset & Domains | MEDIUM | recordsets- |
| 6 | Actions | MEDIUM | actions- |
| 7 | Performance | MEDIUM | performance- |
| 8 | Testing | MEDIUM | testing- |
| 9 | Mixins | LOW | mixins- |
manifest-required-keys — Every module must have name, version, depends, license, installablemanifest-data-order — Security CSV always first in data, menus always lastmanifest-assets-bundle — Register JS/OWL/SCSS files under assets.web.assets_backendmanifest-version-format — Use {odoo}.{major}.{minor}.{patch} e.g. 17.0.1.0.0manifest-dependencies — Missing or wrong depends prevents module installationmodels-class-order — Follow canonical attribute → field → constraint → compute → CRUD → action → helper ordermodels-type-selection — Use Model for persistence, TransientModel for wizards, AbstractModel for mixinsmodels-inherit-modes — Know the 4 _inherit modes: extend, copy, compose, delegatemodels-sql-constraints — Prefer _sql_constraints over Python for uniqueness checksmodels-required-attributes — _name and _description are required on every new modelfields-monetary-currency — Monetary fields always require a paired currency_fieldfields-many2one-index — Always set index=True on Many2one fields used in searchesfields-store-decision — Use store=True only when field needs to be searched or sortedfields-m2m-commands — Use ORM write commands (0,0,v) (4,id) (6,0,ids) for relational writesfields-selection-add — When extending a Selection, always define ondelete for new keysdecorators-depends-completeness — List ALL fields that affect the computed resultdecorators-depends-assign-all-branches — Always assign computed field in every code pathdecorators-constrains-exception — @api.constrains must raise ValidationError, never UserErrordecorators-constrains-loop — Always loop for rec in self inside @api.constrainsdecorators-onchange-not-enforced — @api.onchange does not run on programmatic create/writedecorators-onchange-newid — self.id inside @api.onchange is a NewId, not an integerdecorators-create-multi — Always use @api.model_create_multi for create() overrides in 17.0decorators-depends-context-no-store — Fields with @api.depends_context cannot be store=Truerecordsets-search-count — Use search_count() instead of len(search()) for countingrecordsets-batch-write — Call write() on the whole recordset, never inside a looprecordsets-batch-create — Pass a list to create([...]) instead of calling it in a looprecordsets-domain-operators — | and & are prefix operators applying to the next two conditionsrecordsets-sudo-comment — Always add a comment explaining why sudo() is usedrecordsets-raw-sql-params — Never format SQL strings; always use %s parameterized queriesactions-window-menu — Always bind leaf <menuitem> to an ir.actions.act_window recordactions-data-order — Declare actions in view XML, menus in a separate menus.xml loaded lastactions-python-return — Return action dicts from Python methods to open views or wizardsactions-cron-method — Cron methods must be decorated with @api.model and handle their own errorsactions-server-binding — Use binding_model_id to add server actions to the Action dropdownperformance-prefetch — Rely on ORM prefetch; use mapped() to extract cross-record field valuesperformance-no-loop-write — Never call write() or create() inside a for loopperformance-index-searched-fields — Add index=True on fields used in search() domains or ORDER BYperformance-read-group — Use read_group() for aggregations instead of loading full recordsetsperformance-invalidate-after-sql — Call invalidate_model() after any raw SQL writetesting-setup-class — Use setUpClass for shared fixtures; setUp only when full isolation is neededtesting-post-install-tag — Tag tests with @tagged('post_install', '-at_install')testing-constrains-coverage — Every @api.constrains method must have a test that triggers ittesting-wizard-pattern — Test wizards by creating them with context, then calling the action methodtesting-tour-js — UI tours must be registered in the web_tour.tours registry and tested via HttpCasemixins-mail-thread — Add _inherit = ['mail.thread', 'mail.activity.mixin'] for chatter + activitiesmixins-tracking — Use tracking=True on fields to log changes in the chatter automaticallymixins-sequence — Use ir.sequence + next_by_code() in field default= for auto-numberingmixins-portal — Implement _compute_access_url when using portal.mixinmixins-message-post — Use message_post() for programmatic chatter messagesRead individual skill files for detailed explanations, correct and incorrect code examples, and gotchas:
odoo-manifest.md
odoo-orm-models.md
odoo-orm-fields.md
odoo-orm-decorators.md
odoo-orm-recordsets.md
odoo-actions.md
odoo-performance.md
odoo-testing.md
odoo-mixins.md
Each file contains:
# ❌ WRONG)# ✅ CORRECT)For the complete guide with all rules, patterns, and examples expanded,
including global coding guidelines and skill routing table: AGENTS.md
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.