Skip to main content

概述

Flashduty CLI(flashduty)是一款命令行工具,可在终端中完成故障生命周期管理、值班查询、状态页发布、通知模板调试等操作,适用于运维脚本、本地排障以及与 AI 编程代理协同工作。 工具开源在 flashcatcloud/flashduty-cli,支持 macOS、Linux 和 Windows。

安装

默认安装到 /usr/local/bin,可通过环境变量 FLASHDUTY_INSTALL_DIR 自定义。

安装选项

认证

登录

按提示输入 APP Key。获取方式:登录 Flashduty 控制台,进入 个人中心 > 个人信息,复制 APP Key。

凭证解析顺序

CLI 按以下优先级查找 APP Key(高优先级在前):
  1. --app-key 命令行参数(脚本场景使用)
  2. FLASHDUTY_APP_KEY 环境变量
  3. 配置文件 ~/.flashduty/config.yaml(由 flashduty login 写入)

配置文件

存储在 ~/.flashduty/config.yaml,权限为 0600:

配置命令

全局参数

所有子命令均支持以下参数:

命令清单

incident — 故障生命周期

incident list 常用过滤参数: 时间格式示例:5m、1h、24h、168h、2026-04-01、2026-04-01 10:00:00、1712000000。

工作项与跟进项(work-item-*)

incident work-item-* 管理挂靠在故障或复盘上的工作项,--item-type 区分两种类型:action(故障行动项,挂靠进行中的故障)与 follow_up(复盘跟进项,必须绑定复盘 ID)。
work-item-create 关键参数:--item-type(必填,action 或 follow_up)、--title(必填,最多 512 字符)、--idempotency-key(必填幂等键,最多 128 字符)、--post-mortem-id(follow_up 必填,action 禁止)、--assignee-ids(初始负责人,旧别名)。更新类操作(update/complete/convert/delete/assignees-reset)均需传 --version(乐观锁,必须与当前存储版本一致)。 工作项的负责人可以是成员,也可以是本账户的 AI SRE:
  • work-item-create 与 work-item-assignees-reset 接受 assignees 字段(每项形如 {type, id?},type 取 person 或 ai_sre;ai_sre 项不带 id,最多 20 项),该字段只能通过 --data 传 JSON。--assignee-ids 是等价的旧别名(相当于全部为 person),两者互斥,同时传会报错。
  • work-item-list 新增 --assignee-type person|ai_sre:ai_sre 返回指派给 AI SRE 的事项(AI 调用方用它列出自己的任务),此时不需要 --assignee-id,--assignee-id 也会被忽略;person 搭配 --assignee-id 只返回该成员负责的事项。省略本字段且 --assignee-id 为正数时按 person 过滤。
  • 工作项响应里的 assignee_ids 现在只包含人员负责人(不含 AI SRE),完整负责人列表在 assignees;由 AI SRE 执行的事项还会返回 agent_session_id 与 agent_session_venue(web 或 im),没有关联会话时这两个字段省略。

复盘报告(post-mortem-*)

复盘命令位于 incident 命令组下(没有独立的 post-mortem 顶层命令组):
模板命令:post-mortem-template-list、post-mortem-template-info <template-id>、post-mortem-template-upsert(缺省 --template-id 时为创建,创建时 --team-id 必填)、post-mortem-template-delete <template-id>(不可逆)。

评论类型(comment-type-*)

change — 变更记录

支持 --channel、--since、--until、--type、--limit、--page。

member — 成员查询

member list 支持 --query(姓名/邮箱关键字搜索)、--role-id、--member-id(按成员 ID 过滤,只返回该成员)、--page、--limit、--orderby、--asc。 member info-reset 通过 --member-id、--member-name、--email、--phone 或 --ref-id 之一定位成员,要修改的字段经 --data '{"updates":{...}}' 传入(必填);--from api 在账户关闭成员邀请时,可将更新后的邮箱/手机号直接标记为已验证。 member invite 的成员列表经 --data '{"members":[...]}' 传入;当账户关闭成员邀请且指定 --from api 时,成员会直接以启用状态创建(邮箱/手机号标记为已验证),不再发送邀请邮件。

team — 团队管理

