@dreamboard-games/cli 0.1.30-alpha.1 → 0.1.30-alpha.3

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 (163) hide show
  1. package/README.md +179 -22
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +30 -30
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
  4. package/dist/agent-verifier/{chunk-JH22JNYD.mjs → chunk-3UKQVWLV.mjs} +82 -19
  5. package/dist/agent-verifier/chunk-3UKQVWLV.mjs.map +1 -0
  6. package/dist/agent-verifier/{chunk-4WD3YU2E.mjs → chunk-776W3UGV.mjs} +4 -3
  7. package/dist/agent-verifier/chunk-776W3UGV.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-CJEEA6NJ.mjs → chunk-7WWGFAAU.mjs} +9 -10
  9. package/dist/agent-verifier/chunk-7WWGFAAU.mjs.map +1 -0
  10. package/dist/agent-verifier/{chunk-2SZHMP6F.mjs → chunk-A64ZZUZV.mjs} +6 -9
  11. package/dist/agent-verifier/chunk-A64ZZUZV.mjs.map +1 -0
  12. package/dist/agent-verifier/{chunk-6A5HRJMQ.mjs → chunk-E7SSWJXJ.mjs} +62 -99
  13. package/dist/agent-verifier/chunk-E7SSWJXJ.mjs.map +1 -0
  14. package/dist/agent-verifier/{chunk-2GBBP27W.mjs → chunk-F2DIOJJZ.mjs} +1 -0
  15. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
  16. package/dist/agent-verifier/{chunk-CFU5EWIC.mjs → chunk-G42BGGG2.mjs} +7 -6
  17. package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +1 -0
  18. package/dist/agent-verifier/{chunk-SHUMAVAP.mjs → chunk-H76MT5UR.mjs} +7 -9
  19. package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +1 -0
  20. package/dist/agent-verifier/{chunk-7E65UQLY.mjs → chunk-HGMUAL33.mjs} +3 -2
  21. package/dist/agent-verifier/chunk-HGMUAL33.mjs.map +1 -0
  22. package/dist/agent-verifier/{chunk-LM3OZLZG.mjs → chunk-IAYRNVUC.mjs} +1 -0
  23. package/dist/agent-verifier/chunk-IAYRNVUC.mjs.map +1 -0
  24. package/dist/agent-verifier/{chunk-VYJTHSYR.mjs → chunk-JGT4P4UD.mjs} +2 -1
  25. package/dist/agent-verifier/chunk-JGT4P4UD.mjs.map +1 -0
  26. package/dist/agent-verifier/{chunk-CEDUHGNH.mjs → chunk-LUZ7KE6H.mjs} +8 -3
  27. package/dist/agent-verifier/chunk-LUZ7KE6H.mjs.map +1 -0
  28. package/dist/agent-verifier/{chunk-2E5P5NWG.mjs → chunk-NAK77WXW.mjs} +58 -126
  29. package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +1 -0
  30. package/dist/agent-verifier/{chunk-SYPLYRGB.mjs → chunk-O4YCPU7C.mjs} +116 -15
  31. package/dist/agent-verifier/chunk-O4YCPU7C.mjs.map +1 -0
  32. package/dist/agent-verifier/{chunk-BVVNBJM4.mjs → chunk-S34FRJHS.mjs} +2 -1
  33. package/dist/agent-verifier/chunk-S34FRJHS.mjs.map +1 -0
  34. package/dist/agent-verifier/{chunk-HJFQDSTU.mjs → chunk-SH5JKYOB.mjs} +6 -5
  35. package/dist/agent-verifier/chunk-SH5JKYOB.mjs.map +1 -0
  36. package/dist/agent-verifier/chunk-SKI2ESE5.mjs +44 -0
  37. package/dist/agent-verifier/{chunk-MINCYHXN.mjs → chunk-TAEQKBJB.mjs} +1 -0
  38. package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +1 -0
  39. package/dist/agent-verifier/{chunk-CEQ2VJWN.mjs → chunk-UIOLGH4A.mjs} +2 -1
  40. package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +1 -0
  41. package/dist/agent-verifier/chunk-UIZNWRM6.mjs +2432 -0
  42. package/dist/agent-verifier/chunk-UIZNWRM6.mjs.map +1 -0
  43. package/dist/agent-verifier/{chunk-2QMNAVV4.mjs → chunk-VS573ERH.mjs} +2 -1
  44. package/dist/agent-verifier/chunk-VS573ERH.mjs.map +1 -0
  45. package/dist/agent-verifier/{chunk-EOQIV6PS.mjs → chunk-W3N3QJ4V.mjs} +75 -100
  46. package/dist/agent-verifier/chunk-W3N3QJ4V.mjs.map +1 -0
  47. package/dist/agent-verifier/{chunk-EIQWDQWJ.mjs → chunk-XGWCY624.mjs} +11 -12
  48. package/dist/agent-verifier/chunk-XGWCY624.mjs.map +1 -0
  49. package/dist/agent-verifier/{chunk-7653FPGJ.mjs → chunk-XQXDOBYB.mjs} +3 -2
  50. package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +1 -0
  51. package/dist/agent-verifier/{chunk-MRCUP5SW.mjs → chunk-YE7UAO3T.mjs} +1 -0
  52. package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
  53. package/dist/agent-verifier/{chunk-RBDDIIPM.mjs → chunk-ZEELHSY3.mjs} +1 -0
  54. package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
  55. package/dist/agent-verifier/{compile-5QSPIOUT.mjs → compile-TEQVA46V.mjs} +24 -25
  56. package/dist/agent-verifier/compile-TEQVA46V.mjs.map +1 -0
  57. package/dist/agent-verifier/{global-config-WX3ZZIVU.mjs → global-config-Y2NTSK4R.mjs} +6 -5
  58. package/dist/{keychain-backend-JHTXAKWC.js → agent-verifier/keychain-backend-SPQWGKZN.mjs} +2 -2
  59. package/dist/agent-verifier/keychain-backend-SPQWGKZN.mjs.map +1 -0
  60. package/dist/agent-verifier/{local-files-MTPLP62S.mjs → local-files-JFOQQZDL.mjs} +10 -11
  61. package/dist/agent-verifier/local-files-JFOQQZDL.mjs.map +1 -0
  62. package/dist/agent-verifier/local-typecheck-XVGWI75X.mjs +10 -0
  63. package/dist/agent-verifier/local-typecheck-XVGWI75X.mjs.map +1 -0
  64. package/dist/agent-verifier/{materialize-workspace-FKALAE2T.mjs → materialize-workspace-ZAVGQQSF.mjs} +17 -18
  65. package/dist/agent-verifier/materialize-workspace-ZAVGQQSF.mjs.map +1 -0
  66. package/dist/agent-verifier/{project-state-7GR6BQTQ.mjs → project-state-K576C2TE.mjs} +3 -2
  67. package/dist/agent-verifier/project-state-K576C2TE.mjs.map +1 -0
  68. package/dist/{prompt-GMZABCJC.js → agent-verifier/prompt-MJRJMOGQ.mjs} +2 -2
  69. package/dist/agent-verifier/prompt-MJRJMOGQ.mjs.map +1 -0
  70. package/dist/agent-verifier/{reducer-bundle-preflight-C73LEXI2.mjs → reducer-bundle-preflight-LXNJUBKL.mjs} +6 -9
  71. package/dist/agent-verifier/reducer-bundle-preflight-LXNJUBKL.mjs.map +1 -0
  72. package/dist/agent-verifier/reducer-contract-preflight-TUMQ43JV.mjs +11 -0
  73. package/dist/agent-verifier/reducer-contract-preflight-TUMQ43JV.mjs.map +1 -0
  74. package/dist/agent-verifier/{reducer-native-test-harness-GMWBUISX.mjs → reducer-native-test-harness-CHX5MBL5.mjs} +14 -17
  75. package/dist/agent-verifier/reducer-native-test-harness-CHX5MBL5.mjs.map +1 -0
  76. package/dist/agent-verifier/static-scaffold-R7SVDRQI.mjs +27 -0
  77. package/dist/agent-verifier/static-scaffold-R7SVDRQI.mjs.map +1 -0
  78. package/dist/agent-verifier/{sync-3DUQH32H.mjs → sync-THAI546U.mjs} +31 -37
  79. package/dist/agent-verifier/sync-THAI546U.mjs.map +1 -0
  80. package/dist/agent-verifier/{test-P4U5INTD.mjs → test-AFAQFKOB.mjs} +28 -31
  81. package/dist/agent-verifier/test-AFAQFKOB.mjs.map +1 -0
  82. package/dist/agent-verifier/workspace-codegen-2ZMQRIKJ.mjs +10 -0
  83. package/dist/agent-verifier/workspace-codegen-2ZMQRIKJ.mjs.map +1 -0
  84. package/dist/agent-verifier/{workspace-dependencies-HZ6VVS4G.mjs → workspace-dependencies-NOOQBK6I.mjs} +5 -4
  85. package/dist/agent-verifier/workspace-dependencies-NOOQBK6I.mjs.map +1 -0
  86. package/dist/{chunk-C6UAT6EH.js → chunk-N7XPNNUI.js} +9 -12
  87. package/dist/chunk-N7XPNNUI.js.map +1 -0
  88. package/dist/chunk-SEGVTWSK.js +44 -0
  89. package/dist/chunk-SEGVTWSK.js.map +1 -0
  90. package/dist/{chunk-RS7UXJZV.js → chunk-TAQKH67O.js} +21300 -35881
  91. package/dist/chunk-TAQKH67O.js.map +1 -0
  92. package/dist/{global-config-AGFBDFYD.js → global-config-S4ZIPECE.js} +3 -3
  93. package/dist/global-config-S4ZIPECE.js.map +1 -0
  94. package/dist/index.js +415 -37
  95. package/dist/index.js.map +1 -1
  96. package/dist/internal.js +3 -4
  97. package/dist/{agent-verifier/keychain-backend-TNOPQV3Z.mjs → keychain-backend-HDF4TZDL.js} +2 -1
  98. package/dist/{agent-verifier/prompt-3BAINGAQ.mjs → prompt-NDV3AE5L.js} +2 -1
  99. package/package.json +8 -7
  100. package/skills/dreamboard/references/building-your-first-game.md +510 -0
  101. package/skills/dreamboard/references/cli.md +104 -0
  102. package/skills/dreamboard/references/game-interface.md +548 -0
  103. package/skills/dreamboard/references/manifest-authoring.md +597 -0
  104. package/skills/dreamboard/references/quickstart.md +66 -0
  105. package/skills/dreamboard/references/reducer.md +864 -0
  106. package/skills/dreamboard/references/rule-authoring.md +147 -0
  107. package/skills/dreamboard/references/testing.md +249 -0
  108. package/skills/dreamboard/scripts/events-extract.mjs +218 -0
  109. package/dist/agent-verifier/chunk-54TAYXUD.mjs +0 -12
  110. package/dist/agent-verifier/chunk-6UUJEYDV.mjs +0 -213
  111. package/dist/agent-verifier/chunk-HBNDKQT5.mjs +0 -8381
  112. package/dist/agent-verifier/chunk-LI3ZR3BI.mjs +0 -41
  113. package/dist/agent-verifier/chunk-U6OJN7XS.mjs +0 -8092
  114. package/dist/agent-verifier/chunk-XYDL7GY6.mjs +0 -10
  115. package/dist/agent-verifier/local-typecheck-QFYYAZOK.mjs +0 -9
  116. package/dist/agent-verifier/reducer-contract-preflight-22X7DSZW.mjs +0 -10
  117. package/dist/agent-verifier/static-scaffold-AJMZZQWS.mjs +0 -28
  118. package/dist/agent-verifier/testing-5K2BJYF2.mjs +0 -674
  119. package/dist/agent-verifier/workspace-codegen-JDZJRSDV.mjs +0 -11
  120. package/dist/chunk-2H7UOFLK.js +0 -11
  121. package/dist/chunk-7FOO4AJI.js +0 -50
  122. package/dist/chunk-7FOO4AJI.js.map +0 -1
  123. package/dist/chunk-C6UAT6EH.js.map +0 -1
  124. package/dist/chunk-RS7UXJZV.js.map +0 -1
  125. package/dist/internal.d.ts +0 -311
  126. package/dist/runtime-packages/ui-host-runtime/src/actor-principal.ts +0 -71
  127. package/dist/runtime-packages/ui-host-runtime/src/browser-interaction.ts +0 -139
  128. package/dist/runtime-packages/ui-host-runtime/src/components/host-controls.tsx +0 -374
  129. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback-toaster.tsx +0 -266
  130. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback.tsx +0 -212
  131. package/dist/runtime-packages/ui-host-runtime/src/components/host-primitives.tsx +0 -271
  132. package/dist/runtime-packages/ui-host-runtime/src/components/host-session-metadata.tsx +0 -135
  133. package/dist/runtime-packages/ui-host-runtime/src/components/index.ts +0 -5
  134. package/dist/runtime-packages/ui-host-runtime/src/components/perf-overlay.tsx +0 -194
  135. package/dist/runtime-packages/ui-host-runtime/src/gameplay-authority-transport.ts +0 -626
  136. package/dist/runtime-packages/ui-host-runtime/src/host-controls.tsx +0 -1
  137. package/dist/runtime-packages/ui-host-runtime/src/host-feedback.tsx +0 -1
  138. package/dist/runtime-packages/ui-host-runtime/src/host-session-transport.ts +0 -294
  139. package/dist/runtime-packages/ui-host-runtime/src/index.ts +0 -3
  140. package/dist/runtime-packages/ui-host-runtime/src/logger.ts +0 -11
  141. package/dist/runtime-packages/ui-host-runtime/src/perf.ts +0 -324
  142. package/dist/runtime-packages/ui-host-runtime/src/plugin-bridge.ts +0 -195
  143. package/dist/runtime-packages/ui-host-runtime/src/plugin-health-check.ts +0 -138
  144. package/dist/runtime-packages/ui-host-runtime/src/plugin-messages.ts +0 -159
  145. package/dist/runtime-packages/ui-host-runtime/src/plugin-session-gateway.ts +0 -551
  146. package/dist/runtime-packages/ui-host-runtime/src/runtime/index.ts +0 -13
  147. package/dist/runtime-packages/ui-host-runtime/src/screenshot/projection-to-snapshot.ts +0 -122
  148. package/dist/runtime-packages/ui-host-runtime/src/screenshot/static-store-api.ts +0 -26
  149. package/dist/runtime-packages/ui-host-runtime/src/session-ingress-controller.ts +0 -583
  150. package/dist/runtime-packages/ui-host-runtime/src/session-ingress.ts +0 -219
  151. package/dist/runtime-packages/ui-host-runtime/src/session-live-runtime.ts +0 -117
  152. package/dist/runtime-packages/ui-host-runtime/src/session-model.ts +0 -431
  153. package/dist/runtime-packages/ui-host-runtime/src/session-projection.ts +0 -211
  154. package/dist/runtime-packages/ui-host-runtime/src/session-recovery.ts +0 -80
  155. package/dist/runtime-packages/ui-host-runtime/src/session-state-reducer.ts +0 -1034
  156. package/dist/runtime-packages/ui-host-runtime/src/sse-manager.ts +0 -416
  157. package/dist/runtime-packages/ui-host-runtime/src/unified-session-store.ts +0 -184
  158. package/dist/testing-KLSV6CPJ.js +0 -674
  159. package/dist/testing-KLSV6CPJ.js.map +0 -1
  160. /package/dist/{chunk-2H7UOFLK.js.map → agent-verifier/chunk-SKI2ESE5.mjs.map} +0 -0
  161. /package/dist/{global-config-AGFBDFYD.js.map → agent-verifier/global-config-Y2NTSK4R.mjs.map} +0 -0
  162. /package/dist/{keychain-backend-JHTXAKWC.js.map → keychain-backend-HDF4TZDL.js.map} +0 -0
  163. /package/dist/{prompt-GMZABCJC.js.map → prompt-NDV3AE5L.js.map} +0 -0
