Brand Kit
사용자의 제품을 설명하는 brand-kit.json을 구축하여 다른 스킬이 사용할 수 있도록 합니다 — 색상, 폰트, 톤(voice), do/dont 언어, 선택적 로고. 다른 Cogny 스킬(/tiktok-launch-video, /reddit-launch-video, /linkedin-launch-video, /landing-page-review, /ad-copy-writer)은 이 파일이 존재하면 읽어갑니다.
이 스킬은 사용자가 항상 사이트의 소스 코드에 접근할 수 있는 것은 아니다라는 현실을 바탕으로 설계되었습니다. 키트를 만드는 6가지 경로가 있으며, 우선순위 순서로 시도합니다. 충분한 정보를 얻는 첫 번째 경로에서 멈춥니다.
사용법
/brand-kit https://example.com — 라이브 사이트에서 추출
/brand-kit ~/git/our-site — 로컬 저장소에서 추출 (Tailwind / CSS 변수)
/brand-kit ~/Desktop/logo.png — 로고나 스크린샷에서 팔레트 추출
/brand-kit ~/Desktop/homepage.png logo.png — 사이트 스크린샷 + 로고 결합
/brand-kit — 사용자 인터뷰
출력
brand-kit.json이 다음 위치에 기록됩니다 (우선순위 순서, 사용자 설정에 적합한 경로):
.agents/brand-kit.json(.agents/디렉토리가 존재하는 경우).claude/brand-kit.json(.claude/디렉토리가 존재하는 경우)./brand-kit.json(그 외 — 현재 작업 디렉토리)
항상 기록한 경로를 출력하여 사용자가 이동할 수 있도록 합니다.
스키마
{
"name": "cogny",
"site": "https://cogny.com",
"logo": {
"path": "./brand/logo-square.png",
"use_in_video": false
},
"colors": {
"background": "#1f1d1d",
"foreground": "#ede8e3",
"primary": "#b09acd",
"accent": "#c9badf",
"muted": "#9a9494",
"card": "#282525",
"fuchsia": "#d4848a",
"success": "#7ec8a4",
"amber": "#d4a857"
},
"type": {
"family": "'JetBrains Mono', 'Fira Code', ui-monospace, monospace",
"weight_display": 700,
"weight_body": 500,
"letter_spacing_display": "-0.02em"
},
"voice": {
"register": "기술적, 직접적, 전문 용어 지양, CLI 미학",
"person": "1인칭 복수 (우리 / 여러분)",
"do": ["구체적인 숫자", "트레이드오프 명시", "도구 이름 명시"],
"dont": ["레버리지", "잠금 해제", "혁명적", "차세대"]
},
"source": "repo: ~/git/cogny/tailwind.config.ts + src/index.css",
"captured_at": "2026-04-25"
}
최소 구성 키트: colors.background, colors.foreground, colors.primary, type.family, voice.register. 이 다섯 가지 없이 배포하지 마세요.
경로 0 — Cogny MCP 컨텍스트 트리 (가장 저렴함, 연결되어 있으면 먼저 실행)
사용 조건: cogny MCP 서버가 .mcp.json에 있는 경우. 사용자는 이미 자신의 브랜드 — 톤(voice), 팔레트, 분위기 — 를 컨텍스트 트리에 문서화했을 수 있으며, 이 경우 스크래핑은 중복됩니다.
mcp__cogny__get_context_tree_overview # 어떤 정보가 문서화되어 있는지 확인
mcp__cogny__search_context query="brand" # 팔레트, 톤(voice), 디자인 토큰
mcp__cogny__search_context query="positioning" # 톤(voice) + 레지스터가 여기에 있는 경우가 많음
mcp__cogny__read_context_node node_id="…"
트리가 브랜드/팔레트/톤(voice) 노드를 반환하면 해당 값으로 키트를 채웁니다. 특정 정보가 오래되었거나 모순되는 경우에만 경로 1 또는 3과 교차 확인합니다.
cogny MCP가 연결되어 있지 않거나 트리에 브랜드 관련 정보가 없으면 경로 1로 넘어갑니다.
경로 1 — Tailwind / CSS 변수가 있는 저장소 (최상의 신호)
사용 조건: 사용자가 사이트 소스 코드에 접근할 수 있는 경우.
다음 순서대로 찾습니다:
# Tailwind 구성 — 사용자 정의 색상 네임스페이스
fd -t f 'tailwind\.config\.(ts|js|mjs|cjs)$' <repo>
# CSS 사용자 정의 속성 (대부분의 최신 스택)
fd -t f '(globals|index|app|theme|variables)\.css$' <repo>
# 디자인 토큰
fd -t f '(design-tokens|tokens|theme)\.json$' <repo>
Tailwind 구성 파일을 찾으면 사용자 정의 색상 네임스페이스(일반적으로 브랜드 이름, 예: cogny: {...})를 찾습니다:
// tailwind.config.ts (cogny 예시)
colors: {
cogny: { dark: "#1f1d1d", purple: "#b09acd", secondary: "#7E69AB", light: "#c9badf" }
}
CSS 파일을 찾으면 표준 사용자 정의 속성 이름을 grep합니다:
grep -E '^\s*--(background|foreground|primary|accent|muted|card)' <css-file>
값을 키트 스키마에 매핑합니다. --primary(HSL 또는 16진수)와 Tailwind 네임스페이스를 모두 찾은 경우, Tailwind 네임스페이스를 선호합니다 — 이는 shadcn 기본값보다 명시적인 브랜드 의도인 경우가 많습니다.
동일한 파일에서 폰트 감지:
grep -E "(font-family|fontFamily|--font-)" <repo>/src/**/*.{css,ts,tsx,js} 2>/dev/null | head
경로 2 — 라이브 사이트 URL (소스 접근 없이 동작)
사용 조건: 사용자가 공개 URL만 가지고 있는 경우.
단계:
- 홈페이지를 가져옵니다
WebFetch <url>을 사용하여 인라인<style>블록과 head의 스타일시트 링크를 추출합니다. - 메인 스타일시트를 가져옵니다 (head에서 가장 큰 CSS 링크).
curl -sL <css-url> | head -c 200000정도로 충분합니다 — CSS 사용자 정의 속성(--primary,--background등)과@font-face규칙을 찾습니다. - 매니페스트를 찾습니다
/site.webmanifest,/manifest.json, 또는/manifest.webmanifest에서. 매니페스트에는theme_color,background_color, 아이콘 목록이 포함되어 있습니다 — 브랜드 키트에 매우 유용합니다. - 파비콘과 고해상도 로고를 찾습니다:
사이트에서 가장 큰 PNG 아이콘(Apple touch 아이콘, 매니페스트 아이콘)이 브랜드 마크입니다.curl -sL "<site>/favicon.ico" -o /tmp/favicon.ico curl -sL "<site>/apple-touch-icon.png" -o /tmp/touch.png # 또는 홈페이지 HTML에서 <link rel="icon"> 추출 - 타이포그래피 감지:
body,html, 또는h1에 대한font-family선언을 인라인 CSS에서 검색합니다.<head>에 Google Fonts 링크가 보이면, 폰트 패밀리 이름이 URL에 바로 있습니다.
사이트가 정적 프론트엔드(Next.js 등)를 제공하는 경우, 번들된 CSS에는 개발 소스와 동일한 사용자 정의 속성이 포함되어 있는 경우가 많습니다 — 따라서 저장소 접근 없이도 전체 브랜드 팔레트를 복구할 수 있습니다.
부분 정보만 얻은 경우(예: 매니페스트에서 theme_color는 얻었지만 전체 팔레트는 없는 경우), 경로 3으로 진행하여 로고/스크린샷에서 누락된 부분을 채웁니다.
경로 3 — 로고 또는 스크린샷 팔레트 추출 (항상 동작하는 대체 방법)
사용 조건: 사용자가 로고 이미지, 홈페이지 스크린샷, 또는 브랜드 에셋 PNG/JPG를 업로드하는 경우.
사용자는 일반적으로 어떤 이미지를 가지고 있습니다 — 데스크톱의 로고, Slack 아바타, 웹사이트 스크린샷. FFmpeg를 사용하여 팔레트를 직접 추출합니다:
# 모든 이미지에서 작은 팔레트 이미지(최대 6개의 고유 색상) 생성
ffmpeg -y -i <input.png> \
-vf "palettegen=max_colors=6:reserve_transparent=0:stats_mode=single" \
-frames:v 1 -update 1 /tmp/_palette.png
# 해당 팔레트 색상을 16진수로 읽어옴. PPM 헤더는
# P6\n<W> <H>\n255\n → 표준 16x16 팔레트의 경우 13바이트
ffmpeg -y -i /tmp/_palette.png -c:v ppm -f image2 -update 1 - 2>/dev/null \
| tail -c +14 \
| xxd -c 3 -p \
| awk '!seen[$0]++' \
| head -8 \
| awk '{print "#" toupper($1)}'
cogny 로고(어두운 따뜻한 배경의 그라데이션 C)의 출력:
#1D1B1B ← 배경
#5F4953 ← 진한 자두색
#BB93B9 ← 라벤더 (기본 브랜드 색상)
#CA8B9D ← 코랄-핑크
#D2858C ← 코랄 (강조 색상)
매핑 규칙 — 팔레트는 빈도순으로 정렬되지만, 역할 할당은 사용자의 몫입니다:
- 가장 어두운 색상 →
colors.background(픽셀의 40% 이상을 차지하는 경우) - 가장 밝은 비흰색 →
colors.foreground(흰색에 가까운 색상이 없으면 기본값#fafafa) - 가장 채도가 높은 색상 →
colors.primary - 두 번째로 채도가 높은 색상 →
colors.accent
원본 이미지를 한 번 확인하여 확인합니다 — 알고리즘 역할 할당은 약 70%의 경우 정확합니다.
스크린샷의 타이포그래피: 이미지 기반 폰트 감지는 신뢰할 수 없습니다. 다음 중 하나를 수행합니다:
- 사용자에게 묻기 ("이 이미지의 제목 폰트는 무엇인가요…?"), 또는
- WhatTheFont 또는 Fontspring Matcherator 같은 무료 도구 사용 — 사용자에게 URL을 보여주고, 프로그래밍 방식으로 시도하지 마세요.
선택 사항: node-vibrant를 통한 의미론적 팔레트 (npm 설치 한 번으로 vibrant/muted/dark-vibrant/light-vibrant 카테고리 제공 — primary/accent 역할 매핑에 더 유용함):
npm install -g node-vibrant
node -e "
const Vibrant = require('node-vibrant');
Vibrant.from(process.argv[1]).getPalette().then(p => {
const out = {};
for (const k of ['Vibrant','Muted','DarkVibrant','LightVibrant','DarkMuted','LightMuted']) {
if (p[k]) out[k] = p[k].hex;
}
console.log(JSON.stringify(out, null, 2));
});
" <input.png>
사용 가능한 도구를 사용합니다. FFmpeg는 이미 비디오 스킬과 함께 제공되므로 기본값입니다.
경로 4 — 색상 선택기 / 수동 입력 (항상 사용 가능)
사용 조건: 다른 방법이 모두 실패했거나, 사용자가 키트를 명시적으로 재정의하려는 경우.
다음 순서로 질문하고, 부분적인 답변도 수용합니다:
- 배경 16진수 색상은? (사용자가 가장 많이 보는 페이지 배경)
- 전경 16진수 색상은? (본문 텍스트 색상)
- 기본 브랜드 16진수 색상은? (버튼이나 링크에 사용되는 색상)
- 강조 16진수 색상은? (선택 사항 — 두 번째 브랜드 색상이 있는 경우)
- 폰트 패밀리는? ("Inter 같은 산세리프", "JetBrains Mono" 등 — 최선의 추정, 시스템 대체 폰트도 괜찮습니다)
세 가지 색상과 폰트 하나면 배포하기에 충분합니다.
경로 5 — 톤(voice) 추출 (색상 경로와 관계없이 항상 실행)
톤(voice)은 복사-붙여넣기 도구가 잊어버리는 브랜드 키트의 부분입니다. 비디오가 어떤 비트를 작성할지, 광고 카피 스킬이 어떤 헤드라인을 생성할지를 결정합니다.
톤(voice)의 출처: 홈페이지 히어로 + 1~2개의 더 깊은 페이지(소개, 가격, 블로그).
단계:
- 홈페이지 히어로 텍스트를 가져옵니다 (h1, h2, 히어로 CTA 다음의 첫 번째 단락).
- 깊은 페이지 하나를 가져옵니다 (일반적으로
/about또는/pricing). - 카피를 읽고 세 가지 필드를 생성합니다:
"voice": {
"register": "<한 줄 설명>",
"do": ["패턴 1", "패턴 2", "패턴 3"],
"dont": ["금지 단어 1", "금지 단어 2"]
}
예시 (실제 각 회사 홈페이지에서 파생됨):
| 브랜드 | register | do | dont |
|---|---|---|---|
| cogny | "기술적, 직접적, 전문 용어 지양, CLI 미학" | 구체적인 숫자, 트레이드오프 명시, 도구 이름 명시 | 레버리지, 잠금 해제, 혁명적, 차세대 |
| Linear | "운영자, 독단적, 빠름" | 2인칭, 간결한, 빌드-모드 언어 | 엔터프라이즈, 시너지, 강력한 |
| Mailchimp | "따뜻한, 대화체, 평이한 영어" | 1인칭, 친근한 축약형, 명확한 CTA | 활용하다, 패러다임, 레버리지 |
페이지에서 톤(voice)을 추론할 수 없는 경우(예: 매우 얇은 홈페이지), 사용자에게 어떻게 들리고 싶은지 한 문장으로 설명해 달라고 요청하세요. 만들지 마세요.
단계 (실제 흐름)
-
사용자가 제공한 입력을 감지합니다:
- URL → 경로 2 → 필요한 경우 경로 3 / 5로 넘어감
- 저장소 경로 → 경로 1 → 경로 5로 넘어감
- 이미지 경로 → 경로 3 + 톤(voice)을 위해 사이트 URL 또는 저장소 요청 (경로 5)
- 입력 없음 → 경로 4 + 추출할 로고가 있는지 질문
-
키트를 점진적으로 구축합니다. 각 단계 후 부분 상태를 출력하여 사용자가 개입할 수 있도록 합니다:
◆ 브랜드 키트 (cogny) ✓ 색상 bg=#1f1d1d fg=#ede8e3 primary=#b09acd accent=#c9badf ✓ 폰트 JetBrains Mono / mono ◇ 톤(voice) 대기 중 — /about 페이지를 가져와 분석 중… -
파일을 기록하기 전에 사용자에게 결과를 보여줍니다. 사용자는 색상 역할 할당(배경 vs 기본 등)을 승인해야 합니다 — 이는 영향력이 큰 결정입니다.
-
brand-kit.json을 가장 적절한 위치에 기록합니다 (출력 섹션 참조). 이미 키트가 존재하는 경우, diff를 보여주고 덮어쓰기 전에 질문합니다. -
소비 스킬을 위한 한 줄 설치 힌트를 출력합니다:
저장됨 → .agents/brand-kit.json 다음에서 사용: /tiktok-launch-video, /reddit-launch-video, /linkedin-launch-video, /ad-copy-writer, /landing-page-review
일반적인 실수
- 단일 16진수 색상을 브랜드로 취급 — 대부분의 브랜드는 기본 색상 + 강조 색상 + 배경-전경 쌍을 가지고 있습니다. 최소 세 가지 색상.
- 톤(voice) 없이 배포 — 색상은 브랜드의 30%를 전달하고, 톤(voice)은 70%를 전달합니다. 경로 5를 건너뛰지 마세요.
- shadcn 기본값을 브랜드로 사용 — 사용자의 CSS 파일에
--primary: 240 5.9% 10%가 문자 그대로 있다면, 이는 자리 표시자일 뿐 브랜드가 아닙니다. 홈페이지 스크린샷과 교차 확인하세요. - 로고 그라데이션 아티팩트로 키트를 과포화 — 그라데이션 로고에서 팔레트를 추출하면 4~5개의 전이 색상이 반환됩니다. 끝점(기본 색상 + 강조 색상)을 선택하고 중간 색상은 제거하세요.
- LinkedIn-파랑 / Twitter-파랑 / TikTok-분홍이 키트에 스며드는 것 허용 — 이는 스크린샷에 번져 들어가는 플랫폼 UI 색상이지 브랜드 색상이 아닙니다.
theme-color를 맹목적으로 신뢰 — 사이트에서 모바일 Safari의 주소 표시줄과 일치하도록theme-color를 설정하는 경우가 있는데, 이는 장식용이며 실제 브랜드 기본 색상과 일치하지 않을 수 있습니다.
관련 스킬
/tiktok-launch-video,/reddit-launch-video,/linkedin-launch-video— 키트를 소비함/ad-copy-writer— 톤(voice) 규칙을 사용하여 플랫폼에 적합한 카피를 작성/landing-page-review— 랜딩 페이지와 브랜드 키트 간의 일관성을 확인/non-commodity-content— 톤(voice) 추출이 이 스킬의 인터뷰 단계와 중복됨