EJClaw 19c163f4d2 시간 제한 없음은 정말 무제한, 대기실 설정은 바꾸면 바로 적용, 모르는 사람 기다리기(빠른 시작·공개 방) 제거
- 오목에서 [시간 제한 없음]을 골라도 30초가 흐르던 문제: 대기실 설정이 [설정 저장]을 눌러야
  서버에 반영되어, 누르지 않고 [게임 시작]하면 기본값(한 수 30초)으로 시작했다. 이제 설정은
  바꾸는 즉시 서버에 보낸다(저장 버튼 없음, 휴대폰 시트는 [닫기]만). 빠르게 여러 번 눌러도
  먼저 온 방 정보가 새 값을 되돌리지 않게 lib/option-sync.ts로 맞춘다.
- 시간 제한 없음(오목·체스·장기·오델로·바둑·쿼리도): 무응답 한도(idleLimitSec, 5~10분 뒤 시간패)와
  그 카운트다운을 없앴다. 체스는 첫 수 제한도 피셔일 때만. 연결이 끊긴 사람의 접속 유예는 그대로.
- 홈의 [지금 열린 방] 탭, 게임 소개의 [아무나와 빠른 시작]·기다리는 방 목록, 대기실의 방 공개
  설정을 뺐다(방은 모두 친구만). 서버 API는 남겨 두고 화면에서만 부르지 않는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:42:46 +09:00

같이 놀자 보드게임

광고 없이 가볍고, 링크 하나로 친구·가족과 바로 즐기는 온라인 보드게임 사이트. 계획서는 docs/에 있고, 구현은 계획서를 따른다.

운영 중: https://game.tkrmagid.kr

게임 (26개)

종류 게임
2인 수 싸움 오목, 오셀로, 체스(체스960 포함), 장기, 바둑, 쿼리도(2·4명)
카드·화투 원카드, 섯다, 포커, 고스톱, 달무티, 구십구, 바퀴벌레 포커, 뱅!
타일·주사위 루미큐브, 다빈치 코드, 마작, 요트 다이스, 윷놀이, 라스베가스, 부루마불, 스플렌더
순발력·대화 할리갈리, 도블, 그림 맞히기, 마피아

칩·포인트·지폐는 모두 놀이용이다(실제 돈과 무관).

주요 기능

  • 로그인: 디스코드 또는 게스트(닉네임만). 게스트는 로그아웃하거나 하루 동안 접속하지 않으면 계정이 지워진다.
  • 방: 방 링크를 보내면 친구가 바로 들어온다. 방 막대에서 링크 복사·채팅·규칙·설정(글자 크기·소리)·나가기를 한 번에 누른다. 게임 중에 나가면 기권으로 처리된다.
  • 컴퓨터 상대: 실시간·대화 게임(할리갈리, 도블, 그림 맞히기, 마피아)을 뺀 22개 게임.
  • 처음 하는 사람을 위한 30초 규칙 요약, 게임별 규칙 페이지, 끝난 판 다시 보기, 이름을 누르면 나오는 기록 카드.
  • 홈 화면에 추가(PWA), 휴대폰(320px부터)·PC, 다크 모드.
  • 관리자 화면(/admin): 게임 규칙 기본값·잠금, 사용자·방 관리, 계정별 기록.

개발

bun install
bun run --filter '@bg/server' dev      # 서버 :3000
bun run --filter '@bg/web' dev         # 웹 :5173 (API/WS는 :3000으로 프록시)

브라우저에서 http://localhost:5173 을 연다. 디스코드 값이 없으면 게스트 로그인만 보인다.

확인

bun run typecheck
bun run test                      # 바뀐 부분 테스트만 (origin/main 이후 + 커밋 안 한 변경, 없으면 마지막 커밋 기준)
                                  #   예: 체스만 고쳤으면 체스 테스트만, 문서만 고쳤으면 없음. -- --dry-run 으로 고른 것만 보기
bun run test:all                  # 전체 테스트 (4개 병렬, 무작위 대국은 시드 1/10만, 1분 안쪽)
bun run test:full                 # 배포 전 전체: 무작위 대국 시드 전부(1,000개 등), 순차 실행이라 10분쯤
(cd apps/web && bunx vite build)  # 웹 빌드
bun e2e/omok.e2e.ts               # 브라우저 두 개로 오목 한 판 (Chrome 필요)
bun e2e/admin.e2e.ts              # 관리자: 슈퍼어드민 로그인 → 규칙 변경·잠금 → 새 방 반영
bun e2e/games.e2e.ts [게임id...]   # 게임별: 방 만들기 → 친구 입장 → 실제 화면 조작으로 여러 턴(일부는 끝까지)
bun e2e/a11y.e2e.ts               # 접근성(axe) 검사
bun e2e/pwa.e2e.ts                # PWA: 매니페스트·아이콘, 서비스 워커, 오프라인 안내, 홈 화면에 추가
bun e2e/bots.e2e.ts               # 컴퓨터 상대, 방 나가기, 게스트 로그아웃
bun e2e/replay.e2e.ts             # 다시 보기
bun e2e/tutorial.e2e.ts           # 처음 하는 사람용 규칙 요약
bun scripts/loadtest.ts --help    # 부하·장애 주입 (docs/reports 참고)

배포

deploy/.env.example을 deploy/.env로 복사해 값을 채운 뒤:

cd deploy && docker compose up -d --build

이미 HTTPS 리버스 프록시가 있는 서버(지금 운영 중인 .5 + NPMplus)에서는 docker compose -f docker-compose.proxy.yml up -d --build로 앱만 띄운다. 운영 서버 업데이트는 main에 푸시한 뒤 서버에서:

git pull && cd deploy && docker compose -f docker-compose.proxy.yml up -d --build
curl -fsS http://localhost:2970/healthz

자세한 절차는 docs/11-deployment-ops.md.

관리자

/admin. 슈퍼어드민은 서버의 deploy/.env에 있는 환경 변수 SUPERADMIN_DISCORD_IDS의 디스코드 ID(저장소에는 넣지 않음), 어드민은 관리자 화면에서 디스코드 ID로 추가한다. 자세한 내용은 docs/14-admin.md.

구조

  • packages/engine — 게임 공통 타입, 시드 난수, 테스트 도구
  • packages/shared — 프로토콜, 닉네임·방 코드 규칙, 게임 목록 (/lite는 브라우저용)
  • packages/games/<id> — 게임 규칙(순수 함수)
  • apps/server — Bun 서버(HTTP API, WebSocket, 방 관리, SQLite)
  • apps/web — React 웹
Description
No description provided
Readme 4.9 MiB
Languages
TypeScript 99.3%
CSS 0.5%