@overcrow/mcp 0.0.0 → 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 +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 +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 +50 -4
@@ -0,0 +1,381 @@
1
+ # The manifest
2
+
3
+ `manifest.json` tells PlayerVox OverCrow what a widget is before any of its
4
+ code runs: its identity and version, its names, the sizes it supports, the
5
+ permissions it asks for and the rows it adds to its options menu. You write
6
+ it by hand; it is packaged exactly as written.
7
+
8
+ The file is one strict JSON object. A byte-order mark, a duplicate key,
9
+ trailing data or an unknown field rejects it: there is no field that
10
+ OverCrow ignores.
11
+
12
+ ## A complete example
13
+
14
+ <!-- source: templates/counter/manifest.json -->
15
+ ```json
16
+ {
17
+ "schemaVersion": 1,
18
+ "apiVersion": 1,
19
+ "id": "{{id}}",
20
+ "version": "0.1.0",
21
+ "name": {
22
+ "en": "{{name}}",
23
+ "fr": "{{name}}"
24
+ },
25
+ "sizing": {
26
+ "fit": "none",
27
+ "preferred": { "width": 200, "height": 96 },
28
+ "min": { "width": 140, "height": 72 },
29
+ "max": { "width": 640, "height": 640 }
30
+ }
31
+ }
32
+ ```
33
+
34
+ `overcrow-widget init` writes this file; `{{id}}` and `{{name}}` are the
35
+ values it fills in. A manifest with permissions and a menu:
36
+
37
+ <!-- source: docs/content/examples/countdown/manifest.json -->
38
+ ```json
39
+ {
40
+ "schemaVersion": 1,
41
+ "apiVersion": 1,
42
+ "id": "com.example.countdown",
43
+ "version": "1.0.0",
44
+ "name": { "en": "Countdown", "fr": "Compte à rebours" },
45
+ "sizing": {
46
+ "fit": "none",
47
+ "preferred": { "width": 220, "height": 190 },
48
+ "min": { "width": 180, "height": 160 },
49
+ "max": { "width": 480, "height": 400 }
50
+ },
51
+ "permissions": {
52
+ "storage": true
53
+ },
54
+ "wrapper": {
55
+ "menu": [
56
+ {
57
+ "type": "toggle",
58
+ "id": "show-rounds",
59
+ "label": { "en": "Show finished rounds", "fr": "Afficher les tours terminés" },
60
+ "icon": "circle-check",
61
+ "default": true
62
+ },
63
+ {
64
+ "type": "action",
65
+ "id": "reset-rounds",
66
+ "label": { "en": "Reset the rounds", "fr": "Remettre les tours à zéro" },
67
+ "icon": "rotate-ccw",
68
+ "visibleWhen": "show-rounds"
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## Fields
76
+
77
+ <!-- generated:manifest-fields -->
78
+ | Field | Type | Required | Meaning |
79
+ | --- | --- | --- | --- |
80
+ | `schemaVersion` | integer 1 to 1 | yes | Manifest document version. |
81
+ | `apiVersion` | integer 1 to 1 | yes | Widget API version; selects this schema. |
82
+ | `id` | `widget ID` | yes | Reverse-DNS ID, from 3 bytes to 128 bytes: at least two dot-separated segments of `[a-z0-9-]`, each at most 63 bytes and not starting or ending with `-`. `com.playervox` and `com.playervox.*` are reserved for packages signed by PlayerVox. |
83
+ | `version` | `version` | yes | SemVer 2.0.0 `MAJOR.MINOR.PATCH[-PRERELEASE]` in canonical form, at most 64 bytes; build metadata is rejected. |
84
+ | `name` | `WidgetName` | yes | Localized widget name shown by the host. |
85
+ | `sizing` | `Sizing` | yes | Size and fit rules applied by the widget's frame. |
86
+ | `vm` | `VmRequest` | no | VM budget request; absent means the defaults. |
87
+ | `permissions` | `Permissions` | no | Requested permissions; absent means none. |
88
+ | `wrapper` | `wrapper` | no | Widget rows of the host options menu. |
89
+ | `requires` | `host features` | no | Distinct host data sources the widget cannot work without, as in a `wrapper.menu` row's `requires`. On a machine that lacks one, the host neither starts nor shows the widget and keeps its layout; the widget comes back when the source does. |
90
+ <!-- /generated:manifest-fields -->
91
+
92
+ ### Identity and version
93
+
94
+ - **`id`** is the widget's identity everywhere: in the catalog, in the
95
+ user's profile, in its storage. Choose a reverse-DNS ID under a domain you
96
+ control and keep it. IDs under `com.playervox` are reserved for widgets
97
+ published by PlayerVox.
98
+ - **`version`** is a semantic version. A published version never changes:
99
+ any change to a published widget is a new, higher version.
100
+ - **`schemaVersion`** and **`apiVersion`** are both `1`.
101
+
102
+ ### Names
103
+
104
+ `name` gives the name OverCrow shows in its widget list and menus, in
105
+ English and in French. Both are required.
106
+
107
+ <!-- generated:manifest-name -->
108
+ | Field | Type | Required | Meaning |
109
+ | --- | --- | --- | --- |
110
+ | `en` | `name text` | yes | English name. |
111
+ | `fr` | `name text` | yes | French name. |
112
+ <!-- /generated:manifest-name -->
113
+
114
+ ## Sizes
115
+
116
+ `sizing` says how large the widget is when the user adds it, how small and
117
+ how large the user may resize it, and whether OverCrow can fit its frame to
118
+ its content. Lengths are logical pixels at 100 % scale; the user's content
119
+ scale (50 % to 175 %) multiplies them.
120
+
121
+ <!-- generated:manifest-sizing -->
122
+ | Field | Type | Required | Meaning |
123
+ | --- | --- | --- | --- |
124
+ | `fit` | `none` \| `both` \| `height` | yes | Content fitting the widget supports: `both` axes, `height` only, or `none`. Manual resizing is always available. |
125
+ | `defaultMode` | `fit` \| `manual` | no | Mode of a newly placed widget; default `fit` when `fit` is not `none`, else `manual`. `fit` with `fit: none` is rejected. |
126
+ | `preferred` | `Dimensions` | yes | Initial size; within `min` and `max`. |
127
+ | `min` | `Dimensions` | yes | Smallest size. |
128
+ | `max` | `Dimensions` | yes | Largest size. |
129
+ <!-- /generated:manifest-sizing -->
130
+
131
+ Each of `preferred`, `min` and `max` is a pair of dimensions, with
132
+ `min` ≤ `preferred` ≤ `max` on both axes:
133
+
134
+ <!-- generated:manifest-dimensions -->
135
+ | Field | Type | Required | Meaning |
136
+ | --- | --- | --- | --- |
137
+ | `width` | integer 1 to 4096 | yes | Logical pixels. |
138
+ | `height` | integer 1 to 4096 | yes | Logical pixels. |
139
+ <!-- /generated:manifest-dimensions -->
140
+
141
+ With `fit: "both"`, OverCrow sizes the frame to what the view needs, in
142
+ both directions: the Clock grows when the user turns the seconds on. With
143
+ `fit: "height"`, the user chooses the width and the height follows the
144
+ content. With `fit: "none"`, the frame keeps the size the user gave it and
145
+ the view fills it. The user can always resize by hand.
146
+
147
+ <!-- source: widgets/clock/manifest.json -->
148
+ ```json
149
+ "sizing": {
150
+ "fit": "both",
151
+ "preferred": { "width": 110, "height": 60 },
152
+ "min": { "width": 40, "height": 24 },
153
+ "max": { "width": 480, "height": 240 }
154
+ },
155
+ ```
156
+
157
+ ## Permissions
158
+
159
+ A widget gets nothing it has not declared here, and a declaration grants
160
+ nothing by itself: the user consents first, in the Control Center.
161
+ [Services and permissions](services.md) explains each permission and what
162
+ it allows.
163
+
164
+ <!-- generated:manifest-permissions -->
165
+ | Field | Type | Required | Meaning |
166
+ | --- | --- | --- | --- |
167
+ | `network` | list of `NetworkRule` ≤ 32 | no | Distinct network rules. |
168
+ | `storage` | boolean | no | Host key-value storage; default `false`. |
169
+ | `clipboardWrite` | boolean | no | Clipboard text writes; default `false`. |
170
+ | `gameEvents` | list of `game event` ≤ 32 | no | Distinct `overcrow.game.<name>.v1` event names. |
171
+ | `capabilities` | `capability names` | no | Distinct capabilities of the schema. |
172
+ <!-- /generated:manifest-permissions -->
173
+
174
+ <!-- source: widgets/stopwatch/manifest.json -->
175
+ ```json
176
+ "permissions": {
177
+ "capabilities": ["stopwatch.read", "stopwatch.control"]
178
+ }
179
+ ```
180
+
181
+ A network rule is an object of its own; its fields are described with
182
+ [network rules](services.md#network-rules).
183
+
184
+ ## The options menu
185
+
186
+ Every widget has an options menu, opened from its frame. OverCrow puts its
187
+ own rows first: opacity, content size, fit to content and, when the widget
188
+ needs one, its account. Visibility in Passive mode is the eye in the
189
+ widget's toolbar, not a menu row. `wrapper.menu` adds yours below them:
190
+ toggles, sliders, choices, actions and groups, each with a label in both
191
+ languages.
192
+
193
+ The menu is as wide as its widest row, from 248 to 320 points. Beyond, a
194
+ label ends with "…" and shows whole in a tooltip; a choice shows its
195
+ current value on at most 120 points. Keep labels short, in both languages.
196
+
197
+ <!-- source: widgets/clock/manifest.json -->
198
+ ```json
199
+ "wrapper": {
200
+ "menu": [
201
+ {
202
+ "type": "toggle",
203
+ "id": "show-seconds",
204
+ "label": { "en": "Show seconds", "fr": "Afficher les secondes" },
205
+ "default": false
206
+ },
207
+ {
208
+ "type": "toggle",
209
+ "id": "show-date",
210
+ "label": { "en": "Show date", "fr": "Afficher la date" },
211
+ "default": true
212
+ },
213
+ {
214
+ "type": "choice",
215
+ "id": "date-format",
216
+ "label": { "en": "Date format", "fr": "Format de date" },
217
+ "visibleWhen": "show-date",
218
+ "choices": [
219
+ { "value": "day-month-year", "label": { "en": "dd/mm/yyyy", "fr": "jj/mm/aaaa" } },
220
+ { "value": "year-month-day", "label": { "en": "yyyy-mm-dd", "fr": "aaaa-mm-jj" } },
221
+ { "value": "month-day-year", "label": { "en": "mm/dd/yyyy", "fr": "mm/jj/aaaa" } }
222
+ ],
223
+ "default": "day-month-year"
224
+ }
225
+ ]
226
+ }
227
+ ```
228
+
229
+ OverCrow draws the rows, stores their values in the user's profile and
230
+ gives them to the logic: read a value with `option(id, fallback)`, and
231
+ follow changes with `onHost`. An `action` row has no value: it calls the
232
+ handler you registered with `onMenu`. See
233
+ [the options menu in the logic](logic.md#the-options-menu).
234
+
235
+ A menu row can set one of its declared values or send its action, nothing
236
+ else: it cannot grant a permission or open a link, and choosing a row is
237
+ not a [user action](services.md#calls-that-need-a-user-action) that allows
238
+ a protected service call.
239
+
240
+ ### Fields of every row
241
+
242
+ <!-- generated:menu-row-fields -->
243
+ | Field | Type | Required | Meaning |
244
+ | --- | --- | --- | --- |
245
+ | `type` | `toggle` \| `slider` \| `choice` \| `action` \| `group` | yes | Row type. |
246
+ | `id` | identifier ≤ 48 bytes | yes | Unique among all rows of the widget; key of the stored value. |
247
+ | `label` | `MenuLabel` | yes | Localized row label. |
248
+ | `icon` | Lucide icon name | no | Leading icon from the host list, drawn by the host. |
249
+ | `visibleWhen` | identifier ≤ 48 bytes | no | ID of a `toggle` row declared earlier; this row is shown only while that toggle is on. |
250
+ | `requires` | `fps` \| `telemetry.cpuTemperature` \| `telemetry.gpuTemperature` | no | Host data source; the host hides the row when it cannot supply it. |
251
+ <!-- /generated:menu-row-fields -->
252
+
253
+ A row with `visibleWhen` shows only while the named toggle is on: the
254
+ Clock's date format appears when the date does. A row with `requires` is
255
+ hidden on a machine that cannot supply that data, as the Performance
256
+ widget's temperature rows are:
257
+
258
+ <!-- source: widgets/performance/manifest.json -->
259
+ ```json
260
+ "requires": "telemetry.cpuTemperature",
261
+ ```
262
+
263
+ A `group` row opens a side flyout with its own rows; the Performance
264
+ widget keeps its five metric toggles under one row:
265
+
266
+ <!-- source: widgets/performance/manifest.json -->
267
+ ```json
268
+ "type": "group",
269
+ "id": "shown-values",
270
+ "label": { "en": "Shown values", "fr": "Valeurs affichées" },
271
+ "rows": [
272
+ ```
273
+
274
+ ### Row types
275
+
276
+ <!-- generated:menu-row-types -->
277
+ ### `toggle`
278
+
279
+ Boolean switch.
280
+
281
+ | Field | Type | Required | Meaning |
282
+ | --- | --- | --- | --- |
283
+ | `default` | boolean | yes | Initial value. |
284
+
285
+ ### `slider`
286
+
287
+ Bounded number; `step` > 0, `step` ≤ `max - min`, at most 10000 steps, `default` within range.
288
+
289
+ | Field | Type | Required | Meaning |
290
+ | --- | --- | --- | --- |
291
+ | `min` | number -1000000 to 1000000 | yes | Lower bound. |
292
+ | `max` | number -1000000 to 1000000 | yes | Upper bound, greater than `min`. |
293
+ | `step` | number -1000000 to 1000000 | yes | Increment. |
294
+ | `default` | number -1000000 to 1000000 | yes | Initial value. |
295
+
296
+ ### `choice`
297
+
298
+ One value among declared choices.
299
+
300
+ | Field | Type | Required | Meaning |
301
+ | --- | --- | --- | --- |
302
+ | `choices` | list of `MenuChoice` ≤ 16 | yes | At least 2 choices. |
303
+ | `default` | identifier ≤ 48 bytes | yes | Value of one declared choice. |
304
+
305
+ ### `action`
306
+
307
+ Calls the handler registered with `onMenu`, with the row ID. Not a user action.
308
+
309
+ ### `group`
310
+
311
+ Side flyout holding non-group rows.
312
+
313
+ | Field | Type | Required | Meaning |
314
+ | --- | --- | --- | --- |
315
+ | `rows` | list of `MenuRow` ≤ 16 | yes | At least one row; a `group` is not allowed here. |
316
+ <!-- /generated:menu-row-types -->
317
+
318
+ ### Labels and choices
319
+
320
+ A `label` is an object with both languages:
321
+
322
+ <!-- generated:menu-label -->
323
+ | Field | Type | Required | Meaning |
324
+ | --- | --- | --- | --- |
325
+ | `en` | `label text` | yes | English label. |
326
+ | `fr` | `label text` | yes | French label. |
327
+ <!-- /generated:menu-label -->
328
+
329
+ Each entry of `choices` is a value and its label:
330
+
331
+ <!-- generated:menu-choice -->
332
+ | Field | Type | Required | Meaning |
333
+ | --- | --- | --- | --- |
334
+ | `value` | identifier ≤ 48 bytes | yes | Stored value; unique within the row. |
335
+ | `label` | `MenuLabel` | yes | Localized choice label. |
336
+ <!-- /generated:menu-choice -->
337
+
338
+ ## Required data sources
339
+
340
+ `requires` at the top level lists data sources the widget cannot work
341
+ without, with the same names as a row's `requires`. On a machine that lacks
342
+ one, OverCrow neither starts nor shows the widget and keeps its place in the
343
+ layout; the widget comes back when the source does. Use it for a widget
344
+ that has nothing to show otherwise, such as a frame-rate counter without a
345
+ frame-rate source. For a single optional value, prefer a row's `requires`.
346
+
347
+ ## A larger memory budget
348
+
349
+ The logic runs with a heap of 16 MiB. A widget that needs more asks for it
350
+ with `vm`; nothing else about the VM's budgets can be changed.
351
+
352
+ <!-- generated:manifest-vm -->
353
+ | Field | Type | Required | Meaning |
354
+ | --- | --- | --- | --- |
355
+ | `heapMiB` | integer 16 to 48 | yes | QuickJS heap ceiling in MiB, from 16 MiB to 48 MiB. The VM process ceiling (64 MiB) does not change. |
356
+ <!-- /generated:manifest-vm -->
357
+
358
+ The memory ceiling of the widget's process stays the same, so a larger heap
359
+ leaves less room for everything else. Ask for it only when
360
+ `overcrow-widget dev` shows the widget stopping with `resource_limit`.
361
+
362
+ ## How the manifest is checked
363
+
364
+ `overcrow-widget check` validates the manifest with the validator OverCrow
365
+ itself runs, and points at the member it refuses:
366
+
367
+ ```text
368
+ error[manifest.sizing]: `sizing` is out of bounds or inconsistent
369
+ --> manifest.json:7:3
370
+ |
371
+ 7 | "sizing": {
372
+ | ^
373
+ = help: `min` <= `preferred` <= `max`, each within the schema's widget size bounds
374
+ check: 1 error(s), 0 warning(s)
375
+ ```
376
+
377
+ OverCrow validates it again when the package is admitted to the catalog,
378
+ when it is installed and each time the widget starts. A new version whose
379
+ manifest asks for more than the previous one (a network rule, a game event,
380
+ a capability, storage or the clipboard) waits until the user approves it
381
+ in the Control Center before it replaces the installed version.
@@ -0,0 +1,165 @@
1
+ # MCP
2
+
3
+ PlayerVox OverCrow has a server for AI assistants: `@overcrow/mcp`. Add it
4
+ to Claude Code, Claude Desktop, Cursor, VS Code or Codex, and your
5
+ assistant can create a widget, check it, test it, audit it, package it and
6
+ prepare its submission. You need Node.js 22.18 or later, nothing else: the
7
+ server installs the OverCrow tools it needs by itself.
8
+
9
+ ```sh
10
+ claude mcp add overcrow -- npx -y @overcrow/mcp
11
+ ```
12
+
13
+ Then ask: "Create an OverCrow widget that shows…".
14
+
15
+ ## Add the server
16
+
17
+ Open your widgets folder in the assistant, then add the server.
18
+
19
+ ### In one command
20
+
21
+ **Claude Code**, from that folder:
22
+
23
+ ```sh
24
+ claude mcp add overcrow -- npx -y @overcrow/mcp
25
+ ```
26
+
27
+ **Codex**:
28
+
29
+ ```sh
30
+ codex mcp add overcrow -- npx -y @overcrow/mcp
31
+ ```
32
+
33
+ **VS Code**: [install in VS Code](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522overcrow%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522%2540overcrow%252Fmcp%2522%255D%257D), or:
34
+
35
+ ```sh
36
+ code --add-mcp '{"name":"overcrow","command":"npx","args":["-y","@overcrow/mcp"]}'
37
+ ```
38
+
39
+ ### With a configuration file
40
+
41
+ **Cursor**: a `.cursor/mcp.json` file in the folder.
42
+
43
+ <!-- source: mcp/examples/cursor-mcp.json -->
44
+ ```json
45
+ {
46
+ "mcpServers": {
47
+ "overcrow": {
48
+ "command": "npx",
49
+ "args": ["-y", "@overcrow/mcp"]
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ **VS Code**: a `.vscode/mcp.json` file in the folder.
56
+
57
+ <!-- source: mcp/examples/vscode-mcp.json -->
58
+ ```json
59
+ {
60
+ "servers": {
61
+ "overcrow": {
62
+ "type": "stdio",
63
+ "command": "npx",
64
+ "args": ["-y", "@overcrow/mcp"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ **Claude Desktop** starts its servers outside your folders: name your
71
+ widgets folder with `--root` in `claude_desktop_config.json` (Settings,
72
+ Developer, Edit Config), then restart Claude Desktop.
73
+
74
+ <!-- source: mcp/examples/claude_desktop_config.json -->
75
+ ```json
76
+ {
77
+ "mcpServers": {
78
+ "overcrow": {
79
+ "command": "npx",
80
+ "args": ["-y", "@overcrow/mcp", "--root", "C:\\Users\\you\\Documents\\widgets"]
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ ## What the server does
87
+
88
+ - **The first time**, it downloads the OverCrow creator tools of your
89
+ computer (the [command-line tool](cli.md) and the runtime that plays the
90
+ [tests](testing.md), about 15 MB) from OverCrow's GitHub release. It
91
+ checks every file against the digests written in the server, then keeps
92
+ them in its own folder (`~/.cache/overcrow-mcp`, or
93
+ `%LOCALAPPDATA%\overcrow-mcp` on Windows). Nothing goes on your `PATH`,
94
+ and no administrator right is needed.
95
+ - **Then** your assistant works with its tools, in this order: create the
96
+ widget from a template, install the SDK (it asks you first), check, test
97
+ (it sees the images that differ), audit, package, prepare the
98
+ submission.
99
+ - **The widget ID** is final. Your assistant asks you for it: your
100
+ publisher handle in the OverCrow creator space and a name
101
+ (`nova.lol-timers`), or a domain you can verify
102
+ (`gg.nova.lol-timers`).
103
+ - **The submission**: the server checks everything the creator space asks
104
+ for, then writes the ZIP of your widget's sources to `dist/`, without
105
+ `node_modules`, `dist`, hidden files or keys, and lists what it left out.
106
+ It also lists the texts to write: why the widget needs each permission,
107
+ the release notes and the description in English and French. Your
108
+ assistant drafts them with you.
109
+ - **The audit** scores the widget out of 100 for security and for
110
+ lightness, with a fix and an example from a
111
+ [reference widget](widgets.md) for each finding: unused permissions,
112
+ network rules that are too broad, secrets, clipboard writes without a
113
+ user action, fast timers, network polling, lists that never stop
114
+ growing, large responses read in one turn, heavy images.
115
+ - **The documentation** of this site, in English and French, and the
116
+ sources of the reference widgets come with the server: your assistant
117
+ reads them without network access.
118
+
119
+ ## What it does not do
120
+
121
+ - It never sends, signs or publishes anything. You send the ZIP and the
122
+ texts in the OverCrow creator space on overcrow.playervox.com.
123
+ - It does not install your widget in OverCrow: trying it in a game is the
124
+ [development channel](dev-channel.md) of the command-line tool.
125
+ - It sends nothing about you: no telemetry, no account.
126
+
127
+ ## Security
128
+
129
+ - **Your folders only.** The server works in the folder open in your
130
+ assistant (or the ones given with `--root`). It refuses a system folder,
131
+ your whole home folder, hidden folders, and links that lead outside.
132
+ - **No command of its own choice.** The server runs the OverCrow
133
+ command-line tool and npm, nothing else, never through a shell.
134
+ - **Checked downloads.** It downloads only the pinned files from GitHub,
135
+ and checks them before use. npm installs only `@overcrow/sdk` and
136
+ TypeScript, with install scripts disabled, and their integrity is
137
+ checked against the published packages.
138
+ - **You confirm.** Installing packages and replacing reference images
139
+ need your agreement.
140
+ - **Your files are data.** What the tools return from your files is
141
+ marked as data: a text inside a widget cannot give orders to your
142
+ assistant through the server. Still read what your assistant changes,
143
+ and approve its actions as you usually do.
144
+
145
+ ## Offline
146
+
147
+ Download `overcrow-creator-tools-VERSION-PLATFORM.zip` of your platform
148
+ from OverCrow's GitHub release once, put it in your widgets folder, and ask
149
+ your assistant to run `setup` with it (`zipPath`). Or start the server with
150
+ `--tools-zip` and the path of the file. The file must be exactly the one
151
+ the server pins.
152
+
153
+ ## Supported computers
154
+
155
+ Checking, testing and packaging need Windows x64 or Linux x86-64. On
156
+ macOS and on ARM, the server still gives the documentation, the
157
+ explanations and the audit.
158
+
159
+ ## If something goes wrong
160
+
161
+ - **"not tied to a published OverCrow release"**: update the server with
162
+ `npx -y @overcrow/mcp@latest`.
163
+ - **Behind a proxy**: set `HTTPS_PROXY` in the server's environment.
164
+ - **"cannot work in /"** (often Claude Desktop): add `--root` and your
165
+ widgets folder.
@@ -0,0 +1,131 @@
1
+ # The package
2
+
3
+ A PlayerVox OverCrow widget is distributed as one file, `<id>-<version>.ocpkg`:
4
+ an archive of the manifest, the compiled view, the style, one script, the
5
+ messages, the images and the license. `overcrow-widget package` builds it,
6
+ and OverCrow reads it with the same code that built it.
7
+
8
+ ```sh
9
+ overcrow-widget package
10
+ overcrow-widget inspect dist/com.example.my-widget-0.1.0.ocpkg
11
+ ```
12
+
13
+ `package` checks the project, writes the archive to `dist/` and prints its
14
+ size and its SHA-256. `inspect` shows what a package holds and what it asks
15
+ for, as a reviewer sees it.
16
+
17
+ ## What goes in
18
+
19
+ <!-- generated:package-files -->
20
+ | Path | Required | Limit | Meaning |
21
+ | --- | --- | --- | --- |
22
+ | `manifest.json` | yes | 64 KiB | The manifest, as written. |
23
+ | `ledger.json` | yes | 64 KiB | Canonical SHA-256 and byte ledger of every other entry, written by the CLI. |
24
+ | `logic.js` | yes | 512 KiB | The only executable content: one ES2023 script without imports, compiled expressions of the view included. UTF-8, not empty. |
25
+ | `view.json` | yes | 512 KiB | Compiled view. The `view.ocml` source is not shipped. |
26
+ | `style.ocss` | no | 128 KiB | Style sheet source, parsed by the host when the widget starts. UTF-8. |
27
+ | `locales/en.json` | no | 256 KiB | English messages; present if and only if `locales/fr.json` is, with the same keys. |
28
+ | `locales/fr.json` | no | 256 KiB | French messages. |
29
+ | `LICENSE` | yes | 64 KiB | License text of the package. UTF-8, not empty. |
30
+ | `assets/<path>.{png,jpg,jpeg,webp}` | no | 2 MiB | Images whose signature matches the extension; lowercase `[a-z0-9_-]` segments, at most 4 below `assets/`. |
31
+ <!-- /generated:package-files -->
32
+
33
+ Any other entry rejects the package: a second script, an HTML file, a
34
+ WebAssembly module, native code, a hidden file, another locale. Text files
35
+ are UTF-8, without a byte-order mark.
36
+
37
+ What you write is not all packaged as it is:
38
+
39
+ | In the project | In the package |
40
+ | --- | --- |
41
+ | `manifest.json` | the same bytes |
42
+ | `view.ocml` | `view.json`, the compiled view; the source is not shipped |
43
+ | `logic.ts` or `logic.js` | `logic.js`: your module, the SDK and the compiled expressions of the view, in one script |
44
+ | `style.ocss`, `locales/`, `assets/`, `LICENSE` | the same bytes |
45
+ | `package.json`, `tsconfig.json`, `node_modules/`, `listing.json`, `tests/` | not packaged |
46
+
47
+ Images are PNG, JPEG or WebP files under `assets/`, in lowercase paths, and
48
+ the content of each file must match its extension. The view names one as
49
+ `src="assets/logo.png"`, and the `preview` of a
50
+ [listing](publishing.md#the-listing) is one of those packaged images.
51
+
52
+ ## The script
53
+
54
+ `logic.js` is the only executable content of a package. The tool builds it
55
+ from your logic module, the SDK it embeds and one function per expression
56
+ and handler of the view, then removes what is unused and shortens local
57
+ names. Two consequences:
58
+
59
+ - the SDK in your `node_modules` is used for type checking only: the one
60
+ that runs is the tool's, and `inspect` shows its version;
61
+ - the view itself carries no code: `view.json` refers to the functions of
62
+ `logic.js` by number.
63
+
64
+ A package holds source that OverCrow can read and check, never compiled
65
+ bytecode.
66
+
67
+ ## The same bytes every time
68
+
69
+ Packaging is deterministic: the same sources and the same version of the
70
+ tool give the same archive, byte for byte, on every run and every system.
71
+ That is what lets a reviewer rebuild your package from the sources you
72
+ submit and compare, and what lets the catalog name a package by its
73
+ SHA-256.
74
+
75
+ For that, the archive has one exact layout: an uncompressed zip, with its
76
+ entries sorted, fixed dates and no extra field. Use `overcrow-widget
77
+ package` to write it; an archive made with another zip tool is refused.
78
+
79
+ ## The ledger
80
+
81
+ `ledger.json`, written by the tool, lists every other file with its size
82
+ and its SHA-256. OverCrow recomputes it from the archive and requires the
83
+ same bytes. It is what ties each file to the package: a file changed,
84
+ added or removed after packaging no longer matches.
85
+
86
+ ## How OverCrow checks a package
87
+
88
+ OverCrow validates a package in full when it is admitted to the catalog,
89
+ when it is installed, and again **each time the widget starts**:
90
+
91
+ 1. the size of the archive, its exact layout and the checksum of each
92
+ entry;
93
+ 2. every path, against the list of files above and their size limits, and
94
+ the required files;
95
+ 3. the ledger, byte for byte;
96
+ 4. the manifest, the script, the style, the pair of locales, the license,
97
+ each image, and the compiled view: known elements in allowed places,
98
+ known attributes with values of the right type, events of their element,
99
+ components used as declared, the bounds of the view, and each static
100
+ image present in the package.
101
+
102
+ For a package of the catalog, the size and the SHA-256 of the archive must
103
+ first equal what the signed catalog says, and the manifest must equal the
104
+ one the catalog lists. A widget whose package fails any of these does not
105
+ start. `overcrow-widget check` and `package` run the same checks, so you
106
+ see a problem before a user does.
107
+
108
+ ## Installed from the catalog, or locally
109
+
110
+ - A package **from the signed catalog** is verified: this is how users get
111
+ widgets. See [publishing and review](publishing.md).
112
+ - A package sent by `overcrow-widget dev` is a **development package**:
113
+ marked "Unverified", for the session only. See
114
+ [the development channel](dev-channel.md).
115
+
116
+ A package that does not come from the catalog cannot use an ID under
117
+ `com.playervox`.
118
+
119
+ ## Limits of a package
120
+
121
+ The sizes of each file and of the archive are in
122
+ [limits](limits.md#project-files-and-package). When a package is over a
123
+ bound, `check` says which:
124
+
125
+ | Code | Problem |
126
+ | --- | --- |
127
+ | `project.file_size` | A source file is larger than its limit. |
128
+ | `project.entry_limit` | The project has more files than a package may hold. |
129
+ | `project.asset_path` | An image's path is not lowercase, is too deep or has another extension. |
130
+ | `package.file_size` | A built file (`logic.js`, `view.json`) is larger than its limit. |
131
+ | `package.archive_size` | The archive is larger than 16 MiB. |