story-theme-mcp 1.1.1 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "story-theme-mcp",
3
- "version": "1.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
- const origine = {
298
- dashboard: 'dernière version publiée sur l’espace membre Story Thème',
299
- cache: 'cache local (espace membre injoignable)',
300
- local: 'dossier local (STORY_THEME_DIR)',
301
- }[info.origin] || 'dossier local';
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
- let livraison = `${result.zip} (${result.size_mb} Mo, ${result.files} fichiers, personnalisés : ${result.overlays.join(', ') || 'aucun'})\nCheck-list : ${result.checklist}`;
1238
- if (typeof config.publishExport === 'function') {
1239
- try {
1240
- const lien = await config.publishExport({ zip: result.zip, checklist: result.checklist, project, catalog: catalog.version });
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
@@ -1,3 +1,3 @@
1
1
  // Version du serveur MCP. Ici et dans package.json — les deux doivent être identiques
2
2
  // (npm test le vérifie), et rien d'autre ne la redéclare.
3
- export const VERSION = '1.1.1';
3
+ export const VERSION = '1.1.2';