@materializecms/cli 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/package.json +15 -5
- package/src/commands.js +9 -2
- package/src/site.js +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,33 @@ Ogni versione, dalla più recente. Le novità in arrivo si scrivono sotto «Pros
|
|
|
4
4
|
|
|
5
5
|
## Prossima versione
|
|
6
6
|
|
|
7
|
+
## 0.5.0 — 2026-11-05
|
|
8
|
+
|
|
9
|
+
- **Nuovo logo**: una M fatta di blocchi che passano da trasparenti a pieni, perché i contenuti prendono forma. Il nome è in Geist. Lo trovi nel pannello, nella favicon, nella pagina di accesso e nel README; i file sono in `docs/assets`.
|
|
10
|
+
- **Pubblicazione programmata**: scegli quando una pagina o un articolo esce, e se vuoi quando torna bozza da solo (offerte, eventi). Dal pulsante con il calendario accanto a «Pubblica», con scorciatoie come «Domani alle 9». Esce la bozza com'è in quel momento; i campi mancanti vengono segnalati subito, e se al momento di uscire qualcosa non va la pagina resta bozza e il pannello dice perché. Le date compaiono anche negli elenchi.
|
|
11
|
+
- **Link di anteprima da condividere**: un link segreto per far vedere una bozza a un cliente o a un collega senza account, con il design vero del sito. Scade dopo 1, 7 o 30 giorni o quando lo revochi, segue le modifiche, non finisce su Google e mostra un'etichetta «Anteprima». Da «Altre azioni» → «Condividi anteprima».
|
|
12
|
+
- **Pronto per le ricerche AI**: il sito pubblica `llms.txt`, l'indice per ChatGPT, Claude, Perplexity e gli altri assistenti, e una copia in Markdown di ogni pagina (per esempio `/chi-siamo.md`), più facile da leggere e citare. Si spegne in Impostazioni → SEO.
|
|
13
|
+
- **Feed RSS** su `/rss.xml` con gli ultimi articoli, annunciato in ogni pagina; in Impostazioni → SEO si scelgono le raccolte.
|
|
14
|
+
- **Blocco dei crawler AI più preciso**: blocca solo chi addestra modelli; le ricerche AI (ChatGPT Search, Claude, Perplexity) restano libere, perché portano visitatori. Prima PerplexityBot veniva bloccato.
|
|
15
|
+
- **Controllo di accessibilità e prestazioni**: la scheda SEO dell'editor diventa **Controlli**, con tre gruppi. Accessibilità: contrasto dei testi misurato sulla pagina vera (WCAG), immagini senza descrizione, pulsanti e icone senza nome, campi senza etichetta, link poco chiari, titoli saltati, video senza pausa. Prestazioni: file da altri siti, GIF e video pesanti, video senza copertina, troppe scene 3D, script esterni, troppi caratteri. Prima di pubblicare, i problemi seri vengono elencati.
|
|
16
|
+
- **Moduli più robusti**: antispam senza CAPTCHA (lo spam va in una cartella recuperabile), controlli dei campi anche sul server con il motivo accanto al campo, **file allegati** privati, destinatari per modulo, **risposta automatica** a chi scrive, **webhook** firmato per Zapier, Make e n8n. In Impostazioni → Messaggi: filtri per modulo, da leggere e spam, ricerca, **esportazione CSV** e cancellazione automatica dei messaggi vecchi. La casella da spuntare può aprire l'informativa privacy.
|
|
17
|
+
- Una pagina riportata com'è sul sito (per esempio con ⌘Z) non risulta più «Modifiche da pubblicare».
|
|
18
|
+
|
|
19
|
+
## 0.4.0 — 2026-11-03
|
|
20
|
+
|
|
21
|
+
- **Immagini di riferimento nell'assistente**: allega, incolla (⌘V) o trascina nella chat lo screenshot di un sito che ti piace, un mockup o uno schizzo, e l'assistente ne riprende impaginazione e atmosfera con le sezioni e lo stile del tuo sito. Fino a 4 immagini per messaggio; non vanno nella libreria e non finiscono sulla pagina.
|
|
22
|
+
- **Conversazioni con l'assistente più solide**: un secondo messaggio dopo aver cambiato la selezione sulla tela non fallisce più, e ogni nuovo messaggio rilegge dalla cache tutta la conversazione precedente, così costa una frazione.
|
|
23
|
+
- **L'assistente costa meno**: con Claude usa la cache dei prompt, così istruzioni, strumenti e pagina, rimandati a ogni passaggio, si pagano a una frazione del prezzo dopo il primo.
|
|
24
|
+
- **Azioni rapide più economiche**: ✨ sui testi, SEO e testo alternativo usano Claude Haiku 5.5, molto più economico di Opus; l'assistente e le traduzioni delle pagine restano sul modello principale. Si può scegliere un altro modello in Impostazioni → AI e MCP.
|
|
25
|
+
- **Uso dell'AI del mese** in Impostazioni → AI e MCP: richieste, token letti (e quanti dalla cache) e scritti, per tenere d'occhio la spesa.
|
|
26
|
+
- **AI sul testo formattato**: il pulsante ✨ c'è anche nel corpo degli articoli, e riscrive, accorcia o traduce mantenendo titoli, elenchi, grassetti, link e immagini.
|
|
27
|
+
- **✨ sulla tela mantiene grassetti, corsivi e link** di un testo, nell'Inspector e in modalità Contenuto.
|
|
28
|
+
- **Accorcia e Allunga più affidabili**: chiedono una lunghezza precisa (circa un terzo in meno, circa la metà in più), così un testo breve non torna quasi uguale e uno da allungare non diventa sette volte più lungo.
|
|
29
|
+
- **L'AI rispetta la lunghezza dei campi**: un testo riscritto non supera più il massimo del campo (prima, per esempio, un sommario di 220 caratteri poteva arrivare a 234 e bloccare la pubblicazione).
|
|
30
|
+
- **Descrivi con l'AI conserva i crediti**: il testo alternativo nuovo mantiene il credito della foto già scritto, come «foto di … su Unsplash», e la sua lingua.
|
|
31
|
+
- **Nastri con i bordi sfumati**: le lettere che scendono sotto la riga (g, p, y) non vengono più tagliate in basso.
|
|
32
|
+
- **Indirizzi del pannello scritti a mano**: `/admin/media`, `/admin/persone` e `/admin/impostazioni` portano alla sezione giusta, se nessuna raccolta ha quel nome.
|
|
33
|
+
|
|
7
34
|
## 0.3.0 — 2026-11-01
|
|
8
35
|
|
|
9
36
|
- **Backup fuori dal server**, ogni notte e cifrati, su uno spazio S3 compatibile (Cloudflare R2, Backblaze B2, Hetzner, Amazon S3…) o in una cartella WebDAV (Nextcloud, NAS Synology e QNAP…). Si attiva in Impostazioni → Backup; `materialize decrypt` rende di nuovo leggibili i file scaricati.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@materializecms/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Il comando materialize: sviluppo, produzione con aggiornamenti dal pannello, generazione del sito, backup, MCP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@materializecms/astro": "0.
|
|
25
|
-
"@materializecms/core": "0.
|
|
26
|
-
"@materializecms/db": "0.
|
|
27
|
-
"@materializecms/server": "0.
|
|
24
|
+
"@materializecms/astro": "0.5.0",
|
|
25
|
+
"@materializecms/core": "0.5.0",
|
|
26
|
+
"@materializecms/db": "0.5.0",
|
|
27
|
+
"@materializecms/server": "0.5.0",
|
|
28
28
|
"@modelcontextprotocol/sdk": "1.32.2"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
@@ -42,6 +42,16 @@
|
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
44
|
"changelog": [
|
|
45
|
+
{
|
|
46
|
+
"version": "0.5.0",
|
|
47
|
+
"date": "2026-11-05",
|
|
48
|
+
"notes": "- **Nuovo logo**: una M fatta di blocchi che passano da trasparenti a pieni, perché i contenuti prendono forma. Il nome è in Geist. Lo trovi nel pannello, nella favicon, nella pagina di accesso e nel README; i file sono in `docs/assets`.\n- **Pubblicazione programmata**: scegli quando una pagina o un articolo esce, e se vuoi quando torna bozza da solo (offerte, eventi). Dal pulsante con il calendario accanto a «Pubblica», con scorciatoie come «Domani alle 9». Esce la bozza com'è in quel momento; i campi mancanti vengono segnalati subito, e se al momento di uscire qualcosa non va la pagina resta bozza e il pannello dice perché. Le date compaiono anche negli elenchi.\n- **Link di anteprima da condividere**: un link segreto per far vedere una bozza a un cliente o a un collega senza account, con il design vero del sito. Scade dopo 1, 7 o 30 giorni o quando lo revochi, segue le modifiche, non finisce su Google e mostra un'etichetta «Anteprima». Da «Altre azioni» → «Condividi anteprima».\n- **Pronto per le ricerche AI**: il sito pubblica `llms.txt`, l'indice per ChatGPT, Claude, Perplexity e gli altri assistenti, e una copia in Markdown di ogni pagina (per esempio `/chi-siamo.md`), più facile da leggere e citare. Si spegne in Impostazioni → SEO.\n- **Feed RSS** su `/rss.xml` con gli ultimi articoli, annunciato in ogni pagina; in Impostazioni → SEO si scelgono le raccolte.\n- **Blocco dei crawler AI più preciso**: blocca solo chi addestra modelli; le ricerche AI (ChatGPT Search, Claude, Perplexity) restano libere, perché portano visitatori. Prima PerplexityBot veniva bloccato.\n- **Controllo di accessibilità e prestazioni**: la scheda SEO dell'editor diventa **Controlli**, con tre gruppi. Accessibilità: contrasto dei testi misurato sulla pagina vera (WCAG), immagini senza descrizione, pulsanti e icone senza nome, campi senza etichetta, link poco chiari, titoli saltati, video senza pausa. Prestazioni: file da altri siti, GIF e video pesanti, video senza copertina, troppe scene 3D, script esterni, troppi caratteri. Prima di pubblicare, i problemi seri vengono elencati.\n- **Moduli più robusti**: antispam senza CAPTCHA (lo spam va in una cartella recuperabile), controlli dei campi anche sul server con il motivo accanto al campo, **file allegati** privati, destinatari per modulo, **risposta automatica** a chi scrive, **webhook** firmato per Zapier, Make e n8n. In Impostazioni → Messaggi: filtri per modulo, da leggere e spam, ricerca, **esportazione CSV** e cancellazione automatica dei messaggi vecchi. La casella da spuntare può aprire l'informativa privacy.\n- Una pagina riportata com'è sul sito (per esempio con ⌘Z) non risulta più «Modifiche da pubblicare»."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"version": "0.4.0",
|
|
52
|
+
"date": "2026-11-03",
|
|
53
|
+
"notes": "- **Immagini di riferimento nell'assistente**: allega, incolla (⌘V) o trascina nella chat lo screenshot di un sito che ti piace, un mockup o uno schizzo, e l'assistente ne riprende impaginazione e atmosfera con le sezioni e lo stile del tuo sito. Fino a 4 immagini per messaggio; non vanno nella libreria e non finiscono sulla pagina.\n- **Conversazioni con l'assistente più solide**: un secondo messaggio dopo aver cambiato la selezione sulla tela non fallisce più, e ogni nuovo messaggio rilegge dalla cache tutta la conversazione precedente, così costa una frazione.\n- **L'assistente costa meno**: con Claude usa la cache dei prompt, così istruzioni, strumenti e pagina, rimandati a ogni passaggio, si pagano a una frazione del prezzo dopo il primo.\n- **Azioni rapide più economiche**: ✨ sui testi, SEO e testo alternativo usano Claude Haiku 5.5, molto più economico di Opus; l'assistente e le traduzioni delle pagine restano sul modello principale. Si può scegliere un altro modello in Impostazioni → AI e MCP.\n- **Uso dell'AI del mese** in Impostazioni → AI e MCP: richieste, token letti (e quanti dalla cache) e scritti, per tenere d'occhio la spesa.\n- **AI sul testo formattato**: il pulsante ✨ c'è anche nel corpo degli articoli, e riscrive, accorcia o traduce mantenendo titoli, elenchi, grassetti, link e immagini.\n- **✨ sulla tela mantiene grassetti, corsivi e link** di un testo, nell'Inspector e in modalità Contenuto.\n- **Accorcia e Allunga più affidabili**: chiedono una lunghezza precisa (circa un terzo in meno, circa la metà in più), così un testo breve non torna quasi uguale e uno da allungare non diventa sette volte più lungo.\n- **L'AI rispetta la lunghezza dei campi**: un testo riscritto non supera più il massimo del campo (prima, per esempio, un sommario di 220 caratteri poteva arrivare a 234 e bloccare la pubblicazione).\n- **Descrivi con l'AI conserva i crediti**: il testo alternativo nuovo mantiene il credito della foto già scritto, come «foto di … su Unsplash», e la sua lingua.\n- **Nastri con i bordi sfumati**: le lettere che scendono sotto la riga (g, p, y) non vengono più tagliate in basso.\n- **Indirizzi del pannello scritti a mano**: `/admin/media`, `/admin/persone` e `/admin/impostazioni` portano alla sezione giusta, se nessuna raccolta ha quel nome."
|
|
54
|
+
},
|
|
45
55
|
{
|
|
46
56
|
"version": "0.3.0",
|
|
47
57
|
"date": "2026-11-01",
|
package/src/commands.js
CHANGED
|
@@ -4,7 +4,7 @@ import { copyFile, mkdir, open, readFile, rm, writeFile } from 'node:fs/promises
|
|
|
4
4
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
5
5
|
import { styleText } from 'node:util';
|
|
6
6
|
import { resolveRedirect } from '@materializecms/core/seo';
|
|
7
|
-
import { createActivityStore, createAuthStore, createContentStore, createSettingsStore, openDatabase, } from '@materializecms/db';
|
|
7
|
+
import { createActivityStore, createAuthStore, createContentStore, createPreviewLinkStore, createSettingsStore, openDatabase, } from '@materializecms/db';
|
|
8
8
|
import { apiCaller, createFonts, createMcpServer, createMediaFiles, decryptTree, extractTarGz, parseRecoveryKey, restoreMedia, startServer, VERSION, } from '@materializecms/server';
|
|
9
9
|
import { findConfig, loadConfig } from './load-config.js';
|
|
10
10
|
import { buildSite, exportFonts, exportMedia, hasSite, ProductionSite, startDevSite } from './site.js';
|
|
@@ -150,6 +150,7 @@ async function run(mode, args) {
|
|
|
150
150
|
content: createContentStore(server.database.db),
|
|
151
151
|
auth: createAuthStore(server.database.db),
|
|
152
152
|
settings,
|
|
153
|
+
previews: createPreviewLinkStore(server.database.db),
|
|
153
154
|
});
|
|
154
155
|
redirectOf = async (path) => {
|
|
155
156
|
if (/\.[a-z0-9]+$/i.test(path) && !path.endsWith('.html'))
|
|
@@ -300,6 +301,7 @@ async function restore(args) {
|
|
|
300
301
|
}
|
|
301
302
|
const mediaDir = resolve(config.media.dir);
|
|
302
303
|
const fontsDir = join(dirname(mediaDir), 'fonts');
|
|
304
|
+
const uploadsDir = join(dirname(mediaDir), 'uploads');
|
|
303
305
|
const db = local ? resolve(config.database.url.slice('file:'.length)) : null;
|
|
304
306
|
let kept = null;
|
|
305
307
|
// The images the backup uses, read before it replaces the database (one connection, opened once).
|
|
@@ -334,11 +336,16 @@ async function restore(args) {
|
|
|
334
336
|
const font = /^fonts\/(.+)$/.exec(name)?.[1];
|
|
335
337
|
if (font && !font.split('/').some((part) => part === '..' || part.startsWith('.')))
|
|
336
338
|
return join(fontsDir, font);
|
|
339
|
+
// Files sent with the forms: "<message id>/<n>-<name>".
|
|
340
|
+
const upload = /^uploads\/([\w-]+\/[^/\\]+)$/.exec(name)?.[1];
|
|
341
|
+
if (upload && !upload.split('/').some((part) => part === '..' || part.startsWith('.')))
|
|
342
|
+
return join(uploadsDir, upload);
|
|
337
343
|
return null;
|
|
338
344
|
});
|
|
339
345
|
const media = written.filter((n) => n.startsWith('media/')).length;
|
|
346
|
+
const uploads = written.filter((n) => n.startsWith('uploads/')).length;
|
|
340
347
|
console.log(` ${ok('✓')} Archivio ripristinato: ${relative(process.cwd(), resolve(file))}`);
|
|
341
|
-
console.log(dim(` ${written.includes('content.db') ? 'Database, ' : ''}${media} file dei media, ${written.length - media - (written.includes('content.db') ? 1 : 0)} file dei caratteri.`));
|
|
348
|
+
console.log(dim(` ${written.includes('content.db') ? 'Database, ' : ''}${media} file dei media, ${written.length - media - uploads - (written.includes('content.db') ? 1 : 0)} file dei caratteri, ${uploads} allegati dei moduli.`));
|
|
342
349
|
}
|
|
343
350
|
else if (db) {
|
|
344
351
|
await copyFile(resolve(file), db);
|
package/src/site.js
CHANGED