@dreamboard-games/cli 0.1.30-alpha.31 → 0.1.30-alpha.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +8 -8
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +109 -13
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  4. package/dist/agent-verifier/{chunk-NBRUEJUK.mjs → chunk-OQ6OGY5D.mjs} +3 -3
  5. package/dist/agent-verifier/{chunk-NBRUEJUK.mjs.map → chunk-OQ6OGY5D.mjs.map} +1 -1
  6. package/dist/agent-verifier/{materialize-workspace-MAGKDMK5.mjs → materialize-workspace-3ECF4EYD.mjs} +2 -2
  7. package/dist/agent-verifier/{static-scaffold-CLRRWXON.mjs → static-scaffold-XZ4FS4RR.mjs} +2 -2
  8. package/dist/authoring-compatibility-internal.js +1 -1
  9. package/dist/{chunk-YNJVKC2T.js → chunk-BN5UBK47.js} +3 -3
  10. package/dist/{chunk-YNJVKC2T.js.map → chunk-BN5UBK47.js.map} +1 -1
  11. package/dist/{chunk-X244CUU4.js → chunk-E67GR2SL.js} +111 -14
  12. package/dist/chunk-E67GR2SL.js.map +1 -0
  13. package/dist/index.js +23 -20
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal.js +2 -2
  16. package/package.json +1 -1
  17. package/release/authoring-release-set.json +2 -2
  18. package/skills/dreamboard/SKILL.md +3 -3
  19. package/skills/dreamboard/references/building-your-first-game.md +1 -1
  20. package/skills/dreamboard/references/cli.md +20 -19
  21. package/skills/dreamboard/references/quickstart.md +3 -3
  22. package/dist/chunk-X244CUU4.js.map +0 -1
  23. /package/dist/agent-verifier/{materialize-workspace-MAGKDMK5.mjs.map → materialize-workspace-3ECF4EYD.mjs.map} +0 -0
  24. /package/dist/agent-verifier/{static-scaffold-CLRRWXON.mjs.map → static-scaffold-XZ4FS4RR.mjs.map} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dreamboard
2
2
 
3
- Dreamboard CLI for working with Dreamboard games from your own editor/tooling.
3
+ Dreamboard for working with Dreamboard games from your own editor/tooling.
4
4
 
5
5
  Dreamboard is built to take you from napkin sketch to playable prototype without the paper cuts:
6
6
 
@@ -18,7 +18,7 @@ Published npm package:
18
18
  npm install -g dreamboard
19
19
  ```
20
20
 
21
- The published CLI targets Node 20+.
21
+ The published `dreamboard` package targets Node 20+.
22
22
 
23
23
  ## Why Dreamboard
24
24
 
@@ -35,11 +35,11 @@ Use browser login:
35
35
  dreamboard auth login
36
36
  ```
37
37
 
38
- The CLI stores your refreshable session in `~/.dreamboard/auth.json` by default. The file is written atomically with owner-only permissions (`0600`).
38
+ Dreamboard stores your refreshable session in `~/.dreamboard/auth.json` by default. The file is written atomically with owner-only permissions (`0600`).
39
39
 
40
40
  The operating system keychain is optional. Set `"credentialBackend": "keychain"` in `~/.dreamboard/config.json`, or use `DREAMBOARD_CREDENTIAL_BACKEND=keychain`, to opt in.
41
41
 
42
- That stored session includes the Clerk refresh token the CLI needs to renew and exchange for short-lived Dreamboard API tokens automatically. Direct JWT injection is intentionally not part of the published CLI flow.
42
+ That stored session includes the Clerk refresh token Dreamboard needs to renew and exchange for short-lived Dreamboard API tokens automatically. Direct JWT injection is intentionally not part of the published Dreamboard flow.
43
43
 
44
44
  ## Source Checkout Setup
45
45
 
@@ -112,15 +112,15 @@ dreamboard dev
112
112
  ## Notes
113
113
 
114
114
  - Project state lives in `.dreamboard/project.json`.
115
- - Published/public CLI installs target Node 20+ and support commit-scoped
115
+ - Published/public `dreamboard` installs target Node 20+ and support commit-scoped
116
116
  build, preview, release, and status workflows.
