@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.
- package/README.md +32 -113
- package/dist/agent-verifier/agent-workspace-verifier.mjs +2084 -57
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
- package/dist/agent-verifier/{chunk-XQXDOBYB.mjs → chunk-4I2WWAPK.mjs} +27 -10
- package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-C3VW3DTA.mjs → chunk-BWBN2TDJ.mjs} +535 -633
- package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-TAEQKBJB.mjs → chunk-GWRZRWCF.mjs} +1 -1
- package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
- package/dist/agent-verifier/chunk-HUBV22JQ.mjs +89 -0
- package/dist/agent-verifier/chunk-HUBV22JQ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-MW2QIWWA.mjs → chunk-KAA3B4DI.mjs} +215 -223
- package/dist/agent-verifier/chunk-KAA3B4DI.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-27EEIZCI.mjs → chunk-KDAQ4CZY.mjs} +34 -27
- package/dist/agent-verifier/chunk-KDAQ4CZY.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-IAYRNVUC.mjs → chunk-LMW66VBH.mjs} +2 -13
- package/dist/agent-verifier/{chunk-IAYRNVUC.mjs.map → chunk-LMW66VBH.mjs.map} +1 -1
- package/dist/agent-verifier/{chunk-776W3UGV.mjs → chunk-LROY5SN2.mjs} +7 -45
- package/dist/agent-verifier/chunk-LROY5SN2.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-H76MT5UR.mjs → chunk-M7UVBANQ.mjs} +2 -1
- package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-5NYBTZB4.mjs → chunk-MIRGCMUC.mjs} +112 -26
- package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-NAK77WXW.mjs → chunk-MYMVXTZT.mjs} +4 -5
- package/dist/agent-verifier/chunk-MYMVXTZT.mjs.map +1 -0
- package/dist/agent-verifier/chunk-OJFZVGEL.mjs +492 -0
- package/dist/agent-verifier/chunk-OJFZVGEL.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-XKCJBIRY.mjs → chunk-QD4SQNUP.mjs} +2 -2
- package/dist/agent-verifier/{chunk-QBAF7EYR.mjs → chunk-TTB7AIHZ.mjs} +4 -4
- package/dist/agent-verifier/{chunk-QBAF7EYR.mjs.map → chunk-TTB7AIHZ.mjs.map} +1 -1
- package/dist/agent-verifier/{chunk-F2DIOJJZ.mjs → chunk-XCQQIPCO.mjs} +5 -46
- package/dist/agent-verifier/chunk-XCQQIPCO.mjs.map +1 -0
- package/dist/agent-verifier/{global-config-NYCSCAUI.mjs → global-config-2NUESNEQ.mjs} +5 -5
- package/dist/agent-verifier/{keychain-backend-A3MRWLPF.mjs → keychain-backend-FF4I6ODB.mjs} +11 -6
- package/dist/agent-verifier/keychain-backend-FF4I6ODB.mjs.map +1 -0
- package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs → local-files-OF4QFISU.mjs} +8 -8
- package/dist/agent-verifier/{chunk-UIOLGH4A.mjs → local-typecheck-DHVLM37Z.mjs} +4 -4
- package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
- package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs → materialize-workspace-JBDL6LF4.mjs} +22 -22
- package/dist/agent-verifier/materialize-workspace-JBDL6LF4.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-Z6OZWUIZ.mjs → reducer-bundle-preflight-GLUJKTWU.mjs} +75 -24
- package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-YDIOW2BO.mjs → reducer-contract-preflight-WVQQPW5F.mjs} +7 -6
- package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-ON62IGWK.mjs → reducer-native-test-harness-XQUPIT5D.mjs} +480 -703
- package/dist/agent-verifier/reducer-native-test-harness-XQUPIT5D.mjs.map +1 -0
- package/dist/agent-verifier/static-scaffold-U5DXE23S.mjs +24 -0
- package/dist/agent-verifier/{workspace-codegen-WPZHMATU.mjs → workspace-codegen-SPPVHURX.mjs} +3 -3
- package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs → workspace-dependencies-5HEEKZFP.mjs} +5 -3
- package/dist/authoring-compatibility-internal.js +12 -0
- package/dist/chunk-5IYJOVUA.js +3902 -0
- package/dist/chunk-5IYJOVUA.js.map +1 -0
- package/dist/chunk-6NYVJYN4.js +313 -0
- package/dist/chunk-6NYVJYN4.js.map +1 -0
- package/dist/chunk-EQNBQVIW.js +204 -0
- package/dist/chunk-EQNBQVIW.js.map +1 -0
- package/dist/{chunk-M4SCKH5M.js → chunk-USZAPMQ4.js} +2488 -4993
- package/dist/chunk-USZAPMQ4.js.map +1 -0
- package/dist/{global-config-YBFEGJQG.js → global-config-RBMW7IVA.js} +3 -2
- package/dist/index.js +3099 -6188
- package/dist/index.js.map +1 -1
- package/dist/internal.js +35 -9
- package/dist/internal.js.map +1 -1
- package/dist/{keychain-backend-JHTXAKWC.js → keychain-backend-FSNTNTZE.js} +11 -6
- package/dist/keychain-backend-FSNTNTZE.js.map +1 -0
- package/package.json +9 -19
- package/release/authoring-release-set.json +38 -0
- package/skills/dreamboard/SKILL.md +32 -30
- package/skills/dreamboard/references/building-your-first-game.md +16 -16
- package/skills/dreamboard/references/cli.md +54 -54
- package/skills/dreamboard/references/manifest-authoring.md +11 -3
- package/skills/dreamboard/references/quickstart.md +19 -16
- package/skills/dreamboard/references/testing.md +6 -13
- package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +0 -1
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +0 -1
- package/dist/agent-verifier/chunk-776W3UGV.mjs.map +0 -1
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +0 -1
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +0 -1
- package/dist/agent-verifier/chunk-G42BGGG2.mjs +0 -70
- package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +0 -1
- package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +0 -1
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs +0 -222
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +0 -1
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs +0 -1744
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +0 -1
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs +0 -624
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +0 -1
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +0 -1
- package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +0 -1
- package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +0 -1
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs +0 -39
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +0 -1
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +0 -1
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +0 -1
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +0 -1
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +0 -1
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +0 -1
- package/dist/agent-verifier/compile-576O7TYP.mjs +0 -312
- package/dist/agent-verifier/compile-576O7TYP.mjs.map +0 -1
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +0 -1
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +0 -10
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +0 -1
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +0 -20
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +0 -11
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +0 -50
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +0 -27
- package/dist/agent-verifier/sync-C6S3OGCD.mjs +0 -588
- package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +0 -1
- package/dist/agent-verifier/test-Y5UGQV7J.mjs +0 -353
- package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +0 -1
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +0 -1
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +0 -1
- package/dist/chunk-3NRROR4P.js +0 -432
- package/dist/chunk-3NRROR4P.js.map +0 -1
- package/dist/chunk-M4SCKH5M.js.map +0 -1
- package/dist/dev-host/components/drawer.tsx +0 -132
- package/dist/dev-host/components/input.tsx +0 -21
- package/dist/dev-host/dev-api-proxy-plugin.ts +0 -328
- package/dist/dev-host/dev-author-dom-warnings.ts +0 -100
- package/dist/dev-host/dev-diagnostics.ts +0 -62
- package/dist/dev-host/dev-fallback-stylesheet.ts +0 -53
- package/dist/dev-host/dev-hmr-guard-plugin.ts +0 -47
- package/dist/dev-host/dev-host-controller.ts +0 -674
- package/dist/dev-host/dev-host-player-query.ts +0 -17
- package/dist/dev-host/dev-host-session-transport.ts +0 -52
- package/dist/dev-host/dev-host-storage.ts +0 -56
- package/dist/dev-host/dev-log-relay-plugin.ts +0 -510
- package/dist/dev-host/dev-runtime-config.ts +0 -14
- package/dist/dev-host/dev-runtime-platform.ts +0 -335
- package/dist/dev-host/dev-virtual-modules-plugin.ts +0 -64
- package/dist/dev-host/host-main.css +0 -224
- package/dist/dev-host/host-main.tsx +0 -948
- package/dist/dev-host/index.html +0 -56
- package/dist/dev-host/lib/utils.ts +0 -6
- package/dist/dev-host/plugin-main.ts +0 -61
- package/dist/dev-host/plugin.html +0 -24
- package/dist/dev-host/shared-styles.css +0 -144
- package/dist/dev-host/start-dev-server.ts +0 -140
- package/dist/dev-host/virtual-modules.d.ts +0 -27
- package/dist/global-config-YBFEGJQG.js.map +0 -1
- package/dist/keychain-backend-JHTXAKWC.js.map +0 -1
- package/skills/dreamboard/scripts/events-extract.mjs +0 -218
- /package/dist/agent-verifier/{chunk-XKCJBIRY.mjs.map → chunk-QD4SQNUP.mjs.map} +0 -0
- /package/dist/agent-verifier/{global-config-NYCSCAUI.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
- /package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs.map → local-files-OF4QFISU.mjs.map} +0 -0
- /package/dist/agent-verifier/{local-typecheck-2JWG5IGL.mjs.map → static-scaffold-U5DXE23S.mjs.map} +0 -0
- /package/dist/agent-verifier/{reducer-bundle-preflight-7NYZF5ZT.mjs.map → workspace-codegen-SPPVHURX.mjs.map} +0 -0
- /package/dist/agent-verifier/{reducer-contract-preflight-COD2CO22.mjs.map → workspace-dependencies-5HEEKZFP.mjs.map} +0 -0
- /package/dist/{agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map → authoring-compatibility-internal.js.map} +0 -0
- /package/dist/{agent-verifier/static-scaffold-JBUE3ROP.mjs.map → global-config-RBMW7IVA.js.map} +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.framework.json +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.json +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/index.tsx +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/style.css +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.framework.json +0 -0
- /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-
|
|
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-
|
|
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,
|
package/dist/internal.js.map
CHANGED
|
@@ -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
|
-
|
|
32
|
+
const accessToken = parsed.clerkAccessToken ?? parsed.accessToken;
|
|
33
|
+
if (!accessToken && !parsed.refreshToken) return null;
|
|
33
34
|
return {
|
|
34
|
-
accessToken:
|
|
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
|
-
|
|
56
|
+
clerkAccessToken: creds.accessToken,
|
|
54
57
|
refreshToken: creds.refreshToken,
|
|
55
|
-
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
-
"
|
|
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
|
|
9
|
+
# Dreamboard
|
|
10
10
|
|
|
11
11
|
## Goal
|
|
12
12
|
|
|
13
|
-
Create and iterate on a Dreamboard game locally
|
|
14
|
-
|
|
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
|
|
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
|
|
64
|
-
|
|
65
|
-
- `dreamboard
|
|
66
|
-
|
|
67
|
-
- `dreamboard
|
|
68
|
-
|
|
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:
|
|
73
|
-
-
|
|
74
|
-
-
|
|
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.
|
|
83
|
-
4. Implement
|
|
84
|
-
5.
|
|
85
|
-
6. Run `dreamboard
|
|
86
|
-
7.
|
|
87
|
-
8. Run scenarios with `dreamboard test
|
|
88
|
-
9. Validate the local runtime with `dreamboard
|
|
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
|
-
-
|
|
95
|
-
|
|
96
|
-
- `dreamboard
|
|
97
|
-
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
145
|
-
|
|
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
|
-
|
|
475
|
+
Run the test suite:
|
|
475
476
|
|
|
476
477
|
```bash
|
|
477
|
-
dreamboard test
|
|
478
|
-
dreamboard test run
|
|
478
|
+
dreamboard test
|
|
479
479
|
```
|
|
480
480
|
|
|
481
481
|
## 10. Run the game locally
|
|
482
482
|
|
|
483
|
-
Use the local
|
|
483
|
+
Use the local dev host to verify the same flow manually:
|
|
484
484
|
|
|
485
485
|
```bash
|
|
486
|
-
dreamboard
|
|
486
|
+
dreamboard dev
|
|
487
487
|
```
|
|
488
488
|
|
|
489
|
-
If you edit `rule.md` or `manifest.json`,
|
|
490
|
-
|
|
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
|
-
#
|
|
4
|
+
# Dreamboard command reference
|
|
5
5
|
|
|
6
|
-
Reference for Dreamboard
|
|
6
|
+
Reference for Dreamboard workflows and commands.
|
|
7
7
|
|
|
8
|
-
Dreamboard
|
|
9
|
-
clone a
|
|
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
|
|
14
|
+
Use Dreamboard for:
|
|
14
15
|
|
|
15
16
|
- authenticating the current machine
|
|
16
|
-
- creating or cloning
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
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
|
|
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.
|
|
41
|
-
5. `dreamboard
|
|
42
|
-
6. `dreamboard
|
|
43
|
-
7. `dreamboard test
|
|
44
|
-
8. `dreamboard
|
|
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
|
|
53
|
-
|
|
|
54
|
-
| `dreamboard login`
|
|
55
|
-
| `dreamboard
|
|
56
|
-
| `dreamboard
|
|
57
|
-
| `dreamboard
|
|
58
|
-
| `dreamboard
|
|
59
|
-
| `dreamboard
|
|
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
|
|
64
|
-
dreamboard
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
##
|
|
68
|
+
## Commit commands
|
|
70
69
|
|
|
71
|
-
Use
|
|
72
|
-
|
|
70
|
+
Use commit commands after the commit has been pushed to the configured Git
|
|
71
|
+
remote.
|
|
73
72
|
|
|
74
|
-
| Command
|
|
75
|
-
|
|
|
76
|
-
| `dreamboard
|
|
77
|
-
| `dreamboard
|
|
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
|
|
81
|
-
dreamboard
|
|
82
|
-
dreamboard
|
|
83
|
-
dreamboard
|
|
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
|
|
95
|
-
dreamboard test
|
|
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.
|
|
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
|
| --- | --- | --- |
|