---
name: upgrade-agent-native
description: >-
  Bring an older Agent Native app or workspace current. Use when updating
  @agent-native/core, fixing a broken upgrade, or when tempted to patch or
  override core/dispatch packages to make an old branch run.
scope: dev
metadata:
  internal: true
---

# Upgrade Agent Native

## Rule

When an older Agent Native app/branch needs to run on current packages, use
`agent-native upgrade`. Never "fix" upgrade breakage with
`pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
edits under `node_modules/@agent-native/*` — especially not against
`@agent-native/core` or `@agent-native/dispatch`.

## Why

Agents often respond to a failed core bump by inventing framework patches and
dispatch behavior overrides. That hides the real app-level break, drifts from
upstream, and makes the next upgrade worse. The supported path is bump →
install → refresh scaffold skills → verify, then fix **app** code only.

## How

1. **Preview migration codemods first**

   ```bash
   npx @agent-native/core@latest upgrade --codemods
   ```

   Codemods are preview-by-default: read the diff before applying it. Do not
   manually edit imports before running this command; the migration manifest is
   the source of truth for renamed specifiers and symbols.

2. **Apply the reviewed codemods, then run the upgrade**

   ```bash
   npx @agent-native/core@latest upgrade --codemods --yes
   npx @agent-native/core@latest upgrade
   ```

   Or from an already-installed CLI: `pnpm exec agent-native upgrade` /
   `agent-native upgrade`.

   What it does:

   - Blocks (unless `--force`) when `@agent-native/*` overrides/patches exist
   - Rewrites non-local `@agent-native/*` dependency pins to `latest`
   - Runs the package manager install
   - Runs `skills update scaffold --project`
   - Runs `typecheck` when the project has that script

3. **Pull upstream template changes (optional, separate from the bump)**

   `agent-native upgrade` moves package versions. It never touches files that
   were copied out of a template at scaffold time, so template fixes and
   improvements do not arrive with a bump.

   ```bash
   agent-native template status        # recorded ref vs latest, drift counts
   agent-native template diff          # what upstream changed, read-only
   agent-native template sync          # 3-way merge it into the app
   ```

   `sync` defaults to the ref matching the installed `@agent-native/core`, so
   run it after `upgrade`. It merges per file against a pristine baseline
   stored in `refs/agent-native/template-baseline/<app-path>`; files upstream
   did not touch are left alone, and real collisions get conflict markers.
   After resolving markers, run `agent-native template accept` — the baseline
   deliberately does not advance past an unresolved merge.

   Apps scaffolded before provenance existed have no baseline. Create one
   with `agent-native template baseline` before the first sync.

4. **If upgrade or typecheck fails**

   - Read the concrete error
   - Fix **app** source, actions, config, or env — not framework packages
   - Re-run `agent-native upgrade` or `pnpm typecheck`
   - Stop and ask the user if you cannot fix the app-level error

   Intentional app-level UI customization is a separate workflow. Read
   `customizing-agent-native` when the product needs to own a selectively
   copied component; do not use that path to reproduce framework runtime
   behavior or hide version skew.

5. **Dry-run / partial runs**

   ```bash
   agent-native upgrade --dry-run
   agent-native upgrade --skip-verify
   agent-native upgrade --skip-install   # package.json bumps only
   agent-native doctor --only migration-manifest
   ```

   `migration-manifest` has no opt-out. Run it in CI before upgrading to find
   imports that will break, then use `npx @agent-native/core@latest upgrade --codemods`
   to preview the supported rewrite.

## Don't

- Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
  `patchedDependencies` for any `@agent-native/*` package
- Don't edit `node_modules/@agent-native/core` or
  `node_modules/@agent-native/dispatch`
- Don't invent local "dispatch behavior" shims to paper over version skew
- Don't keep iterating with more framework patches after a failed install
- Don't skip `skills update scaffold --project` after a core bump (the
  upgrade command does this for you)

## Related Skills

- **self-modifying-code** — Tier 4: framework packages are off limits
- **agent-native-docs** — version-matched docs after the bump
- **customizing-agent-native** — intentional app-owned UI copies, not upgrade patches
- **portability** — keep app code provider-agnostic across upgrades
