story-theme-mcp 1.1.0 → 1.1.2
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/package.json +1 -1
- package/src/server.js +36 -19
- package/src/version.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "story-theme-mcp",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Serveur MCP du Story Thème : votre assistant IA connaît le thème Shopify Story par cœur et construit des boutiques propres et professionnelles.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
package/src/server.js
CHANGED
|
@@ -98,6 +98,24 @@ function createContext(config) {
|
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Comment annoncer le thème exporté au marchand.
|
|
103
|
+
*
|
|
104
|
+
* En local (extension, npx), le chemin du fichier est la bonne réponse : il est sur SA machine.
|
|
105
|
+
* Servi à distance (connecteur), ce chemin désigne un dossier temporaire d'un serveur qu'il ne
|
|
106
|
+
* verra jamais — `config.publishExport` dépose alors le fichier dans son espace et rend un lien.
|
|
107
|
+
*/
|
|
108
|
+
async function livrerZip(config, { zip, checklist, project, version }) {
|
|
109
|
+
if (typeof config.publishExport !== 'function') return { texte: zip, lien: null };
|
|
110
|
+
try {
|
|
111
|
+
const lien = await config.publishExport({ zip, checklist, project, catalog: version });
|
|
112
|
+
return lien ? { texte: lien, lien } : { texte: zip, lien: null };
|
|
113
|
+
} catch (error) {
|
|
114
|
+
// L'export a réussi : un dépôt raté ne doit pas le transformer en échec.
|
|
115
|
+
return { texte: `${zip} — ⚠️ mise en ligne du fichier impossible (${error.message})`, lien: null };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
101
119
|
const run = (handler) => async (args) => {
|
|
102
120
|
try {
|
|
103
121
|
return await handler(args || {});
|
|
@@ -294,11 +312,16 @@ export function createServer(config) {
|
|
|
294
312
|
}
|
|
295
313
|
const { catalog } = ctx.get();
|
|
296
314
|
const info = source.info || {};
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
315
|
+
// `remote` est posé par l'espace membre quand le MCP est servi en connecteur : le thème
|
|
316
|
+
// vient alors de la version publiée, préparée côté serveur, et parler de STORY_THEME_DIR
|
|
317
|
+
// ou d'un jeton à configurer n'aurait aucun sens pour le marchand.
|
|
318
|
+
const origine = config.remote
|
|
319
|
+
? 'dernière version publiée, servie par votre espace membre Story Thème'
|
|
320
|
+
: {
|
|
321
|
+
dashboard: 'dernière version publiée sur l’espace membre Story Thème',
|
|
322
|
+
cache: 'cache local (espace membre injoignable)',
|
|
323
|
+
local: 'dossier local (STORY_THEME_DIR)',
|
|
324
|
+
}[info.origin] || 'dossier local';
|
|
302
325
|
|
|
303
326
|
return ok(
|
|
304
327
|
[
|
|
@@ -306,7 +329,7 @@ export function createServer(config) {
|
|
|
306
329
|
`Origine : ${origine}`,
|
|
307
330
|
info.version && info.version !== catalog.version ? `Version annoncée par l’espace membre : ${info.version}` : null,
|
|
308
331
|
info.canal === 'test' ? 'Canal : version EN TEST (compte testeur).' : null,
|
|
309
|
-
`Dossier : ${info.dir || config.themeDir}`,
|
|
332
|
+
config.remote ? null : `Dossier : ${info.dir || config.themeDir}`,
|
|
310
333
|
info.message,
|
|
311
334
|
changed ? `✅ Thème mis à jour en ${info.version} : les sections et réglages connus du MCP viennent de cette version.` : null,
|
|
312
335
|
// Une vérification qui retombe sur le cache n'est pas une vérification : dire « déjà
|
|
@@ -316,7 +339,7 @@ export function createServer(config) {
|
|
|
316
339
|
: null,
|
|
317
340
|
update && !changed && !erreur && info.origin !== 'cache' ? 'Déjà à jour : aucune version plus récente publiée.' : null,
|
|
318
341
|
erreur ? `⚠️ Mise à jour impossible : ${erreur}` : null,
|
|
319
|
-
!config.token && !config.themeDirExplicit
|
|
342
|
+
!config.remote && !config.token && !config.themeDirExplicit
|
|
320
343
|
? '\nAucun jeton configuré : ajoutez STORY_MCP_TOKEN (espace membre Story Thème > MCP & Appli) pour suivre automatiquement les versions publiées.'
|
|
321
344
|
: null,
|
|
322
345
|
]
|
|
@@ -730,7 +753,7 @@ export function createServer(config) {
|
|
|
730
753
|
},
|
|
731
754
|
annotations: writes,
|
|
732
755
|
},
|
|
733
|
-
run((input) => {
|
|
756
|
+
run(async (input) => {
|
|
734
757
|
const { catalog, store } = ctx.get();
|
|
735
758
|
const result = buildStore({ catalog, store }, input);
|
|
736
759
|
const exported = exportTheme({ catalog, store, slug: result.slug });
|
|
@@ -753,7 +776,7 @@ export function createServer(config) {
|
|
|
753
776
|
...result.notes.map((note) => `- ${note}`),
|
|
754
777
|
`Accueil : ${result.sectionsPerFile['templates/index.json']} sections${result.hasImages ? '' : ' (sans photo : héro typographique, aucun carré vide)'}.`,
|
|
755
778
|
`Textes de la marque placés : ${placed}${result.translated ? ` · textes du thème traduits : ${result.translated}` : ''} · textes d’exemple encore à personnaliser : ${toWrite} (list_texts puis edit_template).`,
|
|
756
|
-
exported.ok ? `Zip : ${exported.zip}\nÀ importer dans Shopify : Boutique en ligne > Thèmes > Ajouter un thème > Importer un fichier zip (sans publier), puis Personnaliser pour voir le rendu.` : `Export impossible : ${exported.message}`,
|
|
779
|
+
exported.ok ? `Zip : ${(await livrerZip(config, { zip: exported.zip, checklist: exported.checklist, project: result.slug, version: catalog.version })).texte}\nÀ importer dans Shopify : Boutique en ligne > Thèmes > Ajouter un thème > Importer un fichier zip (sans publier), puis Personnaliser pour voir le rendu.` : `Export impossible : ${exported.message}`,
|
|
757
780
|
'',
|
|
758
781
|
'Questions à poser maintenant pour affiner (pas plus de 5) :',
|
|
759
782
|
...questions.slice(0, 5).map((question) => `- ${question}`),
|
|
@@ -1234,16 +1257,10 @@ Read the file first (read_file) to get ids.`,
|
|
|
1234
1257
|
// Servi à distance (connecteur), le chemin du zip ne veut rien dire pour le marchand :
|
|
1235
1258
|
// le fichier est sur le serveur, pas chez lui. `publishExport` le dépose alors dans son
|
|
1236
1259
|
// espace et rend un lien de téléchargement, qui remplace le chemin dans la réponse.
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
if (lien) livraison = `${lien} (${result.size_mb} Mo, ${result.files} fichiers, personnalisés : ${result.overlays.join(', ') || 'aucun'})`;
|
|
1242
|
-
} catch (error) {
|
|
1243
|
-
// L'export a réussi : un dépôt raté ne doit pas le transformer en échec.
|
|
1244
|
-
livraison = `${result.zip} — ⚠️ mise en ligne du fichier impossible (${error.message})`;
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1260
|
+
const { texte, lien } = await livrerZip(config, { zip: result.zip, checklist: result.checklist, project, version: catalog.version });
|
|
1261
|
+
const livraison = lien
|
|
1262
|
+
? `${texte} (${result.size_mb} Mo, ${result.files} fichiers, personnalisés : ${result.overlays.join(', ') || 'aucun'})`
|
|
1263
|
+
: `${texte} (${result.size_mb} Mo, ${result.files} fichiers, personnalisés : ${result.overlays.join(', ') || 'aucun'})\nCheck-list : ${result.checklist}`;
|
|
1247
1264
|
|
|
1248
1265
|
return ok(`${migratedFiles.length ? `Projet mis à jour vers le thème ${catalog.version} : ${migratedFiles.map((file) => `${file} (${result.migrated[file].length})`).join(', ')} — réglages que le thème n'a plus, sans effet sur le rendu (undo possible).\n` : ''}${notReady ? '⚠️ Exporté, mais PAS PRÊT À PUBLIER : des points 🔴 restent (voir la revue ci-dessous). Importez-le sans le publier.\n' : ''}✅ Thème exporté : ${livraison}\n\n${result.report}`);
|
|
1249
1266
|
}),
|
package/src/version.js
CHANGED