3.6 KiB
3.6 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
cog-socket is a platform for hosting jsPsych and Pavlovia experiments with multiplayer support using WebSockets. Built with SvelteKit, it supports both single-player and multiplayer psychological experiments.
Development Commands
Database
npm run db:start- Start PostgreSQL server via Docker Composenpm run db:push- Push schema changes to databasenpm run db:migrate- Run database migrationsnpm run db:studio- Open Drizzle Studio for database management
Development Server
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production build
Multiplayer Server
npm run multiplayer:dev- Start multiplayer server in watch modenpm run multiplayer:start- Start multiplayer server in production mode
Testing & Quality
npm run test- Run all tests (unit + e2e)npm run test:unit- Run unit tests with Vitestnpm run test:e2e- Run end-to-end tests with Playwrightnpm run check- Run svelte-check for TypeScript checkingnpm run lint- Run linting (Prettier + ESLint)npm run format- Format code with Prettier
Architecture Overview
Database Schema (DrizzleORM + PostgreSQL)
- Users: Authentication with Lucia, supports admin/user roles
- Experiments: jsPsych or PsychoJS experiments with multiplayer flag
- Sessions: User authentication sessions
- ExperimentSessions: Individual experiment runs with status tracking
Multiplayer System (Colyseus)
- Standalone server: Runs on separate port (8080) from main app
- ExperimentRoom: Manages participant queuing, state synchronization
- Session management: Handles participant connections, disconnections, and queuing
- Real-time communication: WebSocket-based experiment state sharing
SvelteKit Structure
- Routes:
/experiment/[id]- Single experiment management/public/multiplayer/run/[experimentId]- Multiplayer experiment runner/public/run/[experimentId]- Single-player experiment runner/api/experiments/[experimentId]- Experiment API endpoints
- Authentication: Lucia-based session management with cookies
- File handling: S3 integration for experiment assets
Key Components
- ExperimentRoom.ts: Core multiplayer room logic with participant management
- ExperimentRoomState.ts: Colyseus schema for synchronized state
- colyseusServer.ts: Multiplayer server setup and room management
- sessionManager.ts: Bridges SvelteKit app with Colyseus server
Development Notes
Multiplayer Development
- Multiplayer server runs independently on port 8080
- Experiments must have
multiplayer: trueflag in database - Room capacity determined by
maxParticipantsfield - Queue system handles overflow participants
Authentication
- Default admin user (admin/admin) created in development
- Session tokens stored in cookies, managed by Lucia
- Authentication middleware in
hooks.server.ts
Database Operations
- Use DrizzleORM for all database operations
- Schema defined in
src/lib/server/db/schema.ts - Migrations managed through drizzle-kit
File Structure
- UI components in
src/lib/components/ui/(bits-ui based) - Server logic in
src/lib/server/ - Route handlers follow SvelteKit conventions
- Multiplayer code isolated in
src/lib/server/multiplayer/
Testing Setup
- Unit tests: Vitest with Svelte browser testing
- E2E tests: Playwright
- TypeScript checking: svelte-check
- Linting: ESLint + Prettier with Svelte plugins