17 KiB
NIS2 Agile - Documentazione Progetto
PRIMA DI INIZIARE
- Leggi sempre questo file prima di iniziare qualsiasi lavoro
- Il progetto e' al 100% di completamento (24.000+ righe di codice, 50+ file sorgente)
- 7 commit su main, tutto deployato e testato su Hetzner
- E2E test completati, bug fixing, Docker verificato, UI polished
docs/CONTEXT_LAST_SESSION.md- Contesto ultima sessione (continuita cross-browser)Poi dimmi cosa hai capito dello stato attuale e dove eravamo rimasti.
A FINE SESSIONE
OBBLIGATORIO: Prima di chiudere, aggiornare SEMPRE:
Aggiorna
docs/CONTEXT_LAST_SESSION.mdcon:
- Data sessione
- Cosa hai fatto in questa sessione
- File creati o modificati
- File deployati su Hetzner
- Problemi aperti / errori non risolti
- Prossimi passi consigliati
Se hai modificato schema DB, architettura o URL, aggiorna anche CLAUDE.md.
Panoramica
NIS2 Agile e' una piattaforma SaaS multi-tenant per supportare le aziende nella compliance alla Direttiva NIS2 (EU 2022/2555) e al D.Lgs. 138/2024 italiano. Include AI integration (Claude API) per gap analysis, generazione policy, classificazione incidenti e suggerimenti rischi.
Target: PMI, Enterprise, Consulenti/CISO.
Stack Tecnologico
- Backend: PHP 8.4 vanilla (no framework, Front Controller pattern)
- Database: MySQL 8.x (nis2_agile_db)
- Frontend: HTML5/CSS3/JavaScript vanilla
- Auth: JWT HS256 (2h access + 7d refresh)
- AI: Anthropic Claude API (claude-sonnet-4-5-20250929)
- Server: Hetzner CPX31 (135.181.149.254)
- VCS: Gitea (git.certisource.it)
- URL Produzione: https://nis2.certisource.it/
Visibilita Cross-Project
agile-services (Read/Write BIDIREZIONALE)
IMPORTANTE: Questo progetto utilizza i microservizi condivisi di agile-services con accesso Read/Write bidirezionale.
Regole di integrazione
- Leggere SEMPRE
agile-services-istructio.mdnella root del progetto per capire come interagire con i servizi - Puoi leggere E modificare i file in agile-services (path locale:
c:\Projects\agile-services, path container:/projects/agile-services) - I servizi disponibili includono: vault, document, payment, certificate, subscription, billing, practice, company, supplier, investigation, whatsapp
- Le credenziali di accesso ai servizi sono documentate in
agile-services-istructio.md - Ogni nuovo servizio creato per NIS2 deve essere registrato anche in agile-services per essere riutilizzabile
- agile-services puo' leggere e modificare file di NIS2 — la visibilita e' bidirezionale
Accesso
- Path locale:
c:\Projects\agile-services - Path container:
/projects/agile-services(read-write) - File istruzioni:
./agile-services-istructio.md(nella root del progetto)
trpg.agile (Read-Only)
NIS2 puo' leggere il codice di TRPG Agile per riferimento e pattern, ma NON deve modificare nessun file.
- Path locale:
c:\Projects\trpg.agile - Permessi: SOLO LETTURA
- Scopo: Consultare pattern UI/UX, architettura frontend, convenzioni codice
- DIVIETO: NON modificare, NON creare, NON cancellare file in trpg.agile
lg231.agile (Read-Only)
NIS2 puo' leggere il codice di 231 Agile per riferimento e pattern, ma NON deve modificare nessun file.
- Path locale:
c:\Projects\lg231.agile - Permessi: SOLO LETTURA
- Scopo: Consultare architettura microservizi PHP/Slim 4, pattern multi-tenancy, struttura database
- DIVIETO: NON modificare, NON creare, NON cancellare file in lg231.agile
sustainai.agile (Read-Only)
NIS2 puo' leggere il codice di SustainAI Agile per riferimento e pattern, ma NON deve modificare nessun file.
- Path locale:
c:\Projects\sustainai.agile - Permessi: SOLO LETTURA
- Scopo: Consultare pattern UI/UX (identico a NIS2), struttura frontend, convenzioni CSS/JS
- DIVIETO: NON modificare, NON creare, NON cancellare file in sustainai.agile
Riepilogo Visibilita
| Progetto | Permesso | Direzione |
|---|---|---|
| agile-services | Read/Write | Bidirezionale (NIS2 <-> agile-services) |
| trpg.agile | Read-Only | NIS2 -> trpg (solo lettura) |
| lg231.agile | Read-Only | NIS2 -> lg231 (solo lettura) |
| sustainai.agile | Read-Only | NIS2 -> sustainai (solo lettura) |
REGOLA: Non accedere MAI a progetti non elencati in questa tabella. Nel dubbio, chiedere all'utente.
Regola Fondamentale
Il progetto NIS2 Agile e' COMPLETAMENTE ISOLATO dagli altri applicativi (CertiSource, AGILE_DFM). Database dedicato, utente dedicato, path dedicati. Non condividere MAI credenziali tra applicativi.
Struttura Progetto
nis2.agile/
├── CLAUDE.md # Questo file
├── .env # Variabili ambiente (NON committare)
├── .gitignore
├── application/
│ ├── config/
│ │ ├── config.php # Costanti app, CORS, JWT, AI, rate limiting
│ │ ├── database.php # Classe Database (PDO singleton)
│ │ └── env.php # Caricamento .env
│ ├── controllers/ # 15 controller (tutti implementati 100%)
│ │ ├── BaseController.php # Auth JWT, multi-tenancy, JSON responses (576 righe)
│ │ ├── AdminController.php # Gestione piattaforma (super_admin)
│ │ ├── AssessmentController.php # Gap analysis e questionari NIS2 (80 domande)
│ │ ├── AssetController.php # Inventario asset e dipendenze
│ │ ├── AuditController.php # Controlli, evidenze, report, export CSV
│ │ ├── AuthController.php # Login, register, JWT, rate limiting
│ │ ├── DashboardController.php # Overview, score, deadlines, heatmap
│ │ ├── IncidentController.php # Incidenti Art.23 (24h/72h/30d) + email
│ │ ├── NonConformityController.php# NCR/CAPA non-conformità e azioni correttive
│ │ ├── OnboardingController.php # Wizard onboarding con visura/CertiSource
│ │ ├── OrganizationController.php # CRUD org, membri, classificazione NIS2
│ │ ├── PolicyController.php # Policy, approvazione, AI generation
│ │ ├── RiskController.php # Risk register, trattamenti, matrice, AI suggest
│ │ ├── SupplyChainController.php # Fornitori, valutazione, risk overview
│ │ └── TrainingController.php # Corsi, assegnazioni, compliance formativa
│ ├── services/ # 5 servizi
│ │ ├── AIService.php # Anthropic Claude API (gap, risk, policy, incident)
│ │ ├── EmailService.php # Email CSIRT, training, welcome, invite
│ │ ├── RateLimitService.php # Rate limiting file-based
│ │ ├── ReportService.php # Report esecutivo HTML, export CSV
│ │ └── VisuraService.php # AI extraction PDF visura + CertiSource API
│ ├── models/ # (vuoto - logica nei controller)
│ └── data/
│ └── nis2_questionnaire.json # 80 domande gap analysis (10 categorie Art.21)
├── public/
│ ├── index.php # Front Controller / Router
│ ├── .htaccess # Rewrite rules + Authorization header
│ ├── api-status.php # Health check
│ ├── index.html # Landing page
│ ├── login.html # Login
│ ├── register.html # Registrazione
│ ├── onboarding.html # Wizard 5-step (visura/CertiSource/manuale)
│ ├── setup-org.html # Setup org (legacy, ora usa onboarding.html)
│ ├── dashboard.html # Dashboard principale
│ ├── assessment.html # Gap analysis wizard
│ ├── risks.html # Risk management + matrice 5x5
│ ├── incidents.html # Gestione incidenti Art.23
│ ├── policies.html # Policy management + AI generate
│ ├── supply-chain.html # Fornitori + assessment sicurezza
│ ├── training.html # Formazione + assegnazioni
│ ├── assets.html # Inventario asset
│ ├── reports.html # Report compliance + audit log
│ ├── settings.html # Impostazioni org/profilo/membri
│ ├── companies.html # Gestione aziende (consulente)
│ ├── architecture.html # Pagina architettura sistema
│ ├── admin/
│ │ ├── index.html # Admin dashboard
│ │ ├── organizations.html # Gestione organizzazioni
│ │ └── users.html # Gestione utenti
│ ├── css/
│ │ └── style.css # CSS principale (~1600 righe)
│ ├── js/
│ │ ├── api.js # Client API (270 righe, tutti gli endpoint)
│ │ ├── common.js # Utility condivise (sidebar, notifiche, etc.)
│ │ ├── i18n.js # Internazionalizzazione IT/EN
│ │ └── help.js # Help contestuale online
│ └── uploads/ # Upload directory (gitignored)
│ └── visure/ # PDF visure camerali
├── docker/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ └── php.ini
└── docs/
├── sql/
│ ├── 001_initial_schema.sql # Schema DB completo (20 tabelle)
│ ├── 002_email_log.sql # Tabella email_log
│ ├── 003_voluntary_compliance.sql # ALTER organizations: voluntary_compliance
│ ├── 004_ncr_capa.sql # Tabelle non_conformities, corrective_actions
│ ├── 005_consultant_support.sql # ALTER user_organizations: ruolo consultant
│ └── 006_security_improvements.sql # Indici performance + soft delete + trigger audit immutabile
├── context/
│ └── CONTEXT_SCHEMA_DB.md
├── prompts/
└── credentials/
├── credentials.md
└── hetzner_key # SSH key per Hetzner
Multi-Tenancy
- Ogni tabella dati ha
organization_id - Header
X-Organization-Idper selezionare org attiva - Ruoli:
super_admin,org_admin,compliance_manager,board_member,auditor,employee,consultant requireOrgAccess()in BaseController verifica membership- Super admin bypassa tutti i controlli di membership
Flusso Utente
- Registrazione → redirect a
onboarding.html - Onboarding (5 step): Scelta metodo → Visura/CertiSource/Manuale → Dati aziendali → Profilo → Classificazione NIS2
- Login → se ha org →
dashboard.html, altrimenti →onboarding.html - Dashboard → navigazione sidebar a tutti i moduli
Database (22 tabelle)
organizations, users, user_organizations, refresh_tokens, assessments, assessment_responses, risks, risk_treatments, incidents, incident_timeline, policies, suppliers, training_courses, training_assignments, assets, compliance_controls, evidence_files, audit_logs, ai_interactions, email_log, non_conformities, corrective_actions
Schema: docs/sql/ (6 migrazioni: 001→006)
Servizi
AIService.php
analyzeGapAssessment()- Analisi assessment con raccomandazionisuggestRisks()- Suggerimenti rischi per settore/assetgeneratePolicy()- Generazione bozze policy NIS2classifyIncident()- Classificazione e severity incidenti- Modello: claude-sonnet-4-5-20250929, API: https://api.anthropic.com/v1/messages
EmailService.php
- Notifiche CSIRT: early warning 24h, notification 72h, final report 30d
- Training assignment e reminder
- Welcome email, member invite
- Template HTML professionale con branding NIS2 Agile
RateLimitService.php
- File-based (/tmp/nis2_ratelimit/)
- Login: 5/min, 20/h | Register: 3/10min | AI: 10/min, 100/h
ReportService.php
- Report esecutivo HTML (stampabile come PDF)
- Export CSV: rischi, incidenti, controlli, asset (separatore ;, BOM UTF-8)
VisuraService.php
- Estrazione AI da PDF visura camerale (Claude con document type)
- Fetch dati da CertiSource API (GET /api/company/enrich?vat=)
- Mapping ATECO → settore NIS2
Deploy
- SSH:
ssh -i docs/credentials/hetzner_key root@135.181.149.254 - Path server:
/var/www/nis2-agile/ - Apache config:
/etc/apache2/conf-available/nis2-agile.conf(Alias /nis2) - Deploy:
cd /var/www/nis2-agile && git pull origin main - DB: Vedi
docs/DB_ACCESS.mdper credenziali (password in.env)
Git
- Repository: https://git.certisource.it/AdminGit2026/nis2-agile
- Token Gitea: Configurato in git credential manager (non documentare qui)
- Branch: main
- Commit format:
[AREA] Descrizione
Cronologia Commit
7080695 [FEAT] Ruolo Consulente + Wizard Registrazione v2
ba21534 [DEPLOY] Migrazione a subdomain nis2.certisource.it
92f9366 Merge branch 'main'
d3eac7c [CORE] Rimosso credenziali da CLAUDE.md + aggiunto docs/DB_ACCESS.md
a0fd543 [CORE] Aggiunto settings Claude Code con permessi ampi
0a73983 [FIX] Dockerignore: allow docker/php.ini for build context
4bd2326 [CORE] Aggiunto integrazione agile-services
52fd45f [FEAT] i18n IT/EN, Help Online contestuale, pagina Architettura
4e3408e [FEAT] Visura auto-fill, adesione volontaria, modulo NCR/CAPA
517cab7 [FIX] Fix annual_turnover field name in setup-org.html
68f8cab [POLISH] Docker setup fix + UI polish + project completion
bcc5a2b [FIX] E2E testing - fix router, EmailService, frontend data mapping
API Endpoints Completi
Base: /api/{controller}/{action}/{id?} (su subdomain https://nis2.certisource.it/)
Auth: POST register, login, logout, refresh, change-password | GET me | PUT profile
Organizations: POST create, classify | GET current, list, {id}/members | PUT {id} | POST {id}/invite | DELETE {id}/members/{sid}
Assessments: GET list, {id}, {id}/questions, {id}/report | POST create, {id}/respond, {id}/complete, {id}/ai-analyze | PUT {id}
Dashboard: GET overview, compliance-score, upcoming-deadlines, recent-activity, risk-heatmap
Risks: GET list, {id}, matrix | POST create, {id}/treatments, ai-suggest | PUT {id}, treatments/{sid} | DELETE {id}
Incidents: GET list, {id} | POST create, {id}/timeline, {id}/early-warning, {id}/notification, {id}/final-report, {id}/ai-classify | PUT {id}
Policies: GET list, {id}, templates | POST create, {id}/approve, ai-generate | PUT {id} | DELETE {id}
Supply Chain: GET list, {id}, risk-overview | POST create, {id}/assess | PUT {id} | DELETE {id}
Training: GET courses, assignments, compliance-status | POST courses, assign | PUT assignments/{sid}
Assets: GET list, {id}, dependency-map | POST create | PUT {id} | DELETE {id}
Audit: GET controls, evidence/list, report, logs, iso27001-mapping, executive-report, export | PUT controls/{sid} | POST evidence/upload
Onboarding: POST upload-visura, fetch-company, complete
Admin: GET organizations, users, stats
NCR/CAPA: GET list, {id}, stats | POST create, fromAssessment, {id}/capa, {id}/sync, webhook | PUT {id}, capa/{subId}
Stato Completamento
Tutti i moduli sono implementati e testati:
- Test end-to-end: tutti gli endpoint API verificati
- Bug fixing: router rewrite, EmailService parse fix, frontend data mapping
- Docker setup: Dockerfile, docker-compose.yml, nginx.conf, php.ini verificati
- UI polish: animazioni, skeleton loaders, mobile backdrop, print styles, a11y
Bug Risolti (E2E Testing)
- Router /{id}/subAction - Pattern matching riscritto completamente per gestire GET /assessments/1/questions, GET /organizations/2/members, etc.
- EmailService parse error - PHP non supporta
??dentro{$var}string interpolation, estratto a variabile - Frontend data mapping - Dashboard, Assessment, Onboarding avevano nomi campo diversi dal backend
- Field name mismatches - annual_turnover→annual_turnover_eur, question_id→question_code, compliance_level→response_value
Ultimo aggiornamento: 2026-02-20
Infrastruttura DevEnv
| Risorsa | Valore |
|---|---|
| Container | nis2-agile-devenv |
| IDE | https://certisource.it/dev-nis2-ide/ |
| API | https://certisource.it/dev-nis2-api/ |
| Browser | https://certisource.it/dev-nis2-browser/ |
| Porte | 8454 / 3046 / 3047 / 6091 |
| Password IDE | Nis2AgileDev2026! |
| Produzione | https://nis2.certisource.it/ |
Documentazione Commerciale
Standard grafici e workflow:
/opt/devenv/COMMERCIAL_STANDARDS.md
5 documenti per il catalogo Agent AI:
- Landing Page -
/opt/agent-ai/hub/landing/nis2-agile.html - Scheda Funzionale -
products.json -> detail.funzionale - Scheda Tecnica -
products.json -> detail.tecnica - Presentazione -
/opt/agent-ai/hub/presentations/nis2-agile.html - Link Demo -
products.json -> links.demo
REGOLA
SEMPRE chiedere conferma utente PRIMA di generare documenti commerciali.
REGOLA: Sincronizzazione CLAUDE.md
- Dopo QUALSIASI modifica a: URL produzione, dominio, porta, path, schema DB, architettura -> AGGIORNARE CLAUDE.md IMMEDIATAMENTE
- CLAUDE.md e la "single source of truth" del progetto
- A fine sessione: verificare che CLAUDE.md rifletta lo stato reale