@framedash/cli 0.1.2 → 0.1.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 +41 -7
- package/dist/commands/alerts.d.ts.map +1 -1
- package/dist/commands/alerts.js +2 -1
- package/dist/commands/alerts.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +25 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +142 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +79 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/map-capture.d.ts +2 -1
- package/dist/commands/map-capture.d.ts.map +1 -1
- package/dist/commands/map-capture.js +38 -9
- package/dist/commands/map-capture.js.map +1 -1
- package/dist/commands/query.d.ts.map +1 -1
- package/dist/commands/query.js +12 -0
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/run-profile-test.d.ts.map +1 -1
- package/dist/commands/run-profile-test.js +143 -26
- package/dist/commands/run-profile-test.js.map +1 -1
- package/dist/commands/threshold-profiles.d.ts +2 -0
- package/dist/commands/threshold-profiles.d.ts.map +1 -0
- package/dist/commands/threshold-profiles.js +24 -0
- package/dist/commands/threshold-profiles.js.map +1 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +42 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +44 -14
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/create-client.d.ts +25 -7
- package/dist/lib/create-client.d.ts.map +1 -1
- package/dist/lib/create-client.js +160 -33
- package/dist/lib/create-client.js.map +1 -1
- package/dist/lib/formatters.js +93 -1
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/oauth/loopback-server.d.ts +27 -0
- package/dist/lib/oauth/loopback-server.d.ts.map +1 -0
- package/dist/lib/oauth/loopback-server.js +164 -0
- package/dist/lib/oauth/loopback-server.js.map +1 -0
- package/dist/lib/oauth/manager.d.ts +36 -0
- package/dist/lib/oauth/manager.d.ts.map +1 -0
- package/dist/lib/oauth/manager.js +130 -0
- package/dist/lib/oauth/manager.js.map +1 -0
- package/dist/lib/oauth/pkce.d.ts +15 -0
- package/dist/lib/oauth/pkce.d.ts.map +1 -0
- package/dist/lib/oauth/pkce.js +24 -0
- package/dist/lib/oauth/pkce.js.map +1 -0
- package/dist/lib/oauth/token-endpoint.d.ts +39 -0
- package/dist/lib/oauth/token-endpoint.d.ts.map +1 -0
- package/dist/lib/oauth/token-endpoint.js +117 -0
- package/dist/lib/oauth/token-endpoint.js.map +1 -0
- package/dist/lib/oauth/token-store.d.ts +34 -0
- package/dist/lib/oauth/token-store.d.ts.map +1 -0
- package/dist/lib/oauth/token-store.js +164 -0
- package/dist/lib/oauth/token-store.js.map +1 -0
- package/dist/lib/run-command.js +2 -2
- package/dist/lib/run-command.js.map +1 -1
- package/dist/lib/run-profile-test-lib.d.ts +39 -0
- package/dist/lib/run-profile-test-lib.d.ts.map +1 -1
- package/dist/lib/run-profile-test-lib.js +47 -0
- package/dist/lib/run-profile-test-lib.js.map +1 -1
- package/dist/lib/uploader.d.ts +14 -1
- package/dist/lib/uploader.d.ts.map +1 -1
- package/dist/lib/uploader.js +26 -12
- package/dist/lib/uploader.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { execFileSync, spawnSync } from "node:child_process";
|
|
1
|
+
import { execFileSync, spawn, spawnSync } from "node:child_process";
|
|
2
2
|
import { constants as osConstants } from "node:os";
|
|
3
3
|
import { buildBuildComparePath, buildBuildsPath } from "@framedash/api-client";
|
|
4
4
|
import { createClient } from "../lib/create-client.js";
|
|
@@ -6,9 +6,15 @@ import { formatOutput } from "../lib/formatters.js";
|
|
|
6
6
|
import { error, log, success, warn } from "../lib/logger.js";
|
|
7
7
|
import { evaluateRegression, formatMetricDiff, isRegressionMetric, } from "../lib/perf-diff-eval.js";
|
|
8
8
|
import { runCommand } from "../lib/run-command.js";
|
|
9
|
-
import { buildEventCount, buildSessionEnv, resolveProfileIdentity, SESSION_ENV_KEYS, waitForIngest, } from "../lib/run-profile-test-lib.js";
|
|
9
|
+
import { buildEventCount, buildSessionEnv, planTreeKill, resolveProfileIdentity, SESSION_ENV_KEYS, validateSeconds, waitForIngest, } from "../lib/run-profile-test-lib.js";
|
|
10
10
|
const DEFAULT_INGEST_TIMEOUT_S = 180;
|
|
11
11
|
const DEFAULT_POLL_INTERVAL_S = 5;
|
|
12
|
+
// Generous finite default so a game that never self-quits cannot hang a CI job
|
|
13
|
+
// forever (the F53 failure mode); 0 disables the bound for interactive/local use.
|
|
14
|
+
const DEFAULT_COMMAND_TIMEOUT_S = 1800;
|
|
15
|
+
// Cap so command-timeout * 1000 stays within setTimeout's signed 32-bit delay
|
|
16
|
+
// (2^31-1 ms); a larger value would be clamped to 1ms and fire almost at once.
|
|
17
|
+
const MAX_COMMAND_TIMEOUT_S = Math.floor(2 ** 31 / 1000);
|
|
12
18
|
/** Best-effort `git` lookup; returns undefined when git is absent or fails. */
|
|
13
19
|
function gitOutput(args) {
|
|
14
20
|
try {
|
|
@@ -22,18 +28,14 @@ function gitOutput(args) {
|
|
|
22
28
|
return undefined;
|
|
23
29
|
}
|
|
24
30
|
}
|
|
25
|
-
/** Parse a
|
|
26
|
-
function parseSeconds(value, flag, fallback) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return fallback;
|
|
31
|
-
const n = Number(value);
|
|
32
|
-
if (!Number.isFinite(n) || n <= 0) {
|
|
33
|
-
error(`--${flag} must be a positive number of seconds`);
|
|
31
|
+
/** Parse a seconds-valued flag with a descriptive error, or fall back. */
|
|
32
|
+
function parseSeconds(value, flag, fallback, opts = {}) {
|
|
33
|
+
const result = validateSeconds(value, fallback, opts);
|
|
34
|
+
if ("error" in result) {
|
|
35
|
+
error(`--${flag} ${result.error}`);
|
|
34
36
|
process.exit(1);
|
|
35
37
|
}
|
|
36
|
-
return
|
|
38
|
+
return result.value;
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
39
41
|
* Forward the project id and base URL so a CI game build that reads them from the
|
|
@@ -83,21 +85,115 @@ function resolveGateOptions(values, candidateBuildId) {
|
|
|
83
85
|
}
|
|
84
86
|
return { metric, thresholdPct, baseline };
|
|
85
87
|
}
|
|
86
|
-
/**
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Terminate the launched process TREE by pid. A plain child kill leaves
|
|
90
|
+
* grandchildren behind (a game launched via the shell spawns helper processes),
|
|
91
|
+
* so use the platform-specific whole-tree strategy from planTreeKill: taskkill
|
|
92
|
+
* /T /F on win32, or a SIGKILL to the process group on POSIX (falling back to the
|
|
93
|
+
* direct pid if the group is already gone). planTreeKill returns a noop plan for a
|
|
94
|
+
* missing/non-positive pid (which would otherwise signal our own group or every
|
|
95
|
+
* process on POSIX). Best-effort: never throws.
|
|
96
|
+
*/
|
|
97
|
+
function killProcessTree(pid) {
|
|
98
|
+
const plan = planTreeKill(process.platform, pid);
|
|
99
|
+
if (plan.platform === "noop")
|
|
100
|
+
return;
|
|
101
|
+
if (plan.platform === "win32") {
|
|
102
|
+
spawnSync(plan.command, plan.args, { stdio: "ignore" });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
process.kill(plan.groupPid, "SIGKILL");
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
try {
|
|
110
|
+
// -groupPid is the validated positive child pid; fall back to it directly.
|
|
111
|
+
process.kill(-plan.groupPid, "SIGKILL");
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// The process (group) is already gone; nothing left to kill.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Spawn the profiling command (inheriting stdio) and resolve when it exits.
|
|
120
|
+
* Bounds the run with an overall timeout: on win32 the child is the shell, whose
|
|
121
|
+
* whole tree taskkill terminates; on POSIX the child is spawned detached so we
|
|
122
|
+
* can signal its process group. timeoutMs <= 0 disables the bound. Rejects only
|
|
123
|
+
* on a spawn error (ENOENT etc.).
|
|
124
|
+
*/
|
|
125
|
+
function runProfilingCommand(command, env, timeoutMs) {
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
const child = spawn(command, {
|
|
128
|
+
shell: true,
|
|
129
|
+
stdio: "inherit",
|
|
130
|
+
env,
|
|
131
|
+
// POSIX: run in a new process group so killProcessTree can signal the whole
|
|
132
|
+
// group. win32 has no process groups here; taskkill /T handles the tree.
|
|
133
|
+
detached: process.platform !== "win32",
|
|
134
|
+
});
|
|
135
|
+
let timedOut = false;
|
|
136
|
+
let timer;
|
|
137
|
+
// A detached POSIX child does NOT share the terminal's signals, so a Ctrl-C or
|
|
138
|
+
// CI cancellation that terminates THIS CLI would orphan the game's process
|
|
139
|
+
// group. Kill the tree on those signals first, then exit with the conventional
|
|
140
|
+
// 128 + signal-number code so the exit status still reflects the signal.
|
|
141
|
+
const forwardedSignals = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
142
|
+
const cleanup = () => {
|
|
143
|
+
if (timer)
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
for (const s of forwardedSignals)
|
|
146
|
+
process.off(s, onSignal);
|
|
147
|
+
};
|
|
148
|
+
const onSignal = (signal) => {
|
|
149
|
+
cleanup();
|
|
150
|
+
killProcessTree(child.pid);
|
|
151
|
+
process.exit(128 + (osConstants.signals[signal] ?? 0));
|
|
152
|
+
};
|
|
153
|
+
for (const s of forwardedSignals)
|
|
154
|
+
process.on(s, onSignal);
|
|
155
|
+
if (timeoutMs > 0) {
|
|
156
|
+
timer = setTimeout(() => {
|
|
157
|
+
timedOut = true;
|
|
158
|
+
killProcessTree(child.pid);
|
|
159
|
+
}, timeoutMs);
|
|
160
|
+
}
|
|
161
|
+
child.on("error", (err) => {
|
|
162
|
+
cleanup();
|
|
163
|
+
reject(err);
|
|
164
|
+
});
|
|
165
|
+
child.on("exit", (code, signal) => {
|
|
166
|
+
cleanup();
|
|
167
|
+
resolve({ status: code, signal, timedOut });
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/** Launch the profiling command and exit on any failure (or timeout). */
|
|
172
|
+
async function launchProfilingRun(command, env, timeoutMs) {
|
|
173
|
+
let result;
|
|
174
|
+
try {
|
|
175
|
+
result = await runProfilingCommand(command, env, timeoutMs);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
error(`Failed to launch --command: ${err instanceof Error ? err.message : String(err)}`);
|
|
91
179
|
process.exit(1);
|
|
92
180
|
}
|
|
93
|
-
|
|
94
|
-
|
|
181
|
+
// A timeout is incomplete data: fail closed WITHOUT gating, same philosophy as a
|
|
182
|
+
// non-zero exit. Checked first because the kill also sets a signal on the child.
|
|
183
|
+
if (result.timedOut) {
|
|
184
|
+
error(`Profiling command exceeded the --command-timeout of ${timeoutMs / 1000}s and was killed; ` +
|
|
185
|
+
"not gating on incomplete data. If the game does not exit on its own, make your " +
|
|
186
|
+
"automation quit when the run finishes, or raise --command-timeout (0 disables the bound).");
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
if (result.signal) {
|
|
190
|
+
error(`Profiling command was terminated by signal ${result.signal}.`);
|
|
95
191
|
// Conventional 128 + signal number so CI sees a meaningful non-zero code.
|
|
96
|
-
process.exit(128 + (osConstants.signals[
|
|
192
|
+
process.exit(128 + (osConstants.signals[result.signal] ?? 0));
|
|
97
193
|
}
|
|
98
|
-
if (typeof
|
|
99
|
-
error(`Profiling command exited with code ${
|
|
100
|
-
process.exit(
|
|
194
|
+
if (typeof result.status === "number" && result.status !== 0) {
|
|
195
|
+
error(`Profiling command exited with code ${result.status}; not gating on incomplete data.`);
|
|
196
|
+
process.exit(result.status);
|
|
101
197
|
}
|
|
102
198
|
}
|
|
103
199
|
/**
|
|
@@ -150,7 +246,10 @@ async function awaitIngest(client, values, buildId, priorEventCount, timeoutMs,
|
|
|
150
246
|
if (!landed) {
|
|
151
247
|
error(`Build '${buildId}' did not ingest fresh events within ${timeoutMs / 1000}s. ` +
|
|
152
248
|
"The SDK may not have flushed, or ingest/aggregation is lagging. " +
|
|
153
|
-
"Increase --ingest-timeout, or check with 'framedash builds'."
|
|
249
|
+
"Increase --ingest-timeout, or check with 'framedash builds'. " +
|
|
250
|
+
`Also confirm the game picked up the awaited build id: --build-id reaches the game via the ` +
|
|
251
|
+
`exported FRAMEDASH_BUILD_ID env var and the SDK's BeginAutomatedSessionFromEnvironment() ` +
|
|
252
|
+
`auto-session pickup -- a game that hardcodes its buildId will never match '${buildId}'.`);
|
|
154
253
|
process.exit(1);
|
|
155
254
|
}
|
|
156
255
|
success(`Build '${buildId}' ingested.`);
|
|
@@ -224,6 +323,7 @@ export async function runProfileTest(args) {
|
|
|
224
323
|
branch: { type: "string" },
|
|
225
324
|
commit: { type: "string" },
|
|
226
325
|
scenario: { type: "string" },
|
|
326
|
+
"command-timeout": { type: "string" },
|
|
227
327
|
"ingest-timeout": { type: "string" },
|
|
228
328
|
"poll-interval": { type: "string" },
|
|
229
329
|
"skip-wait": { type: "boolean" },
|
|
@@ -261,6 +361,12 @@ export async function runProfileTest(args) {
|
|
|
261
361
|
// Validate everything up front so a misconfig fails before we spend minutes
|
|
262
362
|
// running the game only to reject the result.
|
|
263
363
|
const gate = resolveGateOptions(values, identity.buildId);
|
|
364
|
+
// Bounds only the launched game/profiling process, NOT the ingest wait
|
|
365
|
+
// (--ingest-timeout covers that separately). 0 disables the bound.
|
|
366
|
+
const commandTimeoutMs = parseSeconds(values["command-timeout"], "command-timeout", DEFAULT_COMMAND_TIMEOUT_S, {
|
|
367
|
+
allowZero: true,
|
|
368
|
+
max: MAX_COMMAND_TIMEOUT_S,
|
|
369
|
+
}) * 1000;
|
|
264
370
|
const ingestTimeoutMs = parseSeconds(values["ingest-timeout"], "ingest-timeout", DEFAULT_INGEST_TIMEOUT_S) * 1000;
|
|
265
371
|
const pollIntervalMs = parseSeconds(values["poll-interval"], "poll-interval", DEFAULT_POLL_INTERVAL_S) * 1000;
|
|
266
372
|
// The ingest snapshot/poll run in a retry loop, so they need a client that
|
|
@@ -270,7 +376,9 @@ export async function runProfileTest(args) {
|
|
|
270
376
|
const skipWait = Boolean(values["skip-wait"]);
|
|
271
377
|
const pollClient = skipWait
|
|
272
378
|
? client
|
|
273
|
-
: createClient(config.baseUrl, config.
|
|
379
|
+
: createClient(config.baseUrl, config.credential, config.projectId, {
|
|
380
|
+
throwOnError: true,
|
|
381
|
+
});
|
|
274
382
|
// Snapshot the candidate's event count BEFORE the run (only when we will
|
|
275
383
|
// wait), so the ingest wait can require fresh events rather than accepting
|
|
276
384
|
// a prior run's data for the same build_id.
|
|
@@ -305,7 +413,7 @@ export async function runProfileTest(args) {
|
|
|
305
413
|
"game's environment so it is not used as the game's ingest key. Set the game's " +
|
|
306
414
|
"events:write key separately, or pass the gate key via --api-key/--api-key-file.");
|
|
307
415
|
}
|
|
308
|
-
launchProfilingRun(command, childEnv);
|
|
416
|
+
await launchProfilingRun(command, childEnv, commandTimeoutMs);
|
|
309
417
|
// 2) Wait for the candidate build's perf events to land (unless skipped).
|
|
310
418
|
if (!skipWait) {
|
|
311
419
|
await awaitIngest(pollClient, values, identity.buildId, priorEventCount, ingestTimeoutMs, pollIntervalMs);
|
|
@@ -336,6 +444,10 @@ BeginAutomatedSessionFromEnvironment() picks them up automatically:
|
|
|
336
444
|
FRAMEDASH_GIT_BRANCH ci.branch attribute
|
|
337
445
|
FRAMEDASH_GIT_COMMIT ci.commit attribute
|
|
338
446
|
FRAMEDASH_TEST_SCENARIO ci.scenario attribute
|
|
447
|
+
The build id from --build-id (or the git default) reaches the game ONLY via the
|
|
448
|
+
exported FRAMEDASH_BUILD_ID env var, which BeginAutomatedSessionFromEnvironment()
|
|
449
|
+
reads. A game that hardcodes its buildId will never match the awaited build, so
|
|
450
|
+
the ingest wait will time out -- do not hardcode the SDK build id in a CI build.
|
|
339
451
|
FRAMEDASH_PROJECT_ID / FRAMEDASH_BASE_URL are forwarded so the build targets the
|
|
340
452
|
same project the gate queries. The gate uses an analytics:read key while your
|
|
341
453
|
game needs a separate events:write ingest key: pass the gate key with
|
|
@@ -345,6 +457,11 @@ FRAMEDASH_API_KEY, so the gate key does not get inherited as the game's key.
|
|
|
345
457
|
Required:
|
|
346
458
|
--command <cmd> Game/profiling command to launch (run via the shell)
|
|
347
459
|
|
|
460
|
+
Run bound (kills the launched process tree on timeout so a game that never
|
|
461
|
+
self-quits cannot hang a CI job forever; a timeout fails the run without gating):
|
|
462
|
+
--command-timeout <s> Max seconds the launched command may run (default: 1800,
|
|
463
|
+
0 disables the bound)
|
|
464
|
+
|
|
348
465
|
Build identity (each defaults as noted; exported to the child):
|
|
349
466
|
--build-id <id> Candidate build_id (default: --commit, else git HEAD)
|
|
350
467
|
--branch <name> default: git rev-parse --abbrev-ref HEAD
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-profile-test.js","sourceRoot":"","sources":["../../src/commands/run-profile-test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-profile-test.js","sourceRoot":"","sources":["../../src/commands/run-profile-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold-profiles.d.ts","sourceRoot":"","sources":["../../src/commands/threshold-profiles.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB,mCAE5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { formatOutput } from "../lib/formatters.js";
|
|
2
|
+
import { log } from "../lib/logger.js";
|
|
3
|
+
import { runCommand, withSubcommands } from "../lib/run-command.js";
|
|
4
|
+
const HELP = `Usage: framedash threshold-profiles <subcommand> [options]
|
|
5
|
+
|
|
6
|
+
List threshold profiles (performance budgets used by alert rules).
|
|
7
|
+
|
|
8
|
+
Subcommands:
|
|
9
|
+
list List threshold profiles
|
|
10
|
+
|
|
11
|
+
Run 'framedash threshold-profiles <subcommand> --help' for more info.`;
|
|
12
|
+
export const thresholdProfiles = withSubcommands("threshold-profiles", HELP, {
|
|
13
|
+
list: thresholdProfilesList,
|
|
14
|
+
});
|
|
15
|
+
async function thresholdProfilesList(args) {
|
|
16
|
+
await runCommand({
|
|
17
|
+
args,
|
|
18
|
+
help: "Usage: framedash threshold-profiles list [--format json|table|csv] [global options]",
|
|
19
|
+
}, async ({ client, config }) => {
|
|
20
|
+
const data = await client.get(client.projectPath("threshold-profiles"));
|
|
21
|
+
log(formatOutput(data, config.format));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=threshold-profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold-profiles.js","sourceRoot":"","sources":["../../src/commands/threshold-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,IAAI,GAAG;;;;;;;sEAOyD,CAAC;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,oBAAoB,EAAE,IAAI,EAAE;IAC5E,IAAI,EAAE,qBAAqB;CAC3B,CAAC,CAAC;AAEH,KAAK,UAAU,qBAAqB,CAAC,IAAc;IAClD,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,qFAAqF;KAC3F,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACxE,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CACD,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,10 @@ const VERSION = JSON.parse(readFileSync(new URL("../package.json", import.meta.u
|
|
|
6
6
|
const HELP = `Usage: framedash <command> [options]
|
|
7
7
|
|
|
8
8
|
Commands:
|
|
9
|
-
|
|
9
|
+
login Sign in via the browser (interactive OAuth; CI should use
|
|
10
|
+
the FRAMEDASH_API_KEY env var instead)
|
|
11
|
+
logout Revoke and remove a stored browser login
|
|
12
|
+
auth Verify credentials, show their source, and list projects
|
|
10
13
|
status Show project status and key metrics
|
|
11
14
|
dashboard Show dashboard metrics
|
|
12
15
|
retention Show player retention cohorts
|
|
@@ -17,6 +20,7 @@ Commands:
|
|
|
17
20
|
query Execute a read-only ClickHouse query
|
|
18
21
|
alerts Manage alert rules (list, create, update, delete)
|
|
19
22
|
maps Manage maps (list, delete)
|
|
23
|
+
threshold-profiles List threshold profiles (perf budgets for alerts)
|
|
20
24
|
content Manage content registry (list, import, delete)
|
|
21
25
|
map-capture Upload captured map images
|
|
22
26
|
|
|
@@ -25,6 +29,8 @@ Global Options:
|
|
|
25
29
|
a key passed as --api-key is visible in the process
|
|
26
30
|
list and shell history.
|
|
27
31
|
--api-key-file <path> Read the API key from a file ('-' for stdin)
|
|
32
|
+
Without any API key, commands fall back to the OAuth
|
|
33
|
+
tokens stored by 'framedash login' for the base URL.
|
|
28
34
|
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
29
35
|
--base-url <url> API base URL (default: https://app.framedash.dev)
|
|
30
36
|
--format <fmt> Output format: json, table, csv (default: json)
|
|
@@ -34,6 +40,8 @@ Global Options:
|
|
|
34
40
|
Run 'framedash <command> --help' for command-specific options.`;
|
|
35
41
|
/** Type-safe command registry — typos in export names become build-time errors. */
|
|
36
42
|
const COMMANDS = {
|
|
43
|
+
login: () => import("./commands/login.js").then((m) => m.login),
|
|
44
|
+
logout: () => import("./commands/logout.js").then((m) => m.logout),
|
|
37
45
|
auth: () => import("./commands/auth.js").then((m) => m.auth),
|
|
38
46
|
status: () => import("./commands/status.js").then((m) => m.status),
|
|
39
47
|
dashboard: () => import("./commands/dashboard.js").then((m) => m.dashboard),
|
|
@@ -45,6 +53,7 @@ const COMMANDS = {
|
|
|
45
53
|
query: () => import("./commands/query.js").then((m) => m.query),
|
|
46
54
|
alerts: () => import("./commands/alerts.js").then((m) => m.alerts),
|
|
47
55
|
maps: () => import("./commands/maps.js").then((m) => m.maps),
|
|
56
|
+
"threshold-profiles": () => import("./commands/threshold-profiles.js").then((m) => m.thresholdProfiles),
|
|
48
57
|
content: () => import("./commands/content.js").then((m) => m.content),
|
|
49
58
|
"map-capture": () => import("./commands/map-capture.js").then((m) => m.mapCaptureCommand),
|
|
50
59
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC3F,OAAiB,CAAC;AAEpB,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,16 +1,57 @@
|
|
|
1
|
+
import { type StoredTokenEntry } from "./oauth/token-store.js";
|
|
1
2
|
export type OutputFormat = "json" | "table" | "csv";
|
|
2
|
-
|
|
3
|
+
/** Where an API key came from (drives `framedash auth` source display). */
|
|
4
|
+
export type ApiKeySource = "flag" | "file" | "env";
|
|
5
|
+
/**
|
|
6
|
+
* The resolved credential for a run. Precedence: --api-key > --api-key-file >
|
|
7
|
+
* FRAMEDASH_API_KEY env > OAuth tokens stored by `framedash login` for the
|
|
8
|
+
* resolved base URL's origin. The OAuth variant carries the stored entry so
|
|
9
|
+
* the client starts from it without re-reading the store; the token values
|
|
10
|
+
* inside must never be logged.
|
|
11
|
+
*/
|
|
12
|
+
export type CliCredential = {
|
|
13
|
+
kind: "api-key";
|
|
3
14
|
apiKey: string;
|
|
15
|
+
source: ApiKeySource;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "oauth";
|
|
18
|
+
origin: string;
|
|
19
|
+
entry: StoredTokenEntry;
|
|
20
|
+
};
|
|
21
|
+
export type CliConfig = {
|
|
22
|
+
credential: CliCredential;
|
|
4
23
|
projectId: string;
|
|
5
24
|
baseUrl: string;
|
|
6
25
|
format: OutputFormat;
|
|
7
26
|
};
|
|
27
|
+
/** Resolve --base-url/--format (and env fallbacks) for commands that need no credential. */
|
|
28
|
+
export declare function resolveBaseAndFormat(values: Record<string, unknown>): {
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
format: OutputFormat;
|
|
31
|
+
};
|
|
8
32
|
/**
|
|
9
33
|
* Resolve the API key, preferring sources that keep it out of the process
|
|
10
34
|
* argument list: --api-key flag, then --api-key-file (a path, or "-" for stdin),
|
|
11
35
|
* then the FRAMEDASH_API_KEY env var. Returns undefined if none is set.
|
|
12
36
|
*/
|
|
13
37
|
export declare function resolveApiKey(values: Record<string, unknown>): string | undefined;
|
|
38
|
+
/** As resolveApiKey, but also reports WHICH source supplied the key. */
|
|
39
|
+
export declare function resolveApiKeyWithSource(values: Record<string, unknown>): {
|
|
40
|
+
apiKey: string;
|
|
41
|
+
source: ApiKeySource;
|
|
42
|
+
} | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the credential for the given base URL. API keys (flag > file > env)
|
|
45
|
+
* win over a stored OAuth login; the OAuth token store is consulted only for
|
|
46
|
+
* the resolved base URL's exact origin. Returns undefined when nothing is set.
|
|
47
|
+
*
|
|
48
|
+
* NOTE: throws a TypeError (from `new URL`) when `baseUrl` is not a valid
|
|
49
|
+
* URL and no API key short-circuits the lookup. Callers that accept raw user
|
|
50
|
+
* input for the base URL (map-capture) must validate or catch accordingly;
|
|
51
|
+
* resolveConfig* callers are safe because resolveBaseAndFormat has already
|
|
52
|
+
* vetted the URL.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveCredential(values: Record<string, unknown>, baseUrl: string): CliCredential | undefined;
|
|
14
55
|
/** Resolve global CLI config from parsed flags and environment variables. */
|
|
15
56
|
export declare function resolveConfig(values: Record<string, unknown>): CliConfig;
|
|
16
57
|
/** Resolve config for commands that don't require --project-id (e.g. auth). */
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpD,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACrB,CAAC;AAMF,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACrB,CAsBA;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG,SAAS,CAgCtD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,GACb,aAAa,GAAG,SAAS,CAS3B;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAgBxE;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAS9B;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;CAO1B,CAAC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { assertSafeBaseUrl } from "@framedash/api-client";
|
|
3
3
|
import { error } from "./logger.js";
|
|
4
|
-
|
|
4
|
+
import { readStoredEntry } from "./oauth/token-store.js";
|
|
5
|
+
const NO_CREDENTIAL_MESSAGE = "No credentials found: pass --api-key/--api-key-file, set FRAMEDASH_API_KEY, " +
|
|
6
|
+
"or run 'framedash login' (interactive). CI/non-interactive use should set FRAMEDASH_API_KEY.";
|
|
7
|
+
/** Resolve --base-url/--format (and env fallbacks) for commands that need no credential. */
|
|
8
|
+
export function resolveBaseAndFormat(values) {
|
|
5
9
|
const baseUrl = values["base-url"] ??
|
|
6
10
|
process.env.FRAMEDASH_BASE_URL ??
|
|
7
11
|
"https://app.framedash.dev";
|
|
@@ -27,9 +31,13 @@ function resolveBaseAndFormat(values) {
|
|
|
27
31
|
* then the FRAMEDASH_API_KEY env var. Returns undefined if none is set.
|
|
28
32
|
*/
|
|
29
33
|
export function resolveApiKey(values) {
|
|
34
|
+
return resolveApiKeyWithSource(values)?.apiKey;
|
|
35
|
+
}
|
|
36
|
+
/** As resolveApiKey, but also reports WHICH source supplied the key. */
|
|
37
|
+
export function resolveApiKeyWithSource(values) {
|
|
30
38
|
const flag = values["api-key"];
|
|
31
39
|
if (flag)
|
|
32
|
-
return flag;
|
|
40
|
+
return { apiKey: flag, source: "flag" };
|
|
33
41
|
const file = values["api-key-file"];
|
|
34
42
|
if (file) {
|
|
35
43
|
const label = file === "-" ? "stdin" : file;
|
|
@@ -52,15 +60,38 @@ export function resolveApiKey(values) {
|
|
|
52
60
|
error(`--api-key-file (${label}) is empty`);
|
|
53
61
|
process.exit(1);
|
|
54
62
|
}
|
|
55
|
-
return key;
|
|
63
|
+
return { apiKey: key, source: "file" };
|
|
56
64
|
}
|
|
57
|
-
|
|
65
|
+
const envKey = process.env.FRAMEDASH_API_KEY;
|
|
66
|
+
return envKey ? { apiKey: envKey, source: "env" } : undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the credential for the given base URL. API keys (flag > file > env)
|
|
70
|
+
* win over a stored OAuth login; the OAuth token store is consulted only for
|
|
71
|
+
* the resolved base URL's exact origin. Returns undefined when nothing is set.
|
|
72
|
+
*
|
|
73
|
+
* NOTE: throws a TypeError (from `new URL`) when `baseUrl` is not a valid
|
|
74
|
+
* URL and no API key short-circuits the lookup. Callers that accept raw user
|
|
75
|
+
* input for the base URL (map-capture) must validate or catch accordingly;
|
|
76
|
+
* resolveConfig* callers are safe because resolveBaseAndFormat has already
|
|
77
|
+
* vetted the URL.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveCredential(values, baseUrl) {
|
|
80
|
+
const key = resolveApiKeyWithSource(values);
|
|
81
|
+
if (key)
|
|
82
|
+
return { kind: "api-key", ...key };
|
|
83
|
+
const origin = new URL(baseUrl).origin;
|
|
84
|
+
const entry = readStoredEntry(origin);
|
|
85
|
+
if (entry)
|
|
86
|
+
return { kind: "oauth", origin, entry };
|
|
87
|
+
return undefined;
|
|
58
88
|
}
|
|
59
89
|
/** Resolve global CLI config from parsed flags and environment variables. */
|
|
60
90
|
export function resolveConfig(values) {
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
91
|
+
const { baseUrl, format } = resolveBaseAndFormat(values);
|
|
92
|
+
const credential = resolveCredential(values, baseUrl);
|
|
93
|
+
if (!credential) {
|
|
94
|
+
error(NO_CREDENTIAL_MESSAGE);
|
|
64
95
|
process.exit(1);
|
|
65
96
|
}
|
|
66
97
|
const projectId = values["project-id"] ?? process.env.FRAMEDASH_PROJECT_ID;
|
|
@@ -68,18 +99,17 @@ export function resolveConfig(values) {
|
|
|
68
99
|
error("--project-id or FRAMEDASH_PROJECT_ID env is required");
|
|
69
100
|
process.exit(1);
|
|
70
101
|
}
|
|
71
|
-
|
|
72
|
-
return { apiKey, projectId, baseUrl, format };
|
|
102
|
+
return { credential, projectId, baseUrl, format };
|
|
73
103
|
}
|
|
74
104
|
/** Resolve config for commands that don't require --project-id (e.g. auth). */
|
|
75
105
|
export function resolveConfigWithoutProject(values) {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
106
|
+
const { baseUrl, format } = resolveBaseAndFormat(values);
|
|
107
|
+
const credential = resolveCredential(values, baseUrl);
|
|
108
|
+
if (!credential) {
|
|
109
|
+
error(NO_CREDENTIAL_MESSAGE);
|
|
79
110
|
process.exit(1);
|
|
80
111
|
}
|
|
81
|
-
|
|
82
|
-
return { apiKey, baseUrl, format };
|
|
112
|
+
return { credential, baseUrl, format };
|
|
83
113
|
}
|
|
84
114
|
/** Parse a string flag as a positive integer with a descriptive error. */
|
|
85
115
|
export function parsePositiveInt(value, flagName) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
import { ApiClient } from "@framedash/api-client";
|
|
2
|
+
import type { CliCredential } from "./config.js";
|
|
3
|
+
import { OAuthTokenManager } from "./oauth/manager.js";
|
|
4
|
+
export type CreateClientOptions = {
|
|
5
|
+
throwOnError?: boolean;
|
|
6
|
+
};
|
|
7
|
+
/** Test-only: drop cached managers so each test starts from its own entry. */
|
|
8
|
+
export declare function resetOAuthManagerCacheForTests(): void;
|
|
2
9
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* ingest poll), where a transient 429/5xx must be thrown and retried, not exit.
|
|
10
|
+
* Process-shared token manager for an origin. Also used by non-ApiClient
|
|
11
|
+
* consumers (the map-capture uploader) so EVERY Bearer credential in the
|
|
12
|
+
* process rides on the same rotation state.
|
|
7
13
|
*/
|
|
8
|
-
export declare function
|
|
9
|
-
|
|
10
|
-
}):
|
|
14
|
+
export declare function getSharedOAuthManager(baseUrl: string, credential: Extract<CliCredential, {
|
|
15
|
+
kind: "oauth";
|
|
16
|
+
}>): OAuthTokenManager;
|
|
17
|
+
/**
|
|
18
|
+
* Create the CLI's API client from the resolved credential. By default a
|
|
19
|
+
* request error prints a message and exits the process (the right behavior
|
|
20
|
+
* for one-shot commands). Pass `throwOnError` for a client used inside a
|
|
21
|
+
* retry loop (e.g. the run-profile-test ingest poll), where a transient
|
|
22
|
+
* 429/5xx must be thrown and retried, not exit.
|
|
23
|
+
*
|
|
24
|
+
* API keys go on X-API-Key as before. A stored OAuth login gets a wrapper
|
|
25
|
+
* that refreshes near expiry, retries exactly once after a 401, and persists
|
|
26
|
+
* rotated refresh tokens.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createClient(baseUrl: string, credential: CliCredential, projectId: string, options?: CreateClientOptions): ApiClient;
|
|
11
29
|
//# sourceMappingURL=create-client.d.ts.map
|