team list 支持 --query(团队名称子串匹配)、--page、--limit、--orderby(created_at/updated_at/team_name)、--asc、--person-id(按成员 ID 过滤所属团队)。 team info 支持通过 --ref-id、--team-name 或 --team-id 指定团队(三选一);同时提供多个字段时,按 --ref-id > --team-name > --team-id 的优先级取用。 team upsert 创建或更新团队:
  • --team-name(必填,1–39 字符)
  • --team-id(填写则为更新,否则创建)
  • --description(最多 500 字符)
  • --person-ids(成员 ID 列表;会完整替换现有成员名单,更新前请先用 team info 确认当前成员)
  • --emails(按邮箱匹配并加入已存在的成员;不匹配任何现有成员的邮箱会被静默忽略,不会发送邀请)
  • --phones(按手机号匹配并加入已存在的成员;不匹配的号码会被静默忽略,非 E.164 格式的号码按 --country-code 解析)
  • --country-code(对非 E.164 格式的 --phones 号码应用默认国家码)
  • --ref-id(外部系统引用 ID)
team upsert 的 --emails / --phones 只匹配并附加现有成员,不会发送任何邀请。需要邀请新成员加入组织时,请使用 flashduty member invite。
team delete 支持通过 --team-id、--team-name 或 --ref-id 指定团队,操作不可逆。

channel — 协作空间查询

支持 --name。

channel escalate-rule-list — 分派策略查询

分派策略现已并入 channel 命令组,通过位置参数传入协作空间 ID:
其他分派策略管理命令:escalate-rule-create、escalate-rule-update、escalate-rule-delete(均在 channel 命令组下,--channel-id 为必填)。

channel 静默/抑制/丢弃规则 — 降噪规则管理

协作空间级降噪规则通过 channel 命令组管理,规则语义与配置项参见降噪管理。三组命令(silence-rule-* 静默、inhibit-rule-* 抑制、unsubscribe-rule-* 丢弃)形态相同,各含 list/create/update/enable/disable/delete 六个动作:
inhibit-rule-* 与 unsubscribe-rule-* 用法相同;inhibit-rule-create 需 --equals(源与目标告警的配对标签键)。silence / inhibit 均可加 --is-directly-discard 让被抑制的告警直接丢弃而非合并。注意 *-rule-create 与 *-rule-list 的 channel-id 是位置参数,*-rule-update/delete/enable/disable 使用 --channel-id 标志;--rule-id 为 MongoDB ObjectID 字符串。

field — 自定义字段查询

支持 --name。

status-page — 状态页管理

事件草稿(draft-create)

draft-create 保存一份状态页事件草稿(故障事件或维护窗口),供人工在控制台审阅后发布——草稿本身不会对外发布:
  • --source:起草来源的不透明标记(如 ai_sre:sess_xxx),最多 64 字符。
  • --data 中的 draft 对象(必填,序列化后最多 64 KB,原样存储)。必填字段:page_id、type(incident 或 maintenance)、name、message;可选 change_id(大于 0 时表示向已有事件追加更新)、status、affected_components、start_time/end_time(Unix 秒,仅新建维护窗口使用)。
  • 响应返回 draft_id(形如 draft_[A-Za-z0-9]{22})与 created_at,控制台审阅链接携带 draft_id。

从 Atlassian Statuspage 迁移

迁移任务为异步执行,需通过 migration-status 轮询进度:
其他可用子命令:draft-create、change-delete、change-info、change-list、change-timeline-delete、change-timeline-update、change-update、component-upsert、component-delete、section-upsert、section-delete、info、subscriber-list、subscriber-import、subscriber-export、template-list、template-upsert、template-delete。

rum — RUM 应用与会话回放

用于管理 RUM 应用和导出会话回放数据。应用命令覆盖详情、批量读取、列表、Webhook 测试,以及创建、更新、删除。
application-list 常用参数: application-create / application-update 的核心字段: --data 里的 repositories 把应用关联到构建它的代码仓库:有序数组,第一项为主仓库,最多 10 项,每项为 repo(owner/name 形式的 GitHub 仓库,必填)加可选的 subdir(应用在仓库内所在的目录,相对仓库根目录,. 表示仓库根目录,传空值会保存为 .)。创建时传入即建立关联;更新时按 presence 处理——传入即整体替换、传空数组清空全部关联、省略则保持不变;application-info、application-infos、application-list 都会回显该字段。关联本身不授予任何访问权限:AI 会话只能读取账户 GitHub App 安装已授权的仓库(见 应用与集成)。该字段目前仅通过 API 与 CLI 提供,控制台的应用管理页不暴露仓库关联设置。
application-webhook-test 会返回 ok、status_code 和 message,可用于验证 RUM 告警 Webhook 是否真正收到了平台发出的测试事件。

