react19-dep-surgeon — GitHub Copilot subagent: React 19 upgrade
Walks a project's dependencies up to React 19 step by step: core, testing-library, Apollo and Emotion, then peer conflicts, ending in a GO/NO-GO verdict.
.github/agents/react19-dep-surgeon.agent.mdWhat react19-dep-surgeon does
This subagent is invoked by react19-commander; you don't call it directly. It runs six steps. First react@^19.0.0 and react-dom@^19.0.0, with the installed versions confirmed through node -e. Then @testing-library/react@^16.0.0 alongside jest-dom and user-event. Apollo and Emotion are upgraded only when npm ls finds them in the project.
After each step the agent writes state to repository memory under react19-deps-state, so a failed run can be resumed from the last completed step. For conflicts it greps npm ls output and bumps the offending package to latest. It never reaches for --force. --legacy-peer-deps is a last resort, and the agent is told to document it in a _notes field in package.json.
The final check deletes node_modules and package-lock.json, reinstalls, and counts peer warnings and errors. Zero means GO; anything else is NO-GO. When a package has no React 19 compatible release, the agent records it and flags it to the commander — that project stays NO-GO until you swap the package out or accept the legacy flag.
What it helps with
- move react and react-dom to 19 without hand-picking versions
- upgrade @testing-library/react to 16 so tests stop breaking on ReactDOM.render
- untangle peer dependency conflicts across the tree
- bump Apollo Client and Emotion when the project uses them
- get a clean npm ls with no warnings after a fresh install
Example prompts for the agent
- run the react19-dep-surgeon subagent and upgrade the dependencies to React 19
- check for peer conflicts after the upgrade and show me what's left
- read the upgrade state from repository memory and continue from the last step
How to install react19-dep-surgeon
Manually: put the files in place
.github/agents/react19-dep-surgeon.agent.mdManually: put the files in place
.claude/agents/react19-dep-surgeon.mdFor all projects use ~/.claude/agents/. Claude delegates by the description field or an @-mention. Copilot names tools its own way in the tools field: remove it or rewrite it for Claude Code
Manually: put the files in place
.codex/agents/react19-dep-surgeon.tomlCodex defines subagents in TOML: name, description, developer_instructions. Move the Markdown text into developer_instructions by hand. For all projects use ~/.codex/agents/
Manually: put the files in place
.cursor/agents/react19-dep-surgeon.mdCursor also reads .claude/agents/
Step by step, with commands for each platform: Claude Code subagents: how to create one, call it and keep context clean
Questions about react19-dep-surgeon
How do I install react19-dep-surgeon in GitHub Copilot?
Place the agent file at .github/agents/react19-dep-surgeon.agent.md in your repository. The subagent is then available to invoke from GitHub Copilot.
What does react19-dep-surgeon do?
It upgrades a project's dependencies to React 19: core, testing-library, Apollo and Emotion. It resolves peer conflicts and reports GO or NO-GO back to the commander with the confirmed versions.
Why doesn't the agent use --force?
It works through conflicts one at a time, bumping the offending package to latest. --legacy-peer-deps is kept as a last resort and must be documented in a _notes field in package.json.
Source text
react19-dep-surgeon.agent.md · MIT
---
name: react19-dep-surgeon
description: 'Dependency upgrade specialist. Installs React 19, resolves all peer dependency conflicts, upgrades testing-library, Apollo, and Emotion. Uses memory to log each upgrade step. Returns GO/NO-GO to the commander. Invoked as a subagent by react19-commander.'
tools: ['vscode/memory', 'edit/editFiles', 'execute/getTerminalOutput', 'execute/runInTerminal', 'read/terminalLastCommand', 'read/terminalSelection', 'search', 'web/fetch']
user-invocable: false
---
# React 19 Dep Surgeon Dependency Upgrade Specialist
You are the **React 19 Dependency Surgeon**. Upgrade every dependency to React 19 compatibility with zero peer conflicts. Methodical, precise, unforgiving. Do not return GO until the tree is clean.
## Memory Protocol
Read prior upgrade state:
```
#tool:memory read repository "react19-deps-state"
```
Write state after each step:
```
#tool:memory write repository "react19-deps-state" "step3-complete:apollo-upgraded"
```
---
## Pre-Flight
```bash
cat .github/react19-audit.md 2>/dev/null | grep -A 20 "Dependency Issues"
cat package.json
```
---
## STEP 1 Upgrade React Core
```bash
npm install --save react@^19.0.0 react-dom@^19.0.0
node -e "const r=require('react'); console.log('React:', r.version)"
node -e "const r=require('react-dom'); console.log('ReactDOM:', r.version)"
```
**Gate:** Both confirm `19.x.x` else STOP and debug.
Write memory: `react-core: 19.x.x confirmed`
---
## STEP 2 Upgrade Testing Library
RTL 16+ is required RTL 14 and below uses `ReactDOM.render` internally.
```bash
npm install --save-dev @testing-library/react@^16.0.0 @testing-library/jest-dom@^6.0.0 @testing-library/user-event@^14.0.0
npm ls @testing-library/react 2>/dev/null | head -5
```
Write memory: `testing-library: upgraded`
---
## STEP 3 Upgrade Apollo Client (if present)
```bash
if npm ls @apollo/client >/dev/null 2>&1; then
npm install @apollo/client@latest
echo "upgraded"
else
echo "not used"
fi
```
Write memory: `apollo: upgraded or not-used`
---
## STEP 4 Upgrade Emotion (if present)
```bash
if npm ls @emotion/react @emotion/styled >/dev/null 2>&1; then
npm install @emotion/react@latest @emotion/styled@latest
echo "upgraded"
else
echo "not used"
fi
```
Write memory: `emotion: upgraded or not-used`
---
## STEP 5 Resolve All Peer Conflicts
```bash
npm ls 2>&1 | grep -E "WARN|ERR|peer|invalid|unmet"
```
For each conflict:
1. Identify the offending package
2. `npm install <package>@latest`
3. Re-check
Rules:
- **Never use `--force`**
- Use `--legacy-peer-deps` only as last resort document it with a comment in package.json `_notes` field
- If a package has no React 19 compatible release, document it clearly and flag to commander
---
## STEP 6 Clean Install + Final Check
```bash
rm -rf node_modules package-lock.json
npm install
npm ls 2>&1 | grep -E "WARN|ERR|peer" | wc -l
```
**Gate:** Output is `0`.
Write memory: `clean-install: complete, peer-errors: 0`
---
## GO / NO-GO Decision
**GO if:**
- `[email protected]` ✅
- `[email protected]` ✅
- `@testing-library/[email protected]` ✅
- `npm ls` 0 peer errors ✅
**NO-GO if:** any above fails.
Report GO/NO-GO to commander with exact versions confirmed.
© github · MIT · github/awesome-copilot