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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +36 -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 +27368 -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 +16884 -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 +209 -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 +236 -0
  69. package/dist/docs/cli-and-dev-server.md +217 -0
  70. package/dist/docs/cli-error-codes.md +154 -0
  71. package/dist/docs/cli-reference.md +2488 -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 +575 -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 +335 -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 +122 -3
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The one place a command's result reaches stdout (#639).
3
+ *
4
+ * With `--json`, or `SERIOUSGAMING_JSON=1` in the environment, every command
5
+ * writes exactly one JSON document to stdout, whether it succeeded or failed:
6
+ *
7
+ * { "ok": true, "command": "tick", "data": {...}, "diagnostics": [], "warnings": [] }
8
+ * { "ok": false, "command": "build", "error": { "code", "message", "hint"? },
9
+ * "diagnostics": [], "warnings": [] }
10
+ *
11
+ * Commands do not print the envelope themselves. They hand their result to
12
+ * {@link reportResult}, with a printer for the human form, and throw a
13
+ * {@link CliError} to fail. The single catch in `cli.ts` finishes the command
14
+ * here, which is what makes 'one document' a guarantee rather than a habit:
15
+ * while JSON mode is on, anything else written to stdout (a stray
16
+ * `console.log`, commander's help) is moved to stderr.
17
+ */
18
+ import { CliError, type Diagnostic } from './cli-error';
19
+ import { type ErrorCode } from './error-codes';
20
+ /** The environment variable that turns JSON output on for every command. */
21
+ export declare const JSON_ENV_VAR = "SERIOUSGAMING_JSON";
22
+ export interface Warning {
23
+ message: string;
24
+ code?: string;
25
+ }
26
+ export interface SuccessEnvelope {
27
+ ok: true;
28
+ command: string;
29
+ data: unknown;
30
+ /** Findings that did not fail the command: warnings anchored to a file. */
31
+ diagnostics: Diagnostic[];
32
+ warnings: Warning[];
33
+ }
34
+ export interface FailureEnvelope {
35
+ ok: false;
36
+ command: string;
37
+ error: {
38
+ code: ErrorCode;
39
+ message: string;
40
+ hint?: string;
41
+ details?: Record<string, unknown>;
42
+ };
43
+ diagnostics: Diagnostic[];
44
+ warnings: Warning[];
45
+ }
46
+ export type Envelope = SuccessEnvelope | FailureEnvelope;
47
+ /**
48
+ * Ask the top-level handler to end the process once the command has finished,
49
+ * rather than waiting for the event loop to drain. For `dev`, whose servers
50
+ * hold handles open after a stop or a failed start. Commands never call
51
+ * `process.exit` themselves.
52
+ */
53
+ export declare function requestProcessExit(): void;
54
+ export declare function processExitRequested(): boolean;
55
+ /** Whether `SERIOUSGAMING_JSON` asks for JSON output. */
56
+ export declare function jsonRequestedByEnvironment(env?: NodeJS.ProcessEnv): boolean;
57
+ /**
58
+ * Start a command's output. In JSON mode stdout is held for the envelope, and
59
+ * everything else written to it goes to stderr until the command finishes.
60
+ */
61
+ export declare function beginCommand(command: string, json: boolean): void;
62
+ /** The command path, once the parser knows it for certain. */
63
+ export declare function setCommandPath(command: string): void;
64
+ /** Turn JSON mode on for a command already begun, such as from a `--json` flag. */
65
+ export declare function enableJsonOutput(): void;
66
+ export declare function isJsonOutput(): boolean;
67
+ /**
68
+ * Report what the command produced: the envelope's `data` in JSON mode, or
69
+ * whatever `human` prints otherwise. A command that reports nothing has
70
+ * `data: null`.
71
+ */
72
+ export declare function reportResult(data: unknown, human?: () => void): void;
73
+ /** Print a value as JSON on stdout, two-space indented, as every command does. */
74
+ export declare function printJson(value: unknown): void;
75
+ /** A notice the caller should see, carried in the envelope's `warnings`. */
76
+ export declare function recordWarning(message: string, code?: string): void;
77
+ /** Whether the command has already recorded a warning with this code. */
78
+ export declare function hasWarning(code: string): boolean;
79
+ /**
80
+ * A finding that does not fail the command, such as a build warning: carried
81
+ * in the envelope's `diagnostics`. The command prints its own human form.
82
+ */
83
+ export declare function recordDiagnostic(diagnostic: Diagnostic): void;
84
+ /** Write the success envelope (JSON mode) and release stdout. */
85
+ export declare function finishSuccess(): void;
86
+ /**
87
+ * Report a failure: the failure envelope on stdout in JSON mode, a message on
88
+ * stderr otherwise. Returns the exit code its category maps to.
89
+ */
90
+ export declare function finishFailure(error: unknown): number;
91
+ /**
92
+ * The human form of a failure's located diagnostics: ` at file:line:column`
93
+ * under the message, one per finding that names a file. A finding without a
94
+ * file is already in the message a command builds from its findings.
95
+ */
96
+ export declare function locatedDiagnostics(diagnostics: readonly Diagnostic[]): string[];
97
+ /** The envelope a finished JSON command printed, for tests reading it back. */
98
+ export declare function parseEnvelope(stdout: string): Envelope;
99
+ /**
100
+ * Every failure as a {@link CliError}. A parse error from commander is a usage
101
+ * error; anything else that is not a `CliError` is a bug in the CLI, exit 1.
102
+ */
103
+ export declare function toCliError(error: unknown): CliError;
104
+ /** Commander's own errors, recognised by shape so no realm or copy matters. */
105
+ export declare function commanderError(error: unknown): {
106
+ code: string;
107
+ exitCode: number;
108
+ message: string;
109
+ } | null;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared helpers for talking to the Serious Gaming platform API.
3
+ *
4
+ * Every platform endpoint lives under `<host>/api/v0/...` and authenticates
5
+ * with an `Authorization: Bearer <apiKey>` header. The host is just the
6
+ * origin; callers append the API path themselves.
7
+ */
8
+ export declare const DEFAULT_PLATFORM_HOST = "https://app.businesssimulations.com";
9
+ export declare function normalisePlatformHost(url: string): string;
10
+ export interface PlatformErrorBody {
11
+ errors?: unknown;
12
+ message?: unknown;
13
+ }
14
+ export declare function formatPlatformErrors(body: PlatformErrorBody): string;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Every interactive prompt the CLI shows, behind one gate (#639).
3
+ *
4
+ * A prompt is shown only when somebody can answer it: stdin and stdout are
5
+ * both terminals, JSON output is off and `CI` is unset. Anywhere else the
6
+ * prompt is a usage error naming the question and how to pass the answer
7
+ * instead, rather than a command that waits on a pipe forever or reads
8
+ * garbage from one.
9
+ *
10
+ * Import prompts from here, never from `@inquirer/prompts` directly.
11
+ */
12
+ import * as inquirer from '@inquirer/prompts';
13
+ export declare function canPrompt(): boolean;
14
+ /** For tests that drive the prompts through a mock: force the gate open or shut. */
15
+ export declare function setInteractiveOverride(value: boolean | null): void;
16
+ /** `--yes`: answer every confirmation with yes. */
17
+ export declare function setAssumeYes(value: boolean): void;
18
+ /**
19
+ * How to run the current command without prompts, quoted in the error when a
20
+ * prompt is refused.
21
+ */
22
+ export declare function setPromptUsage(value: string | undefined): void;
23
+ export declare const input: typeof inquirer.input;
24
+ export declare const select: typeof inquirer.select;
25
+ export declare const checkbox: typeof inquirer.checkbox;
26
+ /** A yes/no question that is part of the input, such as 'Add another property?'. */
27
+ export declare const confirm: typeof inquirer.confirm;
28
+ /**
29
+ * 'Are you sure?': a confirmation `--yes` answers. Without a terminal and
30
+ * without `--yes` it is a usage error, so a script never deletes by accident
31
+ * and never hangs on the question.
32
+ */
33
+ export declare function confirmAction(config: {
34
+ message: string;
35
+ default?: boolean;
36
+ }, yes?: boolean): Promise<boolean>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A path with its symbolic links resolved, as esbuild reports them, so a
3
+ * package under a linked directory (macOS's `/var`) still yields a relative
4
+ * path. The path as given when it does not exist.
5
+ */
6
+ export declare function realPath(path: string): string;
@@ -0,0 +1,35 @@
1
+ import type { PropertySchema } from '../prompts/index.js';
2
+ /**
3
+ * Extract the properties map from a full JSON Schema object.
4
+ *
5
+ * Returns an empty object if the schema is undefined or has no properties.
6
+ */
7
+ export declare function extractSchemaProperties(schema: Record<string, unknown> | undefined): Record<string, PropertySchema>;
8
+ /**
9
+ * Wrap a flat property map into a full JSON Schema object.
10
+ *
11
+ * The wrapped object has `type: 'object'`, all properties marked as required,
12
+ * and `additionalProperties: false`.
13
+ */
14
+ export declare function wrapAsFullSchema(properties: Record<string, PropertySchema>): Record<string, unknown>;
15
+ /**
16
+ * Detect whether a variablesSchema is in the flat shorthand format (property
17
+ * definitions at the top level) or the full JSON Schema format (with a
18
+ * `properties` key), and return the full format in both cases.
19
+ *
20
+ * **Flat format** (property definitions at the top level):
21
+ * ```json
22
+ * { "Price": { "type": "number", "default": 0 } }
23
+ * ```
24
+ *
25
+ * **Full format** (standard JSON Schema object):
26
+ * ```json
27
+ * { "type": "object", "properties": { "Price": { "type": "number", "default": 0 } } }
28
+ * ```
29
+ *
30
+ * Heuristic: if the schema already has a `properties` key it is treated as
31
+ * the full format. Otherwise every top-level value that is a plain object
32
+ * with a `type` field is assumed to be a property definition, and the schema
33
+ * is wrapped.
34
+ */
35
+ export declare function normalizeVariablesSchema(schema: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
@@ -0,0 +1,17 @@
1
+ import Ajv from 'ajv';
2
+ /**
3
+ * Single construction point for Ajv instances (#283). The shape layer
4
+ * (`cli/validation.ts`) and the semantic layer (`game-validator.ts`) both used
5
+ * to `new Ajv({ allErrors: true, verbose: true })` independently; they now share
6
+ * these options so a change (a format, a keyword) is made once. Neither layer
7
+ * registers formats, so the options are all they share — the two
8
+ * error-formatting conventions are intentionally left untouched.
9
+ *
10
+ * Two keywords are registered, each of which would otherwise fail strict mode
11
+ * as unknown. `tsType` names the TypeScript type a capability property
12
+ * generates to (#601) and constrains nothing at run time. `blob` marks an
13
+ * endpoint request field as a file (§6.12): by the time the schema sees the
14
+ * request the runtime has resolved every such field to a `blob:` reference,
15
+ * so the keyword holds it to that.
16
+ */
17
+ export declare function createAjv(): Ajv;
@@ -0,0 +1,27 @@
1
+ import type { FacilitatorGuideDefinition } from '@seriousgaming/sdk';
2
+ import { referenceLocale } from '../guide/locale.js';
3
+ /**
4
+ * Facilitator guide content validation.
5
+ *
6
+ * Checks the on-disk content of a guide against its definition:
7
+ * - Locale completeness: each declared locale should mirror the reference
8
+ * locale's chapter file set (warnings — fallback handles gaps at runtime)
9
+ * - Video blocks: provider and parameters must validate against the closed
10
+ * provider registry (errors — these render as inert error blocks)
11
+ * - Referenced assets: relative image references must resolve to a file
12
+ * inside the guide directory (errors)
13
+ *
14
+ * This is the **semantic / content** layer (the `validation/` directory); the
15
+ * schema-level bundle-shape check is `validateSDKFacilitatorGuide` in
16
+ * `cli/validation.ts`.
17
+ */
18
+ export interface GuideContentValidationResult {
19
+ errors: string[];
20
+ warnings: string[];
21
+ }
22
+ export { referenceLocale };
23
+ export declare function validateFacilitatorGuideContent(options: {
24
+ definition: FacilitatorGuideDefinition;
25
+ /** Absolute path to the guide's root directory */
26
+ rootDirectory: string;
27
+ }): GuideContentValidationResult;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Validation findings as data (#639): what is wrong, where, and the code a
3
+ * script or agent branches on. Each check returns these, and the message text
4
+ * a person reads is formatted from them rather than the other way round.
5
+ */
6
+ import type { Diagnostic } from '../utils/cli-error';
7
+ /** A diagnostic before the command decides how serious it is. */
8
+ export type Finding = Omit<Diagnostic, 'severity'> & {
9
+ severity?: Diagnostic['severity'];
10
+ };
11
+ /** The manifest, relative to the package root. */
12
+ export declare const MANIFEST_FILE = "seriousgaming.sdk.json";
13
+ /**
14
+ * A resource's bundle file, relative to the package root: the slot's bundle
15
+ * for the kinds a game holds one of, `<plural>/<identifier>/<bundle>` for the
16
+ * rest. Undefined for a type that has no bundle of its own.
17
+ */
18
+ export declare function bundleFileOf(type: string, identifier: string): string | undefined;
19
+ /** One RFC 6901 reference token. */
20
+ export declare function pointerToken(segment: string | number): string;
21
+ /** An RFC 6901 pointer from its segments. */
22
+ export declare function pointerOf(...segments: Array<string | number>): string;
23
+ /**
24
+ * The closest of `candidates` to `name`, when one is close enough to be the
25
+ * likely intent: a typo, not a different word. Case is ignored.
26
+ */
27
+ export declare function closestMatch(name: string, candidates: Iterable<string>): string | undefined;
28
+ /** "Did you mean 'x'?", or undefined when nothing is close. */
29
+ export declare function didYouMean(name: string, candidates: Iterable<string>): string | undefined;
30
+ /** Levenshtein distance, two rows at a time. */
31
+ export declare function editDistance(a: string, b: string): number;
32
+ /**
33
+ * Split a refusal into the sentence saying what is wrong and the rest, which
34
+ * says what to do about it. The refusals for removed fields are written that
35
+ * way, so one string serves the human message and the diagnostic's hint.
36
+ */
37
+ export declare function splitHint(text: string): {
38
+ message: string;
39
+ hint?: string;
40
+ };
@@ -0,0 +1,10 @@
1
+ import { type GameSettingsSource } from '../core/game-settings';
2
+ import { type Finding } from './findings.js';
3
+ /**
4
+ * What is wrong with a game's `gameSettingsConstraints` (SPECIFICATION.md
5
+ * §6.10.1). The manifest's schema already refuses an unknown field or
6
+ * keyword; what it cannot see is a constraint that widens the SDK's schema
7
+ * rather than narrowing it, and a game whose own values break its own
8
+ * constraints, which only the merged schema can judge.
9
+ */
10
+ export declare function gameConstraintFindings(manifest: GameSettingsSource): Finding[];
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Game validation utilities
3
+ * Validates engine execution order and capability dependencies
4
+ *
5
+ * Part of the **semantic / cross-reference** validation layer (the
6
+ * `validation/` directory): it checks meaning across resources, not shape.
7
+ * Per-bundle JSON Schema validation lives in the `validateSDK*` family in
8
+ * `cli/validation.ts`.
9
+ */
10
+ import type { SDKGame, SDKEngine, ResolvedPackageManifest } from '@seriousgaming/sdk';
11
+ import { type Finding } from './findings.js';
12
+ export interface ValidationResult {
13
+ success: boolean;
14
+ errors: string[];
15
+ warnings: string[];
16
+ /**
17
+ * Some of `errors` and `warnings` as data, each with its code and where it
18
+ * points (#639). A finding's message is the error or warning it describes,
19
+ * word for word; the rest are reported without a finer location.
20
+ */
21
+ findings?: Finding[];
22
+ /** The game's engine, once resolved. A game holds exactly one. */
23
+ engine?: SDKEngine;
24
+ }
25
+ export interface GameEngineResult {
26
+ success: boolean;
27
+ engine?: SDKEngine;
28
+ error?: string;
29
+ }
30
+ /**
31
+ * The cross-resource rules the schema cannot express, checked across the
32
+ * whole package once each bundle has passed its own schema.
33
+ */
34
+ export declare function validateGame(game: SDKGame, config: ResolvedPackageManifest): ValidationResult;
@@ -0,0 +1,41 @@
1
+ import type { ResolvedPackageManifest } from '@seriousgaming/sdk';
2
+ import { type ResourceType } from '../templating/resource-metadata.js';
3
+ import type { Diagnostic } from '../utils/cli-error';
4
+ /**
5
+ * The static validation `build` runs before it bundles anything, and that the
6
+ * dev server runs on the package it serves.
7
+ *
8
+ * Each kind of resource declares its checks in {@link VALIDATION_DESCRIPTORS};
9
+ * one loop runs them, in the order the table lists the kinds, and reports one
10
+ * result per resource. A new kind is validated by adding a row.
11
+ */
12
+ /** What a validated resource is: a resource type, or the package or game the manifest is. */
13
+ export type ValidatedType = ResourceType | 'package' | 'game';
14
+ export interface ResourceValidationResult {
15
+ identifier: string;
16
+ type: ValidatedType;
17
+ errors: string[];
18
+ warnings: string[];
19
+ /** Each error and warning above as a diagnostic, located where the check could say. */
20
+ diagnostics: Diagnostic[];
21
+ }
22
+ export interface ValidateOutput {
23
+ success: boolean;
24
+ resources: ResourceValidationResult[];
25
+ summary: {
26
+ total: number;
27
+ passed: number;
28
+ failed: number;
29
+ warnings: number;
30
+ };
31
+ }
32
+ /** Validate the package at `workingDir`, loading its manifest from `config`. */
33
+ export declare function validatePackage(options: {
34
+ config: string;
35
+ workingDir: string;
36
+ }): Promise<ValidateOutput>;
37
+ /** Validate a package already loaded. */
38
+ export declare function validateLoadedPackage(config: ResolvedPackageManifest, options: {
39
+ configPath: string;
40
+ workingDir: string;
41
+ }): Promise<ValidateOutput>;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Package definition validation
3
+ *
4
+ * `schema.json` already enforces a Semantic Versioning 2.0.0 regex on
5
+ * `PackageDefinition.version`, but the build path reads the value out of
6
+ * `seriousgaming.sdk.json` and copies it into the bundled manifest without
7
+ * re-checking it. A hand-edited non-semver value (e.g. `'1.0'`, `'v1.0.0'`)
8
+ * would otherwise reach the bundle, breaking downstream consumers that order
9
+ * packages by semver precedence.
10
+ *
11
+ * `validatePackageDefinition` runs the same check at build time so the
12
+ * manifest is guaranteed to carry a valid semver.
13
+ */
14
+ import type { SDKPackage } from '@seriousgaming/sdk';
15
+ export interface PackageValidationResult {
16
+ success: boolean;
17
+ errors: string[];
18
+ }
19
+ export declare function validatePackageDefinition(packageBundle: SDKPackage | undefined): PackageValidationResult;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Resource validation utilities
3
+ * Validates engines and user interfaces for capability references and file existence
4
+ *
5
+ * This is the **semantic / cross-reference** layer: it checks meaning (do
6
+ * capability references resolve? do declared files exist?), not shape. The
7
+ * schema-level "does this bundle match its JSON Schema?" check is the
8
+ * `validateSDK*` family in `cli/validation.ts`.
9
+ */
10
+ import type { SDKEngine, SDKUserInterface, SDKScenarioEditor, SDKSetup, ResolvedPackageManifest, SDKEndpoint, SDKHook, SDKValidator, SDKTickController } from '@seriousgaming/sdk';
11
+ import { type Finding } from './findings';
12
+ export interface ValidationResult {
13
+ success: boolean;
14
+ errors: string[];
15
+ /**
16
+ * Some or all of `errors` as data, each with its code and where it points
17
+ * (#639). A finding's message is the error it describes, word for word.
18
+ */
19
+ findings?: Finding[];
20
+ }
21
+ /**
22
+ * Validate an engine for capability references
23
+ * Checks that all capabilities in reads/writes exist in the configuration
24
+ */
25
+ export declare function validateEngine(engine: SDKEngine, config: ResolvedPackageManifest): ValidationResult;
26
+ /**
27
+ * Validate a user interface for capability references
28
+ * Checks that all capabilities in reads/writes exist in the configuration.
29
+ * Each user interface fills a slot, so its identifier is its type.
30
+ */
31
+ export declare function validateUserInterface(userInterface: SDKUserInterface, config: ResolvedPackageManifest): ValidationResult;
32
+ /**
33
+ * Validate an endpoint for capability references. Its `writes` are checked
34
+ * with the game, beside the endpoint's scope.
35
+ */
36
+ export declare function validateEndpoint(endpoint: SDKEndpoint, config: ResolvedPackageManifest): ValidationResult;
37
+ /**
38
+ * Validate a hook for capability references — same shape as an engine.
39
+ */
40
+ export declare function validateHook(hook: SDKHook, config: ResolvedPackageManifest): ValidationResult;
41
+ /**
42
+ * Validate a validator for capability references. Validators are read-only by
43
+ * design; the schema rejects `writes` outright.
44
+ */
45
+ export declare function validateValidator(validator: SDKValidator, config: ResolvedPackageManifest): ValidationResult;
46
+ /**
47
+ * Validate a tick controller for capability references. Tick controllers are
48
+ * read-only; the schema does not admit `writes`.
49
+ */
50
+ export declare function validateTickController(tc: SDKTickController, config: ResolvedPackageManifest): ValidationResult;
51
+ /**
52
+ * Validate that an engine's logic file exists and exports the pair its shape
53
+ * requires.
54
+ *
55
+ * Which shape that is comes from the same exports (#513): discovery derives
56
+ * `aggregate` from `InitAggregate` / `RunAggregate`, so there is no
57
+ * declaration left to contradict the code. What remains is the half-aggregate
58
+ * engine — one of the pair without the other — which no dispatch rule covers,
59
+ * and the per-team engine that exports neither and so must export `Run`.
60
+ * `Init` is never required (§10.1).
61
+ */
62
+ export declare function validateEngineFiles(engine: SDKEngine, workingDir: string): Promise<ValidationResult>;
63
+ /**
64
+ * Validate that an endpoint's logic exists and exports what it runs (§6.12):
65
+ * `Handle`, or `Plan` for one that answers in two phases.
66
+ *
67
+ * Discovery has already refused every mix of the three exports, and stamped
68
+ * `responds` when the endpoint answers in two phases. What is left is the
69
+ * endpoint that exports neither, which used to load and build cleanly and fail
70
+ * only when it was first called. Checked here, beside the engine's exports,
71
+ * rather than at load: a file that does not transpile reports no exports at
72
+ * all, and at load that would misreport a syntax error as a missing export and
73
+ * stop the dev server over it.
74
+ */
75
+ export declare function validateEndpointFiles(endpoint: SDKEndpoint, workingDir: string): Promise<ValidationResult>;
76
+ /**
77
+ * Validate that a UI's entrypoint file exists
78
+ */
79
+ export declare function validateUIFiles(ui: SDKUserInterface | SDKSetup | SDKScenarioEditor, workingDir: string): ValidationResult;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Validate that every `default` declared inside a resource's schemas is a valid
3
+ * instance of the subschema that declares it (#335).
4
+ *
5
+ * Ajv is used elsewhere to check configuration *data* against these schemas,
6
+ * but nothing checked the schemas' own defaults. A default that violates its
7
+ * declaring subschema (an object default carrying a property the subschema does
8
+ * not declare under `additionalProperties: false`, a string default on a numeric
9
+ * property) therefore passed `sdk build --validate-only` silently and only
10
+ * surfaced at runtime, where it seeds the initial context or a resolved config.
11
+ */
12
+ export interface SchemaDefaultsIssue {
13
+ /** Dotted path to the subschema declaring the default, e.g. `variablesSchema.properties.Company`. */
14
+ path: string;
15
+ /** Human-readable reason the default does not satisfy its subschema. */
16
+ reason: string;
17
+ }
18
+ /**
19
+ * Check every schema on a resource definition for defaults that violate their
20
+ * own subschema. Returns one issue per offending default, empty when clean.
21
+ */
22
+ export declare function findInvalidSchemaDefaults(definition: unknown): SchemaDefaultsIssue[];
23
+ /**
24
+ * Format the issues for a resource as build error lines.
25
+ *
26
+ * `label` is the resource's human type and identifier, e.g.
27
+ * `Capability "com.example.company"`.
28
+ */
29
+ export declare function validateSchemaDefaults(label: string, definition: unknown): string[];
@@ -0,0 +1,115 @@
1
+ import type { ErrorObject } from 'ajv';
2
+ import type { JSONSchema7 } from 'json-schema';
3
+ import { type Finding } from './findings.js';
4
+ /**
5
+ * Validation result
6
+ */
7
+ export interface ValidationResult {
8
+ valid: boolean;
9
+ /** The findings as one message, for a person. */
10
+ errors?: string;
11
+ /**
12
+ * The same failures as data: one per schema error, each with the RFC 6901
13
+ * pointer AJV reports (its `instancePath`) into the validated value.
14
+ */
15
+ findings?: Finding[];
16
+ }
17
+ /** Every AJV error as a finding. */
18
+ export declare function schemaFindings(errors: ErrorObject[] | null | undefined): Finding[];
19
+ /** Validate an SDKCapability */
20
+ export declare const validateSDKCapability: (data: unknown) => ValidationResult;
21
+ /** Validate an SDKSettings (definition with its settingsSchema) */
22
+ export declare const validateSDKSettings: (data: unknown) => ValidationResult;
23
+ /** Validate an SDKEngine (definition + logic + rootDirectory) */
24
+ export declare const validateSDKEngine: (data: unknown) => ValidationResult;
25
+ /** Validate an SDKUserInterface (definition + entrypoint + rootDirectory) */
26
+ export declare const validateSDKUserInterface: (data: unknown) => ValidationResult;
27
+ /** Validate a package manifest, which is also the game it is */
28
+ export declare const validatePackageManifest: (data: unknown) => ValidationResult;
29
+ /** Validate an SDKTickController */
30
+ export declare const validateSDKTickController: (data: unknown) => ValidationResult;
31
+ /** Validate an SDKScenario */
32
+ export declare const validateSDKScenario: (data: unknown) => ValidationResult;
33
+ /** Validate an SDKFacilitatorGuide */
34
+ export declare const validateSDKFacilitatorGuide: (data: unknown) => ValidationResult;
35
+ /** Validate an SDKSetup */
36
+ export declare const validateSDKSetup: (data: unknown) => ValidationResult;
37
+ /** Validate an SDKScenarioEditor */
38
+ export declare const validateSDKScenarioEditor: (data: unknown) => ValidationResult;
39
+ /** Validate an SDKSessionUserInterface */
40
+ export declare const validateSDKSessionUserInterface: (data: unknown) => ValidationResult;
41
+ /** Validate an SDKWaitingRoomUserInterface */
42
+ export declare const validateSDKWaitingRoomUserInterface: (data: unknown) => ValidationResult;
43
+ /** Validate an SDKPresentation */
44
+ export declare const validateSDKPresentation: (data: unknown) => ValidationResult;
45
+ /** Validate an SDKHook */
46
+ export declare const validateSDKHook: (data: unknown) => ValidationResult;
47
+ /** Validate an SDKValidator */
48
+ export declare const validateSDKValidator: (data: unknown) => ValidationResult;
49
+ /** Validate an SDKEndpoint */
50
+ export declare const validateSDKEndpoint: (data: unknown) => ValidationResult;
51
+ /**
52
+ * Every settings resource's schema, keyed by settings identifier (§8): what an
53
+ * override source is validated against. One table rather than a per-slot map,
54
+ * because settings are named by their identifier and a package may hold any
55
+ * number.
56
+ */
57
+ export type SettingsSchemas = Record<string, JSONSchema7>;
58
+ /** Each settings resource's schema, from a resolved package. */
59
+ export declare function settingsSchemas(config: {
60
+ settings?: {
61
+ definition: {
62
+ identifier: string;
63
+ settingsSchema: unknown;
64
+ };
65
+ }[];
66
+ }): SettingsSchemas;
67
+ /**
68
+ * The per-settings-resource errors in a partial override source: a scenario's
69
+ * `configuration`, or the session layer. One string per failing entry.
70
+ *
71
+ * Driven by the override's **keys**, so a key naming a settings resource the
72
+ * package does not hold is reported rather than skipped: accepting it and then
73
+ * ignoring it is inert configuration that reads as applied (§8.2).
74
+ */
75
+ export declare function collectSettingsOverrideErrors(overrides: Record<string, unknown>, schemas: SettingsSchemas): string[];
76
+ /**
77
+ * The findings in a partial override source, such as a scenario's `settings`:
78
+ * {@link collectSettingsOverrideErrors} as data. `base` is the pointer of the
79
+ * override map inside its file (`/definition/settings` for a scenario), so
80
+ * each finding points at the key or value at fault.
81
+ */
82
+ export declare function collectSettingsOverrideFindings(overrides: Record<string, unknown>, schemas: SettingsSchemas, base?: string): Finding[];
83
+ /**
84
+ * Validate a session-override layer against the settings schemas.
85
+ *
86
+ * Partial, like every other override source (§8.2): the layer holds what a
87
+ * session-scoped source supplied and nothing else, so a key it omits falls
88
+ * through to the layer beneath and must not be faulted as missing.
89
+ * `additionalProperties` still rejects an undeclared key, and property-level
90
+ * checks still apply to the keys that are present.
91
+ */
92
+ export declare function validateSessionOverrides(configuration: unknown, schemas: SettingsSchemas): ValidationResult;
93
+ /**
94
+ * Validate a partial override source, such as a scenario's `settings`,
95
+ * against the settings schemas, labelling the result with the source.
96
+ *
97
+ * @param sourceLabel human-readable name of the override source, prefixed onto
98
+ * the error message (e.g. 'Scenario "hard"')
99
+ */
100
+ export declare function validateSettingsOverrides(overrides: Record<string, unknown>, schemas: SettingsSchemas, sourceLabel: string): ValidationResult;
101
+ /**
102
+ * Validate a **partial** settings override against a resource's
103
+ * `settingsSchema`, returning ajv's errors or `null` when it is valid.
104
+ *
105
+ * An override is partial at every depth (§8.2): a key it omits, at the top or
106
+ * inside an object-valued setting, falls through to the layer beneath and
107
+ * ultimately its default. So `required` is dropped wherever a key can fall
108
+ * through (see {@link withoutRequired}), even against a schema still carrying
109
+ * the top-level `required` that `sdk build` rejects: faulting partial
110
+ * overrides on it is how #389 broke every scenario, and on a nested one how
111
+ * #682 broke a setup UI that spread an object. `additionalProperties` (false
112
+ * by convention) still rejects undeclared keys, and type and value checks
113
+ * still apply to the keys that are present.
114
+ */
115
+ export declare function validatePartialOverride(override: unknown, settingsSchema: JSONSchema7): ErrorObject[] | null;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared Semantic Versioning 2.0.0 pattern. The same regex is enforced by
3
+ * `schema.json` on `PackageDefinition.version`; keeping it in one TypeScript
4
+ * location stops the build path, the `package version` CLI, and the JSON
5
+ * schema from drifting apart.
6
+ *
7
+ * See https://semver.org/spec/v2.0.0.html
8
+ */
9
+ export declare const SEMVER_PATTERN: RegExp;