943acbc573
Durcit la convention de nommage des projets (dérive constatée : 'Sliding Automation', 'code_versioning'... au lieu des formes canoniques). - trilium_api.py : projets_canoniques() lit le référentiel = valeurs du label projet sur les notes de type=projet (source unique, pas de constante en dur). Note-projet CodeVersioning créée (manquait). - mcp_server.py : _valider_projet() branché dans les 6 tools de création (add_decision/history/backlog, new_conversation, create_entite, add_skill). Refuse un projet non canonique (suggestion si faute) ou inconnu (renvoi au processus de création de projet). Ne verrouille pas si référentiel illisible. - lint_audit.py : VAL-nommage aligné sur le référentiel (attrape casse, espace ET snake_case ; l'ancien 'contient un espace' ratait code_versioning). - Données : 79 notes ré-étiquetées vers les 3 formes canoniques. Quality by design : l'erreur de nommage devient impossible à l'écriture, le Lint n'est plus que le filet de sécurité.
35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
from fastapi.encoders import jsonable_encoder
|
|
from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError
|
|
from fastapi.utils import is_body_allowed_for_status_code
|
|
from fastapi.websockets import WebSocket
|
|
from starlette.exceptions import HTTPException
|
|
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse, Response
|
|
from starlette.status import WS_1008_POLICY_VIOLATION
|
|
|
|
|
|
async def http_exception_handler(request: Request, exc: HTTPException) -> Response:
|
|
headers = getattr(exc, "headers", None)
|
|
if not is_body_allowed_for_status_code(exc.status_code):
|
|
return Response(status_code=exc.status_code, headers=headers)
|
|
return JSONResponse(
|
|
{"detail": exc.detail}, status_code=exc.status_code, headers=headers
|
|
)
|
|
|
|
|
|
async def request_validation_exception_handler(
|
|
request: Request, exc: RequestValidationError
|
|
) -> JSONResponse:
|
|
return JSONResponse(
|
|
status_code=422,
|
|
content={"detail": jsonable_encoder(exc.errors())},
|
|
)
|
|
|
|
|
|
async def websocket_request_validation_exception_handler(
|
|
websocket: WebSocket, exc: WebSocketRequestValidationError
|
|
) -> None:
|
|
await websocket.close(
|
|
code=WS_1008_POLICY_VIOLATION, reason=jsonable_encoder(exc.errors())
|
|
)
|