mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-04-06 13:31:43 +02:00
MAJ
This commit is contained in:
@@ -29,7 +29,107 @@ Ce fichier ne doit donc **jamais devenir une documentation permanente**.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
_Aucune entrée pour le moment._
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/react-native.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Bug récurrent détecté lors du theming : les imports non utilisés (`fontWeight`) ne génèrent pas d'erreur TypeScript dans React Native, car le type `fontWeight` est une string — ils passent silencieusement au lint et dans les tests. À signaler comme zone à surveiller lors de toute migration de tokens.
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## Imports morts de tokens dans les composants UI (React Native)
|
||||||
|
|
||||||
|
Lors d'une migration de design system, les imports de tokens abandonnés (ex: `fontWeight` après passage aux fontes nommées par variante) ne génèrent pas d'erreur TypeScript car le type est compatible avec les usages implicites. Vérifier systématiquement les imports non utilisés avec `eslint @typescript-eslint/no-unused-vars` ou `no-unused-imports` activé dans la config ESLint mobile.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/expo-router.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Anti-pattern découvert lors de la review theming-1 : labels et routes des tabs inversés sans erreur visible à la compilation. Le tab "Communauté" routait vers `explore.tsx` (boilerplate) au lieu de `community.tsx`. Aucun test ne couvrait ce mapping.
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## Vérifier le mapping name/label des Tabs Expo Router
|
||||||
|
|
||||||
|
Dans Expo Router, `<Tabs.Screen name="x">` correspond au fichier `app/(tabs)/x.tsx`. Les labels (`title`) sont indépendants du routage — un label "Communauté" sur `name="explore"` affichera `explore.tsx` sans aucune erreur. Lors d'un refacto de navigation (ajout/renommage de tabs), valider visuellement que chaque label correspond bien à l'écran attendu. Ajouter un test de smoke ou de snapshot de la nav si possible.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/react-native.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Input focus ring (border au focus) non implémenté malgré la tâche marquée [x]. React Native ne propose pas de `:focus` CSS — il faut gérer `onFocus`/`onBlur` manuellement avec un state local. Ce pattern est souvent oublié ou marqué done à tort.
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## Focus ring sur TextInput React Native
|
||||||
|
|
||||||
|
React Native n'a pas de pseudo-classe `:focus`. Pour implémenter un focus ring sur un `TextInput`, il faut :
|
||||||
|
1. `const [focused, setFocused] = useState(false)`
|
||||||
|
2. `onFocus={() => setFocused(true)}` / `onBlur={() => setFocused(false)}` sur le `TextInput`
|
||||||
|
3. Appliquer un style conditionnel sur le container : `[styles.container, focused && styles.containerFocused]`
|
||||||
|
|
||||||
|
Ne jamais marquer cette tâche [x] sans avoir vérifié la présence du state `focused` et des handlers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/react-native.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Dette repérée sur login.tsx : écran en anglais alors que tout le reste du flux auth est en français. Aucune erreur de build ou de lint — passe complètement inaperçu jusqu'au test manuel.
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## Cohérence de langue dans les écrans auth (React Native / Expo Router)
|
||||||
|
|
||||||
|
Les textes UI en dur ne sont pas vérifiés par TypeScript ni par les tests unitaires. Une dette de localisation (anglais vs français) peut s'accumuler silencieusement écran par écran. Points de vigilance :
|
||||||
|
- Vérifier chaque nouvel écran auth lors de la code review : titres, labels de boutons, messages d'erreur, placeholders
|
||||||
|
- Les tests de snapshot Storybook ou les reviews visuelles sont le seul filet pour ce type de dette
|
||||||
|
- Prioriser la correction avant la mise en prod (expérience utilisateur incohérente)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/expo-router.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Anti-pattern découvert en review 5.1b : `router.push('/(auth)/forgot-password')` depuis un tab `(tabs)/` — navigation cross-groupe avec préfixe de groupe explicite. Peut échouer selon la version d'Expo Router. Le reste du projet utilise `/forgot-password` sans préfixe de groupe.
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## Navigation cross-groupe Expo Router — ne jamais préfixer avec le groupe dans router.push
|
||||||
|
|
||||||
|
Depuis un écran dans `(tabs)/`, utiliser `router.push('/(auth)/forgot-password')` peut échouer silencieusement ou lever une erreur selon la version d'Expo Router, car la résolution des groupes de routes se fait par contexte de navigation. Toujours utiliser le chemin sans groupe explicite : `router.push('/forgot-password' as never)`. Les groupes `(auth)`, `(tabs)` etc. sont des conventions d'organisation de fichiers, pas des segments de route réels.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2026-03-25 — app-alexandrie
|
||||||
|
|
||||||
|
FILE_UPDATE_PROPOSAL
|
||||||
|
Fichier cible : knowledge/frontend/risques/react-native.md
|
||||||
|
|
||||||
|
Pourquoi :
|
||||||
|
Pattern `contentInset` iOS-only trouvé dans deux écrans (settings.tsx, profile.tsx déjà existant) — aucune erreur au build, invisible sur iOS, cassé sur Android (contenu sous la tab bar).
|
||||||
|
|
||||||
|
Proposition :
|
||||||
|
|
||||||
|
## `contentInset` est iOS-only sur ScrollView React Native
|
||||||
|
|
||||||
|
`ScrollView.contentInset` n'est pas supporté sur Android. Pour gérer le padding bottom autour d'une bottom tab bar, utiliser `contentContainerStyle={{ paddingBottom: insets.bottom }}` à la place. Pattern à auditer systématiquement lors de la review de tout nouvel écran avec ScrollView + bottom navigation.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
51
CLAUDE.md
51
CLAUDE.md
@@ -16,9 +16,9 @@ Langue de travail : **français**.
|
|||||||
La base de connaissance est organisée dans `knowledge/` par domaine.
|
La base de connaissance est organisée dans `knowledge/` par domaine.
|
||||||
Consulte-la avant de proposer une solution dans le domaine concerné.
|
Consulte-la avant de proposer une solution dans le domaine concerné.
|
||||||
|
|
||||||
### Procédure d'accès
|
### Procédure d’accès
|
||||||
|
|
||||||
1. Identifie le domaine : `backend`, `frontend`, `ux`, `workflow`
|
1. Identifie le domaine : `backend`, `frontend`, `ux`, `n8n`, `product`, `workflow`
|
||||||
2. Lis le `README.md` du sous-dossier `patterns/` ou `risques/` concerné
|
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
|
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
|
4. Lis ces fichiers avant de proposer quoi que ce soit
|
||||||
@@ -47,16 +47,6 @@ Consulte-la avant de proposer une solution dans le domaine concerné.
|
|||||||
| `40_decisions_et_archi.md` | Décisions techniques (mini-ADR) |
|
| `40_decisions_et_archi.md` | Décisions techniques (mini-ADR) |
|
||||||
| `90_debug_et_postmortem.md` | Post-mortems et bugs capitalisés |
|
| `90_debug_et_postmortem.md` | Post-mortems et bugs capitalisés |
|
||||||
|
|
||||||
## Règles de mise à jour
|
|
||||||
|
|
||||||
Quand tu repères qu'un pattern mérite d'être capitalisé :
|
|
||||||
|
|
||||||
```
|
|
||||||
FILE_UPDATE_PROPOSAL
|
|
||||||
Fichier : `<nom_du_fichier>`
|
|
||||||
Pourquoi : <1-2 phrases>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Capitalisation du savoir
|
## Capitalisation du savoir
|
||||||
|
|
||||||
Les apprentissages découverts dans un projet ne doivent pas être ajoutés
|
Les apprentissages découverts dans un projet ne doivent pas être ajoutés
|
||||||
@@ -80,49 +70,20 @@ Validation
|
|||||||
Lead_tech
|
Lead_tech
|
||||||
```
|
```
|
||||||
|
|
||||||
Les agents peuvent proposer librement des entrées dans :
|
Les agents peuvent proposer librement des entrées dans `95_a_capitaliser.md`.
|
||||||
|
|
||||||
`95_a_capitaliser.md`
|
Après validation, le contenu est déplacé vers le fichier approprié dans `knowledge/`.
|
||||||
|
|
||||||
Ce fichier sert de **zone tampon** pour les apprentissages à analyser.
|
|
||||||
|
|
||||||
Après validation, le contenu est déplacé vers le fichier approprié dans `knowledge/` :
|
|
||||||
|
|
||||||
- `knowledge/backend/patterns/<thème>.md`
|
|
||||||
- `knowledge/backend/risques/<thème>.md`
|
|
||||||
- `knowledge/frontend/patterns/<thème>.md`
|
|
||||||
- `knowledge/frontend/risques/<thème>.md`
|
|
||||||
- `knowledge/ux/patterns/<thème>.md`
|
|
||||||
- `knowledge/ux/risques/<thème>.md`
|
|
||||||
- `knowledge/n8n/patterns/general.md`
|
|
||||||
- `knowledge/n8n/risques/general.md`
|
|
||||||
- `knowledge/product/patterns/general.md`
|
|
||||||
- `knowledge/product/risques/<thème>.md`
|
|
||||||
- `knowledge/workflow/risques/story-tracking.md`
|
|
||||||
- `10_conventions_redaction.md`
|
|
||||||
- `40_decisions_et_archi.md`
|
|
||||||
- `90_debug_et_postmortem.md`
|
|
||||||
|
|
||||||
Objectif :
|
|
||||||
|
|
||||||
- éviter de polluer la base de connaissance
|
|
||||||
- capitaliser progressivement les retours d'expérience
|
|
||||||
- maintenir `Lead_tech` comme mémoire fiable et validée
|
|
||||||
|
|
||||||
## Projets actifs
|
## Projets actifs
|
||||||
|
|
||||||
La liste des projets actifs est maintenue dans `_projects.conf`.
|
La liste des projets actifs est maintenue dans `_projects.conf`.
|
||||||
|
|
||||||
Ce fichier constitue le registre central des projets (stack, scope, état).
|
|
||||||
Les scripts de l’environnement Lead_tech l’utilisent pour résoudre
|
|
||||||
automatiquement les chemins selon la machine (Mac / NUC).
|
|
||||||
|
|
||||||
## Patterns clés à appliquer systématiquement
|
## Patterns clés à appliquer systématiquement
|
||||||
|
|
||||||
- **Contracts-First / Zod-Infer / No-DTO** : voir `knowledge/backend/patterns/contracts.md`
|
- **Contracts-First / Zod-Infer / No-DTO** : voir `knowledge/backend/patterns/contracts.md`
|
||||||
- **Navigation réactive useEffect** : voir `knowledge/frontend/patterns/navigation.md`
|
- **Navigation réactive useEffect** : voir `knowledge/frontend/patterns/navigation.md`
|
||||||
- **Guard NestJS — ordre d'enregistrement** : voir `knowledge/backend/patterns/nestjs.md`
|
- **Guard NestJS — ordre d’enregistrement** : voir `knowledge/backend/patterns/nestjs.md`
|
||||||
- **Format d'erreur API standardisé** : `{ error: { code, message, requestId } }`
|
- **Format d’erreur API standardisé** : `{ error: { code, message, requestId } }`
|
||||||
- **Sessions avec TTL** : toujours un champ `expiresAt`, filtrer dans les queries
|
- **Sessions avec TTL** : toujours un champ `expiresAt`, filtrer dans les queries
|
||||||
|
|
||||||
## Infrastructure NUC
|
## Infrastructure NUC
|
||||||
|
|||||||
7
scripts/aliases.sh
Normal file → Executable file
7
scripts/aliases.sh
Normal file → Executable file
@@ -26,4 +26,11 @@ alias sync-ai='~/AI_RULES/_Assistant_Lead_Tech/scripts/sync-ai-instructions.sh 2
|
|||||||
alias bmad-init='"$LEADTECH/scripts/bmad-init-project.sh"'
|
alias bmad-init='"$LEADTECH/scripts/bmad-init-project.sh"'
|
||||||
|
|
||||||
# Aller dans projets
|
# Aller dans projets
|
||||||
|
|
||||||
alias projects='cd /Volumes/TeraSSD/Projets_Dev 2>/dev/null || cd /srv/projects'
|
alias projects='cd /Volumes/TeraSSD/Projets_Dev 2>/dev/null || cd /srv/projects'
|
||||||
|
|
||||||
|
# Load global secrets (KeePass → env)
|
||||||
|
alias loadg='~/AI_RULES/Auto_scripts/load-global-secrets.sh 2>/dev/null && source ~/AI_RULES/Auto_scripts/load-global-secrets.sh || source /srv/shared/scripts/load-global-secrets.sh'
|
||||||
|
|
||||||
|
# Sync service secrets (KeePass → service.env)
|
||||||
|
alias sync-service='~/AI_RULES/Auto_scripts/sync-service-secrets.sh 2>/dev/null || /srv/shared/scripts/sync-service-secrets.sh'
|
||||||
|
|||||||
0
scripts/bmad-init-project.sh
Normal file → Executable file
0
scripts/bmad-init-project.sh
Normal file → Executable file
0
scripts/generate_project_claude.sh
Normal file → Executable file
0
scripts/generate_project_claude.sh
Normal file → Executable file
0
scripts/mkproj.sh
Normal file → Executable file
0
scripts/mkproj.sh
Normal file → Executable file
0
scripts/resolve-project-path.sh
Normal file → Executable file
0
scripts/resolve-project-path.sh
Normal file → Executable file
5
scripts/sync-ai-instructions.sh
Normal file → Executable file
5
scripts/sync-ai-instructions.sh
Normal file → Executable file
@@ -46,9 +46,10 @@ ensure_symlink() {
|
|||||||
if [ -L "$link_path" ]; then
|
if [ -L "$link_path" ]; then
|
||||||
local current_target
|
local current_target
|
||||||
current_target="$(readlink "$link_path")"
|
current_target="$(readlink "$link_path")"
|
||||||
if [ "$current_target" = "$target" ]; then
|
if [ "$current_target" = "$target" ] && [ -e "$link_path" ]; then
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
rm -f "$link_path"
|
||||||
elif [ -e "$link_path" ]; then
|
elif [ -e "$link_path" ]; then
|
||||||
rm -f "$link_path"
|
rm -f "$link_path"
|
||||||
fi
|
fi
|
||||||
@@ -71,4 +72,4 @@ ensure_symlink "$REPO_ROOT/CLAUDE.md" "$REPO_ROOT/AGENTS.md"
|
|||||||
if [ "$CHANGED" -eq 1 ]; then
|
if [ "$CHANGED" -eq 1 ]; then
|
||||||
echo "Sync AI instructions (OS: $OS)"
|
echo "Sync AI instructions (OS: $OS)"
|
||||||
echo "Sync terminée."
|
echo "Sync terminée."
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user