Files
cog-socket/CLAUDE.md
2025-07-17 14:29:55 +02:00

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 Compose
  • npm run db:push - Push schema changes to database
  • npm run db:migrate - Run database migrations
  • npm run db:studio - Open Drizzle Studio for database management

Development Server

  • npm run dev - Start development server
  • npm run build - Build for production
  • npm run preview - Preview production build

Multiplayer Server

  • npm run multiplayer:dev - Start multiplayer server in watch mode
  • npm 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 Vitest
  • npm run test:e2e - Run end-to-end tests with Playwright
  • npm run check - Run svelte-check for TypeScript checking
  • npm 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: true flag in database
  • Room capacity determined by maxParticipants field
  • 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