跳转到内容

CLI 参考

Framedash CLI 提供从终端访问遥测数据、分析和项目管理的功能。支持在 CI/CD 流水线中自动上传地图和同步内容。

需要 Node.js 与 npm。可以全局安装,或用 npx 免安装按需运行。

Terminal window
# 全局安装
npm install -g @framedash/cli
# 或免安装运行
npx @framedash/cli --help

通过环境变量提供 API 密钥,或从文件读取:

Terminal window
# 环境变量
export FRAMEDASH_API_KEY=fd_your_api_key_here
# 或从文件读取(- 表示标准输入)
framedash status --api-key-file ./read.key

验证密钥是否有效并查看关联的项目:

Terminal window
framedash auth

CLI 还可以用 framedash login 交互式登录,它会保存 OAuth 会话,之后的读取命令无需再传密钥。

大多数命令接受以下选项:

选项说明
--api-key <key>API 密钥(或 FRAMEDASH_API_KEY 环境变量)
--api-key-file <path>从文件读取 API 密钥(- 表示标准输入)
--project-id <uuid>项目 ID(或 FRAMEDASH_PROJECT_ID 环境变量)
--base-url <url>API 主机 URL(默认:https://app.framedash.dev
--format <fmt>输出格式:jsontablecsv(默认:json
-h, --help显示帮助

本页涵盖最常用的命令。运行 framedash --help(或 framedash <command> --help)可获得随版本变化的权威列表。

验证 API 密钥并显示关联的项目。

Terminal window
framedash auth

选项:--api-key--base-url--format

使用 --format json 时,标准输出只包含 JSON 文档,因此可以安全地传给 jq 等工具。验证结果和凭据来源状态行仍会显示在标准错误中。

framedash login 使用 OAuth 2.1 授权码流程与 PKCE(S256)交互式登录。它会在系统浏览器中打开 {base-url}/oauth/authorize(使用回环重定向),并最多等待 5 分钟供你批准。

Terminal window
framedash login
选项说明
--scopes <list>要请求的 scope(空格分隔,默认 analytics:read
--no-browser打印授权 URL 而不打开浏览器
--base-url <url>授权服务器(默认 https://app.framedash.dev

令牌保存在 ~/.config/framedash/credentials.json(遵循 XDG_CONFIG_HOME;Windows 上采用相同的路径约定),按服务器 origin 建立键,并自动刷新。令牌值绝不会被打印。

framedash logout 会在服务器端撤销令牌(尽力而为),并删除已解析 base URL 的本地凭据。加上 --all 可清除所有 origin。API 密钥不受影响。

Terminal window
framedash logout
framedash logout --all

显式的 --api-key--api-key-fileFRAMEDASH_API_KEY 始终优先于已保存的登录,因此 CI 应使用 FRAMEDASH_API_KEY 而非 framedash login 进行认证。通过 login 建立的授权可在仪表盘的”设置”→“已连接应用”中查看和撤销。

列出你可访问的项目(idnamecreatedAt)。具有 analytics:read 作用域的 API 密钥或 OAuth 登录均可使用,且无需 --project-id。仅有 events:write 的 Ingest 密钥无法列出项目。从 @framedash/cli 0.1.4 起可用。

Terminal window
framedash projects list --format table

--format json|table|csv 设置输出格式。

显示项目健康状态。

Terminal window
framedash status

kpis.fetchedAt 是查询 KPI 快照时的 Unix 毫秒时间戳。状态通常使用服务器缓存;当 CI 或故障排查需要新查询的快照时,请使用 --fresh 绕过缓存。此选项未包含在 @framedash/cli 0.1.7 中;请安装更新的版本,并在使用前确认 framedash status --help 中已列出该选项。

显示仪表盘 KPI(DAU、MAU、会话、事件数)。

Terminal window
framedash dashboard --days 30
选项默认值
--days7, 14, 30, 9030

显示玩家留存率队列(D1、D7、D30)。

Terminal window
framedash retention --days 14
选项默认值
--days7, 14, 30, 9030

分析事件漏斗,衡量步骤间的玩家转化率。

Terminal window
framedash funnel --steps "player_spawn,player_death,player_respawn"
选项说明默认值
--steps逗号分隔的事件名称(必需,2-8 个步骤)
--window时间窗口(秒):3600、21600、86400、60480086400
--days时间范围:7、14、30、9030

按最新优先列出项目中出现过的构建 ID。用于为 framedash perf-diff 选择比较对象。

Terminal window
framedash builds --days 30
选项默认值
--days7、14、30、9030

比较两个构建的 P50/P95 性能(帧时间、内存、GPU 时间)。指定 --fail-on-regression 后,如果候选构建的退化超过阈值,命令会以退出码 1 失败。

Terminal window
framedash perf-diff --baseline "$BASE_SHA" --candidate "$GITHUB_SHA" \
--threshold 5 --fail-on-regression
选项说明
--baseline <id>作为基准的 build_id(必需)
--candidate <id>待测试的 build_id(必需)
--metric <name>限定为单个指标:frame_timememorygpu_timeio.read_bytesio.read_time_msio.read_opsload_time_msmem.vram(默认为全部指标)。load_time_ms 需要 SDK 的地图加载计时,mem.vram 需要 SDK 的 VRAM 采样
--threshold <pct>允许的退化百分比。默认值为 0
--fail-on-regression检测到性能退化时以非零退出
--days <n>时间范围:7、14、30、90(默认 30)
--map <id>限定到一个地图
--platform <name>限定到一个平台

--baseline--candidate 必须是不同的构建 ID。CLI 会拒绝相同的 ID,使配置错误的 CI 作业在把构建与自身比较之前尽早失败。

为 CI 端到端运行性能分析构建:导出 FRAMEDASH_* 自动会话变量,启动游戏/性能分析命令,等待遥测数据入库,然后针对基准执行 perf-diff 门禁。是 buildsperf-diff 的一键式整合工具。

Terminal window
framedash run-profile-test \
--command "./Build/Game.exe -nullrhi -ExecCmds='Automation RunTest Perf'" \
--scenario nightly --api-key-file ci-read.key \
--baseline "$BASE_SHA" --threshold 5 --fail-on-regression
选项说明
--command <cmd>通过 Shell 启动的游戏/性能分析命令(必需)
--build-id <id>候选 build_id(默认:--commit,否则为 git HEAD
--branch <name>默认:git rev-parse --abbrev-ref HEAD
--commit <sha>默认:git rev-parse HEAD
--scenario <name>测试场景标签
--ingest-timeout <s>等待新遥测数据入库的最长秒数(默认 180)
--poll-interval <s>入库轮询间隔(秒,默认 5)
--skip-wait跳过入库等待
--baseline <id>用于门禁对比的已知良好 build_id

--baseline--metric--threshold--fail-on-regression--days--map--platform 标志的行为与 framedash perf-diff 完全一致。

启动的命令会继承 FRAMEDASH_BUILD_ID / FRAMEDASH_GIT_BRANCH / FRAMEDASH_GIT_COMMIT / FRAMEDASH_TEST_SCENARIO。一旦 SDK 调用 BeginAutomatedSessionFromEnvironment(),每条事件就会自动打上标签,无需为每条事件单独编写标签代码。完整设置请参阅 CI 性能分析

对遥测数据执行 SQL 查询。

Terminal window
# 内联 SQL
framedash query "SELECT event_name, count() FROM events GROUP BY event_name"
# 从文件读取
framedash query --file ./queries/daily-active.sql
选项说明
--file <path>从文件读取 SQL 而非内联参数
--limit <n>返回的最大行数

管理性能告警规则。

Terminal window
# 告警规则列表
framedash alerts list
# 创建新告警规则
framedash alerts create --name "FPS Alert" --map-id <uuid> \
--threshold-profile-id <uuid> --metric fps --threshold-level warn \
--fail-percentage 20 --evaluation-days 7 --cell-size 25 \
--cooldown-minutes 60
# 更新告警规则
framedash alerts update <alert-id> --name "Updated Alert"
# 停用告警规则
framedash alerts delete <alert-id>

管理告警规则引用的性能阈值配置(每个指标的 warn/good 区间)。

新创建的项目会自带一个自动创建、名为 Default 的配置(设备筛选全部为通配符,阈值为内置默认值),因此告警规则可以立即引用配置,之后再自定义或新增。

Terminal window
# 阈值配置列表
framedash threshold-profiles list
# 创建阈值配置
framedash threshold-profiles create --name "Console 60fps" \
--fps-good 60 --fps-warn 30 --platform windows
# 删除阈值配置
framedash threshold-profiles delete <profileId>

framedash threshold-profiles create@framedash/cli 0.1.7 及更高版本)用于创建配置。--name 为必填(最多 100 个字符)。阈值成对参数为可选,省略时回退到内置默认值:--fps-good / --fps-warn(FPS)、--frame-time-good / --frame-time-warn(毫秒)、--memory-good / --memory-warn(MB)、--gpu-time-good / --gpu-time-warn(毫秒)。FPS 越高越好(good 大于 warn),其余越低越好(good 小于 warn)。设备筛选(--platform--resolution,如 1920x1080--build-config--gpu--storage)为可选,省略的筛选按通配符处理。创建需要具备 resources:write 作用域的 API 密钥,或在运行 framedash login 时通过 --scopes 包含 resources:write 而获得的 OAuth 会话(默认登录仅请求 analytics:read);服务器会以 409 拒绝重复的名称或完全相同的设备筛选组合(五个筛选全部相等),而部分重叠的组合可以创建成功,命令会报告重叠的配置名称。成功时 CLI 打印 Threshold profile created 及创建的配置。

framedash threshold-profiles delete <profileId>@framedash/cli 0.1.8 及更高版本)用于删除配置。此命令需要具备 resources:write 作用域的 API 密钥,或在运行 framedash login 时通过 --scopes 包含 resources:write 而获得的 OAuth 会话(默认登录仅请求 analytics:read)。仍被告警规则引用的配置(作为主阈值配置或捆绑成员)会被服务器以 409 拒绝。停用告警规则并不会解除该限制,因此请先用 framedash alerts update <alert-id> --threshold-profile-ids <...> 将这些告警规则指向另一个配置。

管理游戏地图。

Terminal window
# 地图列表
framedash maps list
# 通过地图标识符删除
framedash maps delete <map-id>

此处指定的标识符是你在捕获地图时赋予的 mapId slug,而不是内部的 UUID 主键。

上传捕获的地图图像。此命令使用独立的选项解析器,不使用共享的全局选项。

Terminal window
# 上传预览(试运行)
framedash map-capture --input-dir ./captures --upload --dry-run
# 上传地图捕获
framedash map-capture --input-dir ./captures --upload \
--api-key fd_xxx --project-id <uuid>
选项说明
--input-dir <path>捕获图像目录(必需)
--upload实际执行上传(必需)
--api-key <key>上传用 API 密钥
--project-id <uuid>目标项目
--base-url <url>API 基础 URL
--dry-run预览但不发送
--metadata-pattern <glob>仅读取匹配的 JSON 边车(例如 *.capture.json

--input-dir 以非递归方式扫描。默认情况下,每个 *.json 文件都被视为捕获元数据 sidecar。如果同一目录还包含无关 JSON,请使用 --metadata-pattern '*.capture.json' 并相应命名 sidecar。--metadata-pattern 未包含在 @framedash/cli 0.1.7 中;请安装更新的版本,并在使用前确认 framedash map-capture --help 中已列出该选项。命令会读取并校验每个选中的 JSON,然后上传其引用的图像。sidecar 通过 image_path 指向图像,该路径相对于输入目录解析。绝对路径以及逃逸出目录的路径会被拒绝,但输入目录内的子目录是允许的。支持的图像格式为 .png.jpg.jpeg.webp

必需字段:

字段类型说明
version字符串必须是字面量 "1.0"
map_id字符串1~128 个字符
image_path字符串相对于 --input-dir 的路径
image_dimensions对象{ "width", "height" },正整数
world_bounds对象{ "min": {x,y,z}, "max": {x,y,z} },有限数值。max.x 必须大于 min.xmax.y 必须大于 min.yz 无约束。取值为引擎世界单位(例如 Unreal Engine 中为厘米)

可选字段:

字段类型说明
projection字符串自由文本
capture_axis字符串自由文本
coordinate_system字符串自由文本
engine字符串自由文本
build_id字符串最多 255 个字符
captured_at字符串ISO 8601 日期时间

完整示例。将 sidecar arena.json 与其图像 arena.png(1024x1024 的俯视捕获)一起放到 ./captures 中:

{
"version": "1.0",
"map_id": "arena_dust",
"image_path": "arena.png",
"image_dimensions": { "width": 1024, "height": 1024 },
"world_bounds": {
"min": { "x": -8192, "y": -8192, "z": 0 },
"max": { "x": 8192, "y": 8192, "z": 2048 }
},
"engine": "UE5",
"captured_at": "2026-07-16T09:30:00Z"
}

先用 --dry-run 校验。它不需要凭据,也不会上传任何内容:

Terminal window
framedash map-capture --input-dir ./captures --dry-run

试运行会为每个文件打印一行(map_id=..., image=..., bounds=[minX,minY]→[maxX,maxY], size=WxH),随后是 Done: N succeeded, M failed 摘要;只要有任何文件校验失败,就以退出码 1 结束。当它报告没有失败后,再实际上传。上传是向 /api/v1/maps/upload 发起的 multipart POST,需要具有 resources:write 作用域的 API 密钥:

Terminal window
framedash map-capture --input-dir ./captures --upload \
--api-key fd_xxx --project-id <uuid>

管理内容注册表(物品、武器、事件类型等)。

Terminal window
# 内容条目列表
framedash content list
# 从 JSON 文件导入内容
framedash content import ./game-content.json
# 通过 UUID 删除
framedash content delete <uuid>
# 通过类型和内容 ID 删除
framedash content delete --type weapon --content-id ak47

导入 JSON 可以是数组或 { "entries": [...] }。每个条目都需要非空字符串字段 contentTypecontentIddisplayName。可选的 descriptioncategory 必须是字符串或 nullmetadata 必须是对象或 null。发送请求前的校验错误会指出从 1 开始的条目编号。

每小时的 API 速率限制按账户(租户)计量,由该账户拥有的所有项目和 API 密钥共享。免费计划为每小时 100 次请求,更高计划则更多。由于额度共享,并行的 CLI 调用和不同的密钥都会消耗同一个池。

遇到 429 时,请每次都遵循 Retry-After 响应头,而不要围绕 X-RateLimit-Reset 时间戳来安排重试。两个值都由滑动窗口计算得出,因此在所公布的重置时刻刚过之后,它们可能低估实际等待时间,恰好在重置时刻重试可能再次触发 429。

GitHub Actions 示例:

- name: Upload maps and import content
env:
FRAMEDASH_API_KEY: ${{ secrets.FRAMEDASH_API_KEY }}
FRAMEDASH_PROJECT_ID: ${{ vars.PROJECT_ID }}
run: |
framedash map-capture --input-dir ./map-captures --upload
framedash content import ./game-content.json

Jenkins 和 TeamCity 示例请参阅 CI/CD 集成指南