@dreamboard-games/cli 0.1.30-alpha.4 → 0.1.30-alpha.40

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 (156) hide show
  1. package/README.md +32 -113
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +2084 -57
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  4. package/dist/agent-verifier/{chunk-XQXDOBYB.mjs → chunk-4I2WWAPK.mjs} +27 -10
  5. package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
  6. package/dist/agent-verifier/{chunk-C3VW3DTA.mjs → chunk-BWBN2TDJ.mjs} +535 -633
  7. package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-TAEQKBJB.mjs → chunk-GWRZRWCF.mjs} +1 -1
  9. package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
  10. package/dist/agent-verifier/chunk-HUBV22JQ.mjs +89 -0
  11. package/dist/agent-verifier/chunk-HUBV22JQ.mjs.map +1 -0
  12. package/dist/agent-verifier/{chunk-MW2QIWWA.mjs → chunk-KAA3B4DI.mjs} +215 -223
  13. package/dist/agent-verifier/chunk-KAA3B4DI.mjs.map +1 -0
  14. package/dist/agent-verifier/{chunk-27EEIZCI.mjs → chunk-KDAQ4CZY.mjs} +34 -27
  15. package/dist/agent-verifier/chunk-KDAQ4CZY.mjs.map +1 -0
  16. package/dist/agent-verifier/{chunk-IAYRNVUC.mjs → chunk-LMW66VBH.mjs} +2 -13
  17. package/dist/agent-verifier/{chunk-IAYRNVUC.mjs.map → chunk-LMW66VBH.mjs.map} +1 -1
  18. package/dist/agent-verifier/{chunk-776W3UGV.mjs → chunk-LROY5SN2.mjs} +7 -45
  19. package/dist/agent-verifier/chunk-LROY5SN2.mjs.map +1 -0
  20. package/dist/agent-verifier/{chunk-H76MT5UR.mjs → chunk-M7UVBANQ.mjs} +2 -1
  21. package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
  22. package/dist/agent-verifier/{chunk-5NYBTZB4.mjs → chunk-MIRGCMUC.mjs} +112 -26
  23. package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
  24. package/dist/agent-verifier/{chunk-NAK77WXW.mjs → chunk-MYMVXTZT.mjs} +4 -5
  25. package/dist/agent-verifier/chunk-MYMVXTZT.mjs.map +1 -0
  26. package/dist/agent-verifier/chunk-OJFZVGEL.mjs +492 -0
  27. package/dist/agent-verifier/chunk-OJFZVGEL.mjs.map +1 -0
  28. package/dist/agent-verifier/{chunk-XKCJBIRY.mjs → chunk-QD4SQNUP.mjs} +2 -2
  29. package/dist/agent-verifier/{chunk-QBAF7EYR.mjs → chunk-TTB7AIHZ.mjs} +4 -4
  30. package/dist/agent-verifier/{chunk-QBAF7EYR.mjs.map → chunk-TTB7AIHZ.mjs.map} +1 -1
  31. package/dist/agent-verifier/{chunk-F2DIOJJZ.mjs → chunk-XCQQIPCO.mjs} +5 -46
  32. package/dist/agent-verifier/chunk-XCQQIPCO.mjs.map +1 -0
  33. package/dist/agent-verifier/{global-config-NYCSCAUI.mjs → global-config-2NUESNEQ.mjs} +5 -5
  34. package/dist/agent-verifier/{keychain-backend-A3MRWLPF.mjs → keychain-backend-FF4I6ODB.mjs} +11 -6
  35. package/dist/agent-verifier/keychain-backend-FF4I6ODB.mjs.map +1 -0
  36. package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs → local-files-OF4QFISU.mjs} +8 -8
  37. package/dist/agent-verifier/{chunk-UIOLGH4A.mjs → local-typecheck-DHVLM37Z.mjs} +4 -4
  38. package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
  39. package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs → materialize-workspace-JBDL6LF4.mjs} +22 -22
  40. package/dist/agent-verifier/materialize-workspace-JBDL6LF4.mjs.map +1 -0
  41. package/dist/agent-verifier/{chunk-Z6OZWUIZ.mjs → reducer-bundle-preflight-GLUJKTWU.mjs} +75 -24
  42. package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
  43. package/dist/agent-verifier/{chunk-YDIOW2BO.mjs → reducer-contract-preflight-WVQQPW5F.mjs} +7 -6
  44. package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
  45. package/dist/agent-verifier/{chunk-ON62IGWK.mjs → reducer-native-test-harness-XQUPIT5D.mjs} +480 -703
  46. package/dist/agent-verifier/reducer-native-test-harness-XQUPIT5D.mjs.map +1 -0
  47. package/dist/agent-verifier/static-scaffold-U5DXE23S.mjs +24 -0
  48. package/dist/agent-verifier/{workspace-codegen-WPZHMATU.mjs → workspace-codegen-SPPVHURX.mjs} +3 -3
  49. package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs → workspace-dependencies-5HEEKZFP.mjs} +5 -3
  50. package/dist/authoring-compatibility-internal.js +12 -0
  51. package/dist/chunk-5IYJOVUA.js +3902 -0
  52. package/dist/chunk-5IYJOVUA.js.map +1 -0
  53. package/dist/chunk-6NYVJYN4.js +313 -0
  54. package/dist/chunk-6NYVJYN4.js.map +1 -0
  55. package/dist/chunk-EQNBQVIW.js +204 -0
  56. package/dist/chunk-EQNBQVIW.js.map +1 -0
  57. package/dist/{chunk-M4SCKH5M.js → chunk-USZAPMQ4.js} +2488 -4993
  58. package/dist/chunk-USZAPMQ4.js.map +1 -0
  59. package/dist/{global-config-YBFEGJQG.js → global-config-RBMW7IVA.js} +3 -2
  60. package/dist/index.js +3099 -6188
  61. package/dist/index.js.map +1 -1
  62. package/dist/internal.js +35 -9
  63. package/dist/internal.js.map +1 -1
  64. package/dist/{keychain-backend-JHTXAKWC.js → keychain-backend-FSNTNTZE.js} +11 -6
  65. package/dist/keychain-backend-FSNTNTZE.js.map +1 -0
  66. package/package.json +9 -19
  67. package/release/authoring-release-set.json +38 -0
  68. package/skills/dreamboard/SKILL.md +32 -30
  69. package/skills/dreamboard/references/building-your-first-game.md +16 -16
  70. package/skills/dreamboard/references/cli.md +54 -54
  71. package/skills/dreamboard/references/manifest-authoring.md +11 -3
  72. package/skills/dreamboard/references/quickstart.md +19 -16
  73. package/skills/dreamboard/references/testing.md +6 -13
  74. package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +0 -1
  75. package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +0 -1
  76. package/dist/agent-verifier/chunk-776W3UGV.mjs.map +0 -1
  77. package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +0 -1
  78. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +0 -1
  79. package/dist/agent-verifier/chunk-G42BGGG2.mjs +0 -70
  80. package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +0 -1
  81. package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +0 -1
  82. package/dist/agent-verifier/chunk-IDVQXGAO.mjs +0 -222
  83. package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +0 -1
  84. package/dist/agent-verifier/chunk-JO5AMVZU.mjs +0 -1744
  85. package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +0 -1
  86. package/dist/agent-verifier/chunk-KDBSVLCF.mjs +0 -624
  87. package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +0 -1
  88. package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +0 -1
  89. package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +0 -1
  90. package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +0 -1
  91. package/dist/agent-verifier/chunk-QZH6IEZS.mjs +0 -39
  92. package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +0 -1
  93. package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +0 -1
  94. package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +0 -1
  95. package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +0 -1
  96. package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +0 -1
  97. package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +0 -1
  98. package/dist/agent-verifier/compile-576O7TYP.mjs +0 -312
  99. package/dist/agent-verifier/compile-576O7TYP.mjs.map +0 -1
  100. package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +0 -1
  101. package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +0 -10
  102. package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +0 -1
  103. package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +0 -20
  104. package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +0 -11
  105. package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +0 -50
  106. package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +0 -27
  107. package/dist/agent-verifier/sync-C6S3OGCD.mjs +0 -588
  108. package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +0 -1
  109. package/dist/agent-verifier/test-Y5UGQV7J.mjs +0 -353
  110. package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +0 -1
  111. package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +0 -1
  112. package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +0 -1
  113. package/dist/chunk-3NRROR4P.js +0 -432
  114. package/dist/chunk-3NRROR4P.js.map +0 -1
  115. package/dist/chunk-M4SCKH5M.js.map +0 -1
  116. package/dist/dev-host/components/drawer.tsx +0 -132
  117. package/dist/dev-host/components/input.tsx +0 -21
  118. package/dist/dev-host/dev-api-proxy-plugin.ts +0 -328
  119. package/dist/dev-host/dev-author-dom-warnings.ts +0 -100
  120. package/dist/dev-host/dev-diagnostics.ts +0 -62
  121. package/dist/dev-host/dev-fallback-stylesheet.ts +0 -53
  122. package/dist/dev-host/dev-hmr-guard-plugin.ts +0 -47
  123. package/dist/dev-host/dev-host-controller.ts +0 -674
  124. package/dist/dev-host/dev-host-player-query.ts +0 -17
  125. package/dist/dev-host/dev-host-session-transport.ts +0 -52
  126. package/dist/dev-host/dev-host-storage.ts +0 -56
  127. package/dist/dev-host/dev-log-relay-plugin.ts +0 -510
  128. package/dist/dev-host/dev-runtime-config.ts +0 -14
  129. package/dist/dev-host/dev-runtime-platform.ts +0 -335
  130. package/dist/dev-host/dev-virtual-modules-plugin.ts +0 -64
  131. package/dist/dev-host/host-main.css +0 -224
  132. package/dist/dev-host/host-main.tsx +0 -948
  133. package/dist/dev-host/index.html +0 -56
  134. package/dist/dev-host/lib/utils.ts +0 -6
  135. package/dist/dev-host/plugin-main.ts +0 -61
  136. package/dist/dev-host/plugin.html +0 -24
  137. package/dist/dev-host/shared-styles.css +0 -144
  138. package/dist/dev-host/start-dev-server.ts +0 -140
  139. package/dist/dev-host/virtual-modules.d.ts +0 -27
  140. package/dist/global-config-YBFEGJQG.js.map +0 -1
  141. package/dist/keychain-backend-JHTXAKWC.js.map +0 -1
  142. package/skills/dreamboard/scripts/events-extract.mjs +0 -218
  143. /package/dist/agent-verifier/{chunk-XKCJBIRY.mjs.map → chunk-QD4SQNUP.mjs.map} +0 -0
  144. /package/dist/agent-verifier/{global-config-NYCSCAUI.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
  145. /package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs.map → local-files-OF4QFISU.mjs.map} +0 -0
  146. /package/dist/agent-verifier/{local-typecheck-2JWG5IGL.mjs.map → static-scaffold-U5DXE23S.mjs.map} +0 -0
  147. /package/dist/agent-verifier/{reducer-bundle-preflight-7NYZF5ZT.mjs.map → workspace-codegen-SPPVHURX.mjs.map} +0 -0
  148. /package/dist/agent-verifier/{reducer-contract-preflight-COD2CO22.mjs.map → workspace-dependencies-5HEEKZFP.mjs.map} +0 -0
  149. /package/dist/{agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map → authoring-compatibility-internal.js.map} +0 -0
  150. /package/dist/{agent-verifier/static-scaffold-JBUE3ROP.mjs.map → global-config-RBMW7IVA.js.map} +0 -0
  151. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.framework.json +0 -0
  152. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.json +0 -0
  153. /package/{dist/scaffold → scaffold}/assets/static/ui/index.tsx +0 -0
  154. /package/{dist/scaffold → scaffold}/assets/static/ui/style.css +0 -0
  155. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.framework.json +0 -0
  156. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.json +0 -0
