chore: init
This commit is contained in:
BIN
.cursor/.DS_Store
vendored
Normal file
BIN
.cursor/.DS_Store
vendored
Normal file
Binary file not shown.
32
.cursor/rules/api-routes.mdc
Normal file
32
.cursor/rules/api-routes.mdc
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
globs: app/api/**/*.ts
|
||||||
|
---
|
||||||
|
|
||||||
|
# API Routes Rules
|
||||||
|
|
||||||
|
1. Routes MUST only use services for data access
|
||||||
|
2. Routes MUST handle input validation
|
||||||
|
3. Routes MUST return typed responses
|
||||||
|
4. Routes MUST use proper error handling
|
||||||
|
|
||||||
|
Example of correct API route:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { MyService } from "@/services/my-service";
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
try {
|
||||||
|
const service = new MyService(pool);
|
||||||
|
const data = await service.getData();
|
||||||
|
return Response.json(data);
|
||||||
|
} catch (error) {
|
||||||
|
return Response.error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ FORBIDDEN:
|
||||||
|
|
||||||
|
- Direct database queries
|
||||||
|
- Business logic implementation
|
||||||
|
- Untyped responses
|
||||||
31
.cursor/rules/clients.mdc
Normal file
31
.cursor/rules/clients.mdc
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
globs: clients/**/*.ts
|
||||||
|
---
|
||||||
|
|
||||||
|
# HTTP Clients Rules
|
||||||
|
|
||||||
|
1. All HTTP calls MUST be in clients/domains/
|
||||||
|
2. Each domain MUST have its own client
|
||||||
|
3. Clients MUST use the base HTTP client
|
||||||
|
4. Clients MUST type their responses
|
||||||
|
|
||||||
|
Example of correct client:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { HttpClient } from "@/clients/base/http-client";
|
||||||
|
import { MyData } from "@/lib/types";
|
||||||
|
|
||||||
|
export class MyClient {
|
||||||
|
constructor(private httpClient: HttpClient) {}
|
||||||
|
|
||||||
|
async getData(): Promise<MyData[]> {
|
||||||
|
return this.httpClient.get("/api/data");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ FORBIDDEN:
|
||||||
|
|
||||||
|
- Direct fetch calls
|
||||||
|
- Business logic in clients
|
||||||
|
- Untyped responses
|
||||||
28
.cursor/rules/components.mdc
Normal file
28
.cursor/rules/components.mdc
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
globs: components/**/*.tsx
|
||||||
|
---
|
||||||
|
|
||||||
|
# Components Rules
|
||||||
|
|
||||||
|
1. UI components MUST be in components/ui/
|
||||||
|
2. Feature components MUST be in their feature folder
|
||||||
|
3. Components MUST use clients for data fetching
|
||||||
|
4. Components MUST be properly typed
|
||||||
|
|
||||||
|
Example of correct component:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { useMyClient } from '@/hooks/use-my-client';
|
||||||
|
|
||||||
|
export const MyComponent = () => {
|
||||||
|
const { data } = useMyClient();
|
||||||
|
return <div>{data.map(item => <Item key={item.id} {...item} />)}</div>;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ FORBIDDEN:
|
||||||
|
|
||||||
|
- Direct service usage
|
||||||
|
- Direct database queries
|
||||||
|
- Direct fetch calls
|
||||||
|
- Untyped props
|
||||||
30
.cursor/rules/project-structure.mdc
Normal file
30
.cursor/rules/project-structure.mdc
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Project Structure Rules
|
||||||
|
|
||||||
|
1. Backend:
|
||||||
|
- [services/](mdc:services/) - ALL database access
|
||||||
|
- [app/api/](mdc:app/api/) - API routes using services
|
||||||
|
|
||||||
|
2. Frontend:
|
||||||
|
- [clients/](mdc:clients/) - HTTP clients
|
||||||
|
- [components/](mdc:components/) - React components
|
||||||
|
- [hooks/](mdc:hooks/) - React hooks
|
||||||
|
|
||||||
|
3. Shared:
|
||||||
|
- [lib/](mdc:lib/) - Types and utilities
|
||||||
|
- [scripts/](mdc:scripts/) - Utility scripts
|
||||||
|
|
||||||
|
Key Files:
|
||||||
|
|
||||||
|
- [services/database.ts](mdc:services/database.ts) - Database pool
|
||||||
|
- [clients/base/http-client.ts](mdc:clients/base/http-client.ts) - Base HTTP client
|
||||||
|
- [lib/types.ts](mdc:lib/types.ts) - Shared types
|
||||||
|
|
||||||
|
❌ FORBIDDEN:
|
||||||
|
|
||||||
|
- Database access outside services/
|
||||||
|
- HTTP calls outside clients/
|
||||||
|
- Business logic in components/
|
||||||
42
.cursor/rules/services.mdc
Normal file
42
.cursor/rules/services.mdc
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
globs: services/*.ts
|
||||||
|
---
|
||||||
|
|
||||||
|
# Services Rules
|
||||||
|
|
||||||
|
1. Services MUST contain ALL PostgreSQL queries
|
||||||
|
2. Services are the ONLY layer allowed to communicate with the database
|
||||||
|
3. Each service MUST:
|
||||||
|
- Use the pool from [services/database.ts](mdc:services/database.ts)
|
||||||
|
- Implement proper transaction management
|
||||||
|
- Handle errors and logging
|
||||||
|
- Validate data before insertion
|
||||||
|
- Have a clear interface
|
||||||
|
|
||||||
|
Example of correct service implementation:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export class MyService {
|
||||||
|
constructor(private pool: Pool) {}
|
||||||
|
|
||||||
|
async myMethod(): Promise<Result> {
|
||||||
|
const client = await this.pool.connect();
|
||||||
|
try {
|
||||||
|
await client.query("BEGIN");
|
||||||
|
// ... queries
|
||||||
|
await client.query("COMMIT");
|
||||||
|
} catch (error) {
|
||||||
|
await client.query("ROLLBACK");
|
||||||
|
throw error;
|
||||||
|
} finally {
|
||||||
|
client.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ FORBIDDEN:
|
||||||
|
|
||||||
|
- Direct database queries outside services
|
||||||
|
- Raw SQL in API routes
|
||||||
|
- Database logic in components
|
||||||
129
TODO.md
Normal file
129
TODO.md
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
# TowerControl - Plan de développement
|
||||||
|
|
||||||
|
## Phase 1: Setup initial et architecture backend (Priorité 1)
|
||||||
|
|
||||||
|
### 1.1 Configuration projet Next.js
|
||||||
|
- [ ] Initialiser Next.js avec TypeScript
|
||||||
|
- [ ] Configurer ESLint, Prettier
|
||||||
|
- [ ] Setup structure de dossiers selon les règles du workspace
|
||||||
|
- [ ] Configurer base de données (SQLite local pour commencer)
|
||||||
|
- [ ] Setup Prisma ORM
|
||||||
|
|
||||||
|
### 1.2 Architecture backend - Services de base
|
||||||
|
- [ ] Créer `services/database.ts` - Pool de connexion DB
|
||||||
|
- [ ] Créer `services/reminders.ts` - Service pour récupérer les rappels macOS
|
||||||
|
- [ ] Créer `lib/types.ts` - Types partagés (Task, Tag, Project, etc.)
|
||||||
|
- [ ] Créer `services/task-processor.ts` - Logique métier des tâches
|
||||||
|
|
||||||
|
### 1.3 Intégration Rappels macOS (Focus principal Phase 1)
|
||||||
|
- [ ] Rechercher comment accéder aux rappels macOS en local (SQLite, AppleScript, ou API)
|
||||||
|
- [ ] Créer script d'extraction des rappels depuis la DB locale macOS
|
||||||
|
- [ ] Parser les tags et catégories des rappels
|
||||||
|
- [ ] Mapper les données vers le modèle interne
|
||||||
|
- [ ] Créer service de synchronisation périodique
|
||||||
|
|
||||||
|
### 1.4 API Routes de base
|
||||||
|
- [ ] `app/api/tasks/route.ts` - CRUD tâches
|
||||||
|
- [ ] `app/api/tasks/sync/route.ts` - Synchronisation rappels
|
||||||
|
- [ ] `app/api/tags/route.ts` - Gestion des tags
|
||||||
|
- [ ] Middleware d'authentification basique (si nécessaire)
|
||||||
|
|
||||||
|
## Phase 2: Interface utilisateur Kanban (Priorité 2)
|
||||||
|
|
||||||
|
### 2.1 Composants de base
|
||||||
|
- [ ] `components/kanban/Board.tsx` - Tableau Kanban principal
|
||||||
|
- [ ] `components/kanban/Column.tsx` - Colonnes du Kanban
|
||||||
|
- [ ] `components/kanban/TaskCard.tsx` - Cartes de tâches
|
||||||
|
- [ ] `components/ui/` - Composants UI réutilisables
|
||||||
|
|
||||||
|
### 2.2 Clients HTTP
|
||||||
|
- [ ] `clients/tasks-client.ts` - Client pour les tâches
|
||||||
|
- [ ] `clients/base/http-client.ts` - Client HTTP de base
|
||||||
|
- [ ] Gestion des erreurs et loading states
|
||||||
|
|
||||||
|
### 2.3 Hooks React
|
||||||
|
- [ ] `hooks/useTasks.ts` - Hook pour la gestion des tâches
|
||||||
|
- [ ] `hooks/useKanban.ts` - Hook pour la logique Kanban (drag & drop)
|
||||||
|
- [ ] `hooks/useSync.ts` - Hook pour la synchronisation
|
||||||
|
|
||||||
|
### 2.4 Interface Kanban
|
||||||
|
- [ ] Affichage des tâches par statut/tag
|
||||||
|
- [ ] Drag & drop entre colonnes
|
||||||
|
- [ ] Filtrage par tags/projets
|
||||||
|
- [ ] Recherche dans les tâches
|
||||||
|
|
||||||
|
## Phase 3: Intégration Jira (Priorité 3)
|
||||||
|
|
||||||
|
### 3.1 Services Jira
|
||||||
|
- [ ] `services/jira-client.ts` - Client Jira API
|
||||||
|
- [ ] `services/jira-sync.ts` - Synchronisation des tâches Jira
|
||||||
|
- [ ] Gestion multi-projets Jira
|
||||||
|
- [ ] Mapping des statuts Jira vers Kanban interne
|
||||||
|
|
||||||
|
### 3.2 API Routes Jira
|
||||||
|
- [ ] `app/api/jira/projects/route.ts` - Liste des projets
|
||||||
|
- [ ] `app/api/jira/tasks/route.ts` - Tâches Jira
|
||||||
|
- [ ] `app/api/jira/sync/route.ts` - Synchronisation
|
||||||
|
- [ ] Configuration des credentials Jira
|
||||||
|
|
||||||
|
### 3.3 Interface Jira
|
||||||
|
- [ ] Sélecteur de projets Jira
|
||||||
|
- [ ] Affichage mixte rappels + Jira dans le Kanban
|
||||||
|
- [ ] Indicateurs visuels pour différencier les sources
|
||||||
|
|
||||||
|
## Phase 4: Statistiques équipe (Priorité 4)
|
||||||
|
|
||||||
|
### 4.1 Services analytics
|
||||||
|
- [ ] `services/team-analytics.ts` - Calculs statistiques équipe
|
||||||
|
- [ ] `services/jira-team-sync.ts` - Récupération données équipe
|
||||||
|
- [ ] Agrégation des métriques (vélocité, burndown, etc.)
|
||||||
|
|
||||||
|
### 4.2 Dashboard équipe
|
||||||
|
- [ ] `components/dashboard/TeamStats.tsx` - Statistiques équipe
|
||||||
|
- [ ] `components/charts/` - Graphiques (vélocité, burndown, etc.)
|
||||||
|
- [ ] `app/team/page.tsx` - Page dédiée équipe
|
||||||
|
- [ ] Filtres par période, membre, projet
|
||||||
|
|
||||||
|
## Phase 5: Outils additionnels (Priorité 5)
|
||||||
|
|
||||||
|
### 5.1 Intégrations futures
|
||||||
|
- [ ] Calendrier (événements, deadlines)
|
||||||
|
- [ ] Notifications (rappels, alertes)
|
||||||
|
- [ ] Export/Import de données
|
||||||
|
- [ ] Thèmes et personnalisation
|
||||||
|
|
||||||
|
### 5.2 Optimisations
|
||||||
|
- [ ] Cache Redis pour les données Jira
|
||||||
|
- [ ] Optimisation des requêtes DB
|
||||||
|
- [ ] Pagination des tâches
|
||||||
|
- [ ] Mode offline basique
|
||||||
|
|
||||||
|
## Configuration technique
|
||||||
|
|
||||||
|
### Stack
|
||||||
|
- **Frontend**: Next.js 14, React, TypeScript, Tailwind CSS
|
||||||
|
- **Backend**: Next.js API Routes, Prisma ORM
|
||||||
|
- **Database**: SQLite (local) → PostgreSQL (production)
|
||||||
|
- **Intégrations**: macOS Reminders, Jira API
|
||||||
|
- **UI**: Shadcn/ui, React DnD pour le Kanban
|
||||||
|
|
||||||
|
### Structure respectée
|
||||||
|
```
|
||||||
|
/services/ # Accès DB et logique métier
|
||||||
|
/app/api/ # Routes API utilisant les services
|
||||||
|
/clients/ # Clients HTTP frontend
|
||||||
|
/components/ # Composants React (pas de logique métier)
|
||||||
|
/hooks/ # Hooks React
|
||||||
|
/lib/ # Types et utilitaires partagés
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prochaines étapes immédiates
|
||||||
|
|
||||||
|
1. **Setup Next.js** avec la structure de dossiers
|
||||||
|
2. **Recherche technique** : Comment accéder aux rappels macOS localement
|
||||||
|
3. **Créer le service `reminders.ts`** pour l'extraction des données
|
||||||
|
4. **API de base** pour les tâches et synchronisation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Ce plan se concentre d'abord sur le backend et les rappels macOS comme demandé. Chaque phase peut être développée indépendamment.*
|
||||||
Reference in New Issue
Block a user