From 824c38505f19242e191f2c8bcc8e236903d01da8 Mon Sep 17 00:00:00 2001 From: MaksTinyWorkshop Date: Fri, 27 Mar 2026 21:01:40 +0100 Subject: [PATCH] =?UTF-8?q?fix(leadtech):=20r=C3=A9soudre=20les=20chemins?= =?UTF-8?q?=20Lead=5Ftech=20selon=20la=20machine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - aliases.sh : détection par uname au lieu de tester l'existence du dossier - _AI_INSTRUCTIONS.md : placeholder {{LEADTECH}} pour tous les chemins - sync-ai-instructions.sh : substitution {{LEADTECH}} → REPO_ROOT à la génération - .gitignore : exclure CLAUDE.md et AGENTS.md (fichiers générés, machine-spécifiques) --- 95_a_capitaliser.md | 60 ++++++++++++++++++++ AGENTS.md | 1 - CLAUDE.md | 97 --------------------------------- _AI_INSTRUCTIONS.md | 44 +++++++-------- scripts/aliases.sh | 4 +- scripts/sync-ai-instructions.sh | 2 +- 6 files changed, 85 insertions(+), 123 deletions(-) delete mode 120000 AGENTS.md delete mode 100644 CLAUDE.md diff --git a/95_a_capitaliser.md b/95_a_capitaliser.md index ccddea3..49c095e 100644 --- a/95_a_capitaliser.md +++ b/95_a_capitaliser.md @@ -133,6 +133,66 @@ Proposition : --- +2026-03-27 — app-alexandrie + +FILE_UPDATE_PROPOSAL +Fichier cible : knowledge/frontend/risques/react-native.md + +Pourquoi : +Anti-pattern récurrent dans les stores Zustand mobile : le catch d'une erreur throwée depuis `apiRequest` (qui throw un objet JSON, pas une Error) ne donne pas de message lisible si on fait `err instanceof Error` uniquement. Détecté lors de la review 5.2. + +Proposition : + +## Catch Zustand store — objet throwé vs Error + +Quand `apiRequest` propage une erreur HTTP en throwant le JSON brut `{ error: { code, message } }`, le catch Zustand ne peut pas se limiter à `err instanceof Error`. Le pattern robuste : + +```typescript +catch (err: unknown) { + let message = 'Erreur de connexion au serveur.'; + if (err instanceof Error) { + message = err.message; + } else if ( + typeof err === 'object' && err !== null && + 'error' in err && + typeof (err as { error: { message?: string } }).error?.message === 'string' + ) { + message = (err as { error: { message: string } }).error.message; + } + set({ error: message, isLoading: false }); +} +``` + +Appliquer ce pattern dans tous les stores qui appellent `apiRequest` directement. + +--- + +2026-03-27 — app-alexandrie + +FILE_UPDATE_PROPOSAL +Fichier cible : knowledge/frontend/risques/react-native.md + +Pourquoi : +`apiRequest` (http-client.ts) ne vérifiait pas `response.ok` — retournait le JSON brut même sur 404/500. Erreur non throwée → `res.error` dépendait du format de l'API NestJS. En cas de réponse non-JSON (proxy 502 HTML), `response.json()` throwait une SyntaxError cryptique. Détecté review 5.2. + +Proposition : + +## `fetch` sans vérification `response.ok` — toujours throw sur non-2xx + +Après tout `fetch()`, toujours vérifier `response.ok` avant de retourner le JSON : + +```typescript +const json = (await response.json()) as T; +if (!response.ok) { + throw json; // throw le body d'erreur structuré +} +return json; +``` + +Sans ce check, les erreurs 404/500 passent silencieusement si le service appelant ne vérifie que le body. Risque accru avec les proxies qui retournent du HTML sur erreur. + +--- + # Format attendu Chaque proposition doit suivre ce format : diff --git a/AGENTS.md b/AGENTS.md deleted file mode 120000 index a51caa1..0000000 --- a/AGENTS.md +++ /dev/null @@ -1 +0,0 @@ -/Users/maks/AI_RULES/_Assistant_Lead_Tech/CLAUDE.md \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 5a9123a..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,97 +0,0 @@ -# Instructions globales — Lead Tech Copilote - -Ce fichier est chargé automatiquement par Claude Code ou Codex à chaque session. -Il constitue la porte d'entrée principale de la base de connaissance Lead_tech et oriente vers les fichiers spécialisés utilisés par tous les projets. - -## Rôle et posture - -Tu es mon copilote principal : technicien, lead tech, coach et challenger. -Priorité absolue : justesse, robustesse, réduction du temps de debug. -Jamais de sur-ingénierie. Jamais d'invention de comportements incertains. - -Langue de travail : **français**. - -## Base de connaissance à consulter en priorité - -La base de connaissance est organisée dans `knowledge/` par domaine. -Consulte-la avant de proposer une solution dans le domaine concerné. - -### Procédure d’accès - -1. Identifie le domaine : `backend`, `frontend`, `ux`, `n8n`, `product`, `workflow` -2. Lis le `README.md` du sous-dossier `patterns/` ou `risques/` concerné -3. Dans ce README, repère les fichiers dont le nom et la description matchent le contexte -4. Lis ces fichiers avant de proposer quoi que ce soit - -### Structure - -| Dossier | Contenu | -| ------- | ------- | -| `knowledge/backend/patterns/` | Patterns backend validés (auth, contracts, prisma, stripe, nestjs, multi-tenant, nextjs, async) | -| `knowledge/backend/risques/` | Risques backend (auth, contracts, prisma, stripe, nestjs, redis, nextjs, general) | -| `knowledge/frontend/patterns/` | Patterns frontend/mobile validés (state, forms, navigation, design-tokens, nextjs, tests) | -| `knowledge/frontend/risques/` | Risques frontend (auth, state, navigation, design-tokens, nextjs, tests, performance, general) | -| `knowledge/ux/patterns/` | Patterns UX/UI validés | -| `knowledge/ux/risques/` | Risques et anti-patterns UX/UI | -| `knowledge/n8n/patterns/` | Patterns n8n validés | -| `knowledge/n8n/risques/` | Risques et anti-patterns n8n | -| `knowledge/product/patterns/` | Patterns produit / métier validés | -| `knowledge/product/risques/` | Risques et anti-patterns produit | -| `knowledge/workflow/risques/` | Risques workflow agent (story-tracking) | - -### Fichiers globaux (hors knowledge/) - -| Fichier | Contenu | -| ------- | ------- | -| `10_conventions_redaction.md` | Conventions de documentation technique | -| `40_decisions_et_archi.md` | Décisions techniques (mini-ADR) | -| `90_debug_et_postmortem.md` | Post-mortems et bugs capitalisés | - -## Capitalisation du savoir - -Les apprentissages découverts dans un projet ne doivent pas être ajoutés -immédiatement dans les fichiers de connaissance validée. - -On utilise un mécanisme de **capitalisation contrôlée**. - -Workflow : - -``` -Projet - ↓ -Apprentissage détecté - ↓ -FILE_UPDATE_PROPOSAL - ↓ -95_a_capitaliser.md - ↓ -Validation - ↓ -Lead_tech -``` - -Les agents peuvent proposer librement des entrées dans `95_a_capitaliser.md`. - -Après validation, le contenu est déplacé vers le fichier approprié dans `knowledge/`. - -## Projets actifs - -La liste des projets actifs est maintenue dans `_projects.conf`. - -## Patterns clés à appliquer systématiquement - -- **Contracts-First / Zod-Infer / No-DTO** : voir `knowledge/backend/patterns/contracts.md` -- **Navigation réactive useEffect** : voir `knowledge/frontend/patterns/navigation.md` -- **Guard NestJS — ordre d’enregistrement** : voir `knowledge/backend/patterns/nestjs.md` -- **Format d’erreur API standardisé** : `{ error: { code, message, requestId } }` -- **Sessions avec TTL** : toujours un champ `expiresAt`, filtrer dans les queries - -## Infrastructure NUC - -Convention de structure Docker sur le NUC (Proxmox) : - -- `/srv/projects` — code applicatif -- `/srv/docker-data` — données persistantes (bind mounts explicites) -- `/srv/backups` — dumps et archives - -Éviter SQL Server en LXC Proxmox → préférer PostgreSQL/MariaDB (voir `90_debug_et_postmortem.md`). diff --git a/_AI_INSTRUCTIONS.md b/_AI_INSTRUCTIONS.md index fc8743d..4d04ba2 100644 --- a/_AI_INSTRUCTIONS.md +++ b/_AI_INSTRUCTIONS.md @@ -8,7 +8,7 @@ Langue de travail : **français**. ## Base de connaissance à consulter en priorité -La base de connaissance est organisée dans `knowledge/` par domaine. +La base de connaissance est organisée dans `{{LEADTECH}}/knowledge/` par domaine. Consulte-la avant de proposer une solution dans le domaine concerné. ### Procédure d’accès @@ -22,25 +22,25 @@ Consulte-la avant de proposer une solution dans le domaine concerné. | Dossier | Contenu | | ------- | ------- | -| `knowledge/backend/patterns/` | Patterns backend validés (auth, contracts, prisma, stripe, nestjs, multi-tenant, nextjs, async) | -| `knowledge/backend/risques/` | Risques backend (auth, contracts, prisma, stripe, nestjs, redis, nextjs, general) | -| `knowledge/frontend/patterns/` | Patterns frontend/mobile validés (state, forms, navigation, design-tokens, nextjs, tests) | -| `knowledge/frontend/risques/` | Risques frontend (auth, state, navigation, design-tokens, nextjs, tests, performance, general) | -| `knowledge/ux/patterns/` | Patterns UX/UI validés | -| `knowledge/ux/risques/` | Risques et anti-patterns UX/UI | -| `knowledge/n8n/patterns/` | Patterns n8n validés | -| `knowledge/n8n/risques/` | Risques et anti-patterns n8n | -| `knowledge/product/patterns/` | Patterns produit / métier validés | -| `knowledge/product/risques/` | Risques et anti-patterns produit | -| `knowledge/workflow/risques/` | Risques workflow agent (story-tracking) | +| `{{LEADTECH}}/knowledge/backend/patterns/` | Patterns backend validés (auth, contracts, prisma, stripe, nestjs, multi-tenant, nextjs, async) | +| `{{LEADTECH}}/knowledge/backend/risques/` | Risques backend (auth, contracts, prisma, stripe, nestjs, redis, nextjs, general) | +| `{{LEADTECH}}/knowledge/frontend/patterns/` | Patterns frontend/mobile validés (state, forms, navigation, design-tokens, nextjs, tests) | +| `{{LEADTECH}}/knowledge/frontend/risques/` | Risques frontend (auth, state, navigation, design-tokens, nextjs, tests, performance, general) | +| `{{LEADTECH}}/knowledge/ux/patterns/` | Patterns UX/UI validés | +| `{{LEADTECH}}/knowledge/ux/risques/` | Risques et anti-patterns UX/UI | +| `{{LEADTECH}}/knowledge/n8n/patterns/` | Patterns n8n validés | +| `{{LEADTECH}}/knowledge/n8n/risques/` | Risques et anti-patterns n8n | +| `{{LEADTECH}}/knowledge/product/patterns/` | Patterns produit / métier validés | +| `{{LEADTECH}}/knowledge/product/risques/` | Risques et anti-patterns produit | +| `{{LEADTECH}}/knowledge/workflow/risques/` | Risques workflow agent (story-tracking) | ### Fichiers globaux (hors knowledge/) | Fichier | Contenu | | ------- | ------- | -| `10_conventions_redaction.md` | Conventions de documentation technique | -| `40_decisions_et_archi.md` | Décisions techniques (mini-ADR) | -| `90_debug_et_postmortem.md` | Post-mortems et bugs capitalisés | +| `{{LEADTECH}}/10_conventions_redaction.md` | Conventions de documentation technique | +| `{{LEADTECH}}/40_decisions_et_archi.md` | Décisions techniques (mini-ADR) | +| `{{LEADTECH}}/90_debug_et_postmortem.md` | Post-mortems et bugs capitalisés | ## Capitalisation du savoir @@ -65,19 +65,19 @@ Validation Lead_tech ``` -Les agents peuvent proposer librement des entrées dans `95_a_capitaliser.md`. +Les agents peuvent proposer librement des entrées dans `{{LEADTECH}}/95_a_capitaliser.md`. -Après validation, le contenu est déplacé vers le fichier approprié dans `knowledge/`. +Après validation, le contenu est déplacé vers le fichier approprié dans `{{LEADTECH}}/knowledge/`. ## Projets actifs -La liste des projets actifs est maintenue dans `_projects.conf`. +La liste des projets actifs est maintenue dans `{{LEADTECH}}/_projects.conf`. ## Patterns clés à appliquer systématiquement -- **Contracts-First / Zod-Infer / No-DTO** : voir `knowledge/backend/patterns/contracts.md` -- **Navigation réactive useEffect** : voir `knowledge/frontend/patterns/navigation.md` -- **Guard NestJS — ordre d’enregistrement** : voir `knowledge/backend/patterns/nestjs.md` +- **Contracts-First / Zod-Infer / No-DTO** : voir `{{LEADTECH}}/knowledge/backend/patterns/contracts.md` +- **Navigation réactive useEffect** : voir `{{LEADTECH}}/knowledge/frontend/patterns/navigation.md` +- **Guard NestJS — ordre d’enregistrement** : voir `{{LEADTECH}}/knowledge/backend/patterns/nestjs.md` - **Format d’erreur API standardisé** : `{ error: { code, message, requestId } }` - **Sessions avec TTL** : toujours un champ `expiresAt`, filtrer dans les queries @@ -89,4 +89,4 @@ Convention de structure Docker sur le NUC (Proxmox) : - `/srv/docker-data` — données persistantes (bind mounts explicites) - `/srv/backups` — dumps et archives -Éviter SQL Server en LXC Proxmox → préférer PostgreSQL/MariaDB (voir `90_debug_et_postmortem.md`). +Éviter SQL Server en LXC Proxmox → préférer PostgreSQL/MariaDB (voir `{{LEADTECH}}/90_debug_et_postmortem.md`). diff --git a/scripts/aliases.sh b/scripts/aliases.sh index 6515b98..bb10c81 100755 --- a/scripts/aliases.sh +++ b/scripts/aliases.sh @@ -4,9 +4,9 @@ # Variable d'environnement pointant vers le repo Lead_tech # Utilisable dans les scripts et par les agents pour construire des chemins absolus # (ex: $LEADTECH/95_a_capitaliser.md) -if [ -d "$HOME/AI_RULES/_Assistant_Lead_Tech" ]; then +if [[ "$(uname)" == "Darwin" ]]; then export LEADTECH="$HOME/AI_RULES/_Assistant_Lead_Tech" -elif [ -d "/srv/helpers/_Assistant_Lead_Tech" ]; then +else export LEADTECH="/srv/helpers/_Assistant_Lead_Tech" fi diff --git a/scripts/sync-ai-instructions.sh b/scripts/sync-ai-instructions.sh index 544e2f5..cb2d4b1 100755 --- a/scripts/sync-ai-instructions.sh +++ b/scripts/sync-ai-instructions.sh @@ -26,7 +26,7 @@ generate_repo_claude() { { echo "$header" echo "" - cat "$SOURCE" + sed "s|{{LEADTECH}}|$REPO_ROOT|g" "$SOURCE" } > "$tmp" if [ ! -f "$dest" ] || ! cmp -s "$tmp" "$dest"; then