--- name: react lint --- # /react lint - Component Tree Analysis ## Skills to Load - skills/component-patterns.md - skills/typescript-patterns.md - skills/visual-header.md ## Visual Output Display header: `REACT-PLATFORM - Lint` ## Usage ``` /react lint [path] [--fix] [--strict] ``` ## Workflow ### 1. Scan Target - Default path: project root (all `.tsx`, `.ts`, `.jsx`, `.js` files) - If specific path provided, scan only that directory/file - Exclude: `node_modules/`, `dist/`, `build/`, `.next/`, `coverage/` ### 2. Component Structure Analysis Check each component file for: | Check | Severity | Description | |-------|----------|-------------| | Missing prop types | FAIL | Components without TypeScript interface or PropTypes | | Unused props | WARN | Props declared in interface but never used in JSX | | Missing display name | INFO | Components without `displayName` (matters for DevTools) | | Inline function props | WARN | Functions defined inline in JSX (`onClick={() => ...}`) | | Missing key prop | FAIL | List rendering without `key` prop | | Index as key | WARN | Using array index as `key` in dynamic lists | | Large component | WARN | Component exceeds 200 lines (suggest splitting) | | Mixed concerns | WARN | Data fetching + rendering in same component | | Missing error boundary | INFO | Page components without error boundary | ### 3. Hook Analysis Check custom hooks for: | Check | Severity | Description | |-------|----------|-------------| | Missing cleanup | WARN | `useEffect` with subscription/listener but no cleanup return | | Stale closure | WARN | State variables used in effect without being in dependency array | | Conditional hook call | FAIL | Hook called inside condition, loop, or after early return | | Missing dependency | WARN | Values used in effect but missing from dependency array | ### 4. State Management Analysis Check state patterns for: | Check | Severity | Description | |-------|----------|-------------| | Prop drilling | WARN | Same prop passed through 3+ component levels | | Unnecessary state | INFO | State that could be derived from existing state or props | | Multiple setState calls | INFO | Sequential `setState` calls that could be a single update | | Context overuse | WARN | Context provider wrapping entire app for localized state | ### 5. TypeScript Analysis (--strict mode) Additional checks when `--strict` enabled: | Check | Severity | Description | |-------|----------|-------------| | `any` type usage | WARN | Explicit or implicit `any` in component code | | Missing return type | INFO | Components without explicit return type | | Non-null assertion | WARN | Use of `!` operator instead of proper null checking | | Type assertion overuse | WARN | Frequent `as` casts suggesting type design issues | ### 6. Report ``` +----------------------------------------------------------------------+ | REACT-PLATFORM - Lint | | /src/components | +----------------------------------------------------------------------+ Files Scanned: 24 Components Analyzed: 18 Hooks Analyzed: 6 FAIL (2) 1. [src/components/UserList.tsx:45] Missing key prop Found: inside .map() Fix: Add key={user.id} to 2. [src/hooks/useData.ts:12] Conditional hook call Found: if (enabled) { useState(...) } Fix: Move hook before condition, use enabled as guard inside WARN (3) 1. [src/components/Dashboard.tsx] Large component (287 lines) Suggestion: Extract chart section into DashboardCharts component 2. [src/components/Form.tsx:23] Inline function prop Found: onChange={() => setValue(e.target.value)} Suggestion: Extract to named handler function 3. [src/hooks/useWebSocket.ts:18] Missing cleanup Found: useEffect with addEventListener but no removeEventListener Fix: Return cleanup function from useEffect INFO (1) 1. [src/components/Card.tsx] Missing displayName Suggestion: Add Card.displayName = 'Card' SUMMARY Components: 16 clean, 2 with issues Hooks: 5 clean, 1 with issues Anti-patterns: 0 FAIL, 3 WARN, 1 INFO VERDICT: FAIL (2 blocking issues) ``` ## Examples ``` /react lint # Lint entire project /react lint src/components/ # Lint specific directory /react lint src/components/Form.tsx # Lint single file /react lint --strict # Include TypeScript checks /react lint --fix # Auto-fix where possible ```