@kiubi/mcp-designer 1.0.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.
Files changed (65) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +219 -0
  3. package/package.json +57 -0
  4. package/src/app.ts +39 -0
  5. package/src/index.ts +21 -0
  6. package/src/lib/stemmer.ts +38 -0
  7. package/src/lib/theme-checker/block-validator.ts +353 -0
  8. package/src/lib/theme-checker/checker.ts +897 -0
  9. package/src/lib/theme-checker/filter-validator.ts +163 -0
  10. package/src/lib/theme-checker/index.ts +6 -0
  11. package/src/lib/theme-checker/inspector.ts +193 -0
  12. package/src/lib/theme-checker/lang.ts +42 -0
  13. package/src/lib/theme-checker/parsers/component-xml.ts +120 -0
  14. package/src/lib/theme-checker/parsers/model-xml.ts +82 -0
  15. package/src/lib/theme-checker/parsers/post-type-xml.ts +92 -0
  16. package/src/lib/theme-checker/parsers/symbol-xml.ts +162 -0
  17. package/src/lib/theme-checker/parsers/theme-xml.ts +102 -0
  18. package/src/lib/theme-checker/types.ts +97 -0
  19. package/src/logger.ts +28 -0
  20. package/src/tool.ts +13 -0
  21. package/src/tools/create_type.ts +535 -0
  22. package/src/tools/detail_type.ts +208 -0
  23. package/src/tools/get_doc_section.ts +201 -0
  24. package/src/tools/list_types.ts +87 -0
  25. package/src/tools/list_widgets.ts +181 -0
  26. package/src/tools/ruleset.ts +25 -0
  27. package/src/tools/search_doc.ts +160 -0
  28. package/src/tools/validate_theme.ts +63 -0
  29. package/storage/definitions/blog.json +1444 -0
  30. package/storage/definitions/catalogue.json +2817 -0
  31. package/storage/definitions/cms.json +1002 -0
  32. package/storage/definitions/commandes.json +2409 -0
  33. package/storage/definitions/comptes.json +780 -0
  34. package/storage/definitions/modules.json +418 -0
  35. package/storage/definitions/recherche.json +804 -0
  36. package/storage/documents/CLAUDE.exemple.md +281 -0
  37. package/storage/documents/generated/exemples.md +8054 -0
  38. package/storage/documents/generated/integration/01_theme_perso.md +182 -0
  39. package/storage/documents/generated/integration/02_modeles.md +220 -0
  40. package/storage/documents/generated/integration/03_widgets.md +139 -0
  41. package/storage/documents/generated/integration/04_blocs.md +45 -0
  42. package/storage/documents/generated/integration/05_balises.md +43 -0
  43. package/storage/documents/generated/integration/06_balises_globales.md +201 -0
  44. package/storage/documents/generated/integration/07_balises_widget.md +257 -0
  45. package/storage/documents/generated/integration/08_types_billets.md +154 -0
  46. package/storage/documents/generated/integration/09_types_produits.md +77 -0
  47. package/storage/documents/generated/integration/10_types_composants.md +142 -0
  48. package/storage/documents/generated/integration/11_symboles.md +156 -0
  49. package/storage/documents/generated/integration/12_mediatheque.md +66 -0
  50. package/storage/documents/generated/integration/13_includes.md +25 -0
  51. package/storage/documents/generated/integration/14_404.md +32 -0
  52. package/storage/documents/generated/integration/15_arianne.md +62 -0
  53. package/storage/documents/generated/integration/16_fermeture.md +36 -0
  54. package/storage/documents/generated/integration/17_recherche.md +36 -0
  55. package/storage/documents/generated/integration/18_cms.md +582 -0
  56. package/storage/documents/generated/integration/19_modules.md +479 -0
  57. package/storage/documents/generated/integration/20_blog.md +946 -0
  58. package/storage/documents/generated/integration/21_catalogue.md +1834 -0
  59. package/storage/documents/generated/integration/22_commandes.md +2772 -0
  60. package/storage/documents/generated/integration/23_comptes.md +1195 -0
  61. package/storage/documents/generated/integration/24_recherche.md +542 -0
  62. package/storage/documents/hors_sujet_regles.md +43 -0
  63. package/storage/documents/kiubi_api.md +6690 -0
  64. package/storage/documents/kiubi_ruleset.md +419 -0
  65. package/storage/documents/kiubi_workflows.md +121 -0
