diff --git a/.claude/commands/push-tickets-lesstime.md b/.claude/commands/push-tickets-lesstime.md new file mode 100644 index 0000000..93122cf --- /dev/null +++ b/.claude/commands/push-tickets-lesstime.md @@ -0,0 +1,224 @@ +--- +name: push-tickets-lesstime +description: Use after full-project-review to push TICKETS.md tickets into Lesstime project management via MCP. Triggers on "push tickets", "envoyer tickets", "creer les tickets dans lesstime", "sync tickets lesstime", "pousser les tickets". +--- + +# Push Tickets to Lesstime + +## Overview + +Prend le fichier `TICKETS.md` genere par le skill `full-project-review` et cree les taches correspondantes dans Lesstime via son MCP server. Chaque ticket devient une tache avec la bonne priorite, le bon groupe, et la description complete. + +## When to Use + +- Apres un `full-project-review` qui a genere un `TICKETS.md` +- L'utilisateur demande de "pousser", "sync", "envoyer" les tickets dans Lesstime +- L'utilisateur veut creer les taches dans son gestionnaire de projet + +## Prerequis + +- Un fichier `TICKETS.md` doit exister dans le repertoire courant (genere par `full-project-review`) +- L'API Lesstime doit etre accessible via HTTP + +## Connexion a Lesstime + +Lesstime est accessible via un serveur MCP HTTP (JSON-RPC 2.0). Il n'y a PAS de MCP natif configure dans Claude Code — il faut appeler l'API directement via `curl` dans le Bash tool. + +### Parametres de connexion + +``` +URL: http://project.malio-dev.fr/_mcp +TOKEN: 7e8b410a5b79b5c0432951dcee3a3a81e0731e86d9f70d8784ec079a2b759c64 +``` + +### Procedure de connexion (3 etapes) + +**Etape 1 — Initialiser la session** (SANS header Mcp-Session-Id) : +```bash +curl -s -D /tmp/mcp_headers -X POST http://project.malio-dev.fr/_mcp \ + -H "Authorization: Bearer 7e8b410a5b79b5c0432951dcee3a3a81e0731e86d9f70d8784ec079a2b759c64" \ + -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"claude","version":"1.0"}}}' > /dev/null +``` + +**Etape 2 — Extraire le Session ID** depuis les headers de reponse : +```bash +SID=$(grep -i "mcp-session-id" /tmp/mcp_headers | awk '{print $2}' | tr -d '\r\n') +``` + +**Etape 3 — Appeler les outils** avec le Session ID : +```bash +curl -s -X POST http://project.malio-dev.fr/_mcp \ + -H "Authorization: Bearer 7e8b410a5b79b5c0432951dcee3a3a81e0731e86d9f70d8784ec079a2b759c64" \ + -H "Content-Type: application/json" \ + -H "Mcp-Session-Id: $SID" \ + -d '{"jsonrpc":"2.0","id":10,"method":"tools/call","params":{"name":"list-projects","arguments":{}}}' +``` + +Les reponses sont au format `{"jsonrpc":"2.0","id":X,"result":{"content":[{"type":"text","text":"[JSON_DATA]"}]}}`. +Extraire les donnees avec : `python3 -c "import sys,json; d=json.loads(sys.stdin.read()); print(json.loads(d['result']['content'][0]['text']))"` + +### Approche recommandee : script Python + +Pour pousser plusieurs tickets, generer un script Python temporaire qui : +1. Initialise la session via curl subprocess +2. Extrait le SID +3. Boucle sur les tickets et appelle create-task pour chacun +4. Affiche le resultat + +Voir la memoire `reference_lesstime.md` pour les IDs connus (projets, users, statuts, priorites). + +### IDs frequemment utilises + +| Type | Label | ID | +|------|-------|----| +| Statut | A faire | 1 | +| Statut | En cours | 2 | +| Statut | Termine | 5 | +| Priorite | Basse | 1 | +| Priorite | Moyen | 2 | +| Priorite | Haute | 3 | +| User | matteo | 6 | +| User | Matthieu | 5 | +| Projet | Infrastructure | 13 | +| Projet | Lesstime | 5 | +| Projet | Inventory | 7 | +| Projet | Ferme | 8 | +| Projet | SIRH | 12 | + +**IMPORTANT :** Toujours faire un appel `list-projects` / `list-users` / `list-priorities` en phase Discovery pour verifier que les IDs sont toujours valides. Les IDs ci-dessus sont un cache pour aller plus vite, pas une source de verite. + +## Outils MCP Lesstime disponibles + +Le MCP Lesstime expose 22 outils. Voici ceux utilises par ce skill : + +### Discovery (appeler en premier pour mapper les IDs) + +| Outil | Usage | +|-------|-------| +| `list-projects` | Trouver le projectId cible | +| `list-statuses` | Recuperer les statuts disponibles (label, id, color) | +| `list-priorities` | Recuperer les priorites disponibles (label, id, color) | +| `list-efforts` | Recuperer les niveaux d'effort (label, id) | +| `list-groups` | Lister les groupes d'un projet (par projectId) | +| `list-tags` | Lister les tags disponibles (label, id, color) | +| `list-users` | Lister les utilisateurs pour l'assignation | + +### Creation + +| Outil | Usage | +|-------|-------| +| `create-task` | Creer une tache (projectId, title, description, statusId, priorityId, effortId, assigneeId, groupId, tagIds) | +| `create-group` | Creer un groupe dans un projet (projectId, title) | + +### Parametres de `create-task` + +``` +projectId: int (required) -- ID du projet cible +title: string (required) -- Titre du ticket (ex: "T-001 -- Supprimer le webhook hardcode") +description: string (optional) -- Corps complet du ticket (Pourquoi + A faire + Fichiers) +statusId: int (optional) -- ID du statut initial +priorityId: int (optional) -- ID de la priorite +effortId: int (optional) -- ID de l'effort estime +assigneeId: int (optional) -- ID de l'utilisateur assigne +groupId: int (optional) -- ID du groupe (utilise pour regrouper par priorite) +tagIds: int[] (optional) -- IDs des tags +``` + +## Process + +```dot +digraph push_flow { + rankdir=TB; + "1. Lire TICKETS.md" -> "2. Discovery MCP (parallele)"; + "2. Discovery MCP (parallele)" -> "3. Demander projet cible"; + "3. Demander projet cible" -> "4. Mapper priorites"; + "4. Mapper priorites" -> "5. Creer groupes si besoin"; + "5. Creer groupes si besoin" -> "6. Creer les taches"; + "6. Creer les taches" -> "7. Resume au user"; +} +``` + +### Phase 1 -- Lire et parser TICKETS.md + +Lire le fichier `TICKETS.md` du repertoire courant. Extraire : +- La liste des tickets avec leur ID (T-001, T-002, ...) +- Le titre de chaque ticket +- La priorite (P0, P1, P2, P3) -- derivee de la section dans laquelle se trouve le ticket +- Le corps complet (Pourquoi + A faire + Fichiers) -- sera la description de la tache + +**Parsing :** +- Les sections `## P0`, `## P1`, `## P2`, `## P3` delimitent les groupes de priorite +- Chaque `### T-XXX -- {Titre}` est un ticket +- Tout le contenu entre deux `### T-XXX` constitue la description du ticket + +### Phase 2 -- Discovery MCP (appels paralleles) + +Appeler ces outils MCP **en parallele** pour recuperer les metadonnees : + +1. `list-projects` -- pour afficher les projets disponibles +2. `list-statuses` -- pour mapper le statut initial des taches +3. `list-priorities` -- pour mapper P0/P1/P2/P3 aux priorites Lesstime +4. `list-efforts` -- pour estimer l'effort +5. `list-tags` -- pour les tags disponibles + +### Phase 3 -- Demander le projet cible + +Presenter a l'utilisateur la liste des projets Lesstime et lui demander : +1. **Quel projet ?** -- dans quel projet creer les taches +2. **Quel statut initial ?** -- ex: "To Do", "Backlog" +3. **Creer des groupes par priorite ?** -- ex: "P0 - Urgents", "P1 - Importants" +4. **Assigner a quelqu'un ?** -- optionnel +5. **Tags a ajouter ?** -- ex: "review", "tech-debt" + +### Phase 4 -- Mapper les priorites + +Mapper les priorites du TICKETS.md aux priorites Lesstime : +- P0 -> priorite la plus haute disponible (ex: "Urgent", "Critical") +- P1 -> priorite haute (ex: "High") +- P2 -> priorite moyenne (ex: "Medium") +- P3 -> priorite basse (ex: "Low") + +Si le mapping n'est pas evident, demander confirmation a l'utilisateur. + +### Phase 5 -- Creer les groupes (si demande) + +Si l'utilisateur veut des groupes par priorite : +1. Creer le groupe "P0 - Urgents (securite)" via `create-group` +2. Creer le groupe "P1 - Importants" via `create-group` +3. Creer le groupe "P2 - Documentation" via `create-group` +4. Creer le groupe "P3 - Nice to have" via `create-group` + +### Phase 6 -- Creer les taches + +Pour chaque ticket dans TICKETS.md : +1. Construire le titre : `"T-XXX -- {titre}"` +2. Construire la description : le corps complet du ticket (Pourquoi + A faire + Fichiers) +3. Appeler `create-task` avec tous les parametres mappes + +**Optimisation :** Creer les taches en parallele par batch de 5 pour eviter de surcharger l'API. + +### Phase 7 -- Resume + +Afficher un resume au user : +- Nombre de taches creees +- Repartition par priorite +- Lien vers le projet Lesstime (si disponible) +- Taches echouees (si applicable) avec raison + +## Mapping par defaut + +| TICKETS.md | Lesstime Priority | Lesstime Group | +|------------|-------------------|----------------| +| P0 | Urgent/Critical | "P0 - Urgents (securite)" | +| P1 | High | "P1 - Importants" | +| P2 | Medium | "P2 - Documentation" | +| P3 | Low | "P3 - Nice to have" | + +## Common Mistakes + +- **Oublier la phase Discovery** -- les IDs de priorites/statuts varient par workspace Lesstime +- **Ne pas demander confirmation** -- toujours valider le projet cible et le mapping avant de creer +- **Creer sans groupes** -- les groupes rendent la vue Lesstime beaucoup plus lisible +- **Description trop courte** -- inclure le corps complet du ticket, pas juste le titre +- **Ne pas gerer les erreurs** -- si une tache echoue, continuer avec les suivantes et reporter a la fin diff --git a/config/version.yaml b/config/version.yaml index ab2b4d1..59c6b7f 100644 --- a/config/version.yaml +++ b/config/version.yaml @@ -1,2 +1,2 @@ parameters: - app.version: '0.3.9' + app.version: '0.3.10'