@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.
- package/README.md +58 -10
- package/dist/auth/session.js +1 -1
- package/dist/auth/session.js.map +1 -1
- package/dist/auth/subscribe-flow.d.ts +10 -2
- package/dist/auth/subscribe-flow.js.map +1 -1
- package/dist/bin.js +6 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +26 -3
- package/dist/cli.js +76 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.js +9 -0
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/forge.js +1 -1
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.js +9 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/login.js +12 -9
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/reset-account.d.ts +22 -9
- package/dist/commands/reset-account.js +58 -42
- package/dist/commands/reset-account.js.map +1 -1
- package/dist/commands/subscribe.d.ts +12 -0
- package/dist/commands/subscribe.js +12 -11
- package/dist/commands/subscribe.js.map +1 -1
- package/dist/commands/upgrade.d.ts +2 -1
- package/dist/commands/upgrade.js +12 -5
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.js +29 -9
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/environments.d.ts +14 -0
- package/dist/config/environments.js +22 -0
- package/dist/config/environments.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.js +11 -1
- package/dist/errors.js.map +1 -1
- package/dist/forge/run-pipeline.js +1 -1
- package/dist/forge/run-pipeline.js.map +1 -1
- package/dist/forge/stream.js +10 -5
- package/dist/forge/stream.js.map +1 -1
- package/dist/forge/upload-proxy.js +2 -0
- package/dist/forge/upload-proxy.js.map +1 -1
- package/dist/generate/stream.js +10 -5
- package/dist/generate/stream.js.map +1 -1
- package/dist/http/client.d.ts +6 -2
- package/dist/http/client.js +22 -12
- package/dist/http/client.js.map +1 -1
- package/dist/http/spark-refusal.d.ts +11 -0
- package/dist/http/spark-refusal.js +13 -0
- package/dist/http/spark-refusal.js.map +1 -1
- package/dist/publish/client.js +3 -1
- package/dist/publish/client.js.map +1 -1
- package/dist/scaffold/agents-md.d.ts +2 -1
- package/dist/scaffold/agents-md.js +7 -2
- package/dist/scaffold/agents-md.js.map +1 -1
- package/dist/scaffold/engine-download.js +5 -18
- package/dist/scaffold/engine-download.js.map +1 -1
- package/dist/scaffold/project-files.d.ts +3 -2
- package/dist/scaffold/project-files.js +46 -2
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.d.ts +30 -0
- package/dist/scaffold/project.js +55 -29
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/upgrade-project.js +19 -33
- package/dist/scaffold/upgrade-project.js.map +1 -1
- package/dist/telemetry/command-context.d.ts +73 -0
- package/dist/telemetry/command-context.js +114 -0
- package/dist/telemetry/command-context.js.map +1 -0
- package/dist/telemetry/report.d.ts +43 -0
- package/dist/telemetry/report.js +123 -0
- package/dist/telemetry/report.js.map +1 -0
- package/dist/telemetry/request-headers.d.ts +14 -0
- package/dist/telemetry/request-headers.js +48 -0
- package/dist/telemetry/request-headers.js.map +1 -0
- package/dist/update/check.d.ts +14 -0
- package/dist/update/check.js +20 -4
- package/dist/update/check.js.map +1 -1
- package/dist/update/notice.d.ts +59 -1
- package/dist/update/notice.js +75 -2
- package/dist/update/notice.js.map +1 -1
- package/package.json +4 -4
package/dist/update/notice.d.ts
CHANGED
|
@@ -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
|
|
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;
|
package/dist/update/notice.js
CHANGED
|
@@ -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
|
|
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 >=
|
|
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":"
|
|
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
|
+
"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.
|
|
27
|
-
"@bitmagic/world-forger": "0.1.6-dev.
|
|
28
|
-
"@bitmagic/animation-forger": "0.1.1-dev.
|
|
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",
|