@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.
- package/README.md +179 -22
- package/dist/agent-verifier/agent-workspace-verifier.mjs +30 -30
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-JH22JNYD.mjs → chunk-3UKQVWLV.mjs} +82 -19
- package/dist/agent-verifier/chunk-3UKQVWLV.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-4WD3YU2E.mjs → chunk-776W3UGV.mjs} +4 -3
- package/dist/agent-verifier/chunk-776W3UGV.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-CJEEA6NJ.mjs → chunk-7WWGFAAU.mjs} +9 -10
- package/dist/agent-verifier/chunk-7WWGFAAU.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-2SZHMP6F.mjs → chunk-A64ZZUZV.mjs} +6 -9
- package/dist/agent-verifier/chunk-A64ZZUZV.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-6A5HRJMQ.mjs → chunk-E7SSWJXJ.mjs} +62 -99
- package/dist/agent-verifier/chunk-E7SSWJXJ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-2GBBP27W.mjs → chunk-F2DIOJJZ.mjs} +1 -0
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-CFU5EWIC.mjs → chunk-G42BGGG2.mjs} +7 -6
- package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-SHUMAVAP.mjs → chunk-H76MT5UR.mjs} +7 -9
- package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-7E65UQLY.mjs → chunk-HGMUAL33.mjs} +3 -2
- package/dist/agent-verifier/chunk-HGMUAL33.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-LM3OZLZG.mjs → chunk-IAYRNVUC.mjs} +1 -0
- package/dist/agent-verifier/chunk-IAYRNVUC.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-VYJTHSYR.mjs → chunk-JGT4P4UD.mjs} +2 -1
- package/dist/agent-verifier/chunk-JGT4P4UD.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-CEDUHGNH.mjs → chunk-LUZ7KE6H.mjs} +8 -3
- package/dist/agent-verifier/chunk-LUZ7KE6H.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-2E5P5NWG.mjs → chunk-NAK77WXW.mjs} +58 -126
- package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-SYPLYRGB.mjs → chunk-O4YCPU7C.mjs} +116 -15
- package/dist/agent-verifier/chunk-O4YCPU7C.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-BVVNBJM4.mjs → chunk-S34FRJHS.mjs} +2 -1
- package/dist/agent-verifier/chunk-S34FRJHS.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-HJFQDSTU.mjs → chunk-SH5JKYOB.mjs} +6 -5
- package/dist/agent-verifier/chunk-SH5JKYOB.mjs.map +1 -0
- package/dist/agent-verifier/chunk-SKI2ESE5.mjs +44 -0
- package/dist/agent-verifier/{chunk-MINCYHXN.mjs → chunk-TAEQKBJB.mjs} +1 -0
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-CEQ2VJWN.mjs → chunk-UIOLGH4A.mjs} +2 -1
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +1 -0
- package/dist/agent-verifier/chunk-UIZNWRM6.mjs +2432 -0
- package/dist/agent-verifier/chunk-UIZNWRM6.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-2QMNAVV4.mjs → chunk-VS573ERH.mjs} +2 -1
- package/dist/agent-verifier/chunk-VS573ERH.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-EOQIV6PS.mjs → chunk-W3N3QJ4V.mjs} +75 -100
- package/dist/agent-verifier/chunk-W3N3QJ4V.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-EIQWDQWJ.mjs → chunk-XGWCY624.mjs} +11 -12
- package/dist/agent-verifier/chunk-XGWCY624.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-7653FPGJ.mjs → chunk-XQXDOBYB.mjs} +3 -2
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-MRCUP5SW.mjs → chunk-YE7UAO3T.mjs} +1 -0
- package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-RBDDIIPM.mjs → chunk-ZEELHSY3.mjs} +1 -0
- package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
- package/dist/agent-verifier/{compile-5QSPIOUT.mjs → compile-TEQVA46V.mjs} +24 -25
- package/dist/agent-verifier/compile-TEQVA46V.mjs.map +1 -0
- package/dist/agent-verifier/{global-config-WX3ZZIVU.mjs → global-config-Y2NTSK4R.mjs} +6 -5
- package/dist/{keychain-backend-JHTXAKWC.js → agent-verifier/keychain-backend-SPQWGKZN.mjs} +2 -2
- package/dist/agent-verifier/keychain-backend-SPQWGKZN.mjs.map +1 -0
- package/dist/agent-verifier/{local-files-MTPLP62S.mjs → local-files-JFOQQZDL.mjs} +10 -11
- package/dist/agent-verifier/local-files-JFOQQZDL.mjs.map +1 -0
- package/dist/agent-verifier/local-typecheck-XVGWI75X.mjs +10 -0
- package/dist/agent-verifier/local-typecheck-XVGWI75X.mjs.map +1 -0
- package/dist/agent-verifier/{materialize-workspace-FKALAE2T.mjs → materialize-workspace-ZAVGQQSF.mjs} +17 -18
- package/dist/agent-verifier/materialize-workspace-ZAVGQQSF.mjs.map +1 -0
- package/dist/agent-verifier/{project-state-7GR6BQTQ.mjs → project-state-K576C2TE.mjs} +3 -2
- package/dist/agent-verifier/project-state-K576C2TE.mjs.map +1 -0
- package/dist/{prompt-GMZABCJC.js → agent-verifier/prompt-MJRJMOGQ.mjs} +2 -2
- package/dist/agent-verifier/prompt-MJRJMOGQ.mjs.map +1 -0
- package/dist/agent-verifier/{reducer-bundle-preflight-C73LEXI2.mjs → reducer-bundle-preflight-LXNJUBKL.mjs} +6 -9
- package/dist/agent-verifier/reducer-bundle-preflight-LXNJUBKL.mjs.map +1 -0
- package/dist/agent-verifier/reducer-contract-preflight-TUMQ43JV.mjs +11 -0
- package/dist/agent-verifier/reducer-contract-preflight-TUMQ43JV.mjs.map +1 -0
- package/dist/agent-verifier/{reducer-native-test-harness-GMWBUISX.mjs → reducer-native-test-harness-CHX5MBL5.mjs} +14 -17
- package/dist/agent-verifier/reducer-native-test-harness-CHX5MBL5.mjs.map +1 -0
- package/dist/agent-verifier/static-scaffold-R7SVDRQI.mjs +27 -0
- package/dist/agent-verifier/static-scaffold-R7SVDRQI.mjs.map +1 -0
- package/dist/agent-verifier/{sync-3DUQH32H.mjs → sync-THAI546U.mjs} +31 -37
- package/dist/agent-verifier/sync-THAI546U.mjs.map +1 -0
- package/dist/agent-verifier/{test-P4U5INTD.mjs → test-AFAQFKOB.mjs} +28 -31
- package/dist/agent-verifier/test-AFAQFKOB.mjs.map +1 -0
- package/dist/agent-verifier/workspace-codegen-2ZMQRIKJ.mjs +10 -0
- package/dist/agent-verifier/workspace-codegen-2ZMQRIKJ.mjs.map +1 -0
- package/dist/agent-verifier/{workspace-dependencies-HZ6VVS4G.mjs → workspace-dependencies-NOOQBK6I.mjs} +5 -4
- package/dist/agent-verifier/workspace-dependencies-NOOQBK6I.mjs.map +1 -0
- package/dist/{chunk-C6UAT6EH.js → chunk-N7XPNNUI.js} +9 -12
- package/dist/chunk-N7XPNNUI.js.map +1 -0
- package/dist/chunk-SEGVTWSK.js +44 -0
- package/dist/chunk-SEGVTWSK.js.map +1 -0
- package/dist/{chunk-RS7UXJZV.js → chunk-TAQKH67O.js} +21300 -35881
- package/dist/chunk-TAQKH67O.js.map +1 -0
- package/dist/{global-config-AGFBDFYD.js → global-config-S4ZIPECE.js} +3 -3
- package/dist/global-config-S4ZIPECE.js.map +1 -0
- package/dist/index.js +415 -37
- package/dist/index.js.map +1 -1
- package/dist/internal.js +3 -4
- package/dist/{agent-verifier/keychain-backend-TNOPQV3Z.mjs → keychain-backend-HDF4TZDL.js} +2 -1
- package/dist/{agent-verifier/prompt-3BAINGAQ.mjs → prompt-NDV3AE5L.js} +2 -1
- package/package.json +8 -7
- package/skills/dreamboard/references/building-your-first-game.md +510 -0
- package/skills/dreamboard/references/cli.md +104 -0
- package/skills/dreamboard/references/game-interface.md +548 -0
- package/skills/dreamboard/references/manifest-authoring.md +597 -0
- package/skills/dreamboard/references/quickstart.md +66 -0
- package/skills/dreamboard/references/reducer.md +864 -0
- package/skills/dreamboard/references/rule-authoring.md +147 -0
- package/skills/dreamboard/references/testing.md +249 -0
- package/skills/dreamboard/scripts/events-extract.mjs +218 -0
- package/dist/agent-verifier/chunk-54TAYXUD.mjs +0 -12
- package/dist/agent-verifier/chunk-6UUJEYDV.mjs +0 -213
- package/dist/agent-verifier/chunk-HBNDKQT5.mjs +0 -8381
- package/dist/agent-verifier/chunk-LI3ZR3BI.mjs +0 -41
- package/dist/agent-verifier/chunk-U6OJN7XS.mjs +0 -8092
- package/dist/agent-verifier/chunk-XYDL7GY6.mjs +0 -10
- package/dist/agent-verifier/local-typecheck-QFYYAZOK.mjs +0 -9
- package/dist/agent-verifier/reducer-contract-preflight-22X7DSZW.mjs +0 -10
- package/dist/agent-verifier/static-scaffold-AJMZZQWS.mjs +0 -28
- package/dist/agent-verifier/testing-5K2BJYF2.mjs +0 -674
- package/dist/agent-verifier/workspace-codegen-JDZJRSDV.mjs +0 -11
- package/dist/chunk-2H7UOFLK.js +0 -11
- package/dist/chunk-7FOO4AJI.js +0 -50
- package/dist/chunk-7FOO4AJI.js.map +0 -1
- package/dist/chunk-C6UAT6EH.js.map +0 -1
- package/dist/chunk-RS7UXJZV.js.map +0 -1
- package/dist/internal.d.ts +0 -311
- package/dist/runtime-packages/ui-host-runtime/src/actor-principal.ts +0 -71
- package/dist/runtime-packages/ui-host-runtime/src/browser-interaction.ts +0 -139
- package/dist/runtime-packages/ui-host-runtime/src/components/host-controls.tsx +0 -374
- package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback-toaster.tsx +0 -266
- package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback.tsx +0 -212
- package/dist/runtime-packages/ui-host-runtime/src/components/host-primitives.tsx +0 -271
- package/dist/runtime-packages/ui-host-runtime/src/components/host-session-metadata.tsx +0 -135
- package/dist/runtime-packages/ui-host-runtime/src/components/index.ts +0 -5
- package/dist/runtime-packages/ui-host-runtime/src/components/perf-overlay.tsx +0 -194
- package/dist/runtime-packages/ui-host-runtime/src/gameplay-authority-transport.ts +0 -626
- package/dist/runtime-packages/ui-host-runtime/src/host-controls.tsx +0 -1
- package/dist/runtime-packages/ui-host-runtime/src/host-feedback.tsx +0 -1
- package/dist/runtime-packages/ui-host-runtime/src/host-session-transport.ts +0 -294
- package/dist/runtime-packages/ui-host-runtime/src/index.ts +0 -3
- package/dist/runtime-packages/ui-host-runtime/src/logger.ts +0 -11
- package/dist/runtime-packages/ui-host-runtime/src/perf.ts +0 -324
- package/dist/runtime-packages/ui-host-runtime/src/plugin-bridge.ts +0 -195
- package/dist/runtime-packages/ui-host-runtime/src/plugin-health-check.ts +0 -138
- package/dist/runtime-packages/ui-host-runtime/src/plugin-messages.ts +0 -159
- package/dist/runtime-packages/ui-host-runtime/src/plugin-session-gateway.ts +0 -551
- package/dist/runtime-packages/ui-host-runtime/src/runtime/index.ts +0 -13
- package/dist/runtime-packages/ui-host-runtime/src/screenshot/projection-to-snapshot.ts +0 -122
- package/dist/runtime-packages/ui-host-runtime/src/screenshot/static-store-api.ts +0 -26
- package/dist/runtime-packages/ui-host-runtime/src/session-ingress-controller.ts +0 -583
- package/dist/runtime-packages/ui-host-runtime/src/session-ingress.ts +0 -219
- package/dist/runtime-packages/ui-host-runtime/src/session-live-runtime.ts +0 -117
- package/dist/runtime-packages/ui-host-runtime/src/session-model.ts +0 -431
- package/dist/runtime-packages/ui-host-runtime/src/session-projection.ts +0 -211
- package/dist/runtime-packages/ui-host-runtime/src/session-recovery.ts +0 -80
- package/dist/runtime-packages/ui-host-runtime/src/session-state-reducer.ts +0 -1034
- package/dist/runtime-packages/ui-host-runtime/src/sse-manager.ts +0 -416
- package/dist/runtime-packages/ui-host-runtime/src/unified-session-store.ts +0 -184
- package/dist/testing-KLSV6CPJ.js +0 -674
- package/dist/testing-KLSV6CPJ.js.map +0 -1
- /package/dist/{chunk-2H7UOFLK.js.map → agent-verifier/chunk-SKI2ESE5.mjs.map} +0 -0
- /package/dist/{global-config-AGFBDFYD.js.map → agent-verifier/global-config-Y2NTSK4R.mjs.map} +0 -0
- /package/dist/{keychain-backend-JHTXAKWC.js.map → keychain-backend-HDF4TZDL.js.map} +0 -0
- /package/dist/{prompt-GMZABCJC.js.map → prompt-NDV3AE5L.js.map} +0 -0
|
@@ -16,23 +16,19 @@ import {
|
|
|
16
16
|
replayScenarioThroughBackend,
|
|
17
17
|
runReducerNativeScenarios,
|
|
18
18
|
writeReducerNativeGeneratedFiles
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-54TAYXUD.mjs";
|
|
33
|
-
import "./chunk-LM3OZLZG.mjs";
|
|
34
|
-
import "./chunk-SHUMAVAP.mjs";
|
|
35
|
-
import "./chunk-XYDL7GY6.mjs";
|
|
19
|
+
} from "./chunk-E7SSWJXJ.mjs";
|
|
20
|
+
import "./chunk-LUZ7KE6H.mjs";
|
|
21
|
+
import "./chunk-S34FRJHS.mjs";
|
|
22
|
+
import "./chunk-XGWCY624.mjs";
|
|
23
|
+
import "./chunk-F2DIOJJZ.mjs";
|
|
24
|
+
import "./chunk-O4YCPU7C.mjs";
|
|
25
|
+
import "./chunk-VS573ERH.mjs";
|
|
26
|
+
import "./chunk-UIZNWRM6.mjs";
|
|
27
|
+
import "./chunk-NAK77WXW.mjs";
|
|
28
|
+
import "./chunk-TAEQKBJB.mjs";
|
|
29
|
+
import "./chunk-IAYRNVUC.mjs";
|
|
30
|
+
import "./chunk-H76MT5UR.mjs";
|
|
31
|
+
import "./chunk-SKI2ESE5.mjs";
|
|
36
32
|
export {
|
|
37
33
|
assertDispatchResultWireContract,
|
|
38
34
|
createActionPlanReplaySession,
|
|
@@ -51,3 +47,4 @@ export {
|
|
|
51
47
|
runReducerNativeScenarios,
|
|
52
48
|
writeReducerNativeGeneratedFiles
|
|
53
49
|
};
|
|
50
|
+
//# sourceMappingURL=reducer-native-test-harness-CHX5MBL5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
assertCliStaticScaffoldComplete,
|
|
4
|
+
migrateLegacyScenarioImports,
|
|
5
|
+
resolveSdkDependencyRange,
|
|
6
|
+
resolveStaticAssetRoot,
|
|
7
|
+
scaffoldStaticWorkspace
|
|
8
|
+
} from "./chunk-7WWGFAAU.mjs";
|
|
9
|
+
import "./chunk-F2DIOJJZ.mjs";
|
|
10
|
+
import "./chunk-776W3UGV.mjs";
|
|
11
|
+
import "./chunk-O4YCPU7C.mjs";
|
|
12
|
+
import "./chunk-VS573ERH.mjs";
|
|
13
|
+
import "./chunk-UIZNWRM6.mjs";
|
|
14
|
+
import "./chunk-NAK77WXW.mjs";
|
|
15
|
+
import "./chunk-TAEQKBJB.mjs";
|
|
16
|
+
import "./chunk-IAYRNVUC.mjs";
|
|
17
|
+
import "./chunk-ZEELHSY3.mjs";
|
|
18
|
+
import "./chunk-H76MT5UR.mjs";
|
|
19
|
+
import "./chunk-SKI2ESE5.mjs";
|
|
20
|
+
export {
|
|
21
|
+
assertCliStaticScaffoldComplete,
|
|
22
|
+
migrateLegacyScenarioImports,
|
|
23
|
+
resolveSdkDependencyRange,
|
|
24
|
+
resolveStaticAssetRoot,
|
|
25
|
+
scaffoldStaticWorkspace
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=static-scaffold-R7SVDRQI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,95 +1,88 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
assertReducerContractPreflight
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JGT4P4UD.mjs";
|
|
5
5
|
import {
|
|
6
6
|
assertReducerBundleSmoke
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-HBNDKQT5.mjs";
|
|
9
|
-
import "./chunk-CEDUHGNH.mjs";
|
|
7
|
+
} from "./chunk-A64ZZUZV.mjs";
|
|
10
8
|
import {
|
|
11
9
|
resolveRemoteProject
|
|
12
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HGMUAL33.mjs";
|
|
13
11
|
import {
|
|
14
12
|
CONFIG_FLAG_ARGS,
|
|
15
13
|
createGameRevisionSdk,
|
|
14
|
+
defineCommand,
|
|
16
15
|
mapUpsertBlobContentsByContentHash,
|
|
17
16
|
materializeSourceChangeOperations,
|
|
18
17
|
parseSyncCommandArgs,
|
|
19
18
|
uploadProjectSourceBlobsSdk
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-BVVNBJM4.mjs";
|
|
19
|
+
} from "./chunk-W3N3QJ4V.mjs";
|
|
22
20
|
import {
|
|
23
21
|
getProjectAuthoringState,
|
|
24
22
|
getProjectLocalMaintainerRegistry,
|
|
25
23
|
getProjectPendingAuthoringSync,
|
|
26
24
|
updateProjectAuthoringState,
|
|
27
25
|
updateProjectLocalMaintainerRegistry
|
|
28
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-YE7UAO3T.mjs";
|
|
29
27
|
import {
|
|
30
28
|
runLocalTypecheck
|
|
31
|
-
} from "./chunk-
|
|
32
|
-
import "./chunk-
|
|
29
|
+
} from "./chunk-UIOLGH4A.mjs";
|
|
30
|
+
import "./chunk-LUZ7KE6H.mjs";
|
|
31
|
+
import "./chunk-S34FRJHS.mjs";
|
|
33
32
|
import {
|
|
34
33
|
assertReleaseEnvironmentPortableDependencies,
|
|
35
34
|
consola,
|
|
36
35
|
resolveProjectContext
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-
|
|
36
|
+
} from "./chunk-3UKQVWLV.mjs";
|
|
37
|
+
import "./chunk-SH5JKYOB.mjs";
|
|
39
38
|
import {
|
|
40
39
|
collectLocalFiles,
|
|
41
40
|
getLocalDiff,
|
|
42
41
|
loadManifest,
|
|
43
42
|
loadRule,
|
|
44
43
|
writeSnapshot
|
|
45
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-XGWCY624.mjs";
|
|
46
45
|
import {
|
|
47
46
|
assertCliStaticScaffoldComplete,
|
|
48
47
|
scaffoldStaticWorkspace
|
|
49
|
-
} from "./chunk-
|
|
50
|
-
import "./chunk-
|
|
48
|
+
} from "./chunk-7WWGFAAU.mjs";
|
|
49
|
+
import "./chunk-F2DIOJJZ.mjs";
|
|
51
50
|
import {
|
|
52
51
|
BUILD_CHANNEL,
|
|
53
52
|
IS_PUBLISHED_BUILD,
|
|
54
53
|
updateProjectState
|
|
55
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-776W3UGV.mjs";
|
|
56
55
|
import {
|
|
57
|
-
computeManifestHash
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
computeManifestHash,
|
|
57
|
+
isAllowedGamePath,
|
|
58
|
+
isDynamicGeneratedPath
|
|
59
|
+
} from "./chunk-O4YCPU7C.mjs";
|
|
60
|
+
import "./chunk-VS573ERH.mjs";
|
|
60
61
|
import {
|
|
61
62
|
resolveCliRepoRoot
|
|
62
|
-
} from "./chunk-
|
|
63
|
-
import "./chunk-
|
|
64
|
-
import "./chunk-
|
|
63
|
+
} from "./chunk-UIZNWRM6.mjs";
|
|
64
|
+
import "./chunk-NAK77WXW.mjs";
|
|
65
|
+
import "./chunk-TAEQKBJB.mjs";
|
|
65
66
|
import {
|
|
66
67
|
applyWorkspaceCodegen
|
|
67
|
-
} from "./chunk-
|
|
68
|
-
import
|
|
69
|
-
isAllowedGamePath,
|
|
70
|
-
isAuthoritativeGeneratedPath
|
|
71
|
-
} from "./chunk-U6OJN7XS.mjs";
|
|
72
|
-
import "./chunk-54TAYXUD.mjs";
|
|
73
|
-
import "./chunk-LM3OZLZG.mjs";
|
|
68
|
+
} from "./chunk-G42BGGG2.mjs";
|
|
69
|
+
import "./chunk-IAYRNVUC.mjs";
|
|
74
70
|
import {
|
|
75
71
|
reconcileWorkspaceDependencies
|
|
76
|
-
} from "./chunk-
|
|
77
|
-
import "./chunk-
|
|
72
|
+
} from "./chunk-XQXDOBYB.mjs";
|
|
73
|
+
import "./chunk-ZEELHSY3.mjs";
|
|
78
74
|
import {
|
|
79
75
|
ENVIRONMENT_CONFIGS,
|
|
80
76
|
RULE_FILE
|
|
81
|
-
} from "./chunk-
|
|
82
|
-
import "./chunk-
|
|
83
|
-
|
|
84
|
-
// src/commands/sync.ts
|
|
85
|
-
import { defineCommand } from "citty";
|
|
77
|
+
} from "./chunk-H76MT5UR.mjs";
|
|
78
|
+
import "./chunk-SKI2ESE5.mjs";
|
|
86
79
|
|
|
87
80
|
// src/services/project/source-revision-paths.ts
|
|
88
81
|
function isSourceRevisionPath(filePath) {
|
|
89
82
|
return filePath !== RULE_FILE && isAllowedGamePath(filePath);
|
|
90
83
|
}
|
|
91
84
|
function shouldAlwaysUpsertSourcePath(filePath) {
|
|
92
|
-
return filePath === ".npmrc" ||
|
|
85
|
+
return filePath === ".npmrc" || isDynamicGeneratedPath(filePath);
|
|
93
86
|
}
|
|
94
87
|
|
|
95
88
|
// src/services/project/local-maintainer-registry.ts
|
|
@@ -592,3 +585,4 @@ var sync_default = defineCommand({
|
|
|
592
585
|
export {
|
|
593
586
|
sync_default as default
|
|
594
587
|
};
|
|
588
|
+
//# sourceMappingURL=sync-THAI546U.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/project/source-revision-paths.ts","../../src/services/project/local-maintainer-registry.ts","../../src/services/project/local-maintainer-registry-shared.ts","../../src/commands/sync.ts"],"sourcesContent":["import { RULE_FILE } from \"../../constants.js\";\nimport {\n isAllowedGamePath,\n isDynamicGeneratedPath,\n} from \"./scaffold-ownership.js\";\n\n/**\n * Single definition of what belongs in an uploaded source revision, shared by\n * `dev` and `sync`. The compiler consumes the uploaded workspace as-is and\n * does not regenerate codegen outputs, so dynamic generated files (manifest\n * contract, ui-contract, framework tsconfigs) must always be included.\n */\nexport function isSourceRevisionPath(filePath: string): boolean {\n return filePath !== RULE_FILE && isAllowedGamePath(filePath);\n}\n\n/**\n * Files that must be upserted on every sync even when the local diff reports\n * them unchanged: registry configuration and regenerated codegen outputs.\n */\nexport function shouldAlwaysUpsertSourcePath(filePath: string): boolean {\n return filePath === \".npmrc\" || isDynamicGeneratedPath(filePath);\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalMaintainerRegistryConfig } from \"../../types.js\";\nimport { resolveCliRepoRoot } from \"../../utils/repo-root.js\";\nimport {\n LOCAL_REGISTRY_URL,\n didLocalMaintainerSnapshotChange,\n getLocalMaintainerNpmrcContent,\n isLocalMaintainerRegistryEnabled,\n isLocalMaintainerRegistryUrl,\n shortHash,\n} from \"./local-maintainer-registry-shared.js\";\n\nexport {\n didLocalMaintainerSnapshotChange,\n getLocalMaintainerNpmrcContent,\n isLocalMaintainerRegistryEnabled,\n isLocalMaintainerRegistryUrl,\n};\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\n\nfunction getCliPackageRoot(): string {\n try {\n return path.join(\n resolveCliRepoRoot(import.meta.url),\n \"apps\",\n \"dreamboard-cli\",\n );\n } catch {\n return resolveInstalledCliPackageRoot(MODULE_DIR);\n }\n}\n\nfunction resolveInstalledCliPackageRoot(moduleDir: string): string {\n let current = moduleDir;\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(\n readFileSync(packageJsonPath, \"utf8\"),\n ) as { name?: unknown };\n if (\n packageJson.name === \"@dreamboard-games/cli\" ||\n packageJson.name === \"dreamboard\" ||\n packageJson.name === \"dreamboard-cli\"\n ) {\n return current;\n }\n } catch {\n // Keep walking upward; a malformed parent package should not hide the\n // installed CLI package root.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return moduleDir;\n }\n current = parent;\n }\n}\n\nfunction getScriptInvocation(): {\n command: string;\n args: string[];\n attemptedCommand: string;\n cwd: string;\n} {\n const cliPackageRoot = getCliPackageRoot();\n const scriptPath = getLocalMaintainerScriptPath(cliPackageRoot);\n if (!existsSync(scriptPath)) {\n throw new Error(\n [\n \"Dreamboard local maintainer registry support is only available from a source checkout.\",\n `Expected helper script at ${scriptPath}.`,\n ].join(\" \"),\n );\n }\n\n const command = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\n const args = [\"exec\", \"tsx\", scriptPath];\n return {\n command,\n args,\n attemptedCommand: `${command} ${args.join(\" \")}`,\n cwd: cliPackageRoot,\n };\n}\n\nfunction getLocalMaintainerScriptPath(cliPackageRoot: string): string {\n return path.join(cliPackageRoot, \"scripts\", \"local-maintainer-registry.ts\");\n}\n\nfunction isInstalledCliPackageRoot(cliPackageRoot: string): boolean {\n return cliPackageRoot.split(path.sep).includes(\"node_modules\");\n}\n\nfunction shouldSkipLocalMaintainerHelper(): boolean {\n const cliPackageRoot = getCliPackageRoot();\n const scriptPath = getLocalMaintainerScriptPath(cliPackageRoot);\n return !existsSync(scriptPath) && isInstalledCliPackageRoot(cliPackageRoot);\n}\n\nexport function buildInstalledCliLocalMaintainerSnapshot(\n packageJson: { dependencies?: Record<string, unknown> },\n registryUrl: string = LOCAL_REGISTRY_URL,\n): LocalMaintainerRegistryConfig | null {\n const sdkVersion = packageJson.dependencies?.[\"@dreamboard-games/sdk\"];\n if (typeof sdkVersion !== \"string\" || !sdkVersion.includes(\"-local.\")) {\n return null;\n }\n\n return {\n registryUrl,\n snapshotId: shortHash(sdkVersion),\n fingerprint: shortHash(sdkVersion),\n publishedAt: \"\",\n packages: {\n \"@dreamboard-games/sdk\": sdkVersion,\n },\n };\n}\n\nexport function readInstalledCliLocalMaintainerSnapshot(): LocalMaintainerRegistryConfig | null {\n const cliPackageRoot = getCliPackageRoot();\n if (!isInstalledCliPackageRoot(cliPackageRoot)) {\n return null;\n }\n\n const packageJsonPath = path.join(cliPackageRoot, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n dependencies?: Record<string, unknown>;\n };\n return buildInstalledCliLocalMaintainerSnapshot(packageJson);\n}\n\nfunction buildScriptSetupError(options: {\n attemptedCommand: string;\n message: string;\n stderr?: string;\n}): Error {\n return new Error(\n [\n \"Dreamboard local maintainer registry support requires the source-checkout CLI tooling.\",\n options.message,\n `Attempted command: ${options.attemptedCommand}`,\n options.stderr?.trim() ? `stderr:\\n${options.stderr.trim()}` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n}\n\nfunction parseJsonPayload<T>(output: string): T {\n const payload = output\n .trim()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .reverse()\n .find(\n (line) => line === \"null\" || line.startsWith(\"{\") || line.startsWith(\"[\"),\n );\n\n if (!payload) {\n throw new Error(\"completed without returning a JSON payload\");\n }\n\n return JSON.parse(payload) as T;\n}\n\nasync function runLocalMaintainerScript<T>(args: string[]): Promise<T> {\n const invocation = getScriptInvocation();\n\n return new Promise<T>((resolve, reject) => {\n const child = spawn(invocation.command, [...invocation.args, ...args], {\n cwd: invocation.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (error) => {\n const errnoError = error as NodeJS.ErrnoException;\n if (errnoError.code === \"ENOENT\") {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message:\n \"`pnpm` was not found on PATH, so the source-checkout local maintainer helper could not run.\",\n }),\n );\n return;\n }\n reject(error);\n });\n child.on(\"close\", (code) => {\n if (code !== 0) {\n const missingTsx =\n stderr.includes('Command \"tsx\" not found') ||\n stderr.includes(\"tsx: command not found\") ||\n stderr.includes(\"tsx: not found\");\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message: missingTsx\n ? \"`tsx` is not available for the source-checkout CLI package.\"\n : \"The source-checkout local maintainer helper failed.\",\n stderr,\n }),\n );\n return;\n }\n\n const trimmedStdout = stdout.trim();\n if (!trimmedStdout) {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message:\n \"The source-checkout local maintainer helper completed without returning JSON.\",\n stderr,\n }),\n );\n return;\n }\n\n try {\n resolve(parseJsonPayload<T>(trimmedStdout));\n } catch (error) {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message: `Failed to parse JSON from the source-checkout local maintainer helper: ${\n error instanceof Error ? error.message : String(error)\n }`,\n stderr: [stderr.trim(), trimmedStdout].filter(Boolean).join(\"\\n\"),\n }),\n );\n }\n });\n });\n}\n\nexport async function ensureLocalMaintainerSnapshot(\n apiBaseUrl: string,\n): Promise<LocalMaintainerRegistryConfig | null> {\n if (!isLocalMaintainerRegistryEnabled(apiBaseUrl)) {\n return null;\n }\n if (shouldSkipLocalMaintainerHelper()) {\n return readInstalledCliLocalMaintainerSnapshot();\n }\n\n return runLocalMaintainerScript<LocalMaintainerRegistryConfig | null>([\n \"ensure-snapshot\",\n \"--api-base-url\",\n apiBaseUrl,\n ]);\n}\n\nexport async function readWorkspaceLocalMaintainerRegistry(\n projectRoot: string,\n fallbackRegistryUrl: string = LOCAL_REGISTRY_URL,\n): Promise<LocalMaintainerRegistryConfig | null> {\n if (shouldSkipLocalMaintainerHelper()) {\n return null;\n }\n return runLocalMaintainerScript<LocalMaintainerRegistryConfig | null>([\n \"read-workspace\",\n \"--project-root\",\n projectRoot,\n \"--fallback-registry-url\",\n fallbackRegistryUrl,\n ]);\n}\n","import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { BUILD_CHANNEL, IS_PUBLISHED_BUILD } from \"../../build-target.js\";\nimport { ENVIRONMENT_CONFIGS } from \"../../constants.js\";\nimport type {\n LocalMaintainerRegistryConfig,\n LocalMaintainerRegistryPackages,\n LocalMaintainerSdkPackageName,\n} from \"../../types.js\";\nimport { exists, readJsonFile } from \"../../utils/fs.js\";\n\nconst localRegistryAddress = readLocalRegistryAddress();\nexport const LOCAL_REGISTRY_HOST = localRegistryAddress.host;\nexport const LOCAL_REGISTRY_PORT = localRegistryAddress.port;\nexport const LOCAL_REGISTRY_URL = `http://${LOCAL_REGISTRY_HOST}:${LOCAL_REGISTRY_PORT}`;\nexport const LOCAL_SCOPE_NPMRC_CONTENT = `@dreamboard-games:registry=${LOCAL_REGISTRY_URL}\\n`;\nexport const SDK_PUBLISH_ORDER: readonly LocalMaintainerSdkPackageName[] = [\n \"@dreamboard-games/sdk\",\n];\n\nexport type PackageJsonShape = {\n name?: string;\n version?: string;\n description?: string;\n type?: string;\n main?: string;\n types?: string;\n exports?: unknown;\n typesVersions?: Record<string, unknown>;\n files?: string[];\n bin?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\nfunction readLocalRegistryAddress(): { host: string; port: number } {\n const urlOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_URL?.trim();\n const hostOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_HOST?.trim();\n const portOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_PORT?.trim();\n if (urlOverride) {\n let parsed: URL;\n try {\n parsed = new URL(urlOverride);\n } catch {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_URL '${urlOverride}'. Expected an http://host:port URL.`,\n );\n }\n if (parsed.protocol !== \"http:\" || !parsed.hostname || !parsed.port) {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_URL '${urlOverride}'. Expected an http://host:port URL.`,\n );\n }\n return {\n host: hostOverride || parsed.hostname,\n port: parseLocalRegistryPort(portOverride || parsed.port),\n };\n }\n return {\n host: hostOverride || \"127.0.0.1\",\n port: portOverride ? parseLocalRegistryPort(portOverride) : 4873,\n };\n}\n\nfunction parseLocalRegistryPort(raw: string): number {\n const port = Number.parseInt(raw, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_PORT '${raw}'. Expected a TCP port from 1 to 65535.`,\n );\n }\n return port;\n}\n\nexport function shortHash(value: string): string {\n return crypto.createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nexport function isLocalMaintainerRegistryEnabled(apiBaseUrl: string): boolean {\n let isLocalLoopbackUrl = false;\n try {\n const parsed = new URL(apiBaseUrl);\n isLocalLoopbackUrl =\n parsed.protocol === \"http:\" &&\n (parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\");\n } catch {\n isLocalLoopbackUrl = false;\n }\n\n return (\n !IS_PUBLISHED_BUILD &&\n (apiBaseUrl === ENVIRONMENT_CONFIGS.local?.apiBaseUrl ||\n isLocalLoopbackUrl) &&\n BUILD_CHANNEL === \"development\"\n );\n}\n\nexport function packageShortName(\n packageName: LocalMaintainerSdkPackageName,\n): string {\n return packageName.replace(/^@dreamboard(?:-games)?\\//, \"\");\n}\n\nexport async function readWorkspaceLocalMaintainerRegistryFromPackageJson(\n projectRoot: string,\n fallbackRegistryUrl: string = LOCAL_REGISTRY_URL,\n): Promise<LocalMaintainerRegistryConfig | null> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n if (!(await exists(packageJsonPath))) {\n return null;\n }\n\n const packageJson = await readJsonFile<PackageJsonShape>(packageJsonPath);\n const sdkVersion =\n packageJson.dependencies?.[\"@dreamboard-games/sdk\"] ??\n packageJson.devDependencies?.[\"@dreamboard-games/sdk\"];\n const apiClientVersion =\n packageJson.dependencies?.[\"@dreamboard-games/api-client\"] ??\n packageJson.devDependencies?.[\"@dreamboard-games/api-client\"];\n const sdkDependencyVersion =\n packageJson.dependencies?.[\"@dreamboard-games/sdk\"];\n if (!sdkVersion?.includes(\"-local.\") || !sdkDependencyVersion) {\n return null;\n }\n const localSdkVersion = sdkVersion;\n\n const fingerprintSource = [\n apiClientVersion ?? \"\",\n localSdkVersion,\n fallbackRegistryUrl,\n ].join(\":\");\n return {\n registryUrl: fallbackRegistryUrl,\n snapshotId: shortHash(fingerprintSource),\n fingerprint: shortHash(fingerprintSource),\n publishedAt: \"\",\n packages: {\n \"@dreamboard-games/api-client\": apiClientVersion,\n \"@dreamboard-games/sdk\": localSdkVersion,\n } satisfies LocalMaintainerRegistryPackages,\n };\n}\n\nexport function getLocalMaintainerNpmrcContent(\n localMaintainerRegistry: LocalMaintainerRegistryConfig | null | undefined,\n): string | null {\n if (!localMaintainerRegistry) {\n return null;\n }\n return LOCAL_SCOPE_NPMRC_CONTENT.replace(\n LOCAL_REGISTRY_URL,\n localMaintainerRegistry.registryUrl,\n );\n}\n\nexport function didLocalMaintainerSnapshotChange(\n previous: LocalMaintainerRegistryConfig | undefined,\n next: LocalMaintainerRegistryConfig | null,\n): boolean {\n if (!next) {\n return false;\n }\n return previous?.snapshotId !== next.snapshotId;\n}\n\nexport function isLocalMaintainerRegistryUrl(\n fileContent: string | null,\n): boolean {\n if (!fileContent) {\n return false;\n }\n return /@dreamboard-games:registry=http:\\/\\/127\\.0\\.0\\.1:\\d+/.test(\n fileContent,\n );\n}\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport {\n mapUpsertBlobContentsByContentHash,\n materializeSourceChangeOperations,\n type SourceContentChangeOperation,\n} from \"@dreamboard-games/api-client/source-revisions\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { resolveProjectContext } from \"../config/resolve.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { parseSyncCommandArgs } from \"../flags.js\";\nimport {\n collectLocalFiles,\n computeManifestHash,\n getLocalDiff,\n loadManifest,\n loadRule,\n writeSnapshot,\n} from \"../services/project/local-files.js\";\nimport {\n isSourceRevisionPath,\n shouldAlwaysUpsertSourcePath,\n} from \"../services/project/source-revision-paths.js\";\nimport {\n assertCliStaticScaffoldComplete,\n scaffoldStaticWorkspace,\n} from \"../services/project/static-scaffold.js\";\nimport {\n createGameRevisionSdk,\n uploadProjectSourceBlobsSdk,\n} from \"../services/api/index.js\";\nimport {\n getProjectAuthoringState,\n getProjectLocalMaintainerRegistry,\n getProjectPendingAuthoringSync,\n updateProjectAuthoringState,\n updateProjectLocalMaintainerRegistry,\n} from \"../services/project/project-state.js\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport {\n didLocalMaintainerSnapshotChange,\n ensureLocalMaintainerSnapshot,\n isLocalMaintainerRegistryEnabled,\n} from \"../services/project/local-maintainer-registry.js\";\nimport { reconcileWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\nimport { assertReducerContractPreflight } from \"../services/project/reducer-contract-preflight.js\";\nimport { assertReducerBundleSmoke } from \"../services/project/reducer-bundle-preflight.js\";\nimport { runLocalTypecheck } from \"../services/project/local-typecheck.js\";\nimport { resolveRemoteProject } from \"../services/project/remote-project.js\";\nimport { assertReleaseEnvironmentPortableDependencies } from \"../services/project/dependency-portability.js\";\n\nasync function runLoggedStep<T>(\n message: string,\n task: () => Promise<T>,\n): Promise<T> {\n consola.start(message);\n return task();\n}\n\nasync function persistProjectConfig(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n await updateProjectState(options.projectRoot, options.projectConfig);\n return options.projectConfig;\n}\n\nasync function finalizeLocalSync(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n const { projectRoot, projectConfig } = options;\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: getProjectLocalMaintainerRegistry(projectConfig),\n });\n await applyWorkspaceCodegen({\n projectRoot,\n manifest: await loadManifest(projectRoot),\n });\n\n const finalizedProjectConfig = await persistProjectConfig({\n projectRoot,\n projectConfig,\n });\n await writeSnapshot(projectRoot);\n return finalizedProjectConfig;\n}\n\nfunction buildSourceSnapshotChanges(\n localFiles: Record<string, string>,\n): SourceContentChangeOperation[] {\n return Object.entries(localFiles)\n .filter(\n ([filePath]) =>\n isSourceRevisionPath(filePath) ||\n shouldAlwaysUpsertSourcePath(filePath),\n )\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([path, content]) => ({\n kind: \"upsert\",\n path,\n content,\n }));\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description:\n \"Upload authored changes and advance the remote authoring head\",\n },\n args: {\n force: {\n type: \"boolean\",\n description:\n \"Replace the full authored source tree, manifest, and rules, overwriting the remote head with the local copy even when the remote has moved\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Reserved for non-interactive scaffold flows\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseSyncCommandArgs(args);\n const { projectRoot, projectConfig, config } =\n await resolveProjectContext(parsedArgs);\n let nextProjectConfig = projectConfig;\n await assertReleaseEnvironmentPortableDependencies({\n projectRoot,\n projectConfig: nextProjectConfig,\n environment: config.environment,\n });\n const localMaintainerEnabled = isLocalMaintainerRegistryEnabled(\n config.apiBaseUrl,\n );\n const existingLocalMaintainerRegistry =\n getProjectLocalMaintainerRegistry(projectConfig);\n const refreshedLocalMaintainerRegistry = localMaintainerEnabled\n ? await runLoggedStep(\"Checking local SDK snapshot...\", () =>\n ensureLocalMaintainerSnapshot(config.apiBaseUrl),\n )\n : await ensureLocalMaintainerSnapshot(config.apiBaseUrl);\n const localMaintainerRegistry =\n refreshedLocalMaintainerRegistry ??\n (localMaintainerEnabled\n ? (existingLocalMaintainerRegistry ?? null)\n : null);\n const localMaintainerSnapshotChanged = didLocalMaintainerSnapshotChange(\n existingLocalMaintainerRegistry,\n refreshedLocalMaintainerRegistry,\n );\n if (refreshedLocalMaintainerRegistry) {\n nextProjectConfig = updateProjectLocalMaintainerRegistry(\n nextProjectConfig,\n refreshedLocalMaintainerRegistry,\n );\n consola.info(\n localMaintainerSnapshotChanged\n ? \"Local SDK snapshot refreshed.\"\n : \"Using existing local SDK snapshot.\",\n );\n } else if (localMaintainerRegistry) {\n consola.info(\"Using workspace-pinned local SDK snapshot.\");\n }\n\n await runLoggedStep(\"Refreshing static scaffold...\", () =>\n scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry,\n }),\n );\n const localManifest = await loadManifest(projectRoot);\n await runLoggedStep(\"Applying workspace codegen...\", async () =>\n applyWorkspaceCodegen({\n projectRoot,\n manifest: localManifest,\n }),\n );\n const dependencyState = await runLoggedStep(\n \"Reconciling workspace dependencies...\",\n () => reconcileWorkspaceDependencies(projectRoot),\n );\n if (\n dependencyState.packageManagerNormalized ||\n dependencyState.lockfileGenerated ||\n dependencyState.installed ||\n localMaintainerSnapshotChanged\n ) {\n consola.info(\"Workspace dependencies reconciled.\");\n } else {\n consola.info(\"Workspace dependencies already up to date.\");\n }\n await runLoggedStep(\"Validating reducer contract...\", () =>\n assertReducerContractPreflight(projectRoot),\n );\n const typecheckResult = await runLoggedStep(\n \"Running local typecheck...\",\n () => runLocalTypecheck(projectRoot),\n );\n if (typecheckResult.skipped) {\n if (typecheckResult.output) {\n consola.warn(typecheckResult.output);\n }\n } else if (!typecheckResult.success) {\n if (typecheckResult.output) {\n consola.error(typecheckResult.output);\n }\n throw new Error(\n \"Local typecheck failed. Fix the diagnostics before syncing.\",\n );\n }\n await runLoggedStep(\"Smoke-testing reducer bundle...\", async () =>\n assertReducerBundleSmoke({\n projectRoot,\n manifest: localManifest,\n }),\n );\n consola.success(\"Reducer bundle smoke test passed.\");\n\n const remoteProject = await runLoggedStep(\"Ensuring remote project...\", () =>\n resolveRemoteProject({\n projectRoot,\n projectConfig: nextProjectConfig,\n config,\n }),\n );\n nextProjectConfig = remoteProject.projectConfig;\n\n const localDiff = await getLocalDiff(projectRoot);\n await assertCliStaticScaffoldComplete(projectRoot, localDiff.deleted);\n\n const localAuthoring = getProjectAuthoringState(nextProjectConfig);\n const pendingSync = getProjectPendingAuthoringSync(nextProjectConfig);\n const remoteHeadDigest = remoteProject.project.head?.revisionDigest;\n const localHeadDigest =\n localAuthoring.revisionDigest ?? nextProjectConfig.remoteHeadDigest;\n\n if (pendingSync && !parsedArgs.force) {\n throw new Error(\n \"This workspace has an unfinished legacy sync checkpoint. Run 'dreamboard sync --force' to replace it with an atomic project revision.\",\n );\n }\n\n if (\n remoteHeadDigest &&\n localHeadDigest &&\n remoteHeadDigest !== localHeadDigest\n ) {\n if (parsedArgs.force) {\n consola.warn(\n `Remote project head has moved to ${remoteHeadDigest}. --force will overwrite it with this workspace's local copy.`,\n );\n } else {\n throw new Error(\n `Remote project head has moved to ${remoteHeadDigest}. Run 'dreamboard pull' before syncing local changes, or pass --force to overwrite the remote with the local copy.`,\n );\n }\n }\n\n if (remoteHeadDigest && !localHeadDigest) {\n if (parsedArgs.force) {\n consola.warn(\n `This workspace has no authored base but the remote project head is ${remoteHeadDigest}. --force will overwrite it with this workspace's local copy.`,\n );\n } else {\n throw new Error(\n `This workspace has no authored base but the remote project head is ${remoteHeadDigest}. Re-clone, run 'dreamboard pull --force' into a clean workspace, or pass --force to overwrite the remote with the local copy.`,\n );\n }\n }\n\n const hasChanges =\n localDiff.modified.length > 0 ||\n localDiff.added.length > 0 ||\n localDiff.deleted.length > 0;\n const localManifestContentHash = computeManifestHash(localManifest);\n const manifestOutOfSync =\n localAuthoring.localManifestContentHash !== localManifestContentHash;\n if (\n !hasChanges &&\n !parsedArgs.force &&\n localHeadDigest != null &&\n remoteHeadDigest === localHeadDigest &&\n !pendingSync &&\n !manifestOutOfSync\n ) {\n consola.info(\"No local authored changes to sync.\");\n return;\n }\n\n const localFiles = await collectLocalFiles(projectRoot);\n const sourceChanges = buildSourceSnapshotChanges(localFiles);\n const { changes } = await materializeSourceChangeOperations(sourceChanges);\n const uploadBlobs = mapUpsertBlobContentsByContentHash(\n sourceChanges,\n changes,\n );\n await uploadProjectSourceBlobsSdk(\n nextProjectConfig.projectId,\n Array.from(uploadBlobs.values()),\n );\n\n const sourceFiles = changes\n .filter((change) => change.kind === \"upsert\")\n .map(({ path, contentHash, byteSize }) => ({\n path,\n contentHash,\n byteSize,\n }));\n const revision = await createGameRevisionSdk({\n projectId: nextProjectConfig.projectId,\n request: {\n ...(remoteHeadDigest ? { baseRevisionDigest: remoteHeadDigest } : {}),\n source: { files: sourceFiles },\n ruleText: await loadRule(projectRoot),\n manifest: localManifest,\n },\n });\n nextProjectConfig = await persistProjectConfig({\n projectRoot,\n projectConfig: {\n ...updateProjectAuthoringState(nextProjectConfig, {\n revisionDigest: revision.revisionDigest,\n sourceTreeHash: revision.sourceTreeHash,\n manifestContentHash: revision.manifestContentHash,\n localManifestContentHash,\n }),\n remoteHeadDigest: revision.revisionDigest,\n },\n });\n nextProjectConfig = await finalizeLocalSync({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\n\n consola.success(\n `Synced revision ${revision.revisionDigest}. Run 'dreamboard compile' when you're ready.`,\n );\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,SAAS,qBAAqB,UAA2B;AAC9D,SAAO,aAAa,aAAa,kBAAkB,QAAQ;AAC7D;AAMO,SAAS,6BAA6B,UAA2B;AACtE,SAAO,aAAa,YAAY,uBAAuB,QAAQ;AACjE;;;ACtBA,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AACzC,OAAOA,WAAU;AACjB,SAAS,qBAAqB;;;ACH9B,OAAO,YAAY;AACnB,OAAO,UAAU;AAUjB,IAAM,uBAAuB,yBAAyB;AAC/C,IAAM,sBAAsB,qBAAqB;AACjD,IAAM,sBAAsB,qBAAqB;AACjD,IAAM,qBAAqB,UAAU,mBAAmB,IAAI,mBAAmB;AAC/E,IAAM,4BAA4B,8BAA8B,kBAAkB;AAAA;AAsBzF,SAAS,2BAA2D;AAClE,QAAM,cAAc,QAAQ,IAAI,+BAA+B,KAAK;AACpE,QAAM,eAAe,QAAQ,IAAI,gCAAgC,KAAK;AACtE,QAAM,eAAe,QAAQ,IAAI,gCAAgC,KAAK;AACtE,MAAI,aAAa;AACf,QAAI;AACJ,QAAI;AACF,eAAS,IAAI,IAAI,WAAW;AAAA,IAC9B,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,0CAA0C,WAAW;AAAA,MACvD;AAAA,IACF;AACA,QAAI,OAAO,aAAa,WAAW,CAAC,OAAO,YAAY,CAAC,OAAO,MAAM;AACnE,YAAM,IAAI;AAAA,QACR,0CAA0C,WAAW;AAAA,MACvD;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM,gBAAgB,OAAO;AAAA,MAC7B,MAAM,uBAAuB,gBAAgB,OAAO,IAAI;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,gBAAgB;AAAA,IACtB,MAAM,eAAe,uBAAuB,YAAY,IAAI;AAAA,EAC9D;AACF;AAEA,SAAS,uBAAuB,KAAqB;AACnD,QAAM,OAAO,OAAO,SAAS,KAAK,EAAE;AACpC,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AACvD,UAAM,IAAI;AAAA,MACR,2CAA2C,GAAG;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,OAAuB;AAC/C,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E;AAEO,SAAS,iCAAiC,YAA6B;AAC5E,MAAI,qBAAqB;AACzB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,UAAU;AACjC,yBACE,OAAO,aAAa,YACnB,OAAO,aAAa,eAAe,OAAO,aAAa;AAAA,EAC5D,QAAQ;AACN,yBAAqB;AAAA,EACvB;AAEA,SACE,CAAC,uBACA,eAAe,oBAAoB,OAAO,cACzC,uBACF,kBAAkB;AAEtB;AA4DO,SAAS,iCACd,UACA,MACS;AACT,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,UAAU,eAAe,KAAK;AACvC;;;AD/IA,IAAM,aAAaC,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE9D,SAAS,oBAA4B;AACnC,MAAI;AACF,WAAOA,MAAK;AAAA,MACV,mBAAmB,YAAY,GAAG;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,+BAA+B,UAAU;AAAA,EAClD;AACF;AAEA,SAAS,+BAA+B,WAA2B;AACjE,MAAI,UAAU;AACd,SAAO,MAAM;AACX,UAAM,kBAAkBA,MAAK,KAAK,SAAS,cAAc;AACzD,QAAI,WAAW,eAAe,GAAG;AAC/B,UAAI;AACF,cAAM,cAAc,KAAK;AAAA,UACvB,aAAa,iBAAiB,MAAM;AAAA,QACtC;AACA,YACE,YAAY,SAAS,2BACrB,YAAY,SAAS,gBACrB,YAAY,SAAS,kBACrB;AACA,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAGR;AAAA,IACF;AAEA,UAAM,SAASA,MAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,sBAKP;AACA,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,aAAa,6BAA6B,cAAc;AAC9D,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA,6BAA6B,UAAU;AAAA,MACzC,EAAE,KAAK,GAAG;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,aAAa,UAAU,aAAa;AAC5D,QAAM,OAAO,CAAC,QAAQ,OAAO,UAAU;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,IAC9C,KAAK;AAAA,EACP;AACF;AAEA,SAAS,6BAA6B,gBAAgC;AACpE,SAAOA,MAAK,KAAK,gBAAgB,WAAW,8BAA8B;AAC5E;AAEA,SAAS,0BAA0B,gBAAiC;AAClE,SAAO,eAAe,MAAMA,MAAK,GAAG,EAAE,SAAS,cAAc;AAC/D;AAEA,SAAS,kCAA2C;AAClD,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,aAAa,6BAA6B,cAAc;AAC9D,SAAO,CAAC,WAAW,UAAU,KAAK,0BAA0B,cAAc;AAC5E;AAEO,SAAS,yCACd,aACA,cAAsB,oBACgB;AACtC,QAAM,aAAa,YAAY,eAAe,uBAAuB;AACrE,MAAI,OAAO,eAAe,YAAY,CAAC,WAAW,SAAS,SAAS,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,UAAU,UAAU;AAAA,IAChC,aAAa,UAAU,UAAU;AAAA,IACjC,aAAa;AAAA,IACb,UAAU;AAAA,MACR,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,0CAAgF;AAC9F,QAAM,iBAAiB,kBAAkB;AACzC,MAAI,CAAC,0BAA0B,cAAc,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkBA,MAAK,KAAK,gBAAgB,cAAc;AAChE,MAAI,CAAC,WAAW,eAAe,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,MAAM,CAAC;AAGpE,SAAO,yCAAyC,WAAW;AAC7D;AAEA,SAAS,sBAAsB,SAIrB;AACR,SAAO,IAAI;AAAA,IACT;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR,sBAAsB,QAAQ,gBAAgB;AAAA,MAC9C,QAAQ,QAAQ,KAAK,IAAI;AAAA,EAAY,QAAQ,OAAO,KAAK,CAAC,KAAK;AAAA,IACjE,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AACF;AAEA,SAAS,iBAAoB,QAAmB;AAC9C,QAAM,UAAU,OACb,KAAK,EACL,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,QAAQ,EACR;AAAA,IACC,CAAC,SAAS,SAAS,UAAU,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG;AAAA,EAC1E;AAEF,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAe,yBAA4B,MAA4B;AACrE,QAAM,aAAa,oBAAoB;AAEvC,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,UAAM,QAAQ,MAAM,WAAW,SAAS,CAAC,GAAG,WAAW,MAAM,GAAG,IAAI,GAAG;AAAA,MACrE,KAAK,WAAW;AAAA,MAChB,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,IACf,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,YAAM,aAAa;AACnB,UAAI,WAAW,SAAS,UAAU;AAChC;AAAA,UACE,sBAAsB;AAAA,YACpB,kBAAkB,WAAW;AAAA,YAC7B,SACE;AAAA,UACJ,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,cAAM,aACJ,OAAO,SAAS,yBAAyB,KACzC,OAAO,SAAS,wBAAwB,KACxC,OAAO,SAAS,gBAAgB;AAClC;AAAA,UACE,sBAAsB;AAAA,YACpB,kBAAkB,WAAW;AAAA,YAC7B,SAAS,aACL,gEACA;AAAA,YACJ;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,YAAM,gBAAgB,OAAO,KAAK;AAClC,UAAI,CAAC,eAAe;AAClB;AAAA,UACE,sBAAsB;AAAA,YACpB,kBAAkB,WAAW;AAAA,YAC7B,SACE;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,UAAI;AACF,gBAAQ,iBAAoB,aAAa,CAAC;AAAA,MAC5C,SAAS,OAAO;AACd;AAAA,UACE,sBAAsB;AAAA,YACpB,kBAAkB,WAAW;AAAA,YAC7B,SAAS,0EACP,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,YACA,QAAQ,CAAC,OAAO,KAAK,GAAG,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,UAClE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,8BACpB,YAC+C;AAC/C,MAAI,CAAC,iCAAiC,UAAU,GAAG;AACjD,WAAO;AAAA,EACT;AACA,MAAI,gCAAgC,GAAG;AACrC,WAAO,wCAAwC;AAAA,EACjD;AAEA,SAAO,yBAA+D;AAAA,IACpE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AE7NA,eAAe,cACb,SACA,MACY;AACZ,UAAQ,MAAM,OAAO;AACrB,SAAO,KAAK;AACd;AAEA,eAAe,qBAAqB,SAGT;AACzB,QAAM,mBAAmB,QAAQ,aAAa,QAAQ,aAAa;AACnE,SAAO,QAAQ;AACjB;AAEA,eAAe,kBAAkB,SAGN;AACzB,QAAM,EAAE,aAAa,cAAc,IAAI;AACvC,QAAM,wBAAwB,aAAa,UAAU;AAAA,IACnD,yBAAyB,kCAAkC,aAAa;AAAA,EAC1E,CAAC;AACD,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA,UAAU,MAAM,aAAa,WAAW;AAAA,EAC1C,CAAC;AAED,QAAM,yBAAyB,MAAM,qBAAqB;AAAA,IACxD;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,cAAc,WAAW;AAC/B,SAAO;AACT;AAEA,SAAS,2BACP,YACgC;AAChC,SAAO,OAAO,QAAQ,UAAU,EAC7B;AAAA,IACC,CAAC,CAAC,QAAQ,MACR,qBAAqB,QAAQ,KAC7B,6BAA6B,QAAQ;AAAA,EACzC,EACC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAACC,OAAM,OAAO,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,MAAAA;AAAA,IACA;AAAA,EACF,EAAE;AACN;AAEA,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aACE;AAAA,MACF,SAAS;AAAA,IACX;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,aAAa,qBAAqB,IAAI;AAC5C,UAAM,EAAE,aAAa,eAAe,OAAO,IACzC,MAAM,sBAAsB,UAAU;AACxC,QAAI,oBAAoB;AACxB,UAAM,6CAA6C;AAAA,MACjD;AAAA,MACA,eAAe;AAAA,MACf,aAAa,OAAO;AAAA,IACtB,CAAC;AACD,UAAM,yBAAyB;AAAA,MAC7B,OAAO;AAAA,IACT;AACA,UAAM,kCACJ,kCAAkC,aAAa;AACjD,UAAM,mCAAmC,yBACrC,MAAM;AAAA,MAAc;AAAA,MAAkC,MACpD,8BAA8B,OAAO,UAAU;AAAA,IACjD,IACA,MAAM,8BAA8B,OAAO,UAAU;AACzD,UAAM,0BACJ,qCACC,yBACI,mCAAmC,OACpC;AACN,UAAM,iCAAiC;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AACA,QAAI,kCAAkC;AACpC,0BAAoB;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AACA,cAAQ;AAAA,QACN,iCACI,kCACA;AAAA,MACN;AAAA,IACF,WAAW,yBAAyB;AAClC,cAAQ,KAAK,4CAA4C;AAAA,IAC3D;AAEA,UAAM;AAAA,MAAc;AAAA,MAAiC,MACnD,wBAAwB,aAAa,UAAU;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,gBAAgB,MAAM,aAAa,WAAW;AACpD,UAAM;AAAA,MAAc;AAAA,MAAiC,YACnD,sBAAsB;AAAA,QACpB;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,UAAM,kBAAkB,MAAM;AAAA,MAC5B;AAAA,MACA,MAAM,+BAA+B,WAAW;AAAA,IAClD;AACA,QACE,gBAAgB,4BAChB,gBAAgB,qBAChB,gBAAgB,aAChB,gCACA;AACA,cAAQ,KAAK,oCAAoC;AAAA,IACnD,OAAO;AACL,cAAQ,KAAK,4CAA4C;AAAA,IAC3D;AACA,UAAM;AAAA,MAAc;AAAA,MAAkC,MACpD,+BAA+B,WAAW;AAAA,IAC5C;AACA,UAAM,kBAAkB,MAAM;AAAA,MAC5B;AAAA,MACA,MAAM,kBAAkB,WAAW;AAAA,IACrC;AACA,QAAI,gBAAgB,SAAS;AAC3B,UAAI,gBAAgB,QAAQ;AAC1B,gBAAQ,KAAK,gBAAgB,MAAM;AAAA,MACrC;AAAA,IACF,WAAW,CAAC,gBAAgB,SAAS;AACnC,UAAI,gBAAgB,QAAQ;AAC1B,gBAAQ,MAAM,gBAAgB,MAAM;AAAA,MACtC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM;AAAA,MAAc;AAAA,MAAmC,YACrD,yBAAyB;AAAA,QACvB;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,YAAQ,QAAQ,mCAAmC;AAEnD,UAAM,gBAAgB,MAAM;AAAA,MAAc;AAAA,MAA8B,MACtE,qBAAqB;AAAA,QACnB;AAAA,QACA,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AACA,wBAAoB,cAAc;AAElC,UAAM,YAAY,MAAM,aAAa,WAAW;AAChD,UAAM,gCAAgC,aAAa,UAAU,OAAO;AAEpE,UAAM,iBAAiB,yBAAyB,iBAAiB;AACjE,UAAM,cAAc,+BAA+B,iBAAiB;AACpE,UAAM,mBAAmB,cAAc,QAAQ,MAAM;AACrD,UAAM,kBACJ,eAAe,kBAAkB,kBAAkB;AAErD,QAAI,eAAe,CAAC,WAAW,OAAO;AACpC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QACE,oBACA,mBACA,qBAAqB,iBACrB;AACA,UAAI,WAAW,OAAO;AACpB,gBAAQ;AAAA,UACN,oCAAoC,gBAAgB;AAAA,QACtD;AAAA,MACF,OAAO;AACL,cAAM,IAAI;AAAA,UACR,oCAAoC,gBAAgB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,CAAC,iBAAiB;AACxC,UAAI,WAAW,OAAO;AACpB,gBAAQ;AAAA,UACN,sEAAsE,gBAAgB;AAAA,QACxF;AAAA,MACF,OAAO;AACL,cAAM,IAAI;AAAA,UACR,sEAAsE,gBAAgB;AAAA,QACxF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aACJ,UAAU,SAAS,SAAS,KAC5B,UAAU,MAAM,SAAS,KACzB,UAAU,QAAQ,SAAS;AAC7B,UAAM,2BAA2B,oBAAoB,aAAa;AAClE,UAAM,oBACJ,eAAe,6BAA6B;AAC9C,QACE,CAAC,cACD,CAAC,WAAW,SACZ,mBAAmB,QACnB,qBAAqB,mBACrB,CAAC,eACD,CAAC,mBACD;AACA,cAAQ,KAAK,oCAAoC;AACjD;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,kBAAkB,WAAW;AACtD,UAAM,gBAAgB,2BAA2B,UAAU;AAC3D,UAAM,EAAE,QAAQ,IAAI,MAAM,kCAAkC,aAAa;AACzE,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AACA,UAAM;AAAA,MACJ,kBAAkB;AAAA,MAClB,MAAM,KAAK,YAAY,OAAO,CAAC;AAAA,IACjC;AAEA,UAAM,cAAc,QACjB,OAAO,CAAC,WAAW,OAAO,SAAS,QAAQ,EAC3C,IAAI,CAAC,EAAE,MAAAA,OAAM,aAAa,SAAS,OAAO;AAAA,MACzC,MAAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AACJ,UAAM,WAAW,MAAM,sBAAsB;AAAA,MAC3C,WAAW,kBAAkB;AAAA,MAC7B,SAAS;AAAA,QACP,GAAI,mBAAmB,EAAE,oBAAoB,iBAAiB,IAAI,CAAC;AAAA,QACnE,QAAQ,EAAE,OAAO,YAAY;AAAA,QAC7B,UAAU,MAAM,SAAS,WAAW;AAAA,QACpC,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AACD,wBAAoB,MAAM,qBAAqB;AAAA,MAC7C;AAAA,MACA,eAAe;AAAA,QACb,GAAG,4BAA4B,mBAAmB;AAAA,UAChD,gBAAgB,SAAS;AAAA,UACzB,gBAAgB,SAAS;AAAA,UACzB,qBAAqB,SAAS;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,QACD,kBAAkB,SAAS;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,wBAAoB,MAAM,kBAAkB;AAAA,MAC1C;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,YAAQ;AAAA,MACN,mBAAmB,SAAS,cAAc;AAAA,IAC5C;AAAA,EACF;AACF,CAAC;","names":["path","path","path"]}
|
|
@@ -1,55 +1,51 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
generateReducerNativeArtifacts,
|
|
4
|
-
isReducerNativeTestingWorkspace,
|
|
5
|
-
runReducerNativeScenarios
|
|
6
|
-
} from "./chunk-6A5HRJMQ.mjs";
|
|
7
|
-
import "./chunk-HBNDKQT5.mjs";
|
|
8
|
-
import "./chunk-CEDUHGNH.mjs";
|
|
9
2
|
import {
|
|
10
3
|
CONFIG_FLAG_ARGS,
|
|
4
|
+
defineCommand,
|
|
11
5
|
findProjectCompiledResultsForRevision,
|
|
12
6
|
getProjectCompiledResultSdk,
|
|
13
7
|
parseConfigFlags,
|
|
14
8
|
uploadInitialProjectionSdk
|
|
15
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-W3N3QJ4V.mjs";
|
|
10
|
+
import {
|
|
11
|
+
getProjectAuthoringState,
|
|
12
|
+
getProjectCompileState,
|
|
13
|
+
getProjectPendingAuthoringSync
|
|
14
|
+
} from "./chunk-YE7UAO3T.mjs";
|
|
15
|
+
import {
|
|
16
|
+
generateReducerNativeArtifacts,
|
|
17
|
+
isReducerNativeTestingWorkspace,
|
|
18
|
+
runReducerNativeScenarios
|
|
19
|
+
} from "./chunk-E7SSWJXJ.mjs";
|
|
20
|
+
import "./chunk-LUZ7KE6H.mjs";
|
|
16
21
|
import {
|
|
17
22
|
STALE_CONTRACT_ARTIFACT_CODE,
|
|
18
23
|
STALE_CONTRACT_ARTIFACT_EXIT_CODE,
|
|
19
24
|
isDreamboardApiError,
|
|
20
25
|
isStaleContractArtifactMessage
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import {
|
|
23
|
-
getProjectAuthoringState,
|
|
24
|
-
getProjectCompileState,
|
|
25
|
-
getProjectPendingAuthoringSync
|
|
26
|
-
} from "./chunk-MRCUP5SW.mjs";
|
|
27
|
-
import "./chunk-LI3ZR3BI.mjs";
|
|
26
|
+
} from "./chunk-S34FRJHS.mjs";
|
|
28
27
|
import {
|
|
29
28
|
assertReleaseEnvironmentPortableDependencies,
|
|
30
29
|
configureClient,
|
|
31
30
|
consola,
|
|
32
31
|
resolveProjectContext
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
32
|
+
} from "./chunk-3UKQVWLV.mjs";
|
|
33
|
+
import "./chunk-SH5JKYOB.mjs";
|
|
34
|
+
import "./chunk-XGWCY624.mjs";
|
|
35
|
+
import "./chunk-F2DIOJJZ.mjs";
|
|
37
36
|
import {
|
|
38
37
|
IS_PUBLISHED_BUILD
|
|
39
|
-
} from "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
43
|
-
import "./chunk-
|
|
44
|
-
import "./chunk-
|
|
45
|
-
import "./chunk-
|
|
46
|
-
import "./chunk-
|
|
47
|
-
import "./chunk-
|
|
48
|
-
import "./chunk-SHUMAVAP.mjs";
|
|
49
|
-
import "./chunk-XYDL7GY6.mjs";
|
|
38
|
+
} from "./chunk-776W3UGV.mjs";
|
|
39
|
+
import "./chunk-O4YCPU7C.mjs";
|
|
40
|
+
import "./chunk-VS573ERH.mjs";
|
|
41
|
+
import "./chunk-UIZNWRM6.mjs";
|
|
42
|
+
import "./chunk-NAK77WXW.mjs";
|
|
43
|
+
import "./chunk-TAEQKBJB.mjs";
|
|
44
|
+
import "./chunk-IAYRNVUC.mjs";
|
|
45
|
+
import "./chunk-H76MT5UR.mjs";
|
|
46
|
+
import "./chunk-SKI2ESE5.mjs";
|
|
50
47
|
|
|
51
48
|
// src/commands/test.ts
|
|
52
|
-
import { defineCommand } from "citty";
|
|
53
49
|
import { readFile } from "fs/promises";
|
|
54
50
|
import path from "path";
|
|
55
51
|
|
|
@@ -354,3 +350,4 @@ export {
|
|
|
354
350
|
resolveRequestedRunner,
|
|
355
351
|
resolveTestRunExitCode
|
|
356
352
|
};
|
|
353
|
+
//# sourceMappingURL=test-AFAQFKOB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/commands/test.ts","../../src/services/testing/runtime-mode.ts","../../src/services/workflows/resolve-latest-compiled-result.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { configureClient, resolveProjectContext } from \"../config/resolve.js\";\nimport { parseConfigFlags } from \"../flags.js\";\nimport { uploadInitialProjectionSdk } from \"../services/api/index.js\";\nimport { assertReleaseEnvironmentPortableDependencies } from \"../services/project/dependency-portability.js\";\nimport {\n generateReducerNativeArtifacts,\n isReducerNativeTestingWorkspace,\n runReducerNativeScenarios,\n type ReducerNativeScenarioSummary,\n} from \"../services/testing/reducer-native-test-harness.js\";\nimport { shouldUseRemoteTestRuntime } from \"../services/testing/runtime-mode.js\";\nimport { resolveLatestCompiledResult } from \"../services/workflows/resolve-latest-compiled-result.js\";\nimport type { ProjectConfig } from \"../types.js\";\nimport {\n isDreamboardApiError,\n isStaleContractArtifactMessage,\n STALE_CONTRACT_ARTIFACT_CODE,\n STALE_CONTRACT_ARTIFACT_EXIT_CODE,\n} from \"../utils/errors.js\";\n\ntype RequestedTestRunner = \"reducer\" | \"remote\" | \"browser\";\n\nexport const REDUCER_NATIVE_TEST_WORKSPACE_ERROR =\n \"dreamboard test now requires a reducer-native workspace with app/game.ts, shared/generated/ui-contract.ts, test/bases/*.base.ts, and test/scenarios/*.scenario.ts. Legacy test/base-scenarios.json workspaces are no longer supported.\";\n\nexport const NO_REDUCER_NATIVE_BASES_FOUND_ERROR =\n \"No bases found under test/bases/*.base.ts\";\n\nexport const NO_REDUCER_NATIVE_SCENARIOS_FOUND_ERROR =\n \"No scenarios found under test/scenarios/*.scenario.ts\";\n\nexport function isPreviewProjectionEndpointUnavailable(\n error: unknown,\n): boolean {\n if (!isDreamboardApiError(error) || error.status !== 404) {\n return false;\n }\n\n const endpoint = error.problem.instance ?? error.problem.context?.endpoint;\n const message = error.problem.detail ?? error.problem.title;\n return (\n endpoint?.includes(\"/preview/initial-projection\") === true &&\n message?.toLowerCase() === \"not found\"\n );\n}\n\nasync function uploadGeneratedPreviewProjection(options: {\n projectRoot: string;\n gameId: string;\n bases: Array<{ definition: { id: string } }>;\n}): Promise<void> {\n const previewBase =\n options.bases.find((base) => base.definition.id === \"initial-turn\") ??\n options.bases[0];\n if (!previewBase) {\n return;\n }\n const projectionPath = path.join(\n options.projectRoot,\n \"test\",\n \"generated\",\n \"bases\",\n previewBase.definition.id,\n \"player-1.projection.json\",\n );\n const projectionJson = await readFile(projectionPath, \"utf8\");\n try {\n await uploadInitialProjectionSdk(options.gameId, projectionJson);\n } catch (error) {\n if (isPreviewProjectionEndpointUnavailable(error)) {\n consola.warn(\n \"Skipping preview projection upload because the selected backend does not expose the preview projection endpoint.\",\n );\n return;\n }\n throw error;\n }\n}\n\nexport function resolveRequestedRunner(\n value: unknown,\n): RequestedTestRunner | undefined {\n if (value == null || value === \"\") {\n return undefined;\n }\n if (value === \"reducer\" || value === \"remote\" || value === \"browser\") {\n return value;\n }\n throw new Error(\n `Unsupported test runner '${String(value)}'. Expected one of reducer, remote, browser.`,\n );\n}\n\nfunction isStaleContractArtifactResult(\n result: ReducerNativeScenarioSummary[\"results\"][number],\n): boolean {\n return (\n result.errorCode === STALE_CONTRACT_ARTIFACT_CODE ||\n (result.error ? isStaleContractArtifactMessage(result.error) : false)\n );\n}\n\nexport function resolveTestRunExitCode(\n summary: ReducerNativeScenarioSummary,\n): number {\n if (summary.failed === 0) {\n return 0;\n }\n return summary.results.some(\n (result) => !result.success && isStaleContractArtifactResult(result),\n )\n ? STALE_CONTRACT_ARTIFACT_EXIT_CODE\n : 1;\n}\n\nasync function assertReducerNativeTestingWorkspace(\n projectRoot: string,\n): Promise<void> {\n if (await isReducerNativeTestingWorkspace(projectRoot)) {\n return;\n }\n\n throw new Error(REDUCER_NATIVE_TEST_WORKSPACE_ERROR);\n}\n\nasync function resolveReducerNativeRuntimeIdentity(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n useRemoteRuntime: boolean;\n runner?: RequestedTestRunner;\n}): Promise<{\n gameId: string;\n compiledResultId?: string;\n}> {\n if (\n options.useRemoteRuntime ||\n options.runner === \"remote\" ||\n options.runner === \"browser\"\n ) {\n const latestCompiledResult = await resolveLatestCompiledResult(\n options.projectRoot,\n options.projectConfig,\n );\n return {\n gameId: options.projectConfig.gameId,\n compiledResultId: latestCompiledResult.id,\n };\n }\n\n return {\n gameId: options.projectConfig.gameId,\n compiledResultId: options.projectConfig.compile?.latestSuccessful?.resultId,\n };\n}\n\nconst generateCommand = defineCommand({\n meta: {\n name: \"generate\",\n description: \"Generate reducer-native base artifacts for typed scenarios\",\n },\n args: {\n scenario: {\n type: \"string\",\n description: \"Optional scenario file path under test/scenarios\",\n },\n debug: {\n type: \"boolean\",\n description: \"Print full reducer-native validation details\",\n default: false,\n },\n \"update-snapshots\": {\n type: \"boolean\",\n description: \"Refresh generated projection and scenario snapshots\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedFlags = parseConfigFlags(args);\n const useRemoteRuntime = shouldUseRemoteTestRuntime(parsedFlags.env);\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedFlags,\n { requireAuth: useRemoteRuntime },\n );\n await assertReleaseEnvironmentPortableDependencies({\n projectRoot,\n projectConfig,\n environment: config.environment,\n });\n\n await assertReducerNativeTestingWorkspace(projectRoot);\n\n const runtimeIdentity = await resolveReducerNativeRuntimeIdentity({\n projectRoot,\n projectConfig,\n useRemoteRuntime,\n });\n const { bases, scenarios } = await generateReducerNativeArtifacts({\n projectRoot,\n scenarioPath: args.scenario,\n compiledResultId: runtimeIdentity.compiledResultId,\n gameId: runtimeIdentity.gameId,\n debug: Boolean(args.debug),\n });\n\n if (bases.length === 0) {\n throw new Error(NO_REDUCER_NATIVE_BASES_FOUND_ERROR);\n }\n if (scenarios.length === 0) {\n throw new Error(NO_REDUCER_NATIVE_SCENARIOS_FOUND_ERROR);\n }\n\n if (useRemoteRuntime && config.authToken) {\n await configureClient(config);\n await uploadGeneratedPreviewProjection({\n projectRoot,\n gameId: runtimeIdentity.gameId,\n bases,\n });\n } else {\n consola.info(\n \"Skipping preview projection upload because this test generation is local-only.\",\n );\n }\n\n consola.success(\n `Generated ${bases.length} base state(s) for ${scenarios.length} scenario(s).`,\n );\n },\n});\n\nconst runCommand = defineCommand({\n meta: {\n name: \"run\",\n description: \"Run reducer-native scenarios from test/scenarios\",\n },\n args: {\n scenario: {\n type: \"string\",\n description: \"Optional scenario file path under test/scenarios\",\n },\n debug: {\n type: \"boolean\",\n description: \"Print full reducer-native validation details\",\n default: false,\n },\n \"update-snapshots\": {\n type: \"boolean\",\n description: \"Refresh generated projection and scenario snapshots\",\n default: false,\n },\n runner: {\n type: \"string\",\n valueHint: \"reducer|remote|browser\",\n description:\n \"Scenario runner: reducer (in-process, default), remote (live sessions against the configured backend), or browser (local web stack).\",\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedFlags = parseConfigFlags(args);\n const useRemoteRuntime = shouldUseRemoteTestRuntime(parsedFlags.env);\n const runner = resolveRequestedRunner(args.runner) ?? \"reducer\";\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedFlags,\n {\n requireAuth:\n useRemoteRuntime || runner === \"remote\" || runner === \"browser\",\n },\n );\n await assertReleaseEnvironmentPortableDependencies({\n projectRoot,\n projectConfig,\n environment: config.environment,\n });\n\n await assertReducerNativeTestingWorkspace(projectRoot);\n\n const runtimeIdentity = await resolveReducerNativeRuntimeIdentity({\n projectRoot,\n projectConfig,\n useRemoteRuntime,\n runner,\n });\n const summary = await runReducerNativeScenarios({\n projectRoot,\n projectConfig,\n resolvedConfig: config,\n runner,\n scenarioPath: args.scenario,\n compiledResultId: runtimeIdentity.compiledResultId,\n gameId: runtimeIdentity.gameId,\n debug: Boolean(args.debug),\n updateSnapshots: Boolean(args[\"update-snapshots\"]),\n });\n\n for (const result of summary.results) {\n if (result.success) {\n consola.success(`PASS ${result.id}`);\n } else if (\n result.errorCode === STALE_CONTRACT_ARTIFACT_CODE &&\n result.error\n ) {\n consola.error(result.error);\n } else {\n consola.error(\n `FAIL ${result.id}: ${result.error ?? \"Scenario failed\"}`,\n );\n }\n }\n\n consola.info(\n `Test summary: ${summary.passed} passed, ${summary.failed} failed.`,\n );\n if (summary.failed > 0) {\n process.exitCode = resolveTestRunExitCode(summary);\n }\n },\n});\n\nexport default defineCommand({\n meta: {\n name: \"test\",\n description: \"Reducer-native test runner with typed bases and scenarios\",\n },\n subCommands: {\n generate: generateCommand,\n run: runCommand,\n },\n});\n","import { IS_PUBLISHED_BUILD } from \"../../build-target.js\";\n\nexport function isRemoteTestEnvironment(\n environment: string | undefined,\n): environment is \"staging\" | \"prod\" {\n return environment === \"staging\" || environment === \"prod\";\n}\n\nexport function shouldUseRemoteTestRuntime(\n environment: string | undefined,\n): boolean {\n return IS_PUBLISHED_BUILD || isRemoteTestEnvironment(environment);\n}\n","import consola from \"consola\";\nimport type { CompiledResult } from \"@dreamboard-games/api-client\";\nimport type { ProjectConfig } from \"../../types.js\";\nimport {\n findProjectCompiledResultsForRevision,\n getProjectCompiledResultSdk,\n} from \"../api/compiled-results-api.js\";\nimport {\n getProjectCompileState,\n getProjectAuthoringState,\n getProjectPendingAuthoringSync,\n} from \"../project/project-state.js\";\n\nexport async function resolveLatestCompiledResult(\n projectRoot: string,\n projectConfig: ProjectConfig,\n): Promise<CompiledResult> {\n void projectRoot;\n const authoring = getProjectAuthoringState(projectConfig);\n if (getProjectPendingAuthoringSync(projectConfig)) {\n throw new Error(\n \"Previous sync did not finish updating local scaffold files. Run 'dreamboard sync' again first.\",\n );\n }\n if (authoring.revisionDigest) {\n const compile = getProjectCompileState(projectConfig);\n const latestSuccess = (\n await findProjectCompiledResultsForRevision({\n projectId: projectConfig.projectId,\n revisionDigest: authoring.revisionDigest,\n })\n ).find((result) => result.success);\n const matchingLocalSuccess =\n compile.latestSuccessful?.revisionDigest === authoring.revisionDigest\n ? compile.latestSuccessful\n : undefined;\n const resolvedSuccess =\n latestSuccess ??\n (matchingLocalSuccess?.resultId\n ? await getProjectCompiledResultSdk(\n projectConfig.projectId,\n matchingLocalSuccess.resultId,\n )\n : undefined);\n\n if (!resolvedSuccess?.success) {\n throw new Error(\n \"No successful compile exists for the current authored revision. Run 'dreamboard compile' first.\",\n );\n }\n\n const resultRevisionDigest = (resolvedSuccess as { revisionDigest?: string })\n .revisionDigest;\n if (\n resultRevisionDigest &&\n resultRevisionDigest !== authoring.revisionDigest\n ) {\n consola.warn(\n `Latest successful compile ${resolvedSuccess.id} belongs to ${resultRevisionDigest}, not ${authoring.revisionDigest}.`,\n );\n }\n\n consola.info(\n `Project summary:\\n compiledResultId: ${resolvedSuccess.id}\\n revisionDigest: ${authoring.revisionDigest}`,\n );\n\n return resolvedSuccess;\n }\n\n throw new Error(\n \"This workspace does not know its project revision yet. Run 'dreamboard sync' first.\",\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -3,12 +3,13 @@ import {
|
|
|
3
3
|
generatePnpmLockfile,
|
|
4
4
|
installWorkspaceDependencies,
|
|
5
5
|
reconcileWorkspaceDependencies
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-XQXDOBYB.mjs";
|
|
7
|
+
import "./chunk-ZEELHSY3.mjs";
|
|
8
|
+
import "./chunk-H76MT5UR.mjs";
|
|
9
|
+
import "./chunk-SKI2ESE5.mjs";
|
|
10
10
|
export {
|
|
11
11
|
generatePnpmLockfile,
|
|
12
12
|
installWorkspaceDependencies,
|
|
13
13
|
reconcileWorkspaceDependencies
|
|
14
14
|
};
|
|
15
|
+
//# sourceMappingURL=workspace-dependencies-NOOQBK6I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -8,27 +8,24 @@ import path4 from "path";
|
|
|
8
8
|
var DEFAULT_API_BASE_URL = "https://api.dreamboard.games";
|
|
9
9
|
var DEFAULT_WEB_BASE_URL = "https://dreamboard.games";
|
|
10
10
|
var PROJECT_DIR_NAME = ".dreamboard";
|
|
11
|
+
var DEFAULT_CLERK_OAUTH_SCOPE = "openid profile email offline_access";
|
|
11
12
|
var ENVIRONMENT_CONFIGS = {
|
|
12
13
|
local: {
|
|
13
14
|
apiBaseUrl: "http://localhost:8080",
|
|
14
15
|
webBaseUrl: "http://localhost:5173",
|
|
15
|
-
|
|
16
|
-
clerkOAuthClientId: process.env.DREAMBOARD_LOCAL_CLERK_OAUTH_CLIENT_ID,
|
|
17
|
-
clerkOAuthScope: process.env.DREAMBOARD_LOCAL_CLERK_OAUTH_SCOPE
|
|
16
|
+
clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE
|
|
18
17
|
},
|
|
19
18
|
staging: {
|
|
20
19
|
apiBaseUrl: "https://api-staging.dreamboard.games",
|
|
21
20
|
webBaseUrl: "https://staging.dreamboard.games",
|
|
22
|
-
clerkOAuthIssuer:
|
|
23
|
-
|
|
24
|
-
clerkOAuthScope:
|
|
21
|
+
clerkOAuthIssuer: "https://happy-caribou-19.clerk.accounts.dev",
|
|
22
|
+
clerkOAuthTokenUrl: "https://happy-caribou-19.clerk.accounts.dev/oauth/token",
|
|
23
|
+
clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE
|
|
25
24
|
},
|
|
26
25
|
prod: {
|
|
27
26
|
apiBaseUrl: "https://api.dreamboard.games",
|
|
28
27
|
webBaseUrl: "https://dreamboard.games",
|
|
29
|
-
|
|
30
|
-
clerkOAuthClientId: process.env.DREAMBOARD_PROD_CLERK_OAUTH_CLIENT_ID ?? process.env.DREAMBOARD_CLERK_OAUTH_CLIENT_ID,
|
|
31
|
-
clerkOAuthScope: process.env.DREAMBOARD_PROD_CLERK_OAUTH_SCOPE ?? process.env.DREAMBOARD_CLERK_OAUTH_SCOPE
|
|
28
|
+
clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE
|
|
32
29
|
}
|
|
33
30
|
};
|
|
34
31
|
var PROJECT_CONFIG_FILE = "project.json";
|
|
@@ -287,7 +284,7 @@ async function defaultBackendResolver() {
|
|
|
287
284
|
if (!useKeychain) {
|
|
288
285
|
return fileCredentialBackend;
|
|
289
286
|
}
|
|
290
|
-
const { tryKeychainBackend } = await import("./keychain-backend-
|
|
287
|
+
const { tryKeychainBackend } = await import("./keychain-backend-HDF4TZDL.js");
|
|
291
288
|
const keychain = await tryKeychainBackend();
|
|
292
289
|
if (keychain.available) {
|
|
293
290
|
return keychain.backend;
|
|
@@ -296,7 +293,7 @@ async function defaultBackendResolver() {
|
|
|
296
293
|
}
|
|
297
294
|
async function readCredentialBackendPreference() {
|
|
298
295
|
try {
|
|
299
|
-
const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-
|
|
296
|
+
const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-S4ZIPECE.js");
|
|
300
297
|
const config = await loadGlobalConfig2();
|
|
301
298
|
return config.credentialBackend === "keychain";
|
|
302
299
|
} catch {
|
|
@@ -432,4 +429,4 @@ export {
|
|
|
432
429
|
loadGlobalConfig,
|
|
433
430
|
saveGlobalConfig
|
|
434
431
|
};
|
|
435
|
-
//# sourceMappingURL=chunk-
|
|
432
|
+
//# sourceMappingURL=chunk-N7XPNNUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/global-config.ts","../src/constants.ts","../src/utils/fs.ts","../src/utils/atomic-file.ts","../src/config/credential-store.ts"],"sourcesContent":["import os from \"node:os\";\nimport path from \"node:path\";\nimport type { CredentialBackendPreference, GlobalConfig } from \"../types.js\";\nimport { PROJECT_DIR_NAME } from \"../constants.js\";\nimport { ensureDir, readJsonFile } from \"../utils/fs.js\";\nimport { atomicWriteFile } from \"../utils/atomic-file.js\";\nimport { getCredentialFilePath } from \"./credential-store.js\";\n\nfunction normalizeCredentialBackend(\n value: unknown,\n): CredentialBackendPreference | undefined {\n if (value === \"file\" || value === \"keychain\") return value;\n // Tolerate unknown / malformed values rather than refusing to load the\n // whole config - an unrecognised backend name should degrade to \"use\n // the default\" instead of locking the user out of their CLI.\n return undefined;\n}\n\nexport function getGlobalConfigPath(): string {\n return path.join(os.homedir(), PROJECT_DIR_NAME, \"config.json\");\n}\n\n/**\n * Path to the on-disk credential file used by the file backend of\n * `CredentialStore`. Re-exported here to avoid circular / ad-hoc imports\n * in UI surface (`auth status`, `config show`, etc).\n */\nexport function getGlobalAuthPath(): string {\n return getCredentialFilePath();\n}\n\n/**\n * Load non-credential CLI configuration.\n *\n * Note: this function used to also load `authToken` / `refreshToken`\n * from `auth.json` and flatten them onto `GlobalConfig`. That shape\n * enabled the refresh-token-wipe bug: `saveGlobalConfig({ ...config })`\n * without explicit auth fields erased the stored refresh token.\n *\n * Credentials are now owned exclusively by `CredentialStore`. Callers\n * that need them must import `getCredentials()` directly.\n */\nexport async function loadGlobalConfig(): Promise<GlobalConfig> {\n const config = await readJsonFile<GlobalConfig>(getGlobalConfigPath()).catch(\n () => ({}) as GlobalConfig,\n );\n return {\n environment: config.environment,\n credentialBackend: normalizeCredentialBackend(config.credentialBackend),\n };\n}\n\n/**\n * Persist non-credential CLI configuration.\n *\n * This function cannot write credentials, by construction: the\n * `GlobalConfig` type has no credential fields. Credentials must be\n * persisted through `setCredentials` / `clearCredentials` from\n * `credential-store.ts`.\n */\nexport async function saveGlobalConfig(config: GlobalConfig): Promise<void> {\n const configDir = path.join(os.homedir(), PROJECT_DIR_NAME);\n await ensureDir(configDir);\n const normalized: GlobalConfig = {\n environment: config.environment,\n credentialBackend: normalizeCredentialBackend(config.credentialBackend),\n };\n await atomicWriteFile(\n getGlobalConfigPath(),\n `${JSON.stringify(normalized, null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n","import type { EnvironmentConfig } from \"./types.js\";\n\nexport const DEFAULT_API_BASE_URL = \"https://api.dreamboard.games\";\nexport const DEFAULT_WEB_BASE_URL = \"https://dreamboard.games\";\n\nexport const PROJECT_DIR_NAME = \".dreamboard\";\nexport const DEFAULT_CLERK_OAUTH_SCOPE =\n \"openid profile email offline_access\";\n\n// Predefined environment configurations. These are intentionally static:\n// process/env overrides are applied in config resolution so the CLI does not\n// depend on a shell-sourced env file just to know first-party environments.\nexport const ENVIRONMENT_CONFIGS: Record<string, EnvironmentConfig> = {\n local: {\n apiBaseUrl: \"http://localhost:8080\",\n webBaseUrl: \"http://localhost:5173\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n staging: {\n apiBaseUrl: \"https://api-staging.dreamboard.games\",\n webBaseUrl: \"https://staging.dreamboard.games\",\n clerkOAuthIssuer: \"https://happy-caribou-19.clerk.accounts.dev\",\n clerkOAuthTokenUrl:\n \"https://happy-caribou-19.clerk.accounts.dev/oauth/token\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n prod: {\n apiBaseUrl: \"https://api.dreamboard.games\",\n webBaseUrl: \"https://dreamboard.games\",\n clerkOAuthScope: DEFAULT_CLERK_OAUTH_SCOPE,\n },\n};\nexport const PROJECT_CONFIG_FILE = \"project.json\";\nexport const PROJECT_STATE_FILE = \"state.json\";\nexport const SNAPSHOT_FILE = \"snapshot.json\";\nexport const MANIFEST_FILE = \"manifest.ts\";\nexport const GENERATED_DIR_NAME = \"generated\";\nexport const MATERIALIZED_MANIFEST_FILE = `${PROJECT_DIR_NAME}/${GENERATED_DIR_NAME}/manifest.json`;\nexport const MANIFEST_TYPECHECK_CONFIG_FILE = \"manifest.tsconfig.json\";\nexport const RULE_FILE = \"rule.md\";\nexport const DEFAULT_LOGIN_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DEFAULT_TURN_DELAY_MS = 250;\n\nexport const LOCAL_IGNORE_DIRS = new Set([\n \".dreamboard\",\n \".git\",\n \"node_modules\",\n \"dist\",\n]);\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function exists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n}\n\nexport async function readTextFileIfExists(\n filePath: string,\n): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeTextFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await writeFile(filePath, content, \"utf8\");\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const data = await readTextFile(filePath);\n return JSON.parse(data) as T;\n}\n\nexport async function writeJsonFile(\n filePath: string,\n data: unknown,\n): Promise<void> {\n await writeTextFile(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n","/**\n * Primitives for safely mutating local state files owned by the CLI.\n *\n * Two guarantees:\n * - Writes are atomic-ish: we stage the payload in a sibling temp file with\n * the target permissions, fsync the contents, then `rename` over the target.\n * On POSIX `rename` within the same directory is atomic; on Windows it is\n * atomic within the same volume which is always the case for files we write\n * inside `~/.dreamboard`.\n * - We refuse to clobber a file with an empty payload. The original bug that\n * wiped refresh tokens on a failing `sync`/`compile` hinged on `undefined`\n * JSON values being persisted and reloaded as `{}`. Forbidding empty\n * writes here removes that entire failure mode at the primitive level.\n *\n * Additionally, `withFileLock` provides a cross-process advisory lock built on\n * `O_CREAT | O_EXCL` so that parallel CLI invocations (e.g. `dreamboard sync`\n * running while `dreamboard compile` is in flight) serialize around mutations\n * of the same credential state.\n */\n\nimport { constants as fsConstants, promises as fs, type Stats } from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nexport type AtomicWriteOptions = {\n /** File mode applied to the written file (default: 0o600). */\n mode?: number;\n /** Call `fsync` on the temp file before renaming. Default: true. */\n fsync?: boolean;\n};\n\nexport async function atomicWriteFile(\n targetPath: string,\n contents: string,\n options: AtomicWriteOptions = {},\n): Promise<void> {\n if (contents.length === 0) {\n throw new Error(\n `Refusing to atomicWriteFile an empty payload to ${targetPath}`,\n );\n }\n const mode = options.mode ?? 0o600;\n const shouldFsync = options.fsync ?? true;\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n\n const suffix = crypto.randomBytes(6).toString(\"hex\");\n const tmpPath = `${targetPath}.tmp-${process.pid}-${suffix}`;\n\n const fh = await fs.open(\n tmpPath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,\n mode,\n );\n try {\n await fh.writeFile(contents, \"utf8\");\n try {\n await fh.chmod(mode);\n } catch {\n // Some filesystems (e.g. network volumes, Windows) refuse chmod.\n // Ignoring here is safe: the `open` call above already created the\n // file with the requested mode on systems that honor it.\n }\n if (shouldFsync) {\n try {\n await fh.sync();\n } catch {\n // Best-effort. Not all backends (tmpfs on some platforms) support fsync.\n }\n }\n } finally {\n await fh.close();\n }\n\n try {\n await fs.rename(tmpPath, targetPath);\n } catch (err) {\n await fs.unlink(tmpPath).catch(() => undefined);\n throw err;\n }\n}\n\nexport type FileLockOptions = {\n /** Max number of acquisition attempts before giving up. Default: 100. */\n retries?: number;\n /** Minimum backoff between retries in ms. Default: 20. */\n minDelayMs?: number;\n /** Maximum backoff between retries in ms. Default: 200. */\n maxDelayMs?: number;\n /**\n * A lockfile older than this is considered stale and forcibly removed.\n * Guards against crashed processes leaving a permanent lock. Default: 30s.\n */\n staleMs?: number;\n};\n\nexport async function withFileLock<T>(\n lockPath: string,\n fn: () => Promise<T>,\n options: FileLockOptions = {},\n): Promise<T> {\n const retries = options.retries ?? 100;\n const minDelayMs = options.minDelayMs ?? 20;\n const maxDelayMs = options.maxDelayMs ?? 200;\n const staleMs = options.staleMs ?? 30_000;\n\n await fs.mkdir(path.dirname(lockPath), { recursive: true });\n\n let attempt = 0;\n let acquired = false;\n while (!acquired) {\n try {\n const fh = await fs.open(\n lockPath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,\n 0o600,\n );\n await fh.writeFile(`${process.pid}\\n`, \"utf8\");\n await fh.close();\n acquired = true;\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw err;\n }\n }\n\n let stat: Stats | null = null;\n try {\n stat = await fs.stat(lockPath);\n } catch {\n continue;\n }\n if (stat !== null) {\n const ageMs = Date.now() - stat.mtimeMs;\n if (ageMs > staleMs) {\n await fs.unlink(lockPath).catch(() => undefined);\n continue;\n }\n }\n\n attempt += 1;\n if (attempt >= retries) {\n throw new Error(\n `Timed out acquiring file lock at ${lockPath} after ${retries} attempts.`,\n );\n }\n const jitter = Math.floor(\n Math.random() * Math.max(1, maxDelayMs - minDelayMs),\n );\n await new Promise((resolve) => setTimeout(resolve, minDelayMs + jitter));\n }\n\n try {\n return await fn();\n } finally {\n await fs.unlink(lockPath).catch(() => undefined);\n }\n}\n","/**\n * Single writer for the long-lived Dreamboard session credentials.\n *\n * Design invariants (enforced at the type level and tested in\n * `credential-store.test.ts`):\n *\n * 1. This module is the ONLY place in the CLI that writes credentials to\n * disk or the OS keychain. `global-config.ts` used to own both the\n * config and the credentials via `saveGlobalConfig`, which made it\n * trivial to wipe a refresh token by accident. The `GlobalConfig` type\n * no longer carries credentials, so attempting to persist one through\n * the config path is a type error.\n *\n * 2. The mutating surface is intentionally narrow:\n * - `setCredentials(c)` for refreshable sessions (both tokens present)\n * - `setAccessOnlySession(accessToken)` for the `auth set` / `config set\n * --token` power-user path, which has no refresh token by\n * construction\n * - `clearCredentials()` wipes the file entirely\n * There is no \"partial update\" API. `Credentials` requires both\n * `accessToken` and `refreshToken`, so it is impossible to persist a\n * half-populated refreshable session.\n *\n * 3. Writes go through `atomicWriteFile` + `withFileLock`, so a crash or\n * interrupt during `dreamboard sync`/`compile` cannot leave `auth.json`\n * truncated, and parallel CLI invocations cannot clobber each other's\n * rotated refresh tokens.\n *\n * 4. The on-disk JSON shape for the file backend is kept backward\n * compatible: we continue to read/write `authToken` + `refreshToken`\n * so existing users are not forced to log in again after this change.\n * A newer `accessToken` key is also accepted for read to ease any\n * future format bump.\n *\n * 5. The file backend is the default. The OS keychain is opt-in via\n * `credentialBackend: \"keychain\"` in `~/.dreamboard/config.json`\n * because on macOS the first keychain write triggers a login-password\n * prompt, and re-prompts whenever the executing Node binary's code\n * signature changes (e.g. after an `nvm`/`volta` upgrade). Users who\n * want encrypted-at-rest storage can opt in explicitly; everyone else\n * gets a zero-prompt experience.\n */\n\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport { PROJECT_DIR_NAME } from \"../constants.js\";\nimport {\n atomicWriteFile,\n withFileLock,\n type FileLockOptions,\n} from \"../utils/atomic-file.js\";\n\n/** Fully refreshable session: both tokens required. */\nexport type Credentials = {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly tokenExpiresAt?: string;\n readonly clerkOAuthIssuer?: string;\n readonly clerkOAuthClientId?: string;\n readonly clerkOAuthTokenUrl?: string;\n readonly environment?: string;\n};\n\n/**\n * Raw on-disk snapshot. Either or both fields may be present. The refresh\n * coordinator only acts on snapshots that have both tokens populated.\n */\nexport type StoredSessionSnapshot = {\n readonly accessToken?: string;\n readonly refreshToken?: string;\n readonly tokenExpiresAt?: string;\n readonly clerkOAuthIssuer?: string;\n readonly clerkOAuthClientId?: string;\n readonly clerkOAuthTokenUrl?: string;\n readonly environment?: string;\n};\n\nexport type CredentialBackendName = \"file\" | \"keychain\";\n\nexport type CredentialBackend = {\n readonly name: CredentialBackendName;\n read(): Promise<StoredSessionSnapshot | null>;\n writeFull(creds: Credentials): Promise<void>;\n writeAccessOnly(accessToken: string): Promise<void>;\n clear(): Promise<void>;\n};\n\nexport type CredentialLockOps = {\n readonly backendName: CredentialBackendName;\n read(): Promise<StoredSessionSnapshot | null>;\n writeFull(creds: Credentials): Promise<void>;\n writeAccessOnly(accessToken: string): Promise<void>;\n clear(): Promise<void>;\n};\n\ntype DiskShape = Partial<{\n accessToken: string;\n authToken: string;\n refreshToken: string;\n tokenExpiresAt: string;\n clerkOAuthIssuer: string;\n clerkOAuthClientId: string;\n clerkOAuthTokenUrl: string;\n environment: string;\n}>;\n\nexport function getCredentialFilePath(): string {\n return path.join(os.homedir(), PROJECT_DIR_NAME, \"auth.json\");\n}\n\nfunction getCredentialLockPath(): string {\n return `${getCredentialFilePath()}.lock`;\n}\n\nasync function fileRead(): Promise<StoredSessionSnapshot | null> {\n const filePath = getCredentialFilePath();\n let data: string;\n try {\n data = await fs.readFile(filePath, \"utf8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw err;\n }\n if (data.trim().length === 0) {\n return null;\n }\n let parsed: DiskShape;\n try {\n parsed = JSON.parse(data) as DiskShape;\n } catch {\n return null;\n }\n const accessToken = parsed.accessToken ?? parsed.authToken;\n const refreshToken = parsed.refreshToken;\n if (!accessToken && !refreshToken) return null;\n return {\n accessToken: accessToken || undefined,\n refreshToken: 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}\n\nasync function writeFilePayload(payload: DiskShape): Promise<void> {\n await atomicWriteFile(\n getCredentialFilePath(),\n `${JSON.stringify(payload, null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n\nasync function fileWriteFull(creds: Credentials): Promise<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 await writeFilePayload({\n authToken: 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}\n\nasync function fileWriteAccessOnly(accessToken: string): Promise<void> {\n if (!accessToken) {\n throw new Error(\"Refusing to persist an empty access token.\");\n }\n await writeFilePayload({ authToken: accessToken });\n}\n\nasync function fileClear(): Promise<void> {\n const filePath = getCredentialFilePath();\n try {\n await fs.unlink(filePath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n}\n\nexport const fileCredentialBackend: CredentialBackend = {\n name: \"file\",\n read: fileRead,\n writeFull: fileWriteFull,\n writeAccessOnly: fileWriteAccessOnly,\n clear: fileClear,\n};\n\nexport type BackendResolver = () =>\n | CredentialBackend\n | Promise<CredentialBackend>;\n\nlet cachedBackend: CredentialBackend | null = null;\nlet migrationCompleted = false;\nlet backendResolver: BackendResolver = defaultBackendResolver;\n\n/**\n * Default resolver precedence:\n *\n * 1. `DREAMBOARD_CREDENTIAL_BACKEND` env var (debugging / CI override).\n * - \"file\" -> force file\n * - \"keychain\" -> force keychain (falls back to file if the native\n * module or the OS keyring is unavailable)\n * - \"auto\" -> same as unset (use config)\n * - unknown -> throw so typos fail loud\n * 2. `credentialBackend` in `~/.dreamboard/config.json`.\n * - \"keychain\" -> opt in to the OS keychain (with file fallback)\n * - \"file\" / unset / malformed -> file\n * 3. Default: file backend.\n *\n * Keychain is opt-in because on macOS the OS login-keychain prompts for\n * the user's password the first time a new binary tries to write to an\n * item, and re-prompts whenever the Node binary signature changes. We\n * would rather ship a zero-prompt default and let users who care about\n * encrypted-at-rest storage enable it.\n *\n * The resolver is async because the keychain probe requires a dynamic\n * `@napi-rs/keyring` import.\n */\nasync function defaultBackendResolver(): Promise<CredentialBackend> {\n const override = (process.env.DREAMBOARD_CREDENTIAL_BACKEND ?? \"\")\n .trim()\n .toLowerCase();\n if (override === \"file\") {\n return fileCredentialBackend;\n }\n if (override && override !== \"keychain\" && override !== \"auto\") {\n // Fail loud on typos rather than silently falling back: this env\n // var exists specifically for users who are debugging auth issues\n // and need to know their override took effect.\n throw new Error(\n `Unknown DREAMBOARD_CREDENTIAL_BACKEND value \"${override}\" (expected \"file\", \"keychain\", or \"auto\").`,\n );\n }\n\n const useKeychain =\n override === \"keychain\" || (await readCredentialBackendPreference());\n if (!useKeychain) {\n return fileCredentialBackend;\n }\n\n const { tryKeychainBackend } = await import(\"./keychain-backend.js\");\n const keychain = await tryKeychainBackend();\n if (keychain.available) {\n return keychain.backend;\n }\n // The user explicitly asked for keychain but the platform can't\n // provide one (no libsecret on Linux, missing native module, etc).\n // Silently degrade to the file backend so the CLI stays usable; the\n // active backend is still visible through `dreamboard auth status`.\n return fileCredentialBackend;\n}\n\nasync function readCredentialBackendPreference(): Promise<boolean> {\n try {\n // Dynamic import to avoid a top-level cycle with `global-config.ts`\n // (which imports `getCredentialFilePath` from this module). Using\n // the async path keeps the cycle purely lazy.\n const { loadGlobalConfig } = await import(\"./global-config.js\");\n const config = await loadGlobalConfig();\n return config.credentialBackend === \"keychain\";\n } catch {\n // If the config file is unreadable or the dynamic import fails\n // (e.g. during early bootstrap), fall back to the file-backed\n // default rather than crashing credential lookups.\n return false;\n }\n}\n\n/**\n * Override which backend is used. Tests use this to inject in-memory\n * backends; production code uses the default keychain-first resolver.\n */\nexport function setCredentialBackendResolver(resolver: BackendResolver): void {\n backendResolver = resolver;\n cachedBackend = null;\n migrationCompleted = false;\n}\n\nexport async function getCredentialBackend(): Promise<CredentialBackend> {\n if (cachedBackend === null) {\n cachedBackend = await backendResolver();\n // One-time migration: if we resolved to a non-file backend and\n // `auth.json` still has credentials from the old layout, copy them\n // over and remove the file. We only do this when the new backend is\n // empty, so repeated migrations cannot stomp a newer keychain\n // session with a stale file session.\n if (!migrationCompleted && cachedBackend.name !== \"file\") {\n await migrateFromFileBackendIfNeeded(cachedBackend);\n }\n migrationCompleted = true;\n }\n return cachedBackend;\n}\n\nasync function migrateFromFileBackendIfNeeded(\n target: CredentialBackend,\n): Promise<void> {\n try {\n const [onDisk, onTarget] = await Promise.all([\n fileCredentialBackend.read(),\n target.read(),\n ]);\n if (!onDisk) return;\n if (onTarget) {\n // Target already has a session - the user has already migrated.\n // Remove the file so it cannot get re-used accidentally.\n await fileCredentialBackend.clear();\n return;\n }\n if (onDisk.accessToken && onDisk.refreshToken) {\n await target.writeFull({\n accessToken: onDisk.accessToken,\n refreshToken: onDisk.refreshToken,\n });\n } else if (onDisk.accessToken) {\n await target.writeAccessOnly(onDisk.accessToken);\n } else {\n return;\n }\n await fileCredentialBackend.clear();\n } catch {\n // Migration is best-effort. A failure here should not block CLI\n // operation; on next run the file backend is still consulted\n // directly because the keychain backend's `read` returns null and\n // callers fall through to \"missing session\" → login prompt.\n }\n}\n\nexport async function getActiveCredentialBackendName(): Promise<CredentialBackendName> {\n const backend = await getCredentialBackend();\n return backend.name;\n}\n\n/** Loose read: returns whatever is on disk, including access-only sessions. */\nexport async function getStoredSession(): Promise<StoredSessionSnapshot | null> {\n const backend = await getCredentialBackend();\n return backend.read();\n}\n\n/** Strict read: returns a refreshable pair, or null if either token is missing. */\nexport async function getCredentials(): Promise<Credentials | null> {\n const snapshot = await getStoredSession();\n if (!snapshot) return null;\n const { accessToken, refreshToken } = snapshot;\n if (!accessToken || !refreshToken) return null;\n return { accessToken, refreshToken };\n}\n\nexport async function setCredentials(creds: Credentials): Promise<void> {\n await withFileLock(getCredentialLockPath(), async () => {\n const backend = await getCredentialBackend();\n await backend.writeFull(creds);\n });\n}\n\nexport async function setAccessOnlySession(accessToken: string): Promise<void> {\n await withFileLock(getCredentialLockPath(), async () => {\n const backend = await getCredentialBackend();\n await backend.writeAccessOnly(accessToken);\n });\n}\n\nexport async function clearCredentials(): Promise<void> {\n await withFileLock(getCredentialLockPath(), async () => {\n const backend = await getCredentialBackend();\n await backend.clear();\n });\n}\n\n/**\n * Run `fn` while holding the cross-process credential lock. `fn` receives\n * an ops handle that reads/writes the active backend without re-acquiring\n * the lock (avoiding deadlock).\n *\n * This is the only correct way to perform a read-modify-write on stored\n * credentials (e.g. CLI refresh rotation) in the presence of\n * concurrent CLI invocations.\n */\nexport async function withCredentialLock<T>(\n fn: (ops: CredentialLockOps) => Promise<T>,\n options?: FileLockOptions,\n): Promise<T> {\n return withFileLock(\n getCredentialLockPath(),\n async () => {\n const backend = await getCredentialBackend();\n const ops: CredentialLockOps = {\n backendName: backend.name,\n read: () => backend.read(),\n writeFull: (creds) => backend.writeFull(creds),\n writeAccessOnly: (accessToken) => backend.writeAccessOnly(accessToken),\n clear: () => backend.clear(),\n };\n return fn(ops);\n },\n options,\n );\n}\n\n/** Test-only reset of module state. Not exported through the barrel. */\nexport function _resetCredentialStoreForTests(): void {\n cachedBackend = null;\n migrationCompleted = false;\n backendResolver = defaultBackendResolver;\n}\n"],"mappings":"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","names":["os","path","path","stat","path","fs","path","fs","loadGlobalConfig","path","os"]}
|