@overcrow/mcp 0.1.0 → 0.1.1

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 (50) hide show
  1. package/README.md +1 -1
  2. package/dist/content/docs/en/cli.md +446 -31
  3. package/dist/content/docs/en/creator-space.md +78 -0
  4. package/dist/content/docs/en/guide.md +3 -4
  5. package/dist/content/docs/en/manifest.md +13 -6
  6. package/dist/content/docs/en/mcp.md +1 -1
  7. package/dist/content/docs/en/publish-a-widget.md +94 -0
  8. package/dist/content/docs/en/publish-keys.md +95 -0
  9. package/dist/content/docs/en/publishing.md +5 -0
  10. package/dist/content/docs/en/verified-domain.md +46 -0
  11. package/dist/content/docs/en/widget-listing.md +65 -0
  12. package/dist/content/docs/en/widget-review.md +57 -0
  13. package/dist/content/docs/en/widget-statistics.md +134 -0
  14. package/dist/content/docs/fr/cli.md +467 -32
  15. package/dist/content/docs/fr/creator-space.md +83 -0
  16. package/dist/content/docs/fr/guide.md +3 -4
  17. package/dist/content/docs/fr/manifest.md +15 -6
  18. package/dist/content/docs/fr/mcp.md +1 -1
  19. package/dist/content/docs/fr/publish-a-widget.md +101 -0
  20. package/dist/content/docs/fr/publish-keys.md +97 -0
  21. package/dist/content/docs/fr/publishing.md +5 -0
  22. package/dist/content/docs/fr/verified-domain.md +49 -0
  23. package/dist/content/docs/fr/widget-listing.md +69 -0
  24. package/dist/content/docs/fr/widget-review.md +59 -0
  25. package/dist/content/docs/fr/widget-statistics.md +141 -0
  26. package/dist/content/examples/countdown/manifest.json +1 -1
  27. package/dist/content/examples/fps/submission.json +8 -0
  28. package/dist/content/examples/media/submission.json +12 -0
  29. package/dist/content/examples/notes/submission.json +12 -0
  30. package/dist/content/examples/performance/submission.json +12 -0
  31. package/dist/content/examples/playervox-journal/submission.json +12 -0
  32. package/dist/content/examples/playervox-rating/submission.json +12 -0
  33. package/dist/content/examples/playervox-reviews/submission.json +8 -0
  34. package/dist/content/examples/playervox-score/submission.json +8 -0
  35. package/dist/content/examples/session/submission.json +8 -0
  36. package/dist/content/examples/stopwatch/submission.json +12 -0
  37. package/dist/content/examples/twitch-chat/submission.json +12 -0
  38. package/dist/content/examples/warframe-market/submission.json +24 -0
  39. package/dist/content/examples/weather/manifest.json +1 -1
  40. package/dist/content/examples/weather/submission.json +17 -0
  41. package/dist/content/index.json +106 -2
  42. package/dist/content/reference/errors.json +224 -12
  43. package/dist/content/reference/manifest.md +1 -1
  44. package/dist/hidden.js +47 -0
  45. package/dist/texts.js +1 -1
  46. package/dist/tools/project.js +5 -0
  47. package/dist/tools/submission.js +1 -1
  48. package/dist/version.js +1 -1
  49. package/npm-shrinkwrap.json +2 -2
  50. package/package.json +1 -1
@@ -7,11 +7,11 @@ validateurs que ceux qu’OverCrow exécute quand il installe et démarre un
7
7
  widget : un paquet qu’il accepte est un paquet qu’OverCrow lit.
8
8
 
9
9
  ```sh
10
- overcrow-widget init my-widget --template counter
10
+ overcrow-widget init my-widget --template counter --id nova.my-widget
11
11
  cd my-widget
12
12
  overcrow-widget check
13
13
  overcrow-widget package
14
- overcrow-widget inspect dist/com.example.my-widget-0.1.0.ocpkg
14
+ overcrow-widget inspect dist/nova.my-widget-0.1.0.ocpkg
15
15
  overcrow-widget doctor
16
16
  overcrow-widget dev
17
17
  overcrow-widget test
@@ -26,10 +26,14 @@ overcrow-widget test
26
26
  | [`dev`](#dev) | Exécute le widget dans OverCrow et le recharge à chaque enregistrement. |
27
27
  | [`test`](#test) | Joue les scénarios de test du projet et compare leurs images. |
28
28
  | [`doctor`](#doctor) | Indique ce que votre installation a et ce qui lui manque. |
29
- | [`admit`](#admit) | Exécute l’admission de la marketplace sur votre soumission. |
29
+ | [`admit`](#admit) | Exécute l’admission de l’espace créateurs sur vos sources, un dossier ou un ZIP. |
30
+ | [`diff`](#diff) | Compare deux versions des sources d’un widget. |
31
+ | [`submit`](#submit) | Envoie une version à l’espace créateurs avec une clé de publication, et suit ses contrôles. |
32
+ | [`status`](#status) | Montre les versions d’un widget, leurs contrôles et leur revue. |
30
33
 
31
34
  Chaque commande prend le dossier du projet en argument ; sans argument,
32
- elle utilise le dossier courant.
35
+ elle utilise le dossier courant. La [sortie lisible par un programme](#sortie-lisible-par-un-programme)
36
+ et les [codes de sortie](#codes-de-sortie) sont stables pour vos scripts.
33
37
 
34
38
  ## Installation
35
39
 
@@ -97,15 +101,15 @@ dans `node_modules` dont la version diffère de celle que l’outil embarque.
97
101
  | `logic.ts` ou `logic.js` | [La logique](logic.md), un seul module ; regroupée avec le SDK dans `logic.js`. | regroupé |
98
102
  | `locales/en.json`, `locales/fr.json` | [Les messages](logic.md#messages) ; les deux fichiers ou aucun, avec les mêmes clés. | oui |
99
103
  | `LICENSE` | Le texte de la licence du paquet. Les templates partent de la licence MIT ; choisissez la vôtre. | oui |
100
- | `assets/` | Images PNG, JPEG ou WebP ; facultatif. | oui |
104
+ | `assets/` | Images PNG, JPEG ou WebP ; facultatif. Les fichiers cachés (`.DS_Store`) et ce que les outils créateurs n’envoient jamais (`dist/`…) sont ignorés, comme dans les [archives de sources](#archives-de-sources). | oui |
101
105
  | `package.json`, `tsconfig.json` | Outillage uniquement : TypeScript et les types du SDK. | non |
102
- | `listing.json` | Le texte de marketplace d’une [soumission](publishing.md#la-fiche) ; lu par `admit`. | non |
106
+ | `listing.json` | Le texte de marketplace d’une [soumission](publishing.md#la-fiche) ; lu par `admit`. Dans l’espace créateurs, où la fiche se modifie, une simple proposition d’import. | non |
103
107
  | `tests/` | Les [scénarios](testing.md#scénarios) (`tests/<name>.scenario.json`), leurs images de référence (`tests/reference/`) et vos tests unitaires. `tests/output/` contient les images des exécutions en échec. | non |
104
108
 
105
109
  ## init
106
110
 
107
111
  ```sh
