@framedash/cli 0.1.1 → 0.1.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 +23 -0
- package/dist/commands/builds.d.ts +2 -0
- package/dist/commands/builds.d.ts.map +1 -0
- package/dist/commands/builds.js +31 -0
- package/dist/commands/builds.js.map +1 -0
- package/dist/commands/content.d.ts.map +1 -1
- package/dist/commands/content.js +2 -2
- package/dist/commands/content.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +3 -3
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/funnel.d.ts.map +1 -1
- package/dist/commands/funnel.js +7 -8
- package/dist/commands/funnel.js.map +1 -1
- package/dist/commands/map-capture.d.ts.map +1 -1
- package/dist/commands/map-capture.js +5 -4
- package/dist/commands/map-capture.js.map +1 -1
- package/dist/commands/perf-diff.d.ts +2 -0
- package/dist/commands/perf-diff.d.ts.map +1 -0
- package/dist/commands/perf-diff.js +125 -0
- package/dist/commands/perf-diff.js.map +1 -0
- package/dist/commands/retention.d.ts.map +1 -1
- package/dist/commands/retention.js +3 -3
- package/dist/commands/retention.js.map +1 -1
- package/dist/commands/run-profile-test.d.ts +7 -0
- package/dist/commands/run-profile-test.d.ts.map +1 -0
- package/dist/commands/run-profile-test.js +386 -0
- package/dist/commands/run-profile-test.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/create-client.d.ts +9 -1
- package/dist/lib/create-client.d.ts.map +1 -1
- package/dist/lib/create-client.js +17 -1
- package/dist/lib/create-client.js.map +1 -1
- package/dist/lib/logger.d.ts +2 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +4 -0
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/perf-diff-eval.d.ts +58 -0
- package/dist/lib/perf-diff-eval.d.ts.map +1 -0
- package/dist/lib/perf-diff-eval.js +49 -0
- package/dist/lib/perf-diff-eval.js.map +1 -0
- package/dist/lib/run-profile-test-lib.d.ts +117 -0
- package/dist/lib/run-profile-test-lib.d.ts.map +1 -0
- package/dist/lib/run-profile-test-lib.js +124 -0
- package/dist/lib/run-profile-test-lib.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,6 +11,9 @@ Framedash CLI tool for CI/CD pipelines, analytics queries, and coding agent inte
|
|
|
11
11
|
| `framedash dashboard` | Fetch dashboard KPI summary |
|
|
12
12
|
| `framedash retention` | Fetch retention cohort data |
|
|
13
13
|
| `framedash funnel` | Fetch funnel conversion data |
|
|
14
|
+
| `framedash builds` | List builds seen for the project (for `perf-diff`) |
|
|
15
|
+
| `framedash perf-diff` | Compare two builds and gate CI on a perf regression |
|
|
16
|
+
| `framedash run-profile-test` | Run a profiling build, wait for ingest, then gate on a regression |
|
|
14
17
|
| `framedash alerts` | Manage alert rules and channels |
|
|
15
18
|
| `framedash maps` | List and manage map overlays |
|
|
16
19
|
| `framedash content` | Manage content registry entries |
|
|
@@ -56,6 +59,26 @@ node . dashboard --api-key-file ../../framedash.key --format table
|
|
|
56
59
|
node . dashboard --api-key-file ../../framedash.key --format csv
|
|
57
60
|
```
|
|
58
61
|
|
|
62
|
+
## CI performance gating
|
|
63
|
+
|
|
64
|
+
`run-profile-test` ties the SDK's automated-session API to the `perf-diff` gate
|
|
65
|
+
into a single CI step. It exports the `FRAMEDASH_*` session contract, launches
|
|
66
|
+
your profiling build, waits for its performance data to ingest, then fails the
|
|
67
|
+
job on a build-over-build regression:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
framedash run-profile-test \
|
|
71
|
+
--command "./Build/Game.exe -nullrhi -ExecCmds='Automation RunTest Perf'" \
|
|
72
|
+
--scenario nightly --baseline "$BASE_SHA" --threshold 5 --fail-on-regression
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The launched command inherits `FRAMEDASH_BUILD_ID`, `FRAMEDASH_GIT_BRANCH`,
|
|
76
|
+
`FRAMEDASH_GIT_COMMIT`, and `FRAMEDASH_TEST_SCENARIO`; an SDK that calls
|
|
77
|
+
`BeginAutomatedSessionFromEnvironment()` stamps them onto every event with no
|
|
78
|
+
in-game code change. The build id (defaulting to the git commit) becomes the
|
|
79
|
+
`perf-diff` candidate. Run `framedash run-profile-test --help` for all options,
|
|
80
|
+
or use `framedash builds` / `framedash perf-diff` to drive the steps manually.
|
|
81
|
+
|
|
59
82
|
## Development
|
|
60
83
|
|
|
61
84
|
Run these commands from `packages/cli`:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builds.d.ts","sourceRoot":"","sources":["../../src/commands/builds.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { buildBuildsPath } from "@framedash/api-client";
|
|
2
|
+
import { formatOutput } from "../lib/formatters.js";
|
|
3
|
+
import { log } from "../lib/logger.js";
|
|
4
|
+
import { runCommand } from "../lib/run-command.js";
|
|
5
|
+
export async function builds(args) {
|
|
6
|
+
await runCommand({
|
|
7
|
+
args,
|
|
8
|
+
help: HELP,
|
|
9
|
+
options: {
|
|
10
|
+
days: { type: "string" },
|
|
11
|
+
},
|
|
12
|
+
}, async ({ client, config, values }) => {
|
|
13
|
+
const data = await client.get(client.projectPath(buildBuildsPath({ days: values.days })));
|
|
14
|
+
log(formatOutput(data, config.format));
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const HELP = `Usage: framedash builds [options]
|
|
18
|
+
|
|
19
|
+
List the builds seen for the project (newest first), so you can pick build IDs
|
|
20
|
+
to compare with 'framedash perf-diff'. A build is any non-empty build_id that
|
|
21
|
+
produced performance events in the window (set build_id from your CI, e.g. the
|
|
22
|
+
git SHA, when initializing the SDK).
|
|
23
|
+
|
|
24
|
+
Options:
|
|
25
|
+
--days <n> Time period in days: 7, 14, 30, 90 (default: 30)
|
|
26
|
+
--api-key <key> API key (or FRAMEDASH_API_KEY env)
|
|
27
|
+
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
28
|
+
--base-url <url> API base URL (default: https://app.framedash.dev)
|
|
29
|
+
--format <fmt> Output format: json, table, csv (default: json)
|
|
30
|
+
-h, --help Show help`;
|
|
31
|
+
//# sourceMappingURL=builds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/commands/builds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IAC1C,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACxB;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC5B,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAA0B,EAAE,CAAC,CAAC,CAChF,CAAC;QACF,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CACD,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;mCAasB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/commands/content.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/commands/content.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,OAAO,mCAIlB,CAAC"}
|
package/dist/commands/content.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { buildContentPath } from "@framedash/api-client";
|
|
2
3
|
import { formatOutput } from "../lib/formatters.js";
|
|
3
4
|
import { error, log, success } from "../lib/logger.js";
|
|
4
5
|
import { runCommand, withSubcommands } from "../lib/run-command.js";
|
|
@@ -27,8 +28,7 @@ async function contentList(args) {
|
|
|
27
28
|
help: "Usage: framedash content list [--type <content-type>] [--format json|table|csv] [global options]",
|
|
28
29
|
options: { type: { type: "string" } },
|
|
29
30
|
}, async ({ client, config, values }) => {
|
|
30
|
-
const
|
|
31
|
-
const data = await client.get(`/api/v1/content${params}`);
|
|
31
|
+
const data = await client.get(buildContentPath({ type: values.type }));
|
|
32
32
|
log(formatOutput(data, config.format));
|
|
33
33
|
});
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/commands/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,IAAI,GAAG;;;;;;;;;2DAS8C,CAAC;AAE5D,MAAM,WAAW,GAAG;;;6DAGyC,CAAC;AAE9D,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE;IACvD,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;CACrB,CAAC,CAAC;AAEH,KAAK,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,kGAAkG;QACxG,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACrC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/commands/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7D"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { buildDashboardPath } from "@framedash/api-client";
|
|
1
2
|
import { formatOutput } from "../lib/formatters.js";
|
|
2
3
|
import { log } from "../lib/logger.js";
|
|
3
4
|
import { runCommand } from "../lib/run-command.js";
|
|
4
5
|
export async function dashboard(args) {
|
|
5
6
|
await runCommand({ args, help: HELP, options: { days: { type: "string" } } }, async ({ client, config, values }) => {
|
|
6
|
-
const
|
|
7
|
-
const data = await client.get(client.projectPath(`dashboard?${params}`));
|
|
7
|
+
const data = await client.get(client.projectPath(buildDashboardPath({ days: values.days ?? "30" })));
|
|
8
8
|
log(formatOutput(data, config.format));
|
|
9
9
|
});
|
|
10
10
|
}
|
|
@@ -13,7 +13,7 @@ const HELP = `Usage: framedash dashboard [options]
|
|
|
13
13
|
Show project dashboard metrics.
|
|
14
14
|
|
|
15
15
|
Options:
|
|
16
|
-
--days <n> Time period in days:
|
|
16
|
+
--days <n> Time period in days: 7, 14, 30, 90 (default: 30)
|
|
17
17
|
--api-key <key> API key (or FRAMEDASH_API_KEY env)
|
|
18
18
|
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
19
19
|
--base-url <url> API base URL (default: https://app.framedash.dev)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC7C,MAAM,UAAU,CACf,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAC3D,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC7C,MAAM,UAAU,CACf,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAC3D,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC5B,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAG,MAAM,CAAC,IAAe,IAAI,IAAI,EAAE,CAAC,CAAC,CACjF,CAAC;QACF,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CACD,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;mCAUsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnel.d.ts","sourceRoot":"","sources":["../../src/commands/funnel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"funnel.d.ts","sourceRoot":"","sources":["../../src/commands/funnel.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B1D"}
|
package/dist/commands/funnel.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildFunnelPath } from "@framedash/api-client";
|
|
1
2
|
import { formatOutput } from "../lib/formatters.js";
|
|
2
3
|
import { error, log } from "../lib/logger.js";
|
|
3
4
|
import { runCommand } from "../lib/run-command.js";
|
|
@@ -15,13 +16,11 @@ export async function funnel(args) {
|
|
|
15
16
|
error('--steps is required (comma-separated event names, e.g. "login,tutorial,purchase")');
|
|
16
17
|
process.exit(1);
|
|
17
18
|
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
params.set("window", values.window);
|
|
24
|
-
const data = await client.get(client.projectPath(`funnels?${params}`));
|
|
19
|
+
const data = await client.get(client.projectPath(buildFunnelPath({
|
|
20
|
+
steps: values.steps,
|
|
21
|
+
days: values.days,
|
|
22
|
+
window: values.window,
|
|
23
|
+
})));
|
|
25
24
|
log(formatOutput(data, config.format));
|
|
26
25
|
});
|
|
27
26
|
}
|
|
@@ -33,7 +32,7 @@ Required:
|
|
|
33
32
|
--steps <events> Comma-separated event names (2-8 steps)
|
|
34
33
|
|
|
35
34
|
Options:
|
|
36
|
-
--days <n> Time period in days:
|
|
35
|
+
--days <n> Time period in days: 7, 14, 30, 90 (default: 30)
|
|
37
36
|
--window <seconds> Conversion window: 3600, 21600, 86400, 604800 (default: 86400)
|
|
38
37
|
--api-key <key> API key (or FRAMEDASH_API_KEY env)
|
|
39
38
|
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnel.js","sourceRoot":"","sources":["../../src/commands/funnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IAC1C,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,mFAAmF,CAAC,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"funnel.js","sourceRoot":"","sources":["../../src/commands/funnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IAC1C,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,mFAAmF,CAAC,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC5B,MAAM,CAAC,WAAW,CACjB,eAAe,CAAC;YACf,KAAK,EAAE,MAAM,CAAC,KAAe;YAC7B,IAAI,EAAE,MAAM,CAAC,IAA0B;YACvC,MAAM,EAAE,MAAM,CAAC,MAA4B;SAC3C,CAAC,CACF,CACD,CAAC;QACF,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CACD,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;;mCAcsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-capture.d.ts","sourceRoot":"","sources":["../../src/commands/map-capture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"map-capture.d.ts","sourceRoot":"","sources":["../../src/commands/map-capture.ts"],"names":[],"mappings":"AA0CA,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrE;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+InF"}
|
|
@@ -18,10 +18,11 @@ Required:
|
|
|
18
18
|
|
|
19
19
|
Upload options (all required together):
|
|
20
20
|
--upload Enable upload to Framedash API
|
|
21
|
-
--api-key <key>
|
|
22
|
-
--api-key-file: a key passed
|
|
23
|
-
in the process list and shell
|
|
24
|
-
|
|
21
|
+
--api-key <key> API key (needs the resources:write scope). Prefer
|
|
22
|
+
FRAMEDASH_API_KEY env or --api-key-file: a key passed
|
|
23
|
+
as --api-key is visible in the process list and shell
|
|
24
|
+
history.
|
|
25
|
+
--api-key-file <path> Read the API key from a file ('-' for stdin)
|
|
25
26
|
--project-id <uuid> Target project ID, or set FRAMEDASH_PROJECT_ID env
|
|
26
27
|
|
|
27
28
|
Optional:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-capture.js","sourceRoot":"","sources":["../../src/commands/map-capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG
|
|
1
|
+
{"version":3,"file":"map-capture.js","sourceRoot":"","sources":["../../src/commands/map-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-diff.d.ts","sourceRoot":"","sources":["../../src/commands/perf-diff.ts"],"names":[],"mappings":"AAYA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G5D"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { buildBuildComparePath } from "@framedash/api-client";
|
|
2
|
+
import { formatOutput } from "../lib/formatters.js";
|
|
3
|
+
import { error, log, success } from "../lib/logger.js";
|
|
4
|
+
import { evaluateRegression, formatMetricDiff, isRegressionMetric, } from "../lib/perf-diff-eval.js";
|
|
5
|
+
import { runCommand } from "../lib/run-command.js";
|
|
6
|
+
export async function perfDiff(args) {
|
|
7
|
+
await runCommand({
|
|
8
|
+
args,
|
|
9
|
+
help: HELP,
|
|
10
|
+
options: {
|
|
11
|
+
baseline: { type: "string" },
|
|
12
|
+
candidate: { type: "string" },
|
|
13
|
+
metric: { type: "string" },
|
|
14
|
+
days: { type: "string" },
|
|
15
|
+
map: { type: "string" },
|
|
16
|
+
platform: { type: "string" },
|
|
17
|
+
threshold: { type: "string" },
|
|
18
|
+
"fail-on-regression": { type: "boolean" },
|
|
19
|
+
},
|
|
20
|
+
}, async ({ client, config, values }) => {
|
|
21
|
+
// Trim so the local equality/required checks match the server (the route
|
|
22
|
+
// trims too) and a stray-whitespace build id does not waste an API round-trip.
|
|
23
|
+
const baseline = values.baseline?.trim();
|
|
24
|
+
const candidate = values.candidate?.trim();
|
|
25
|
+
if (!baseline || !candidate) {
|
|
26
|
+
error("--baseline and --candidate are required (build IDs; see 'framedash builds')");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// A build compared against itself is a zero diff that would pass the gate;
|
|
30
|
+
// fail fast on a misconfigured CI (e.g. BASE_SHA == GITHUB_SHA).
|
|
31
|
+
if (baseline === candidate) {
|
|
32
|
+
error("--baseline and --candidate must be different build IDs");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
let metric;
|
|
36
|
+
if (values.metric !== undefined) {
|
|
37
|
+
const raw = values.metric.trim();
|
|
38
|
+
if (!isRegressionMetric(raw)) {
|
|
39
|
+
error(`Invalid --metric '${raw}'. Allowed: frame_time, memory, gpu_time`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
metric = raw;
|
|
43
|
+
}
|
|
44
|
+
let thresholdPct = 0;
|
|
45
|
+
if (values.threshold !== undefined) {
|
|
46
|
+
thresholdPct = Number(values.threshold);
|
|
47
|
+
if (!Number.isFinite(thresholdPct) || thresholdPct < 0) {
|
|
48
|
+
error("--threshold must be a non-negative number (percent)");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const comparison = await client.get(client.projectPath(buildBuildComparePath({
|
|
53
|
+
baseline,
|
|
54
|
+
candidate,
|
|
55
|
+
days: values.days,
|
|
56
|
+
mapId: values.map,
|
|
57
|
+
platform: values.platform,
|
|
58
|
+
})));
|
|
59
|
+
// A non-error 2xx with a malformed body must not crash the gate with a raw
|
|
60
|
+
// TypeError; fail closed with a clear message instead.
|
|
61
|
+
if (!comparison || !Array.isArray(comparison.diffs)) {
|
|
62
|
+
error("Unexpected response from the builds/compare API (no comparison data).");
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
// Always print the comparison so CI logs carry the numbers. JSON gets the
|
|
66
|
+
// full object (baseline/candidate stats + diffs); table/csv get the diff rows.
|
|
67
|
+
if (config.format === "json") {
|
|
68
|
+
log(formatOutput(comparison, "json"));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
log(formatOutput(comparison.diffs, config.format));
|
|
72
|
+
}
|
|
73
|
+
if (!values["fail-on-regression"])
|
|
74
|
+
return;
|
|
75
|
+
const verdict = evaluateRegression(comparison, { metric, thresholdPct });
|
|
76
|
+
// Fail closed: if --fail-on-regression was requested but nothing was
|
|
77
|
+
// comparable (wrong build IDs, or the chosen metric has no data on the
|
|
78
|
+
// platform), do not let the build pass an unmeasured gate.
|
|
79
|
+
if (verdict.evaluated.length === 0) {
|
|
80
|
+
error(metric
|
|
81
|
+
? `No comparable '${metric}' data between these builds; cannot evaluate a regression.`
|
|
82
|
+
: "No comparable performance data between these builds; cannot evaluate a regression.");
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
if (verdict.failed) {
|
|
86
|
+
error(`Performance regression detected (threshold ${thresholdPct}%): ${verdict.offenders
|
|
87
|
+
.map(formatMetricDiff)
|
|
88
|
+
.join("; ")}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
success(`No performance regression beyond ${thresholdPct}% (${verdict.evaluated.length} metric(s) checked).`);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const HELP = `Usage: framedash perf-diff --baseline <id> --candidate <id> [options]
|
|
95
|
+
|
|
96
|
+
Compare two builds' performance (P50/P95 frame time, memory, GPU time) and,
|
|
97
|
+
with --fail-on-regression, exit non-zero when the candidate regressed -- so a CI
|
|
98
|
+
job can gate a merge on a build-over-build performance regression. Build IDs are
|
|
99
|
+
whatever your SDK reported as build_id (set it from CI, e.g. the git SHA); list
|
|
100
|
+
them with 'framedash builds'.
|
|
101
|
+
|
|
102
|
+
Required:
|
|
103
|
+
--baseline <id> Known-good build_id to compare against
|
|
104
|
+
--candidate <id> New build_id under test
|
|
105
|
+
|
|
106
|
+
Options:
|
|
107
|
+
--metric <name> Gate on one metric only: frame_time, memory, gpu_time
|
|
108
|
+
(default: all). Lower is better; a positive % is a regression.
|
|
109
|
+
--threshold <pct> Tolerate a regression up to this percent (default: 0 =
|
|
110
|
+
any worsening fails). e.g. --threshold 5 ignores <=5% noise.
|
|
111
|
+
--fail-on-regression Exit 1 if a regression beyond the threshold is found
|
|
112
|
+
(otherwise perf-diff only reports and exits 0)
|
|
113
|
+
--days <n> Time period in days: 7, 14, 30, 90 (default: 30)
|
|
114
|
+
--map <id> Restrict the comparison to one map
|
|
115
|
+
--platform <name> Restrict the comparison to one platform
|
|
116
|
+
--api-key <key> API key (or FRAMEDASH_API_KEY env)
|
|
117
|
+
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
118
|
+
--base-url <url> API base URL (default: https://app.framedash.dev)
|
|
119
|
+
--format <fmt> Output format: json, table, csv (default: json)
|
|
120
|
+
-h, --help Show help
|
|
121
|
+
|
|
122
|
+
Example (GitHub Actions gate):
|
|
123
|
+
framedash perf-diff --baseline "$BASE_SHA" --candidate "$GITHUB_SHA" \\
|
|
124
|
+
--threshold 5 --fail-on-regression`;
|
|
125
|
+
//# sourceMappingURL=perf-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-diff.js","sourceRoot":"","sources":["../../src/commands/perf-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAEN,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC5C,MAAM,UAAU,CACf;QACC,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SACzC;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,yEAAyE;QACzE,+EAA+E;QAC/E,MAAM,QAAQ,GAAI,MAAM,CAAC,QAA+B,EAAE,IAAI,EAAE,CAAC;QACjE,MAAM,SAAS,GAAI,MAAM,CAAC,SAAgC,EAAE,IAAI,EAAE,CAAC;QACnE,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,6EAA6E,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,2EAA2E;QAC3E,iEAAiE;QACjE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,MAAoC,CAAC;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAI,MAAM,CAAC,MAAiB,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,qBAAqB,GAAG,0CAA0C,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;YACD,MAAM,GAAG,GAAG,CAAC;QACd,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACxD,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACF,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAClC,MAAM,CAAC,WAAW,CACjB,qBAAqB,CAAC;YACrB,QAAQ;YACR,SAAS;YACT,IAAI,EAAE,MAAM,CAAC,IAA0B;YACvC,KAAK,EAAE,MAAM,CAAC,GAAyB;YACvC,QAAQ,EAAE,MAAM,CAAC,QAA8B;SAC/C,CAAC,CACF,CACD,CAAC;QAEF,2EAA2E;QAC3E,uDAAuD;QACvD,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,uEAAuE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,0EAA0E;QAC1E,+EAA+E;QAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAAE,OAAO;QAE1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAEzE,qEAAqE;QACrE,uEAAuE;QACvE,2DAA2D;QAC3D,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,CACJ,MAAM;gBACL,CAAC,CAAC,kBAAkB,MAAM,4DAA4D;gBACtF,CAAC,CAAC,oFAAoF,CACvF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CACJ,8CAA8C,YAAY,OAAO,OAAO,CAAC,SAAS;iBAChF,GAAG,CAAC,gBAAgB,CAAC;iBACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CACd,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,CACN,oCAAoC,YAAY,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,sBAAsB,CACpG,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA8B0B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/commands/retention.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/commands/retention.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7D"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { buildRetentionPath } from "@framedash/api-client";
|
|
1
2
|
import { formatOutput } from "../lib/formatters.js";
|
|
2
3
|
import { log } from "../lib/logger.js";
|
|
3
4
|
import { runCommand } from "../lib/run-command.js";
|
|
4
5
|
export async function retention(args) {
|
|
5
6
|
await runCommand({ args, help: HELP, options: { days: { type: "string" } } }, async ({ client, config, values }) => {
|
|
6
|
-
const
|
|
7
|
-
const data = await client.get(client.projectPath(`retention?${params}`));
|
|
7
|
+
const data = await client.get(client.projectPath(buildRetentionPath({ days: values.days ?? "30" })));
|
|
8
8
|
log(formatOutput(data, config.format));
|
|
9
9
|
});
|
|
10
10
|
}
|
|
@@ -13,7 +13,7 @@ const HELP = `Usage: framedash retention [options]
|
|
|
13
13
|
Show player retention cohorts.
|
|
14
14
|
|
|
15
15
|
Options:
|
|
16
|
-
--days <n> Time period in days:
|
|
16
|
+
--days <n> Time period in days: 7, 14, 30, 90 (default: 30)
|
|
17
17
|
--api-key <key> API key (or FRAMEDASH_API_KEY env)
|
|
18
18
|
--project-id <uuid> Project ID (or FRAMEDASH_PROJECT_ID env)
|
|
19
19
|
--base-url <url> API base URL (default: https://app.framedash.dev)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/commands/retention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC7C,MAAM,UAAU,CACf,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAC3D,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/commands/retention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC7C,MAAM,UAAU,CACf,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAC3D,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC5B,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAG,MAAM,CAAC,IAAe,IAAI,IAAI,EAAE,CAAC,CAAC,CACjF,CAAC;QACF,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CACD,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;mCAUsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turnkey CI profiling gate: export the FRAMEDASH_* session contract, launch the
|
|
3
|
+
* configured game/profiling command, wait for its perf data to ingest, then run
|
|
4
|
+
* the perf-diff regression gate against a baseline build.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runProfileTest(args: string[]): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=run-profile-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-profile-test.d.ts","sourceRoot":"","sources":["../../src/commands/run-profile-test.ts"],"names":[],"mappings":"AAySA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4IlE"}
|