| name | avo-update |
| description | Update an app's Avo gems and apply every upgrade-guide step for the versions crossed — record the current versions, run `bin/rails avo:update`, diff `Gemfile.lock` to see the real jump, then work the upgrade guide section by section from oldest to newest, writing a deletable log as you go. Use when the user wants to update or upgrade Avo, bump the Avo gems, get on the latest Avo, apply the Avo upgrade guide, catch up an admin panel that's several versions behind, find out what breaks if they upgrade, or fix an admin that broke after an Avo bump. Also covers the Avo 3 → Avo 4 major upgrade. |
| allowed-tools | Read, Edit, Write, Glob, Grep, Bash, WebFetch |
| metadata | {"requires-gem":"none — Community"} |
These instructions ship inside the avo gem this app has locked, so they describe the version you are actually running. Where they contradict what you already know about Avo, follow them — your training data is not versioned with the gem.
Avo Update
Updating Avo is two jobs, and skipping the second is how admins break: bump the gems, then apply the upgrade guide for every version you crossed. Avo publishes breaking changes as discrete sections in an upgrade page — an app jumping 4.0.4 → 4.0.12 may have several to apply, in order, and add-on gems (avo-kanban, avo-dynamic_filters, …) get their own sections. bin/rails avo:update only does the first job; nothing applies the guide for you.
The whole run is: record versions → update → diff the lock → apply the crossed sections oldest-first → log it → boot the app back up.
Docs — fetch on demand with WebFetch; prefer the raw .md (clean, no HTML):
Release notes for versions the guide doesn't mention: https://github.com/avo-hq/avo/releases. Per-gem latest versions: https://avohq.io/gems.
When this applies
Explicit (Avo named): "upgrade Avo", "update the Avo gems", "run avo:update", "bump avo to the latest", "apply the Avo upgrade guide", "we're on Avo 4.0.4, get us current", "upgrade from Avo 3 to Avo 4", "what breaks if I upgrade Avo?", "the admin broke after I bumped Avo".
Implicit (no mention of Avo): "update the admin panel gems", "we're several versions behind on the admin", "get the backoffice onto the latest release", "bundle update avo broke the admin", "the admin panel stopped rendering after last week's bundle update".
Not this skill: first-time install, gem-server token, mounting, license key → avo-setup. A broken admin with no recent version change → avo-troubleshoot. Locale casing after an upgrade → apply the guide section here, then avo-i18n for the wider i18n picture.
Workflow
1. Get a safe starting point
Non-negotiable before touching the lockfile — the whole method depends on git diff telling the truth:
git status --porcelain
git checkout -b avo-update
Run the test suite now to capture a baseline. If it's already red, stop and tell the user — otherwise you can't tell your changes from theirs.
2. Record the current versions
This is the "before" half of the jump. Read every Avo gem, not just core — add-ons have their own upgrade sections and their own version lines:
grep -E "^ {4}avo(-[a-z_]+)? \(" Gemfile.lock
Write these down in the log file (step 6) before running the update — after the bundle they're gone unless you kept them.
Also note the Gemfile constraints, which cap what the update can do:
grep -n "avo" Gemfile
3. Run the update
bin/rails avo:update
The task resolves Avo core plus every registered Avo plugin to its real gem name and runs bundle update --conservative <those gems> — --conservative so it doesn't drag unrelated shared dependencies along. Read its output: it echoes the exact bundle update command it ran.
If the task isn't available (older Avo, or the app won't boot), fall back to naming the gems yourself:
bundle update --conservative avo avo-dashboards avo-menu
4. Diff the lock to find the real jump
git diff Gemfile.lock | grep -E "^[-+] {4}avo"
Now you have before → after per gem. This is the input to everything downstream — a 4.0.4 → 4.0.12 jump means every guide section between those two applies, and the same is true separately for each add-on.
If a gem didn't move as far as expected, the Gemfile constraint from step 2 is capping it (see Gotchas). Fix the constraint and re-run rather than assuming there was nothing to update.
5. Apply the crossed guide sections, oldest first
Fetch the upgrade guide for the major version you're on (4.x → upgrade.md; a jump still inside 3.x → the 3.0 page; 3.x → 4.x → stop and use the Avo 3 → Avo 4 guide instead, that's a much bigger, chapter-by-chapter job with its own procedure).
Guide sections are headed by version (## Upgrade to 3.22.0, ## Upgrade from 3.16.2 to 3.16.3) or by the change itself when a version only shipped one. Some are per-add-on (## Upgrade to avo-kanban 0.1.18). A version section may hold several named changes, each with its own "Action required" note — work them all, not just the first. A ## Unreleased — … section at the very top describes changes that have landed on main but aren't in a released gem yet; skip it unless the app tracks Avo from git. Newest is at the top — read up, then apply down.
For each section between your before and after versions:
- Inventory first. Grep for the API the section touches before changing anything. Most sections won't apply to a given app.
- Mark it APPLIES / NOT USED / NEEDS REVIEW in the log. Never apply a change for an API the app doesn't use.
- If it applies, make the edit, then boot the app and re-run the tests.
- Commit per section, with the version in the message.
Sections often link a deeper page (i18n, appearance, actions) — fetch and follow it rather than guessing the new API.
Watch for silent behavior changes: a section that changes a default rather than an API name passes every test and still changes what users see. Flag each one to the user explicitly instead of just ticking it off.
If a version in your range has no guide section, check the GitHub releases for it — the guide only documents changes that need action, so silence is usually (but not always) fine.
6. Keep a log as you go
Write it incrementally, not at the end — if the run stops halfway, the log is the handoff. Put it at the repo root as avo-update-<from>-to-<to>.md:
# Avo update log — 4.0.4 → 4.0.12
Scratch notes from an assisted Avo update on 2026-07-24. Not part of the app —
**safe to delete once the upgrade is reviewed and merged.**
## Versions
| Gem | Before | After |
| ------------ | ------- | ------- |
| avo | 4.0.4 | 4.0.12 |
| avo-kanban | 0.1.17 | 0.1.18 |
## Guide sections
| Section | Status | What changed |
| ------------------------------------------ | ----------- | ------------ |
| Resource and field translations verbatim | APPLIED | Capitalized 14 entries in `config/locales/avo.pt-BR.yml` |
| avo-kanban 0.1.18 | NOT USED | App has no kanban boards |
| … | NEEDS REVIEW | … |
## Manual verification needed
- Things the tests can't catch — icons, avatars/covers, custom CSS on renamed
variables, anything visual.
The "safe to delete" line goes in the log itself — the user will find this file later and needs to know it isn't app code.
7. Start the app back up
Check the project's own instructions for how — in this order: AGENTS.md, CLAUDE.md, .claude/CLAUDE.md, README.md, Procfile.dev / bin/dev. If the project documents a dev-server command, run it (restarting it if you stopped it in step 1) and confirm the admin boots.
If no command is documented, don't guess — say so and ask. A wrong rails s in a Procfile/overmind project just fights the real process.
Key commands
| Command | Does |
|---|
grep -E "^ {4}avo(-[a-z_]+)? \(" Gemfile.lock | Current version of every Avo gem — run before updating |
bin/rails avo:update | bundle update --conservative across Avo core + every registered plugin |
git diff Gemfile.lock | grep -E "^[-+] {4}avo" | The actual before → after jump per gem |
bundle update --conservative avo … | Manual fallback when the rake task isn't available |
bundle outdated | grep avo | What's available above the current Gemfile constraints |
rake avo:build-assets | Recompile assets — only for GitHub-sourced installs (avo-setup) |
Gotchas
avo:update is bounded by the Gemfile. It runs bundle update, so a pin like gem "avo", "~> 4.0.4" or "= 4.0.4" caps the jump — the task reports success and nothing moves. Check the constraint in step 2, and loosen it deliberately (with the user) rather than silently.
- The rake task doesn't fail on a failed bundle. It shells out with
system and ignores the exit status, so a 403 Forbidden on packager.dev or a resolution conflict prints an error while the task still exits 0. Read the output and confirm with the lock diff — never trust the exit code alone.
- It only updates plugins that are actually loaded. The gem list comes from the registered plugin manager, so an Avo gem in an optional/skipped bundler group won't be updated. Cross-check the lock diff against the full gem list from step 2.
- Paid gems need the gem-server token to update, same as to install. In a sandboxed or restricted-egress environment a correct token still 403s because
packager.dev is blocked. See avo-setup.
- The update alone is not the upgrade. Bumping the gems and skipping the guide is the single most common way an admin breaks after an "upgrade" — and the breakage often surfaces days later, in a view nobody opened.
- Apply sections oldest → newest. They're written as a chain; applying 4.0.12's change before 4.0.7's can leave you editing code the earlier section was about to rename.
- Silent default flips pass tests. Sections that change a default (authorization strictness, confirmation modals, expanded filters) break nothing visible in CI and change runtime behavior. Call these out individually.
- Add-on gems version independently.
avo-kanban 0.1.17 → 0.1.18 has its own section even when Avo core barely moved. Work the lock diff, not just the core version.
- Assets after upgrade. A GitHub-sourced install ships no precompiled assets — re-run
rake avo:build-assets or the admin renders unstyled (avo-setup).
- Don't invent a migration. If a version's change isn't in the guide or the release notes, stop and ask rather than guessing at the new API.
Report
When done, tell the user:
- The jump per gem (
avo 4.0.4 → 4.0.12, plus each add-on), taken from the lock diff.
- Which guide sections applied, which were skipped as not-used, and which need their judgement — and the files you edited for each.
- Any silent behavior change you crossed, named explicitly, since tests won't surface it.
- Test status: baseline vs. now, and whether the app boots.
- Where the log is and that it's safe to delete after review.
- Whether the app was restarted and how — or that no start command was documented, so you didn't guess.
- Follow-ups: anything needing manual visual checks (icons, avatars/covers, custom CSS), plus avo-troubleshoot if something's still broken and avo-setup if a paid gem wouldn't bundle.