Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4a22b9f
chore(week1): bootstrap project plan, workflow docs, and task scaffol…
peterabcd May 31, 2026
ccb2c5b
docs(wiki): drop .md suffix from wiki cross-links
peterabcd May 31, 2026
df63d20
docs: realign Week 1 deliverables to new stack and host/participant m…
peterabcd Jun 3, 2026
c26427b
docs(retro): add explicit '다르게 한다면' section for Week 2 habit changes
peterabcd Jun 3, 2026
dbb5812
feat(scaffold): Next.js 15 + Tailwind + shadcn + Docker/Caddy bootstr…
peterabcd Jun 3, 2026
68ba15b
feat(db): Prisma 6 + SQLite schema with init migration (#24)
peterabcd Jun 3, 2026
ffafc44
feat(auth): Auth.js v5 Google OAuth (@snu.ac.kr) + approval whitelist…
peterabcd Jun 3, 2026
d932953
feat(sessions): host creates session, participant adds own row, auto …
peterabcd Jun 4, 2026
aa5096e
feat(uploads): session group photo upload (local volume, original pre…
peterabcd Jun 4, 2026
ddde5c5
fix(sessions): empty-form noop + drop encType + Session.id → autoincr…
peterabcd Jun 4, 2026
2d5e201
fix(forms): inline validation alerts + double-submit prevention (#29)
peterabcd Jun 4, 2026
bc7e8b1
feat(sessions): archive list /sessions with cursor pagination (#30)
peterabcd Jun 4, 2026
55a56de
chore(week2): photo/admin form retrofit + CI + Deploy + retro (#31)
peterabcd Jun 5, 2026
5621c04
fix: repair deploy image build (#32)
peterabcd Jun 6, 2026
852f5ea
fix: include prisma runtime dependencies (#33)
peterabcd Jun 7, 2026
45c3f75
chore: week2 audit (#34)
peterabcd Jun 7, 2026
63869cf
chore(deploy): N100 prod-only, dev push builds image only (#36)
peterabcd Jun 7, 2026
91a9c05
feat(meta): OG image + PWA manifest (#37)
peterabcd Jun 7, 2026
3e9d24a
feat(sessions): location/member/month/participant-count filter with U…
peterabcd Jun 7, 2026
30f6cc9
feat(members): /me and /runners/[id] stats + SVG pace chart (#39)
peterabcd Jun 7, 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
22 changes: 22 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
node_modules
.next
out
.git
.gitignore
.env
.env.*
!.env.example
*.log
.DS_Store
README.md
docs
.gjc
.github
scripts
deploy/.env
deploy/.env.*
!deploy/.env.example
.vscode
.idea
coverage
*.tsbuildinfo
34 changes: 34 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# ---------------------------------------------------------------------------
# 뮤런 환경변수 템플릿. cp .env.example .env.local 후 채워 넣기.
# 실제 값은 절대 commit 금지. .env.local 은 .gitignore 됨.
# ---------------------------------------------------------------------------

# --- App ---
# 외부 노출 URL. layout.tsx 의 metadataBase 가 이걸 쓴다 (OG/사이트맵 절대 URL).
# 비워두면 Next 가 요청 host 로 fallback — 로컬 개발에선 그래도 OK.
NEXT_PUBLIC_APP_URL=http://localhost:3000

# --- Database (SQLite) ---
DATABASE_URL=file:./data/murun.db

# --- Auth.js v5 ---
# NEXTAUTH_URL 은 base URL. dev=localhost:3000, prod=https://murun.duckdns.org
AUTH_URL=http://localhost:3000
# 생성: openssl rand -base64 32
AUTH_SECRET=

# 신뢰 host (Auth.js v5는 비공개 IP/도메인 사용 시 명시 필요)
AUTH_TRUST_HOST=true

# --- Google OAuth ---
# Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client ID
# Authorized redirect URI: http://localhost:3000/api/auth/callback/google
# (배포 후엔 https://<도메인>/api/auth/callback/google 도 추가)
AUTH_GOOGLE_ID=
AUTH_GOOGLE_SECRET=
# 이메일 도메인 강제. snu.ac.kr 이외는 reject.
AUTH_GOOGLE_HD=snu.ac.kr

# --- Uploads (단체사진 저장 디렉터리) ---
# 로컬: ./uploads — 컨테이너: /app/uploads (compose volume 에 마운트됨)
UPLOADS_DIR=./uploads
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* text=auto eol=lf
*.sh text eol=lf
*.md text eol=lf
19 changes: 19 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
name: Bug
about: 버그 리포트
title: "[bug] "
labels: ["type:bug"]
---

## 증상

## 재현
1. ...
2. ...

## 기대

## 환경
- 브라우저 / OS:
- URL:
- 로그 (있다면):
30 changes: 30 additions & 0 deletions .github/ISSUE_TEMPLATE/feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
name: Feature
about: 새 기능 (vertical slice 1개 = issue 1개)
title: "[feat] "
labels: ["type:feat"]
---

## User story

> ... 으로서 ... 하기 위해 ... 하고 싶다.

## Acceptance

- [ ] ...
- [ ] ...
- [ ] 모바일 375px 정상
- [ ] `pnpm typecheck` / `pnpm lint` / `pnpm build` 통과

## Out of scope

- ...

## Spec / 참고

- `.gjc/specs/<feature>.md` (작성 후 링크)
- 관련 wiki: `docs/wiki/...`

## Notes

(있다면)
15 changes: 15 additions & 0 deletions .github/ISSUE_TEMPLATE/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Task / Chore
about: feature가 아닌 설정·문서·리팩터링·인프라
title: "[chore] "
labels: ["type:chore"]
---

## What
(한 줄)

## Why
(한 줄)

## Done when
- [ ] ...
38 changes: 38 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## Summary

Closes #

<!-- 변경 요약 5줄 이내 -->
-

## Screenshots

| Mobile (375px) | Desktop |
|---|---|
| | |

## Checklist (사람이 직접 본다 — `docs/wiki/06-Checkpoints.md`)

### 공통
- [ ] diff 처음부터 끝까지 읽음
- [ ] `pnpm typecheck` / `pnpm lint` / `pnpm build` 통과
- [ ] preview deploy URL에서 시나리오 1회 실행
- [ ] 새 env / dep 있다면 `.env.example`·README 업데이트

### UI 변경 시
- [ ] 모바일 375px 가로 스크롤 없음
- [ ] 빈/로딩/에러 상태 처리
- [ ] 콘솔 error/warning 0

### 데이터 쓰기 시
- [ ] Server Action 첫 줄에 인증·권한 체크
- [ ] zod 스키마 통과
- [ ] 중복 생성 차단 (DB unique 또는 트랜잭션)

### Schema/Migration 시
- [ ] migration 이름 의미 있음
- [ ] 데이터 손실 변경이면 PR 본문에 명시

## Notes

(있다면)
82 changes: 82 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: CI

on:
pull_request:
branches: [dev, main]
push:
branches: [dev, main]

# 같은 PR 에 빠르게 여러 push 가 와도 마지막 것만 실행
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
name: typecheck + lint + build
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node 22
uses: actions/setup-node@v4
with:
node-version: "22"

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 11.5.1
run_install: false

- name: Resolve pnpm store path
id: pnpm-cache
run: echo "STORE_PATH=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"

- name: Cache pnpm store
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: pnpm-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: |
pnpm-${{ runner.os }}-

- name: Cache Next.js build
uses: actions/cache@v4
with:
path: |
${{ github.workspace }}/.next/cache
key: next-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('**/*.ts', '**/*.tsx') }}
restore-keys: |
next-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-

- name: Install dependencies
# frozen-lockfile 로 의존 정확성 강제 (lockfile mismatch 면 fail)
run: pnpm install --frozen-lockfile

# postinstall 이 prisma generate 를 이미 돌리지만, hoisted layout 에서
# 한 번 더 명시적으로 (CI 캐시 hit 시점 안전)
- name: Prisma generate
run: pnpm db:generate

- name: Typecheck
run: pnpm typecheck

- name: Lint
run: pnpm lint

- name: Build
run: pnpm build
env:
# build 단계에 일부 env 필요 — Auth.js / DB url 은 dummy 로 충분
DATABASE_URL: file:./data/ci-stub.db
AUTH_URL: http://localhost:3000
AUTH_SECRET: ci-stub-secret-ci-stub-secret-ci-stub-secret
AUTH_TRUST_HOST: "true"
AUTH_GOOGLE_ID: ci-stub
AUTH_GOOGLE_SECRET: ci-stub
AUTH_GOOGLE_HD: snu.ac.kr
NEXT_PUBLIC_APP_URL: http://localhost:3000
Loading
Loading