@dreamboard-games/cli 0.1.30-alpha.0 → 0.1.30-alpha.2
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/{chunk-TSJVWTJO.js → chunk-N7XPNNUI.js} +14 -12
- package/dist/chunk-N7XPNNUI.js.map +1 -0
- package/dist/chunk-SEGVTWSK.js +44 -0
- package/dist/{chunk-3XNJT3RK.js → chunk-TAQKH67O.js} +21279 -35845
- package/dist/chunk-TAQKH67O.js.map +1 -0
- package/dist/{global-config-UKSWNDTX.js → global-config-S4ZIPECE.js} +3 -3
- package/dist/index.js +955 -230
- 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 +6 -6
- 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/agent-workspace-verifier.mjs +0 -227
- package/dist/agent-verifier/chunk-2E5P5NWG.mjs +0 -835
- package/dist/agent-verifier/chunk-2GBBP27W.mjs +0 -301
- package/dist/agent-verifier/chunk-2NZNKIND.mjs +0 -166
- package/dist/agent-verifier/chunk-2QMNAVV4.mjs +0 -14522
- package/dist/agent-verifier/chunk-2SZHMP6F.mjs +0 -264
- package/dist/agent-verifier/chunk-54TAYXUD.mjs +0 -12
- package/dist/agent-verifier/chunk-6A5HRJMQ.mjs +0 -3174
- package/dist/agent-verifier/chunk-6UUJEYDV.mjs +0 -213
- package/dist/agent-verifier/chunk-7653FPGJ.mjs +0 -381
- package/dist/agent-verifier/chunk-BVVNBJM4.mjs +0 -221
- package/dist/agent-verifier/chunk-CEDUHGNH.mjs +0 -74
- package/dist/agent-verifier/chunk-CEQ2VJWN.mjs +0 -149
- package/dist/agent-verifier/chunk-CFU5EWIC.mjs +0 -69
- package/dist/agent-verifier/chunk-DTMJCPS4.mjs +0 -730
- package/dist/agent-verifier/chunk-EIQWDQWJ.mjs +0 -186
- package/dist/agent-verifier/chunk-EOQIV6PS.mjs +0 -649
- package/dist/agent-verifier/chunk-HBNDKQT5.mjs +0 -8381
- package/dist/agent-verifier/chunk-HJFQDSTU.mjs +0 -225
- package/dist/agent-verifier/chunk-LI3ZR3BI.mjs +0 -41
- package/dist/agent-verifier/chunk-LM3OZLZG.mjs +0 -48
- package/dist/agent-verifier/chunk-MINCYHXN.mjs +0 -106
- package/dist/agent-verifier/chunk-MRCUP5SW.mjs +0 -128
- package/dist/agent-verifier/chunk-PM3SVG6R.mjs +0 -38
- package/dist/agent-verifier/chunk-RBDDIIPM.mjs +0 -19
- package/dist/agent-verifier/chunk-RJBLBYHX.mjs +0 -1681
- package/dist/agent-verifier/chunk-SHUMAVAP.mjs +0 -59
- package/dist/agent-verifier/chunk-SYPLYRGB.mjs +0 -2812
- package/dist/agent-verifier/chunk-U6OJN7XS.mjs +0 -8092
- package/dist/agent-verifier/chunk-VYJTHSYR.mjs +0 -44
- package/dist/agent-verifier/chunk-XYDL7GY6.mjs +0 -10
- package/dist/agent-verifier/compile-WNCQQVOF.mjs +0 -313
- package/dist/agent-verifier/global-config-WX3ZZIVU.mjs +0 -17
- package/dist/agent-verifier/local-files-MTPLP62S.mjs +0 -46
- package/dist/agent-verifier/local-typecheck-QFYYAZOK.mjs +0 -9
- package/dist/agent-verifier/materialize-workspace-EWGZIVOY.mjs +0 -90
- package/dist/agent-verifier/project-state-7GR6BQTQ.mjs +0 -32
- package/dist/agent-verifier/reducer-bundle-preflight-C73LEXI2.mjs +0 -23
- package/dist/agent-verifier/reducer-contract-preflight-22X7DSZW.mjs +0 -10
- package/dist/agent-verifier/reducer-native-test-harness-GMWBUISX.mjs +0 -53
- package/dist/agent-verifier/static-scaffold-4YEQME5N.mjs +0 -28
- package/dist/agent-verifier/sync-LOQAH4RC.mjs +0 -594
- package/dist/agent-verifier/test-YOJERVHN.mjs +0 -356
- package/dist/agent-verifier/testing-5K2BJYF2.mjs +0 -674
- package/dist/agent-verifier/workspace-codegen-JDZJRSDV.mjs +0 -11
- package/dist/agent-verifier/workspace-dependencies-HZ6VVS4G.mjs +0 -14
- package/dist/chunk-2H7UOFLK.js +0 -11
- package/dist/chunk-3XNJT3RK.js.map +0 -1
- package/dist/chunk-7FOO4AJI.js +0 -50
- package/dist/chunk-7FOO4AJI.js.map +0 -1
- package/dist/chunk-TSJVWTJO.js.map +0 -1
- package/dist/internal.d.ts +0 -311
- package/dist/keychain-backend-JHTXAKWC.js +0 -135
- package/dist/prompt-GMZABCJC.js +0 -756
- 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 → chunk-SEGVTWSK.js.map} +0 -0
- /package/dist/{global-config-UKSWNDTX.js.map → global-config-S4ZIPECE.js.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
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
atomicWriteFile,
|
|
4
|
-
withFileLock
|
|
5
|
-
} from "./chunk-MINCYHXN.mjs";
|
|
6
|
-
import {
|
|
7
|
-
ensureDir,
|
|
8
|
-
readJsonFile
|
|
9
|
-
} from "./chunk-LM3OZLZG.mjs";
|
|
10
|
-
import {
|
|
11
|
-
PROJECT_DIR_NAME
|
|
12
|
-
} from "./chunk-SHUMAVAP.mjs";
|
|
13
|
-
|
|
14
|
-
// src/config/global-config.ts
|
|
15
|
-
import os2 from "os";
|
|
16
|
-
import path2 from "path";
|
|
17
|
-
|
|
18
|
-
// src/config/credential-store.ts
|
|
19
|
-
import os from "os";
|
|
20
|
-
import path from "path";
|
|
21
|
-
import { promises as fs } from "fs";
|
|
22
|
-
function getCredentialFilePath() {
|
|
23
|
-
return path.join(os.homedir(), PROJECT_DIR_NAME, "auth.json");
|
|
24
|
-
}
|
|
25
|
-
function getCredentialLockPath() {
|
|
26
|
-
return `${getCredentialFilePath()}.lock`;
|
|
27
|
-
}
|
|
28
|
-
async function fileRead() {
|
|
29
|
-
const filePath = getCredentialFilePath();
|
|
30
|
-
let data;
|
|
31
|
-
try {
|
|
32
|
-
data = await fs.readFile(filePath, "utf8");
|
|
33
|
-
} catch (err) {
|
|
34
|
-
if (err.code === "ENOENT") return null;
|
|
35
|
-
throw err;
|
|
36
|
-
}
|
|
37
|
-
if (data.trim().length === 0) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
let parsed;
|
|
41
|
-
try {
|
|
42
|
-
parsed = JSON.parse(data);
|
|
43
|
-
} catch {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
const accessToken = parsed.accessToken ?? parsed.authToken;
|
|
47
|
-
const refreshToken = parsed.refreshToken;
|
|
48
|
-
if (!accessToken && !refreshToken) return null;
|
|
49
|
-
return {
|
|
50
|
-
accessToken: accessToken || void 0,
|
|
51
|
-
refreshToken: refreshToken || void 0,
|
|
52
|
-
tokenExpiresAt: parsed.tokenExpiresAt || void 0,
|
|
53
|
-
clerkOAuthIssuer: parsed.clerkOAuthIssuer || void 0,
|
|
54
|
-
clerkOAuthClientId: parsed.clerkOAuthClientId || void 0,
|
|
55
|
-
clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || void 0,
|
|
56
|
-
environment: parsed.environment || void 0
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
async function writeFilePayload(payload) {
|
|
60
|
-
await atomicWriteFile(
|
|
61
|
-
getCredentialFilePath(),
|
|
62
|
-
`${JSON.stringify(payload, null, 2)}
|
|
63
|
-
`,
|
|
64
|
-
{ mode: 384 }
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
async function fileWriteFull(creds) {
|
|
68
|
-
if (!creds.accessToken || !creds.refreshToken) {
|
|
69
|
-
throw new Error(
|
|
70
|
-
"Refusing to persist credentials with an empty accessToken or refreshToken."
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
await writeFilePayload({
|
|
74
|
-
authToken: creds.accessToken,
|
|
75
|
-
refreshToken: creds.refreshToken,
|
|
76
|
-
tokenExpiresAt: creds.tokenExpiresAt,
|
|
77
|
-
clerkOAuthIssuer: creds.clerkOAuthIssuer,
|
|
78
|
-
clerkOAuthClientId: creds.clerkOAuthClientId,
|
|
79
|
-
clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,
|
|
80
|
-
environment: creds.environment
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
async function fileWriteAccessOnly(accessToken) {
|
|
84
|
-
if (!accessToken) {
|
|
85
|
-
throw new Error("Refusing to persist an empty access token.");
|
|
86
|
-
}
|
|
87
|
-
await writeFilePayload({ authToken: accessToken });
|
|
88
|
-
}
|
|
89
|
-
async function fileClear() {
|
|
90
|
-
const filePath = getCredentialFilePath();
|
|
91
|
-
try {
|
|
92
|
-
await fs.unlink(filePath);
|
|
93
|
-
} catch (err) {
|
|
94
|
-
if (err.code !== "ENOENT") throw err;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
var fileCredentialBackend = {
|
|
98
|
-
name: "file",
|
|
99
|
-
read: fileRead,
|
|
100
|
-
writeFull: fileWriteFull,
|
|
101
|
-
writeAccessOnly: fileWriteAccessOnly,
|
|
102
|
-
clear: fileClear
|
|
103
|
-
};
|
|
104
|
-
var cachedBackend = null;
|
|
105
|
-
var migrationCompleted = false;
|
|
106
|
-
var backendResolver = defaultBackendResolver;
|
|
107
|
-
async function defaultBackendResolver() {
|
|
108
|
-
const override = (process.env.DREAMBOARD_CREDENTIAL_BACKEND ?? "").trim().toLowerCase();
|
|
109
|
-
if (override === "file") {
|
|
110
|
-
return fileCredentialBackend;
|
|
111
|
-
}
|
|
112
|
-
if (override && override !== "keychain" && override !== "auto") {
|
|
113
|
-
throw new Error(
|
|
114
|
-
`Unknown DREAMBOARD_CREDENTIAL_BACKEND value "${override}" (expected "file", "keychain", or "auto").`
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
const useKeychain = override === "keychain" || await readCredentialBackendPreference();
|
|
118
|
-
if (!useKeychain) {
|
|
119
|
-
return fileCredentialBackend;
|
|
120
|
-
}
|
|
121
|
-
const { tryKeychainBackend } = await import("./keychain-backend-TNOPQV3Z.mjs");
|
|
122
|
-
const keychain = await tryKeychainBackend();
|
|
123
|
-
if (keychain.available) {
|
|
124
|
-
return keychain.backend;
|
|
125
|
-
}
|
|
126
|
-
return fileCredentialBackend;
|
|
127
|
-
}
|
|
128
|
-
async function readCredentialBackendPreference() {
|
|
129
|
-
try {
|
|
130
|
-
const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-WX3ZZIVU.mjs");
|
|
131
|
-
const config = await loadGlobalConfig2();
|
|
132
|
-
return config.credentialBackend === "keychain";
|
|
133
|
-
} catch {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
async function getCredentialBackend() {
|
|
138
|
-
if (cachedBackend === null) {
|
|
139
|
-
cachedBackend = await backendResolver();
|
|
140
|
-
if (!migrationCompleted && cachedBackend.name !== "file") {
|
|
141
|
-
await migrateFromFileBackendIfNeeded(cachedBackend);
|
|
142
|
-
}
|
|
143
|
-
migrationCompleted = true;
|
|
144
|
-
}
|
|
145
|
-
return cachedBackend;
|
|
146
|
-
}
|
|
147
|
-
async function migrateFromFileBackendIfNeeded(target) {
|
|
148
|
-
try {
|
|
149
|
-
const [onDisk, onTarget] = await Promise.all([
|
|
150
|
-
fileCredentialBackend.read(),
|
|
151
|
-
target.read()
|
|
152
|
-
]);
|
|
153
|
-
if (!onDisk) return;
|
|
154
|
-
if (onTarget) {
|
|
155
|
-
await fileCredentialBackend.clear();
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
if (onDisk.accessToken && onDisk.refreshToken) {
|
|
159
|
-
await target.writeFull({
|
|
160
|
-
accessToken: onDisk.accessToken,
|
|
161
|
-
refreshToken: onDisk.refreshToken
|
|
162
|
-
});
|
|
163
|
-
} else if (onDisk.accessToken) {
|
|
164
|
-
await target.writeAccessOnly(onDisk.accessToken);
|
|
165
|
-
} else {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
await fileCredentialBackend.clear();
|
|
169
|
-
} catch {
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
async function getStoredSession() {
|
|
173
|
-
const backend = await getCredentialBackend();
|
|
174
|
-
return backend.read();
|
|
175
|
-
}
|
|
176
|
-
async function setCredentials(creds) {
|
|
177
|
-
await withFileLock(getCredentialLockPath(), async () => {
|
|
178
|
-
const backend = await getCredentialBackend();
|
|
179
|
-
await backend.writeFull(creds);
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// src/config/global-config.ts
|
|
184
|
-
function normalizeCredentialBackend(value) {
|
|
185
|
-
if (value === "file" || value === "keychain") return value;
|
|
186
|
-
return void 0;
|
|
187
|
-
}
|
|
188
|
-
function getGlobalConfigPath() {
|
|
189
|
-
return path2.join(os2.homedir(), PROJECT_DIR_NAME, "config.json");
|
|
190
|
-
}
|
|
191
|
-
function getGlobalAuthPath() {
|
|
192
|
-
return getCredentialFilePath();
|
|
193
|
-
}
|
|
194
|
-
async function loadGlobalConfig() {
|
|
195
|
-
const config = await readJsonFile(getGlobalConfigPath()).catch(
|
|
196
|
-
() => ({})
|
|
197
|
-
);
|
|
198
|
-
return {
|
|
199
|
-
environment: config.environment,
|
|
200
|
-
credentialBackend: normalizeCredentialBackend(config.credentialBackend)
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
async function saveGlobalConfig(config) {
|
|
204
|
-
const configDir = path2.join(os2.homedir(), PROJECT_DIR_NAME);
|
|
205
|
-
await ensureDir(configDir);
|
|
206
|
-
const normalized = {
|
|
207
|
-
environment: config.environment,
|
|
208
|
-
credentialBackend: normalizeCredentialBackend(config.credentialBackend)
|
|
209
|
-
};
|
|
210
|
-
await atomicWriteFile(
|
|
211
|
-
getGlobalConfigPath(),
|
|
212
|
-
`${JSON.stringify(normalized, null, 2)}
|
|
213
|
-
`,
|
|
214
|
-
{ mode: 384 }
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export {
|
|
219
|
-
getStoredSession,
|
|
220
|
-
setCredentials,
|
|
221
|
-
getGlobalConfigPath,
|
|
222
|
-
getGlobalAuthPath,
|
|
223
|
-
loadGlobalConfig,
|
|
224
|
-
saveGlobalConfig
|
|
225
|
-
};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// ../../node_modules/.pnpm/@dreamboard-games+sdk@0.4.0-alpha.0_@types+react-dom@19.2.3_@types+react@19.2.17__@type_b74cbe125b074769500a56e94fa7f664/node_modules/@dreamboard-games/sdk/dist/chunk-3OZMHZK3.js
|
|
4
|
-
var DEFAULT_REMEDY_BY_ARTIFACT = {
|
|
5
|
-
"base-states": "run `dreamboard test generate`, then re-run the tests.",
|
|
6
|
-
"session-state": "reset the dev session or run `dreamboard test generate`."
|
|
7
|
-
};
|
|
8
|
-
function artifactLabel(artifact) {
|
|
9
|
-
return artifact === "base-states" ? "base states" : "session state";
|
|
10
|
-
}
|
|
11
|
-
function artifactVerb(artifact) {
|
|
12
|
-
return artifact === "base-states" ? "were" : "was";
|
|
13
|
-
}
|
|
14
|
-
var StaleContractArtifactError = class extends Error {
|
|
15
|
-
code = "STALE_CONTRACT_ARTIFACT";
|
|
16
|
-
artifact;
|
|
17
|
-
expected;
|
|
18
|
-
found;
|
|
19
|
-
remedy;
|
|
20
|
-
constructor(options) {
|
|
21
|
-
const remedy = options.remedy ?? DEFAULT_REMEDY_BY_ARTIFACT[options.artifact];
|
|
22
|
-
super(
|
|
23
|
-
`${artifactLabel(options.artifact)} ${artifactVerb(
|
|
24
|
-
options.artifact
|
|
25
|
-
)} generated for contract ${options.found} but the current contract is ${options.expected}. Your state or phase schemas changed since the artifact was created. Remedy: ${remedy}`
|
|
26
|
-
);
|
|
27
|
-
this.name = "StaleContractArtifactError";
|
|
28
|
-
this.artifact = options.artifact;
|
|
29
|
-
this.expected = options.expected;
|
|
30
|
-
this.found = options.found;
|
|
31
|
-
this.remedy = remedy;
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
function isStaleContractArtifactError(error) {
|
|
35
|
-
return error instanceof StaleContractArtifactError || typeof error === "object" && error !== null && error.code === "STALE_CONTRACT_ARTIFACT";
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export {
|
|
39
|
-
StaleContractArtifactError,
|
|
40
|
-
isStaleContractArtifactError
|
|
41
|
-
};
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/utils/fs.ts
|
|
4
|
-
import { mkdir, readFile, stat, writeFile } from "fs/promises";
|
|
5
|
-
import path from "path";
|
|
6
|
-
async function ensureDir(dirPath) {
|
|
7
|
-
await mkdir(dirPath, { recursive: true });
|
|
8
|
-
}
|
|
9
|
-
async function exists(filePath) {
|
|
10
|
-
try {
|
|
11
|
-
await stat(filePath);
|
|
12
|
-
return true;
|
|
13
|
-
} catch {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
async function readTextFile(filePath) {
|
|
18
|
-
return readFile(filePath, "utf8");
|
|
19
|
-
}
|
|
20
|
-
async function readTextFileIfExists(filePath) {
|
|
21
|
-
try {
|
|
22
|
-
return await readFile(filePath, "utf8");
|
|
23
|
-
} catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async function writeTextFile(filePath, content) {
|
|
28
|
-
await ensureDir(path.dirname(filePath));
|
|
29
|
-
await writeFile(filePath, content, "utf8");
|
|
30
|
-
}
|
|
31
|
-
async function readJsonFile(filePath) {
|
|
32
|
-
const data = await readTextFile(filePath);
|
|
33
|
-
return JSON.parse(data);
|
|
34
|
-
}
|
|
35
|
-
async function writeJsonFile(filePath, data) {
|
|
36
|
-
await writeTextFile(filePath, `${JSON.stringify(data, null, 2)}
|
|
37
|
-
`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export {
|
|
41
|
-
ensureDir,
|
|
42
|
-
exists,
|
|
43
|
-
readTextFile,
|
|
44
|
-
readTextFileIfExists,
|
|
45
|
-
writeTextFile,
|
|
46
|
-
readJsonFile,
|
|
47
|
-
writeJsonFile
|
|
48
|
-
};
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/utils/atomic-file.ts
|
|
4
|
-
import { constants as fsConstants, promises as fs } from "fs";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import crypto from "crypto";
|
|
7
|
-
async function atomicWriteFile(targetPath, contents, options = {}) {
|
|
8
|
-
if (contents.length === 0) {
|
|
9
|
-
throw new Error(
|
|
10
|
-
`Refusing to atomicWriteFile an empty payload to ${targetPath}`
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
const mode = options.mode ?? 384;
|
|
14
|
-
const shouldFsync = options.fsync ?? true;
|
|
15
|
-
const dir = path.dirname(targetPath);
|
|
16
|
-
await fs.mkdir(dir, { recursive: true });
|
|
17
|
-
const suffix = crypto.randomBytes(6).toString("hex");
|
|
18
|
-
const tmpPath = `${targetPath}.tmp-${process.pid}-${suffix}`;
|
|
19
|
-
const fh = await fs.open(
|
|
20
|
-
tmpPath,
|
|
21
|
-
fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,
|
|
22
|
-
mode
|
|
23
|
-
);
|
|
24
|
-
try {
|
|
25
|
-
await fh.writeFile(contents, "utf8");
|
|
26
|
-
try {
|
|
27
|
-
await fh.chmod(mode);
|
|
28
|
-
} catch {
|
|
29
|
-
}
|
|
30
|
-
if (shouldFsync) {
|
|
31
|
-
try {
|
|
32
|
-
await fh.sync();
|
|
33
|
-
} catch {
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
} finally {
|
|
37
|
-
await fh.close();
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
await fs.rename(tmpPath, targetPath);
|
|
41
|
-
} catch (err) {
|
|
42
|
-
await fs.unlink(tmpPath).catch(() => void 0);
|
|
43
|
-
throw err;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async function withFileLock(lockPath, fn, options = {}) {
|
|
47
|
-
const retries = options.retries ?? 100;
|
|
48
|
-
const minDelayMs = options.minDelayMs ?? 20;
|
|
49
|
-
const maxDelayMs = options.maxDelayMs ?? 200;
|
|
50
|
-
const staleMs = options.staleMs ?? 3e4;
|
|
51
|
-
await fs.mkdir(path.dirname(lockPath), { recursive: true });
|
|
52
|
-
let attempt = 0;
|
|
53
|
-
let acquired = false;
|
|
54
|
-
while (!acquired) {
|
|
55
|
-
try {
|
|
56
|
-
const fh = await fs.open(
|
|
57
|
-
lockPath,
|
|
58
|
-
fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,
|
|
59
|
-
384
|
|
60
|
-
);
|
|
61
|
-
await fh.writeFile(`${process.pid}
|
|
62
|
-
`, "utf8");
|
|
63
|
-
await fh.close();
|
|
64
|
-
acquired = true;
|
|
65
|
-
break;
|
|
66
|
-
} catch (err) {
|
|
67
|
-
const code = err.code;
|
|
68
|
-
if (code !== "EEXIST") {
|
|
69
|
-
throw err;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
let stat = null;
|
|
73
|
-
try {
|
|
74
|
-
stat = await fs.stat(lockPath);
|
|
75
|
-
} catch {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
if (stat !== null) {
|
|
79
|
-
const ageMs = Date.now() - stat.mtimeMs;
|
|
80
|
-
if (ageMs > staleMs) {
|
|
81
|
-
await fs.unlink(lockPath).catch(() => void 0);
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
attempt += 1;
|
|
86
|
-
if (attempt >= retries) {
|
|
87
|
-
throw new Error(
|
|
88
|
-
`Timed out acquiring file lock at ${lockPath} after ${retries} attempts.`
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
const jitter = Math.floor(
|
|
92
|
-
Math.random() * Math.max(1, maxDelayMs - minDelayMs)
|
|
93
|
-
);
|
|
94
|
-
await new Promise((resolve) => setTimeout(resolve, minDelayMs + jitter));
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
return await fn();
|
|
98
|
-
} finally {
|
|
99
|
-
await fs.unlink(lockPath).catch(() => void 0);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export {
|
|
104
|
-
atomicWriteFile,
|
|
105
|
-
withFileLock
|
|
106
|
-
};
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/services/project/project-state.ts
|
|
4
|
-
var LOCAL_MAINTAINER_SDK_PACKAGE_NAMES = [
|
|
5
|
-
"@dreamboard-games/api-client",
|
|
6
|
-
"@dreamboard-games/sdk"
|
|
7
|
-
];
|
|
8
|
-
function getProjectAuthoringState(projectConfig) {
|
|
9
|
-
return projectConfig.authoring ?? {};
|
|
10
|
-
}
|
|
11
|
-
function getProjectPendingAuthoringSync(projectConfig) {
|
|
12
|
-
return getProjectAuthoringState(projectConfig).pendingSync;
|
|
13
|
-
}
|
|
14
|
-
function getProjectCompileState(projectConfig) {
|
|
15
|
-
return projectConfig.compile ?? {};
|
|
16
|
-
}
|
|
17
|
-
function getProjectLocalMaintainerRegistry(projectConfig) {
|
|
18
|
-
return projectConfig.localMaintainerRegistry;
|
|
19
|
-
}
|
|
20
|
-
function updateProjectAuthoringState(projectConfig, authoring) {
|
|
21
|
-
return {
|
|
22
|
-
...projectConfig,
|
|
23
|
-
authoring: {
|
|
24
|
-
...getProjectAuthoringState(projectConfig),
|
|
25
|
-
...authoring
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function setProjectPendingAuthoringSync(projectConfig, pendingSync) {
|
|
30
|
-
return updateProjectAuthoringState(projectConfig, {
|
|
31
|
-
pendingSync
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
function clearProjectPendingAuthoringSync(projectConfig) {
|
|
35
|
-
const authoring = getProjectAuthoringState(projectConfig);
|
|
36
|
-
if (!authoring.pendingSync) {
|
|
37
|
-
return projectConfig;
|
|
38
|
-
}
|
|
39
|
-
const { pendingSync: _pendingSync, ...rest } = authoring;
|
|
40
|
-
return {
|
|
41
|
-
...projectConfig,
|
|
42
|
-
authoring: rest
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function finalizeProjectPendingAuthoringSync(projectConfig) {
|
|
46
|
-
const authoring = getProjectAuthoringState(projectConfig);
|
|
47
|
-
const pendingSync = authoring.pendingSync;
|
|
48
|
-
if (!pendingSync) {
|
|
49
|
-
return projectConfig;
|
|
50
|
-
}
|
|
51
|
-
return updateProjectAuthoringState(
|
|
52
|
-
clearProjectPendingAuthoringSync(projectConfig),
|
|
53
|
-
{
|
|
54
|
-
authoringStateId: pendingSync.phase === "authoring_state_created" ? pendingSync.authoringStateId : authoring.authoringStateId,
|
|
55
|
-
revisionDigest: pendingSync.revisionDigest ?? authoring.revisionDigest,
|
|
56
|
-
sourceRevisionId: pendingSync.sourceRevisionId,
|
|
57
|
-
sourceTreeHash: pendingSync.sourceTreeHash,
|
|
58
|
-
manifestId: pendingSync.manifestId,
|
|
59
|
-
manifestContentHash: pendingSync.manifestContentHash,
|
|
60
|
-
localManifestContentHash: pendingSync.localManifestContentHash,
|
|
61
|
-
ruleId: pendingSync.ruleId
|
|
62
|
-
}
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
function updateProjectCompileState(projectConfig, compile) {
|
|
66
|
-
return {
|
|
67
|
-
...projectConfig,
|
|
68
|
-
compile: {
|
|
69
|
-
...getProjectCompileState(projectConfig),
|
|
70
|
-
...compile
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
function setLatestCompileAttempt(projectConfig, attempt) {
|
|
75
|
-
return updateProjectCompileState(projectConfig, {
|
|
76
|
-
...getProjectCompileState(projectConfig),
|
|
77
|
-
latestAttempt: attempt,
|
|
78
|
-
latestSuccessful: attempt.status === "successful" && attempt.resultId ? {
|
|
79
|
-
resultId: attempt.resultId,
|
|
80
|
-
authoringStateId: attempt.authoringStateId,
|
|
81
|
-
revisionDigest: attempt.revisionDigest
|
|
82
|
-
} : getProjectCompileState(projectConfig).latestSuccessful
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
function clearProjectCompileState(projectConfig) {
|
|
86
|
-
return {
|
|
87
|
-
...projectConfig,
|
|
88
|
-
compile: {}
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
function updateProjectLocalMaintainerRegistry(projectConfig, localMaintainerRegistry) {
|
|
92
|
-
return {
|
|
93
|
-
...projectConfig,
|
|
94
|
-
localMaintainerRegistry: sanitizeProjectLocalMaintainerRegistry(
|
|
95
|
-
localMaintainerRegistry
|
|
96
|
-
)
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
function sanitizeProjectLocalMaintainerRegistry(localMaintainerRegistry) {
|
|
100
|
-
if (!localMaintainerRegistry) return void 0;
|
|
101
|
-
const packages = {};
|
|
102
|
-
for (const packageName of LOCAL_MAINTAINER_SDK_PACKAGE_NAMES) {
|
|
103
|
-
const version = localMaintainerRegistry.packages[packageName];
|
|
104
|
-
if (version) {
|
|
105
|
-
packages[packageName] = version;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
...localMaintainerRegistry,
|
|
110
|
-
packages
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export {
|
|
115
|
-
getProjectAuthoringState,
|
|
116
|
-
getProjectPendingAuthoringSync,
|
|
117
|
-
getProjectCompileState,
|
|
118
|
-
getProjectLocalMaintainerRegistry,
|
|
119
|
-
updateProjectAuthoringState,
|
|
120
|
-
setProjectPendingAuthoringSync,
|
|
121
|
-
clearProjectPendingAuthoringSync,
|
|
122
|
-
finalizeProjectPendingAuthoringSync,
|
|
123
|
-
updateProjectCompileState,
|
|
124
|
-
setLatestCompileAttempt,
|
|
125
|
-
clearProjectCompileState,
|
|
126
|
-
updateProjectLocalMaintainerRegistry,
|
|
127
|
-
sanitizeProjectLocalMaintainerRegistry
|
|
128
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
ensureProjectSdk,
|
|
4
|
-
loadRemoteProjectIdentity
|
|
5
|
-
} from "./chunk-EOQIV6PS.mjs";
|
|
6
|
-
import {
|
|
7
|
-
updateProjectState
|
|
8
|
-
} from "./chunk-2NZNKIND.mjs";
|
|
9
|
-
|
|
10
|
-
// src/services/project/remote-project.ts
|
|
11
|
-
async function resolveRemoteProject(options) {
|
|
12
|
-
const identity = await loadRemoteProjectIdentity();
|
|
13
|
-
const project = await ensureProjectSdk({
|
|
14
|
-
projectId: options.projectConfig.projectId,
|
|
15
|
-
slug: options.projectConfig.slug,
|
|
16
|
-
updateAlias: options.updateAlias
|
|
17
|
-
});
|
|
18
|
-
const nextProjectConfig = {
|
|
19
|
-
...options.projectConfig,
|
|
20
|
-
slug: project.slug,
|
|
21
|
-
deploymentId: identity.deploymentId,
|
|
22
|
-
ownerScopeId: identity.ownerScopeId,
|
|
23
|
-
bindingKey: identity.bindingKey,
|
|
24
|
-
remoteHeadDigest: project.head?.revisionDigest,
|
|
25
|
-
apiBaseUrl: options.config.apiBaseUrl,
|
|
26
|
-
webBaseUrl: options.config.webBaseUrl
|
|
27
|
-
};
|
|
28
|
-
await updateProjectState(options.projectRoot, nextProjectConfig);
|
|
29
|
-
return {
|
|
30
|
-
identity,
|
|
31
|
-
project,
|
|
32
|
-
projectConfig: nextProjectConfig
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
resolveRemoteProject
|
|
38
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/services/project/framework-dependencies.ts
|
|
4
|
-
var FRAMEWORK_REACT_VERSION = "19.2.6";
|
|
5
|
-
var FRAMEWORK_ZOD_VERSION = "4.4.3";
|
|
6
|
-
var FRAMEWORK_REACT_DEPENDENCIES = {
|
|
7
|
-
react: FRAMEWORK_REACT_VERSION,
|
|
8
|
-
"react-dom": FRAMEWORK_REACT_VERSION
|
|
9
|
-
};
|
|
10
|
-
var FRAMEWORK_PNPM_OVERRIDES = {
|
|
11
|
-
...FRAMEWORK_REACT_DEPENDENCIES,
|
|
12
|
-
zod: FRAMEWORK_ZOD_VERSION
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
FRAMEWORK_ZOD_VERSION,
|
|
17
|
-
FRAMEWORK_REACT_DEPENDENCIES,
|
|
18
|
-
FRAMEWORK_PNPM_OVERRIDES
|
|
19
|
-
};
|