Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
f8ed510
docs: add React dashboard template design
ydj515 Jul 1, 2026
986f321
docs: add React dashboard template plan
ydj515 Jul 1, 2026
fb0eabb
chore: modernize React project tooling
ydj515 Jul 1, 2026
cc271de
fix: make tooling config self-contained
ydj515 Jul 1, 2026
19f1628
chore: clean generated tooling artifacts
ydj515 Jul 1, 2026
b0e71dc
chore: expand local artifact ignores
ydj515 Jul 1, 2026
84e3672
chore: stabilize React tooling setup
ydj515 Jul 2, 2026
26c3f67
test: add shared test utilities
ydj515 Jul 2, 2026
aaf0052
feat: add project domain model
ydj515 Jul 2, 2026
a3a99f5
feat: add MSW project API
ydj515 Jul 2, 2026
469c590
feat: add shared UI primitives
ydj515 Jul 2, 2026
824ea27
feat: add UI state store
ydj515 Jul 2, 2026
0c55d45
feat: add dashboard app shell
ydj515 Jul 2, 2026
e994972
feat: add project dashboard flow
ydj515 Jul 2, 2026
29369cd
feat: add dashboard and settings pages
ydj515 Jul 2, 2026
186a342
docs: document React dashboard template
ydj515 Jul 2, 2026
c756e09
feat: refine React dashboard template
ydj515 Jul 2, 2026
58e5039
feat: refine React dashboard template
ydj515 Jul 2, 2026
61dd867
chore: resolve settings merge conflict
ydj515 Jul 2, 2026
1182737
fix: address PR review feedback
ydj515 Jul 2, 2026
b07e398
Merge pull request #1 from ydj515/feat/react-dashboard-template
ydj515 Jul 3, 2026
9f31db6
feat: add storybook
ydj515 Jul 3, 2026
7ed8726
ci: add GitHub Actions workflow for validate and storybook build
ydj515 Jul 4, 2026
74acd68
chore: add lefthook git hooks for pre-commit format/lint and pre-push…
ydj515 Jul 4, 2026
c64b30f
feat: add route error boundary with fallback error page
ydj515 Jul 4, 2026
1d989fe
feat: add zod-validated typed environment config
ydj515 Jul 4, 2026
7eb3942
test: add coverage thresholds and exclude non-tested files
ydj515 Jul 4, 2026
8b5d4ca
test: add storybook play-function interaction tests
ydj515 Jul 4, 2026
edc22d8
test: add playwright e2e tests with ci job
ydj515 Jul 4, 2026
e603c69
ci: add github pages workflow to deploy storybook
ydj515 Jul 4, 2026
5b6080c
docs: add contributing guide, dependabot, and issue/pr templates
ydj515 Jul 4, 2026
881ab19
docs: update readme for storybook, e2e, env, and ci additions
ydj515 Jul 4, 2026
8e88cd7
chore: 파일 위치 변경
ydj515 Jul 4, 2026
0fa3093
chore: improve storybook config with vitefinal, density toggle, and c…
ydj515 Jul 4, 2026
4e1a134
ci: cache playwright browsers to speed up e2e job
ydj515 Jul 4, 2026
e21f98a
fix: bump vulnerable transitive deps (rollup, esbuild, flatted, babel…
ydj515 Jul 4, 2026
2b67c50
chore: update vite to 8.1.3 (latest patch)
ydj515 Jul 4, 2026
ba1ea4c
chore(deps): bump actions/setup-node from 4 to 6 (#2)
dependabot[bot] Jul 4, 2026
cbae789
chore(deps): bump actions/cache from 4 to 6 (#3)
dependabot[bot] Jul 4, 2026
5706356
chore(deps): bump actions/upload-artifact from 4 to 7 (#4)
dependabot[bot] Jul 4, 2026
3da7726
chore(deps): bump actions/configure-pages from 5 to 6 (#5)
dependabot[bot] Jul 4, 2026
c6cb443
chore(deps): bump @tanstack/react-router (#7)
dependabot[bot] Jul 4, 2026
4f5f2ae
chore(deps): bump lucide-react from 1.22.0 to 1.23.0 (#9)
dependabot[bot] Jul 4, 2026
097eab4
chore(deps): bump actions/upload-pages-artifact from 3 to 5 (#6)
dependabot[bot] Jul 4, 2026
1128044
chore(deps-dev): bump the dev-dependencies group across 1 directory w…
dependabot[bot] Jul 4, 2026
926bacb
ci: bump checkout, pnpm-action-setup, deploy-pages to node 24 versions
ydj515 Jul 4, 2026
d556f77
fix: override yaml to patched 2.8.3 to resolve audit vulnerability
ydj515 Jul 4, 2026
ac6a18d
ci: add pnpm audit job with summary report and artifact
ydj515 Jul 4, 2026
2316493
chore: prune orphaned yaml and dedupe pnpm lockfile
ydj515 Jul 4, 2026
ca2d9d2
perf: enable route-based code splitting via tanstack router autoCodeS…
ydj515 Jul 4, 2026
70ec518
feat: add toast notifications and wire project creation feedback
ydj515 Jul 4, 2026
3eab9b9
feat: add authentication guard with protected routes and login flow
ydj515 Jul 4, 2026
0506b88
docs: document auth flow, toast notifications, and code splitting
ydj515 Jul 4, 2026
9814fb4
test: add storybook stories for feature components, layouts, and pages
ydj515 Jul 5, 2026
17bc3bd
ci: auto-enable github pages via configure-pages enablement
ydj515 Jul 5, 2026
45d7d60
chore(deps-dev): bump storybook in the storybook group
dependabot[bot] Jul 11, 2026
a10f9e2
chore(deps): bump @radix-ui/react-dialog from 1.1.18 to 1.1.19
dependabot[bot] Jul 11, 2026
923d2c0
chore(deps): bump lucide-react from 1.23.0 to 1.24.0
dependabot[bot] Jul 11, 2026
ec6792b
chore(deps): bump react-hook-form from 7.80.0 to 7.81.0
dependabot[bot] Jul 15, 2026
ad4b848
chore(deps): bump msw from 2.14.6 to 2.15.0
dependabot[bot] Jul 15, 2026
e15770e
chore(deps-dev): bump the dev-dependencies group across 1 directory w…
dependabot[bot] Jul 15, 2026
391e661
chore(deps-dev): bump the dev-dependencies group with 17 updates
dependabot[bot] Jul 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# 이 파일을 복사해 `.env.local`을 만들어 로컬 값으로 덮어쓴다.
# cp .env.example .env.local

# API 서버 base URL (기본값: http://localhost:3000)
VITE_API_BASE_URL=http://localhost:3000

# MSW 목 API 사용 여부 ("true" | "false", 기본값: true)
VITE_ENABLE_MOCKS=true
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: 버그 리포트
description: 버그를 신고합니다.
labels: ["bug"]
body:
- type: textarea
id: description
attributes:
label: 버그 설명
description: 무엇이 잘못되었는지 설명해 주세요.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: 재현 방법
description: 재현 단계를 순서대로 적어 주세요.
placeholder: |
1. ...
2. ...
3. ...
validations:
required: true
- type: textarea
id: expected
attributes:
label: 기대 동작
validations:
required: true
- type: textarea
id: environment
attributes:
label: 환경
description: OS, 브라우저, Node/pnpm 버전 등
validations:
required: false
23 changes: 23 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: 기능 제안
description: 새로운 기능이나 개선을 제안합니다.
labels: ["enhancement"]
body:
- type: textarea
id: problem
attributes:
label: 해결하려는 문제
description: 어떤 불편함이나 필요에서 출발했는지 설명해 주세요.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: 제안 내용
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: 고려한 대안
validations:
required: false
29 changes: 29 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 10
groups:
# 관련 패키지를 묶어 PR 수를 줄인다.
react:
patterns:
- "react"
- "react-dom"
- "@types/react"
- "@types/react-dom"
tanstack:
patterns:
- "@tanstack/*"
storybook:
patterns:
- "storybook"
- "@storybook/*"
dev-dependencies:
dependency-type: development

- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
22 changes: 22 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## 변경 요약

<!-- 무엇을, 왜 바꿨는지 간단히 설명합니다. -->

## 변경 유형

- [ ] 기능 추가 (feat)
- [ ] 버그 수정 (fix)
- [ ] 리팩터링 (refactor)
- [ ] 문서 (docs)
- [ ] 테스트 (test)
- [ ] 기타 (chore/ci)

## 체크리스트

- [ ] `pnpm validate` 통과 (typecheck, lint, format, test, build)
- [ ] 필요한 경우 테스트를 추가/수정했습니다
- [ ] UI 변경 시 Storybook 스토리를 추가/갱신했습니다

## 관련 이슈

<!-- 예: Closes #123 -->
109 changes: 109 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: CI

on:
push:
branches: [main]
pull_request:

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
name: Validate (typecheck, lint, format, test, build)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm validate

storybook:
name: Build Storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm build-storybook

e2e:
name: E2E (Playwright)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Resolve Playwright version
id: playwright
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"
- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v6
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.playwright.outputs.version }}
# 캐시 미스: 브라우저 + 시스템 의존성 모두 설치
- name: Install Playwright browsers and system deps
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: pnpm exec playwright install --with-deps chromium
# 캐시 히트: 브라우저는 복원됐으므로 시스템 의존성만 설치(빠름)
- name: Install Playwright system deps
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: pnpm exec playwright install-deps chromium
- run: pnpm test:e2e
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
name: playwright-report
path: playwright-report/
retention-days: 7

audit:
name: Security audit (pnpm)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm
- run: pnpm install --frozen-lockfile
# 전체 취약점을 Actions 실행 요약(Summary)에 표로 남긴다.
- name: Audit report to job summary
if: always()
run: |
{
echo "## pnpm audit report"
echo ""
echo '```'
pnpm audit || true
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
# JSON 리포트를 아티팩트로 보관한다.
- name: Save audit JSON report
if: always()
run: pnpm audit --json > pnpm-audit.json || true
- uses: actions/upload-artifact@v7
if: always()
with:
name: pnpm-audit-report
path: pnpm-audit.json
retention-days: 7
# high/critical 취약점이 있을 때만 실패시킨다(moderate/low는 리포트만).
- name: Fail on high or critical vulnerabilities
run: pnpm audit --audit-level high
42 changes: 42 additions & 0 deletions .github/workflows/deploy-storybook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Deploy Storybook

on:
push:
branches: [main]
workflow_dispatch:

# GitHub Pages 배포에 필요한 최소 권한.
permissions:
contents: read
pages: write
id-token: write

concurrency:
group: storybook-pages
cancel-in-progress: true

jobs:
deploy:
name: Build and deploy to GitHub Pages
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm build-storybook
- uses: actions/configure-pages@v6
with:
# Pages가 아직 켜져 있지 않으면 워크플로가 Source=GitHub Actions로 자동 활성화한다.
enablement: true
- uses: actions/upload-pages-artifact@v5
with:
path: storybook-static
- id: deployment
uses: actions/deploy-pages@v5
28 changes: 28 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,34 @@ dist
dist-ssr
*.local

# Environment files
.env
.env.*
!.env.example

# Package manager caches
.pnpm-store/
.npm/
.yarn/

# Local agent artifacts
.superpowers/
.worktrees/

# Test and build output
coverage/
.vite/
.vitest/
.cache/
.turbo/
playwright-report/
test-results/
*.tsbuildinfo

# Storybook
storybook-static/
*.storybook.log

# Editor directories and files
.vscode/*
!.vscode/extensions.json
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20.11.0
24.13.0
16 changes: 16 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
node_modules/
dist/
dist-ssr/
coverage/
.superpowers/
docs/superpowers/
.worktrees/
.vite/
.vitest/
.cache/
.turbo/
playwright-report/
test-results/
pnpm-lock.yaml
public/mockServiceWorker.js
src/routeTree.gen.ts
15 changes: 9 additions & 6 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
{
"editor.formatOnSave": true,
"prettier.semi": true,
"prettier.javascriptEnable": ["javascript", "javascriptreact"],
"prettier.printWidth": 2,
"prettier.useTabs": false,
"prettier.tabWidth": 4,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"trailingComma": "all",
"bracketSpacing": true,
"arrowParens": "always",
"endOfLine": "lf",
"plugins": ["prettier-plugin-tailwindcss"]
}
33 changes: 33 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
// 스토리는 컴포넌트와 같은 위치(co-location)에 두어 유지보수를 쉽게 한다.
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(ts|tsx)"],
addons: [
"@storybook/addon-docs", // autodocs 문서 자동 생성
"@storybook/addon-a11y", // 접근성 검사
"@storybook/addon-themes", // 라이트/다크 테마 토글
],
framework: {
name: "@storybook/react-vite",
options: {},
},
viteFinal(viteConfig) {
// 앱 전용 TanStack Router 플러그인(라우트 생성/HMR)은 Storybook에 불필요하다.
// 세 플러그인 모두 "tanstack" 접두사를 쓰므로 이름으로 걸러 빌드 부하를 줄인다.
const isTanstackRouterPlugin = (plugin: unknown): boolean =>
typeof plugin === "object" &&
plugin !== null &&
"name" in plugin &&
typeof (plugin as { name: unknown }).name === "string" &&
(plugin as { name: string }).name.includes("tanstack");

viteConfig.plugins = (viteConfig.plugins ?? [])
.flat(Infinity)
.filter((plugin) => !isTanstackRouterPlugin(plugin));

return viteConfig;
},
};

export default config;
Loading
Loading