远程配置(application-remote-config-*)

远程配置按应用维护一份采集与隐私参数,发布后由 SDK 在下一个新会话生效。控制台侧的配置项含义、发布与生效方式见 应用管理 · 远程配置:
完整配置(config 对象:enabled、activation、default、rules、custom、refresh_on_foreground)经 --data 传入;--data 也可携带整个请求体,位置参数与具名标志会覆盖其中的同名字段。 发布与回滚都会分配一个新版本号(回滚不会复现旧版本号)。配置变更对新会话生效:activation 为 next_session(默认)时运行中的会话不受影响,为 immediate 时客户端收到配置后结束当前会话、由新会话按新配置运行;发布 enabled: false 可关闭配置下发,各端回落到 SDK 初始化设置。

会话回放

session-replay-metadata 的 --ts 可填写会话开始时间的 Unix 毫秒时间戳,用于区分不同时间窗口中复用的会话 ID。 session-replay-segments 常用参数:

错误摄入规则(error-ingestion-rules-*)

错误摄入规则按过滤条件筛除或改写应用上报的错误事件:
--description 最长 512 字符;create/list/history-list/history-revert 以位置参数接收 application-id,update/enable/disable/delete 通过 --application-id 与 --rule-id 标志指定目标。

预设严重级别规则(issue-preset-severity-rules-*)

预设严重级别规则为匹配条件的错误预设等级,用于 issue 分级:

资源信息(resource-info)

oncall — On-call 许可证

该命令只读,返回成员 ID、名称及许可证类型:fixed 表示固定分配,temporary 表示当前临时许可证窗口内生效。

template — 通知模板

支持的通知渠道:dingtalk、dingtalk_app、feishu、feishu_app、wecom、wecom_app、slack、slack_app、telegram、teams_app、email、sms、zoom。

session — AI SRE 会话

用于巡查 AI SRE(以及其他 Flashduty 智能体)的会话:session list 列出调用者可见的会话,session export 将单个会话的完整事件流式导出,便于离线分析。
session list 常用参数:
服务端 /safari/session/list 单页上限为 100 条,超出 --limit 时 CLI 会自动向服务端翻页拉取,无需手动分页。API 本身没有时间窗口过滤,--since 是在拉取后于客户端按会话的 updated_at 进行过滤的。
session export 将会话事件以换行分隔 JSON(NDJSON)流式写入标准输出:第一行始终是 session_meta 信封,其后每行是一个事件(user_message、llm_call、tool_call、subagent_dispatch、final_answer、agent_text、error)。导出内容可能很大,建议重定向到文件而非直接打印到终端:

monit-query — 监控数据源统一工具调用

monit-query 对已配置的数据源执行单个命名工具,是查询与诊断的统一入口:查询工具(<type>.query,覆盖 prometheus、mysql、postgres、oracle、clickhouse、elasticsearch、loki、victorialogs、sls、tencent_cls)与诊断工具(如 mysql.overview、redis_node.slowlog)都走它,无需经过告警规则层。旧 monit-query data 子命令已退役。数据源 ID 从 monit datasource-list 的 id 字段获取:
查询工具与诊断工具的 Edge 版本门禁不同:查询工具经 Explore 执行路径提交,要求所选集群内全部当前在线可路由的 Edge 会话支持 Explore 查询协议 v0.68.0;诊断工具经基础调用协议提交,要求 v0.71.0(详见下文 monit datasource-tools-invoke)。版本不满足时命令直接失败并返回错误码:edge_upgrade_required(Edge 版本过低)、mixed_edge_versions(集群内 Edge 版本混合,只有部分会话支持)、edge_version_unknown(集群内存在版本无法识别的 Edge)、no_active_edge(没有可用的在线 Edge);收到这些错误时不要轮换 Edge、也不要回退到旧版入口。 查询工具返回完整的 explore_result.v1 结构化结果:format 固定为 explore_result.v1,result.kind 为 samples(带完整标签集的即时样本)、frames(类型化表格/时序帧)或 logs(原始日志,含 applied_limit 与 has_more)三者之一。诊断工具的返回结构见下文 monit datasource-tools-invoke。

