Agent skill

Odoo Workflow

by unclecatvn in unclecatvn/agent-skills

Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix…

MITAuto-check passedDevelopment

Install Odoo Workflow

skills CLI
$ npx skills add unclecatvn/agent-skills --skill odoo-workflow -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install unclecatvn/agent-skills odoo-workflow --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/unclecatvn/agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/odoo-workflow .claude/skills/odoo-workflow && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
odoo-workflow
GitHub stars
143
Token cost
~4.7k tokens
SKILL.md length
2,311 words
Files
4 (incl. scripts, references)
Skills in repo
8
Repo updated
First seen
Licence
MIT

At a glance

Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix…

  • Works in 7 steps: Runtime, version, pack → Trace the chain → Context Brief (no citation, no code) → …
  • Pastes an Odoo traceback
  • SKILL.md covers When this applies, Step 0 - Runtime, version, pack, Step 1 - Trace the chain and Step 2 - Context Brief (no…, plus 4 more sections
  • Runs Python scripts from its folder; calls python3

What it does

Odoo Workflow is an agent skill from unclecatvn/agent-skills. Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix, refactor, "optimize", "clean code", "stick to base"), Odoo 16-19. Also when the user pastes an Odoo traceback or install/upgrade error (ParseError "cannot be located in parent view", "Field ... does not exist", missing xmlid) or asks where an Odoo model, field, method, view or xmlid is defined. Run BEFORE brainstorming or…

Its SKILL.md is about 4.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including scripts and reference files (for example `references/definition-of-done.md`, `scripts/odoo_trace.py` and `templates/CLAUDE.md`).

It sits in Development, covering Debugging, Internationalization and Brainstorming. It works with Odoo and Python. The repository describes itself as: Odoo Skills Documentation. The licence is MIT.

When your agent uses it

  • Pastes an Odoo traceback
  • Install/upgrade error (ParseError cannot be located in parent view

Example prompts

  • “optimize”
  • “clean code”
  • “stick to base”
  • “/odoo-workflow”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Runtime, version, pack
  2. Trace the chain
  3. Context Brief (no citation, no code)
  4. Minimal plan
  5. Implement
  6. Definition of done
  7. Hand off

What it can do on your machine

Read from SKILL.md and the folder at commit 3039ef3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Odoo Workflow loads about 4.7k tokens when it runs, and up to ~6.8k if it reads all its reference files. Until then it costs about 209 tokens; SKILL.md has 2,311 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~209
When it runs · the whole SKILL.md, loaded when a task matches
~4.7k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from unclecatvn/agent-skills at commit 3039ef3, republished under its MIT licence (© unclecatvn). 2,311 words, ~4,678 tokens.

Download SKILL.mdSave it as .claude/skills/odoo-workflow/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
odoo-workflow
description
Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix, refactor, "optimize", "clean code", "stick to base"), Odoo 16-19. Also when the user pastes an Odoo traceback or install/upgrade error (ParseError "cannot be located in parent view", "Field ... does not exist", missing xmlid) or asks where an Odoo model, field, method, view or xmlid is defined. Run BEFORE brainstorming or planning: Odoo design questions are answered by tracing the real source into a Context Brief (file:line), not by open-ended Q&A or memory. Resolves the Odoo runtime and version, loads the matching odoo-<major> pack, and closes with install, test, upgrade, i18n, security and hygiene checks before commit.

Odoo Workflow - trace first, then code

Procedure for every Odoo change. The expensive failures are always the same: a field or method that does not exist, an xpath anchor that was never there, an override hooked on the wrong method, a stored field renamed without a migration, a sudo() nobody can audit, a test run that ran no tests. The fix is mechanical: no citation, no code.

When this applies

  • Full path - anything that ends in Odoo Python, XML, JS or data: new field, override, inherited view, OWL patch, wizard, cron, controller, report, security, migration, bug fix, refactor, "optimize", "clean up". A pasted traceback starts here: its innermost frame in a workspace module is the first citation.
  • Brief only - questions about Odoo symbols ("where is X defined", "does sale.order have F", "which model gets this field on 19"): run Steps 0-2 and answer with the Brief, no code.
  • Fast path - the change names no symbol outside the module being edited and adds no field, override, xmlid, xpath, group or depends: a label, help text or typo in the module's own code, a manifest version bump, a test-only change. The Brief is one row citing the edited line; skip Steps 1, 3 and 6; Step 5 still applies (i18n when a string changed). Any doubt: full path.
  • Skip for documentation-only and git-only tasks (use odoo-commit).
  • Brainstorming and planning skills come after Step 2, and only if the business intent is still unclear - the Context Brief is their input.

