travisjneuman/.claude/generic-react-code-reviewer

Claude Code and agent skill by travisjneuman/.claude

Trust tier 3
  • community
  • ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Source check pending

Checking that the SKILL.md file is still in the repository.

Review React/TypeScript code for bugs, security vulnerabilities, performance issues, accessibility gaps, and CLAUDE.md workflow compliance. Enforces TypeScript strict mode, GPU-accelerated animations, WCAG AA accessibility, bundle size limits, and surgical simplicity. Use when completing features, before commits, or reviewing pull requests.

Install

npx vskill@latest install travisjneuman/.claude/generic-react-code-reviewer

Semi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard

SKILL.md

React Code Reviewer

Review React/TypeScript code against production quality standards.

Extends: Generic Code Reviewer - Read base skill for full code review methodology, P0/P1/P2 priority system, and judgment calls.

Pre-Commit Validation

Validate by reading the diff, not by running a test/lint/build ladder; the checks below are what to look for.

React-Specific Checks

TypeScript Strict Mode
typescript
// Required tsconfig.json settings
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true
}
}
  • No any types for user input or API responses
  • Validate external data with unknown first, then type guard
  • Generic types over any in reusable utilities
Component Patterns
PatternCheck
PropsInterface defined, no any
StateTyped with Zustand/useState
EventsTyped event handlers
RefsuseRef<ElementType>(null)
Hook Dependency Arrays
typescript
// P1 Issue: Missing dependencies
useEffect(() => {
fetchData(userId); // userId missing from deps
}, []); // ❌
// Correct
useEffect(() => {
fetchData(userId);
}, [userId]); // ✓

Rule: Enable react-hooks/exhaustive-deps ESLint rule.

State Management (Zustand/Redux)
  • Store slices properly typed
  • Actions return void (update state directly)
  • Selectors memoized for derived state
  • Large data (>1MB) in IndexedDB, not localStorage
React Query/SWR Patterns
typescript
// Proper typing
const { data } = useQuery<User>({
queryKey: ["user", id],
queryFn: () => fetchUser(id),
});
// Check: staleTime, cacheTime configured
// Check: error boundaries for query failures

Performance (P1)

Bundle Size Targets
TargetThreshold
Initial bundle< 100KB gzipped
Lazy-loaded chunks< 50KB each
Total JS< 300KB
Lazy Loading
typescript
// Heavy components (>20KB) MUST be lazy loaded
const HeavyChart = lazy(() => import('./HeavyChart'));
const RichTextEditor = lazy(() => import('./RichTextEditor'));
// Wrap in Suspense
<Suspense fallback={<Skeleton />}>
<HeavyChart />
</Suspense>
Memoization
typescript
// Expensive calculations
const sortedItems = useMemo(() =>
items.sort((a, b) => a.date - b.date),
[items]
);
// Callback stability for child components
const handleClick = useCallback(() => {
doSomething(id);
}, [id]);
// Component memoization (when props are stable)
export const Item = memo(function Item({ data }: Props) {
return <div>{data.name}</div>;
});
Animation (GPU-Accelerated Only)
css
/* ✓ DO animate */
transform: translateY(-4px);
opacity: 0.5;
/* ❌ NEVER animate */
width, height, margin, padding, top, left

Accessibility (P1)

Focus Management
typescript
// Modal focus trapping
useEffect(() => {
if (isOpen) {
const firstFocusable = modalRef.current?.querySelector("button, input");
firstFocusable?.focus();
}
}, [isOpen]);
// Escape to close
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === "Escape") onClose();
};
window.addEventListener("keydown", handleEscape);
return () => window.removeEventListener("keydown", handleEscape);
}, [onClose]);
ARIA in JSX
tsx
// Icon-only buttons require labels
<button aria-label="Close modal">
<X className="w-5 h-5" />
</button>
// Dialogs
<div role="dialog" aria-modal="true" aria-labelledby="title">
<h2 id="title">Confirm Action</h2>
</div>

Quick Review Checklist

React-Specific (add to base checklist):

  • [ ] Hook dependencies correct
  • [ ] Heavy components lazy loaded
  • [ ] State management typed
  • [ ] Memoization where beneficial
  • [ ] Focus management in modals

See Also

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
52
Repository forks
13
7-day trend score
20

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 13 May 2026, 5 months ago.

Extension points

  • hookPre/post lifecycle hooks

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/travisjneuman/.claude/generic-react-code-reviewer/badge)](https://verified-skill.com/skills/travisjneuman/.claude/generic-react-code-reviewer)

Something wrong with this skill or its page? Tell us.