Use when building web UIs with Next.js 15+ and React 19 - covers Server Components, App Router, testing with Vitest and Playwright, and accessibility standards
/plugin marketplace add bryonjacob/aug/plugin install bryonjacob-aug-web-aug-web@bryonjacob/augThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Modern web UI with Next.js 15+ (App Router) + React 19 (Server Components) + TypeScript (strict mode).
Extends configuring-javascript-stack with web-specific patterns.
pnpm add -D @playwright/test @axe-core/playwright
pnpm add -D @testing-library/react @testing-library/jest-dom jsdom
pnpm exec playwright install
app/ # Next.js App Router
├── page.tsx # Homepage
├── layout.tsx # Root layout
├── globals.css # Global styles
└── [route]/page.tsx # Additional pages
components/
├── layout/ # Nav, footer, container
├── sections/ # Hero, CTA, features
├── ui/ # Buttons, headings, cards
├── forms/ # Form components
└── providers/ # Context providers
lib/ # Utility functions
types/ # TypeScript definitions
public/ # Static assets
tests/
├── e2e/ # Playwright tests
└── components/ # Component tests
Server Components (default):
// app/page.tsx - Server Component
export default function HomePage() {
// Can use Node.js APIs, database queries
return <div>Server-rendered content</div>
}
Client Components (only when needed):
// components/ui/Button.tsx
'use client'
import { useState } from 'react'
export default function Button() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}
Component tests (Vitest + React Testing Library):
import { render, screen } from '@testing-library/react'
import { describe, it, expect } from 'vitest'
import Button from './Button'
describe('Button', () => {
it('renders with primary variant', () => {
render(<Button>Click me</Button>)
expect(screen.getByRole('button')).toBeInTheDocument()
})
})
E2E tests (Playwright):
import { test, expect } from '@playwright/test'
test('navigation works', async ({ page }) => {
await page.goto('/')
await page.click('text=About')
await expect(page).toHaveURL('/about')
})
Accessibility tests:
import AxeBuilder from '@axe-core/playwright'
test('homepage has no a11y violations', async ({ page }) => {
await page.goto('/')
const results = await new AxeBuilder({ page }).analyze()
expect(results.violations).toEqual([])
})
vitest.config.ts:
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
setupFiles: ['./tests/setup.ts'],
coverage: {
thresholds: { lines: 80, functions: 80, branches: 80 },
},
},
})
playwright.config.ts:
import { defineConfig } from '@playwright/test'
export default defineConfig({
testDir: './tests/e2e',
use: {
baseURL: 'http://localhost:3000',
},
webServer: {
command: 'pnpm dev',
url: 'http://localhost:3000',
},
})
All from configuring-javascript-stack plus:
dev:
pnpm install
pnpm dev
build:
pnpm build
test-e2e:
pnpm playwright test
a11y:
pnpm playwright test accessibility.spec.ts
check-all: format lint typecheck test coverage test-e2e a11y
@echo "✅ All checks passed"
Data fetching in Server Components:
async function getPosts() {
const res = await fetch('https://api.example.com/posts')
return res.json()
}
export default async function BlogPage() {
const posts = await getPosts()
return <div>{posts.map(post => <article key={post.id}/>)}</div>
}
Client/Server composition:
// Navigation.tsx (Server Component)
import NavigationClient from './NavigationClient'
export default function Navigation() {
const links = [{ href: '/', label: 'Home' }]
return <NavigationClient links={links} />
}
// NavigationClient.tsx
'use client'
import { useState } from 'react'
export default function NavigationClient({ links }) {
const [isOpen, setIsOpen] = useState(false)
// Interactive UI
}
<Image> componentnext/fontdynamic() for heavy components<button>, <nav>, etc.This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.