From greenfield
Captures screenshots and documents behavioral flows for web applications using browser automation. Useful for understanding UI affordances, navigation, and state changes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/greenfield:visual-explorationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Document behavioral intelligence through browser automation and visual observation. Every screenshot is an empirical observation. Every interaction sequence is a behavioral flow. This mode captures what the user SEES and what the system DOES in response to user actions.
Document behavioral intelligence through browser automation and visual observation. Every screenshot is an empirical observation. Every interaction sequence is a behavioral flow. This mode captures what the user SEES and what the system DOES in response to user actions.
Visual exploration activates when:
This mode requires a running instance of the target application and browser automation capabilities (Playwright, Puppeteer, or equivalent). All output is RAW (screenshots and flow documentation capture the target's UI in detail).
Targets without a web UI get no useful signal from this mode — skip it.
Source code tells you what the system CAN do. Tests tell you what the system MUST do. Visual exploration tells you what the system LOOKS LIKE while doing it. This is behavioral intelligence that no other mode captures:
Goal: Navigate to the root URL, capture the landing page, and identify the application type, auth requirements, and available affordances.
# Navigate to root URL and screenshot
# (Using Playwright as reference; adapt to available browser automation)
const page = await browser.newPage();
await page.goto(ROOT_URL, { waitUntil: 'networkidle' });
await page.screenshot({ path: 'workspace/raw/runtime/visual/screenshots/001-landing.png', fullPage: true });
Document:
If authentication is required:
Goal: Click every navigation element, screenshot each page, and document the complete navigation tree.
// Extract all navigation links
const navLinks = await page.$$eval('nav a, [role="navigation"] a, .sidebar a, .menu a, header a',
links => links.map(a => ({ text: a.textContent.trim(), href: a.href }))
);
For each navigation element:
for (const [index, link] of navLinks.entries()) {
await page.goto(link.href, { waitUntil: 'networkidle' });
await page.screenshot({
path: `workspace/raw/runtime/visual/screenshots/nav-${String(index).padStart(3, '0')}-${slugify(link.text)}.png`,
fullPage: true
});
}
Write to workspace/raw/runtime/visual/navigation-map.md:
## Navigation Tree
- **Home** (`/`) -- screenshot: 001-landing.png
- **Dashboard** (`/dashboard`) -- screenshot: nav-001-dashboard.png
- **Analytics** (`/dashboard/analytics`) -- screenshot: nav-002-analytics.png
- **Reports** (`/dashboard/reports`) -- screenshot: nav-003-reports.png
- **Settings** (`/settings`) -- screenshot: nav-004-settings.png
- **Profile** (`/settings/profile`) -- screenshot: nav-005-profile.png
- **Billing** (`/settings/billing`) -- screenshot: nav-006-billing.png
Goal: For each page, identify interactive elements, interact with them, and capture before/after screenshots documenting the system's feedback.
For each page, identify:
const interactiveElements = await page.$$eval(
'button, input, select, textarea, [role="button"], [role="tab"], [onclick], a[href="#"]',
els => els.map(el => ({
tag: el.tagName,
type: el.type || '',
text: el.textContent?.trim().substring(0, 50),
id: el.id,
name: el.name,
ariaLabel: el.getAttribute('aria-label'),
}))
);
For each interactive element:
// Example: form submission
await page.screenshot({ path: `screenshots/form-${name}-before.png` });
await page.fill('input[name="email"]', '[email protected]');
await page.click('button[type="submit"]');
await page.waitForTimeout(1000); // Allow time for feedback
await page.screenshot({ path: `screenshots/form-${name}-after.png` });
Write to workspace/raw/runtime/visual/page-inventory.md:
## Page: Settings > Profile
**URL:** `/settings/profile`
**Screenshot:** nav-005-profile.png
### Interactive Elements
| Element | Type | Action Taken | Feedback | Screenshots |
|---------|------|-------------|----------|-------------|
| Display Name | text input | Typed "Test User" | No immediate feedback | form-profile-before.png, form-profile-after.png |
| Save | submit button | Clicked | Success toast: "Profile updated" | form-profile-save.png |
| Avatar | file upload | Uploaded test.png | Preview updated | form-profile-avatar.png |
Goal: Document end-to-end user flows with screenshots at every state transition.
Document these flows whenever they exist:
| Flow | Description | Priority |
|---|---|---|
| Onboarding | First-time user experience from signup to first use | High |
| Core workflow | The primary task the application enables | High |
| Error recovery | What happens when something goes wrong | High |
| Settings/configuration | How users customize the application | Medium |
| Search/filter | How users find content within the application | Medium |
| CRUD operations | Create, read, update, delete for primary entities | Medium |
| Authentication flow | Login, logout, password reset, session expiry | Medium |
| Export/import | How data moves in and out of the application | Lower |
For each flow, create a directory under workspace/raw/runtime/visual/flows/:
workspace/raw/runtime/visual/flows/
onboarding/
step-01-landing.png
step-02-signup-form.png
step-03-email-verification.png
step-04-profile-setup.png
step-05-first-dashboard.png
flow.md
core-workflow/
step-01-start.png
step-02-input.png
step-03-processing.png
step-04-result.png
flow.md
Each flow.md follows this format:
# Flow: Onboarding
## Steps
### Step 1: Landing Page
**Screenshot:** step-01-landing.png
**URL:** `/`
**Action:** Click "Sign Up" button
**State:** Unauthenticated, no account
### Step 2: Signup Form
**Screenshot:** step-02-signup-form.png
**URL:** `/signup`
**Action:** Fill email, password, click "Create Account"
**State:** Unauthenticated, form displayed
**Feedback:** Form validation on blur for email format
### Step 3: Email Verification
**Screenshot:** step-03-email-verification.png
**URL:** `/verify`
**Action:** (requires email access -- documented but not tested)
**State:** Account created, not verified
**Feedback:** "Check your email" message displayed
## Behavioral Claims
- New accounts require email verification before first use
<!-- cite: source=visual-observation, ref=flows/onboarding/step-03-email-verification.png, confidence=confirmed, agent=visual-explorer -->
Goal: Explore edge cases that reveal the system's behavior at its boundaries.
// Navigate to pages likely to have empty states (lists, dashboards, search results)
// Screenshot each empty state
await page.goto('/projects'); // Assuming no projects exist
await page.screenshot({ path: 'screenshots/empty-projects.png', fullPage: true });
Document: What does the system show when there is no data? Does it provide guidance? Is the UI broken?
// Submit forms with very long text
await page.fill('input[name="title"]', 'A'.repeat(1000));
await page.screenshot({ path: 'screenshots/long-input.png' });
Document: Does the system truncate? Overflow? Reject? Scroll?
// Test at different viewport sizes
const viewports = [
{ width: 375, height: 812, name: 'mobile' }, // iPhone
{ width: 768, height: 1024, name: 'tablet' }, // iPad
{ width: 1280, height: 800, name: 'laptop' }, // Laptop
{ width: 1920, height: 1080, name: 'desktop' }, // Desktop
];
for (const vp of viewports) {
await page.setViewportSize({ width: vp.width, height: vp.height });
await page.screenshot({ path: `screenshots/responsive-${vp.name}.png`, fullPage: true });
}
Document: Does the layout adapt? Is navigation accessible at mobile sizes? Are interactive elements reachable?
// Check for keyboard navigation
await page.keyboard.press('Tab');
await page.screenshot({ path: 'screenshots/keyboard-focus-1.png' });
await page.keyboard.press('Tab');
await page.screenshot({ path: 'screenshots/keyboard-focus-2.png' });
// Check for skip links
await page.keyboard.press('Tab'); // First tab should focus skip-to-content if present
Document: Is keyboard navigation possible? Are focus indicators visible? Is there a skip-to-content link?
All screenshots follow this naming scheme:
{phase}-{context}-{description}.png
| Phase Prefix | Usage |
|---|---|
001- through 099- | Phase 1: Initial reconnaissance |
nav-NNN- | Phase 2: Navigation mapping |
form-{page}- | Phase 3: Interaction documentation |
step-NN- | Phase 4: Flow documentation (within flow subdirectory) |
edge-{type}- | Phase 5: Edge case exploration |
workspace/raw/runtime/visual/
screenshots/ # All screenshots (flat, except flows)
001-landing.png
nav-001-dashboard.png
nav-002-analytics.png
form-profile-before.png
form-profile-after.png
edge-empty-projects.png
edge-responsive-mobile.png
flows/ # End-to-end flow documentation
onboarding/
step-01-landing.png
step-02-signup.png
flow.md
core-workflow/
step-01-start.png
step-02-result.png
flow.md
navigation-map.md # Complete navigation tree with screenshot refs
page-inventory.md # Per-page interactive element inventory
visual-behaviors.md # Behavioral claims synthesized from all observations
All claims from visual exploration use source=visual-observation:
- The dashboard displays a "No projects" message with a "Create Project" call-to-action when the project list is empty
<!-- cite: source=visual-observation, ref=screenshots/edge-empty-projects.png, confidence=confirmed, agent=visual-explorer -->
Every behavioral claim gets an inline citation immediately after the claim. The ref field should be the screenshot path.
workspace/raw/. They never reach workspace/output/ or workspace/public/.networkidle or explicit waits for dynamic content.<!-- cite: --> comment immediately after the claim. Never defer citation to a later step.fullPage: true to capture below-the-fold content. Viewport-only screenshots miss content.npx claudepluginhub prime-radiant-inc/prime-radiant-marketplace --plugin greenfieldPlaywright browser automation: navigates URLs, captures screenshots and accessibility snapshots, interacts with UI elements (click, type, fill form), and reports findings with visual evidence.
Generates structured user documentation for web apps via browser automation: screenshots pages/routes, step-by-step guides, diagrams, tables. Supports quick-to-exhaustive depths.
Performs adversarial UI testing via browse CLI: analyzes git diffs for targeted testing or explores apps for bugs in functionality, accessibility, responsive layout, and UX heuristics.