@bitmagic/cli 0.1.46-dev.3 → 0.1.46-dev.5

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 (81) hide show
  1. package/README.md +58 -10
  2. package/dist/auth/session.js +1 -1
  3. package/dist/auth/session.js.map +1 -1
  4. package/dist/auth/subscribe-flow.d.ts +10 -2
  5. package/dist/auth/subscribe-flow.js.map +1 -1
  6. package/dist/bin.js +6 -2
  7. package/dist/bin.js.map +1 -1
  8. package/dist/cli.d.ts +26 -3
  9. package/dist/cli.js +76 -7
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/dev.js +9 -0
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/forge.js +1 -1
  14. package/dist/commands/forge.js.map +1 -1
  15. package/dist/commands/generate.js +9 -1
  16. package/dist/commands/generate.js.map +1 -1
  17. package/dist/commands/login.js +12 -9
  18. package/dist/commands/login.js.map +1 -1
  19. package/dist/commands/reset-account.d.ts +22 -9
  20. package/dist/commands/reset-account.js +58 -42
  21. package/dist/commands/reset-account.js.map +1 -1
  22. package/dist/commands/subscribe.d.ts +12 -0
  23. package/dist/commands/subscribe.js +12 -11
  24. package/dist/commands/subscribe.js.map +1 -1
  25. package/dist/commands/upgrade.d.ts +2 -1
  26. package/dist/commands/upgrade.js +12 -5
  27. package/dist/commands/upgrade.js.map +1 -1
  28. package/dist/commands/whoami.d.ts +8 -0
  29. package/dist/commands/whoami.js +29 -9
  30. package/dist/commands/whoami.js.map +1 -1
  31. package/dist/config/environments.d.ts +14 -0
  32. package/dist/config/environments.js +22 -0
  33. package/dist/config/environments.js.map +1 -1
  34. package/dist/errors.d.ts +10 -1
  35. package/dist/errors.js +11 -1
  36. package/dist/errors.js.map +1 -1
  37. package/dist/forge/run-pipeline.js +1 -1
  38. package/dist/forge/run-pipeline.js.map +1 -1
  39. package/dist/forge/stream.js +10 -5
  40. package/dist/forge/stream.js.map +1 -1
  41. package/dist/forge/upload-proxy.js +2 -0
  42. package/dist/forge/upload-proxy.js.map +1 -1
  43. package/dist/generate/stream.js +10 -5
  44. package/dist/generate/stream.js.map +1 -1
  45. package/dist/http/client.d.ts +6 -2
  46. package/dist/http/client.js +22 -12
  47. package/dist/http/client.js.map +1 -1
  48. package/dist/http/spark-refusal.d.ts +11 -0
  49. package/dist/http/spark-refusal.js +13 -0
  50. package/dist/http/spark-refusal.js.map +1 -1
  51. package/dist/publish/client.js +3 -1
  52. package/dist/publish/client.js.map +1 -1
  53. package/dist/scaffold/agents-md.d.ts +2 -1
  54. package/dist/scaffold/agents-md.js +7 -2
  55. package/dist/scaffold/agents-md.js.map +1 -1
  56. package/dist/scaffold/engine-download.js +5 -18
  57. package/dist/scaffold/engine-download.js.map +1 -1
  58. package/dist/scaffold/project-files.d.ts +3 -2
  59. package/dist/scaffold/project-files.js +46 -2
  60. package/dist/scaffold/project-files.js.map +1 -1
  61. package/dist/scaffold/project.d.ts +30 -0
  62. package/dist/scaffold/project.js +55 -29
  63. package/dist/scaffold/project.js.map +1 -1
  64. package/dist/scaffold/upgrade-project.js +19 -33
  65. package/dist/scaffold/upgrade-project.js.map +1 -1
  66. package/dist/telemetry/command-context.d.ts +73 -0
  67. package/dist/telemetry/command-context.js +114 -0
  68. package/dist/telemetry/command-context.js.map +1 -0
  69. package/dist/telemetry/report.d.ts +43 -0
  70. package/dist/telemetry/report.js +123 -0
  71. package/dist/telemetry/report.js.map +1 -0
  72. package/dist/telemetry/request-headers.d.ts +14 -0
  73. package/dist/telemetry/request-headers.js +48 -0
  74. package/dist/telemetry/request-headers.js.map +1 -0
  75. package/dist/update/check.d.ts +14 -0
  76. package/dist/update/check.js +20 -4
  77. package/dist/update/check.js.map +1 -1
  78. package/dist/update/notice.d.ts +59 -1
  79. package/dist/update/notice.js +75 -2
  80. package/dist/update/notice.js.map +1 -1
  81. package/package.json +4 -4
