Python 64.6%
TypeScript 33.7%
CSS 0.8%
1.PHONY: dev api web sandbox migrate seed ingest test lint build deploy stage23PY=backend/.venv/bin/python4COURSE?=imm10335PATH_IN?=content/$(COURSE)67dev: ## docker compose (api :8190, web :5173, sandbox :8191)8 docker compose up --build910api: ## API locale (venv)11 cd backend && .venv/bin/python -m uvicorn app.main:app --reload --port 81901213sandbox: ## sandbox-runner local14 cd sandbox-runner && .venv/bin/python -m uvicorn server:app --port 8191 --reload1516web: ## frontend Vite avec proxy /api17 cd frontend && npm run dev1819setup: ## venvs + npm install20 cd backend && uv venv --python 3.12 .venv && uv pip install --python .venv/bin/python -e ".[dev]"21 cd sandbox-runner && uv venv --python 3.12 .venv && uv pip install --python .venv/bin/python -r requirements.txt22 cd frontend && npm install2324migrate: ## crée/actualise le schéma (create_all ; Alembic à venir)25 cd backend && .venv/bin/python -c "import asyncio; from app.db import init_db; asyncio.run(init_db())"2627seed: ## cours IMM1003/IMM1033 (+ PROF=email pour un compte professeur)28 cd backend && .venv/bin/python -m scripts.seed $(if $(PROF),--professor $(PROF),)2930ingest: ## make ingest COURSE=imm1033 SITE=<dist dir> | PATH_IN=<dossier de fichiers>31 cd backend && .venv/bin/python -m scripts.ingest --course $(COURSE) $(if $(SITE),--site $(SITE),) $(if $(wildcard ../$(PATH_IN)),--path ../$(PATH_IN),)3233test: ## tests backend + frontend34 cd backend && .venv/bin/pytest -q35 cd frontend && npx tsc --noEmit3637lint:38 cd backend && .venv/bin/ruff check app scripts tests39 cd frontend && npx tsc --noEmit4041build: ## build frontend (dist servi par l'API)42 cd frontend && npm run build4344stage: build ## laptop → passerelle M1M3245 ~/Desktop/cluster-skill/mld stage $(CURDIR) uqo-chat4647deploy: stage ## déploiement mld (nœud choisi par score ; NODE=X pour forcer)48 ~/Desktop/cluster-skill/mld deploy uqo-chat $(if $(NODE),--node $(NODE),)49