package/README.md CHANGED
@@ -1,50 +1,207 @@
1
- # Dreamboard CLI
1
+ # dreamboard
2
2
 
3
- Dreamboard CLI supports three main workflows:
3
+ Dreamboard CLI for working with Dreamboard games from your own editor/tooling.
4
4
 
5
- - Authoring: `dreamboard sync`, `dreamboard compile`, `dreamboard pull`
6
- - Interactive verification: `dreamboard dev`
7
- - Scripted verification: `dreamboard test generate`, `dreamboard test run`
5
+ Dreamboard is built to take you from napkin sketch to playable prototype without the paper cuts:
6
+
7
+ - Describe the game you want to make.
8
+ - Generate the rules, components, and scaffolding.
9
+ - Playtest instantly with a frictionless lobby and live iteration loops.
10
+
11
+ The platform’s core promise is the same one described on the landing page: digital prototyping for everyone, with AI helping you move from idea to playable faster.
8
12
 
9
13
  ## Install
10
14
 
15
+ Published npm package:
16
+
11
17
  ```bash
12
18
  npm install -g dreamboard
19
+ ```
20
+
21
+ The published CLI targets Node 20+.
22
+
23
+ ## Why Dreamboard
24
+
25
+ - `Describe`: start from theme, mechanics, and player experience instead of boilerplate setup.
26
+ - `Generate`: Dreamboard handles the sandbox primitives like turns, hands, and structured scaffolding.
27
+ - `Playtest`: share a live prototype instead of printing fresh paper every time a rule changes.
28
+ - `Iterate live`: keep testing momentum by changing values and flows without resetting the whole process.
29
+
30
+ ## Authentication
31
+
32
+ Use browser login:
33
+
34
+ ```bash
13
35
  dreamboard login
14
36
  ```
