story-theme-mcp 1.7.3 → 1.7.4
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/README.md +4 -4
- package/package.json +1 -1
- package/src/config.js +1 -1
- package/src/index.js +1 -1
- package/src/knowledge/brancher.js +29 -1
- package/src/knowledge/demos.js +1 -1
- package/src/server.js +7 -5
- package/src/shops/app-tools.js +1 -1
- package/src/shops/direct.js +10 -2
- package/src/shops/format.js +1 -1
- package/src/theme/source.js +1 -1
- package/src/version.js +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Votre assistant IA connaît le [Story Thème](https://story-theme.com) par cœur — chaque section, chaque bloc, chaque réglage — et construit des boutiques Shopify propres et professionnelles, sans jamais produire un fichier que Shopify refuserait.
|
|
4
4
|
|
|
5
|
-
Réservé aux titulaires d'une licence Story Thème. Le jeton se génère dans l'espace membre : **Story Thème > MCP
|
|
5
|
+
Réservé aux titulaires d'une licence Story Thème. Le jeton se génère dans l'espace membre : **Story Thème > MCP**.
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
Vous : « Crée la boutique Maison Lumen : bougies parfumées coulées à la main à Lyon. »
|
|
@@ -15,7 +15,7 @@ IA : une seule salve de questions (photos, collection, conditions… ou « vas
|
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
18
|
-
**Le plus simple — l'extension Claude.** Téléchargez `story-theme-mcp.mcpb` depuis votre espace membre (page MCP
|
|
18
|
+
**Le plus simple — l'extension Claude.** Téléchargez `story-theme-mcp.mcpb` depuis votre espace membre (page MCP) et ouvrez le fichier : Claude installe le serveur et vous demande votre jeton dans un formulaire. Rien d'autre à installer, Node compris.
|
|
19
19
|
|
|
20
20
|
Les deux méthodes ci-dessous restent valables si vous préférez configurer à la main. Elles demandent Node 20 ou plus ([nodejs.org](https://nodejs.org)).
|
|
21
21
|
|
|
@@ -82,7 +82,7 @@ Prompts prêts à l'emploi : `creer-boutique`, `refaire-une-page`, `auditer-un-t
|
|
|
82
82
|
|
|
83
83
|
| Variable | Défaut | Rôle |
|
|
84
84
|
|---|---|---|
|
|
85
|
-
| `STORY_MCP_TOKEN` | — | Jeton personnel (espace membre > MCP
|
|
85
|
+
| `STORY_MCP_TOKEN` | — | Jeton personnel (espace membre > MCP). Vérifie la licence et donne accès au thème publié. |
|
|
86
86
|
| `STORY_MCP_HOME` | `~/Documents/Story Theme MCP` | Projets, historique, exports, cache du thème. |
|
|
87
87
|
| `STORY_MCP_LANGUAGE` | `fr` | Langue par défaut des projets et des textes. |
|
|
88
88
|
| `STORY_MCP_CANAL` | `stable` | `test` pour la version en test du thème (comptes testeurs). |
|
|
@@ -117,7 +117,7 @@ npm run fonts # recharge la bibliothèque de polices Shopify (shopify.dev)
|
|
|
117
117
|
npm run bundle # fabrique build/story-theme-mcp-<version>.mcpb (extension Claude, un clic)
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
Après `npm run bundle`, déposer le `.mcpb` dans le dossier `mcp/` de l'espace membre : la page MCP
|
|
120
|
+
Après `npm run bundle`, déposer le `.mcpb` dans le dossier `mcp/` de l'espace membre : la page MCP sert automatiquement la version la plus récente qu'elle y trouve.
|
|
121
121
|
|
|
122
122
|
Avec `STORY_THEME_DIR` sur le dépôt du thème, le MCP lit le thème en cours d'écriture et n'appelle pas l'espace membre. Les connaissances rédigées à la main vivent dans `src/knowledge/` (descriptions de chaque section et bloc, compositions par métier, directions artistiques, guides) ; tout le reste vient du thème. `npm run check` signale une section ou un bloc public sans description.
|
|
123
123
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "story-theme-mcp",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.4",
|
|
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/config.js
CHANGED
|
@@ -11,7 +11,7 @@ export function loadConfig(env = process.env) {
|
|
|
11
11
|
const themeDir = env.STORY_THEME_DIR || '';
|
|
12
12
|
return {
|
|
13
13
|
version: VERSION,
|
|
14
|
-
// Jeton personnel du client (espace membre > MCP
|
|
14
|
+
// Jeton personnel du client (espace membre > MCP). Sans lui, pas de thème à distance :
|
|
15
15
|
// le MCP retombe sur son cache, puis sur un dossier local.
|
|
16
16
|
token: (env.STORY_MCP_TOKEN || '').trim(),
|
|
17
17
|
apiBase: (env.STORY_MCP_API || DEFAULT_API).trim(),
|
package/src/index.js
CHANGED
|
@@ -25,7 +25,7 @@ if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
|
25
25
|
'construit des boutiques Shopify prêtes à importer. Il ne s’utilise pas à la main.',
|
|
26
26
|
'',
|
|
27
27
|
'Variables d’environnement :',
|
|
28
|
-
' STORY_MCP_TOKEN jeton personnel (espace membre Story Thème > MCP
|
|
28
|
+
' STORY_MCP_TOKEN jeton personnel (espace membre Story Thème > MCP) — indispensable',
|
|
29
29
|
' STORY_MCP_HOME dossier des projets et exports (défaut : ~/Documents/Story Theme MCP)',
|
|
30
30
|
' STORY_MCP_LANGUAGE langue des textes (défaut : fr)',
|
|
31
31
|
' STORY_MCP_CANAL « test » pour la version en test du thème (comptes testeurs)',
|
|
@@ -18,7 +18,7 @@ const ETAPES = [
|
|
|
18
18
|
'Dans l’administration Shopify, installez l’application gratuite Theme Access (éditée par Shopify) : https://apps.shopify.com/theme-access',
|
|
19
19
|
'Dans Theme Access : « Créer un mot de passe », avec votre propre adresse e-mail.',
|
|
20
20
|
'Ouvrez l’e-mail reçu et affichez le mot de passe : il commence par shptka_ et ne s’affiche qu’une fois.',
|
|
21
|
-
`Collez-le dans votre espace membre Story Thème, page MCP
|
|
21
|
+
`Collez-le dans votre espace membre Story Thème, page MCP > « Brancher une boutique » (${PAGE_BRANCHEMENT}). Jamais dans la conversation.`,
|
|
22
22
|
];
|
|
23
23
|
|
|
24
24
|
/** La marche à suivre complète, prête à recopier au marchand. */
|
|
@@ -33,3 +33,31 @@ export const TUTO_BRANCHEMENT = [
|
|
|
33
33
|
|
|
34
34
|
/** Une ligne pour les réponses où la boutique n'est pas (ou peut-être pas) branchée. */
|
|
35
35
|
export const INVITATION_BRANCHEMENT = `Boutique pas encore branchée ? Proposez Theme Access au marchand (deux minutes, une seule fois) : list_shops donne la marche à suivre${VIDEO_BRANCHEMENT ? ` et la vidéo (${VIDEO_BRANCHEMENT})` : ''}. Sans lui, le zip reste la solution de repli, à importer à chaque version.`;
|
|
36
|
+
|
|
37
|
+
/* --------------------------------------------- le connecteur Shopify officiel */
|
|
38
|
+
|
|
39
|
+
// Theme Access n'ouvre que les thèmes. Le connecteur Shopify officiel, édité par Shopify pour
|
|
40
|
+
// ChatGPT et Claude (mai 2026), ouvre le reste : produits, prix, stocks, collections, réductions,
|
|
41
|
+
// commandes. Avec lui, l'assistant remplit les pages des vrais produits et crée les réductions des
|
|
42
|
+
// offres au lieu de laisser une liste au marchand : le MCP le propose donc, surtout au début.
|
|
43
|
+
|
|
44
|
+
/** La fiche du connecteur dans l'annuaire de Claude (vérifiée le 20/10/2026). */
|
|
45
|
+
export const LIEN_CONNECTEUR_SHOPIFY_CLAUDE = 'https://claude.com/connectors/shopify';
|
|
46
|
+
|
|
47
|
+
/** Le conseil, tel que l'assistant le lit dans un résultat d'outil. */
|
|
48
|
+
// Le MCP ne voit pas les autres connecteurs de l'assistant ; l'assistant, lui, voit ses outils :
|
|
49
|
+
// c'est à lui de vérifier, et de se taire si le connecteur est déjà là.
|
|
50
|
+
export const CONSEIL_CONNECTEUR_SHOPIFY = `Connecteur Shopify officiel — seulement s'il n'est pas déjà en place. Vérifiez d'abord vos outils : si vous avez déjà ceux du connecteur Shopify (produits, commandes, réductions…), n'en parlez pas. S'il est installé mais pas actif dans cette conversation, dites simplement de l'activer (ChatGPT : @Shopify). Sinon, proposez-le au marchand en une phrase : édité par Shopify, il vous ouvre, en plus du thème, ses produits, prix, stocks, collections, réductions et commandes (pages remplies de ses vrais produits, réductions des offres créées pour lui, photos déposées dans Fichiers). Où l'ajouter : Claude, ${LIEN_CONNECTEUR_SHOPIFY_CLAUDE} ; ChatGPT, Applis › « Shopify » ; ailleurs, l'annuaire de connecteurs de son IA. S'il l'a refusé ou dit l'avoir déjà, n'y revenez plus.`;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Surtout au début, pas tout le temps : un compteur par conversation (une session MCP) qui
|
|
54
|
+
* rend le conseil aux deux premiers résultats, puis à un sur cinq. Chaque appel compte.
|
|
55
|
+
* @returns {() => string} le conseil, ou une chaîne vide
|
|
56
|
+
*/
|
|
57
|
+
export function rappelConnecteurShopify() {
|
|
58
|
+
let appels = 0;
|
|
59
|
+
return () => {
|
|
60
|
+
appels += 1;
|
|
61
|
+
return appels <= 2 || appels % 5 === 0 ? CONSEIL_CONNECTEUR_SHOPIFY : '';
|
|
62
|
+
};
|
|
63
|
+
}
|
package/src/knowledge/demos.js
CHANGED
|
@@ -22,7 +22,7 @@ export function creerDemos(config) {
|
|
|
22
22
|
const appel = async (chemin) => {
|
|
23
23
|
if (!config.token) {
|
|
24
24
|
throw new Error(
|
|
25
|
-
'Les boutiques démo demandent un jeton : ajoutez STORY_MCP_TOKEN (espace membre Story Thème > MCP
|
|
25
|
+
'Les boutiques démo demandent un jeton : ajoutez STORY_MCP_TOKEN (espace membre Story Thème > MCP).',
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
28
|
const reponse = await fetch(`${config.apiBase.replace(/\/+$/, '')}${chemin}`, {
|
package/src/server.js
CHANGED
|
@@ -95,7 +95,9 @@ Appelez list_shops AVANT de construire : c'est ce qui décide du chemin.
|
|
|
95
95
|
- **Aucune boutique branchée** : recopiez-lui la marche à suivre que list_shops renvoie (Theme Access, deux minutes, une seule fois, rien à installer sur l'ordinateur, avec la vidéo quand elle existe) ET construisez quand même la V1 tout de suite. Insistez gentiment : c'est ce qui lui évite d'importer un zip à chaque retouche. Dès qu'il a branché sa boutique, push_to_shop y envoie le projet. S'il ne veut pas, export_theme donne le zip, solution de repli.
|
|
96
96
|
- **Le mot de passe Theme Access ne passe jamais par la conversation** : il se colle dans l'espace membre. S'il le colle dans le chat, dites-lui de le supprimer dans Theme Access et d'en créer un autre.
|
|
97
97
|
|
|
98
|
-
Theme Access n'ouvre que les thèmes. Le Story Thème affiche ; il ne crée ni produits, ni collections, ni pages, ni menus, ni réductions. Pour cela,
|
|
98
|
+
Theme Access n'ouvre que les thèmes. Le Story Thème affiche ; il ne crée ni produits, ni collections, ni pages, ni menus, ni réductions. Pour cela, le connecteur Shopify officiel (édité par Shopify, pour ChatGPT, Claude et d'autres) : vous lirez ses vrais produits et collections, créerez les pages et leur attribuerez les modèles, monterez les menus, créerez les réductions des offres et déposerez ses photos dans Contenu > Fichiers. Une boutique réelle bat toujours un contenu inventé : noms de produits, prix, collections, photos déjà en ligne.
|
|
99
|
+
|
|
100
|
+
Proposez-le SEULEMENT s'il n'est pas déjà en place : regardez d'abord vos outils. Si vous avez déjà ceux du connecteur Shopify, servez-vous-en sans en parler. Sinon, proposez-le tôt (dès le premier échange sur sa boutique), puis seulement quand une demande touche aux produits, prix, stocks, collections, pages, menus ou réductions — une phrase, jamais à chaque message, et plus du tout s'il l'a refusé. Où l'ajouter : Claude, https://claude.com/connectors/shopify ; ChatGPT, Applis › « Shopify » (installé mais pas actif dans la conversation : @Shopify) ; ailleurs, l'annuaire de connecteurs de son IA. Ne répondez jamais « il faudrait des autorisations supplémentaires » : nommez le connecteur. Sans lui, listez ce qu'il doit faire à la main.
|
|
99
101
|
|
|
100
102
|
Si un connecteur Shopify est disponible : lisez les collections et les produits réels, copiez 3 à 6 belles photos dans Contenu > Fichiers (read_guide images donne la requête fileCreate), puis passez leurs noms dans images (celles de 1600 px et plus dans images.large) et les handles dans collections.
|
|
101
103
|
|
|
@@ -124,12 +126,12 @@ Répondez au marchand dans sa langue, en vouvoyant en français, brièvement.`;
|
|
|
124
126
|
// ni ses outils ni ses consignes ne sont montrés : l'assistant ne propose pas ce qu'il ne peut pas faire.
|
|
125
127
|
const INSTRUCTIONS_APPLI = `## L'appli Story Theme Apps
|
|
126
128
|
|
|
127
|
-
**L'appli Story Theme Apps** est gratuite : le marchand l'installe lui-même depuis son espace membre (page
|
|
129
|
+
**L'appli Story Theme Apps** est gratuite : le marchand l'installe lui-même depuis son espace membre (page Story Theme Apps). Elle ajoute les avis clients, les tests A/B, les offres cumulables et récompenses panier, et les codes promo. Sur une boutique branchée où elle est installée, commencez par app_status, puis :
|
|
128
130
|
- app_reviews : importer un export CSV (Judge.me, Loox…), ajouter, modérer, répondre aux avis ;
|
|
129
131
|
- app_ab_tests : opposer deux modèles de page. Le modèle B doit exister dans le thème PUBLIÉ : composez-le (compose_page, edit_template), puis, avec l'accord du marchand, envoyez CE SEUL fichier : push_to_shop({ shops, theme: <thème publié>, files: ["templates/product.offre-b.json"], confirm: true }) — un modèle en plus ne change aucune page en ligne. Suivez les résultats (14 jours au moins), puis appliquez le gagnant ;
|
|
130
132
|
- app_offers : les paliers et lots se règlent dans le thème (offres de la fiche produit), l'appli applique la remise au panier : activate la met en place, diagnostic dit pourquoi une offre ne s'applique pas ;
|
|
131
133
|
- app_discount_codes : créer un code promo cumulable avec les offres.
|
|
132
|
-
Les actions irréversibles et celles sur plusieurs boutiques demandent confirm: true : décrivez ce qui va se passer et attendez le oui du marchand. Appli pas installée ? Il l'installe depuis son espace membre (page
|
|
134
|
+
Les actions irréversibles et celles sur plusieurs boutiques demandent confirm: true : décrivez ce qui va se passer et attendez le oui du marchand. Appli pas installée ? Il l'installe depuis son espace membre (page Story Theme Apps > « Installer l'appli ») ; en attendant, dites-lui ce qu'il faudra régler.
|
|
133
135
|
|
|
134
136
|
`;
|
|
135
137
|
|
|
@@ -506,7 +508,7 @@ export function createServer(config) {
|
|
|
506
508
|
update && !changed && !erreur && info.origin !== 'cache' ? 'Déjà à jour : aucune version plus récente publiée.' : null,
|
|
507
509
|
erreur ? `⚠️ Mise à jour impossible : ${erreur}` : null,
|
|
508
510
|
!config.remote && !config.token && !config.themeDirExplicit
|
|
509
|
-
? '\nAucun jeton configuré : ajoutez STORY_MCP_TOKEN (espace membre Story Thème > MCP
|
|
511
|
+
? '\nAucun jeton configuré : ajoutez STORY_MCP_TOKEN (espace membre Story Thème > MCP) pour suivre automatiquement les versions publiées.'
|
|
510
512
|
: null,
|
|
511
513
|
]
|
|
512
514
|
.filter(Boolean)
|
|
@@ -1035,7 +1037,7 @@ export function createServer(config) {
|
|
|
1035
1037
|
'À dire au marchand, dans cet ordre : ce qui a été construit ; « Ce que j’ai inventé, à valider » (avis d’exemple et leurs prénoms, dates et histoire, conditions de livraison et de retour, prix et remises des offres, horaires, chiffres) ; ce qu’il doit créer dans Shopify (réductions des offres, pages et modèles, menus, application d’avis).',
|
|
1036
1038
|
'Sa boutique est branchée (list_shops) ? push_to_shop({ shops, create: true }) y envoie la V1 dans un thème non publié, sans zip.',
|
|
1037
1039
|
INVITATION_BRANCHEMENT,
|
|
1038
|
-
'
|
|
1040
|
+
'Pas encore de connecteur Shopify officiel parmi vos outils ? Proposez-le-lui : vous pourrez créer les pages et leurs modèles, les menus, les réductions et déposer ses photos, au lieu de lui laisser une liste à faire à la main. Déjà là : servez-vous-en, sans en parler.',
|
|
1039
1041
|
'',
|
|
1040
1042
|
'Questions à poser maintenant pour affiner (pas plus de 5) :',
|
|
1041
1043
|
...questions.slice(0, 5).map((question) => `- ${question}`),
|
package/src/shops/app-tools.js
CHANGED
|
@@ -9,7 +9,7 @@ import { formatApp } from './format.js';
|
|
|
9
9
|
// Ce qu'il faut dire au marchand quand l'appli manque : il l'installe lui-même, depuis son espace
|
|
10
10
|
// membre (bouton « Installer l'appli » ; « Demander l'appli » tant que Shopify ne l'a pas validée).
|
|
11
11
|
export const DEMANDER_APPLI =
|
|
12
|
-
"depuis son espace membre, page
|
|
12
|
+
"depuis son espace membre, page Story Theme Apps (https://story-theme.com/apps) : « Installer l'appli », gratuite, en un clic ; à défaut, contact@story-theme.com";
|
|
13
13
|
|
|
14
14
|
export const APPLI_ABSENTE = `L'appli Story Theme Apps n'est pas installée sur cette boutique, ou la boutique n'est pas branchée par Theme Access dans l'espace membre. Elle est gratuite : dites au marchand de l'installer ${DEMANDER_APPLI}, et de brancher sa boutique avec Theme Access (même page). En attendant, ses thèmes restent accessibles : pull_from_shop, push_to_shop, update_theme.`;
|
|
15
15
|
|
package/src/shops/direct.js
CHANGED
|
@@ -15,7 +15,7 @@ import { parseThemeJson } from '../theme/loader.js';
|
|
|
15
15
|
import { fileKind, validateFile } from '../validate/template.js';
|
|
16
16
|
import { majeure } from '../migrate/source.js';
|
|
17
17
|
import { devinerLangue, textesDesModeles } from '../validate/design.js';
|
|
18
|
-
import { TUTO_BRANCHEMENT } from '../knowledge/brancher.js';
|
|
18
|
+
import { TUTO_BRANCHEMENT, rappelConnecteurShopify } from '../knowledge/brancher.js';
|
|
19
19
|
|
|
20
20
|
const chemin = (config, suite) => `${String(config.apiBase || 'https://story-theme.com').replace(/\/+$/, '')}/api/v1/mcp${suite}`;
|
|
21
21
|
|
|
@@ -113,6 +113,10 @@ function memoriser(store, slug, domaine, theme, fichiers, { cree = false } = {})
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
116
|
+
// Le conseil du connecteur Shopify officiel suit la conversation : présent aux premiers
|
|
117
|
+
// résultats, puis de loin en loin (voir rappelConnecteurShopify).
|
|
118
|
+
const conseilShopify = rappelConnecteurShopify();
|
|
119
|
+
|
|
116
120
|
server.registerTool(
|
|
117
121
|
'list_shops',
|
|
118
122
|
{
|
|
@@ -124,9 +128,10 @@ export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
|
124
128
|
garde(async () => {
|
|
125
129
|
const { boutiques = [] } = await appel(config, '/boutiques');
|
|
126
130
|
if (!boutiques.length) {
|
|
127
|
-
return ok(`Aucune boutique déclarée dans ce compte Story Thème (espace membre > Boutiques).\n\n${AIDE_BRANCHEMENT}`, { boutiques });
|
|
131
|
+
return ok([`Aucune boutique déclarée dans ce compte Story Thème (espace membre > Boutiques).\n\n${AIDE_BRANCHEMENT}`, conseilShopify()].filter(Boolean).join('\n\n'), { boutiques });
|
|
128
132
|
}
|
|
129
133
|
const lignes = boutiques.map((b) => `${b.branchee ? '●' : '○'} ${b.nom} — ${b.domaine}${b.branchee ? '' : ' (non branchée)'}`);
|
|
134
|
+
const conseil = conseilShopify();
|
|
130
135
|
const branchees = boutiques.filter((b) => b.branchee).length;
|
|
131
136
|
return ok(
|
|
132
137
|
[
|
|
@@ -140,6 +145,7 @@ export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
|
140
145
|
// Une seule boutique branchée sur trois, c'est deux marchands qui ignorent encore
|
|
141
146
|
// que c'est possible : la marche à suivre reste affichée tant qu'il en manque une.
|
|
142
147
|
branchees < boutiques.length ? `${branchees ? '\n' : ''}${AIDE_BRANCHEMENT}` : '',
|
|
148
|
+
conseil ? `\n${conseil}` : '',
|
|
143
149
|
]
|
|
144
150
|
.filter((ligne) => ligne !== '')
|
|
145
151
|
.join('\n'),
|
|
@@ -363,6 +369,7 @@ export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
|
363
369
|
resultat.theme.role === 'main' ? '' : 'Le marchand vérifie sur ordinateur et sur mobile, puis publie lui-même.',
|
|
364
370
|
exclus.length && !voulus ? `Modèles exclus du projet mais toujours présents dans ce thème : ${exclus.slice(0, 8).join(', ')}${exclus.length > 8 ? '…' : ''}.` : '',
|
|
365
371
|
voulus ? `Envoi limité à : ${voulus.join(', ')} ; le reste du thème n'a pas été touché.` : 'Images, produits, collections, menus et réductions restent à créer côté Shopify : review_project en donne la liste.',
|
|
372
|
+
conseilShopify(),
|
|
366
373
|
]
|
|
367
374
|
.filter(Boolean)
|
|
368
375
|
.join('\n'),
|
|
@@ -485,6 +492,7 @@ export function registerDirectTools(server, config, { ctx, ok, garde }) {
|
|
|
485
492
|
repris.length ? repris.slice(0, 20).map((chemin) => `- ${chemin}`).join('\n') + (repris.length > 20 ? `\n- … ${repris.length - 20} autre(s)` : '') : 'Le projet était déjà identique à la boutique.',
|
|
486
493
|
'',
|
|
487
494
|
'Le projet reflète maintenant la boutique, modifications faites à la main comprises. Modifiez (read_file, edit_template, compose_page…), puis renvoyez avec push_to_shop dans ce même thème. undo revient à la version d’avant la relecture.',
|
|
495
|
+
conseilShopify(),
|
|
488
496
|
]
|
|
489
497
|
.filter(Boolean)
|
|
490
498
|
.join('\n'),
|
package/src/shops/format.js
CHANGED
|
@@ -17,7 +17,7 @@ export function formatShopList(data) {
|
|
|
17
17
|
const lignes = [BANDEAU, `Compte : ${data.account?.email || '?'} · ${shops.length} boutique${shops.length > 1 ? 's' : ''} connectée${shops.length > 1 ? 's' : ''}`, ''];
|
|
18
18
|
if (!shops.length) {
|
|
19
19
|
lignes.push(
|
|
20
|
-
"Aucune boutique connectée. Pour en connecter une : installez l'appli Story Theme Apps sur la boutique (depuis l'espace membre Story Thème, page
|
|
20
|
+
"Aucune boutique connectée. Pour en connecter une : installez l'appli Story Theme Apps sur la boutique (depuis l'espace membre Story Thème, page Story Theme Apps), et branchez la boutique avec Theme Access (même page).",
|
|
21
21
|
);
|
|
22
22
|
return lignes.join('\n');
|
|
23
23
|
}
|
package/src/theme/source.js
CHANGED
|
@@ -19,7 +19,7 @@ import path from 'node:path';
|
|
|
19
19
|
import { unzipSync } from 'fflate';
|
|
20
20
|
|
|
21
21
|
const AIDE_JETON = `Aucun thème disponible. Deux façons de brancher le MCP :
|
|
22
|
-
• un jeton : générez-le dans votre espace membre Story Thème (menu « MCP
|
|
22
|
+
• un jeton : générez-le dans votre espace membre Story Thème (menu « MCP »), puis ajoutez STORY_MCP_TOKEN à la configuration du MCP ;
|
|
23
23
|
• un dossier : pointez STORY_THEME_DIR sur un thème Story déjà décompressé.`;
|
|
24
24
|
|
|
25
25
|
/** Erreur de licence : le jeton est refusé ou l'abonnement n'est plus actif. Jamais un repli. */
|
package/src/version.js
CHANGED