Step 0 - Runtime, version, pack

The bundled helper scripts/odoo_trace.py (stdlib Python 3.8+, read-only) resolves the runtime and answers the Python-side trace questions. Call it with the skill's base directory written out in full every time - shell variables do not survive between tool calls. Below, odoo_trace stands for python3 <skill_dir>/scripts/odoo_trace.py.

bash
odoo_trace env

First hit wins: flags, .claude/odoo.json, an odoo-bin configuration in .claude/launch.json whose addons cover the cwd (both files in the cwd or nearest parent), then the one *.conf whose addons_path covers the cwd, searched from the parent directory upwards (each level and its subdirectories). It prints version (from odoo/release.py), odoo_root, conf, python, dev_db, and the addons roots in the order Odoo uses them (the first root holding a module name wins). An odoo_version in .claude/odoo.json or a .odoo-version file must match release.py.

  • Exit 2 prints SETUP ERROR: and the cause. Runtime not located: ask once for the core checkout and conf, pass them as odoo_trace --odoo-root <core> --conf <conf> <command> on every call (roots included), and offer to write a gitignored .claude/odoo.json with odoo_version, odoo_root, conf, python, dev_db (machine-local paths). Version sources that disagree, or several confs covering the cwd: ask which one is right. Never trace against custom roots alone.
  • An explicit statement from the user or the project CLAUDE.md / AGENTS.md outranks the helper. If they disagree, stop and ask. Do not silently assume a version.
  • Load the Odoo reference pack for that major: odoo-<major> with the skills CLI, <plugin>:odoo-<major>-0 in the Claude Code plugin (for example agent-skills:odoo-18-0). Read its references/api-highlights.md (APIs removed or renamed in this version) and only the guide section the task needs (grep -n '^## ' <guide>, then a range). Pack missing: say so and continue - the real source is the authority, never memory.

Step 1 - Trace the chain

Python symbols: the helper. It parses classes with ast, applies the version's _name rules, follows _inherit parents (mixins such as mail.thread, portal.mixin), _inherits delegation, base extensions and the core BaseModel, marks classes in files the module never imports (UNIMPORTED), and prints absolute file:line.

