@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,516 @@
1
+ # Type safety best practices
2
+
3
+ This guide ensures you create proper types and avoid common type safety pitfalls when building Serious Gaming games.
4
+
5
+ ## Core principle
6
+
7
+ The Serious Gaming SDK uses TypeScript and JSON Schema to provide **end-to-end type safety**. When you define a capability's `variablesSchema` or a settings resource's `settingsSchema`, the SDK generates precise TypeScript types. Shortcuts and workarounds (using `any`, string-based JSON, etc.) break this guarantee and lead to runtime errors.
8
+
9
+ ## Rule 1: never use `any` type
10
+
11
+ The generated types in your `types.ts` file are precise and auto-generated. Always use them:
12
+
13
+ ### ❌ WRONG: using `any`
14
+
15
+ ```typescript
16
+ // types.ts (auto-generated)
17
+ export type Context = {
18
+ "pricing": {
19
+ BasePrice: number;
20
+ CurrentPrice: number;
21
+ };
22
+ };
23
+
24
+ export type Settings = {
25
+ pricing: {
26
+ PriceAdjustment: number;
27
+ };
28
+ };
29
+
30
+ // logic.ts
31
+ // ❌ WRONG
32
+ const { BasePrice }: any = context.pricing;
33
+ const { PriceAdjustment }: any = settings.pricing;
34
+
35
+ export const Run: RunFunction<any, any> = async ({ context, settings, callbacks }) => {
36
+ // No type checking, no IDE help, runtime errors likely
37
+ ...
38
+ };
39
+ ```
40
+
41
+ ### ✅ CORRECT: using generated types
42
+
43
+ ```typescript
44
+ // logic.ts
45
+ import type { Context, Settings } from './types';
46
+ import { RunFunction } from '@seriousgaming/sdk';
47
+
48
+ // ✅ CORRECT
49
+ export const Run: RunFunction<Context, Settings> = async ({ context, settings, callbacks }) => {
50
+ // Full type safety
51
+ const { BasePrice, CurrentPrice } = context.pricing;
52
+ const { PriceAdjustment } = settings.pricing;
53
+
54
+ // TypeScript catches errors:
55
+ // const newPrice = BasePrice + settings.pricing.InvalidField; // Error!
56
+ // const price = CurrentPrice.toUpperCase(); // Error! (not a string)
57
+
58
+ return {
59
+ capabilities: {
60
+ ...context,
61
+ pricing: {
62
+ ...context.pricing,
63
+ CurrentPrice: BasePrice + PriceAdjustment,
64
+ },
65
+ },
66
+ };
67
+ };
68
+ ```
69
+
70
+ ## Rule 2: use proper JSON Schema types
71
+
72
+ Match your schema type to the actual data. Never use `string` as a workaround for complex data.
73
+
74
+ ### ❌ WRONG: string type for complex data
75
+
76
+ ```bash
77
+ # ❌ WRONG: Accepting JSON as string
78
+ pnpm run sdk new capability '{
79
+ "definition": {
80
+ "identifier": "policy",
81
+ "variablesSchema": {
82
+ "type": "object",
83
+ "properties": {
84
+ "Rules": {
85
+ "type": "string",
86
+ "default": "{\"taxRate\": 0.1, \"enabled\": true}"
87
+ }
88
+ },
89
+ "required": ["Rules"],
90
+ "additionalProperties": false
91
+ }
92
+ }
93
+ }'
94
+ ```
95
+
96
+ ```typescript
97
+ // ❌ WRONG: Parsing JSON from string at runtime
98
+ const rules = JSON.parse(context.policy.Rules);
99
+ const taxRate = rules.taxRate; // String parsing, no type safety
100
+ ```
101
+
102
+ ### ✅ CORRECT: object type for complex data
103
+
104
+ ```bash
105
+ # ✅ CORRECT: Use object type
106
+ pnpm run sdk new capability '{
107
+ "definition": {
108
+ "identifier": "policy",
109
+ "variablesSchema": {
110
+ "type": "object",
111
+ "properties": {
112
+ "Rules": {
113
+ "type": "object",
114
+ "properties": {
115
+ "taxRate": { "type": "number", "minimum": 0, "maximum": 1 },
116
+ "enabled": { "type": "boolean" }
117
+ },
118
+ "required": ["taxRate", "enabled"],
119
+ "additionalProperties": false,
120
+ "default": { "taxRate": 0.1, "enabled": true },
121
+ "description": "Tax rules"
122
+ }
123
+ },
124
+ "required": ["Rules"],
125
+ "additionalProperties": false
126
+ }
127
+ }
128
+ }'
129
+ ```
130
+
131
+ ```typescript
132
+ // ✅ CORRECT: Access as typed object
133
+ const { Rules } = context.policy;
134
+ const taxRate = Rules.taxRate; // Type-safe, IDE autocomplete
135
+ ```
136
+
137
+ The generated type will be:
138
+
139
+ ```typescript
140
+ export interface Context {
141
+ policy: {
142
+ Rules: {
143
+ taxRate: number;
144
+ enabled: boolean;
145
+ };
146
+ };
147
+ }
148
+ ```
149
+
150
+ ### Where a precise type comes from
151
+
152
+ The generator reads the type from the schema's keywords, never from `default`. A `default` seeds the tick-0 value and nothing more, so `{ "type": "object", "default": { "taxRate": 0.1 } }` with no `properties` generates `{ [k: string]: unknown }`, and `{ "type": "array", "default": [...] }` with no `items` generates `unknown[]`, however much structure the default shows.
153
+
154
+ | Schema | Generated type |
155
+ | ------------------------------------------------------------- | ---------------------------------------------- |
156
+ | `"type": "number"` (or `string`, `boolean`) | `number` (or `string`, `boolean`) |
157
+ | `"enum": ["low", "high"]` | `'low' \| 'high'` |
158
+ | `"const": "v1"` | `'v1'` |
159
+ | `"type": "object"` with `properties` and `required` | An object type with those fields |
160
+ | The same, plus `"additionalProperties": false` | The same, with no `[k: string]: unknown` added |
161
+ | `"type": "array"` with `items` | An array of the item's type |
162
+ | `"type": "object"` or `"type": "array"` with only a `default` | `{ [k: string]: unknown }` or `unknown[]` |
163
+
164
+ Set `"additionalProperties": false` on every nested object, not only the top-level schema: without it the object's type gains an index signature, `[k: string]: unknown`, and a misspelt field compiles. Where the schema cannot say what you mean, name a TypeScript type with [`tsType`](./capabilities.md#a-typescript-type-of-your-own).
165
+
166
+ ## Rule 3: define array element types clearly
167
+
168
+ An array's element type comes from its `items` schema. Without one the array is `unknown[]`, whatever its `default` holds:
169
+
170
+ ### ❌ WRONG: empty array with no type info
171
+
172
+ ```bash
173
+ # ❌ WRONG: No items schema, so the elements are unknown
174
+ pnpm run sdk new capability '{
175
+ "definition": {
176
+ "identifier": "transactions",
177
+ "variablesSchema": {
178
+ "type": "object",
179
+ "properties": {
180
+ "Entries": {
181
+ "type": "array",
182
+ "default": []
183
+ }
184
+ },
185
+ "required": ["Entries"],
186
+ "additionalProperties": false
187
+ }
188
+ }
189
+ }'
190
+ ```
191
+
192
+ ```typescript
193
+ // At runtime, you don't know what's in the array
194
+ const entries = context.transactions.Entries;
195
+ entries.push('something'); // TypeScript won't catch type errors here
196
+ ```
197
+
198
+ ### ✅ CORRECT: define array item schema
199
+
200
+ ```bash
201
+ # ✅ CORRECT: Define item structure in schema, not just default
202
+ pnpm run sdk new capability '{
203
+ "definition": {
204
+ "identifier": "transactions",
205
+ "variablesSchema": {
206
+ "type": "object",
207
+ "properties": {
208
+ "Entries": {
209
+ "type": "array",
210
+ "items": {
211
+ "type": "object",
212
+ "properties": {
213
+ "id": { "type": "number" },
214
+ "amount": { "type": "number", "minimum": 0 },
215
+ "date": { "type": "string" }
216
+ },
217
+ "required": ["id", "amount", "date"],
218
+ "additionalProperties": false
219
+ },
220
+ "default": [
221
+ { "id": 1, "amount": 100, "date": "2024-01-01" }
222
+ ],
223
+ "description": "List of transaction records"
224
+ }
225
+ },
226
+ "required": ["Entries"],
227
+ "additionalProperties": false
228
+ }
229
+ }
230
+ }'
231
+ ```
232
+
233
+ ```typescript
234
+ // Now the type is precise
235
+ const entries = context.transactions.Entries;
236
+ // TypeScript infers: Array<{ id: number; amount: number; date: string }>
237
+ entries.push({ id: 2, amount: 50, date: '2024-01-02' }); // Type-checked
238
+ // entries.push({ id: "invalid" }); // Error! Wrong type
239
+ ```
240
+
241
+ ## Rule 4: use constraints for validation
242
+
243
+ JSON Schema supports numeric constraints. Declare them, so the range is written down where every resource can see it (and, in a `settingsSchema`, a scenario or session override outside it is refused). They do not clamp what logic computes: the runtime does not check a value your engine returns against `minimum` or `maximum`, so logic that can push a value out of range still bounds it:
244
+
245
+ ### ❌ WRONG: no constraints, manual validation
246
+
247
+ ```bash
248
+ # ❌ WRONG: No constraints defined
249
+ pnpm run sdk new capability '{
250
+ "definition": {
251
+ "identifier": "pricing",
252
+ "variablesSchema": {
253
+ "type": "object",
254
+ "properties": {
255
+ "Price": {
256
+ "type": "number",
257
+ "default": 100
258
+ }
259
+ },
260
+ "required": ["Price"],
261
+ "additionalProperties": false
262
+ }
263
+ }
264
+ }'
265
+ ```
266
+
267
+ ```typescript
268
+ // ❌ WRONG: Manual validation in code
269
+ export const Run: RunFunction<Context, Settings> = async ({ context, settings, callbacks }) => {
270
+ let newPrice = context.pricing.Price + settings.pricing.Adjustment;
271
+
272
+ // The range lives only in code: nothing in the schema says what it is
273
+ if (newPrice < 0) newPrice = 0;
274
+ if (newPrice > 1000) newPrice = 1000;
275
+
276
+ return {/* ... */};
277
+ };
278
+ ```
279
+
280
+ ### ✅ CORRECT: constraints in schema
281
+
282
+ ```bash
283
+ # ✅ CORRECT: Define constraints in schema
284
+ pnpm run sdk new capability '{
285
+ "definition": {
286
+ "identifier": "pricing",
287
+ "variablesSchema": {
288
+ "type": "object",
289
+ "properties": {
290
+ "Price": {
291
+ "type": "number",
292
+ "default": 100,
293
+ "minimum": 0,
294
+ "maximum": 1000,
295
+ "description": "Product price in dollars"
296
+ },
297
+ "TaxRate": {
298
+ "type": "number",
299
+ "default": 0.1,
300
+ "minimum": 0,
301
+ "maximum": 1,
302
+ "description": "Tax rate as decimal (0.1 = 10%)"
303
+ }
304
+ },
305
+ "required": ["Price", "TaxRate"],
306
+ "additionalProperties": false
307
+ }
308
+ }
309
+ }'
310
+ ```
311
+
312
+ ```typescript
313
+ // ✅ CORRECT: The schema declares the range, and the engine keeps its result inside it
314
+ export const Run: RunFunction<Context, Settings> = async ({ context, settings, callbacks }) => {
315
+ // The runtime does not clamp returned values to `minimum` / `maximum`
316
+ const newPrice = Math.min(
317
+ 1000,
318
+ Math.max(0, context.pricing.Price + settings.pricing.Adjustment)
319
+ );
320
+
321
+ return {
322
+ capabilities: {
323
+ ...context,
324
+ pricing: {
325
+ ...context.pricing,
326
+ Price: newPrice,
327
+ },
328
+ },
329
+ };
330
+ };
331
+ ```
332
+
333
+ ## Rule 5: never cast away type safety
334
+
335
+ Avoid `as` casts. They defeat the purpose of typing:
336
+
337
+ ### ❌ WRONG: using `as` to bypass types
338
+
339
+ ```typescript
340
+ // ❌ WRONG: Casting away type safety
341
+ const context = {...} as any;
342
+ const value = context.something as unknown as string;
343
+ ```
344
+
345
+ ### ✅ CORRECT: use proper types
346
+
347
+ ```typescript
348
+ import type { Context } from '../types';
349
+
350
+ // ✅ CORRECT: Rely on type inference
351
+ const context: Context = {...};
352
+ const value = context.something.MyField; // Properly typed
353
+ ```
354
+
355
+ ### In a test fixture, spread the generated defaults
356
+
357
+ `as unknown as Context` in a test is usually a fixture that grew too big to write by hand: `Context` is the union of every capability the resource declares, and TypeScript requires all of them. Spread `defaultContext` from the generated `defaults.ts` beside the types and override only what the case is about:
358
+
359
+ ```typescript
360
+ import { defaultContext } from './defaults';
361
+ import type { Context } from './types';
362
+
363
+ // ✅ CORRECT: complete, checked, and one line
364
+ const context: Context = { ...defaultContext, inventory: { Stock: 100 } };
365
+ ```
366
+
367
+ See [Testing](testing.md#starting-from-the-generated-defaults).
368
+
369
+ ## Rule 6: let generated types update automatically
370
+
371
+ Never manually write `types.ts`. Always run `pnpm run generate` after capability or settings schema changes:
372
+
373
+ ```bash
374
+ # After ANY variablesSchema or settingsSchema change:
375
+ pnpm run generate
376
+
377
+ # This regenerates types.ts with the latest schema
378
+ ```
379
+
380
+ Manual `types.ts` files lead to:
381
+
382
+ - Types being out of sync with schema
383
+ - Missing fields
384
+ - Runtime errors despite 'type checking'
385
+
386
+ ## Checklist for type safety
387
+
388
+ Before creating a capability or settings resource:
389
+
390
+ - [ ] Using proper JSON Schema types (number, string, boolean, object, array)?
391
+ - [ ] Objects defined with `properties` and `required`?
392
+ - [ ] Arrays defined with an `items` schema (a `default` alone types nothing)?
393
+ - [ ] Nested objects closed with `"additionalProperties": false`?
394
+ - [ ] No `any` types in engine code?
395
+ - [ ] No string-based JSON parsing (use object type instead)?
396
+ - [ ] Numeric constraints defined (min/max) in schema?
397
+ - [ ] Generated types imported in engine logic?
398
+ - [ ] Ran `pnpm run generate` after schema changes?
399
+ - [ ] Engine functions use `RunFunction<Context, Settings>` signatures?
400
+
401
+ ## Common patterns
402
+
403
+ ### Settings numbers
404
+
405
+ ```bash
406
+ pnpm run sdk new settings '{
407
+ "definition": {
408
+ "identifier": "targets",
409
+ "settingsSchema": {
410
+ "type": "object",
411
+ "properties": {
412
+ "DailySalesTarget": {
413
+ "type": "number",
414
+ "default": 100,
415
+ "minimum": 0,
416
+ "description": "Daily sales target in units"
417
+ },
418
+ "DiscountPercentage": {
419
+ "type": "number",
420
+ "default": 0.1,
421
+ "minimum": 0,
422
+ "maximum": 1,
423
+ "description": "Discount as decimal (0.1 = 10%)"
424
+ }
425
+ },
426
+ "additionalProperties": false
427
+ }
428
+ }
429
+ }'
430
+ ```
431
+
432
+ Every settings property declares a `default`, and a `settingsSchema` carries no top-level `required`: every property always has a value. A resource that lists `"settings": ["targets"]` reads `settings.targets.DailySalesTarget` as a `number`.
433
+
434
+ ### Complex objects
435
+
436
+ ```bash
437
+ pnpm run sdk new capability '{
438
+ "definition": {
439
+ "identifier": "marketdata",
440
+ "variablesSchema": {
441
+ "type": "object",
442
+ "properties": {
443
+ "MarketConditions": {
444
+ "type": "object",
445
+ "properties": {
446
+ "demandLevel": { "type": "string" },
447
+ "competitorCount": { "type": "number", "minimum": 0 },
448
+ "growthRate": { "type": "number" },
449
+ "priceRange": {
450
+ "type": "object",
451
+ "properties": {
452
+ "min": { "type": "number", "minimum": 0 },
453
+ "max": { "type": "number", "minimum": 0 }
454
+ },
455
+ "required": ["min", "max"],
456
+ "additionalProperties": false
457
+ }
458
+ },
459
+ "required": ["demandLevel", "competitorCount", "growthRate", "priceRange"],
460
+ "additionalProperties": false,
461
+ "default": {
462
+ "demandLevel": "high",
463
+ "competitorCount": 5,
464
+ "growthRate": 0.05,
465
+ "priceRange": { "min": 50, "max": 200 }
466
+ },
467
+ "description": "Current market conditions"
468
+ }
469
+ },
470
+ "required": ["MarketConditions"],
471
+ "additionalProperties": false
472
+ }
473
+ }
474
+ }'
475
+ ```
476
+
477
+ The generated type will be precise:
478
+
479
+ ```typescript
480
+ export interface Context {
481
+ marketdata: {
482
+ MarketConditions: {
483
+ demandLevel: string;
484
+ competitorCount: number;
485
+ growthRate: number;
486
+ priceRange: {
487
+ min: number;
488
+ max: number;
489
+ };
490
+ };
491
+ };
492
+ }
493
+ ```
494
+
495
+ ## Why this matters
496
+
497
+ Type safety in Serious Gaming:
498
+
499
+ 1. **Catches mistakes at build time** - not runtime
500
+ 2. **IDE assistance** - autocomplete, rename refactoring
501
+ 3. **Self-documenting code** - types are documentation
502
+ 4. **Prevents silent failures** - schema enforces constraints
503
+ 5. **Easier debugging** - stack traces point to real issues, not parsing errors
504
+
505
+ When you skip proper typing, you:
506
+
507
+ - Spend time debugging JSON parsing errors
508
+ - Miss out on IDE help
509
+ - Create ambiguous code that's hard to maintain
510
+ - Introduce runtime errors from schema mismatches
511
+
512
+ ## See also
513
+
514
+ - [Creating capabilities](./capabilities.md): defining capability schemas
515
+ - [Creating engines](./engine.md): writing engine logic
516
+ - [The state model](./capabilities.md#the-state-model): how context is scoped and updated