doing-a-simple-two-sta…
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when writing or modifying React components, planning React features, or working with .jsx/.tsx files - provides modern React patterns with TypeScript, hooks usage, component composition, and common pitfalls to avoid
Claude Code
$ npx -y skills add ed3dai/ed3d-plugins --skill programming-in-react --agent claude-code
Codex
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a codex -y
Cursor
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a cursor -y
Gemini CLI
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a gemini-cli -y
GitHub Copilot
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a github-copilot -y
OpenCode
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a opencode -y
Windsurf
$ npx skills add ed3dai/ed3d-plugins --skill programming-in-react -a windsurf -y
name: programming-in-react description: Use when writing or modifying React components, planning React features, or working with .jsx/.tsx files - provides modern React patterns with TypeScript, hooks usage, component composition, and common pitfalls to avoid user-invocable: false
Modern React development using functional components, hooks, and TypeScript. This skill guides you through React workflows from component creation to testing.
**Core principle:** Components are functions that return UI. State and effects are managed through hooks. Composition over inheritance always.
**REQUIRED SUB-SKILL:** Use ed3d-house-style:howto-code-in-typescript for general TypeScript patterns. This skill covers React-specific TypeScript usage only.
**Functional components only.** Use `interface` for props, avoid `React.FC`:
interface ButtonProps {
label: string;
onClick: () => void;
disabled?: boolean;
}
export function Button({ label, onClick, disabled }: ButtonProps) {
return <button onClick={onClick} disabled={disabled}>{label}</button>;
}**Event typing:** `React.MouseEvent<HTMLButtonElement>`, `React.ChangeEvent<HTMLInputElement>`. Children: `React.ReactNode`.
**useState for simple state:**
const [count, setCount] = useState(0); // Always use functional updates when new state depends on old setCount(prev => prev + 1); // Good setCount(count + 1); // Avoid - can be stale in closures
**useReducer for complex state:** When state has multiple related pieces that update together, or next state depends on previous state in complex ways.
**State management decision framework:** 1. **Local component state?** � useState 2. **Multiple related state updates?** � useReducer 3. **Shared across components?** � Context API or custom hook 4. **Need external library?** � Use codebase-investigator to find existing patterns, or internet-researcher to evaluate options (Zustand, Redux Toolkit, TanStack Query)
**useEffect for external systems only** (API calls, subscriptions, browser APIs). NOT for derived state.
**Critical rules:**
**Common pattern:**
useEffect(() => {
const controller = new AbortController();
fetch('/api/data', { signal: controller.signal })
.then(res => res.json())
.then(data => setData(data));
return () => controller.abort(); // Cleanup
}, []);For comprehensive useEffect guidance (dependencies, cleanup, when NOT to use, debugging), see [useEffect-deep-dive.md](./useEffect-deep-dive.md).
**Children prop:** Use `children: React.ReactNode` for wrapping components.
**Custom hooks:** Extract reusable stateful logic (prefer over duplicating logic in components).
**Compound components:** For complex APIs like `<Select><Select.Option /></Select>`.
**Render props:** When component controls rendering but parent provides template.
**ALWAYS use codebase-investigator first** to find existing test patterns. Common approaches: React Testing Library, Playwright, Cypress.
See [react-testing.md](./react-testing.md) for comprehensive guidance.
Profile before optimizing. Use `useMemo`, `useCallback`, `React.memo` only when measurements show need. React 19 compiler handles most memoization automatically.
| Excuse | Reality | |--------|---------| | "useEffect is fine for derived state" | Calculate derived values directly. useEffect for derived state causes extra renders and bugs. | | "React.FC is the standard way" | Community moved away from React.FC. Use explicit function declarations with typed props. | | "Cleanup doesn't matter for short operations" | Memory leaks are real. Always cleanup subscriptions, timers, and abort fetch requests. | | "Missing dependencies is fine, I know what I'm doing" | Stale closures cause bugs. Always include all dependencies. Fix the root cause, don't lie to the linter. | | "useCallback with all dependencies is correct" | Including state in deps creates new function every render AND stale closures. Use functional setState updates instead. | | "This is Functional Core because it's pure logic" | Hooks with state are Imperative Shell or Mixed. Only pure functions without hooks are Functional Core. | | "Array index as key is fine for static lists" | If list ever reorders, filters, or updates, you'll get bugs. Use stable unique IDs. | | "Mutating state is faster" | React won't detect the change. Always create new objects/arrays. |
| Task | Pattern | |------|---------| | Props | `interface Props {...}; function Comp({ prop }: Props)` | | State update | `setState(prev => newValue)` when depends on current | | Fetch on mount | `useEffect(() => { fetch(...); return cleanup }, [])` | | Derived value | Calculate directly, NOT useEffect | | List render | `{items.map(item => <Item key={item.id} />)}` |
When you see these, refactor before proceeding.
Ed's repo of Claude Code plugins, centered around a research-plan-implement workflow. Only a tiny bit cursed. If you're lucky.
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format,…
Use when creating specialized subagents for Claude Code plugins or the Task tool - covers description writing for…
Use when creating, releasing, or maintaining a Claude Code Plugin Marketplace - covers marketplace.json schema, version…
Use when completing development phases or branches to identify and update CLAUDE.md or AGENTS.md files that may have become stale…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.