How this skill is triggered — by the user, by Claude, or both
Slash command
/syntek-dev-suite:stack-reactThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Last Updated**: 29/12/2025
Last Updated: 29/12/2025 Version: 1.3.1 Maintained By: Development Team Language: British English (en_GB) Timezone: Europe/London
| Layer | Technology |
|---|---|
| Platform | Raw Docker (Node environment) |
| Framework | React 18+, TypeScript |
| Build | Vite |
| Styling | Tailwind CSS |
| Testing | Vitest, React Testing Library |
| Task | Command |
|---|---|
| Start environment | docker compose up |
| Start (detached) | docker compose up -d |
| Stop environment | docker compose down |
| Install packages | docker compose run --rm app npm install |
| Add package | docker compose run --rm app npm install <package> |
| Run tests | docker compose run --rm app npm test |
| Run tests (watch) | docker compose run --rm app npm test -- --watch |
| Build | docker compose run --rm app npm run build |
| Lint | docker compose run --rm app npm run lint |
| Shell | docker compose run --rm app /bin/sh |
React.FC sparingly - prefer explicit return typesinterface UserCardProps {
user: User;
onSelect: (userId: string) => void;
showBadge?: boolean;
}
export function UserCard({ user, onSelect, showBadge = true }: UserCardProps): JSX.Element {
return (
<div className="rounded-lg bg-white p-4 shadow">
<h3 className="text-lg font-semibold">{user.name}</h3>
{showBadge && <Badge status={user.status} />}
<button onClick={() => onSelect(user.id)}>Select</button>
</div>
);
}
| Size | Solution |
|---|---|
| Component-local | useState, useReducer |
| Shared (small app) | Context API |
| Shared (medium app) | Zustand |
| Complex (large app) | Redux Toolkit (only if truly needed) |
@layer componentsuse (e.g., useAuth, useFetch)src/
├── components/
│ ├── ui/ # Generic UI components
│ │ ├── Button.tsx
│ │ └── Modal.tsx
│ └── features/ # Feature-specific components
│ └── UserCard.tsx
├── hooks/
│ ├── useAuth.ts
│ └── useFetch.ts
├── contexts/
│ └── AuthContext.tsx
├── services/
│ └── api.ts # API client
├── types/
│ └── index.ts # Shared TypeScript types
├── utils/
│ └── formatters.ts
├── pages/ # Route pages (if using router)
├── App.tsx
└── main.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { UserCard } from './UserCard';
describe('UserCard', () => {
const mockUser = { id: '1', name: 'Test User', status: 'active' };
it('renders user name', () => {
render(<UserCard user={mockUser} onSelect={vi.fn()} />);
expect(screen.getByText('Test User')).toBeInTheDocument();
});
it('calls onSelect when clicked', () => {
const onSelect = vi.fn();
render(<UserCard user={mockUser} onSelect={onSelect} />);
fireEvent.click(screen.getByRole('button'));
expect(onSelect).toHaveBeenCalledWith('1');
});
});
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub syntek-dev/syntek-dev-suite --plugin syntek-dev-suite