stitch-design·stitch-build·stitch-utilities) 아래 총 15개 스킬이며, 공식 오픈 표준인 Agent Skills(agentskills.io)를 따른다. Stitch로 화면을 생성하고, React/React Native/Remotion 코드로 변환하고, 프롬프트를 다듬고, 디자인 시스템을 지키게 하는 "디자인 → 코드" 파이프라인 전체를 스킬 단위로 쪼갠 것이 핵심이다.
google-labs-code/stitch-skills · 라이선스 Apache-2.0 · "공식 지원 Google 제품 아님"을 README에 명시 · 파일 87개(마크다운 51 / JSON 14 / TSX 9 / 셸 4 / TS 3 / JS 2 / Python 1) · 최신 커밋 7b53207, 2026-07-21(PR #87, OpenCode 수동 설치 가이드 추가) · 별점 미인용)
이 저장소를 열면 서버도, 프론트엔드 앱도, npm start로 띄울 무언가도 없다. 있는 것은 plugins/ 폴더 아래 15개의 SKILL.md 파일과 그것을 뒷받침하는 소수의 스크립트(.sh/.js/.py)뿐이다. 즉 이 레포의 "산출물"은 사람이 아니라 AI 에이전트가 읽는 업무 매뉴얼이다.
Stitch는 텍스트나 이미지로 UI 화면(스크린)을 생성해주는 Google의 디자인 툴이며, MCP(Model Context Protocol) 서버로 코딩 에이전트에 연결된다. 문제는 "Stitch MCP에 연결됐다"는 사실만으로는 에이전트가 디자인 토큰을 지키고, 이미지를 안전하게 올리고, React로 옮길 때 접근성·타입을 지키는 행동을 하지 않는다는 점이다. stitch-skills는 이 간극을, 각 작업 단계마다 강제 규칙(GATE)과 안티패턴 목록을 박아넣은 스킬 문서로 메운다.
Stitch라는 툴 자체는 신입 디자이너가 손에 쥔 강력한 렌더링 장비다. 하지만 장비를 쥐여줬다고 회사 규정에 맞게 작업하는 건 아니다. "이 순서대로 하고, 이건 절대 하지 마라"는 매뉴얼이 따로 필요하다.
stitch-skills는 그 매뉴얼 바인더다. "디자인 뽑는 법" 챕터, "React로 옮기는 법" 챕터, "색상 규칙 지키는 법" 챕터가 각각 따로 있고, 몇몇 챕터 끝에는 신입이 규칙을 지켰는지 자동으로 채점하는 시험지(스크립트)까지 붙어 있다.
2026년 들어 Claude Code·Codex·Cursor·Gemini CLI 등 코딩 에이전트가 폭발적으로 늘면서, 이들에게 "특정 작업을 어떻게 해야 하는지" 가르치는 표준 포맷인 Agent Skills(agentskills.io)가 여러 벤더에 걸쳐 자리 잡고 있다. stitch-skills는 이 표준을 채택한 초기 사례 중 하나이며, 만든 주체가 google-labs-code라는 점에서 신뢰도 신호가 크다.
v0·Lovable·Stitch 같은 텍스트/이미지 기반 UI 생성 툴이 늘면서, "생성된 디자인을 실제 프로덕션 코드로 안전하게 옮기는" 중간 단계가 새로운 병목이 됐다. stitch-skills는 이 병목을 정면으로 겨냥해 React·React Native·shadcn/ui·Remotion(동영상)까지 변환 대상을 넓혔다.
README는 Codex, Antigravity, Gemini CLI, Claude Code, Cursor, (수동 설치로) OpenCode까지 호환된다고 명시한다. npx plugins add ... --target claude-code, npx plugins add ... --target cursor처럼 같은 스킬 소스를 타겟만 바꿔 설치하는 배포 방식은, 특정 벤더에 종속되지 않으려는 최근 흐름과 맞아떨어진다.
대부분의 프롬프트 모음은 텍스트일 뿐이라 지켜지는지 확인할 길이 없다. 이 레포는 일부 스킬(react-components, react-native)에 대해 AST 파서로 실제 코드를 검사하는 스크립트와 GitHub Actions CI를 붙여, "말로만 하는 규칙"을 "기계로 확인하는 규칙"으로 바꿨다.
Anthropic의 공식 Claude Skills, 커뮤니티의 awesome-claude-skills 같은 큐레이션 목록과 나란히 놓고 보면, stitch-skills는 "한 제품(Stitch)을 위한 전용 스킬 스위트"라는 좁고 깊은 포지션을 취한다. 범용 스킬 모음이 아니라, 디자인 생성부터 코드 변환까지 하나의 워크플로를 끝까지 커버하는 구성이 특징이다.
AI 에이전트에게 Stitch MCP 접근권만 주고 "디자인을 React로 바꿔줘"라고 하면 실제로 어떤 일이 벌어질까? 소스 코드에 남은 실패 사례에 대한 방어 코드와 경고 문구들을 역추적하면, 이 레포가 막으려는 실제 문제가 선명하게 드러난다.
| 실제 문제 상황 | 담당 스킬 / 메커니즘 | 어떻게 막는가 |
|---|---|---|
| 이미지·HTML을 MCP 인자로 그대로 보내면 모델 출력 토큰 한계(~16K)에 걸려 base64가 중간에 잘림 | upload-to-stitch | upload_to_stitch.py가 파일을 모델을 거치지 않고 직접 읽어 base64 인코딩 후 HTTP로 전송 |
| Stitch가 준 다운로드 URL(GCS)이 에이전트 내장 fetch 툴에서 자주 실패 | react-components / react-native | fetch-stitch.sh가 curl -L -f --compressed로 리다이렉트·보안 핸드셰이크를 대신 처리 |
| 변환된 React 컴포넌트에 Props 타입이 없거나 색상이 하드코딩된 hex로 남음 | react-components | scripts/validate.js가 AST를 파싱해 Props 인터페이스와 hex 색상 사용을 기계적으로 검사 |
| 여러 프로젝트를 오가며 작업하다 이전 프로젝트의 디자인 토큰이 섞여 들어감 | react-components Phase 2 | 매 변환마다 style-guide.json을 현재 HTML의 tailwind.config에서 다시 추출해 덮어쓰도록 GATE로 강제 |
Stitch 화면의 href="#" placeholder 링크가 실제 앱에 그대로 남아 내비게이션이 죽음 | react-components Phase 3 | 모든 href="#"를 라우트가 있는 <Link>로 교체하도록 명시 규칙 + 체크리스트 |
| AI가 생성한 화면이 전형적인 "AI스러운" 디자인(보라 네온, Inter 폰트, 3열 카드, 가짜 통계)이 됨 | taste-design | 색상·폰트·레이아웃·통계 조작 등 명시적 금지 목록을 담은 DESIGN.md 생성 규칙 |
| 여러 페이지를 자동으로 이어 만들다 다음에 뭘 할지, 뭘 이미 만들었는지 잊음 | stitch-loop | .stitch/next-prompt.md(baton)·.stitch/SITE.md(사이트맵/로드맵)로 진행 상태를 파일에 영속화 |
일반 프롬프트 모음이 "이렇게 해주세요" 하고 부탁하는 메모라면, stitch-skills는 "이 순서대로, 이 파일을 거쳐서, 이 스크립트로 확인하고 나서"까지 지정하는 작업 표준서(SOP)에 가깝다. 부탁이 아니라 절차이기 때문에, 몇몇 항목은 코드로 재확인까지 한다.
스킬 하나의 내부는 Agent Skills 표준이 정한 4단 규격을 따른다(단, 아래에서 보듯 실제로는 지켜지지 않는 스킬도 있다):
| 항목 | 수치 / 사실 |
|---|---|
| 전체 파일 수 | 87개(.git 제외) |
| 파일 유형 분포 | Markdown 51 · JSON 14 · TSX 9 · Shell 4 · TypeScript 3 · JavaScript 2 · Python 1 |
| 스킬 개수 | design 6 + build 5 + utilities 4 = 총 15개 |
| 매니페스트 이중화 | 플러그인마다 plugin.json(일반) + .codex-plugin/plugin.json(Codex 전용, brandColor·defaultPrompt 등 UI 메타데이터 포함) |
| 구조 불일치 | react-vite-dashboard는 SKILL.md+README.md뿐, scripts/resources/examples가 전부 없음(4단 규격 미준수) |
plugins/stitch-build/skills/react-components/SKILL.md는 작업을 Phase 1~4로 나누고, 각 Phase 앞에 "GATE: … 완료로 간주된다"는 문구를 박아 넣는다. 예를 들어 Phase 1은 fetch-stitch.sh로 모든 화면을 다운로드하고 스크린샷을 육안 감사한 뒤에만 완료로 치고, Phase 2는 현재 프로젝트의 HTML에서 새로 추출한 토큰으로 style-guide.json을 덮어써야만 완료로 친다. 각 Phase 끝에는 "Anti-patterns" 목록이 명시적으로 붙어, 흔한 실수(모놀리식 컴포넌트, 하드코딩 색상, 미변환 href="#")를 나열한다.
공장 생산라인의 품질 게이트와 같다. 검사원(GATE)이 서명하기 전에는 다음 공정으로 부품이 못 넘어간다. 다만 이 게이트는 사람이 손으로 쓴 규칙 문장일 뿐, 실제로 다음 단계를 물리적으로 막는 코드가 아니다 — 에이전트가 지침을 "읽고 따르기"에 의존한다는 한계는 뒤 9장에서 다룬다.
말로 된 규칙과 달리 실제로 강제되는 유일한 지점이 plugins/stitch-build/skills/react-components/scripts/validate.js다. @swc/core로 TSX 코드를 파싱해 AST를 만든 뒤, 재귀 walk() 함수로 트리를 훑으며 두 가지를 검사한다.
const HEX_COLOR_REGEX = /#[0-9A-Fa-f]{3,8}\b/;
...
if (node.type === 'TsInterfaceDeclaration' && node.id.value.endsWith('Props')) hasInterface = true;
if (node.type === 'JSXAttribute' && (node.name?.value === 'className' || node.name?.name === 'className')) {
if (node.value?.value && HEX_COLOR_REGEX.test(node.value.value)) tailwindIssues.push(node.value.value);
}
즉 ① ~Props로 끝나는 TypeScript 인터페이스 선언이 있는지, ② className 안에 하드코딩 hex 색상이 섞여 있는지를 검사해 hasInterface와 tailwindIssues를 채우고, 하나라도 어긋나면 process.exit(1)로 실패 처리한다. 이 검사는 .github/workflows/validate-skills.yml CI에서 examples/gold-standard-card.tsx를 대상으로 실제로 실행된다(Node 18.x, npm ci → node scripts/validate.js).
plugins/stitch-design/skills/upload-to-stitch/scripts/upload_to_stitch.py의 docstring은 이 레포에서 가장 흥미로운 설계 근거를 직접 설명한다: MCP 툴 호출 인자는 모델의 출력이므로, 파일을 base64로 통째로 재생성해 인자에 담아야 하는데 모델 출력 토큰 한도(~16K)가 파일의 base64 길이(예: 53KB PNG → 약 71K자)보다 훨씬 작아 중간에 잘리고 요청이 깨진다.
"The AI model cannot upload files via the MCP tool directly … The output gets truncated mid-string, producing a corrupted payload … This script bypasses the model entirely — it reads the file, encodes it in-process, and sends the full payload directly over HTTP."
해결책은 모델을 완전히 우회하는 것이다. 스크립트가 직접 파일을 읽어 base64 인코딩하고, BatchCreateScreens REST 엔드포인트(POST /v1/projects/{id}/screens:batchCreate)로 곧장 HTTP 요청을 보낸다. 에이전트는 "이 파일 경로로 스크립트를 실행해라"라고만 지시하면 된다 — 파일 내용을 자기 출력으로 재생성할 필요가 없다.
stitch-loop 스킬은 .stitch/next-prompt.md라는 파일을 다음 실행 회차에 넘기는 계주봉(baton)으로 쓴다. 파일의 YAML 프론트매터 page: 필드가 다음에 만들 페이지명을, 본문이 그 페이지의 프롬프트(디자인 시스템 블록 포함)를 담는다. 한 번의 실행(iteration)은 6단계로 진행된다.
프로젝트·화면 ID는 .stitch/metadata.json에 영속화되어 다음 회차가 이어받는다. 이 루프는 오케스트레이션 방식과 무관하게 설계됐다 — GitHub Actions가 파일 변경을 트리거해도, 사람이 매번 같은 에이전트를 다시 실행해도 동일하게 동작한다.
계주 경기의 바톤(baton)과 똑같다. 각 주자(에이전트 실행 1회)는 바톤(next-prompt.md)을 받아 자기 구간(페이지 1개)을 뛰고, 반드시 다음 주자를 위해 바톤을 다시 넘겨야 한다. 바톤을 안 넘기면 — 즉 next-prompt.md를 안 갱신하면 — 경기(자동 빌드 루프)는 그 자리에서 멈춘다.
taste-design 스킬은 "예쁘게 만들어줘" 대신 무엇을 하지 말아야 하는지를 촘촘히 나열한다 — Inter 폰트 금지, 순수 검정(#000000) 금지, 보라/네온 글로우 금지, 균등 3열 카드 금지, 그리고 "99.98% 가동률" 같은 존재하지 않는 통계를 지어내는 것 자체를 금지한다. 이는 LLM이 그럴듯해 보이는 숫자를 환각하는 문제를 디자인 스킬 차원에서 막으려는 시도다.
이 레포 전체를 관통하는 태도는 자연어 지침도 소프트웨어 설계처럼 구조화할 수 있다는 것이다. GATE(전제조건), Anti-pattern(회귀 테스트), 스크립트(단위 테스트), CI(통합 테스트)라는 대응 관계를 발견하면 이 레포의 진짜 학습 가치가 보인다.
validate.js는 TSX 코드를 문자열로 훑는 대신 AST로 정확히 "이 노드가 Props 인터페이스인가"를 판별한다.
레포 루트에는 package.json이 없다. 이는 이 레포가 "빌드해서 실행하는 소프트웨어"가 아니라 "에이전트가 읽는 문서+도구 모음"이라는 정체성을 그대로 보여준다. npm 의존성의 버전 진실원(source of truth)은 개별 스킬 폴더 안의 package.json뿐이다.
| 스킬 | 런타임/언어 | 의존성 |
|---|---|---|
| react-components | Node ≥18 (ESM) | @swc/core ^1.3.100 — AST 파싱·검증용. package-lock.json으로 버전 고정 |
| react-native | Node ≥18 (ESM) | 동일하게 @swc/core ^1.3.100 (패키지명만 react-native-components로 다름) |
| upload-to-stitch | Python 3 | 표준 라이브러리(urllib, base64, argparse) + 선택적 certifi(SSL 컨텍스트, 없으면 기본 컨텍스트로 폴백) |
| remotion / shadcn-ui | Bash | npm 패키지 없이 download-stitch-asset.sh, verify-setup.sh 같은 순수 셸 스크립트만 사용 |
| extract-static-html | TypeScript (3개 파일) | 런타임(웹앱)에서 실행되는 인라인 HTML 추출·후처리·스냅샷 스크립트 — 별도 package.json 없이 사용처 프로젝트의 툴체인에 의존 |
| 그 외 10개 스킬 | — | 실행 의존성 없음. SKILL.md + 리소스(md/json) 텍스트로만 구성 |
이 레포 자체에는 세맨틱 버전이 없다(플러그인 plugin.json이 각자 1.0.0을 자체 표기할 뿐). 무엇이 바뀌었는지는 커밋 로그로만 추적된다. 최신 커밋은 7b53207(2026-07-21, OpenCode 매뉴얼 설치 안내 PR merge)이다.
| 대상 CLI | 설치 방법 |
|---|---|
| Codex | codex plugin marketplace add google-labs-code/stitch-skills --ref main --sparse .agents/plugins --sparse plugins/stitch-design ... 로 마켓플레이스 등록 후 플러그인별 설치 |
| Claude Code | npx plugins add google-labs-code/stitch-skills --scope project --target claude-code |
| Cursor | npx plugins add google-labs-code/stitch-skills --scope workspace --target cursor |
| 스킬 선택 설치(공통) | npx skills add google-labs-code/stitch-skills — 단, 스킬 간 의존관계가 있어 일부만 골라 설치하면 깨질 수 있음(README 경고) |
| OpenCode | 수동 설치만 지원. plugins/*/skills/<name> 폴더를 .opencode/skills/로 직접 복사 + opencode.json에 Stitch 원격 MCP 엔드포인트 수동 등록 |
| 필수 전제조건 | Stitch MCP 서버 설정이 먼저 끝나 있어야 함(API 키/환경변수 포함) — 이게 없으면 스킬은 그냥 텍스트일 뿐 아무 것도 호출할 수 없다 |
이 레포의 스킬 이름 상당수가 stitch::react-components처럼 stitch:: 네임스페이스 접두어를 쓴다. 그런데 README는 "OpenCode는 name frontmatter가 소문자 kebab-case이면서 폴더명과 일치해야 로드한다"고 명시한다. 즉 OpenCode에 쓰려면 frontmatter의 name과 폴더명을 둘 다 바꿔야 하는 경우가 생긴다 — 그대로 복사만 하면 스킬이 인식되지 않는다.
가장 대표적인 흐름은 "Stitch에서 화면을 만들고, 그것을 React 코드로 바꾸는" 경로다. 여러 스킬이 이 한 흐름 안에서 순서대로 호출된다.
자율 사이트 빌드가 목적이면 stitch-loop가 이 흐름을 반복 실행으로 감싼다: baton(.stitch/next-prompt.md)을 읽고 → 위 [2]~[4]에 준하는 생성·통합을 한 페이지만큼 수행하고 → 다음 페이지를 위한 새 baton을 써서 마무리한다. Chrome DevTools MCP가 있으면 Step 4.5에서 렌더링 결과를 스크린샷 비교로 시각 검증하는 선택 단계도 들어간다.
Stitch 계정이 없어도 SKILL.md 파일들은 그냥 마크다운이라 로컬에서 바로 읽힌다. "에이전트에게 복잡한 다단계 작업을 안전하게 시키려면 지침을 어떻게 구조화해야 하는가"를 배우는 참고 자료로 활용 가치가 크다.
SKILL.md의 "GATE: … 완료로 간주된다"는 문구는 에이전트에게 주는 강한 어조의 지시문일 뿐, 실제로 다음 단계 실행을 막는 코드가 아니다. 에이전트가 그 지시를 무시하거나 잘못 이해하면 그대로 어겨진다. 진짜로 강제되는 지점은 validate.js와 CI뿐이고, 그마저도 15개 스킬 중 2개(react-components, react-native)에만 존재한다.
이 저장소를 클론해서 뭔가를 "실행"해볼 수는 없다. 모든 스킬은 Stitch MCP 서버가 이미 연결되어 있다는 것을 전제로 쓰였다(list_tools로 MCP 접두어를 찾는 절차가 거의 모든 SKILL.md 첫머리에 등장). 전제 인프라 없이 읽으면 "왜 아무 것도 안 되지?"라는 함정에 빠지기 쉽다.
README 맨 끝에 "This is not an officially supported Google product. This project is not eligible for the Google OSS VRP(취약점 신고 보상)"라고 명시돼 있다. 조직명에 google-labs-code가 들어 있다고 프로덕션급 SLA를 기대하면 안 된다.
README의 "Repository Structure" 절은 모든 스킬이 SKILL.md/scripts/resources/examples 4종을 갖는 것처럼 설명하지만, 실제로 react-vite-dashboard는 SKILL.md와 README.md 두 파일뿐이고 remotion·shadcn-ui는 scripts는 있어도 npm package.json은 없다. 문서와 실제 구조가 스킬마다 미묘하게 다르다.
같은 "지침서"라도 react-components·react-native처럼 AST 검증 + CI가 붙은 스킬은 결과물 품질을 기계적으로 재확인할 수 있지만, 나머지는 에이전트의 성실함에 전적으로 의존한다. 중요한 작업에는 검증 스크립트가 있는 스킬을 우선하거나, 직접 검증 단계를 추가하는 편이 안전하다.
| 대안 | 결이 다른 점 |
|---|---|
| v0(Vercel) · Lovable · Bolt | 디자인 생성부터 코드 배포까지 자체 폐쇄형 플랫폼이 전부 처리한다. stitch-skills는 반대로 "Stitch라는 외부 툴 + 내가 쓰는 에이전트"를 이어붙이는 접착제에 가깝다 — 플랫폼이 아니라 워크플로 지침이다. |
| Figma-to-code 플러그인류 | 대부분 Figma 파일 안에서 동작하는 단일 변환기다. stitch-skills는 변환뿐 아니라 프롬프트 강화·디자인 시스템 관리·자율 루프까지 워크플로 전 구간을 스킬로 쪼갠다는 점이 다르다. |
| Anthropic 공식 Claude Skills / awesome-claude-skills류 목록 | 범용 목적의 스킬을 폭넓게 모은 백화점형 큐레이션이다. stitch-skills는 Stitch라는 단일 제품 전용으로 좁고 깊게 판다 — 서로 경쟁 관계라기보다 "한 제품을 위한 깊은 스킬 세트"라는 다른 카테고리에 가깝다. |
| 일반 프롬프트 템플릿 모음(gist, 블로그 포스트 등) | 대개 텍스트 하나로 끝난다. 이 레포는 GATE·Anti-pattern·AST 검증·CI까지 갖춘 게 차별점이지만, 그 장치가 15개 중 2개 스킬에만 있다는 점은 감안해야 한다. |
stitch-skills는 "소프트웨어"가 아니라 "AI 에이전트를 위한 운영 지침 세트"다. 이미 Google Stitch로 디자인 작업을 하면서 Claude Code·Cursor·Codex 같은 에이전트에게 후속 작업(React 변환, 디자인 시스템 관리, 자율 사이트 빌드)을 맡기고 싶은 사람에게 직접적인 실용 가치가 있다. Stitch를 쓰지 않더라도, "에이전트에게 복잡한 다단계 작업을 어떻게 안전하게 위임할 것인가"를 GATE·Anti-pattern·AST 검증·CI라는 구체적 장치로 보여주는 참고 설계 사례로서 읽을 가치가 크다.
디자인 토큰이 흐트러지지 않게, 내비게이션이 깨지지 않게, 타입이 빠지지 않게 체크리스트가 이미 짜여진 상태로 변환을 맡길 수 있다.
GATE 문구, Anti-pattern 목록, "왜 이 스크립트가 필요한가"를 설명하는 docstring, CI로 검증되는 gold-standard 예제 — 이 네 가지 패턴을 그대로 참고해 자기 도메인의 스킬을 만들 수 있다.