15
37
 
16
- ## Create a game
38
+ The published CLI stores your refreshable session in:
39
+
40
+ ```bash
41
+ ~/.dreamboard/config.json
42
+ ```
43
+
44
+ That stored session includes the refresh token the CLI needs to renew access automatically. Direct JWT injection is intentionally not part of the published CLI flow.
45
+
46
+ ## Source Checkout Setup
47
+
48
+ For local source-checkout development, install workspace dependencies with pnpm and keep Bun available for local embedded-harness workflows:
49
+
50
+ ```bash
51
+ pnpm install
52
+ ```
53
+
54
+ Playwright (for `dreamboard run`):
55
+
56
+ ```bash
57
+ npx playwright install
58
+ ```
59
+
60
+ ## Commands
61
+
62
+ Create a new game:
63
+
64
+ ```bash
65
+ dreamboard new my-game --description "A trick-taking card game"
66
+ ```
67
+
68
+ Clone an existing game:
17
69
 
18
70
  ```bash
19
- dreamboard new my-game --description "A short game description"
20
- cd my-game
71
+ dreamboard clone my-game
21
72
  ```
22
73
 
23
- ## Iterate
74
+ Sync local authored changes and regenerate scaffolded files:
24
75
 
25
76
  ```bash
26
77
  dreamboard sync
78
+ dreamboard sync --update-sdk
79
+ ```
80
+
81
+ If the remote has advanced unexpectedly, reconcile authored changes explicitly with:
82
+
83
+ ```bash
84
+ dreamboard pull
85
+ ```
86
+
87
+ Compile the current authored head:
88
+
89
+ ```bash
27
90
  dreamboard compile
28
- dreamboard dev
91
+ dreamboard compile --skip-local-check
92
+ ```
93
+
94
+ Inspect local vs remote state:
95
+
96
+ ```bash
97
+ dreamboard status
98
+ dreamboard status --json
99
+ ```
100
+
101
+ Run the game locally (server-compiled UI):
102
+
103
+ ```bash
104
+ dreamboard run
105
+ dreamboard run --players 4
106
+ dreamboard run --seed 1337
107
+ dreamboard run --new-session
108
+ ```
109
+
110
+ If no successful compile exists for the current authored state yet, `dreamboard run` will ask you to run `dreamboard compile` first.
111
+ By default, the CLI uses `manifest.json`'s `playerConfig.minPlayers` to decide how many seats to create.
112
+
113
+ `dreamboard run` now defaults to a wait-and-observe loop when no scenario is provided:
114
+
115
+ 1. Reuse the previous active session (`--resume` defaults to true) unless `--new-session` is set.
116
+ 2. Subscribe to session SSE events.
117
+ 3. Exit when `YOUR_TURN` (default `--until`) or `GAME_ENDED` is received.
118
+ 4. Persist artifacts in `.dreamboard/run/`:
119
+ - `session.json`
120
+ - `events.ndjson`
121
+ - `latest-your-turn.json`
122
+ - `last-run-summary.json`
123
+
124
+ `dreamboard run` is deterministic-by-default for new sessions: if `--seed` is not provided, it uses `1337`.
125
+
126
+ Useful flags:
127
+
128
+ - `--until YOUR_TURN|GAME_ENDED|ANY`
129
+ - `--observe-events turns|all` (default `turns`; persist `YOUR_TURN` and `ACTION_REJECTED` messages)
130
+ - `--seed <int>` (deterministic RNG seed for new sessions, default `1337`)
131
+ - `--timeout-ms <ms>`
132
+ - `--max-events <count>`
133
+ - `--screenshot` (capture one Playwright screenshot for the selected run session)
134
+ - `--output <path>`
135
+ - `--delay <ms>`
136
+ - `--width <px>`
137
+ - `--height <px>`
138
+ - `--scenario-driver api|ui` (default `api`)
139
+
140
+ Playwright launch is now optional:
141
+
142
+ 1. It is launched when `--scenario-driver ui` is used.
143
+ 2. It is launched when `--screenshot` is used.
144
+ 3. Default API scenarios (`--scenario` with `--scenario-driver api`) do not require Playwright.
145
+ 4. Pure observe runs (`dreamboard run` without scenario/screenshot) do not require a browser session.
146
+
147
+ ## Scenario Files
148
+
149
+ `dreamboard run --scenario <file>` supports scenario JSON (API driver by default):
150
+
151
+ ```json
152
+ {
153
+ "steps": [
154
+ {
155
+ "playerId": "player-1",
156
+ "actionType": "playCard",
157
+ "parameters": { "cardId": "hearts-7" },
158
+ "turns": 1
159
+ },
160
+ {
161
+ "playerId": "player-1",
162
+ "actionType": "endTurn",
163
+ "parameters": {},
164
+ "turns": 1
165
+ }
166
+ ]
167
+ }
168
+ ```
169
+
170
+ `playerId` is required on every scenario step. The CLI executes all steps in order per invocation:
171
+
172
+ ```bash
173
+ dreamboard run
174
+ dreamboard run --scenario path/to/scenario.json
175
+ dreamboard run --scenario path/to/scenario.json --scenario-driver ui
29
176
  ```
30
177
 
31
- `dreamboard dev` starts the local iframe host for the current project while gameplay continues on the backend.
178
+ If there is no current `.dreamboard/run/latest-your-turn.json` for the active session (for example with `--new-session`), `dreamboard run --scenario ...` first observes SSE until it receives the initial `YOUR_TURN`, then starts executing scenario steps.
179
+
180
+ API-driven scenarios are strict per step: after each `submitAction`, the CLI waits for either `ACTION_EXECUTED` or `ACTION_REJECTED`. On rejection, it stops immediately with `stopReason=scenario_rejected`.
181
+
182
+ Screenshots are saved to `.dreamboard/screenshots/` by default. The CLI captures the same session selected by `--resume` / `--new-session`.
32
183
 
33
- ## Test
184
+ To capture a screenshot during observe or scenario runs:
34
185
 
