@overcrow/mcp 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -2
  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 +353 -0
  15. package/dist/content/docs/en/dev-channel.md +130 -0
  16. package/dist/content/docs/en/elements.md +469 -0
  17. package/dist/content/docs/en/forms.md +328 -0
  18. package/dist/content/docs/en/guide.md +253 -0
  19. package/dist/content/docs/en/index.md +85 -0
  20. package/dist/content/docs/en/limits.md +241 -0
  21. package/dist/content/docs/en/logic.md +446 -0
  22. package/dist/content/docs/en/manifest.md +381 -0
  23. package/dist/content/docs/en/mcp.md +165 -0
  24. package/dist/content/docs/en/package.md +131 -0
  25. package/dist/content/docs/en/publishing.md +162 -0
  26. package/dist/content/docs/en/reference.md +55 -0
  27. package/dist/content/docs/en/result-shapes.md +332 -0
  28. package/dist/content/docs/en/sdk.md +295 -0
  29. package/dist/content/docs/en/security.md +115 -0
  30. package/dist/content/docs/en/service-reference.md +344 -0
  31. package/dist/content/docs/en/services.md +517 -0
  32. package/dist/content/docs/en/style-properties.md +270 -0
  33. package/dist/content/docs/en/style.md +266 -0
  34. package/dist/content/docs/en/testing.md +400 -0
  35. package/dist/content/docs/en/view.md +338 -0
  36. package/dist/content/docs/en/widgets.md +76 -0
  37. package/dist/content/docs/fr/cli.md +367 -0
  38. package/dist/content/docs/fr/dev-channel.md +140 -0
  39. package/dist/content/docs/fr/elements.md +475 -0
  40. package/dist/content/docs/fr/forms.md +341 -0
  41. package/dist/content/docs/fr/guide.md +264 -0
  42. package/dist/content/docs/fr/index.md +90 -0
  43. package/dist/content/docs/fr/limits.md +244 -0
  44. package/dist/content/docs/fr/logic.md +461 -0
  45. package/dist/content/docs/fr/manifest.md +392 -0
  46. package/dist/content/docs/fr/mcp.md +173 -0
  47. package/dist/content/docs/fr/package.md +139 -0
  48. package/dist/content/docs/fr/publishing.md +172 -0
  49. package/dist/content/docs/fr/reference.md +59 -0
  50. package/dist/content/docs/fr/result-shapes.md +333 -0
  51. package/dist/content/docs/fr/sdk.md +301 -0
  52. package/dist/content/docs/fr/security.md +129 -0
  53. package/dist/content/docs/fr/service-reference.md +346 -0
  54. package/dist/content/docs/fr/services.md +540 -0
  55. package/dist/content/docs/fr/style-properties.md +272 -0
  56. package/dist/content/docs/fr/style.md +281 -0
  57. package/dist/content/docs/fr/testing.md +417 -0
  58. package/dist/content/docs/fr/view.md +352 -0
  59. package/dist/content/docs/fr/widgets.md +81 -0
  60. package/dist/content/examples/clock/LICENSE +21 -0
  61. package/dist/content/examples/clock/README.md +75 -0
  62. package/dist/content/examples/clock/listing.json +19 -0
  63. package/dist/content/examples/clock/locales/en.json +4 -0
  64. package/dist/content/examples/clock/locales/fr.json +4 -0
  65. package/dist/content/examples/clock/logic.ts +85 -0
  66. package/dist/content/examples/clock/manifest.json +44 -0
  67. package/dist/content/examples/clock/package.json +16 -0
  68. package/dist/content/examples/clock/style.ocss +26 -0
  69. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  70. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  71. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  72. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  73. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  74. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  75. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  76. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  77. package/dist/content/examples/clock/tsconfig.json +16 -0
  78. package/dist/content/examples/clock/view.ocml +8 -0
  79. package/dist/content/examples/countdown/LICENSE +20 -0
  80. package/dist/content/examples/countdown/listing.json +10 -0
  81. package/dist/content/examples/countdown/locales/en.json +15 -0
  82. package/dist/content/examples/countdown/locales/fr.json +15 -0
  83. package/dist/content/examples/countdown/logic.ts +179 -0
  84. package/dist/content/examples/countdown/manifest.json +34 -0
  85. package/dist/content/examples/countdown/package.json +15 -0
  86. package/dist/content/examples/countdown/style.ocss +94 -0
  87. package/dist/content/examples/countdown/tsconfig.json +16 -0
  88. package/dist/content/examples/countdown/view.ocml +42 -0
  89. package/dist/content/examples/fps/LICENSE +21 -0
  90. package/dist/content/examples/fps/README.md +64 -0
  91. package/dist/content/examples/fps/listing.json +19 -0
  92. package/dist/content/examples/fps/locales/en.json +11 -0
  93. package/dist/content/examples/fps/locales/fr.json +11 -0
  94. package/dist/content/examples/fps/logic.ts +64 -0
  95. package/dist/content/examples/fps/manifest.json +30 -0
  96. package/dist/content/examples/fps/package.json +16 -0
  97. package/dist/content/examples/fps/style.ocss +31 -0
  98. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  99. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  100. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  101. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  102. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  103. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  104. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  105. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  106. package/dist/content/examples/fps/tsconfig.json +16 -0
  107. package/dist/content/examples/fps/view.ocml +11 -0
  108. package/dist/content/examples/media/LICENSE +21 -0
  109. package/dist/content/examples/media/README.md +147 -0
  110. package/dist/content/examples/media/listing.json +19 -0
  111. package/dist/content/examples/media/locales/en.json +11 -0
  112. package/dist/content/examples/media/locales/fr.json +11 -0
  113. package/dist/content/examples/media/logic.ts +191 -0
  114. package/dist/content/examples/media/manifest.json +35 -0
  115. package/dist/content/examples/media/package.json +16 -0
  116. package/dist/content/examples/media/style.ocss +148 -0
  117. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  118. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  119. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  120. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  121. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  122. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  123. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  124. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  125. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  126. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  127. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  128. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  129. package/dist/content/examples/media/tsconfig.json +16 -0
  130. package/dist/content/examples/media/view.ocml +41 -0
  131. package/dist/content/examples/notes/LICENSE +21 -0
  132. package/dist/content/examples/notes/README.md +219 -0
  133. package/dist/content/examples/notes/listing.json +19 -0
  134. package/dist/content/examples/notes/locales/en.json +25 -0
  135. package/dist/content/examples/notes/locales/fr.json +25 -0
  136. package/dist/content/examples/notes/logic.ts +799 -0
  137. package/dist/content/examples/notes/manifest.json +40 -0
  138. package/dist/content/examples/notes/package.json +16 -0
  139. package/dist/content/examples/notes/style.ocss +469 -0
  140. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  141. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  142. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  143. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  144. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  145. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  146. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  147. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  148. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  149. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  150. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  151. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  152. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  153. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  154. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  155. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  156. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  157. package/dist/content/examples/notes/tsconfig.json +16 -0
  158. package/dist/content/examples/notes/view.ocml +154 -0
  159. package/dist/content/examples/performance/LICENSE +21 -0
  160. package/dist/content/examples/performance/README.md +134 -0
  161. package/dist/content/examples/performance/listing.json +19 -0
  162. package/dist/content/examples/performance/locales/en.json +20 -0
  163. package/dist/content/examples/performance/locales/fr.json +20 -0
  164. package/dist/content/examples/performance/logic.ts +210 -0
  165. package/dist/content/examples/performance/manifest.json +83 -0
  166. package/dist/content/examples/performance/package.json +16 -0
  167. package/dist/content/examples/performance/style.ocss +75 -0
  168. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  169. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  170. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  171. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  172. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  173. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  174. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  175. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  176. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  177. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  178. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  179. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  180. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  181. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  182. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  183. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  184. package/dist/content/examples/performance/tsconfig.json +16 -0
  185. package/dist/content/examples/performance/view.ocml +18 -0
  186. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  187. package/dist/content/examples/playervox-journal/README.md +150 -0
  188. package/dist/content/examples/playervox-journal/listing.json +19 -0
  189. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  190. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  191. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  192. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  193. package/dist/content/examples/playervox-journal/package.json +16 -0
  194. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  195. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  196. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  197. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  198. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  199. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  200. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  201. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  202. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  203. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  204. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  205. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  206. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  207. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  208. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  209. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  210. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  211. package/dist/content/examples/playervox-rating/README.md +166 -0
  212. package/dist/content/examples/playervox-rating/listing.json +19 -0
  213. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  214. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  215. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  216. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  217. package/dist/content/examples/playervox-rating/package.json +16 -0
  218. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  219. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  220. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  221. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  222. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  223. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  224. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  225. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  226. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  227. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  228. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  229. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  230. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  231. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  232. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  233. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  234. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  235. package/dist/content/examples/playervox-reviews/README.md +194 -0
  236. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  237. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  238. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  239. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  240. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  241. package/dist/content/examples/playervox-reviews/package.json +16 -0
  242. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  243. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  244. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  245. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  246. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  247. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  248. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  249. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  250. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  251. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  252. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  253. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  254. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  255. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  256. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  257. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  258. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  259. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  260. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  261. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  262. package/dist/content/examples/playervox-score/LICENSE +21 -0
  263. package/dist/content/examples/playervox-score/README.md +131 -0
  264. package/dist/content/examples/playervox-score/listing.json +19 -0
  265. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  266. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  267. package/dist/content/examples/playervox-score/logic.ts +430 -0
  268. package/dist/content/examples/playervox-score/manifest.json +47 -0
  269. package/dist/content/examples/playervox-score/package.json +16 -0
  270. package/dist/content/examples/playervox-score/style.ocss +247 -0
  271. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  272. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  273. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  274. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  275. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  276. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  277. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  278. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  279. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  280. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  281. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-score/view.ocml +51 -0
  283. package/dist/content/examples/session/LICENSE +21 -0
  284. package/dist/content/examples/session/README.md +57 -0
  285. package/dist/content/examples/session/listing.json +19 -0
  286. package/dist/content/examples/session/locales/en.json +3 -0
  287. package/dist/content/examples/session/locales/fr.json +3 -0
  288. package/dist/content/examples/session/logic.ts +26 -0
  289. package/dist/content/examples/session/manifest.json +19 -0
  290. package/dist/content/examples/session/package.json +16 -0
  291. package/dist/content/examples/session/style.ocss +16 -0
  292. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  293. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  294. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  295. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  296. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  297. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  298. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  299. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  300. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  301. package/dist/content/examples/session/tsconfig.json +16 -0
  302. package/dist/content/examples/session/view.ocml +11 -0
  303. package/dist/content/examples/stopwatch/LICENSE +21 -0
  304. package/dist/content/examples/stopwatch/README.md +99 -0
  305. package/dist/content/examples/stopwatch/listing.json +19 -0
  306. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  307. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  308. package/dist/content/examples/stopwatch/logic.ts +93 -0
  309. package/dist/content/examples/stopwatch/manifest.json +19 -0
  310. package/dist/content/examples/stopwatch/package.json +16 -0
  311. package/dist/content/examples/stopwatch/style.ocss +54 -0
  312. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  313. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  314. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  315. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  316. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  318. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  319. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  320. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  321. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  322. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  323. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  324. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  325. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  326. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  327. package/dist/content/examples/stopwatch/view.ocml +29 -0
  328. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  329. package/dist/content/examples/twitch-chat/README.md +283 -0
  330. package/dist/content/examples/twitch-chat/listing.json +19 -0
  331. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  332. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  333. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  334. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  335. package/dist/content/examples/twitch-chat/package.json +16 -0
  336. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  337. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  338. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  339. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  340. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  341. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  342. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  343. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  344. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  345. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  346. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  347. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  348. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  349. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  350. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  351. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  352. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  353. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  354. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  355. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  356. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  357. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  358. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  359. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  360. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  361. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  362. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  363. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  364. package/dist/content/examples/warframe-market/LICENSE +21 -0
  365. package/dist/content/examples/warframe-market/README.md +176 -0
  366. package/dist/content/examples/warframe-market/listing.json +19 -0
  367. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  368. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  369. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  370. package/dist/content/examples/warframe-market/manifest.json +92 -0
  371. package/dist/content/examples/warframe-market/package.json +16 -0
  372. package/dist/content/examples/warframe-market/style.ocss +422 -0
  373. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  374. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  375. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  376. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  377. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  378. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  379. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  380. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  381. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  382. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  383. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  384. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  385. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  386. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  387. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  388. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  389. package/dist/content/examples/warframe-market/view.ocml +116 -0
  390. package/dist/content/examples/weather/LICENSE +20 -0
  391. package/dist/content/examples/weather/listing.json +10 -0
  392. package/dist/content/examples/weather/locales/en.json +9 -0
  393. package/dist/content/examples/weather/locales/fr.json +9 -0
  394. package/dist/content/examples/weather/logic.ts +62 -0
  395. package/dist/content/examples/weather/manifest.json +51 -0
  396. package/dist/content/examples/weather/package.json +15 -0
  397. package/dist/content/examples/weather/style.ocss +29 -0
  398. package/dist/content/examples/weather/tsconfig.json +16 -0
  399. package/dist/content/examples/weather/view.ocml +12 -0
  400. package/dist/content/index.json +3601 -0
  401. package/dist/content/reference/errors.json +1712 -0
  402. package/dist/content/reference/limits.json +1154 -0
  403. package/dist/content/reference/manifest.md +223 -0
  404. package/dist/content/reference/permissions.json +413 -0
  405. package/dist/content/templates/blank/locales/en.json +3 -0
  406. package/dist/content/templates/blank/locales/fr.json +3 -0
  407. package/dist/content/templates/blank/logic.ts +7 -0
  408. package/dist/content/templates/blank/manifest.json +16 -0
  409. package/dist/content/templates/blank/style.ocss +10 -0
  410. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  411. package/dist/content/templates/blank/view.ocml +6 -0
  412. package/dist/content/templates/chart/locales/en.json +3 -0
  413. package/dist/content/templates/chart/locales/fr.json +3 -0
  414. package/dist/content/templates/chart/logic.ts +27 -0
  415. package/dist/content/templates/chart/manifest.json +16 -0
  416. package/dist/content/templates/chart/style.ocss +27 -0
  417. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  418. package/dist/content/templates/chart/view.ocml +10 -0
  419. package/dist/content/templates/counter/locales/en.json +4 -0
  420. package/dist/content/templates/counter/locales/fr.json +4 -0
  421. package/dist/content/templates/counter/logic.ts +20 -0
  422. package/dist/content/templates/counter/manifest.json +16 -0
  423. package/dist/content/templates/counter/style.ocss +26 -0
  424. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  425. package/dist/content/templates/counter/view.ocml +13 -0
  426. package/dist/content/templates/list/locales/en.json +8 -0
  427. package/dist/content/templates/list/locales/fr.json +8 -0
  428. package/dist/content/templates/list/logic.ts +35 -0
  429. package/dist/content/templates/list/manifest.json +16 -0
  430. package/dist/content/templates/list/style.ocss +42 -0
  431. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  432. package/dist/content/templates/list/view.ocml +17 -0
  433. package/dist/content/templates/shared/LICENSE +20 -0
  434. package/dist/content/templates/shared/package.json +14 -0
  435. package/dist/content/templates/shared/tsconfig.json +16 -0
  436. package/dist/content.js +68 -0
  437. package/dist/env.js +156 -0
  438. package/dist/fingerprint.js +32 -0
  439. package/dist/ids.js +27 -0
  440. package/dist/index.js +82 -0
  441. package/dist/knowledge.js +222 -0
  442. package/dist/npm.js +149 -0
  443. package/dist/prompts.js +47 -0
  444. package/dist/resources.js +82 -0
  445. package/dist/run.js +120 -0
  446. package/dist/server.js +43 -0
  447. package/dist/session.js +205 -0
  448. package/dist/sources.js +218 -0
  449. package/dist/text.js +80 -0
  450. package/dist/texts.js +44 -0
  451. package/dist/tools/audit.js +105 -0
  452. package/dist/tools/build.js +453 -0
  453. package/dist/tools/common.js +122 -0
  454. package/dist/tools/docs.js +196 -0
  455. package/dist/tools/preview.js +87 -0
  456. package/dist/tools/project.js +178 -0
  457. package/dist/tools/setup.js +146 -0
  458. package/dist/tools/submission.js +369 -0
  459. package/dist/version.js +3 -0
  460. package/npm-shrinkwrap.json +402 -0
  461. package/package.json +52 -4
