From 92217897caab5b5b3b36e32deef8084e41093564 Mon Sep 17 00:00:00 2001 From: Luca Sacchi Ricciardi Date: Fri, 3 Apr 2026 17:07:35 +0200 Subject: [PATCH] fix: standardize project name to LogWhispererAI (no space) - Replace all occurrences of 'LogWhisperer AI' with 'LogWhispererAI' - Fix 47 instances across 30 files including: - Documentation (README, PRD, specs, docs) - Frontend components (Footer, Navbar, Hero, etc.) - Backend files (Dockerfile, server.js) - Workflow files (n8n, bash scripts) - Configuration files (AGENTS.md, LICENSE) Ensures consistent branding across the entire codebase. --- .env.example | 2 +- .opencode/agents/n8n_specialist_agent.md | 2 +- AGENTS.md | 2 +- LICENSE.md | 4 ++-- README.md | 2 +- docker-compose.yml | 2 +- docs/1.setup_procedure/agents.md | 6 +++--- docs/1.setup_procedure/setup.md | 2 +- docs/frontend_landing_plan.md | 2 +- docs/git-history.md | 6 +++--- docs/prd.md | 2 +- docs/prompt.project.manager.md | 2 +- docs/reviews/sprint1_review.md | 4 ++-- docs/roadmap_ideas.md | 4 ++-- docs/setup_config_archive.md | 2 +- docs/specs/ai_pipeline.md | 6 +++--- docs/sprint1_verification.md | 4 ++-- docs/tools_fake_backend.md | 2 +- frontend/Dockerfile.dev | 2 +- frontend/src/components/layout/Footer.tsx | 4 ++-- frontend/src/components/layout/Navbar.tsx | 4 ++-- frontend/src/components/sections/Hero.tsx | 2 +- frontend/src/components/sections/OnboardingWizard.tsx | 4 ++-- frontend/src/components/sections/ProblemSolution.tsx | 2 +- tools/fake-backend/Dockerfile | 2 +- tools/fake-backend/server.js | 8 ++++---- workflows/README.md | 2 +- workflows/REPORT.md | 2 +- workflows/logwhisperer_ingest.json | 2 +- workflows/test_workflow.sh | 4 ++-- 30 files changed, 47 insertions(+), 47 deletions(-) diff --git a/.env.example b/.env.example index f82a731..b4083ef 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -# LogWhisperer AI - Environment Variables +# LogWhispererAI - Environment Variables # Telegram Bot Configuration # Ottieni questi valori seguendo le istruzioni in docs/telegram_setup.md diff --git a/.opencode/agents/n8n_specialist_agent.md b/.opencode/agents/n8n_specialist_agent.md index 9b734ab..f24772e 100644 --- a/.opencode/agents/n8n_specialist_agent.md +++ b/.opencode/agents/n8n_specialist_agent.md @@ -7,7 +7,7 @@ read: true @n8n-specialist -Sei un esperto di automazione n8n. Il tuo compito è interfacciare LogWhisperer AI con l'istanza Docker su 192.168.254.12. +Sei un esperto di automazione n8n. Il tuo compito è interfacciare LogWhispererAI con l'istanza Docker su 192.168.254.12. Focus Operativo diff --git a/AGENTS.md b/AGENTS.md index 559bed5..39ed2ce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# LogWhisperer AI - Agent Rules +# LogWhispererAI - Agent Rules Regole operative per gli agenti AI che collaborano su questo progetto. diff --git a/LICENSE.md b/LICENSE.md index b5a6a0e..e42174a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -20,11 +20,11 @@ Nessuna Modifica: È vietato modificare, alterare, adattare, tradurre, decompila Uso Non Autorizzato: È vietato vendere, noleggiare, dare in locazione, concedere in licenza o utilizzare il software per scopi commerciali senza una licenza specifica rilasciata dall'autore. -Tutela del Marchio: I nomi "LogWhisperer AI", "Sacchi's Server Sentinel" e il "Metodo Sacchi" sono marchi e metodologie di proprietà dell'autore. +Tutela del Marchio: I nomi "LogWhispererAI", "Sacchi's Server Sentinel" e il "Metodo Sacchi" sono marchi e metodologie di proprietà dell'autore. Legge Applicabile e Foro Competente -Il presente accordo è regolato dalla legge italiana. Per qualsiasi controversia derivante dall'interpretazione, esecuzione o risoluzione della presente licenza e per ogni disputa relativa al progetto "LogWhisperer AI", sarà competente in via esclusiva il Foro di Milano, Italia. +Il presente accordo è regolato dalla legge italiana. Per qualsiasi controversia derivante dall'interpretazione, esecuzione o risoluzione della presente licenza e per ogni disputa relativa al progetto "LogWhispererAI", sarà competente in via esclusiva il Foro di Milano, Italia. Contatti diff --git a/README.md b/README.md index 9a8d1cf..db99c5f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ 🎯 Visione del Progetto -LogWhisperer AI trasforma i log di sistema e database spesso incomprensibili in alert azionabili descritti in "plain language". È pensato per piccole web agency e freelance che gestiscono infrastrutture (AWS, DigitalOcean, VPS) senza avere un sistemista senior dedicato. +LogWhispererAI trasforma i log di sistema e database spesso incomprensibili in alert azionabili descritti in "plain language". È pensato per piccole web agency e freelance che gestiscono infrastrutture (AWS, DigitalOcean, VPS) senza avere un sistemista senior dedicato. ## 🚀 Stato di Sviluppo diff --git a/docker-compose.yml b/docker-compose.yml index e7eadb9..d7accbc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -# Docker Compose - LogWhisperer AI Development Environment +# Docker Compose - LogWhispererAI Development Environment # Usage: docker compose up -d # Access Frontend: http://localhost:5173 # Access Fake Backend API: http://localhost:3000 diff --git a/docs/1.setup_procedure/agents.md b/docs/1.setup_procedure/agents.md index 8e69065..d6304c0 100644 --- a/docs/1.setup_procedure/agents.md +++ b/docs/1.setup_procedure/agents.md @@ -1,6 +1,6 @@ -# LogWhisperer AI - Agent Staff Catalog +# LogWhispererAI - Agent Staff Catalog -Catalogo completo degli agenti AI specializzati che collaborano sul progetto LogWhisperer AI. +Catalogo completo degli agenti AI specializzati che collaborano sul progetto LogWhispererAI. --- @@ -211,7 +211,7 @@ Mantiene aggiornata la documentazione e il changelog. Esperto in automazione e orchestrazione n8n. **Responsabilità:** -- Interfacciare LogWhisperer AI con l'istanza Docker su 192.168.254.12 +- Interfacciare LogWhispererAI con l'istanza Docker su 192.168.254.12 - Configurazione e testing dei Webhook di ricezione log - Monitorare esecuzioni per garantire applicazione "Metodo Sacchi" nei prompt LLM - Troubleshooting della connessione tra script Bash locale e API n8n diff --git a/docs/1.setup_procedure/setup.md b/docs/1.setup_procedure/setup.md index ba01fe0..fbf0daa 100644 --- a/docs/1.setup_procedure/setup.md +++ b/docs/1.setup_procedure/setup.md @@ -1,4 +1,4 @@ -Ottimo progetto. Per trasformare **LogWhisperer AI** in un prodotto reale in 4 giorni usando **OpenCode.ai**, dobbiamo configurare l'ambiente in modo che l'agente non si limiti a scrivere codice, ma agisca come un vero team di sviluppo (Tech Lead + Developer + QA). +Ottimo progetto. Per trasformare **LogWhispererAI** in un prodotto reale in 4 giorni usando **OpenCode.ai**, dobbiamo configurare l'ambiente in modo che l'agente non si limiti a scrivere codice, ma agisca come un vero team di sviluppo (Tech Lead + Developer + QA). Ecco come configurare OpenCode.ai seguendo la tua metodologia **Spec-Driven**, **TDD** e il **Metodo Sacchi**. diff --git a/docs/frontend_landing_plan.md b/docs/frontend_landing_plan.md index 1e5e559..6d3932f 100644 --- a/docs/frontend_landing_plan.md +++ b/docs/frontend_landing_plan.md @@ -1,6 +1,6 @@ # Piano d'Azione per lo Sviluppo della Landing Page -**Obiettivo:** Creare una landing page di alta qualità che comunichi efficacemente l'UVP di LogWhisperer AI e converta i visitatori in utenti attivi. +**Obiettivo:** Creare una landing page di alta qualità che comunichi efficacemente l'UVP di LogWhispererAI e converta i visitatori in utenti attivi. ## 🎯 UVP da Comunicare > *"Il DevOps tascabile che traduce i crash del tuo server e ti dice l'esatto comando per risolverli"* diff --git a/docs/git-history.md b/docs/git-history.md index 797c5ca..ed38c47 100644 --- a/docs/git-history.md +++ b/docs/git-history.md @@ -1,6 +1,6 @@ -# Git History - LogWhisperer AI +# Git History - LogWhispererAI -**Repository:** LogWhisperer AI +**Repository:** LogWhispererAI **Branch Principale:** `main` **Ultimo Aggiornamento:** 2026-04-02 **Commit Corrente:** `88cfe9a` @@ -18,7 +18,7 @@ ## Panoramica -Questo documento traccia la storia dei commit del progetto LogWhisperer AI. Viene aggiornato periodicamente per riflettere l'evoluzione del codebase. +Questo documento traccia la storia dei commit del progetto LogWhispererAI. Viene aggiornato periodicamente per riflettere l'evoluzione del codebase. ### Convenzioni di Commit diff --git a/docs/prd.md b/docs/prd.md index 49c44d1..779ed4c 100644 --- a/docs/prd.md +++ b/docs/prd.md @@ -1,5 +1,5 @@ # Product Requirements Document (PRD) - MVP -## Progetto: LogWhisperer AI (aka Sacchi's Server Sentinel) +## Progetto: LogWhispererAI (aka Sacchi's Server Sentinel) **Status:** 🟢 MVP Active Development - Sprint 1 Completed **Last Updated:** 2026-04-02 diff --git a/docs/prompt.project.manager.md b/docs/prompt.project.manager.md index 9e532d3..9e50b88 100644 --- a/docs/prompt.project.manager.md +++ b/docs/prompt.project.manager.md @@ -4,7 +4,7 @@ Here is the English translation: **PROMPT TO INSERT INTO THE AI:** -*"Act as a Tech Lead and Project Manager expert in Lean Startup and Micro-SaaS methodologies. I have provided you with the Product Requirements Document (PRD) for the 'LogWhisperer AI' project. +*"Act as a Tech Lead and Project Manager expert in Lean Startup and Micro-SaaS methodologies. I have provided you with the Product Requirements Document (PRD) for the 'LogWhispererAI' project. Our goal is to launch this MVP to market in just 4 days ('fail fast, fail cheap' approach) using No-Code/Low-Code logic wherever possible to save time. Your task is to analyze the PRD and generate a development strategy ('Spec-driven development') structured as follows:* diff --git a/docs/reviews/sprint1_review.md b/docs/reviews/sprint1_review.md index aab73f9..5f37bab 100644 --- a/docs/reviews/sprint1_review.md +++ b/docs/reviews/sprint1_review.md @@ -1,5 +1,5 @@ # Project Review - Sprint 1 -## LogWhisperer AI - Log Ingestion +## LogWhispererAI - Log Ingestion **Data Review:** 2026-04-02 **Sprint:** 1 - Log Ingestion Script @@ -430,7 +430,7 @@ Tutti i deliverable dello Sprint 1 sono stati prodotti e verificati con successo --- -**Review Condotta da:** Agent Staff LogWhisperer AI +**Review Condotta da:** Agent Staff LogWhispererAI **Data:** 2026-04-02 **Prossima Review:** Post-Sprint 2 diff --git a/docs/roadmap_ideas.md b/docs/roadmap_ideas.md index 13ab8a2..69ae56d 100644 --- a/docs/roadmap_ideas.md +++ b/docs/roadmap_ideas.md @@ -1,6 +1,6 @@ # Roadmap & Suggerimenti di Sviluppo -> **Documento Living** - Questo file raccoglie idee, suggerimenti e potenziali nuove funzionalità per LogWhisperer AI. +> **Documento Living** - Questo file raccoglie idee, suggerimenti e potenziali nuove funzionalità per LogWhispererAI. > > Ultimo aggiornamento: 2026-04-03 @@ -289,4 +289,4 @@ Hai un'idea? Aggiungila a questo documento seguendo il formato: --- -*Documento mantenuto dal team LogWhisperer AI* +*Documento mantenuto dal team LogWhispererAI* diff --git a/docs/setup_config_archive.md b/docs/setup_config_archive.md index bdd42b8..86bed7f 100644 --- a/docs/setup_config_archive.md +++ b/docs/setup_config_archive.md @@ -1,4 +1,4 @@ -# 🤖 Staff di Agenti AI - LogWhisperer AI +# 🤖 Staff di Agenti AI - LogWhispererAI Questo documento definisce i ruoli, le responsabilità e le configurazioni per i sotto-agenti da utilizzare in OpenCode.ai per garantire un workflow "Spec-Driven" e "Safety First". diff --git a/docs/specs/ai_pipeline.md b/docs/specs/ai_pipeline.md index f05c48c..49e87d6 100644 --- a/docs/specs/ai_pipeline.md +++ b/docs/specs/ai_pipeline.md @@ -10,7 +10,7 @@ ## 1. Overview ### 1.1 Scopo -L'AI Processing Pipeline è il cuore intelligente di LogWhisperer AI. Trasforma log grezzi di sistema in insight azionabili utilizzando OpenRouter per accedere a modelli AI (GPT-4o-mini) con fallback automatico e costi ottimizzati. +L'AI Processing Pipeline è il cuore intelligente di LogWhispererAI. Trasforma log grezzi di sistema in insight azionabili utilizzando OpenRouter per accedere a modelli AI (GPT-4o-mini) con fallback automatico e costi ottimizzati. ### 1.2 Flusso Dati @@ -56,7 +56,7 @@ Il prompt di sistema incorpora esplicitamente i tre pilastri del Metodo Sacchi: ### 2.2 System Prompt Completo ```javascript -const SYSTEM_PROMPT = `Sei LogWhisperer AI, un assistente DevOps esperto specializzato nell'analisi di log di sistema. +const SYSTEM_PROMPT = `Sei LogWhispererAI, un assistente DevOps esperto specializzato nell'analisi di log di sistema. ## MISSIONE Analizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro. @@ -305,7 +305,7 @@ const SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai'; const APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI'; // System Prompt (incollare qui il SYSTEM_PROMPT completo) -const SYSTEM_PROMPT = `Sei LogWhisperer AI...`; +const SYSTEM_PROMPT = `Sei LogWhispererAI...`; // Input dal nodo precedente const inputData = $input.first().json; diff --git a/docs/sprint1_verification.md b/docs/sprint1_verification.md index 9139bee..4cb8e9d 100644 --- a/docs/sprint1_verification.md +++ b/docs/sprint1_verification.md @@ -1,6 +1,6 @@ # Sprint 1 Verification Report -**Progetto:** LogWhisperer AI +**Progetto:** LogWhispererAI **Sprint:** 1 - Log Ingestion Script **Data Verifica:** 2026-04-02 **Verificatore:** OpenCode Agent @@ -38,7 +38,7 @@ ## 1. Overview -Questo documento certifica il completamento dello Sprint 1 del progetto LogWhisperer AI. Lo sprint aveva come obiettivo la creazione di uno script Bash per l'ingestion dei log di sistema, seguendo la metodologia TDD (Test-Driven Development) e il Metodo Sacchi. +Questo documento certifica il completamento dello Sprint 1 del progetto LogWhispererAI. Lo sprint aveva come obiettivo la creazione di uno script Bash per l'ingestion dei log di sistema, seguendo la metodologia TDD (Test-Driven Development) e il Metodo Sacchi. --- diff --git a/docs/tools_fake_backend.md b/docs/tools_fake_backend.md index dd8968e..7232a96 100644 --- a/docs/tools_fake_backend.md +++ b/docs/tools_fake_backend.md @@ -8,7 +8,7 @@ ## 📋 Descrizione -Il `fake-backend` è un server Node.js/Express che simula le risposte dell'API di LogWhisperer AI. È progettato per: +Il `fake-backend` è un server Node.js/Express che simula le risposte dell'API di LogWhispererAI. È progettato per: - **Sviluppo UI**: Testare l'interfaccia utente con risposte realistiche - **Demo offline**: Mostrare il prodotto senza connessione internet diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev index e311e53..d5f046a 100644 --- a/frontend/Dockerfile.dev +++ b/frontend/Dockerfile.dev @@ -1,4 +1,4 @@ -# Dockerfile.dev - Development container for LogWhisperer AI Frontend +# Dockerfile.dev - Development container for LogWhispererAI Frontend # Optimized for Node.js with Hot Module Replacement (HMR) FROM node:20-alpine diff --git a/frontend/src/components/layout/Footer.tsx b/frontend/src/components/layout/Footer.tsx index a4931e8..c4ecca7 100644 --- a/frontend/src/components/layout/Footer.tsx +++ b/frontend/src/components/layout/Footer.tsx @@ -53,7 +53,7 @@ export const Footer: React.FC = () => {
🌌 - LogWhisperer AI + LogWhispererAI

