본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

directions-lab

기능별 디자인 실험 페이지를 만들어 실제 UI와 두세 가지 대안을 나란히 비교합니다. 테마와 애니메이션 전환을 제공하고 Storybook에 등록한 뒤 테스트와 빌드를 확인합니다.

원문원문 설명 보기

Scaffold a directions lab that shows shipped UI (Today) beside 2-3 design directions, with surface tabs, theme and animation toggles and the V1 MVP hover motion, registered in design-proposals Storybook. Use for a directions page or lab, or to explore design directions next to production.

paperclipai/paperclip스타 108,557(GitHub 108,557 + cccskills 0)
연동 도구Vercel

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • 실제 UI와 디자인 대안 비교
  • 여러 화면의 디자인 검토 공유
  • 기능별 디자인 실험 페이지 제작
  • 디자인 제안을 Storybook에 등록

한국어 소개

할 수 있는 일

이 스킬은 기능별 디자인 실험 페이지를 만들어 실제 서비스 UI와 두세 가지 디자인 대안을 나란히 보여 줍니다. 생성되는 페이지에는 기능이 표시되는 위치별 탭, 테마와 애니메이션 전환 기능, 대안 목록이 포함됩니다. 실험 페이지는 Storybook의 디자인 제안 카탈로그에도 등록합니다. 실제 UI는 실제 컴포넌트를 사용해 표시하며 비교 기준으로 삼습니다. 생성 후에는 화면 구조와 데이터, 각 디자인 대안을 단계적으로 다듬고 테스트와 빌드 같은 확인 작업을 진행합니다. 캡처 이미지는 검토 자료로 첨부할 수 있으며 저장소에는 포함하지 않습니다.

이럴 때 유용합니다

구현된 UI와 새로운 제안을 같은 조건에서 비교하거나 여러 화면에 걸친 디자인 검토를 공유할 때 적합합니다. 팀에서 각 안의 외관과 움직임을 살펴볼 검토용 진입점을 마련하려는 경우에도 유용합니다.

사용 예시

  • “이 기능의 실제 UI와 세 가지 디자인안을 비교하는 실험 페이지를 만들어 주세요.”
  • “이 기능이 표시되는 화면마다 디자인안을 비교할 수 있는 페이지를 준비해 주세요.”
  • “생성한 디자인 실험 페이지를 Storybook에 등록하고 확인 절차를 진행해 주세요.”

주의 사항

원문 지침은 대상 저장소의 UI 구성과 기능 지도를 참고하고 Vite, Storybook, 테스트 환경을 사용합니다. 생성 후 확인하려면 대상 프로젝트의 개발 환경이 필요합니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
A양호실패 시 되돌리며 캡처 이미지는 저장소에 넣지 않는다고 명시합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족저장소 UI 구성, Vite, Storybook, 테스트 환경이 필요합니다.

