docs-consistency-checker

Validate consistency across SEED Design component documentation layers (design guidelines in ./docs/content/docs/components, Rootage specs in ./packages/rootage/components, and React docs in ./docs/content/react/components). Use when auditing documentation completeness, before releases, or validating new component docs.

allowed_tools: Read, Grep, Glob

$ Installieren

git clone https://github.com/daangn/seed-design /tmp/seed-design && cp -r /tmp/seed-design/.claude/skills/docs-consistency-checker ~/.claude/skills/seed-design

// tip: Run this command in your terminal to install the skill


name: docs-consistency-checker description: Validate consistency across SEED Design component documentation layers (design guidelines in ./docs/content/docs/components, Rootage specs in ./packages/rootage/components, and React docs in ./docs/content/react/components). Use when auditing documentation completeness, before releases, or validating new component docs. allowed-tools: Read, Grep, Glob

Documentation Consistency Checker

Validates consistency across three documentation layers in SEED Design System.

Purpose

์ด ์Šคํ‚ฌ์€ SEED Design System์˜ ๋ฌธ์„œ ๋ ˆ์ด์–ด ๊ฐ„ ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ ๊ฐ€์ด๋“œ๋ผ์ธ, Rootage ์ปดํฌ๋„ŒํŠธ ์ŠคํŽ™, React ๊ตฌํ˜„ ๋ฌธ์„œ๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ถˆ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

When to Use

๋‹ค์Œ ์ƒํ™ฉ์—์„œ ์ด ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

  1. ๋ฆด๋ฆฌ์Šค ์ „ ๊ฐ์‚ฌ: ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค ์ „ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œ ์™„์ „์„ฑ ๊ฒ€์ฆ
  2. ์ƒˆ ์ปดํฌ๋„ŒํŠธ ๊ฒ€ํ† : ์ƒˆ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œ ๋ฐœํ–‰ ์ „ ์ผ๊ด€์„ฑ ํ™•์ธ
  3. ๋ฌธ์„œ ์ •๋ฆฌ: ๊ณ ์•„ ํŒŒ์ผ(orphaned files) ๋ฐ ์˜ค๋ž˜๋œ ๋ฌธ์„œ ์‹๋ณ„
  4. Props ๊ฒ€์ฆ: ์ปดํฌ๋„ŒํŠธ Props๊ฐ€ Rootage ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
  5. ์ •๊ธฐ ๊ฐ์‚ฌ: ์›”๊ฐ„/๋ถ„๊ธฐ๋ณ„ ๋ฌธ์„œ ํ’ˆ์งˆ ์ ๊ฒ€

ํŠธ๋ฆฌ๊ฑฐ ํ‚ค์›Œ๋“œ: "docs consistency", "documentation audit", "validate docs", "check documentation", "pre-release validation"

Documentation Layers

Layer 1: Design Guidelines

  • Path: ./docs/content/docs/components/{component-id}.mdx
  • Purpose: ๋””์ž์ธ ๋ช…์„ธ ๋ฐ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ๋ผ์ธ
  • Key Sections: Props, Anatomy, Guidelines, Spec

Layer 2: Rootage Component Spec

  • Path: ./packages/rootage/components/{component-id}.yaml
  • Purpose: ๊ธฐ์ˆ ์  ์ปดํฌ๋„ŒํŠธ ๋ช…์„ธ
  • Key Data: metadata.id, metadata.name, schema.slots, definitions

Layer 3: React Implementation Docs

  • Path: ./docs/content/react/components/{component-id}.mdx
  • Purpose: React API ๋ฌธ์„œ ๋ฐ ์˜ˆ์‹œ
  • Key Sections: Installation, Props, Examples

Consistency Requirements

1. Component Naming Consistency

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • Design guidelines title โ‰ก Rootage metadata.name
  • React docs title โ‰ก Design guidelines title
  • ๋ชจ๋“  ๋ฌธ์„œ๊ฐ€ ๋™์ผํ•œ ๋Œ€์†Œ๋ฌธ์ž์™€ ํ˜•์‹ ์‚ฌ์šฉ

