@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
@@ -1,56 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <link
7
- rel="icon"
8
- href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%23f59e0b'/%3E%3Ctext x='32' y='41' font-size='28' text-anchor='middle' fill='%23231f20' font-family='Arial,sans-serif'%3EDB%3C/text%3E%3C/svg%3E"
9
- />
10
- <title>Dreamboard Dev</title>
11
- <style>
12
- :root {
13
- color-scheme: light;
14
- font-family:
15
- ui-sans-serif,
16
- system-ui,
17
- -apple-system,
18
- BlinkMacSystemFont,
19
- "Segoe UI",
20
- sans-serif;
21
- background: #f5f1e7;
22
- color: #1f2937;
23
- }
24
-
25
- * {
26
- box-sizing: border-box;
27
- }
28
-
29
- html,
30
- body,
31
- #app {
32
- height: 100%;
33
- margin: 0;
34
- }
35
-
36
- body {
37
- background:
38
- radial-gradient(
39
- circle at top left,
40
- rgba(255, 255, 255, 0.8),
41
- transparent 35%
42
- ),
43
- linear-gradient(180deg, #f5f1e7 0%, #efe7d6 100%);
44
- }
45
-
46
- #app {
47
- display: grid;
48
- grid-template-rows: auto 1fr;
49
- }
50
- </style>
51
- </head>
52
- <body>
53
- <div id="app"></div>
54
- <script type="module" src="/host-main.tsx"></script>
55
- </body>
56
- </html>
@@ -1,6 +0,0 @@
1
- import { clsx, type ClassValue } from "clsx";
2
- import { twMerge } from "tailwind-merge";
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs));
6
- }
@@ -1,61 +0,0 @@
1
- import devConfig from "virtual:dreamboard-dev-config";
2
- import { stringifyForRelay } from "./dev-diagnostics.js";
3
- import { installPlayableZoneItemWarnings } from "./dev-author-dom-warnings.js";
4
-
5
- installPluginConsoleRelay();
6
- const disposePlayableZoneWarnings = installPlayableZoneItemWarnings();
7
-
8
- void import("virtual:dreamboard-project-entry").catch((error: unknown) => {
9
- console.error("[dreamboard-dev] Failed to load project entry.", error);
10
- });
11
-
12
- if (import.meta.hot) {
13
- import.meta.hot.dispose(() => {
14
- disposePlayableZoneWarnings();
15
- });
16
- }
17
-
18
- function installPluginConsoleRelay(): void {
19
- const relay = (level: "log" | "warn" | "error", args: unknown[]): void => {
20
- try {
21
- window.parent.postMessage(
22
- {
23
- type: "dreamboard-dev-console",
24
- level,
25
- message: args.map((value) => stringifyForRelay(value)).join(" "),
26
- },
27
- "*",
28
- );
29
- } catch {
30
- // Ignore logging failures in the dev iframe.
31
- }
32
- };
33
-
34
- const original = {
35
- log: console.log.bind(console),
36
- warn: console.warn.bind(console),
37
- error: console.error.bind(console),
38
- };
39
-
40
- console.log = (...args: unknown[]) => {
41
- original.log(...args);
42
- if (devConfig.debug) {
43
- relay("log", args);
44
- }
45
- };
46
- console.warn = (...args: unknown[]) => {
47
- original.warn(...args);
48
- relay("warn", args);
49
- };
50
- console.error = (...args: unknown[]) => {
51
- original.error(...args);
52
- relay("error", args);
53
- };
54
-
55
- window.addEventListener("error", (event) => {
56
- relay("error", [`window.error ${event.message}`]);
57
- });
58
- window.addEventListener("unhandledrejection", (event) => {
59
- relay("error", ["unhandledrejection", event.reason]);
60
- });
61
- }
@@ -1,24 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <link
7
- rel="icon"
8
- href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%23f59e0b'/%3E%3Ctext x='32' y='41' font-size='28' text-anchor='middle' fill='%23231f20' font-family='Arial,sans-serif'%3EDB%3C/text%3E%3C/svg%3E"
9
- />
10
- <title>Dreamboard Plugin</title>
11
- <style>
12
- html,
13
- body,
14
- #root {
15
- height: 100%;
16
- margin: 0;
17
- }
18
- </style>
19
- </head>
20
- <body>
21
- <div id="root"></div>
22
- <script type="module" src="/plugin-main.ts"></script>
23
- </body>
24
- </html>
@@ -1,144 +0,0 @@
1
- @import "tailwindcss";
2
- @import "tw-animate-css";
3
-
4
- @source "./**/*.{ts,tsx}";
5
- @source "../runtime-packages/ui-host-runtime/src/**/*.{ts,tsx}";
6
-
7
- :root {
8
- --background: oklch(0.98 0.005 220);
9
- --foreground: oklch(0.22 0.03 220);
10
- --card: oklch(1 0 0);
11
- --card-foreground: oklch(0.22 0.03 220);
12
- --popover: oklch(1 0 0);
13
- --popover-foreground: oklch(0.22 0.03 220);
14
- --primary: oklch(0.45 0.15 165);
15
- --primary-foreground: oklch(0.98 0.005 165);
16
- --secondary: oklch(0.94 0.01 220);
17
- --secondary-foreground: oklch(0.28 0.03 220);
18
- --muted: oklch(0.94 0.01 220);
19
- --muted-foreground: oklch(0.50 0.03 220);
20
- --accent: oklch(0.94 0.01 220);
21
- --accent-foreground: oklch(0.28 0.03 220);
22
- --destructive: oklch(0.55 0.22 25);
23
- --destructive-foreground: oklch(0.55 0.22 25);
24
- --border: oklch(0.87 0.02 220);
25
- --input: oklch(0.87 0.02 220);
26
- --ring: oklch(0.45 0.15 165);
27
- --chart-1: oklch(0.45 0.15 165);
28
- --chart-2: oklch(0.55 0.12 200);
29
- --chart-3: oklch(0.60 0.15 40);
30
- --chart-4: oklch(0.75 0.14 80);
31
- --chart-5: oklch(0.60 0.12 280);
32
- --radius: 0.625rem;
33
- --sidebar: oklch(0.96 0.008 220);
34
- --sidebar-foreground: oklch(0.22 0.03 220);
35
- --sidebar-primary: oklch(0.45 0.15 165);
36
- --sidebar-primary-foreground: oklch(0.98 0.005 165);
37
- --sidebar-accent: oklch(0.94 0.01 220);
38
- --sidebar-accent-foreground: oklch(0.28 0.03 220);
39
- --sidebar-border: oklch(0.87 0.02 220);
40
- --sidebar-ring: oklch(0.45 0.15 165);
41
- }
42
-
43
- .dark {
44
- --background: oklch(0.16 0.02 230);
45
- --foreground: oklch(0.93 0.01 220);
46
- --card: oklch(0.20 0.025 230);
47
- --card-foreground: oklch(0.93 0.01 220);
48
- --popover: oklch(0.20 0.025 230);
49
- --popover-foreground: oklch(0.93 0.01 220);
50
- --primary: oklch(0.70 0.17 162);
51
- --primary-foreground: oklch(0.15 0.02 165);
52
- --secondary: oklch(0.25 0.03 230);
53
- --secondary-foreground: oklch(0.90 0.01 220);
54
- --muted: oklch(0.25 0.03 230);
55
- --muted-foreground: oklch(0.58 0.03 220);
56
- --accent: oklch(0.35 0.06 165);
57
- --accent-foreground: oklch(0.93 0.01 220);
58
- --destructive: oklch(0.45 0.18 350);
59
- --destructive-foreground: oklch(0.65 0.22 350);
60
- --border: oklch(0.28 0.03 230);
61
- --input: oklch(0.28 0.03 230);
62
- --ring: oklch(0.70 0.17 162);
63
- --chart-1: oklch(0.70 0.17 162);
64
- --chart-2: oklch(0.65 0.12 200);
65
- --chart-3: oklch(0.72 0.12 40);
66
- --chart-4: oklch(0.80 0.14 80);
67
- --chart-5: oklch(0.70 0.15 280);
68
- --sidebar: oklch(0.18 0.025 230);
69
- --sidebar-foreground: oklch(0.93 0.01 220);
70
- --sidebar-primary: oklch(0.70 0.17 162);
71
- --sidebar-primary-foreground: oklch(0.15 0.02 165);
72
- --sidebar-accent: oklch(0.25 0.03 230);
73
- --sidebar-accent-foreground: oklch(0.93 0.01 220);
74
- --sidebar-border: oklch(0.28 0.03 230);
75
- --sidebar-ring: oklch(0.70 0.17 162);
76
- }
77
-
78
- @theme inline {
79
- --color-background: var(--background);
80
- --color-foreground: var(--foreground);
81
- --color-card: var(--card);
82
- --color-card-foreground: var(--card-foreground);
83
- --color-popover: var(--popover);
84
- --color-popover-foreground: var(--popover-foreground);
85
- --color-primary: var(--primary);
86
- --color-primary-foreground: var(--primary-foreground);
87
- --color-secondary: var(--secondary);
88
- --color-secondary-foreground: var(--secondary-foreground);
89
- --color-muted: var(--muted);
90
- --color-muted-foreground: var(--muted-foreground);
91
- --color-accent: var(--accent);
92
- --color-accent-foreground: var(--accent-foreground);
93
- --color-destructive: var(--destructive);
94
- --color-destructive-foreground: var(--destructive-foreground);
95
- --color-border: var(--border);
96
- --color-input: var(--input);
97
- --color-ring: var(--ring);
98
- --color-chart-1: var(--chart-1);
99
- --color-chart-2: var(--chart-2);
100
- --color-chart-3: var(--chart-3);
101
- --color-chart-4: var(--chart-4);
102
- --color-chart-5: var(--chart-5);
103
- --radius-sm: calc(var(--radius) - 4px);
104
- --radius-md: calc(var(--radius) - 2px);
105
- --radius-lg: var(--radius);
106
- --radius-xl: calc(var(--radius) + 4px);
107
- --color-sidebar: var(--sidebar);
108
- --color-sidebar-foreground: var(--sidebar-foreground);
109
- --color-sidebar-primary: var(--sidebar-primary);
110
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
111
- --color-sidebar-accent: var(--sidebar-accent);
112
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
113
- --color-sidebar-border: var(--sidebar-border);
114
- --color-sidebar-ring: var(--sidebar-ring);
115
- }
116
-
117
- @layer base {
118
- * {
119
- @apply border-border outline-ring/50;
120
- }
121
- body {
122
- @apply bg-background text-foreground;
123
- }
124
- }
125
-
126
- @theme {
127
- /* Midnight Slate custom color scale */
128
- --color-galaxy-950: #0a0e14;
129
- --color-galaxy-900: #121820;
130
- --color-galaxy-800: #1e2630;
131
- --color-galaxy-700: #2b3544;
132
- --color-galaxy-600: #3d4a5c;
133
- --color-galaxy-500: #536478;
134
- --color-galaxy-400: #748698;
135
- --color-galaxy-300: #9cabb9;
136
- --color-galaxy-200: #c4ced8;
137
- --color-galaxy-100: #e4e9ee;
138
- --color-galaxy-50: #f3f5f7;
139
-
140
- /* Accent colors */
141
- --color-cosmic-blue: #2d6a4f;
142
- --color-nebula-pink: #c24a6e;
143
- --color-star-gold: #c4b490;
144
- }
@@ -1,140 +0,0 @@
1
- import { rmSync } from "node:fs";
2
- import { createRequire } from "node:module";
3
- import os from "node:os";
4
- import react from "@vitejs/plugin-react";
5
- import tailwindcssPostcss from "@tailwindcss/postcss";
6
- import { createServer, type ViteDevServer } from "vite";
7
- import type { ResolvedConfig } from "../types.js";
8
- import { createDevApiProxyPlugin } from "./dev-api-proxy-plugin.js";
9
- import { createDevRuntimePlatform } from "./dev-runtime-platform.js";
10
- import { createVirtualDevModulesPlugin } from "./dev-virtual-modules-plugin.js";
11
- import { createDevLogRelayPlugin } from "./dev-log-relay-plugin.js";
12
- import { prepareFallbackStylesheet } from "./dev-fallback-stylesheet.js";
13
- import { createDevHmrGuardPlugin } from "./dev-hmr-guard-plugin.js";
14
- import type { DreamboardDevRuntimeConfig } from "./dev-runtime-config.js";
15
-
16
- const require = createRequire(import.meta.url);
17
- const tailwindCssEntry = require.resolve("tailwindcss/index.css");
18
-
19
- export type { DreamboardDevRuntimeConfig } from "./dev-runtime-config.js";
20
-
21
- export async function startDreamboardDevServer(options: {
22
- projectRoot: string;
23
- sessionFilePath: string;
24
- port?: number;
25
- host?: string | boolean;
26
- allowedHosts?: string[];
27
- runtimeConfig: DreamboardDevRuntimeConfig;
28
- config: ResolvedConfig;
29
- }): Promise<{
30
- url: string;
31
- networkUrls: string[];
32
- close: () => Promise<void>;
33
- server: ViteDevServer;
34
- }> {
35
- const { projectRoot, port, host, allowedHosts, runtimeConfig, config } =
36
- options;
37
- const platform = createDevRuntimePlatform({
38
- importMetaUrl: import.meta.url,
39
- projectRoot,
40
- debug: runtimeConfig.debug,
41
- port,
42
- host,
43
- allowedHosts,
44
- tailwindCssEntry,
45
- });
46
- const generatedFallbackStylesheetPath = prepareFallbackStylesheet({
47
- projectRoot,
48
- repoRoot: platform.repoRoot,
49
- });
50
-
51
- const server = await createServer({
52
- root: platform.devHostRoot,
53
- appType: "spa",
54
- plugins: [
55
- createDevHmrGuardPlugin({ projectRoot }),
56
- react(),
57
- createVirtualDevModulesPlugin({
58
- projectRoot,
59
- runtimeConfig,
60
- generatedFallbackStylesheetPath,
61
- }),
62
- createDevApiProxyPlugin({ config }),
63
- createDevLogRelayPlugin({
64
- sessionFilePath: options.sessionFilePath,
65
- runtimeConfig,
66
- config,
67
- diagnosticsLevel: platform.diagnosticsLevel,
68
- }),
69
- ],
70
- css: {
71
- postcss: {
72
- plugins: [tailwindcssPostcss()],
73
- },
74
- },
75
- logLevel: platform.viteLogLevel,
76
- resolve: {
77
- dedupe: platform.resolveDedupe,
78
- alias: platform.resolveAlias,
79
- },
80
- optimizeDeps: {
81
- exclude: platform.optimizeDepsExclude,
82
- },
83
- server: platform.serverConfig,
84
- });
85
-
86
- await server.listen();
87
- const resolvedPort = getBoundPort(server);
88
- const url = `http://localhost:${resolvedPort}/index.html`;
89
- return {
90
- url,
91
- networkUrls: getNetworkUrls(host, resolvedPort),
92
- close: async () => {
93
- await server.close();
94
- if (generatedFallbackStylesheetPath) {
95
- rmSync(generatedFallbackStylesheetPath, { force: true });
96
- }
97
- },
98
- server,
99
- };
100
- }
101
-
102
- function getNetworkUrls(
103
- host: string | boolean | undefined,
104
- port: number,
105
- ): string[] {
106
- if (!host) return [];
107
- if (typeof host === "string" && isLoopbackHost(host)) return [];
108
-
109
- const hosts =
110
- host === true || host === "0.0.0.0" || host === "::"
111
- ? getLanIpv4Addresses()
112
- : [host];
113
-
114
- return hosts.map(
115
- (value) => `http://${formatUrlHost(value)}:${port}/index.html`,
116
- );
117
- }
118
-
119
- function isLoopbackHost(host: string): boolean {
120
- return host === "localhost" || host === "127.0.0.1" || host === "::1";
121
- }
122
-
123
- function getLanIpv4Addresses(): string[] {
124
- return Object.values(os.networkInterfaces())
125
- .flatMap((interfaces) => interfaces ?? [])
126
- .filter((details) => details.family === "IPv4" && !details.internal)
127
- .map((details) => details.address);
128
- }
129
-
130
- function formatUrlHost(host: string): string {
131
- return host.includes(":") ? `[${host}]` : host;
132
- }
133
-
134
- function getBoundPort(server: ViteDevServer): number {
135
- const address = server.httpServer?.address();
136
- if (!address || typeof address === "string") {
137
- throw new Error("Failed to determine local dev server port.");
138
- }
139
- return address.port;
140
- }
@@ -1,27 +0,0 @@
1
- declare module "virtual:dreamboard-dev-config" {
2
- export interface DreamboardDevConfig {
3
- apiBaseUrl: string;
4
- userId: string | null;
5
- gameId: string;
6
- compiledResultId: string;
7
- setupProfileId: string | null;
8
- playerCount: number;
9
- debug: boolean;
10
- slug: string;
11
- autoStartGame: boolean;
12
- initialSession: {
13
- sessionId: string;
14
- shortCode: string;
15
- gameId: string;
16
- seed: number | null;
17
- };
18
- }
19
-
20
- const config: DreamboardDevConfig;
21
- export default config;
22
- }
23
-
24
- declare module "virtual:dreamboard-project-entry" {
25
- const projectEntry: unknown;
26
- export default projectEntry;
27
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
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 *opt-in* storage backend, enabled by setting\n * `credentialBackend: \"keychain\"` in `~/.dreamboard/config.json` (see\n * `credential-store.ts` for the resolver). 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 * It is not the default because on macOS the first keychain write\n * triggers a login-password prompt, and macOS re-prompts whenever the\n * executing Node binary's code signature changes (e.g. after an\n * `nvm`/`volta` upgrade). The zero-prompt file backend is a better\n * out-of-the-box experience for CLI users.\n *\n * This module is loaded optionally: `@napi-rs/keyring` is declared as an\n * `optionalDependencies` entry so environments where the native binary is\n * unavailable (e.g. Alpine containers, Linux without libsecret, some CI\n * images) still get a working CLI via the file backend fallback.\n *\n * One-time migration: when a user opts into the keychain and `auth.json`\n * still has tokens, `credential-store.ts` copies them into the keychain\n * and deletes the file. This is the only path that intentionally mutates\n * 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; we swallow that\n // and fall back to the file backend.\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 accessToken?: string;\n refreshToken?: string;\n tokenExpiresAt?: 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 if (!parsed.accessToken && !parsed.refreshToken) return null;\n return {\n accessToken: parsed.accessToken || undefined,\n refreshToken: parsed.refreshToken || undefined,\n tokenExpiresAt: parsed.tokenExpiresAt || 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 accessToken: creds.accessToken,\n refreshToken: creds.refreshToken,\n tokenExpiresAt: creds.tokenExpiresAt,\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 // `clearCredentials` contracts as 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":";;;;AAmCA,IAAM,mBAAmB;AAMzB,IAAM,mBAAmB;AAYzB,IAAI;AAEJ,eAAe,oBAAmD;AAChE,MAAI,iBAAiB,OAAW,QAAO;AACvC,MAAI;AAIF,UAAM,MAAO,MAAM,OAAO,kBAAkB;AAC5C,mBAAe;AAAA,EACjB,QAAQ;AACN,mBAAe;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAA+B;AAIpD,MAAI;AACF,UAAM,YAAY;AAClB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYA,SAAS,aACP,KAC8B;AAC9B,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,OAAO,eAAe,CAAC,OAAO,aAAc,QAAO;AACxD,WAAO;AAAA,MACL,aAAa,OAAO,eAAe;AAAA,MACnC,cAAc,OAAO,gBAAgB;AAAA,MACrC,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,kBAAkB,OAAO,oBAAoB;AAAA,MAC7C,oBAAoB,OAAO,sBAAsB;AAAA,MACjD,oBAAoB,OAAO,sBAAsB;AAAA,MACjD,aAAa,OAAO,eAAe;AAAA,IACrC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,OAAsB,OAA0B;AACjE,MAAI,CAAC,MAAM,eAAe,CAAC,MAAM,cAAc;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAA2B;AAAA,IAC/B,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,kBAAkB,MAAM;AAAA,IACxB,oBAAoB,MAAM;AAAA,IAC1B,oBAAoB,MAAM;AAAA,IAC1B,aAAa,MAAM;AAAA,EACrB;AACA,QAAM,YAAY,KAAK,UAAU,OAAO,CAAC;AAC3C;AAEA,SAAS,gBAAgB,OAAsB,aAA2B;AACxE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,QAAM,UAA2B,EAAE,YAAY;AAC/C,QAAM,YAAY,KAAK,UAAU,OAAO,CAAC;AAC3C;AAEA,SAAS,MAAM,OAA4B;AACzC,MAAI;AACF,UAAM,eAAe;AAAA,EACvB,QAAQ;AAAA,EAGR;AACF;AAWA,eAAsB,qBAAoD;AACxE,QAAM,MAAM,MAAM,kBAAkB;AACpC,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,YAAQ,IAAI,IAAI,MAAM,kBAAkB,gBAAgB;AAAA,EAC1D,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ,sCAAsC,OAAQ,IAAc,WAAW,GAAG,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAA6B;AAAA,IACjC,MAAM;AAAA,IACN,MAAM,OAAO;AACX,UAAI;AACF,eAAO,aAAa,MAAM,YAAY,CAAC;AAAA,MACzC,SAAS,KAAK;AACZ,cAAM,UAAU,OAAQ,IAAc,WAAW,GAAG;AAKpD,YAAI,+BAA+B,KAAK,OAAO,GAAG;AAChD,iBAAO;AAAA,QACT;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM,UAAU,OAAO;AACrB,gBAAU,OAAO,KAAK;AAAA,IACxB;AAAA,IACA,MAAM,gBAAgB,aAAa;AACjC,sBAAgB,OAAO,WAAW;AAAA,IACpC;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,KAAK;AAAA,IACb;AAAA,EACF;AACA,SAAO,EAAE,WAAW,MAAM,QAAQ;AACpC;AAMO,SAAS,0BAA0B,KAAiC;AACzE,iBAAe;AACjB;AAEO,SAAS,8BAAoC;AAClD,iBAAe;AACjB;","names":[]}