7.1 KiB
prompt.md — Brief projet context-hub
Ce fichier est le PRD complet. Antigravity le lit et construit l application.
Derniere mise a jour : 2026-06-24
CONTEXTE
context-hub est la source de verite unique pour tous les agents AI du NAS Synology DS920+. Au lieu de dupliquer les regles dans chaque system prompt / AGENTS.md / CLAUDE.md, un seul service REST + MCP centralise tout. Chaque agent interroge ce service selon ses droits et obtient uniquement ce qu il est autorise a voir.
Consumers :
- Nabil (interface web admin)
- Claude (MCP via claude.ai)
- hermes-tt / hermes-nyora / hermes-perso (MCP via agents Hermes)
- Gemini / Antigravity (REST API + MCP)
STACK TECHNIQUE
- Python 3.11+
- FastAPI (API REST + MCP SSE)
- SQLite (via aiosqlite)
- Jinja2 (templates admin UI)
- PyJWT (auth web Nabil)
- uvicorn
Un seul container Docker. Pas de base externe. Pas de Redis. Toutes les variables depuis .env (deja present dans /mnt/docker/context-hub/).
STRUCTURE FICHIERS
context-hub/ ├── app/ │ ├── main.py FastAPI app + montage routes │ ├── auth.py JWT web (Nabil) + API key (agents) │ ├── models.py SQLite schema + CRUD (aiosqlite) │ ├── scopes.py Matrice acces par cle API │ ├── routes/ │ │ ├── api.py GET /api/rules/{scope}, /api/ports, /api/search │ │ ├── admin.py POST admin (CRUD regles, cles, audit) │ │ └── mcp.py Endpoint MCP SSE /mcp │ └── seed.py Population initiale SQLite depuis les donnees ci-dessous ├── templates/ │ ├── base.html │ ├── login.html │ ├── dashboard.html Vue Nabil : tous les scopes, audit log, cles │ └── editor.html Editeur de regles par scope ├── static/ │ └── style.css ├── docker-compose.yml ├── Dockerfile ├── requirements.txt ├── .env (deja cree — NE PAS recreer) ├── AGENTS.md (deja cree — NE PAS recreer) └── prompt.md (ce fichier)
MATRICE D ACCES
| Scope | CLAUDE | HERMES_TT | HERMES_NYORA | HERMES_PERSO | GEMINI | NABIL |
|---|---|---|---|---|---|---|
| infra | oui | oui | oui | oui | oui | oui |
| llm | oui | oui | oui | oui | oui | oui |
| nyora | oui | NON | oui | oui | oui | oui |
| perso | oui | NON | NON | oui | NON | oui |
| tt | oui | oui | NON | NON | NON | oui |
HTTP 403 sur toute tentative non autorisee. La cle determine le consumer.
ENDPOINTS API
GET /api/rules/{scope} Regles du scope (JSON). Auth: X-API-Key GET /api/ports Registre ports complet (JSON) GET /api/search?q=terme Recherche plein-texte (scopes autorises) POST /api/admin/rules/{scope} CRUD regle (NABIL uniquement, JWT) GET /api/audit?limit=50 Log acces agents (NABIL uniquement) GET /api/keys Gestion cles API (NABIL uniquement) POST /api/keys/rotate/{agent} Rotation cle (NABIL uniquement) GET /health Health check public POST /mcp MCP SSE endpoint
Auth web Nabil : POST /auth/login -> JWT cookie httponly (12h) Auth agents : Header X-API-Key
OUTILS MCP
get_rules(scope) -> dict Regles scope si autorise get_ports() -> list Registre ports complet search_rules(query) -> list Recherche scopes autorises get_agent_config(name) -> dict Config compilee agent (infra+llm+scopes) check_port(port) -> dict Port libre ou occupe
CONTENU SEED — scope infra
Initialiser SQLite avec : ssh: host=192.168.100.33, port=22222, user=Best0f docker: uid=1026, gid=100 network: from_container=172.17.0.1, from_lan=192.168.100.33 identities: bolbol=Gitea, Best0f=SSH, bestof=Portainer git_push_pattern: http://bolbol:PWD@172.17.0.1:3232/bolbol/REPO.git mcp_nas: heredoc->timeout, heredoc->printf/python, limit=350chars, session-poison-apres-3-erreurs
CONTENU SEED — scope llm
bifrost_internal: http://bifrost:8080/v1 bifrost_lan: http://192.168.100.33:3085/v1 bifrost_auth: header x-bf-vk (JAMAIS Authorization Bearer) bifrost_proxy_max_tokens: 16384 default_model: deepseek/deepseek-chat-v3-0324 provider: opencode-go budget_usd_month: 10 vision_model: openrouter/google/gemini-2.5-flash deepseek_limitation: text-only, 404 sur images openrouter: urgence uniquement
CONTENU SEED — scope nyora
apps: family-help:3041, nyora-veille:3055, redaction-pro:3092 dr_nexum: deadline=2026-11-15, target_subs=1000, target_revenue_eur=300 footer: color=#d4a01a, line1=gradient-or, line2=NYORA, line3=Crafted with precision, line4=2026 rules:
- Ne jamais ecrire Tunisie Telecom ou Zone Sud dans apps Nyora
- Login forms : placeholder=Identifiant uniquement
- Footer Nyora obligatoire sur toutes les apps personnelles
CONTENU SEED — scope perso
family: nedya: nee 1983, coeliaque yesmine: nee 2008, fibromyalgie et nevralgie, priorite accompagnement ahmed: ne 2010 mondher: pharmacien, reponses niveau clinique yasmi: marque artisanale mode, jasmine, Sfax
CONTENU SEED — scope tt (acces restreint)
baserow_token: deT2PW3ZFZ0h3euxhKDFnlZhKNrcckYV zone: Gabes, Gafsa, Kebili, Medenine, Sfax, Tataouine, Tozeur ci_cpt_zone_sud: 998, fb_zone_sud: 1006 rla_contracts: table=856, count=55 rules:
- Ne jamais mentionner Baserow/Python/IA dans documents officiels
- Documents = travail Direction Zone Sud Tunisie Telecom
ADMIN UI — NABIL
Page dashboard : vue tous scopes, audit log dernieres 24h, statut cles Page editor : editer une regle par scope (formulaire JSON inline) Page audit : log complet avec filtre par agent et par scope Page keys : liste cles + date derniere utilisation + bouton rotation
Design : sobre, dark theme, same feel que redaction-pro. Pas de framework CSS externe. Tailwind CDN accepte. Titre page : context-hub | Nyora Infrastructure
DOCKER-COMPOSE
Service unique context-hub. Reseau : n8n (pour acces interne bifrost, nyora-notes, baserow). Volume : ./data:/app/data (SQLite persiste). Port : 3093:8000. Env : env_file: .env Restart : unless-stopped. Healthcheck : GET /health.
SECURITE
- .env dans .gitignore (deja configure)
- JWT httponly, SameSite=strict
- Rate limit sur /auth/login (5 tentatives/minute)
- Logs audit : chaque requete API loguee (agent, scope, timestamp, ip)
- Rotation cles : possible depuis UI sans redemarrage (cles en DB)
- Scope tt : double verification (cle + scope explicite dans requete)
ORDRE DE CONSTRUCTION RECOMMANDE
- models.py + seed.py (schema SQLite + donnees initiales)
- auth.py (JWT + API key middleware)
- scopes.py (matrice + validation)
- routes/api.py (endpoints REST publics agents)
- routes/admin.py (CRUD + audit)
- routes/mcp.py (MCP SSE)
- templates/ (UI Nabil)
- Dockerfile + docker-compose.yml
- Test complet toutes les cles + scopes
- git commit + push bolbol/context-hub.git