117
- - Published/public CLI builds are production-only; they do not support environment overrides or direct JWT injection.
117
+ - Published stable `dreamboard` builds are production-only and do not support environment overrides or direct JWT injection. Published alpha builds allow `--env <local|staging|prod>` for operator verification, but still reject direct JWT injection.
118
118
  - Local embedded-harness testing remains Bun-only and requires a source checkout with local backend support.
119
- - Internal source-checkout builds may expose extra auth and environment helpers, but those are not part of the published CLI contract.
119
+ - Internal source-checkout builds may expose extra auth and environment helpers, but those are not part of the published Dreamboard contract.
120
120
 
121
121
  ## Skill Source
122
122
 
123
123
  - Public skill source lives under `skills/dreamboard/`.
124
124
  - `skills/dreamboard/references/*.md` are generated from `docs/` via `pnpm run sync:skill-docs`.
125
125
  - `dreamboard project create` installs the bundled skill into `.agents/skills/dreamboard/` in the generated game project.
126
- - Public GitHub repo for the CLI is [dreamboard-games/dreamboard-cli](https://github.com/dreamboard-games/dreamboard-cli).
126
+ - Public GitHub repo for Dreamboard is [dreamboard-games/dreamboard](https://github.com/dreamboard-games/dreamboard).
@@ -1129,8 +1129,15 @@ var consola = createConsola2();
1129
1129
 
1130
1130
  // src/build-target.ts
1131
1131
  var injectedBuildChannel = true ? "development" : void 0;
1132
+ var injectedPackageVersion = typeof __DREAMBOARD_PACKAGE_VERSION__ === "string" ? __DREAMBOARD_PACKAGE_VERSION__ : void 0;
1132
1133
  var BUILD_CHANNEL = injectedBuildChannel === "published" ? "published" : "development";
1134
+ var PACKAGE_VERSION = injectedPackageVersion ?? "0.0.0-development";
1135
+ function isAlphaReleaseVersion(version) {
1136
+ return /(?:^|-|\.)alpha(?:$|-|\.)/.test(version);
1137
+ }
1133
1138
  var IS_PUBLISHED_BUILD = BUILD_CHANNEL === "published";
1139
+ var IS_ALPHA_RELEASE = isAlphaReleaseVersion(PACKAGE_VERSION);
1140
+ var CAN_SELECT_ENVIRONMENT = !IS_PUBLISHED_BUILD || IS_ALPHA_RELEASE;
1134
1141
  var PUBLISHED_ENVIRONMENT = "prod";
1135
1142
 
1136
1143
  // src/auth/refresh-error.ts
@@ -1618,15 +1625,15 @@ function resolveConfig(globalConfig, flags, project, credentials) {
1618
1625
  if (IS_PUBLISHED_BUILD) {
1619
1626
  assertPublicRuntimeFlags(flags);
1620
1627
  }
1621
- const envEnvironment = IS_PUBLISHED_BUILD ? void 0 : environmentFromProcess();
1622
- const projectEnvironment = IS_PUBLISHED_BUILD ? void 0 : project?.environment;
1623
- const environment = IS_PUBLISHED_BUILD ? PUBLISHED_ENVIRONMENT : flags.env || envEnvironment || projectEnvironment || globalConfig.environment || "staging";
1628
+ const envEnvironment = CAN_SELECT_ENVIRONMENT ? environmentFromProcess() : void 0;
1629
+ const projectEnvironment = CAN_SELECT_ENVIRONMENT ? project?.environment : void 0;
1630
+ const environment = CAN_SELECT_ENVIRONMENT ? flags.env || envEnvironment || projectEnvironment || globalConfig.environment || (IS_PUBLISHED_BUILD ? PUBLISHED_ENVIRONMENT : "staging") : PUBLISHED_ENVIRONMENT;
1624
1631
  const envConfig = ENVIRONMENT_CONFIGS[environment];
1625
1632
  const publishedEnvConfig = ENVIRONMENT_CONFIGS[PUBLISHED_ENVIRONMENT];
1626
- const hasExplicitEnvironmentOverride = !IS_PUBLISHED_BUILD && Boolean(flags.env || envEnvironment || projectEnvironment);
1627
- const resolvedApiBaseUrl = IS_PUBLISHED_BUILD ? publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.apiBaseUrl, environment) || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL : project?.apiBaseUrl || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL;
1633
+ const hasExplicitEnvironmentOverride = CAN_SELECT_ENVIRONMENT && Boolean(flags.env || envEnvironment || projectEnvironment);
1634
+ const resolvedApiBaseUrl = IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT ? publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.apiBaseUrl, environment) || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL : project?.apiBaseUrl || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL;
1628
1635
  const apiBaseUrl = valueOrUndefined(process.env.DREAMBOARD_API_BASE_URL) ?? resolvedApiBaseUrl;
1629
- const resolvedWebBaseUrl = IS_PUBLISHED_BUILD ? publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.webBaseUrl, environment) || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;
1636
+ const resolvedWebBaseUrl = IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT ? publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.webBaseUrl, environment) || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;
1630
1637
  const webBaseUrl = valueOrUndefined(process.env.DREAMBOARD_WEB_BASE_URL) ?? resolvedWebBaseUrl;
