mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-02-13 20:15:46 +01:00
- Fix syntax errors in skills markdown files (.github/skills, .opencode/skills) - Change typescript to tsx for code blocks with JSX - Replace ellipsis (...) in array examples with valid syntax - Separate CSS from TypeScript into distinct code blocks - Convert JavaScript object examples to valid JSON in docs - Fix enum definitions with proper comma separation
221 lines
7.8 KiB
Markdown
221 lines
7.8 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Development Commands
|
|
|
|
**Core Development:**
|
|
|
|
- `pnpm dev` - Start development server (runs custom server.ts with schedulers)
|
|
- `pnpm dev:next-only` - Start Next.js only with Turbopack (no schedulers)
|
|
- `pnpm build` - Build production application
|
|
- `pnpm start` - Run production server
|
|
|
|
**Code Quality:**
|
|
|
|
- `pnpm lint` - Run ESLint
|
|
- `pnpm lint:fix` - Fix ESLint issues automatically
|
|
- `pnpm format` - Format code with Prettier
|
|
- `pnpm format:check` - Check formatting without fixing
|
|
|
|
**Database:**
|
|
|
|
- `pnpm prisma:generate` - Generate Prisma client
|
|
- `pnpm prisma:migrate` - Run database migrations
|
|
- `pnpm prisma:push` - Push schema changes to database
|
|
- `pnpm prisma:push:force` - Force reset database and push schema
|
|
- `pnpm prisma:seed` - Seed database with initial data
|
|
- `pnpm prisma:studio` - Open Prisma Studio database viewer
|
|
|
|
**Testing:**
|
|
|
|
- `pnpm test` - Run both Vitest and Playwright tests concurrently
|
|
- `pnpm test:vitest` - Run Vitest tests only
|
|
- `pnpm test:vitest:watch` - Run Vitest in watch mode
|
|
- `pnpm test:vitest:coverage` - Run Vitest with coverage report
|
|
- `pnpm test:coverage` - Run all tests with coverage
|
|
|
|
**Markdown:**
|
|
|
|
- `pnpm lint:md` - Lint Markdown files
|
|
- `pnpm lint:md:fix` - Fix Markdown linting issues
|
|
|
|
## Architecture Overview
|
|
|
|
**LiveDash-Node** is a real-time analytics dashboard for monitoring user sessions with AI-powered analysis and processing pipeline.
|
|
|
|
### Tech Stack
|
|
|
|
- **Frontend:** Next.js 16 + React 19 + TailwindCSS 4
|
|
- **Backend:** Next.js API Routes + Custom Node.js server
|
|
- **Database:** PostgreSQL (Neon) with Prisma ORM
|
|
- **Authentication:** Neon Auth (Better Auth) - unified for all routes
|
|
- **AI Processing:** OpenAI API integration
|
|
- **Visualization:** D3.js, React Leaflet, Recharts
|
|
- **Scheduling:** Node-cron for background processing
|
|
|
|
### Key Architecture Components
|
|
|
|
**1. Multi-Stage Processing Pipeline**
|
|
The system processes user sessions through distinct stages tracked in `SessionProcessingStatus`:
|
|
|
|
- `CSV_IMPORT` - Import raw CSV data into `SessionImport`
|
|
- `TRANSCRIPT_FETCH` - Fetch transcript content from URLs
|
|
- `SESSION_CREATION` - Create normalized `Session` and `Message` records
|
|
- `AI_ANALYSIS` - AI processing for sentiment, categorization, summaries
|
|
- `QUESTION_EXTRACTION` - Extract questions from conversations
|
|
|
|
**2. Database Architecture**
|
|
|
|
- **Multi-tenant design** with `Company` as root entity
|
|
- **Dual storage pattern**: Raw CSV data in `SessionImport`, processed data in `Session`
|
|
- **1-to-1 relationship** between `SessionImport` and `Session` via `importId`
|
|
- **Message parsing** into individual `Message` records with order tracking
|
|
- **AI cost tracking** via `AIProcessingRequest` with detailed token usage
|
|
- **Flexible AI model management** through `AIModel`, `AIModelPricing`, and `CompanyAIModel`
|
|
|
|
**3. Custom Server Architecture**
|
|
|
|
- `server.ts` - Custom Next.js server with configurable scheduler initialization
|
|
- Three main schedulers: CSV import, import processing, and session processing
|
|
- Environment-based configuration via `lib/env.ts`
|
|
|
|
**4. Key Processing Libraries**
|
|
|
|
- `lib/scheduler.ts` - CSV import scheduling
|
|
- `lib/importProcessor.ts` - Raw data to Session conversion
|
|
- `lib/processingScheduler.ts` - AI analysis pipeline
|
|
- `lib/transcriptFetcher.ts` - External transcript fetching
|
|
- `lib/transcriptParser.ts` - Message parsing from transcripts
|
|
|
|
### Development Environment
|
|
|
|
**Environment Configuration:**
|
|
Environment variables are managed through `lib/env.ts` with .env.local file support:
|
|
|
|
- Database: PostgreSQL via `DATABASE_URL` and `DATABASE_URL_DIRECT`
|
|
- Authentication: `NEON_AUTH_BASE_URL`, `AUTH_URL`, `JWKS_URL`
|
|
- AI Processing: `OPENAI_API_KEY`
|
|
- Schedulers: `SCHEDULER_ENABLED`, various interval configurations
|
|
|
|
**Key Files to Understand:**
|
|
|
|
- `prisma/schema.prisma` - Complete database schema with enums and relationships
|
|
- `server.ts` - Custom server entry point
|
|
- `lib/env.ts` - Environment variable management and validation
|
|
- `app/` - Next.js App Router structure
|
|
|
|
**Testing:**
|
|
|
|
- Uses Vitest for unit testing
|
|
- Playwright for E2E testing
|
|
- Test files in `tests/` directory
|
|
|
|
### Important Notes
|
|
|
|
**Scheduler System:**
|
|
|
|
- Schedulers are optional and controlled by `SCHEDULER_ENABLED` environment variable
|
|
- Use `pnpm dev:next-only` to run without schedulers for pure frontend development
|
|
- Three separate schedulers handle different pipeline stages:
|
|
- CSV Import Scheduler (`lib/scheduler.ts`)
|
|
- Import Processing Scheduler (`lib/importProcessor.ts`)
|
|
- Session Processing Scheduler (`lib/processingScheduler.ts`)
|
|
|
|
**Database Migrations:**
|
|
|
|
- Always run `pnpm prisma:generate` after schema changes
|
|
- Use `pnpm prisma:migrate` for production-ready migrations
|
|
- Use `pnpm prisma:push` for development schema changes
|
|
- Database uses PostgreSQL with Prisma's driver adapter for connection pooling
|
|
|
|
**AI Processing:**
|
|
|
|
- All AI requests are tracked for cost analysis
|
|
- Support for multiple AI models per company
|
|
- Time-based pricing management for accurate cost calculation
|
|
- Processing stages can be retried on failure with retry count tracking
|
|
|
|
**Code Quality Standards:**
|
|
|
|
- Run `pnpm lint` and `pnpm format:check` before committing
|
|
- TypeScript with ES modules (type: "module" in package.json)
|
|
- React 19 with Next.js 16 App Router
|
|
- TailwindCSS 4 for styling
|
|
|
|
### Authentication Architecture
|
|
|
|
**Unified Neon Auth (Better Auth):**
|
|
|
|
All authentication uses Neon Auth with role-based access control via `UserRole` enum:
|
|
|
|
- **Platform roles** (companyId = null): `PLATFORM_SUPER_ADMIN`, `PLATFORM_ADMIN`, `PLATFORM_SUPPORT`
|
|
- **Company roles** (companyId set): `ADMIN`, `USER`
|
|
|
|
**Key Files:**
|
|
|
|
- `lib/auth/client.ts` - Client-side auth with `authClient.useSession()` hook
|
|
- `lib/auth/server.ts` - Server-side helpers:
|
|
- `neonAuth()` - Get current session/user
|
|
- `getAuthenticatedUser()` - Get any authenticated user
|
|
- `getAuthenticatedCompanyUser()` - Get company users only
|
|
- `getAuthenticatedPlatformUser()` - Get platform users only
|
|
- `isPlatformRole()`, `hasPlatformAccess()` - Role checking utilities
|
|
- `app/api/auth/[...path]/route.ts` - Neon Auth API handler
|
|
- `app/api/auth/me/route.ts` - Returns current user data from User table
|
|
|
|
**Auth Routes:**
|
|
|
|
- `/auth/sign-in`, `/auth/sign-up`, `/auth/sign-out` - Auth pages
|
|
- `/account/settings`, `/account/security` - Account management
|
|
- `/platform/login` - Platform admin login (uses same Neon Auth)
|
|
|
|
**User Data Flow:**
|
|
|
|
- Neon Auth manages authentication (sessions, JWT)
|
|
- Prisma `User` table stores `companyId` and `role` for authorization
|
|
- Users with `companyId = null` are platform users
|
|
- Users with `companyId` set are company users
|
|
- `/api/auth/me` endpoint returns full user data including role
|
|
|
|
**Key Auth Patterns:**
|
|
|
|
```tsx
|
|
// Client Component
|
|
import { authClient } from "@/lib/auth/client";
|
|
const { data, isPending } = authClient.useSession();
|
|
|
|
// Server/API Route - General auth
|
|
import { neonAuth } from "@/lib/auth/server";
|
|
const { session, user } = await neonAuth();
|
|
|
|
// Server/API Route - Company user only
|
|
import { getAuthenticatedCompanyUser } from "@/lib/auth/server";
|
|
const { user, company } = await getAuthenticatedCompanyUser();
|
|
|
|
// Server/API Route - Platform user only
|
|
import { getAuthenticatedPlatformUser, hasPlatformAccess } from "@/lib/auth/server";
|
|
const { user } = await getAuthenticatedPlatformUser();
|
|
if (!hasPlatformAccess(user.role, "PLATFORM_ADMIN")) {
|
|
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
|
|
}
|
|
```
|
|
|
|
**User Creation (Passwordless in DB):**
|
|
|
|
Users are created without passwords in our database. Neon Auth handles password storage:
|
|
|
|
```tsx
|
|
await prisma.user.create({
|
|
data: {
|
|
email,
|
|
name,
|
|
role: "ADMIN",
|
|
companyId: company.id,
|
|
invitedBy: currentUser.email,
|
|
invitedAt: new Date(),
|
|
},
|
|
});
|
|
// User completes signup via /auth/sign-up with same email
|
|
```
|