옵션
집 Skill 웹 개발 coding-standards

명명 규칙, 가독성, 불변성 및 코드 품질 검토에 관한 프로젝트 간 기본 코딩 규칙. 프레임워크별 패턴을 적용할 때는 세부적인 프론트엔드 또는 백엔드 기술을 활용하십시오.

...모든 것을 확장하십시오
55
업데이트 된 시간 2026년 6월 29일

소개 coding-standards

coding-standards 특정 워크플로우에 초점을 맞춘 재사용 가능한 AI 스킬입니다. 이름: coding-standards

이 스킬은 지침, 규칙 및 작업별 안내를 종합하여 에이전트가 업무를 보다 일관성 있게 수행할 수 있도록 지원합니다. 설명: 명명 규칙, 가독성, 불변성 및 코드 품질 검토에 대한 프로젝트 간 공통 코딩 규칙입니다. 프레임워크별 패턴에 대해서는 상세한 프론트엔드 또는 백엔드 스킬을 활용하십시오. 이 스킬은 프로젝트 전반에 적용 가능한 기본 코딩 규칙을 제공합니다. 이 스킬은 세부적인 프레임워크 가이드라인이 아닌, 공통적으로 준수해야 할 최소 기준입니다.

실제로 이 스킬은 설정 단계가 적고 모호성이 적은 상태에서 반복적으로 작업을 수행해야 하는 사용자에게 가장 적합합니다. - React, 상태 관리, 폼, 렌더링 및 UI 아키텍처에 대해서는 `frontend-patterns`를 사용하세요. - 리포지토리/서비스 계층, 엔드포인트 설계, 유효성 검사 및 서버 관련 사항에는 `backend-patterns` 또는 `api-design`을 사용하세요. - 전체 스킬 안내 대신 재사용 가능한 가장 간결한 규칙 계층이 필요할 때는 `rules/common/coding-style.md`를 사용하세요. - 새로운 프로젝트 또는 모듈 시작 시

자주 묻는 질문

coding-standards 는 어떤 도움을 주나요?

coding-standards 에이전트가 소스 문서에 설명된 집중적인 워크플로를 따르도록 도와주어, 모호성을 줄이고 실행이 의도된 작업과 일치하도록 유지합니다.

이 스킬은 언제 사용해야 하나요?

작업이 스킬 문서에 설명된 워크플로, 도메인 또는 운영 규칙과 일치할 때, 특히 일관된 실행이 중요한 경우에 사용하십시오.

주요 제한 사항은 무엇인가요?

이 스킬은 원본 지침의 품질과 범위에 제약을 받습니다. 기본 문서가 불완전한 경우, 상담원이 추가적인 맥락 정보나 수동 검증이 필요할 수 있습니다.

GitHub에서 보기

Coding Standards & Best Practices

Baseline coding conventions applicable across projects.

This skill is the shared floor, not the detailed framework playbook.

  • Use frontend-patterns for React, state, forms, rendering, and UI architecture.
  • Use backend-patterns or api-design for repository/service layers, endpoint design, validation, and server-specific concerns.
  • Use rules/common/coding-style.md when you need the shortest reusable rule layer instead of a full skill walkthrough.

When to Activate

  • Starting a new project or module
  • Reviewing code for quality and maintainability
  • Refactoring existing code to follow conventions
  • Enforcing naming, formatting, or structural consistency
  • Setting up linting, formatting, or type-checking rules
  • Onboarding new contributors to coding conventions

Scope Boundaries

Activate this skill for:

  • descriptive naming
  • immutability defaults
  • readability, KISS, DRY, and YAGNI enforcement
  • error-handling expectations and code-smell review

Do not use this skill as the primary source for:

  • React composition, hooks, or rendering patterns
  • backend architecture, API design, or database layering
  • domain-specific framework guidance when a narrower ECC skill already exists

Code Quality Principles

1. Readability First

  • Code is read more than written
  • Clear variable and function names
  • Self-documenting code preferred over comments
  • Consistent formatting

2. KISS (Keep It Simple, Stupid)

  • Simplest solution that works
  • Avoid over-engineering
  • No premature optimization
  • Easy to understand > clever code

