# Figma 측정 설정 가이드 Phase 0.5 Figma baseline 측정을 위한 설정 안내. 한 번 설정 후에는 `npx dsmonitor audit` 에 자동 편승. ## 개요 DSMonitor 의 Figma analyzer 는 Figma REST API 를 통해 다음을 측정합니다. - **DS 파일별 카운트**: Styles / Main Components / Variant 그룹 (Variables 는 Phase B 이월) - **도메인 파일 출처 미상 Instance 비율**: 등록된 DS 중 어디에도 매칭되지 않는 INSTANCE 비율 + Top N (마이그레이션 우선순위) - **정상 Instance 출처 분포**: ds-new / ds-legacy / unknown 버킷 ## 필드 이름 규칙 `label` / `comment` 2개만 사용합니다. | 필드 | 용도 | 필수 여부 | |---|---|---| | `label` | 파일 식별자 (리포트 그룹핑 키, 중복 불가) | 필수 | | `comment` | 가독성용 메모 (페이지/프레임 이름 등) | 선택 (권장) | ## 초기 설정 (한 번만) ### 1. Figma Personal Access Token 발급 1. Figma 웹 앱 → **Settings** → **Security** → **Personal access tokens** → "Generate new token" 2. Scope: **File content read-only** 만 선택 (Phase 0.5 는 이것만 필요. Variables 측정은 Phase B 이월) 3. 생성된 토큰 복사 (한 번만 표시됨) ### 2. `.env.local` 에 토큰 저장 ```bash cd dsmonitor cp .env.local.example .env.local # 최초 1회 # .env.local 을 편집해 FIGMA_API_TOKEN= 에 토큰 붙여넣기 ``` `.env.local` 은 `.gitignore` 에 등록되어 있어 커밋되지 않습니다. ### 3. 측정 대상 파일 등록 (`dsmonitor.config.local.ts`) ```bash cp dsmonitor.config.local.example.ts dsmonitor.config.local.ts # dsmonitor.config.local.ts 를 편집해 실제 파일 URL 채우기 ``` 이 파일도 `.gitignore` 에 등록됨. 예시 템플릿 `.example.ts` 는 커밋 대상. ### 4. Figma 측정 활성화 `dsmonitor/dsmonitor.config.ts` 에서: ```typescript metrics: { // ... figmaAnalysis: true, // false → true 로 변경 }, ``` ## DS 파일 등록 DS 파일 = 컴포넌트 / Variables / Styles 정의 자체가 있는 파일. 페이지/프레임 선택 불필요. ```typescript export const figmaDesignSystemFiles: FigmaDesignSystemFile[] = [ { url: "", label: "ds-legacy" }, { url: "", label: "ds-new" }, ]; ``` **label 규칙**: 여기 등록한 label 이 리포트의 "정상 Instance 출처 분포" 에서 **그대로 버킷 키로 사용**됩니다 (`figma.instanceSources[label]`). 위 예시처럼 `"ds-new"` / `"ds-legacy"` 로 등록하면 두 개의 버킷이 생기고, 세 번째 DS 를 예컨대 `"ds-external"` 로 추가하면 자동으로 세 번째 버킷이 추가됩니다. label 에 대한 특별 취급 / 하드코딩 분류 없음 — config 에 등록된 수만큼 동적으로 집계. 등록되지 않은 DS 에서 유래한 INSTANCE 는 `figma.instanceAnalysis.unmatchedInstances` (매칭 실패 = 등록 DS 범위 밖, 마이그레이션 대상) 로 집계됩니다. ### Primary 명시 / Primary specification (0.2.0) `primary: true` 명시 필수. dashboard 안 transformer 의 `primaryLabel` read: - DS 1개 = 자동 primary (primary 필드 생략 가능) - DS 2개 이상 = 정확히 1개에 `primary: true` 명시 필수 - primary 0개 또는 2개 이상 = 에러 throw Dashboard 안 사용자 라벨 그대로 표시. 라벨 형태 = 자유 결정 (예: `"v1"`, `"v2"`, `"legacy"`, `"main"` 등). **EN —** Specify primary explicitly with `primary: true`. The dashboard reads `primaryLabel` from the transformer: - 1 DS file = auto-primary (`primary` field can be omitted) - 2+ files = exactly one must have `primary: true` - 0 or 2+ primaries = throws error The dashboard displays user-defined labels verbatim. Labels are free-form (e.g. `"v1"`, `"v2"`, `"legacy"`, `"main"`). #### 예시 / Example ```typescript export const figmaDesignSystemFiles = [ { url: "...", label: "ds-legacy" }, { url: "...", label: "ds-new", primary: true }, // ← primary 명시 ]; ``` > **Migration from 0.1.x**: 0.1.x 흐름 = `ds-new` 라벨 자동 primary 처리. 0.2.0 부터 = 명시 필수. 옛 항목에 `primary: true` 1줄 추가 필요. Labels themselves (`ds-new` / `ds-legacy`) can stay or be freely renamed. ## 도메인 파일 등록 — 3가지 패턴 도메인 파일 = 실제 UI 시안 / 프로토타입 파일. 측정 범위에 따라 아래 3가지 패턴 중 하나 사용. ### 패턴 A — 파일 전체 측정 ```typescript { label: "domain-a", url: "<파일 Copy link>", comment: "파일 전체 측정" } ``` Copy link 방법: Figma 에서 파일을 연 뒤 주소창의 URL 을 그대로 복사 (또는 "Share" → "Copy link" 버튼). **node-id 가 없는 파일 루트 URL** 이어야 합니다. 언제 사용: 파일 안에 archive 같은 제외 대상이 없을 때. ### 패턴 B — 특정 페이지 전체 측정 ```typescript { label: "domain-b", pages: [ { url: "<페이지 Copy link>", comment: "계정관리" }, { url: "<페이지 Copy link>", comment: "권한설정" }, ], } ``` Copy link 방법: Figma 왼쪽 페이지 목록에서 **페이지 이름 우클릭** → "Copy link". 결과 URL 은 `...?node-id=X-Y` 형태. 언제 사용: 측정할 페이지 수가 적고 명확할 때. 또는 "파일 전체 - archive" 처럼 일부 제외하고 싶을 때 (포함할 페이지만 명시). ### 패턴 C — 페이지 안의 특정 프레임만 측정 ```typescript { label: "domain-c", pages: [ { comment: "대시보드", // 페이지 이름 (URL 없음) frames: [ { url: "<프레임 Copy link>", comment: "메인위젯" }, { url: "<프레임 Copy link>", comment: "상단요약" }, ], }, ], } ``` Copy link 방법: Figma 캔버스에서 **프레임을 선택한 뒤 우클릭** → "Copy link to selection". 결과 URL 은 `...?node-id=X-Y` 형태 (페이지 URL 과 형식 동일). 언제 사용: 페이지 안에 정리 대상이 아닌 스케치 / 탐색용 프레임이 섞여있을 때. ### 혼합 패턴 한 파일 안에서 어떤 페이지는 B, 어떤 페이지는 C. 같은 파일 소속이기만 하면 OK. ```typescript { label: "domain-d", pages: [ { url: "<페이지 Copy link>", comment: "계정관리" }, // 패턴 B { comment: "권한", // 패턴 C frames: [ { url: "<프레임 Copy link>", comment: "목록" }, ], }, ], } ``` 자세한 예시는 `dsmonitor.config.local.example.ts` 의 `domain-d` 참고. ## 측정 실행 ```bash # 프로젝트 루트에서 실행 (통합 측정 cycle): npx dsmonitor audit --baseline # codebase + Figma 측정 + markdown + dashboard 자동 chain # 또는 측정 부분별: npx dsmonitor audit --only figma # figma 만 (base JSON 필요,`dsmonitor:figma` 단독 측정 시 제약 — 아래 주의 참조) npx dsmonitor report # markdown 만 재생성 npx dsmonitor dashboard # dashboard html 만 재빌드 ``` ### `dsmonitor:figma` 단독 측정의 제약 `--only figma` 흐름은 코드 인덱스 (`classIndex`) 가 없어 **componentMatch 미생성** 합니다 (B 그룹 단계 3, v0.11 시점부터). componentMatch = Figma DS 컴포넌트 ↔ 코드 className 매칭. 해당 측정값이 필요하면 통합 측정 (`dsmonitor:baseline`) 사용 권장. ### 마이그레이션 정보 추출 (v0.14, Phase 0.7 단계 1+6) frame 단위 instance 목록을 CSV 로 추출 — 마이그레이션 작업 진입 사전 정보. ```bash npx dsmonitor export-migration --frame= [--ds=