# Tests (toujours utiliser le venv)
.venv/bin/python3 -m pytest tests/ -q --tb=short
# Vérifier import app sans erreur
.venv/bin/python3 -c "from app import app; print('OK')"
# Lancer le serveur
.venv/bin/python3 -m uvicorn app:app --reload
# Linter / pre-commit
.venv/bin/python3 -m pre_commit run --all-files1587 passing, 57 pre-existing failures — ne pas régresser.
Les 57 failures sont des problèmes connus (routes 404 dans test_settings + test_microsoft_api, openpyxl manquant dans test_tender_scout, route /api/skills-market/search absente du router).
- Toutes les nouvelles routes vont dans
routers/<domain>.py, jamais dansapp.py routers/shared.pyest la seule source pour :jobs,limiter,templates,BASE_DIR,CONSULTANT_NAME,COMPANY_NAME,safe_error_message,safe_traceback,send_sse- SSE streaming :
send_sse(event, data)de shared.py +StreamingResponse - Background jobs :
threading.Thread(target=fn, daemon=True)+jobs[job_id]dict - Auth :
get_current_user(request)depuisutils/auth.py— routes meeting-capture et elearning exigent ce guard
- Venv obligatoire : Python 3.13 dans
.venv/— jamaispython3système - Pas de
except:nu — toujoursexcept Exception as e:ou exception spécifique safe_error_message(e)pour les réponses erreur client — jamais exposer le message brut@limiter.limit("N/minute")sur tous les endpoints de mutation- Messages d'erreur UI en français
asyncio_mode=autodans pytest.ini — pas besoin de@pytest.mark.asyncioconftest.pyauto-mockapp.get_current_user→"test_admin"pour tous les tests- Tests non-authentifiés : re-patcher
app.get_current_useràNonedans le corps du test - Quand on déplace du code vers un router : mettre à jour les patches
app.X→routers.<module>.X - La cible du patch = là où le nom est importé (pas où il est défini)
- Branches :
feature/phase<N><lettre>-<description>(ex:feature/phase7b-routers-groupB) - PRs ciblent
dev(pasmain) - Commits : message clair
utils/__init__.pyetagents/__init__.pyré-exportent tout — une erreur de syntaxe dans n'importe quel module casse tous les testsstatic/photos/est créé au démarrage (upload de photos)- Skills Market DB : patcher
routers.skills_market.skills_market_db(plusapp.skills_market_db) - Meeting Capture : patcher
routers.meeting_capture.MeetingGmailClient(plusapp.MeetingGmailClient) - LinkedIn : patcher
routers.linkedin.LinkedInClientetrouters.linkedin.has_linkedin_access_token - TenderScout : patcher
routers.tenderscout.get_current_user,routers.tenderscout.TenderDatabase,routers.tenderscout.MeetingGmailClient - E-learning DB : patcher
routers.elearning.elearning_db(plusapp.elearning_db) - Document editor : patcher
routers.document_editor.BUG_REPORTS_FILE(plusapp.BUG_REPORTS_FILE)