108
- overcrow-widget init my-widget --template list --id com.example.my-widget --name "My widget"
112
+ overcrow-widget init my-widget --template list --id nova.my-widget --name "My widget"
109
113
  ```
110
114
 
111
115
  Écrit un nouveau projet dans le dossier, qui ne doit pas exister ou doit
@@ -118,8 +122,12 @@ overcrow-widget init my-widget --template list --id com.example.my-widget --name
118
122
  | `list` | Une liste de tâches à clés : `for`, gestionnaires avec arguments, `t()` avec paramètres. |
119
123
  | `chart` | Un graphique en direct, mis à jour par un minuteur. |
120
124
 
121
- Par défaut, l’ID vaut `com.example.<dir>`. Passez `--id` avec un ID en DNS
122
- inversé, sous un domaine que vous contrôlez (`com.playervox.*` est réservé).
125
+ Passez `--id` avec l’ID de votre widget : `<pseudo>.<nom>`, votre pseudo
126
+ d’éditeur dans l’espace créateurs d’OverCrow et un nom (`nova.lol-timers`),
127
+ ou un domaine que vous avez vérifié, inversé, et un nom
128
+ (`gg.nova.lol-timers`) ; voir [le manifeste](manifest.md#identité-et-version).
129
+ Sans `--id`, l’ID vaut `yourhandle.<dir>` : remplacez `yourhandle` avant
130
+ d’envoyer le widget, car `admit` le refuse. `com.playervox.*` est réservé.
123
131
  Chaque template est livré avec un scénario de test,
124
132
  `tests/example.scenario.json` ; `counter`, `list` et `chart` fournissent
125
133
  aussi ses images de référence.
@@ -165,6 +173,10 @@ Exécute `check`, puis écrit le paquet dans `dist/<id>-<version>.ocpkg`, ou
165
173
  à l’emplacement donné par `--out`. La commande affiche le chemin, la taille
166
174
  et le SHA-256 de l’archive.
167
175
 
176
+ Avec `--source-map FILE`, elle écrit aussi dans ce fichier
177
+ [la carte du code](#la-carte-du-code) de `logic.js`. La carte n’entre
178
+ jamais dans le paquet : le paquet est le même avec ou sans elle.
179
+
168
180
  L’empaquetage est déterministe : les mêmes sources et la même version de
169
181
  l’outil donnent les mêmes octets à chaque exécution et sur tous les
170
182
  systèmes. Le contenu du paquet est décrit dans [le paquet](package.md).
@@ -172,7 +184,7 @@ systèmes. Le contenu du paquet est décrit dans [le paquet](package.md).
172
184
  ## inspect
173
185
 
174
186
  ```sh
175
- overcrow-widget inspect dist/com.example.my-widget-0.1.0.ocpkg
187
+ overcrow-widget inspect dist/nova.my-widget-0.1.0.ocpkg
176
188
  ```
177
189
 
178
190
  Valide un paquet comme le fait OverCrow, puis le montre tel qu’un relecteur
@@ -280,39 +292,381 @@ Options : `--format json`, `--deny-warnings`.
280
292
  ## admit
281
293
 
282
294
  ```sh