점수에는 넣지 않았습니다. 2026년 10월 27일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(70)

  • SKILL.md15.4 KB
  • agents/openai.yaml291 B
  • assets/motion/v1-mvp-motion.css787 B
  • assets/PRECEDENT187 B
  • assets/templates/api-routes.ts.mjs531 B
  • assets/templates/api-stub.ts.mjs1.9 KB
  • assets/templates/build-info.ts.mjs220 B
  • assets/templates/define-lab.ts.mjs3.9 KB
  • assets/templates/direction/index.tsx.mjs445 B
  • assets/templates/direction/MotionSpecimen.tsx.mjs2.3 KB
  • assets/templates/direction/SlotBody.tsx.mjs521 B
  • assets/templates/direction/tokens.css.mjs1.1 KB
  • assets/templates/entry.html.mjs752 B
  • assets/templates/fixtures.ts.mjs1.2 KB
  • assets/templates/frames/AppShell.tsx.mjs5.2 KB
  • assets/templates/frames/Board.tsx.mjs4.8 KB
  • assets/templates/frames/LabToolbar.tsx.mjs4.4 KB
  • assets/templates/frames/Slot.tsx.mjs329 B
  • assets/templates/frames/SurfaceFrame.tsx.mjs1.3 KB
  • assets/templates/frames/SurfaceView.tsx.mjs540 B
  • assets/templates/kit.ts.mjs1.9 KB
  • assets/templates/lab-state.ts.mjs1.8 KB
  • assets/templates/lab.css.mjs74 B
  • assets/templates/launch-entries.json.mjs680 B
  • assets/templates/main.tsx.mjs6.2 KB
  • assets/templates/providers.tsx.mjs920 B
  • assets/templates/registry.ts.mjs1.6 KB
  • assets/templates/shot.cjs.mjs10.0 KB
  • assets/templates/stories/compare.stories.tsx.mjs3.4 KB
  • assets/templates/tests/api-stub.test.ts.mjs1.6 KB
  • assets/templates/tests/lab-state.test.ts.mjs3.1 KB
  • assets/templates/tests/motion-contract.test.ts.mjs5.7 KB
  • assets/templates/tests/registry.test.ts.mjs2.5 KB
  • assets/templates/tests/today.test.tsx.mjs2.0 KB
  • assets/templates/today/adapters.ts.mjs748 B
  • assets/templates/today/index.tsx.mjs387 B
  • assets/templates/today/SlotBody.tsx.mjs972 B
  • assets/templates/vite.config.mjs.mjs2.9 KB
  • evals/asks-how-many-directions/case.yaml343 B
  • evals/asks-how-many-directions/graders/01-expected-output.md347 B
  • evals/asks-how-many-directions/prompt.md197 B
  • evals/multi-surface-three-directions/case.yaml674 B
  • evals/multi-surface-three-directions/graders/01-expected-output.md672 B
  • evals/multi-surface-three-directions/prompt.md510 B
  • evals/single-surface-two-directions/case.yaml398 B
  • evals/single-surface-two-directions/graders/01-expected-output.md397 B
  • evals/single-surface-two-directions/prompt.md284 B
  • references/canonical-directory.md15.5 KB
  • references/design-proposals-storybook.md29.2 KB
  • references/drawing-phases.md21.7 KB
  • references/generator.md25.7 KB
  • references/lab-anatomy.md28.7 KB
  • references/lifecycle.md18.9 KB
  • references/motion-spec.md21.1 KB
  • references/questions-and-defaults.md15.6 KB
  • references/repo-gates.md20.8 KB
  • references/today-fixtures-and-build.md34.9 KB
  • scripts/lib/args.mjs2.4 KB
  • scripts/lib/capabilities.mjs2.1 KB
  • scripts/lib/check.mjs10.6 KB
  • scripts/lib/context.mjs8.6 KB
  • scripts/lib/modes.mjs1001 B
  • scripts/lib/ports.mjs1.9 KB
  • scripts/lib/registry-edit.mjs5.2 KB
  • scripts/lib/render.mjs3.6 KB
  • scripts/lib/shared-files.mjs2.9 KB
  • scripts/lib/verify.mjs1.8 KB
  • scripts/lib/write.mjs2.3 KB
  • scripts/scaffold.mjs14.3 KB
  • scripts/scaffold.test.mjs33.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Directions lab

A directions lab is how design explorations are made in this repo: one page, one feature, Today plus two or three directions, every surface the feature appears on, and the same controls every time, so a shared link reads the same to everyone. The artifact directions lab (ui/src/artifact-directions) is the precedent and stays the frozen reference; this skill generates new labs in the same shape without redrawing the plumbing by hand.

What you are making

  • The page. ui/<slug>-directions.html plus ui/src/<slug>-directions/, a second Vite entry with no backend. All state lives in the URL (?d=&s=&theme=&chrome=&anim=, plus proposal=1 for the proposal palette). A registry module is the single source for the direction ids, digit keys, labels, surfaces, landing view and story id; the toolbar, keyboard, overview board and capture script read it at runtime, and add-direction keeps the story's per-direction export in step, so a direction is one registry entry plus one directory.
  • The toolbar. Row 1 is the directions row: the numbered directions then 0.Today last, as a segmented control, with Theme and Animation right-aligned. Row 2 is the surfaces row: Overview plus one tab per surface. Row 2 is written only when the lab is scaffolded with more than one surface (a surface added later to a one-surface lab needs row 2 by hand, references/lab-anatomy.md section 8); with one surface the keyboard legend joins row 1. Nothing else goes in the header.
  • Today. Always present, always 0.Today, always the shipped components mounted on the lab's fixtures through small adapters and a fetch stub. It is the control every direction is judged against, so it is never a redraw.
  • The directions. Two or three, numbered, each a self-contained kit directory with its own scoped tokens.css. Every direction carries the V1 MVP motion block verbatim and a test that proves it, so hover feels the same across labs. Read references/motion-spec.md before touching any of it.
  • The directory entry. One story file under ui/storybook/stories/design-proposals/ with a stable id, catalogued as a proposal. The design-proposals Storybook is becoming the canonical directory of the design system; a lab exists there from its first commit.