3. DRY (Don't Repeat Yourself)

  • Extract common logic into functions
  • Create reusable components
  • Share utilities across modules
  • Avoid copy-paste programming

4. YAGNI (You Aren't Gonna Need It)

  • Don't build features before they're needed
  • Avoid speculative generality
  • Add complexity only when required
  • Start simple, refactor when needed

TypeScript/JavaScript Standards

Variable Naming

// PASS: GOOD: Descriptive namesconst marketSearchQuery = 'election'const isUserAuthenticated = trueconst totalRevenue = 1000// FAIL: BAD: Unclear namesconst q = 'election'const flag = trueconst x = 1000

Function Naming

// PASS: GOOD: Verb-noun patternasync function fetchMarketData(marketId: string) { }function calculateSimilarity(a: number[], b: number[]) { }function isValidEmail(email: string): boolean { }// FAIL: BAD: Unclear or noun-onlyasync function market(id: string) { }function similarity(a, b) { }function email(e) { }

Immutability Pattern (CRITICAL)

// PASS: ALWAYS use spread operatorconst updatedUser = {  ...user,  name: 'New Name'}const updatedArray = [...items, newItem]// FAIL: NEVER mutate directlyuser.name = 'New Name'  // BADitems.push(newItem)     // BAD

Error Handling

// PASS: GOOD: Comprehensive error handlingasync function fetchData(url: string) {  try {    const response = await fetch(url)    if (!response.ok) {      throw new Error(`HTTP ${response.status}: ${response.statusText}`)    }    return await response.json()  } catch (error) {    console.error('Fetch failed:', error)    throw new Error('Failed to fetch data')  }}// FAIL: BAD: No error handlingasync function fetchData(url) {  const response = await fetch(url)  return response.json()}

Async/Await Best Practices

// PASS: GOOD: Parallel execution when possibleconst [users, markets, stats] = await Promise.all([  fetchUsers(),  fetchMarkets(),  fetchStats()])// FAIL: BAD: Sequential when unnecessaryconst users = await fetchUsers()const markets = await fetchMarkets()const stats = await fetchStats()

Type Safety

// PASS: GOOD: Proper typesinterface Market {  id: string  name: string  status: 'active' | 'resolved' | 'closed'  created_at: Date}function getMarket(id: string): Promise<Market> {  // Implementation}// FAIL: BAD: Using 'any'function getMarket(id: any): Promise<any> {  // Implementation}

React Best Practices

Component Structure

// PASS: GOOD: Functional component with typesinterface ButtonProps {  children: React.ReactNode  onClick: () => void  disabled?: boolean  variant?: 'primary' | 'secondary'}export function Button({  children,  onClick,  disabled = false,  variant = 'primary'}: ButtonProps) {  return (    <button      onClick={onClick}      disabled={disabled}      className={`btn btn-${variant}`}    >      {children}    </button>  )}// FAIL: BAD: No types, unclear structureexport function Button(props) {  return <button onClick={props.onClick}>{props.children}</button>}

Custom Hooks

// PASS: GOOD: Reusable custom hookexport function useDebounce<T>(value: T, delay: number): T {  const [debouncedValue, setDebouncedValue] = useState<T>(value)  useEffect(() => {    const handler = setTimeout(() => {      setDebouncedValue(value)    }, delay)    return () => clearTimeout(handler)  }, [value, delay])  return debouncedValue}// Usageconst debouncedQuery = useDebounce(searchQuery, 500)

State Management

// PASS: GOOD: Proper state updatesconst [count, setCount] = useState(0)// Functional update for state based on previous statesetCount(prev => prev + 1)// FAIL: BAD: Direct state referencesetCount(count + 1)  // Can be stale in async scenarios

Conditional Rendering

// PASS: GOOD: Clear conditional rendering{isLoading && <Spinner />}{error && <ErrorMessage error={error} />}{data && <DataDisplay data={data} />}// FAIL: BAD: Ternary hell{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}

API Design Standards

REST API Conventions

GET    /api/markets              # List all marketsGET    /api/markets/:id          # Get specific marketPOST   /api/markets              # Create new marketPUT    /api/markets/:id          # Update market (full)PATCH  /api/markets/:id          # Update market (partial)DELETE /api/markets/:id          # Delete market# Query parameters for filteringGET /api/markets?status=active&limit=10&offset=0

Response Format

// PASS: GOOD: Consistent response structureinterface ApiResponse<T> {  success: boolean  data?: T  error?: string  meta?: {    total: number    page: number    limit: number  }}// Success responsereturn NextResponse.json({  success: true,  data: markets,  meta: { total: 100, page: 1, limit: 10 }})// Error responsereturn NextResponse.json({  success: false,  error: 'Invalid request'}, { status: 400 })

Input Validation

import { z } from 'zod'// PASS: GOOD: Schema validationconst CreateMarketSchema = z.object({  name: z.string().min(1).max(200),  description: z.string().min(1).max(2000),  endDate: z.string().datetime(),  categories: z.array(z.string()).min(1)})export async function POST(request: Request) {  const body = await request.json()  try {    const validated = CreateMarketSchema.parse(body)    // Proceed with validated data  } catch (error) {    if (error instanceof z.ZodError) {      return NextResponse.json({        success: false,        error: 'Validation failed',        details: error.errors      }, { status: 400 })    }  }}

File Organization

Project Structure

src/├── app/                    # Next.js App Router│   ├── api/               # API routes│   ├── markets/           # Market pages│   └── (auth)/           # Auth pages (route groups)├── components/            # React components│   ├── ui/               # Generic UI components│   ├── forms/            # Form components│   └── layouts/          # Layout components├── hooks/                # Custom React hooks├── lib/                  # Utilities and configs│   ├── api/             # API clients│   ├── utils/           # Helper functions│   └── constants/       # Constants├── types/                # TypeScript types└── styles/              # Global styles

File Naming

components/Button.tsx          # PascalCase for componentshooks/useAuth.ts              # camelCase with 'use' prefixlib/formatDate.ts             # camelCase for utilitiestypes/market.types.ts         # camelCase with .types suffix

Comments & Documentation

When to Comment

// PASS: GOOD: Explain WHY, not WHAT// Use exponential backoff to avoid overwhelming the API during outagesconst delay = Math.min(1000 * Math.pow(2, retryCount), 30000)// Deliberately using mutation here for performance with large arraysitems.push(newItem)// FAIL: BAD: Stating the obvious// Increment counter by 1count++// Set name to user's namename = user.name

JSDoc for Public APIs

/** * Searches markets using semantic similarity. * * @param query - Natural language search query * @param limit - Maximum number of results (default: 10) * @returns Array of markets sorted by similarity score * @throws {Error} If OpenAI API fails or Redis unavailable * * @example * ```typescript * const results = await searchMarkets('election', 5) * console.log(results[0].name) // "Trump vs Biden" * ``` */export async function searchMarkets(  query: string,  limit: number = 10): Promise<Market[]> {  // Implementation}

Performance Best Practices

Memoization

import { useMemo, useCallback } from 'react'// PASS: GOOD: Memoize expensive computations// Copy before sorting - Array.prototype.sort mutates in placeconst sortedMarkets = useMemo(() => {  return [...markets].sort((a, b) => b.volume - a.volume)}, [markets])// PASS: GOOD: Memoize callbacksconst handleSearch = useCallback((query: string) => {  setSearchQuery(query)}, [])

Lazy Loading

import { lazy, Suspense } from 'react'// PASS: GOOD: Lazy load heavy componentsconst HeavyChart = lazy(() => import('./HeavyChart'))export function Dashboard() {  return (    <Suspense fallback={<Spinner />}>      <HeavyChart />    </Suspense>  )}

Database Queries

// PASS: GOOD: Select only needed columnsconst { data } = await supabase  .from('markets')  .select('id, name, status')  .limit(10)// FAIL: BAD: Select everythingconst { data } = await supabase  .from('markets')  .select('*')

Testing Standards

Test Structure (AAA Pattern)

test('calculates similarity correctly', () => {  // Arrange  const vector1 = [1, 0, 0]  const vector2 = [0, 1, 0]  // Act  const similarity = calculateCosineSimilarity(vector1, vector2)  // Assert  expect(similarity).toBe(0)})

Test Naming

// PASS: GOOD: Descriptive test namestest('returns empty array when no markets match query', () => { })test('throws error when OpenAI API key is missing', () => { })test('falls back to substring search when Redis unavailable', () => { })// FAIL: BAD: Vague test namestest('works', () => { })test('test search', () => { })

Code Smell Detection

Watch for these anti-patterns:

1. Long Functions

// FAIL: BAD: Function > 50 linesfunction processMarketData() {  // 100 lines of code}// PASS: GOOD: Split into smaller functionsfunction processMarketData() {  const validated = validateData()  const transformed = transformData(validated)  return saveData(transformed)}

2. Deep Nesting

// FAIL: BAD: 5+ levels of nestingif (user) {  if (user.isAdmin) {    if (market) {      if (market.isActive) {        if (hasPermission) {          // Do something        }      }    }  }}// PASS: GOOD: Early returnsif (!user) returnif (!user.isAdmin) returnif (!market) returnif (!market.isActive) returnif (!hasPermission) return// Do something

3. Magic Numbers

// FAIL: BAD: Unexplained numbersif (retryCount > 3) { }setTimeout(callback, 500)// PASS: GOOD: Named constantsconst MAX_RETRIES = 3const DEBOUNCE_DELAY_MS = 500if (retryCount > MAX_RETRIES) { }setTimeout(callback, DEBOUNCE_DELAY_MS)

Remember: Code quality is not negotiable. Clear, maintainable code enables rapid development and confident refactoring.

모든 파일

1개 파일

coding-standards 설치

스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

git clone https://github.com/affaan-m/ECC/blob/main/skills/coding-standards/SKILL.md # Copy SKILL.md to your .claude/skills/ directory

복사 복사
빠른 설정: skill 폴더를 .claude/skills/로 복사하면 Claude가 해당 스킬을 자동으로 감지하여 사용합니다.

관련 스킬

github-code-search
업데이트 된 시간 2026년 6월 29일
drizzle-orm
업데이트 된 시간 2026년 6월 29일
clickhouse-io
업데이트 된 시간 2026년 6월 29일
prisma-client-api
업데이트 된 시간 2026년 6월 29일
OR