Lean local helper for managing pi skills in Odoo projects.
osmo = Odoo Skill Management tOol
The final O in osmo (from tOol) is an easter egg aligned with the octo / otto naming style.
- TUI-first DX for humans (clear, friendly, low-friction)
- CLI-first determinism for agents (
json-friendly, scriptable, reliable) - One clear setup path (KISS)
- Shared skills stay consistent across docs, manifest, and defaults
- Distribution standard for tools:
pipx
docs/releases/README.mddocs/releases/v0.2.0.mddocs/releases/RELEASE_CHECKLIST.md
docs/operator-cheatsheet.md
lazygitlazydockerk9sotto
Target feel: keyboard-first, readable, calm defaults, strong feedback loops.
python3(withvenv)direnvpipx
Install direnv with your OS package manager (examples):
- macOS (Homebrew):
brew install direnv - Ubuntu/Debian:
sudo apt-get update && sudo apt-get install -y direnv - Fedora:
sudo dnf install -y direnv - Arch:
sudo pacman -S direnv - Windows:
winget install direnv.direnv(orchoco install direnv/scoop install direnv)
If pipx is missing:
python3 -m pip install --user pipx
python3 -m pipx ensurepathRun this exact sequence after cloning:
# 1) install the CLI globally (isolated via pipx)
pipx install --editable .
# 2) create repo-local venv and install deps
./scripts/bootstrap.sh
# 3) enable auto-activation of .venv for this repo
direnv allow
# 4) install local git hooks
./scripts/install-git-hooks.sh
# 5) verify setup
./scripts/smoke-test.shWhy this is the recommended path:
pipxmakesosmoavailable in your shellPATHeverywhere, so humans and agents can call the same command consistently.pipxisolates the CLI in its own environment, preventing global Python package conflicts.bootstrap.shkeeps repo dependencies inside.venv, so installs do not leak into system Python.direnv allowauto-activates.venvwhenever you enter the repo, including new terminals (no manual re-activation step).- hooks + smoke provide deterministic quality gates before commits.
Update:
pipx upgrade osmoUninstall:
pipx uninstall osmocd /path/to/osmo
# direnv auto-activates .venv
./scripts/smoke-test.sh
osmoIf dependencies change (requirements.txt updates), rerun:
./scripts/bootstrap.shWhy this matters:
- Humans and agents should run the same executable:
osmo. - This avoids “works in one shell, fails in another” issues.
- It keeps automation deterministic.
Human-first (interactive):
osmoAgent-first (deterministic CLI):
osmo wizard /path/to/odoo-project --dry-run --output json
osmo doctor /path/to/odoo-project --output json
osmo cleanup /path/to/odoo-project --dry-run --output json
osmo reset-project-path --dry-run --output json
osmo wizard --describe --output json
osmo doctor --describe --output jsonRun the skill manager without arguments:
osmoThis opens the interactive TUI (default experience).
Layout is stack-based for readability (otto-like):
- Mode + filter bar (top)
- Use-cases hint bar
- Skills table (count/name/state)
- Selected skill details
- Doctor + status panel
- Status footer
↑/↓orj/k— move selectionEnter/Space— toggle selected skille— enable selected skilld— disable selected skills— run quick setupc— cleanup/uninstall osmo-managed project artifacts (with confirm)x— quick doctor summary + top fix suggestionsX— full doctor report in terminalr— refreshq— quit
Path-aware commands support explicit project targeting.
Wizard/doctor/cleanup resolve project path by:
- explicit argument (if provided), or
- saved default from
.envrc.local(ODOO_REPO_PATH), or - interactive prompt.
Runtime commands (components, enable-skill, disable-skill, up, db, shell, test, lint) support:
--project /path/to/odoo-project(recommended for deterministic automation)- otherwise cwd-based auto-detection.
You can clear saved path with:
osmo reset-project-pathBoth doctor modes give guidance, not only status:
- what failed/warned
- what to do next
- concrete follow-up commands when relevant
- JSON mode includes
checks_structured[](check_code,category,resource,severity, ...) - JSON mode includes
recommendations_structured[]withcode,severity,message,next_command
Use quick x for in-TUI guidance, and X when you want the full report.
The TUI is primary. Command mode is agent-friendly for deterministic automation:
osmo --help
osmo help --output json
osmo ui [PROJECT_REPO_PATH]
osmo wizard [PROJECT_REPO_PATH]
osmo wizard [PROJECT_REPO_PATH] --dry-run --output json
osmo wizard --describe --output json
osmo doctor [PROJECT_REPO_PATH]
osmo doctor [PROJECT_REPO_PATH] --output json
osmo doctor --describe --output json
osmo cleanup [PROJECT_REPO_PATH]
osmo components --project /path/to/odoo-project --output json
osmo enable-skill dev-workbench --project /path/to/odoo-project --dry-run --output json
osmo disable-skill dev-workbench --project /path/to/odoo-project --dry-run --output json
osmo up --project /path/to/odoo-project
osmo reset-project-path --dry-run --output json
osmo reset-project-path --describe --output jsonAutomation contract (JSON/describe/dry-run where mutating):
wizard,doctor,cleanup,components,enable-skill,disable-skill,reset-project-path
Human-ops commands (intentionally outside automation contract):
ui,new-skill,up,db,shell,test,lint
Stable contract spec:
docs/cli-contract.md
You can inspect command scope machine-readably via:
osmo help --output jsonLook for:
data.contract_versiondata.contract_specdata.details[].params[]
Use the global osmo command (installed via pipx):
osmoThe skill manager installs shared skills into your project via symlinks (not file copies).
- shared skills symlink directory:
<odoo-project>/.pi/skills/shared-osmo/<skill>→<skill-manager-root>/skills/<skill>
Why this is useful:
- one source of truth in the skill manager repo
- instant skill updates across linked projects
- easy cleanup/uninstall
Local hygiene behavior:
- the tool can add
.pi/to local git exclude (.git/info/exclude) - this is local-only and not committed
Current shared skills in this skill manager:
dev-workbenchlocal-dbsemantic-commit-messageodoo-ottoodoo-log-debugodoo-pr-reviewodoo-shell-debugodoo-ui-checkskill-authoringweb-lookup
Browser JS helpers used by odoo-ui-check are in:
skills/browser-tools/browser-tools/
./scripts/smoke-test.shSmoke uses .venv/bin/python and checks:
- CLI help/guardrails
- skill metadata consistency (
skills/, manifest, docs, defaults) - CLI contract behavior (
scripts/test-cli-contracts.sh) - golden JSON snapshots (
scripts/test-cli-golden.sh)
Install once:
./scripts/install-git-hooks.shThis enables a local pre-commit hook that runs the smoke test before each commit.