@@ -226,7 +226,7 @@ export const Footer: React.FC = () => {

- © {currentYear} LogWhisperer AI. Tutti i diritti riservati. + © {currentYear} LogWhispererAI. Tutti i diritti riservati.

Made with ❤️ by Luca Sacchi Ricciardi diff --git a/frontend/src/components/layout/Navbar.tsx b/frontend/src/components/layout/Navbar.tsx index 38940a6..83cc1d4 100644 --- a/frontend/src/components/layout/Navbar.tsx +++ b/frontend/src/components/layout/Navbar.tsx @@ -12,7 +12,7 @@ export const Navbar: React.FC = ({ onCtaClick }) => {

🌌 - LogWhisperer AI + LogWhispererAI
@@ -20,7 +20,7 @@ export const Navbar: React.FC = ({ onCtaClick }) => { diff --git a/frontend/src/components/sections/Hero.tsx b/frontend/src/components/sections/Hero.tsx index 349b91e..a003827 100644 --- a/frontend/src/components/sections/Hero.tsx +++ b/frontend/src/components/sections/Hero.tsx @@ -49,7 +49,7 @@ export const Hero: React.FC = ({ diff --git a/frontend/src/components/sections/OnboardingWizard.tsx b/frontend/src/components/sections/OnboardingWizard.tsx index 50c9edb..9557b72 100644 --- a/frontend/src/components/sections/OnboardingWizard.tsx +++ b/frontend/src/components/sections/OnboardingWizard.tsx @@ -94,7 +94,7 @@ export const OnboardingWizard: React.FC = ({ onComplete } Inizia in 3 semplici passi

- Configura LogWhisperer AI sul tuo server in meno di 5 minuti. + Configura LogWhispererAI sul tuo server in meno di 5 minuti.

@@ -145,7 +145,7 @@ export const OnboardingWizard: React.FC = ({ onComplete }

- Benvenuto su LogWhisperer AI + Benvenuto su LogWhispererAI

Il tuo assistente DevOps personale che monitora i log del server diff --git a/frontend/src/components/sections/ProblemSolution.tsx b/frontend/src/components/sections/ProblemSolution.tsx index c6b8d80..29b1a09 100644 --- a/frontend/src/components/sections/ProblemSolution.tsx +++ b/frontend/src/components/sections/ProblemSolution.tsx @@ -75,7 +75,7 @@ export const ProblemSolution: React.FC = () => { 🌌

-
LogWhisperer AI
+
LogWhispererAI
Ora
diff --git a/tools/fake-backend/Dockerfile b/tools/fake-backend/Dockerfile index dd56154..97f4d13 100644 --- a/tools/fake-backend/Dockerfile +++ b/tools/fake-backend/Dockerfile @@ -1,5 +1,5 @@ # Dockerfile for Fake Backend -# Development mock API server for LogWhisperer AI +# Development mock API server for LogWhispererAI FROM node:20-alpine diff --git a/tools/fake-backend/server.js b/tools/fake-backend/server.js index 9532cb5..73ff49f 100644 --- a/tools/fake-backend/server.js +++ b/tools/fake-backend/server.js @@ -1,10 +1,10 @@ /** - * Fake Backend Server for LogWhisperer AI + * Fake Backend Server for LogWhispererAI * * Simulates AI analysis responses for frontend development * without requiring real backend or OpenRouter API calls. * - * @author LogWhisperer AI Team + * @author LogWhispererAI Team * @version 1.0.0 */ @@ -180,7 +180,7 @@ app.get('/health', (req, res) => { */ app.get('/', (req, res) => { res.json({ - name: 'LogWhisperer AI - Fake Backend', + name: 'LogWhispererAI - Fake Backend', version: '1.0.0', description: 'Mock API server for frontend development', endpoints: { @@ -206,7 +206,7 @@ app.use((err, req, res, next) => { app.listen(PORT, () => { console.log(` ╔══════════════════════════════════════════════════════════════╗ -║ LogWhisperer AI - Fake Backend Server ║ +║ LogWhispererAI - Fake Backend Server ║ ║ ║ ║ 🚀 Server running on http://localhost:${PORT} ║ ║ 📖 Documentation: docs/tools_fake_backend.md ║ diff --git a/workflows/README.md b/workflows/README.md index 9301c3e..f75431d 100644 --- a/workflows/README.md +++ b/workflows/README.md @@ -1,4 +1,4 @@ -# LogWhisperer AI - Workflow n8n +# LogWhispererAI - Workflow n8n Workflow per l'ingestion sicura dei log con validazione HMAC-SHA256. diff --git a/workflows/REPORT.md b/workflows/REPORT.md index a4e9b46..6b1f76a 100644 --- a/workflows/REPORT.md +++ b/workflows/REPORT.md @@ -131,7 +131,7 @@ cd /home/google/Sources/LucaSacchiNet/LogWhispererAI # Output atteso: # ========================================== -# LogWhisperer AI - Workflow Test Suite +# LogWhispererAI - Workflow Test Suite # Target: http://192.168.254.12:5678 # ========================================== # diff --git a/workflows/logwhisperer_ingest.json b/workflows/logwhisperer_ingest.json index 433e1d9..bfef6a5 100644 --- a/workflows/logwhisperer_ingest.json +++ b/workflows/logwhisperer_ingest.json @@ -98,7 +98,7 @@ }, { "parameters": { - "jsCode": "// ============================================================================\n// n8n Code Node: OpenRouter Processor\n// ============================================================================\n// Input: JSON dal nodo precedente (log data)\n// Output: Oggetto con analisi AI o fallback\n// Provider: OpenRouter (accesso a 300+ modelli AI)\n\nconst OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';\nconst SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai';\nconst APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI';\n\n// System Prompt completo con Metodo Sacchi\nconst SYSTEM_PROMPT = `Sei LogWhisperer AI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.\n\n## MISSIONE\nAnalizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro.\n\n## PRINCIPI OBBLIGATORI (Metodo Sacchi)\n\n### 1. SAFETY FIRST - Sicurezza Prima di Tutto\nMAI suggerire comandi che possano:\n- Cancellare dati (rm, del, truncate senza backup)\n- Modificare configurazioni critiche senza verifica\n- Riavviare servizi in produzione senza warning\n- Eseguire operazioni irreversibili\n\nREGOLE DI SICUREZZA:\n- Preferisci SEMPRE comandi read-only (cat, grep, df, ps, etc.)\n- Se un comando potrebbe essere distruttivo, imposta \\\"sicuro\\\": false\n- Per operazioni rischiose, richiedi sempre conferma umana\n- Non assumere mai che l'utente sappia cosa sta facendo\n\n### 2. LITTLE OFTEN - Piccoli Passi Verificabili\n- Suggerisci UN solo comando alla volta\n- Ogni azione deve essere verificabile prima della prossima\n- Dividi problemi complessi in step incrementali\n- Preferisci diagnostica prima della mitigazione\n\n### 3. DOUBLE CHECK - Verifica le Ipotesi\n- Non assumere MAI il contesto senza verificarlo\n- Se mancano informazioni, chiedi chiarimenti (richiede_conferma: true)\n- Verifica sempre i presupposti prima di suggerire azioni\n- Se l'errore e' ambiguo, richiedi analisi manuale\n\n## FORMATO OUTPUT OBBLIGATORIO\n\nRispondi SEMPRE in formato JSON valido con questa struttura:\n\n{\n \\\"sintesi\\\": \\\"Descrizione breve e chiara del problema in italiano\\\",\n \\\"severita\\\": \\\"low|medium|critical\\\",\n \\\"comando\\\": \\\"Comando bash esatto per diagnostica/mitigazione (o null)\\\",\n \\\"sicuro\\\": true|false,\n \\\"note\\\": \\\"Istruzioni aggiuntive, link documentazione, o 'Nessuna nota aggiuntiva'\\\",\n \\\"richiede_conferma\\\": true|false\n}\n\n## REGOLE JSON\n\n1. \\\"sintesi\\\": Massimo 150 caratteri, linguaggio semplice\n2. \\\"severita\\\": \n - \\\"critical\\\": Servizio down, rischio data loss, security breach\n - \\\"medium\\\": Degradazione performance, warning spazio disco\n - \\\"low\\\": Messaggi informativi, warning minori\n3. \\\"comando\\\": \n - Deve essere copiabile e incollabile in terminale\n - Se incerto o rischioso, usa null\n - Preferisci diagnostica (ls, grep, df) a modifica (rm, kill)\n4. \\\"sicuro\\\": \n - true solo se comando e' read-only o sicuro al 100%\n - false se potenzialmente distruttivo\n5. \\\"note\\\": \n - Spiega il perche' del comando\n - Aggiungi link a documentazione rilevante\n - Suggerisci verifiche aggiuntive\n6. \\\"richiede_conferma\\\": \n - true se serve conferma umana prima di eseguire\n - true se il problema e' ambiguo o poco chiaro\n\n## ESEMPI\n\nLog: \\\"OutOfMemoryError: Java heap space\\\"\n{\n \\\"sintesi\\\": \\\"Applicazione Java ha esaurito la memoria heap\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"ps aux | grep java | head -5 && free -h\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica processi Java attivi e memoria disponibile. Se necessario, aumentare heap size in JVM options.\\\",\n \\\"richiede_conferma\\\": false\n}\n\nLog: \\\"Connection refused to database on port 5432\\\"\n{\n \\\"sintesi\\\": \\\"Impossibile connettersi al database PostgreSQL\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"sudo systemctl status postgresql && netstat -tlnp | grep 5432\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica stato del servizio PostgreSQL. Se stopped: 'sudo systemctl start postgresql'\\\",\n \\\"richiede_conferma\\\": true\n}\n\nLog: \\\"Disk space warning: /var at 85%\\\"\n{\n \\\"sintesi\\\": \\\"Spazio su disco in esaurimento (85% utilizzato)\\\",\n \\\"severita\\\": \\\"medium\\\",\n \\\"comando\\\": \\\"df -h /var && du -sh /var/log/* | sort -hr | head -10\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Identifica file di log piu' grandi. Per pulizia sicura: usa find per eliminare log vecchi.\\\",\n \\\"richiede_conferma\\\": false\n}\n\n## COMANDI PROIBITI (NON MAI SUGGERIRE)\n- rm -rf / o varianti\n- dd if=/dev/zero (sovrascrittura dischi)\n- mkfs, fdisk (formattazione)\n- kill -9 senza verifica processo\n- chmod 777 ricorsivo\n- Qualsiasi comando con pipe a sh/bash senza verifica\n\n## COMANDI PREFERITI (READ-ONLY)\n- Diagnostica: ps, top, htop, df, du, free, iostat, netstat, ss\n- Log: tail, head, grep, cat, less, journalctl\n- Rete: ping, curl, netstat, ss, lsof\n- Systemd: systemctl status, journalctl -u\n\nRICORDA: L'utente potrebbe essere non-tecnico. Spiega in italiano semplice.`;\n\n// Input dal nodo precedente\nconst inputData = $input.first().json;\n\n// Trunca raw_log se troppo lungo\nconst maxLogLength = 2000;\nconst truncatedLog = inputData.raw_log \n ? inputData.raw_log.substring(0, maxLogLength)\n : 'Nessun log fornito';\n\n// Prepara payload per OpenRouter\nconst payload = {\n model: \\\"openai/gpt-4o-mini\\\",\n messages: [\n {\n role: \\\"system\\\",\n content: SYSTEM_PROMPT\n },\n {\n role: \\\"user\\\",\n content: JSON.stringify({\n timestamp: inputData.timestamp,\n severity: inputData.severity,\n source: inputData.source,\n hostname: inputData.hostname,\n client_id: inputData.client_id,\n raw_log: truncatedLog\n })\n }\n ],\n temperature: 0.3,\n max_tokens: 500,\n response_format: { type: \\\"json_object\\\" },\n store: false\n};\n\n// Timeout configurazione\nconst TIMEOUT_MS = 10000;\n\nasync function callOpenRouter() {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);\n \n const response = await fetch(OPENROUTER_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + OPENROUTER_API_KEY,\n 'HTTP-Referer': SITE_URL,\n 'X-Title': APP_NAME\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n throw new Error('OpenRouter API error: ' + response.status + ' ' + response.statusText);\n }\n \n const data = await response.json();\n const aiResponse = JSON.parse(data.choices[0].message.content);\n \n // Aggiungi info modello usato (per tracking)\n const modelUsed = data.model || 'unknown';\n \n // Merge con dati originali\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: aiResponse,\n ai_status: 'success',\n ai_timestamp: new Date().toISOString(),\n ai_model: modelUsed\n }\n }];\n \n } catch (error) {\n console.error('OpenRouter Error:', error.message);\n \n // Fallback response\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: {\n sintesi: \\\"Errore durante analisi AI\\\",\n severita: inputData.severity || \\\"medium\\\",\n comando: null,\n sicuro: true,\n note: 'Fallback: ' + error.message + '. Controlla manualmente il log.',\n richiede_conferma: true\n },\n ai_status: 'fallback',\n ai_error: error.message,\n ai_timestamp: new Date().toISOString()\n }\n }];\n }\n}\n\n// Esegui chiamata\nreturn await callOpenRouter();" + "jsCode": "// ============================================================================\n// n8n Code Node: OpenRouter Processor\n// ============================================================================\n// Input: JSON dal nodo precedente (log data)\n// Output: Oggetto con analisi AI o fallback\n// Provider: OpenRouter (accesso a 300+ modelli AI)\n\nconst OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';\nconst SITE_URL = process.env.OPENROUTER_SITE_URL || 'https://logwhisperer.ai';\nconst APP_NAME = process.env.OPENROUTER_APP_NAME || 'LogWhispererAI';\n\n// System Prompt completo con Metodo Sacchi\nconst SYSTEM_PROMPT = `Sei LogWhispererAI, un assistente DevOps esperto specializzato nell'analisi di log di sistema.\n\n## MISSIONE\nAnalizza i log ricevuti e fornisci insight azionabili in italiano, semplice e chiaro.\n\n## PRINCIPI OBBLIGATORI (Metodo Sacchi)\n\n### 1. SAFETY FIRST - Sicurezza Prima di Tutto\nMAI suggerire comandi che possano:\n- Cancellare dati (rm, del, truncate senza backup)\n- Modificare configurazioni critiche senza verifica\n- Riavviare servizi in produzione senza warning\n- Eseguire operazioni irreversibili\n\nREGOLE DI SICUREZZA:\n- Preferisci SEMPRE comandi read-only (cat, grep, df, ps, etc.)\n- Se un comando potrebbe essere distruttivo, imposta \\\"sicuro\\\": false\n- Per operazioni rischiose, richiedi sempre conferma umana\n- Non assumere mai che l'utente sappia cosa sta facendo\n\n### 2. LITTLE OFTEN - Piccoli Passi Verificabili\n- Suggerisci UN solo comando alla volta\n- Ogni azione deve essere verificabile prima della prossima\n- Dividi problemi complessi in step incrementali\n- Preferisci diagnostica prima della mitigazione\n\n### 3. DOUBLE CHECK - Verifica le Ipotesi\n- Non assumere MAI il contesto senza verificarlo\n- Se mancano informazioni, chiedi chiarimenti (richiede_conferma: true)\n- Verifica sempre i presupposti prima di suggerire azioni\n- Se l'errore e' ambiguo, richiedi analisi manuale\n\n## FORMATO OUTPUT OBBLIGATORIO\n\nRispondi SEMPRE in formato JSON valido con questa struttura:\n\n{\n \\\"sintesi\\\": \\\"Descrizione breve e chiara del problema in italiano\\\",\n \\\"severita\\\": \\\"low|medium|critical\\\",\n \\\"comando\\\": \\\"Comando bash esatto per diagnostica/mitigazione (o null)\\\",\n \\\"sicuro\\\": true|false,\n \\\"note\\\": \\\"Istruzioni aggiuntive, link documentazione, o 'Nessuna nota aggiuntiva'\\\",\n \\\"richiede_conferma\\\": true|false\n}\n\n## REGOLE JSON\n\n1. \\\"sintesi\\\": Massimo 150 caratteri, linguaggio semplice\n2. \\\"severita\\\": \n - \\\"critical\\\": Servizio down, rischio data loss, security breach\n - \\\"medium\\\": Degradazione performance, warning spazio disco\n - \\\"low\\\": Messaggi informativi, warning minori\n3. \\\"comando\\\": \n - Deve essere copiabile e incollabile in terminale\n - Se incerto o rischioso, usa null\n - Preferisci diagnostica (ls, grep, df) a modifica (rm, kill)\n4. \\\"sicuro\\\": \n - true solo se comando e' read-only o sicuro al 100%\n - false se potenzialmente distruttivo\n5. \\\"note\\\": \n - Spiega il perche' del comando\n - Aggiungi link a documentazione rilevante\n - Suggerisci verifiche aggiuntive\n6. \\\"richiede_conferma\\\": \n - true se serve conferma umana prima di eseguire\n - true se il problema e' ambiguo o poco chiaro\n\n## ESEMPI\n\nLog: \\\"OutOfMemoryError: Java heap space\\\"\n{\n \\\"sintesi\\\": \\\"Applicazione Java ha esaurito la memoria heap\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"ps aux | grep java | head -5 && free -h\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica processi Java attivi e memoria disponibile. Se necessario, aumentare heap size in JVM options.\\\",\n \\\"richiede_conferma\\\": false\n}\n\nLog: \\\"Connection refused to database on port 5432\\\"\n{\n \\\"sintesi\\\": \\\"Impossibile connettersi al database PostgreSQL\\\",\n \\\"severita\\\": \\\"critical\\\",\n \\\"comando\\\": \\\"sudo systemctl status postgresql && netstat -tlnp | grep 5432\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Verifica stato del servizio PostgreSQL. Se stopped: 'sudo systemctl start postgresql'\\\",\n \\\"richiede_conferma\\\": true\n}\n\nLog: \\\"Disk space warning: /var at 85%\\\"\n{\n \\\"sintesi\\\": \\\"Spazio su disco in esaurimento (85% utilizzato)\\\",\n \\\"severita\\\": \\\"medium\\\",\n \\\"comando\\\": \\\"df -h /var && du -sh /var/log/* | sort -hr | head -10\\\",\n \\\"sicuro\\\": true,\n \\\"note\\\": \\\"Identifica file di log piu' grandi. Per pulizia sicura: usa find per eliminare log vecchi.\\\",\n \\\"richiede_conferma\\\": false\n}\n\n## COMANDI PROIBITI (NON MAI SUGGERIRE)\n- rm -rf / o varianti\n- dd if=/dev/zero (sovrascrittura dischi)\n- mkfs, fdisk (formattazione)\n- kill -9 senza verifica processo\n- chmod 777 ricorsivo\n- Qualsiasi comando con pipe a sh/bash senza verifica\n\n## COMANDI PREFERITI (READ-ONLY)\n- Diagnostica: ps, top, htop, df, du, free, iostat, netstat, ss\n- Log: tail, head, grep, cat, less, journalctl\n- Rete: ping, curl, netstat, ss, lsof\n- Systemd: systemctl status, journalctl -u\n\nRICORDA: L'utente potrebbe essere non-tecnico. Spiega in italiano semplice.`;\n\n// Input dal nodo precedente\nconst inputData = $input.first().json;\n\n// Trunca raw_log se troppo lungo\nconst maxLogLength = 2000;\nconst truncatedLog = inputData.raw_log \n ? inputData.raw_log.substring(0, maxLogLength)\n : 'Nessun log fornito';\n\n// Prepara payload per OpenRouter\nconst payload = {\n model: \\\"openai/gpt-4o-mini\\\",\n messages: [\n {\n role: \\\"system\\\",\n content: SYSTEM_PROMPT\n },\n {\n role: \\\"user\\\",\n content: JSON.stringify({\n timestamp: inputData.timestamp,\n severity: inputData.severity,\n source: inputData.source,\n hostname: inputData.hostname,\n client_id: inputData.client_id,\n raw_log: truncatedLog\n })\n }\n ],\n temperature: 0.3,\n max_tokens: 500,\n response_format: { type: \\\"json_object\\\" },\n store: false\n};\n\n// Timeout configurazione\nconst TIMEOUT_MS = 10000;\n\nasync function callOpenRouter() {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);\n \n const response = await fetch(OPENROUTER_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + OPENROUTER_API_KEY,\n 'HTTP-Referer': SITE_URL,\n 'X-Title': APP_NAME\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n throw new Error('OpenRouter API error: ' + response.status + ' ' + response.statusText);\n }\n \n const data = await response.json();\n const aiResponse = JSON.parse(data.choices[0].message.content);\n \n // Aggiungi info modello usato (per tracking)\n const modelUsed = data.model || 'unknown';\n \n // Merge con dati originali\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: aiResponse,\n ai_status: 'success',\n ai_timestamp: new Date().toISOString(),\n ai_model: modelUsed\n }\n }];\n \n } catch (error) {\n console.error('OpenRouter Error:', error.message);\n \n // Fallback response\n return [{\n json: {\n client_id: inputData.client_id,\n hostname: inputData.hostname,\n severity: inputData.severity,\n raw_log: inputData.raw_log,\n ai_analysis: {\n sintesi: \\\"Errore durante analisi AI\\\",\n severita: inputData.severity || \\\"medium\\\",\n comando: null,\n sicuro: true,\n note: 'Fallback: ' + error.message + '. Controlla manualmente il log.',\n richiede_conferma: true\n },\n ai_status: 'fallback',\n ai_error: error.message,\n ai_timestamp: new Date().toISOString()\n }\n }];\n }\n}\n\n// Esegui chiamata\nreturn await callOpenRouter();" }, "id": "openrouter-node", "name": "Call OpenRouter", diff --git a/workflows/test_workflow.sh b/workflows/test_workflow.sh index bb62ce0..ec235b9 100755 --- a/workflows/test_workflow.sh +++ b/workflows/test_workflow.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# LogWhisperer AI - Workflow Test Script +# LogWhispererAI - Workflow Test Script # Verifica che il workflow n8n risponda correttamente # @@ -205,7 +205,7 @@ EOF # Main main() { echo "==========================================" - echo "LogWhisperer AI - Workflow Test Suite" + echo "LogWhispererAI - Workflow Test Suite" echo "Target: ${N8N_URL}" echo "==========================================" echo ""