@@ -1,3 +1,4 @@
1
+ import type { EnvironmentName } from '../config/environments.js';
1
2
  /** Which published line a build came from: a prerelease was installed from `@bitmagic/cli@dev`. */
2
3
  export type UpdateTag = 'latest' | 'dev';
3
4
  /**
@@ -11,6 +12,32 @@ export type UpdateTag = 'latest' | 'dev';
11
12
  export declare function updateTagFor(version: string): UpdateTag;
12
13
  /** How to install the line a build is already on, so a nudge never moves someone between lines. */
13
14
  export declare function installCommandFor(tag: UpdateTag): string;
15
+ /**
16
+ * What to call a line in a sentence.
17
+ *
18
+ * The dev line says "prerelease" out loud because the only place this is used asks someone to
19
+ * install it, and portal/src/cli-install.ts is right that putting an untested build on the machine
20
+ * of someone who never opted into testing is the worse failure. Being asked to cross lines is
21
+ * legitimate — the project's environment is what wants it — but nobody should cross without knowing
22
+ * which side they are landing on.
23
+ */
24
+ export declare function describeUpdateTag(tag: UpdateTag): string;
25
+ /**
26
+ * Which line a PROJECT's CLI should come from — the one answer to "dev or prod?" for anyone
27
+ * standing in a project directory, and the reason nobody should ever be asked.
28
+ *
29
+ * The project decides because the project is where the mismatch bites: new `/api/cli/v1` endpoints
30
+ * reach the dev api-server before production, so a prerelease run against `prod` calls endpoints
31
+ * that are not there yet, and a release run against `dev` is behind the engine that environment
32
+ * serves. `local` sits with `dev` — a localhost api-server is built from the same `main` a
33
+ * prerelease is cut from, so it is ahead of the release by construction.
34
+ *
35
+ * Note this is NOT `updateTagFor` applied to something else: that reads a version string and
36
+ * answers "which line is this build ON", which is a fact about the install. This answers "which
37
+ * line SHOULD it be on here", which is a fact about the project. The two disagreeing is exactly
38
+ * what `cliLineMismatchNotice` reports.
39
+ */
40
+ export declare function updateTagForEnvironment(environment: EnvironmentName): UpdateTag;
14
41
  /**
15
42
  * How stale a cached npm answer may be before it is refreshed.
16
43
  *
@@ -18,7 +45,18 @@ export declare function installCommandFor(tag: UpdateTag): string;
18
45
  * refreshed in the background for next time. So this is only "how far behind the notice can be",
19
46
  * not "how long a command waits".
20
47
  */
21
- export declare const UPDATE_CHECK_INTERVAL_MS: number;
48
+ export declare const RELEASE_UPDATE_CHECK_INTERVAL_MS: number;
49
+ /**
50
+ * The same allowance for the dev line, which is shorter because the line moves faster.
51
+ *
52
+ * The dev line is cut from every merge to `main` and can move several times an hour, so an answer
53
+ * that old is often about a build two or three versions back — precisely the version someone
54
+ * testing dev needs to be told about soonest. Fifteen minutes keeps the nudge close to the line
55
+ * while still collapsing a burst of commands into a single background registry read.
56
+ */
57
+ export declare const DEV_UPDATE_CHECK_INTERVAL_MS: number;
58
+ /** How long an answer about `tag` stays good. */
59
+ export declare function updateCheckIntervalFor(tag: UpdateTag): number;
22
60
  /** What is remembered between runs, so no command pays for the network. */