1631
1638
  const snapshot = buildCredentialSnapshot(flags, credentials, environment);
1632
1639
  const oauthConfig = resolveEnvironmentOAuthConfig(environment, envConfig);
@@ -1731,9 +1738,10 @@ function projectLocalBaseUrl(rawUrl, environment) {
1731
1738
  return void 0;
1732
1739
  }
1733
1740
  }
1734
- function assertPublicRuntimeFlags(flags) {
1735
- const argv2 = process.argv.slice(2);
1736
- if (flags.env || argv2.includes("--env")) {
1741
+ function assertPublicRuntimeFlags(flags, options = {}) {
1742
+ const canSelectEnvironment = options.canSelectEnvironment ?? CAN_SELECT_ENVIRONMENT;
1743
+ const argv2 = options.argv ?? process.argv.slice(2);
1744
+ if (!canSelectEnvironment && (flags.env || argv2.includes("--env"))) {
1737
1745
  throw new Error(
1738
1746
  "The published Dreamboard CLI is production-only and does not accept `--env`."
1739
1747
  );
@@ -1763,12 +1771,18 @@ function createRetryingReadFetch(fetchImpl) {
1763
1771
  return (async (input, init2) => {
1764
1772
  const method = resolveFetchMethod(input, init2);
1765
1773
  if (method !== "GET" && method !== "HEAD") {
1766
- return fetchImpl(input, init2);
1774
+ return fetchWithOptionalTrace(fetchImpl, input, init2, {
1775
+ attempt: 0,
1776
+ willRetry: false
1777
+ });
1767
1778
  }
1768
1779
  let lastError;
1769
1780
  for (let attempt = 0; attempt <= TRANSIENT_READ_RETRY_DELAYS_MS.length; attempt += 1) {
1770
1781
  try {
1771
- return await fetchImpl(input, init2);
1782
+ return await fetchWithOptionalTrace(fetchImpl, input, init2, {
1783
+ attempt,
1784
+ willRetry: attempt < TRANSIENT_READ_RETRY_DELAYS_MS.length
1785
+ });
1772
1786
  } catch (error) {
1773
1787
  lastError = error;
1774
1788
  if (attempt >= TRANSIENT_READ_RETRY_DELAYS_MS.length || !isTransientFetchError(error)) {
@@ -1780,6 +1794,88 @@ function createRetryingReadFetch(fetchImpl) {
1780
1794
  throw lastError;
1781
1795
  });
1782
1796
  }
1797
+ async function fetchWithOptionalTrace(fetchImpl, input, init2, options) {
1798
+ if (!isHttpTraceEnabled()) {
1799
+ return fetchImpl(input, init2);
1800
+ }
1801
+ const request = describeRequest(input, init2);
1802
+ const startedAt = Date.now();
1803
+ try {
1804
+ const response = await fetchImpl(input, init2);
1805
+ writeHttpTrace({
1806
+ ...request,
1807
+ attempt: options.attempt,
1808
+ status: response.status,
1809
+ durationMs: Date.now() - startedAt
1810
+ });
1811
+ return response;
1812
+ } catch (error) {
1813
+ writeHttpTrace({
1814
+ ...request,
1815
+ attempt: options.attempt,
1816
+ durationMs: Date.now() - startedAt,
1817
+ error: error instanceof Error ? error.name : "UnknownError",
1818
+ willRetry: options.willRetry
1819
+ });
1820
+ throw error;
1821
+ }
1822
+ }
1823
+ function isHttpTraceEnabled() {
1824
+ return process.env.DREAMBOARD_CLI_HTTP_TRACE === "1";
1825
+ }
1826
+ function describeRequest(input, init2) {
1827
+ return {
1828
+ method: resolveFetchMethod(input, init2),
1829
+ url: redactUrl(input),
1830
+ hasAuthorization: hasAuthorizationHeader(input, init2)
1831
+ };
1832
+ }
1833
+ function redactUrl(input) {
1834
+ const rawUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
1835
+ try {
1836
+ const url = new URL(rawUrl);
1837
+ return `${url.origin}${url.pathname}`;
1838
+ } catch {
1839
+ return "<unparseable-url>";
1840
+ }
1841
+ }
1842
+ function hasAuthorizationHeader(input, init2) {
1843
+ return headersContainAuthorization(init2?.headers) || typeof Request !== "undefined" && input instanceof Request && input.headers.has("Authorization");
1844
+ }
1845
+ function headersContainAuthorization(headers) {
1846
+ if (!headers) {
1847
+ return false;
1848
+ }
1849
+ if (headers instanceof Headers) {
1850
+ return headers.has("Authorization");
1851
+ }
1852
+ if (Array.isArray(headers)) {
1853
+ return headers.some(([name]) => name.toLowerCase() === "authorization");
1854
+ }
1855
+ return Object.keys(headers).some(
1856
+ (name) => name.toLowerCase() === "authorization"
1857
+ );
1858
+ }
1859
+ function writeHttpTrace(event) {
1860
+ const parts = [
1861
+ "[dreamboard-cli:http]",
1862
+ `method=${event.method}`,
1863
+ `url=${event.url}`,
1864
+ `auth=${event.hasAuthorization ? "present" : "missing"}`,
1865
+ `attempt=${event.attempt + 1}`,
1866
+ `durationMs=${event.durationMs}`
1867
+ ];
1868
+ if (typeof event.status === "number") {
1869
+ parts.push(`status=${event.status}`);
1870
+ }
1871
+ if (event.error) {
1872
+ parts.push(`error=${event.error}`);
1873
+ }
1874
+ if (event.willRetry) {
1875
+ parts.push("willRetry=true");
1876
+ }
1877
+ console.error(parts.join(" "));
1878
+ }
1783
1879
  function resolveFetchMethod(input, init2) {
1784
1880
  const method = init2?.method ?? (typeof Request !== "undefined" && input instanceof Request ? input.method : void 0);
1785
1881
  return (method ?? "GET").toUpperCase();
@@ -2012,7 +2108,7 @@ Usage:
2012
2108
  }
2013
2109
  async function materializePreparedWorkspace(args) {
2014
2110
  const inputPath = readRequiredOption(args, "--input");
2015
- const { materializeWorkspaceProject } = await import("./materialize-workspace-MAGKDMK5.mjs");
2111
+ const { materializeWorkspaceProject } = await import("./materialize-workspace-3ECF4EYD.mjs");
2016
2112
  const input = JSON.parse(await readFile(inputPath, "utf8"));
2017
2113
  await materializeWorkspaceProject({
2018
2114
  ...input,
@@ -2080,7 +2176,7 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
2080
2176
  { assertReducerContractPreflight },
2081
2177
  { getProjectLocalMaintainerRegistry }
2082
2178
  ] = await Promise.all([
2083
- import("./static-scaffold-CLRRWXON.mjs"),
2179
+ import("./static-scaffold-XZ4FS4RR.mjs"),
2084
2180
  import("./local-files-OF4QFISU.mjs"),
2085
2181
  import("./workspace-codegen-SPPVHURX.mjs"),
2086
2182
  import("./workspace-dependencies-5HEEKZFP.mjs"),