QuestionCommand
Classes defining / extending MODEL, its mixins, type, _auto, _log_accessodoo_trace model MODEL
Does FIELD exist on MODEL (own, parent, _inherits, magic), every definition, comodel; a dotted path is checked hop by hopodoo_trace field MODEL FIELD[.FIELD...]
Every definition of METHOD in super() order (#1 runs first), super() calls, hooks, AMBIGUOUS pairsodoo_trace method MODEL METHOD --module MODULE
Transitive depends of MODULE in load orderodoo_trace depends MODULE
Does an xmlid exist (loaded XML record or CSV row, or generated at install)odoo_trace xmlid module.name
Files of MODULE that never load (not in data/assets, not imported)odoo_trace unlisted MODULE

The last line is the VERDICT. Exit 0 = found, 1 = NOT FOUND (the verdict names the closest real symbols), 2 = setup error or answer unknown. Only exit 1 supports a NOT FOUND cell. Lists on hub models (sale.order, mail.thread) are capped; --all after model, method or unlisted prints them whole.

XML, JS, controllers, uses: grep over the same roots. ROOTS below means $(odoo_trace roots) written out in full: command substitution splits into one argument per root in zsh and bash, a plain $ROOTS string does not split in zsh. Keep the quotes around --include globs. A grep that warns No such file or directory or exits 2 is a broken command, never a NOT FOUND. So is a grep run while odoo_trace env exits 2 (an empty $(odoo_trace roots) leaves grep -r searching only the cwd), and one over a root whose path holds a space: it splits, and macOS grep skips the pieces silently, so grep that root separately, quoted.

bash
# V1. Views on MODEL
grep -rlE --include='*.xml' "<field name=\"model\">MODEL</field>" ROOTS
# V2. Every view and QWeb template inheriting VIEW; -A1 also catches inherit_id split over two lines
grep -rnE -A1 --include='*.xml' "name=['\"]inherit_id['\"]|inherit_id=['\"]" ROOTS | grep -E ":[0-9]+:.*(ref|inherit_id)=['\"](MODULE\.)?VIEW['\"]|-[0-9]+-\s*ref=['\"](MODULE\.)?VIEW['\"]"
# V3. ANCHOR nodes inside one view record, absolute lines. A = the id line, B = the next </record>: grep -nE 'id="VIEW"|</record>' VIEW_FILE
awk -v a=A -v b=B 'NR>=a && NR<=b && /name="ANCHOR"/ {print FILENAME":"NR": "$0}' VIEW_FILE
# W1. OWL / QWeb client template: definition and every t-inherit (extension or primary)
grep -rnE --include='*.xml' "t-name=['\"]TEMPLATE['\"]|t-inherit=['\"]TEMPLATE['\"]" ROOTS
# W2. JS class or component: its definition (= import path) and every patch of it
grep -rnE --include='*.js' "^export (default )?(class|function|const) NAME[^A-Za-z0-9_]|patch\(\s*NAME[^A-Za-z0-9_]" ROOTS
# C1. Route (the second pattern finds a decorator split over lines), then every subclass of
#     its controller class (an `import CLASS as ALIAS` hit: run the class grep again with ALIAS)
grep -rnE --include='*.py' "@(http\.)?route\(.*['\"]URL['\"]|^\s*(route=)?\[?\s*['\"]URL['\"]" ROOTS
grep -rnE --include='*.py' "^class \w+\(([^)]*[ ,])?([A-Za-z_.]+\.)?CLASS[,)]|import.*[ ,]CLASS as " ROOTS
# S1. ACL rows and record rules on MODEL (dots as underscores)
grep -rn --include='ir.model.access.csv' "model_MODEL_UNDERSCORED," ROOTS
grep -rlE --include='*.xml' "model_MODEL_UNDERSCORED['\"]" ROOTS | grep security
# U1. Every use of NAME before renaming, removing, or changing the signature of a field or method
grep -rnwE --include='*.py' --include='*.xml' --include='*.js' --include='*.csv' --include='*.scss' "NAME" ROOTS
# T1. Tests to mirror
ls BASE_MODULE/tests/; grep -rnE "def test_.*METHOD" MODULE/tests

For U1 keep the hits on MODEL and list each one: views, QWeb, @api.depends, related=, domains, record rules, cron and server-action code, <function>, button name=, JS orm.call strings, tests, migrations. On a generic name (name, state, partner_id) restrict the list to the modules odoo_trace model MODEL printed plus the views from V1/V2; if it is still over 50 hits, show the count per module and ask before going on.

A grep hit counts only if its file loads (odoo_trace unlisted MODULE lists the files that never do) and, in Python, sits in MODEL's own class, not another class of the same file.

Reading budget - this is where tokens go:

  • Read ranges, not files: Read with offset/limit, or awk 'NR>=A && NR<=B' - never sed -n 'A,Bp' | grep -n, whose line numbers restart at 1 and cannot be cited. At most 120 lines per hop.
  • At most 3 hops inline. Deeper or cross-module flows go to the odoo-code-tracer agent with odoo_version, pack_dir (the loaded pack's directory), roots and helper (the helper's full path, plus any flags env needed), if it is installed; otherwise keep going with the commands above.
  • Never re-read a file already cited in the Brief.

Step 2 - Context Brief (no citation, no code)

Write the brief before any code, one row per symbol the change touches (Odoo 18 example):

LayerSymbolSource (file:line)Base behaviourChange
modelpurchase.orderaddons/purchase/models/purchase_order.py:19_name, inherits mail.threadinherit
method+superbutton_approvepurchase_order.py:528; override purchase_stock/models/purchase_order.py:117 calls _create_pickingpickings exist only with purchase_stockdepends purchase_stock, call super, then X
pathstock.picking partner_id.commercial_partner_id.vatstock/models/stock_picking.py:630 -> base/models/res_partner.py:304 -> :247Many2one, Many2one, Charrelated field
view+xpathpurchase.purchase_order_formpurchase/views/purchase_views.xml:130, anchor partner_ref :185, one node in the form-add field after anchor

Layers: model / field / method+super / path / view+xpath / client / controller / security / company / data / migration / i18n / test.

The Source cell holds exactly one of:

  • file:line - the cited line itself shows the claim (definition, record, anchor node).
  • NOT FOUND - the helper exited 1, or a clean grep over all ROOTS matched nothing on MODEL. Name the closest real symbol when one exists.
  • UNCERTAIN: <what is missing> - name the file not read, the runtime-built domain, or the other module's view that provides the anchor. Never for a question a command above answers.
  • AMBIGUOUS: <modules> - overrides in modules that do not depend on each other.

Any cell other than file:line means no code for that row: drop it, add the missing depends, or ask. More than 15 rows means the task should be split; never drop a row to fit.

Rules:

  • Redefined field. odoo_trace field lists every definition in load order; cite each one whose attributes the change relies on. Attributes not repeated keep their earlier value (selection_add extends the list), unless the newer class does not subclass the earlier one: then the earlier attributes are dropped and the helper prints final class.
  • Path (related=, @api.depends, depends=, domain=, domain_force). One field call on the dotted path, one citation per hop. A missing hop, or a non-relational hop before the end, is NOT FOUND at that hop.
  • Depends. A symbol defined only in a module outside odoo_trace depends MODULE is not guaranteed to be installed, even if it exists in the current database. Add the dependency or drop the row.
  • Override order. Take it from odoo_trace method ... --module MODULE, never from memory or grep order: the class loaded last runs first and its super() reaches the earlier ones. Declare depends on every module whose override the change relies on. Pairs it marks AMBIGUOUS stay AMBIGUOUS.
  • Xmlids. odoo_trace xmlid decides: a record in an XML or CSV file the manifest loads, or GENERATED at install (model_*, field_*__*, selection__*, base.module_*, account.<company id>_<name> from a chart template), each tied to the module the helper names. A record only in a file the manifest never loads is NOT FOUND (UNKNOWN when an init hook may load it). Never invent an xmlid and never report a generated one as missing. A missing group in a view's groups= does not stop the install: Odoo only logs a WARNING, and the node is hidden because no user belongs to a group that does not exist.
  • Magic fields. Never assume them; odoo_trace field decides. create_uid, create_date, write_uid, write_date exist only when _log_access is true; it defaults to _auto, so report and SQL-view models (_auto = False) do not have them.
  • Xpath anchor. The anchor must be in the base view or in an inheriting view of a module in depends; otherwise UNCERTAIN. A locator matches the first node, so state how many nodes carry that name in the combined views (V2 + V3).
  • Company. If MODEL or a comodel has company_id, cite it and whether the model sets _check_company_auto. New relational fields to company-bound comodels get check_company=True. A new model with company_id gets a record rule as core writes it: [('company_id', 'in', company_ids)], or [('company_id', 'in', company_ids + [False])] when the company is optional.
  • Schema change. Renaming, removing or retyping a stored field, changing or removing selection keys, adding required, adding a stored compute to a populated table, or renaming a model needs a migration row: the new manifest version and the migrations/<version>/pre-*.py / post-*.py script (def migrate(cr, version)) that moves the data; the script runs only if its version is above the installed one and not above the manifest's. A stored field renamed without one loses its column and data on -u, silently. Skip only when the user confirms the module was never installed on a database that matters. Recipes are in the pack's migration guide.
  • sudo. Every added sudo() or with_user(SUPERUSER_ID) gets a security row: which ACL or record rule it bypasses (S1) and the check made before it (check_access / has_access on 18+, an access token, or a group check). No row, no sudo.
  • Reuse over invent: before adding a field, helper, or compute, look for an existing one.
  • "Clean code" / "stick to base" means: follow the base implementation's pattern with the minimal delta, never rewriting what super() already does. "Optimize" about speed means: measure first (query count or timing on a named case), change, measure again.
Show full SKILL.md (473 more words)Show less

Step 3 - Minimal plan

At most 10 bullets: files to touch, files explicitly not touched, what is deferred. One module unless the Brief proves the change belongs to two, and one commit and PR per git repository touched. YAGNI: no config for a value that never changes, no helper used once, no abstraction with one implementation.

Step 4 - Implement

  • Apply the pack's Coding Conventions and its api-highlights.md list for this version; existing stable-addon style wins over personal preference.
  • Override the narrowest hook that runs when the change needs it (the hooks odoo_trace method prints), not the public method that wraps it. Call super() and add the smallest delta; never copy the base body.
  • Extend with _inherit = 'model' (a string); a new model sets _name explicitly. A list _inherit without _name creates a new model named after the class: on 19 always (with a warning), on 18 once the list has two items.
  • Every new XML or CSV file goes into the manifest data in load order (groups, ir.model.access.csv, views, menus); every new static file must match an entry of the right assets bundle. An unlisted file installs cleanly and does nothing.
  • sudo() naming: bind any recordset obtained through sudo() to a name ending in _sudo (partner_sudo = self.partner_id.sudo(), orders_sudo = self.env['sale.order'].sudo().search(domain)). A one-shot call (record.sudo().write(vals)) needs no variable. Never return a _sudo recordset from a public method or keep it on self.
  • No ponytail: or other "simplified for now" markers in Odoo code - either the code is right or the plan in Step 3 says what was deferred.
  • New user-facing strings go through _() / _t() / string= / help= so they are extractable.

Step 5 - Definition of done

Read references/definition-of-done.md before reporting done: it holds the exact commands per version. In short:

  • One throwaway database scratch_<module> for the whole checklist: install with the module's tests, a test summary counting N > 0 tests (no summary, or of 0 tests, is not a pass), no ERROR/CRITICAL, every WARNING about the module explained. Never -i/-u a named database (the conf db_name, staging, dev) unless the user asks.
  • Upgrade tested on a copy of a database with the previous version whenever the Brief has a migration row.
  • odoo_trace unlisted <module> reports that all files load.
  • ACL rows for every new model; company rule where the Company rule applies; every sudo() has its security row.
  • i18n regenerated whenever a string changed; shipped .po files keep their names.
  • The project's own linter, if it has one, passes on the changed files.
  • Hygiene checks pass in every git repository the change touched.
  • Scratch database dropped with its filestore. Commit through odoo-commit ([TAG] module: description, no AI attribution), one commit and PR per repository.

Step 6 - Hand off

Run the odoo-code-review agent with odoo_version, pack_dir, roots and helper if it is installed. If not, walk the Security and Hygiene lists in references/definition-of-done.md yourself before reporting done.

© unclecatvn, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (scripts, references) in skills/odoo-workflow of unclecatvn/agent-skills.

  • SKILL.md
  • references/definition-of-done.md
  • scripts/odoo_trace.py
  • templates/CLAUDE.md

Open the folder on GitHubat commit 3039ef3

Compare with similar skills

Odoo Workflow next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Odoo Workflow compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Odoo Workflow this skillunclecatvn/agent-skills143—~4.7kAutomated safety check: PassMIT
Dignified Python Standardsdocling-project/docling69k—~1.5kAutomated safety check: PassApache-2.0
Code Refactor Masteryennanliu/CS_basics142—~3.3kAutomated safety check: PassNone
SlintMoosync/Moosync259—~2.4kAutomated safety check: PassGPL-3.0
Clean Testsertugrul-dmr/clean-code-skills196—~1.3kAutomated safety check: PassMIT
Code Revieweralirezarezvani/claude-skills28k1 repos~1.6kAutomated safety check: PassMIT

Similar skills

  • Dignified Python Standards

    docling-project/docling

    Applies opinionated production Python conventions chosen by the project's Python version: modern type syntax, pathlib, explicit checks and interface guidance.

    69k GitHub stars~1.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Code Refactor Master

    yennanliu/CS_basics

    Code refactoring expert for improving code quality, readability, maintainability, and performance.

    142 GitHub stars~3.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Slint

    Moosync/Moosync

    Expert guidance for building, debugging, and working with Slint GUI applications.

    259 GitHub stars~2.4k tokensUpdated 6 days ago
    DevelopmentAuto-check passed
  • Clean Tests

    ertugrul-dmr/clean-code-skills

    A skill your agent uses when writing, fixing, editing, or refactoring Python tests.

    196 GitHub stars~1.3k tokensUpdated 5 mo ago
    DevelopmentAuto-check passed
  • Code Reviewer

    alirezarezvani/claude-skills

    Code review automation for TypeScript, JavaScript, Python, Go, Swift, Kotlin, C, .NET, Java, C, C++, Rust, Ruby, PHP, and Dart/Flutter.

    28k GitHub starsUsed in 1 repo~1.6k tokens
    DevelopmentAuto-check passed
  • Code Reviewer

    LeoYeAI/openclaw-master-skills

    Code review automation for TypeScript, JavaScript, Python, Go, Swift, Kotlin.

    2.2k GitHub starsUsed in 1 repo~1.2k tokens
    DevelopmentAuto-check passed

More from unclecatvn/agent-skills

All 8 skills in this repo
  • Code Review

    unclecatvn/agent-skills

    A skill your agent uses when receiving code review feedback (especially if unclear or technically questionable), when completing tasks or major features requiring review before proceeding, or before…

    143 GitHub stars~1.3k tokensUpdated 14 days ago
    Auto-check passed
  • Odoo 16

    unclecatvn/agent-skills

    Odoo 16 development reference for Python models and ORM (search, domain, readgroup, compute fields), XML/CSV data and views, OWL/JS client code, QWeb reports, security (ACL, record rules, groups)…

    143 GitHub stars~1.4k tokensUpdated 14 days ago
    Auto-check passed
  • Odoo 17

    unclecatvn/agent-skills

    Odoo 17 development reference for Python models and ORM (search, domain, readgroup, compute fields), XML/CSV data and views, OWL/JS client code, QWeb reports, security (ACL, record rules, groups)…

    143 GitHub stars~1.4k tokensUpdated 14 days ago
    Auto-check passed
  • Odoo 18

    unclecatvn/agent-skills

    Odoo 18 development reference for Python models and ORM (search, domain, readgroup, compute fields), XML/CSV data and views, OWL/JS client code, QWeb reports, security (ACL, record rules, groups)…

    143 GitHub stars~1.3k tokensUpdated 14 days ago
    Auto-check passed
  • AI Vibe Slides

    unclecatvn/agent-skills

    Create beautiful, professional HTML or React slide decks ready for fullscreen presentation.

    143 GitHub stars~3.5k tokensUpdated 14 days ago
    Auto-check passed
  • Dtg Base

    unclecatvn/agent-skills

    Complete reference for DTG Base module utilities and helpers.

    143 GitHub stars~901 tokensUpdated 14 days ago
    Auto-check passed

Works with

Categories

Questions about Odoo Workflow

What does Odoo Workflow do?

Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix…. Odoo Workflow is an agent skill from unclecatvn/agent-skills. Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix, refactor, "optimize", "clean code", "stick to base"), Odoo 16-19.