monit datasource-tools-invoke — 数据源诊断工具

monit datasource-tools-invoke 对已配置的数据源执行一次确定性的只读工具调用,是结构化数据源诊断的现行路径(取代 monit-query diagnose),与上文 monit-query 命令等价,monit-query 为推荐路径。数据源 ID 从 monit datasource-list 的 id 字段获取:
语义与限制:
  • 无工具目录、无自动重试、无回退:一次调用只执行一个命名工具,参数需按各数据源工具约定填写,不要从命令行列表猜测。除诊断工具外,入口还支持 <type>.query 查询工具(prometheus、mysql、postgres、oracle、clickhouse、elasticsearch、loki、victorialogs、sls、tencent_cls)。
  • 要求所选集群内全部当前在线可路由的 Edge 会话支持 v0.71.0 基础调用协议(个别工具可能要求更新的实现);查询工具(<type>.query)走 Explore 执行路径,另有 Explore 查询协议 v0.68.0 的下限——集群只支持旧版时查询工具同样失败,不会回退到旧入口。
  • 请求体 ≤128 KiB;完整成功响应 ≤10 MiB;工具超时 ≤25 秒。
  • 需要数据源 enabled=true;alerting_enabled=false 不阻塞诊断。
  • 返回值:data(工具特定的 JSON 证据,原样保留、永不为 null,不含旧 diagnose 信封)、tool、datasource_id、可选 summary,以及 truncated 对象(含 reason,存在即表示结果被截断)。
错误按原样返回,常见错误码:edge_upgrade_required(Edge 版本过低)、mixed_edge_versions(集群内 Edge 版本混合)、edge_version_unknown(集群内存在版本无法识别的 Edge,查询工具路径返回)、no_active_edge(无可用在线 Edge)、tool_not_supported(工具不支持)、invalid_request(修正参数)、source_too_large / result_too_large(收窄请求范围)。出现 Edge 版本问题时不要轮换 Edge 或回退到旧版 diagnose。

monit — 监控数据源与规则表达式预览

如果你想在保存规则前直接验证某条数据源表达式,可以使用 preview-sync 走一条同步预览请求,拿到原始结果。
常用参数:

数据源管理(datasource-*)

monit datasource-* 命令族管理监控数据源(由 OpenAPI 生成命令提供):
datasource-create / datasource-update 核心字段: enabled 与 alerting_enabled 相互独立:告警评估同时要求 enabled=true 与类型支持告警;alerting_enabled=false 不阻塞非告警查询与诊断工具,monit datasource-list 返回的 alerting_enabled 对仅诊断类型恒为 false。 诊断类型 payload 与密钥处理:
  • redis_node:database(Redis 库号,默认 0)、username / password、timeout_ms(默认 3000,范围 1000–10000)。
  • redis_sentinel:username / password、timeout_ms(默认 3000)。
  • mongodb_mongod / mongodb_mongos:auth_source(认证库,默认 admin;用户名与密码须成对配置)、username / password、timeout_ms(默认 3000)、TLS 字段;不支持客户端证书。
  • kafka:sasl_mechanism(none 默认 / plain / scram-sha-256 / scram-sha-512,后三者需用户名与密码)、username / password、timeout_ms(默认 5000)、TLS 字段(tls_min_version 默认 1.2,最高 1.3)。
  • 密码与 kafka.tls_key 支持 ${env:NAME} 引用(在 Edge 上解析);字面值不会出现在响应中,仅 ${env:...} 引用会回显。更新时省略这些字段以保留已存密钥,显式传空字符串表示清除。

prometheus-api-v1-label-{label_name}-values — 查询 Prometheus 标签值