283
- overcrow-widget admit
284
- overcrow-widget admit --package dist/com.example.my-widget-0.1.0.ocpkg
295
+ overcrow-widget admit --publisher nova
296
+ overcrow-widget admit lol-timers.zip --publisher nova --previous lol-timers-1.0.0.ocpkg
297
+ overcrow-widget admit --publisher nova --package dist/nova.my-widget-0.1.0.ocpkg
285
298
  ```
286
299
 
287
- Exécute l’admission statique par laquelle passe une soumission à la
288
- marketplace, exactement comme la marketplace l’exécute. La commande
289
- n’exécute jamais votre code ni `tsc` :
300
+ Exécute l’admission statique que l’espace créateurs fait passer à chaque
301
+ version que vous envoyez. Les sources sont le dossier du projet ou un ZIP
302
+ de ce dossier, lus comme l’espace créateurs les reçoit
303
+ ([archives de sources](#archives-de-sources)). La commande n’exécute
304
+ jamais votre code ni `tsc` :
290
305
 
291
- 1. le dossier est construit comme `package` le construit ;
306
+ 1. les sources sont construites comme `package` les construit ;
292
307
  2. avec `--package`, la vue compilée de cette archive doit être, à l’octet
293
308
  près, ce que donne la compilation de `view.ocml` ;
294
- 3. l’ID n’est pas réservé, `listing.json` est valide, son aperçu est un PNG
295
- empaqueté d’au plus 256 Kio ;
309
+ 3. l’ID appartient à l’éditeur donné par `--publisher` (ses ID
310
+ `<pseudo>.<nom>` et, avec `--domain`, les ID sous un domaine qu’il a
311
+ vérifié) ; sans `--publisher`, l’ID n’est ni réservé, ni un ID
312
+ d’exemple (`nova.*`, `yourhandle.*`, `gg.nova.*`, `com.example.*`…), ni
313
+ sous un pseudo que personne ne peut prendre (`admin.*`, `com.*`).
314
+ `listing.json` est valide, son aperçu est un PNG empaqueté d’au plus
315
+ 256 Kio ;
296
316
  4. les pouvoirs que le widget demande sont listés pour le relecteur :
297
317
  capabilities (les sensibles sont signalées), routes réseau avec leur
298
318
  limite de réponse, écritures dans le presse-papiers, stockage et
299
- événements de jeu.
319
+ événements de jeu ;
320
+ 5. avec `--previous`, la dernière version approuvée (son `manifest.json`,
321
+ son paquet, son dossier ou son ZIP) : l’ID doit être le même et la
322
+ version supérieure, et le rapport liste les
323
+ [clés de permission](#clés-de-permission) ajoutées, élargies et
324
+ retirées, ainsi que la revue dont la version a besoin.
300
325
 
301
326
  | Code | Sévérité | Signification |
302
327
  | --- | --- | --- |
303
- | `admission.reserved_id` | erreur | Un ID `com.playervox.*`, réservé à PlayerVox. |
304
- | `admission.listing_missing`, `admission.listing` | erreur | Pas de `listing.json`, ou un fichier qui enfreint les règles de la fiche. |
305
- | `admission.preview` | erreur | `preview` ne désigne pas un PNG empaqueté dans les limites. |
306
- | `admission.license` | erreur | Un widget PlayerVox dont la licence n’est pas MIT. |
328
+ | `admission.reserved_id` | erreur | Un ID `com.playervox.*`, réservé à PlayerVox ; sans `--publisher`, aussi un ID sous un pseudo réservé (`playervox.*`, `admin.*`…). |
329
+ | `admission.placeholder_id` | erreur | Un ID d’exemple, sans `--publisher`. |
330
+ | `admission.id_not_owned` | erreur | L’ID n’appartient pas à l’éditeur, ou, sans `--publisher`, ne peut appartenir à personne. |
331
+ | `admission.listing_missing`, `admission.listing` | erreur | Pas de `listing.json`, ou un fichier qui enfreint les règles de la fiche (un avertissement avec `--listing optional`). |
332
+ | `admission.preview` | erreur | `preview` ne désigne pas un PNG empaqueté dans les limites (un avertissement avec `--listing optional`). |
333
+ | `admission.license` | erreur | Un widget PlayerVox dont la licence n’est pas MIT (un avertissement avec `--listing optional`). |
307
334
  | `admission.view_not_reproducible` | erreur | La vue compilée soumise diffère de ce que donne la compilation de `view.ocml`. |
335
+ | `admission.previous` | erreur | La version précédente ne peut pas être lue. |
336
+ | `admission.previous_mismatch` | erreur | La version précédente est un autre widget. |
337
+ | `admission.version_not_newer` | erreur | La version n’est pas supérieure à la précédente. |
308
338
  | `admission.package_rebuilt` | avertissement | L’archive soumise diffère de la reconstruction dans d’autres fichiers. |
309
339
  | `admission.not_rebuilt` | avertissement | Une archive a été admise sans ses sources. |
310
340
 
311
- Options : `--package FILE`, `--out DIR` (écrit le paquet admis, sa fiche et
312
- un rapport dans un dossier vide), `--format json`, `--deny-warnings`.
313
- `admit <file.ocpkg> --listing FILE` vérifie une archive sans ses sources.
314
- Codes de sortie : 0 admis, 1 refusé, 2 pour une erreur d’utilisation ou de
315
- fichier. Voir [publication et revue](publishing.md).
341
+ Options : `--publisher HANDLE`, `--domain DOMAIN` (répétable), `--previous
342
+ FILE`, `--package FILE`, `--source-map FILE` ([la carte du
343
+ code](#la-carte-du-code), écrite quand les sources sont admises), `--out
344
+ DIR` (écrit le paquet admis, sa fiche et un rapport dans un dossier vide),
345
+ `--format json`, `--deny-warnings`. `admit <file.ocpkg> --listing FILE`
346
+ vérifie une archive sans ses sources. Codes de sortie : 0 admis, 1 refusé,
347
+ 2 pour une erreur d’utilisation ou de fichier. Voir
348
+ [publication et revue](publishing.md).
349
+
350
+ `--listing required|optional` concerne les sources. `required`, par
351
+ défaut, refuse des sources sans `listing.json` valide. `optional` est le
352
+ mode de l’espace créateurs : la fiche s’y modifie, donc `listing.json` peut
353
+ manquer, et un fichier qui pose problème est écarté (aucune fiche dans le
354
+ rapport ni dans `--out`) avec des avertissements, au lieu de refuser les
355
+ sources.
356
+
357
+ ### Clés de permission
358
+
359
+ Chaque permission a une clé stable, la même dans l’espace créateurs :
360
+
361
+ | Clé | Permission |
362
+ | --- | --- |
363
+ | `network:GET https://api.nova.gg/v1/timers` | Une route réseau : méthode, origine et chemin. |
364
+ | `storage` | Le stockage. |
365
+ | `clipboardWrite` | Les écritures dans le presse-papiers. |
366
+ | `capability:<name>` | Une capability. |
367
+ | `gameEvent:<name>` | Un événement de jeu. |
368
+
369
+ Une clé est *ajoutée* quand la version précédente ne l’avait pas,
370
+ *élargie* quand sa route reste mais que sa règle change (contraintes du
371
+ chemin ou de la requête, limite de réponse), et *retirée* quand elle
372
+ disparaît. Une clé ajoutée ou élargie demande une revue **complète** ;
373
+ sinon la revue est **rapide**.
374
+
375
+ ## diff
376
+
377
+ ```sh
378
+ overcrow-widget diff lol-timers-1.0.0.zip .
379
+ overcrow-widget diff old/ new/ --format json
380
+ ```
381
+
382
+ Montre ce qui a changé entre deux versions des sources d’un widget,
383
+ chacune un dossier ou un ZIP, lues comme `admit` les lit : les fichiers que
384
+ reçoit l’espace créateurs. Les fichiers sont triés par chemin ; chaque
385
+ fichier ajouté, modifié ou supprimé est accompagné de ses changements au
386
+ format unifié (trois lignes de contexte) et du nombre de lignes ajoutées et
387
+ retirées. Un fichier qui n’est pas du texte UTF-8 est binaire : seul son
388
+ SHA-256 est comparé. De même pour un texte de plus de 1 Mio ou de
389
+ 20 000 lignes, ou une fois 200 000 lignes comparées dans un même diff
390
+ (`tooLarge`). Quand les deux versions ont un manifeste valide, les
391
+ [clés de permission](#clés-de-permission) que la nouvelle version ajoute,
392
+ élargit et retire sont listées, avec la revue dont elle a besoin.
393
+
394
+ Option : `--format json`. Codes de sortie : 0 quand les deux versions ont
395
+ été lues, qu’elles diffèrent ou non ; 1 quand l’une est refusée ; 2 pour
396
+ une erreur d’utilisation ou de fichier (une version absente ou illisible).
397
+
398
+ ## submit
399
+
400
+ ```sh
401
+ overcrow-widget submit --dry-run --submission submission.json
402
+ overcrow-widget submit --submission submission.json
403
+ ```
404
+
405
+ Envoie une version de votre widget à l’espace créateurs d’OverCrow, depuis
406
+ un terminal, une CI ou le serveur MCP d’OverCrow, puis suit ses contrôles.
407
+ La commande ne pose jamais de question : ce qui manque est signalé, avec un
408
+ [code de sortie](#codes-de-sortie) stable. Elle prend le dossier du widget
409
+ (le dossier courant sans argument) ou un ZIP de ce dossier.
410
+
411
+ ### La clé de publication
412
+
413
+ - Créez-la dans l’espace créateurs (Éditeur, Clés de publication). Une clé
414
+ ne permet que de soumettre des versions d’un seul widget, pour 1 à
415
+ 365 jours (90 par défaut), et n’est affichée qu’une fois.
416
+ - `submit` et `status` la lisent dans la variable d’environnement
417
+ `OVERCROW_PUBLISH_KEY`, et seulement là : jamais dans un argument ni dans
418
+ un fichier du projet. Dans une CI, gardez-la comme secret.
419
+ - L’outil ne l’affiche jamais : tout texte `ocw_pub_…` est masqué dans ses
420
+ sorties, ses erreurs et ses journaux. Quelle que soit la commande, il
421
+ retire la variable de l’environnement des programmes qu’il lance
422
+ (TypeScript, le runtime).
423
+ - Une clé qui expire dans moins de 14 jours donne un avertissement. Une clé
424
+ expirée ou révoquée finit avec le code 2 : créez-en une autre et
425
+ remplacez le secret.
426
+ - Chaque requête nomme le widget du `manifest.json` des sources (en-tête
427
+ `Overcrow-Widget`). Une clé qui couvre plusieurs widgets de son éditeur
428
+ (réservée à PlayerVox pour l’instant) envoie celui qui est nommé ;
429
+ `status` prend alors `--widget`.
430
+
431
+ ### Ce que fait la commande
432
+
433
+ 1. Elle vérifie la clé et lit ce dont l’espace créateurs a besoin pour ce
434
+ widget : la dernière version approuvée, la plus petite version acceptée
435
+ maintenant, les envois restants (20 sur 24 heures), la présence d’une
436
+ politique de confidentialité dans la fiche.
437
+ 2. Elle vérifie exactement ce qu’elle va envoyer. Le dossier est zippé tel
438
+ que l’espace créateurs le lit ([archives de sources](#archives-de-sources)),
439
+ relu, puis admis comme l’espace créateurs l’admet, `listing.json` étant
440
+ facultatif ; un ZIP donné à la place est envoyé tel quel, octet pour
441
+ octet. L’ID du manifeste doit être le widget de la clé, et la version
442
+ supérieure à la dernière approuvée. Chaque permission que la version
443
+ ajoute ou élargit (chaque permission, pour une première version) demande
444
+ une justification, par sa [clé](#clés-de-permission). Les textes
445
+ doivent suivre les règles de l’espace créateurs. Au moindre problème,
446
+ rien n’est envoyé (code 1).
447
+ 3. Elle envoie l’archive, puis suit les six contrôles de l’espace créateurs,
448
+ environ une minute : manifeste, numéro de version, analyse du code,
449
+ construction du paquet, permissions, taille et ressources.
450
+ 4. Elle se termine quand la version entre en revue (code 0), quand un
451
+ contrôle échoue (code 1 : chaque problème est montré sur la ligne de
452
+ votre fichier), ou quand la version a réussi ses contrôles mais attend
453
+ dans l’espace créateurs ce que seul l’espace créateurs reçoit (code 3) :
454
+ une politique de confidentialité si le widget utilise le réseau, une
455
+ fiche complète pour une première version, ou la place en revue d’un
456
+ nouvel éditeur. Le lien pour finir là-bas est affiché.
457
+
458
+ ### Une version que l’espace créateurs a déjà
459
+
460
+ Avant toute autre vérification, `submit` cherche une version du même
461
+ numéro dans l’espace créateurs. Si elle a les mêmes sources (octet pour
462
+ octet, telles que `submit` les zippe) ou, une fois admise, le même paquet,
463
+ rien n’est envoyé : la commande se termine sur l’état de cette version,
464
+ avec `outcome` `already_known`.
465
+
466
+ - Code 0 : elle est publiée, approuvée, en revue, ou attend votre réponse à
467
+ des modifications demandées.
468
+ - Code 3 : elle attend dans l’espace créateurs (le lien pour finir est
469
+ affiché).
470
+ - Code 1 : elle a échoué à ses contrôles, a été refusée, retirée ou
471
+ abandonnée : montez la version dans `manifest.json` pour envoyer d’autres
472
+ sources.
473
+ - Une version encore en contrôle est suivie, comme après un envoi.
474
+
475
+ Le même numéro avec un autre paquet est refusé avant l’envoi
476
+ (`submit.version_known_differs`) : montez la version dans `manifest.json`.
477
+ Une CI peut donc lancer `submit` à chaque push : une version déjà envoyée
478
+ ne change rien.
479
+
480
+ Ctrl+C pendant les contrôles arrête de les suivre ; ils continuent dans
481
+ l’espace créateurs, et `overcrow-widget status --version 1.3.1 --wait` les
482
+ suit de nouveau (code 4). Une commande coupée avant la fin (réseau, Ctrl+C)
483
+ reprend le même envoi quand vous la relancez à l’identique ; des sources ou
484
+ des textes modifiés font un nouvel envoi. Un envoi non terminé dans l’heure
485
+ expire, et chaque envoi compte dans la limite quotidienne.
486
+
487
+ | Option | Effet |
488
+ | --- | --- |
489
+ | `--submission FILE` | Les textes de la version ([ci-dessous](#le-fichier-de-textes)). |
490
+ | `--release-notes-en TEXT`, `--release-notes-fr TEXT`, `--review-message TEXT` | Remplacent ceux du fichier. |
491
+ | `--dry-run` | Étapes 1 et 2 seulement, sans rien envoyer : ce que l’espace créateurs exigera (justifications, politique de confidentialité, type de revue, version minimale, envois restants) et l’empreinte SHA-256 de l’archive. Pour une première version, l’espace créateurs vérifie aussi toute la fiche, qu’il est seul à connaître : un essai à blanc qui finit avec 0 peut encore finir avec 3. |
492
+ | `--expect-sha256 HEX` | N’envoie qu’une archive de cette empreinte, l’`archive.sha256` d’un `--dry-run` : ce qui part est ce qui a été vérifié. |
493
+ | `--no-wait` | S’arrête après l’envoi (code 4). |
494
+ | `--format json` | Un seul objet JSON ([sortie lisible par un programme](#sortie-lisible-par-un-programme)). |
495
+ | `--verbose` | Une ligne par requête sur la sortie d’erreur : méthode, adresse sans sa requête, statut et durée ; jamais un en-tête, une clé ou un corps. |
496
+
497
+ ### Le fichier de textes
498
+
499
+ <!-- source: docs/content/examples/weather/submission.json -->
500
+ ```json
501
+ {
502
+ "releaseNotes": {
503
+ "en": "First version: the forecast of your city, in metric or imperial units.",
504
+ "fr": "Première version : les prévisions de votre ville, en unités métriques ou impériales."
505
+ },
506
+ "justifications": [
507
+ {
508
+ "permission": "network:GET https://api.example.com/v1/forecast/{city}",
509
+ "text": "Reads the forecast of the city the player chose, every 30 minutes at most."
510
+ },
511
+ {
512
+ "permission": "storage",
513
+ "text": "Keeps the chosen city and units between two games."
514
+ }
515
+ ],
516
+ "reviewMessage": "The forecast API needs no account and receives only the city."
517
+ }
518
+ ```
519
+
520
+ | Clé | Valeur |
521
+ | --- | --- |
522
+ | `releaseNotes` | Les notes publiques de la version, montrées aux joueurs : `en` (exigé dès qu’il y a des notes) et `fr`, 500 caractères chacune, texte simple, retours à la ligne admis. |
523
+ | `justifications` | Pour le relecteur, un `{permission, text}` par permission nouvelle ou élargie, par sa [clé](#clés-de-permission) ; 500 caractères chacun. |
524
+ | `reviewMessage` | Un message privé au relecteur, 2 000 caractères. |
525
+
526
+ Chaque clé est facultative ; toute autre clé est refusée. Le serveur MCP
527
+ d’OverCrow écrit ce fichier.
528
+
529
+ ### Dans une CI
530
+
531
+ Un workflow GitHub Actions qui installe l’outil ([installation](#installation))
532
+ et soumet le widget d’exemple `nova.weather` à chaque étiquette de version,
533
+ avec la clé dans les secrets du dépôt :
534
+
535
+ <!-- source: docs/content/examples/weather/.github/workflows/submit.yml -->
536
+ ```yaml
537
+ # Sends the widget to the OverCrow creator space when a version tag is
538
+ # pushed. The publish key is a secret of the repository, and the OverCrow
539
+ # release whose creator tools to use is a variable of the repository.
540
+ name: Submit to OverCrow
541
+
542
+ on:
543
+ push:
544
+ tags: ["v*"]
545
+
546
+ permissions:
547
+ contents: read
548
+
549
+ jobs:
550
+ submit:
551
+ runs-on: ubuntu-24.04
552
+ env:
553
+ OVERCROW_VERSION: ${{ vars.OVERCROW_VERSION }}
554
+ steps:
555
+ - uses: actions/checkout@v4
556
+ - name: Install overcrow-widget
557
+ run: |
558
+ tools="overcrow-creator-tools-$OVERCROW_VERSION-linux-x86_64"
559
+ curl --fail --location --silent --show-error --remote-name \
560
+ "https://github.com/Valhallab/playervox-overcrow-releases/releases/download/v$OVERCROW_VERSION/$tools.zip"
561
+ unzip -q "$tools.zip"
562
+ (cd "$tools" && sha256sum --check --quiet SHA256SUMS)
563
+ install -D -m 755 "$tools"/overcrow-widget-*-linux-x86_64 "$HOME/.local/bin/overcrow-widget"
564
+ echo "$HOME/.local/bin" >> "$GITHUB_PATH"
565
+ - name: Submit to OverCrow
566
+ run: overcrow-widget submit --submission submission.json
567
+ env:
568
+ OVERCROW_PUBLISH_KEY: ${{ secrets.OVERCROW_PUBLISH_KEY }}
569
+ ```
570
+
571
+ Le job échoue pour tout code autre que 0. `OVERCROW_API_URL` dirige
572
+ `submit` et `status` vers une autre API, pour des essais seulement :
573
+ `https://`, ou `http://` vers `127.0.0.1`, `localhost` ou `[::1]`, avec un
574
+ avertissement à chaque fois. Ne la posez jamais dans une vraie CI ; le
575
+ serveur MCP d’OverCrow ne la pose jamais.
576
+
577
+ ## status
578
+
579
+ ```sh
580
+ overcrow-widget status
581
+ overcrow-widget status --version 1.3.1 --wait
582
+ ```
583
+
584
+ Montre les versions du widget de la clé, avec leur état et leur type de
585
+ revue. Avec `--version`, une seule version, par son numéro (la plus récente
586
+ de ce numéro) ou son ID : ses six contrôles et leurs problèmes, ce qui la
587
+ retient avant la revue, les remarques du relecteur et le délai de revue.
588
+ `--wait` suit une version encore en contrôle. `--widget ID` nomme le widget,
589
+ pour une clé qui en couvre plusieurs (code 2 sans lui, avec les widgets que
590
+ la clé couvre). Options : `--widget ID`, `--version VERSION|ID`, `--wait`,
591
+ `--format json`, `--verbose`. Code de sortie : 0
592
+ quand la lecture a réussi, 2 sur une erreur ; avec `--wait`, les codes de
593
+ `submit`.
594
+
595
+ | État | Signification |
596
+ | --- | --- |
597
+ | `checking` | Les contrôles tournent. |
598
+ | `checks_failed` | Un contrôle a échoué : rien n’est parvenu aux relecteurs. |
599
+ | `ready` | Les contrôles ont réussi ; la version attend dans l’espace créateurs. |
600
+ | `in_review` | Une personne la relit. |
601
+ | `changes_requested`, `approved`, `rejected` | La décision de la revue. |
602
+ | `published` | Dans le catalogue. |
603
+ | `superseded`, `discarded` | Remplacée par un envoi plus récent, ou abandonnée. |
604
+ | `withdrawn`, `suspended` | Hors du catalogue. |
605
+
606
+ ## Archives de sources
607
+
608
+ `admit` et `diff` acceptent le dossier du widget ou un ZIP de ce dossier
609
+ (son nom finit par `.zip`), tel que l’espace créateurs le reçoit. Le ZIP
610
+ peut contenir les fichiers directement, ou un seul dossier qui les contient
611
+ tous, comme le font Windows et macOS. Il peut porter un court commentaire
612
+ d’archive (1 024 octets au plus), comme l’écrivent le « Download ZIP » de
613
+ GitHub et `git archive` ; ce commentaire n’est jamais lu.
614
+
615
+ Laissés de côté dans les deux cas, et jamais envoyés par les outils
616
+ créateurs : les fichiers et dossiers cachés (`.env`, `.git/`,
617
+ `assets/.DS_Store`…), `node_modules/`, `dist/`, `tests/output/`,
618
+ `__MACOSX/`, les paquets construits, les fichiers de clés et les fichiers
619
+ système, et, dans un dossier, les liens et les noms qui ne sont pas en
620
+ ASCII portable. Dans un ZIP, ils comptent tout de même dans les limites
621
+ ci-dessous et sont vérifiés comme le reste. Un nom qui contient un
622
+ caractère interdit par Windows (`\ : * ? " < > |`) est refusé, dans un
623
+ dossier aussi.
624
+
625
+ | Limite | Valeur |
626
+ | --- | --- |
627
+ | Archive | 32 Mio |
628
+ | Décompressé | 64 Mio |
629
+ | Fichiers | 2 000 |
630
+
631
+ Tout est vérifié avant d’écrire le moindre octet : une archive refusée
632
+ n’écrit rien, et une archive admise n’est écrite que dans un dossier de
633
+ travail privé, supprimé à la fin.
634
+
635
+ | Code | L’archive contient |
636
+ | --- | --- |
637
+ | `sources.archive_size` | Plus de 32 Mio. |
638
+ | `sources.too_large`, `sources.too_many_files` | Plus de 64 Mio ou de 2 000 fichiers une fois décompressée. |
639
+ | `sources.unsafe_name` | Un nom qui pourrait sortir du dossier du widget (`../`, `/` en tête), ou qu’un système ne peut pas utiliser : un caractère interdit par Windows (`\`, `:`, `*`, `?`, `"`, `<`, `>`, \|), autre chose que de l’ASCII imprimable, un point ou une espace final, `CON`, `NUL`, `COM1`… Le message nomme le caractère et le fichier. |
640
+ | `sources.backslash` | Des dossiers séparés par `\`, comme les écrit `Compress-Archive` de Windows PowerShell 5.1. Envoyez le dossier du widget lui-même dans l’espace créateurs, ou utilisez [`submit`](#submit), qui fait un ZIP correct. |
641
+ | `sources.duplicate_name` | Deux noms qui ne diffèrent que par la casse, ou un fichier qui est aussi un dossier. |
642
+ | `sources.link`, `sources.special_file` | Un lien, ou un périphérique, une FIFO ou un socket. |
643
+ | `sources.bomb` | Une entrée qui se décompresse bien au-delà de sa taille compressée, ou de sa taille déclarée. |
644
+ | `sources.read` | Le fichier ne peut pas être lu (code de sortie 2). |
645
+ | `sources.encrypted` | Une entrée chiffrée. |
646
+ | `sources.zip64` | Du ZIP64, dont des sources n’ont jamais besoin. |
647
+ | `sources.archive` | Tout autre élément qu’un ZIP ne doit pas contenir : un commentaire de plus de 1 024 octets ou qui contient un enregistrement de fin, des octets avant, entre ou après les entrées ou après les données compressées d’une entrée, un autre nom dans un champ extra, des tailles ou des sommes de contrôle qui ne concordent pas. |
648
+
649
+ ## La carte du code
650
+
651
+ `--source-map FILE` écrit une carte qui relie chaque position du
652
+ `logic.js` livré, regroupé et minifié, au fichier, à la ligne et à la
653
+ colonne de vos sources : une [Source Map v3](https://tc39.es/ecma426/).
654
+ L’espace créateurs la garde privée et s’en sert pour vous montrer les
655
+ erreurs de votre widget dans votre propre code.
656
+
657
+ - `sources` : `logic.ts` (ou `logic.js`), les fichiers de `@overcrow/sdk`
658
+ (listés dans `ignoreList`) et `overcrow:view-table`, la table des
659
+ expressions générée depuis `view.ocml`, dont le texte est dans
660
+ `sourcesContent`.
661
+ - `x_overcrow_functions` : les fonctions nommées des sources,
662
+ `{"source", "name", "start": [line, column], "end": [line, column]}`,
663
+ numérotées à partir de 0, colonnes en unités UTF-16 comme `mappings`. La
664
+ fonction d’une position est la plus intérieure qui l’entoure. Les
665
+ expressions de la table de vue s’appellent `view expression <n>`, `<n>`
666
+ étant leur rang dans `view.json`.
667
+
668
+ Les mêmes sources donnent toujours la même carte. Elle ne fait jamais
669
+ partie du paquet, et `logic.js` ne la désigne pas.
316
670
 
317
671
  ## Diagnostics
318
672
 
@@ -342,7 +696,9 @@ Le code a la forme `<domain>.<category>` :
342
696
  | `typecheck` | TypeScript | `tsc` (le message de TypeScript lui-même), `skipped`, `sdk_version`, `timeout` |
343
697
  | `package` | Le paquet relu | `archive_size`, `file_size` et les catégories du lecteur de paquets d’OverCrow |
344
698
  | `test` | Les scénarios | `scenario`, `scenario_name`, `too_many_scenarios` |
699
+ | `sources` | Une archive de sources | voir [archives de sources](#archives-de-sources) |
345
700
  | `init`, `doctor`, `admission` | Ces commandes | listés ci-dessus |
701
+ | `submit` | Ce que `submit` vérifie avant l’envoi | `widget_not_submittable`, `agreement_required`, `limit_reached`, `version_too_low`, `justification_missing`, `archive_too_large`, `archive_mismatch`, `release_notes`, `justification`, `review_message` |
346
702
 
347
703
  - Les lignes et les colonnes commencent à 1 ; une colonne compte des
348
704
  caractères, pas des octets.
@@ -351,17 +707,96 @@ Le code a la forme `<domain>.<category>` :
351
707
  la sortie standard :
352
708
  `{"severity","code","file","line","column","message","help"}`, avec
353
709
  `null` pour ce qui est inconnu. `package --format json` se termine par un
354
- objet `{"package","bytes","sha256","logicBytes"}`.
710
+ objet `{"package","bytes","sha256","logicBytes","sourceMap"}` ; `admit` et
711
+ `diff` affichent un seul rapport ([sortie lisible par un
712
+ programme](#sortie-lisible-par-un-programme)).
355
713
  - Les textes qui viennent d’un widget (ses journaux, ses noms) sont affichés
356
714
  avec les caractères de contrôle du terminal neutralisés.
357
715
 
358
716
  Dans vos scripts, appuyez-vous sur les codes : les messages et les textes
359
717
  d’aide peuvent être reformulés.
360
718
 
719
+ ## Sortie lisible par un programme
720
+
721
+ Avec `--format json`, `admit`, `diff`, `submit` et `status` affichent un
722
+ seul objet JSON sur une ligne. Des champs peuvent seulement s’ajouter ; tout autre changement
723
+ est annoncé par un nouveau `formatVersion`.
724
+
725
+ `admit` :
726
+
727
+ | Champ | Valeur |
728
+ | --- | --- |
729
+ | `formatVersion` | `1`. |
730
+ | `admitted` | Si les sources sont admises. |
731
+ | `publisher` | Le pseudo de `--publisher`, ou `third-party`. |
732
+ | `id`, `version`, `reservedId` | Le widget ; `null` quand les sources ont été refusées avant la construction. |
733
+ | `package` | `bytes`, `sha256` et les `bytes` et `sha256` de chaque fichier. |
734
+ | `reproducible` | `viewJson` et `archive`, comparés avec `--package`, sinon `null`. |
735
+ | `listing` | `bytes`, `sha256`, `spdxLicense` et `preview` de `listing.json`. |
736
+ | `sources` | `kind` (`folder` ou `archive`), `files`, `bytes`, `ignored` (`path`, `reason`) et, pour un ZIP, `sha256` et `prefix` (le dossier englobant). |
737
+ | `review` | Les pouvoirs à relire, un objet par élément (`kind`, puis ses champs). |
738
+ | `permissions` | `keys` ; avec `--previous`, aussi `previous` (`id`, `version`), `added`, `changed`, `removed` et `reviewType` (`full` ou `quick`), sinon `null`. |
739
+ | `listingPolicy` | `required` ou `optional` (`--listing`). |
740
+ | `diagnostics` | Les diagnostics, comme ci-dessus. |
741
+
742
+ `diff` :
743
+
744
+ | Champ | Valeur |
745
+ | --- | --- |
746
+ | `formatVersion` | `1`. |
747
+ | `compared` | `false` quand une version est refusée ; seul `diagnostics` suit alors. |
748
+ | `old`, `new` | `kind`, `files`, `bytes`, `sha256`, `prefix`, `ignored`, `id` et `version` de chaque version. |
749
+ | `files` | Les fichiers modifiés, par chemin : `path`, `status` (`added`, `modified`, `removed`), `binary`, `tooLarge`, `oldSha256`, `newSha256`, `additions`, `deletions` et `hunks` (`oldStart`, `oldLines`, `newStart`, `newLines`, `lines`, chaque ligne commençant par ` `, `-`, `+` ou `\`). |
750
+ | `totals` | `added`, `modified`, `removed`, `additions`, `deletions`. |
751
+ | `permissions` | `added`, `changed`, `removed` et `reviewType`, ou `null` sans deux manifestes valides. |
752
+ | `diagnostics` | Les diagnostics. |
753
+
754
+
755
+ `submit` et `status` :
756
+
757
+ | Champ | Valeur |
758
+ | --- | --- |
759
+ | `formatVersion`, `command` | `1` ; `submit` ou `status`. |
760
+ | `outcome`, `exitCode` | La fin de la commande (ci-dessous) et son [code de sortie](#codes-de-sortie). |
761
+ | `dryRun` | `submit` : si rien ne devait partir. |
762
+ | `key` | `name`, `hint` (les quatre caractères après `ocw_pub_`), `expiresAt`, `expiresSoon`, `widgets` (les widgets que la clé couvre). |
763
+ | `widget` | `id` ; `submit` : `publisher`, `status` ; `status` : `name`. |
764
+ | `archive` | `submit` : `kind` (`folder`, zippé par l’outil, ou `archive`), `bytes`, `sha256`, `files`, `uncompressedBytes`, `ignored`. |
765
+ | `local` | `submit` : `admitted`, `version`, `minimumVersion`, `previousVersion`, `permissions` (`keys`, `added`, `changed`, `removed`, `reviewType`), `diagnostics`. |
766
+ | `requirements` | `submit` : `justifications` (`required`, `given`, `missing`, `unused`), `privacyPolicy` (`required`, `present`), `reviewType`, `submissions` (`limit`, `remaining`, `nextSubmissionAt`), `review` (`available`, `blockedBy`), `agreement` (`version`, `accepted`), `blockers` (`code`). |
767
+ | `known` | `submit` : la version que l’espace créateurs a déjà (rien n’est parti) : `versionId`, `state`, `match` (`sources` ou `package`). |
768
+ | `submission` | `submit` : `id`, `state`, `resumed`, `quota`. |
769
+ | `version` | La version de l’espace créateurs, ses champs en camelCase : `id`, `version`, `state`, `reviewType`, `checks` (`key`, `status`, `diagnostics`), `reviewBlockers`, `completeInPortal` (`message`, `url`), `permissions`, `remarks`, `deadline`, `history`… |
770
+ | `versions` | `status` sans `--version` : toutes les versions. |
771
+ | `error` | `code`, `message` et, quand ils sont connus, `httpStatus`, `retryAfter`, `nextSubmissionAt`, `minimumVersion`, `expiredAt`, `fields` ; sinon `null`. |
772
+
773
+ `outcome` vaut `ready_to_send` (`--dry-run`), `refused_locally`, `refused`
774
+ (l’espace créateurs a refusé l’envoi), `complete_in_portal`,
775
+ `already_known` (rien n’est parti, voir `known`), `error`, ou l’état de la
776
+ version ; `status` sans `--wait` n’en a pas. Les codes
777
+ d’erreur sont ceux de l’espace créateurs (`version_not_newer`,
778
+ `submission_limit_reached`, `publish_key_expired`, `publish_key_revoked`,
779
+ `widget_required`, `publish_key_widget_not_covered`…)
780
+ ou ceux de l’outil : `publish_key_missing`, `invalid_publish_key`,
781
+ `api_url_invalid`, `submission_file`, `sources`, `sources.read`, `network`,
782
+ `timeout`, `server`, `response`, `redirect`, `upload_refused`,
783
+ `build_failed`, `submission_state`, `not_found`, `internal`. Les problèmes
784
+ trouvés avant l’envoi sont des diagnostics : `sources.*`,
785
+ `project.missing_file` (ce n’est pas le dossier du widget), `admission.*`
786
+ et `submit.*`
787
+ (`widget_not_submittable`, `agreement_required`, `limit_reached`,
788
+ `version_too_low`, `justification_missing`, `archive_too_large`,
789
+ `archive_mismatch`, `version_known_differs`, `release_notes`,
790
+ `justification`, `review_message`).
791
+
361
792
  ## Codes de sortie
362
793
 
363
794
  | Code | Signification |
364
795
  | --- | --- |
365
- | 0 | Succès. Les avertissements sont admis, sauf avec `--deny-warnings`. |
366
- | 1 | Des erreurs ont été trouvées ; `admit` a refusé la soumission ; un scénario de `test` a échoué ; l’overlay a mis fin à une session `dev`. |
367
- | 2 | Une erreur d’utilisation ou de fichier ; pas d’overlay pour `dev` ; pas de runtime pour `test`. |
796
+ | 0 | Succès. Les avertissements sont admis, sauf avec `--deny-warnings`. `diff` a lu les deux versions, qu’elles diffèrent ou non. `submit` : la version est en revue (avec `--dry-run`, elle y entrerait), ou déjà au-delà (approuvée, publiée, retirée), ou l’espace créateurs l’avait déjà en revue, avec des modifications demandées, approuvée ou publiée. |
797
+ | 1 | Des erreurs ont été trouvées ; `admit` a refusé les sources ; `diff` a refusé une version ; un scénario de `test` a échoué ; l’overlay a mis fin à une session `dev`. `submit` : quelque chose à corriger (une vérification avant l’envoi, un refus de l’espace créateurs, un contrôle échoué, une version que l’espace créateurs a déjà refusée, retirée ou abandonnée). |
798
+ | 2 | Une erreur d’utilisation ou de fichier ; pas d’overlay pour `dev` ; pas de runtime pour `test`. `submit`, `status` : la clé (absente, invalide, expirée, révoquée), le réseau ou le serveur. |
799
+ | 3 | `submit`, `status --wait` : la version a réussi ses contrôles et attend dans l’espace créateurs. |
800
+ | 4 | `submit`, `status --wait` : la version est encore en contrôle (Ctrl+C, `--no-wait`, ou 15 minutes). |
801
+
802
+ Ces significations ne changent pas d’une version de l’outil à l’autre.