@juho0719/cckit 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/skills/plan-viewer/SKILL.md +162 -0
- package/assets/skills/plan-viewer/scripts/frame-template.html +266 -0
- package/assets/skills/plan-viewer/scripts/helper.js +84 -0
- package/assets/skills/plan-viewer/scripts/server.js +334 -0
- package/assets/skills/plan-viewer/scripts/start-server.sh +122 -0
- package/assets/skills/plan-viewer/scripts/stop-server.sh +27 -0
- package/assets/skills/plan-viewer/spec-reviewer-prompt.md +47 -0
- package/assets/skills/plan-viewer/visual-guide.md +234 -0
- package/assets/skills/scaffold/SKILL.md +119 -0
- package/assets/skills/scaffold/presets.md +94 -0
- package/assets/skills/scaffold/scripts/common.sh +73 -0
- package/assets/skills/scaffold/scripts/monorepo.sh +449 -0
- package/assets/skills/scaffold/scripts/nextjs-fullstack.sh +305 -0
- package/dist/agents-LI3AHTTX.js +10 -0
- package/dist/{chunk-3Y26YU4R.js → chunk-33CGM7PI.js} +7 -3
- package/dist/{chunk-5XOKKPAA.js → chunk-4NEXS2FY.js} +5 -0
- package/dist/{chunk-W7RWPDBH.js → chunk-52Q6TDAH.js} +7 -3
- package/dist/{chunk-E3INXQNO.js → chunk-6COBMJZ6.js} +5 -1
- package/dist/{chunk-SW3OJLHC.js → chunk-7VVGOZDZ.js} +5 -1
- package/dist/{chunk-K25UZZVG.js → chunk-FLBB3OH4.js} +5 -0
- package/dist/{chunk-ID643AV4.js → chunk-H4YDYF2X.js} +7 -3
- package/dist/{chunk-KEENFBLL.js → chunk-MSCXXA2X.js} +6 -2
- package/dist/{chunk-3GUKEMND.js → chunk-T5VPG46W.js} +5 -0
- package/dist/chunk-TLOORH3N.js +50 -0
- package/dist/{chunk-W63UKEIT.js → chunk-VN5S6JGZ.js} +5 -0
- package/dist/{chunk-EYY2IZ7N.js → chunk-ZBGGTONN.js} +7 -3
- package/dist/claudemd-NWG63O2G.js +8 -0
- package/dist/cli-KHRWBZPV.js +2735 -0
- package/dist/commands-UAOYWGUX.js +10 -0
- package/dist/hooks-NONUWI6V.js +10 -0
- package/dist/index.js +21 -17
- package/dist/mcps-ISPG3F7T.js +7 -0
- package/dist/{paths-FT6KBIRD.js → paths-B754SP2D.js} +2 -1
- package/dist/{registry-KRLOB4TH.js → registry-6CLDID6R.js} +3 -2
- package/dist/rules-GZEAGCSL.js +10 -0
- package/dist/skills-ML3QLXUK.js +9 -0
- package/dist/{uninstall-cli-GLYJG5V2.js → uninstall-cli-XU7E26JX.js} +14 -2
- package/package.json +1 -1
- package/dist/agents-AEKT67A6.js +0 -9
- package/dist/claudemd-KKQ2DL7P.js +0 -7
- package/dist/cli-KZYBSIXO.js +0 -314
- package/dist/commands-P5LILVZ5.js +0 -9
- package/dist/hooks-A2WQ2LGG.js +0 -9
- package/dist/mcps-67Q7TBGW.js +0 -6
- package/dist/rules-EFSJ3L3A.js +0 -9
- package/dist/skills-ULMW3UCM.js +0 -8
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Visual Guide — Plan Viewer
|
|
2
|
+
|
|
3
|
+
브라우저 기반 비주얼 뷰어 상세 가이드. 아키텍처 다이어그램, 플로우차트, 레이아웃 비교 등 시각 자료를 보여줄 때 참조한다.
|
|
4
|
+
|
|
5
|
+
## 동작 원리
|
|
6
|
+
|
|
7
|
+
서버가 `.plan-viewer/sessions/<session-id>` 디렉터리를 감시하고, 가장 최신 HTML 파일을 브라우저에 서빙한다. HTML 파일을 작성하면 사용자 브라우저에 자동 반영되고, 사용자의 클릭 이벤트는 `.events` 파일에 기록된다.
|
|
8
|
+
|
|
9
|
+
**콘텐츠 프래그먼트 vs 풀 도큐먼트:** HTML 파일이 `<!DOCTYPE` 또는 `<html`로 시작하면 그대로 서빙한다. 그렇지 않으면 프레임 템플릿으로 자동 래핑한다. **기본적으로 콘텐츠 프래그먼트만 작성한다.**
|
|
10
|
+
|
|
11
|
+
## 서버 시작
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 프로젝트 디렉터리에 영구 저장
|
|
15
|
+
scripts/start-server.sh --project-dir /path/to/project
|
|
16
|
+
|
|
17
|
+
# 반환 JSON:
|
|
18
|
+
# {"type":"server-started","port":52341,"url":"http://localhost:52341",
|
|
19
|
+
# "screen_dir":"/path/to/project/.plan-viewer/sessions/12345-1706000000"}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`screen_dir`을 저장한다. 사용자에게 URL을 알려준다.
|
|
23
|
+
|
|
24
|
+
## 루프
|
|
25
|
+
|
|
26
|
+
1. **서버 활성 확인 후 HTML 작성** — `screen_dir`에 새 파일 작성
|
|
27
|
+
- 매번 `$SCREEN_DIR/.server-info` 존재 확인. 없으면 (또는 `.server-stopped` 있으면) 서버 재시작
|
|
28
|
+
- 시맨틱 파일명 사용: `architecture.html`, `data-flow.html`, `comparison.html`
|
|
29
|
+
- **파일명 재사용 금지** — 매 화면마다 새 파일
|
|
30
|
+
- Write 도구 사용 — cat/heredoc 금지
|
|
31
|
+
- 서버가 자동으로 최신 파일을 서빙
|
|
32
|
+
|
|
33
|
+
2. **사용자에게 안내하고 턴 종료:**
|
|
34
|
+
- URL을 매번 상기 (첫 번째뿐 아니라 매번)
|
|
35
|
+
- 화면 내용을 간략히 텍스트로 요약
|
|
36
|
+
- 예: "3가지 아키텍처 접근안을 브라우저에서 확인하세요. 선호하는 옵션을 클릭하세요."
|
|
37
|
+
|
|
38
|
+
3. **다음 턴** — 사용자 응답 후:
|
|
39
|
+
- `$SCREEN_DIR/.events` 읽기 (있으면) — 클릭/선택 이벤트 JSON
|
|
40
|
+
- 사용자의 터미널 텍스트와 병합
|
|
41
|
+
- 터미널 메시지가 주 피드백, `.events`는 보조
|
|
42
|
+
|
|
43
|
+
4. **반복 또는 진행** — 피드백으로 현재 화면 수정 시 새 파일 작성 (예: `architecture-v2.html`)
|
|
44
|
+
|
|
45
|
+
5. **터미널 복귀 시 대기 화면 표시** — 다음 단계가 브라우저 불필요할 때:
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<!-- filename: waiting.html -->
|
|
49
|
+
<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
|
|
50
|
+
<p class="subtitle">터미널에서 계속 진행 중...</p>
|
|
51
|
+
</div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
6. 반복.
|
|
55
|
+
|
|
56
|
+
## 콘텐츠 프래그먼트 작성
|
|
57
|
+
|
|
58
|
+
프레임 안에 들어갈 콘텐츠만 작성한다. 서버가 자동으로 프레임 템플릿(헤더, CSS, 선택 인디케이터 등)을 감싸준다.
|
|
59
|
+
|
|
60
|
+
### 아키텍처 다이어그램 예시
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<h2>시스템 아키텍처</h2>
|
|
64
|
+
<p class="subtitle">제안하는 전체 아키텍처 구성</p>
|
|
65
|
+
|
|
66
|
+
<div class="mockup">
|
|
67
|
+
<div class="mockup-header">Architecture Diagram</div>
|
|
68
|
+
<div class="mockup-body">
|
|
69
|
+
<div style="display:flex;gap:2rem;justify-content:center;flex-wrap:wrap;">
|
|
70
|
+
<div class="placeholder" style="width:150px;padding:1.5rem;">
|
|
71
|
+
<strong>API Gateway</strong><br><small>인증, 라우팅</small>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="placeholder" style="width:150px;padding:1.5rem;">
|
|
74
|
+
<strong>Service A</strong><br><small>비즈니스 로직</small>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="placeholder" style="width:150px;padding:1.5rem;">
|
|
77
|
+
<strong>Service B</strong><br><small>데이터 처리</small>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div style="text-align:center;margin:1rem 0;color:var(--text-secondary);">
|
|
81
|
+
↕ REST / gRPC
|
|
82
|
+
</div>
|
|
83
|
+
<div style="display:flex;gap:2rem;justify-content:center;">
|
|
84
|
+
<div class="placeholder" style="width:150px;padding:1.5rem;">
|
|
85
|
+
<strong>PostgreSQL</strong>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="placeholder" style="width:150px;padding:1.5rem;">
|
|
88
|
+
<strong>Redis</strong>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 접근안 비교 예시
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<h2>아키텍처 접근안 비교</h2>
|
|
99
|
+
<p class="subtitle">각 접근안의 장단점을 비교하세요</p>
|
|
100
|
+
|
|
101
|
+
<div class="options">
|
|
102
|
+
<div class="option" data-choice="a" onclick="toggleSelect(this)">
|
|
103
|
+
<div class="letter">A</div>
|
|
104
|
+
<div class="content">
|
|
105
|
+
<h3>모놀리스</h3>
|
|
106
|
+
<p>단일 애플리케이션으로 빠른 개발, 단순한 배포</p>
|
|
107
|
+
<div class="pros-cons" style="margin-top:0.5rem;">
|
|
108
|
+
<div class="pros"><h4>Pros</h4><ul><li>빠른 초기 개발</li><li>단순한 인프라</li></ul></div>
|
|
109
|
+
<div class="cons"><h4>Cons</h4><ul><li>스케일링 제한</li><li>결합도 높음</li></ul></div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="option" data-choice="b" onclick="toggleSelect(this)">
|
|
114
|
+
<div class="letter">B</div>
|
|
115
|
+
<div class="content">
|
|
116
|
+
<h3>마이크로서비스</h3>
|
|
117
|
+
<p>독립적 서비스로 유연한 스케일링</p>
|
|
118
|
+
<div class="pros-cons" style="margin-top:0.5rem;">
|
|
119
|
+
<div class="pros"><h4>Pros</h4><ul><li>독립 배포</li><li>기술 스택 자유</li></ul></div>
|
|
120
|
+
<div class="cons"><h4>Cons</h4><ul><li>운영 복잡도</li><li>네트워크 오버헤드</li></ul></div>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 데이터 흐름 예시
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<h2>데이터 흐름</h2>
|
|
131
|
+
<p class="subtitle">요청부터 응답까지의 데이터 흐름</p>
|
|
132
|
+
|
|
133
|
+
<div class="mockup">
|
|
134
|
+
<div class="mockup-header">Data Flow</div>
|
|
135
|
+
<div class="mockup-body" style="font-family:monospace;font-size:0.85rem;line-height:2;">
|
|
136
|
+
<div>Client → API Gateway → Auth Middleware</div>
|
|
137
|
+
<div style="padding-left:2rem;">↓</div>
|
|
138
|
+
<div style="padding-left:2rem;">Route Handler → Service Layer</div>
|
|
139
|
+
<div style="padding-left:4rem;">↓</div>
|
|
140
|
+
<div style="padding-left:4rem;">Repository → Database</div>
|
|
141
|
+
<div style="padding-left:4rem;">↓</div>
|
|
142
|
+
<div style="padding-left:4rem;">Cache (Redis) ← Response</div>
|
|
143
|
+
<div style="padding-left:2rem;">↓</div>
|
|
144
|
+
<div>Client ← Serialized Response</div>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## CSS 클래스 레퍼런스
|
|
150
|
+
|
|
151
|
+
프레임 템플릿이 제공하는 CSS 클래스:
|
|
152
|
+
|
|
153
|
+
### Options (A/B/C 선택)
|
|
154
|
+
```html
|
|
155
|
+
<div class="options">
|
|
156
|
+
<div class="option" data-choice="a" onclick="toggleSelect(this)">
|
|
157
|
+
<div class="letter">A</div>
|
|
158
|
+
<div class="content"><h3>제목</h3><p>설명</p></div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**다중 선택:** 컨테이너에 `data-multiselect` 추가.
|
|
164
|
+
|
|
165
|
+
### Cards (시각적 디자인)
|
|
166
|
+
```html
|
|
167
|
+
<div class="cards">
|
|
168
|
+
<div class="card" data-choice="design1" onclick="toggleSelect(this)">
|
|
169
|
+
<div class="card-image"><!-- 내용 --></div>
|
|
170
|
+
<div class="card-body"><h3>이름</h3><p>설명</p></div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Mockup 컨테이너
|
|
176
|
+
```html
|
|
177
|
+
<div class="mockup">
|
|
178
|
+
<div class="mockup-header">제목</div>
|
|
179
|
+
<div class="mockup-body"><!-- 내용 --></div>
|
|
180
|
+
</div>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Split view (나란히 비교)
|
|
184
|
+
```html
|
|
185
|
+
<div class="split">
|
|
186
|
+
<div class="mockup"><!-- 왼쪽 --></div>
|
|
187
|
+
<div class="mockup"><!-- 오른쪽 --></div>
|
|
188
|
+
</div>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Pros/Cons
|
|
192
|
+
```html
|
|
193
|
+
<div class="pros-cons">
|
|
194
|
+
<div class="pros"><h4>Pros</h4><ul><li>장점</li></ul></div>
|
|
195
|
+
<div class="cons"><h4>Cons</h4><ul><li>단점</li></ul></div>
|
|
196
|
+
</div>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Placeholder (와이어프레임 블록)
|
|
200
|
+
```html
|
|
201
|
+
<div class="placeholder">영역 설명</div>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Typography
|
|
205
|
+
- `h2` — 페이지 제목
|
|
206
|
+
- `h3` — 섹션 제목
|
|
207
|
+
- `.subtitle` — 부제
|
|
208
|
+
- `.section` — 콘텐츠 블록
|
|
209
|
+
- `.label` — 소문자 라벨
|
|
210
|
+
|
|
211
|
+
## 브라우저 이벤트 형식
|
|
212
|
+
|
|
213
|
+
`$SCREEN_DIR/.events`에 JSON 라인으로 기록:
|
|
214
|
+
|
|
215
|
+
```jsonl
|
|
216
|
+
{"type":"click","choice":"a","text":"Option A - 모놀리스","timestamp":1706000101}
|
|
217
|
+
{"type":"click","choice":"b","text":"Option B - 마이크로서비스","timestamp":1706000108}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
마지막 이벤트가 최종 선택일 가능성이 높지만, 클릭 패턴에서 고민을 읽을 수 있다.
|
|
221
|
+
|
|
222
|
+
## 파일 네이밍
|
|
223
|
+
|
|
224
|
+
- 시맨틱 이름: `architecture.html`, `data-flow.html`, `comparison.html`
|
|
225
|
+
- 파일명 재사용 금지 — 매 화면 새 파일
|
|
226
|
+
- 반복 시: `architecture-v2.html`, `architecture-v3.html`
|
|
227
|
+
|
|
228
|
+
## 서버 종료
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
scripts/stop-server.sh $SCREEN_DIR
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
`--project-dir` 사용 시 `.plan-viewer/sessions/`에 파일이 유지된다.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scaffold
|
|
3
|
+
description: Integrated project scaffolding launcher. Generates projects for various technology stacks based on presets. Use it when you receive requests such as “create a new project,” “initialize a project,” or “scaffold.”
|
|
4
|
+
argument-hint: <project-name> [--preset nextjs-fullstack|monorepo] [--db sqlite|postgres] [--ui shadcn|none] [--pm bun|npm|pnpm] [--packages pkg1 pkg2 ...]
|
|
5
|
+
allowed-tools: Bash, Read, Write, Edit, Glob
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# scaffold
|
|
9
|
+
|
|
10
|
+
Integrated project scaffolding skill. When you select a preset, it automatically generates a project structure that matches the chosen stack.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Usage Examples
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/scaffold my-app
|
|
18
|
+
/scaffold my-app --preset nextjs-fullstack
|
|
19
|
+
/scaffold my-app --preset nextjs-fullstack --db postgres --ui none --pm pnpm
|
|
20
|
+
/scaffold my-mono --preset monorepo
|
|
21
|
+
/scaffold my-mono --preset monorepo --packages core utils api --pm pnpm
|
|
22
|
+
/scaffold . --preset nextjs-fullstack
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## How to Parse $ARGUMENTS
|
|
28
|
+
|
|
29
|
+
When this skill is invoked, Claude must:
|
|
30
|
+
|
|
31
|
+
1. Parse `$ARGUMENTS` to extract:
|
|
32
|
+
- **Project name** — first positional argument (e.g., `my-app` or `.`)
|
|
33
|
+
- `--preset` — which preset to use (`nextjs-fullstack` | `monorepo`)
|
|
34
|
+
- `--db` — database choice (`sqlite` | `postgres`), only for nextjs-fullstack
|
|
35
|
+
- `--ui` — UI library choice (`shadcn` | `none`), only for nextjs-fullstack
|
|
36
|
+
- `--pm` — package manager (`bun` | `npm` | `pnpm`)
|
|
37
|
+
- `--packages` — space-separated list of package names, only for monorepo
|
|
38
|
+
|
|
39
|
+
2. **If no arguments at all**: Ask the user:
|
|
40
|
+
- Which preset they want (`nextjs-fullstack` or `monorepo`)
|
|
41
|
+
- What the project name should be
|
|
42
|
+
- Any non-default options they want
|
|
43
|
+
|
|
44
|
+
3. **If project name is given but no `--preset`**: Default to `nextjs-fullstack`.
|
|
45
|
+
|
|
46
|
+
4. **Validate** the project name is provided before running any script. If missing, ask for it.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Preset: nextjs-fullstack
|
|
51
|
+
|
|
52
|
+
Full-stack Next.js app with TypeScript, Tailwind CSS, Drizzle ORM, and optionally shadcn/ui.
|
|
53
|
+
|
|
54
|
+
**Defaults**: `--db sqlite --ui shadcn --pm bun`
|
|
55
|
+
|
|
56
|
+
**Command to run**:
|
|
57
|
+
```bash
|
|
58
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh <project-name> --db <db> --ui <ui> --pm <pm>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Example**:
|
|
62
|
+
```bash
|
|
63
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh my-app --db sqlite --ui shadcn --pm bun
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**After-run guidance** (tell the user):
|
|
67
|
+
- `cd <project-name>` (unless initialized in-place)
|
|
68
|
+
- Run `<pm> run db:migrate` to apply the first migration
|
|
69
|
+
- Run `<pm> run dev` to start the development server
|
|
70
|
+
- Drizzle Studio available via `<pm> run db:studio`
|
|
71
|
+
- For postgres: make sure to set `DATABASE_URL` in `.env.local` before migrating
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Preset: monorepo
|
|
76
|
+
|
|
77
|
+
Turborepo monorepo with shared TypeScript config, shared ESLint config, Prettier, and optional extra packages.
|
|
78
|
+
|
|
79
|
+
**Defaults**: `--pm bun` (no extra packages)
|
|
80
|
+
|
|
81
|
+
**Command to run**:
|
|
82
|
+
```bash
|
|
83
|
+
bash ~/.claude/skills/scaffold/scripts/monorepo.sh <project-name> --pm <pm> [--packages pkg1 pkg2 ...]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Example**:
|
|
87
|
+
```bash
|
|
88
|
+
bash ~/.claude/skills/scaffold/scripts/monorepo.sh my-mono --pm bun --packages core utils
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**After-run guidance** (tell the user):
|
|
92
|
+
- `cd <project-name>` (unless initialized in-place)
|
|
93
|
+
- Run `<pm> run build` to build all packages
|
|
94
|
+
- Run `<pm> run dev` to start development mode across all packages
|
|
95
|
+
- Add new packages by creating a directory under `packages/` and following the pattern of existing packages
|
|
96
|
+
- For pnpm: workspace config lives in `pnpm-workspace.yaml`
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Option Reference
|
|
101
|
+
|
|
102
|
+
See `~/.claude/skills/scaffold/presets.md` for the full option matrix, DB-specific details, and planned future presets.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Decision Flow
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
$ARGUMENTS empty?
|
|
110
|
+
YES → Ask user for preset + project name + options
|
|
111
|
+
NO →
|
|
112
|
+
project name present?
|
|
113
|
+
NO → Ask for project name
|
|
114
|
+
YES →
|
|
115
|
+
--preset specified?
|
|
116
|
+
NO → default to nextjs-fullstack
|
|
117
|
+
YES → use specified preset
|
|
118
|
+
Run the appropriate script with all parsed flags
|
|
119
|
+
```
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Scaffold Presets
|
|
2
|
+
|
|
3
|
+
This document describes all available presets, their options, and which script powers them.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## nextjs-fullstack
|
|
8
|
+
|
|
9
|
+
**Description**: Full-stack Next.js app with TypeScript, Tailwind CSS, Drizzle ORM, and optionally shadcn/ui. Suitable for web applications that need a database and a modern component library out of the box.
|
|
10
|
+
|
|
11
|
+
**Script**: `~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh`
|
|
12
|
+
|
|
13
|
+
**Default options**:
|
|
14
|
+
- `--db sqlite`
|
|
15
|
+
- `--ui shadcn`
|
|
16
|
+
- `--pm bun`
|
|
17
|
+
|
|
18
|
+
**Option matrix**:
|
|
19
|
+
|
|
20
|
+
| Flag | Values | Default | Description |
|
|
21
|
+
|------|--------|---------|-------------|
|
|
22
|
+
| `--db` | `sqlite`, `postgres` | `sqlite` | Database driver and Drizzle dialect |
|
|
23
|
+
| `--ui` | `shadcn`, `none` | `shadcn` | UI component library |
|
|
24
|
+
| `--pm` | `bun`, `npm`, `pnpm` | `bun` | Package manager |
|
|
25
|
+
|
|
26
|
+
**DB details**:
|
|
27
|
+
|
|
28
|
+
| | sqlite | postgres |
|
|
29
|
+
|-|--------|----------|
|
|
30
|
+
| Runtime dep | `drizzle-orm better-sqlite3` | `drizzle-orm pg` |
|
|
31
|
+
| Dev dep | `drizzle-kit @types/better-sqlite3` | `drizzle-kit @types/pg` |
|
|
32
|
+
| Schema import | `drizzle-orm/sqlite-core` | `drizzle-orm/pg-core` |
|
|
33
|
+
| Column types | `int`, `text`, `sqliteTable` | `serial`, `text`, `timestamp`, `pgTable` |
|
|
34
|
+
| DB connection | `drizzle-orm/better-sqlite3` | `drizzle-orm/node-postgres` with `Pool` |
|
|
35
|
+
| Dialect in config | `sqlite` | `postgresql` |
|
|
36
|
+
| `.env.local` | `DATABASE_URL=sqlite.db` | `DATABASE_URL=postgresql://localhost:5432/<name>` |
|
|
37
|
+
| `.gitignore` extras | `*.db`, `*.db-shm`, `*.db-wal` | (none) |
|
|
38
|
+
|
|
39
|
+
**Usage examples**:
|
|
40
|
+
```bash
|
|
41
|
+
# All defaults
|
|
42
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh my-app
|
|
43
|
+
|
|
44
|
+
# Postgres + no UI
|
|
45
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh my-app --db postgres --ui none
|
|
46
|
+
|
|
47
|
+
# npm + shadcn + sqlite
|
|
48
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh my-app --pm npm
|
|
49
|
+
|
|
50
|
+
# In-place (current directory)
|
|
51
|
+
bash ~/.claude/skills/scaffold/scripts/nextjs-fullstack.sh .
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## monorepo
|
|
57
|
+
|
|
58
|
+
**Description**: Bun (or npm/pnpm) + Turborepo monorepo with shared TypeScript config, shared ESLint config, Prettier, and optional extra packages scaffolded under `packages/`.
|
|
59
|
+
|
|
60
|
+
**Script**: `~/.claude/skills/scaffold/scripts/monorepo.sh`
|
|
61
|
+
|
|
62
|
+
**Default options**:
|
|
63
|
+
- `--pm bun`
|
|
64
|
+
- `--packages` (none — only shared config packages are created)
|
|
65
|
+
|
|
66
|
+
**Option matrix**:
|
|
67
|
+
|
|
68
|
+
| Flag | Values | Default | Description |
|
|
69
|
+
|------|--------|---------|-------------|
|
|
70
|
+
| `--pm` | `bun`, `npm`, `pnpm` | `bun` | Package manager |
|
|
71
|
+
| `--packages` | space-separated names | (empty) | Extra packages to scaffold under `packages/` |
|
|
72
|
+
|
|
73
|
+
**Usage examples**:
|
|
74
|
+
```bash
|
|
75
|
+
# Minimal monorepo
|
|
76
|
+
bash ~/.claude/skills/scaffold/scripts/monorepo.sh my-mono
|
|
77
|
+
|
|
78
|
+
# With extra packages
|
|
79
|
+
bash ~/.claude/skills/scaffold/scripts/monorepo.sh my-mono --packages core utils api
|
|
80
|
+
|
|
81
|
+
# pnpm with packages
|
|
82
|
+
bash ~/.claude/skills/scaffold/scripts/monorepo.sh my-mono --pm pnpm --packages sdk cli
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Planned Presets
|
|
88
|
+
|
|
89
|
+
The following presets are on the roadmap and will be added in future versions:
|
|
90
|
+
|
|
91
|
+
| Preset | Description |
|
|
92
|
+
|--------|-------------|
|
|
93
|
+
| `vite-react` | Vite + React + TypeScript + TailwindCSS, optionally with shadcn/ui |
|
|
94
|
+
| `api-only` | Lightweight REST/RPC API server (Hono or Fastify), TypeScript, Drizzle ORM |
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# common.sh — Shared utilities for scaffold scripts
|
|
3
|
+
|
|
4
|
+
GREEN='\033[0;32m'
|
|
5
|
+
YELLOW='\033[1;33m'
|
|
6
|
+
BLUE='\033[0;34m'
|
|
7
|
+
CYAN='\033[0;36m'
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
BOLD='\033[1m'
|
|
10
|
+
RESET='\033[0m'
|
|
11
|
+
|
|
12
|
+
info() { echo -e "${BLUE}[INFO]${RESET} $*"; }
|
|
13
|
+
success() { echo -e "${GREEN}[OK]${RESET} $*"; }
|
|
14
|
+
warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
|
|
15
|
+
error() { echo -e "${RED}[ERR]${RESET} $*" >&2; }
|
|
16
|
+
step() { echo -e "\n${BOLD}${CYAN}==> $*${RESET}"; }
|
|
17
|
+
|
|
18
|
+
# check_command <cmd> <install-hint>
|
|
19
|
+
check_command() {
|
|
20
|
+
if ! command -v "$1" &>/dev/null; then
|
|
21
|
+
error "$1 이 설치되어 있지 않습니다."
|
|
22
|
+
echo " 설치: $2"
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
success "$1 $(command "$1" --version 2>&1 | head -1)"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# resolve_target_dir <project-arg>
|
|
29
|
+
# Sets: TARGET_DIR, PROJECT_NAME, INIT_IN_PLACE
|
|
30
|
+
resolve_target_dir() {
|
|
31
|
+
local project_arg="$1"
|
|
32
|
+
|
|
33
|
+
if [ "$project_arg" = "." ]; then
|
|
34
|
+
TARGET_DIR="$(pwd)"
|
|
35
|
+
PROJECT_NAME="$(basename "$TARGET_DIR")"
|
|
36
|
+
INIT_IN_PLACE=true
|
|
37
|
+
if [ "$(ls -A "$TARGET_DIR" 2>/dev/null)" ]; then
|
|
38
|
+
error "현재 디렉토리가 비어있지 않습니다: $TARGET_DIR"
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
else
|
|
42
|
+
TARGET_DIR="$(pwd)/$project_arg"
|
|
43
|
+
PROJECT_NAME="$project_arg"
|
|
44
|
+
INIT_IN_PLACE=false
|
|
45
|
+
if [ -d "$TARGET_DIR" ] && [ "$(ls -A "$TARGET_DIR" 2>/dev/null)" ]; then
|
|
46
|
+
error "디렉토리가 이미 존재하고 비어있지 않습니다: $TARGET_DIR"
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
mkdir -p "$TARGET_DIR"
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
export TARGET_DIR PROJECT_NAME INIT_IN_PLACE
|
|
53
|
+
info "프로젝트: ${PROJECT_NAME} (${TARGET_DIR})"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# git_init_commit <commit-message>
|
|
57
|
+
git_init_commit() {
|
|
58
|
+
local msg="$1"
|
|
59
|
+
if [ ! -d ".git" ]; then
|
|
60
|
+
git init -q
|
|
61
|
+
git add -A
|
|
62
|
+
git commit -q -m "$msg"
|
|
63
|
+
success "Git 초기화 및 첫 커밋 완료"
|
|
64
|
+
else
|
|
65
|
+
git add -A
|
|
66
|
+
if ! git diff --cached --quiet; then
|
|
67
|
+
git commit -q -m "$msg"
|
|
68
|
+
success "커밋 완료"
|
|
69
|
+
else
|
|
70
|
+
info "커밋할 변경사항 없음 — 건너뜀"
|
|
71
|
+
fi
|
|
72
|
+
fi
|
|
73
|
+
}
|