commit 3aa895a02ebfe0528b482a94eff52e5bb2d88a77 Author: Julien Froidefond Date: Sat Sep 13 08:59:07 2025 +0200 chore: init diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..22f901c Binary files /dev/null and b/.DS_Store differ diff --git a/.cursor/.DS_Store b/.cursor/.DS_Store new file mode 100644 index 0000000..29c219a Binary files /dev/null and b/.cursor/.DS_Store differ diff --git a/.cursor/rules/api-routes.mdc b/.cursor/rules/api-routes.mdc new file mode 100644 index 0000000..36409d5 --- /dev/null +++ b/.cursor/rules/api-routes.mdc @@ -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 diff --git a/.cursor/rules/clients.mdc b/.cursor/rules/clients.mdc new file mode 100644 index 0000000..3f35f89 --- /dev/null +++ b/.cursor/rules/clients.mdc @@ -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 { + return this.httpClient.get("/api/data"); + } +} +``` + +❌ FORBIDDEN: + +- Direct fetch calls +- Business logic in clients +- Untyped responses diff --git a/.cursor/rules/components.mdc b/.cursor/rules/components.mdc new file mode 100644 index 0000000..443b131 --- /dev/null +++ b/.cursor/rules/components.mdc @@ -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
{data.map(item => )}
; +}; +``` + +❌ FORBIDDEN: + +- Direct service usage +- Direct database queries +- Direct fetch calls +- Untyped props diff --git a/.cursor/rules/project-structure.mdc b/.cursor/rules/project-structure.mdc new file mode 100644 index 0000000..7fc5a30 --- /dev/null +++ b/.cursor/rules/project-structure.mdc @@ -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/ diff --git a/.cursor/rules/services.mdc b/.cursor/rules/services.mdc new file mode 100644 index 0000000..02a8673 --- /dev/null +++ b/.cursor/rules/services.mdc @@ -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 { + 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 diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..8fe083b --- /dev/null +++ b/TODO.md @@ -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.*