opencode-agent-kit
Version:
Multi-stack OpenCode agent toolkit — 33+ specialized AI agents, 200+ skills, 46 commands, 8 MCP servers (Nuxt, React, Node.js, Laravel, CI3, Android, Flutter, DevOps, SEO, SonarQube, and more)
180 lines (126 loc) • 5.74 kB
Markdown
---
name: visual-dev-loop
description: 'Automated visual development loop: run app, preview in browser, screenshot, inspect, fix, repeat until done. Uses Chrome DevTools MCP for inspection + agent-browser for annotated screenshots + portless for stable dev URLs.'
---
# Visual Development Loop
Use this skill when developing frontend/UI features that need visual verification. The agent runs an automated loop: build → preview → screenshot → inspect → fix → repeat until the task is complete.
## Tooling Overview
| Tool | Purpose |
| ----------------------- | --------------------------------------------------------------------------------------- |
| **portless** | Run dev server with named URL: `https://myapp.localhost` |
| **chrome-devtools MCP** | Navigate, screenshot, snapshot, inspect console, network, performance |
| **agent-browser MCP** | Annotated screenshots (numbered labels), visual diff, React tree inspection, Web Vitals |
## Port-Specific Guidance
When running `portless` as a Bash command, use the `PORT` env var if port 443 is unavailable:
```bash
PORT=443 portless myapp npm run dev
```
Portless reads `package.json` "dev" script automatically. Just run:
```bash
portless
# or
portless myapp next dev
```
This produces `https://myapp.localhost` (or `<project-name>.localhost`).
## Dev Loop Protocol
### Step 1: Start Dev Server
```bash
# In project with package.json:
portless
# Or with explicit name and command:
portless <app-name> <dev-command>
```
The app is now at `https://<app-name>.localhost`.
### Step 2: Open Browser & Navigate
Use chrome-devtools to open the app:
```
chrome-devtools new_page https://<app-name>.localhost
```
### Step 3: Inspect the UI
**Using chrome-devtools (primary):**
```
chrome-devtools take_screenshot — full page screenshot
chrome-devtools take_snapshot — accessibility tree with refs
chrome-devtools list_console_messages — check for errors/warnings
chrome-devtools list_network_requests — verify API calls, no 4xx/5xx
chrome-devtools lighthouse_audit — performance/accessibility audit
```
**Using agent-browser (when visual context is needed):**
```
agent-browser screenshot --annotate — screenshot with numbered labels
agent-browser snapshot -i — interactive elements only
agent-browser get title — current page title
agent-browser get url — current URL
```
### Step 4: Analyze Issues
Compare what you see against the task requirements:
- Visual issues (layout, styling, missing elements) → from screenshots
- Console errors → from chrome-devtools list_console_messages
- Network failures → from chrome-devtools list_network_requests
- Accessibility violations → from lighthouse_audit or take_snapshot
### Step 5: Fix Code
Edit the source files based on findings.
### Step 6: Reload & Re-inspect
```
chrome-devtools navigate_page (reload)
# Wait for page to load
chrome-devtools take_screenshot
chrome-devtools list_console_messages
```
### Step 7: Loop Until Done
Repeat steps 4-6 until all issues are resolved.
## Agent-Browser Specific Workflows
### Annotated Screenshots for Visual Reference
```
agent-browser navigate_page https://myapp.localhost
agent-browser screenshot --annotate
```
Produces a screenshot with `@e1`, `@e2`, etc. labels overlaid on interactive elements.
### Visual Regression Diff
```
agent-browser screenshot baseline.png
# ... after changes ...
agent-browser screenshot current.png
agent-browser diff screenshot --baseline baseline.png --output diff.png
```
### React Component Inspection
```
agent-browser new_page https://myapp.localhost --enable react-devtools
agent-browser evaluate_script "agent_browser_react_tree()"
```
## Chrome DevTools Specific Workflows
### Full Inspection (Every Loop)
```
1. take_screenshot — visual capture
2. take_snapshot — accessibility tree with element refs
3. list_console_messages (types: error, warn) — JS errors
4. list_network_requests (resourceTypes: xhr, fetch) — API call status
```
### Performance Check (When Loading is Slow)
```
1. performance_start_trace (reload: true)
2. Wait for trace to complete
3. performance_analyze_insight — get performance recommendations
```
### Mobile/Responsive Testing
```
1. emulate viewport "375x667x2,mobile"
2. take_screenshot
3. resize_page 1440 900
4. take_screenshot
```
## Loop Termination Criteria
The loop stops when ALL criteria are met:
- [ ] Application loads without console errors
- [ ] All network requests return 2xx/3xx
- [ ] UI matches requirements visually (verified via screenshot)
- [ ] Accessibility snapshot shows correct elements
- [ ] No layout/rendering issues visible
If after 10 iterations the task is not complete, stop and report remaining issues.
## Common Pitfalls
1. **Port already in use** → Kill existing process with `kill $(lsof -ti:PORT)` or use different port
2. **portless permission** → First run requires `sudo` for port 443 on macOS/Linux: `sudo portless trust`
3. **Chrome not starting** → Ensure Chrome is installed. chrome-devtools-mcp auto-downloads Chrome for Testing
4. **agent-browser not installed** → `npm install -g agent-browser && agent-browser install`
5. **Screenshot too large** → chrome-devtools-mcp is configured with `--screenshot-max-width 1200` to reduce token usage
6. **State loss on reload** → If app state resets, use chrome-devtools `evaluate_script` to re-hydrate state after reload