23
61
  export interface UpdateCheckCache {
24
62
  /** The newest version npm reported for `tag`, or null if the last check could not reach it. */
@@ -34,6 +72,13 @@ export interface UpdateCheckCache {
34
72
  /** Epoch ms of that check. */
35
73
  checkedAt: number;
36
74
  }
75
+ /**
76
+ * The interval comes from the cache's OWN tag, not from the running build's.
77
+ *
78
+ * They agree wherever this decides anything: `refreshUpdateCacheInBackground` refreshes a
79
+ * cross-line cache unconditionally, so by the time staleness is asked about, the cache is about the
80
+ * line the build is on.
81
+ */
37
82
  export declare function isCacheStale(cache: UpdateCheckCache | null, now: number): boolean;
38
83
  /**
39
84
  * The line to print, or null to stay quiet.
@@ -46,3 +91,16 @@ export declare function isCacheStale(cache: UpdateCheckCache | null, now: number
46
91
  * 0.1.46-dev.3 to "update" to the older 0.1.45 release.
47
92
  */
48
93
  export declare function cliUpdateNotice(currentVersion: string, latestVersion: string | null | undefined): string | null;
94
+ /**
95
+ * The line to say when the CLI running inside a project came from the other one.
96
+ *
97
+ * This is the one place the two lines are deliberately crossed, and it needs no version comparison
98
+ * to do it: whatever the numbers say, a project pinned to `dev` wants the dev line and a project
99
+ * pinned to `prod` wants the release. Version-driven nudges structurally cannot report this — a
100
+ * prerelease sitting in a `prod` project is *ahead* of the release tag, so `cliUpdateNotice` is
101
+ * correctly silent about a CLI that is on the wrong line entirely.
102
+ *
103
+ * `projectEnvironment` must be a project's committed pin, never a resolved environment: a one-off
104
+ * `--env` is a statement about this command, not about which CLI belongs in this directory.
105
+ */
106
+ export declare function cliLineMismatchNotice(currentVersion: string, projectEnvironment: EnvironmentName): string | null;
@@ -14,6 +14,36 @@ export function updateTagFor(version) {
14
14
  export function installCommandFor(tag) {
15
15
  return tag === 'dev' ? 'npm i -g @bitmagic/cli@dev' : 'npm i -g @bitmagic/cli';
16
16
  }
17
+ /**
18
+ * What to call a line in a sentence.
19
+ *
20
+ * The dev line says "prerelease" out loud because the only place this is used asks someone to
21
+ * install it, and portal/src/cli-install.ts is right that putting an untested build on the machine
22
+ * of someone who never opted into testing is the worse failure. Being asked to cross lines is
23
+ * legitimate — the project's environment is what wants it — but nobody should cross without knowing
24
+ * which side they are landing on.
25
+ */
26
+ export function describeUpdateTag(tag) {
27
+ return tag === 'dev' ? 'dev (prerelease)' : 'release';
28
+ }
29
+ /**
30
+ * Which line a PROJECT's CLI should come from — the one answer to "dev or prod?" for anyone
31
+ * standing in a project directory, and the reason nobody should ever be asked.
32
+ *
33
+ * The project decides because the project is where the mismatch bites: new `/api/cli/v1` endpoints
34
+ * reach the dev api-server before production, so a prerelease run against `prod` calls endpoints
35
+ * that are not there yet, and a release run against `dev` is behind the engine that environment
36
+ * serves. `local` sits with `dev` — a localhost api-server is built from the same `main` a
37
+ * prerelease is cut from, so it is ahead of the release by construction.
38
+ *
39
+ * Note this is NOT `updateTagFor` applied to something else: that reads a version string and
40
+ * answers "which line is this build ON", which is a fact about the install. This answers "which
41
+ * line SHOULD it be on here", which is a fact about the project. The two disagreeing is exactly
42
+ * what `cliLineMismatchNotice` reports.
43
+ */
44
+ export function updateTagForEnvironment(environment) {
45
+ return environment === 'prod' ? 'latest' : 'dev';
46
+ }
17
47
  /**
18
48
  * How stale a cached npm answer may be before it is refreshed.
19
49
  *
@@ -21,7 +51,27 @@ export function installCommandFor(tag) {
21
51
  * refreshed in the background for next time. So this is only "how far behind the notice can be",
22
52
  * not "how long a command waits".
23
53
  */
24
- export const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
54
+ export const RELEASE_UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000;
55
+ /**
56
+ * The same allowance for the dev line, which is shorter because the line moves faster.
57
+ *
58
+ * The dev line is cut from every merge to `main` and can move several times an hour, so an answer
59
+ * that old is often about a build two or three versions back — precisely the version someone
60
+ * testing dev needs to be told about soonest. Fifteen minutes keeps the nudge close to the line
61
+ * while still collapsing a burst of commands into a single background registry read.
62
+ */
63
+ export const DEV_UPDATE_CHECK_INTERVAL_MS = 15 * 60 * 1000;
64
+ /** How long an answer about `tag` stays good. */
65
+ export function updateCheckIntervalFor(tag) {
66
+ return tag === 'dev' ? DEV_UPDATE_CHECK_INTERVAL_MS : RELEASE_UPDATE_CHECK_INTERVAL_MS;
67
+ }
68
+ /**
69
+ * The interval comes from the cache's OWN tag, not from the running build's.
70
+ *
71
+ * They agree wherever this decides anything: `refreshUpdateCacheInBackground` refreshes a
72
+ * cross-line cache unconditionally, so by the time staleness is asked about, the cache is about the
73
+ * line the build is on.
74
+ */
25
75
  export function isCacheStale(cache, now) {
26
76
  if (cache === null)
27
77
  return true;
@@ -29,7 +79,7 @@ export function isCacheStale(cache, now) {
29
79
  // as fresh forever.
30
80
  if (cache.checkedAt > now)
31
81
  return true;
32
- return now - cache.checkedAt >= UPDATE_CHECK_INTERVAL_MS;
82
+ return now - cache.checkedAt >= updateCheckIntervalFor(cache.tag);
33
83
  }
34
84
  /**
35
85
  * The line to print, or null to stay quiet.
@@ -52,4 +102,27 @@ export function cliUpdateNotice(currentVersion, latestVersion) {
52
102
  const install = installCommandFor(updateTagFor(currentVersion));
53
103
  return `A newer bitmagic CLI is available: ${latestVersion} (you have ${currentVersion}). Run \`${install}\` to update.`;
54
104
  }
105
+ /**
106
+ * The line to say when the CLI running inside a project came from the other one.
107
+ *
108
+ * This is the one place the two lines are deliberately crossed, and it needs no version comparison
109
+ * to do it: whatever the numbers say, a project pinned to `dev` wants the dev line and a project
110
+ * pinned to `prod` wants the release. Version-driven nudges structurally cannot report this — a
111
+ * prerelease sitting in a `prod` project is *ahead* of the release tag, so `cliUpdateNotice` is
112
+ * correctly silent about a CLI that is on the wrong line entirely.
113
+ *
114
+ * `projectEnvironment` must be a project's committed pin, never a resolved environment: a one-off
115
+ * `--env` is a statement about this command, not about which CLI belongs in this directory.
116
+ */
117
+ export function cliLineMismatchNotice(currentVersion, projectEnvironment) {
118
+ if (typeof currentVersion !== 'string' || currentVersion === '')
119
+ return null;
120
+ const wanted = updateTagForEnvironment(projectEnvironment);
121
+ const installed = updateTagFor(currentVersion);
122
+ if (installed === wanted)
123
+ return null;
124
+ return (`This project is on the ${projectEnvironment} environment, so its CLI comes from the ` +
125
+ `${describeUpdateTag(wanted)} line — but you are running a ${describeUpdateTag(installed)} ` +
126
+ `build (${currentVersion}). Run \`${installCommandFor(wanted)}\`.`);
127
+ }
55
128
  //# sourceMappingURL=notice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notice.js","sourceRoot":"","sources":["../../src/update/notice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAKrE;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,iBAAiB,CAAC,GAAc;IAC9C,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,wBAAwB,CAAC;AACjF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAkB5D,MAAM,UAAU,YAAY,CAAC,KAA8B,EAAE,GAAW;IACtE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,+FAA+F;IAC/F,oBAAoB;IACpB,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,wBAAwB,CAAC;AAC3D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,cAAsB,EAAE,aAAwC;IAC9F,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7E,IAAI,oBAAoB,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9E,8FAA8F;IAC9F,MAAM,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAChE,OAAO,sCAAsC,aAAa,cAAc,cAAc,YAAY,OAAO,eAAe,CAAC;AAC3H,CAAC"}
1
+ {"version":3,"file":"notice.js","sourceRoot":"","sources":["../../src/update/notice.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/cli",
3
- "version": "0.1.46-dev.3",
3
+ "version": "0.1.46-dev.5",
4
4
  "description": "Build Bitmagic games from your own agent tool",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Bitmagic Oy",
@@ -23,9 +23,9 @@
23
23
  "fflate": "^0.8.2",
24
24
  "playwright-core": "^1.59.1",
25
25
  "tar": "^7.4.3",
26
- "@bitmagic/asset-core": "0.2.1-dev.1",
27
- "@bitmagic/world-forger": "0.1.6-dev.1",
28
- "@bitmagic/animation-forger": "0.1.1-dev.1"
26
+ "@bitmagic/asset-core": "0.2.1-dev.3",
27
+ "@bitmagic/world-forger": "0.1.6-dev.3",
28
+ "@bitmagic/animation-forger": "0.1.1-dev.3"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@eslint/js": "^9.38.0",