package/dist/internal.js CHANGED
@@ -1,30 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CONFIG_FLAG_ARGS,
4
- applyWorkspaceCodegen,
5
4
  configureClient,
6
- configurePlaywrightBrowsersPath,
7
5
  ensureReducerNativeTestingFiles,
8
6
  findCompiledResultsForAuthoringState,
9
- loadManifest,
10
- loadProjectConfig,
11
7
  parseConfigFlags,
12
8
  requireAuth,
13
9
  resolveConfig,
14
10
  resolveProjectContext,
11
+ shortHash
12
+ } from "./chunk-5IYJOVUA.js";
13
+ import {
14
+ applyWorkspaceCodegen,
15
+ loadManifest,
16
+ loadProjectConfig,
17
+ materializeWorkspaceProject,
15
18
  setLatestCompileAttempt,
16
- shortHash,
17
19
  updateProjectState,
18
20
  writeSnapshot
19
- } from "./chunk-M4SCKH5M.js";
21
+ } from "./chunk-USZAPMQ4.js";
20
22
  import {
21
- ENVIRONMENT_CONFIGS,
22
23
  getStoredSession,
23
- loadGlobalConfig,
24
+ loadGlobalConfig
25
+ } from "./chunk-6NYVJYN4.js";
26
+ import {
27
+ ENVIRONMENT_CONFIGS,
24
28
  readJsonFile,
25
29
  writeJsonFile
26
- } from "./chunk-3NRROR4P.js";
30
+ } from "./chunk-EQNBQVIW.js";
27
31
  import "./chunk-2H7UOFLK.js";
