@overcrow/mcp 0.0.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 (489) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -1
  3. package/dist/audit/index.js +103 -0
  4. package/dist/audit/lexer.js +417 -0
  5. package/dist/audit/project.js +200 -0
  6. package/dist/audit/rules.js +661 -0
  7. package/dist/bootstrap/download.js +229 -0
  8. package/dist/bootstrap/install.js +280 -0
  9. package/dist/bootstrap/pin.js +85 -0
  10. package/dist/bootstrap/pin.json +119 -0
  11. package/dist/bootstrap/zip.js +258 -0
  12. package/dist/cli.js +200 -0
  13. package/dist/confine.js +244 -0
  14. package/dist/content/docs/en/cli.md +768 -0
  15. package/dist/content/docs/en/creator-space.md +78 -0
  16. package/dist/content/docs/en/dev-channel.md +130 -0
  17. package/dist/content/docs/en/elements.md +469 -0
  18. package/dist/content/docs/en/forms.md +328 -0
  19. package/dist/content/docs/en/guide.md +252 -0
  20. package/dist/content/docs/en/index.md +85 -0
  21. package/dist/content/docs/en/limits.md +241 -0
  22. package/dist/content/docs/en/logic.md +446 -0
  23. package/dist/content/docs/en/manifest.md +388 -0
  24. package/dist/content/docs/en/mcp.md +165 -0
  25. package/dist/content/docs/en/package.md +131 -0
  26. package/dist/content/docs/en/publish-a-widget.md +94 -0
  27. package/dist/content/docs/en/publish-keys.md +95 -0
  28. package/dist/content/docs/en/publishing.md +167 -0
  29. package/dist/content/docs/en/reference.md +55 -0
  30. package/dist/content/docs/en/result-shapes.md +332 -0
  31. package/dist/content/docs/en/sdk.md +295 -0
  32. package/dist/content/docs/en/security.md +115 -0
  33. package/dist/content/docs/en/service-reference.md +344 -0
  34. package/dist/content/docs/en/services.md +517 -0
  35. package/dist/content/docs/en/style-properties.md +270 -0
  36. package/dist/content/docs/en/style.md +266 -0
  37. package/dist/content/docs/en/testing.md +400 -0
  38. package/dist/content/docs/en/verified-domain.md +46 -0
  39. package/dist/content/docs/en/view.md +338 -0
  40. package/dist/content/docs/en/widget-listing.md +65 -0
  41. package/dist/content/docs/en/widget-review.md +57 -0
  42. package/dist/content/docs/en/widget-statistics.md +134 -0
  43. package/dist/content/docs/en/widgets.md +76 -0
  44. package/dist/content/docs/fr/cli.md +802 -0
  45. package/dist/content/docs/fr/creator-space.md +83 -0
  46. package/dist/content/docs/fr/dev-channel.md +140 -0
  47. package/dist/content/docs/fr/elements.md +475 -0
  48. package/dist/content/docs/fr/forms.md +341 -0
  49. package/dist/content/docs/fr/guide.md +263 -0
  50. package/dist/content/docs/fr/index.md +90 -0
  51. package/dist/content/docs/fr/limits.md +244 -0
  52. package/dist/content/docs/fr/logic.md +461 -0
  53. package/dist/content/docs/fr/manifest.md +401 -0
  54. package/dist/content/docs/fr/mcp.md +173 -0
  55. package/dist/content/docs/fr/package.md +139 -0
  56. package/dist/content/docs/fr/publish-a-widget.md +101 -0
  57. package/dist/content/docs/fr/publish-keys.md +97 -0
  58. package/dist/content/docs/fr/publishing.md +177 -0
  59. package/dist/content/docs/fr/reference.md +59 -0
  60. package/dist/content/docs/fr/result-shapes.md +333 -0
  61. package/dist/content/docs/fr/sdk.md +301 -0
  62. package/dist/content/docs/fr/security.md +129 -0
  63. package/dist/content/docs/fr/service-reference.md +346 -0
  64. package/dist/content/docs/fr/services.md +540 -0
  65. package/dist/content/docs/fr/style-properties.md +272 -0
  66. package/dist/content/docs/fr/style.md +281 -0
  67. package/dist/content/docs/fr/testing.md +417 -0
  68. package/dist/content/docs/fr/verified-domain.md +49 -0
  69. package/dist/content/docs/fr/view.md +352 -0
  70. package/dist/content/docs/fr/widget-listing.md +69 -0
  71. package/dist/content/docs/fr/widget-review.md +59 -0
  72. package/dist/content/docs/fr/widget-statistics.md +141 -0
  73. package/dist/content/docs/fr/widgets.md +81 -0
  74. package/dist/content/examples/clock/LICENSE +21 -0
  75. package/dist/content/examples/clock/README.md +75 -0
  76. package/dist/content/examples/clock/listing.json +19 -0
  77. package/dist/content/examples/clock/locales/en.json +4 -0
  78. package/dist/content/examples/clock/locales/fr.json +4 -0
  79. package/dist/content/examples/clock/logic.ts +85 -0
  80. package/dist/content/examples/clock/manifest.json +44 -0
  81. package/dist/content/examples/clock/package.json +16 -0
  82. package/dist/content/examples/clock/style.ocss +26 -0
  83. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  84. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  85. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  86. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  87. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  88. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  89. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  90. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  91. package/dist/content/examples/clock/tsconfig.json +16 -0
  92. package/dist/content/examples/clock/view.ocml +8 -0
  93. package/dist/content/examples/countdown/LICENSE +20 -0
  94. package/dist/content/examples/countdown/listing.json +10 -0
  95. package/dist/content/examples/countdown/locales/en.json +15 -0
  96. package/dist/content/examples/countdown/locales/fr.json +15 -0
  97. package/dist/content/examples/countdown/logic.ts +179 -0
  98. package/dist/content/examples/countdown/manifest.json +34 -0
  99. package/dist/content/examples/countdown/package.json +15 -0
  100. package/dist/content/examples/countdown/style.ocss +94 -0
  101. package/dist/content/examples/countdown/tsconfig.json +16 -0
  102. package/dist/content/examples/countdown/view.ocml +42 -0
  103. package/dist/content/examples/fps/LICENSE +21 -0
  104. package/dist/content/examples/fps/README.md +64 -0
  105. package/dist/content/examples/fps/listing.json +19 -0
  106. package/dist/content/examples/fps/locales/en.json +11 -0
  107. package/dist/content/examples/fps/locales/fr.json +11 -0
  108. package/dist/content/examples/fps/logic.ts +64 -0
  109. package/dist/content/examples/fps/manifest.json +30 -0
  110. package/dist/content/examples/fps/package.json +16 -0
  111. package/dist/content/examples/fps/style.ocss +31 -0
  112. package/dist/content/examples/fps/submission.json +8 -0
  113. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  114. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  115. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  116. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  117. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  118. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  119. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  120. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  121. package/dist/content/examples/fps/tsconfig.json +16 -0
  122. package/dist/content/examples/fps/view.ocml +11 -0
  123. package/dist/content/examples/media/LICENSE +21 -0
  124. package/dist/content/examples/media/README.md +147 -0
  125. package/dist/content/examples/media/listing.json +19 -0
  126. package/dist/content/examples/media/locales/en.json +11 -0
  127. package/dist/content/examples/media/locales/fr.json +11 -0
  128. package/dist/content/examples/media/logic.ts +191 -0
  129. package/dist/content/examples/media/manifest.json +35 -0
  130. package/dist/content/examples/media/package.json +16 -0
  131. package/dist/content/examples/media/style.ocss +148 -0
  132. package/dist/content/examples/media/submission.json +12 -0
  133. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  134. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  135. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  136. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  137. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  138. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  139. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  140. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  141. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  142. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  143. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  144. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  145. package/dist/content/examples/media/tsconfig.json +16 -0
  146. package/dist/content/examples/media/view.ocml +41 -0
  147. package/dist/content/examples/notes/LICENSE +21 -0
  148. package/dist/content/examples/notes/README.md +219 -0
  149. package/dist/content/examples/notes/listing.json +19 -0
  150. package/dist/content/examples/notes/locales/en.json +25 -0
  151. package/dist/content/examples/notes/locales/fr.json +25 -0
  152. package/dist/content/examples/notes/logic.ts +799 -0
  153. package/dist/content/examples/notes/manifest.json +40 -0
  154. package/dist/content/examples/notes/package.json +16 -0
  155. package/dist/content/examples/notes/style.ocss +469 -0
  156. package/dist/content/examples/notes/submission.json +12 -0
  157. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  158. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  159. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  160. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  161. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  162. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  163. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  164. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  165. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  166. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  167. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  168. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  169. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  170. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  171. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  172. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  173. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  174. package/dist/content/examples/notes/tsconfig.json +16 -0
  175. package/dist/content/examples/notes/view.ocml +154 -0
  176. package/dist/content/examples/performance/LICENSE +21 -0
  177. package/dist/content/examples/performance/README.md +134 -0
  178. package/dist/content/examples/performance/listing.json +19 -0
  179. package/dist/content/examples/performance/locales/en.json +20 -0
  180. package/dist/content/examples/performance/locales/fr.json +20 -0
  181. package/dist/content/examples/performance/logic.ts +210 -0
  182. package/dist/content/examples/performance/manifest.json +83 -0
  183. package/dist/content/examples/performance/package.json +16 -0
  184. package/dist/content/examples/performance/style.ocss +75 -0
  185. package/dist/content/examples/performance/submission.json +12 -0
  186. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  187. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  188. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  189. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  190. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  191. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  192. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  193. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  194. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  195. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  196. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  197. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  198. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  199. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  200. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  201. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  202. package/dist/content/examples/performance/tsconfig.json +16 -0
  203. package/dist/content/examples/performance/view.ocml +18 -0
  204. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  205. package/dist/content/examples/playervox-journal/README.md +150 -0
  206. package/dist/content/examples/playervox-journal/listing.json +19 -0
  207. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  208. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  209. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  210. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  211. package/dist/content/examples/playervox-journal/package.json +16 -0
  212. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  213. package/dist/content/examples/playervox-journal/submission.json +12 -0
  214. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  215. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  216. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  217. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  218. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  219. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  220. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  221. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  222. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  223. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  224. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  225. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  226. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  227. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  228. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  229. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  230. package/dist/content/examples/playervox-rating/README.md +166 -0
  231. package/dist/content/examples/playervox-rating/listing.json +19 -0
  232. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  233. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  234. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  235. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  236. package/dist/content/examples/playervox-rating/package.json +16 -0
  237. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  238. package/dist/content/examples/playervox-rating/submission.json +12 -0
  239. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  240. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  241. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  242. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  243. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  244. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  245. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  246. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  247. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  248. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  249. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  250. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  251. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  252. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  253. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  254. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  255. package/dist/content/examples/playervox-reviews/README.md +194 -0
  256. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  257. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  258. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  259. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  260. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  261. package/dist/content/examples/playervox-reviews/package.json +16 -0
  262. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  263. package/dist/content/examples/playervox-reviews/submission.json +8 -0
  264. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  265. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  266. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  267. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  268. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  269. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  270. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  271. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  272. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  273. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  274. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  275. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  276. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  277. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  278. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  279. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  280. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  281. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  283. package/dist/content/examples/playervox-score/LICENSE +21 -0
  284. package/dist/content/examples/playervox-score/README.md +131 -0
  285. package/dist/content/examples/playervox-score/listing.json +19 -0
  286. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  287. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  288. package/dist/content/examples/playervox-score/logic.ts +430 -0
  289. package/dist/content/examples/playervox-score/manifest.json +47 -0
  290. package/dist/content/examples/playervox-score/package.json +16 -0
  291. package/dist/content/examples/playervox-score/style.ocss +247 -0
  292. package/dist/content/examples/playervox-score/submission.json +8 -0
  293. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  294. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  295. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  296. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  297. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  298. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  299. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  300. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  301. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  302. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  303. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  304. package/dist/content/examples/playervox-score/view.ocml +51 -0
  305. package/dist/content/examples/session/LICENSE +21 -0
  306. package/dist/content/examples/session/README.md +57 -0
  307. package/dist/content/examples/session/listing.json +19 -0
  308. package/dist/content/examples/session/locales/en.json +3 -0
  309. package/dist/content/examples/session/locales/fr.json +3 -0
  310. package/dist/content/examples/session/logic.ts +26 -0
  311. package/dist/content/examples/session/manifest.json +19 -0
  312. package/dist/content/examples/session/package.json +16 -0
  313. package/dist/content/examples/session/style.ocss +16 -0
  314. package/dist/content/examples/session/submission.json +8 -0
  315. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  316. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  318. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  319. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  320. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  321. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  322. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  323. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  324. package/dist/content/examples/session/tsconfig.json +16 -0
  325. package/dist/content/examples/session/view.ocml +11 -0
  326. package/dist/content/examples/stopwatch/LICENSE +21 -0
  327. package/dist/content/examples/stopwatch/README.md +99 -0
  328. package/dist/content/examples/stopwatch/listing.json +19 -0
  329. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  330. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  331. package/dist/content/examples/stopwatch/logic.ts +93 -0
  332. package/dist/content/examples/stopwatch/manifest.json +19 -0
  333. package/dist/content/examples/stopwatch/package.json +16 -0
  334. package/dist/content/examples/stopwatch/style.ocss +54 -0
  335. package/dist/content/examples/stopwatch/submission.json +12 -0
  336. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  337. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  338. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  339. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  340. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  341. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  342. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  343. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  344. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  345. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  346. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  347. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  348. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  349. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  350. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  351. package/dist/content/examples/stopwatch/view.ocml +29 -0
  352. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  353. package/dist/content/examples/twitch-chat/README.md +283 -0
  354. package/dist/content/examples/twitch-chat/listing.json +19 -0
  355. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  356. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  357. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  358. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  359. package/dist/content/examples/twitch-chat/package.json +16 -0
  360. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  361. package/dist/content/examples/twitch-chat/submission.json +12 -0
  362. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  363. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  364. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  365. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  366. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  367. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  368. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  369. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  370. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  371. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  372. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  373. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  374. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  375. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  376. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  377. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  378. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  379. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  380. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  381. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  382. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  383. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  384. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  385. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  386. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  387. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  388. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  389. package/dist/content/examples/warframe-market/LICENSE +21 -0
  390. package/dist/content/examples/warframe-market/README.md +176 -0
  391. package/dist/content/examples/warframe-market/listing.json +19 -0
  392. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  393. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  394. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  395. package/dist/content/examples/warframe-market/manifest.json +92 -0
  396. package/dist/content/examples/warframe-market/package.json +16 -0
  397. package/dist/content/examples/warframe-market/style.ocss +422 -0
  398. package/dist/content/examples/warframe-market/submission.json +24 -0
  399. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  400. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  401. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  402. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  403. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  404. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  405. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  406. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  407. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  408. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  409. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  410. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  411. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  412. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  413. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  414. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  415. package/dist/content/examples/warframe-market/view.ocml +116 -0
  416. package/dist/content/examples/weather/LICENSE +20 -0
  417. package/dist/content/examples/weather/listing.json +10 -0
  418. package/dist/content/examples/weather/locales/en.json +9 -0
  419. package/dist/content/examples/weather/locales/fr.json +9 -0
  420. package/dist/content/examples/weather/logic.ts +62 -0
  421. package/dist/content/examples/weather/manifest.json +51 -0
  422. package/dist/content/examples/weather/package.json +15 -0
  423. package/dist/content/examples/weather/style.ocss +29 -0
  424. package/dist/content/examples/weather/submission.json +17 -0
  425. package/dist/content/examples/weather/tsconfig.json +16 -0
  426. package/dist/content/examples/weather/view.ocml +12 -0
  427. package/dist/content/index.json +3705 -0
  428. package/dist/content/reference/errors.json +1924 -0
  429. package/dist/content/reference/limits.json +1154 -0
  430. package/dist/content/reference/manifest.md +223 -0
  431. package/dist/content/reference/permissions.json +413 -0
  432. package/dist/content/templates/blank/locales/en.json +3 -0
  433. package/dist/content/templates/blank/locales/fr.json +3 -0
  434. package/dist/content/templates/blank/logic.ts +7 -0
  435. package/dist/content/templates/blank/manifest.json +16 -0
  436. package/dist/content/templates/blank/style.ocss +10 -0
  437. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  438. package/dist/content/templates/blank/view.ocml +6 -0
  439. package/dist/content/templates/chart/locales/en.json +3 -0
  440. package/dist/content/templates/chart/locales/fr.json +3 -0
  441. package/dist/content/templates/chart/logic.ts +27 -0
  442. package/dist/content/templates/chart/manifest.json +16 -0
  443. package/dist/content/templates/chart/style.ocss +27 -0
  444. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  445. package/dist/content/templates/chart/view.ocml +10 -0
  446. package/dist/content/templates/counter/locales/en.json +4 -0
  447. package/dist/content/templates/counter/locales/fr.json +4 -0
  448. package/dist/content/templates/counter/logic.ts +20 -0
  449. package/dist/content/templates/counter/manifest.json +16 -0
  450. package/dist/content/templates/counter/style.ocss +26 -0
  451. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  452. package/dist/content/templates/counter/view.ocml +13 -0
  453. package/dist/content/templates/list/locales/en.json +8 -0
  454. package/dist/content/templates/list/locales/fr.json +8 -0
  455. package/dist/content/templates/list/logic.ts +35 -0
  456. package/dist/content/templates/list/manifest.json +16 -0
  457. package/dist/content/templates/list/style.ocss +42 -0
  458. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  459. package/dist/content/templates/list/view.ocml +17 -0
  460. package/dist/content/templates/shared/LICENSE +20 -0
  461. package/dist/content/templates/shared/package.json +14 -0
  462. package/dist/content/templates/shared/tsconfig.json +16 -0
  463. package/dist/content.js +68 -0
  464. package/dist/env.js +156 -0
  465. package/dist/fingerprint.js +32 -0
  466. package/dist/hidden.js +47 -0
  467. package/dist/ids.js +27 -0
  468. package/dist/index.js +82 -0
  469. package/dist/knowledge.js +222 -0
  470. package/dist/npm.js +149 -0
  471. package/dist/prompts.js +47 -0
  472. package/dist/resources.js +82 -0
  473. package/dist/run.js +120 -0
  474. package/dist/server.js +43 -0
  475. package/dist/session.js +205 -0
  476. package/dist/sources.js +218 -0
  477. package/dist/text.js +80 -0
  478. package/dist/texts.js +44 -0
  479. package/dist/tools/audit.js +105 -0
  480. package/dist/tools/build.js +453 -0
  481. package/dist/tools/common.js +122 -0
  482. package/dist/tools/docs.js +196 -0
  483. package/dist/tools/preview.js +87 -0
  484. package/dist/tools/project.js +183 -0
  485. package/dist/tools/setup.js +146 -0
  486. package/dist/tools/submission.js +369 -0
  487. package/dist/version.js +3 -0
  488. package/npm-shrinkwrap.json +402 -0
  489. package/package.json +50 -4