GET /monit/prometheus/api/v1/label/{label_name}/values(operationId monit-prometheus-read-label-values)带路径参数,因此不参与代码生成,由手工实现命令提供。命令名沿用生成命令的路径派生写法(monit 组 + 路径剩余段连字符拼接),因此在 flashduty monit --help 下可见、但无法按直觉猜到,需要按本节的写法使用:
返回体是数据源原生的 Prometheus 载荷,不带 Flashduty 的 {request_id, error, data} 信封:成功时为 {"status":"success","data":["api","db","worker"]}。数据源自身拒绝查询时(如标签名不存在),命令以非零退出码失败,错误文本是数据源(或 Monitors 代理)返回的原始内容——Prometheus 的原生错误形如 {"status":"error","errorType":"bad_data","error":"unknown label name"},与 Flashduty 的错误码体系无关。
本命令只取某个标签的取值集合;要按表达式取时序数据或做更复杂的 PromQL 查询,请用上文的 monit-query <datasource-id> --tool 'prometheus.query'。

alert — 告警与告警事件查询

两个 list 命令常用过滤参数:--severity(Critical,Warning,Info)、--channel(逗号分隔协作空间 ID)、--integration(逗号分隔的集成 ID)、--since/--until、--limit(最大 100)、--page。alert-event list 另有 --integration-type,按逗号分隔的插件键过滤(如 AliCloud,Prometheus)——注意它取插件键而非集成 ID,按集成 ID 过滤请使用 --integration。

automation — AI SRE 自动化规则

automation 命令组管理 AI SRE 的自动化规则——创建、查询、更新、删除、运行历史与触发,页面操作见自动化。
create 常用参数: update 可改字段:--name、--prompt/--prompt-file、--schedule/--at/--weekday/--cron-expr、--enable/--disable、--enable-schedule/--disable-schedule、--enable-http-post-trigger/--disable-http-post-trigger、--rotate-http-post-token、--environment-kind/--environment-id。个人 / 团队作用域创建后不可变更,update 不提供改作用域的参数。 runs 支持 --status(queued/running/retrying/succeeded/partial/failed/skipped/abandoned)、--trigger-kind(schedule/debug/http_post)、--since/--until、--page、--limit。fire 用触发器的 Token 鉴权(--token,或环境变量 FLASHDUTY_AUTOMATION_TRIGGER_TOKEN),--text 传本次运行的上下文,--data 传完整 JSON 请求体(内联 JSON 或 - 读 stdin)。
时区语义:--at 与 --cron-expr 均按规则时区的本地挂钟时间理解——规则时区在创建时默认为调用者的成员时区,成员未设置时回退到账户时区。请直接传用户的本地时间,不要预先换算成 UTC。CLI 的 create / update 都没有 --timezone 参数:创建时如需固定其它时区,请改用生成命令 flashduty safari automation-rule-create --timezone;已创建规则的时区在 update 中不可更改。

insight — 洞察查询

insight 命令族按时间窗口查询聚合的故障指标(响应时间、通知数等):
insight incidents 常用参数: json/toon 模式默认按紧凑字段投影:incident_id、title、severity、channel_name、seconds_to_ack、seconds_to_close、notifications(默认投影时 stderr 会提示可用 --fields 更换),输出受 16 KiB 上限约束,超出时行会被丢弃或单行截短,提示只写 stderr(详见下文「输出格式」的「结构化输出的字段投影」)。 insight top-alerts:--label 必填(check 或 resource),--since/--until 同前,--limit 默认 10(Top-K),返回每个标签值的告警数与事件数。 insight incident-export:按当前筛选条件输出一行 CSV(重定向到文件;--start-time/--end-time 为 Unix 秒)。导出端点单次返回且服务端会静默截断行数,因此命令写完后会核对 CSV 数据行数与同筛选条件 incident-list 的总数:不足时 CSV 仍会写出(stderr 打印 rows=N),并以非零退出码提示实际写出 vs 总数——请收窄时间窗口后重试。

全量命令覆盖

除上述精选命令外,CLI 现已通过 spec 驱动的代码生成实现对 Flashduty OpenAPI 的全量覆盖。CLI 生成器读取的 OpenAPI 规范含 338 个 API 操作,CLI 为其中 334 个 生成对应命令,其余 4 个以手工实现命令提供——流式导出的 session-read-export(session export)、multipart 表单上传的 mapping-data-write-upload 与 skill-write-upload(enrichment mapping-data-upload、safari skill-upload)、带路径参数的 monit-prometheus-read-label-values(monit prometheus-api-v1-label-{label_name}-values,见下文「查询 Prometheus 标签值」)——并与生成命令一并按资源组织为顶层命令组。除 On-call 域(incident、incident-trigger-subscription、change、channel、field、status-page、template 等)外,还覆盖了:
  • AI SRE(safari):a2a-agents、artifacts、automations、knowledge、mcp-servers、sessions、skills 等
  • 告警与降噪:alert、alert-event、enrichment(alert-rules、rule-sets)、route
  • On-call 与日程:calendar、schedule
  • 平台管理:account、member、person、team、role(roles-permissions)、audit(audit-logs)
  • 监控与 RUM:monit、rum、sourcemap
  • 集成与 Webhook:datasource(IM 集成)、webhook(integrations)