@@ -0,0 +1,192 @@
1
+ {
2
+ "scenarioVersion": 1,
3
+ "name": "unavailable",
4
+ "description": "OverCrow ends the subscription when its reviews source fails: the widget says so, keeps nothing of the page it showed, and subscribes again five seconds later; hidden, it waits until it shows again.",
5
+ "fixtures": {
6
+ "calls": {
7
+ "playervox.reviews.page": [
8
+ {
9
+ "value": {
10
+ "gameName": "Portal 2",
11
+ "items": [
12
+ {
13
+ "id": "r31",
14
+ "author": "Mira_Quill",
15
+ "grade": "S+",
16
+ "score": 94,
17
+ "text": "The co-op campaign is the best puzzle design I have played in years. Every chamber teaches one idea, then twists it twice before letting you go, and the writing never gets in the way of the thinking. My only complaint is the loading between chambers.",
18
+ "original": null,
19
+ "hidden": false,
20
+ "publishedAt": 1789900200000,
21
+ "offsetMinutes": 120
22
+ },
23
+ {
24
+ "id": "r30",
25
+ "author": "Kestrel42",
26
+ "grade": "A",
27
+ "score": 74,
28
+ "text": "Solid puzzles, short story.",
29
+ "original": null,
30
+ "hidden": false,
31
+ "publishedAt": 1789813800000,
32
+ "offsetMinutes": 120
33
+ },
34
+ {
35
+ "id": "r29",
36
+ "author": "Tavish",
37
+ "grade": "D",
38
+ "score": 38,
39
+ "text": "Runs badly on my laptop.\nCrashed twice in chapter 3.",
40
+ "original": null,
41
+ "hidden": false,
42
+ "publishedAt": 1789381800000,
43
+ "offsetMinutes": 120
44
+ }
45
+ ],
46
+ "page": 1,
47
+ "totalPages": 3,
48
+ "count": 7
49
+ }
50
+ }
51
+ ]
52
+ }
53
+ },
54
+ "steps": [
55
+ {
56
+ "expect": {
57
+ "text": [
58
+ "Loading…"
59
+ ],
60
+ "calls": [
61
+ {
62
+ "service": "playervox.reviews.subscribe"
63
+ }
64
+ ]
65
+ }
66
+ },
67
+ {
68
+ "publish": {
69
+ "service": "playervox.reviews.subscribe",
70
+ "error": "unavailable"
71
+ }
72
+ },
73
+ {
74
+ "expect": {
75
+ "text": [
76
+ "The reviews are unavailable. Retrying automatically."
77
+ ],
78
+ "noText": [
79
+ "Loading…"
80
+ ],
81
+ "image": "source-failed",
82
+ "calls": []
83
+ }
84
+ },
85
+ {
86
+ "advance": {
87
+ "ms": 4900
88
+ }
89
+ },
90
+ {
91
+ "expect": {
92
+ "text": [
93
+ "The reviews are unavailable. Retrying automatically."
94
+ ],
95
+ "calls": []
96
+ }
97
+ },
98
+ {
99
+ "advance": {
100
+ "ms": 100
101
+ }
102
+ },
103
+ {
104
+ "expect": {
105
+ "calls": [
106
+ {
107
+ "service": "playervox.reviews.subscribe"
108
+ }
109
+ ]
110
+ }
111
+ },
112
+ {
113
+ "publish": {
114
+ "service": "playervox.reviews.subscribe",
115
+ "value": {
116
+ "state": "ready",
117
+ "revision": 1,
118
+ "offline": false
119
+ }
120
+ }
121
+ },
122
+ {
123
+ "expect": {
124
+ "text": [
125
+ "7 reviews",
126
+ "Mira_Quill"
127
+ ],
128
+ "noText": [
129
+ "The reviews are unavailable. Retrying automatically."
130
+ ],
131
+ "image": "recovered",
132
+ "calls": [
133
+ {
134
+ "service": "playervox.reviews.page",
135
+ "params": {
136
+ "page": 1,
137
+ "followedOnly": false
138
+ },
139
+ "outcome": "ok"
140
+ }
141
+ ]
142
+ }
143
+ },
144
+ {
145
+ "publish": {
146
+ "service": "playervox.reviews.subscribe",
147
+ "error": "unavailable"
148
+ }
149
+ },
150
+ {
151
+ "expect": {
152
+ "text": [
153
+ "The reviews are unavailable. Retrying automatically."
154
+ ],
155
+ "noText": [
156
+ "7 reviews",
157
+ "Mira_Quill",
158
+ "Portal 2"
159
+ ]
160
+ }
161
+ },
162
+ {
163
+ "host": {
164
+ "visible": false
165
+ }
166
+ },
167
+ {
168
+ "advance": {
169
+ "ms": 60000
170
+ }
171
+ },
172
+ {
173
+ "expect": {
174
+ "calls": []
175
+ }
176
+ },
177
+ {
178
+ "host": {
179
+ "visible": true
180
+ }
181
+ },
182
+ {
183
+ "expect": {
184
+ "calls": [
185
+ {
186
+ "service": "playervox.reviews.subscribe"
187
+ }
188
+ ]
189
+ }
190
+ }
191
+ ]
192
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2023",
4
+ "lib": ["ES2023"],
5
+ "types": [],
6
+ "module": "ES2022",
7
+ "moduleResolution": "bundler",
8
+ "strict": true,
9
+ "noEmit": true,
10
+ "isolatedModules": true,
11
+ "verbatimModuleSyntax": true,
12
+ "noUncheckedIndexedAccess": true,
13
+ "exactOptionalPropertyTypes": true
14
+ },
15
+ "include": ["logic.ts"]
16
+ }
@@ -0,0 +1,110 @@
1
+ <!-- Player reviews: three PlayerVox reviews of the active game per page,
2
+ each with its player's grade badge, name, date, score and text, and
3
+ the paging footer (parity sheet: playervox-overcrow
4
+ docs/builtin-parity/playervox-circle.md). The buttons show in
5
+ Interactive mode. A page holds at most three reviews, so each has its
6
+ own badge canvas, passed to the card through its slot. -->
7
+ <component name="review-card" props="row">
8
+ <separator class="rule"/>
9
+ <box class="review" label={row.label}>
10
+ <box class="head">
11
+ <slot/>
12
+ <box class="who">
13
+ <text class="author" tooltip={row.authorTip}>{row.author}</text>
14
+ <text class="date">{row.date}</text>
15
+ </box>
16
+ <text class="score">{row.score}</text>
17
+ </box>
18
+ <if test={row.masked}>
19
+ <text class="note">{t("hidden")}</text>
20
+ <if test={state.interactive}>
21
+ <box class="actions">
22
+ <button class="link" on:activate={reveal(row.id)}>
23
+ <text class="link-text">{t("reveal")}</text>
24
+ </button>
25
+ </box>
26
+ </if>
27
+ </if>
28
+ <else-if test={row.text != ""}>
29
+ <text class={row.textClass}>{row.text}</text>
30
+ <if test={row.actions}>
31
+ <box class="actions">
32
+ <if test={row.fold != ""}>
33
+ <button class="link" on:activate={toggleFold(row.id)}>
34
+ <text class="link-text">{row.fold}</text>
35
+ </button>
36
+ </if>
37
+ <if test={row.translated}>
38
+ <text class="note">{t("translated")}</text>
39
+ </if>
40
+ <if test={row.language != ""}>
41
+ <button class="link" on:activate={toggleLanguage(row.id)}>
42
+ <text class="link-text">{row.language}</text>
43
+ </button>
44
+ </if>
45
+ </box>
46
+ </if>
47
+ <else-if test={row.translated}>
48
+ <text class="note">{t("translated")}</text>
49
+ </else-if>
50
+ </else-if>
51
+ </box>
52
+ </component>
53
+
54
+ <box class={state.offline ? "reviews offline" : "reviews"} label={t("label")}>
55
+ <box class="header">
56
+ <text class="title">{t("label")}</text>
57
+ <canvas ref="mark" class="mark" label={t("mark")}/>
58
+ </box>
59
+ <if test={gameName(state.page) != ""}>
60
+ <text class="game" tooltip={cutBytes(gameName(state.page), 256)}>{gameName(state.page)}</text>
61
+ </if>
62
+ <if test={message(state.problem) != ""}>
63
+ <text class="message">{message(state.problem)}</text>
64
+ </if>
65
+ <if test={state.phase == "loading"}>
66
+ <text class="status">{state.offline ? t("offline") : t("loading")}</text>
67
+ </if>
68
+ <if test={state.phase == "idle"}>
69
+ <text class="status">{t("waiting")}</text>
70
+ </if>
71
+ <if test={state.phase == "unsupported"}>
72
+ <text class="status">{t("unsupported")}</text>
73
+ </if>
74
+ <if test={state.phase == "ready"}>
75
+ <if test={!has(state.page, 0)}>
76
+ <text class="status">{emptyText(state.followedOnly)}</text>
77
+ </if>
78
+ <else>
79
+ <scroll class="list">
80
+ <review-card row={row(state.page, state.reading, state.interactive, 0)}>
81
+ <canvas ref="badge-0" class="grade" label={row(state.page, state.reading, state.interactive, 0).badge}/>
82
+ </review-card>
83
+ <if test={has(state.page, 1)}>
84
+ <review-card row={row(state.page, state.reading, state.interactive, 1)}>
85
+ <canvas ref="badge-1" class="grade" label={row(state.page, state.reading, state.interactive, 1).badge}/>
86
+ </review-card>
87
+ </if>
88
+ <if test={has(state.page, 2)}>
89
+ <review-card row={row(state.page, state.reading, state.interactive, 2)}>
90
+ <canvas ref="badge-2" class="grade" label={row(state.page, state.reading, state.interactive, 2).badge}/>
91
+ </review-card>
92
+ </if>
93
+ </scroll>
94
+ <box class="footer">
95
+ <text class="count">{countText(state.page)}</text>
96
+ <if test={state.interactive}>
97
+ <button class="control" label={t("previous")} tooltip={t("previous")} disabled={!canTurn(state.page, "previous", state.busy, state.offline)} on:activate={turn("previous")}>
98
+ <icon name="chevron-left"/>
99
+ </button>
100
+ </if>
101
+ <text class="pager" label={pagerLabel(state.page)} tooltip={t("page")}>{pagerText(state.page)}</text>
102
+ <if test={state.interactive}>
103
+ <button class="control" label={t("next")} tooltip={t("next")} disabled={!canTurn(state.page, "next", state.busy, state.offline)} on:activate={turn("next")}>
104
+ <icon name="chevron-right"/>
105
+ </button>
106
+ </if>
107
+ </box>
108
+ </else>
109
+ </if>
110
+ </box>
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Valhallab SASU
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,131 @@
1
+ # PlayerVox score
2
+
3
+ `com.playervox.overcrow.playervox.score` — the public PlayerVox community
4
+ grade of the Steam game you play: a grade badge (S+ to F), the rounded
5
+ overall score out of 100, the game's name on PlayerVox, the rating count
6
+ and, if you want, the Gameplay, Art and Technology criteria. No PlayerVox
7
+ account is needed. A built-in of OverCrow, written against the public
8
+ `@overcrow/sdk` and packaged with `overcrow-widget` like any creator's
9
+ widget. MIT.
10
+
11
+ ## What it shows
12
+
13
+ | State | Shows |
14
+ | --- | --- |
15
+ | Rated | the badge, "94 /100", "1,284 ratings", the game's name |
16
+ | Not rated yet | a neutral `--` badge, "Not rated yet" / "Pas encore noté", "No ratings yet" / "Aucun vote", the game's name |
17
+ | Waiting for PlayerVox | a `--` badge and "Loading…" / "Chargement…": after a game switch, never the previous game's score |
18
+ | No game | "Waiting for a game" / "En attente du jeu" |
19
+ | A game without a Steam app ID | "Game not linked" / "Jeu non associé", "Steam game required" / "Jeu Steam requis" |
20
+ | A game PlayerVox does not know, or cannot tell apart | "Game not found" / "Jeu introuvable", "On PlayerVox" / "Sur PlayerVox" |
21
+ | PlayerVox unreachable, busy or failing | "Score unavailable" / "Note indisponible", "Retrying automatically" / "Nouvel essai automatique"; an earlier score is not kept |
22
+ | No permission | "Score unavailable": the widget asks OverCrow nothing |
23
+
24
+ Without a score the title reads "Community rating" / "Note communautaire".
25
+ A status's second line shows only with the rating count option on.
26
+
27
+ - **The badge.** A 56 px rounded square with a black face and a 3 px border
28
+ in the grade's colour, turned by 4° with its letter in the display face.
29
+ `--` is square, grey on a translucent face. S+ has a faint static glow.
30
+ The badge is drawn by the widget in a canvas, from the source it shares
31
+ with PlayerVox Rating ([widgets-shared](../../widgets-shared/README.md)).
32
+ - **Grades** come from OverCrow, on the raw score: S+ ≥ 90, S ≥ 80,
33
+ A ≥ 70, B ≥ 60, C ≥ 40, D ≥ 20, else F. 89.6 shows "90" with grade S.
34
+ Numbers round half away from zero (72.5 shows 73).
35
+
36
+ | Grade | S+ | S | A | B | C | D | F, `--` |
37
+ | --- | --- | --- | --- | --- | --- | --- | --- |
38
+ | Colour | `#9ae600` | `#7ccf00` | `#00d3f3` | `#fdc700` | `#fe9a00` | `#e7000b` | `#52525c` |
39
+
40
+ The same colours serve both themes: the badge keeps its black face on a
41
+ light panel.
42
+ - **The pulse.** When a score shows or changes (another grade or number),
43
+ the badge grows to 108 % and back once, in 600 ms. OverCrow animates it:
44
+ the widget sends one class change, nothing moves once it ends, and a
45
+ hidden widget draws nothing. A new rating count alone, a status or `--`
46
+ never pulses.
47
+ - **The count** uses your number format ("1,284 ratings", FR "1 284 votes"),
48
+ in the singular only for exactly one.
49
+ - **The criteria**, 220 px wide: the name, the rounded value or `--` when
50
+ PlayerVox has none (a real 0 shows "0"), and a 3 px bar in the colour of
51
+ that value's own grade.
52
+ - **The title** stays on one line, ending with an ellipsis. The PlayerVox
53
+ mark keeps the header's right corner, the title shown or not. Hovering
54
+ the widget shows the game's name, or the status.
55
+ - **Accessible names:** the badge "Grade S+, 94/100" / "Note S+, 94/100" or
56
+ "No grade" / "Pas de note"; each bar "Gameplay: 97".
57
+ - **Size.** Fitted to its content, 64 to 220 px of content wide (220 with
58
+ the criteria), within the host frame and its 10 × 8 px margin; the badge
59
+ alone is a 64 px square within the frame's 8 px margin.
60
+
61
+ ## Controls
62
+
63
+ None: no click, no key. In Interactive mode the host moves and resizes the
64
+ widget; hovering shows the tooltip.
65
+
66
+ ## Menu
67
+
68
+ | Row | Type | Default |
69
+ | --- | --- | --- |
70
+ | Show overall score / Afficher le score global | toggle `show-score` | on |
71
+ | Show three criteria / Afficher les trois critères | toggle `show-criteria` | off |
72
+ | Show game title / Afficher le nom du jeu | toggle `show-title` | on |
73
+ | Show rating count / Afficher le nombre de notes | toggle `show-votes` | on |
74
+
75
+ No row hides the badge. With every row off, the widget is the badge alone;
76
+ set the background opacity to 0 % for the look without a panel (OverCrow
77
+ does so when it moves an egui badge-only Score to this widget).
78
+
79
+ ## Permissions
80
+
81
+ - `playervox.score.read`: the public PlayerVox score of the active game.
82
+ Sensitive: the score and the game's name tell which game you play.
83
+
84
+ As a sensitive capability rules out the network and the clipboard, the
85
+ widget declares neither, and no storage: it keeps nothing. OverCrow fetches
86
+ the score (`api.playervox.com`, anonymously), refreshes it every five
87
+ minutes and on PlayerVox's live updates, and backs off after failures; it
88
+ does so only while this widget subscribes.
89
+
90
+ ## Tests
91
+
92
+ - `tests/logic.test.mjs`: the logic on `@overcrow/sdk/testing`: the badge's
93
+ commands per grade, one pulse per new score, rounding, the count's
94
+ plural and number format, every state's text, the tooltip's bound, the
95
+ criteria, the options and the retry.
96
+ - Scenarios, played in OverCrow's headless runtime
97
+ (`overcrow-widget test --runtime …`), with their reference images in
98
+ `tests/reference/`:
99
+
100
+ | Scenario | Covers |
101
+ | --- | --- |
102
+ | `states` | every state, dark English and light French, 100 % and 150 % |
103
+ | `grades` | the seven grades with the criteria, a real 0, missing criteria, rounding, light theme, 150 % in French |
104
+ | `options` | the badge alone (both themes, 150 %), each toggle, a long title, a large count, a single rating |
105
+ | `pulse` | the pulse's peak and end, none for the same score or a status |
106
+ | `unavailable` | the host's source failing, then the new subscription 5 s later |
107
+ | `refused` | no grant: no call, "Score unavailable" |
108
+ | `signed-out` | signed out of PlayerVox: the score, no account panel |
109
+
110
+ ## Cost
111
+
112
+ Measured on 2026-09-30 with OverCrow's release build, on an AMD Ryzen 7
113
+ 5800X3D Linux workstation and in a Windows 11 virtual machine (2 vCPU),
114
+ with a rated game and the default rows:
115
+
116
+ | | Linux | Windows (VM) |
117
+ | --- | --- | --- |
118
+ | Widget start, warm, into the overlay's runtime | 8.5 ms (p50), 12.4 ms at most | VM ready in 16–20 ms (p50) |
119
+ | VM memory | 0.73 MiB private, 0.91 MiB PSS | 1.08 MiB private working set, 1.36 MiB private commit |
120
+ | Private memory in all (VM, sandbox helpers, overlay share) | 6.5–8.6 MB | — |
121
+ | CPU, a score held | 0.03 % of one core, no frame | — |
122
+ | CPU, a new score and its pulse every 2 s | 0.23 % of one core: about 36 frames of 0.05 ms per pulse, then none | — |
123
+ | CPU, hidden, a new score every 2 s | 0.05–0.07 % of one core: no pulse frame | — |
124
+ | VM CPU | one short turn per score; none during the pulse | — |
125
+
126
+ Scores change only when PlayerVox publishes an update or at the five-minute
127
+ refresh: the 2 s load is a stress. The egui widget it replaces had no pulse
128
+ and painted in the overlay's own process (0.04 ms a frame); OverCrow fetched
129
+ the score whenever that widget was enabled, and now only while this widget
130
+ subscribes. Scenarios render the same images on Linux and Windows, pixel
131
+ for pixel.
@@ -0,0 +1,19 @@
1
+ {
2
+ "author": "PlayerVox",
3
+ "spdxLicense": "MIT",
4
+ "sourceUrl": "https://github.com/Valhallab/playervox-overcrow-releases/tree/main/widgets/playervox-score",
5
+ "preview": "assets/preview.png",
6
+ "defaultLocale": "en",
7
+ "localizations": [
8
+ {
9
+ "locale": "en",
10
+ "name": "PlayerVox score",
11
+ "description": "The PlayerVox community grade of your Steam game, with its score, rating count and three criteria. No account needed; the badge is always shown."
12
+ },
13
+ {
14
+ "locale": "fr",
15
+ "name": "Note PlayerVox",
16
+ "description": "La note de la communauté PlayerVox pour votre jeu Steam, avec son score, son nombre de votes et trois critères. Sans compte ; le badge reste toujours visible."
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "label": "PlayerVox score",
3
+ "community": "Community rating",
4
+ "mark": "PlayerVox",
5
+ "waiting": "Waiting for a game",
6
+ "unsupported": "Game not linked",
7
+ "steam-required": "Steam game required",
8
+ "loading": "Loading…",
9
+ "unrated": "Not rated yet",
10
+ "no-votes": "No ratings yet",
11
+ "not-found": "Game not found",
12
+ "on-playervox": "On PlayerVox",
13
+ "unavailable": "Score unavailable",
14
+ "retrying": "Retrying automatically",
15
+ "votes-one": "{count} rating",
16
+ "votes-other": "{count} ratings",
17
+ "gameplay": "Gameplay",
18
+ "art": "Art",
19
+ "tech": "Technology",
20
+ "grade": "Grade",
21
+ "no-grade": "No grade",
22
+ "criterion": "{name}: {value}"
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "label": "Note PlayerVox",
3
+ "community": "Note communautaire",
4
+ "mark": "PlayerVox",
5
+ "waiting": "En attente du jeu",
6
+ "unsupported": "Jeu non associé",
7
+ "steam-required": "Jeu Steam requis",
8
+ "loading": "Chargement…",
9
+ "unrated": "Pas encore noté",
10
+ "no-votes": "Aucun vote",
11
+ "not-found": "Jeu introuvable",
12
+ "on-playervox": "Sur PlayerVox",
13
+ "unavailable": "Note indisponible",
14
+ "retrying": "Nouvel essai automatique",
15
+ "votes-one": "{count} vote",
16
+ "votes-other": "{count} votes",
17
+ "gameplay": "Gameplay",
18
+ "art": "Artistique",
19
+ "tech": "Technique",
20
+ "grade": "Note",
21
+ "no-grade": "Pas de note",
22
+ "criterion": "{name} : {value}"
23
+ }