diff --git a/.DS_Store b/.DS_Store index b607d78..fde3205 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.claude/project/dreaming-context.md b/.claude/project/dreaming-context.md new file mode 100644 index 0000000..20708a0 --- /dev/null +++ b/.claude/project/dreaming-context.md @@ -0,0 +1,59 @@ +# ๐Ÿง  ํ”„๋กœ์ ํŠธ ์ž์œจ ์ธ์ง€ ๋ฉ”๋ชจ๋ฆฌ (Dreaming Context) + +์ด ํŒŒ์ผ์€ `dreaming.js` ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž๋™ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. +Claude Code๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๊ตฌ์กฐ, ์‚ฌ์šฉ ์ค‘์ธ ์Šคํ† ์–ด, ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์•„์›ƒ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์‹  ๊ฐœ๋ฐœ ํ๋ฆ„์„ ์™„๋ฒฝํžˆ ์ธ์ง€ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. + +* **์ตœ์ข… ๋™๊ธฐํ™” ์‹œ๊ฐ„:** 2026. 5. 21. ์˜คํ›„ 9:20:21 (Asia/Seoul) + +--- + +## ๐Ÿ— ํ”„๋กœ์ ํŠธ ์ •๋ณด +* **ํ”„๋กœ์ ํŠธ๋ช…:** `Unknown Project` (v1.0.0) +* **ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ:** `Unknown` +* **๊ธฐ์ˆ  ์Šคํƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:** + - (๊ฐ์ง€๋œ ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์Œ) + +--- + +## ๐Ÿ“ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ์ปดํฌ๋„ŒํŠธ ํ˜„ํ™ฉ +ํ˜„์žฌ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ ์ •๋ณด์ž…๋‹ˆ๋‹ค. + +| ๋””๋ ‰ํ† ๋ฆฌ | ํ™œ์„ฑ ์—ฌ๋ถ€ | ํŒŒ์ผ ๊ฐœ์ˆ˜ | ์ฃผ์š” ์ƒ˜ํ”Œ ํŒŒ์ผ (์ตœ๋Œ€ 5๊ฐœ) | +|---|---|---|---| +| `components/` | โŒ | 0๊ฐœ | - | +| `composables/` | โŒ | 0๊ฐœ | - | +| `stores/` | โŒ | 0๊ฐœ | - | +| `pages/` | โŒ | 0๊ฐœ | - | +| `server/` | โŒ | 0๊ฐœ | - | +| `layouts/` | โŒ | 0๊ฐœ | - | +| `middleware/` | โŒ | 0๊ฐœ | - | +| `plugins/` | โŒ | 0๊ฐœ | - | +| `types/` | โŒ | 0๊ฐœ | - | +| `assets/` | โŒ | 0๊ฐœ | - | + +--- + +## ๐Ÿ ์•กํ‹ฐ๋ธŒ Pinia ์Šคํ† ์–ด ๋ชฉ๋ก +ํ˜„์žฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ์ €์žฅ์†Œ๋“ค์˜ ํ…œํ”Œ๋ฆฟ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์•„๋ž˜ ์Šคํ† ์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐธ๊ณ ํ•˜์„ธ์š”. + +*๊ฐ์ง€๋œ Pinia ์Šคํ† ์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (stores/ ๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ ํ˜น์€ ๋น„์–ด์žˆ์Œ)* + +--- + +## ๐ŸŽฃ ์ปค์Šคํ…€ Composable (useXxx) ๋ชฉ๋ก +๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ฒฉ๋ฆฌํ•ด ๋‘” ์ปค์Šคํ…€ ํ›… ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ง์ ‘ ์งœ๊ธฐ ์ „, ์•„๋ž˜ ํ›…๋“ค์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๋จผ์ € ํƒ€์ง„ํ•˜์„ธ์š”. + +*๊ฐ์ง€๋œ ์ปค์Šคํ…€ Composable์ด ์—†์Šต๋‹ˆ๋‹ค. (composables/ ๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ ํ˜น์€ ๋น„์–ด์žˆ์Œ)* + +--- + +## ๐Ÿงช ์œ ๋‹› ํ…Œ์ŠคํŠธ ํ†ต๊ณ„ +ํ˜„์žฌ๊นŒ์ง€ ๊ตฌ์ถ•๋œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ˜„ํ™ฉ์ž…๋‹ˆ๋‹ค. +* **๊ฐ์ง€๋œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ˆ˜:** `0๊ฐœ` + *(์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ Vitest ๊ทœ๊ฒฉ์˜ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•ด์•ผ ํ•จ)* + +--- + +## ๐Ÿ›  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ (package.json) +ํ”„๋กœ์ ํŠธ ๊ตฌ๋™ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. +- ์Šคํฌ๋ฆฝํŠธ ์—†์Œ diff --git a/.claude/rules/automation-guide.md b/.claude/rules/automation-guide.md new file mode 100644 index 0000000..1c35041 --- /dev/null +++ b/.claude/rules/automation-guide.md @@ -0,0 +1,107 @@ +# ๐Ÿค– ํ”„๋ก ํŠธ์—”๋“œ ์—์ด์ „ํŠธ ์ž๋™ํ™” ์‹œ์Šคํ…œ ๊ฐ€์ด๋“œ + +์ด ๋ฌธ์„œ๋Š” `gameservice-fe-agent` ํŒจํ‚ค์ง€์— ํƒ‘์žฌ๋œ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šคโ€”**ํ”„๋กœ์ ํŠธ ์ž์œจ ์ธ์ง€(Dreaming) ์‹œ์Šคํ…œ** ๋ฐ **AI ๊ฐœ๋ฐœ ์Šค์ฟผ๋“œ(Squad) ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜**์˜ ๊ฐœ๋…๊ณผ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ๊ฐ€์ด๋“œํ•ฉ๋‹ˆ๋‹ค. + +์ด ๋„๊ตฌ๋“ค์€ ์ผํšŒ์„ฑ(Stateless) AI ์ฝ”๋“œ ์ž‘์„ฑ์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, **์ง€์†์„ฑ ์žˆ๋Š” ์ปจ๋ฒค์…˜ ์ˆ˜ํ˜ธ์ž(Convention Guardian)**๋กœ ๋™์ž‘ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ **๋ณ‘๋ ฌ ์ „๋ฌธ ์—ญํ•  ๋ถ„๋‹ด ์Šค์ฟผ๋“œ**๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿง  1. "AI ์ฝ”๋”"์—์„œ "์ƒํƒœ ์ €์žฅํ˜• ์ปจ๋ฒค์…˜ ๊ฐ€๋””์–ธ"์œผ๋กœ (Dreaming) + +### ๐Ÿ’ก ๋„์ž… ๋ฐฐ๊ฒฝ ๋ฐ ๊ฐœ๋… +์ผ๋ฐ˜์ ์ธ LLM ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ปจํ…์ŠคํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” **๋‹จ๋ฐœ์„ฑ(Stateless)** ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ปค์Šคํ…€ Composable(useXxx), ํ™œ์„ฑํ™”๋œ Pinia ์Šคํ† ์–ด ๋ชฉ๋ก, ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๋“ฑ์„ ๋งค๋ฒˆ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•ด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ปจ๋ฒค์…˜์„ ๊นจ๋Š” ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฆ…๋‹ˆ๋‹ค. + +**Dreaming ์ž๋™ํ™” ์‹œ์Šคํ…œ**์€ ์—์ด์ „ํŠธ๊ฐ€ "์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์ž์œจ ์„ฑ์ฐฐ(Self-reflection)"ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋กœ์ปฌ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. `dreaming.js`๋ฅผ ๊ตฌ๋™ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ์ƒํƒœ๋ฅผ ํœด๋ฆฌ์Šคํ‹ฑํ•˜๊ฒŒ ๋ถ„์„ํ•˜์—ฌ `.claude/project/dreaming-context.md` ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๊ณ , `CLAUDE.md` ์ˆ˜์ž… ์„ ์–ธ์„ ํ†ตํ•ด ์—์ด์ „ํŠธ๊ฐ€ ์‹œ์ž‘๋ถ€ํ„ฐ ์ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ์ธ์ง€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. + +### ๐Ÿ›  ์‹คํ–‰ ๋ฐ ์—ฐ๋™ ๋ฐฉ๋ฒ• + +#### โ‘  ์‹คํ–‰ ๋ช…๋ น์–ด +ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ์—์„œ ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค: +```bash +node .claude/skills/dreaming/scripts/dreaming.js +``` + +#### โ‘ก ์ž๋™ ์ˆ˜ํ–‰๋˜๋Š” ํƒœ์Šคํฌ +1. `package.json` ํŒŒ์‹ฑ: ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „, ํ•ต์‹ฌ ๊ธฐ์ˆ  ์Šคํƒ(Nuxt, Pinia, Tailwind, Vitest ๋“ฑ), ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ ๋ช…๋ น์–ด ์ˆ˜์ง‘. +2. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์Šค์บ”: ํ™œ์„ฑํ™”๋œ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์†Œ์† ํŒŒ์ผ ๊ฐœ์ˆ˜, ๊ตฌ์กฐ์  ์˜ˆ์‹œ ๋ชฉ๋ก ๋„์ถœ. +3. **Pinia ์Šคํ† ์–ด ์ž์œจ ์ถ”์ถœ:** `stores/` ๋‚ด๋ถ€์˜ ํŒŒ์ผ๋“ค์„ ๋ถ„์„ํ•˜์—ฌ ๊ฐ ์Šคํ† ์–ด์˜ ID, ๋ฐ˜์‘ํ˜• ์ƒํƒœ(state/computed), ๋น„์ฆˆ๋‹ˆ์Šค ํ•จ์ˆ˜(actions) ๋ชฉ๋ก์„ ์ •๋ฐ€ ์ธ์ง€. +4. **์ปค์Šคํ…€ Composable ์ž์œจ ์ถ”์ถœ:** `composables/` ๋‚ด๋ถ€์˜ `useXxx` ์Šคํƒ€์ผ ์ปดํฌ์ €๋ธ”์„ ๊ฒ€์ถœํ•ด ๋…ธ์ถœ ํ•จ์ˆ˜ ๋ฆฌ์ŠคํŠธ ํ™•๋ณด. +5. **์œ ๋‹› ํ…Œ์ŠคํŠธ ํ†ต๊ณ„ ํŒŒ์‹ฑ:** ๊ตฌ์ถ•๋œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋ชฉ๋ก ๋ฐ ํ†ต๊ณ„ ์ถ”์ถœ. +6. **๋งˆํฌ๋‹ค์šด ์ถœ๋ ฅ ๋ฐ ์ž๋™ ์ž„ํฌํŠธ:** ์ˆ˜์ง‘๋œ ์ •๋ณด๋ฅผ ๋งˆํฌ๋‹ค์šด ๋ฆฌํฌํŠธ๋กœ ์ž๋™ ๋นŒ๋“œํ•ด `.claude/project/dreaming-context.md` ํŒŒ์ผ์— ๋ฎ์–ด์“ฐ๊ณ , ๋ฃจํŠธ์˜ `CLAUDE.md`์— `@.claude/project/dreaming-context.md` ์ž„ํฌํŠธ ๊ตฌ๋ฌธ์ด ์—†์œผ๋ฉด ์ด๋ฅผ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿ“Œ ์‹œ๋‹ˆ์–ด FE ๊ด€์ ์˜ ๊ธฐ๋Œ€ ํšจ๊ณผ +* **์ค‘๋ณต ์ฝ”๋“œ ์ƒ์„ฑ ์ „๋ฉด ์–ต์ œ:** ์—์ด์ „ํŠธ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” Pinia ์Šคํ† ์–ด๋‚˜ ์ปค์Šคํ…€ ํ›…์„ ์ฆ‰์‹œ ์ฐพ์•„๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ API ๋ฐ”์ธ๋”ฉ์ด๋‚˜ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์ด์ค‘์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +* **ํ”„๋กœ์ ํŠธ ๋งž์ถคํ˜• ๊ฐ€์ƒ ์ฃผ๋‹ˆ์–ดํ™”:** ๋ฉฐ์น  ์‰ฌ๊ณ  ์˜ค๊ฑฐ๋‚˜ ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๋”๋ผ๋„, ์—์ด์ „ํŠธ๊ฐ€ ๋‹จ 1์ดˆ ๋งŒ์— ํ”„๋กœ์ ํŠธ์˜ ์ตœ์‹  ์Šค๋ƒ…์ƒท์„ ๋‡Œ๋ฆฌ์— ์ƒˆ๊ธด ์ƒํƒœ(Stateful)๋กœ ์ง€๋Šฅ์ ์ธ ๋ณด์กฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ‘ฅ 2. "AI ํ•œ ๋ช…๊ณผ ๋Œ€ํ™”"๊ฐ€ ์•„๋‹Œ "AI ๊ฐœ๋ฐœ ์Šค์ฟผ๋“œ(Squad) ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜" + +### ๐Ÿ’ก ๋„์ž… ๋ฐฐ๊ฒฝ ๋ฐ ๊ฐœ๋… +์•„๋ฌด๋ฆฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ชจ๋ธ์ด๋ผ๋„ ํ…œํ”Œ๋ฆฟ ๋งˆํฌ์—… ์ž‘์„ฑ, ๋ณต์žกํ•œ Tailwind ์Šคํƒ€์ผ๋ง, WCAG 2.1 AA ์ ‘๊ทผ์„ฑ ๋งˆํฌ์—…, ๊ทธ๋ฆฌ๊ณ  Vitest ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ํ•œ ๋ฒˆ์— ์ง€์‹œํ•˜๋ฉด ๋ฌธ๋งฅ ๋ˆ„๋ฝ์ด๋‚˜ ๊ฒฐํ•จ(Bug)์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค. + +**์Šค์ฟผ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜**์€ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜ ์š”์ฒญ์„ **3์ธ์˜ ๊ฐ€์ƒ ์ „๋ฌธ ๊ฐœ๋ฐœ ์—์ด์ „ํŠธ**๋กœ ์ชผ๊ฐœ์–ด ๋‹จ๊ณ„๋ณ„/๋ณ‘๋ ฌ ํ˜‘์—… ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์‹œ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด(Gil)๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์— ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋Š” ๋Œ€์‹ , ์ด ์ „๋ฌธ ์—์ด์ „ํŠธ๋“ค์„ ์กฐ์œจํ•˜๊ณ  ํ•ฉ์‚ฐ ๊ฒฐ๊ณผ๋ฌผ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์‚ฌ์–‘๊ณผ ๋ Œ๋”๋ง์„ ์ตœ์ข… ์Šน์ธํ•˜๋Š” **์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(Orchestrator)**์˜ ์ตœ๊ณ  ์กด์—„ ์ง€์œ„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. + +``` + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ Gil (Orchestrator) โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ (์Šค์ฟผ๋“œ ์ƒ์„ฑ ์ง€์‹œ) + โ–ผ +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ squad-orchestrator.js โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ โ”‚ โ”‚ + โ–ผ โ–ผ โ–ผ + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ Role 1 โ”‚โ”‚ Role 2 โ”‚โ”‚ Role 3 โ”‚ + โ”‚ UI/๋งˆํฌ์—… โ”‚โ”‚ ์›น ์ ‘๊ทผ์„ฑ โ”‚โ”‚ QA/๋‹จ์œ„ํ…Œ์ŠคํŠธโ”‚ + โ”‚ ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ โ”‚โ”‚ ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ โ”‚โ”‚ ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ โ”‚ โ”‚ + โ–ผ โ–ผ โ–ผ + [๊ตฌ์กฐ & ๋ผˆ๋Œ€ ๋นŒ๋“œ] [ARIA & ํ‚ค๋ณด๋“œ ์ฃผ์ž…] [Vitest ์ผ€์ด์Šค PASS] +``` + +### ๐Ÿ›  ์‹คํ–‰ ๋ฐ ์—ฐ๋™ ๋ฐฉ๋ฒ• + +#### โ‘  ์Šค์ฟผ๋“œ ์กฐ์งํ•˜๊ธฐ (์ธํ„ฐ๋ž™์…˜/CLI ๊ฒธ์šฉ) +์ƒˆ๋กœ์šด ํ”ผ์ฒ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค: + +* **๋Œ€ํ™”ํ˜• ๋ชจ๋“œ๋กœ ์กฐ์งํ•˜๊ธฐ:** + ```bash + node .claude/skills/squad-orchestration/scripts/squad-orchestrator.js + ``` + ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ํ„ฐ๋ฏธ๋„์˜ ์งˆ๋ฌธ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๊ณผ ์š”๊ตฌ ์ŠคํŽ™์„ ์ž…๋ ฅํ•˜๋ฉด ์Šค์ฟผ๋“œ๊ฐ€ ์ฆ‰์‹œ ์กฐ์ง๋ฉ๋‹ˆ๋‹ค. + +* **CLI ์ธ์ž๋กœ ํ•œ ๋ฒˆ์— ์กฐ์งํ•˜๊ธฐ:** + ```bash + node .claude/skills/squad-orchestration/scripts/squad-orchestrator.js --name "UserScoreCard" --spec "์œ ์ € ํ”„๋กœํ•„๊ณผ ์ „์ , ๋žญํ‚น์„ ๋ณด์—ฌ์ฃผ๊ณ  ์ ์ˆ˜์— ๋”ฐ๋ผ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ์ด ๋ฐ”๋€Œ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„" + ``` + +#### โ‘ก ์Šค์ฟผ๋“œ ํŒŒ์ผ ๊ตฌ์„ฑ ๋ฐ ์—ญํ•  +๋ช…๋ น์ด ๋๋‚˜๋ฉด ๋ฃจํŠธ์— `squad//` ํด๋”๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. +* **`tasks/01_markup_agent.md` (Role 1):** Vue 3 ํ…œํ”Œ๋ฆฟ, ๋ฐ์ดํ„ฐ ์ƒํƒœ ์„ค๊ณ„, Tailwind ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์ง‘์ค‘ ์ง€์‹œ์„œ. +* **`tasks/02_a11y_agent.md` (Role 2):** WCAG 2.1 AA ๊ธฐ์ค€ ์ค€์ˆ˜, ARIA ์—ญํ• (role), ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์šฉ ๋ผ๋ฒจ๋ง, ํ‚ค๋ณด๋“œ ์ธํ„ฐ๋ž™์…˜ ์ง‘์ค‘ ๋ณด์™„ ๋ฐ Surgical ์ •๋ฐ€ ์ˆ˜์ • ์ง€์‹œ์„œ. +* **`tasks/03_test_agent.md` (Role 3):** ์ƒ์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์–‘ ๊ฒ€์ฆ์„ ์œ„ํ•œ `*.spec.ts` ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฐ Mock ๋ฐ์ดํ„ฐ ๊ตฌ์ถ• ์ง€์‹œ์„œ. +* **`run-squad.js`:** Claude Code CLI๋ฅผ ์—ฐ์† ๊ตฌ๋™ํ•˜์—ฌ ์„ธ ๋‹จ๊ณ„์˜ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ์ฐจ๋ก€๋กœ ์ž๋™ ์‹คํ–‰ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— Vitest ํ…Œ์ŠคํŠธ ์—”์ง„์„ ๊ฐ€๋™ํ•˜์—ฌ ๊ฒ€์ฆ์„ ์™„์ˆ˜ํ•ด ๋‚ด๋Š” ๋งˆ์Šคํ„ฐ ๋Ÿฌ๋„ˆ ์Šคํฌ๋ฆฝํŠธ. + +#### โ‘ข ์Šค์ฟผ๋“œ ์ž๋™ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ€๋™ +์Šค์ฟผ๋“œ๊ฐ€ ์„ธํŒ…๋˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ํด๋” ๋‚ด์˜ ๋งˆ์Šคํ„ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฆ‰์‹œ ๊ฐ€๋™ํ•˜์—ฌ ์˜คํ† ํŒŒ์ผ๋Ÿฟ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +```bash +node squad//run-squad.js +``` + +### ๐Ÿ“Œ ์‹œ๋‹ˆ์–ด FE ๊ด€์ ์˜ ๊ธฐ๋Œ€ ํšจ๊ณผ +* **๊ฒฐ์  ์ œ๋กœ(Defect-Free) ์ปดํฌ๋„ŒํŠธ ์™„์„ฑ:** ๊ฐ ์—ญํ• ๊ตฐ์ด ํ•˜๋‚˜์˜ ๊ด€์ (UI ๊ตฌ์กฐ -> ์ ‘๊ทผ์„ฑ -> ํ…Œ์ŠคํŠธ ํ’ˆ์งˆ)์— ์™„๋ฒฝํžˆ ๋ชฐ์ž…ํ•˜์—ฌ ๋‹จ๊ณ„๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ€๊พธ๊ณ  ๋‹ค๋“ฌ๊ธฐ ๋•Œ๋ฌธ์—, ํ’ˆ์งˆ์ ์œผ๋กœ ์™„๋ฒฝ๋ฌด๊ฒฐํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กฐ๋ฆฝ๋ฉ๋‹ˆ๋‹ค. +* **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์˜ ์ •์ˆ˜ ์ฒด๋“:** ์ตœ์ข… ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์—์ด์ „ํŠธ ๋ฃจํ”„๊ฐ€ ๊ฐ€๋™๋˜๋ฏ€๋กœ, ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ๋„ ์ „์— ๋ชจ๋“  ๋‹จ์œ„ ๋™์ž‘๊ณผ ๊ฐ€์‹œ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ์—ฃ์ง€ ์ผ€์ด์Šค๋“ค์˜ ํ†ต๊ณผ๋ฅผ ๋ณด์žฅ๋ฐ›์€ ์ฑ„ ๊ฐœ๋ฐœ์ด ๋งˆ๋ฌด๋ฆฌ๋ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿš€ ์‹ค๋ฌด ๋„์ž… ์‹œ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค + +1. **์ง€์†์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•œ git ignore ์ถ”๊ฐ€ ๊ถŒ์žฅ:** + `squad/` ํด๋” ๋‚ด์˜ ์ž‘์—… ์ง€์‹œ์„œ๋‚˜ ๊ฐ€์ด๋“œ ํŒŒ์ผ๋“ค์€ ๊ฐœ๋ฐœ ๋„์ค‘์˜ ์ค‘๊ฐ„ ์ƒ์„ฑ๋ฌผ(Task sheets)์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ git ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `.gitignore`์— `squad/` ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. + +2. **๊ฐœ๋ฐœ ์ „ dreaming ๊ตฌ๋™ ๋ฃจํ‹ดํ™”:** + ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๊ฑฐ๋‚˜ ๋Œ€๊ทœ๋ชจ PR์„ ๋จธ์ง€๋ฐ›์•˜์„ ๋•Œ๋Š” ์—์ด์ „ํŠธ์—๊ฒŒ ์ผ์„ ์‹œํ‚ค๊ธฐ ์ „ `node .claude/skills/dreaming/scripts/dreaming.js`๋ฅผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ์˜ ๋‡Œ ์Šค๋ƒ…์ƒท์„ 1์ดˆ ๋งŒ์— ์ตœ์‹ ํ™”ํ•ด ์ค๋‹ˆ๋‹ค. diff --git a/.claude/rules/claude-workflow.md b/.claude/rules/claude-workflow.md new file mode 100644 index 0000000..680a759 --- /dev/null +++ b/.claude/rules/claude-workflow.md @@ -0,0 +1,62 @@ +# Claude ์ž‘์—… ๋ฐฉ์‹ ์ง€์นจ + +์ด ๋ฌธ์„œ๋Š” Claude๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ์ผ๋ฐ˜์ ์ธ ์›์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + +## ๊ธฐ๋ณธ ์›์น™ + +1. **๊ธฐ์กด ์ฝ”๋“œ ์กด์ค‘**: ์ˆ˜์ • ์ „์— ๊ด€๋ จ ํŒŒ์ผ๊ณผ ์ฃผ๋ณ€ ์ปจ๋ฒค์…˜์„ ๋จผ์ € ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. +2. **์ตœ์†Œ ๋ณ€๊ฒฝ**: ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์—†๋Š” ๋ฆฌํŒฉํ† ๋ง์€ ๋ณ„๋„ ์ž‘์—…์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +3. **๊ฐ€์ • ๋Œ€์‹  ์งˆ๋ฌธ**: ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ชจํ˜ธํ•˜๋ฉด ์ถ”์ธกํ•˜์ง€ ๋ง๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +4. **๊ทผ๊ฑฐ ์žˆ๋Š” ์ˆ˜์ •**: ์ฝ”๋“œ ๋ณ€๊ฒฝ์˜ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## ์ž‘์—… ์ˆœ์„œ + +1. **ํƒ์ƒ‰ (Explore)** + - ๊ด€๋ จ ํŒŒ์ผ์„ ๋จผ์ € ์ฝ๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. + - ์œ ์‚ฌํ•œ ํŒจํ„ด์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. + +2. **๊ณ„ํš (Plan)** + - ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ์ž‘์—…์ด๋ฉด ํ•  ์ผ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. + - ์•„ํ‚คํ…์ฒ˜์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€๊ฒฝ์€ ์ฐฉ์ˆ˜ ์ „์— ์‚ฌ์šฉ์ž ์Šน์ธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. + +3. **๊ตฌํ˜„ (Implement)** + - ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. + - ๊ณตํ†ต ์ง€์นจ๊ณผ ํ”„๋กœ์ ํŠธ ์ง€์นจ์„ ๋ชจ๋‘ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. + +4. **๊ฒ€์ฆ (Verify)** + - ๋ฆฐํŠธ / ํƒ€์ž…์ฒดํฌ / ๋นŒ๋“œ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. + - ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + - ์ˆ˜๋™ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ™•์ธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. + +## ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ + +- **์ž„์˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ธˆ์ง€**: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **๊ธฐ์กด ์ฝ”๋“œ ๋Œ€๋Ÿ‰ ๋ฆฌํŒฉํ† ๋ง ๊ธˆ์ง€**: ์š”์ฒญ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ณ€๊ฒฝ์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **์ฃผ์„ / ๋ฌธ์„œ ์ž„์˜ ์‚ญ์ œ ๊ธˆ์ง€**: ๋ถˆํ•„์š”ํ•ด ๋ณด์—ฌ๋„ ์‚ญ์ œ ์ „ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **๋น„๋ฐ€์ •๋ณด ์ถœ๋ ฅ ๊ธˆ์ง€**: ํ™˜๊ฒฝ๋ณ€์ˆ˜, ํ‚ค, ํ† ํฐ ๋“ฑ์€ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **์˜์กด์„ฑ ๋ฒ„์ „ ์ž„์˜ ๋ณ€๊ฒฝ ๊ธˆ์ง€**: ์š”์ฒญ์ด ์—†๋‹ค๋ฉด `package.json`์˜ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **๊ฐ•์ œ ํ‘ธ์‹œ / ํžˆ์Šคํ† ๋ฆฌ ์žฌ์ž‘์„ฑ ๊ธˆ์ง€**: `push --force`, `reset --hard` ๋“ฑ์€ ์‚ฌ์šฉ์ž์˜ ๋ช…์‹œ์  ์š”์ฒญ ์—†์ด ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +## ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ + +- ๋‹ต๋ณ€์€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ, ๊ฒฐ๋ก ์„ ๋จผ์ € ๋งํ•ฉ๋‹ˆ๋‹ค. +- ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด **์–ด๋–ค ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟจ๋Š”์ง€** ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. +- ๋ถˆํ™•์‹คํ•œ ๋ถ€๋ถ„์€ ์†”์งํ•˜๊ฒŒ ๋ฐํžˆ๊ณ  ๋Œ€์•ˆ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. +- ๊ธด ์„ค๋ช…๋ณด๋‹ค ์‹ค์ œ ๊ฒฐ๊ณผ๋ฌผ(์ฝ”๋“œ/ํŒŒ์ผ)์„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. + +## ํŒŒ์ผ ์ž‘์—… ์›์น™ + +- ์ƒˆ ํŒŒ์ผ ์ƒ์„ฑ๋ณด๋‹ค **๊ธฐ์กด ํŒŒ์ผ ์ˆ˜์ •**์„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. +- README, ๋ฌธ์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- ํŒŒ์ผ์„ ์ฝ์ง€ ์•Š๊ณ  ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- ๋Œ€๋Ÿ‰ ๋ณ€๊ฒฝ ์‹œ์—๋Š” diff๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +## ์งˆ๋ฌธ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ + +๋‹ค์Œ์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์ธ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. + +- ์š”๊ตฌ์‚ฌํ•ญ์˜ ์ผ๋ถ€๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•  ๋•Œ +- ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ์žˆ๊ณ  ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ๋šœ๋ ทํ•  ๋•Œ +- ๊ณตํ†ต ์ง€์นจ๊ณผ ํ”„๋กœ์ ํŠธ ์ง€์นจ์ด ์ถฉ๋Œํ•  ๋•Œ +- ํŒŒ๊ดด์  ์ž‘์—…(ํŒŒ์ผ ์‚ญ์ œ, ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๋“ฑ)์ด ํ•„์š”ํ•  ๋•Œ +- ์™ธ๋ถ€ ์„œ๋น„์Šค ํ˜ธ์ถœ์ด๋‚˜ ๊ฒฐ์ œ ๊ด€๋ จ ์ž‘์—…์ผ ๋•Œ diff --git a/.claude/rules/coding-conventions.md b/.claude/rules/coding-conventions.md new file mode 100644 index 0000000..1ecc347 --- /dev/null +++ b/.claude/rules/coding-conventions.md @@ -0,0 +1,50 @@ +# ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ + +## ๊ธฐ๋ณธ ์›์น™ + +- **๊ฐ€๋…์„ฑ ์šฐ์„ **: ์˜๋ฆฌํ•œ ์ฝ”๋“œ๋ณด๋‹ค ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. +- **์ผ๊ด€์„ฑ ์œ ์ง€**: ๊ธฐ์กด ์ฝ”๋“œ์˜ ์Šคํƒ€์ผ์„ ๋จผ์ € ๊ด€์ฐฐํ•˜๊ณ  ๊ทธ์— ๋งž์ถฅ๋‹ˆ๋‹ค. +- **์ž‘์€ ๋‹จ์œ„**: ํ•จ์ˆ˜์™€ ํŒŒ์ผ์€ ํ•œ ๊ฐ€์ง€ ์ฑ…์ž„๋งŒ ์ง€๋„๋ก ์ž‘๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +## ํฌ๋งทํŒ… + +- ๋“ค์—ฌ์“ฐ๊ธฐ: ์ŠคํŽ˜์ด์Šค 2์นธ (ํƒญ ์‚ฌ์šฉ ๊ธˆ์ง€) +- ๋ฌธ์ž์—ด: ์‹ฑ๊ธ€ ์ฟผํ„ฐ(`'`) ์‚ฌ์šฉ, JSX/ํ…œํ”Œ๋ฆฟ ์†์„ฑ๊ฐ’์€ ๋”๋ธ” ์ฟผํ„ฐ(`"`) +- ์„ธ๋ฏธ์ฝœ๋ก : ์ƒ๋žตํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ์ž‘์„ฑ +- ์ค„ ๋ ๊ณต๋ฐฑ ์ œ๊ฑฐ, ํŒŒ์ผ ๋ ๊ฐœํ–‰ 1์ค„ ์œ ์ง€ +- ํ•œ ์ค„ ์ตœ๋Œ€ 100์ž (์ดˆ๊ณผ ์‹œ ์ค„๋ฐ”๊ฟˆ) +- Prettier ์„ค์ • ํŒŒ์ผ(`.prettierrc`)์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์„ค์ •์„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. + +## ๋„ค์ด๋ฐ + +- **๋ณ€์ˆ˜/ํ•จ์ˆ˜**: `camelCase` (์˜ˆ: `userProfile`, `fetchUserData`) +- **์ƒ์ˆ˜**: `UPPER_SNAKE_CASE` (์˜ˆ: `MAX_RETRY_COUNT`) +- **์ปดํฌ๋„ŒํŠธ/ํด๋ž˜์Šค/ํƒ€์ž…**: `PascalCase` (์˜ˆ: `UserCard`, `OrderStatus`) +- **ํŒŒ์ผ๋ช…** + - Vue ์ปดํฌ๋„ŒํŠธ: `PascalCase.vue` (์˜ˆ: `UserCard.vue`) + - Composable: `use` ์ ‘๋‘์‚ฌ + `camelCase` (์˜ˆ: `useAuth.ts`) + - ์ผ๋ฐ˜ TS ๋ชจ๋“ˆ: `kebab-case.ts` (์˜ˆ: `format-date.ts`) +- **์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ**: `handle` ๋˜๋Š” `on` ์ ‘๋‘์‚ฌ (์˜ˆ: `handleClick`, `onSubmit`) +- **๋ถˆ๋ฆฌ์–ธ**: `is`, `has`, `can`, `should` ์ ‘๋‘์‚ฌ (์˜ˆ: `isLoading`, `hasError`) + +## ํƒ€์ž… + +- `any` ์‚ฌ์šฉ ๊ธˆ์ง€. ๋ถˆ๊ฐ€ํ”ผํ•  ๊ฒฝ์šฐ ์ฃผ์„์œผ๋กœ ์ด์œ ๋ฅผ ๋‚จ๊ธฐ๊ณ  `unknown`์„ ๋จผ์ € ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. +- ๊ณต๊ฐœ API(ํƒ€ ๋ชจ๋“ˆ์—์„œ import ๋˜๋Š” ๊ฒƒ)๋Š” ๋ฐ˜๋“œ์‹œ ํƒ€์ž…์„ export ํ•ฉ๋‹ˆ๋‹ค. +- ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ `as const` ๋˜๋Š” ๋ณ„๋„ ํƒ€์ž… alias๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + +## ์ฃผ์„ + +- "๋ฌด์—‡์„" ๋ณด๋‹ค "์™œ"๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. +- TODO/FIXME ์ฃผ์„์—๋Š” ์ž‘์„ฑ์ž์™€ ๋‚ ์งœ ๋˜๋Š” ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +- ๊ณต๊ฐœ ํ•จ์ˆ˜/์ปดํฌ๋„ŒํŠธ์—๋Š” JSDoc ํ•œ ์ค„ ์„ค๋ช…์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. + +## import ์ˆœ์„œ + +1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ: `vue`, `nuxt`) +2. ๋‚ด๋ถ€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ (์˜ˆ: `~/components/...`) +3. ์ƒ๋Œ€ ๊ฒฝ๋กœ (์˜ˆ: `./utils`) +4. ํƒ€์ž… only import๋Š” ๊ฐ ๊ทธ๋ฃน ๋‚ด์—์„œ ๋ณ„๋„ ๋ธ”๋ก์œผ๋กœ ๋ถ„๋ฆฌ + +๊ทธ๋ฃน ์‚ฌ์ด์—๋Š” ๋นˆ ์ค„์„ ํ•œ ์ค„ ๋‘ก๋‹ˆ๋‹ค. diff --git a/.claude/rules/commit-pr.md b/.claude/rules/commit-pr.md new file mode 100644 index 0000000..d3a65f5 --- /dev/null +++ b/.claude/rules/commit-pr.md @@ -0,0 +1,83 @@ +# ์ปค๋ฐ‹ / PR ๊ทœ์น™ + +## ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ + +[Conventional Commits](https://www.conventionalcommits.org/)๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. + +``` +(): + + + +