4.4 KiB
4.4 KiB
Copilot Instructions for Ionian
Project Overview
Ionian is a full-stack content file management system focused on comic/media files. It's a pnpm monorepo with 3 packages: server (Elysia.js API), client (React+Vite SPA), and dbtype (shared TypeScript types).
Architecture & Key Patterns
Monorepo Structure
- Uses pnpm workspaces with
packages/*configuration dbtypepackage provides shared types between client/server- Server builds to
dist/directory which client proxies to via Vite dev server
Server Architecture (Elysia.js + SQLite)
- Framework: Elysia.js with TypeScript, uses Kysely for type-safe SQL queries
- Database: SQLite with custom migration system in
migrations/directory - Core Pattern: Document-centric with content types (
comic,video, etc.) - File Watching:
DiffManager+ content watchers monitor filesystem changes insrc/diff/ - Permissions: Role-based system in
src/permission/permission.ts - Routes: Organized by domain (
/api/doc/*,/api/user/*,/api/diff/*)
Client Architecture (React + State Management)
- Router: Uses
wouter(not React Router) for client-side routing - State: Jotai atoms for global state (
src/lib/atom.tsre-exports jotai) - API: SWR for data fetching with custom hooks in
src/hook/ - UI: shadcn/ui components with Tailwind CSS, dark mode support
- Build Info: Vite injects git hash/build time via
__BUILD_*__constants
Critical File Watching System
The diff system monitors content directories:
DiffManagerorchestrates multiple content watchersContentDiffHandlerprocesses filesystem changes- Watchers register via
await diffManager.register(type, watcher) - Content changes queue in waiting lists before manual commit
Development Workflows
Build Commands
# Full deployment build (run from root)
pnpm run app:build # Builds both client and server
# Individual package builds
pnpm run compile # Server build
pnpm run build # Client build (from packages/client)
# Development
cd packages/server && pnpm run dev # tsx watch mode
cd packages/client && pnpm run dev # Vite dev server
Database Migrations
cd packages/server && pnpm run migrate
Migrations live in migrations/YYYY-MM-DD.ts with manual version tracking.
Testing
cd packages/server && pnpm test # Vitest unit tests
cd packages/server && pnpm test:watch # Watch mode
Key Conventions
Import Patterns
- Server: Use
.tsextensions in imports (./module.ts) - Client: Use
@/alias forsrc/directory - Cross-package imports:
import { Type } from "dbtype/mod.ts"
API Design
- RESTful routes under
/api/prefix - Elysia schema validation with
t.Object()patterns - Permission decorators:
beforeHandle: createPermissionCheck(Permission.QueryContent) - Error handling via
sendError()helper and global error handler
Component Patterns
- Page components in
src/page/directory - Reusable components in
src/components/with ui/ subdirectory - Custom hooks in
src/hook/for API operations - State atoms in
src/lib/atom.ts
Database Patterns
- Models in
src/model/define interfaces - Controllers in
src/db/implement database operations - Use Kysely query builder, not raw SQL
- Document-centric design with tag relationships
Project-Specific Context
Content Types
System supports multiple content types (comic, video) with extensible architecture. Comic content has special thumbnail/page rendering support.
Permission System
Three-tier permissions: Admin, User, Guest. Check src/permission/permission.ts for available permissions.
Client-Server Communication
- Client proxies
/api/*to server during development - Production serves client from server's static middleware
- Authentication via HTTP-only cookies with JWT refresh pattern
Common Tasks
Adding New Content Type
- Create watcher in
src/diff/watcher/ - Register in
create_server() - Add route handler in
src/route/ - Update
dbtypeif new fields needed
Adding New API Endpoint
- Create route in appropriate
src/route/*.tsfile - Add to main router in
src/server.ts - Define types in
dbtypepackage if needed - Create client hook in
packages/client/src/hook/
UI Component Development
- Use shadcn/ui patterns in
src/components/ui/ - Use Jotai atoms for component state sharing
- Follow existing page structure patterns