From jkit
Redesign an existing Flutter feature's UI (presentation/pages/views/widgets only) while preserving its bloc, domain, and infrastructure. Use when the user wants to apply a new design (Figma, Stitch, image, or text) to a feature without touching its business logic.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jkit:flutter-redesign-feature <free-form text containing target feature + design source><free-form text containing target feature + design source>The summary Claude sees in its skill listing — used to decide when to auto-load this skill
기존 Flutter feature의 UI(`presentation/{pages,views,widgets}`)만 새 디자인으로 재작성한다. BLoC·domain·infrastructure는 절대 건드리지 않는다.
기존 Flutter feature의 UI(presentation/{pages,views,widgets})만 새 디자인으로 재작성한다. BLoC·domain·infrastructure는 절대 건드리지 않는다.
BEFORE running this skill, you MUST first read:
자유 형식 입력에서 두 가지를 식별한다.
다음 순서로 진행:
홈/home, 상품/제품/product, 주문/order, 로그인/login, 회원가입/signup, 프로필/profile, 설정/settings, 검색/search, 장바구니/cart 등<entry>/lib/features/**/<keyword>/presentation/bloc/<keyword>_bloc.dart
| 입력 패턴 | 처리 방법 |
|---|---|
Stitch + Project ID/Screen ID | mcp__stitch__get_screen (가용 시) → 결과의 hosted URL을 curl -L/WebFetch로 다운로드 후 시각 인식 |
https://www.figma.com/... | WebFetch로 페이지 fetch |
.png/.jpg/.webp/.svg 파일 경로 | Read tool (이미지 시각 인식) |
| 그 외 URL | WebFetch |
| 자유 텍스트 설명만 | 텍스트를 디자인 명세로 사용 |
여러 소스가 동시에 들어오면 모두 fetch한 뒤 종합한다.
본 스킬이 수정할 수 있는 파일 범위 — import 제약은 별도로 architecture lint가 강제한다 (@LINT.md 참조).
<entry>/lib/features/<feature>/presentation/pages/**<entry>/lib/features/<feature>/presentation/views/**<entry>/lib/features/<feature>/presentation/widgets/**<entry>/lib/features/<feature>/presentation/bloc/** — BLoC Event/State는 계약. 시그니처 변경이 필요하면 본 스킬에서는 수정하지 않고 // TODO(bloc): 마커로 surface한다 ("Markers" 섹션 참조).<entry>/lib/features/<feature>/domain/**<entry>/lib/features/<feature>/infrastructure/**<entry>/lib/common/**<entry>/lib/di/**<entry>/lib/router/**import 가능 여부는
@LINT.md의presentation·bloc·usecases·ports·adapters레이어 룰을 따른다. 본 스킬은 lint 룰을 복제·요약하지 않으며, 위반은 9단계 검증의dart analyze에서 자동 검출된다.
새 디자인이 현재 BLoC/도메인/디자인 토큰으로 완전히 표현되지 않아도 UI 재작성을 끝까지 진행한다. 부족한 부분은 코드에 마커를 남기고 9단계 보고서에 surface해서 별도 작업으로 보완한다.
| 마커 | 용도 | 예시 |
|---|---|---|
// TODO(bloc): | 새 BLoC Event/State 또는 도메인 확장 필요 | // TODO(bloc): HomeEvent에 RankingRefreshed 추가 필요 |
// FIXME(design): | 미정의 디자인 토큰·공용 위젯 — 임시값 사용 중 | // FIXME(design): primaryAccent 토큰 미정의, 임시 hex 사용 |
// NOTE(scope): | 정보성 (예: common 승격 후보) | // NOTE(scope): common 승격 후보 |
규칙:
grep -rn "TODO(bloc)\|FIXME(design)\|NOTE(scope)" <entry>/lib/features/<feature>/presentation 결과를 그대로 노출 — 누락 방지.이후 모든 경로의 <entry> placeholder를 다음 규칙으로 결정:
app/lib/ 디렉토리가 존재하면 → <entry> = app (Melos workspace 컨벤션).lib/이 존재하면 → <entry> = . (프로젝트 루트 = entry).이후 단계에서 <entry>/lib/... 형식으로 표기된 경로는 위 규칙으로 치환되어 사용된다. <entry> = . 인 경우 ./lib/... 또는 단순히 lib/....
위 "$ARGUMENTS Parsing" 규칙으로 feature + 디자인 소스를 추출. 모호하면 즉시 halt + AskUserQuestion.
위 @ eager imports로 자동 로드. 특히 LINT.md의 presentation·bloc 레이어 import 제약을 한 번 더 확인.
다음 파일을 Read로 모두 읽어 BLoC 계약을 머릿속에 적재:
<entry>/lib/features/<feature>/presentation/bloc/<feature>_state.dart<entry>/lib/features/<feature>/presentation/bloc/<feature>_event.dart<entry>/lib/features/<feature>/presentation/bloc/<feature>_bloc.dartState 필드 = UI에 노출되는 데이터. Event = UI에서 dispatch 가능한 액션.
<entry>/lib/features/<feature>/presentation/{pages,views,widgets}/ 의 파일 트리만 파악(전체 내용 정독은 불필요). 어떤 위젯이 어떤 State 필드/Event를 사용 중인지 빠르게 매핑.
다운로드 데이터는 소스 종류별로 /tmp/<source>_<feature>/ 디렉토리에 저장한다 (없으면 mkdir -p로 생성). 저장 경로는 9단계 보고서에 surface된다.
mcp__stitch__get_project + mcp__stitch__get_screen 호출. 결과를 /tmp/stitch_<feature>/에 저장.
/tmp/stitch_<feature>/<feature>.png — curl -L -o로 hosted image URL 다운로드/tmp/stitch_<feature>/<feature>.html — Stitch 응답에서 추출/tmp/figma_<feature>/<feature>.html (+ 추출 이미지 <feature>.png)로 저장./tmp/redesign_<feature>/spec.txt로 저장.다음 형식으로 계획을 출력하고 사용자 승인 대기. 승인 없이 다음 단계로 진행 금지.
## 작업 계획
대상 feature: <feature>
디자인 소스: <type + ref>
### 변경 파일
- pages/<feature>_screen.dart (rewrite)
- views/<feature>_body_view.dart (rewrite)
- widgets/<feature>_card.dart (new)
- widgets/<feature>_old_banner.dart (delete)
### State → UI 매핑
- <Feature>State.field1 → <UI 요소>
- <Feature>State.field2 → <UI 요소>
### Event → UI 트리거
- <Feature>Event.loadRequested ← initState
- <Feature>Event.refreshRequested ← pull-to-refresh
### 마커 예정 (사후 보완 필요)
- TODO(bloc): <FeatureEvent>에 X 추가 — 디자인 Y 항목 위해 필요
- FIXME(design): <토큰명> 미정의 — 임시 hex 사용 예정
- (없으면 "없음")
AskUserQuestion으로 옵션 제시: ["진행", "수정 요청", "취소"].
허용 경로 안에서만 파일을 생성/수정/삭제. import 제약 준수. BLoC Event는 dispatch만, 비즈니스 결정 금지.
현재 BLoC/도메인/디자인 토큰으로 표현 불가능한 부분은 위 "Markers" 섹션의 컨벤션으로 마커를 남기고 진행한다. 빈 콜백·더미값·임시 hex에 마커 누락 금지.
<entry> 디렉토리에서 dart analyze 실행:
# <entry>가 'app'인 경우
cd app && dart analyze
# <entry>가 '.'인 경우 (루트)
dart analyze
이어서 변경 범위 검사:
git diff --name-only
<entry>/lib/features/<feature>/presentation/(pages|views|widgets)/ 아래여야 한다.## 변경 파일
- pages/<feature>_screen.dart (rewrite, 132→89줄)
- views/<feature>_body_view.dart (rewrite)
- widgets/<feature>_card.dart (new)
- widgets/<feature>_old_banner.dart (delete)
## State → UI 매핑
- <Feature>State.field1 → <UI>
## Lint 결과
dart analyze: 0 errors, 0 warnings
## 디자인 소스 데이터
- /tmp/stitch_<feature>/<feature>.png (Stitch 스크린샷)
- /tmp/stitch_<feature>/<feature>.html (Stitch Tailwind HTML)
- /tmp/figma_<feature>/<feature>.html (Figma 페이지)
- /tmp/redesign_<feature>/spec.txt (자유 텍스트)
- /abs/path/to/input.png (이미지 경로 입력 — 원본)
## 사후 보완 항목 (마커)
- pages/<feature>_screen.dart:42 TODO(bloc): HomeEvent에 RankingRefreshed 추가 필요
- widgets/<feature>_card.dart:18 FIXME(design): primaryAccent 토큰 미정의, 임시 hex 사용
- (없으면 "없음" — `grep -rn "TODO(bloc)\|FIXME(design)\|NOTE(scope)"` 결과 그대로)
진짜 halt는 disambiguation·fetch 실패·자동 수정 불가 케이스만. BLoC/토큰 부족은 marker 삽입 후 자동 진행.
| 조건 | 처리 |
|---|---|
| feature 키워드 모호 / glob 결과 0개 또는 다중 | halt + AskUserQuestion (후보 리스트) |
| 디자인 소스 fetch 실패 | halt + "Stitch/Figma fetch 실패: . 재시도 또는 다른 소스?" |
dart analyze 에러를 자동 수정 불가 | halt + 에러 원문 제시 |
git diff에 범위 밖 파일 존재 | halt + "범위 밖 변경: <파일 리스트>. 롤백할까요?" |
| 새 BLoC Event 필요 | // TODO(bloc): 마커 + 빈 콜백, 진행 |
| 새 BLoC State 필드 필요 | // TODO(bloc): 마커 + 더미값/생략 처리, 진행 |
| 새 공용 위젯 필요 | feature/widgets에 생성 + // NOTE(scope): common 승격 후보, 진행 |
| Theme 토큰 변경 필요 | // FIXME(design): 마커 + 임시값, 진행 |
/jkit:flutter-redesign-feature
## Stitch Instructions
Get the images and code for the following Stitch project's screens:
## Project
Title: <project title>
ID: <project id>
## Screens:
1. <screen name>
ID: <screen id>
Use a utility like `curl -L` to download the hosted URLs. <feature 키워드> UI 변경 해줘
→ feature: 키워드에서 추출, source: Stitch (project/screen ID). pages/<feature>_screen.dart + views/* + widgets/* 재작성.
/jkit:flutter-redesign-feature <figma URL> <feature 키워드> UI 새 디자인 적용해줘
→ source: Figma URL → WebFetch로 fetch.
/jkit:flutter-redesign-feature <이미지 경로> <feature 키워드> 화면 이렇게 바꿔줘
→ source: 로컬 이미지 → Read로 시각 인식.
/jkit:flutter-redesign-feature <feature 키워드> 화면을 <스타일 설명>으로 바꿔줘.
→ source: 텍스트 설명 그대로 디자인 명세로 사용.
common/widgets/·common/theme/ 변경은 범위 밖. 새 공용 위젯이 명확히 필요하면 feature/widgets에 우선 둔 뒤 // NOTE(scope): common 승격 후보 마커로 표시한다.dart analyze로 자동 검출되며, 발견 시 즉시 수정 후 재검증한다.npx claudepluginhub josephnk/jkit-code-plugin --plugin jkitProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.