plugins/odoo-development/SKILL.md
MUST be loaded when ANY Odoo development task is detected. CRITICAL: Claude MUST use this skill for ALL tasks involving: - "odoo", "module", "model", "view", "field", "OWL", "manifest" - ANY mention of Odoo versions (14, 15, 16, 17, 18, 19) - "create odoo module", "generate odoo code", "review odoo module" - "upgrade odoo", "odoo best practices", "odoo security" ALWAYS trigger the odoo-context-gatherer agent BEFORE writing ANY Odoo code.
npx skillsauth add letzdoo/claude-marketplace odoo-developmentInstall 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.
CRITICAL: Before writing ANY Odoo code, Claude MUST invoke the
odoo-context-gathereragent to compile relevant patterns for the task.MANDATORY WORKFLOW:
- Detect/confirm Odoo version (NEVER skip)
- Invoke
odoo-development:odoo-context-gathereragent with task description- Use returned context patterns for code generation
- NEVER skip step 2 - context gathering is REQUIRED
╔══════════════════════════════════════════════════════════════════════════════╗
║ BEFORE generating Odoo code, you MUST: ║
║ 1. Determine the target Odoo version ║
║ 2. Invoke odoo-context-gatherer agent with task description ║
║ 3. Use the patterns returned by the agent ║
║ ║
║ DO NOT generate Odoo code without context from the agent. ║
╚══════════════════════════════════════════════════════════════════════════════╝
Usage: This is a lightweight discovery index. DO NOT read full skill files unless needed. Use
Readtool on specific file paths only when you need the detailed pattern.
# Basic fields
name = fields.Char(required=True)
active = fields.Boolean(default=True)
sequence = fields.Integer(default=10)
amount = fields.Float(digits=(16, 2))
date = fields.Date(default=fields.Date.today)
note = fields.Text()
html_content = fields.Html()
# Relational
partner_id = fields.Many2one('res.partner', ondelete='cascade')
tag_ids = fields.Many2many('my.tag', string='Tags')
line_ids = fields.One2many('my.line', 'parent_id')
# Computed
total = fields.Float(compute='_compute_total', store=True)
@api.depends('line_ids.amount')
def _compute_total(self):
for rec in self:
rec.total = sum(rec.line_ids.mapped('amount'))
class MyModel(models.Model):
_name = 'my.model'
_description = 'My Model'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'sequence, id'
<!-- v17+: direct attribute -->
<field name="x" invisible="state != 'draft'"/>
<field name="y" readonly="is_locked"/>
<!-- v14-16: attrs dict -->
<field name="x" attrs="{'invisible': [('state', '!=', 'draft')]}"/>
| Intent / Keywords | Skill File | Description |
|-------------------|------------|-------------|
| fields, char, many2one, one2many, selection | skills/field-type-reference.md | All field types with attributes |
| computed, depends, inverse, search | skills/computed-field-patterns.md | Computed field patterns |
| constraint, validation, check | skills/constraint-patterns.md | SQL and Python constraints |
| onchange, dynamic, domain | skills/onchange-dynamic-patterns.md | Form field dynamics |
| view, form, tree, kanban, search | skills/xml-view-patterns.md | XML view patterns |
| widget, statusbar, badge, image | skills/widget-field-patterns.md | Field widgets |
| qweb, template, t-if, t-foreach | skills/qweb-template-patterns.md | QWeb templating |
| action, window, server, client | skills/action-patterns.md | Action patterns |
| menu, navigation, menuitem | skills/menu-navigation-patterns.md | Menu structure |
| security, access, rule, group | skills/odoo-security-guide.md | Security configuration |
| workflow, state, statusbar, approval | skills/workflow-state-patterns.md | State machines |
| wizard, transient, dialog | skills/wizard-patterns.md | Wizard patterns |
| report, pdf, qweb, print | skills/report-patterns.md | PDF reports |
| cron, scheduled, automation | skills/cron-automation-patterns.md | Scheduled actions |
| controller, http, api, rest, json | skills/controller-api-patterns.md | HTTP controllers |
| mail, email, chatter, activity | skills/mail-notification-patterns.md | Mail integration |
| multi-company, company, currency | skills/multi-company-patterns.md | Multi-company |
| inherit, extend, override | skills/inheritance-patterns.md | Model/view inheritance |
| migration, upgrade, version | skills/data-migration-patterns.md | Data migration |
| website, portal, public | skills/website-integration-patterns.md | Website integration |
| external, api, webhook, sync | skills/external-api-patterns.md | External APIs |
| logging, debug, error | skills/logging-debugging-patterns.md | Logging/debugging |
| stock, inventory, warehouse, move | skills/stock-inventory-patterns.md | Stock operations |
| account, invoice, journal, payment | skills/accounting-patterns.md | Accounting |
| sale, order, quotation, crm, lead | skills/sale-crm-patterns.md | Sales/CRM |
| hr, employee, contract, leave | skills/hr-employee-patterns.md | HR patterns |
| domain, filter, search, operator | skills/domain-filter-patterns.md | Search domains |
| sequence, number, reference | skills/sequence-numbering-patterns.md | Auto-numbering |
| purchase, vendor, procurement | skills/purchase-procurement-patterns.md | Purchasing |
| project, task, timesheet | skills/project-task-patterns.md | Project management |
| context, env, sudo, with_context | skills/context-environment-patterns.md | Environment/context |
| exception, error, validation | skills/error-handling-patterns.md | Error handling |
| portal, token, access, share | skills/portal-access-patterns.md | Portal access |
| dashboard, kpi, analytics, graph | skills/dashboard-kpi-patterns.md | Dashboards |
| settings, config, parameter | skills/config-settings-patterns.md | Module settings |
| translation, i18n, language | skills/translation-i18n-patterns.md | Translations |
| assets, js, css, scss, bundle | skills/assets-bundling-patterns.md | Asset bundling |
| variant, attribute, product | skills/product-variant-patterns.md | Product variants |
| pricelist, price, discount | skills/pricelist-pricing-patterns.md | Pricing |
| uom, unit, measure, conversion | skills/uom-patterns.md | Units of measure |
| lot, serial, batch, expiry | skills/lot-serial-patterns.md | Lot/serial tracking |
| import, export, csv, excel | skills/import-export-patterns.md | Data import/export |
| tax, fiscal, vat | skills/tax-fiscal-patterns.md | Tax configuration |
| owl, component, frontend, javascript | skills/odoo-owl-components.md | OWL components |
| test, unittest, integration | skills/odoo-test-patterns.md | Testing |
| performance, optimize, index | skills/odoo-performance-guide.md | Performance |
| manifest, module, depends | skills/odoo-module-generator.md | Module structure |
| version, 14, 15, 16, 17, 18, 19 | skills/odoo-version-knowledge.md | Version differences |
| binary, attachment, file, image | skills/attachment-binary-patterns.md | File handling |
For version-specific code, check these skill files:
skills/odoo-version-knowledge.md - Breaking changes by versionskills/odoo-owl-components.md - OWL 1.x (v15) / 2.x (v16-18) / 3.x (v19)skills/{pattern}-{version}.mdRead toolExample:
User: "Create a computed field that sums order lines"
→ Keywords: computed, depends
→ Read: skills/computed-field-patterns.md
→ Use the pattern, don't keep file in context
tools
Core OTK engine: Rust CLI proxy, output filters, token tracking, and analytics. This skill provides the `otk` binary and all 12 filter strategies. AUTO-TRIGGER: Used automatically via PreToolUse hook - no manual invocation needed. Performance: <10ms startup, <5MB binary, <5MB memory. Written in Rust like RTK.
tools
OTK (Odoo Token Killer) - Reduce token consumption by 60-90% on Odoo development operations. Inspired by RTK (Rust Token Killer) by the rtk-ai team. AUTO-USE when running Bash commands during Odoo development. The PreToolUse hook handles transparent rewriting automatically. For manual use, prefix commands with `otk`: otk invoke test my_module → test failures only (90% savings) otk docker compose logs odoo → errors/warnings only (90% savings) otk git status → compact stats (80% savings) otk read models/sale.py → signatures + fields only (60% savings) otk read views/sale_view.xml → structure only (70% savings) otk gain → token savings dashboard Compatible with: odoo-doodba-dev, odoo-development, odoo-query plugins.
data-ai
Connect to Odoo instances via XML-RPC for read-only queries to investigate issues and explore data. Use when user asks to "query odoo", "connect to odoo", "investigate odoo data", "read odoo records", or needs to explore an Odoo instance.
tools
--- name: Odoo Indexer description: Fast indexer for Odoo codebases - 95% more token-efficient than reading files. USE AUTOMATICALLY AND PROACTIVELY before ANY Odoo code work. AUTO-TRIGGER when user mentions models (sale.order, res.partner, account.move, etc.), fields (partner_id, name, state, etc.), views (form, tree, kanban), XML IDs, or when you need to search/validate/explore Odoo code. USE BEFORE writing code to validate references exist, USE BEFORE reading files to locate elements, USE DUR