When should I use Odoo Workflow?

Odoo Workflow fits situations like: pastes an Odoo traceback; install/upgrade error (ParseError cannot be located in parent view.

How do I install Odoo Workflow in Claude Code?

Run `npx skills add unclecatvn/agent-skills --skill odoo-workflow -a claude-code`. Or copy the skill folder (skills/odoo-workflow in unclecatvn/agent-skills) into .claude/skills/odoo-workflow in your project. Claude Code loads it when a task matches its description.

How do I install Odoo Workflow in Codex?

Run `npx skills add unclecatvn/agent-skills --skill odoo-workflow -a codex`. Or copy the skill folder (skills/odoo-workflow in unclecatvn/agent-skills) into .agents/skills/odoo-workflow in your project. Codex loads it when a task matches its description.

Can I use Odoo Workflow in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add unclecatvn/agent-skills --skill odoo-workflow -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/odoo-workflow, .gemini/skills/odoo-workflow, .github/skills/odoo-workflow and .opencode/skills/odoo-workflow in your project.

What does Odoo Workflow need to run?

Going by SKILL.md and its folder, Odoo Workflow needs Python for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3.

Does Odoo Workflow access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Odoo Workflow safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Odoo Workflow use?

Odoo Workflow is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Odoo Workflow use?

About 4.7k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.1k tokens, read only when the agent opens those files.

What are the alternatives to Odoo Workflow?

Skills that share tags, products or a category with Odoo Workflow: Dignified Python Standards (docling-project/docling, 69k stars), Code Refactor Master (yennanliu/CS_basics, 142 stars), Slint (Moosync/Moosync, 259 stars) and Clean Tests (ertugrul-dmr/clean-code-skills, 196 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Odoo Workflow?

unclecatvn (a GitHub user) maintains it in unclecatvn/agent-skills, which has 143 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 24, 2026.

Source: unclecatvn/agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.