์˜ˆ์‹œ:

# Rootage YAML
metadata:
  id: action-button
  name: Action Button

# Design Guidelines MDX
---
title: Action Button  # Must match
---

# React Docs MDX
---
title: Action Button  # Must match
---

๊ฒ€์ฆ ๋กœ์ง:

rootage.metadata.name === designDocs.title === reactDocs.title

2. Description Consistency

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • React docs description โ‰ก Design guidelines description
  • ์–‘์ชฝ ๋ชจ๋‘ ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์„ค๋ช… ์ œ๊ณต

์˜ˆ์‹œ:

# Design Guidelines
description: ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์•ก์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

# React Docs - MUST match exactly
description: ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์•ก์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๋กœ์ง:

designDocs.description === reactDocs.description

3. Props/Variants Consistency

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • Design guidelines Props ํ…Œ์ด๋ธ”์ด Rootage YAML definitions๋ฅผ ๋ฐ˜์˜
  • Variants, sizes, states๊ฐ€ YAML์—์„œ ์ถ”์ถœํ•œ ๊ฒƒ๊ณผ ์ผ์น˜

๊ฒ€์ฆ ์›Œํฌํ”Œ๋กœ์šฐ:

  1. Rootage YAML definitions ์ฝ๊ธฐ
  2. Variants (variant=*), sizes (size=*), states (base.*) ์ถ”์ถœ
  3. Design guidelines Props ํ…Œ์ด๋ธ”๊ณผ ๋น„๊ต
  4. ๋ถˆ์ผ์น˜ ๋˜๋Š” ๋ˆ„๋ฝ๋œ ๋ฌธ์„œํ™” ํ”Œ๋ž˜๊ทธ

์˜ˆ์‹œ:

# Rootage defines
definitions:
  variant=brandSolid: {...}
  variant=neutralSolid: {...}
  size=medium: {...}
  size=large: {...}

# Design guidelines MUST document
| ์†์„ฑ    | ๊ฐ’                              |
| variant | brand solid, neutral solid      |  # Must match YAML
| size    | medium, large                   |  # Must match YAML

๊ฒ€์ฆ ๋กœ์ง:

extractedPropsFromYAML โІ documentedPropsั–ะฝDesignDocs
// Documented props should cover all YAML-defined props

4. Component ID Consistency

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • <PlatformStatusTable componentId="X" /> โ‰ก Rootage metadata.id
  • <ComponentSpecBlock id="X" /> โ‰ก Rootage metadata.id

์˜ˆ์‹œ:

# Design Guidelines
<PlatformStatusTable componentId="action-button" />  # Must match metadata.id
<ComponentSpecBlock id="action-button" />             # Must match metadata.id

๊ฒ€์ฆ ๋กœ์ง:

<PlatformStatusTable componentId="X" /> where X === rootage.metadata.id
<ComponentSpecBlock id="X" /> where X === rootage.metadata.id

5. Slot/Part Documentation

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • Design guidelines์—์„œ Rootage schema์˜ ์ฃผ์š” slots ์–ธ๊ธ‰
  • Anatomy ์„น์…˜์ด ์ฃผ์š” ์•„ํ‚คํ…์ฒ˜ parts ์ปค๋ฒ„

์˜ˆ์‹œ:

# Rootage defines
schema:
  slots:
    root: {...}
    label: {...}
    icon: {...}
    prefixIcon: {...}
    suffixIcon: {...}

# Design guidelines should explain:
- Icon usage (prefixIcon, suffixIcon, icon-only layout)
- Label positioning
- Root container behavior

๊ฒ€์ฆ ๊ธฐ์ค€:

  • ๋ชจ๋“  ์ฃผ์š” slots๊ฐ€ ๋ฌธ์„œ์— ์–ธ๊ธ‰๋˜๋Š”์ง€ ํ™•์ธ
  • Anatomy ๋˜๋Š” Props ์„น์…˜์—์„œ ์„ค๋ช… ํ™•์ธ

6. File Existence Check