35
186
  ```bash
36
- dreamboard test generate
37
- dreamboard test run
38
- dreamboard test run --scenario test/scenarios/example.scenario.ts
187
+ dreamboard run --screenshot
188
+ dreamboard run --scenario path/to/scenario.json --screenshot
189
+ dreamboard run --screenshot --output ./shot.png --delay 1500 --width 1440 --height 900
39
190
  ```
40
191
 
41
- Scenario assertions must use the projection-only API from `test/testing-types.ts`:
192
+ ## Notes
42
193
 
43
- - `players()`
44
- - `state()`
45
- - `view(playerId)`
46
- - `expect`
194
+ - Project state lives in `.dreamboard/project.json`.
195
+ - Snapshots for `status` are stored in `.dreamboard/snapshot.json`.
196
+ - Published/public CLI installs target Node 20+ and support remote workflows.
197
+ - Published/public CLI builds are production-only; they do not support environment overrides or direct JWT injection.
198
+ - Local embedded-harness testing remains Bun-only and requires a source checkout with local backend support.
199
+ - Internal source-checkout builds may expose extra auth and environment helpers, but those are not part of the published CLI contract.
47
200
 
48
- ## Scaffold ownership
201
+ ## Skill Source
49
202
 
50
- Framework-owned static scaffold files are restored by `dreamboard sync`. Generated projects no longer expose wire-format message typings.
203
+ - Public skill source lives under `skills/dreamboard/`.
204
+ - `skills/dreamboard/references/*.md` are generated from `docs/` via `pnpm run sync:skill-docs`.
205
+ - `dreamboard new` installs the bundled skill into `.agents/skills/dreamboard/` in the generated game project.
206
+ - The Node helper script for run-artifact inspection is `.agents/skills/dreamboard/scripts/events-extract.mjs`.
207
+ - Public GitHub repo for the CLI is [dreamboard-games/dreamboard-cli](https://github.com/dreamboard-games/dreamboard-cli).
@@ -3,16 +3,16 @@ import {
3
3
  assertCompilerPortableDependencies,
4
4
  consola,
5
5
  resolveProjectContext
6
- } from "./chunk-JH22JNYD.mjs";
7
- import "./chunk-HJFQDSTU.mjs";
8
- import "./chunk-4WD3YU2E.mjs";
9
- import "./chunk-2E5P5NWG.mjs";
10
- import "./chunk-MINCYHXN.mjs";
11
- import "./chunk-LM3OZLZG.mjs";
12
- import "./chunk-SHUMAVAP.mjs";
13
- import "./chunk-XYDL7GY6.mjs";
6
+ } from "./chunk-3UKQVWLV.mjs";
7
+ import "./chunk-SH5JKYOB.mjs";
8
+ import "./chunk-776W3UGV.mjs";
9
+ import "./chunk-NAK77WXW.mjs";
10
+ import "./chunk-TAEQKBJB.mjs";
11
+ import "./chunk-IAYRNVUC.mjs";
12
+ import "./chunk-H76MT5UR.mjs";
13
+ import "./chunk-SKI2ESE5.mjs";
14
14
 
15
- // src/agent-workspace-verifier.ts
15
+ // src/agent-verifier/agent-workspace-verifier.ts
16
16
  import { readFile } from "fs/promises";
