218 lines
7.1 KiB
Markdown
218 lines
7.1 KiB
Markdown
# 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
|
|
|
|
1. models.py + seed.py (schema SQLite + donnees initiales)
|
|
2. auth.py (JWT + API key middleware)
|
|
3. scopes.py (matrice + validation)
|
|
4. routes/api.py (endpoints REST publics agents)
|
|
5. routes/admin.py (CRUD + audit)
|
|
6. routes/mcp.py (MCP SSE)
|
|
7. templates/ (UI Nabil)
|
|
8. Dockerfile + docker-compose.yml
|
|
9. Test complet toutes les cles + scopes
|
|
10. git commit + push bolbol/context-hub.git
|