@@ -0,0 +1,419 @@
1
+ # Kiubi CMS : Règles d'intégration
2
+
3
+ > Ce document est la référence des contraintes structurelles, des conventions de code et des règles métier à respecter
4
+ > dans toute intégration Kiubi. Il est lu une fois avant toute tâche.
5
+
6
+ ## RÈGLES STRUCTURELLES
7
+
8
+ ### Hiérarchie des blocs du moteur de template html
9
+
10
+ | Règles absolues | Contrainte |
11
+ |:----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
12
+ | Appariement | Chaque `<!-- BEGIN:XXX -->` doit avoir son `<!-- END:XXX -->` correspondant |
13
+ | Hiérarchie | Un bloc ne peut exister que s'il est imbriqué dans son parent direct tel que défini par la documentation technique. Ne jamais placer un bloc à un niveau non documenté. |
14
+ | Unicité | Un même bloc ne doit apparaître qu'une seule fois par fichier, sauf indication contraire explicite dans la documentation |
15
+ | Nommage | Les noms de blocs doivent correspondre exactement à ceux de la documentation. Une personnalisation n'est autorisée que si la documentation le spécifie explicitement (ex : champs de billets, composants, etc.) |
16
+ | Casse | Les noms de blocs s'écrivent en minuscules : `<!-- BEGIN: main -->` est correct, `<!-- BEGIN: MAIN -->` est interdit |
17
+
18
+ Exemple de hiérarchie valide : `main.collection.item.title`
19
+
20
+ ```html
21
+ <!-- BEGIN: main -->
22
+ <!-- BEGIN: collection -->
23
+ <!-- BEGIN: item -->
24
+ <!-- BEGIN: title --><!-- END: title -->
25
+ <!-- END: item -->
26
+ <!-- END: collection -->
27
+ <!-- END: main -->
28
+ ```
29
+
30
+ ### Commentaires HTML
31
+
32
+ **Caractères autorisés dans les commentaires :** lettres `a-z` / `A-Z`, chiffres `0-9`, tiret simple `-`, underscore
33
+ simple `_`, espace.
34
+
35
+ **Tout le reste est interdit**, sans exception :
36
+
37
+ - Caractères accentués (`é`, `è`, `à`, `ç`…). Si un nom contient un accent, le translittérer. Ex : `Témoignages` → `Temoignages`.
38
+ - Entités HTML (`&eacute;`, `&agrave;`…), même pour écrire un mot accentué
39
+ - Tirets doubles `--` ou underscores doubles `__`, tiret long (`—`)
40
+ - Tout autre caractère spécial
41
+
42
+ Exemples :
43
+
44
+ ```html
45
+ <!-- Correct -->
46
+ <!-- Template du Widget Temoignages -->
47
+
48
+ <!-- INTERDIT -->
49
+ <!-- Template du Widget Témoignages -->
50
+ <!-- Template du Widget T&eacute;moignages -->
51
+ ```
52
+
53
+ ---
54
+
55
+ ## CHAMPS PERSONNALISÉS
56
+
57
+ ### Règles de nommage universelles
58
+
59
+ S'appliquent à **tous** les champs personnalisés (billets, produits, composants, symboles).
60
+
61
+ | Règle | Contrainte |
62
+ |:---------------------|:------------------------------------------------------------------------------------------------------------------------------------|
63
+ | Caractères autorisés | Lettres minuscules `a-z` et chiffres `0-9` uniquement |
64
+ | Caractères interdits | Espaces, tirets `-`, underscores `_`, tout caractère spécial |
65
+ | Langue | Anglais recommandé pour les composants et symboles (`content`, `subtitle`, `bgcolor`, `image`, `button`, `link`) |
66
+ | Attribut `aide` | Obligatoire dans `config.xml` pour expliquer l'utilité du champ, sauf si le nom est universellement compréhensible (ex : `Contenu`) |
67
+
68
+ ### Champs par type de template
69
+
70
+ | Champ | Billet | Billet du blog / Produit | Composant / Symbole | Remarque |
71
+ |:----------------------|:----------------|:-------------------------|:--------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
72
+ | `titre` | **Obligatoire** | **Interdit** | **Interdit** | Titre natif du billet |
73
+ | `sstitre` | Facultatif | **Interdit** | **Interdit** | Utiliser de préférence plutôt qu'un champ `text` dédié |
74
+ | `texte1` | **Obligatoire** | Facultatif | **Interdit** | Contenu rédactionnel principal. Privilégier `wysiwyg` |
75
+ | `texte2` à `texte5` | Facultatif | Facultatif | **Interdit** | Contenus rédactionnels alternatifs |
76
+ | `texte6` à `texte9` | Facultatif | Facultatif | **Interdit** | Données diverses (méta, infos complémentaires, paramètres) |
77
+ | `texte10` à `texte15` | Facultatif | Facultatif | **Interdit** | Fichiers et images |
78
+ | `title` | **Interdit** | **Interdit** | **Obligatoire** | Obligatoire au niveau composant ET dans chaque item de collection, qu'il soit affiché en front-office ou non. Sa présence dans `config.xml` est non négociable. Facultatif dans `desc.xml` d'un symbole |
79
+ | `subtitle` | **Interdit** | **Interdit** | Facultatif | Sous-titre du composant ou de l'item |
80
+ | `content` | **Interdit** | **Interdit** | Facultatif | Nom imposé pour le contenu principal du composant. Privilégier `wysiwyg` |
81
+ | `img` | **Interdit** | **Interdit** | Facultatif | Nom imposé pour le champ image du composant |
82
+ | Autres champs libres | Facultatif | Facultatif | Facultatif | Nommage selon les règles de la section précédente |
83
+
84
+ ### Uniformisation des noms de champs
85
+
86
+ Avant de nommer un nouveau champ, inspecter les templates existants du même type pour identifier les noms déjà en usage
87
+ dans le projet. Si un champ remplit la même fonction, réutiliser le même nom, y compris pour les champs de la plage
88
+ `texteN`.
89
+
90
+ Exemples :
91
+
92
+ - Si `texte9` contrôle l'alignement partout dans le projet → utiliser `texte9` pour cette fonction dans le nouveau
93
+ template.
94
+ - Si `bgcolor` contrôle la couleur de fond dans les composants existants → utiliser `bgcolor` et non `backgroundcolor`
95
+ ou `bg`.
96
+
97
+ L'homogénéité des noms à travers le projet est préférable.
98
+
99
+ ### Règles spécifiques au champ `title`
100
+
101
+ Le champ `title` d'un composant peut apparaître simultanément hors item et dans un item : c'est une exception autorisée
102
+ à la règle d'unicité. Sa présence dans `config.xml` est obligatoire indépendamment de son affichage en front-office : ne
103
+ jamais le supprimer au motif qu'il ne s'affiche pas. Si le champ n'est pas affiché en front-office, préciser dans
104
+ l'attribut `aide` (ex : `aide="Le titre n'est pas affiché dans le site web mais permet d'identifier le composant dans
105
+ la console d'administration"`).
106
+
107
+ ### Types de champs disponibles
108
+
109
+ | Type | Description |
110
+ |:-----------|:----------------------------------------------|
111
+ | `text` | Champ de saisie simple (une ligne) |
112
+ | `textarea` | Champ de saisie multiligne |
113
+ | `wysiwyg` | Éditeur de texte visuel |
114
+ | `image` | Fichier image de la médiathèque |
115
+ | `fichier` | Fichier quelconque de la médiathèque |
116
+ | `select` | Champ de liste déroulante |
117
+ | `color` | Couleur hexadécimale |
118
+ | `date` | Date au format `dd/mm/YYYY` |
119
+ | `datetime` | Date et heure au format `dd/mm/YYYY hh:mm:ss` |
120
+ | `checkbox` | Case à cocher |
121
+
122
+ #### Champ de type `select`
123
+
124
+ Un champ `select` permet à l'éditeur de choisir parmi une liste de valeurs prédéfinies. Le comportement dépend de
125
+ l'attribut `value` de chaque `<option>` :
126
+
127
+ ```xml
128
+
129
+ <champ champ="monchamp" type="select" intitule="Mon champ">
130
+ <option value=""></option>
131
+ <option value="">Vide</option>
132
+ <option value=" ">Espace</option>
133
+ <option value="default">Par défaut</option>
134
+ </champ>
135
+ ```
136
+
137
+ | Déclaration | Valeur enregistrée | Valeur non vide | Usage recommandé |
138
+ |:----------------------------------------------|:-----------------------------------|:---------------:|:-------------------------------------------------------------------------------------------------|
139
+ | `<option value=""></option>` | Aucune, le champ reste sans valeur | Non | Permis pour de l'affichage conditionnel via BEGIN/END, mais non recommandé |
140
+ | `<option value="">Vide</option>` | Le libellé de l'option, ici `Vide` | Oui | À éviter : `value=""` est trompeur. Toujours préférer une valeur explicite (ex : `value="vide"`) |
141
+ | `<option value=" ">Espace</option>` | Un espace `" "` | Oui | Utilisable, mais peu lisible. Préférer une valeur explicite |
142
+ | `<option value="default">Par défaut</option>` | `default` | Oui | Forme recommandée : la valeur enregistrée est explicite et prévisible |
143
+
144
+ **Règle :** Ne jamais laisser `value=""` sur une option qui porte un libellé. La valeur enregistrée serait le libellé
145
+ lui-même, ce qui crée une ambiguïté entre la valeur affichée et la valeur stockée.
146
+
147
+ #### Autres règles spécifiques aux champs
148
+
149
+ - **Saturation d'une plage :** Si une plage `texte` est saturée, il est permis d'utiliser des champs de la plage
150
+ précédente, mais la cohérence doit être maintenue et `texte1` reste non négociable.
151
+ - **Imbrication interdite :** Les champs `texte1` à `texte15` ne s'imbriquent jamais entre eux. Ils sont toujours au
152
+ même niveau dans le bloc parent. Tout pattern `texteX.texteY` trouvé dans le projet est non conforme et ne doit pas
153
+ être reproduit.
154
+ - **Un champ personnalisé ne peut jamais être le bloc parent d'un autre champ personnalisé**, quel que soit son nom. Le
155
+ pattern `<!-- BEGIN:img --><!-- BEGIN:imgwidth -->` est **interdit** si `img` et `imgwidth` sont tous deux des champs
156
+ personnalisés.
157
+
158
+ ---
159
+
160
+ ## FILTRES
161
+
162
+ ### Règles absolues
163
+
164
+ | Règle | Contrainte |
165
+ |:----------------------------|:-------------------------------------------------------------------------------------------------------|
166
+ | Pas d'espace dans le filtre | La syntaxe `{balise\|filtre\|arg1\|arg2}` doit être compacte. `{balise\|mapValue\| arg1}` est invalide |
167
+ | Un seul filtre par balise | `{balise\|filtre1\|filtre2}` est **interdit** |
168
+
169
+ ### Filtre `mapValue` (affichage conditionnel)
170
+
171
+ Teste si une balise renvoie une valeur interprétée comme "vraie".
172
+
173
+ - **Valeurs "vraies" :** `1`, `actif`, `checked`, `selected`, `erreur`
174
+ - **Syntaxe :** `{balise|mapValue|valeur_si_vrai|valeur_si_faux}`, 2 arguments maximum
175
+ - **Usages courants :** classe CSS, attribut HTML, toute valeur textuelle conditionnelle
176
+ - **Valeur par défaut :** `valeur_si_faux` s'applique quand la balise ne renvoie pas une valeur vraie
177
+ - **Champs personnalisés avec `mapValue` :** le champ doit toujours avoir une valeur définie pour les deux états (ex :
178
+ `0` et `1`). Un champ vide ou absent est interprété comme faux.
179
+
180
+ | Cas d'usage | Syntaxe | Résultat |
181
+ |:-----------------------|:-----------------------------------------------------------|:--------------------------------------------------------|
182
+ | Valeur si VRAI | `{erreur\|mapValue\|is-invalid}` | Applique `is-invalid` si `erreur` renvoie `erreur` |
183
+ | Valeur si FAUX | `{is_active\|mapValue\|\|text-muted}` | Applique `text-muted` si `is_active` ne renvoie pas `1` |
184
+ | Alternative de valeurs | `{actif\|mapValue\|active\|inactive}` | `active` si vrai, `inactive` si faux |
185
+ | Multi-valeurs | `{my_tag\|mapValue\|class1} {my_tag\|mapValue\|class2}` | Répéter la balise pour chaque valeur à appliquer |
186
+ | Première position | `{position\|mapValue\|first-position\|not-first-position}` | Aussi possible avec `compteur` |
187
+ | Niveau d'une page | `{niveau\|mapValue\|first-level\|not-first-level}` | `first-level` si page de niveau 1 |
188
+ | Page fille | `{page_fille\|mapValue\|has-child\|no-child}` | `has-child` si la page a une page fille |
189
+
190
+ ### Filtre `htmlentities`
191
+
192
+ Convertit les caractères spéciaux d'une valeur en entités HTML (`<` devient `&lt;`, `&` devient `&amp;`, etc.) pour
193
+ éviter qu'ils soient interprétés par le navigateur.
194
+
195
+ **Cas d'usage principal :** toujours utiliser `htmlentities` quand une balise Kiubi est placée dans un attribut HTML qui
196
+ affiche du contenu éditorial libre :
197
+
198
+ ```html
199
+ <img src="..." alt="{alt|htmlentities}" title="{title|htmlentities}">
200
+ <div data-label="{label|htmlentities}">
201
+ ```
202
+
203
+ **Inutile dans les cas suivants :**
204
+
205
+ - Champ de type `wysiwyg` (le CMS gère déjà l'échappement)
206
+ - Balises Kiubi nativement conçues pour être dans un attribut (métadonnées, `{url}`, `{slug}`, etc.) dont les valeurs
207
+ sont propres par nature
208
+ - Partout ailleurs hors attribut HTML
209
+
210
+ ### Filtre `alternate` (séquence numérique modulo)
211
+
212
+ Génère une séquence numérique cyclique. **Ce n'est pas un filtre conditionnel.**
213
+
214
+ - **Syntaxe :** `{position|alternate|3}` → produit `1`, `2`, `3`, `1`, `2`, `3`, …
215
+ - **Argument unique :** ne peut pas prendre d'argument supplémentaire après le chiffre (`{position|alternate|3|XXX}` est
216
+ invalide)
217
+ - **Balise recommandée :** `position` dans les collections de composants (`compteur` n'est pas disponible dans ce
218
+ contexte)
219
+
220
+ ---
221
+
222
+ ## LIVRABLES ET COHÉRENCE DES FICHIERS
223
+
224
+ ### Fichiers obligatoires par contexte
225
+
226
+ | Contexte | Fichiers obligatoires |
227
+ |:-------------------|:------------------------------------------------------------------------|
228
+ | Billet site web | `index.html` + `config.xml` |
229
+ | Billet blog | `config.xml` |
230
+ | Produit | `index.html` + `config.xml` |
231
+ | Composant | `index.html` + `config.xml` |
232
+ | Symbole | `index.html` + `desc.xml` + `structure.xhtml` |
233
+ | Template principal | `index.html` + `desc.xml` + `structure.xhtml` |
234
+ | Widget | `index.html` + éventuellement d'autres fichiers `.html` selon le widget |
235
+
236
+ Tous les fichiers obligatoires d'un contexte doivent être produits ensemble, sauf instruction explicite de ne livrer que
237
+ l'un d'eux.
238
+
239
+ Pour les widgets, consulter la documentation technique pour connaître la liste exacte des fichiers attendus.
240
+
241
+ ### Emplacement des répertoires
242
+
243
+ Chaque template est créé dans un sous-répertoire **direct** du répertoire correspondant à son type ; jamais imbriqué
244
+ dans un sous-répertoire existant.
245
+
246
+ | Type | Répertoire parent |
247
+ |:-----------------------------|:-----------------------------------------|
248
+ | Billet site web | `theme/[lg]/billets/` |
249
+ | Billet blog (`config.xml`) | `theme/[lg]/billets_blog/` |
250
+ | Billet blog (`index.html`) | `theme/[lg]/widgets/blog/detail_billet/` |
251
+ | Composant | `theme/[lg]/composants/` |
252
+ | Produit | `theme/[lg]/produits/` |
253
+ | Symbole | `theme/[lg]/symboles/` |
254
+ | Template principal | `theme/[lg]/templates/` |
255
+ | Widget (template alternatif) | `theme/[lg]/widgets/[service]/[widget]/` |
256
+
257
+ ### Spécificités des widgets
258
+
259
+ Un répertoire de widget a la structure suivante :
260
+
261
+ ```
262
+ theme/[lg]/widgets/[service]/[widget]/
263
+ ├── index.html ← template principal du widget (rendu par défaut)
264
+ ├── liste.html ← autres fichiers .html du widget (selon le widget)
265
+ ├── vignette.html
266
+ └── mon_template/ ← template alternatif (sous-répertoire direct)
267
+ ├── index.html
268
+ └── ...
269
+ ```
270
+
271
+ Règles d'exploration :
272
+
273
+ - Le `index.html` à la racine du widget est le template principal → il doit être lu au même titre que les autres
274
+ fichiers.
275
+ - Les autres fichiers `.html` à la racine (`liste.html`, `vignette.html`, etc.) sont des templates secondaires du même
276
+ widget → les lire aussi.
277
+ - Les sous-répertoires directs sont des templates alternatifs, chacun peut contenir ses propres fichiers `.html`.
278
+ - Tous ces fichiers doivent être pris en compte quand on travaille sur un widget.
279
+
280
+ Le template alternatif est un sous-répertoire **direct** du répertoire du widget, jamais imbriqué dans un template
281
+ alternatif existant.
282
+
283
+ Exemple valide : `theme/fr/widgets/site_web/bloc_extrait/mon_template/`
284
+ Exemple interdit : `theme/fr/widgets/site_web/bloc_extrait/template_existant/mon_template/`
285
+
286
+ ### Répertoires `/includes/`
287
+
288
+ | Emplacement | Chemin | Quand l'utiliser |
289
+ |:---------------------|:-----------------------|:----------------------------------------------|
290
+ | Racine du thème | `theme/includes/` | Include sans texte spécifique à une langue |
291
+ | Répertoire de langue | `theme/[lg]/includes/` | Include contenant du texte propre à la langue |
292
+
293
+ ### Répertoire `/modules/`
294
+
295
+ `theme/[lg]/modules/[nom-du-module]/`
296
+
297
+ | Module | Répertoire |
298
+ |:-------------------|:--------------------------------|
299
+ | Page d'erreur 404 | `theme/[lg]/modules/404/` |
300
+ | Fil d'Ariane | `theme/[lg]/modules/chemin/` |
301
+ | Page de fermeture | `theme/[lg]/modules/fermeture/` |
302
+ | Sélecteur de sites | `theme/[lg]/modules/selecteur/` |
303
+
304
+ ### Cohérence `index.html` / `config.xml` (et `desc.xml` pour les symboles)
305
+
306
+ | Règle | Contrainte |
307
+ |:---------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|
308
+ | Inséparabilité | Si un template utilise des champs personnalisés, le `config.xml` (ou `desc.xml`) doit être produit en même temps |
309
+ | Pas de déclaration inutile | Tout champ déclaré dans `config.xml` (ou `desc.xml`) doit être utilisé dans `index.html`. Exception : champ utilisé exclusivement par un bloc d'extrait lié |
310
+
311
+ #### Cas particulier : billet du blog
312
+
313
+ Le `config.xml` et le `index.html` du billet blog sont **complètement indépendants** l'un de l'autre :
314
+
315
+ - `config.xml` → définit un **type de contenu** (champs éditoriaux disponibles dans le back-office)
316
+ - `index.html` → définit une **mise en page** (rendu visuel en front-office)
317
+
318
+ La relation est **n:m** : plusieurs types de contenu peuvent utiliser la même mise en page, et une même mise en page
319
+ peut afficher plusieurs types de contenu. Il n'y a aucun lien structurel entre un `config.xml` dans `billets_blog/` et
320
+ un `index.html` dans `widgets/blog/detail_billet/`.
321
+
322
+ **Conséquences opérationnelles :**
323
+
324
+ - Ne jamais créer automatiquement un `index.html` lors de la création d'un `config.xml`, ni l'inverse, sauf instruction
325
+ explicite.
326
+ - Si la demande est ambiguë (type de contenu, mise en page, ou les deux), demander avant de continuer.
327
+
328
+ #### Cas particulier : bloc d'extrait
329
+
330
+ Un bloc d'extrait est toujours dépendant d'un billet. Avant toute action, il est **obligatoire** de poser cette question
331
+ à l'utilisateur :
332
+
333
+ > **Le `config.xml` du billet associé existe-t-il déjà ?**
334
+
335
+ Ne jamais commencer la création du bloc d'extrait sans avoir reçu une réponse explicite à cette question.
336
+
337
+ - **Oui** → demander quel billet. Ne pas créer de `config.xml`, le billet utilisant ce `config.xml` sera le support
338
+ éditorial du bloc d'extrait.
339
+ - **Non** → créer le `config.xml` du billet en même temps que le bloc d'extrait.
340
+
341
+ Si la demande ne précise rien, poser la question avant de continuer.
342
+
343
+ ### Zonage des templates principaux et symboles
344
+
345
+ Tout template principal et tout symbole doit obligatoirement avoir une zone `id="contenu"` de `type="contenu"` :
346
+
347
+ ```xml
348
+
349
+ <zone id="contenu" colmax="3" intitule="Contenu" defaut="1" type="contenu"/>
350
+ ```
351
+
352
+ **Règle de construction :** partir toujours de la zone `id="contenu"`, puis ajouter les zones supplémentaires si
353
+ nécessaire. Ne jamais partir des zones additionnelles sans avoir défini la zone `id="contenu"` d'abord.
354
+
355
+ **Attribut `type="contenu"` :** seules les zones déclarées avec `type="contenu"` acceptent des billets, composants et
356
+ symboles dans la console d'administration. Une zone sans cet attribut ne peut recevoir que des widgets. La zone
357
+ `id="contenu"` doit toujours avoir `type="contenu"`.
358
+
359
+ **Ordre des zones :** suivre un ordre logique en fonction de la structure visuelle attendue du template, de haut en bas
360
+ et de gauche à droite. Par exemple, pour un template classique :
361
+
362
+ ```xml
363
+
364
+ <zones defaut="contenu">
365
+ <zone id="entete" colmax="1" intitule="Entete" defaut="1"/>
366
+ <zone id="menu" colmax="1" intitule="Menu" defaut="1"/>
367
+ <zone id="contenu" colmax="3" intitule="Contenu" defaut="1" type="contenu"/>
368
+ <zone id="sidebar" colmax="1" intitule="Sidebar" defaut="1" type="contenu"/>
369
+ <zone id="piedepage" colmax="3" intitule="Pied de page" defaut="1"/>
370
+ </zones>
371
+ ```
372
+
373
+ **`<zones defaut="...">` :** toujours pointer sur `contenu` sauf raison explicite contraire.
374
+
375
+ ### Uniformité des noms de zones entre templates principaux
376
+
377
+ **Règle absolue :** les noms de zones (`id`) doivent être identiques d'un template principal à l'autre pour toute zone
378
+ qui remplit le même rôle fonctionnel, indépendamment des variations visuelles ou structurelles du template.
379
+
380
+ **En pratique :** avant de nommer une zone, inspecter les templates principaux existants du projet et réutiliser les
381
+ `id` déjà en place pour les zones de même rôle. Ne jamais inventer un nouveau nom si un nom équivalent existe déjà.
382
+
383
+ **Exemple :** une sidebar reste `sidebar` qu'elle soit positionnée à gauche ou à droite, large ou étroite. Ce qui
384
+ change, c'est sa position dans `structure.xhtml`, pas son `id`.
385
+
386
+ | Situation | Correct | Incorrect |
387
+ |:-------------------------------------|:-----------------|:---------------------------------------------|
388
+ | Sidebar, quelle que soit sa position | `id="sidebar"` | `id="sidebar_droite"`, `id="sidebar_gauche"` |
389
+ | En-tête, même si réduit | `id="entete"` | `id="entete_compact"` |
390
+ | Pied de page | `id="piedepage"` | `id="footer"` |
391
+
392
+ **Cas d'un rôle vraiment nouveau** (zone sans équivalent dans les templates existants) : choisir un nom court, en
393
+ minuscules, sans tirets ni underscores, qui décrit le rôle fonctionnel, pas la position visuelle.
394
+
395
+ ### Rédaction de `structure.xhtml`
396
+
397
+ Le fichier `structure.xhtml` définit la grille de mise en page via un tableau HTML.
398
+
399
+ - **Zones pleine largeur :** occupent toute la largeur, utilisent `colspan="N"` (N = nombre total de colonnes).
400
+ - **Zones en colonne :** dès qu'un `<tr>` contient plusieurs `<td>`, chaque `<td>` doit porter un attribut `width="%"`.
401
+ L'ensemble des largeurs doit totaliser 100 %.
402
+
403
+ Exemple avec sidebar à droite :
404
+
405
+ ```xml
406
+
407
+ <table>
408
+ <tr>
409
+ <td colspan="2">{annonce}</td>
410
+ </tr>
411
+ <tr>
412
+ <td width="65%">{contenu}</td>
413
+ <td width="35%">{sidebar}</td>
414
+ </tr>
415
+ <tr>
416
+ <td colspan="2">{piedepage}</td>
417
+ </tr>
418
+ </table>
419
+ ```
@@ -0,0 +1,121 @@
1
+ # Kiubi CMS : Workflows d'intégration
2
+
3
+ > Ce document décrit les workflows à suivre selon le type de tâche d'intégration. Consulter le workflow applicable à chaque tâche.
4
+
5
+ ---
6
+
7
+ ## Workflow A : Modification d'un template Kiubi existant
8
+
9
+ **Action préalable :** Annoncer `Workflow A : Modification d'un template Kiubi existant`
10
+
11
+ **Étapes à suivre dans l'ordre :**
12
+
13
+ 1. **Analyse :** Lire le `index.html` et le `config.xml` existants pour comprendre la structure. Pour un widget, lister et lire **tous** les fichiers `.html` du répertoire, pas uniquement `index.html`.
14
+ 2. **Inspection :** Inspecter les templates existants du même type pour évaluer la cohérence CSS et HTML du projet.
15
+ 3. **Plan d'action :** Exposer les modifications envisagées. **→ Attendre une validation explicite avant de continuer.**
16
+ 4. **Modification :** Ajouter ou modifier des éléments en respectant les blocs et la logique en place.
17
+
18
+ ---
19
+
20
+ ## Workflow B : Création ou conversion d'un template Kiubi
21
+
22
+ **Action préalable :** Annoncer `Workflow B : Création ou conversion d'un template Kiubi`
23
+
24
+ **Étapes à suivre dans l'ordre :**
25
+
26
+ 1. **Identification du mode :** Demander obligatoirement à l'utilisateur lequel des trois modes s'applique, quelle que soit l'instruction reçue :
27
+
28
+ | Mode | Instruction typique | HTML fourni | Approche |
29
+ | :--- | :--- | :--- | :--- |
30
+ | **Préservation** | "convertis ce HTML", "intègre ce HTML tel quel", "garde la mise en page" | Oui | Conserver au maximum la structure, le balisage et les classes CSS d'origine. Les modifications se limitent à ce qu'imposent les règles des sections Règles structurelles, Champs personnalisés, Filtres et Livrables. |
31
+ | **Adaptation** | "inspire-toi de ce HTML", "adapte au thème", "reprends la structure mais adapte le style" | Oui | S'inspirer du HTML fourni pour produire un template cohérent avec le thème existant (classes, wrappers, conventions CSS du projet). |
32
+ | **Création autonome** | "crée un composant", "fais-moi un template", "nouveau billet" | Non | Construire le template de toutes pièces en s'appuyant uniquement sur les templates existants du projet comme référence visuelle et structurelle. |
33
+
34
+ **Cette question est obligatoire à chaque déclenchement du Workflow B**, même si une réponse a déjà été donnée en début de session. Le mode peut changer d'un template à l'autre. Ne jamais supposer que le mode de la conversion précédente s'applique à la suivante.
35
+
36
+ > Formulation suggérée : "Dois-je préserver ce HTML tel quel, m'en inspirer pour l'adapter au thème, ou créer le template de toutes pièces à partir des patterns du projet ?"
37
+
38
+ **→ Attendre une validation explicite avant de passer à l'étape suivante.**
39
+
40
+ 2. **Qualification :** Définir la nature exacte du livrable : billet, composant, widget, symbole, template principal ? Cette décision conditionne toutes les étapes suivantes. En cas de doute, l'exposer dans le plan d'action (étape 4) et attendre confirmation.
41
+
42
+ 3. **Inspection :** Inspecter les templates existants du même type pour la cohérence CSS et HTML.
43
+ - En mode **Création autonome**, cette étape est la source principale. Lire attentivement plusieurs templates existants du même type pour identifier les patterns visuels (classes, wrappers, structure HTML), les champs utilisés et les conventions de nommage. C'est à partir de cette lecture que le nouveau template est construit.
44
+
45
+ 4. **Plan d'action :** Avant de produire quoi que ce soit, exposer un plan détaillé contenant :
46
+ - Nature exacte du livrable et fichiers à créer
47
+ - Blocs Kiubi envisagés et leur hiérarchie
48
+ - Champs personnalisés prévus (noms, types, rôles)
49
+ - Zones si applicable
50
+ - Points ambigus ou choix structurels nécessitant une décision
51
+
52
+ **→ Attendre une validation explicite avant de passer à l'étape suivante.**
53
+
54
+ 5. **Structure :** Compléter les blocs `<!-- BEGIN:XXX -->` et `<!-- END:XXX -->` en respectant la hiérarchie Kiubi.
55
+
56
+ 6. **Dynamisation :** Remplacer les contenus statiques par les balises Kiubi appropriées (`{title}`, `{content}`, etc.).
57
+
58
+ ---
59
+
60
+ ## Workflow C : Intégration d'un HTML brut avec dépendances en template principal
61
+
62
+ **Action préalable :** Annoncer `Workflow C : Intégration d'un HTML brut avec dépendances en template principal`
63
+
64
+ **Contexte d'application :** Un fichier HTML statique accompagné de ses fichiers de dépendances (CSS, JS, images, fonts, etc.) est à intégrer comme template principal dans `theme/[lg]/templates/`. Le fichier HTML est fourni directement dans la conversation. Les fichiers de dépendances sont déposés au préalable dans `temp/`.
65
+
66
+ **Étapes à suivre dans l'ordre :**
67
+
68
+ 1. **Inventaire :** À partir du HTML fourni, identifier toutes les dépendances en suivant l'arbre complet : CSS, JS, images, fonts, et toute autre ressource externe référencée directement dans le HTML, mais aussi les dépendances de ces fichiers (ex : un CSS qui importe une font, un JS qui charge un autre JS), récursivement. Tout fichier présent dans `temp/` mais non atteignable depuis ce HTML est ignoré et ne doit pas être déplacé ni déclaré.
69
+
70
+ 2. **Doublons :** Avant de déplacer, comparer chaque fichier avec ceux déjà présents dans `theme/assets/`. Si un fichier du même nom existe déjà, identifier les différences et soumettre le cas à l'utilisateur avec les trois options suivantes :
71
+
72
+ | Option | Action |
73
+ | :--- | :--- |
74
+ | **Écraser** | Remplacer le fichier existant par le nouveau |
75
+ | **Conserver les deux** | Renommer l'existant en ajoutant le suffixe `.backup` avant l'extension (ex : `bootstrap.min.css` → `bootstrap.min.backup.css`), puis déplacer le nouveau avec son nom d'origine |
76
+ | **Garder l'existant** | Ignorer le nouveau fichier, ne rien déplacer |
77
+
78
+ **→ Attendre une décision explicite pour chaque doublon avant de continuer.** Si aucun doublon : déplacer directement.
79
+
80
+ 3. **Déplacement :** Placer chaque fichier dans le sous-répertoire adapté de `theme/assets/` :
81
+
82
+ | Type | Destination |
83
+ |:-------|:----------------------------------|
84
+ | CSS | `theme/assets/css/` |
85
+ | JS | `theme/assets/js/` |
86
+ | Images | `theme/assets/img/` |
87
+ | Fonts | `theme/assets/fonts/` |
88
+ | Autres | Sous-répertoire le plus approprié |
89
+
90
+ 4. **Liens internes :** Dans chaque fichier déplacé, recalculer les chemins vers ses propres dépendances (ex : un CSS qui référence des fonts ou des images) en fonction de son nouvel emplacement.
91
+
92
+ 5. **Injection dans les includes :** Ajouter les liens dans les fichiers d'includes, après les liens existants et avant les fichiers de surcouche :
93
+
94
+ | Fichier | Position d'insertion |
95
+ |:-----------------------------------|:--------------------------------|
96
+ | `theme/[lg]/includes/css.html` | Avant `{Stylesheet}` |
97
+ | `theme/[lg]/includes/js-head.html` | Avant le script `kiubi.api.pfo` |
98
+ | `theme/[lg]/includes/js-body.html` | Avant `js.js` |
99
+
100
+ Encadrer les ajouts d'un commentaire d'identification :
101
+ ```html
102
+ <!-- Dependances : nom-du-template -->
103
+ <link rel="stylesheet" href="{theme}/{lg}/assets/css/ma-dependance.css">
104
+ <!-- / Dependances : nom-du-template -->
105
+ ```
106
+
107
+ 6. **Rapport :** Produire un rapport listant :
108
+ - Les fichiers ajoutés et leur répertoire de destination
109
+ - Les liens ajoutés dans chaque fichier d'includes
110
+ - Les fichiers en doublon et leur renommage (ancien nom → nouveau nom)
111
+
112
+ 7. **Stratégie des zones :** Utiliser le tool disponible pour inspecter les templates principaux existants et proposer une stratégie. Deux modes sont possibles :
113
+
114
+ | Mode | Description |
115
+ | :--- | :--- |
116
+ | **Zones utiles uniquement** | Conserver le code d'origine et placer uniquement les zones nécessaires pour dynamiser le template (contenu éditorial, navigation, etc.) |
117
+ | **Zones utiles + zones utilitaires** | Conserver le code d'origine, placer les zones utiles, et ajouter les zones utilitaires déjà présentes dans les autres templates du projet (ex : bannières, annonces, en-tête, etc.) |
118
+
119
+ Exposer les deux options avec les zones identifiées dans chaque cas. **→ Attendre une décision explicite avant de créer quoi que ce soit.**
120
+
121
+ 8. **Zones et structure générale :** Créer les fichiers `index.html`, `desc.xml` et `structure.xhtml` avec les zones validées à l'étape précédente. Cette étape se concentre exclusivement sur les zones et la structure générale du template. Ne pas intégrer le contenu (billets, widgets, composants, etc.) : cela se fait séparément via le Workflow B, dans une autre demande.