@@ -0,0 +1,802 @@
1
+ # L’outil en ligne de commande
2
+
3
+ `overcrow-widget` crée, vérifie et empaquette les widgets PlayerVox
4
+ OverCrow, les exécute dans OverCrow pendant que vous les écrivez, et les
5
+ teste. C’est un seul programme pour Linux et Windows. Il contient les mêmes
6
+ validateurs que ceux qu’OverCrow exécute quand il installe et démarre un
7
+ widget : un paquet qu’il accepte est un paquet qu’OverCrow lit.
8
+
9
+ ```sh
10
+ overcrow-widget init my-widget --template counter --id nova.my-widget
11
+ cd my-widget
12
+ overcrow-widget check
13
+ overcrow-widget package
14
+ overcrow-widget inspect dist/nova.my-widget-0.1.0.ocpkg
15
+ overcrow-widget doctor
16
+ overcrow-widget dev
17
+ overcrow-widget test
18
+ ```
19
+
20
+ | Commande | Rôle |
21
+ | --- | --- |
22
+ | [`init`](#init) | Crée un projet à partir d’un template. |
23
+ | [`check`](#check) | Valide un projet sans rien écrire. |
24
+ | [`package`](#package) | Vérifie, puis écrit le paquet `.ocpkg`. |
25
+ | [`inspect`](#inspect) | Montre ce qu’un paquet contient et demande. |
26
+ | [`dev`](#dev) | Exécute le widget dans OverCrow et le recharge à chaque enregistrement. |
27
+ | [`test`](#test) | Joue les scénarios de test du projet et compare leurs images. |
28
+ | [`doctor`](#doctor) | Indique ce que votre installation a et ce qui lui manque. |
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. |
33
+
34
+ Chaque commande prend le dossier du projet en argument ; sans argument,
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.
37
+
38
+ ## Installation
39
+
40
+ Chaque [release d’OverCrow](https://github.com/Valhallab/playervox-overcrow-releases/releases)
41
+ contient les outils créateurs dans un ZIP par plateforme : l’outil avec
42
+ sa licence et ses notices tierces, le runtime headless d’OverCrow
43
+ qu’utilise [`test`](#test), un `README.txt` et un `SHA256SUMS` de tous
44
+ les fichiers.
45
+
46
+ | Plateforme | ZIP | Outil dans le ZIP |
47
+ | --- | --- | --- |
48
+ | Linux x86-64 | `overcrow-creator-tools-VERSION-linux-x86_64.zip` | `overcrow-widget-VERSION-linux-x86_64` |
49
+ | Windows x64 | `overcrow-creator-tools-VERSION-windows-x86_64.zip` | `overcrow-widget-VERSION-windows-x86_64.exe` |
50
+
51
+ Décompressez-le, vérifiez les fichiers, renommez l’outil `overcrow-widget`
52
+ (`overcrow-widget.exe` sous Windows), rendez-le exécutable sous Linux
53
+ (`chmod +x`) et placez-le dans votre `PATH`. Il n’a besoin de rien d’autre
54
+ pour vérifier et empaqueter un widget. `overcrow-widget --version` donne sa
55
+ version et celle du SDK qu’il embarque.
56
+
57
+ ```sh
58
+ unzip overcrow-creator-tools-VERSION-linux-x86_64.zip
59
+ cd overcrow-creator-tools-VERSION-linux-x86_64
60
+ sha256sum --check SHA256SUMS
61
+ install -m 755 overcrow-widget-*-linux-x86_64 ~/.local/bin/overcrow-widget
62
+ ```
63
+
64
+ L’outil se compile aussi avec Rust depuis le
65
+ [dépôt public](https://github.com/Valhallab/playervox-overcrow-releases) ;
66
+ le dépôt épingle la toolchain nécessaire. Le programme est alors
67
+ `target/dist/overcrow-widget`.
68
+
69
+ ```sh
70
+ cargo build -p overcrow-widget-cli --profile dist --locked
71
+ ```
72
+
73
+ ### Les types du SDK
74
+
75
+ `check` vérifie les types de votre logique avec le TypeScript du projet, si
76
+ Node.js 22 ou plus récent et `node_modules/typescript` sont présents. Sinon,
77
+ il signale par un avertissement que les types n’ont pas été vérifiés
78
+ (`typecheck.skipped`) et continue. Le SDK lui-même est inclus dans l’outil :
79
+ l’empaquetage ne dépend donc jamais de `node_modules`.
80
+
81
+ `@overcrow/sdk` est sur [npm](https://www.npmjs.com/package/@overcrow/sdk).
82
+ Le `package.json` d’un projet créé par `init` nomme TypeScript et la version
83
+ du SDK que l’outil embarque : lancez `npm install` dans le projet. Dans un
84
+ autre projet, installez le SDK avec :
85
+
86
+ ```sh
87
+ npm install --save-dev --save-exact @overcrow/sdk@1.0.0
88
+ ```
89
+
90
+ Gardez la version que l’outil embarque (`overcrow-widget --version`).
91
+ `overcrow-widget doctor` signale l’absence de TypeScript, ainsi qu’un SDK
92
+ dans `node_modules` dont la version diffère de celle que l’outil embarque.
93
+
94
+ ## Fichiers d’un projet
95
+
96
+ | Fichier | Rôle | Empaqueté |
97
+ | --- | --- | --- |
98
+ | `manifest.json` | [Le manifeste](manifest.md), empaqueté tel quel. | oui |
99
+ | `view.ocml` | [La vue](view.md), compilée en `view.json`. | compilé |
100
+ | `style.ocss` | [Le style](style.md) ; facultatif. | oui |
101
+ | `logic.ts` ou `logic.js` | [La logique](logic.md), un seul module ; regroupée avec le SDK dans `logic.js`. | regroupé |
102
+ | `locales/en.json`, `locales/fr.json` | [Les messages](logic.md#messages) ; les deux fichiers ou aucun, avec les mêmes clés. | oui |
103
+ | `LICENSE` | Le texte de la licence du paquet. Les templates partent de la licence MIT ; choisissez la vôtre. | 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 |
105
+ | `package.json`, `tsconfig.json` | Outillage uniquement : TypeScript et les types du SDK. | 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 |
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 |
108
+
109
+ ## init
110
+
111
+ ```sh
112
+ overcrow-widget init my-widget --template list --id nova.my-widget --name "My widget"
113
+ ```
114
+
115
+ Écrit un nouveau projet dans le dossier, qui ne doit pas exister ou doit
116
+ être vide : `init` n’écrase jamais un fichier.
117
+
118
+ | Template | Montre |
119
+ | --- | --- |
120
+ | `blank` (par défaut) | Un titre tiré des messages et un état vide. |
121
+ | `counter` | Une valeur et deux boutons dont la logique exporte les gestionnaires. |
122
+ | `list` | Une liste de tâches à clés : `for`, gestionnaires avec arguments, `t()` avec paramètres. |
123
+ | `chart` | Un graphique en direct, mis à jour par un minuteur. |
124
+
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é.
131
+ Chaque template est livré avec un scénario de test,
132
+ `tests/example.scenario.json` ; `counter`, `list` et `chart` fournissent
133
+ aussi ses images de référence.
134
+
135
+ ## check
136
+
137
+ ```sh
138
+ overcrow-widget check
139
+ overcrow-widget check --deny-warnings --format json
140
+ ```
141
+
142
+ Exécute toutes les vérifications, dans cet ordre, et n’écrit rien :
143
+
144
+ 1. **Fichiers du projet** : les fichiers requis sont présents et respectent
145
+ leurs limites de taille, il y a un seul module de logique, et les deux
146
+ fichiers de langue ou aucun.
147
+ 2. **Manifeste** : le validateur de manifeste d’OverCrow lui-même.
148
+ 3. **Vue** : `view.ocml` est compilé et le résultat validé ; les images
149
+ statiques doivent exister dans `assets/`.
150
+ 4. **Style** : `style.ocss` est analysé avec l’analyseur syntaxique
151
+ d’OverCrow.
152
+ 5. **Fichiers de langue** : des objets de chaînes aux clés valides, avec les
153
+ mêmes clés dans les deux fichiers. Un `t("key")` de la vue dont la clé
154
+ n’a pas de message donne un avertissement.
155
+ 6. **Logique** : son
156
+ [analyse statique](logic.md#ce-que-la-logique-ne-peut-pas-utiliser), et
157
+ les exports que la vue appelle.
158
+ 7. **Types** : le `tsc --noEmit -p tsconfig.json` du projet.
159
+ 8. **Paquet** : `logic.js` est construit, puis le paquet est écrit en
160
+ mémoire et relu exactement comme OverCrow le lira.
161
+
162
+ Options : `--no-typecheck`, `--deny-warnings` (un avertissement fait échouer
163
+ la commande), `--format json`.
164
+
165
+ ## package
166
+
167
+ ```sh
168
+ overcrow-widget package
169
+ overcrow-widget package --out build/my-widget.ocpkg
170
+ ```
171
+
172
+ Exécute `check`, puis écrit le paquet dans `dist/<id>-<version>.ocpkg`, ou
173
+ à l’emplacement donné par `--out`. La commande affiche le chemin, la taille
174
+ et le SHA-256 de l’archive.
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
+
180
+ L’empaquetage est déterministe : les mêmes sources et la même version de
181
+ l’outil donnent les mêmes octets à chaque exécution et sur tous les
182
+ systèmes. Le contenu du paquet est décrit dans [le paquet](package.md).
183
+
184
+ ## inspect
185
+
186
+ ```sh
187
+ overcrow-widget inspect dist/nova.my-widget-0.1.0.ocpkg
188
+ ```
189
+
190
+ Valide un paquet comme le fait OverCrow, puis le montre tel qu’un relecteur
191
+ le voit : l’ID, la version et les noms ; la taille et le SHA-256 de
192
+ l’archive ; la version du SDK que contient son `logic.js` ; chaque
193
+ permission en toutes lettres (routes réseau avec les contraintes de leurs
194
+ paramètres et la limite de réponse déclarée, stockage, presse-papiers,
195
+ événements de jeu) ; chaque capability avec son résumé, en précisant si
196
+ elle est sensible ou demande un compte ; le nombre de lignes du menu ; et
197
+ chaque fichier avec sa taille et son SHA-256. Quand OverCrow refuserait le
198
+ paquet, la commande le signale à la place, avec la raison.
199
+
200
+ ## dev
201
+
202
+ ```sh
203
+ overcrow-widget dev
204
+ ```
205
+
206
+ Exécute le widget dans l’overlay OverCrow qui tourne sur votre machine,
207
+ pendant que vous le modifiez :
208
+
209
+ 1. la commande se connecte à l’overlay, qui doit avoir été lancé avec les
210
+ installations de développement autorisées ;
211
+ 2. elle construit le paquet comme le fait `package` et l’envoie à l’overlay,
212
+ qui le valide entièrement et l’affiche avec la mention
213
+ **Unverified · development package**, les permissions de son manifeste
214
+ étant accordées pour la session seulement ;
215
+ 3. elle surveille les fichiers du projet et, 200 ms après la dernière
216
+ modification, reconstruit et recharge le widget. Une construction en
217
+ erreur n’est pas envoyée : le widget continue de s’exécuter avec sa
218
+ dernière construction valide ;
219
+ 4. elle affiche ce que l’overlay rapporte : les états du widget (`starting`,
220
+ `running`, `restarting` avec l’échec, `failed`…) et les sorties `log.*`
221
+ de sa logique ;
222
+ 5. sur **Ctrl+C**, elle retire le widget de l’overlay.
223
+
224
+ Options : `--no-typecheck`, `--format json` (un objet JSON par ligne).
225
+ Codes de sortie : 0 après Ctrl+C, 1 quand l’overlay met fin à la session,
226
+ 2 quand aucun overlay n’est joignable.
227
+ [Le canal de développement](dev-channel.md) explique comment lancer OverCrow
228
+ pour cela, et ce que signifient chaque état et chaque refus.
229
+
230
+ ## test
231
+
232
+ ```sh
233
+ overcrow-widget test
234
+ overcrow-widget test --scenario example
235
+ overcrow-widget test --update
236
+ ```
237
+
238
+ Joue les scénarios de `tests/` dans le runtime headless d’OverCrow et
239
+ compare les images qu’il rend avec les références :
240
+
241
+ 1. la commande construit le paquet comme le fait `package` ;
242
+ 2. elle lit chaque `tests/<name>.scenario.json` et le vérifie par rapport au
243
+ manifeste avant toute exécution ; une erreur dans un scénario donne un
244
+ diagnostic `test.scenario` dans son fichier ;
245
+ 3. elle exécute chaque scénario dans le [runtime headless](testing.md#le-runtime-headless)
246
+ que l’outil épingle, ou celui donné par `--runtime`, et affiche la
247
+ version et le SHA-256 de ce runtime. La première fois, elle télécharge
248
+ le runtime épinglé ;
249
+ 4. elle compare chaque image capturée avec
250
+ `tests/reference/<name>/<image>.png`. Une différence, un changement de
251
+ taille ou une référence manquante fait échouer le scénario et écrit
252
+ `tests/output/<name>/<image>.actual.png` et, pour une différence,
253
+ `<image>.diff.png`.
254
+
255
+ Options : `--runtime <path>` (un autre programme `overcrow-widget-headless`),
256
+ `--offline` (ne jamais télécharger le runtime), `--scenario <name>` (ce scénario seulement), `--update` (enregistre les
257
+ images capturées comme références : examinez-les avant de les commiter),
258
+ `--format json`, `--no-typecheck`.
259
+
260
+ Codes de sortie : 0 quand tous les scénarios ont réussi, 1 quand l’un d’eux
261
+ a échoué, 2 quand aucun runtime ne peut s’exécuter. Les scénarios sont
262
+ décrits dans [tester un widget](testing.md).
263
+
264
+ ## doctor
265
+
266
+ ```sh
267
+ overcrow-widget doctor
268
+ ```
269
+
270
+ | Ligne | Ce qui est vérifié |
271
+ | --- | --- |
272
+ | `cli`, `sdk` | La version de l’outil, son API de widgets et le `@overcrow/sdk` qu’il embarque. |
273
+ | `platform` | Le système d’exploitation et l’architecture. |
274
+ | `overcrow` | Un OverCrow installé. |
275
+ | `development` | Un overlay en cours d’exécution qui autorise les installations de développement, et sa version. |
276
+ | `node`, `typescript`, `project sdk` | Dans un projet de widget : Node.js dans le `PATH`, `node_modules/typescript` et la version de `node_modules/@overcrow/sdk`. |
277
+
278
+ | Code | Sévérité | Signification |
279
+ | --- | --- | --- |
280
+ | `doctor.overcrow_missing` | avertissement | OverCrow n’est pas installé. |
281
+ | `doctor.development_off` | avertissement | Aucun overlay n’autorise les installations de développement ; l’aide donne les commandes pour relancer OverCrow en les autorisant. |
282
+ | `doctor.channel_busy` | avertissement | L’overlay sert déjà son nombre maximal de sessions `dev`. |
283
+ | `doctor.channel_io` | avertissement | La connexion à l’overlay a échoué. |
284
+ | `doctor.channel_untrusted` | erreur | Ce qui répond n’est pas l’overlay de cet utilisateur. |
285
+ | `doctor.protocol_version` | erreur | L’overlay et l’outil ne parlent pas la même version du canal de développement. |
286
+ | `doctor.node_missing`, `doctor.node_version` | avertissement | Pas de Node.js, ou une version antérieure à la 22 : `check` ne peut pas vérifier les types. |
287
+ | `doctor.typescript_missing`, `doctor.sdk_missing` | avertissement | TypeScript ou les types du SDK ne sont pas installés dans le projet. |
288
+ | `doctor.sdk_version` | avertissement | `node_modules/@overcrow/sdk` diffère du SDK de l’outil. |
289
+
290
+ Options : `--format json`, `--deny-warnings`.
291
+
292
+ ## admit
293
+
294
+ ```sh
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
298
+ ```
299
+
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` :
305
+
306
+ 1. les sources sont construites comme `package` les construit ;
307
+ 2. avec `--package`, la vue compilée de cette archive doit être, à l’octet
308
+ près, ce que donne la compilation de `view.ocml` ;
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 ;
316
+ 4. les pouvoirs que le widget demande sont listés pour le relecteur :
317
+ capabilities (les sensibles sont signalées), routes réseau avec leur
318
+ limite de réponse, écritures dans le presse-papiers, stockage et
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.
325
+
326
+ | Code | Sévérité | Signification |
327
+ | --- | --- | --- |
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`). |
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. |
338
+ | `admission.package_rebuilt` | avertissement | L’archive soumise diffère de la reconstruction dans d’autres fichiers. |
339
+ | `admission.not_rebuilt` | avertissement | Une archive a été admise sans ses sources. |
340
+
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.
670
+
671
+ ## Diagnostics
672
+
673
+ Chaque problème est un diagnostic, avec un code stable, une position et,
674
+ quand il y en a une, une suggestion :
675
+
676
+ ```text
677
+ error[view.unknown_attribute]: `clas` is not an attribute of <text>
678
+ --> view.ocml:4:9
679
+ |
680
+ 4 | <text clas="value">{state.count}</text>
681
+ | ^
682
+ = help: did you mean `class`?
683
+ check: 1 error(s), 0 warning(s)
684
+ ```
685
+
686
+ Le code a la forme `<domain>.<category>` :
687
+
688
+ | Domaine | Origine | Codes |
689
+ | --- | --- | --- |
690
+ | `project` | Les fichiers du projet | `missing_file`, `file_size`, `encoding`, `ambiguous_logic`, `asset_path`, `entry_limit`, `read` |
691
+ | `manifest` | `manifest.json` | voir [le manifeste](manifest.md#comment-le-manifeste-est-vérifié) |
692
+ | `view` | `view.ocml` | voir [la vue](view.md#quand-la-vue-est-incorrecte) |
693
+ | `style` | `style.ocss` | voir [le style](style.md#quand-le-style-est-incorrect) |
694
+ | `locales` | `locales/*.json` | `missing_file`, `json`, `shape`, `key`, `value`, `keys`, `entry_limit`, `unknown_key` |
695
+ | `logic` | `logic.ts` | voir [la logique](logic.md#ce-que-la-logique-ne-peut-pas-utiliser) |
696
+ | `typecheck` | TypeScript | `tsc` (le message de TypeScript lui-même), `skipped`, `sdk_version`, `timeout` |
697
+ | `package` | Le paquet relu | `archive_size`, `file_size` et les catégories du lecteur de paquets d’OverCrow |
698
+ | `test` | Les scénarios | `scenario`, `scenario_name`, `too_many_scenarios` |
699
+ | `sources` | Une archive de sources | voir [archives de sources](#archives-de-sources) |
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` |
702
+
703
+ - Les lignes et les colonnes commencent à 1 ; une colonne compte des
704
+ caractères, pas des octets.
705
+ - Un nom inconnu est accompagné du nom existant le plus proche.
706
+ - Avec `--format json`, chaque diagnostic est un objet JSON sur une ligne de
707
+ la sortie standard :
708
+ `{"severity","code","file","line","column","message","help"}`, avec
709
+ `null` pour ce qui est inconnu. `package --format json` se termine par un
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)).
713
+ - Les textes qui viennent d’un widget (ses journaux, ses noms) sont affichés
714
+ avec les caractères de contrôle du terminal neutralisés.
715
+
716
+ Dans vos scripts, appuyez-vous sur les codes : les messages et les textes
717
+ d’aide peuvent être reformulés.
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
+
792
+ ## Codes de sortie
793
+
794
+ | Code | Signification |
795
+ | --- | --- |
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.