forked from yvv/decision
- Fonte : Nunito → Plus Jakarta Sans (moderne, ronde sans être toy) - Logo : ğ(Decision) → libreDecision (libre italic/muted + Decision bold) - Footer et watermark DocumentPreview mis à jour - Mode démo : DEMO_MODE flag dans config.py + auth.py (profils rapides en prod) - docker-compose : ENVIRONMENT=production explicite + DEMO_MODE=true par défaut - Seed : +décision Licence G1 v0.4.0, +3 mandats (ComTech, Admin Forgerons, Modération) runner 7→10 étapes, import Mandate/MandateStep ajouté Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
libreDecision
Boîte à outils de gouvernance collective pour la communauté Duniter/G1. Documents modulaires sous vote permanent + protocoles de vote + mandats. Architecture marque blanche — vocation à être intégré dans sweethomeCloud et librodrome.
Protocole de début de session
git pull --rebase origin main- Si des migrations DB sont attendues :
cd backend && alembic upgrade head - Si l'objectif de la session n'est pas précisé, le demander
Stack
- Frontend : Nuxt 4 (Vue 3, TypeScript) + Nuxt UI v3 + Pinia + UnoCSS ; package manager : npm
- Backend : Python FastAPI + SQLAlchemy 2.0 async + PostgreSQL asyncpg ; migrations Alembic
- Auth : Duniter V2 Ed25519 challenge-response (substrate-interface — stub en dev)
- Sanctuaire : IPFS kubo + hash on-chain (system.remark) — TODO sprint 2
- Déploiement : Docker multi-stage + Traefik (postgres + backend + frontend + ipfs) ; CI Woodpecker
Structure
frontend/
app/
components/ # composants Vue
layouts/ # layouts Nuxt
pages/ # routing file-based (9 pages sprint 1)
composables/ # (1 composable sprint 1)
stores/ # 5 Pinia stores (auth, ...)
assets/css/
moods.css # système de palettes (.mood-* sur <html>)
utils/ # (2 utils sprint 1)
nuxt.config.ts # port 3002, host 0.0.0.0, apiBase via NUXT_PUBLIC_API_BASE
backend/
app/
routers/ # 8 routers : auth, communes, documents, protocols, votes, ...
services/ # 6 services
engine/ # 5 modules : formule inertie, critères Smith/TechComm, médiane
models/ # 14 tables SQLAlchemy
alembic/versions/ # migrations
tests/ # 186 tests (63 intégration TDD sprint 1)
seed.py # Engagement Certification (33 items) + Forgeron (51 items) + Runtime Upgrade
docker/
docker-compose.yml # postgres + backend + frontend + ipfs
backend.Dockerfile
frontend.Dockerfile
docs/content/ # 7 docs dev + 8 docs user
public/
hexagram-tsing.svg # sceau 井 (embossed)
hexagram-tsing-flat.svg
Données runtime
- postgres-data : volume Docker PostgreSQL — jamais écrasé par les builds
- ipfs-data : volume Docker IPFS kubo
.envà la racine :POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB,SECRET_KEY,DOMAIN,DUNITER_RPC_URL
Commandes
# Backend
cd backend && . venv/bin/activate
uvicorn app.main:app --port 8002 --host 0.0.0.0 --reload
pytest tests/ -v
alembic upgrade head
python seed.py # reseed Engagement Certification + Forgeron + Runtime Upgrade
# Frontend
cd frontend && npm run dev # :3002
npm run build
# Docker
docker compose -f docker/docker-compose.yml up
Conventions / pièges
- UI français, code anglais (variables, commentaires, docstrings)
- API : préfixe
/api/v1/, Pydantic v2 pour tous les schémas, async partout (SQLAlchemy + FastAPI) - Auth :
get_current_admin(24h),get_current_citizen(4h),require_super_admin - Formule inertie :
Result = C + B^W + (M + (1-M) × (1 - (T/W)^G)) × max(0, T-C)— voirbackend/app/engine/ - Mood system :
useMood.tssynchronisecolorMode.preferenceavec la palette — jamais de:global()dans<style scoped>pour les styles mood-dépendants (causa le bug dark mode veil) - Sceau
井(#48 Tsing) :.app-sealdansapp.vue, right-aligned ; SVGs danspublic/ - CSS drop-shadow() safe pour effets emboss ;
<filter>SVG inline cause des artefacts de rendu - Domaine : libredecision.org (Woodpecker CI ; ancien dossier : Glibredecision)
- Ed25519 verification : stub en dev (substrate-interface), autoritaire en prod — ne pas bypasser sans test