feat: add Copilot instructions for Ionian project, detailing architecture, workflows, and conventions

This commit is contained in:
monoid 2025-10-01 02:01:49 +09:00
parent fa72aca9f4
commit 251718d014

118
.github/copilot-instructions.md vendored Normal file
View file

@ -0,0 +1,118 @@
# 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
- `dbtype` package 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 in `src/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.ts` re-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:
- `DiffManager` orchestrates multiple content watchers
- `ContentDiffHandler` processes filesystem changes
- Watchers register via `await diffManager.register(type, watcher)`
- Content changes queue in waiting lists before manual commit
## Development Workflows
### Build Commands
```bash
# 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
```bash
cd packages/server && pnpm run migrate
```
Migrations live in `migrations/YYYY-MM-DD.ts` with manual version tracking.
### Testing
```bash
cd packages/server && pnpm test # Vitest unit tests
cd packages/server && pnpm test:watch # Watch mode
```
## Key Conventions
### Import Patterns
- Server: Use `.ts` extensions in imports (`./module.ts`)
- Client: Use `@/` alias for `src/` 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
1. Create watcher in `src/diff/watcher/`
2. Register in `create_server()`
3. Add route handler in `src/route/`
4. Update `dbtype` if new fields needed
### Adding New API Endpoint
1. Create route in appropriate `src/route/*.ts` file
2. Add to main router in `src/server.ts`
3. Define types in `dbtype` package if needed
4. Create client hook in `packages/client/src/hook/`
### UI Component Development
1. Use shadcn/ui patterns in `src/components/ui/`
2. Use Jotai atoms for component state sharing
3. Follow existing page structure patterns