这些生成命令的叶子名称采用「资源-动作」形式(如 flashduty safari a2a-agent-get、flashduty safari session-list),其入参与返回字段直接映射到对应 API。鼓励用 flashduty <资源> --help 逐层探索:
生成命令的时间窗口参数(--start-time / --end-time)与精选命令一样支持人性化的时间格式:相对时长(7d、24h,表示从当前往前推)、+7d(从当前往后推,即未来时间)、now、日期或日期时间(如 2026-05-01、2026-05-01 10:00:00)、Unix 秒级时间戳。此外,--since 和 --until 分别是 --start-time 和 --end-time 的别名,可互换使用;若两种写法同时传入且取值不同,CLI 会报冲突错误。

knowledge — AI SRE 知识

safari knowledge-* 命令族管理 AI SRE 的知识——账户或团队作用域下的版本化文件树(DUTY.md 加运行手册、FAQ、服务清单等),会话开始时会被加载进每个 AI SRE 沙箱。知识的完整功能模型(DUTY.md 结构、@引用、账户/团队作用域、文件约束)参见 管理知识。
常用参数: knowledge-file-put 的 --content-b64 必须是合法 UTF-8 文本的 Base64 编码,--content-type 省略时按文件扩展名推断。knowledge-file-delete 默认在文件仍被其他知识文件引用时阻止删除;加 --force 可强制执行,此时引用方会以警告形式返回。

artifacts — AI SRE 产物库