32
+
33
+ // src/ui/playwright-runner.ts
34
+ import os from "os";
35
+ import path from "path";
36
+ function configurePlaywrightBrowsersPath() {
37
+ if (process.env.PLAYWRIGHT_BROWSERS_PATH) {
38
+ return;
39
+ }
40
+ const runtimeHome = process.env.HOME;
41
+ let realHome;
42
+ try {
43
+ realHome = os.userInfo().homedir;
44
+ } catch {
45
+ return;
46
+ }
47
+ if (!runtimeHome || path.resolve(runtimeHome) === path.resolve(realHome)) {
48
+ return;
49
+ }
50
+ const browserCachePath = process.platform === "darwin" ? path.join(realHome, "Library", "Caches", "ms-playwright") : process.platform === "win32" ? path.join(realHome, "AppData", "Local", "ms-playwright") : path.join(realHome, ".cache", "ms-playwright");
51
+ process.env.PLAYWRIGHT_BROWSERS_PATH = browserCachePath;
52
+ }
28
53
  export {
29
54
  CONFIG_FLAG_ARGS,
30
55
  ENVIRONMENT_CONFIGS,
@@ -37,6 +62,7 @@ export {
37
62
  loadGlobalConfig,
38
63
  loadManifest,
39
64
  loadProjectConfig,
65
+ materializeWorkspaceProject,
40
66
  parseConfigFlags,
41
67
  readJsonFile,
42
68
  requireAuth,
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/ui/playwright-runner.ts"],"sourcesContent":["import os from \"node:os\";\nimport path from \"node:path\";\nimport type { ResolvedConfig } from \"../types.js\";\nimport { createUserSessionManager } from \"../auth/user-session-manager.js\";\nimport { resolveLocalHarnessAccessToken } from \"../config/local-harness-auth.js\";\n\n/**\n * Browser test runner helpers shared with reducer-native-test-harness (browser runner).\n * Screenshot / JSON scenario navigation helpers lived in the deleted `run` command.\n */\nexport function configurePlaywrightBrowsersPath(): void {\n if (process.env.PLAYWRIGHT_BROWSERS_PATH) {\n return;\n }\n\n const runtimeHome = process.env.HOME;\n let realHome: string;\n try {\n realHome = os.userInfo().homedir;\n } catch {\n return;\n }\n\n if (!runtimeHome || path.resolve(runtimeHome) === path.resolve(realHome)) {\n return;\n }\n\n const browserCachePath =\n process.platform === \"darwin\"\n ? path.join(realHome, \"Library\", \"Caches\", \"ms-playwright\")\n : process.platform === \"win32\"\n ? path.join(realHome, \"AppData\", \"Local\", \"ms-playwright\")\n : path.join(realHome, \".cache\", \"ms-playwright\");\n\n process.env.PLAYWRIGHT_BROWSERS_PATH = browserCachePath;\n}\n\nexport async function buildBrowserAuthInitScript(\n config: ResolvedConfig,\n): Promise<string | null> {\n const resolvedToken =\n resolveLocalHarnessAccessToken(config) ??\n (await createUserSessionManager(config).resolveApiToken())?.token;\n if (!resolvedToken) return null;\n\n return `(function(){localStorage.setItem('dreamboard_auth_token',${JSON.stringify(resolvedToken)});})();`;\n}\n\nexport async function waitForGameReady(\n page: import(\"playwright\").Page,\n timeoutMs = 60000,\n): Promise<void> {\n await page.waitForSelector('iframe[title=\"Game UI Plugin\"]', {\n timeout: timeoutMs,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AASV,SAAS,kCAAwC;AACtD,MAAI,QAAQ,IAAI,0BAA0B;AACxC;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,IAAI;AAChC,MAAI;AACJ,MAAI;AACF,eAAW,GAAG,SAAS,EAAE;AAAA,EAC3B,QAAQ;AACN;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,QAAQ,GAAG;AACxE;AAAA,EACF;AAEA,QAAM,mBACJ,QAAQ,aAAa,WACjB,KAAK,KAAK,UAAU,WAAW,UAAU,eAAe,IACxD,QAAQ,aAAa,UACnB,KAAK,KAAK,UAAU,WAAW,SAAS,eAAe,IACvD,KAAK,KAAK,UAAU,UAAU,eAAe;AAErD,UAAQ,IAAI,2BAA2B;AACzC;","names":[]}
@@ -29,11 +29,14 @@ function parsePayload(raw) {
29
29
  if (trimmed.length === 0) return null;
30
30
  try {
31
31
  const parsed = JSON.parse(trimmed);
32
- if (!parsed.accessToken && !parsed.refreshToken) return null;
32
+ const accessToken = parsed.clerkAccessToken ?? parsed.accessToken;
33
+ if (!accessToken && !parsed.refreshToken) return null;
33
34
  return {
34
- accessToken: parsed.accessToken || void 0,
35
+ accessToken: accessToken || void 0,
35
36
  refreshToken: parsed.refreshToken || void 0,
36
- tokenExpiresAt: parsed.tokenExpiresAt || void 0,
37
+ tokenExpiresAt: parsed.clerkAccessExpiresAt || parsed.tokenExpiresAt || void 0,
38
+ dreamboardApiToken: parsed.dreamboardApiToken || void 0,
39
+ dreamboardApiExpiresAt: parsed.dreamboardApiExpiresAt || void 0,
37
40
  clerkOAuthIssuer: parsed.clerkOAuthIssuer || void 0,
38
41
  clerkOAuthClientId: parsed.clerkOAuthClientId || void 0,
39
42
  clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || void 0,
@@ -50,9 +53,11 @@ function writeFull(entry, creds) {
50
53
  );
51
54
  }
52
55
  const payload = {
53
- accessToken: creds.accessToken,
56
+ clerkAccessToken: creds.accessToken,
54
57
  refreshToken: creds.refreshToken,
55
- tokenExpiresAt: creds.tokenExpiresAt,
58
+ clerkAccessExpiresAt: creds.tokenExpiresAt,
59
+ dreamboardApiToken: creds.dreamboardApiToken,
60
+ dreamboardApiExpiresAt: creds.dreamboardApiExpiresAt,
56
61
  clerkOAuthIssuer: creds.clerkOAuthIssuer,
57
62
  clerkOAuthClientId: creds.clerkOAuthClientId,
58
63
  clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,
@@ -132,4 +137,4 @@ export {
132
137
  _setKeyringModuleForTests,
133
138
  tryKeychainBackend
134
139
  };
135
- //# sourceMappingURL=keychain-backend-JHTXAKWC.js.map
140
+ //# sourceMappingURL=keychain-backend-FSNTNTZE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/keychain-backend.ts"],"sourcesContent":["/**\n * OS keychain-backed `CredentialBackend` built on top of `@napi-rs/keyring`.\n *\n * Keychain is an optional storage backend. Users can opt in with\n * `credentialBackend: \"keychain\"` in `~/.dreamboard/config.json`\n * (see `credential-store.ts` for the resolver).\n * When enabled, it gives us:\n * - A refresh token encrypted at rest by the OS (Keychain on macOS,\n * Credential Vault on Windows, Secret Service on Linux).\n * - Protection against other processes running as the same user tailing\n * `~/.dreamboard/auth.json` to scrape the token.\n *\n * This module is loaded optionally: `@napi-rs/keyring` is declared as an\n * `optionalDependencies` entry. If the native binary or OS keyring is\n * unavailable, the resolver falls back to the file backend.\n *\n * One-time migration: when the active backend is keychain and `auth.json` still\n * has tokens, `credential-store.ts` copies them into the keychain, verifies the\n * keychain read, and deletes the file. This is the only path that intentionally\n * mutates both backends.\n */\n\nimport type {\n CredentialBackend,\n Credentials,\n StoredSessionSnapshot,\n} from \"./credential-store.js\";\n\n/** Keychain service id. Shared across all Dreamboard CLI builds. */\nconst KEYCHAIN_SERVICE = \"dreamboard-cli\";\n/**\n * Keychain account id. The `user@host` shape is conventional but we keep\n * it fixed for now because the CLI only cares about \"the session for this\n * OS user\", not per-process sessions.\n */\nconst KEYCHAIN_ACCOUNT = \"session\";\n\ntype EntryInstance = {\n setPassword(value: string): void;\n getPassword(): string | null | undefined;\n deletePassword(): boolean;\n};\n\ntype KeyringModule = {\n Entry: new (service: string, account: string) => EntryInstance;\n};\n\nlet cachedModule: KeyringModule | null | undefined;\n\nasync function loadKeyringModule(): Promise<KeyringModule | null> {\n if (cachedModule !== undefined) return cachedModule;\n try {\n // `@napi-rs/keyring` is an optional dependency. If the native binary is\n // missing on this platform the dynamic import throws; resolver policy in\n // credential-store decides whether that is fatal.\n const mod = (await import(\"@napi-rs/keyring\")) as unknown as KeyringModule;\n cachedModule = mod;\n } catch {\n cachedModule = null;\n }\n return cachedModule;\n}\n\nfunction keychainProbe(entry: EntryInstance): boolean {\n // Some platforms have the module installed but no accessible keyring\n // (e.g. headless Linux without DBus). Touch getPassword to verify we\n // can talk to the service without side effects.\n try {\n entry.getPassword();\n return true;\n } catch {\n return false;\n }\n}\n\ntype KeychainPayload = {\n clerkAccessToken?: string;\n accessToken?: string;\n refreshToken?: string;\n clerkAccessExpiresAt?: string;\n tokenExpiresAt?: string;\n dreamboardApiToken?: string;\n dreamboardApiExpiresAt?: string;\n clerkOAuthIssuer?: string;\n clerkOAuthClientId?: string;\n clerkOAuthTokenUrl?: string;\n environment?: string;\n};\n\nfunction parsePayload(\n raw: string | null | undefined,\n): StoredSessionSnapshot | null {\n if (raw === null || raw === undefined) return null;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n try {\n const parsed = JSON.parse(trimmed) as KeychainPayload;\n const accessToken = parsed.clerkAccessToken ?? parsed.accessToken;\n if (!accessToken && !parsed.refreshToken) return null;\n return {\n accessToken: accessToken || undefined,\n refreshToken: parsed.refreshToken || undefined,\n tokenExpiresAt:\n parsed.clerkAccessExpiresAt || parsed.tokenExpiresAt || undefined,\n dreamboardApiToken: parsed.dreamboardApiToken || undefined,\n dreamboardApiExpiresAt: parsed.dreamboardApiExpiresAt || undefined,\n clerkOAuthIssuer: parsed.clerkOAuthIssuer || undefined,\n clerkOAuthClientId: parsed.clerkOAuthClientId || undefined,\n clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || undefined,\n environment: parsed.environment || undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction writeFull(entry: EntryInstance, creds: Credentials): void {\n if (!creds.accessToken || !creds.refreshToken) {\n throw new Error(\n \"Refusing to persist credentials with an empty accessToken or refreshToken.\",\n );\n }\n const payload: KeychainPayload = {\n clerkAccessToken: creds.accessToken,\n refreshToken: creds.refreshToken,\n clerkAccessExpiresAt: creds.tokenExpiresAt,\n dreamboardApiToken: creds.dreamboardApiToken,\n dreamboardApiExpiresAt: creds.dreamboardApiExpiresAt,\n clerkOAuthIssuer: creds.clerkOAuthIssuer,\n clerkOAuthClientId: creds.clerkOAuthClientId,\n clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,\n environment: creds.environment,\n };\n entry.setPassword(JSON.stringify(payload));\n}\n\nfunction writeAccessOnly(entry: EntryInstance, accessToken: string): void {\n if (!accessToken) {\n throw new Error(\"Refusing to persist an empty access token.\");\n }\n const payload: KeychainPayload = { accessToken };\n entry.setPassword(JSON.stringify(payload));\n}\n\nfunction clear(entry: EntryInstance): void {\n try {\n entry.deletePassword();\n } catch {\n // keyring-rs throws when the entry does not exist. That is fine -\n // Session clearing is idempotent.\n }\n}\n\nexport type KeychainAvailability =\n | { available: true; backend: CredentialBackend }\n | { available: false; reason: string };\n\n/**\n * Attempt to construct a keychain-backed `CredentialBackend`. Returns an\n * `available: false` result (with a reason) if the native module, the\n * OS keyring, or the probe fails.\n */\nexport async function tryKeychainBackend(): Promise<KeychainAvailability> {\n const mod = await loadKeyringModule();\n if (!mod) {\n return {\n available: false,\n reason: \"@napi-rs/keyring is not installed for this platform\",\n };\n }\n\n let entry: EntryInstance;\n try {\n entry = new mod.Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);\n } catch (err) {\n return {\n available: false,\n reason: `Failed to construct keyring entry: ${String((err as Error).message ?? err)}`,\n };\n }\n\n if (!keychainProbe(entry)) {\n return {\n available: false,\n reason: \"OS keyring is not accessible from this process\",\n };\n }\n\n const backend: CredentialBackend = {\n name: \"keychain\",\n async read() {\n try {\n return parsePayload(entry.getPassword());\n } catch (err) {\n const message = String((err as Error).message ?? err);\n // Transient keychain access errors (e.g. Touch ID prompt\n // cancelled) should not surface as \"session wiped\". Treat the\n // unreadable state as \"no session\" so the caller can fall back\n // to prompting for login.\n if (/no matching entry|not found/i.test(message)) {\n return null;\n }\n throw err;\n }\n },\n async writeFull(creds) {\n writeFull(entry, creds);\n },\n async writeAccessOnly(accessToken) {\n writeAccessOnly(entry, accessToken);\n },\n async clear() {\n clear(entry);\n },\n };\n return { available: true, backend };\n}\n\n/**\n * Test-only escape hatch so unit tests can install a fake keyring module\n * without going through the dynamic import cache.\n */\nexport function _setKeyringModuleForTests(mod: KeyringModule | null): void {\n cachedModule = mod;\n}\n\nexport function _resetKeyringModuleForTests(): void {\n cachedModule = undefined;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreamboard-games/cli",
3
- "version": "0.1.30-alpha.4",
3
+ "version": "0.1.30-alpha.40",
4
4
  "description": "Design board games with AI and turn ideas into playable digital prototypes.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,6 +8,10 @@
8
8
  },
9
9
  "exports": {
10
10
  ".": "./dist/index.js",
11
+ "./authoring-compatibility-internal": {
12
+ "types": "./dist/authoring-compatibility-internal.d.ts",
13
+ "default": "./dist/authoring-compatibility-internal.js"
14
+ },
11
15
  "./internal": {
12
16
  "types": "./dist/internal.d.ts",
13
17
  "default": "./dist/internal.js"
@@ -18,6 +22,8 @@
18
22
  "files": [
19
23
  "dist",
20
24
  "README.md",
25
+ "release",
26
+ "scaffold",
21
27
  "skills"
22
28
  ],
23
29
  "keywords": [
@@ -34,29 +40,13 @@
34
40
  "access": "public"
35
41
  },
36
42
  "dependencies": {
37
- "@dreamboard-games/api-client": "0.3.0-alpha.3",
43
+ "@dreamboard-games/api-client": "0.3.0-alpha.4",
38
44
  "@dreamboard-games/gameplay-authority-client": "0.1.0-alpha.1",
39
- "@dreamboard-games/sdk": "0.4.0-alpha.0",
40
- "@dreamboard-games/ui-host-runtime": "0.1.0-alpha.2",
41
- "@tailwindcss/postcss": "^4.3.0",
42
- "@vitejs/plugin-react": "^4.7.0",
43
45
  "citty": "^0.2.2",
44
- "clsx": "^2.1.1",
45
46
  "consola": "^3.4.2",
46
47
  "esbuild": "^0.25.12",
47
- "lucide-react": "^1.17.0",
48
48
  "picocolors": "^1.1.1",
49
- "postcss": "^8.5.15",
50
- "react": "^19.2.7",
51
- "react-dom": "^19.2.7",
52
- "sonner": "^2.0.7",
53
- "tailwind-merge": "^3.6.0",
54
- "tailwindcss": "^4.3.0",
55
- "tw-animate-css": "^1.4.0",
56
- "vaul": "^1.1.2",
57
- "vite": "^5.4.21",
58
- "zod": "4.4.3",
59
- "zustand": "^5.0.14"
49
+ "zod": "4.4.3"
60
50
  },
61
51
  "optionalDependencies": {
62
52
  "@napi-rs/keyring": "^1.3.0"
@@ -0,0 +1,38 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "channel": "public",
4
+ "packages": {
5
+ "cli": {
6
+ "name": "@dreamboard-games/cli",
7
+ "version": "0.1.30-alpha.40"
8
+ },
9
+ "sdk": {
10
+ "name": "@dreamboard-games/sdk",
11
+ "version": "0.4.0-alpha.6"
12
+ },
13
+ "apiClient": {
14
+ "name": "@dreamboard-games/api-client",
15
+ "version": "0.3.0-alpha.4"
16
+ },
17
+ "devHost": {
18
+ "name": "@dreamboard-games/dev-host",
19
+ "version": "0.1.30-alpha.27"
20
+ }
21
+ },
22
+ "protocols": {
23
+ "authoringAdapter": 1,
24
+ "devHost": 1,
25
+ "verifier": 1
26
+ },
27
+ "schemas": {
28
+ "scaffold": 2,
29
+ "manifest": 2,
30
+ "generatedArtifacts": 1
31
+ },
32
+ "registry": {
33
+ "kind": "public-npm",
34
+ "portable": true
35
+ },
36
+ "packageManager": "pnpm@10.4.1",
37
+ "releaseSetId": "sha256:b1ba68e0bd81fbf6c44d39665e716f5fba81342036f04f1d102b12da77c73f1c"
38
+ }
@@ -6,18 +6,18 @@ metadata:
6
6
  tags: [dreamboard, cli, game-dev, board-game, turn-based, multiplayer]
7
7
  ---
8
8
 
9
- # Dreamboard CLI
9
+ # Dreamboard
10
10
 
11
11
  ## Goal
12
12
 
13
- Create and iterate on a Dreamboard game locally, then sync authored changes,
14
- compile, run, and test against the current reducer-native scaffold.
13
+ Create and iterate on a Dreamboard game locally with the Git-native Dreamboard
14
+ command, then verify exact commits, run tests, and use the local dev host.
15
15
 
16
16
  ## Prereqs
17
17
 
18
- - Dreamboard CLI installed and available as `dreamboard`
18
+ - Dreamboard installed and available as `dreamboard`
19
19
  Install with `npm install -g dreamboard`
20
- - Authenticated via `dreamboard login`
20
+ - Authenticated via `dreamboard auth login`
21
21
 
22
22
  ## Buliding Your First Game
23
23
  See [tutorials/building-your-first-game.md](references/building-your-first-game.md)
@@ -60,18 +60,25 @@ The current scaffold centers on these files:
60
60
 
61
61
  Use the commands for different kinds of state:
62
62
 
63
- - `dreamboard sync`
64
- Upload local authored changes and advance the remote authored head. Run this after editing `rule.md`, `manifest.json`, or authored source files that should be part of the next remote build.
65
- - `dreamboard compile`
66
- Compile the current remote authored head. Run this after `sync`, or re-run it after a failed compile when you have not made new authored edits.
67
- - `dreamboard pull`
68
- Reconcile remote authored changes into the current workspace. Run this when someone else advanced the remote authored head or `dreamboard status` shows authored state `behind` or `diverged`.
63
+ - `dreamboard project create <slug> --description <text>`
64
+ Create a project workspace and configure its Git remote.
65
+ - `dreamboard project clone <project>`
66
+ Clone an existing project repository.
67
+ - `dreamboard project status --commit <rev> [--wait]`
68
+ Read server state for one exact commit.
69
+ - `dreamboard verify --commit <rev>`
70
+ Verify one exact commit from a detached worktree.
71
+ - `dreamboard test`
72
+ Regenerate derived test artifacts as needed and run offline reducer tests.
73
+ - `dreamboard dev [--from-scenario <id>]`
74
+ Start the local dev host for browser validation.
69
75
 
70
76
  Quick rule:
71
77
 
72
- - edited files locally: `dreamboard sync` then `dreamboard compile`
73
- - compile failed but you have not edited files since: `dreamboard compile` again
74
- - remote authored head moved: `dreamboard pull` first
78
+ - edited files locally: commit them with Git and push the branch
79
+ - need server readback: `dreamboard project status --commit <rev> --wait`
80
+ - need exact local proof: `dreamboard verify --commit <rev>`
81
+ - need scenario proof: `dreamboard test`
75
82
 
76
83
  ## Workflow
77
84
 
@@ -79,23 +86,22 @@ Use this order by default:
79
86
 
80
87
  1. Write or revise `rule.md`.
81
88
  2. Align `manifest.json` to the rules.
82
- 3. Run `dreamboard sync`.
83
- 4. Implement reducer state, phases, actions, and views in `app/`.
84
- 5. Implement the playable UI in `ui/App.tsx`.
85
- 6. Run `dreamboard compile`.
86
- 7. Generate test artifacts with `dreamboard test generate`.
87
- 8. Run scenarios with `dreamboard test run`.
88
- 9. Validate the local runtime with `dreamboard run`.
89
+ 3. Implement reducer state, phases, actions, and views in `app/`.
90
+ 4. Implement the playable UI in `ui/App.tsx`.
91
+ 5. Commit and push authored changes with Git.
92
+ 6. Run `dreamboard project status --commit HEAD --wait`.
93
+ 7. Run `dreamboard verify --commit HEAD`.
94
+ 8. Run scenarios with `dreamboard test`.
95
+ 9. Validate the local runtime with `dreamboard dev`.
89
96
  10. For agent-built games, run `dreamboard dev` and verify the browser UI before handoff. Use Playwright to open the dev host, check that the plugin iframe renders without console errors, and click a primary interaction such as selecting a playable hand card. Reducer scenarios alone are not enough when the game has an interactive UI.
90
97
 
91
98
  ## Guardrails
92
99
 
93
100
  - `manifest.json` and `rule.md` are the source of truth for scaffolding.
94
- - Run `dreamboard sync` after authored changes to keep generated files and the remote authored head in sync.
95
- - `dreamboard pull` reconciles authored divergence into the current workspace.
96
- - `dreamboard compile` is separate from authored sync; failed compiles do not mean the workspace needs a pull or another sync unless you changed authored files again.
97
- - Use `dreamboard status` to distinguish authored sync from compile health before deciding whether the next command should be `sync`, `compile`, or `pull`.
98
- - Re-run `dreamboard test generate` after runtime-shape changes in `manifest.json` or `app/`.
101
+ - Use Git for source-control state transitions; Dreamboard does not stage,
102
+ commit, pull, merge, branch, or push for you.
103
+ - Use `dreamboard project status --commit <rev>` for server state, not local Git status.
104
+ - Run `dreamboard test` after runtime-shape changes in `manifest.json` or `app/`; it regenerates derived test artifacts automatically.
99
105
  - Keep reducer-owned UI data in views; do not reintroduce the old `shared/ui-args.ts` pattern in new scaffolds.
100
106
  - When a game exposes clickable hands, markets, boards, or prompts, prove the same interaction works through `dreamboard dev` in a browser. A direct scenario submission can pass even when the rendered surface does not collect the input.
101
107
  - For interactive card hands, render generated surfaces such as `handSurface.Hand` and `handSurface.Card` consistently. Do not swap a surface card for a raw `Card` or custom tile based on `me.canAct`; the surface primitive is responsible for disabling unavailable interactions.
@@ -124,7 +130,3 @@ Do not edit generated or framework-owned files such as:
124
130
 
125
131
  ## Offical Documentation
126
132
  Visit https://dreamboard.games/docs
127
-
128
- ## Framework Feedback
129
-
130
- Use `feedback.md` in the game project root to record framework issues, missing features, or workflow friction. Include reproduction steps, expected behavior, and actual behavior when possible.
@@ -33,13 +33,13 @@ By the end of the tutorial you will have:
33
33
 
34
34
  ## Prerequisites
35
35
 
36
- - Dreamboard CLI installed: `npm install -g dreamboard`
37
- - authenticated with `dreamboard login`
36
+ - Dreamboard installed: `npm install -g dreamboard`
37
+ - authenticated with `dreamboard auth login`
38
38
 
39
39
  ## 1. Create the workspace
40
40
 
41
41
  ```bash
42
- dreamboard new race-to-ten --description "A tiny scoring game with one shared die"
42
+ dreamboard project create race-to-ten --description "A tiny scoring game with one shared die"
43
43
  cd race-to-ten
44
44
  ```
45
45
 
@@ -138,16 +138,17 @@ This game needs player-count metadata and one shared die.
138
138
  }
139
139
  ```
140
140
 
141
- Run:
141
+ Commit and push the authored source with Git, then wait for the server to
142
+ observe and verify the exact commit:
142
143
 
143
144
  ```bash
144
- dreamboard sync
145
- dreamboard compile
145
+ git add .
146
+ git commit -m "Build Race to Ten"
147
+ git push -u origin main
148
+ dreamboard project status --commit HEAD --wait
149
+ dreamboard verify --commit HEAD
146
150
  ```
147
151
 
148
- `dreamboard sync` refreshes generated contracts from authored files.
149
- `dreamboard compile` builds the current authored head.
150
-
151
152
  ## 4. Define the reducer contract
152
153
 
153
154
  Open `app/game-contract.ts` and replace the empty schemas with the state the
@@ -471,23 +472,22 @@ export default defineScenario({
471
472
  });
472
473
  ```
473
474
 
474
- Generate artifacts and run the test suite:
475
+ Run the test suite:
475
476
 
476
477
  ```bash
477
- dreamboard test generate
478
- dreamboard test run
478
+ dreamboard test
479
479
  ```
480
480
 
481
481
  ## 10. Run the game locally
482
482
 
483
- Use the local runtime to verify the same flow manually:
483
+ Use the local dev host to verify the same flow manually:
484
484
 
485
485
  ```bash
486
- dreamboard run
486
+ dreamboard dev
487
487
  ```
488
488
 
489
- If you edit `rule.md` or `manifest.json`, run `dreamboard sync` again before
490
- continuing.
489
+ If you edit `rule.md` or `manifest.json`, commit and push the changes before
490
+ running commit-scoped build, preview, release, or remote test commands.
491
491
 
492
492
  ## Where to go next
493
493
 
@@ -1,25 +1,25 @@
1
1
  <!-- Generated by apps/dreamboard-cli/scripts/sync-skill-docs.ts. -->
2
2
  <!-- Source: docs/reference/cli.mdx -->
3
3
 
4
- # CLI
4
+ # Dreamboard command reference
5
5
 
6
- Reference for Dreamboard CLI workflows and commands.
6
+ Reference for Dreamboard workflows and commands.
7
7
 
8
- Dreamboard CLI manages the authored workspace loop: authenticate, create or
9
- clone a game, sync authored changes, compile, run, and test.
8
+ Dreamboard manages the Git-native authored workspace loop: authenticate,
9
+ create or clone a project, verify exact commits, build or preview pushed
10
+ commits, run a local dev host, and test reducer scenarios.
10
11
 
11
12
  ## Responsibility
12
13
 
13
- Use the CLI for:
14
+ Use Dreamboard for:
14
15
 
15
16
  - authenticating the current machine
16
- - creating or cloning game workspaces
17
- - syncing authored files to the remote authoring head
18
- - compiling the current authored head
19
- - inspecting local versus remote state
20
- - pulling remote authored changes into the workspace
21
- - starting or observing playable sessions
22
- - generating and running reducer-native tests
17
+ - creating or cloning project workspaces
18
+ - inspecting server state for an exact commit
19
+ - verifying an exact commit from a detached worktree
20
+ - building, previewing, and publishing pushed commits
21
+ - starting the local dev host
22
+ - running offline reducer tests
23
23
 
24
24
  ## Install targets
25
25
 
@@ -27,76 +27,76 @@ Use the published package for normal game work:
27
27
 
28
28
  ```bash
29
29
  npm install -g dreamboard
30
- dreamboard login
30
+ dreamboard auth login
31
31
  ```
32
32
 
33
33
  ## Command flow
34
34
 
35
35
  Use this sequence for the normal authored loop:
36
36
 
37
- 1. `dreamboard login`
38
- 2. `dreamboard new ...` or `dreamboard clone ...`
37
+ 1. `dreamboard auth login`
38
+ 2. `dreamboard project create ...` or `dreamboard project clone ...`
39
39
  3. edit `rule.md`, `manifest.json`, and authored source files
40
- 4. `dreamboard sync`
41
- 5. `dreamboard compile`
42
- 6. `dreamboard run` or `dreamboard start`
43
- 7. `dreamboard test generate`
44
- 8. `dreamboard test run`
45
-
46
- When the remote authored head moves first, run `dreamboard pull` before the
47
- next sync or compile. Use `dreamboard status` to decide whether the workspace is
48
- ahead, behind, or diverged.
40
+ 4. commit with Git and push to the configured remote
41
+ 5. `dreamboard project status --commit <rev> --wait`
42
+ 6. `dreamboard verify --commit <rev>`
43
+ 7. `dreamboard test`
44
+ 8. `dreamboard build --commit <rev>`
45
+ 9. `dreamboard preview --commit <rev>`
49
46
 
50
47
  ## Workspace commands
51
48
 
52
- | Command | Use it for |
53
- | --- | --- |
54
- | `dreamboard login` | Open browser login and store a refreshable session |
55
- | `dreamboard new <slug> --description "..."` | Create a new game and scaffold a local workspace |
56
- | `dreamboard clone <slug>` | Clone an existing game into a new local workspace |
57
- | `dreamboard sync` | Upload authored changes and refresh scaffolded files |
58
- | `dreamboard compile` | Compile the current remote authored head |
59
- | `dreamboard status` | Compare local authored and compile state with remote |
60
- | `dreamboard pull` | Reconcile remote authored changes into the workspace |
49
+ | Command | Use it for |
50
+ | ------------------------------------------------------ | --------------------------------------------------------------- |
51
+ | `dreamboard auth login` | Open browser login and store a refreshable session |
52
+ | `dreamboard auth status` | Show the current authenticated session |
53
+ | `dreamboard project create <slug> --description "..."` | Create a project, scaffold a local workspace, and configure Git |
54
+ | `dreamboard project clone <project>` | Clone an existing project repository |
55
+ | `dreamboard project status --commit <rev>` | Show server state for one exact commit |
56
+ | `dreamboard verify --commit <rev>` | Verify one exact commit in a detached worktree |
61
57
 
62
58
  ```bash
63
- dreamboard new race-to-ten --description "A tiny scoring game"
64
- dreamboard sync
65
- dreamboard compile
66
- dreamboard status --json
59
+ dreamboard auth login
60
+ dreamboard project create race-to-ten --description "A tiny scoring game"
61
+ git add .
62
+ git commit -m "Create Race to Ten"
63
+ git push -u origin main
64
+ dreamboard project status --commit HEAD --wait
65
+ dreamboard verify --commit HEAD
67
66
  ```
68
67
 
69
- ## Session commands
68
+ ## Commit commands
70
69
 
71
- Use session commands after you have a successful compile for the current
72
- authored head.
70
+ Use commit commands after the commit has been pushed to the configured Git
71
+ remote.
73
72
 
74
- | Command | Use it for |
75
- | --- | --- |
76
- | `dreamboard run` | Start or resume a playable session and observe it from the CLI |
77
- | `dreamboard start` | Start a fresh session and open it in the browser |
73
+ | Command | Use it for |
74
+ | ------------------------------------------------- | ----------------------------------------- |
75
+ | `dreamboard test` | Run offline reducer tests |
76
+ | `dreamboard dev [--from-scenario <id>]` | Start the local project dev host |
77
+ | `dreamboard build --commit <rev>` | Create a server build for a pushed commit |
78
+ | `dreamboard preview --commit <rev>` | Create a preview for a pushed commit |
79
+ | `dreamboard release publish --commit <rev> --yes` | Publish an explicit release |
80
+ | `dreamboard release current` | Show the current release pointer |
78
81
 
79
82
  ```bash
80
- dreamboard run
81
- dreamboard run --players 4 --seed 1337
82
- dreamboard run --scenario path/to/scenario.json
83
- dreamboard start --players 2
83
+ dreamboard test
84
+ dreamboard dev
85
+ dreamboard build --commit HEAD
86
+ dreamboard preview --commit HEAD
84
87
  ```
85
88
 
86
- `dreamboard run` reuses the previous active session by default. Use
87
- `--new-session` when you want a fresh session instead.
88
-
89
89
  ## Test commands
90
90
 
91
91
  Use the scaffolded reducer-native test workspace for repeatable game assertions.
92
92
 
93
93
  ```bash
94
- dreamboard test generate
95
- dreamboard test run
96
- dreamboard test run --scenario test/scenarios/player-two-wins.scenario.ts
94
+ dreamboard test
95
+ dreamboard test --scenario test/scenarios/player-two-wins.scenario.ts
97
96
  ```
98
97
 
99
98
  ## Start local server
99
+
100
100
  ```bash
101
101
  dreamboard dev
102
102
  ```
@@ -121,14 +121,15 @@ Use `home` on cards, piece seeds, and die seeds to place authored inventory.
121
121
 
122
122
  ## `cardSets`
123
123
 
124
- `cardSets` define the cards that exist. They do not place cards into zones by themselves.
124
+ `cardSets` define the cards that exist. `defaultHome` or per-card `home` places
125
+ authored inventory into zones.
125
126
 
126
127
  ### `CardSetDefinition`
127
128
 
128
129
  | Variant | Required fields | Notes |
129
130
  | --- | --- | --- |
130
- | `type: "manual"` | `id`, `name`, `cardSchema`, `cards` | Define your own cards |
131
- | `type: "preset"` | `id`, `name` | Use a built-in set |
131
+ | `type: "manual"` | `id`, `name`, `cardSchema`, `cards`, `defaultHome` | Define your own cards |
132
+ | `type: "preset"` | `id`, `name`, `defaultHome` | Use a built-in set |
132
133
 
133
134
  Current supported preset ID: `standard_52_deck`.
134
135
 
@@ -153,6 +154,10 @@ Current supported preset ID: `standard_52_deck`.
153
154
  "type": "manual",
154
155
  "id": "project-cards",
155
156
  "name": "Project cards",
157
+ "defaultHome": {
158
+ "type": "zone",
159
+ "zoneId": "project-deck"
160
+ },
156
161
  "cardSchema": {
157
162
  "properties": {
158
163
  "cost": { "type": "integer" },
@@ -181,6 +186,9 @@ Current supported preset ID: `standard_52_deck`.
181
186
  ## `zones`
182
187
 
183
188
  Use `zones` for shared piles, per-player hands, pools, bags, and other table-level containers.
189
+ `allowedCardSetIds` controls destination compatibility. `defaultHome` and
190
+ per-card `home` control initial placement. Use reducer setup for dynamic
191
+ distribution and shuffle.
184
192
 
185
193
  | Field | Required | Notes |
186
194
  | --- | --- | --- |