Module Workflow
WPMoo is built around the work Odoo developers repeat every day: add a module, install it, update it, test it, lint the environment, export translations, and recover safely when something goes wrong.
Use the cockpit for guided selection or run the same actions directly with ./moo.
Find Modules
List modules from the cockpit or inspect the environment:
./moo statusstatus reports installable modules, non-installable modules, and module quality findings such as missing actionable menus.
If no modules are found, add or sync a source repository first:
$ npx @wpmoo/toolkit source list
$ npx @wpmoo/toolkit source sync$ pnpm dlx @wpmoo/toolkit source list
$ pnpm dlx @wpmoo/toolkit source sync$ yarn dlx @wpmoo/toolkit source list
$ yarn dlx @wpmoo/toolkit source sync$ bunx @wpmoo/toolkit source list
$ bunx @wpmoo/toolkit source syncAdd A Module
Create a new addon skeleton inside a source repository:
$ npx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_module \
--source-type private$ pnpm dlx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_module \
--source-type private$ yarn dlx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_module \
--source-type private$ bunx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_module \
--source-type privateWPMoo creates a minimal install-safe Odoo addon:
my_module/
|-- __init__.py
|-- __manifest__.py
|-- models/
|-- security/
|-- views/
`-- tests/Use a scaffold profile when the addon has a known shape:
$ npx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_portal_addon \
--source-type private \
--profile portal$ pnpm dlx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_portal_addon \
--source-type private \
--profile portal$ yarn dlx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_portal_addon \
--source-type private \
--profile portal$ bunx @wpmoo/toolkit add-module \
--repo odoo-addons \
--module my_portal_addon \
--source-type private \
--profile portalSupported profiles:
core, documents, scoring, portal, exhibition, ai_review, mail, proProfiles keep the generated skeleton generic. They add safe dependencies, folders, and starter files for common Odoo addon types without adding product-specific business logic.
Install And Update
Start services, then install a module:
./moo start
./moo install my_moduleAfter Python, XML, security, or data changes:
./moo update my_moduleUpdate multiple modules with a comma-separated list:
./moo update module_a,module_bOr use --db when spacing module names:
./moo update module_a module_b --db develIf the arguments are ambiguous, WPMoo prints a concrete correction instead of guessing.
Run Tests
Run module tests:
./moo test my_moduleChoose a database:
./moo test my_module --db develChoose a test mode or tags:
./moo test my_module --db devel --mode update --tags /my_moduleWhen tests fail, WPMoo prints the relevant Odoo log excerpt when available and still shows the full log path.
Lint And Translate
Run environment lint checks:
./moo lintExport a translation template:
./moo pot my_module devel i18n/my_module.potRemove A Module
Remove a module registration:
$ npx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private$ pnpm dlx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private$ yarn dlx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private$ bunx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type privateDelete files only when you intend to remove the source directory:
$ npx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private \
--delete-files$ pnpm dlx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private \
--delete-files$ yarn dlx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private \
--delete-files$ bunx @wpmoo/toolkit remove-module \
--repo odoo-addons \
--module my_module \
--source-type private \
--delete-filesWPMoo refuses dirty deletion because module directories are product source code, not disposable generated files.
Standard Daily Loop
./moo start
./moo update my_module
./moo test my_module
./moo lint
./moo doctorFor repeatable close-out checks, use Quality Gates.