Hard rules, because the repo's gates enforce them and reviewers expect them: no code comments in anything you commit, no file of 600 lines or more in a lab (check refuses at 600), no package.json script, no lockfile change, no screenshots or generated catalog files in the repo.

Before you start

Run from the repo root on a branch of your own (claude/<slug>-directions, from origin/master). Check that ui/node_modules/.bin/vite exists; if not, pnpm install --frozen-lockfile. Then run the generator's own tests:

node --test .agents/skills/directions-lab/scripts/scaffold.test.mjs

Red here usually means a template or the motion asset has drifted from the precedent (ui/src/artifact-directions/directions/d5-v1-mvp/tokens.css); two cases also read the real feature map and the catalog script, so a changed feature-map row or catalog message shows up here too. Fix the generator before scaffolding anything; a lab built on a stale template fails later in ways that look like your drawing.

Read the brief, then ground the subject

Extract four things from what Tonio wrote: the subject (its slug and title), the places it appears (one surface per place), a stated count or names of the directions, and any flag or component names. Then look at the code before you ask anything:

rg -l "<Subject>" ui/src/components ui/src/pages
rg -n "<subject word>" maps/feature-map/*.md

The first grep gives the component files, the flag hook (use<Feature>Enabled), and, by following useQuery/queryFn into ui/src/api/*, the /api/ routes Today must answer. The second gives the capability ids the story cites. This grounding is what makes the surfaces question specific instead of generic. references/questions-and-defaults.md has the full extraction and derivation tables.

Ask, in one call

Ask at most two questions, in a single AskUserQuestion call, and skip each one the brief already answers:

  1. How many directions? Options 2 and 3. Say in the question that three unnamed directions scaffold as 1.Refine (tokens and spacing, same structure), 2.Rework (new components, same layout) and 3.Rethink (new layout), two as 1.Refine and 2.Rethink, and are renamed later. Skip when the brief states a count or names the directions.
  2. Which surfaces? Multi-select from the usage sites the grep found, plus "only one place". Two or more selections produce the surfaces row. Skip when the brief names the places.

Never ask about theme, animation, Today, ports, the slug or the landing view; those are fixed by the skill. When no question can be asked (a headless run), write this before doing anything else, then proceed: "Defaulting to three directions and one surface (<surface>) because I cannot ask; change later with scaffold.mjs add-direction."

State what you derived, then scaffold

Before running the generator, state every derived value in your reply: slug and title, each surface as id:Label:width@nav with the line the width comes from, the direction count and names, the group, the capabilities with their feature-map rows (or [] and the exception sentence), the flag hook and the /api/ paths Today will need. A wrong slug or capability is cheap to catch here and expensive after files exist. Then:

node .agents/skills/directions-lab/scripts/scaffold.mjs new \
  --slug composer --title "Composer" \
  --surfaces thread:Task-thread:960@tasks,panel:Right-panel:434@tasks \
  --directions 3 --dry-run

Read the plan (paths, ports, cells, story), drop --dry-run, and run it. new renders everything in memory, refuses existing paths, writes the lab, the html entry, the Vite config, the story file, two .claude/launch.json entries and one .gitignore line, then verifies: the Storybook catalog check, the lab's own Vitest files, and a Vite build. On any failure it deletes what it wrote and restores the two shared files, so a half-written lab never breaks pnpm test or tsc -b for the whole repo (ui/vitest.config.ts has no include filter and ui/tsconfig.json includes all of src). Quote the --json output in your reply.

--surfaces takes id:Label:width@nav per place, where nav is the sidebar item the shell highlights (tasks, artifacts or other) and the width is the product's own constant for that place (see references/questions-and-defaults.md). Flags you will use: --names a,b,c for stated names, --group Components|Pages|Layouts|Patterns (Components when the grep hits ui/src/components), --capabilities area/key,... (validated against maps/feature-map; omit for [] plus an exception sentence), --company name:PREFIX (default acmehats:ACM), --landing auto|all|today|<id>, --ports dev,preview (the generator picks free ones), --keep-on-failure to inspect a failed scaffold.

Look at it

Start the dev entry the generator added, preview_start {name: "<slug>-directions-dev"}, and open three URLs: / (the landing), /?d=today&s=<first surface> and /?d=<first direction id>&s=<first surface> (d1-refine when the directions are unnamed). Confirm document.documentElement.dataset.labAnim === "1", hover a motion specimen and watch the front rise and the two pages turn, press a, hover again and see only the fill change. Read the console for [<slug>-directions] unhandled lines: each one is a route Today will need. The overview board and the capture script never show the movement (iframes take no pointer; stills ask for reduced motion; --hover records one hovered frame, not the transition), so the transition is verified only this way.

Commit the scaffold, then draw

Commit the untouched scaffold first as feat(ui): scaffold the <title> directions lab. Reviewers then see the redraw as its own diff, not buried under plumbing. Draw in this order; references/drawing-phases.md has the done-when for each:

  1. Frames. Replace each data-lab-stub="frame-<surface>" region with the product chrome around that place: copy the product's class strings, freeze the registry width, reuse presentational primitives, let nothing scroll internally. The precedent frames show how (ThreadFrame, PanelFrame, GalleryFrame, AppShell).
  2. Fixtures and Today. Retype the per-surface data in kit.ts to the props each place receives, fill fixtures.ts, mount the shipped component in directions/today/<Pascal>Body.tsx (PascalCase of the surface id, so ThreadBody.tsx for thread) through adapters.ts, and register exactly the routes it fetches inside registerFeatureRoutes() in api-routes.ts. Today is done when it matches the product on the same data and its test passes with the real component.
  3. Directions. One at a time: replace the motion specimen with the drawing, keep the hook names (data-front on every treatment branch, data-rotate and data-spread with the inline base angle), put every raw value in that direction's tokens.css (light base, .dark override), and leave the motion block alone. Run scaffold.mjs check --slug <slug> after each phase.

Phase 2 comes before 3 because the slot props change shape in phase 2 and every kit follows the type.

Capture

node ui/src/<slug>-directions/shot.cjs --port <dev> --d all --out <scratch dir>

Captures are rest states at 1440×900, DPR 2, both themes; attach the PNGs to the PR, never to the repo. --hover adds a rest/hover pair per direction from a second browser context that allows motion; the browser pane with the Animation toggle on is still the only place to judge the motion itself.

Hand off

node .agents/skills/directions-lab/scripts/scaffold.mjs check --slug <slug> --strict --run

--strict refuses any remaining data-lab-stub marker; --run runs the lab's tests, the catalog check, the token gates, a Vite build of the lab and cd ui && pnpm typecheck, stopping at the first failure, and prints a ## Verification block whose Not run: lines name what stays manual (pnpm build-storybook, the repo-wide typecheck); --json returns the same results as data, with those items under notRun. Open the PR with every section of .github/PULL_REQUEST_TEMPLATE.md filled, the linked-issue path B with three filled feature-request labels, the story id, the launch entries and the Vercel alias if you deployed. Offer the DESIGN.md directory row as text in the PR body; never apply it from a lab PR.

If the skill itself is in your diff, force-add it: /.agents/ is git-ignored and the repo's tracked skills were added with git add -f.

Storybook and the design directory

new writes ui/storybook/stories/design-proposals/<slug>-directions.stories.tsx with meta id design-<slug>-directions, title Design proposals/<Group>/<Title> directions/Compare, a literal parameters.paperclip block (status: "proposed", home: "design-proposals", implementation: "prototype", boundary: "fixtures", capabilities, exception, notes) and stories Compare, Today, one per direction, and TodayProductionPalette (the decorator themes the whole iframe with the proposal palette; this one opts out so Today can be seen as shipped). The page itself renders the production palette by default; ?proposal=1 wraps it in the proposal theme for a side-by-side with the entry. The catalog script validates all of it at Storybook start, in cd ui && pnpm typecheck and in CI.

The lifecycle a direction moves through, and what to edit by hand at each step, is in references/lifecycle.md: proposed (what new writes), adopted (product code behind an experimental setting, with a feature-home story), current (flag removed), historical (retired with a replacement, moved out of the proposals folder keeping its id). Today the catalog forces every entry in the proposals folder to stay proposed; the governance change that would let the directory carry current entries is written up as paste-ready diffs in references/canonical-directory.md. Offer it once, as its own PR, only when Tonio says yes.

Later asks

  • Add a direction: scaffold.mjs add-direction --slug <slug> --name <Name> (next digit, registry entry, kit directory with the motion block and a specimen, the story's D<N> export, then check, rolling back on failure). The toolbar legend follows the registry at runtime. The generator refuses a fourth without --force-count, which also records allowMore in the registry; the story description's "1–N" sentence is the one thing to update by hand. Once phase 2 has retyped the slot props in kit.ts, add-direction refuses and prints the by-hand steps instead, because a generated kit would not fit the new props.
  • List labs: scaffold.mjs list.
  • Rename a direction, add a surface, or move a direction through the lifecycle: by hand, following references/lab-anatomy.md section 5 and 8 and references/lifecycle.md.
  • Publish: build with <SLUG>_DIRECTIONS_OUT_DIR=<dir>/paperclip-<slug>-directions, remove sw.js from the output, vercel deploy <that dir> --prod --yes from its parent; the basename names the project and the alias is the public URL. references/today-fixtures-and-build.md section 11 has the details.

Do not

  • Run two full ui Vitest suites at once; run the lab's files alone.
  • Land on d=all&s=board from a dev server with more than eight cells; use the static launch entry (<slug>-directions) for the full board.
  • Copy the artifact lab's html:not(.dark) token idiom; new labs put light values in the base block and dark ones under .dark [data-direction=…].
  • Edit the motion block in a lab. A different rise or fan is Tonio's decision.
  • Add comments, package.json scripts, lockfile changes, PAP ids or localhost URLs to anything that goes in the PR.

Maintaining the skill

The generator's templates were derived from the precedent at the commit recorded in assets/PRECEDENT. scripts/scaffold.test.mjs pins the generated structure and asserts the motion asset still equals the precedent's block after substitution; when the precedent changes, re-derive the template and bump the pin. references/generator.md explains the template conventions and the context object.

References

FileRead it when
references/questions-and-defaults.mdBefore asking; derivation tables, eval prompts as flag lines
references/lab-anatomy.mdDrawing frames or changing the toolbar, state or board
references/today-fixtures-and-build.mdMounting Today, the fetch stub, build, capture, deploy
references/motion-spec.mdAny hover motion; the per-direction checklist
references/drawing-phases.mdAfter the scaffold, phase by phase
references/design-proposals-storybook.mdThe story file, the catalog gate, the theme
references/lifecycle.mdAdopting, shipping or retiring a direction
references/canonical-directory.mdOnly when Tonio approves the governance PR
references/repo-gates.mdBefore the PR
references/generator.mdChanging the generator

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

add-product-e2e-eval

무료요약 있음

Paperclip에서 실제 브라우저부터 서버, 데이터베이스, runner까지 검증하는 E2E 평가를 추가·확장합니다. 테스트 데이터와 판정 조건, 증거를 기존 보고서에 연결합니다.

  • 전체 사용자 작업 흐름의 평가 추가
  • 테스트 데이터와 판정 조건 갱신
  • 평가 보고서에 스크린샷과 산출물 추가
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

add-runner-eval

무료요약 있음

Paperclip Runner의 동작 평가에 판정 조건, 실행 대상, 보고서 검증 데이터를 추가하고 증거와 실행 이력을 남겨 검증합니다.

  • Runner 동작 평가를 추가합니다
  • 정상 및 잘못된 증거로 판정을 검증합니다
  • 실행 대상 목록과 지속 평가를 갱신합니다
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

agent-browser

무료요약 있음

실제 브라우저로 웹페이지와 앱을 조작하며 화면과 동작을 검증합니다. 스크린샷, 간단한 양식 입력, 오류 및 통신 기록으로 문제 재현과 결과 확인을 돕습니다.

  • UI 변경 후 화면을 확인합니다
  • JavaScript로 렌더링된 내용을 읽습니다
  • 화면 문제와 오류를 재현합니다
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

agentmail

무료요약 있음

Paperclip에서 할당받은 AgentMail 수신함으로 작업에 연결된 메일을 확인하고, 새 메일 전송과 답장, 전송 결과 확인까지 수행합니다.

  • 담당 작업에 연결된 메일을 확인합니다
  • 할당된 수신함에서 새 메일을 보냅니다
  • 대화의 특정 메시지에 답장합니다
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

check-pr

무료요약 있음

GitHub, GitLab, Perforce 변경의 검토 의견, 자동 검사 실패와 설명 누락을 확인하고, 할 일을 정리하며 요청에 따라 수정과 처리된 스레드 해결을 지원합니다.

  • 변경 사항을 제출하기 전에 점검합니다
  • 실패한 검사와 수정할 항목을 확인합니다
  • 사람과 봇의 검토 의견을 정리합니다
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

company-creator

무료요약 있음

구상이나 기존 저장소를 바탕으로 AI 에이전트의 역할, 보고 체계, 작업 인계를 정리하고 규격에 맞는 회사 또는 팀 패키지를 만듭니다.

  • 구상에서 에이전트 회사를 만듭니다
  • 저장소를 팀 구성으로 정리합니다
  • 역할 분담과 작업 인계를 설계합니다
paperclipai/paperclip10.9만2026년 10월 29일 업데이트

paperclipai의 스킬 모두 보기

이 스킬의 문제 신고