<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>openclaw - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/openclaw/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Fri, 22 May 2026 18:44:40 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>openclaw - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Come creare un tema WordPress attraverso OpenCode</title>
		<link>https://www.mrtux.it/come-creare-un-tema-wordpress-attraverso-opencode</link>
					<comments>https://www.mrtux.it/come-creare-un-tema-wordpress-attraverso-opencode#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Fri, 22 May 2026 18:33:31 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[codex]]></category>
		<category><![CDATA[creare tema wordpress]]></category>
		<category><![CDATA[openclaw]]></category>
		<category><![CDATA[opencode wordpress]]></category>
		<category><![CDATA[tema wordpress ai]]></category>
		<category><![CDATA[WordPress Development]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/?p=3401</guid>

					<description><![CDATA[Scopri come creare un tema WordPress personalizzato usando OpenCode, l'agente AI che automatizza il workflow dello sviluppatore WordPress, dalla struttura del progetto al codice pronto per il deploy.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Perché usare un agente AI per creare un tema WordPress</h2>


<p class="wp-block-paragraph">Creare un tema WordPress da zero richiede un workflow strutturato: definizione requisiti, configurazione ambiente, scrittura codice, test e manutenzione. OpenCode, l&#x27;agente AI sviluppato all&#x27;interno della piattaforma OpenClaw, automatizza ogni fase di questo processo, consentendoti di partire da un&#x27;idea e arrivare a un tema funzionante senza perdere tempo in operazioni ripetitive.</p>


<p class="wp-block-paragraph">Se vuoi approfondire come mrtux.it utilizza l&#x27;intelligenza artificiale per velocizzare lo sviluppo WordPress, abbiamo analizzato nel dettaglio il approccio AI-first per il web design nella nostra guida su <a href="https://mrtux.it/web-design-wordpress-novamira-ai" target="_self" rel="noopener" data-wpel-link="internal">web design WordPress con Novamira.ai</a>. Il principio è lo stesso: delegare la generazione boilerplate a un agente, concentrarsi sulla logica applicativa.</p>


<h2 class="wp-block-heading">Preparazione: requisiti e strumenti necessari</h2>


<p class="wp-block-paragraph">Prima di lanciare OpenCode, verifica di avere tutto il necessario. Un ambiente WordPress pulito, un editor serio (VS Code o PhpStorm), accesso FTP/SFTP al server, e una chiara definizione di cosa deve fare il tema.</p>


<p class="wp-block-paragraph">Ecco la lista organizzata per categorie:</p>



<figure class="wp-block-table"><table><thead><tr><th>Categoria</th><th>Strumento</th><th>Note</th></tr></thead><tbody><tr><td>CMS</td><td>WordPress 6.4+</td><td>PHP 8.2 consigliato</td></tr><tr><td>AI Agent</td><td>OpenCode (OpenClaw)</td><td>Configurato e autenticato</td></tr><tr><td>Ambiente</td><td>Local by Flywheel / Docker</td><td>Sviluppo locale</td></tr><tr><td>Editor</td><td>VS Code / PhpStorm</td><td>Con estensioni WordPress</td></tr><tr><td>Controllo</td><td>Git</td><td>Versionamento del tema</td></tr><tr><td>Debug</td><td>Query Monitor / WP_DEBUG</td><td>Verifica errori</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">WordPress.org mette a disposizione la <a href="https://developer.wordpress.org/themes/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">documentazione ufficiale sulla struttura dei temi</a>. È il riferimento primario prima di any altra fonte. Tienila aperta mentre lavori con OpenCode.</p>


<h2 class="wp-block-heading">Step 1 — Prompt strutturato: dall&#x27;idea al brief</h2>


<p class="wp-block-paragraph">Il primo comando che dai a OpenCode imposta il tono di tutto il progetto. Un prompt efficace specifica: funzionalità richieste, design di riferimento, breakpoint responsivi, eventuali plugin da supportare.</p>


<pre class="wp-block-code"><code># Esempio di prompt iniziale per OpenCode
/create-wordpress-theme name=mytheme domain=mytheme\ndescription=Tema custom per blog personale\nfeatures=post-grid,dark-mode,cookie-banner\nbreakpoints=mobile,tablet,desktop\nplugins=contact-form-7,yoast-seo</code></pre>


<p class="wp-block-paragraph">OpenCode analizza il brief, predispone la struttura cartelle e genera i file core del tema. Non è magia: è un modello linguistico addestrato sulla documentazione WordPress che risponde in modo contestuale.</p>


<h2 class="wp-block-heading">Step 2 — Struttura del tema WordPress</h2>


<p class="wp-block-paragraph">Un tema WordPress ben strutturato rispetta lo <a href="https://developer.wordpress.org/coding-standards/wordpress-coding-standards/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Standard di WordPress Coding</a>. OpenCode crea automaticamente lo scheletro:</p>


<pre class="wp-block-code"><code>mytheme/
├── style.css              # Header del tema (obbligatorio)
├── functions.php          # Hook, enqueue script, customizer
├── index.php              # Template fallback
├── header.php             # Sezione head e header
├── footer.php             # Footer e script finali
├── singular.php           # Singolo articolo / pagina
├── archive.php            # Lista post
├── search.php             # Risultati ricerca
├── 404.php                # Pagina errore
├── screenshot.png         # Anteprima tema (880×660px)
├── assets/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── main.js
│   └── images/
└── parts/
    ├── navbar.php
    ├── loop.php
    └── footer-content.php</code></pre>


<p class="wp-block-paragraph">Ogni file ha un ruolo preciso. OpenCode genera anche <code>theme.json</code> per il Full Site Editing (FSE) se il progetto lo richiede.</p>


<h2 class="wp-block-heading">Step 3 — Il cuore: functions.php e style.css</h2>


<p class="wp-block-paragraph">Questi due file sono il minimo sindacale per qualsiasi tema WordPress. OpenCode li produce contestualmente al prompt.</p>


<h3 class="wp-block-heading">style.css — Header del tema</h3>


<pre class="wp-block-code"><code>/*
Theme Name: MyTheme
Theme URI: https://example.com/mytheme
Author: Developer Name
Author URI: https://example.com
Description: Tema WordPress custom per blog personale, con dark mode e cookie banner.
Version: 1.0.0
Requires at least: 6.4
Tested up to: 6.6
Requires PHP: 8.2
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: mytheme
*/

/* === Reset &amp; Base === */
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, sans-serif; line-height: 1.6; }

/* === Layout === */
.site-container { max-width: 1200px; margin: 0 auto; padding: 0 1rem; }</code></pre>


<h3 class="wp-block-heading">functions.php — Setup e hook</h3>


<pre class="wp-block-code"><code>&lt;?php
/**
 * MyTheme functions and definitions
 * @link https://developer.wordpress.org/themes/basics/theme-functions/
 */

if ( ! defined( 'ABSPATH' ) ) exit;

/** === Enqueue Scripts e Styles === */
function mytheme_enqueue_assets() {
    wp_enqueue_style( 'mytheme-style', get_stylesheet_uri(), [], wp_get_theme()-&gt;get( 'Version' ) );
    wp_enqueue_script( 'mytheme-main', get_template_directory_uri() . '/assets/js/main.js', [], '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_assets' );

/** === Theme Support === */
function mytheme_setup() {
    add_theme_support( 'title-tag' );
    add_theme_support( 'automatic-feed-links' );
    add_theme_support( 'custom-logo' );
    add_theme_support( 'custom-header' );
    add_theme_support( 'custom-background' );
    add_theme_support( 'post-thumbnails' );
    add_theme_support( 'html5', [ 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' ] );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

/** === Register Nav Menus === */
function mytheme_menus() {
    register_nav_menus( [
        'primary'   =&gt; 'Primary Menu',
        'footer'    =&gt; 'Footer Menu',
        'mobile'    =&gt; 'Mobile Menu',
    ] );
}
add_action( 'init', 'mytheme_menus' );</code></pre>


<p class="wp-block-paragraph">Questi snippet sono generati direttamente da OpenCode, ma devi sempre verificare che rispettino lo standard PHP di WordPress e la vostra convenzione di progetto.</p>


<h2 class="wp-block-heading">Step 4 — WordPress Hook e comportamento runtime</h2>


<p class="wp-block-paragraph">OpenCode conosce la struttura dei <a href="https://developer.wordpress.org/plugins/hooks/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">hook WordPress</a> (actions e filters). Li utilizza per collegare le funzionalità al core di WordPress senza toccare il CMS.</p>


<pre class="wp-block-code"><code>&lt;?php
// Esempio: aggiungere meta description dinamico via filter hook
function mytheme_meta_description( $description ) {
    if ( is_single() ) {
        $post = get_post( get_queried_object_id() );
        $description = wp_trim_words( $post-&gt;post_content, 30, '...' );
    }
    return $description;
}
add_filter( 'rank_math/frontend/description', 'mytheme_meta_description' );</code></pre>


<p class="wp-block-paragraph">Questo è un pattern comune quando il tema deve integrarsi con plugin SEO come Rank Math. La forza di OpenCode sta nel proporre la struttura corretta del hook, ma sta a te validare che non crei conflitti con altri plugin attivi.</p>


<h2 class="wp-block-heading">Step 5 — Debug locale con WP-CLI e wp-config.php</h2>


<p class="wp-block-paragraph">Prima di qualsiasi test sul server remoto, lavora in locale. OpenCode può aiutarti anche qui.</p>


<pre class="wp-block-code"><code># Reset database WordPress in locale (da cartella tema)
wp db reset --yes

# Scaffold utente admin di test
wp user create admin admin@example.com --role=administrator --user_pass=password

# Attivare debug mode da linea di comando
WP_DEBUG=true wp theme activate mytheme

# Genera contenuto di test
wp scaffold post-template --title="Post di test" --count=20</code></pre>


<p class="wp-block-paragraph">Per attivare la modalità debug in locale, modifica <code>wp-config.php</code>:</p>


<pre class="wp-block-code"><code>// wp-config.php — Debug mode
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
define( 'SCRIPT_DEBUG', true );</code></pre>


<p class="wp-block-paragraph">Il file <code>wp-config.php</code> non fa parte del tema (è nella root di WordPress), ma è il primo posto dove guardare quando qualcosa non funziona dopo un&#x27;attivazione.</p>


<h2 class="wp-block-heading">Step 6 — Deploy: dal locale alla produzione</h2>


<p class="wp-block-paragraph">Quando il tema è testato e pronto, il deploy segue un flusso prevedibile:</p>


<ol class="wp-block-list"><li><strong>Esporta</strong> il tema localte tramite FPT o sincronizza via Git.</li><li><strong>Carica</strong> via FTP nella cartella <code>/wp-content/themes/mytheme/</code> sul server produzione.</li><li><strong>Attiva</strong> dal pannello WordPress: Aspetto → Temi.</li><li><strong>Verifica</strong> che tutti i plugin previsti siano installati e attivi.</li><li><strong>Query Monitor</strong> in produzione per confermare zero errori PHP o SQL.</li></ol>


<p class="wp-block-paragraph">Se il progetto usa GitHub Actions per il deploy automatico, OpenCode può generare anche la workflow YAML:</p>


<pre class="wp-block-code"><code># .github/workflows/deploy-theme.yml
name: Deploy Theme
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy via RSYNC
        uses: burnett01/rsync-deployments@6.0
        with:
          switches: -avzr --delete
          path: ./mytheme
          remote_path: /var/www/html/wp-content/themes/
          remote_host: ${{ secrets.SSH_HOST }}
          remote_user: ${{ secrets.SSH_USER }}
          remote_key: ${{ secrets.SSH_KEY }}</code></pre>


<p class="wp-block-paragraph">Questo approccio ti consente di pubblicare il tema su più ambienti senza toccare manualmente i file sul server. Se vuoi un esempio pratico di workflow automatizzato, consulta la <a href="https://github.com/WordPress/gutenberg/actions" target="_blank" rel="noopener nofollow external" data-wpel-link="external">repository GitHub di riferimento per lo sviluppo WordPress con CI/CD</a>.</p>


<h2 class="wp-block-heading">Manutenzione del tema WordPress</h2>


<p class="wp-block-paragraph">Un tema non finisce con il deploy. OpenCode ti accompagna anche nella fase di manutenzione, rispondendo a domande specifiche: aggiungere una nuova area widget, modificare un hook, aggiornare la compatibilità con una nuova versione di WordPress.</p>


<pre class="wp-block-code"><code># Chiedi a OpenCode di generare un template part aggiuntivo
/generate-theme-part name=newsletter-bar type=partial location=header\ncontent=Campo email con privacy checkbox</code></pre>


<p class="wp-block-paragraph">La manutenzione regolare include: controllo compatibilità con l&#x27;ultimo WordPress release, aggiornamento dipendenze JavaScript, revisione accessibilità (WCAG 2.1), e backup pre-aggiornamento.</p>


<p class="wp-block-paragraph">Per una panoramica completa su tutti gli strumenti AI disponibili per WordPress, incluidos quelli per la creazione e gestione di plugin, consulta la nostra guida completa su <a href="https://mrtux.it/web-design-wordpress-novamira-ai" target="_self" rel="noopener" data-wpel-link="internal">web design WordPress con Novamira.ai</a>, che copre l&#x27;intero ecosistema AI-powered per sviluppatori WordPress.</p>


<h2 class="wp-block-heading">FAQ — Domande frequenti sulla creazione di un tema WordPress con OpenCode</h2>


<p class="wp-block-paragraph"><strong>OpenCode sostituisce la conoscenza di PHP e WordPress?</strong> No. OpenCode accelera la scrittura del codice ripetitivo, ma devi saper verificare cosa genera. Un tema WordPress funzionante richiede comprensione di template hierarchy, hook system e customizer API. Senza queste basi, il debug diventa cieco.</p>


<p class="wp-block-paragraph"><strong>Posso creare un tema child con OpenCode?</strong> Sì. Fornisci il tema parent come riferimento e specifica le modifiche richieste. OpenCode genera il child theme con il minimo indispensabile: <code>style.css</code>, <code>functions.php</code> con <code>parent_theme</code> dichiarato, e eventuali template override.</p>


<p class="wp-block-paragraph"><strong>OpenCode supporta Full Site Editing e block theme?</strong> Sì. OpenCode può generare <code>theme.json</code> completo per il Full Site Editing e file <code>templates/*.html</code> basati su blocchi Gutenberg nativi. Tuttavia, per custom block complessi è ancora necessario scrivere JavaScript/React.</p>


<p class="wp-block-paragraph"><strong>Come gestisco la sicurezza del tema generato?</strong> Ogni snippet che accetti da OpenCode deve passare un controllo: input sanitizzati con <code>sanitize_text_field()</code>, <code>esc_html()</code>, <code>esc_url()</code>, output escaping con <code>esc_html()</code> e <code>esc_attr()</code>. Non accettare mai codice che inserisce dati utente senza validazione.</p>


<p class="wp-block-paragraph"><strong>Quanto costa usare OpenCode per creare un tema?</strong> OpenCode è un agente AI basato su modello linguistico. I costi dipendono dal provider di OpenClaw configurato. Verifica i tuoi limiti con il comando <code>openclaw status</code> per evitare interruzioni durante la generazione di un tema complesso.</p>


<p class="wp-block-paragraph"><strong>Posso usare OpenCode con un team?</strong> Sì. Workflow consigliato: prompt iniziale condiviso, revisione del codice generato via pull request su Git, test su ambiente di staging prima del merge su produzione. OpenCode non sostituisce il processo di code review.</p>


<h2 class="wp-block-heading">Conclusione</h2>


<p class="wp-block-paragraph">Creare un tema WordPress con OpenCode non è un shortcut: è un workflow accelerato che richiede comunque competenza, verifica e manutenzione. Ma la differenza in termini di tempo è concreta. Dove prima scrivevi 20 file a mano, ora hai una base solida da revisionare e personalizzare.</p>


<p class="wp-block-paragraph">Il vantaggio competitivo reale sta nel fatto che OpenCode ti permette di iterare velocemente su prototipi funzionanti, testare idee di design, e concentrarti sulla logica applicativa che distingue il tuo lavoro da un tema predefinito.</p>


<p class="wp-block-paragraph"><strong>Prova adesso</strong>: lancia OpenCode e descrivi il tema che hai in mente. Dal primo prompt alla struttura completa in pochi minuti. Poi tocca a te affinare, testare e deployare.</p>


<p class="wp-block-paragraph">Hai già usato un agente AI per creare un tema WordPress? Racconta la tua esperienza nei commenti o contattaci per una consulenza sul tuo progetto specifico.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/come-creare-un-tema-wordpress-attraverso-opencode/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenClaw: Guida Completa, Configurazione e Creazione Skills</title>
		<link>https://www.mrtux.it/openclaw-guida-completa-configurazione-e-creazione-skills</link>
					<comments>https://www.mrtux.it/openclaw-guida-completa-configurazione-e-creazione-skills#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 17:54:43 +0000</pubDate>
				<category><![CDATA[Copywriting]]></category>
		<category><![CDATA[Intelligenza artificiale]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[openclaw]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/?p=3187</guid>

					<description><![CDATA[OpenClaw ha conquistato oltre 100.000 stelle su GitHub in meno di una settimana dal lancio, a gennaio 2026, diventando uno dei repository open-source in più rapida crescita della storia. Non si tratta di un semplice chatbot: è un agente AI personale che gira sul proprio hardware, agisce autonomamente e impara nuove abilità attraverso un sistema [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>OpenClaw</strong> ha conquistato oltre 100.000 stelle su GitHub in meno di una settimana dal lancio, a gennaio 2026, diventando uno dei repository open-source in più rapida crescita della storia. Non si tratta di un semplice chatbot: è un <strong>agente AI personale</strong> che gira sul proprio hardware, agisce autonomamente e impara nuove abilità attraverso un sistema di skill modulari.</p>
<p>Questa guida copre tutto — dall'installazione alla configurazione avanzata — con tre esempi pratici di skill pronti all'uso, inclusa una che <strong>pubblica automaticamente articoli giornalistici su WordPress</strong> tramite WP-CLI.</p>
<h2>1. Cos'è OpenClaw e come funziona</h2>
<p>OpenClaw (precedentemente noto come MoltBot e ClawdBot) è un framework open-source per agenti AI personali, progettato per girare direttamente sul proprio hardware. A differenza degli assistenti AI tradizionali, non si limita a rispondere a domande: <strong>agisce, esegue comandi, automatizza flussi di lavoro</strong> e impara nuove abilità in modo autonomo.</p>
<p>Creato da Peter Steinberger (fondatore di PSPDFKit), il progetto si basa su tre principi fondamentali:</p>
<ul>
<li><strong>Local-first</strong> — tutti i dati, la memoria e le configurazioni risiedono sul proprio machine, senza dipendenza da servizi cloud.</li>
<li><strong>Model-agnostic</strong> — supporta Claude (Anthropic), GPT-4, Gemini, Llama e qualsiasi modello compatibile con l'API OpenAI.</li>
<li><strong>Community-extensible</strong> — le Skill sono file <code>SKILL.md</code> portabili, condivisibili e installabili dal marketplace <strong>ClawHub</strong>.</li>
</ul>
<h3>Il Loop dell'Agente</h3>
<p>Quando si lancia <code>openclaw gateway</code>, si avvia un singolo processo Node.js che gestisce tutto: canali di messaggistica, sessioni, chiamate al modello, esecuzione degli strumenti e persistenza della memoria. Il ciclo agentico si compone di quattro fasi:</p>
<ol>
<li><strong>Perceive</strong> — riceve un input (comando utente, evento cron, webhook, heartbeat).</li>
<li><strong>Plan</strong> — l'LLM analizza il contesto, la memoria e le skill disponibili.</li>
<li><strong>Act</strong> — esegue strumenti: shell, browser, web fetch, file system, API.</li>
<li><strong>Reflect</strong> — aggiorna la memoria, notifica l'utente e attende il prossimo ciclo.</li>
</ol>
<h3>Dove si posiziona rispetto ad altri strumenti</h3>
<p>Gli LLM puri (ChatGPT, Claude) sono intelligenti ma non agiscono. Gli strumenti di automazione (n8n, Make, Zapier) agiscono ma richiedono configurazione esplicita. OpenClaw unisce entrambi: l'LLM decide cosa fare, il Gateway lo esegue.</p>
<hr />
<h2>2. Installazione</h2>
<h3>Requisiti di sistema</h3>
<table>
<thead>
<tr>
<th>Componente</th>
<th>Requisito</th>
</tr>
</thead>
<tbody>
<tr>
<td>Node.js</td>
<td>≥ 22.x (LTS raccomandato)</td>
</tr>
<tr>
<td>npm/pnpm</td>
<td>npm ≥ 10 o pnpm ≥ 9</td>
</tr>
<tr>
<td>OS</td>
<td>macOS, Linux, Windows (WSL2)</td>
</tr>
<tr>
<td>RAM</td>
<td>Minimo 2 GB (4 GB+ raccomandati)</td>
</tr>
<tr>
<td>Disco</td>
<td>~500 MB per l'installazione base</td>
</tr>
</tbody>
</table>
<h3>Installazione via npm</h3>
<pre><code class="language-bash">npm install -g openclaw@latest</code></pre>
<p>In alternativa con pnpm:</p>
<pre><code class="language-bash">pnpm add -g openclaw@latest</code></pre>
<p>Verifica l'installazione:</p>
<pre><code class="language-bash">openclaw --version</code></pre>
<h3>Installazione via script (Linux/macOS)</h3>
<pre><code class="language-bash">curl -fsSL https://clawd.bot/install.sh | bash</code></pre>
<blockquote>
<p>⚠️ <strong>Sicurezza</strong> — Prima di eseguire script via <code>curl</code>, esamina sempre il contenuto su <code>clawd.bot</code>. OpenClaw richiede permessi elevati sulla macchina.</p>
</blockquote>
<h3>Onboarding Wizard</h3>
<p>Dopo l'installazione, avvia il wizard interattivo:</p>
<pre><code class="language-bash">openclaw onboard --install-daemon</code></pre>
<p>Il flag <code>--install-daemon</code> installa il daemon di sistema (launchd su macOS, systemd su Linux) in modo che il Gateway rimanga sempre attivo in background. Il wizard configura: modello LLM, canale di messaggistica, workspace principale e prime skill.</p>
<h3>Verifica con Doctor</h3>
<pre><code class="language-bash">openclaw doctor</code></pre>
<p>Controlla: stato del daemon, API key configurate, permessi del workspace, policy DM, presenza di binari richiesti dalle skill attive.</p>
<hr />
<h2>3. Configurazione</h2>
<h3>Il file principale: <code>~/.openclaw/openclaw.json</code></h3>
<pre><code class="language-json">{
  &quot;agents&quot;: {
    &quot;defaults&quot;: {
      &quot;model&quot;: &quot;claude-opus-4-6&quot;,
      &quot;provider&quot;: &quot;anthropic&quot;,
      &quot;maxTokens&quot;: 8192
    }
  },
  &quot;gateway&quot;: {
    &quot;port&quot;: 18789,
    &quot;host&quot;: &quot;127.0.0.1&quot;
  },
  &quot;skills&quot;: {
    &quot;load&quot;: {
      &quot;extraDirs&quot;: [&quot;/path/to/custom/skills&quot;]
    }
  }
}</code></pre>
<h3>Configurazione dei Modelli LLM</h3>
<p>OpenClaw supporta qualsiasi provider compatibile OpenAI. I principali:</p>
<ul>
<li><strong>Anthropic (Claude)</strong> — raccomandato per resistenza all'injection e long-context</li>
<li><strong>OpenAI (GPT-4, GPT-4o)</strong></li>
<li><strong>Google (Gemini Flash, Gemini Pro)</strong></li>
<li><strong>Provider locali</strong> via Ollama o LM Studio</li>
</ul>
<p><strong>Esempio configurazione Anthropic:</strong></p>
<pre><code class="language-json">&quot;providers&quot;: {
  &quot;anthropic&quot;: {
    &quot;apiKey&quot;: &quot;sk-ant-...&quot;,
    &quot;defaultModel&quot;: &quot;claude-opus-4-6&quot;
  }
}</code></pre>
<p><strong>Failover automatico tra modelli:</strong></p>
<pre><code class="language-json">&quot;modelFailover&quot;: [
  &quot;claude-opus-4-6&quot;,
  &quot;claude-sonnet-4-6&quot;,
  &quot;gpt-4o&quot;
]</code></pre>
<blockquote>
<p>💡 <strong>Consiglio</strong> — Usa <code>claude-opus-4-6</code> per task complessi (ragionamento, coding, analisi) e Gemini Flash per task semplici (riassunti, lookup veloci). Puoi cambiare modello dal menu Telegram in qualsiasi momento.</p>
</blockquote>
<h3>Configurazione dei Canali</h3>
<p><strong>Telegram</strong> — il canale più semplice per iniziare. Crea un bot con @BotFather e ottieni il token:</p>
<pre><code class="language-json">&quot;channels&quot;: {
  &quot;telegram&quot;: {
    &quot;enabled&quot;: true,
    &quot;token&quot;: &quot;YOUR_BOT_TOKEN&quot;,
    &quot;ownerIds&quot;: [123456789]
  }
}</code></pre>
<p><strong>Slack</strong> — richiede una Slack App con permessi <code>chat:write</code>, <code>im:read</code>, <code>im:write</code>, <code>users:read</code>:</p>
<pre><code class="language-json">&quot;slack&quot;: {
  &quot;enabled&quot;: true,
  &quot;botToken&quot;: &quot;xoxb-...&quot;,
  &quot;signingSecret&quot;: &quot;...&quot;,
  &quot;appToken&quot;: &quot;xapp-...&quot;
}</code></pre>
<h3>Il file <code>soul.md</code></h3>
<p>Uno degli aspetti più potenti di OpenClaw è il file <code>soul.md</code> — la personalità e le istruzioni permanenti dell'agente. Si trova nel workspace principale e viene caricato come system prompt persistente:</p>
<pre><code class="language-markdown"># Il mio Assistente AI Personale

## Personalità
Sei un assistente professionale, preciso e proattivo. Parli italiano.
Anticipi le esigenze e proponi soluzioni prima di essere interrogato.

## Contesto
- Nome: Marco
- Professione: Giornalista digitale
- Sito WordPress: https://miosito.it
- Server: VPS Ubuntu 22.04

## Regole operative
1. Prima di eseguire comandi distruttivi, chiedi conferma.
2. Logga sempre le azioni importanti in ~/logs/agent.log
3. Avvisami su Telegram se qualcosa va storto.</code></pre>
<h3>Sicurezza — Best Practice</h3>
<ul>
<li>Non installare mai OpenClaw sull'account root di un server di produzione.</li>
<li>Usa VM o container dedicati per ambienti ad alto rischio.</li>
<li>Configura le <strong>Exec Approvals</strong> per i comandi shell pericolosi.</li>
<li>Imposta <strong>spending cap</strong> sul dashboard del provider LLM.</li>
<li>Esegui <code>openclaw doctor</code> regolarmente.</li>
</ul>
<blockquote>
<p>⚠️ <strong>Attenzione</strong> — Un agente in loop può consumare molti token rapidamente. Imposta sempre un limite mensile di spesa prima di avviare automazioni autonome.</p>
</blockquote>
<hr />
<h2>4. Il Sistema delle Skills</h2>
<h3>Cos'è una Skill</h3>
<p>Una skill in OpenClaw è una cartella contenente un file <code>SKILL.md</code> con frontmatter YAML e istruzioni in linguaggio naturale. Le skill insegnano all'agente come usare strumenti specifici, seguire procedure particolari o automatizzare task ricorrenti.</p>
<pre><code>my-skill/
  SKILL.md         # definizione principale
  scripts/         # script Python/Bash
  config.json      # configurazione opzionale</code></pre>
<h3>Anatomia di un <code>SKILL.md</code></h3>
<pre><code class="language-yaml">---
name: nome-skill
description: Descrizione breve che appare nel prompt dell&#039;agente
homepage: https://link-documentazione.com
user-invocable: true
disable-model-invocation: false
metadata:
  {&quot;openclaw&quot;: {
    &quot;emoji&quot;: &quot;🔧&quot;,
    &quot;requires&quot;: {
      &quot;bins&quot;: [&quot;wp&quot;, &quot;python3&quot;],
      &quot;env&quot;: [&quot;WP_SSH_HOST&quot;],
      &quot;config&quot;: [&quot;browser.enabled&quot;]
    }
  }}
---

# Istruzioni per l&#039;agente

Qui vanno le istruzioni dettagliate in linguaggio naturale.
L&#039;agente le leggerà e le seguirà per eseguire il task.</code></pre>
<h3>Posizioni e Precedenza</h3>
<p>OpenClaw carica le skill da tre posizioni, in ordine di precedenza:</p>
<ol>
<li><strong>Workspace skills</strong> — <code>&lt;workspace&gt;/skills</code> → priorità massima</li>
<li><strong>Managed/local skills</strong> — <code>~/.openclaw/skills</code> → condivise tra tutti gli agenti</li>
<li><strong>Bundled skills</strong> — incluse nell'installazione npm → priorità minima</li>
</ol>
<h3>ClawHub — Il Marketplace</h3>
<p><a href="https://clawhub.com" target="_blank" rel="noopener nofollow external" data-wpel-link="external">ClawHub</a> è il registry pubblico delle skill per OpenClaw. Comandi principali:</p>
<pre><code class="language-bash"># Cerca una skill
clawhub search wordpress

# Installa una skill nel workspace
clawhub install wordpress-publisher

# Aggiorna tutte le skill installate
clawhub update --all</code></pre>
<h3>Gating (Filtri al Caricamento)</h3>
<p>OpenClaw filtra le skill al caricamento in base ai requisiti dichiarati:</p>
<table>
<thead>
<tr>
<th>Campo</th>
<th>Comportamento</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>requires.bins</code></td>
<td>I binari devono essere presenti nel PATH</td>
</tr>
<tr>
<td><code>requires.env</code></td>
<td>Le variabili d'ambiente devono esistere</td>
</tr>
<tr>
<td><code>requires.config</code></td>
<td>I path di <code>openclaw.json</code> devono avere valori truthy</td>
</tr>
<tr>
<td><code>os</code></td>
<td>La skill si carica solo sugli OS specificati</td>
</tr>
</tbody>
</table>
<h3>Iniezione di Segreti nelle Skill</h3>
<pre><code class="language-json">&quot;skills&quot;: {
  &quot;entries&quot;: {
    &quot;my-wordpress-skill&quot;: {
      &quot;env&quot;: {
        &quot;WP_DB_PASS&quot;: &quot;secret123&quot;,
        &quot;UNSPLASH_KEY&quot;: &quot;your-api-key&quot;
      }
    }
  }
}</code></pre>
<hr />
<h2>5. Automazione: Cron, Heartbeat e Webhook</h2>
<h3>Cron Jobs</h3>
<pre><code class="language-json">&quot;cron&quot;: {
  &quot;jobs&quot;: [
    {
      &quot;id&quot;: &quot;morning-briefing&quot;,
      &quot;schedule&quot;: &quot;0 8 * * *&quot;,
      &quot;prompt&quot;: &quot;Prepara il briefing mattutino: meteo, news, calendario.&quot;,
      &quot;channel&quot;: &quot;telegram&quot;
    },
    {
      &quot;id&quot;: &quot;weekly-report&quot;,
      &quot;schedule&quot;: &quot;0 9 * * 1&quot;,
      &quot;prompt&quot;: &quot;Genera il report settimanale di analytics WordPress.&quot;,
      &quot;channel&quot;: &quot;slack&quot;
    }
  ]
}</code></pre>
<h3>Heartbeat (Ciclo Autonomo)</h3>
<pre><code class="language-json">&quot;heartbeat&quot;: {
  &quot;enabled&quot;: true,
  &quot;intervalMinutes&quot;: 60,
  &quot;prompt&quot;: &quot;Controlla se ci sono task pendenti, aggiorna la memoria, invia notifiche se necessario.&quot;
}</code></pre>
<blockquote>
<p>💡 <strong>Differenza chiave</strong> — Il <strong>Cron</strong> è per task schedulati a orari precisi. Il <strong>Heartbeat</strong> è per check periodici autonomi. In pratica: usa il Cron per <em>&quot;pubblica alle 9:00&quot;</em>, usa il Heartbeat per <em>&quot;controlla ogni ora se c'è qualcosa da fare&quot;</em>.</p>
</blockquote>
<h3>Webhook</h3>
<pre><code class="language-json">&quot;webhooks&quot;: {
  &quot;enabled&quot;: true,
  &quot;endpoints&quot;: [
    {
      &quot;path&quot;: &quot;/github-push&quot;,
      &quot;secret&quot;: &quot;your-webhook-secret&quot;,
      &quot;prompt&quot;: &quot;Un nuovo push su GitHub. Analizza le modifiche e aggiorna la documentazione.&quot;
    }
  ]
}</code></pre>
<hr />
<h2>6. Configurazione Multi-Agent</h2>
<p>OpenClaw supporta più agenti sullo stesso Gateway, ognuno con il proprio workspace, <code>soul.md</code>, set di skill e canale dedicato. Architettura ideale per:</p>
<ul>
<li>Separare agenti per ruolo (sviluppo, marketing, giornalismo)</li>
<li>Isolare gli ambienti per sicurezza (agente untrusted in sandbox Docker)</li>
<li>Condividere skill comuni tra agenti diversi</li>
</ul>
<p><strong>Routing dei canali:</strong></p>
<pre><code class="language-json">&quot;routing&quot;: {
  &quot;telegram&quot;: {
    &quot;workBot&quot;: &quot;agent-work&quot;,
    &quot;personalBot&quot;: &quot;agent-personal&quot;
  }
}</code></pre>
<hr />
<h2>7. Esempi di impostazione Skills OpenClaw</h2>
<hr />
<h3>Skill 1 — Web Scraper e Digest Quotidiano delle News</h3>
<p>Raccoglie automaticamente notizie da fonti RSS, le aggrega, applica un'analisi editoriale e invia un digest formattato su Telegram ogni mattina.</p>
<p><strong>Struttura della cartella:</strong></p>
<pre><code>~/.openclaw/skills/news-digest/
  SKILL.md
  scripts/
    fetch_rss.py
  sources.json</code></pre>
<p><strong>SKILL.md:</strong></p>
<pre><code class="language-yaml">---
name: news-digest
description: Raccoglie news da RSS, le aggrega e invia un digest quotidiano su Telegram
user-invocable: true
metadata:
  {&quot;openclaw&quot;: {
    &quot;emoji&quot;: &quot;📰&quot;,
    &quot;requires&quot;: {
      &quot;bins&quot;: [&quot;python3&quot;],
      &quot;env&quot;: [&quot;TELEGRAM_CHAT_ID&quot;]
    }
  }}
---

# Skill: News Digest Quotidiano

## Trigger
Eseguita automaticamente alle 7:30 via cron job, oppure con /news-digest.

## Procedura

1. Esegui: python3 {baseDir}/scripts/fetch_rss.py &gt; /tmp/raw_news.json

2. Per ogni notizia applica questa analisi:
   - Valuta la rilevanza (1-10): impatto, novità, interesse
   - Scrivi un riassunto di 2-3 righe in italiano
   - Assegna categoria: Tecnologia, Economia, Politica, Scienza, Altro

3. Seleziona le TOP 5 notizie per rilevanza.

4. Formatta il digest:
   🌅 *Buongiorno! Digest News — [DATA]*
   📌 *[TITOLO]*
   [RIASSUNTO]
   🔗 [LINK]

5. Invia su Telegram. Logga in ~/openclaw-logs/news-digest-[DATA].json</code></pre>
<p><strong>scripts/fetch_rss.py:</strong></p>
<pre><code class="language-python">#!/usr/bin/env python3
import json, feedparser
from datetime import datetime, timedelta

SOURCES = json.load(open(&#039;{baseDir}/sources.json&#039;))
articles = []

for src in SOURCES[&#039;feeds&#039;]:
    feed = feedparser.parse(src[&#039;url&#039;])
    for entry in feed.entries[:10]:
        articles.append({
            &#039;title&#039;: entry.get(&#039;title&#039;, &#039;&#039;),
            &#039;summary&#039;: entry.get(&#039;summary&#039;, &#039;&#039;)[:400],
            &#039;link&#039;: entry.get(&#039;link&#039;, &#039;&#039;),
            &#039;source&#039;: src[&#039;name&#039;]
        })

print(json.dumps(articles, ensure_ascii=False))</code></pre>
<p><strong>sources.json:</strong></p>
<pre><code class="language-json">{
  &quot;feeds&quot;: [
    {&quot;name&quot;: &quot;Ansa&quot;,     &quot;url&quot;: &quot;https://www.ansa.it/sito/notizie/tecnologia/tecnologia_rss.xml&quot;},
    {&quot;name&quot;: &quot;Wired IT&quot;, &quot;url&quot;: &quot;https://www.wired.it/feed/rss&quot;},
    {&quot;name&quot;: &quot;BBC Tech&quot;, &quot;url&quot;: &quot;https://feeds.bbci.co.uk/news/technology/rss.xml&quot;}
  ]
}</code></pre>
<p><strong>Configurazione cron:</strong></p>
<pre><code class="language-json">{
  &quot;cron&quot;: {
    &quot;jobs&quot;: [{
      &quot;id&quot;: &quot;morning-news&quot;,
      &quot;schedule&quot;: &quot;30 7 * * *&quot;,
      &quot;prompt&quot;: &quot;Esegui la skill news-digest e invia il digest mattutino.&quot;,
      &quot;channel&quot;: &quot;telegram&quot;
    }]
  }
}</code></pre>
<hr />
<h3>Skill 2 — Monitoraggio e Alert del Server</h3>
<p>Monitora periodicamente CPU, RAM, disco e servizi critici di un server Linux, inviando alert proattivi con diagnosi e azioni consigliate su Telegram.</p>
<p><strong>Struttura della cartella:</strong></p>
<pre><code>~/.openclaw/skills/server-monitor/
  SKILL.md
  scripts/
    check_metrics.sh
  thresholds.json</code></pre>
<p><strong>SKILL.md:</strong></p>
<pre><code class="language-yaml">---
name: server-monitor
description: Monitora CPU, RAM, disco e servizi del server con alert intelligenti su Telegram
user-invocable: true
metadata:
  {&quot;openclaw&quot;: {
    &quot;emoji&quot;: &quot;🖥️&quot;,
    &quot;requires&quot;: {
      &quot;bins&quot;: [&quot;df&quot;, &quot;free&quot;, &quot;top&quot;, &quot;systemctl&quot;, &quot;python3&quot;],
      &quot;env&quot;: [&quot;ALERT_TELEGRAM_CHAT_ID&quot;]
    },
    &quot;os&quot;: [&quot;linux&quot;]
  }}
---

# Skill: Server Monitor con Alert Intelligenti

## Esecuzione automatica
Gira ogni 15 minuti via heartbeat.

## Procedura

1. Raccogli metriche:
   bash {baseDir}/scripts/check_metrics.sh &gt; /tmp/metrics.txt

2. Confronta i valori con {baseDir}/thresholds.json

3. Determina la gravità:
   - WARNING (🟡): metrica tra 70% e 85% della soglia critica
   - CRITICAL (🔴): metrica sopra l&#039;85%

4. Genera alert con:
   - Metrica problematica e valore attuale
   - Diagnosi probabile (es. &quot;Possibile memory leak in nginx&quot;)
   - Azioni consigliate (comandi specifici)

5. In caso di CRITICAL, esegui automaticamente:
   sudo systemctl restart nginx (se nginx è coinvolto)
   Notifica l&#039;azione intrapresa.</code></pre>
<p><strong>scripts/check_metrics.sh:</strong></p>
<pre><code class="language-bash">#!/bin/bash
echo &quot;=== CPU ===&quot;
top -bn1 | grep &#039;Cpu(s)&#039; | awk &#039;{print $2}&#039; | cut -d&#039;%&#039; -f1

echo &quot;=== RAM ===&quot;
free -m | awk &#039;NR==2{printf &quot;%.1f\n&quot;, $3*100/$2}&#039;

echo &quot;=== DISCO ===&quot;
df -h / | awk &#039;NR==2{print $5}&#039; | tr -d &#039;%&#039;

echo &quot;=== SERVIZI ===&quot;
for svc in nginx mysql php8.2-fpm; do
  systemctl is-active $svc 2&gt;/dev/null &amp;&amp; echo &quot;$svc:OK&quot; || echo &quot;$svc:FAIL&quot;
done</code></pre>
<p><strong>thresholds.json:</strong></p>
<pre><code class="language-json">{
  &quot;cpu_warning&quot;: 70,
  &quot;cpu_critical&quot;: 90,
  &quot;ram_warning&quot;: 75,
  &quot;ram_critical&quot;: 90,
  &quot;disk_warning&quot;: 80,
  &quot;disk_critical&quot;: 95,
  &quot;services&quot;: [&quot;nginx&quot;, &quot;mysql&quot;, &quot;php8.2-fpm&quot;]
}</code></pre>
<blockquote>
<p>⚠️ <strong>Sicurezza</strong> — Configura <code>sudoers</code> per permettere solo i comandi specifici necessari (es. <code>systemctl restart nginx</code>) senza password, e mai con accesso root completo.</p>
</blockquote>
<hr />
<h3>Skill 3 — WordPress Remote News Publisher via SSH + WP-CLI</h3>
<blockquote>
<p><strong>Versione remota della Skill 3 originale.</strong><br />
Rispetto alla versione locale, questa skill non richiede WP-CLI installato sulla macchina che esegue OpenClaw: tutta l'interazione con WordPress avviene sul <strong>server remoto</strong> tramite connessione <strong>SSH con autenticazione automatica a chiave pubblica</strong>. Le immagini vengono scaricate e ottimizzate localmente, trasferite sul server via <code>scp</code>, e poi importate con <code>wp media import</code> eseguito in remoto.</p>
</blockquote>
<hr />
<h4>Struttura della cartella</h4>
<pre><code>~/.openclaw/skills/wp-remote-publisher/
  SKILL.md
  scripts/
    download_cover.py
    optimize_image.sh
    upload_media_remote.sh
    publish_wp_remote.sh
  config.json</code></pre>
<hr />
<h4>SKILL.md</h4>
<pre><code class="language-markdown">---
name: wp-remote-publisher
description: Genera e pubblica automaticamente articoli di news su WordPress remoto
            via SSH con autenticazione a chiave pubblica e WP-CLI installato sul server.
            Scarica e ottimizza immagini di copertina da Unsplash, le trasferisce via scp
            e pubblica con metadati SEO Yoast.
user-invocable: true
metadata:
  {&quot;openclaw&quot;: {
    &quot;emoji&quot;: &quot;📝&quot;,
    &quot;requires&quot;: {
      &quot;bins&quot;: [&quot;ssh&quot;, &quot;scp&quot;, &quot;python3&quot;, &quot;curl&quot;, &quot;convert&quot;],
      &quot;env&quot;: [
        &quot;WP_SSH_HOST&quot;,
        &quot;WP_SSH_USER&quot;,
        &quot;WP_SSH_KEY&quot;,
        &quot;WP_REMOTE_PATH&quot;,
        &quot;UNSPLASH_ACCESS_KEY&quot;,
        &quot;WP_AUTHOR_ID&quot;
      ]
    }
  }}
---

#### Skill: WordPress Remote News Publisher

#### IMPORTANTE — Filosofia Editoriale

Ogni articolo DEVE rispettare queste regole:
- Scrivi come un giornalista senior del settore, non come un AI.
- Usa frasi di lunghezza variabile. Alterna periodi brevi a costruzioni articolate.
- Inserisci una tesi editoriale chiara nel primo paragrafo (lede).
- Usa citazioni attribuite a fonti reali quando disponibili.
- EVITA: &quot;è importante notare&quot;, &quot;nell&#039;era digitale&quot;, &quot;nel mondo di oggi&quot;,
  &quot;in conclusione&quot;, &quot;ovviamente&quot;, &quot;chiaramente&quot;, qualsiasi formula AI.
- Il titolo deve essere specifico. Niente clickbait.

#### Variabili d&#039;ambiente richieste

| Variabile           | Descrizione                                             | Esempio                              |
|---------------------|---------------------------------------------------------|--------------------------------------|
| WP_SSH_HOST         | Hostname o IP del server remoto                         | `203.0.113.10` o `miosito.it`        |
| WP_SSH_USER         | Utente SSH sul server remoto                            | `ubuntu` / `www-data` / `deploy`     |
| WP_SSH_KEY          | Path assoluto alla chiave privata SSH locale            | `/home/user/.ssh/id_ed25519_wp`      |
| WP_SSH_PORT         | Porta SSH (default 22)                                  | `22`                                 |
| WP_REMOTE_PATH      | Path assoluto di WordPress sul server remoto            | `/var/www/html/wordpress`            |
| WP_REMOTE_TMP       | Cartella temporanea scrivibile sul server remoto        | `/tmp`                               |
| UNSPLASH_ACCESS_KEY | Access Key API Unsplash                                 | `AbC123...`                          |
| WP_AUTHOR_ID        | ID autore WordPress                                     | `1`                                  |

#### Trigger
Eseguita ogni giorno alle 10:00 e 16:00 (lun-ven) via cron job.
Invocabile manualmente con: /wp-remote-publisher [argomento]

---

#### Procedura Completa

#### FASE 1 — Selezione Argomento
Se non viene fornito un argomento:
1. Leggi {baseDir}/config.json per la lista di topic configurati.
2. Seleziona il topic con la pubblicazione più vecchia (round-robin).

#### FASE 2 — Verifica Connessione SSH
Prima di qualsiasi operazione, verifica che la connessione SSH funzioni:

  ssh -i $WP_SSH_KEY -p ${WP_SSH_PORT:-22} -o StrictHostKeyChecking=no \
      -o BatchMode=yes -o ConnectTimeout=10 \
      $WP_SSH_USER@$WP_SSH_HOST \
      &quot;wp --info --path=$WP_REMOTE_PATH&quot; 2&gt;&amp;1

Se il comando fallisce, interrompi e notifica l&#039;errore su Telegram.

#### FASE 3 — Ricerca e Raccolta Fatti
1. Cerca via web: &quot;[argomento] ultime notizie [mese corrente]&quot;
   Cerca anche in inglese per fonti internazionali.

2. Raccogli SOLO fatti verificabili:
   - Dati numerici con fonte
   - Dichiarazioni di persone reali con nome e ruolo
   - Date ed eventi specifici
   - Evita speculazioni non attribuite

3. Salva i fatti in /tmp/wp_facts.json

#### FASE 4 — Generazione Articolo con Stile Giornalistico

Struttura editoriale obbligatoria:

**TITOLO** (max 65 caratteri)
- Specifico, non generico. Contiene il fatto principale.
- Buono:  &quot;Meta taglia 3.600 posti: addio ai team AI di Base&quot;
- Cattivo: &quot;Meta compie un passo importante per il futuro&quot;

**LEDE** (primo paragrafo, 40-60 parole)
- Risponde a: Chi? Cosa? Quando? Dove? Perché?
- È la notizia più importante in forma densa e precisa.
- Non inizia mai con &quot;Nel mondo di...&quot; o &quot;Negli ultimi anni...&quot;

**CORPO** (600-900 parole totali)
- Paragrafo 2: contesto e background
- Paragrafo 3-4: sviluppo principale con dati e citazioni
- Paragrafo 5: reazioni e posizioni dei protagonisti
- Paragrafo 6: implicazioni e prospettive (attribuite a esperti)
- Paragrafo finale: elemento che chiude il cerchio narrativo

**META DESCRIPTION** (max 155 caratteri)
**TAG SEO** (3-5 tag, senza #)
**KEYWORD PRINCIPALE** (1 keyword)

Salva in /tmp/wp_article.json:
{
  &quot;title&quot;: &quot;...&quot;,
  &quot;content&quot;: &quot;...&quot;,
  &quot;excerpt&quot;: &quot;...&quot;,
  &quot;tags&quot;: [&quot;...&quot;],
  &quot;meta_desc&quot;: &quot;...&quot;,
  &quot;keyword&quot;: &quot;...&quot;,
  &quot;topic&quot;: &quot;...&quot;
}

#### FASE 5 — Immagine di Copertina
1. Determina una keyword visiva (es. &quot;server room technology&quot;).
2. Scarica da Unsplash LOCALMENTE:
   python3 {baseDir}/scripts/download_cover.py &#039;[keyword]&#039; /tmp/cover.jpg
3. Ottimizza localmente:
   bash {baseDir}/scripts/optimize_image.sh /tmp/cover.jpg /tmp/cover_opt.jpg
4. Trasferisci sul server remoto e importa in WordPress:
   bash {baseDir}/scripts/upload_media_remote.sh /tmp/cover_opt.jpg
   → ID salvato in /tmp/wp_media_id.txt

#### FASE 6 — Pubblicazione su WordPress Remoto
1. Esegui: bash {baseDir}/scripts/publish_wp_remote.sh
2. Post creato come draft. Aspetta 30 secondi, verifica lo stato via SSH.
3. Se OK, pubblica:
   ssh -i $WP_SSH_KEY -p ${WP_SSH_PORT:-22} $WP_SSH_USER@$WP_SSH_HOST \
     &quot;wp post update $(cat /tmp/wp_post_id.txt) \
      --post_status=publish --path=$WP_REMOTE_PATH&quot;
4. Recupera l&#039;URL del post pubblicato:
   ssh -i $WP_SSH_KEY -p ${WP_SSH_PORT:-22} $WP_SSH_USER@$WP_SSH_HOST \
     &quot;wp post get $(cat /tmp/wp_post_id.txt) --field=url --path=$WP_REMOTE_PATH&quot;
5. Invia conferma su Telegram con titolo, URL, parole, keyword.

#### FASE 7 — Aggiornamento Registro
Aggiorna {baseDir}/config.json segnando il topic come
&quot;ultimo pubblicato&quot; con timestamp per garantire la rotazione.</code></pre>
<hr />
<h4>config.json</h4>
<pre><code class="language-json">{
  &quot;wp_remote_path&quot;: &quot;/var/www/html/wordpress&quot;,
  &quot;author_id&quot;: 1,
  &quot;categories&quot;: {
    &quot;tecnologia&quot;: 5,
    &quot;economia&quot;: 8,
    &quot;startup&quot;: 12
  },
  &quot;topics&quot;: [
    {
      &quot;name&quot;: &quot;Intelligenza Artificiale&quot;,
      &quot;keywords&quot;: [&quot;AI&quot;, &quot;machine learning&quot;, &quot;LLM&quot;],
      &quot;category&quot;: &quot;tecnologia&quot;,
      &quot;last_published&quot;: null
    },
    {
      &quot;name&quot;: &quot;Cybersecurity&quot;,
      &quot;keywords&quot;: [&quot;sicurezza informatica&quot;, &quot;hacking&quot;, &quot;privacy&quot;],
      &quot;category&quot;: &quot;tecnologia&quot;,
      &quot;last_published&quot;: null
    },
    {
      &quot;name&quot;: &quot;Startup Tech&quot;,
      &quot;keywords&quot;: [&quot;startup&quot;, &quot;venture capital&quot;, &quot;unicorn&quot;],
      &quot;category&quot;: &quot;startup&quot;,
      &quot;last_published&quot;: null
    }
  ]
}</code></pre>
<hr />
<h4>scripts/download_cover.py</h4>
<p>Identico alla versione locale: scarica l'immagine da Unsplash sulla macchina locale.</p>
<pre><code class="language-python">#!/usr/bin/env python3
import sys, requests, os

query   = sys.argv[1]
outfile = sys.argv[2]
api_key = os.environ[&#039;UNSPLASH_ACCESS_KEY&#039;]

r = requests.get(
    &#039;https://api.unsplash.com/photos/random&#039;,
    params={&#039;query&#039;: query, &#039;orientation&#039;: &#039;landscape&#039;, &#039;content_filter&#039;: &#039;high&#039;},
    headers={&#039;Authorization&#039;: f&#039;Client-ID {api_key}&#039;}
)
r.raise_for_status()
data = r.json()

img_data = requests.get(data[&#039;urls&#039;][&#039;regular&#039;]).content
with open(outfile, &#039;wb&#039;) as f:
    f.write(img_data)

with open(&#039;/tmp/cover_meta.txt&#039;, &#039;w&#039;) as f:
    f.write(f&quot;Photo by {data[&#039;user&#039;][&#039;name&#039;]} on Unsplash&quot;)

print(f&quot;Immagine scaricata: {outfile}&quot;)</code></pre>
<hr />
<h4>scripts/optimize_image.sh</h4>
<p>Identico alla versione locale: ottimizza e ritaglia l'immagine sulla macchina locale con ImageMagick.</p>
<pre><code class="language-bash">#!/bin/bash
INPUT=$1
OUTPUT=$2

# Resize a 1200x630 (dimensione Open Graph ottimale) e comprimi
convert &quot;$INPUT&quot; \
  -resize 1200x630^ \
  -gravity Center \
  -extent 1200x630 \
  -quality 85 \
  -strip \
  &quot;$OUTPUT&quot;

echo &quot;Ottimizzazione completata: $(du -h &quot;$OUTPUT&quot; | cut -f1)&quot;</code></pre>
<hr />
<h4>scripts/upload_media_remote.sh</h4>
<p>Questo script è la principale differenza rispetto alla versione locale.<br />
<strong>Trasferisce</strong> l'immagine ottimizzata sul server remoto via <code>scp</code>, poi esegue <code>wp media import</code> tramite <code>ssh</code>.</p>
<pre><code class="language-bash">#!/bin/bash
# ============================================================
# upload_media_remote.sh
# Trasferisce l&#039;immagine sul server remoto e la importa
# in WordPress con WP-CLI remoto via SSH a chiave pubblica.
# ============================================================

IMAGE_PATH=$1

# --- Parametri SSH da variabili d&#039;ambiente ---
SSH_HOST=&quot;${WP_SSH_HOST}&quot;
SSH_USER=&quot;${WP_SSH_USER}&quot;
SSH_KEY=&quot;${WP_SSH_KEY}&quot;
SSH_PORT=&quot;${WP_SSH_PORT:-22}&quot;
REMOTE_PATH=&quot;${WP_REMOTE_PATH:-/var/www/html/wordpress}&quot;
REMOTE_TMP=&quot;${WP_REMOTE_TMP:-/tmp}&quot;

# Opzioni SSH comuni (chiave pubblica, no password, no prompt)
SSH_OPTS=&quot;-i $SSH_KEY -p $SSH_PORT \
          -o StrictHostKeyChecking=no \
          -o BatchMode=yes \
          -o ConnectTimeout=15 \
          -o PasswordAuthentication=no&quot;

# --- Validazione variabili ---
if [ -z &quot;$SSH_HOST&quot; ] || [ -z &quot;$SSH_USER&quot; ] || [ -z &quot;$SSH_KEY&quot; ]; then
  echo &quot;ERRORE: WP_SSH_HOST, WP_SSH_USER e WP_SSH_KEY sono obbligatori.&quot; &gt;&amp;2
  exit 1
fi

if [ ! -f &quot;$SSH_KEY&quot; ]; then
  echo &quot;ERRORE: chiave SSH non trovata in $SSH_KEY&quot; &gt;&amp;2
  exit 1
fi

if [ ! -f &quot;$IMAGE_PATH&quot; ]; then
  echo &quot;ERRORE: immagine non trovata in $IMAGE_PATH&quot; &gt;&amp;2
  exit 1
fi

REMOTE_FILENAME=&quot;wp_cover_$(date +%s).jpg&quot;
REMOTE_FILE_PATH=&quot;$REMOTE_TMP/$REMOTE_FILENAME&quot;

# --- Trasferimento immagine via scp ---
echo &quot;Trasferimento immagine su $SSH_USER@$SSH_HOST:$REMOTE_FILE_PATH ...&quot;
scp $SSH_OPTS &quot;$IMAGE_PATH&quot; &quot;$SSH_USER@$SSH_HOST:$REMOTE_FILE_PATH&quot;

if [ $? -ne 0 ]; then
  echo &quot;ERRORE: scp fallito durante il trasferimento dell&#039;immagine.&quot; &gt;&amp;2
  exit 1
fi

echo &quot;Immagine trasferita con successo.&quot;

# --- Importazione media con WP-CLI remoto ---
echo &quot;Importazione media in WordPress via WP-CLI remoto...&quot;
MEDIA_ID=$(ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; \
  &quot;wp media import &#039;$REMOTE_FILE_PATH&#039; \
   --path=&#039;$REMOTE_PATH&#039; \
   --porcelain 2&gt;/dev/null&quot;)

if [ -z &quot;$MEDIA_ID&quot; ]; then
  echo &quot;ERRORE: wp media import non ha restituito un ID.&quot; &gt;&amp;2
  # Cleanup file remoto anche in caso di errore
  ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; &quot;rm -f &#039;$REMOTE_FILE_PATH&#039;&quot; 2&gt;/dev/null
  exit 1
fi

# --- Cleanup file temporaneo remoto ---
ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; &quot;rm -f &#039;$REMOTE_FILE_PATH&#039;&quot; 2&gt;/dev/null

echo &quot;$MEDIA_ID&quot; &gt; /tmp/wp_media_id.txt
echo &quot;Media importato su WordPress con ID: $MEDIA_ID&quot;</code></pre>
<hr />
<h4>scripts/publish_wp_remote.sh</h4>
<p>Esegue tutti i comandi <code>wp</code> sul server remoto tramite SSH. Nessuna chiamata WP-CLI locale.</p>
<pre><code class="language-bash">#!/bin/bash
# ============================================================
# publish_wp_remote.sh
# Crea il post WordPress come draft via WP-CLI remoto (SSH).
# ============================================================

# --- Parametri SSH da variabili d&#039;ambiente ---
SSH_HOST=&quot;${WP_SSH_HOST}&quot;
SSH_USER=&quot;${WP_SSH_USER}&quot;
SSH_KEY=&quot;${WP_SSH_KEY}&quot;
SSH_PORT=&quot;${WP_SSH_PORT:-22}&quot;
REMOTE_PATH=&quot;${WP_REMOTE_PATH:-/var/www/html/wordpress}&quot;
AUTHOR_ID=&quot;${WP_AUTHOR_ID:-1}&quot;

SSH_OPTS=&quot;-i $SSH_KEY -p $SSH_PORT \
          -o StrictHostKeyChecking=no \
          -o BatchMode=yes \
          -o ConnectTimeout=15 \
          -o PasswordAuthentication=no&quot;

# --- Leggi dati articolo ---
TITLE=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(d[&#039;title&#039;])&quot;)
CONTENT=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(d[&#039;content&#039;])&quot;)
EXCERPT=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(d[&#039;excerpt&#039;])&quot;)
TAGS=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(&#039;,&#039;.join(d[&#039;tags&#039;]))&quot;)
META_DESC=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(d[&#039;meta_desc&#039;])&quot;)
KEYWORD=$(python3 -c &quot;import json; d=json.load(open(&#039;/tmp/wp_article.json&#039;)); print(d[&#039;keyword&#039;])&quot;)
MEDIA_ID=$(cat /tmp/wp_media_id.txt)

# --- Trasferisci il JSON dell&#039;articolo sul server remoto (necessario per content lungo) ---
REMOTE_ARTICLE_JSON=&quot;/tmp/wp_article_remote_$(date +%s).json&quot;
scp $SSH_OPTS /tmp/wp_article.json &quot;$SSH_USER@$SSH_HOST:$REMOTE_ARTICLE_JSON&quot;

# --- Crea il post come draft (WP-CLI remoto) ---
echo &quot;Creazione post come draft su WordPress remoto...&quot;
POST_ID=$(ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; bash &lt;&lt;ENDSSH
  TITLE=\$(python3 -c &quot;import json; d=json.load(open(&#039;$REMOTE_ARTICLE_JSON&#039;)); print(d[&#039;title&#039;])&quot;)
  CONTENT=\$(python3 -c &quot;import json; d=json.load(open(&#039;$REMOTE_ARTICLE_JSON&#039;)); print(d[&#039;content&#039;])&quot;)
  EXCERPT=\$(python3 -c &quot;import json; d=json.load(open(&#039;$REMOTE_ARTICLE_JSON&#039;)); print(d[&#039;excerpt&#039;])&quot;)

  wp post create \
    --post_title=&quot;\$TITLE&quot; \
    --post_content=&quot;\$CONTENT&quot; \
    --post_excerpt=&quot;\$EXCERPT&quot; \
    --post_status=draft \
    --post_author=$AUTHOR_ID \
    --post_type=post \
    --path=&quot;$REMOTE_PATH&quot; \
    --porcelain 2&gt;/dev/null
ENDSSH
)

if [ -z &quot;$POST_ID&quot; ]; then
  echo &quot;ERRORE: wp post create non ha restituito un ID.&quot; &gt;&amp;2
  ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; &quot;rm -f &#039;$REMOTE_ARTICLE_JSON&#039;&quot; 2&gt;/dev/null
  exit 1
fi

echo &quot;Post draft creato con ID: $POST_ID&quot;

# --- Imposta immagine di copertina ---
echo &quot;Impostazione immagine di copertina...&quot;
ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; \
  &quot;wp post meta update $POST_ID _thumbnail_id $MEDIA_ID \
   --path=&#039;$REMOTE_PATH&#039;&quot; 2&gt;/dev/null

# --- Aggiungi tag ---
echo &quot;Aggiunta tag...&quot;
ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; \
  &quot;wp post term add $POST_ID post_tag &#039;$TAGS&#039; \
   --path=&#039;$REMOTE_PATH&#039;&quot; 2&gt;/dev/null

# --- Meta SEO Yoast ---
echo &quot;Aggiornamento meta SEO Yoast...&quot;
ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; \
  &quot;wp post meta update $POST_ID _yoast_wpseo_metadesc &#039;$META_DESC&#039; \
   --path=&#039;$REMOTE_PATH&#039;&quot; 2&gt;/dev/null

ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; \
  &quot;wp post meta update $POST_ID _yoast_wpseo_focuskw &#039;$KEYWORD&#039; \
   --path=&#039;$REMOTE_PATH&#039;&quot; 2&gt;/dev/null

# --- Cleanup file temporanei remoti ---
ssh $SSH_OPTS &quot;$SSH_USER@$SSH_HOST&quot; &quot;rm -f &#039;$REMOTE_ARTICLE_JSON&#039;&quot; 2&gt;/dev/null

echo &quot;$POST_ID&quot; &gt; /tmp/wp_post_id.txt
echo &quot;Post WordPress creato come draft con ID: $POST_ID&quot;</code></pre>
<hr />
<h4>Configurazione in <code>~/.openclaw/openclaw.json</code></h4>
<h4>Iniezione chiave pubblica SSH nella skill</h4>
<pre><code class="language-json">&quot;skills&quot;: {
  &quot;entries&quot;: {
    &quot;wp-remote-publisher&quot;: {
      &quot;env&quot;: {
        &quot;WP_SSH_HOST&quot;:         &quot;203.0.113.10&quot;,
        &quot;WP_SSH_USER&quot;:         &quot;deploy&quot;,
        &quot;WP_SSH_KEY&quot;:          &quot;/home/user/.ssh/id_ed25519_wp&quot;,
        &quot;WP_SSH_PORT&quot;:         &quot;22&quot;,
        &quot;WP_REMOTE_PATH&quot;:      &quot;/var/www/html/wordpress&quot;,
        &quot;WP_REMOTE_TMP&quot;:       &quot;/tmp&quot;,
        &quot;WP_AUTHOR_ID&quot;:        &quot;1&quot;,
        &quot;UNSPLASH_ACCESS_KEY&quot;: &quot;la-tua-access-key-unsplash&quot;
      }
    }
  }
}</code></pre>
<h4>Cron jobs per pubblicazione automatica</h4>
<pre><code class="language-json">&quot;cron&quot;: {
  &quot;jobs&quot;: [
    {
      &quot;id&quot;: &quot;wp-morning-news&quot;,
      &quot;schedule&quot;: &quot;0 10 * * 1-5&quot;,
      &quot;prompt&quot;: &quot;Esegui la skill wp-remote-publisher. Scegli il topic dalla rotazione.&quot;,
      &quot;channel&quot;: &quot;telegram&quot;
    },
    {
      &quot;id&quot;: &quot;wp-afternoon-news&quot;,
      &quot;schedule&quot;: &quot;0 16 * * 1-5&quot;,
      &quot;prompt&quot;: &quot;Esegui la skill wp-remote-publisher per il pomeriggio.&quot;,
      &quot;channel&quot;: &quot;telegram&quot;
    }
  ]
}</code></pre>
<hr />
<h4>Setup della chiave SSH (una-tantum)</h4>
<p>Prima di usare la skill, configura l'autenticazione a chiave pubblica sul server remoto:</p>
<pre><code class="language-bash"># 1. Genera una coppia di chiavi dedicata (raccomandato: ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_wp -C &quot;openclaw-wp-publisher&quot; -N &quot;&quot;

# 2. Copia la chiave pubblica sul server remoto
ssh-copy-id -i ~/.ssh/id_ed25519_wp.pub -p 22 deploy@203.0.113.10

# 3. Verifica la connessione automatica (nessuna password richiesta)
ssh -i ~/.ssh/id_ed25519_wp -o BatchMode=yes deploy@203.0.113.10 &quot;wp --info&quot;

# 4. (Opzionale) Limita ulteriormente la chiave in ~/.ssh/authorized_keys sul server
# Aggiungi prima della chiave: command=&quot;wp --allow-root&quot;,no-port-forwarding,no-X11-forwarding</code></pre>
<blockquote>
<p>💡 <strong>Consiglio sicurezza</strong> — Usa un utente SSH dedicato (<code>deploy</code> o <code>wpcli</code>) con permessi minimi sul server. Non usare <code>root</code>. Se WP-CLI richiede permessi su <code>/var/www</code>, aggiungi l'utente al gruppo <code>www-data</code>.</p>
</blockquote>
<hr />
<h4>Requisiti sul server remoto</h4>
<table>
<thead>
<tr>
<th>Componente</th>
<th>Requisito</th>
<th>Verifica</th>
</tr>
</thead>
<tbody>
<tr>
<td>WP-CLI</td>
<td>Installato e nel PATH</td>
<td><code>wp --info</code></td>
</tr>
<tr>
<td>PHP</td>
<td>≥ 7.4 (8.x raccomandato)</td>
<td><code>php --version</code></td>
</tr>
<tr>
<td>Python 3</td>
<td>Per leggere JSON nell'articolo</td>
<td><code>python3 --version</code></td>
</tr>
<tr>
<td>Permessi</td>
<td>Utente SSH scrive in <code>WP_REMOTE_PATH</code></td>
<td><code>ls -la /var/www/html/wordpress</code></td>
</tr>
<tr>
<td>Porta SSH</td>
<td>Aperta nel firewall</td>
<td><code>ufw status</code> / <code>iptables -L</code></td>
</tr>
</tbody>
</table>
<h4>Requisiti sulla macchina locale (OpenClaw)</h4>
<table>
<thead>
<tr>
<th>Componente</th>
<th>Requisito</th>
<th>Installazione</th>
</tr>
</thead>
<tbody>
<tr>
<td>ssh, scp</td>
<td>Presenti nel PATH</td>
<td>Pre-installati su Linux/macOS</td>
</tr>
<tr>
<td>ImageMagick</td>
<td>Comando <code>convert</code></td>
<td><code>apt install imagemagick</code></td>
</tr>
<tr>
<td>Python 3</td>
<td>Con libreria <code>requests</code></td>
<td><code>pip install requests</code></td>
</tr>
</tbody>
</table>
<hr />
<blockquote>
<p>✅ <strong>In sintesi rispetto alla versione locale:</strong> WP-CLI non è più richiesto sulla macchina con OpenClaw. Tutti i comandi <code>wp</code> vengono eseguiti via <code>ssh -i chiave ...</code> sul server remoto. Le immagini vengono elaborate localmente e trasferite con <code>scp</code>. La connessione non richiede mai password grazie all'autenticazione a chiave pubblica.</p>
</blockquote>
<p><strong>Esempio di articolo generato con stile giornalistico:</strong></p>
<blockquote>
<p><strong>Titolo:</strong> OpenAI apre i modelli o1 agli sviluppatori: tariffe ridotte del 40% e nuovi limiti di contesto</p>
<p><strong>Lede:</strong> OpenAI ha reso disponibili via API i modelli della famiglia o1, finora riservati agli utenti ChatGPT Plus, con una riduzione dei costi del 40% rispetto all'anteprima pubblica. La mossa, annunciata il 20 febbraio, amplia la finestra di contesto a un milione di token per i tier enterprise e segnala un cambio di strategia nella monetizzazione dell'AI per sviluppatori.</p>
</blockquote>
<p>Notare: nessun <em>&quot;nell'era digitale&quot;</em>, nessun <em>&quot;è importante notare&quot;</em>. Il lede risponde subito alle 5W con dati numerici precisi e fonte esplicita. Tono da agenzia stampa, non da blog.</p>
<hr />
<h2>8. Riferimento Comandi CLI {#cli}</h2>
<table>
<thead>
<tr>
<th>Comando</th>
<th>Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>openclaw onboard</code></td>
<td>Avvia il wizard di configurazione guidata</td>
</tr>
<tr>
<td><code>openclaw gateway</code></td>
<td>Avvia il Gateway (processo principale)</td>
</tr>
<tr>
<td><code>openclaw gateway --daemon</code></td>
<td>Avvia il Gateway in background</td>
</tr>
<tr>
<td><code>openclaw status</code></td>
<td>Stato del Gateway e degli agenti</td>
</tr>
<tr>
<td><code>openclaw stop</code></td>
<td>Ferma il Gateway</td>
</tr>
<tr>
<td><code>openclaw doctor</code></td>
<td>Diagnosi configurazione e sicurezza</td>
</tr>
<tr>
<td><code>openclaw logs</code></td>
<td>Log del Gateway in tempo reale</td>
</tr>
<tr>
<td><code>clawhub install &lt;slug&gt;</code></td>
<td>Installa una skill da ClawHub</td>
</tr>
<tr>
<td><code>clawhub search &lt;query&gt;</code></td>
<td>Cerca skill nel registry</td>
</tr>
<tr>
<td><code>clawhub update --all</code></td>
<td>Aggiorna tutte le skill installate</td>
</tr>
<tr>
<td><code>openclaw agent list</code></td>
<td>Lista degli agenti configurati</td>
</tr>
<tr>
<td><code>openclaw session list</code></td>
<td>Lista delle sessioni attive</td>
</tr>
</tbody>
</table>
<hr />
<h2>9. Troubleshooting</h2>
<p><strong>Il Gateway non si avvia</strong><br />
Verifica che Node.js sia ≥22: <code>node --version</code>. Controlla i log con <code>openclaw logs</code>. Assicurati che la porta 18789 non sia occupata: <code>lsof -i :18789</code>.</p>
<p><strong>Le skill non vengono caricate</strong><br />
Esegui <code>openclaw doctor</code> per rilevare binari mancanti o env non configurate. Controlla che <code>SKILL.md</code> abbia frontmatter YAML valido. Verifica che <code>requires.bins</code> siano nel PATH dell'utente che esegue OpenClaw.</p>
<p><strong>WP-CLI restituisce errore di permessi</strong><br />
Usa l'utente web corretto (es. <code>www-data</code>) o il flag <code>--allow-root</code> solo in ambienti controllati. Verifica il path: <code>wp --path=/var/www/html/wordpress post list</code>.</p>
<p><strong>Consumo eccessivo di token</strong><br />
Imposta spending cap sul dashboard del provider. Usa modelli economici (Gemini Flash) per skill semplici. Disabilita il heartbeat in sviluppo. Controlla che non ci siano loop nei cron job.</p>
<p><strong>L'agente non trova le skill nel prompt</strong><br />
OpenClaw fa uno snapshot delle skill all'avvio della sessione. Dopo aver aggiunto una skill, riavvia la sessione o abilita <code>skills.watcher</code> per il hot-reload automatico.</p>
<hr />
<h2>Risorse Utili</h2>
<ul>
<li><strong>GitHub</strong> — <a href="https://github.com/openclaw/openclaw" target="_blank" rel="noopener nofollow external" data-wpel-link="external">github.com/openclaw/openclaw</a></li>
<li><strong>Documentazione</strong> — <a href="https://docs.openclaw.ai" target="_blank" rel="noopener nofollow external" data-wpel-link="external">docs.openclaw.ai</a></li>
<li><strong>ClawHub</strong> — <a href="https://clawhub.com" target="_blank" rel="noopener nofollow external" data-wpel-link="external">clawhub.com</a></li>
<li><strong>WP-CLI</strong> — <a href="https://wp-cli.org" target="_blank" rel="noopener nofollow external" data-wpel-link="external">wp-cli.org</a></li>
<li><strong>Unsplash API</strong> — <a href="https://unsplash.com/developers" target="_blank" rel="noopener nofollow external" data-wpel-link="external">unsplash.com/developers</a></li>
<li><strong>AgentSkills spec</strong> — <a href="https://agentskills.io" target="_blank" rel="noopener nofollow external" data-wpel-link="external">agentskills.io</a></li>
</ul>
<hr />
<p><em>Hai domande o vuoi condividere la tua skill? Lascia un commento qui sotto o apri una issue su GitHub.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/openclaw-guida-completa-configurazione-e-creazione-skills/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
