From 6a208d6b06f834b932891222d5940e47fe64749b Mon Sep 17 00:00:00 2001 From: hansoo Date: Sat, 12 Jul 2025 07:31:32 +0900 Subject: [PATCH] feat: Set up Task Master AI project management system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Initialize Task Master AI with configuration and PRD - Create comprehensive project improvement plan (10 tasks) - Set up MCP server integration for Claude Code - Add custom slash commands and tool configurations - Generate structured task breakdown for development phases: * Phase 1: TypeScript strict mode, code quality, security * Phase 2: Zustand, TanStack Query, testing setup * Phase 3: Performance optimization, automated deployment * Phase 4: Monitoring, bundle optimization ๐Ÿค– Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .claude/commands/taskmaster-complete.md | 9 + .claude/commands/taskmaster-next.md | 8 + .claude/settings.json | 18 + .env.example | 10 + .gitignore | 13 + .mcp.json | 19 ++ .taskmaster/config.json | 105 ++++++ .taskmaster/docs/improvement-plan.md | 156 +++++++++ .taskmaster/state.json | 6 + .taskmaster/tasks/task_001.txt | 11 + .taskmaster/tasks/task_002.txt | 11 + .taskmaster/tasks/task_003.txt | 11 + .taskmaster/tasks/task_004.txt | 11 + .taskmaster/tasks/task_005.txt | 11 + .taskmaster/tasks/task_006.txt | 11 + .taskmaster/tasks/task_007.txt | 11 + .taskmaster/tasks/task_008.txt | 11 + .taskmaster/tasks/task_009.txt | 11 + .taskmaster/tasks/task_010.txt | 11 + .taskmaster/tasks/tasks.json | 256 +++++++++++++++ .taskmaster/templates/example_prd.txt | 47 +++ CLAUDE.md | 417 ++++++++++++++++++++++++ PROJECT_IMPROVEMENT_PLAN.md | 327 +++++++++++++++++++ 23 files changed, 1501 insertions(+) create mode 100644 .claude/commands/taskmaster-complete.md create mode 100644 .claude/commands/taskmaster-next.md create mode 100644 .claude/settings.json create mode 100644 .env.example create mode 100644 .mcp.json create mode 100644 .taskmaster/config.json create mode 100644 .taskmaster/docs/improvement-plan.md create mode 100644 .taskmaster/state.json create mode 100644 .taskmaster/tasks/task_001.txt create mode 100644 .taskmaster/tasks/task_002.txt create mode 100644 .taskmaster/tasks/task_003.txt create mode 100644 .taskmaster/tasks/task_004.txt create mode 100644 .taskmaster/tasks/task_005.txt create mode 100644 .taskmaster/tasks/task_006.txt create mode 100644 .taskmaster/tasks/task_007.txt create mode 100644 .taskmaster/tasks/task_008.txt create mode 100644 .taskmaster/tasks/task_009.txt create mode 100644 .taskmaster/tasks/task_010.txt create mode 100644 .taskmaster/tasks/tasks.json create mode 100644 .taskmaster/templates/example_prd.txt create mode 100644 CLAUDE.md create mode 100644 PROJECT_IMPROVEMENT_PLAN.md diff --git a/.claude/commands/taskmaster-complete.md b/.claude/commands/taskmaster-complete.md new file mode 100644 index 0000000..d5f52ea --- /dev/null +++ b/.claude/commands/taskmaster-complete.md @@ -0,0 +1,9 @@ +Task Master ํƒœ์Šคํฌ ์™„๋ฃŒ: $ARGUMENTS + +๋‹จ๊ณ„: + +1. `task-master show $ARGUMENTS`๋กœ ํ˜„์žฌ ํƒœ์Šคํฌ ๊ฒ€ํ†  +2. ๋ชจ๋“  ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ +3. ํ•ด๋‹น ํƒœ์Šคํฌ์™€ ๊ด€๋ จ๋œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ +4. `task-master set-status --id=$ARGUMENTS --status=done`์œผ๋กœ ์™„๋ฃŒ ํ‘œ์‹œ +5. `task-master next`๋กœ ๋‹ค์Œ ๊ฐ€๋Šฅํ•œ ํƒœ์Šคํฌ ํ‘œ์‹œ \ No newline at end of file diff --git a/.claude/commands/taskmaster-next.md b/.claude/commands/taskmaster-next.md new file mode 100644 index 0000000..1deae4d --- /dev/null +++ b/.claude/commands/taskmaster-next.md @@ -0,0 +1,8 @@ +๋‹ค์Œ Task Master ํƒœ์Šคํฌ๋ฅผ ์ฐพ์•„์„œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. + +๋‹จ๊ณ„: + +1. `task-master next` ์‹คํ–‰ํ•ด์„œ ๋‹ค์Œ ํƒœ์Šคํฌ ํ™•์ธ +2. ํƒœ์Šคํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด `task-master show ` ์‹คํ–‰ํ•ด์„œ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ +3. ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋‚ด์šฉ ์š”์•ฝ ์ œ๊ณต +4. ์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„ ๋‹จ๊ณ„ ์ œ์•ˆ \ No newline at end of file diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..dca8874 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,18 @@ +{ + "allowedTools": [ + "Edit", + "MultiEdit", + "Write", + "Read", + "Bash(task-master *)", + "Bash(tm *)", + "Bash(git commit*)", + "Bash(git add*)", + "Bash(npm run *)", + "Bash(npx *)", + "mcp__task_master_ai__*" + ], + "mcp": { + "configFile": ".mcp.json" + } +} \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2c5babf --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +# API Keys (Required to enable respective provider) +ANTHROPIC_API_KEY="your_anthropic_api_key_here" # Required: Format: sk-ant-api03-... +PERPLEXITY_API_KEY="your_perplexity_api_key_here" # Optional: Format: pplx-... +OPENAI_API_KEY="your_openai_api_key_here" # Optional, for OpenAI/OpenRouter models. Format: sk-proj-... +GOOGLE_API_KEY="your_google_api_key_here" # Optional, for Google Gemini models. +MISTRAL_API_KEY="your_mistral_key_here" # Optional, for Mistral AI models. +XAI_API_KEY="YOUR_XAI_KEY_HERE" # Optional, for xAI AI models. +AZURE_OPENAI_API_KEY="your_azure_key_here" # Optional, for Azure OpenAI models (requires endpoint in .taskmaster/config.json). +OLLAMA_API_KEY="your_ollama_api_key_here" # Optional: For remote Ollama servers that require authentication. +GITHUB_API_KEY="your_github_api_key_here" # Optional: For GitHub import/export features. Format: ghp_... or github_pat_... \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4e21c06..fc420a3 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,16 @@ android/app/src/main/assets/public/ android/gradle.properties.bak ios/App/Zellyy-Finance-Debug.ipa ios/App/Zellyy-Finance-Release.ipa + +*.log +dev-debug.log +# Dependency directories +node_modules/ +# Environment variables +.env +.vscode +# OS specific + +# Task files +# tasks.json +# tasks/ diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..a5a4734 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,19 @@ +{ + "mcpServers": { + "task-master-ai": { + "command": "npx", + "args": ["-y", "--package=task-master-ai", "task-master-ai"], + "env": { + "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}", + "PERPLEXITY_API_KEY": "${PERPLEXITY_API_KEY}", + "OPENAI_API_KEY": "${OPENAI_API_KEY}", + "GOOGLE_API_KEY": "${GOOGLE_API_KEY}", + "XAI_API_KEY": "${XAI_API_KEY}", + "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}", + "MISTRAL_API_KEY": "${MISTRAL_API_KEY}", + "AZURE_OPENAI_API_KEY": "${AZURE_OPENAI_API_KEY}", + "OLLAMA_API_KEY": "${OLLAMA_API_KEY}" + } + } + } +} \ No newline at end of file diff --git a/.taskmaster/config.json b/.taskmaster/config.json new file mode 100644 index 0000000..11d857d --- /dev/null +++ b/.taskmaster/config.json @@ -0,0 +1,105 @@ +{ + "models": { + "main": { + "0": "c", + "1": "l", + "2": "a", + "3": "u", + "4": "d", + "5": "e", + "6": "-", + "7": "3", + "8": "-", + "9": "5", + "10": "-", + "11": "s", + "12": "o", + "13": "n", + "14": "n", + "15": "e", + "16": "t", + "17": "-", + "18": "2", + "19": "0", + "20": "2", + "21": "4", + "22": "1", + "23": "0", + "24": "2", + "25": "2", + "provider": "claude-code", + "modelId": "sonnet", + "maxTokens": 64000, + "temperature": 0.2 + }, + "research": { + "0": "p", + "1": "e", + "2": "r", + "3": "p", + "4": "l", + "5": "e", + "6": "x", + "7": "i", + "8": "t", + "9": "y", + "10": "-", + "11": "l", + "12": "l", + "13": "a", + "14": "m", + "15": "a", + "16": "-", + "17": "3", + "18": ".", + "19": "1", + "20": "-", + "21": "s", + "22": "o", + "23": "n", + "24": "a", + "25": "r", + "26": "-", + "27": "l", + "28": "a", + "29": "r", + "30": "g", + "31": "e", + "32": "-", + "33": "1", + "34": "2", + "35": "8", + "36": "k", + "37": "-", + "38": "o", + "39": "n", + "40": "l", + "41": "i", + "42": "n", + "43": "e", + "provider": "gemini-cli", + "modelId": "gemini-2.5-pro", + "maxTokens": 65536, + "temperature": 0.1 + }, + "fallback": { + "provider": "claude-code", + "modelId": "sonnet", + "maxTokens": 64000, + "temperature": 0.2 + } + }, + "global": { + "logLevel": "info", + "debug": false, + "defaultNumTasks": 10, + "defaultSubtasks": 5, + "defaultPriority": "medium", + "projectName": "Task Master", + "ollamaBaseURL": "http://localhost:11434/api", + "bedrockBaseURL": "https://bedrock.us-east-1.amazonaws.com", + "responseLanguage": "Korean", + "userId": "1234567890" + }, + "claudeCode": {} +} \ No newline at end of file diff --git a/.taskmaster/docs/improvement-plan.md b/.taskmaster/docs/improvement-plan.md new file mode 100644 index 0000000..9e840e7 --- /dev/null +++ b/.taskmaster/docs/improvement-plan.md @@ -0,0 +1,156 @@ +# ์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ ๊ฐœ์„  ๊ณ„ํš PRD + +## ํ”„๋กœ์ ํŠธ ๊ฐœ์š” +์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ(Zellyy Finance) ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ ์  ๊ฐœ์„ ์„ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ ๊ณ„ํš + +## 1๋‹จ๊ณ„: ์ฆ‰์‹œ ๊ฐœ์„  (1์ฃผ์ผ) + +### 1.1 TypeScript ์„ค์ • ๊ฐ•ํ™” +- tsconfig.json์˜ strict ๋ชจ๋“œ ์ ์ง„์  ํ™œ์„ฑํ™” +- noImplicitAny, strictNullChecks ํ™œ์„ฑํ™” +- ๊ธฐ์กด any ํƒ€์ž… ์‚ฌ์šฉ ์ œ๊ฑฐ +- ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด + +### 1.2 ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  +- console.log 81๊ฐœ ์ œ๊ฑฐ +- ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ • (SupabaseToAppwriteMigration import ์˜ค๋ฅ˜) +- ESLint ๊ทœ์น™ ๊ฐ•ํ™” +- Prettier ์„ค์ • ์ถ”๊ฐ€ + +### 1.3 ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ ๊ฐ•ํ™” +- API ํ‚ค ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฌธ์ œ ํ•ด๊ฒฐ +- ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ๊ฐœ์„  +- .env ํŒŒ์ผ ๊ตฌ์กฐ ์ •๋ฆฌ + +### 1.4 CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• +- GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ์„ค์ • +- ์ž๋™ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ +- ESLint ์ž๋™ ๊ฒ€์‚ฌ + +## 2๋‹จ๊ณ„: ํ•ต์‹ฌ ๊ฐœ์„  (2-3์ฃผ) + +### 2.1 ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +- Context API์—์„œ Zustand๋กœ ์ „ํ™˜ +- ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ 80% ๊ฐ์†Œ +- ํƒ€์ž… ์•ˆ์ „์„ฑ ํ–ฅ์ƒ +- ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ + +### 2.2 ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ฐœ์„  +- TanStack Query ๋„์ž… +- ์ž๋™ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” +- ์˜คํ”„๋ผ์ธ ์ง€์› ๊ฐ•ํ™” +- ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„ + +### 2.3 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ +- Vitest + React Testing Library ์„ค์ • +- ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹จ์œ„ ํ…Œ์ŠคํŠธ +- ์ฃผ์š” ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ +- ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ชฉํ‘œ: 80% + +### 2.4 React ์„ฑ๋Šฅ ์ตœ์ ํ™” +- React.memo, useMemo, useCallback ์ ์šฉ +- ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€ +- ์„ธ์…˜ ์ฒดํฌ ์ฃผ๊ธฐ ์ตœ์ ํ™” (5์ดˆ โ†’ 30์ดˆ) +- ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ + +### 2.5 ์ž๋™ ๋ฐฐํฌ ์„ค์ • +- Vercel ์ž๋™ ๋ฐฐํฌ ์„ค์ • +- ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ (์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜) +- PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ + +## 3๋‹จ๊ณ„: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ (1๊ฐœ์›”) + +### 3.1 ์ธ์ฆ ์‹œ์Šคํ…œ ๊ฐœ์„  +- Clerk ์ธ์ฆ ์‹œ์Šคํ…œ ๋„์ž… +- ์นด์นด์˜ค/๋„ค์ด๋ฒ„ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ถ”๊ฐ€ +- 2FA ๋ฐ ์ƒ์ฒด์ธ์ฆ ์ง€์› +- ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ + +### 3.2 ๋ฐฑ์—”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +- Appwrite์—์„œ Supabase๋กœ ์ „ํ™˜ ๊ณ ๋ ค +- ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๊ฐœ์„  +- ์˜คํ”„๋ผ์ธ ์ง€์› ๊ฐ•ํ™” +- ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ + +### 3.3 ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ตœ์ ํ™” +- Recharts์—์„œ Chart.js๋กœ ์ „ํ™˜ +- ๋ฒˆ๋“ค ํฌ๊ธฐ 300KB โ†’ 100KB ๊ฐ์†Œ +- ๋ชจ๋ฐ”์ผ ์„ฑ๋Šฅ ํ–ฅ์ƒ +- ์ปค์Šคํ…€ ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ + +### 3.4 PWA ๊ธฐ๋Šฅ ์ถ”๊ฐ€ +- ์„œ๋น„์Šค ์›Œ์ปค ๊ตฌํ˜„ +- ์˜คํ”„๋ผ์ธ ์บ์‹œ ์ „๋žต +- ํ‘ธ์‹œ ์•Œ๋ฆผ ์ง€์› +- ์•ฑ ์„ค์น˜ ํ”„๋กฌํ”„ํŠธ + +## 4๋‹จ๊ณ„: ์ตœ์ ํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง (2๊ฐœ์›”) + +### 4.1 ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™” +- Webpack Bundle Analyzer ์‚ฌ์šฉ +- 74๊ฐœ dependencies ์ •๋ฆฌ +- ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ +- Tree shaking ์ตœ์ ํ™” + +### 4.2 ๋ชจ๋ฐ”์ผ ๋นŒ๋“œ ์ž๋™ํ™” +- Android/iOS ์ž๋™ ๋นŒ๋“œ +- App Store/Play Store ์ž๋™ ๋ฐฐํฌ +- ๋ฒ„์ „ ๊ด€๋ฆฌ ์ž๋™ํ™” +- ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ž๋™ ์ƒ์„ฑ + +### 4.3 ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• +- Sentry ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง +- ์„ฑ๋Šฅ ์ง€ํ‘œ ์ถ”์  +- ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„ +- ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌ์ถ• + +### 4.4 ์ ‘๊ทผ์„ฑ ๋ฐ UX ๊ฐœ์„  +- ARIA ๋ผ๋ฒจ ์ถ”๊ฐ€ +- ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ง€์› +- ์ƒ‰์ƒ ๋Œ€๋น„ ๊ฐœ์„  +- ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ง€์› + +## ์„ฑ๊ณต ์ง€ํ‘œ + +### ๊ธฐ์ˆ ์  ์ง€ํ‘œ +- ๋นŒ๋“œ ์‹œ๊ฐ„ 50% ๋‹จ์ถ• +- ์•ฑ ๋กœ๋”ฉ ์†๋„ 2๋ฐฐ ํ–ฅ์ƒ +- ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ๋‹ฌ์„ฑ +- ๋ฒˆ๋“ค ํฌ๊ธฐ 30% ๊ฐ์†Œ + +### ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ +- ๋กœ๊ทธ์ธ ์„ฑ๊ณต๋ฅ  95% ์ด์ƒ +- ์•ฑ ํฌ๋ž˜์‹œ์œจ 0.1% ์ดํ•˜ +- ์˜คํ”„๋ผ์ธ ๋™์ž‘ 100% ์ง€์› +- ์ ‘๊ทผ์„ฑ AA ๋“ฑ๊ธ‰ ๋‹ฌ์„ฑ + +## ์œ„ํ—˜ ์š”์†Œ ๋ฐ ๋Œ€์‘์ฑ… + +### ๊ธฐ์ˆ ์  ์œ„ํ—˜ +- ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ๋ฐ์ดํ„ฐ ์†์‹ค โ†’ ๋ฐฑ์—… ์ „๋žต ์ˆ˜๋ฆฝ +- ์„ฑ๋Šฅ ์ €ํ•˜ โ†’ ๋‹จ๊ณ„์  ์ ์šฉ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง +- ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ โ†’ ์ฒ ์ €ํ•œ ํ…Œ์ŠคํŠธ + +### ์ผ์ • ์œ„ํ—˜ +- ๋ณต์žก์„ฑ ๊ณผ์†Œํ‰๊ฐ€ โ†’ ๋ฒ„ํผ ์‹œ๊ฐ„ ํ™•๋ณด +- ์˜์กด์„ฑ ๋ฌธ์ œ โ†’ ๋Œ€์•ˆ ๊ธฐ์ˆ  ์ค€๋น„ +- ํŒ€ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ โ†’ ์šฐ์„ ์ˆœ์œ„ ์กฐ์ • + +## ๋ฆฌ์†Œ์Šค ์š”๊ตฌ์‚ฌํ•ญ + +### ๊ฐœ๋ฐœ ๋„๊ตฌ +- GitHub Actions (๋ฌด๋ฃŒ ํ‹ฐ์–ด) +- Vercel (๋ฌด๋ฃŒ ํ‹ฐ์–ด) +- Sentry (๋ฌด๋ฃŒ ํ‹ฐ์–ด) +- Linear (๋ฌด๋ฃŒ ํ‹ฐ์–ด) + +### API ์„œ๋น„์Šค +- Clerk (10,000 ์‚ฌ์šฉ์ž๊นŒ์ง€ ๋ฌด๋ฃŒ) +- Supabase (500MB๊นŒ์ง€ ๋ฌด๋ฃŒ) +- ์ด ์˜ˆ์ƒ ๋น„์šฉ: $0/์›” (์†Œ๊ทœ๋ชจ) + +## ๋‹ค์Œ ๋‹จ๊ณ„ +1. Phase 1 ์ž‘์—… ์ฆ‰์‹œ ์‹œ์ž‘ +2. ์ฃผ๊ฐ„ ์ง„ํ–‰ ์ƒํ™ฉ ๋ฆฌ๋ทฐ +3. ํ•„์š”์‹œ ๊ณ„ํš ์กฐ์ • +4. ๊ฐ ๋‹จ๊ณ„๋ณ„ ์„ฑ๊ณผ ์ธก์ • \ No newline at end of file diff --git a/.taskmaster/state.json b/.taskmaster/state.json new file mode 100644 index 0000000..2bd7ae2 --- /dev/null +++ b/.taskmaster/state.json @@ -0,0 +1,6 @@ +{ + "currentTag": "master", + "lastSwitched": "2025-07-11T20:57:32.202Z", + "branchTagMapping": {}, + "migrationNoticeShown": true +} \ No newline at end of file diff --git a/.taskmaster/tasks/task_001.txt b/.taskmaster/tasks/task_001.txt new file mode 100644 index 0000000..20003e1 --- /dev/null +++ b/.taskmaster/tasks/task_001.txt @@ -0,0 +1,11 @@ +# Task ID: 1 +# Title: TypeScript ์„ค์ • ๊ฐ•ํ™” ๋ฐ ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด +# Status: pending +# Dependencies: None +# Priority: high +# Description: tsconfig.json์˜ strict ๋ชจ๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ธฐ์กด any ํƒ€์ž… ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. tsconfig.json์—์„œ strict: true, noImplicitAny: true, strictNullChecks: true ํ™œ์„ฑํ™” 2. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ any ํƒ€์ž… ์‚ฌ์šฉ ๋ถ€๋ถ„ ์ฐพ์•„์„œ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ 3. ํƒ€์ž… ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ˆ˜์ • 4. ์ปดํฌ๋„ŒํŠธ props์™€ state์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ 5. API ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€ + +# Test Strategy: +TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ 0๊ฐœ ๋‹ฌ์„ฑ, tsc --noEmit ๋ช…๋ น์–ด๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ™•์ธ, IDE์—์„œ ํƒ€์ž… ์ถ”๋ก ์ด ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆ diff --git a/.taskmaster/tasks/task_002.txt b/.taskmaster/tasks/task_002.txt new file mode 100644 index 0000000..508f98c --- /dev/null +++ b/.taskmaster/tasks/task_002.txt @@ -0,0 +1,11 @@ +# Task ID: 2 +# Title: ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๋ฐ ๋ฆฐํŒ… ์„ค์ • +# Status: pending +# Dependencies: 1 +# Priority: high +# Description: console.log ์ œ๊ฑฐ, ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •, ESLint/Prettier ์„ค์ •์„ ํ†ตํ•ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ console.log 81๊ฐœ ์ œ๊ฑฐ (production์—์„œ๋Š” ์‚ญ์ œ, development์—์„œ๋Š” logger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ) 2. SupabaseToAppwriteMigration import ์˜ค๋ฅ˜ ์ˆ˜์ • 3. ESLint ๊ทœ์น™ ๊ฐ•ํ™” (@typescript-eslint/recommended, react-hooks/recommended ์ถ”๊ฐ€) 4. Prettier ์„ค์ • ์ถ”๊ฐ€ (.prettierrc, .prettierignore ํŒŒ์ผ ์ƒ์„ฑ) 5. pre-commit hook ์„ค์ •์œผ๋กœ ์ž๋™ ํฌ๋งทํŒ… + +# Test Strategy: +ESLint ์˜ค๋ฅ˜ 0๊ฐœ, Prettier ํฌ๋งทํŒ… ์ž๋™ ์ ์šฉ ํ™•์ธ, ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ, ๋ถˆํ•„์š”ํ•œ console.log๊ฐ€ production ๋นŒ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์ฆ diff --git a/.taskmaster/tasks/task_003.txt b/.taskmaster/tasks/task_003.txt new file mode 100644 index 0000000..c52eab7 --- /dev/null +++ b/.taskmaster/tasks/task_003.txt @@ -0,0 +1,11 @@ +# Task ID: 3 +# Title: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ๊ด€๋ฆฌ ๊ฐœ์„  +# Status: pending +# Dependencies: None +# Priority: high +# Description: API ํ‚ค์˜ ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜์ง€ ๋ง์•„์•ผ ํ•  API ํ‚ค๋“ค์„ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ๋กœ ์ด๋™ 2. .env.example ํŒŒ์ผ ์ƒ์„ฑ์œผ๋กœ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฌธ์„œํ™” 3. VITE_๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜๋„๋ก ์ •๋ฆฌ 4. ๋ฏผ๊ฐํ•œ API ํ‚ค๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋‚˜ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ 5. ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ (.env.local, .env.production) + +# Test Strategy: +๋นŒ๋“œ๋œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋ฏผ๊ฐํ•œ API ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜๋Š”์ง€ ๊ฐ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ diff --git a/.taskmaster/tasks/task_004.txt b/.taskmaster/tasks/task_004.txt new file mode 100644 index 0000000..5a98166 --- /dev/null +++ b/.taskmaster/tasks/task_004.txt @@ -0,0 +1,11 @@ +# Task ID: 4 +# Title: CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• +# Status: pending +# Dependencies: 2 +# Priority: medium +# Description: GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ESLint ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. .github/workflows/ci.yml ํŒŒ์ผ ์ƒ์„ฑ 2. Node.js ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์˜์กด์„ฑ ์„ค์น˜ 3. TypeScript ๋นŒ๋“œ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ 4. ESLint ๋ฐ Prettier ๊ฒ€์‚ฌ ์ž๋™ํ™” 5. ํ…Œ์ŠคํŠธ ์‹คํ–‰ (๋‚˜์ค‘์— ์ถ”๊ฐ€๋  ํ…Œ์ŠคํŠธ๋“ค) 6. ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ ๋ฐ ์ €์žฅ 7. PR์—์„œ ์ž๋™ ๊ฒ€์‚ฌ ์‹คํ–‰ + +# Test Strategy: +GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ, PR ์ƒ์„ฑ ์‹œ ์ž๋™ ๊ฒ€์‚ฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ, ๋นŒ๋“œ ์‹คํŒจ ์‹œ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ diff --git a/.taskmaster/tasks/task_005.txt b/.taskmaster/tasks/task_005.txt new file mode 100644 index 0000000..70ae468 --- /dev/null +++ b/.taskmaster/tasks/task_005.txt @@ -0,0 +1,11 @@ +# Task ID: 5 +# Title: ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +# Status: pending +# Dependencies: 1 +# Priority: medium +# Description: ๊ธฐ์กด Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Zustand๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +# Details: +1. Zustand ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • 2. ๊ธฐ์กด Context ๊ตฌ์กฐ ๋ถ„์„ ๋ฐ Zustand store ์„ค๊ณ„ 3. ์ธ์ฆ ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (auth store) 4. ์•ฑ ์ „์ฒด ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (app store) 5. ๊ธฐ์กด useContext ํ˜ธ์ถœ์„ zustand store ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ 6. TypeScript ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€ 7. DevTools ์—ฐ๋™ ์„ค์ • + +# Test Strategy: +์ƒํƒœ ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ƒํƒœ ์ถ”์  ๊ฐ€๋Šฅ ํ™•์ธ diff --git a/.taskmaster/tasks/task_006.txt b/.taskmaster/tasks/task_006.txt new file mode 100644 index 0000000..e85888f --- /dev/null +++ b/.taskmaster/tasks/task_006.txt @@ -0,0 +1,11 @@ +# Task ID: 6 +# Title: TanStack Query๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ฐœ์„  +# Status: pending +# Dependencies: 5 +# Priority: medium +# Description: TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ž๋™ ์บ์‹ฑ, ๋™๊ธฐํ™”, ์˜คํ”„๋ผ์ธ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. @tanstack/react-query ์„ค์น˜ ๋ฐ QueryClient ์„ค์ • 2. API ํ˜ธ์ถœ ํ•จ์ˆ˜๋“ค์„ React Query hooks๋กœ ์ „ํ™˜ 3. ์ž๋™ ์บ์‹ฑ ์ „๋žต ์„ค์ • (staleTime, cacheTime) 4. ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„ (optimistic updates) 5. ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ 6. ๋ฐฑ๊ทธ๋ผ์šด๋“œ refetch ์„ค์ • 7. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„ + +# Test Strategy: +๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ™•์ธ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ diff --git a/.taskmaster/tasks/task_007.txt b/.taskmaster/tasks/task_007.txt new file mode 100644 index 0000000..bff7d79 --- /dev/null +++ b/.taskmaster/tasks/task_007.txt @@ -0,0 +1,11 @@ +# Task ID: 7 +# Title: ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ•ต์‹ฌ ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž‘์„ฑ +# Status: pending +# Dependencies: 4 +# Priority: medium +# Description: Vitest์™€ React Testing Library๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ฃผ์š” ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. Vitest ๋ฐ React Testing Library ์„ค์น˜ ๋ฐ ์„ค์ • 2. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ (vitest.config.ts) 3. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ 4. ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ 5. ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ (๋กœ๊ทธ์ธ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋“ฑ) 6. API ๋ชจํ‚น ์„ค์ • 7. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ๋ชฉํ‘œ ๋‹ฌ์„ฑ + +# Test Strategy: +๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ…Œ์ŠคํŠธ ์ž๋™ ์‹คํ–‰ ํ™•์ธ diff --git a/.taskmaster/tasks/task_008.txt b/.taskmaster/tasks/task_008.txt new file mode 100644 index 0000000..59e055c --- /dev/null +++ b/.taskmaster/tasks/task_008.txt @@ -0,0 +1,11 @@ +# Task ID: 8 +# Title: React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ตฌํ˜„ +# Status: pending +# Dependencies: 6 +# Priority: medium +# Description: React.memo, useMemo, useCallback์„ ์ ์šฉํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์•ฑ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +# Details: +1. React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•œ ์„ฑ๋Šฅ ๋ถ„์„ 2. ์ž์ฃผ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— React.memo ์ ์šฉ 3. ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๋กœ์ง์— useMemo ์ ์šฉ 4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— useCallback ์ ์šฉ 5. ์„ธ์…˜ ์ฒดํฌ ์ฃผ๊ธฐ๋ฅผ 5์ดˆ์—์„œ 30์ดˆ๋กœ ์กฐ์ • 6. ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ตฌํ˜„ (React.lazy, Suspense) 7. ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ + +# Test Strategy: +React DevTools์—์„œ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ 2๋ฐฐ ํ–ฅ์ƒ ์ธก์ •, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™” ํ™•์ธ diff --git a/.taskmaster/tasks/task_009.txt b/.taskmaster/tasks/task_009.txt new file mode 100644 index 0000000..9d8605d --- /dev/null +++ b/.taskmaster/tasks/task_009.txt @@ -0,0 +1,11 @@ +# Task ID: 9 +# Title: Vercel ์ž๋™ ๋ฐฐํฌ ์„ค์ • +# Status: pending +# Dependencies: 4 +# Priority: low +# Description: Vercel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ์™€ PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. Vercel ํ”„๋กœ์ ํŠธ ์—ฐ๊ฒฐ ๋ฐ GitHub ํ†ตํ•ฉ 2. ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ ์„ค์ • (ํ”„๋กœ๋•์…˜, ์Šคํ…Œ์ด์ง•) 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ • 4. PR ์ƒ์„ฑ ์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ์ž๋™ ์ƒ์„ฑ 5. ๋นŒ๋“œ ์ตœ์ ํ™” ์„ค์ • 6. ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ๋ฐ SSL ์ธ์ฆ์„œ ์„ค์ • 7. ๋ฐฐํฌ ํ›„ ์•Œ๋ฆผ ์„ค์ • + +# Test Strategy: +์ž๋™ ๋ฐฐํฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธ, PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ๋™์ž‘ ํ™•์ธ, ํ™˜๊ฒฝ๋ณ„๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ๊ฒ€์ฆ diff --git a/.taskmaster/tasks/task_010.txt b/.taskmaster/tasks/task_010.txt new file mode 100644 index 0000000..9f191af --- /dev/null +++ b/.taskmaster/tasks/task_010.txt @@ -0,0 +1,11 @@ +# Task ID: 10 +# Title: ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” +# Status: pending +# Dependencies: 8, 9 +# Priority: low +# Description: Sentry๋ฅผ ์‚ฌ์šฉํ•œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์„ค์ •ํ•˜๊ณ  ์›นํŒฉ ๋ฒˆ๋“ค ๋ถ„์„์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. +# Details: +1. Sentry ์„ค์น˜ ๋ฐ ์„ค์ • (์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง, ์„ฑ๋Šฅ ์ถ”์ ) 2. Webpack Bundle Analyzer๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒˆ๋“ค ๋ถ„์„ 3. ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ (74๊ฐœ dependencies ์ •๋ฆฌ) 4. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ์œผ๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ตœ์ ํ™” 5. Tree shaking ์ตœ์ ํ™” 6. ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ํŠธ๋ž˜ํ‚น 7. ์„ฑ๋Šฅ ์ง€ํ‘œ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ + +# Test Strategy: +Sentry์—์„œ ์—๋Ÿฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ง‘๋˜๋Š”์ง€ ํ™•์ธ, ๋ฒˆ๋“ค ํฌ๊ธฐ 30% ๊ฐ์†Œ ๋‹ฌ์„ฑ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  ์ธก์ • diff --git a/.taskmaster/tasks/tasks.json b/.taskmaster/tasks/tasks.json new file mode 100644 index 0000000..49805f1 --- /dev/null +++ b/.taskmaster/tasks/tasks.json @@ -0,0 +1,256 @@ +{ + "tasks": [ + { + "id": 1, + "title": "TypeScript ์„ค์ • ๊ฐ•ํ™” ๋ฐ ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด", + "description": "tsconfig.json์˜ strict ๋ชจ๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ธฐ์กด any ํƒ€์ž… ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. tsconfig.json์—์„œ strict: true, noImplicitAny: true, strictNullChecks: true ํ™œ์„ฑํ™” 2. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ any ํƒ€์ž… ์‚ฌ์šฉ ๋ถ€๋ถ„ ์ฐพ์•„์„œ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ 3. ํƒ€์ž… ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ˆ˜์ • 4. ์ปดํฌ๋„ŒํŠธ props์™€ state์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ 5. API ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€", + "testStrategy": "TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ 0๊ฐœ ๋‹ฌ์„ฑ, tsc --noEmit ๋ช…๋ น์–ด๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ™•์ธ, IDE์—์„œ ํƒ€์ž… ์ถ”๋ก ์ด ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "high", + "dependencies": [], + "status": "pending", + "subtasks": [] + }, + { + "id": 2, + "title": "์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๋ฐ ๋ฆฐํŒ… ์„ค์ •", + "description": "console.log ์ œ๊ฑฐ, ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •, ESLint/Prettier ์„ค์ •์„ ํ†ตํ•ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ console.log 81๊ฐœ ์ œ๊ฑฐ (production์—์„œ๋Š” ์‚ญ์ œ, development์—์„œ๋Š” logger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ) 2. SupabaseToAppwriteMigration import ์˜ค๋ฅ˜ ์ˆ˜์ • 3. ESLint ๊ทœ์น™ ๊ฐ•ํ™” (@typescript-eslint/recommended, react-hooks/recommended ์ถ”๊ฐ€) 4. Prettier ์„ค์ • ์ถ”๊ฐ€ (.prettierrc, .prettierignore ํŒŒ์ผ ์ƒ์„ฑ) 5. pre-commit hook ์„ค์ •์œผ๋กœ ์ž๋™ ํฌ๋งทํŒ…", + "testStrategy": "ESLint ์˜ค๋ฅ˜ 0๊ฐœ, Prettier ํฌ๋งทํŒ… ์ž๋™ ์ ์šฉ ํ™•์ธ, ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ, ๋ถˆํ•„์š”ํ•œ console.log๊ฐ€ production ๋นŒ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "high", + "dependencies": [1], + "status": "pending", + "subtasks": [] + }, + { + "id": 3, + "title": "ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ๊ด€๋ฆฌ ๊ฐœ์„ ", + "description": "API ํ‚ค์˜ ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜์ง€ ๋ง์•„์•ผ ํ•  API ํ‚ค๋“ค์„ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ๋กœ ์ด๋™ 2. .env.example ํŒŒ์ผ ์ƒ์„ฑ์œผ๋กœ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฌธ์„œํ™” 3. VITE_๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜๋„๋ก ์ •๋ฆฌ 4. ๋ฏผ๊ฐํ•œ API ํ‚ค๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋‚˜ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ 5. ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ (.env.local, .env.production)", + "testStrategy": "๋นŒ๋“œ๋œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋ฏผ๊ฐํ•œ API ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜๋Š”์ง€ ๊ฐ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ", + "priority": "high", + "dependencies": [], + "status": "pending", + "subtasks": [] + }, + { + "id": 4, + "title": "CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•", + "description": "GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ESLint ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. .github/workflows/ci.yml ํŒŒ์ผ ์ƒ์„ฑ 2. Node.js ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์˜์กด์„ฑ ์„ค์น˜ 3. TypeScript ๋นŒ๋“œ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ 4. ESLint ๋ฐ Prettier ๊ฒ€์‚ฌ ์ž๋™ํ™” 5. ํ…Œ์ŠคํŠธ ์‹คํ–‰ (๋‚˜์ค‘์— ์ถ”๊ฐ€๋  ํ…Œ์ŠคํŠธ๋“ค) 6. ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ ๋ฐ ์ €์žฅ 7. PR์—์„œ ์ž๋™ ๊ฒ€์‚ฌ ์‹คํ–‰", + "testStrategy": "GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ, PR ์ƒ์„ฑ ์‹œ ์ž๋™ ๊ฒ€์‚ฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ, ๋นŒ๋“œ ์‹คํŒจ ์‹œ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ", + "priority": "medium", + "dependencies": [2], + "status": "pending", + "subtasks": [] + }, + { + "id": 5, + "title": "์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜", + "description": "๊ธฐ์กด Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Zustand๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.", + "details": "1. Zustand ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • 2. ๊ธฐ์กด Context ๊ตฌ์กฐ ๋ถ„์„ ๋ฐ Zustand store ์„ค๊ณ„ 3. ์ธ์ฆ ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (auth store) 4. ์•ฑ ์ „์ฒด ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (app store) 5. ๊ธฐ์กด useContext ํ˜ธ์ถœ์„ zustand store ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ 6. TypeScript ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€ 7. DevTools ์—ฐ๋™ ์„ค์ •", + "testStrategy": "์ƒํƒœ ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ƒํƒœ ์ถ”์  ๊ฐ€๋Šฅ ํ™•์ธ", + "priority": "medium", + "dependencies": [1], + "status": "pending", + "subtasks": [] + }, + { + "id": 6, + "title": "TanStack Query๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ฐœ์„ ", + "description": "TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ž๋™ ์บ์‹ฑ, ๋™๊ธฐํ™”, ์˜คํ”„๋ผ์ธ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. @tanstack/react-query ์„ค์น˜ ๋ฐ QueryClient ์„ค์ • 2. API ํ˜ธ์ถœ ํ•จ์ˆ˜๋“ค์„ React Query hooks๋กœ ์ „ํ™˜ 3. ์ž๋™ ์บ์‹ฑ ์ „๋žต ์„ค์ • (staleTime, cacheTime) 4. ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„ (optimistic updates) 5. ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ 6. ๋ฐฑ๊ทธ๋ผ์šด๋“œ refetch ์„ค์ • 7. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„", + "testStrategy": "๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ™•์ธ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ", + "priority": "medium", + "dependencies": [5], + "status": "pending", + "subtasks": [] + }, + { + "id": 7, + "title": "ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ•ต์‹ฌ ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž‘์„ฑ", + "description": "Vitest์™€ React Testing Library๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ฃผ์š” ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Vitest ๋ฐ React Testing Library ์„ค์น˜ ๋ฐ ์„ค์ • 2. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ (vitest.config.ts) 3. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ 4. ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ 5. ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ (๋กœ๊ทธ์ธ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋“ฑ) 6. API ๋ชจํ‚น ์„ค์ • 7. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ๋ชฉํ‘œ ๋‹ฌ์„ฑ", + "testStrategy": "๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ…Œ์ŠคํŠธ ์ž๋™ ์‹คํ–‰ ํ™•์ธ", + "priority": "medium", + "dependencies": [4], + "status": "pending", + "subtasks": [] + }, + { + "id": 8, + "title": "React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ตฌํ˜„", + "description": "React.memo, useMemo, useCallback์„ ์ ์šฉํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์•ฑ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.", + "details": "1. React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•œ ์„ฑ๋Šฅ ๋ถ„์„ 2. ์ž์ฃผ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— React.memo ์ ์šฉ 3. ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๋กœ์ง์— useMemo ์ ์šฉ 4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— useCallback ์ ์šฉ 5. ์„ธ์…˜ ์ฒดํฌ ์ฃผ๊ธฐ๋ฅผ 5์ดˆ์—์„œ 30์ดˆ๋กœ ์กฐ์ • 6. ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ตฌํ˜„ (React.lazy, Suspense) 7. ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ", + "testStrategy": "React DevTools์—์„œ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ 2๋ฐฐ ํ–ฅ์ƒ ์ธก์ •, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™” ํ™•์ธ", + "priority": "medium", + "dependencies": [6], + "status": "pending", + "subtasks": [] + }, + { + "id": 9, + "title": "Vercel ์ž๋™ ๋ฐฐํฌ ์„ค์ •", + "description": "Vercel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ์™€ PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Vercel ํ”„๋กœ์ ํŠธ ์—ฐ๊ฒฐ ๋ฐ GitHub ํ†ตํ•ฉ 2. ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ ์„ค์ • (ํ”„๋กœ๋•์…˜, ์Šคํ…Œ์ด์ง•) 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ • 4. PR ์ƒ์„ฑ ์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ์ž๋™ ์ƒ์„ฑ 5. ๋นŒ๋“œ ์ตœ์ ํ™” ์„ค์ • 6. ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ๋ฐ SSL ์ธ์ฆ์„œ ์„ค์ • 7. ๋ฐฐํฌ ํ›„ ์•Œ๋ฆผ ์„ค์ •", + "testStrategy": "์ž๋™ ๋ฐฐํฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธ, PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ๋™์ž‘ ํ™•์ธ, ํ™˜๊ฒฝ๋ณ„๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "low", + "dependencies": [4], + "status": "pending", + "subtasks": [] + }, + { + "id": 10, + "title": "๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™”", + "description": "Sentry๋ฅผ ์‚ฌ์šฉํ•œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์„ค์ •ํ•˜๊ณ  ์›นํŒฉ ๋ฒˆ๋“ค ๋ถ„์„์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Sentry ์„ค์น˜ ๋ฐ ์„ค์ • (์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง, ์„ฑ๋Šฅ ์ถ”์ ) 2. Webpack Bundle Analyzer๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒˆ๋“ค ๋ถ„์„ 3. ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ (74๊ฐœ dependencies ์ •๋ฆฌ) 4. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ์œผ๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ตœ์ ํ™” 5. Tree shaking ์ตœ์ ํ™” 6. ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ํŠธ๋ž˜ํ‚น 7. ์„ฑ๋Šฅ ์ง€ํ‘œ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ", + "testStrategy": "Sentry์—์„œ ์—๋Ÿฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ง‘๋˜๋Š”์ง€ ํ™•์ธ, ๋ฒˆ๋“ค ํฌ๊ธฐ 30% ๊ฐ์†Œ ๋‹ฌ์„ฑ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  ์ธก์ •", + "priority": "low", + "dependencies": [8, 9], + "status": "pending", + "subtasks": [] + } + ], + "metadata": { + "version": "1.0.0", + "created": "2025-01-11", + "lastModified": "2025-01-11", + "project": "์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ ๊ฐœ์„  ํ”„๋กœ์ ํŠธ" + }, + "master": { + "tasks": [ + { + "id": 1, + "title": "TypeScript ์„ค์ • ๊ฐ•ํ™” ๋ฐ ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด", + "description": "tsconfig.json์˜ strict ๋ชจ๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ธฐ์กด any ํƒ€์ž… ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. tsconfig.json์—์„œ strict: true, noImplicitAny: true, strictNullChecks: true ํ™œ์„ฑํ™” 2. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ any ํƒ€์ž… ์‚ฌ์šฉ ๋ถ€๋ถ„ ์ฐพ์•„์„œ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ 3. ํƒ€์ž… ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‹จ๊ณ„์ ์œผ๋กœ ์ˆ˜์ • 4. ์ปดํฌ๋„ŒํŠธ props์™€ state์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ 5. API ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€", + "testStrategy": "TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ 0๊ฐœ ๋‹ฌ์„ฑ, tsc --noEmit ๋ช…๋ น์–ด๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ™•์ธ, IDE์—์„œ ํƒ€์ž… ์ถ”๋ก ์ด ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "high", + "dependencies": [], + "status": "pending", + "subtasks": [] + }, + { + "id": 2, + "title": "์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๋ฐ ๋ฆฐํŒ… ์„ค์ •", + "description": "console.log ์ œ๊ฑฐ, ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •, ESLint/Prettier ์„ค์ •์„ ํ†ตํ•ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ console.log 81๊ฐœ ์ œ๊ฑฐ (production์—์„œ๋Š” ์‚ญ์ œ, development์—์„œ๋Š” logger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ) 2. SupabaseToAppwriteMigration import ์˜ค๋ฅ˜ ์ˆ˜์ • 3. ESLint ๊ทœ์น™ ๊ฐ•ํ™” (@typescript-eslint/recommended, react-hooks/recommended ์ถ”๊ฐ€) 4. Prettier ์„ค์ • ์ถ”๊ฐ€ (.prettierrc, .prettierignore ํŒŒ์ผ ์ƒ์„ฑ) 5. pre-commit hook ์„ค์ •์œผ๋กœ ์ž๋™ ํฌ๋งทํŒ…", + "testStrategy": "ESLint ์˜ค๋ฅ˜ 0๊ฐœ, Prettier ํฌ๋งทํŒ… ์ž๋™ ์ ์šฉ ํ™•์ธ, ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ, ๋ถˆํ•„์š”ํ•œ console.log๊ฐ€ production ๋นŒ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "high", + "dependencies": [ + 1 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 3, + "title": "ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ๊ด€๋ฆฌ ๊ฐœ์„ ", + "description": "API ํ‚ค์˜ ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜์ง€ ๋ง์•„์•ผ ํ•  API ํ‚ค๋“ค์„ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ๋กœ ์ด๋™ 2. .env.example ํŒŒ์ผ ์ƒ์„ฑ์œผ๋กœ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฌธ์„œํ™” 3. VITE_๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜๋„๋ก ์ •๋ฆฌ 4. ๋ฏผ๊ฐํ•œ API ํ‚ค๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋‚˜ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ 5. ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ (.env.local, .env.production)", + "testStrategy": "๋นŒ๋“œ๋œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋ฏผ๊ฐํ•œ API ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜๋Š”์ง€ ๊ฐ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ", + "priority": "high", + "dependencies": [], + "status": "pending", + "subtasks": [] + }, + { + "id": 4, + "title": "CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•", + "description": "GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ESLint ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. .github/workflows/ci.yml ํŒŒ์ผ ์ƒ์„ฑ 2. Node.js ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์˜์กด์„ฑ ์„ค์น˜ 3. TypeScript ๋นŒ๋“œ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ 4. ESLint ๋ฐ Prettier ๊ฒ€์‚ฌ ์ž๋™ํ™” 5. ํ…Œ์ŠคํŠธ ์‹คํ–‰ (๋‚˜์ค‘์— ์ถ”๊ฐ€๋  ํ…Œ์ŠคํŠธ๋“ค) 6. ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ ๋ฐ ์ €์žฅ 7. PR์—์„œ ์ž๋™ ๊ฒ€์‚ฌ ์‹คํ–‰", + "testStrategy": "GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ, PR ์ƒ์„ฑ ์‹œ ์ž๋™ ๊ฒ€์‚ฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ, ๋นŒ๋“œ ์‹คํŒจ ์‹œ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ", + "priority": "medium", + "dependencies": [ + 2 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 5, + "title": "์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜", + "description": "๊ธฐ์กด Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Zustand๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.", + "details": "1. Zustand ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • 2. ๊ธฐ์กด Context ๊ตฌ์กฐ ๋ถ„์„ ๋ฐ Zustand store ์„ค๊ณ„ 3. ์ธ์ฆ ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (auth store) 4. ์•ฑ ์ „์ฒด ์ƒํƒœ ๊ด€๋ฆฌ store ์ƒ์„ฑ (app store) 5. ๊ธฐ์กด useContext ํ˜ธ์ถœ์„ zustand store ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ 6. TypeScript ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€ 7. DevTools ์—ฐ๋™ ์„ค์ •", + "testStrategy": "์ƒํƒœ ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์ƒํƒœ ์ถ”์  ๊ฐ€๋Šฅ ํ™•์ธ", + "priority": "medium", + "dependencies": [ + 1 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 6, + "title": "TanStack Query๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ฐœ์„ ", + "description": "TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ž๋™ ์บ์‹ฑ, ๋™๊ธฐํ™”, ์˜คํ”„๋ผ์ธ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. @tanstack/react-query ์„ค์น˜ ๋ฐ QueryClient ์„ค์ • 2. API ํ˜ธ์ถœ ํ•จ์ˆ˜๋“ค์„ React Query hooks๋กœ ์ „ํ™˜ 3. ์ž๋™ ์บ์‹ฑ ์ „๋žต ์„ค์ • (staleTime, cacheTime) 4. ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„ (optimistic updates) 5. ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ 6. ๋ฐฑ๊ทธ๋ผ์šด๋“œ refetch ์„ค์ • 7. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„", + "testStrategy": "๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ, ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ™•์ธ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ", + "priority": "medium", + "dependencies": [ + 5 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 7, + "title": "ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ•ต์‹ฌ ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž‘์„ฑ", + "description": "Vitest์™€ React Testing Library๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ฃผ์š” ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Vitest ๋ฐ React Testing Library ์„ค์น˜ ๋ฐ ์„ค์ • 2. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ (vitest.config.ts) 3. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ 4. ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ 5. ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ (๋กœ๊ทธ์ธ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋“ฑ) 6. API ๋ชจํ‚น ์„ค์ • 7. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ๋ชฉํ‘œ ๋‹ฌ์„ฑ", + "testStrategy": "๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ…Œ์ŠคํŠธ ์ž๋™ ์‹คํ–‰ ํ™•์ธ", + "priority": "medium", + "dependencies": [ + 4 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 8, + "title": "React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ตฌํ˜„", + "description": "React.memo, useMemo, useCallback์„ ์ ์šฉํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์•ฑ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.", + "details": "1. React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•œ ์„ฑ๋Šฅ ๋ถ„์„ 2. ์ž์ฃผ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— React.memo ์ ์šฉ 3. ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๋กœ์ง์— useMemo ์ ์šฉ 4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— useCallback ์ ์šฉ 5. ์„ธ์…˜ ์ฒดํฌ ์ฃผ๊ธฐ๋ฅผ 5์ดˆ์—์„œ 30์ดˆ๋กœ ์กฐ์ • 6. ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ตฌํ˜„ (React.lazy, Suspense) 7. ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ", + "testStrategy": "React DevTools์—์„œ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜ ๊ฐ์†Œ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ 2๋ฐฐ ํ–ฅ์ƒ ์ธก์ •, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™” ํ™•์ธ", + "priority": "medium", + "dependencies": [ + 6 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 9, + "title": "Vercel ์ž๋™ ๋ฐฐํฌ ์„ค์ •", + "description": "Vercel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ์™€ PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Vercel ํ”„๋กœ์ ํŠธ ์—ฐ๊ฒฐ ๋ฐ GitHub ํ†ตํ•ฉ 2. ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ ์„ค์ • (ํ”„๋กœ๋•์…˜, ์Šคํ…Œ์ด์ง•) 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ • 4. PR ์ƒ์„ฑ ์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ์ž๋™ ์ƒ์„ฑ 5. ๋นŒ๋“œ ์ตœ์ ํ™” ์„ค์ • 6. ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ๋ฐ SSL ์ธ์ฆ์„œ ์„ค์ • 7. ๋ฐฐํฌ ํ›„ ์•Œ๋ฆผ ์„ค์ •", + "testStrategy": "์ž๋™ ๋ฐฐํฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธ, PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ ๋™์ž‘ ํ™•์ธ, ํ™˜๊ฒฝ๋ณ„๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€ ๊ฒ€์ฆ", + "priority": "low", + "dependencies": [ + 4 + ], + "status": "pending", + "subtasks": [] + }, + { + "id": 10, + "title": "๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™”", + "description": "Sentry๋ฅผ ์‚ฌ์šฉํ•œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์„ค์ •ํ•˜๊ณ  ์›นํŒฉ ๋ฒˆ๋“ค ๋ถ„์„์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.", + "details": "1. Sentry ์„ค์น˜ ๋ฐ ์„ค์ • (์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง, ์„ฑ๋Šฅ ์ถ”์ ) 2. Webpack Bundle Analyzer๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒˆ๋“ค ๋ถ„์„ 3. ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ (74๊ฐœ dependencies ์ •๋ฆฌ) 4. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ์œผ๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ตœ์ ํ™” 5. Tree shaking ์ตœ์ ํ™” 6. ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ํŠธ๋ž˜ํ‚น 7. ์„ฑ๋Šฅ ์ง€ํ‘œ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ", + "testStrategy": "Sentry์—์„œ ์—๋Ÿฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ง‘๋˜๋Š”์ง€ ํ™•์ธ, ๋ฒˆ๋“ค ํฌ๊ธฐ 30% ๊ฐ์†Œ ๋‹ฌ์„ฑ ํ™•์ธ, ์•ฑ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  ์ธก์ •", + "priority": "low", + "dependencies": [ + 8, + 9 + ], + "status": "pending", + "subtasks": [] + } + ], + "metadata": { + "created": "2025-07-11T21:00:35.577Z", + "updated": "2025-07-11T21:00:35.577Z", + "description": "Tasks for master context" + } + } +} \ No newline at end of file diff --git a/.taskmaster/templates/example_prd.txt b/.taskmaster/templates/example_prd.txt new file mode 100644 index 0000000..194114d --- /dev/null +++ b/.taskmaster/templates/example_prd.txt @@ -0,0 +1,47 @@ + +# Overview +[Provide a high-level overview of your product here. Explain what problem it solves, who it's for, and why it's valuable.] + +# Core Features +[List and describe the main features of your product. For each feature, include: +- What it does +- Why it's important +- How it works at a high level] + +# User Experience +[Describe the user journey and experience. Include: +- User personas +- Key user flows +- UI/UX considerations] + + +# Technical Architecture +[Outline the technical implementation details: +- System components +- Data models +- APIs and integrations +- Infrastructure requirements] + +# Development Roadmap +[Break down the development process into phases: +- MVP requirements +- Future enhancements +- Do not think about timelines whatsoever -- all that matters is scope and detailing exactly what needs to be build in each phase so it can later be cut up into tasks] + +# Logical Dependency Chain +[Define the logical order of development: +- Which features need to be built first (foundation) +- Getting as quickly as possible to something usable/visible front end that works +- Properly pacing and scoping each feature so it is atomic but can also be built upon and improved as development approaches] + +# Risks and Mitigations +[Identify potential risks and how they'll be addressed: +- Technical challenges +- Figuring out the MVP that we can build upon +- Resource constraints] + +# Appendix +[Include any additional information: +- Research findings +- Technical specifications] + \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..83f3f78 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,417 @@ +# Task Master AI - Claude Code Integration Guide + +## Essential Commands + +### Core Workflow Commands + +```bash +# Project Setup +task-master init # Initialize Task Master in current project +task-master parse-prd .taskmaster/docs/prd.txt # Generate tasks from PRD document +task-master models --setup # Configure AI models interactively + +# Daily Development Workflow +task-master list # Show all tasks with status +task-master next # Get next available task to work on +task-master show # View detailed task information (e.g., task-master show 1.2) +task-master set-status --id= --status=done # Mark task complete + +# Task Management +task-master add-task --prompt="description" --research # Add new task with AI assistance +task-master expand --id= --research --force # Break task into subtasks +task-master update-task --id= --prompt="changes" # Update specific task +task-master update --from= --prompt="changes" # Update multiple tasks from ID onwards +task-master update-subtask --id= --prompt="notes" # Add implementation notes to subtask + +# Analysis & Planning +task-master analyze-complexity --research # Analyze task complexity +task-master complexity-report # View complexity analysis +task-master expand --all --research # Expand all eligible tasks + +# Dependencies & Organization +task-master add-dependency --id= --depends-on= # Add task dependency +task-master move --from= --to= # Reorganize task hierarchy +task-master validate-dependencies # Check for dependency issues +task-master generate # Update task markdown files (usually auto-called) +``` + +## Key Files & Project Structure + +### Core Files + +- `.taskmaster/tasks/tasks.json` - Main task data file (auto-managed) +- `.taskmaster/config.json` - AI model configuration (use `task-master models` to modify) +- `.taskmaster/docs/prd.txt` - Product Requirements Document for parsing +- `.taskmaster/tasks/*.txt` - Individual task files (auto-generated from tasks.json) +- `.env` - API keys for CLI usage + +### Claude Code Integration Files + +- `CLAUDE.md` - Auto-loaded context for Claude Code (this file) +- `.claude/settings.json` - Claude Code tool allowlist and preferences +- `.claude/commands/` - Custom slash commands for repeated workflows +- `.mcp.json` - MCP server configuration (project-specific) + +### Directory Structure + +``` +project/ +โ”œโ”€โ”€ .taskmaster/ +โ”‚ โ”œโ”€โ”€ tasks/ # Task files directory +โ”‚ โ”‚ โ”œโ”€โ”€ tasks.json # Main task database +โ”‚ โ”‚ โ”œโ”€โ”€ task-1.md # Individual task files +โ”‚ โ”‚ โ””โ”€โ”€ task-2.md +โ”‚ โ”œโ”€โ”€ docs/ # Documentation directory +โ”‚ โ”‚ โ”œโ”€โ”€ prd.txt # Product requirements +โ”‚ โ”œโ”€โ”€ reports/ # Analysis reports directory +โ”‚ โ”‚ โ””โ”€โ”€ task-complexity-report.json +โ”‚ โ”œโ”€โ”€ templates/ # Template files +โ”‚ โ”‚ โ””โ”€โ”€ example_prd.txt # Example PRD template +โ”‚ โ””โ”€โ”€ config.json # AI models & settings +โ”œโ”€โ”€ .claude/ +โ”‚ โ”œโ”€โ”€ settings.json # Claude Code configuration +โ”‚ โ””โ”€โ”€ commands/ # Custom slash commands +โ”œโ”€โ”€ .env # API keys +โ”œโ”€โ”€ .mcp.json # MCP configuration +โ””โ”€โ”€ CLAUDE.md # This file - auto-loaded by Claude Code +``` + +## MCP Integration + +Task Master provides an MCP server that Claude Code can connect to. Configure in `.mcp.json`: + +```json +{ + "mcpServers": { + "task-master-ai": { + "command": "npx", + "args": ["-y", "--package=task-master-ai", "task-master-ai"], + "env": { + "ANTHROPIC_API_KEY": "your_key_here", + "PERPLEXITY_API_KEY": "your_key_here", + "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", + "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", + "XAI_API_KEY": "XAI_API_KEY_HERE", + "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", + "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", + "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", + "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE" + } + } + } +} +``` + +### Essential MCP Tools + +```javascript +help; // = shows available taskmaster commands +// Project setup +initialize_project; // = task-master init +parse_prd; // = task-master parse-prd + +// Daily workflow +get_tasks; // = task-master list +next_task; // = task-master next +get_task; // = task-master show +set_task_status; // = task-master set-status + +// Task management +add_task; // = task-master add-task +expand_task; // = task-master expand +update_task; // = task-master update-task +update_subtask; // = task-master update-subtask +update; // = task-master update + +// Analysis +analyze_project_complexity; // = task-master analyze-complexity +complexity_report; // = task-master complexity-report +``` + +## Claude Code Workflow Integration + +### Standard Development Workflow + +#### 1. Project Initialization + +```bash +# Initialize Task Master +task-master init + +# Create or obtain PRD, then parse it +task-master parse-prd .taskmaster/docs/prd.txt + +# Analyze complexity and expand tasks +task-master analyze-complexity --research +task-master expand --all --research +``` + +If tasks already exist, another PRD can be parsed (with new information only!) using parse-prd with --append flag. This will add the generated tasks to the existing list of tasks.. + +#### 2. Daily Development Loop + +```bash +# Start each session +task-master next # Find next available task +task-master show # Review task details + +# During implementation, check in code context into the tasks and subtasks +task-master update-subtask --id= --prompt="implementation notes..." + +# Complete tasks +task-master set-status --id= --status=done +``` + +#### 3. Multi-Claude Workflows + +For complex projects, use multiple Claude Code sessions: + +```bash +# Terminal 1: Main implementation +cd project && claude + +# Terminal 2: Testing and validation +cd project-test-worktree && claude + +# Terminal 3: Documentation updates +cd project-docs-worktree && claude +``` + +### Custom Slash Commands + +Create `.claude/commands/taskmaster-next.md`: + +```markdown +Find the next available Task Master task and show its details. + +Steps: + +1. Run `task-master next` to get the next task +2. If a task is available, run `task-master show ` for full details +3. Provide a summary of what needs to be implemented +4. Suggest the first implementation step +``` + +Create `.claude/commands/taskmaster-complete.md`: + +```markdown +Complete a Task Master task: $ARGUMENTS + +Steps: + +1. Review the current task with `task-master show $ARGUMENTS` +2. Verify all implementation is complete +3. Run any tests related to this task +4. Mark as complete: `task-master set-status --id=$ARGUMENTS --status=done` +5. Show the next available task with `task-master next` +``` + +## Tool Allowlist Recommendations + +Add to `.claude/settings.json`: + +```json +{ + "allowedTools": [ + "Edit", + "Bash(task-master *)", + "Bash(git commit:*)", + "Bash(git add:*)", + "Bash(npm run *)", + "mcp__task_master_ai__*" + ] +} +``` + +## Configuration & Setup + +### API Keys Required + +At least **one** of these API keys must be configured: + +- `ANTHROPIC_API_KEY` (Claude models) - **Recommended** +- `PERPLEXITY_API_KEY` (Research features) - **Highly recommended** +- `OPENAI_API_KEY` (GPT models) +- `GOOGLE_API_KEY` (Gemini models) +- `MISTRAL_API_KEY` (Mistral models) +- `OPENROUTER_API_KEY` (Multiple models) +- `XAI_API_KEY` (Grok models) + +An API key is required for any provider used across any of the 3 roles defined in the `models` command. + +### Model Configuration + +```bash +# Interactive setup (recommended) +task-master models --setup + +# Set specific models +task-master models --set-main claude-3-5-sonnet-20241022 +task-master models --set-research perplexity-llama-3.1-sonar-large-128k-online +task-master models --set-fallback gpt-4o-mini +``` + +## Task Structure & IDs + +### Task ID Format + +- Main tasks: `1`, `2`, `3`, etc. +- Subtasks: `1.1`, `1.2`, `2.1`, etc. +- Sub-subtasks: `1.1.1`, `1.1.2`, etc. + +### Task Status Values + +- `pending` - Ready to work on +- `in-progress` - Currently being worked on +- `done` - Completed and verified +- `deferred` - Postponed +- `cancelled` - No longer needed +- `blocked` - Waiting on external factors + +### Task Fields + +```json +{ + "id": "1.2", + "title": "Implement user authentication", + "description": "Set up JWT-based auth system", + "status": "pending", + "priority": "high", + "dependencies": ["1.1"], + "details": "Use bcrypt for hashing, JWT for tokens...", + "testStrategy": "Unit tests for auth functions, integration tests for login flow", + "subtasks": [] +} +``` + +## Claude Code Best Practices with Task Master + +### Context Management + +- Use `/clear` between different tasks to maintain focus +- This CLAUDE.md file is automatically loaded for context +- Use `task-master show ` to pull specific task context when needed + +### Iterative Implementation + +1. `task-master show ` - Understand requirements +2. Explore codebase and plan implementation +3. `task-master update-subtask --id= --prompt="detailed plan"` - Log plan +4. `task-master set-status --id= --status=in-progress` - Start work +5. Implement code following logged plan +6. `task-master update-subtask --id= --prompt="what worked/didn't work"` - Log progress +7. `task-master set-status --id= --status=done` - Complete task + +### Complex Workflows with Checklists + +For large migrations or multi-step processes: + +1. Create a markdown PRD file describing the new changes: `touch task-migration-checklist.md` (prds can be .txt or .md) +2. Use Taskmaster to parse the new prd with `task-master parse-prd --append` (also available in MCP) +3. Use Taskmaster to expand the newly generated tasks into subtasks. Consdier using `analyze-complexity` with the correct --to and --from IDs (the new ids) to identify the ideal subtask amounts for each task. Then expand them. +4. Work through items systematically, checking them off as completed +5. Use `task-master update-subtask` to log progress on each task/subtask and/or updating/researching them before/during implementation if getting stuck + +### Git Integration + +Task Master works well with `gh` CLI: + +```bash +# Create PR for completed task +gh pr create --title "Complete task 1.2: User authentication" --body "Implements JWT auth system as specified in task 1.2" + +# Reference task in commits +git commit -m "feat: implement JWT auth (task 1.2)" +``` + +### Parallel Development with Git Worktrees + +```bash +# Create worktrees for parallel task development +git worktree add ../project-auth feature/auth-system +git worktree add ../project-api feature/api-refactor + +# Run Claude Code in each worktree +cd ../project-auth && claude # Terminal 1: Auth work +cd ../project-api && claude # Terminal 2: API work +``` + +## Troubleshooting + +### AI Commands Failing + +```bash +# Check API keys are configured +cat .env # For CLI usage + +# Verify model configuration +task-master models + +# Test with different model +task-master models --set-fallback gpt-4o-mini +``` + +### MCP Connection Issues + +- Check `.mcp.json` configuration +- Verify Node.js installation +- Use `--mcp-debug` flag when starting Claude Code +- Use CLI as fallback if MCP unavailable + +### Task File Sync Issues + +```bash +# Regenerate task files from tasks.json +task-master generate + +# Fix dependency issues +task-master fix-dependencies +``` + +DO NOT RE-INITIALIZE. That will not do anything beyond re-adding the same Taskmaster core files. + +## Important Notes + +### AI-Powered Operations + +These commands make AI calls and may take up to a minute: + +- `parse_prd` / `task-master parse-prd` +- `analyze_project_complexity` / `task-master analyze-complexity` +- `expand_task` / `task-master expand` +- `expand_all` / `task-master expand --all` +- `add_task` / `task-master add-task` +- `update` / `task-master update` +- `update_task` / `task-master update-task` +- `update_subtask` / `task-master update-subtask` + +### File Management + +- Never manually edit `tasks.json` - use commands instead +- Never manually edit `.taskmaster/config.json` - use `task-master models` +- Task markdown files in `tasks/` are auto-generated +- Run `task-master generate` after manual changes to tasks.json + +### Claude Code Session Management + +- Use `/clear` frequently to maintain focused context +- Create custom slash commands for repeated Task Master workflows +- Configure tool allowlist to streamline permissions +- Use headless mode for automation: `claude -p "task-master next"` + +### Multi-Task Updates + +- Use `update --from=` to update multiple future tasks +- Use `update-task --id=` for single task updates +- Use `update-subtask --id=` for implementation logging + +### Research Mode + +- Add `--research` flag for research-based AI enhancement +- Requires a research model API key like Perplexity (`PERPLEXITY_API_KEY`) in environment +- Provides more informed task creation and updates +- Recommended for complex technical tasks + +--- + +_This guide ensures Claude Code has immediate access to Task Master's essential functionality for agentic development workflows._ diff --git a/PROJECT_IMPROVEMENT_PLAN.md b/PROJECT_IMPROVEMENT_PLAN.md new file mode 100644 index 0000000..fb37024 --- /dev/null +++ b/PROJECT_IMPROVEMENT_PLAN.md @@ -0,0 +1,327 @@ +# ์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ ํ”„๋กœ์ ํŠธ ๊ฐœ์„  ๊ณ„ํš + +## ๋ชฉ์ฐจ +1. [ํ”„๋กœ์ ํŠธ ํ˜„ํ™ฉ ๋ถ„์„](#ํ”„๋กœ์ ํŠธ-ํ˜„ํ™ฉ-๋ถ„์„) +2. [์ฃผ์š” ๊ฐœ์„ ์‚ฌํ•ญ](#์ฃผ์š”-๊ฐœ์„ ์‚ฌํ•ญ) +3. [๊ธฐ์ˆ  ์Šคํƒ ๊ฐœ์„  ๊ณ„ํš](#๊ธฐ์ˆ -์Šคํƒ-๊ฐœ์„ -๊ณ„ํš) +4. [์ธ์ฆ ์‹œ์Šคํ…œ ๊ฐœ์„ ](#์ธ์ฆ-์‹œ์Šคํ…œ-๊ฐœ์„ ) +5. [CI/CD ๋„์ž… ๊ณ„ํš](#cicd-๋„์ž…-๊ณ„ํš) +6. [ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋„๊ตฌ](#ํ”„๋กœ์ ํŠธ-๊ด€๋ฆฌ-๋„๊ตฌ) +7. [์‹คํ–‰ ๋กœ๋“œ๋งต](#์‹คํ–‰-๋กœ๋“œ๋งต) + +## ํ”„๋กœ์ ํŠธ ํ˜„ํ™ฉ ๋ถ„์„ + +### ํ”„๋กœ์ ํŠธ ๊ฐœ์š” +- **ํ”„๋กœ์ ํŠธ๋ช…**: ์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ (Zellyy Finance) +- **๋ชฉ์ **: ๊ฐœ์ธ ์žฌ๋ฌด/์˜ˆ์‚ฐ ๊ด€๋ฆฌ ๋ชจ๋ฐ”์ผ ์•ฑ +- **ํ”Œ๋žซํผ**: ์›น + iOS/Android (Capacitor) +- **ํ˜„์žฌ ์ƒํƒœ**: Supabase โ†’ Appwrite ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์™„๋ฃŒ + +### ํ˜„์žฌ ๊ธฐ์ˆ  ์Šคํƒ +``` +Frontend: React 18 + TypeScript + Vite +UI: Tailwind CSS + shadcn/ui (๋‰ด๋ชจํ”ฝ ๋””์ž์ธ) +์ƒํƒœ๊ด€๋ฆฌ: Context API +๋ฐฑ์—”๋“œ: Appwrite (self-hosted) +๋ชจ๋ฐ”์ผ: Capacitor +``` + +## ์ฃผ์š” ๊ฐœ์„ ์‚ฌํ•ญ + +### ๐Ÿ”ด ๊ธด๊ธ‰ ๊ฐœ์„  ํ•„์š” (๋ณด์•ˆ/์•ˆ์ •์„ฑ) + +#### 1. TypeScript ์„ค์ • ๊ฐ•ํ™” +```json +// tsconfig.json ์ˆ˜์ • ํ•„์š” +{ + "compilerOptions": { + "strict": true, + "strictNullChecks": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true + } +} +``` + +#### 2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ +- ํ˜„์žฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ „๋ฌด +- Vitest + React Testing Library ๋„์ž… ํ•„์š” +- ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋ถ€ํ„ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ + +#### 3. ๋ณด์•ˆ ์ทจ์•ฝ์  ํ•ด๊ฒฐ +- API ํ‚ค ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฌธ์ œ +- ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ๊ฐœ์„  ํ•„์š” + +### ๐ŸŸก ์ค‘์š” ๊ฐœ์„ ์‚ฌํ•ญ (์„ฑ๋Šฅ/ํ’ˆ์งˆ) + +#### 4. React ์„ฑ๋Šฅ ์ตœ์ ํ™” +- React.memo, useMemo, useCallback ํ™œ์šฉ ๋ถ€์กฑ +- ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€ ํ•„์š” +- ์„ธ์…˜ ์ฒดํฌ ์ฃผ๊ธฐ ์ตœ์ ํ™” (ํ˜„์žฌ 5์ดˆ โ†’ 30์ดˆ) + +#### 5. ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  +- console.log 81๊ฐœ ์ œ๊ฑฐ +- ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ • +- ESLint ๊ทœ์น™ ๊ฐ•ํ™” + +#### 6. ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™” +- 74๊ฐœ dependencies ์ •๋ฆฌ +- ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€ ์ œ๊ฑฐ +- ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ + +### ๐ŸŸข ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ ์‚ฌํ•ญ + +#### 7. UX ๊ฐœ์„  +- ์Šค์ผˆ๋ ˆํ†ค UI ํ™œ์šฉ๋„ ์ฆ๋Œ€ +- ์ ‘๊ทผ์„ฑ ๊ฐœ์„  (ARIA ๋ผ๋ฒจ, ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜) +- ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๊ฐœ์„  + +## ๊ธฐ์ˆ  ์Šคํƒ ๊ฐœ์„  ๊ณ„ํš + +### ์ƒํƒœ ๊ด€๋ฆฌ: Context API โ†’ Zustand + +**ํ˜„์žฌ (Context API)** +```typescript +const BudgetContext = createContext(); +// ๋ณต์žกํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ +``` + +**๊ฐœ์„  ํ›„ (Zustand)** +```typescript +const useBudgetStore = create((set) => ({ + budgets: [], + transactions: [], + addTransaction: (transaction) => set((state) => ({ + transactions: [...state.transactions, transaction] + })) +})); +``` + +### ๋ฐ์ดํ„ฐ ํŽ˜์นญ: ์ˆ˜๋™ โ†’ TanStack Query + +**ํ˜„์žฌ** +```typescript +useEffect(() => { + fetchTransactions().then(setTransactions); +}, []); +``` + +**๊ฐœ์„  ํ›„** +```typescript +const { data, isLoading, error } = useQuery({ + queryKey: ['transactions'], + queryFn: fetchTransactions, + staleTime: 5 * 60 * 1000, +}); +``` + +### ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Recharts โ†’ Chart.js +- ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ (300KB โ†’ 100KB) +- ๋ชจ๋ฐ”์ผ ์„ฑ๋Šฅ ํ–ฅ์ƒ + +### ์ถ”๊ฐ€ ๋„์ž… ํ•„์š” ๋„๊ตฌ +```json +{ + "devDependencies": { + "prettier": "^3.0.0", + "husky": "^8.0.0", + "lint-staged": "^13.0.0", + "@testing-library/react": "^14.0.0", + "vitest": "^1.0.0" + } +} +``` + +## ์ธ์ฆ ์‹œ์Šคํ…œ ๊ฐœ์„  + +### ํ˜„์žฌ: Appwrite Auth +- ๋ชจ๋“  ์ธ์ฆ ๋กœ์ง ์ง์ ‘ ๊ตฌํ˜„ +- ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋ณต์žก +- ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์–ด๋ ค์›€ + +### ๊ถŒ์žฅ: Clerk + Supabase ์กฐํ•ฉ + +#### Clerk (์ธ์ฆ ์ „๋ฌธ) +```typescript +import { useUser, SignIn } from '@clerk/clerk-react'; + +function App() { + const { user, isLoaded } = useUser(); + if (!user) return ; + return ; +} +``` + +**์žฅ์ :** +- ์นด์นด์˜ค/๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ +- 2FA, ์ƒ์ฒด์ธ์ฆ ๋‚ด์žฅ +- 10,000๋ช…๊นŒ์ง€ ๋ฌด๋ฃŒ +- ๋›ฐ์–ด๋‚œ UX/UI ์ปดํฌ๋„ŒํŠธ + +#### Supabase (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค) +```typescript +// Clerk JWT๋ฅผ Supabase์— ์ „๋‹ฌ +const supabase = createClient(url, key, { + global: { + headers: async () => { + const token = await getToken({ template: 'supabase' }); + return { Authorization: `Bearer ${token}` }; + }, + }, +}); +``` + +### ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ„ํš +1. Supabase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์Šคํ‚ค๋งˆ ์„ค์ • +2. Clerk ํ†ตํ•ฉ ๋ฐ JWT ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ +3. ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Appwrite โ†’ Supabase) +4. ์ ์ง„์  ๊ธฐ๋Šฅ ์ „ํ™˜ + +## CI/CD ๋„์ž… ๊ณ„ํš + +### GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ + +#### 1. ์ง€์†์  ํ†ตํ•ฉ (CI) +```yaml +# .github/workflows/ci.yml +name: CI + +on: + pull_request: + branches: [main, develop] + push: + branches: [main, develop] + +jobs: + lint-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18' + cache: 'npm' + - run: npm ci + - run: npm run lint + - run: npx tsc --noEmit + - run: npm test -- --coverage + - run: npm run build +``` + +#### 2. ์ž๋™ ๋ฐฐํฌ (CD) +```yaml +# .github/workflows/deploy.yml +name: Deploy + +on: + push: + branches: [main] + +jobs: + deploy-web: + runs-on: ubuntu-latest + steps: + # Vercel ์ž๋™ ๋ฐฐํฌ + - uses: amondnet/vercel-action@v25 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-args: '--prod' +``` + +### ๋ธŒ๋žœ์น˜ ์ „๋žต +``` +main โ†’ ํ”„๋กœ๋•์…˜ (์ž๋™ ๋ฐฐํฌ) +develop โ†’ ์Šคํ…Œ์ด์ง• (์ž๋™ ๋ฐฐํฌ) +feature/* โ†’ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ (PR ์ฒดํฌ๋งŒ) +``` + +### ์ถ”๊ฐ€ ํ†ตํ•ฉ +- SonarCloud: ์ฝ”๋“œ ํ’ˆ์งˆ ๋ถ„์„ +- Codecov: ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ถ”์  +- Sentry: ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง + +## ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋„๊ตฌ + +### ๊ถŒ์žฅ: Task Master AI + Linear ํ•˜์ด๋ธŒ๋ฆฌ๋“œ + +#### Task Master AI (์ด๋ฏธ ์„ค์ •๋จ) +```bash +# AI ๊ธฐ๋ฐ˜ ํƒœ์Šคํฌ ์ƒ์„ฑ +task-master parse-prd .taskmaster/docs/prd.txt --research + +# ๋‹ค์Œ ์ž‘์—… ํ™•์ธ +task-master next + +# ์ƒํƒœ ์—…๋ฐ์ดํŠธ +task-master set-status --id=1.2 --status=done +``` + +#### Linear (์„ ํƒ์  - ์‹œ๊ฐ์  ๊ด€๋ฆฌ) +- ๊ฐœ๋ฐœ์ž ์นœํ™”์  UI +- GitHub ์ž๋™ ํ†ตํ•ฉ +- ๋ฌด๋ฃŒ ํ‹ฐ์–ด ์ถฉ๋ถ„ + +### ์›Œํฌํ”Œ๋กœ์šฐ +1. Task Master๋กœ PRD ํŒŒ์‹ฑ โ†’ ํƒœ์Šคํฌ ์ž๋™ ์ƒ์„ฑ +2. Linear๋กœ ์‹œ๊ฐ์  ๊ด€๋ฆฌ (ํ•„์š”์‹œ) +3. GitHub PR๊ณผ ์ž๋™ ์—ฐ๊ฒฐ +4. ์ง„ํ–‰ ์ƒํ™ฉ ์ถ”์  + +## ์‹คํ–‰ ๋กœ๋“œ๋งต + +### Phase 1: ์ฆ‰์‹œ ์‹œ์ž‘ (1์ฃผ์ผ) +- [ ] TypeScript strict ๋ชจ๋“œ ์ ์ง„์  ํ™œ์„ฑํ™” +- [ ] console.log ์ œ๊ฑฐ ๋ฐ ๋นŒ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ • +- [ ] ESLint + Prettier ์„ค์ • +- [ ] GitHub Actions CI ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• +- [ ] ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ ๊ฐ•ํ™” + +### Phase 2: ํ•ต์‹ฌ ๊ฐœ์„  (2-3์ฃผ) +- [ ] Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +- [ ] TanStack Query ๋„์ž… +- [ ] ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž‘์„ฑ +- [ ] React ์„ฑ๋Šฅ ์ตœ์ ํ™” (๋ฉ”๋ชจ์ด์ œ์ด์…˜) +- [ ] Vercel ์ž๋™ ๋ฐฐํฌ ์„ค์ • + +### Phase 3: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ (1๊ฐœ์›”) +- [ ] Clerk ์ธ์ฆ ์‹œ์Šคํ…œ ๋„์ž… +- [ ] Supabase ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +- [ ] Chart.js๋กœ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ต์ฒด +- [ ] PWA ๊ธฐ๋Šฅ ์ถ”๊ฐ€ +- [ ] ์ ‘๊ทผ์„ฑ ๊ฐœ์„  + +### Phase 4: ์ตœ์ ํ™” (2๊ฐœ์›”) +- [ ] ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™” +- [ ] ๋ชจ๋ฐ”์ผ ๋นŒ๋“œ ์ž๋™ํ™” +- [ ] ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง (Sentry) ๊ตฌ์ถ• +- [ ] ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„์ž… + +## ์˜ˆ์ƒ ํšจ๊ณผ + +### ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ +- ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ์œผ๋กœ ๋ฒ„๊ทธ ๊ฐ์†Œ +- CI/CD๋กœ ๋ฐฐํฌ ์‹œ๊ฐ„ 90% ๋‹จ์ถ• +- ํƒ€์ž… ์•ˆ์ „์„ฑ์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐฉ์ง€ + +### ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ +- ์„ฑ๋Šฅ ๊ฐœ์„ ์œผ๋กœ ์•ฑ ์†๋„ 2๋ฐฐ ํ–ฅ์ƒ +- ์นด์นด์˜ค/๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์œผ๋กœ ๊ฐ€์ž…๋ฅ  ์ฆ๊ฐ€ +- ์•ˆ์ •์„ฑ ํ–ฅ์ƒ์œผ๋กœ ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ๊ฐœ์„  + +### ์œ ์ง€๋ณด์ˆ˜์„ฑ +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๋ฆฌํŒฉํ† ๋ง ์•ˆ์ „์„ฑ ํ™•๋ณด +- ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ๋ฌธ์ œ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ +- ๋ฌธ์„œํ™”๋กœ ํ–ฅํ›„ ๊ฐœ๋ฐœ ์šฉ์ด + +## ์ฐธ๊ณ  ์ž๋ฃŒ + +- [Zustand ๊ณต์‹ ๋ฌธ์„œ](https://github.com/pmndrs/zustand) +- [TanStack Query ๊ณต์‹ ๋ฌธ์„œ](https://tanstack.com/query) +- [Clerk ๊ณต์‹ ๋ฌธ์„œ](https://clerk.com/docs) +- [GitHub Actions ๊ฐ€์ด๋“œ](https://docs.github.com/en/actions) +- [Task Master AI](https://github.com/cline/task-master-ai) + +--- + +*์ด ๋ฌธ์„œ๋Š” ์ ค๋ฆฌ์˜ ์ ์žํƒˆ์ถœ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ ์  ๊ฐœ์„ ์„ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ ๊ณ„ํš์„œ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋Š” ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.* \ No newline at end of file