๊ฒ€์ฆ ํ•ญ๋ชฉ:

  • Rootage YAML ์กด์žฌ โ†’ Design guidelines ์กด์žฌํ•ด์•ผ ํ•จ
  • Design guidelines ์กด์žฌ โ†’ React docs ์กด์žฌํ•ด์•ผ ํ•จ
  • ๊ณ ์•„ ํŒŒ์ผ ํ”Œ๋ž˜๊ทธ

Coverage Matrix:

Component ID | Rootage YAML | Design Docs | React Docs | Status
-------------|--------------|-------------|-----------|-------
action-button|      โœ“       |      โœ“      |     โœ“     | Complete
checkbox     |      โœ“       |      โœ“      |     โœ“     | Complete
new-comp     |      โœ“       |      โœ—      |     โœ—     | Missing docs

Workflow

Step 1: Discovery

์ปดํฌ๋„ŒํŠธ ์ธ๋ฒคํ† ๋ฆฌ ๊ตฌ์ถ•:

1. Glob all Rootage YAML files: packages/rootage/components/*.yaml
2. Extract component IDs from metadata.id
3. Build component inventory

๋„๊ตฌ ์‚ฌ์šฉ:

// Glob to find all YAML files
const yamlFiles = await glob('packages/rootage/components/*.yaml')

// Read each file and extract metadata.id
for (const file of yamlFiles) {
  const content = await read(file)
  const yaml = parseYAML(content)
  const componentId = yaml.metadata.id
  inventory.push(componentId)
}

Step 2: Cross-Reference Check

๊ฐ ์ปดํฌ๋„ŒํŠธ ID์— ๋Œ€ํ•ด ํŒŒ์ผ ์กด์žฌ ํ™•์ธ:

For each component ID:
  1. Check existence:
     - docs/content/docs/components/{id}.mdx
     - docs/content/react/components/{id}.mdx
  2. Flag missing files

๋„๊ตฌ ์‚ฌ์šฉ:

for (const id of inventory) {
  const designDocsPath = `docs/content/docs/components/${id}.mdx`
  const reactDocsPath = `docs/content/react/components/${id}.mdx`

  const designExists = await fileExists(designDocsPath)
  const reactExists = await fileExists(reactDocsPath)

  if (!designExists) issues.push({ id, type: 'missing_design_docs' })
  if (!reactExists) issues.push({ id, type: 'missing_react_docs' })
}

Step 3: Content Validation

์™„์ „ํ•œ ์„ธํŠธ(YAML + Design + React)์— ๋Œ€ํ•ด ๋‚ด์šฉ ๊ฒ€์ฆ:

For each complete set:
  1. Read all three files
  2. Extract metadata:
     - Names (title, metadata.name)
     - Descriptions
     - Props/variants/sizes
     - Component references (componentId, id)
  3. Compare values
  4. Report inconsistencies

๋„๊ตฌ ์‚ฌ์šฉ:

// Read files
const yamlContent = await read(yamlPath)
const designContent = await read(designPath)
const reactContent = await read(reactPath)

// Parse frontmatter
const designFrontmatter = parseFrontmatter(designContent)
const reactFrontmatter = parseFrontmatter(reactContent)

// Compare names
if (yaml.metadata.name !== designFrontmatter.title) {
  issues.push({
    id,
    type: 'name_mismatch',
    expected: yaml.metadata.name,
    actual: designFrontmatter.title
  })
}

// Compare descriptions
if (designFrontmatter.description !== reactFrontmatter.description) {
  issues.push({
    id,
    type: 'description_mismatch',
    design: designFrontmatter.description,
    react: reactFrontmatter.description
  })
}

Step 4: Props Deep Validation

Props ์ƒ์„ธ ๊ฒ€์ฆ:

For each component:
  1. Parse Rootage YAML definitions
  2. Extract:
     - Variants: keys matching "variant="
     - Sizes: keys matching "size="
     - States: base.* keys
  3. Read design guidelines Props table
  4. Compare extracted vs documented
  5. Flag missing or extra props

๋„๊ตฌ ์‚ฌ์šฉ:

// Extract props from YAML
const definitions = yaml.data.definitions
const variants = Object.keys(definitions)
  .filter(key => key.startsWith('variant='))
  .map(key => key.replace('variant=', ''))

const sizes = Object.keys(definitions)
  .filter(key => key.startsWith('size='))
  .map(key => key.replace('size=', ''))

const states = Object.keys(definitions.base || {})

// Extract props from design docs (using Grep)
const propsTableMatch = await grep({
  pattern: '\\| variant\\s+\\|.*\\|',
  path: designPath,
  output_mode: 'content'
})

// Parse table and compare
const documentedVariants = parsePropsTable(propsTableMatch)

const missingVariants = variants.filter(v => !documentedVariants.includes(v))
if (missingVariants.length > 0) {
  issues.push({
    id,
    type: 'missing_variants',
    missing: missingVariants
  })
}

Step 5: Component ID Validation

Design guidelines์—์„œ ์ปดํฌ๋„ŒํŠธ ID ์ฐธ์กฐ ํ™•์ธ:

// Check PlatformStatusTable componentId
const platformStatusMatch = await grep({
  pattern: '<PlatformStatusTable componentId="([^"]+)"',
  path: designPath,
  output_mode: 'content'
})

const extractedId = extractComponentId(platformStatusMatch)
if (extractedId !== yaml.metadata.id) {
  issues.push({
    id,
    type: 'platform_status_id_mismatch',
    expected: yaml.metadata.id,
    actual: extractedId
  })
}

// Check ComponentSpecBlock id
const specBlockMatch = await grep({
  pattern: '<ComponentSpecBlock id="([^"]+)"',
  path: designPath,
  output_mode: 'content'
})

const specId = extractComponentId(specBlockMatch)
if (specId !== yaml.metadata.id) {
  issues.push({
    id,
    type: 'spec_block_id_mismatch',
    expected: yaml.metadata.id,
    actual: specId
  })
}

Step 6: Report Generation

๊ฒ€์ฆ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž ์นœํ™”์  ๋ฆฌํฌํŠธ๋กœ ์ƒ์„ฑ:

# Consistency Report

## Summary
- Total components: 28
- Fully consistent: 22
- Issues found: 6

## Issues

### Critical (Must Fix)
1. **badge**: Design docs missing Props table
2. **chip**: Description mismatch between design/react docs

### Warnings (Review)
1. **avatar**: Rootage defines size=xlarge but design docs don't document it
2. **callout**: ComponentSpecBlock id="callouts" (should be "callout")

### Missing Documentation
1. **divider**: Has YAML, missing design guidelines
2. **dialog**: Has YAML, missing React docs

## Recommendations
{Actionable fixes with file paths and specific changes}

Usage Scenarios

Scenario 1: Full Audit

์‚ฌ์šฉ์ž ์š”์ฒญ:

"Run docs consistency checker on all components"

์‹คํ–‰ ๊ณผ์ •:

  1. ๋ชจ๋“  Rootage YAML ํŒŒ์ผ ๊ฒ€์ƒ‰
  2. ๊ฐ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด 6๊ฐ€์ง€ ๊ฒ€์ฆ ํ•ญ๋ชฉ ์‹คํ–‰
  3. Comprehensive ๋ฆฌํฌํŠธ ์ƒ์„ฑ

Scenario 2: Single Component

์‚ฌ์šฉ์ž ์š”์ฒญ:

"Check docs consistency for action-button"

์‹คํ–‰ ๊ณผ์ •:

  1. action-button์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒ€์ฆ
  2. Detailed ๋ชจ๋“œ๋กœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

Scenario 3: Focus on Missing Docs

์‚ฌ์šฉ์ž ์š”์ฒญ:

"Find components with missing documentation"

์‹คํ–‰ ๊ณผ์ •:

  1. ํŒŒ์ผ ์กด์žฌ ํ™•์ธ๋งŒ ์‹คํ–‰ (Step 2)
  2. ๋ˆ„๋ฝ๋œ ๋ฌธ์„œ ๋ชฉ๋ก ์ถœ๋ ฅ

Scenario 4: Props Validation

์‚ฌ์šฉ์ž ์š”์ฒญ:

"Validate that all component props match Rootage specs"

์‹คํ–‰ ๊ณผ์ •:

  1. Props ๊ฒ€์ฆ๋งŒ ์‹คํ–‰ (Step 4)
  2. ๋ถˆ์ผ์น˜ํ•˜๋Š” props ๋ชฉ๋ก ์ถœ๋ ฅ

Output Formats

Compact Mode (default)

๊ฐ„๋‹จํ•œ ์ƒํƒœ ์š”์•ฝ:

โœ… action-button - Fully consistent
โš ๏ธ  checkbox - Warning: Description differs slightly
โŒ badge - Critical: Missing Props table
๐Ÿ“‹ divider - Missing: Design guidelines not found

์ƒํƒœ ์•„์ด์ฝ˜:

  • โœ… Fully consistent: ๋ชจ๋“  ๊ฒ€์ฆ ํ†ต๊ณผ
  • โš ๏ธ Warning: ๊ฒฝ๋ฏธํ•œ ๋ถˆ์ผ์น˜, ๊ฒ€ํ†  ํ•„์š”
  • โŒ Critical: ์ค‘์š”ํ•œ ๋ฌธ์ œ, ์ฆ‰์‹œ ์ˆ˜์ • ํ•„์š”
  • ๐Ÿ“‹ Missing: ํŒŒ์ผ ๋ˆ„๋ฝ

Detailed Mode (--verbose)

์ƒ์„ธํ•œ ๊ฒ€์ฆ ๊ฒฐ๊ณผ:

## action-button
Status: โœ… Fully consistent

Checks performed:
- โœ… Name consistency (Action Button)
- โœ… Description matches
- โœ… Props table matches YAML (6/6 props documented)
- โœ… Component IDs correct
- โœ… All files exist

## checkbox
Status: โš ๏ธ  Warning

Checks performed:
- โœ… Name consistency (Checkbox)
- โš ๏ธ  Description differs:
  - Design: "์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”..."
  - React:  "์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”..."
  - Diff: Extra text in react docs
- โœ… Props table matches YAML
- โœ… Component IDs correct
- โœ… All files exist

Recommendation: Align descriptions in both files

Summary Report

์ „์ฒด ํ”„๋กœ์ ํŠธ ์ƒํƒœ:

# SEED Design Documentation Consistency Report
Generated: 2025-01-21

## Overall Status
- Total Components: 58
- Fully Consistent: 48 (82.8%)
- With Warnings: 6 (10.3%)
- Critical Issues: 2 (3.4%)
- Missing Docs: 2 (3.4%)

## Critical Issues (Must Fix Immediately)

### 1. badge
**Issue**: Design docs missing Props table
**Impact**: Users cannot understand component options
**Fix**: Add Props table to `/docs/content/docs/components/badge.mdx`

### 2. chip
**Issue**: Description mismatch
**Details**:
- Design: "์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์„ ํƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค."
- React: "์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค."
**Fix**: Align descriptions in both files

## Warnings (Review Soon)

### 1. avatar
**Issue**: Missing variant documentation
**Details**: Rootage defines `size=xlarge` but design docs only show small, medium, large
**Fix**: Add xlarge size to Props table

### 2. callout
**Issue**: ComponentSpecBlock ID typo
**Details**: Uses `id="callouts"` but should be `id="callout"`
**Fix**: Change ComponentSpecBlock id in design docs

## Missing Documentation

### 1. divider
**Missing**: Design guidelines
**Path**: `/docs/content/docs/components/divider.mdx`
**Status**: Rootage YAML exists, React docs exist

### 2. dialog
**Missing**: React documentation
**Path**: `/docs/content/react/components/dialog.mdx`
**Status**: Rootage YAML exists, design docs exist

## Recommendations

1. **Immediate Actions** (Critical):
   - Fix badge Props table
   - Align chip descriptions

2. **This Week** (Warnings):
   - Document avatar xlarge size
   - Fix callout ComponentSpecBlock ID

3. **This Sprint** (Missing Docs):
   - Create divider design guidelines
   - Write dialog React documentation

## Next Steps

1. Assign issues to owners
2. Create tracking tasks
3. Re-run validation after fixes
4. Schedule regular monthly audits

Validation Rules

Rule 1: Exact Name Match

rootage.metadata.name === designDocs.title === reactDocs.title

Rule 2: Exact Description Match

designDocs.description === reactDocs.description

Rule 3: Props Coverage

extractedPropsFromYAML โІ documentedPropsInDesignDocs
// Documented props should cover all YAML-defined props

Rule 4: Component ID Match

<PlatformStatusTable componentId="X" /> where X === rootage.metadata.id
<ComponentSpecBlock id="X" /> where X === rootage.metadata.id

Rule 5: File Completeness

if (rootageYAML.exists()) {
  designDocs.shouldExist() // Warning if missing
  reactDocs.shouldExist()  // Info if missing (may be WIP)
}

Implementation Guidelines

Tool Usage

Read:

  • YAML ํŒŒ์ผ ํŒŒ์‹ฑ
  • MDX frontmatter ์ถ”์ถœ
  • ํŒŒ์ผ ์กด์žฌ ํ™•์ธ

Grep:

  • Props ํ…Œ์ด๋ธ” ์ถ”์ถœ
  • Component ID ์ฐธ์กฐ ์ฐพ๊ธฐ
  • ํŠน์ • ํŒจํ„ด ๊ฒ€์ƒ‰

Glob:

  • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ YAML ํŒŒ์ผ ์ฐพ๊ธฐ
  • ๋ฌธ์„œ ํŒŒ์ผ ๋ชฉ๋ก ์ƒ์„ฑ

Error Handling

try {
  const content = await read(filePath)
} catch (error) {
  if (error.code === 'ENOENT') {
    issues.push({ type: 'file_not_found', path: filePath })
  } else {
    throw error
  }
}

Performance

  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ: ๋…๋ฆฝ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๊ฒ€์ฆ์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰
  • ์บ์‹ฑ: ๋™์ผ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์ง€ ์•Š๋„๋ก ์บ์‹ฑ
  • ์กฐ๊ธฐ ์ข…๋ฃŒ: Critical ๋ฌธ์ œ ๋ฐœ๊ฒฌ ์‹œ ์ฆ‰์‹œ ๋ณด๊ณ  (์„ ํƒ์ )

Extensibility

Future Enhancements

  1. ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ๊ฒ€์ฆ:

    • Design guidelines์—์„œ ์ฐธ์กฐํ•˜๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
    • ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด WebP ํฌ๋งท์ธ์ง€ ๊ฒ€์ฆ
  2. ์˜ˆ์‹œ ์ฝ”๋“œ ๊ฒ€์ฆ:

    • React ์˜ˆ์‹œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ props ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธ
    • ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์ฆ
  3. ์ ‘๊ทผ์„ฑ ๊ฒ€์‚ฌ:

    • Design docs์—์„œ a11y ๊ธฐ๋Šฅ ์–ธ๊ธ‰ ํ™•์ธ
    • ARIA attributes ๋ฌธ์„œํ™” ๊ฒ€์ฆ
  4. ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ๊ฒ€์ฆ:

    • ํ•œ๊ตญ์–ด ์„ค๋ช… ์ผ๊ด€์„ฑ ํ™•์ธ
    • ๋ฒˆ์—ญ ํ’ˆ์งˆ ๊ฒ€์‚ฌ

Checklist

๊ฒ€์ฆ ์‹คํ–‰ ์ „ ํ™•์ธ ์‚ฌํ•ญ:

  • ๋ชจ๋“  Rootage YAML ํŒŒ์ผ์ด ์ตœ์‹  ์ƒํƒœ์ธ๊ฐ€?
  • Git ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊นจ๋—ํ•œ๊ฐ€? (์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์—†์Œ)
  • ๊ฒ€์ฆ ๋ฒ”์œ„๊ฐ€ ๋ช…ํ™•ํ•œ๊ฐ€? (์ „์ฒด vs ํŠน์ • ์ปดํฌ๋„ŒํŠธ)
  • ์ถœ๋ ฅ ํ˜•์‹์ด ๊ฒฐ์ •๋˜์—ˆ๋Š”๊ฐ€? (Compact vs Detailed)

๊ฒ€์ฆ ์‹คํ–‰ ํ›„ ํ™•์ธ ์‚ฌํ•ญ:

  • Critical ์ด์Šˆ๊ฐ€ ๋ชจ๋‘ ๋ฌธ์„œํ™”๋˜์—ˆ๋Š”๊ฐ€?
  • ๊ฐ ์ด์Šˆ์— ์ˆ˜์ • ๋ฐฉ๋ฒ•์ด ๋ช…์‹œ๋˜์—ˆ๋Š”๊ฐ€?
  • ์ด์Šˆ๊ฐ€ tracking ์‹œ์Šคํ…œ์— ๋“ฑ๋ก๋˜์—ˆ๋Š”๊ฐ€?
  • ๋‹ด๋‹น์ž๊ฐ€ ํ• ๋‹น๋˜์—ˆ๋Š”๊ฐ€?
  • ๋‹ค์Œ ๊ฒ€์ฆ ์ผ์ •์ด ๊ณ„ํš๋˜์—ˆ๋Š”๊ฐ€?

Reference

์œ ์‚ฌ ๋„๊ตฌ:

  • ESLint (์ฝ”๋“œ ์ผ๊ด€์„ฑ ๊ฒ€์‚ฌ)
  • Vale (๋ฌธ์„œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ)
  • markdownlint (Markdown ๊ทœ์น™ ๊ฒ€์‚ฌ)

SEED Design ๋ฌธ์„œ ๋ ˆ์ด์–ด:

  • Design Guidelines: ๋””์ž์ธ ์›์น™๊ณผ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ
  • Rootage Spec: ๊ธฐ์ˆ ์  ๋ช…์„ธ์™€ ์Šคํƒ€์ผ ์ •์˜
  • React Docs: ๊ตฌํ˜„ API์™€ ์‚ฌ์šฉ ์˜ˆ์‹œ

Tips

  1. ์ •๊ธฐ ์‹คํ–‰:

    • ๋ฆด๋ฆฌ์Šค ์ „ ํ•„์ˆ˜ ์‹คํ–‰
    • ์›”๊ฐ„ ์ •๊ธฐ ๊ฐ์‚ฌ ์ผ์ • ์ˆ˜๋ฆฝ
    • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ ๊ณ ๋ ค
  2. ์ ์ง„์  ๊ฐœ์„ :

    • Critical ์ด์Šˆ ๋จผ์ € ํ•ด๊ฒฐ
    • Warning์€ ์Šคํ”„๋ฆฐํŠธ ๊ณ„ํš์— ํฌํ•จ
    • Missing docs๋Š” ๋ฐฑ๋กœ๊ทธ์— ์ถ”๊ฐ€
  3. ์ž๋™ํ™”:

    • GitHub Actions๋กœ PR ์‹œ ์ž๋™ ๊ฒ€์ฆ
    • Slack/Discord๋กœ ์ด์Šˆ ์•Œ๋ฆผ
    • Dashboard๋กœ ์‹œ๊ฐํ™”
  4. ๋ฌธ์„œ ํ’ˆ์งˆ:

    • ๊ฒ€์ฆ ํ†ต๊ณผ๊ฐ€ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹˜
    • ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ๋ช…ํ™•์„ฑ์ด ์šฐ์„ 
    • ์ผ๊ด€์„ฑ์€ ์ˆ˜๋‹จ, ํ’ˆ์งˆ์€ ๋ชฉ์ 
  5. ํŒ€ ํ˜‘์—…:

    • ๊ฒ€์ฆ ๊ฒฐ๊ณผ๋ฅผ ํŒ€๊ณผ ๊ณต์œ 
    • ๋ฌธ์ œ ํŒจํ„ด ๋ถ„์„ ๋ฐ ๊ฐœ์„ 
    • ๋ฌธ์„œ ์ž‘์„ฑ ๊ฐ€์ด๋“œ ์—…๋ฐ์ดํŠธ