cool-solution — dev.blog
Tecnologie

Crea il tuo marketplace di plugin per Claude Code su GitHub

La parola «marketplace» spaventa, ma è la cosa più semplice del mondo: un repository GitHub con un file JSON. Da lì Claude Code installa i tuoi plugin con un comando, su qualsiasi macchina. In questo tutorial creo un repo privato, ci metto dentro un plugin che salva la sessione in Obsidian e lo espongo con due comandi — /salva-session e /salva-session:compact. Tutto installabile da remoto, non da una cartella locale.

Dal repo GitHub privato al plugin Claude Code installato da remoto su ogni macchina: marketplace.json, /plugin install e i comandi /salva-session.

🧩 Marketplace, plugin, comandi: i tre pezzi

Tre concetti, dal contenitore al contenuto. Il marketplace è il catalogo: un repo con .claude-plugin/marketplace.json che elenca cosa offri. Il plugin è il pacchetto vero e proprio: comandi, hook, skill, agent. Il comando è ciò che digiti, tipo /salva-session. Un marketplace può contenere più plugin, un plugin più comandi.

Perché un repo GitHub e non una cartella locale? Perché da remoto installo la stessa versione su ogni macchina — la mia, quella di un collega, il portatile nuovo — con un solo comando, e aggiorno tutti allo stesso modo. La cartella locale resta comoda solo mentre sviluppo. Partiamo dal repo.

GitHub › nuovo repository privato
Create a new repositoryOwner * / Repository name *your-username/claude-marketplaceDescription (optional)My personal Claude Code marketplacePublicAnyone on the internet can see this repository.PrivateYou choose who can see and commit to this repository.Create repository

Repo privato: il marketplace funziona benissimo anche senza renderlo pubblico.

1️⃣ Il repo e il file marketplace.json

Creo un repository — lo chiamo claude-marketplace — e lo tengo privato. L'unico file obbligatorio è .claude-plugin/marketplace.json: dà un nome al catalogo, indica il proprietario ed elenca i plugin con il loro percorso dentro il repo.

Qui dichiaro un solo plugin, salva-session, che vive nella cartella ./plugins/salva-session. La description è quella che vedrò sfogliando il marketplace. Tutto qui: questo file è il marketplace.

.claude-plugin/marketplace.json
{
  "name": "my-marketplace",
  "owner": { "name": "your-username" },
  "plugins": [
    {
      "name": "salva-session",
      "source": "./plugins/salva-session",
      "description": "Salva e compatta la sessione in Obsidian"
    }
  ]
}

Doc ufficiale · Marketplace

L'unico file che trasforma un repo in un catalogo di plugin.

2️⃣ La struttura del plugin

Dentro plugins/salva-session metto un altro .claude-plugin/plugin.json (nome, versione, descrizione, autore) e una cartella commands/ con un file Markdown per comando. La struttura completa è questa.

La cosa importante è il nome del plugin, salva-session: i comandi di un plugin vivono sempre sotto il suo namespace, nella forma /nome-plugin:comando. Per questo commands/compact.md si invoca come /salva-session:compact, e il comando principale di salvataggio lo richiamo come /salva-session. È il nome del plugin a evitare le collisioni tra plugin diversi.

Struttura di marketplace e plugin
claude-marketplace · GitHub repo · privateclaude-marketplace/← your GitHub repo (private)├─ .claude-plugin/│ └─ marketplace.json← lists the plugins you publish└─ plugins/ └─ salva-session/ ├─ .claude-plugin/ │ └─ plugin.json └─ commands/ ├─ salva-session.md→ /salva-session └─ compact.md→ /salva-session:compact

Da questa struttura nascono /salva-session e /salva-session:compact.

3️⃣ I due comandi: /salva-session e /salva-session:compact

Un comando è un file Markdown: un piccolo frontmatter con la descrizione e, sotto, le istruzioni in linguaggio naturale che Claude eseguirà. /salva-session fa una cosa sola: riassume la conversazione e la salva come nota nel vault Obsidian, in sessions/AAAA-MM-GG.md.

/salva-session:compact fa un passo in più: prima lancia /compact per comprimere il contesto, poi salva. Lo uso quando la sessione è lunga e voglio chiudere in ordine senza trascinare token inutili. Due file, due comandi, zero codice da compilare.

commands/salva-session.md · commands/compact.md
// commands/salva-session.md   → /salva-session
---
description: Salva la sessione corrente in Obsidian
---
Riassumi la sessione e salvala come nota Markdown
nel vault, in sessions/AAAA-MM-GG.md.

// commands/compact.md          → /salva-session:compact
---
description: Compatta e poi salva la sessione
---
Esegui prima /compact per comprimere il contesto,
poi salva la sessione come sopra.

Doc ufficiale · Slash commands

Frontmatter + istruzioni: il comando è tutto qui.

🚀 Cosa succede alla fine della sessione

