-
Notifications
You must be signed in to change notification settings - Fork 0
Development
- Node 20+, npm 10+ (workspaces nativos)
- TypeScript 5.7 strict everywhere
- Vite 6 (client) + tsc (server, shared)
- Vitest 4 (server + shared tests)
- Socket.io 4 (server ↔ client)
- Zustand 5 (client state)
- React 18 (client)
- rpg-prop-kit (CRT visuals)
- vite-plugin-pwa (display PWA)
npm run dev # server (tsx watch) + client (vite) em paralelo
npm run build # shared → client → server (ordem importa)
npm run build:shared # só recompila shared/ (usado em iteração)
npm start # node server/dist/index.js
npm test # vitest run (server + shared)
npm run test:watch # vitest watchHistórico importante: shared/ usa exports apontados pra dist/ (NodeNext). Em produção, node server/dist/index.js precisa do JS compilado de shared. Em dev, tsx lê TS direto.
# Pipeline do build raiz:
npm run build -w @gmcr/shared # tsc → shared/dist/{index.js, index.d.ts}
npm run build -w @gmcr/client # vite build → client/dist/
npm run build -w @gmcr/server # tsc → server/dist/Vitest alias resolve @gmcr/shared pra shared/src/index.ts durante testes — não precisa de build prévio pra rodar npm test.
Cada workspace tem seu próprio package.json. Cross-deps por "@gmcr/shared": "*".
-
Imports: tipo apenas via
import type(preserva tree-shaking, evita runtime). - Componentes: funcionais, com hooks. Sem class components.
-
CSS:
index.cssglobal (BEM-ish). Sem CSS-in-JS. -
Strict TS:
noUncheckedIndexedAccessligado em alguns pacotes; sempre verifiquearray[i]antes de usar. -
Eventos socket: tipados nos dois lados via
shared/.
- Adicionar campo em
SessionState(shared/). - Adicionar evento
ClientToServerEventsse for interativo. - Handler em
session.ts(sanitize + apply + broadcast). - Persistir em
persist.tsse sobrevive ao restart. - Spelhar no
store.ts(client). - Componente UI consumindo via
useSession.
Não precisa tocar shared/server. Só adicionar componente em client/src/features/ e plugar no Control.tsx ou Display.tsx.
npm test # tudo
npm test -- shared # só shared
npm test -- server/src/spotify # só spotify
npm test -- --watch # watch modeTargets atuais: parser de dados, gating de tratamento, tools (tracker), validate, spotify auth + api.
O painel do mestre (Control) usa react-grid-layout pra deixar os cards
arrastáveis e minimizáveis (layout persiste global no servidor, .layout.json).
npm run dev (Vite/:5173). O React.StrictMode
faz double-mount em dev, o que desconecta os listeners do react-draggable — o
cursor vira mãozinha mas o card não move. É só artefato de desenvolvimento.
Pra testar/usar o arraste, rode o build de produção (que é como o GM Control Room roda self-hosted):
npm run build && npm start # serve client/dist + socket na :4000Abra http://localhost:4000/control. Minimizar, resetar e persistência funcionam
em ambos os modos; só o drag depende do build. Se um dia o arraste no dev for
necessário, remover o <StrictMode> de client/src/main.tsx.
GitHub Actions .github/workflows/ci.yml:
- Checkout gm-control-room + gmcr-srd-systems (dual checkout — file: deps).
- Build SRD packages (
@lippelt/srd-coreprimeiro). npm cinpm testnpm run build
Roda em PRs e push pra main.
-
main— sempre verde, deploy-ready. -
feat/*oufix/*— features/fixes, PR pra main. -
local/*— branches só locais (NÃO PUSH) pra integrações com repos privados. Veja RPG Systems.
Setup
Conteúdo
Ferramentas
- Combat Tracker
- Creature Library
- Encounter Library
- Clocks
- Party Resources
- Random Tables
- Dice and Roll History
- GM Notes
- RPG Systems
Display
Arquitetura