feat: add Copilot instructions for Ionian project, detailing architecture, workflows, and conventions
This commit is contained in:
parent
fa72aca9f4
commit
251718d014
1 changed files with 118 additions and 0 deletions
118
.github/copilot-instructions.md
vendored
Normal file
118
.github/copilot-instructions.md
vendored
Normal 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
|
Loading…
Add table
Reference in a new issue