@overcrow/mcp 0.1.3 → 0.1.5
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 +12 -7
- package/dist/bootstrap/pin.js +19 -1
- package/dist/bootstrap/pin.json +47 -43
- package/dist/cli.js +14 -4
- package/dist/content/docs/en/cli.md +34 -32
- package/dist/content/docs/en/dev-channel.md +5 -5
- package/dist/content/docs/en/elements.md +5 -5
- package/dist/content/docs/en/forms.md +32 -30
- package/dist/content/docs/en/guide.md +16 -16
- package/dist/content/docs/en/index.md +12 -12
- package/dist/content/docs/en/limits.md +5 -4
- package/dist/content/docs/en/logic.md +30 -28
- package/dist/content/docs/en/manifest.md +35 -33
- package/dist/content/docs/en/mcp.md +13 -13
- package/dist/content/docs/en/package.md +7 -7
- package/dist/content/docs/en/publish-keys.md +6 -5
- package/dist/content/docs/en/publishing.md +9 -8
- package/dist/content/docs/en/reference.md +5 -5
- package/dist/content/docs/en/result-shapes.md +3 -3
- package/dist/content/docs/en/sdk.md +11 -11
- package/dist/content/docs/en/security.md +30 -30
- package/dist/content/docs/en/service-reference.md +2 -2
- package/dist/content/docs/en/services.md +33 -32
- package/dist/content/docs/en/style-properties.md +2 -2
- package/dist/content/docs/en/style.md +19 -18
- package/dist/content/docs/en/testing.md +36 -35
- package/dist/content/docs/en/view.md +13 -12
- package/dist/content/docs/en/widget-statistics.md +18 -17
- package/dist/content/docs/en/widgets.md +1 -1
- package/dist/content/docs/fr/cli.md +35 -30
- package/dist/content/docs/fr/dev-channel.md +8 -8
- package/dist/content/docs/fr/elements.md +5 -5
- package/dist/content/docs/fr/forms.md +35 -34
- package/dist/content/docs/fr/guide.md +13 -12
- package/dist/content/docs/fr/index.md +15 -15
- package/dist/content/docs/fr/limits.md +5 -5
- package/dist/content/docs/fr/logic.md +42 -37
- package/dist/content/docs/fr/manifest.md +40 -39
- package/dist/content/docs/fr/mcp.md +21 -19
- package/dist/content/docs/fr/package.md +8 -7
- package/dist/content/docs/fr/publish-keys.md +6 -5
- package/dist/content/docs/fr/publishing.md +8 -8
- package/dist/content/docs/fr/reference.md +6 -6
- package/dist/content/docs/fr/result-shapes.md +4 -3
- package/dist/content/docs/fr/sdk.md +12 -11
- package/dist/content/docs/fr/security.md +41 -39
- package/dist/content/docs/fr/service-reference.md +2 -2
- package/dist/content/docs/fr/services.md +34 -33
- package/dist/content/docs/fr/style-properties.md +2 -2
- package/dist/content/docs/fr/style.md +25 -22
- package/dist/content/docs/fr/testing.md +43 -43
- package/dist/content/docs/fr/view.md +17 -16
- package/dist/content/docs/fr/widget-statistics.md +20 -20
- package/dist/content/docs/fr/widgets.md +1 -1
- package/dist/content/examples/clock/README.md +3 -3
- package/dist/content/examples/fps/README.md +3 -3
- package/dist/content/examples/media/README.md +2 -2
- package/dist/content/examples/notes/README.md +1 -1
- package/dist/content/examples/performance/README.md +2 -2
- package/dist/content/examples/playervox-journal/README.md +5 -5
- package/dist/content/examples/playervox-rating/README.md +3 -3
- package/dist/content/examples/playervox-reviews/README.md +3 -3
- package/dist/content/examples/playervox-score/README.md +3 -3
- package/dist/content/examples/session/README.md +3 -3
- package/dist/content/examples/stopwatch/README.md +3 -3
- package/dist/content/examples/twitch-chat/README.md +4 -4
- package/dist/content/examples/warframe-market/README.md +2 -2
- package/dist/content/reference/errors.json +16 -16
- package/dist/prompts.js +2 -2
- package/dist/resources.js +1 -1
- package/dist/text.js +10 -2
- package/dist/texts.js +1 -1
- package/dist/tools/build.js +16 -10
- package/dist/tools/common.js +19 -12
- package/dist/tools/submission.js +7 -4
- package/dist/typescript.js +38 -0
- package/dist/version.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -27,12 +27,12 @@ une façon d’en sortir.
|
|
|
27
27
|
requêtes simultanées avec `busy`. Voir [erreurs](services.md#erreurs).
|
|
28
28
|
- **Pendant que la logique s’exécute**, dépasser un budget de la VM (la
|
|
29
29
|
durée d’un tour, le tas, les messages d’un tour) arrête le widget ;
|
|
30
|
-
OverCrow le redémarre quelques fois. Voir
|
|
30
|
+
PlayerVox OverCrow le redémarre quelques fois. Voir
|
|
31
31
|
[ce qui se passe en cas d’échec](logic.md#ce-qui-se-passe-en-cas-déchec).
|
|
32
|
-
- **Dans ce que le widget affiche**, OverCrow refuse une valeur
|
|
33
|
-
(un texte trop long pour un attribut, trop de nœuds), ce qui
|
|
34
|
-
le widget : bornez ce que vous affichez, par exemple le
|
|
35
|
-
d’une liste.
|
|
32
|
+
- **Dans ce que le widget affiche**, PlayerVox OverCrow refuse une valeur
|
|
33
|
+
hors limites (un texte trop long pour un attribut, trop de nœuds), ce qui
|
|
34
|
+
arrête aussi le widget : bornez ce que vous affichez, par exemple le
|
|
35
|
+
nombre de lignes d’une liste.
|
|
36
36
|
|
|
37
37
|
Les longueurs sont en pixels logiques, à une échelle du contenu de 100 %.
|
|
38
38
|
Les limites de texte comptent des octets UTF-8, sauf quand l’unité indique
|
|
@@ -40,14 +40,15 @@ gestionnaires que la vue appelle avec `on:activate={increment}`.
|
|
|
40
40
|
`setTimeout`, ni `console`, ni `Intl`, ni `require`. Les objets standard
|
|
41
41
|
d’ECMAScript sont là (`Math`, `JSON`, `Date`, `Map`, `Promise`…), et le
|
|
42
42
|
SDK est la seule porte de sortie.
|
|
43
|
-
- Tout le reste se passe par **tours**. OverCrow envoie un
|
|
44
|
-
déclenchement de minuteur, une réponse de service ou un
|
|
45
|
-
propres données ; votre code s’exécute ; puis la VM
|
|
46
|
-
n’envoie à OverCrow que ce qui a changé. Vous ne mettez
|
|
47
|
-
jour à la main.
|
|
48
|
-
- Un tour a un budget de temps, et la VM un plafond de mémoire.
|
|
49
|
-
arrête et relance, quelques fois, un widget qui dépasse
|
|
50
|
-
voir [ce qui se passe en cas
|
|
43
|
+
- Tout le reste se passe par **tours**. PlayerVox OverCrow envoie un
|
|
44
|
+
événement, un déclenchement de minuteur, une réponse de service ou un
|
|
45
|
+
changement de ses propres données ; votre code s’exécute ; puis la VM
|
|
46
|
+
réévalue la vue et n’envoie à OverCrow que ce qui a changé. Vous ne mettez
|
|
47
|
+
jamais la vue à jour à la main.
|
|
48
|
+
- Un tour a un budget de temps, et la VM un plafond de mémoire.
|
|
49
|
+
PlayerVox OverCrow arrête et relance, quelques fois, un widget qui dépasse
|
|
50
|
+
l’un ou l’autre ; voir [ce qui se passe en cas
|
|
51
|
+
d’échec](#ce-qui-se-passe-en-cas-déchec).
|
|
51
52
|
|
|
52
53
|
Le seul import permis à un module de logique est `@overcrow/sdk`. Tout ce
|
|
53
54
|
dont il a besoin par ailleurs se trouve dans le module lui-même.
|
|
@@ -137,8 +138,8 @@ sauf si la logique exporte le sien.
|
|
|
137
138
|
|
|
138
139
|
## Les données d’OverCrow : `host`
|
|
139
140
|
|
|
140
|
-
`host` contient ce
|
|
141
|
-
membres donnent toujours la dernière valeur.
|
|
141
|
+
`host` contient ce que PlayerVox OverCrow sait de l’utilisateur et du
|
|
142
|
+
widget. Ses membres donnent toujours la dernière valeur.
|
|
142
143
|
|
|
143
144
|
| Membre | Valeur |
|
|
144
145
|
| --- | --- |
|
|
@@ -153,12 +154,12 @@ membres donnent toujours la dernière valeur.
|
|
|
153
154
|
| `host.grants` | Les capabilities accordées par l’utilisateur ; lisez-les avec `hasGrant`. |
|
|
154
155
|
| `host.messages` | Les messages de la langue active ; lisez-les avec `t`. |
|
|
155
156
|
|
|
156
|
-
`onHost(listener)` appelle votre écouteur quand OverCrow envoie de
|
|
157
|
-
valeurs, avec les noms des membres qui ont changé, avant la
|
|
158
|
-
la vue. Utilisez-le quand un changement demande plus que
|
|
159
|
-
nouvelle valeur : réarmer un minuteur, se réabonner,
|
|
160
|
-
Un membre peut être renvoyé avec la même valeur :
|
|
161
|
-
vous avez gardée quand cela compte.
|
|
157
|
+
`onHost(listener)` appelle votre écouteur quand PlayerVox OverCrow envoie de
|
|
158
|
+
nouvelles valeurs, avec les noms des membres qui ont changé, avant la
|
|
159
|
+
réévaluation de la vue. Utilisez-le quand un changement demande plus que
|
|
160
|
+
l’affichage de la nouvelle valeur : réarmer un minuteur, se réabonner,
|
|
161
|
+
redessiner un canvas. Un membre peut être renvoyé avec la même valeur :
|
|
162
|
+
comparez-la à celle que vous avez gardée quand cela compte.
|
|
162
163
|
|
|
163
164
|
<!-- source: widgets/stopwatch/logic.ts -->
|
|
164
165
|
```ts
|
|
@@ -175,8 +176,9 @@ ses boutons tant que `host.mode` ne vaut pas `"interactive"`.
|
|
|
175
176
|
|
|
176
177
|
## Le menu d’options
|
|
177
178
|
|
|
178
|
-
OverCrow dessine et enregistre les lignes déclarées dans
|
|
179
|
-
[manifeste](manifest.md#le-menu-doptions). La logique les
|
|
179
|
+
PlayerVox OverCrow dessine et enregistre les lignes déclarées dans
|
|
180
|
+
`wrapper.menu` du [manifeste](manifest.md#le-menu-doptions). La logique les
|
|
181
|
+
lit :
|
|
180
182
|
|
|
181
183
|
- `option(id, fallback)` renvoie la valeur enregistrée d’une ligne de type
|
|
182
184
|
bascule, curseur ou choix, ou `fallback` quand il n’y en a pas ou qu’elle
|
|
@@ -212,8 +214,8 @@ pour un service protégé : une ligne `action` peut modifier l’état, pas
|
|
|
212
214
|
|
|
213
215
|
## Minuteurs
|
|
214
216
|
|
|
215
|
-
Il n’y a pas de `setTimeout`. Les minuteurs appartiennent à
|
|
216
|
-
passent par `timers` :
|
|
217
|
+
Il n’y a pas de `setTimeout`. Les minuteurs appartiennent à
|
|
218
|
+
PlayerVox OverCrow et passent par `timers` :
|
|
217
219
|
|
|
218
220
|
| Fonction | Se déclenche |
|
|
219
221
|
| --- | --- |
|
|
@@ -231,7 +233,8 @@ timers.every(1000, () => {
|
|
|
231
233
|
});
|
|
232
234
|
```
|
|
233
235
|
|
|
234
|
-
Puisque les minuteurs appartiennent à OverCrow, trois règles
|
|
236
|
+
Puisque les minuteurs appartiennent à PlayerVox OverCrow, trois règles
|
|
237
|
+
s’appliquent :
|
|
235
238
|
|
|
236
239
|
- **Aucun minuteur de moins de 100 ms.** Un intervalle plus court est porté
|
|
237
240
|
à cette valeur. Le mouvement relève du
|
|
@@ -278,8 +281,9 @@ function start(): void {
|
|
|
278
281
|
```
|
|
279
282
|
|
|
280
283
|
Une durée qui doit seulement avancer à l’écran n’a besoin d’aucun minuteur :
|
|
281
|
-
OverCrow fait avancer l’élément `elapsed` à partir d’un point de
|
|
282
|
-
la logique lui donne. Voir l’[élément
|
|
284
|
+
PlayerVox OverCrow fait avancer l’élément `elapsed` à partir d’un point de
|
|
285
|
+
départ que la logique lui donne. Voir l’[élément
|
|
286
|
+
`elapsed`](elements.md#elapsed).
|
|
283
287
|
|
|
284
288
|
## Heure, dates et nombres
|
|
285
289
|
|
|
@@ -349,12 +353,12 @@ export function toggleLabel(running: boolean): string {
|
|
|
349
353
|
}
|
|
350
354
|
```
|
|
351
355
|
|
|
352
|
-
Quand l’utilisateur change la langue
|
|
353
|
-
les nouveaux messages. En revanche, un texte que la logique a
|
|
354
|
-
rangé dans l’état ne change pas : calculez les textes dans des
|
|
355
|
-
la vue appelle, ou rafraîchissez-les dans `onHost` quand
|
|
356
|
-
Le nom du widget et les libellés de son menu se trouvent
|
|
357
|
-
pas dans les fichiers de langue.
|
|
356
|
+
Quand l’utilisateur change la langue de PlayerVox OverCrow, la vue est
|
|
357
|
+
réévaluée avec les nouveaux messages. En revanche, un texte que la logique a
|
|
358
|
+
calculé puis rangé dans l’état ne change pas : calculez les textes dans des
|
|
359
|
+
fonctions que la vue appelle, ou rafraîchissez-les dans `onHost` quand
|
|
360
|
+
`"locale"` change. Le nom du widget et les libellés de son menu se trouvent
|
|
361
|
+
dans le manifeste, pas dans les fichiers de langue.
|
|
358
362
|
|
|
359
363
|
`overcrow-widget check` avertit quand la vue appelle `t("key")` avec une clé
|
|
360
364
|
sans message, et refuse deux fichiers dont les clés diffèrent.
|
|
@@ -380,9 +384,10 @@ function paint(): void {
|
|
|
380
384
|
|
|
381
385
|
Les coordonnées sont en pixels logiques, depuis le coin supérieur gauche du
|
|
382
386
|
canvas ; les couleurs sont des littéraux (`#rrggbb`) ou des tokens de
|
|
383
|
-
couleur. OverCrow vérifie chaque commande et les dessine lui-même
|
|
384
|
-
ni accès aux pixels ni shader. Redessinez quand ce que vous
|
|
385
|
-
et quand `host.theme` change si vous utilisez des couleurs
|
|
387
|
+
couleur. PlayerVox OverCrow vérifie chaque commande et les dessine lui-même
|
|
388
|
+
: il n’y a ni accès aux pixels ni shader. Redessinez quand ce que vous
|
|
389
|
+
affichez change, et quand `host.theme` change si vous utilisez des couleurs
|
|
390
|
+
littérales.
|
|
386
391
|
|
|
387
392
|
<!-- generated:draw-commands -->
|
|
388
393
|
| Commande | Arguments | Signification |
|
|
@@ -443,17 +448,17 @@ indique par quoi le SDK remplace ce qui manque :
|
|
|
443
448
|
| `logic.debugger` | `debugger` donne un avertissement. |
|
|
444
449
|
|
|
445
450
|
Ce contrôle vous aide ; ce n’est pas lui qui protège l’utilisateur. C’est le
|
|
446
|
-
rôle du sandbox, des budgets de la VM et de la vérification par
|
|
447
|
-
tout ce que le widget envoie.
|
|
451
|
+
rôle du sandbox, des budgets de la VM et de la vérification par
|
|
452
|
+
PlayerVox OverCrow de tout ce que le widget envoie.
|
|
448
453
|
|
|
449
454
|
## Ce qui se passe en cas d’échec
|
|
450
455
|
|
|
451
456
|
- Une exception dans un gestionnaire met fin à ce tour ; le widget continue
|
|
452
457
|
de tourner, et `overcrow-widget dev` affiche la faute.
|
|
453
458
|
- Un tour plus long que son budget (50 ms), un tas au-dessus de son plafond
|
|
454
|
-
ou trop de messages dans un tour arrêtent le widget. OverCrow
|
|
455
|
-
erreur fixe dans son cadre et le relance après 1, 5 puis 15
|
|
456
|
-
trois fois au plus.
|
|
459
|
+
ou trop de messages dans un tour arrêtent le widget. PlayerVox OverCrow
|
|
460
|
+
affiche une erreur fixe dans son cadre et le relance après 1, 5 puis 15
|
|
461
|
+
secondes, trois fois au plus.
|
|
457
462
|
- La promesse rejetée d’un appel de service est une erreur ordinaire de
|
|
458
463
|
votre code : interceptez-la. Voir les [erreurs](services.md#erreurs).
|
|
459
464
|
|
|
@@ -7,7 +7,7 @@ d’options. Vous l’écrivez à la main ; il est empaqueté tel quel.
|
|
|
7
7
|
|
|
8
8
|
Le fichier est un seul objet JSON strict. Une marque d’ordre des octets, une
|
|
9
9
|
clé en double, des données après l’objet ou un champ inconnu le font
|
|
10
|
-
refuser : OverCrow n’ignore aucun champ.
|
|
10
|
+
refuser : PlayerVox OverCrow n’ignore aucun champ.
|
|
11
11
|
|
|
12
12
|
## Un exemple complet
|
|
13
13
|
|
|
@@ -93,13 +93,13 @@ valeurs qu’il remplit. Voici un manifeste avec des permissions et un menu :
|
|
|
93
93
|
|
|
94
94
|
- **`id`** est l’identité du widget partout : dans le catalogue, dans le
|
|
95
95
|
profil de l’utilisateur, dans son stockage. Il s’écrit `<pseudo>.<nom>`,
|
|
96
|
-
votre pseudo d’éditeur dans l’espace créateurs
|
|
97
|
-
(`nova.lol-timers`), ou, une fois un domaine vérifié, ce domaine
|
|
98
|
-
et un nom (`gg.nova.lol-timers`). Un ID est définitif : il n’est
|
|
99
|
-
donné à un autre widget, même après la suppression du vôtre.
|
|
100
|
-
`example`, `yourhandle` et `yourname` sont des pseudos d’exemple
|
|
101
|
-
lesquels personne ne peut publier, et les ID sous `com.playervox`
|
|
102
|
-
réservés aux widgets publiés par PlayerVox.
|
|
96
|
+
votre pseudo d’éditeur dans l’espace créateurs de PlayerVox OverCrow et un
|
|
97
|
+
nom (`nova.lol-timers`), ou, une fois un domaine vérifié, ce domaine
|
|
98
|
+
inversé et un nom (`gg.nova.lol-timers`). Un ID est définitif : il n’est
|
|
99
|
+
jamais donné à un autre widget, même après la suppression du vôtre.
|
|
100
|
+
`nova`, `example`, `yourhandle` et `yourname` sont des pseudos d’exemple
|
|
101
|
+
sous lesquels personne ne peut publier, et les ID sous `com.playervox`
|
|
102
|
+
sont réservés aux widgets publiés par PlayerVox.
|
|
103
103
|
- **`version`** est une version sémantique. Une version publiée ne change
|
|
104
104
|
jamais : toute modification d’un widget publié est une nouvelle version,
|
|
105
105
|
supérieure.
|
|
@@ -107,9 +107,9 @@ valeurs qu’il remplit. Voici un manifeste avec des permissions et un menu :
|
|
|
107
107
|
|
|
108
108
|
### Noms
|
|
109
109
|
|
|
110
|
-
`name` donne le nom
|
|
111
|
-
menus, en anglais et en français. Les deux sont obligatoires. Un
|
|
112
|
-
s’affiche tel qu’il est écrit : ni caractère de contrôle, ni caractère
|
|
110
|
+
`name` donne le nom que PlayerVox OverCrow affiche dans sa liste de widgets
|
|
111
|
+
et dans ses menus, en anglais et en français. Les deux sont obligatoires. Un
|
|
112
|
+
nom s’affiche tel qu’il est écrit : ni caractère de contrôle, ni caractère
|
|
113
113
|
invisible ou de sens d’écriture, comme U+200B (espace sans chasse) ou
|
|
114
114
|
U+202E (forçage de droite à gauche). Les libellés du menu suivent la même
|
|
115
115
|
règle.
|
|
@@ -124,10 +124,10 @@ règle.
|
|
|
124
124
|
## Tailles
|
|
125
125
|
|
|
126
126
|
`sizing` indique la taille du widget quand l’utilisateur l’ajoute, jusqu’où
|
|
127
|
-
celui-ci peut le réduire et l’agrandir, et si OverCrow peut
|
|
128
|
-
cadre à son contenu. Les longueurs sont en pixels logiques, à
|
|
129
|
-
100 % ; l’échelle du contenu choisie par l’utilisateur (de 50
|
|
130
|
-
les multiplie.
|
|
127
|
+
celui-ci peut le réduire et l’agrandir, et si PlayerVox OverCrow peut
|
|
128
|
+
ajuster son cadre à son contenu. Les longueurs sont en pixels logiques, à
|
|
129
|
+
une échelle de 100 % ; l’échelle du contenu choisie par l’utilisateur (de 50
|
|
130
|
+
% à 175 %) les multiplie.
|
|
131
131
|
|
|
132
132
|
<!-- generated:manifest-sizing -->
|
|
133
133
|
| Champ | Type | Obligatoire | Signification |
|
|
@@ -149,12 +149,12 @@ les multiplie.
|
|
|
149
149
|
| `height` | entier de 1 à 4096 | oui | Pixels logiques. |
|
|
150
150
|
<!-- /generated:manifest-dimensions -->
|
|
151
151
|
|
|
152
|
-
Avec `fit: "both"`, OverCrow donne au cadre la taille dont la vue
|
|
153
|
-
dans les deux directions : l’Horloge grandit quand l’utilisateur
|
|
154
|
-
secondes. Avec `fit: "height"`, l’utilisateur choisit la largeur
|
|
155
|
-
hauteur suit le contenu. Avec `fit: "none"`, le cadre garde la taille
|
|
156
|
-
l’utilisateur lui a donnée et la vue le remplit. L’utilisateur peut
|
|
157
|
-
redimensionner à la main.
|
|
152
|
+
Avec `fit: "both"`, PlayerVox OverCrow donne au cadre la taille dont la vue
|
|
153
|
+
a besoin, dans les deux directions : l’Horloge grandit quand l’utilisateur
|
|
154
|
+
active les secondes. Avec `fit: "height"`, l’utilisateur choisit la largeur
|
|
155
|
+
et la hauteur suit le contenu. Avec `fit: "none"`, le cadre garde la taille
|
|
156
|
+
que l’utilisateur lui a donnée et la vue le remplit. L’utilisateur peut
|
|
157
|
+
toujours redimensionner à la main.
|
|
158
158
|
|
|
159
159
|
<!-- source: widgets/clock/manifest.json -->
|
|
160
160
|
```json
|
|
@@ -196,12 +196,13 @@ les [règles réseau](services.md#règles-réseau).
|
|
|
196
196
|
|
|
197
197
|
## Le menu d’options
|
|
198
198
|
|
|
199
|
-
Chaque widget a un menu d’options, ouvert depuis son cadre.
|
|
200
|
-
d’abord ses propres lignes : opacité, taille du
|
|
201
|
-
contenu et, si le widget en a besoin, son compte. La
|
|
202
|
-
passif est l’œil de la barre d’outils du widget, pas une
|
|
203
|
-
`wrapper.menu` ajoute les vôtres en dessous : bascules,
|
|
204
|
-
actions et groupes, chacun avec un libellé dans les deux
|
|
199
|
+
Chaque widget a un menu d’options, ouvert depuis son cadre.
|
|
200
|
+
PlayerVox OverCrow y place d’abord ses propres lignes : opacité, taille du
|
|
201
|
+
contenu, ajustement au contenu et, si le widget en a besoin, son compte. La
|
|
202
|
+
visibilité en mode passif est l’œil de la barre d’outils du widget, pas une
|
|
203
|
+
ligne du menu. `wrapper.menu` ajoute les vôtres en dessous : bascules,
|
|
204
|
+
curseurs, choix, actions et groupes, chacun avec un libellé dans les deux
|
|
205
|
+
langues.
|
|
205
206
|
|
|
206
207
|
Le menu prend la largeur de sa ligne la plus large, de 248 à 320 points.
|
|
207
208
|
Au-delà, un libellé se termine par « … » et s’affiche en entier dans une
|
|
@@ -240,8 +241,8 @@ libellés courts, dans les deux langues.
|
|
|
240
241
|
}
|
|
241
242
|
```
|
|
242
243
|
|
|
243
|
-
OverCrow dessine les lignes, enregistre leurs valeurs dans le
|
|
244
|
-
l’utilisateur et les donne à la logique : lisez une valeur avec
|
|
244
|
+
PlayerVox OverCrow dessine les lignes, enregistre leurs valeurs dans le
|
|
245
|
+
profil de l’utilisateur et les donne à la logique : lisez une valeur avec
|
|
245
246
|
`option(id, fallback)` et suivez les changements avec `onHost`. Une ligne
|
|
246
247
|
`action` n’a pas de valeur : elle appelle le gestionnaire que vous avez
|
|
247
248
|
enregistré avec `onMenu`. Voir
|
|
@@ -357,8 +358,8 @@ Chaque entrée de `choices` est une valeur et son libellé :
|
|
|
357
358
|
Au premier niveau du manifeste, `requires` liste les sources de données sans
|
|
358
359
|
lesquelles le widget ne peut pas fonctionner, avec les mêmes noms que le
|
|
359
360
|
`requires` d’une ligne. Sur une machine à laquelle il en manque une,
|
|
360
|
-
OverCrow ne démarre pas le widget, ne l’affiche pas et conserve sa
|
|
361
|
-
dans la disposition ; le widget revient quand la source revient.
|
|
361
|
+
PlayerVox OverCrow ne démarre pas le widget, ne l’affiche pas et conserve sa
|
|
362
|
+
place dans la disposition ; le widget revient quand la source revient.
|
|
362
363
|
Utilisez-le pour un widget qui n’a rien d’autre à afficher, comme un
|
|
363
364
|
compteur d’images par seconde sans source de fréquence d’images. Pour une
|
|
364
365
|
seule valeur facultative, préférez le `requires` d’une ligne.
|
|
@@ -380,8 +381,8 @@ grand laisse donc moins de place à tout le reste. Ne le demandez que si
|
|
|
380
381
|
|
|
381
382
|
## Comment le manifeste est vérifié
|
|
382
383
|
|
|
383
|
-
`overcrow-widget check` valide le manifeste avec le validateur
|
|
384
|
-
exécute lui-même, et désigne le membre qu’il refuse :
|
|
384
|
+
`overcrow-widget check` valide le manifeste avec le validateur que
|
|
385
|
+
PlayerVox OverCrow exécute lui-même, et désigne le membre qu’il refuse :
|
|
385
386
|
|
|
386
387
|
```text
|
|
387
388
|
error[manifest.sizing]: `sizing` is out of bounds or inconsistent
|
|
@@ -393,9 +394,9 @@ error[manifest.sizing]: `sizing` is out of bounds or inconsistent
|
|
|
393
394
|
check: 1 error(s), 0 warning(s)
|
|
394
395
|
```
|
|
395
396
|
|
|
396
|
-
OverCrow le valide de nouveau quand le paquet est admis dans le
|
|
397
|
-
quand il est installé et à chaque démarrage du widget. Une
|
|
398
|
-
dont le manifeste demande plus que la précédente (une règle
|
|
399
|
-
événement de jeu, une capability, le stockage ou le
|
|
400
|
-
que l’utilisateur l’approuve dans le Centre de
|
|
401
|
-
la version installée.
|
|
397
|
+
PlayerVox OverCrow le valide de nouveau quand le paquet est admis dans le
|
|
398
|
+
catalogue, quand il est installé et à chaque démarrage du widget. Une
|
|
399
|
+
nouvelle version dont le manifeste demande plus que la précédente (une règle
|
|
400
|
+
réseau, un événement de jeu, une capability, le stockage ou le
|
|
401
|
+
presse-papiers) attend que l’utilisateur l’approuve dans le Centre de
|
|
402
|
+
contrôle avant de remplacer la version installée.
|
|
@@ -11,7 +11,7 @@ il a besoin.
|
|
|
11
11
|
claude mcp add overcrow -- npx -y @overcrow/mcp
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Demandez ensuite : « Crée un widget OverCrow qui affiche… ».
|
|
14
|
+
Demandez ensuite : « Crée un widget PlayerVox OverCrow qui affiche… ».
|
|
15
15
|
|
|
16
16
|
## Ajouter le serveur
|
|
17
17
|
|
|
@@ -87,22 +87,22 @@ Claude Desktop.
|
|
|
87
87
|
|
|
88
88
|
## Ce que fait le serveur
|
|
89
89
|
|
|
90
|
-
- **La première fois**, il télécharge les outils créateurs
|
|
91
|
-
votre ordinateur ([l’outil en ligne de
|
|
92
|
-
qui joue les [tests](testing.md), environ
|
|
93
|
-
d’OverCrow. Il vérifie chaque fichier avec
|
|
94
|
-
le serveur, puis les garde dans son propre
|
|
95
|
-
(`~/.cache/overcrow-mcp`, ou `%LOCALAPPDATA%\overcrow-mcp` sous
|
|
96
|
-
Rien ne s’ajoute à votre `PATH`, et aucun droit d’administrateur
|
|
97
|
-
nécessaire.
|
|
90
|
+
- **La première fois**, il télécharge les outils créateurs
|
|
91
|
+
PlayerVox OverCrow de votre ordinateur ([l’outil en ligne de
|
|
92
|
+
commande](cli.md) et le runtime qui joue les [tests](testing.md), environ
|
|
93
|
+
15 Mo) depuis la release GitHub d’OverCrow. Il vérifie chaque fichier avec
|
|
94
|
+
les empreintes inscrites dans le serveur, puis les garde dans son propre
|
|
95
|
+
dossier (`~/.cache/overcrow-mcp`, ou `%LOCALAPPDATA%\overcrow-mcp` sous
|
|
96
|
+
Windows). Rien ne s’ajoute à votre `PATH`, et aucun droit d’administrateur
|
|
97
|
+
n’est nécessaire.
|
|
98
98
|
- **Ensuite**, votre assistant travaille avec ses outils, dans cet ordre :
|
|
99
99
|
créer le widget depuis un modèle, installer le SDK (il vous le demande
|
|
100
100
|
d’abord), vérifier, tester (il voit les images qui diffèrent), auditer,
|
|
101
101
|
empaqueter, préparer la soumission.
|
|
102
102
|
- **L’identifiant du widget** est définitif. Votre assistant vous le
|
|
103
|
-
demande : votre pseudo d’éditeur dans l’espace créateurs
|
|
104
|
-
nom (`nova.lol-timers`), ou un domaine que vous
|
|
105
|
-
(`gg.nova.lol-timers`).
|
|
103
|
+
demande : votre pseudo d’éditeur dans l’espace créateurs de
|
|
104
|
+
PlayerVox OverCrow et un nom (`nova.lol-timers`), ou un domaine que vous
|
|
105
|
+
pouvez vérifier (`gg.nova.lol-timers`).
|
|
106
106
|
- **La soumission** : le serveur vérifie tout ce que demande l’espace
|
|
107
107
|
créateurs, puis écrit le zip des sources de votre widget dans `dist/`,
|
|
108
108
|
sans `node_modules`, `dist`, fichiers cachés ni clés, et liste ce qu’il a
|
|
@@ -123,10 +123,11 @@ Claude Desktop.
|
|
|
123
123
|
## Ce qu’il ne fait pas
|
|
124
124
|
|
|
125
125
|
- Il n’envoie, ne signe et ne publie jamais rien. Vous envoyez le zip et
|
|
126
|
-
les textes dans l’espace créateurs
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
les textes dans l’espace créateurs de PlayerVox OverCrow, à l’adresse
|
|
127
|
+
creators.playervox.com.
|
|
128
|
+
- Il n’installe pas votre widget dans PlayerVox OverCrow : l’essayer en jeu
|
|
129
|
+
passe par le [canal de développement](dev-channel.md) de l’outil en ligne
|
|
130
|
+
de commande.
|
|
130
131
|
- Il n’envoie rien sur vous : ni télémétrie, ni compte.
|
|
131
132
|
|
|
132
133
|
## Sécurité
|
|
@@ -136,7 +137,8 @@ Claude Desktop.
|
|
|
136
137
|
système, votre dossier personnel entier, les dossiers cachés et les liens
|
|
137
138
|
qui mènent ailleurs.
|
|
138
139
|
- **Aucune commande de son choix.** Le serveur lance l’outil en ligne de
|
|
139
|
-
commande
|
|
140
|
+
commande de PlayerVox OverCrow et npm, rien d’autre, jamais à travers un
|
|
141
|
+
shell.
|
|
140
142
|
- **Téléchargements vérifiés.** Il ne télécharge que les fichiers épinglés
|
|
141
143
|
depuis GitHub, et les vérifie avant de s’en servir. npm n’installe que
|
|
142
144
|
`@overcrow/sdk` et TypeScript, sans scripts d’installation, et leur
|
|
@@ -150,8 +152,8 @@ Claude Desktop.
|
|
|
150
152
|
|
|
151
153
|
## Hors ligne
|
|
152
154
|
|
|
153
|
-
Téléchargez une fois depuis la release GitHub
|
|
154
|
-
`overcrow-creator-tools-VERSION-PLATFORME.zip` de votre plateforme,
|
|
155
|
+
Téléchargez une fois depuis la release GitHub de PlayerVox OverCrow le
|
|
156
|
+
fichier `overcrow-creator-tools-VERSION-PLATFORME.zip` de votre plateforme,
|
|
155
157
|
placez-le dans votre dossier de widgets, et demandez à votre assistant de
|
|
156
158
|
lancer `setup` avec ce fichier (`zipPath`). Ou lancez le serveur avec
|
|
157
159
|
`--tools-zip` et le chemin du fichier. Le fichier doit être exactement celui
|
|
@@ -64,8 +64,8 @@ ne sert pas et raccourcit les noms locaux. Deux conséquences :
|
|
|
64
64
|
- la vue elle-même ne contient aucun code : `view.json` désigne les
|
|
65
65
|
fonctions de `logic.js` par leur numéro.
|
|
66
66
|
|
|
67
|
-
Un paquet contient des sources
|
|
68
|
-
bytecode compilé.
|
|
67
|
+
Un paquet contient des sources que PlayerVox OverCrow peut lire et vérifier,
|
|
68
|
+
jamais de bytecode compilé.
|
|
69
69
|
|
|
70
70
|
## Les mêmes octets à chaque fois
|
|
71
71
|
|
|
@@ -84,14 +84,15 @@ produite par un autre outil zip est refusée.
|
|
|
84
84
|
## Le registre
|
|
85
85
|
|
|
86
86
|
`ledger.json`, écrit par l’outil, liste tous les autres fichiers avec leur
|
|
87
|
-
taille et leur SHA-256. OverCrow le recalcule à partir de
|
|
88
|
-
exige les mêmes octets. C’est lui qui lie chaque fichier au
|
|
89
|
-
fichier modifié, ajouté ou retiré après l’empaquetage ne
|
|
87
|
+
taille et leur SHA-256. PlayerVox OverCrow le recalcule à partir de
|
|
88
|
+
l’archive et exige les mêmes octets. C’est lui qui lie chaque fichier au
|
|
89
|
+
paquet : un fichier modifié, ajouté ou retiré après l’empaquetage ne
|
|
90
|
+
correspond plus.
|
|
90
91
|
|
|
91
92
|
## Comment OverCrow vérifie un paquet
|
|
92
93
|
|
|
93
|
-
OverCrow valide un paquet en entier lors de son admission au
|
|
94
|
-
lors de son installation, puis **à chaque démarrage du widget** :
|
|
94
|
+
PlayerVox OverCrow valide un paquet en entier lors de son admission au
|
|
95
|
+
catalogue, lors de son installation, puis **à chaque démarrage du widget** :
|
|
95
96
|
|
|
96
97
|
1. la taille de l’archive, sa structure exacte et la somme de contrôle de
|
|
97
98
|
chaque entrée ;
|
|
@@ -50,10 +50,11 @@ soumet le widget à chaque tag de version :
|
|
|
50
50
|
|
|
51
51
|
<!-- source: docs/content/examples/weather/.github/workflows/submit.yml -->
|
|
52
52
|
```yaml
|
|
53
|
-
# Sends the widget to the OverCrow creator space when a version
|
|
54
|
-
# pushed. The publish key is a secret of the repository, and the
|
|
55
|
-
# release whose creator tools to use is a variable of the
|
|
56
|
-
|
|
53
|
+
# Sends the widget to the PlayerVox OverCrow creator space when a version
|
|
54
|
+
# tag is pushed. The publish key is a secret of the repository, and the
|
|
55
|
+
# OverCrow release whose creator tools to use is a variable of the
|
|
56
|
+
# repository.
|
|
57
|
+
name: Submit to PlayerVox OverCrow
|
|
57
58
|
|
|
58
59
|
on:
|
|
59
60
|
push:
|
|
@@ -78,7 +79,7 @@ jobs:
|
|
|
78
79
|
(cd "$tools" && sha256sum --check --quiet SHA256SUMS)
|
|
79
80
|
install -D -m 755 "$tools"/overcrow-widget-*-linux-x86_64 "$HOME/.local/bin/overcrow-widget"
|
|
80
81
|
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
81
|
-
- name: Submit to OverCrow
|
|
82
|
+
- name: Submit to PlayerVox OverCrow
|
|
82
83
|
run: overcrow-widget submit --submission submission.json
|
|
83
84
|
env:
|
|
84
85
|
OVERCROW_PUBLISH_KEY: ${{ secrets.OVERCROW_PUBLISH_KEY }}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> **Les pull requests sont fermées.** Les widgets ne sont plus proposés par
|
|
4
4
|
> pull request : ceux de PlayerVox passent déjà par l’espace créateurs
|
|
5
|
-
> OverCrow, et le vôtre y passera à son ouverture. D’ici là, cette
|
|
6
|
-
> décrit l’admission, la revue et le catalogue que suit un widget.
|
|
5
|
+
> PlayerVox OverCrow, et le vôtre y passera à son ouverture. D’ici là, cette
|
|
6
|
+
> page décrit l’admission, la revue et le catalogue que suit un widget.
|
|
7
7
|
|
|
8
8
|
Les widgets atteignent les utilisateurs de PlayerVox OverCrow par le
|
|
9
9
|
catalogue signé des widgets : OverCrow n’installe que ce que liste ce
|
|
@@ -91,7 +91,7 @@ n’exécute jamais votre code ni `tsc` :
|
|
|
91
91
|
|
|
92
92
|
1. elle construit le dossier comme le fait `package` : toutes les
|
|
93
93
|
vérifications des sources, du style, de la logique et du paquet, puis le
|
|
94
|
-
lecteur de paquets
|
|
94
|
+
lecteur de paquets de PlayerVox OverCrow lui-même ;
|
|
95
95
|
2. avec `--package`, la vue compilée de votre archive doit être, octet pour
|
|
96
96
|
octet, le résultat de la compilation de `view.ocml` ;
|
|
97
97
|
3. elle vérifie les limites du schéma, les IDs réservés, `listing.json`,
|
|
@@ -142,16 +142,16 @@ publique est dans [`keys/`](../../../keys/). Le catalogue :
|
|
|
142
142
|
version publiée ne change jamais, et un changement est une nouvelle
|
|
143
143
|
version ;
|
|
144
144
|
- porte un numéro de séquence strictement croissant et expire au bout de
|
|
145
|
-
90 jours au plus : OverCrow refuse une séquence plus ancienne et
|
|
146
|
-
catalogue expiré ;
|
|
145
|
+
90 jours au plus : PlayerVox OverCrow refuse une séquence plus ancienne et
|
|
146
|
+
un catalogue expiré ;
|
|
147
147
|
- marque `built-in` les widgets de référence PlayerVox (IDs
|
|
148
148
|
`com.playervox.*` uniquement) : ils sont installés sur un nouveau profil
|
|
149
149
|
avec leurs permissions déclarées accordées, sauf pour une mise à jour qui
|
|
150
150
|
en demande davantage.
|
|
151
151
|
|
|
152
|
-
OverCrow vérifie la signature, l’empreinte du paquet, son registre
|
|
153
|
-
vue compilée avant l’installation, puis à chaque démarrage du widget.
|
|
154
|
-
[le paquet](package.md#comment-overcrow-vérifie-un-paquet).
|
|
152
|
+
PlayerVox OverCrow vérifie la signature, l’empreinte du paquet, son registre
|
|
153
|
+
et sa vue compilée avant l’installation, puis à chaque démarrage du widget.
|
|
154
|
+
Voir [le paquet](package.md#comment-overcrow-vérifie-un-paquet).
|
|
155
155
|
|
|
156
156
|
## Mises à jour
|
|
157
157
|
|
|
@@ -28,10 +28,10 @@ ensemble ; celles qui suivent sont à garder ouvertes pendant que vous
|
|
|
28
28
|
|
|
29
29
|
- Les tableaux des éléments, des attributs, des propriétés de style, des
|
|
30
30
|
tokens, des services, des formes de résultat et des limites sont
|
|
31
|
-
**générés à partir du schéma des widgets**, les mêmes tables
|
|
32
|
-
et l’outil en ligne de commande compilent dans leurs
|
|
33
|
-
vérification échoue dès qu’une page diffère du schéma, en
|
|
34
|
-
français.
|
|
31
|
+
**générés à partir du schéma des widgets**, les mêmes tables que
|
|
32
|
+
PlayerVox OverCrow et l’outil en ligne de commande compilent dans leurs
|
|
33
|
+
validateurs. Une vérification échoue dès qu’une page diffère du schéma, en
|
|
34
|
+
anglais ou en français.
|
|
35
35
|
- Les **types du SDK** sont générés à partir du même schéma : un élément,
|
|
36
36
|
une icône, une capability ou un paramètre de service erroné est donc une
|
|
37
37
|
erreur TypeScript dans votre logique.
|
|
@@ -52,8 +52,8 @@ et `@overcrow/sdk` 1.0.
|
|
|
52
52
|
Trois spécifications, dans le dépôt public, s’adressent à ceux qui
|
|
53
53
|
implémentent un hôte ou un autre outil plutôt qu’un widget : la
|
|
54
54
|
[référence complète du schéma, générée](../../widget-schema-v1.md), qui
|
|
55
|
-
couvre aussi le protocole entre OverCrow et le processus du widget
|
|
56
|
-
les données du catalogue ; le
|
|
55
|
+
couvre aussi le protocole entre PlayerVox OverCrow et le processus du widget
|
|
56
|
+
ainsi que les données du catalogue ; le
|
|
57
57
|
[protocole du canal de développement](../../dev-channel.md) ; et le
|
|
58
58
|
[format de l’archive et du catalogue](../../widget-package-v1.md). L’auteur
|
|
59
59
|
d’un widget n’en a pas besoin.
|
|
@@ -37,9 +37,10 @@ la vue en lit les membres :
|
|
|
37
37
|
- Un membre accompagné de `offsetMinutes` est un horodatage à mettre en
|
|
38
38
|
forme avec ce décalage UTC ; voir
|
|
39
39
|
[heure, dates et nombres](logic.md#heure-dates-et-nombres).
|
|
40
|
-
- Un identifiant `asset:` est une image
|
|
41
|
-
liez-le au `src` d’une `image` ou d’un `avatar`, ou
|
|
42
|
-
canvas. Ce n’est pas une URL, et ses octets ne peuvent
|
|
40
|
+
- Un identifiant `asset:` est une image que PlayerVox OverCrow détient pour
|
|
41
|
+
le widget : liez-le au `src` d’une `image` ou d’un `avatar`, ou
|
|
42
|
+
dessinez-le sur un canvas. Ce n’est pas une URL, et ses octets ne peuvent
|
|
43
|
+
pas être lus.
|
|
43
44
|
- Un abonnement dont la forme est « … ou `null` » livre `null` quand il n’y
|
|
44
45
|
a rien à afficher : pas de jeu actif, pas de lecteur multimédia.
|
|
45
46
|
|
|
@@ -32,8 +32,8 @@ import {
|
|
|
32
32
|
Le SDK est assemblé dans le `logic.js` du widget à l’empaquetage et
|
|
33
33
|
s’exécute dans la VM du widget ; le charger ailleurs lève une erreur. Les
|
|
34
34
|
parties inutilisées sont retirées du script assemblé. C’est une commodité,
|
|
35
|
-
pas une barrière de sécurité : OverCrow vérifie chaque appel,
|
|
36
|
-
paramètre et chaque valeur qui sort de la VM.
|
|
35
|
+
pas une barrière de sécurité : PlayerVox OverCrow vérifie chaque appel,
|
|
36
|
+
chaque paramètre et chaque valeur qui sort de la VM.
|
|
37
37
|
|
|
38
38
|
| Export | Nature | Résumé |
|
|
39
39
|
| --- | --- | --- |
|
|
@@ -69,9 +69,9 @@ const state = initState({ values: [50] as number[] });
|
|
|
69
69
|
|
|
70
70
|
| Export | Nature | Résumé |
|
|
71
71
|
| --- | --- | --- |
|
|
72
|
-
| `host` | constante | Objet figé dont les membres donnent toujours les dernières valeurs envoyées par OverCrow. |
|
|
72
|
+
| `host` | constante | Objet figé dont les membres donnent toujours les dernières valeurs envoyées par PlayerVox OverCrow. |
|
|
73
73
|
| `HostData` | interface | Type de `host` : `locale`, `messages`, `theme`, `region`, `scale` (en millièmes), `viewport`, `mode`, `visible`, `options`, `grants`. |
|
|
74
|
-
| `onHost(listener)` | fonction | Appelle `listener` avec les noms des membres de `host`
|
|
74
|
+
| `onHost(listener)` | fonction | Appelle `listener` avec les noms des membres de `host` que PlayerVox OverCrow vient d’envoyer (`options` après un changement dans le menu, `visible` quand le widget est affiché ou masqué, `region`…), avant la réévaluation de la vue. Renvoie `{ cancel() }`. |
|
|
75
75
|
| `HostKey` | type | Le nom d’un membre de `HostData`. |
|
|
76
76
|
| `HostListener` | type | Un écouteur de `onHost`. |
|
|
77
77
|
| `Viewport` | interface | `{ width, height }`, en pixels logiques. |
|
|
@@ -100,8 +100,8 @@ onHost((changed) => {
|
|
|
100
100
|
|
|
101
101
|
## Services
|
|
102
102
|
|
|
103
|
-
Chaque service répond par l’intermédiaire
|
|
104
|
-
appel sa permission ou sa capability, ses paramètres et l’action de
|
|
103
|
+
Chaque service répond par l’intermédiaire de PlayerVox OverCrow, qui vérifie
|
|
104
|
+
à chaque appel sa permission ou sa capability, ses paramètres et l’action de
|
|
105
105
|
l’utilisateur.
|
|
106
106
|
|
|
107
107
|
| Export | Nature | Résumé |
|
|
@@ -256,7 +256,7 @@ règles de pluriel ne font pas partie de la version 1.0.
|
|
|
256
256
|
## Types générés
|
|
257
257
|
|
|
258
258
|
Ces types sont générés à partir du schéma des widgets : ils correspondent
|
|
259
|
-
donc toujours à ce
|
|
259
|
+
donc toujours à ce que PlayerVox OverCrow accepte.
|
|
260
260
|
|
|
261
261
|
| Export | Résumé |
|
|
262
262
|
| --- | --- |
|
|
@@ -295,7 +295,8 @@ nombre : `MAX_TIMERS`, `MIN_TIMER_INTERVAL_MS`, `MAX_SERVICE_CALLS_IN_FLIGHT`,
|
|
|
295
295
|
|
|
296
296
|
## Tests unitaires : `@overcrow/sdk/testing`
|
|
297
297
|
|
|
298
|
-
Un second point d’entrée, jamais assemblé dans un widget, remplace
|
|
299
|
-
dans un test unitaire de la logique : `installRuntime()`
|
|
300
|
-
virtuel, fait aboutir les appels de service et pousse les
|
|
301
|
-
abonnements. Voir les [tests
|
|
298
|
+
Un second point d’entrée, jamais assemblé dans un widget, remplace
|
|
299
|
+
PlayerVox OverCrow dans un test unitaire de la logique : `installRuntime()`
|
|
300
|
+
fournit un temps virtuel, fait aboutir les appels de service et pousse les
|
|
301
|
+
valeurs des abonnements. Voir les [tests
|
|
302
|
+
unitaires](testing.md#tests-unitaires).
|