safari artifact-* 命令族管理 AI SRE 会话产出的产物(Artifact)——发布到产物库、共享与签名下载,产品功能见产物:
公开分享与签名语义:
  • public_url 是控制台 /share/artifact/<artifact-id> 页面,完全由 CDN 提供;仅在分享期间存在,任何拿到链接的人无需登录即可查看。
  • 公开快照按产物当前的 file_id 物化:当 share_enabled=true 且响应中 share_file_id 与 file_id 不一致时,公开快照已过期——调用 artifact-gallery-share-sync 刷新后再对外引用。
  • artifact-sign 的签名 token 绑定调用账户与成员,有效期 5 分钟(响应 expires_in);download_url / preview_url 是相对路径(/safari/artifact/stream?...),使用时需拼接 API base(https://api.flashcat.cloud)。
  • 产物初始作用域继承来源会话(个人会话的产物归创建者个人,绑定团队的会话的产物归团队);can_edit 决定调用者能否重命名/转移/删除/分享(创建者、所属团队成员或源会话管理者)。

工具命令

flashduty update 会下载并执行平台安装脚本,将当前二进制替换为最新版本。--check 仅打印可用版本号,不修改本地文件。在终端中执行其他命令后,若检测到有新版本可用,CLI 会在 stderr 自动输出更新提示横幅。
启用 Shell 自动补全示例(zsh):

输出格式

通过 --output-format 选择输出形态(--json 是 --output-format json 的别名),便于在不同场景下消费:
人类可读,列对齐,长字段截断显示。

生成命令的输出上限

由 OpenAPI 代码生成提供覆盖的生成命令(如 safari session-list、monit datasource-list、safari a2a-agent-list 等),其 json / toon 输出对列表形态的响应按 16 KiB 上限处理。缩减分三级,另外会有一个机读标记:
  1. 整页超限:只输出能完整放下的前几行,每个值保持原样,stderr 提示实际输出了 N/M 行、其余行未输出。
  2. 单行本身超限:该行的字符串值以 ... 截短,stderr 点名被截字段;标识符字段(以 _id / _key 结尾)不会被截短。
  3. 行无法缩减到上限以内:命令报错并点名字节数最大的字段(最多 3 个),请调低 --limit 或减少输出字段后重试。
列表信封会被重建并写入缩减标记。列表信封指行数组名为 items / docs / list、同级只有 total、has_next_page、search_after_ctx 等标量字段的响应(如 monit datasource-list、safari session-list);一旦发生缩减,CLI 会重建该信封并在 payload 中补写字段,脚本无需解析 stderr 也能发现缩减:
  • 整行被丢弃:写入 truncated: true 与 emitted_rows: N(N 为实际输出的行数)。此时信封中的 total、has_next_page、search_after_ctx 仍是服务端原始分页的原样回显,不能用来判断是否已取全——被截成「100 行中前 7 行」的一页照样带着原来的分页字段。要取全请按实际收到的行数收窄 --limit 重新请求,再沿返回的游标继续翻页。
  • 只有长值被截短(没有丢行):只写 truncated: true,stderr 会点名被截字段。重新请求无法找回这些值,请收窄筛选条件、减少每页行数,或改用支持字段投影的精选命令。
顶层数组形态的响应(如精选命令 incident list、insight incidents)没有信封可承载标记,缩减仍只写 stderr。 明细形态的单个对象(如 safari session-get 的详情)不做截断、原样输出——截短后的值无法与真实短值区分,因此这类响应不受上限约束。生成命令大多没有可收窄输出的标志(个别命令的 --fields 是请求体的字段选择器,不作用于输出);需要完整 JSON 时请通过 --limit 调小每页数量、配合 --page 分页逐页拉取(如 flashduty safari session-list --limit 20 --page 2),或按需收窄筛选条件。

结构化输出的字段投影

以下命令在 json 或 toon 输出时支持 --fields。用逗号分隔顶层响应字段;未知字段会直接报错,表格输出会忽略此参数。 例如,只导出故障编号、标题和处理进度:
列表投影(incident list、incident similar、alert-event list、channel escalate-rule-list、insight incidents)超过 16 KiB 上限时,CLI 按三级行为处理,所有提示只写 stderr、不改写 stdout:
  1. 整页超限:只输出能完整放下的前 N 行,每个值保持原样、不再截短,stderr 提示实际输出了 N/M 行、其余行未输出;收窄 --fields 或调低 --limit 可让每页容纳更多行。
  2. 单行本身超预算:截短该行的字符串值并以 ... 标记,stderr 点名被截短的字段;在被截短过的字段上匹配或过滤会漏数据,需要原始值时请收窄 --fields 或 --limit。标识符字段(以 _id 或 _key 结尾)在任何一级都不会被截短。
  3. 行无法缩减到上限以内:命令报错并点名字节数最大的字段(最多 3 个,含各自字节数),请减少 --fields 字段或调低 --limit 后重试。
incident detail 的投影超限行为不同:详情是单个对象,截断后的值与本身就很短的真实值无法区分,静默截短会返回错误数据,因此投影超过 8 KiB 时命令直接失败,错误信息会点名最大的字段(最多 3 个,含各自字节数)。此时请减少 --fields 中的字段,或直接省略 --fields 获取不受投影上限约束的完整详情。 未指定 --fields 而使用默认紧凑投影时,CLI 会在 stderr 打印一行提示,说明当前投影使用的字段、以及可通过 --fields 选择其他字段。该提示只写 stderr、不改写 stdout,管道给 jq 等工具时输出保持不变。

Agent Skills

Flashduty CLI 内置一个名为 flashduty 的 Agent Skill,可让 Claude Code、Cursor、Codex、Gemini CLI、Windsurf 等 AI 编程代理通过 CLI 操作 Flashduty。 一键安装到当前机器上检测到的所有代理:
技能采用「路由 + 参考卡」结构:SKILL.md 承载认证、全局参数、安全规则等共享约定,并按领域索引参考卡——故障、告警、变更、值班与排班、协作空间与分派、状态页、洞察、监控、RUM 与 sourcemap、自动化、通知模板、成员与团队等。代理执行任务前先读取对应领域的参考卡,即可获得该领域的全部命令、参数与工作流,无需 --help 试探。

常见用法

通过 flashduty incident get <id> 在终端中快速查看故障详情,可将命令片段嵌入到通知模板里供值班同学一键复制。
然后通过 jq 处理或导入数据仓库。
将上述命令加入 CI,可在模板提交时立即捕获语法或字段错误。
完整源码和问题反馈请访问 GitHub 仓库。