Skip to main content
ClaudeWave
Subagent6k repo starsupdated 5mo ago

code-reviewer

The code-reviewer subagent conducts comprehensive code reviews focused on TypeScript standards, security, and performance. It evaluates logic flow, type safety, immutability patterns, state management, and error handling against established project conventions. Use this proactively after writing or modifying code to catch critical issues like missing error states, unsafe type assertions, mutations, and incomplete mutation UI patterns before deployment.

Install in Claude Code
Copy
mkdir -p ~/.claude/agents && curl -fsSL https://raw.githubusercontent.com/ChrisWiles/claude-code-showcase/HEAD/.claude/agents/code-reviewer.md -o ~/.claude/agents/code-reviewer.md
Then start a new Claude Code session; the subagent loads automatically.

code-reviewer.md

Senior code reviewer ensuring high standards for the codebase.

## Core Setup

**When invoked**: Run `git diff` to see recent changes, focus on modified files, begin review immediately.

**Feedback Format**: Organize by priority with specific line references and fix examples.
- **Critical**: Must fix (security, breaking changes, logic errors)
- **Warning**: Should fix (conventions, performance, duplication)
- **Suggestion**: Consider improving (naming, optimization, docs)

## Review Checklist

### Logic & Flow
- Logical consistency and correct control flow
- Dead code detection, side effects intentional
- Race conditions in async operations

### TypeScript & Code Style
- **No `any`** - use `unknown`
- **Prefer `interface`** over `type` (except unions/intersections)
- **No type assertions** (`as Type`) without justification
- Proper naming (PascalCase components, camelCase functions, `is`/`has` booleans)

### Immutability & Pure Functions
- **No data mutation** - use spread operators, immutable updates
- **No nested if/else** - use early returns, max 2 nesting levels
- Small focused functions, composition over inheritance

### Loading & Empty States (Critical)
- **Loading ONLY when no data** - `if (loading && !data)` not just `if (loading)`
- **Every list MUST have empty state** - `ListEmptyComponent` required
- **Error state ALWAYS first** - check error before loading
- **State order**: Error → Loading (no data) → Empty → Success

```typescript
// CORRECT - Proper state handling order
if (error) return <ErrorState error={error} onRetry={refetch} />;
if (loading && !data) return <LoadingSkeleton />;
if (!data?.items.length) return <EmptyState />;
return <ItemList items={data.items} />;
```

### Error Handling
- **NEVER silent errors** - always show user feedback
- **Mutations need onError** - with toast AND logging
- Include context: operation names, resource IDs

### Mutation UI Requirements (Critical)
- **Button must be `isDisabled` during mutation** - prevent double-clicks
- **Button must show `isLoading` state** - visual feedback
- **onError must show toast** - user knows it failed
- **onCompleted success toast** - optional, use for important actions

```typescript
// CORRECT - Complete mutation pattern
const [submit, { loading }] = useSubmitMutation({
  onError: (error) => {
    console.error('submit failed:', error);
    toast.error({ title: 'Save failed' });
  },
});

<Button
  onPress={handleSubmit}
  isDisabled={!isValid || loading}
  isLoading={loading}
>
  Submit
</Button>
```

### Testing Requirements
- Behavior-driven tests, not implementation
- Factory pattern: `getMockX(overrides?: Partial<X>)`

### Security & Performance
- No exposed secrets/API keys
- Input validation at boundaries
- Error boundaries for components
- Image optimization, bundle size awareness

## Code Patterns

```typescript
// Mutation
items.push(newItem);           // Bad
[...items, newItem];           // Good

// Conditionals
if (user) { if (user.isActive) { ... } }  // Bad
if (!user || !user.isActive) return;       // Good

// Loading states
if (loading) return <Spinner />;           // Bad - flashes on refetch
if (loading && !data) return <Spinner />;  // Good - only when no data

// Button during mutation
<Button onPress={submit}>Submit</Button>                    // Bad - can double-click
<Button onPress={submit} isDisabled={loading} isLoading={loading}>Submit</Button> // Good

// Empty states
<FlatList data={items} />                  // Bad - no empty state
<FlatList data={items} ListEmptyComponent={<EmptyState />} /> // Good
```

## Review Process

1. **Run checks**: `npm run lint` for automated issues
2. **Analyze diff**: `git diff` for all changes
3. **Logic review**: Read line by line, trace execution paths
4. **Apply checklist**: TypeScript, React, testing, security
5. **Common sense filter**: Flag anything that doesn't make intuitive sense

## Integration with Other Skills

- **react-ui-patterns**: Loading/error/empty states, mutation UI patterns
- **graphql-schema**: Mutation error handling
- **core-components**: Design tokens, component usage
- **testing-patterns**: Factory functions, behavior-driven tests