@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.
- package/LICENSE +93 -0
- package/README.md +38 -2
- package/dist/bundling/logic-exports.d.ts +34 -0
- package/dist/bundling/node-builtins.d.ts +21 -0
- package/dist/bundling/transpiler.d.ts +7 -0
- package/dist/cli.js +27404 -0
- package/dist/client/dev-server.d.ts +59 -0
- package/dist/client/index.d.ts +28 -0
- package/dist/client/stub-services.d.ts +32 -0
- package/dist/client/test-session.d.ts +195 -0
- package/dist/client.js +16920 -0
- package/dist/core/asset-reference-translator.d.ts +46 -0
- package/dist/core/clock.d.ts +57 -0
- package/dist/core/faults.d.ts +65 -0
- package/dist/core/game-settings.d.ts +65 -0
- package/dist/core/history.d.ts +89 -0
- package/dist/core/listen-with-fallback.d.ts +30 -0
- package/dist/core/mutation-queue.d.ts +61 -0
- package/dist/core/package-scenario.d.ts +89 -0
- package/dist/core/participant-registry.d.ts +109 -0
- package/dist/core/pending-changes.d.ts +14 -0
- package/dist/core/protocol.d.ts +83 -0
- package/dist/core/scenario-drafts.d.ts +32 -0
- package/dist/core/session-endpoints.d.ts +108 -0
- package/dist/core/session-gates.d.ts +75 -0
- package/dist/core/session-host.d.ts +94 -0
- package/dist/core/session-refusals.d.ts +56 -0
- package/dist/core/session-rewind.d.ts +32 -0
- package/dist/core/session-roster.d.ts +128 -0
- package/dist/core/session-surfaces.d.ts +32 -0
- package/dist/core/session-ticks.d.ts +18 -0
- package/dist/core/session-timers.d.ts +84 -0
- package/dist/core/session-writes.d.ts +40 -0
- package/dist/core/session.d.ts +385 -0
- package/dist/core/settings-locks.d.ts +22 -0
- package/dist/core/team-names.d.ts +52 -0
- package/dist/core/team-state-store.d.ts +218 -0
- package/dist/core/tick-timer.d.ts +75 -0
- package/dist/dev/blob-links.d.ts +10 -0
- package/dist/dev/console/assets/index-DgFglsnA.js +204 -0
- package/dist/dev/console/index.html +12 -0
- package/dist/dev/console-path.d.ts +19 -0
- package/dist/dev/lockfile.d.ts +124 -0
- package/dist/dev/package-watcher.d.ts +21 -0
- package/dist/dev/routes.d.ts +67 -0
- package/dist/dev/shell.d.ts +260 -0
- package/dist/dev/surfaces.d.ts +41 -0
- package/dist/dev/tools-identity.d.ts +23 -0
- package/dist/dev/view/batch.d.ts +172 -0
- package/dist/dev/view/commands.d.ts +75 -0
- package/dist/dev/view/route.d.ts +58 -0
- package/dist/dev/view/view.d.ts +78 -0
- package/dist/dev/view/viewer.d.ts +32 -0
- package/dist/discovery/config.d.ts +9 -0
- package/dist/discovery/manifest-paths.d.ts +21 -0
- package/dist/discovery/removed-fields.d.ts +90 -0
- package/dist/docs/api/deck.md +386 -0
- package/dist/docs/api/index.md +67 -0
- package/dist/docs/api/sdk-commands.md +286 -0
- package/dist/docs/api/sdk-e2e.md +433 -0
- package/dist/docs/api/sdk-projection.md +207 -0
- package/dist/docs/api/sdk-testing.md +214 -0
- package/dist/docs/api/sdk-tools-client.md +560 -0
- package/dist/docs/api/sdk-ui-testing.md +231 -0
- package/dist/docs/api/sdk-ui.md +1269 -0
- package/dist/docs/api/sdk.md +2140 -0
- package/dist/docs/changelog-0.x.md +1156 -0
- package/dist/docs/changelog.md +241 -0
- package/dist/docs/cli-and-dev-server.md +217 -0
- package/dist/docs/cli-error-codes.md +156 -0
- package/dist/docs/cli-reference.md +2489 -0
- package/dist/docs/cli-simulation-testing.md +222 -0
- package/dist/docs/concepts/index.md +46 -0
- package/dist/docs/concepts/terminology.md +322 -0
- package/dist/docs/environment-variables.md +102 -0
- package/dist/docs/getting-started.md +145 -0
- package/dist/docs/guides/ai-facilitation.md +220 -0
- package/dist/docs/guides/capabilities.md +460 -0
- package/dist/docs/guides/endpoints.md +335 -0
- package/dist/docs/guides/engine-testing.md +477 -0
- package/dist/docs/guides/engine.md +527 -0
- package/dist/docs/guides/file-handling.md +405 -0
- package/dist/docs/guides/games.md +176 -0
- package/dist/docs/guides/global-settings.md +94 -0
- package/dist/docs/guides/guide.md +123 -0
- package/dist/docs/guides/hooks.md +183 -0
- package/dist/docs/guides/index.md +51 -0
- package/dist/docs/guides/internationalization.md +288 -0
- package/dist/docs/guides/llm-integration.md +635 -0
- package/dist/docs/guides/multi-team-games.md +586 -0
- package/dist/docs/guides/patterns.md +391 -0
- package/dist/docs/guides/presentation.md +196 -0
- package/dist/docs/guides/production-constraints.md +130 -0
- package/dist/docs/guides/scenario-editor.md +143 -0
- package/dist/docs/guides/scenarios.md +515 -0
- package/dist/docs/guides/session.md +972 -0
- package/dist/docs/guides/settings.md +458 -0
- package/dist/docs/guides/setup.md +193 -0
- package/dist/docs/guides/speech-generation.md +233 -0
- package/dist/docs/guides/starter-game.md +164 -0
- package/dist/docs/guides/testing.md +577 -0
- package/dist/docs/guides/tick-controller.md +569 -0
- package/dist/docs/guides/type-safety.md +516 -0
- package/dist/docs/guides/ui.md +1389 -0
- package/dist/docs/guides/upgrading.md +636 -0
- package/dist/docs/guides/validators.md +217 -0
- package/dist/docs/guides/waiting-room.md +244 -0
- package/dist/docs/index.md +41 -0
- package/dist/docs/recipes/act-on-the-session-from-an-endpoint.md +95 -0
- package/dist/docs/recipes/adapt-a-game-for-walkthroughs.md +133 -0
- package/dist/docs/recipes/adapt-ui-for-observers.md +74 -0
- package/dist/docs/recipes/call-endpoint-from-ui.md +109 -0
- package/dist/docs/recipes/check-a-package-from-a-script.md +117 -0
- package/dist/docs/recipes/create-capability.md +66 -0
- package/dist/docs/recipes/create-endpoint.md +127 -0
- package/dist/docs/recipes/create-engine.md +111 -0
- package/dist/docs/recipes/create-game.md +70 -0
- package/dist/docs/recipes/create-guide.md +75 -0
- package/dist/docs/recipes/create-hook.md +80 -0
- package/dist/docs/recipes/create-presentation.md +142 -0
- package/dist/docs/recipes/create-scenario-editor.md +102 -0
- package/dist/docs/recipes/create-scenario.md +98 -0
- package/dist/docs/recipes/create-session-ui.md +116 -0
- package/dist/docs/recipes/create-settings.md +88 -0
- package/dist/docs/recipes/create-setup.md +115 -0
- package/dist/docs/recipes/create-tick-controller.md +65 -0
- package/dist/docs/recipes/create-user-interface.md +96 -0
- package/dist/docs/recipes/create-validator.md +67 -0
- package/dist/docs/recipes/create-waiting-room-ui.md +109 -0
- package/dist/docs/recipes/declare-api-uses.md +67 -0
- package/dist/docs/recipes/design-state-for-concurrent-writes.md +96 -0
- package/dist/docs/recipes/distribute-package.md +80 -0
- package/dist/docs/recipes/e2e-testing.md +116 -0
- package/dist/docs/recipes/end-game-on-condition.md +154 -0
- package/dist/docs/recipes/fix-duplicate-packages.md +101 -0
- package/dist/docs/recipes/index.md +86 -0
- package/dist/docs/recipes/make-an-endpoint-external.md +101 -0
- package/dist/docs/recipes/negotiate-across-teams.md +164 -0
- package/dist/docs/recipes/observe-other-teams-state.md +119 -0
- package/dist/docs/recipes/publish-a-package.md +139 -0
- package/dist/docs/recipes/remember-a-viewers-choice.md +55 -0
- package/dist/docs/recipes/review-a-past-day.md +73 -0
- package/dist/docs/recipes/share-assets-across-scenarios.md +120 -0
- package/dist/docs/recipes/share-logic-between-engine-and-ui.md +130 -0
- package/dist/docs/recipes/show-all-teams-participants.md +109 -0
- package/dist/docs/recipes/start-from-an-empty-package.md +169 -0
- package/dist/docs/recipes/take-a-file-in-an-endpoint.md +82 -0
- package/dist/docs/recipes/test-a-multi-role-game.md +51 -0
- package/dist/docs/recipes/test-user-interface.md +95 -0
- package/dist/docs/recipes/test-with-engine.md +115 -0
- package/dist/docs/recipes/upload-and-display-files.md +148 -0
- package/dist/docs/recipes/use-request-play.md +65 -0
- package/dist/docs/recipes/use-request-tick.md +75 -0
- package/dist/docs/troubleshooting.md +816 -0
- package/dist/execution/blob-inputs.d.ts +57 -0
- package/dist/execution/bundle-reload.d.ts +42 -0
- package/dist/execution/config-resolver.d.ts +127 -0
- package/dist/execution/configuration-builder.d.ts +66 -0
- package/dist/execution/context-composition.d.ts +161 -0
- package/dist/execution/endpoint-actions.d.ts +9 -0
- package/dist/execution/endpoint-payloads.d.ts +32 -0
- package/dist/execution/endpoint-runner.d.ts +129 -0
- package/dist/execution/engine-state.d.ts +40 -0
- package/dist/execution/executor-callbacks.d.ts +56 -0
- package/dist/execution/executor.d.ts +436 -0
- package/dist/execution/gates.d.ts +45 -0
- package/dist/execution/hook-chain.d.ts +25 -0
- package/dist/execution/logic-calls.d.ts +190 -0
- package/dist/execution/logic-failure.d.ts +84 -0
- package/dist/execution/logic-loader.d.ts +54 -0
- package/dist/execution/logic-result.d.ts +76 -0
- package/dist/execution/tick-controller-call.d.ts +32 -0
- package/dist/execution/types.d.ts +48 -0
- package/dist/generation/ts-type.d.ts +39 -0
- package/dist/guide/locale.d.ts +12 -0
- package/dist/guide/video-registry.d.ts +42 -0
- package/dist/help-examples.d.ts +125 -0
- package/dist/host/adapter.d.ts +67 -0
- package/dist/host/host-channel.d.ts +222 -0
- package/dist/host/index.d.ts +20 -0
- package/dist/host/protocol.d.ts +783 -0
- package/dist/host/surfaces.d.ts +42 -0
- package/dist/host/theme.d.ts +55 -0
- package/dist/host.js +583 -0
- package/dist/prompts/index.d.ts +7 -0
- package/dist/prompts/schema-builder.d.ts +29 -0
- package/dist/prompts/types.d.ts +108 -0
- package/dist/prompts/validators.d.ts +32 -0
- package/dist/runtime/capability-scope.d.ts +6 -0
- package/dist/runtime/context-merge.d.ts +29 -0
- package/dist/runtime/context-projection.d.ts +41 -0
- package/dist/runtime/guarded-callbacks.d.ts +15 -0
- package/dist/runtime/index.d.ts +27 -0
- package/dist/runtime/manifest-version.d.ts +55 -0
- package/dist/runtime/tick-validation.d.ts +25 -0
- package/dist/runtime.js +346 -0
- package/dist/schema.json +1546 -0
- package/dist/server/vite-plugin.d.ts +46 -0
- package/dist/services/tts/client.d.ts +51 -0
- package/dist/services/tts/elevenlabs.d.ts +24 -0
- package/dist/services/tts/types.d.ts +44 -0
- package/dist/storage/asset-resolver.d.ts +49 -0
- package/dist/storage/blob-store.d.ts +41 -0
- package/dist/templates/endpoint/logic.test.ts.liquid +61 -0
- package/dist/templates/endpoint/logic.ts.liquid +25 -0
- package/dist/templates/engine/init.json.liquid +7 -0
- package/dist/templates/engine/logic-aggregate.test.ts.liquid +90 -0
- package/dist/templates/engine/logic-aggregate.ts.liquid +46 -0
- package/dist/templates/engine/logic.test.ts.liquid +61 -0
- package/dist/templates/engine/logic.ts.liquid +32 -0
- package/dist/templates/engine/run.json.liquid +7 -0
- package/dist/templates/guide/01-at-a-glance.md.liquid +19 -0
- package/dist/templates/guide/02-preparation.md.liquid +18 -0
- package/dist/templates/guide/03-running-the-session.md.liquid +37 -0
- package/dist/templates/hook/logic.test.ts.liquid +46 -0
- package/dist/templates/hook/logic.ts.liquid +12 -0
- package/dist/templates/package/CLAUDE.md.template +338 -0
- package/dist/templates/package/DESIGN.md.liquid +144 -0
- package/dist/templates/package/README.md.liquid +143 -0
- package/dist/templates/package/claude/rules/workflow-create-capability.md +26 -0
- package/dist/templates/package/claude/rules/workflow-create-endpoint.md +35 -0
- package/dist/templates/package/claude/rules/workflow-create-engine.md +35 -0
- package/dist/templates/package/claude/rules/workflow-create-guide.md +40 -0
- package/dist/templates/package/claude/rules/workflow-create-presentation.md +37 -0
- package/dist/templates/package/claude/rules/workflow-create-user-interface.md +31 -0
- package/dist/templates/package/claude/rules/workflow-publish-package.md +54 -0
- package/dist/templates/package/claude/rules/workflow-test-engine-or-ui.md +30 -0
- package/dist/templates/package/claude/rules/workflow-update-sdk-version.md +43 -0
- package/dist/templates/package/claude/settings.json.template +16 -0
- package/dist/templates/package/gitignore.template +15 -0
- package/dist/templates/package/global-setup.ts.template +21 -0
- package/dist/templates/package/globals.d.ts.template +2 -0
- package/dist/templates/package/oxfmtrc.json.template +14 -0
- package/dist/templates/package/oxlintrc.json.template +238 -0
- package/dist/templates/package/package.json.liquid +65 -0
- package/dist/templates/package/playwright.config.ts.liquid +19 -0
- package/dist/templates/package/pnpm-workspace.yaml.template +27 -0
- package/dist/templates/package/test-setup.ts.liquid +7 -0
- package/dist/templates/package/tsconfig.json.liquid +15 -0
- package/dist/templates/package/vite.config.ts.liquid +19 -0
- package/dist/templates/package/vitest.config.ts.liquid +25 -0
- package/dist/templates/package/vitest.engine.config.ts.liquid +12 -0
- package/dist/templates/presentation/index.html.liquid +20 -0
- package/dist/templates/presentation/src/App.tsx.liquid +49 -0
- package/dist/templates/presentation/src/Slides.tsx.liquid +81 -0
- package/dist/templates/presentation/src/i18n.ts.liquid +54 -0
- package/dist/templates/presentation/src/main.tsx.liquid +14 -0
- package/dist/templates/scenario_editor/src/App.test.tsx.liquid +30 -0
- package/dist/templates/scenario_editor/src/App.tsx.liquid +95 -0
- package/dist/templates/scenario_editor/src/i18n.ts.liquid +44 -0
- package/dist/templates/session/src/App.test.tsx.liquid +60 -0
- package/dist/templates/session/src/App.tsx.liquid +128 -0
- package/dist/templates/session/src/i18n.ts.liquid +53 -0
- package/dist/templates/session/src/main.tsx.liquid +48 -0
- package/dist/templates/session/src/theme.ts.liquid +46 -0
- package/dist/templates/settings-editor/index.html.liquid +12 -0
- package/dist/templates/settings-editor/src/main.tsx.liquid +48 -0
- package/dist/templates/settings-editor/src/theme.ts.liquid +24 -0
- package/dist/templates/setup/src/App.test.tsx.liquid +39 -0
- package/dist/templates/setup/src/App.tsx.liquid +102 -0
- package/dist/templates/setup/src/i18n.ts.liquid +47 -0
- package/dist/templates/starter-game/capabilities/briefing/capability.sdk.json +18 -0
- package/dist/templates/starter-game/capabilities/plan/capability.sdk.json +17 -0
- package/dist/templates/starter-game/capabilities/results/capability.sdk.json +61 -0
- package/dist/templates/starter-game/capabilities/roles/capability.sdk.json +17 -0
- package/dist/templates/starter-game/capabilities/weather/capability.sdk.json +23 -0
- package/dist/templates/starter-game/engine/defaults.ts +81 -0
- package/dist/templates/starter-game/engine/engine.sdk.json +12 -0
- package/dist/templates/starter-game/engine/logic.test.ts +221 -0
- package/dist/templates/starter-game/engine/logic.ts +149 -0
- package/dist/templates/starter-game/engine/test-helpers.ts +74 -0
- package/dist/templates/starter-game/engine/types.ts +139 -0
- package/dist/templates/starter-game/guide/content/en/01-at-a-glance.md +51 -0
- package/dist/templates/starter-game/guide/content/en/02-preparation.md +35 -0
- package/dist/templates/starter-game/guide/content/en/03-running-the-day.md +58 -0
- package/dist/templates/starter-game/guide/guide.sdk.json +10 -0
- package/dist/templates/starter-game/guide/guide.test.ts +108 -0
- package/dist/templates/starter-game/hooks/assignproducts/defaults.ts +37 -0
- package/dist/templates/starter-game/hooks/assignproducts/hook.sdk.json +13 -0
- package/dist/templates/starter-game/hooks/assignproducts/logic/logic.test.ts +77 -0
- package/dist/templates/starter-game/hooks/assignproducts/logic/logic.ts +47 -0
- package/dist/templates/starter-game/hooks/assignproducts/types.ts +55 -0
- package/dist/templates/starter-game/package.json +68 -0
- package/dist/templates/starter-game/playwright.config.ts +19 -0
- package/dist/templates/starter-game/scenarios/heatwave/scenario.sdk.json +20 -0
- package/dist/templates/starter-game/scenarios/ordinary_week/scenario.sdk.json +12 -0
- package/dist/templates/starter-game/seriousgaming.sdk.json +23 -0
- package/dist/templates/starter-game/session/defaults.ts +80 -0
- package/dist/templates/starter-game/session/index.html +12 -0
- package/dist/templates/starter-game/session/session.sdk.json +11 -0
- package/dist/templates/starter-game/session/src/App.test.tsx +307 -0
- package/dist/templates/starter-game/session/src/App.tsx +309 -0
- package/dist/templates/starter-game/session/src/Section.tsx +37 -0
- package/dist/templates/starter-game/session/src/TeamDoor.tsx +96 -0
- package/dist/templates/starter-game/session/src/format.ts +8 -0
- package/dist/templates/starter-game/session/src/i18n.ts +51 -0
- package/dist/templates/starter-game/session/src/main.tsx +48 -0
- package/dist/templates/starter-game/session/src/theme.ts +45 -0
- package/dist/templates/starter-game/session/types.ts +135 -0
- package/dist/templates/starter-game/settings/engine/settings.sdk.json +50 -0
- package/dist/templates/starter-game/settings/menu/settings.sdk.json +78 -0
- package/dist/templates/starter-game/settings/session/settings.sdk.json +23 -0
- package/dist/templates/starter-game/settings/ui/settings.sdk.json +25 -0
- package/dist/templates/starter-game/test-setup.ts +7 -0
- package/dist/templates/starter-game/testing/e2e/game.spec.ts +139 -0
- package/dist/templates/starter-game/testing/e2e/global-setup.ts +21 -0
- package/dist/templates/starter-game/testing/engine/game.engine.test.ts +171 -0
- package/dist/templates/starter-game/tsconfig.json +19 -0
- package/dist/templates/starter-game/ui/defaults.ts +60 -0
- package/dist/templates/starter-game/ui/index.html +12 -0
- package/dist/templates/starter-game/ui/src/App.test.tsx +138 -0
- package/dist/templates/starter-game/ui/src/App.tsx +175 -0
- package/dist/templates/starter-game/ui/src/DayBar.test.tsx +78 -0
- package/dist/templates/starter-game/ui/src/DayBar.tsx +72 -0
- package/dist/templates/starter-game/ui/src/HistoryPanel.test.tsx +74 -0
- package/dist/templates/starter-game/ui/src/HistoryPanel.tsx +120 -0
- package/dist/templates/starter-game/ui/src/MakeRow.tsx +129 -0
- package/dist/templates/starter-game/ui/src/Section.tsx +37 -0
- package/dist/templates/starter-game/ui/src/ThemeToggle.tsx +49 -0
- package/dist/templates/starter-game/ui/src/TodayPanel.test.tsx +179 -0
- package/dist/templates/starter-game/ui/src/TodayPanel.tsx +92 -0
- package/dist/templates/starter-game/ui/src/YesterdayPanel.tsx +142 -0
- package/dist/templates/starter-game/ui/src/format.ts +12 -0
- package/dist/templates/starter-game/ui/src/i18n.ts +95 -0
- package/dist/templates/starter-game/ui/src/main.tsx +48 -0
- package/dist/templates/starter-game/ui/src/menu.ts +18 -0
- package/dist/templates/starter-game/ui/src/test-helpers.ts +58 -0
- package/dist/templates/starter-game/ui/src/theme.ts +45 -0
- package/dist/templates/starter-game/ui/src/writes.ts +43 -0
- package/dist/templates/starter-game/ui/types.ts +137 -0
- package/dist/templates/starter-game/ui/ui.sdk.json +11 -0
- package/dist/templates/starter-game/validators/capacity/defaults.ts +37 -0
- package/dist/templates/starter-game/validators/capacity/logic/logic.test.ts +96 -0
- package/dist/templates/starter-game/validators/capacity/logic/logic.ts +45 -0
- package/dist/templates/starter-game/validators/capacity/types.ts +55 -0
- package/dist/templates/starter-game/validators/capacity/validator.sdk.json +11 -0
- package/dist/templates/starter-game/vite.config.ts +19 -0
- package/dist/templates/starter-game/vitest.config.ts +15 -0
- package/dist/templates/starter-game/vitest.engine.config.ts +19 -0
- package/dist/templates/starter-game/waiting_room/defaults.ts +40 -0
- package/dist/templates/starter-game/waiting_room/index.html +12 -0
- package/dist/templates/starter-game/waiting_room/src/App.test.tsx +102 -0
- package/dist/templates/starter-game/waiting_room/src/App.tsx +194 -0
- package/dist/templates/starter-game/waiting_room/src/i18n.ts +33 -0
- package/dist/templates/starter-game/waiting_room/src/main.tsx +48 -0
- package/dist/templates/starter-game/waiting_room/src/theme.ts +45 -0
- package/dist/templates/starter-game/waiting_room/types.ts +59 -0
- package/dist/templates/starter-game/waiting_room/waiting_room.sdk.json +10 -0
- package/dist/templates/tick-controller/logic.ts.liquid +8 -0
- package/dist/templates/ui/index.html.liquid +12 -0
- package/dist/templates/ui/src/App.test.tsx.liquid +41 -0
- package/dist/templates/ui/src/App.tsx.liquid +103 -0
- package/dist/templates/ui/src/i18n.ts.liquid +47 -0
- package/dist/templates/ui/src/main.tsx.liquid +48 -0
- package/dist/templates/ui/src/theme.ts.liquid +46 -0
- package/dist/templates/validator/logic.test.ts.liquid +42 -0
- package/dist/templates/validator/logic.ts.liquid +21 -0
- package/dist/templates/waiting-room/index.html.liquid +12 -0
- package/dist/templates/waiting-room/src/App.test.tsx.liquid +57 -0
- package/dist/templates/waiting-room/src/App.tsx.liquid +118 -0
- package/dist/templates/waiting-room/src/i18n.ts.liquid +44 -0
- package/dist/templates/waiting-room/src/main.tsx.liquid +48 -0
- package/dist/templates/waiting-room/src/theme.ts.liquid +46 -0
- package/dist/templating/resource-metadata.d.ts +131 -0
- package/dist/types.d.ts +14 -0
- package/dist/utils/atomic-write.d.ts +40 -0
- package/dist/utils/cli-error.d.ts +64 -0
- package/dist/utils/document-parser-client.d.ts +20 -0
- package/dist/utils/env-loader.d.ts +40 -0
- package/dist/utils/error-codes.d.ts +339 -0
- package/dist/utils/errors.d.ts +19 -0
- package/dist/utils/global-settings.d.ts +65 -0
- package/dist/utils/llm-client.d.ts +34 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/output.d.ts +109 -0
- package/dist/utils/platform.d.ts +14 -0
- package/dist/utils/prompt.d.ts +36 -0
- package/dist/utils/real-path.d.ts +6 -0
- package/dist/utils/schema-properties.d.ts +35 -0
- package/dist/validation/ajv.d.ts +17 -0
- package/dist/validation/facilitator-guide-validator.d.ts +27 -0
- package/dist/validation/findings.d.ts +40 -0
- package/dist/validation/game-constraints.d.ts +10 -0
- package/dist/validation/game-validator.d.ts +34 -0
- package/dist/validation/package-validation.d.ts +41 -0
- package/dist/validation/package-validator.d.ts +19 -0
- package/dist/validation/resource-validator.d.ts +79 -0
- package/dist/validation/schema-defaults-validator.d.ts +29 -0
- package/dist/validation/schema-validation.d.ts +115 -0
- package/dist/validation/semver.d.ts +9 -0
- 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
|