@seriousgaming/sdk-tools 0.0.0-stage → 1.0.0-alpha.2

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 (391) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +38 -2
  3. package/dist/bundling/logic-exports.d.ts +34 -0
  4. package/dist/bundling/node-builtins.d.ts +21 -0
  5. package/dist/bundling/transpiler.d.ts +7 -0
  6. package/dist/cli.js +27404 -0
  7. package/dist/client/dev-server.d.ts +59 -0
  8. package/dist/client/index.d.ts +28 -0
  9. package/dist/client/stub-services.d.ts +32 -0
  10. package/dist/client/test-session.d.ts +195 -0
  11. package/dist/client.js +16920 -0
  12. package/dist/core/asset-reference-translator.d.ts +46 -0
  13. package/dist/core/clock.d.ts +57 -0
  14. package/dist/core/faults.d.ts +65 -0
  15. package/dist/core/game-settings.d.ts +65 -0
  16. package/dist/core/history.d.ts +89 -0
  17. package/dist/core/listen-with-fallback.d.ts +30 -0
  18. package/dist/core/mutation-queue.d.ts +61 -0
  19. package/dist/core/package-scenario.d.ts +89 -0
  20. package/dist/core/participant-registry.d.ts +109 -0
  21. package/dist/core/pending-changes.d.ts +14 -0
  22. package/dist/core/protocol.d.ts +83 -0
  23. package/dist/core/scenario-drafts.d.ts +32 -0
  24. package/dist/core/session-endpoints.d.ts +108 -0
  25. package/dist/core/session-gates.d.ts +75 -0
  26. package/dist/core/session-host.d.ts +94 -0
  27. package/dist/core/session-refusals.d.ts +56 -0
  28. package/dist/core/session-rewind.d.ts +32 -0
  29. package/dist/core/session-roster.d.ts +128 -0
  30. package/dist/core/session-surfaces.d.ts +32 -0
  31. package/dist/core/session-ticks.d.ts +18 -0
  32. package/dist/core/session-timers.d.ts +84 -0
  33. package/dist/core/session-writes.d.ts +40 -0
  34. package/dist/core/session.d.ts +385 -0
  35. package/dist/core/settings-locks.d.ts +22 -0
  36. package/dist/core/team-names.d.ts +52 -0
  37. package/dist/core/team-state-store.d.ts +218 -0
  38. package/dist/core/tick-timer.d.ts +75 -0
  39. package/dist/dev/blob-links.d.ts +10 -0
  40. package/dist/dev/console/assets/index-DgFglsnA.js +204 -0
  41. package/dist/dev/console/index.html +12 -0
  42. package/dist/dev/console-path.d.ts +19 -0
  43. package/dist/dev/lockfile.d.ts +124 -0
  44. package/dist/dev/package-watcher.d.ts +21 -0
  45. package/dist/dev/routes.d.ts +67 -0
  46. package/dist/dev/shell.d.ts +260 -0
  47. package/dist/dev/surfaces.d.ts +41 -0
  48. package/dist/dev/tools-identity.d.ts +23 -0
  49. package/dist/dev/view/batch.d.ts +172 -0
  50. package/dist/dev/view/commands.d.ts +75 -0
  51. package/dist/dev/view/route.d.ts +58 -0
  52. package/dist/dev/view/view.d.ts +78 -0
  53. package/dist/dev/view/viewer.d.ts +32 -0
  54. package/dist/discovery/config.d.ts +9 -0
  55. package/dist/discovery/manifest-paths.d.ts +21 -0
  56. package/dist/discovery/removed-fields.d.ts +90 -0
  57. package/dist/docs/api/deck.md +386 -0
  58. package/dist/docs/api/index.md +67 -0
  59. package/dist/docs/api/sdk-commands.md +286 -0
  60. package/dist/docs/api/sdk-e2e.md +433 -0
  61. package/dist/docs/api/sdk-projection.md +207 -0
  62. package/dist/docs/api/sdk-testing.md +214 -0
  63. package/dist/docs/api/sdk-tools-client.md +560 -0
  64. package/dist/docs/api/sdk-ui-testing.md +231 -0
  65. package/dist/docs/api/sdk-ui.md +1269 -0
  66. package/dist/docs/api/sdk.md +2140 -0
  67. package/dist/docs/changelog-0.x.md +1156 -0
  68. package/dist/docs/changelog.md +241 -0
  69. package/dist/docs/cli-and-dev-server.md +217 -0
  70. package/dist/docs/cli-error-codes.md +156 -0
  71. package/dist/docs/cli-reference.md +2489 -0
  72. package/dist/docs/cli-simulation-testing.md +222 -0
  73. package/dist/docs/concepts/index.md +46 -0
  74. package/dist/docs/concepts/terminology.md +322 -0
  75. package/dist/docs/environment-variables.md +102 -0
  76. package/dist/docs/getting-started.md +145 -0
  77. package/dist/docs/guides/ai-facilitation.md +220 -0
  78. package/dist/docs/guides/capabilities.md +460 -0
  79. package/dist/docs/guides/endpoints.md +335 -0
  80. package/dist/docs/guides/engine-testing.md +477 -0
  81. package/dist/docs/guides/engine.md +527 -0
  82. package/dist/docs/guides/file-handling.md +405 -0
  83. package/dist/docs/guides/games.md +176 -0
  84. package/dist/docs/guides/global-settings.md +94 -0
  85. package/dist/docs/guides/guide.md +123 -0
  86. package/dist/docs/guides/hooks.md +183 -0
  87. package/dist/docs/guides/index.md +51 -0
  88. package/dist/docs/guides/internationalization.md +288 -0
  89. package/dist/docs/guides/llm-integration.md +635 -0
  90. package/dist/docs/guides/multi-team-games.md +586 -0
  91. package/dist/docs/guides/patterns.md +391 -0
  92. package/dist/docs/guides/presentation.md +196 -0
  93. package/dist/docs/guides/production-constraints.md +130 -0
  94. package/dist/docs/guides/scenario-editor.md +143 -0
  95. package/dist/docs/guides/scenarios.md +515 -0
  96. package/dist/docs/guides/session.md +972 -0
  97. package/dist/docs/guides/settings.md +458 -0
  98. package/dist/docs/guides/setup.md +193 -0
  99. package/dist/docs/guides/speech-generation.md +233 -0
  100. package/dist/docs/guides/starter-game.md +164 -0
  101. package/dist/docs/guides/testing.md +577 -0
  102. package/dist/docs/guides/tick-controller.md +569 -0
  103. package/dist/docs/guides/type-safety.md +516 -0
  104. package/dist/docs/guides/ui.md +1389 -0
  105. package/dist/docs/guides/upgrading.md +636 -0
  106. package/dist/docs/guides/validators.md +217 -0
  107. package/dist/docs/guides/waiting-room.md +244 -0
  108. package/dist/docs/index.md +41 -0
  109. package/dist/docs/recipes/act-on-the-session-from-an-endpoint.md +95 -0
  110. package/dist/docs/recipes/adapt-a-game-for-walkthroughs.md +133 -0
  111. package/dist/docs/recipes/adapt-ui-for-observers.md +74 -0
  112. package/dist/docs/recipes/call-endpoint-from-ui.md +109 -0
  113. package/dist/docs/recipes/check-a-package-from-a-script.md +117 -0
  114. package/dist/docs/recipes/create-capability.md +66 -0
  115. package/dist/docs/recipes/create-endpoint.md +127 -0
  116. package/dist/docs/recipes/create-engine.md +111 -0
  117. package/dist/docs/recipes/create-game.md +70 -0
  118. package/dist/docs/recipes/create-guide.md +75 -0
  119. package/dist/docs/recipes/create-hook.md +80 -0
  120. package/dist/docs/recipes/create-presentation.md +142 -0
  121. package/dist/docs/recipes/create-scenario-editor.md +102 -0
  122. package/dist/docs/recipes/create-scenario.md +98 -0
  123. package/dist/docs/recipes/create-session-ui.md +116 -0
  124. package/dist/docs/recipes/create-settings.md +88 -0
  125. package/dist/docs/recipes/create-setup.md +115 -0
  126. package/dist/docs/recipes/create-tick-controller.md +65 -0
  127. package/dist/docs/recipes/create-user-interface.md +96 -0
  128. package/dist/docs/recipes/create-validator.md +67 -0
  129. package/dist/docs/recipes/create-waiting-room-ui.md +109 -0
  130. package/dist/docs/recipes/declare-api-uses.md +67 -0
  131. package/dist/docs/recipes/design-state-for-concurrent-writes.md +96 -0
  132. package/dist/docs/recipes/distribute-package.md +80 -0
  133. package/dist/docs/recipes/e2e-testing.md +116 -0
  134. package/dist/docs/recipes/end-game-on-condition.md +154 -0
  135. package/dist/docs/recipes/fix-duplicate-packages.md +101 -0
  136. package/dist/docs/recipes/index.md +86 -0
  137. package/dist/docs/recipes/make-an-endpoint-external.md +101 -0
  138. package/dist/docs/recipes/negotiate-across-teams.md +164 -0
  139. package/dist/docs/recipes/observe-other-teams-state.md +119 -0
  140. package/dist/docs/recipes/publish-a-package.md +139 -0
  141. package/dist/docs/recipes/remember-a-viewers-choice.md +55 -0
  142. package/dist/docs/recipes/review-a-past-day.md +73 -0
  143. package/dist/docs/recipes/share-assets-across-scenarios.md +120 -0
  144. package/dist/docs/recipes/share-logic-between-engine-and-ui.md +130 -0
  145. package/dist/docs/recipes/show-all-teams-participants.md +109 -0
  146. package/dist/docs/recipes/start-from-an-empty-package.md +169 -0
  147. package/dist/docs/recipes/take-a-file-in-an-endpoint.md +82 -0
  148. package/dist/docs/recipes/test-a-multi-role-game.md +51 -0
  149. package/dist/docs/recipes/test-user-interface.md +95 -0
  150. package/dist/docs/recipes/test-with-engine.md +115 -0
  151. package/dist/docs/recipes/upload-and-display-files.md +148 -0
  152. package/dist/docs/recipes/use-request-play.md +65 -0
  153. package/dist/docs/recipes/use-request-tick.md +75 -0
  154. package/dist/docs/troubleshooting.md +816 -0
  155. package/dist/execution/blob-inputs.d.ts +57 -0
  156. package/dist/execution/bundle-reload.d.ts +42 -0
  157. package/dist/execution/config-resolver.d.ts +127 -0
  158. package/dist/execution/configuration-builder.d.ts +66 -0
  159. package/dist/execution/context-composition.d.ts +161 -0
  160. package/dist/execution/endpoint-actions.d.ts +9 -0
  161. package/dist/execution/endpoint-payloads.d.ts +32 -0
  162. package/dist/execution/endpoint-runner.d.ts +129 -0
  163. package/dist/execution/engine-state.d.ts +40 -0
  164. package/dist/execution/executor-callbacks.d.ts +56 -0
  165. package/dist/execution/executor.d.ts +436 -0
  166. package/dist/execution/gates.d.ts +45 -0
  167. package/dist/execution/hook-chain.d.ts +25 -0
  168. package/dist/execution/logic-calls.d.ts +190 -0
  169. package/dist/execution/logic-failure.d.ts +84 -0
  170. package/dist/execution/logic-loader.d.ts +54 -0
  171. package/dist/execution/logic-result.d.ts +76 -0
  172. package/dist/execution/tick-controller-call.d.ts +32 -0
  173. package/dist/execution/types.d.ts +48 -0
  174. package/dist/generation/ts-type.d.ts +39 -0
  175. package/dist/guide/locale.d.ts +12 -0
  176. package/dist/guide/video-registry.d.ts +42 -0
  177. package/dist/help-examples.d.ts +125 -0
  178. package/dist/host/adapter.d.ts +67 -0
  179. package/dist/host/host-channel.d.ts +222 -0
  180. package/dist/host/index.d.ts +20 -0
  181. package/dist/host/protocol.d.ts +783 -0
  182. package/dist/host/surfaces.d.ts +42 -0
  183. package/dist/host/theme.d.ts +55 -0
  184. package/dist/host.js +583 -0
  185. package/dist/prompts/index.d.ts +7 -0
  186. package/dist/prompts/schema-builder.d.ts +29 -0
  187. package/dist/prompts/types.d.ts +108 -0
  188. package/dist/prompts/validators.d.ts +32 -0
  189. package/dist/runtime/capability-scope.d.ts +6 -0
  190. package/dist/runtime/context-merge.d.ts +29 -0
  191. package/dist/runtime/context-projection.d.ts +41 -0
  192. package/dist/runtime/guarded-callbacks.d.ts +15 -0
  193. package/dist/runtime/index.d.ts +27 -0
  194. package/dist/runtime/manifest-version.d.ts +55 -0
  195. package/dist/runtime/tick-validation.d.ts +25 -0
  196. package/dist/runtime.js +346 -0
  197. package/dist/schema.json +1546 -0
  198. package/dist/server/vite-plugin.d.ts +46 -0
  199. package/dist/services/tts/client.d.ts +51 -0
  200. package/dist/services/tts/elevenlabs.d.ts +24 -0
  201. package/dist/services/tts/types.d.ts +44 -0
  202. package/dist/storage/asset-resolver.d.ts +49 -0
  203. package/dist/storage/blob-store.d.ts +41 -0
  204. package/dist/templates/endpoint/logic.test.ts.liquid +61 -0
  205. package/dist/templates/endpoint/logic.ts.liquid +25 -0
  206. package/dist/templates/engine/init.json.liquid +7 -0
  207. package/dist/templates/engine/logic-aggregate.test.ts.liquid +90 -0
  208. package/dist/templates/engine/logic-aggregate.ts.liquid +46 -0
  209. package/dist/templates/engine/logic.test.ts.liquid +61 -0
  210. package/dist/templates/engine/logic.ts.liquid +32 -0
  211. package/dist/templates/engine/run.json.liquid +7 -0
  212. package/dist/templates/guide/01-at-a-glance.md.liquid +19 -0
  213. package/dist/templates/guide/02-preparation.md.liquid +18 -0
  214. package/dist/templates/guide/03-running-the-session.md.liquid +37 -0
  215. package/dist/templates/hook/logic.test.ts.liquid +46 -0
  216. package/dist/templates/hook/logic.ts.liquid +12 -0
  217. package/dist/templates/package/CLAUDE.md.template +338 -0
  218. package/dist/templates/package/DESIGN.md.liquid +144 -0
  219. package/dist/templates/package/README.md.liquid +143 -0
  220. package/dist/templates/package/claude/rules/workflow-create-capability.md +26 -0
  221. package/dist/templates/package/claude/rules/workflow-create-endpoint.md +35 -0
  222. package/dist/templates/package/claude/rules/workflow-create-engine.md +35 -0
  223. package/dist/templates/package/claude/rules/workflow-create-guide.md +40 -0
  224. package/dist/templates/package/claude/rules/workflow-create-presentation.md +37 -0
  225. package/dist/templates/package/claude/rules/workflow-create-user-interface.md +31 -0
  226. package/dist/templates/package/claude/rules/workflow-publish-package.md +54 -0
  227. package/dist/templates/package/claude/rules/workflow-test-engine-or-ui.md +30 -0
  228. package/dist/templates/package/claude/rules/workflow-update-sdk-version.md +43 -0
  229. package/dist/templates/package/claude/settings.json.template +16 -0
  230. package/dist/templates/package/gitignore.template +15 -0
  231. package/dist/templates/package/global-setup.ts.template +21 -0
  232. package/dist/templates/package/globals.d.ts.template +2 -0
  233. package/dist/templates/package/oxfmtrc.json.template +14 -0
  234. package/dist/templates/package/oxlintrc.json.template +238 -0
  235. package/dist/templates/package/package.json.liquid +65 -0
  236. package/dist/templates/package/playwright.config.ts.liquid +19 -0
  237. package/dist/templates/package/pnpm-workspace.yaml.template +27 -0
  238. package/dist/templates/package/test-setup.ts.liquid +7 -0
  239. package/dist/templates/package/tsconfig.json.liquid +15 -0
  240. package/dist/templates/package/vite.config.ts.liquid +19 -0
  241. package/dist/templates/package/vitest.config.ts.liquid +25 -0
  242. package/dist/templates/package/vitest.engine.config.ts.liquid +12 -0
  243. package/dist/templates/presentation/index.html.liquid +20 -0
  244. package/dist/templates/presentation/src/App.tsx.liquid +49 -0
  245. package/dist/templates/presentation/src/Slides.tsx.liquid +81 -0
  246. package/dist/templates/presentation/src/i18n.ts.liquid +54 -0
  247. package/dist/templates/presentation/src/main.tsx.liquid +14 -0
  248. package/dist/templates/scenario_editor/src/App.test.tsx.liquid +30 -0
  249. package/dist/templates/scenario_editor/src/App.tsx.liquid +95 -0
  250. package/dist/templates/scenario_editor/src/i18n.ts.liquid +44 -0
  251. package/dist/templates/session/src/App.test.tsx.liquid +60 -0
  252. package/dist/templates/session/src/App.tsx.liquid +128 -0
  253. package/dist/templates/session/src/i18n.ts.liquid +53 -0
  254. package/dist/templates/session/src/main.tsx.liquid +48 -0
  255. package/dist/templates/session/src/theme.ts.liquid +46 -0
  256. package/dist/templates/settings-editor/index.html.liquid +12 -0
  257. package/dist/templates/settings-editor/src/main.tsx.liquid +48 -0
  258. package/dist/templates/settings-editor/src/theme.ts.liquid +24 -0
  259. package/dist/templates/setup/src/App.test.tsx.liquid +39 -0
  260. package/dist/templates/setup/src/App.tsx.liquid +102 -0
  261. package/dist/templates/setup/src/i18n.ts.liquid +47 -0
  262. package/dist/templates/starter-game/capabilities/briefing/capability.sdk.json +18 -0
  263. package/dist/templates/starter-game/capabilities/plan/capability.sdk.json +17 -0
  264. package/dist/templates/starter-game/capabilities/results/capability.sdk.json +61 -0
  265. package/dist/templates/starter-game/capabilities/roles/capability.sdk.json +17 -0
  266. package/dist/templates/starter-game/capabilities/weather/capability.sdk.json +23 -0
  267. package/dist/templates/starter-game/engine/defaults.ts +81 -0
  268. package/dist/templates/starter-game/engine/engine.sdk.json +12 -0
  269. package/dist/templates/starter-game/engine/logic.test.ts +221 -0
  270. package/dist/templates/starter-game/engine/logic.ts +149 -0
  271. package/dist/templates/starter-game/engine/test-helpers.ts +74 -0
  272. package/dist/templates/starter-game/engine/types.ts +139 -0
  273. package/dist/templates/starter-game/guide/content/en/01-at-a-glance.md +51 -0
  274. package/dist/templates/starter-game/guide/content/en/02-preparation.md +35 -0
  275. package/dist/templates/starter-game/guide/content/en/03-running-the-day.md +58 -0
  276. package/dist/templates/starter-game/guide/guide.sdk.json +10 -0
  277. package/dist/templates/starter-game/guide/guide.test.ts +108 -0
  278. package/dist/templates/starter-game/hooks/assignproducts/defaults.ts +37 -0
  279. package/dist/templates/starter-game/hooks/assignproducts/hook.sdk.json +13 -0
  280. package/dist/templates/starter-game/hooks/assignproducts/logic/logic.test.ts +77 -0
  281. package/dist/templates/starter-game/hooks/assignproducts/logic/logic.ts +47 -0
  282. package/dist/templates/starter-game/hooks/assignproducts/types.ts +55 -0
  283. package/dist/templates/starter-game/package.json +68 -0
  284. package/dist/templates/starter-game/playwright.config.ts +19 -0
  285. package/dist/templates/starter-game/scenarios/heatwave/scenario.sdk.json +20 -0
  286. package/dist/templates/starter-game/scenarios/ordinary_week/scenario.sdk.json +12 -0
  287. package/dist/templates/starter-game/seriousgaming.sdk.json +23 -0
  288. package/dist/templates/starter-game/session/defaults.ts +80 -0
  289. package/dist/templates/starter-game/session/index.html +12 -0
  290. package/dist/templates/starter-game/session/session.sdk.json +11 -0
  291. package/dist/templates/starter-game/session/src/App.test.tsx +307 -0
  292. package/dist/templates/starter-game/session/src/App.tsx +309 -0
  293. package/dist/templates/starter-game/session/src/Section.tsx +37 -0
  294. package/dist/templates/starter-game/session/src/TeamDoor.tsx +96 -0
  295. package/dist/templates/starter-game/session/src/format.ts +8 -0
  296. package/dist/templates/starter-game/session/src/i18n.ts +51 -0
  297. package/dist/templates/starter-game/session/src/main.tsx +48 -0
  298. package/dist/templates/starter-game/session/src/theme.ts +45 -0
  299. package/dist/templates/starter-game/session/types.ts +135 -0
  300. package/dist/templates/starter-game/settings/engine/settings.sdk.json +50 -0
  301. package/dist/templates/starter-game/settings/menu/settings.sdk.json +78 -0
  302. package/dist/templates/starter-game/settings/session/settings.sdk.json +23 -0
  303. package/dist/templates/starter-game/settings/ui/settings.sdk.json +25 -0
  304. package/dist/templates/starter-game/test-setup.ts +7 -0
  305. package/dist/templates/starter-game/testing/e2e/game.spec.ts +139 -0
  306. package/dist/templates/starter-game/testing/e2e/global-setup.ts +21 -0
  307. package/dist/templates/starter-game/testing/engine/game.engine.test.ts +171 -0
  308. package/dist/templates/starter-game/tsconfig.json +19 -0
  309. package/dist/templates/starter-game/ui/defaults.ts +60 -0
  310. package/dist/templates/starter-game/ui/index.html +12 -0
  311. package/dist/templates/starter-game/ui/src/App.test.tsx +138 -0
  312. package/dist/templates/starter-game/ui/src/App.tsx +175 -0
  313. package/dist/templates/starter-game/ui/src/DayBar.test.tsx +78 -0
  314. package/dist/templates/starter-game/ui/src/DayBar.tsx +72 -0
  315. package/dist/templates/starter-game/ui/src/HistoryPanel.test.tsx +74 -0
  316. package/dist/templates/starter-game/ui/src/HistoryPanel.tsx +120 -0
  317. package/dist/templates/starter-game/ui/src/MakeRow.tsx +129 -0
  318. package/dist/templates/starter-game/ui/src/Section.tsx +37 -0
  319. package/dist/templates/starter-game/ui/src/ThemeToggle.tsx +49 -0
  320. package/dist/templates/starter-game/ui/src/TodayPanel.test.tsx +179 -0
  321. package/dist/templates/starter-game/ui/src/TodayPanel.tsx +92 -0
  322. package/dist/templates/starter-game/ui/src/YesterdayPanel.tsx +142 -0
  323. package/dist/templates/starter-game/ui/src/format.ts +12 -0
  324. package/dist/templates/starter-game/ui/src/i18n.ts +95 -0
  325. package/dist/templates/starter-game/ui/src/main.tsx +48 -0
  326. package/dist/templates/starter-game/ui/src/menu.ts +18 -0
  327. package/dist/templates/starter-game/ui/src/test-helpers.ts +58 -0
  328. package/dist/templates/starter-game/ui/src/theme.ts +45 -0
  329. package/dist/templates/starter-game/ui/src/writes.ts +43 -0
  330. package/dist/templates/starter-game/ui/types.ts +137 -0
  331. package/dist/templates/starter-game/ui/ui.sdk.json +11 -0
  332. package/dist/templates/starter-game/validators/capacity/defaults.ts +37 -0
  333. package/dist/templates/starter-game/validators/capacity/logic/logic.test.ts +96 -0
  334. package/dist/templates/starter-game/validators/capacity/logic/logic.ts +45 -0
  335. package/dist/templates/starter-game/validators/capacity/types.ts +55 -0
  336. package/dist/templates/starter-game/validators/capacity/validator.sdk.json +11 -0
  337. package/dist/templates/starter-game/vite.config.ts +19 -0
  338. package/dist/templates/starter-game/vitest.config.ts +15 -0
  339. package/dist/templates/starter-game/vitest.engine.config.ts +19 -0
  340. package/dist/templates/starter-game/waiting_room/defaults.ts +40 -0
  341. package/dist/templates/starter-game/waiting_room/index.html +12 -0
  342. package/dist/templates/starter-game/waiting_room/src/App.test.tsx +102 -0
  343. package/dist/templates/starter-game/waiting_room/src/App.tsx +194 -0
  344. package/dist/templates/starter-game/waiting_room/src/i18n.ts +33 -0
  345. package/dist/templates/starter-game/waiting_room/src/main.tsx +48 -0
  346. package/dist/templates/starter-game/waiting_room/src/theme.ts +45 -0
  347. package/dist/templates/starter-game/waiting_room/types.ts +59 -0
  348. package/dist/templates/starter-game/waiting_room/waiting_room.sdk.json +10 -0
  349. package/dist/templates/tick-controller/logic.ts.liquid +8 -0
  350. package/dist/templates/ui/index.html.liquid +12 -0
  351. package/dist/templates/ui/src/App.test.tsx.liquid +41 -0
  352. package/dist/templates/ui/src/App.tsx.liquid +103 -0
  353. package/dist/templates/ui/src/i18n.ts.liquid +47 -0
  354. package/dist/templates/ui/src/main.tsx.liquid +48 -0
  355. package/dist/templates/ui/src/theme.ts.liquid +46 -0
  356. package/dist/templates/validator/logic.test.ts.liquid +42 -0
  357. package/dist/templates/validator/logic.ts.liquid +21 -0
  358. package/dist/templates/waiting-room/index.html.liquid +12 -0
  359. package/dist/templates/waiting-room/src/App.test.tsx.liquid +57 -0
  360. package/dist/templates/waiting-room/src/App.tsx.liquid +118 -0
  361. package/dist/templates/waiting-room/src/i18n.ts.liquid +44 -0
  362. package/dist/templates/waiting-room/src/main.tsx.liquid +48 -0
  363. package/dist/templates/waiting-room/src/theme.ts.liquid +46 -0
  364. package/dist/templating/resource-metadata.d.ts +131 -0
  365. package/dist/types.d.ts +14 -0
  366. package/dist/utils/atomic-write.d.ts +40 -0
  367. package/dist/utils/cli-error.d.ts +64 -0
  368. package/dist/utils/document-parser-client.d.ts +20 -0
  369. package/dist/utils/env-loader.d.ts +40 -0
  370. package/dist/utils/error-codes.d.ts +339 -0
  371. package/dist/utils/errors.d.ts +19 -0
  372. package/dist/utils/global-settings.d.ts +65 -0
  373. package/dist/utils/llm-client.d.ts +34 -0
  374. package/dist/utils/logger.d.ts +36 -0
  375. package/dist/utils/output.d.ts +109 -0
  376. package/dist/utils/platform.d.ts +14 -0
  377. package/dist/utils/prompt.d.ts +36 -0
  378. package/dist/utils/real-path.d.ts +6 -0
  379. package/dist/utils/schema-properties.d.ts +35 -0
  380. package/dist/validation/ajv.d.ts +17 -0
  381. package/dist/validation/facilitator-guide-validator.d.ts +27 -0
  382. package/dist/validation/findings.d.ts +40 -0
  383. package/dist/validation/game-constraints.d.ts +10 -0
  384. package/dist/validation/game-validator.d.ts +34 -0
  385. package/dist/validation/package-validation.d.ts +41 -0
  386. package/dist/validation/package-validator.d.ts +19 -0
  387. package/dist/validation/resource-validator.d.ts +79 -0
  388. package/dist/validation/schema-defaults-validator.d.ts +29 -0
  389. package/dist/validation/schema-validation.d.ts +115 -0
  390. package/dist/validation/semver.d.ts +9 -0
  391. package/package.json +123 -3
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import type { Callbacks, Settings, Context } from '../types';
4
+ import { Run } from './logic';
5
+
6
+ const callbacks = {} as Callbacks;
7
+ const settings: Settings = {
8
+ menu: {
9
+ Capacity: 120,
10
+ Menu: {
11
+ lemonade: { Name: 'Lemonade', Order: 1, Cost: 15, Price: 50 },
12
+ icedtea: { Name: 'Iced tea', Order: 2, Cost: 20, Price: 60 },
13
+ cookies: { Name: 'Cookies', Order: 3, Cost: 25, Price: 70 },
14
+ },
15
+ },
16
+ };
17
+
18
+ const empty: Context = { roles: { LooksAfter: {} } };
19
+
20
+ const join = async (context: Context, id: string, index: number, over: Settings = settings) =>
21
+ (
22
+ await Run({
23
+ participants: [],
24
+ context,
25
+ settings: over,
26
+ callbacks,
27
+ meta: { locale: 'en', seed: 'lemonade-test-seed', runKind: 'session', now: 0 },
28
+ participant: {
29
+ id,
30
+ teamId: 'team-1',
31
+ name: `Participant ${index + 1}`,
32
+ index,
33
+ connected: true,
34
+ },
35
+ })
36
+ ).capabilities;
37
+
38
+ describe('Run', () => {
39
+ it('puts the first arrival on the first thing on the menu', async () => {
40
+ const result = await join(empty, 'participant-1', 0);
41
+
42
+ expect(result.roles.LooksAfter).toEqual({ 'participant-1': 'lemonade' });
43
+ });
44
+
45
+ it('hands the menu out in order, and starts again round a fourth person', async () => {
46
+ let context = empty;
47
+ for (const [index, id] of ['a', 'b', 'c', 'd'].entries()) {
48
+ context = await join(context, id, index);
49
+ }
50
+
51
+ expect(context.roles.LooksAfter).toEqual({
52
+ a: 'lemonade',
53
+ b: 'icedtea',
54
+ c: 'cookies',
55
+ d: 'lemonade',
56
+ });
57
+ });
58
+
59
+ it('leaves a returning participant on what they had', async () => {
60
+ const context: Context = {
61
+ ...empty,
62
+ roles: { LooksAfter: { 'participant-1': 'cookies' } },
63
+ };
64
+
65
+ const result = await join(context, 'participant-1', 0);
66
+
67
+ expect(result.roles.LooksAfter['participant-1']).toBe('cookies');
68
+ });
69
+
70
+ it('does nothing when the menu is empty', async () => {
71
+ const result = await join(empty, 'participant-1', 0, {
72
+ menu: { ...settings.menu, Menu: {} },
73
+ });
74
+
75
+ expect(result.roles.LooksAfter).toEqual({});
76
+ });
77
+ });
@@ -0,0 +1,47 @@
1
+ import type { HookFunction } from '../types';
2
+
3
+ /**
4
+ * Puts each arriving participant in charge of one thing on the menu.
5
+ *
6
+ * This is what makes the concurrency safe in ordinary play rather than by luck:
7
+ * three people looking after three different items normally change three
8
+ * different keys, so the host's merge keeps all three. Nobody is stopped from
9
+ * changing somebody else's item, and the validator is what covers the day they
10
+ * do.
11
+ *
12
+ * It reads the menu rather than carrying a list of its own, so a fourth item
13
+ * added to the game is handed out without touching this file.
14
+ *
15
+ * Hooks fire out of tick, once per join, and the runtime serialises them, so
16
+ * reading the map and writing it back is safe here in a way the same pattern
17
+ * would not be in a surface.
18
+ */
19
+ export const Run: HookFunction = async ({ context, settings, participant }) => {
20
+ const assignments = context.roles.LooksAfter;
21
+
22
+ // A reconnect re-fires the signal. Re-assigning would move somebody to a
23
+ // different item mid-session for no reason they could see.
24
+ if (assignments[participant.id]) {
25
+ return { capabilities: context };
26
+ }
27
+
28
+ const menu = Object.entries(settings.menu.Menu)
29
+ .sort(([, a], [, b]) => a.Order - b.Order)
30
+ .map(([id]) => id);
31
+
32
+ if (menu.length === 0) {
33
+ return { capabilities: context };
34
+ }
35
+
36
+ return {
37
+ capabilities: {
38
+ ...context,
39
+ roles: {
40
+ LooksAfter: {
41
+ ...assignments,
42
+ [participant.id]: menu[Object.keys(assignments).length % menu.length],
43
+ },
44
+ },
45
+ },
46
+ };
47
+ };
@@ -0,0 +1,55 @@
1
+ // This file is auto-generated from the hook's capability definitions.
2
+ // Do not edit this file directly. It will be regenerated on build.
3
+
4
+ export interface Context {
5
+ roles: {
6
+ /**
7
+ * Which menu item each participant is in charge of, keyed by participant id. Written by the participantJoin hook, and the reason two people normally edit two different keys.
8
+ */
9
+ LooksAfter: {
10
+ [k: string]: string;
11
+ };
12
+ };
13
+ }
14
+
15
+ export interface Settings {
16
+ menu: {
17
+ /**
18
+ * How many items the stall can make in a day, across the whole menu
19
+ */
20
+ Capacity: number;
21
+ Menu: Menu;
22
+ };
23
+ }
24
+ /**
25
+ * What the stall sells, keyed by item id. Money is in pence, so the sums stay in whole numbers. Read by the engine and every surface, so the price on screen and the price in the sums are the same number.
26
+ */
27
+ export interface Menu {
28
+ [k: string]: MenuItem;
29
+ }
30
+ export interface MenuItem {
31
+ /**
32
+ * What the item is called on every screen
33
+ */
34
+ Name: string;
35
+ /**
36
+ * Where it sits on the menu, so every screen lists it in the same order. 1 comes first
37
+ */
38
+ Order: number;
39
+ /**
40
+ * Cost to make one, in pence
41
+ */
42
+ Cost: number;
43
+ /**
44
+ * Sale price, in pence
45
+ */
46
+ Price: number;
47
+ }
48
+
49
+ import type { LogicCallbacks } from '@seriousgaming/sdk';
50
+
51
+ export type Callbacks = LogicCallbacks;
52
+
53
+ import type { HookFunction as SDKHookFunction } from '@seriousgaming/sdk';
54
+
55
+ export type HookFunction = SDKHookFunction<'participantJoin', Context, Settings, Callbacks>;
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "com.example.lemonade",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "description": "The scaffolded starter game, kept as a worked example",
6
+ "license": "UNLICENSED",
7
+ "author": "Serious Gaming",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "type": "module",
12
+ "main": "index.js",
13
+ "scripts": {
14
+ "generate": "pnpm run sdk generate",
15
+ "build": "pnpm run sdk build",
16
+ "start": "pnpm run sdk dev",
17
+ "test": "vitest",
18
+ "test:run": "vitest run",
19
+ "test:coverage": "vitest run --coverage",
20
+ "test:engine": "vitest run --config vitest.engine.config.ts",
21
+ "lint": "oxlint --max-warnings=0",
22
+ "lint:fix": "oxlint --fix",
23
+ "format": "oxfmt",
24
+ "format:check": "oxfmt --check",
25
+ "typecheck": "tsc --noEmit",
26
+ "sdk": "vite-node node_modules/@seriousgaming/sdk-tools/cli/cli.ts",
27
+ "test:e2e": "playwright test"
28
+ },
29
+ "dependencies": {
30
+ "@emotion/cache": "^11.14.0",
31
+ "@emotion/react": "^11.14.0",
32
+ "@emotion/styled": "^11.14.1",
33
+ "@fontsource-variable/roboto-mono": "^5.3.0",
34
+ "@fontsource-variable/work-sans": "^5.3.0",
35
+ "@mui/material": "^9.4.0",
36
+ "@mui/stylis-plugin-rtl": "^9.4.0",
37
+ "i18next": "^26.4.2",
38
+ "react": "^19.3.0",
39
+ "react-dom": "^19.3.0",
40
+ "react-i18next": "^17.0.16",
41
+ "stylis": "^4.4.0",
42
+ "vite": "^8.3.4"
43
+ },
44
+ "devDependencies": {
45
+ "@playwright/test": "^1.64.0",
46
+ "@seriousgaming/sdk": "workspace:*",
47
+ "@seriousgaming/sdk-tools": "workspace:*",
48
+ "@testing-library/jest-dom": "^7.0.1",
49
+ "@testing-library/react": "^16.3.3",
50
+ "@testing-library/user-event": "^14.6.7",
51
+ "@types/node": "^24.19.1",
52
+ "@types/react": "^19.3.0",
53
+ "@types/react-dom": "^19.3.0",
54
+ "@types/stylis": "^4.2.7",
55
+ "@vitejs/plugin-react": "^6.1.2",
56
+ "commander": "^15.0.0",
57
+ "esbuild": "^0.28.2",
58
+ "jsdom": "^30.1.2",
59
+ "json-schema-to-typescript": "^16.0.0",
60
+ "typescript": "^6.0.3",
61
+ "vite-node": "^6.0.0",
62
+ "vitest": "^5.0.3"
63
+ },
64
+ "peerDependencies": {
65
+ "@seriousgaming/sdk": "workspace:*"
66
+ },
67
+ "sdkResources": "./dist/seriousgaming.json"
68
+ }
@@ -0,0 +1,19 @@
1
+ import { defineConfig } from '@playwright/test';
2
+
3
+ export default defineConfig({
4
+ testDir: './testing/e2e',
5
+ // Starts an isolated dev server on free ports, beside any `sdk dev` you
6
+ // have running, and stops it when the run ends. It names the server in
7
+ // SERIOUSGAMING_DEV_URL, which the SDK's e2e helpers read.
8
+ globalSetup: './testing/e2e/global-setup.ts',
9
+ // One worker: these tests share a session, so a tick in one is visible to
10
+ // the next. Running them in parallel makes each test's starting state
11
+ // depend on what another happened to be doing.
12
+ workers: 1,
13
+ // A stray `test.only` passes locally and silently skips the rest on CI.
14
+ forbidOnly: !!process.env.CI,
15
+ use: {
16
+ // Read again in each worker, after the global setup has set it.
17
+ baseURL: process.env.SERIOUSGAMING_DEV_URL,
18
+ },
19
+ });
@@ -0,0 +1,20 @@
1
+ {
2
+ "definition": {
3
+ "locales": {
4
+ "en": {
5
+ "name": "Heatwave",
6
+ "description": "Five hot days. The queue is longer than the stall can serve, so the only question is what to fill it with."
7
+ }
8
+ },
9
+ "settings": {
10
+ "game": {
11
+ "maxTicks": 5
12
+ },
13
+ "engine": {
14
+ "SunnyPull": 1.9,
15
+ "RainyPull": 1.1
16
+ }
17
+ }
18
+ },
19
+ "rootDirectory": "."
20
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "definition": {
3
+ "locales": {
4
+ "en": {
5
+ "name": "An ordinary week",
6
+ "description": "Ten days of mixed weather. The one to run first."
7
+ }
8
+ },
9
+ "default": true
10
+ },
11
+ "rootDirectory": "."
12
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "identifier": "com.example.lemonade",
3
+ "supportedLocales": ["en"],
4
+ "locales": {
5
+ "en": {
6
+ "name": "Lemonade Stand"
7
+ }
8
+ },
9
+ "maxTicks": 10,
10
+ "teams": {
11
+ "mode": "independent",
12
+ "min": 1,
13
+ "max": 8,
14
+ "perTeam": {
15
+ "minParticipants": 2,
16
+ "maxParticipants": 5
17
+ }
18
+ },
19
+ "waitingRoom": {
20
+ "openOnStart": true
21
+ },
22
+ "scenarioFormat": 1
23
+ }
@@ -0,0 +1,80 @@
1
+ // This file is auto-generated from the schemas the resource declares: the values
2
+ // a session starts with, for use as test fixtures.
3
+ // Do not edit this file directly. It will be regenerated on build.
4
+
5
+ import type { Context, TeamContext, SharedContext, Settings } from './types';
6
+
7
+ export const defaultContext: Context = {
8
+ plan: {
9
+ Make: {},
10
+ },
11
+ results: {
12
+ Day: 0,
13
+ Weather: 'sunny',
14
+ Lines: {},
15
+ Takings: 0,
16
+ Spent: 0,
17
+ Profit: 0,
18
+ Purse: 0,
19
+ },
20
+ roles: {
21
+ LooksAfter: {},
22
+ },
23
+ briefing: {
24
+ Message: '',
25
+ },
26
+ };
27
+
28
+ export const defaultTeamContext: TeamContext = {
29
+ plan: {
30
+ Make: {},
31
+ },
32
+ results: {
33
+ Day: 0,
34
+ Weather: 'sunny',
35
+ Lines: {},
36
+ Takings: 0,
37
+ Spent: 0,
38
+ Profit: 0,
39
+ Purse: 0,
40
+ },
41
+ roles: {
42
+ LooksAfter: {},
43
+ },
44
+ };
45
+
46
+ export const defaultSharedContext: SharedContext = {
47
+ briefing: {
48
+ Message: '',
49
+ },
50
+ };
51
+
52
+ export const defaultSettings: Settings = {
53
+ menu: {
54
+ Capacity: 120,
55
+ Menu: {
56
+ lemonade: {
57
+ Name: 'Lemonade',
58
+ Order: 1,
59
+ Cost: 15,
60
+ Price: 50,
61
+ },
62
+ icedtea: {
63
+ Name: 'Iced tea',
64
+ Order: 2,
65
+ Cost: 20,
66
+ Price: 60,
67
+ },
68
+ cookies: {
69
+ Name: 'Cookies',
70
+ Order: 3,
71
+ Cost: 25,
72
+ Price: 70,
73
+ },
74
+ },
75
+ },
76
+ session: {
77
+ ShowJoinLinks: true,
78
+ CurrencySymbol: '£',
79
+ },
80
+ };
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Allocation</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="./src/main.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,11 @@
1
+ {
2
+ "definition": {
3
+ "reads": ["plan", "results", "roles", "briefing"],
4
+ "writes": ["briefing"],
5
+ "settings": ["menu", "session"]
6
+ },
7
+ "ui": {
8
+ "entrypoint": "index.html"
9
+ },
10
+ "rootDirectory": "."
11
+ }