17
17
  main().catch((error) => {
18
18
  console.error(error instanceof Error ? error.message : String(error));
@@ -39,15 +39,17 @@ function printHelp() {
39
39
 
40
40
  Usage:
41
41
  agent-workspace-verifier materialize-prepared-workspace --input <path>
42
- agent-workspace-verifier preflight [--env local|dev|prod]
43
- agent-workspace-verifier verify [--env local|dev|prod]
44
- agent-workspace-verifier fin [--env local|dev|prod]
42
+ agent-workspace-verifier preflight [--env local|staging|prod]
43
+ agent-workspace-verifier verify [--env local|staging|prod]
44
+ agent-workspace-verifier fin [--env local|staging|prod]
45
45
  `);
46
46
  }
47
47
  async function materializePreparedWorkspace(args) {
48
48
  const inputPath = readRequiredOption(args, "--input");
49
- const input = JSON.parse(await readFile(inputPath, "utf8"));
50
- const { materializeWorkspaceProject } = await import("./materialize-workspace-FKALAE2T.mjs");
49
+ const { materializeWorkspaceProject } = await import("./materialize-workspace-ZAVGQQSF.mjs");
50
+ const input = JSON.parse(
51
+ await readFile(inputPath, "utf8")
52
+ );
51
53
  await materializeWorkspaceProject({
52
54
  ...input,
53
55
  agentManaged: true,
@@ -80,9 +82,9 @@ async function verifyAgentWorkspace(rawMode, args) {
80
82
  }
81
83
  async function runFullBackendConnectedVerification(parsedFlags) {
82
84
  const [{ default: cmdSync }, { default: cmdCompile }, { default: cmdTest }] = await Promise.all([
83
- import("./sync-3DUQH32H.mjs"),
84
- import("./compile-5QSPIOUT.mjs"),
85
- import("./test-P4U5INTD.mjs")
85
+ import("./sync-THAI546U.mjs"),
86
+ import("./compile-TEQVA46V.mjs"),
87
+ import("./test-AFAQFKOB.mjs")
86
88
  ]);
87
89
  await runCommandDefinition(cmdSync, { ...parsedFlags, force: true });
88
90
  await runCommandDefinition(cmdCompile, parsedFlags);
@@ -90,10 +92,7 @@ async function runFullBackendConnectedVerification(parsedFlags) {
90
92
  resolveTestSubCommand(cmdTest, "generate"),
91
93
  parsedFlags
92
94
  );
93
- await runCommandDefinition(
94
- resolveTestSubCommand(cmdTest, "run"),
95
- parsedFlags
96
- );
95
+ await runCommandDefinition(resolveTestSubCommand(cmdTest, "run"), parsedFlags);
97
96
  }
98
97
  async function runCommandDefinition(command, args) {
99
98
  if (!command.run) {
@@ -149,12 +148,12 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
149
148
  { assertReducerContractPreflight },
150
149
  { getProjectLocalMaintainerRegistry }
151
150
  ] = await Promise.all([
152
- import("./static-scaffold-AJMZZQWS.mjs"),
153
- import("./local-files-MTPLP62S.mjs"),
154
- import("./workspace-codegen-JDZJRSDV.mjs"),
155
- import("./workspace-dependencies-HZ6VVS4G.mjs"),
156
- import("./reducer-contract-preflight-22X7DSZW.mjs"),
157
- import("./project-state-7GR6BQTQ.mjs")
151
+ import("./static-scaffold-R7SVDRQI.mjs"),
152
+ import("./local-files-JFOQQZDL.mjs"),
153
+ import("./workspace-codegen-2ZMQRIKJ.mjs"),
154
+ import("./workspace-dependencies-NOOQBK6I.mjs"),
155
+ import("./reducer-contract-preflight-TUMQ43JV.mjs"),
156
+ import("./project-state-K576C2TE.mjs")
158
157
  ]);
159
158
  consola.start("Refreshing static scaffold...");
160
159
  await scaffoldStaticWorkspace(projectRoot, "update", {
@@ -168,8 +167,8 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
168
167
  consola.start("Validating reducer contract...");
169
168
  await assertReducerContractPreflight(projectRoot);
170
169
  const [{ runLocalTypecheck }, { assertReducerBundleSmoke }] = await Promise.all([
171
- import("./local-typecheck-QFYYAZOK.mjs"),
172
- import("./reducer-bundle-preflight-C73LEXI2.mjs")
170
+ import("./local-typecheck-XVGWI75X.mjs"),
171
+ import("./reducer-bundle-preflight-LXNJUBKL.mjs")
173
172
  ]);
174
173
  consola.start("Running local typecheck...");
175
174
  const typecheckResult = await runLocalTypecheck(projectRoot);
@@ -187,7 +186,7 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
187
186
  generateReducerNativeArtifacts,
188
187
  isReducerNativeTestingWorkspace,
189
188
  runReducerNativeScenarios
190
- } = await import("./reducer-native-test-harness-GMWBUISX.mjs");
189
+ } = await import("./reducer-native-test-harness-CHX5MBL5.mjs");
191
190
  if (await isReducerNativeTestingWorkspace(projectRoot)) {
192
191
  const { bases } = await generateReducerNativeArtifacts({
193
192
  projectRoot,
@@ -225,3 +224,4 @@ function readRequiredOption(args, name) {
225
224
  }
226
225
  return value;
227
226
  }
227
+ //# sourceMappingURL=agent-workspace-verifier.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agent-verifier/agent-workspace-verifier.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport consola from \"consola\";\nimport type { CommandDef } from \"citty\";\nimport type { ConfigFlags } from \"../flags.js\";\nimport type { ProjectConfig, ResolvedConfig } from \"../types.js\";\nimport { resolveProjectContext } from \"../config/resolve.js\";\nimport { assertCompilerPortableDependencies } from \"../services/project/dependency-portability.js\";\n\ntype VerificationMode = \"preflight\" | \"verify\" | \"fin\" | \"cloud-local\";\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n\nasync function main() {\n const [command, ...args] = process.argv.slice(2);\n if (command === \"--help\" || command === \"help\") {\n printHelp();\n return;\n }\n if (command === \"materialize-prepared-workspace\") {\n if (args.includes(\"--help\")) {\n printHelp();\n return;\n }\n await materializePreparedWorkspace(args);\n return;\n }\n await verifyAgentWorkspace(command ?? \"verify\", args);\n}\n\nfunction printHelp() {\n console.log(`Dreamboard agent workspace verifier\n\nUsage:\n agent-workspace-verifier materialize-prepared-workspace --input <path>\n agent-workspace-verifier preflight [--env local|staging|prod]\n agent-workspace-verifier verify [--env local|staging|prod]\n agent-workspace-verifier fin [--env local|staging|prod]\n`);\n}\n\nasync function materializePreparedWorkspace(args: string[]) {\n const inputPath = readRequiredOption(args, \"--input\");\n const { materializeWorkspaceProject } = await import(\n \"../services/project/materialize-workspace.js\"\n );\n const input = JSON.parse(\n await readFile(inputPath, \"utf8\"),\n ) as Parameters<typeof materializeWorkspaceProject>[0];\n await materializeWorkspaceProject({\n ...input,\n agentManaged: true,\n workspacePrepared: true,\n allowCreateGame: false,\n installDependencies: false,\n });\n consola.success(`Prepared workspace in ${input.targetDir}`);\n}\n\nasync function verifyAgentWorkspace(rawMode: string, args: string[]) {\n const requestedMode = parseVerificationMode(rawMode);\n const parsedFlags = parseConfigArgs(args);\n const { projectRoot, projectConfig, config } =\n await resolveProjectContext(parsedFlags);\n await assertCompilerPortableDependencies({ projectRoot, projectConfig });\n\n if (requestedMode === \"preflight\") {\n consola.success(\"Agent workspace preflight passed.\");\n return;\n }\n\n if (process.env.DREAMBOARD_AGENT_FINAL_SYNC_VERIFY === \"1\") {\n await runFullBackendConnectedVerification(parsedFlags);\n return;\n }\n\n if (\n requestedMode === \"cloud-local\" ||\n requestedMode === \"verify\" ||\n requestedMode === \"fin\"\n ) {\n await runCloudLocalVerification(projectRoot, projectConfig, config);\n return;\n }\n\n throw new Error(\n \"Agent workspaces now run cloud-local verification directly. Use `fin` only through the generated wrapper.\",\n );\n}\n\nasync function runFullBackendConnectedVerification(\n parsedFlags: ConfigFlags,\n): Promise<void> {\n const [{ default: cmdSync }, { default: cmdCompile }, { default: cmdTest }] =\n await Promise.all([\n import(\"../commands/sync.js\"),\n import(\"../commands/compile.js\"),\n import(\"../commands/test.js\"),\n ]);\n await runCommandDefinition(cmdSync, { ...parsedFlags, force: true });\n await runCommandDefinition(cmdCompile, parsedFlags);\n await runCommandDefinition(\n resolveTestSubCommand(cmdTest, \"generate\"),\n parsedFlags,\n );\n await runCommandDefinition(resolveTestSubCommand(cmdTest, \"run\"), parsedFlags);\n}\n\nasync function runCommandDefinition(\n command: CommandDef<any>,\n args: Record<string, unknown>,\n) {\n if (!command.run) {\n throw new Error(\"Verifier command is missing a runnable step.\");\n }\n await command.run({ args, rawArgs: [], cmd: command } as any);\n}\n\nfunction resolveTestSubCommand(\n cmdTest: CommandDef<any>,\n name: \"generate\" | \"run\",\n): CommandDef<any> {\n const subCommands = cmdTest.subCommands as\n | Record<string, CommandDef<any>>\n | undefined;\n const command = subCommands?.[name];\n if (!command) {\n throw new Error(`Verifier command is missing test ${name}.`);\n }\n return command;\n}\n\nfunction parseVerificationMode(value: unknown): VerificationMode {\n if (\n value === \"preflight\" ||\n value === \"verify\" ||\n value === \"fin\" ||\n value === \"cloud-local\"\n ) {\n return value;\n }\n throw new Error(\n `Expected mode to be one of preflight, verify, fin, or cloud-local. Received: ${String(value)}`,\n );\n}\n\nfunction parseConfigArgs(args: string[]): ConfigFlags {\n const flags: ConfigFlags = {};\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--env\") {\n const value = args[++index];\n if (value === \"local\" || value === \"staging\" || value === \"prod\") {\n flags.env = value;\n continue;\n }\n throw new Error(`Invalid --env value: ${String(value)}`);\n }\n if (arg === \"--token\") {\n flags.token = args[++index];\n continue;\n }\n if (arg === \"--skip-install\") {\n continue;\n }\n throw new Error(`Unknown verifier argument: ${arg}`);\n }\n return flags;\n}\n\nasync function runCloudLocalVerification(\n projectRoot: string,\n projectConfig: ProjectConfig,\n config: ResolvedConfig,\n): Promise<void> {\n const [\n { scaffoldStaticWorkspace },\n { loadManifest },\n { applyWorkspaceCodegen },\n { reconcileWorkspaceDependencies },\n { assertReducerContractPreflight },\n { getProjectLocalMaintainerRegistry },\n ] = await Promise.all([\n import(\"../services/project/static-scaffold.js\"),\n import(\"../services/project/local-files.js\"),\n import(\"../services/project/workspace-codegen.js\"),\n import(\"../services/project/workspace-dependencies.js\"),\n import(\"../services/project/reducer-contract-preflight.js\"),\n import(\"../services/project/project-state.js\"),\n ]);\n\n consola.start(\"Refreshing static scaffold...\");\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: getProjectLocalMaintainerRegistry(projectConfig),\n });\n\n consola.start(\"Applying workspace codegen...\");\n const manifest = await loadManifest(projectRoot);\n await applyWorkspaceCodegen({ projectRoot, manifest });\n\n consola.start(\"Reconciling workspace dependencies...\");\n await reconcileWorkspaceDependencies(projectRoot);\n\n consola.start(\"Validating reducer contract...\");\n await assertReducerContractPreflight(projectRoot);\n\n const [{ runLocalTypecheck }, { assertReducerBundleSmoke }] =\n await Promise.all([\n import(\"../services/project/local-typecheck.js\"),\n import(\"../services/project/reducer-bundle-preflight.js\"),\n ]);\n\n consola.start(\"Running local typecheck...\");\n const typecheckResult = await runLocalTypecheck(projectRoot);\n if (typecheckResult.skipped) {\n if (typecheckResult.output) consola.warn(typecheckResult.output);\n } else if (!typecheckResult.success) {\n if (typecheckResult.output) consola.error(typecheckResult.output);\n throw new Error(\n \"Local typecheck failed. Fix the diagnostics before syncing.\",\n );\n }\n\n consola.start(\"Smoke-testing reducer bundle...\");\n await assertReducerBundleSmoke({ projectRoot, manifest });\n\n const {\n generateReducerNativeArtifacts,\n isReducerNativeTestingWorkspace,\n runReducerNativeScenarios,\n } = await import(\n \"../services/testing/reducer-native-test-harness.js\"\n );\n\n if (await isReducerNativeTestingWorkspace(projectRoot)) {\n const { bases } = await generateReducerNativeArtifacts({\n projectRoot,\n gameId: projectConfig.gameId,\n compiledResultId: projectConfig.compile?.latestSuccessful?.resultId,\n });\n const summary = await runReducerNativeScenarios({\n projectRoot,\n projectConfig,\n resolvedConfig: config,\n runner: \"reducer\",\n gameId: projectConfig.gameId,\n compiledResultId: projectConfig.compile?.latestSuccessful?.resultId,\n });\n if (summary.failed > 0) {\n const failures = summary.results\n .filter((result) => !result.success)\n .map((result) =>\n result.error\n ? `FAIL ${result.id}: ${result.error}`\n : `FAIL ${result.id}`,\n );\n throw new Error(\n [\n `Reducer-native verification failed: ${summary.failed} failed, ${summary.passed} passed.`,\n ...failures,\n ].join(\"\\n\"),\n );\n }\n consola.success(`Generated ${bases.length} reducer-native base state(s).`);\n }\n\n consola.success(\"Agent workspace cloud-local verification passed.\");\n}\n\nfunction readRequiredOption(args: string[], name: string): string {\n const index = args.indexOf(name);\n const value = index >= 0 ? args[index + 1] : undefined;\n if (!value) {\n throw new Error(`${name} is required.`);\n }\n return value;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB;AAUzB,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,eAAe,OAAO;AACpB,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC/C,MAAI,YAAY,YAAY,YAAY,QAAQ;AAC9C,cAAU;AACV;AAAA,EACF;AACA,MAAI,YAAY,kCAAkC;AAChD,QAAI,KAAK,SAAS,QAAQ,GAAG;AAC3B,gBAAU;AACV;AAAA,IACF;AACA,UAAM,6BAA6B,IAAI;AACvC;AAAA,EACF;AACA,QAAM,qBAAqB,WAAW,UAAU,IAAI;AACtD;AAEA,SAAS,YAAY;AACnB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOb;AACD;AAEA,eAAe,6BAA6B,MAAgB;AAC1D,QAAM,YAAY,mBAAmB,MAAM,SAAS;AACpD,QAAM,EAAE,4BAA4B,IAAI,MAAM,OAC5C,sCACF;AACA,QAAM,QAAQ,KAAK;AAAA,IACjB,MAAM,SAAS,WAAW,MAAM;AAAA,EAClC;AACA,QAAM,4BAA4B;AAAA,IAChC,GAAG;AAAA,IACH,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB,CAAC;AACD,UAAQ,QAAQ,yBAAyB,MAAM,SAAS,EAAE;AAC5D;AAEA,eAAe,qBAAqB,SAAiB,MAAgB;AACnE,QAAM,gBAAgB,sBAAsB,OAAO;AACnD,QAAM,cAAc,gBAAgB,IAAI;AACxC,QAAM,EAAE,aAAa,eAAe,OAAO,IACzC,MAAM,sBAAsB,WAAW;AACzC,QAAM,mCAAmC,EAAE,aAAa,cAAc,CAAC;AAEvE,MAAI,kBAAkB,aAAa;AACjC,YAAQ,QAAQ,mCAAmC;AACnD;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,uCAAuC,KAAK;AAC1D,UAAM,oCAAoC,WAAW;AACrD;AAAA,EACF;AAEA,MACE,kBAAkB,iBAClB,kBAAkB,YAClB,kBAAkB,OAClB;AACA,UAAM,0BAA0B,aAAa,eAAe,MAAM;AAClE;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,oCACb,aACe;AACf,QAAM,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,WAAW,GAAG,EAAE,SAAS,QAAQ,CAAC,IACxE,MAAM,QAAQ,IAAI;AAAA,IAChB,OAAO,qBAAqB;AAAA,IAC5B,OAAO,wBAAwB;AAAA,IAC/B,OAAO,qBAAqB;AAAA,EAC9B,CAAC;AACH,QAAM,qBAAqB,SAAS,EAAE,GAAG,aAAa,OAAO,KAAK,CAAC;AACnE,QAAM,qBAAqB,YAAY,WAAW;AAClD,QAAM;AAAA,IACJ,sBAAsB,SAAS,UAAU;AAAA,IACzC;AAAA,EACF;AACA,QAAM,qBAAqB,sBAAsB,SAAS,KAAK,GAAG,WAAW;AAC/E;AAEA,eAAe,qBACb,SACA,MACA;AACA,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,QAAM,QAAQ,IAAI,EAAE,MAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAQ;AAC9D;AAEA,SAAS,sBACP,SACA,MACiB;AACjB,QAAM,cAAc,QAAQ;AAG5B,QAAM,UAAU,cAAc,IAAI;AAClC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oCAAoC,IAAI,GAAG;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAkC;AAC/D,MACE,UAAU,eACV,UAAU,YACV,UAAU,SACV,UAAU,eACV;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR,gFAAgF,OAAO,KAAK,CAAC;AAAA,EAC/F;AACF;AAEA,SAAS,gBAAgB,MAA6B;AACpD,QAAM,QAAqB,CAAC;AAC5B,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,QAAQ,SAAS;AACnB,YAAM,QAAQ,KAAK,EAAE,KAAK;AAC1B,UAAI,UAAU,WAAW,UAAU,aAAa,UAAU,QAAQ;AAChE,cAAM,MAAM;AACZ;AAAA,MACF;AACA,YAAM,IAAI,MAAM,wBAAwB,OAAO,KAAK,CAAC,EAAE;AAAA,IACzD;AACA,QAAI,QAAQ,WAAW;AACrB,YAAM,QAAQ,KAAK,EAAE,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,QAAQ,kBAAkB;AAC5B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,8BAA8B,GAAG,EAAE;AAAA,EACrD;AACA,SAAO;AACT;AAEA,eAAe,0BACb,aACA,eACA,QACe;AACf,QAAM;AAAA,IACJ,EAAE,wBAAwB;AAAA,IAC1B,EAAE,aAAa;AAAA,IACf,EAAE,sBAAsB;AAAA,IACxB,EAAE,+BAA+B;AAAA,IACjC,EAAE,+BAA+B;AAAA,IACjC,EAAE,kCAAkC;AAAA,EACtC,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,OAAO,gCAAwC;AAAA,IAC/C,OAAO,4BAAoC;AAAA,IAC3C,OAAO,kCAA0C;AAAA,IACjD,OAAO,uCAA+C;AAAA,IACtD,OAAO,2CAAmD;AAAA,IAC1D,OAAO,8BAAsC;AAAA,EAC/C,CAAC;AAED,UAAQ,MAAM,+BAA+B;AAC7C,QAAM,wBAAwB,aAAa,UAAU;AAAA,IACnD,yBAAyB,kCAAkC,aAAa;AAAA,EAC1E,CAAC;AAED,UAAQ,MAAM,+BAA+B;AAC7C,QAAM,WAAW,MAAM,aAAa,WAAW;AAC/C,QAAM,sBAAsB,EAAE,aAAa,SAAS,CAAC;AAErD,UAAQ,MAAM,uCAAuC;AACrD,QAAM,+BAA+B,WAAW;AAEhD,UAAQ,MAAM,gCAAgC;AAC9C,QAAM,+BAA+B,WAAW;AAEhD,QAAM,CAAC,EAAE,kBAAkB,GAAG,EAAE,yBAAyB,CAAC,IACxD,MAAM,QAAQ,IAAI;AAAA,IAChB,OAAO,gCAAwC;AAAA,IAC/C,OAAO,yCAAiD;AAAA,EAC1D,CAAC;AAEH,UAAQ,MAAM,4BAA4B;AAC1C,QAAM,kBAAkB,MAAM,kBAAkB,WAAW;AAC3D,MAAI,gBAAgB,SAAS;AAC3B,QAAI,gBAAgB,OAAQ,SAAQ,KAAK,gBAAgB,MAAM;AAAA,EACjE,WAAW,CAAC,gBAAgB,SAAS;AACnC,QAAI,gBAAgB,OAAQ,SAAQ,MAAM,gBAAgB,MAAM;AAChE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,MAAM,iCAAiC;AAC/C,QAAM,yBAAyB,EAAE,aAAa,SAAS,CAAC;AAExD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,OACR,4CACF;AAEA,MAAI,MAAM,gCAAgC,WAAW,GAAG;AACtD,UAAM,EAAE,MAAM,IAAI,MAAM,+BAA+B;AAAA,MACrD;AAAA,MACA,QAAQ,cAAc;AAAA,MACtB,kBAAkB,cAAc,SAAS,kBAAkB;AAAA,IAC7D,CAAC;AACD,UAAM,UAAU,MAAM,0BAA0B;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ,cAAc;AAAA,MACtB,kBAAkB,cAAc,SAAS,kBAAkB;AAAA,IAC7D,CAAC;AACD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,WAAW,QAAQ,QACtB,OAAO,CAAC,WAAW,CAAC,OAAO,OAAO,EAClC;AAAA,QAAI,CAAC,WACJ,OAAO,QACH,QAAQ,OAAO,EAAE,KAAK,OAAO,KAAK,KAClC,QAAQ,OAAO,EAAE;AAAA,MACvB;AACF,YAAM,IAAI;AAAA,QACR;AAAA,UACE,uCAAuC,QAAQ,MAAM,YAAY,QAAQ,MAAM;AAAA,UAC/E,GAAG;AAAA,QACL,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AACA,YAAQ,QAAQ,aAAa,MAAM,MAAM,gCAAgC;AAAA,EAC3E;AAEA,UAAQ,QAAQ,kDAAkD;AACpE;AAEA,SAAS,mBAAmB,MAAgB,MAAsB;AAChE,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,QAAM,QAAQ,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC7C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,GAAG,IAAI,eAAe;AAAA,EACxC;AACA,SAAO;AACT;","names":[]}
@@ -3,25 +3,25 @@ import {
3
3
  getStoredSession,
4
4
  loadGlobalConfig,
5
5
  setCredentials
6
- } from "./chunk-HJFQDSTU.mjs";
6
+ } from "./chunk-SH5JKYOB.mjs";
7
7
  import {
8
8
  IS_PUBLISHED_BUILD,
9
9
  PUBLISHED_ENVIRONMENT,
10
10
  findProjectRoot,
11
11
  loadProjectConfig
12
- } from "./chunk-4WD3YU2E.mjs";
12
+ } from "./chunk-776W3UGV.mjs";
13
13
  import {
14
14
  client
15
- } from "./chunk-2E5P5NWG.mjs";
15
+ } from "./chunk-NAK77WXW.mjs";
16
16
  import {
17
17
  readJsonFile,
18
18
  readTextFileIfExists
19
- } from "./chunk-LM3OZLZG.mjs";
19
+ } from "./chunk-IAYRNVUC.mjs";
20
20
  import {
21
21
  DEFAULT_API_BASE_URL,
22
22
  DEFAULT_WEB_BASE_URL,
23
23
  ENVIRONMENT_CONFIGS
24
- } from "./chunk-SHUMAVAP.mjs";
24
+ } from "./chunk-H76MT5UR.mjs";
25
25
 
26
26
  // ../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/core.mjs
27
27
  var LogLevels = {
@@ -1105,7 +1105,7 @@ function createConsola2(options = {}) {
1105
1105
  defaults: { level },
1106
1106
  stdout: process.stdout,
1107
1107
  stderr: process.stderr,
1108
- prompt: (...args) => import("./prompt-3BAINGAQ.mjs").then((m) => m.prompt(...args)),
1108
+ prompt: (...args) => import("./prompt-MJRJMOGQ.mjs").then((m) => m.prompt(...args)),
1109
1109
  reporters: options.reporters || [
1110
1110
  options.fancy ?? !(T || R) ? new FancyReporter() : new BasicReporter()
1111
1111
  ],
@@ -1142,8 +1142,9 @@ function assertConfigured(config) {
1142
1142
  throw new Error(
1143
1143
  [
1144
1144
  "Clerk OAuth CLI is not configured for this environment.",
1145
- "Set DREAMBOARD_CLERK_OAUTH_ISSUER and DREAMBOARD_CLERK_OAUTH_CLIENT_ID",
1146
- "or the environment-specific DREAMBOARD_<ENV>_CLERK_OAUTH_* variables.",
1145
+ "The CLI expects first-party environments to be configured in its built-in registry.",
1146
+ "If this environment has no registered public Clerk OAuth client, create one and release a CLI with its client id.",
1147
+ "For emergency overrides, set the environment-specific DREAMBOARD_<ENV>_CLERK_OAUTH_* variables or DREAMBOARD_CLERK_OAUTH_*.",
1147
1148
  "For local harness auth, use `pnpm auth:local` or the auto-bootstrapped local harness flows instead."
1148
1149
  ].join(" ")
1149
1150
  );
@@ -1290,6 +1291,7 @@ function resolveConfig(globalConfig, flags, project, credentials) {
1290
1291
  const resolvedWebBaseUrl = IS_PUBLISHED_BUILD ? publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.webBaseUrl, environment) || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;
1291
1292
  const webBaseUrl = valueOrUndefined(process.env.DREAMBOARD_WEB_BASE_URL) ?? resolvedWebBaseUrl;
1292
1293
  const snapshot = buildCredentialSnapshot(flags, credentials, environment);
1294
+ const oauthConfig = resolveEnvironmentOAuthConfig(environment, envConfig);
1293
1295
  return {
1294
1296
  environment,
1295
1297
  apiBaseUrl,
@@ -1297,14 +1299,31 @@ function resolveConfig(globalConfig, flags, project, credentials) {
1297
1299
  authToken: snapshot.accessToken,
1298
1300
  refreshToken: snapshot.refreshToken,
1299
1301
  tokenExpiresAt: snapshot.tokenExpiresAt,
1300
- clerkOAuthIssuer: snapshot.clerkOAuthIssuer ?? envConfig?.clerkOAuthIssuer,
1301
- clerkOAuthClientId: snapshot.clerkOAuthClientId ?? envConfig?.clerkOAuthClientId,
1302
- clerkOAuthTokenUrl: snapshot.clerkOAuthTokenUrl ?? valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_TOKEN_URL),
1303
- clerkOAuthScope: envConfig?.clerkOAuthScope,
1302
+ clerkOAuthIssuer: snapshot.clerkOAuthIssuer ?? oauthConfig.issuer,
1303
+ clerkOAuthClientId: snapshot.clerkOAuthClientId ?? oauthConfig.clientId,
1304
+ clerkOAuthTokenUrl: snapshot.clerkOAuthTokenUrl ?? oauthConfig.tokenUrl,
1305
+ clerkOAuthScope: oauthConfig.scope,
1304
1306
  authTokenSource: snapshot.authTokenSource,
1305
1307
  refreshTokenSource: snapshot.refreshTokenSource
1306
1308
  };
1307
1309
  }
1310
+ function resolveEnvironmentOAuthConfig(environment, envConfig) {
1311
+ const prefix = environment.toUpperCase();
1312
+ return {
1313
+ issuer: valueOrUndefined(
1314
+ process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_ISSUER`]
1315
+ ) ?? valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_ISSUER) ?? envConfig?.clerkOAuthIssuer,
1316
+ clientId: valueOrUndefined(
1317
+ process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_CLIENT_ID`]
1318
+ ) ?? valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_CLIENT_ID) ?? envConfig?.clerkOAuthClientId,
1319
+ tokenUrl: valueOrUndefined(
1320
+ process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_TOKEN_URL`]
1321
+ ) ?? valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_TOKEN_URL) ?? envConfig?.clerkOAuthTokenUrl,
1322
+ scope: valueOrUndefined(
1323
+ process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_SCOPE`]
1324
+ ) ?? valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_SCOPE) ?? envConfig?.clerkOAuthScope
1325
+ };
1326
+ }
1308
1327
  function buildCredentialSnapshot(flags, storedCredentials, environment) {
1309
1328
  const flagToken = valueOrUndefined(flags.token);
1310
1329
  const agentEnvToken = valueOrUndefined(process.env.DREAMBOARD_AGENT_TOKEN);
@@ -1548,6 +1567,10 @@ async function buildSourceDependencyProfile(options) {
1548
1567
  }
1549
1568
  async function assertCompilerPortableDependencies(options) {
1550
1569
  const packageJson = await readProjectPackageJson(options.projectRoot);
1570
+ const legacyProblems = collectLegacyDreamboardSpecifiers(packageJson);
1571
+ if (legacyProblems.length > 0) {
1572
+ throwLegacyDreamboardPackageError(legacyProblems);
1573
+ }
1551
1574
  const problems = collectUnportableDreamboardSpecifiers(packageJson);
1552
1575
  if (problems.length > 0) {
1553
1576
  const details = problems.map(
@@ -1557,7 +1580,7 @@ async function assertCompilerPortableDependencies(options) {
1557
1580
  [
1558
1581
  "Compiler-bound workspaces must install Dreamboard packages from a registry.",
1559
1582
  `Found unportable Dreamboard dependency specifier(s): ${details}.`,
1560
- "Run `dreamboard sync` from a workspace that uses registry-pinned @dreamboard/* and dreamboard versions before compiling."
1583
+ "Run `dreamboard sync` from a workspace that uses registry-pinned @dreamboard-games/* and dreamboard versions before compiling."
1561
1584
  ].join(" ")
1562
1585
  );
1563
1586
  }
@@ -1573,6 +1596,11 @@ async function assertCompilerPortableDependencies(options) {
1573
1596
  return profile;
1574
1597
  }
1575
1598
  async function assertReleaseEnvironmentPortableDependencies(options) {
1599
+ const packageJson = await readProjectPackageJson(options.projectRoot);
1600
+ const legacyProblems = collectLegacyDreamboardSpecifiers(packageJson);
1601
+ if (legacyProblems.length > 0) {
1602
+ throwLegacyDreamboardPackageError(legacyProblems);
1603
+ }
1576
1604
  const profile = await buildSourceDependencyProfile(options);
1577
1605
  if (!isReleaseEnvironment(options.environment)) {
1578
1606
  return profile;
@@ -1606,7 +1634,7 @@ function collectDreamboardPackageSpecifiers(packageJson) {
1606
1634
  const dependencies = packageJson[field];
1607
1635
  if (!dependencies) continue;
1608
1636
  for (const [packageName, specifier] of Object.entries(dependencies)) {
1609
- if (isDreamboardPackage(packageName)) {
1637
+ if (isPortableDreamboardPackage(packageName)) {
1610
1638
  packages[packageName] = specifier;
1611
1639
  }
1612
1640
  }
@@ -1614,7 +1642,7 @@ function collectDreamboardPackageSpecifiers(packageJson) {
1614
1642
  const overrides = packageJson.pnpm?.overrides;
1615
1643
  if (overrides) {
1616
1644
  for (const [packageName, specifier] of Object.entries(overrides)) {
1617
- if (isDreamboardPackage(packageName) && typeof specifier === "string" && packages[packageName] === void 0) {
1645
+ if (isPortableDreamboardPackage(packageName) && typeof specifier === "string" && packages[packageName] === void 0) {
1618
1646
  packages[packageName] = specifier;
1619
1647
  }
1620
1648
  }
@@ -1627,7 +1655,7 @@ function collectUnportableDreamboardSpecifiers(packageJson) {
1627
1655
  const dependencies = packageJson[field];
1628
1656
  if (!dependencies) continue;
1629
1657
  for (const [packageName, specifier] of Object.entries(dependencies)) {
1630
- if (isDreamboardPackage(packageName) && UNPORTABLE_SPECIFIER_PATTERN.test(specifier)) {
1658
+ if (isPortableDreamboardPackage(packageName) && UNPORTABLE_SPECIFIER_PATTERN.test(specifier)) {
1631
1659
  problems.push({ location: field, packageName, specifier });
1632
1660
  }
1633
1661
  }
@@ -1635,7 +1663,7 @@ function collectUnportableDreamboardSpecifiers(packageJson) {
1635
1663
  const overrides = packageJson.pnpm?.overrides;
1636
1664
  if (overrides) {
1637
1665
  for (const [packageName, specifier] of Object.entries(overrides)) {
1638
- if (isDreamboardPackage(packageName) && typeof specifier === "string" && UNPORTABLE_SPECIFIER_PATTERN.test(specifier)) {
1666
+ if (isPortableDreamboardPackage(packageName) && typeof specifier === "string" && UNPORTABLE_SPECIFIER_PATTERN.test(specifier)) {
1639
1667
  problems.push({
1640
1668
  location: "pnpm.overrides",
1641
1669
  packageName,
@@ -1646,8 +1674,42 @@ function collectUnportableDreamboardSpecifiers(packageJson) {
1646
1674
  }
1647
1675
  return problems;
1648
1676
  }
1649
- function isDreamboardPackage(packageName) {
1650
- return packageName === "dreamboard" || packageName.startsWith("@dreamboard/") || packageName.startsWith("@dreamboard-games/");
1677
+ function collectLegacyDreamboardSpecifiers(packageJson) {
1678
+ const problems = [];
1679
+ for (const field of DEPENDENCY_FIELDS) {
1680
+ const dependencies = packageJson[field];
1681
+ if (!dependencies) continue;
1682
+ for (const packageName of Object.keys(dependencies)) {
1683
+ if (isLegacyDreamboardPackage(packageName)) {
1684
+ problems.push({ location: field, packageName });
1685
+ }
1686
+ }
1687
+ }
1688
+ const overrides = packageJson.pnpm?.overrides;
1689
+ if (overrides) {
1690
+ for (const packageName of Object.keys(overrides)) {
1691
+ if (isLegacyDreamboardPackage(packageName)) {
1692
+ problems.push({ location: "pnpm.overrides", packageName });
1693
+ }
1694
+ }
1695
+ }
1696
+ return problems;
1697
+ }
1698
+ function throwLegacyDreamboardPackageError(problems) {
1699
+ const details = problems.map((problem) => `${problem.location} ${problem.packageName}`).join("; ");
1700
+ throw new Error(
1701
+ [
1702
+ "Legacy @dreamboard/* package dependencies are no longer supported in compiler-bound workspaces.",
1703
+ `Found ${details}.`,
1704
+ "Repin to the public @dreamboard-games/* packages and rerun the command."
1705
+ ].join(" ")
1706
+ );
1707
+ }
1708
+ function isPortableDreamboardPackage(packageName) {
1709
+ return packageName === "dreamboard" || packageName.startsWith("@dreamboard-games/");
1710
+ }
1711
+ function isLegacyDreamboardPackage(packageName) {
1712
+ return packageName.startsWith("@dreamboard/");
1651
1713
  }
1652
1714
  function isReleaseEnvironment(environment) {
1653
1715
  return environment === "staging" || environment === "prod";
@@ -1679,3 +1741,4 @@ export {
1679
1741
  assertCompilerPortableDependencies,
1680
1742
  assertReleaseEnvironmentPortableDependencies
1681
1743
  };
1744
+ //# sourceMappingURL=chunk-3UKQVWLV.mjs.map