fsd-workshop/skills/framework-adapter/SKILL.md
fsd-workshop 파이프라인의 3단계 (최종). structure-planner가 완성한 fsd-blueprint.md를 입력받아 특정 프레임워크(Next.js App Router, SvelteKit, Nuxt, Angular, React+Vite 등)의 강제 폴더 구조와 FSD를 통합한 최종 디렉터리 트리를 생성하고 fsd-blueprint.md를 완성한다. "FSD 폴더 구조 만들어줘", "Next.js에서 FSD 어떻게 써", "fsd-workshop 3단계", "framework-adapter", "SvelteKit FSD 구조", "프레임워크별 FSD 매핑", "폴더 트리 완성" 같은 요청에 트리거. 반드시 structure-planner 완료 후 실행한다.
npx skillsauth add dev-goraebap/skills framework-adapterInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
fsd-workshop 파이프라인의 최종 단계. 프레임워크가 강제하는 폴더 구조와 FSD 레이어를 통합해 실제 폴더 트리를 생성한다.
프레임워크마다 라우팅 폴더가 다르고 FSD의 pages / app 레이어와 충돌이 생기는 문제를 해결하는 것이 이 스킬의 핵심 역할이다.
fsd-blueprint.md가 존재하고 structure-planner 단계까지 완료되어야 한다. 파일을 먼저 읽어 프레임워크, 페이지 목록, 레이아웃, 공용 컴포넌트 정보를 파악한다.
파일이 없거나 structure-planner 섹션이 비어 있으면:
fsd-blueprint.md의 레이아웃 구조 / 공용 컴포넌트 섹션이 비어 있습니다.
먼저 `fsd-workshop:structure-planner`를 실행해 주세요.
fsd-blueprint.md의 메타 섹션에서 프레임워크를 읽는다. 미정이거나 다른 프레임워크를 쓰고 싶다면 확인한다.
현재 선택된 프레임워크: [값 또는 미정]
다른 프레임워크로 변경하거나 미정이면 선택해 주세요.
1) Next.js (App Router)
2) Next.js (Pages Router)
3) SvelteKit
4) Nuxt
5) Angular
6) React + Vite (TanStack Router / React Router)
7) Vue + Vite (Vue Router)
8) 현재 값 유지
모든 SSR/파일기반 라우팅 프레임워크에서 공통으로 적용되는 패턴:
프레임워크 라우팅 폴더는 얇은 re-export 껍데기다.
실제 구현은src/아래 FSD 레이어에 있고, 라우팅 파일은 FSDpages레이어를 import만 한다.
FSD와의 충돌: app/ 폴더가 Next.js 라우팅을 담당하며 FSD의 app 레이어와 이름이 겹친다.
해결책:
[project-root]/
├── app/ # Next.js 라우팅 껍데기 (re-export만)
│ ├── (auth)/
│ │ ├── login/
│ │ │ └── page.tsx # export { LoginPage as default } from '@/pages/login'
│ │ └── layout.tsx # export { AuthLayout as default } from '@/app/layouts/auth'
│ ├── (main)/
│ │ ├── dashboard/
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ └── not-found.tsx
├── pages/ # 빈 폴더 (Next.js Pages Router 오인 방지용)
│ └── README.md
└── src/
├── app/ # FSD app 레이어
│ ├── layouts/
│ │ ├── auth-layout.tsx
│ │ └── main-layout.tsx
│ ├── providers/
│ └── styles/
├── pages/ # FSD pages 레이어
│ ├── login/
│ │ ├── ui/
│ │ │ └── LoginPage.tsx
│ │ └── index.ts
│ └── dashboard/
├── widgets/
├── features/
├── entities/
└── shared/
Route Group (auth), (main), (admin) 등을 활용해 레이아웃을 분리한다.
[project-root]/
├── pages/ # Next.js 라우팅 껍데기
│ ├── _app.tsx # export { App as default } from '@/app/custom-app'
│ ├── login.tsx # export { LoginPage as default } from '@/pages/login'
│ └── dashboard.tsx
└── src/
├── app/
│ └── custom-app/
├── pages/ # FSD pages 레이어
├── widgets/
├── features/
├── entities/
└── shared/
config 변경으로 라우팅 폴더를 src/app/routes로 이동한다.
# svelte.config.ts 변경 필요
files: {
routes: 'src/app/routes',
lib: 'src',
appTemplate: 'src/app/app.html'
}
alias: { '@/*': 'src/*' }
src/
├── app/
│ ├── routes/ # SvelteKit 라우팅 껍데기
│ │ ├── (auth)/
│ │ │ ├── login/
│ │ │ │ └── +page.svelte # <script>import { LoginPage } from '@/pages/login'</script>
│ │ │ └── +layout.svelte
│ │ └── (main)/
│ │ └── +layout.svelte
│ ├── layouts/
│ └── app.html
├── pages/ # FSD pages 레이어
├── widgets/
├── features/
├── entities/
└── shared/
config 변경으로 라우팅과 레이아웃 폴더를 src/app/ 안으로 이동한다.
# nuxt.config.ts 변경 필요
dir: {
pages: './src/app/routes',
layouts: './src/app/layouts'
}
alias: { '@': '../src' }
src/
├── app/
│ ├── routes/ # Nuxt 라우팅 껍데기
│ ├── layouts/ # Nuxt 레이아웃
│ └── router.config.ts
├── pages/ # FSD pages 레이어
├── widgets/
├── features/
├── entities/
└── shared/
Angular는 파일 기반 라우팅이 없으므로 FSD와의 구조적 충돌이 적다. 라우팅 설정은 app/routes 세그먼트에 둔다.
src/
├── app/ # FSD app 레이어 (= Angular root module)
│ ├── routes/ # 라우팅 설정 (RouterModule 또는 provideRouter)
│ │ └── app.routes.ts
│ ├── layouts/
│ │ ├── auth-layout/
│ │ └── main-layout/
│ └── app.config.ts
├── pages/
│ ├── login/
│ │ ├── ui/
│ │ │ └── login-page.component.ts
│ │ └── index.ts
│ └── dashboard/
├── widgets/
├── features/
├── entities/
└── shared/
├── ui/
├── api/
├── auth/ # 토큰 관리 복잡 시
└── lib/
파일 기반 라우팅이 없으므로 순수 FSD 구조에 가장 가깝다.
src/
├── app/
│ ├── router.tsx # createBrowserRouter 설정
│ ├── providers/
│ └── styles/
├── pages/
├── widgets/
├── features/
├── entities/
└── shared/
fsd-blueprint.md의 정보(페이지 목록, 레이아웃, shared/ui, widgets)를 기반으로 실제 폴더 트리를 작성한다.
폴더 트리 작성 규칙:
pages 레이어: 페이지 목록의 모든 항목을 슬라이스로 생성widgets 레이어: widgets 후보 목록의 모든 항목 생성shared/ui: shared/ui 후보 목록 기반shared/api: 기본 생성 (API 클라이언트)shared/auth: 토큰 관리가 중간 이상인 경우만 생성features, entities: 빈 폴더로만 표시 (구현 시 채움)공통 표시 규칙:
# [설명] 형태로 중요한 파일/폴더에 주석 추가index.ts)은 슬라이스마다 표시기존 파일에 폴더 트리 섹션을 추가하고 진행 상태를 업데이트한다.
## 폴더 트리
> 프레임워크: [프레임워크명]
> FSD 통합 패턴: [패턴 설명]
\`\`\`
[실제 폴더 트리]
\`\`\`
### 주요 파일 설명
| 파일/폴더 | 역할 |
|---------|------|
| `app/[route]/page.tsx` | Next.js 라우팅 껍데기 — FSD pages 레이어 re-export |
| `src/app/layouts/` | 레이아웃 컴포넌트 (FSD app 레이어) |
| `src/shared/auth/` | 토큰 관리 전용 세그먼트 |
| ... | ... |
### 설정 파일 변경 사항
[프레임워크별 필요한 config 변경 내용 요약]
업데이트 후 진행 상태:
> **현재 단계**: 3/3 — 완료 ✅
□ fsd-blueprint.md 읽기 완료 (메타, 페이지, 레이아웃, 공용컴포넌트 파악)
□ 프레임워크 확정됨
□ 프레임워크 충돌 해결 방식 적용됨 (re-export 패턴)
□ 모든 페이지가 pages 레이어 슬라이스로 매핑됨
□ 모든 레이아웃이 올바른 레이어에 배치됨
□ shared/ui 후보가 shared/ui 폴더에 반영됨
□ widgets 후보가 widgets 폴더에 반영됨
□ shared/auth 생성 여부 토큰 복잡도에 따라 결정됨
□ 프레임워크 config 변경 사항 명시됨
□ 기존 fsd-blueprint.md 내용 보존됨
□ 진행 단계 3/3 완료로 업데이트됨
testing
도메인 일반 패턴을 강의 모드로 가르치는 인지과학 기반 학습 스킬. AI가 가상 도메인 전문가(선생님) 역할을 하고 사용자가 학생으로 낯선 도메인을 차근차근 배운다. 메뉴로 시작해서 페이즈를 골라 잠수 → 능동 회상 Q&A → 자기 설명(Feynman) 순서로 진행. Dunlosky 메타분석 기반 인지과학 8원칙(Cognitive Load, Practice Testing, 정교화 질문, Self-Explanation, Schema 연결, Dual Coding, Desirable Difficulty, 분산 학습)을 본문에 명시 적용. 도메인의 법령·산업 표준·인증을 학습 본문에 정식 통합 (출처 인용이 아니라 학습 대상). AI가 판단해 보편적이고 자료 풍부한 도메인은 자료 요청 없이 진행, 좁고 깊은 도메인일 때만 사용자에게 자료 있는지 묻기. 산출물은 학습 노트 스타일 (진도 체크박스 + 페이즈별 일관 구조 + 출처 링크). 페르소나 강요 없이 보편 액터 표현("사원 A", "관리자 A"). bigpicture의 이전 단계로 작동하거나 단독 사용 가능. Triggers — "도메인 학습", "낯선 도메인 가르쳐줘", "이 산업 어떻게 굴러가요", "선생님 모드", "1:1 강의", "도메인 입문", "도메인 일반 패턴", "HR 플랫폼이 뭔지", "이커머스 흐름", "domain classroom", "/domain-classroom".
development
빅픽처 이벤트스토밍의 1:1 분석 도구. 학습 단계(domain-classroom)에서 머리에 박힌 도메인 일반 패턴을 클라이언트 시스템에 매핑해 빅픽처 산출물(시간순 도메인 이벤트·페이즈·액터·외부시스템·핫스팟·피벗)을 누적한다. domain-classroom의 학습 노트(docs/learning-notes/{도메인}- classroom.md)와 클라이언트 자료(RFP·요구사항정의서·기존 시스템 스키마)를 입력으로 받아 페이즈 단위로 진행. 페르소나·서사 없는 분석 톤. 도메인 이벤트 판별 4기준(도메인 전문가 관심·비즈니스 상태 변화·법적 의미·다른 흐름 트리거)을 명시 적용해 UI/Telemetry 이벤트 혼입 방지. 이벤트는 한국어 자연어 + Code Identifier 이중 표기. 핫스팟에 ID·답할 위치·확신도 태그 부여. 산출물은 docs/eventstorming.md 단일 파일로 시작, 후속 단계 스킬(process-modeling·software-design)이 추가될 때 폴더로 자연 분기. Initial/Update/Cycle 모드 지원 — 코드 작성 후에도 다시 사이클 가능. Triggers — "빅픽처", "빅픽처 만들어줘", "이벤트스토밍", "도메인 이벤트 정리", "Big Picture EventStorming", "페이즈 매핑", "도메인 산출물 정리", "/bigpicture".
data-ai
빅픽처 이벤트스토밍의 1:1 학습 친화 변형. 그룹 워크샵에서 도메인 전문가가 던지는 이벤트를 받아 적는 대신, AI가 가상 도메인 전문가 역할을 하고 사용자가 학습자로 1:1 인터뷰하며 빅픽처를 누적한다. 산출물(시간순 도메인 이벤트·액터· 외부시스템·핫스팟·피벗)은 빅픽처 이벤트스토밍과 거의 동일하지만, 한 보드에 한 번에 펼치는 방식이 아니라 **한 액터·한 챕터씩 시간순 서사로 누적**한다. 각 장면마다 "왜 이게 필요한가?" 설명을 곁들여 학습자가 따라올 수 있게 한다. RFP·요구사항정의서·기존 도메인 자료를 입력으로 받거나, 자료가 없으면 AI 사전 리서치(보편 사례·법령·산업 표준)로 보충해 진행. 페르소나 시점의 챕터 단위 (5~7개 장면) + 확신도 태그 [확실/일반론/추측]로 검증 지점 명시 + 사용자 인터랙션 + 액터 전환으로 빅픽처를 점진적으로 채운다. 산출물 저장은 옵셔널 — 이해 자체가 목적이다. Triggers — "낯선 도메인 이해", "도메인 차근차근 알려줘", "1:1 빅픽처", "솔로 이벤트스토밍", "RFP 분석", "비즈니스 흐름 이해", "액터 시나리오", "신규 프로젝트 도메인 파악", "빅픽처 스토리타임", "bigpicture storytime", "/bigpicture-storytime".
databases
PostgreSQL DB에 직접 접근하는 스킬. DB 조회, 테이블 구조 확인, 데이터 검증이 필요할 때 사용한다. Node.js 스크립트로 직접 연결하며 접속 정보는 환경변수 또는 credentials 파일에서 읽는다. "postgres 조회", "DB 확인", "테이블 구조", "pg-query", "쿼리 실행", "데이터 검증", "PostgreSQL 접속" 같은 요청에 트리거한다.