ワンクリックで
verify-badge-consistency
StatusBadge 사용 일관성 및 뱃지 색상 타입 안전성을 검증합니다. 뱃지/상태 표시 변경 후 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
StatusBadge 사용 일관성 및 뱃지 색상 타입 안전성을 검증합니다. 뱃지/상태 표시 변경 후 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
jh_kim dev 계정(dev Keycloak)으로 E2E API 테스트를 수행하는 스킬입니다. 로컬 main 빌드 API + dev DB + dev Keycloak PKCE 토큰 조합으로, dev API 서버에 아직 배포되지 않은 머지 코드를 실데이터 환경에서 검증할 때 사용합니다. "/e2e-test-dev", "dev 계정으로 E2E", "jh_kim으로 API 테스트", "dev DB로 E2E 테스트" 등을 요청할 때 사용됩니다. (로컬 Docker Keycloak 기반 테스트는 e2e-test 스킬 사용)
plan-master(기획용 FE 코드 + docs/specs 기획서)와 bitda-back(구현된 BE 코드) 사이의 갭을 분석하여 누락된 기능·API·정책을 GitHub 이슈로 자동 생성하는 스킬입니다. 기획서→이슈 전달 과정에서 발생하는 누락을 방지하기 위해 FE 코드를 1차 소스로 사용합니다. "/gap-analyze", "/gap-analyze BOM", "/gap-analyze production" 등을 요청할 때 사용됩니다.
plan-master FE 코드만을 유일한 1차 소스로(기획서 .md 배제) 멀티팀 에이전트가 BE가 보장해야 할 비즈니스 로직과 FE 작업에 필요한 API 항목을 도출하고, 총괄 에이전트가 bitda-back BE 구현과 실측 대조하여 누락 갭을 발굴, 직렬 verifier로 확정한 뒤 GitHub 이슈로 생성하는 스킬입니다. gap-analyze의 변종으로, 기획서가 구현완료를 선언해 갭을 가리는 오염을 제거하기 위해 기획서를 의도적으로 보지 않습니다. /gap-fe-code 생산현황, 기획서 빼고 FE 코드로 갭 분석, FE 코드만 보고 누락 API 이슈 만들어 등을 요청할 때 사용됩니다.
실제 API 서버(8080 포트)를 실행하고 Keycloak OAuth 인증을 통해 E2E API 테스트를 수행하는 스킬입니다. 테스트 결과와 요청/응답을 docs/e2e-test/{test}/ 디렉토리에 markdown 형식으로 기록합니다. 이 스킬은 다음 상황에서 사용됩니다: - 특정 API의 실제 동작을 테스트하고 싶을 때 - API 변경 후 실제 환경에서 검증이 필요할 때 - 사용자가 "E2E 테스트", "API 테스트", "/e2e-test" 등을 요청할 때
Creates phase-based feature plans with quality gates and incremental delivery structure. Use when planning features, organizing work, breaking down tasks, creating roadmaps, or structuring development strategy. Keywords: plan, planning, phases, breakdown, strategy, roadmap, organize, structure, outline.
Swagger 스냅샷(api-docs.json)과 코드베이스를 기반으로 Notion API 맵핑 DB에 API 문서를 등록하고 상세 페이지를 작성하는 스킬입니다. (notion-api.py REST wrapper 사용 버전) 이 스킬은 다음 상황에서 사용됩니다: - 특정 API를 Notion에 문서화할 때 (MCP 비활성화 환경) - mcp__notion__* 도구 deprecated/불안정한 경우 - 사용자가 "api 노션 등록 (api 모드)", "/api-to-notion-api" 등을 요청할 때
| name | verify-badge-consistency |
| description | StatusBadge 사용 일관성 및 뱃지 색상 타입 안전성을 검증합니다. 뱃지/상태 표시 변경 후 사용. |
프로젝트 전체에서 상태 뱃지 사용 패턴의 일관성과 타입 안전성을 검증합니다:
<span> 또는 <Badge>로 상태 표시 금지, 플랫폼 StatusBadge 사용 필수Record<DomainType, BadgeColor>로 정확히 타이핑되었는지 확인| File | Purpose |
|---|---|
packages/web-platform/src/components/StatusBadge.tsx | 플랫폼 StatusBadge 컴포넌트 |
packages/web-platform/src/types/badge.ts | BadgeColor 타입 정의 |
apps/*/src/**/types.ts | 도메인 타입 및 labels Record |
apps/*/src/**/constants.ts | 뱃지 색상 상수 (colors Record) |
검사: StatusBadge가 아닌 raw <span> 또는 <Badge>로 상태/유형을 표시하는 패턴을 감지합니다.
감지 패턴 A: className에 색상 하드코딩된 span/Badge
grep -rn "className=.*bg-\(green\|red\|yellow\|blue\|amber\|gray\|orange\)-\(50\|100\).*text-\(green\|red\|yellow\|blue\|amber\|gray\|orange\)-" apps/*/src/ --include="*.tsx"
위 결과에서 StatusBadge import가 없는 파일을 필터링합니다.
감지 패턴 B: 조건부 색상 분기 (switch/if)
grep -rn "case.*:.*return.*bg-\|case.*:.*className.*bg-" apps/*/src/ --include="*.tsx"
상태값에 따른 색상 분기 로직이 있다면 StatusBadge로 교체 대상입니다.
PASS: StatusBadge 미사용 raw 뱃지가 0건 FAIL: raw span/Badge로 상태를 표시하는 파일 존재
수정:
// Before (raw span)
<span className={cn("px-2 py-0.5 rounded-full text-xs", colorMap[status])}>
{labelMap[status]}
</span>
// After (StatusBadge)
<StatusBadge status={status} labels={LABELS} colors={COLORS} />
검사: 뱃지 색상 상수가 Record<string, string> 대신 정확한 도메인 타입으로 정의되어 있는지 확인합니다.
grep -rn "Record<string.*string>.*=" apps/*/src/**/constants.ts --include="*.ts" | grep -i "color\|badge"
PASS: 뱃지 색상 관련 상수가 모두 Record<DomainType, BadgeColor>로 타이핑
FAIL: Record<string, string> 또는 Record<string, BadgeColor> 사용
수정:
// Before (unsafe)
export const STATUS_COLORS: Record<string, string> = { ... };
// After (type-safe)
import type { BadgeColor } from '@plan-master/web-platform';
import type { MyStatus } from './types';
export const STATUS_COLORS: Record<MyStatus, BadgeColor> = { ... };
검사: 동일한 StatusBadge labels/colors 설정이 2곳 이상에서 인라인으로 반복되는지 확인합니다.
grep -rn "labels={{" apps/*/src/ --include="*.tsx"
grep -rn "colors={{" apps/*/src/ --include="*.tsx"
인라인 객체 {{ ... }}가 2회 이상 동일한 키 구조로 나타나면 공유 상수로 추출해야 합니다.
PASS: StatusBadge labels/colors가 공유 상수 참조 또는 1회만 사용 FAIL: 동일 구조의 labels/colors가 2곳 이상에서 인라인 정의
수정:
// constants.ts에 추출
export const MY_STATUS_COLORS: Record<MyStatus, BadgeColor> = { ... };
// types.ts에 labels 추출
export const MY_STATUS_LABELS: Record<MyStatus, string> = { ... };
// 사용처에서 import
<StatusBadge status={status} labels={MY_STATUS_LABELS} colors={MY_STATUS_COLORS} />
검사: labels는 types.ts에, colors는 constants.ts에 위치하는 분리 규칙을 준수하는지 확인합니다.
grep -rn "LABELS.*Record.*string>.*=" apps/*/src/**/constants.ts --include="*.ts"
constants.ts에 *_LABELS 상수가 있으면 위반입니다. Labels는 도메인 타입과 함께 types.ts에 위치해야 합니다.
grep -rn "COLORS.*Record.*BadgeColor>.*=" apps/*/src/**/types.ts --include="*.ts"
types.ts에 *_COLORS 상수가 있으면 위반입니다. Colors는 constants.ts에 위치해야 합니다.
PASS: labels → types.ts, colors → constants.ts 분리 준수 FAIL: labels/colors가 잘못된 파일에 위치
검사: StatusBadge에 커스텀 labels prop을 전달하는 경우, labels에 누락된 상태값이 있으면 영어 raw 값이 표시됨.
특히 상태 용어 변경(예: CONFIRMED→APPROVED) 후 localStorage에 잔존하는 이전 값에 대한 fallback이 필요.
배경: StatusBadge는 labels?.[status] ?? presetConfig?.labels[status] ?? status로 라벨을 결정함.
labels prop이 주어지면 preset을 사용하지 않고, labels에 없는 키는 raw status 그대로 표시.
감지 방법:
# StatusBadge에 커스텀 labels를 전달하는 곳 찾기
grep -rn "StatusBadge" apps/*/src/ --include="*.tsx" -A3 | grep "labels="
발견된 각 사용처에서:
PASS: 커스텀 labels가 이전 상태값 fallback을 포함하거나, preset만 사용 FAIL: 커스텀 labels에 이전 상태값이 누락되어 영어 raw 값 표시 가능성 있음
수정 예시:
// Before (fallback 없음)
const LABELS: Record<DeclarationStatus, string> = {
DRAFT: "작성중", SUBMITTED: "제출완료", APPROVED: "승인", REJECTED: "반려",
};
// After (이전 상태값 fallback 포함)
const LABELS: Record<string, string> = {
DRAFT: "작성중", SUBMITTED: "제출완료", APPROVED: "승인", REJECTED: "반려",
// 이전 상태값 fallback (localStorage 잔존 데이터)
UPDATE: "작성중", TRANSMITTED: "제출완료", CONFIRMED: "승인",
};
| # | 검사 | 파일 | 상태 | 상세 |
|---|------|------|------|------|
| 1 | Raw 뱃지 감지 | file.tsx | PASS/FAIL | 상세... |
| 2 | BadgeColor 타입 | file.ts | PASS/FAIL | 상세... |
| 3 | 인라인 중복 | file.tsx | PASS/FAIL | 상세... |
| 4 | labels/colors 분리 | file.ts | PASS/FAIL | 상세... |
packages/web-platform/src/components/StatusBadge.tsx 자체는 raw span을 사용해도 됨 (플랫폼 컴포넌트이므로)Badge (예: "전통주", "NEW" 등 단일 고정 텍스트)는 raw Badge 허용apps/preview/는 프리뷰 전용이므로 검증 대상 제외LiquorTypeBadge)를 사용하는 것이 올바른 패턴이므로 StatusBadge로 교체 불필요