Qui si chiude il cerchio con l'articolo sul settings.json. Posso lanciare /salva-session a mano, oppure lasciare che sia l'hook Stop a farlo in automatico a ogni fine turno, richiamando lo stesso script. Il risultato è identico: la sessione viene compattata e salvata senza che io ci pensi.

Nella pratica vedo proprio questo: la conversazione viene compattata (con tanto di token risparmiati), partono le skill di fine sessione e la nota atterra nel vault. È l'automazione che preferisco — invisibile finché funziona.

Fine sessione: compatta, salva, archivia
Stop hook → auto-end-of-session.shCompacted conversation · saved 969.8k tokensRan skill/dev-vault:end-of-sessionRan skill/dev-vault:vault-compressReadSKILL.md7m 29s · 1.5k tokens · doneObsidian vaultsessions/2026-06-22.mdsession saved ✓

Lo stesso script richiamato dall'hook Stop o dal comando /salva-session:compact.

📄 Il risultato nel vault Obsidian

Il prodotto finale è una nota Markdown ordinata: cosa abbiamo fatto, le decisioni prese, cosa resta aperto per la prossima volta. Ritrovo lo storico delle sessioni come un diario di bordo del progetto, cercabile e collegabile.

Niente di sensibile in chiaro se imposti bene lo script: nomi di progetto, percorsi e segreti restano fuori o vengono ridotti all'essenziale. Qui sotto un esempio con contenuti generici.

La sessione salvata in Obsidian
VAULT · SESSIONS2026-06-182026-06-192026-06-202026-06-22INDEXsessions / 2026-06-22.md2026-06-22What we worked onRefactored the event filter into a pure function + testsi18n: IT / EN parity is green across the whole blogPlugin: session-save commands wired to the vaultDecisionsStop hook saves + compacts every session automaticallyTwo trees (it / en); html-lang set on the clientOpen / next sessionPublish the marketplace article, link it from LinkedIn327 words · saved ✓

Esempio con contenuti generici: la struttura è quella reale, i dati no.

🐙 Installare da remoto (non da locale)

Ecco il pezzo che conta, e che molti sbagliano facendo tutto in locale. Per usare il plugin su qualsiasi macchina, aggiungo il marketplace dal repo GitHub e poi installo il plugin dal marketplace. Due comandi.

In alternativa li registro in settings.json con extraKnownMarketplaces e enabledPlugins, così una macchina nuova è pronta solo sincronizzando la configurazione. La variante locale (/plugin marketplace add ./percorso) la tengo solo mentre sviluppo il plugin.

I comandi da remoto (quelli da evidenziare)
# 1) aggiungi il marketplace dal repo GitHub
/plugin marketplace add your-username/claude-marketplace

# 2) installa il plugin dal marketplace
/plugin install salva-session@my-marketplace

// in alternativa, dentro settings.json:
"extraKnownMarketplaces": { "my-marketplace": { "source": {
  "source": "github", "repo": "your-username/claude-marketplace" } } },
"enabledPlugins": { "salva-session@my-marketplace": true }

Doc ufficiale · Plugin

Dal repo GitHub, non da una cartella: stessa versione ovunque.

⚖️ Remoto o locale: quando usare cosa

Riassumo la scelta che faccio sempre. Da remoto quando il plugin è pronto e lo voglio ovunque, condiviso e aggiornabile con un comando. Da locale solo nel ciclo di sviluppo, quando modifico i file e voglio provarli senza fare push a ogni cambiamento.

Da remoto o da locale?

Da remoto (GitHub)

  • /plugin marketplace add utente/repo
  • Stessa versione su ogni macchina
  • Aggiornamenti con un comando
  • Ideale per il team

Da locale (cartella)

  • /plugin marketplace add ./percorso
  • Solo sulla tua macchina
  • Perfetto mentre sviluppi
  • Nessuna condivisione

Domande frequenti su marketplace plugin Claude Code

Serve un repo pubblico per installare il plugin?

No. Un repo privato va benissimo: Claude Code lo clona usando le tue credenziali Git, quindi basta che tu (o il team) abbiate accesso al repository. Il marketplace resta privato e installabile lo stesso.

Come aggiorno il plugin dopo una modifica?

Faccio push delle modifiche su GitHub e aggiorno il catalogo con /plugin marketplace update. Da remoto tutte le macchine prendono la nuova versione con un comando, senza reinstallare nulla a mano.

Posso installare da remoto invece che da locale?

Sì, ed è il punto: /plugin marketplace add utente/repo aggiunge il catalogo direttamente da GitHub, poi /plugin install nome@marketplace installa il plugin. La versione locale con un percorso serve solo mentre sviluppi.

Parliamone

Se questo tema ti riguarda, scrivimi: confrontarsi su codice e AI è sempre tempo speso bene.

Altri articoli del blog

tips-claude-resume-luglio-2026.md10 luglio 2026claude-code-hooks-quality-gate-2026.md9 luglio 2026orchestrazione-agenti-ai-multi-agent-dotnet-2026.md8 luglio 2026