# License Manager 管理控制台 用户使用手册

| 项目 | 说明 |
| ---- | ---- |
| 文档版本 | v1.4 |
| 适用系统 | License Manager Admin Console |
| 适用读者 | 系统管理员（admin）、运营人员（operator）、支持人员（support）、终端客户（customer） |
| 更新日期 | 2026-09 |

> v1.1 变更：补注 `LicenseType` 完整 8 种枚举（§4）；§8.3 "最后一名 active admin 不可删除" 条款与服务端已实现守卫对齐。
>
> v1.2 变更（按第四轮审查 R4-D 核对 UI）：§9.1 Webhook 端点列表列集合更正为实际 UI（名称 / URL / 订阅事件 / 启用状态 / 创建时间 / 操作，**无"最后触发时间"列**）；§13 角色矩阵补充第四个内置角色 `customer`（终端客户：仪表盘 + 工单 + 知识库）。
>
> v1.3 变更（按代码核对）：§3 系统状态面板引用的后端就绪探针更正为 `/v1/readyz`；§10.3 API 密钥调用方式更正为 `Authorization: ApiKey <keyId>:<secret>`（`X-Api-Key` 请求头并非本平台 API 的认证方式，仅用于浮动许可证服务器）。
>
> v1.4 变更（商业化裁剪，2026-10-08）：移除/标注资金流相关内容——订单管理章节（§7）随商业化下线（资金流移交外部销售系统），仪表盘指标、产品表单、报表中心、菜单分组等描述同步至当前界面实际状态。

---

## 目录

1. [系统简介](#1-系统简介)
2. [登录与界面布局](#2-登录与界面布局)
3. [仪表盘](#3-仪表盘)
4. [产品管理](#4-产品管理)
5. [客户管理](#5-客户管理)
6. [授权管理](#6-授权管理)
7. ~~[订单管理](#7-订单管理)~~（已随商业化裁剪移除，资金流由外部销售系统承接）
8. [用户与权限管理](#8-用户与权限管理)
9. [Webhook 端点配置](#9-webhook-端点配置)
10. [API 密钥管理](#10-api-密钥管理)
11. [报表中心](#11-报表中心)
12. [审计日志](#12-审计日志)
13. [角色权限说明](#13-角色权限说明)
14. [常见问题（FAQ）](#14-常见问题faq)

---

## 1. 系统简介

License Manager 管理控制台是许可证全生命周期管理平台的管理端 Web 应用，提供以下核心能力：

- **产品管理**：维护可授权的产品及其授权模板。
- **客户管理**：维护客户档案，作为授权的归属主体。
- **授权管理**：签发、挂起、恢复、续期、吊销许可证，支持批量操作与向导式发放。
- **用户与权限**：基于 RBAC 的多角色访问控制（admin / operator / support / customer，详见第 13 章）。
- **报表与审计**：用量与激活统计及全量操作审计追踪。

> 订单/支付等商业功能已随商业化裁剪移除，购买与资金流由外部销售系统承接。

界面支持 **中文 / English** 双语切换（右上角语言菜单），并支持亮色 / 暗色 / 跟随系统三种主题模式。

---

## 2. 登录与界面布局

### 2.1 登录系统

**操作步骤：**

1. 打开浏览器，访问管理控制台地址（如 `http://localhost:5173`）。
2. 在登录页输入管理员分配的 **邮箱** 与 **密码**。
3. 点击 **登录** 按钮，认证通过后自动跳转到仪表盘。

![登录页](images/user-manual/01-login-zh.png)

> **提示：** 默认管理员账号由部署时的 `Seed:AdminPassword` 配置决定，生产环境必须由运维显式设置强密码。连续登录失败会触发账户锁定策略（见「登录安全」页面）。

### 2.2 界面布局说明

登录成功后的主界面分为四个区域：

| 区域 | 位置 | 功能 |
| ---- | ---- | ---- |
| 侧边导航栏 | 左侧 | 按业务分组的功能菜单（产品 / 授权 / 合规 / 通讯 / 系统，以及仪表盘、客户、报表等顶级菜单；商业/财务分组已随商业化裁剪移除） |
| 顶部工具栏 | 顶部 | 命令面板搜索（Ctrl+K）、主题切换、语言切换、通知中心、当前用户菜单 |
| 主内容区 | 中部 | 当前页面的业务内容 |
| 页头 | 内容区顶部 | 页面标题、描述与主要操作按钮 |

> **快捷技巧：** 按 `Ctrl + K` 打开命令面板，输入关键词即可快速跳转到任意页面或执行常用操作。

### 2.3 退出登录

点击右上角用户头像菜单，选择 **退出登录**，系统清除会话并返回登录页。

### 2.4 语言与主题切换

**切换界面语言：**

1. 点击顶部工具栏的 **语言图标**（🌐）。
2. 在下拉菜单中选择 **简体中文** 或 **English**。
3. 界面所有菜单、按钮、表单文案即时切换，无需刷新页面；语言偏好保存在浏览器本地，下次登录自动生效。

**切换显示主题：**

1. 点击顶部工具栏的 **主题图标**（☀/🌙）。
2. 可选 **亮色模式** / **暗色模式** / **跟随系统**（随操作系统外观自动切换）。

**通知中心：**

点击顶部工具栏的 **铃铛图标** 打开通知中心，可查看系统通知、单条标记已读或全部标记已读；铃铛上的红色角标显示未读数量。

---

## 3. 仪表盘

登录后默认进入仪表盘，页面分四个区域展示平台核心运营指标：

| 区域 | 作用 |
| ---- | ---- |
| **统计卡片** | 客户总数、授权总数、活跃授权，每项带趋势百分比与色条 |
| **趋势图表** | 近 6 个月授权签发趋势（折线图），仅 admin/operator 可见 |
| **快捷入口** | 4 个高频操作卡片：新建产品 / 新建客户 / 签发授权 / 查看报表 |
| **系统状态** | 实时探测 API 服务、数据库、授权服务、报表服务可达性，并以红/黄圆点标注健康度 |

![仪表盘](images/user-manual/02-dashboard-zh.png)

![仪表盘-快捷入口与系统状态](images/user-manual/02b-dashboard-quick-zh.png)

**统计卡片说明：**

- 每张卡片左侧为大色块图标（紫/青/琥珀/玫红），顶部细色条与图标色相对应。
- 数字旁带 ↑/↓/— 趋势标记，绿色表示同比增长、红色表示下降、灰色表示持平。
- 趋势值是占位展示，正式版本会从后端 `reports/usage` 接口返回的同比/环比计算。

**快捷入口说明：**

- 鼠标悬停时整行向右轻微平移，右侧箭头变为品牌色，提示可点击。
- **查看报表** 仅对 admin/operator 角色可见（support 角色无报表访问权），其他三个入口对所有登录用户显示。
- 点击卡片直接跳转到对应页面的列表视图，可结合页面右上角的「新建」按钮继续操作。

**系统状态说明：**

- 进入页面时会自动对四个服务发起轻量级探活（`page=1&page_size=1`），无需手动刷新。
- 整体状态徽标会显示 **正常**（绿）或 **需关注**（黄），汇总各探活项的结果。
- 该面板为前端主动探活，与后端 `/v1/readyz` 解耦；如需更精细的依赖检查请运维在 K8s 中使用 readiness 探针。

> **角色差异：** support（支持）角色无权访问报表接口，其仪表盘的统计卡片改由列表接口数据推导，且不显示图表区域，**查看报表** 快捷入口也对该角色隐藏，**系统状态** 探活项也相应去掉报表服务（因为发起该探活会触发 403）。这是设计行为，非系统故障。

![仪表盘-支持角色视角](images/user-manual/02c-dashboard-support-zh.png)

---

## 4. 产品管理

产品是可授权对象的基础定义，签发授权前必须先创建产品。

### 4.1 查看产品列表

**路径：** 侧边栏 → **产品** → **产品**

列表页展示产品的名称、SKU、授权类型、价格、状态等信息。

- **搜索**：在搜索框输入产品名称或 SKU 关键字，列表实时过滤（客户端即时搜索，无需回车）。
- **分页**：底部分页栏可切换页码、调整每页条数（10 / 20 / 50）。

![产品列表](images/user-manual/03-products-zh.png)

### 4.2 新建产品

**操作步骤：**

1. 点击页面右上角 **新建产品** 按钮。
2. 在弹出的对话框中填写：
   - **名称**（必填）：产品显示名称。
   - **SKU**：产品唯一编码，便于识别与集成。
   - **授权类型**：永久（perpetual）/ 订阅（subscription）/ 节点锁定（node-locked）/ 浮动（floating）/ 消费型（consumption）。
   - > 完整的 `LicenseType` 枚举共 **8 种**：`NodeLocked`（节点锁定，绑定单一设备）、`Concurrent`（并发/浮动）、`Consumption`（按量消费）、`Subscription`（订阅/限时）、`Perpetual`（永久）、`NamedUser`（命名用户，绑定单一身份）、`Bundle`（捆绑，覆盖多产品）、`Trial`（限时试用）。
   - **描述**：产品说明（可选）。
3. 点击 **创建**，系统提示「产品已创建」，列表自动刷新。

![新建产品](images/user-manual/04-product-create-zh.png)

### 4.3 编辑与删除产品

- 在列表 **操作** 列点击 **编辑**，修改后点击 **保存**。
- 点击 **删除** 并在确认框中确认，即可删除产品。

> **注意：** 已被授权引用的产品删除后，历史授权记录仍保留，但新授权无法再从该产品签发。建议改用「停用」而非删除。

---

## 5. 客户管理

客户是授权的归属主体，签发授权前必须先创建客户。

### 5.1 查看客户列表

**路径：** 侧边栏 → **客户**

列表展示客户名称、邮箱、公司、电话、创建时间等信息。支持按名称 / 邮箱 / 公司 / 电话即时搜索与分页浏览。

![客户列表](images/user-manual/05-customers-zh.png)

### 5.2 新建客户

**操作步骤：**

1. 点击右上角 **新建客户** 按钮。
2. 填写表单：
   - **邮箱**（必填，需符合邮箱格式）：客户唯一标识。
   - **名称**：客户联系人或企业名称。
   - **公司 / 电话**：辅助信息（可选）。
3. 点击 **创建**，系统提示「客户已创建」。

![新建客户](images/user-manual/06-customer-create-zh.png)

> **校验规则：** 邮箱为必填且必须符合格式要求；输入不合法时表单会给出红色错误提示，修正后方可提交。

### 5.3 编辑与删除客户

- **编辑**：操作列点击 **编辑**，修改后保存。
- **删除**：操作列点击 **删除**，二次确认后生效。

---

## 6. 授权管理

授权（许可证）是系统的核心业务对象。本章介绍授权的查询、签发、批量操作与单条运维操作。

### 6.1 查看授权列表

**路径：** 侧边栏 → **授权** → **授权**

列表每行展示：授权 Key、产品、客户、类型、状态、到期时间与操作按钮。

- **搜索**：支持按授权 Key / ID / 产品名 / 客户名 / 客户邮箱即时过滤。
- **状态筛选**：工具栏下拉框可按 `active`（活跃）/ `suspended`（已挂起）/ `revoked`（已吊销）/ `expired`（已过期）筛选。
- **分页**：底部切换页码与每页条数。

![授权列表](images/user-manual/07-licenses-zh.png)

**授权状态流转：**

```
notactivated（未激活）→ active（活跃）⇄ suspended（已挂起）
                              ↓
                        revoked（已吊销，终态，不可恢复）
```

### 6.2 新建授权（快捷表单）

**操作步骤：**

1. 点击右上角 **新建授权** 按钮。
2. 在对话框中填写：
   - **产品 ID**（必填）：从下拉框中搜索并选择目标产品。
   - **客户 ID**（必填）：从下拉框中搜索并选择归属客户。
   - **授权类型**：与产品模板一致或按需覆盖。
   - **最大设备数**：允许激活的设备上限。
   - **到期时间**：留空表示永久授权。
3. 点击 **创建**，系统提示「授权已创建」。

![新建授权](images/user-manual/08-license-create-zh.png)

> **提示：** 快捷表单与「向导发放」（见 6.4）均支持按名称搜索选择产品与客户；向导模式额外提供分步校验与草稿保存，适合批量或复杂参数场景。

### 6.3 批量操作

勾选列表左侧复选框后，列表上方出现批量操作条，显示「已选 N 项」并提供四种批量动作：

| 按钮 | 作用 | 是否可逆 |
| ---- | ---- | ---- |
| 批量挂起 | 将选中授权置为 suspended，暂停使用 | 可恢复 |
| 批量吊销 | 将选中授权置为 revoked，永久失效 | **不可逆** |
| 批量导出 CSV | 下载选中授权的关键字段 CSV 文件（UTF-8 带 BOM，可直接用 Excel 打开） | — |
| 批量生成激活码 | 按指定产品 + 客户 + 类型批量签发 N 个授权，生成后可一键全部复制 | — |

![批量操作](images/user-manual/09-license-batch-zh.png)

> **安全提示：** 「批量吊销」不可撤销，执行前系统会弹出红色危险确认框，请仔细核对选中数量。

### 6.4 向导式发放授权（推荐）

**路径：** 授权列表页 → 点击 **向导发放** 按钮。

向导按步骤引导完成发放，过程中可随时 **保存草稿**，下次进入自动恢复：

1. **选择产品**：从产品下拉列表中选择（支持搜索过滤）。
2. **选择客户**：从客户下拉列表中选择。
3. **配置授权参数**：授权类型、最大设备数、到期时间、元数据（JSON，可选）。
4. **确认信息**：核对汇总信息，点击 **确认发放**。
5. **完成**：系统展示新签发的授权 Key，可选择「再发一个」或「返回列表」。

![授权向导](images/user-manual/10-license-wizard-zh.png)

> **草稿机制：** 向导每一步的填写内容都会自动/手动保存到浏览器本地。中途关闭页面后重新进入向导，系统提示「已加载未完成草稿」；如不需要可点击 **丢弃草稿**。

### 6.5 授权详情与单条运维

在授权列表操作列点击 **查看**，进入授权详情页。页面包含：

- **授权信息卡片**：ID、授权 Key、产品、客户、类型、状态、最大设备数、到期、发放与更新时间。
- **设备列表**：该授权下已激活的设备（设备 ID、名称、主机名、启用状态、最后在线、激活时间）。

![授权详情](images/user-manual/11-license-detail-zh.png)

**可执行的运维操作（卡片右上角按钮，按当前状态动态显示）：**

| 操作 | 出现条件 | 说明 |
| ---- | ---- | ---- |
| 挂起 | 状态为 active | 弹出原因输入框（可选填），确认后授权暂停使用 |
| 恢复 | 状态为 suspended | 确认后授权恢复为 active |
| 续期 | 任意非吊销状态（已吊销许可证隐藏续期按钮） | 确认后到期时间延长 365 天 |
| 吊销 | 非 revoked 状态 | 弹出原因输入框，确认后永久失效（红色危险操作） |

操作成功后系统显示对应成功提示，页面数据自动刷新。

---

## 7. 订单管理

> **本章节功能已随商业化裁剪移除**（订单创建、履约与支付相关页面与接口均已删除），购买与资金流由外部销售系统承接。历史章节内容不再适用，章节号保留以免后续章节编号变动。

---

## 8. 用户与权限管理

> **仅 admin 角色可见此菜单。**

### 8.1 用户列表

**路径：** 侧边栏 → **系统** → **用户**

列表展示控制台用户的邮箱、显示名、角色、最后登录时间。支持按邮箱 / 显示名 / 角色即时搜索。

![用户列表](images/user-manual/14-users-zh.png)

### 8.2 新建用户

**操作步骤：**

1. 点击右上角 **新建用户**。
2. 填写：
   - **邮箱**（必填，需符合格式）：登录账号。
   - **密码**（必填）：初始密码，建议强密码。
   - **角色**：`admin`（管理员）/ `operator`（运营）/ `support`（支持）。
3. 点击 **创建**，新用户即可凭邮箱密码登录。

![新建用户](images/user-manual/15-user-create-zh.png)

### 8.3 删除用户

操作列点击 **删除** 并确认。删除后该用户立即无法登录。

> **注意：** 系统不允许删除最后一名处于 active 状态的 admin 账号（服务端已强制校验，删除时会被拒绝），请确保始终保留至少一名管理员。

---

## 9. Webhook 端点配置

Webhook 用于将平台事件（授权签发、挂起、吊销、订阅续期等）实时推送到您的业务系统。

### 9.1 查看端点列表

**路径：** 侧边栏 → **通讯** → **Webhooks**

列表展示已配置端点的名称、URL、订阅事件、启用状态、创建时间与操作按钮（当前版本无"最后触发时间"列；投递成功率与最近投递请查看「Webhook 投递」页面）。

![Webhook 端点列表](images/user-manual/18-webhooks-zh.png)

### 9.2 新建 Webhook 端点

**操作步骤：**

1. 点击右上角 **新建端点** 按钮。
2. 在对话框中填写：
   - **URL**（必填，需为合法 http/https 地址）：您业务系统的接收地址。
   - **事件**：勾选需要订阅的事件类型。
   - **密钥（Secret）**：用于对投递内容签名，接收方可据此验证来源真实性。
3. 点击 **创建**，端点立即生效。

![新建 Webhook 端点](images/user-manual/19-webhook-create-zh.png)

### 9.3 投递监控与删除

- **Webhook 投递**：侧边栏 → **通讯** → **Webhook 投递**，查看每次投递的状态、响应码与重试记录，失败投递可在此排查原因。
- **删除端点**：列表操作列点击 **删除**，二次确认后生效；删除后事件不再推送至该地址。

> **安全建议：** 接收方务必校验签名密钥，并只接受 https 地址，防止伪造事件与中间人攻击。

---

## 10. API 密钥管理

API 密钥用于程序化访问平台 Open API（如您的业务系统直接签发/验证授权），无需登录控制台。

> **仅 admin 角色可见此菜单。**

### 10.1 查看密钥列表

**路径：** 侧边栏 → **系统** → **API 密钥**

列表展示密钥名称、Key 原文、绑定角色、启用状态、创建时间与操作按钮。

![API 密钥列表](images/user-manual/20-api-keys-zh.png)

### 10.2 新建 API 密钥

1. 点击右上角 **新建 API 密钥**。
2. 填写密钥 **名称**（用途标识，如"外部系统集成"）并选择绑定 **角色**（决定该密钥的接口权限范围）。
3. 创建成功后 **立即复制并妥善保存 Key**；密钥即创建即生效。

### 10.3 使用与轮换

- 调用 API 时在请求头携带密钥（`Authorization: ApiKey <keyId>:<secret>`，亦支持 `Hmac` 签名方案与 `Bearer` JWT，详见《Integration Guide》）。
- 密钥泄露或定期轮换时：先在列表 **删除** 旧密钥，再按 10.2 创建新密钥并下发到调用方。

> **安全提示：** API 密钥等同于账号密码，禁止硬编码在前端代码或公开仓库中；生产环境建议每 90 天轮换一次。

---

## 11. 报表中心

**路径：** 侧边栏 → **报表**

报表页提供平台运营数据的可视化分析（需 operator 及以上角色）：

- 用量统计（按日 / 周 / 月）；
- 激活统计。

![报表](images/user-manual/16-reports-zh.png)

---

## 12. 审计日志

**路径：** 侧边栏 → **审计日志**

系统对关键操作（登录、签发、挂起、吊销、删除等）自动记录审计日志，字段包括：时间、操作、资源类型、资源 ID、操作者、来源 IP。

- **时间范围筛选**：通过开始 / 结束时间选择器圈定查询区间。
- **关键字搜索**：按操作、资源、操作者过滤。

![审计日志](images/user-manual/17-audit-zh.png)

> **合规提示：** 审计日志为只读数据，任何角色无法修改或删除，满足安全审计与合规追溯要求。

---

## 13. 角色权限说明

系统内置四种角色，权限矩阵如下：

| 功能域 | admin | operator | support | customer |
| ---- | ---- | ---- | ---- | ---- |
| 仪表盘 | ✔ | ✔ | ✔ | ✔ |
| 产品 / 客户 / 授权 | ✔ | ✔ | ✔ | ✘ |
| 工单 / 知识库 | ✔ | ✔ | ✔ | ✔ |
| 报表中心 | ✔ | ✔ | ✘（仪表盘改由列表数据推导） | ✘ |
| 审计日志 / Webhooks / 批量操作 | ✔ | ✔ | ✘ | ✘ |
| 用户 / 角色 / API 密钥 / 系统密钥 | ✔ | ✘ | ✘ | ✘ |
| 租户 / 合规配置 | ✔ | ✘ | ✘ | ✘ |

> `customer`（终端客户）角色仅可访问仪表盘、工单与知识库（路由定义见 `web/admin/src/router/index.ts`，`AppRole = 'admin' | 'operator' | 'support' | 'customer'`）；其余菜单对该角色隐藏。

**要点：**

- 菜单按角色动态过滤，无权限的菜单项不会出现在侧边栏。
- 即使直接输入 URL，前端路由守卫与后端中间件会双重拦截，返回无权限提示并跳转回仪表盘。
- 所有权限校验以后端 `AuthorizationMiddleware` 为准，前端菜单过滤仅为体验优化。

---

## 14. 常见问题（FAQ）

**Q1：登录后看不到「用户」「角色」菜单？**
A：这些菜单仅 admin 角色可见。请确认当前账号角色，或联系管理员调整。

**Q2：访问某页面提示「无权限访问」并跳回仪表盘？**
A：当前角色无权访问该页面（前端路由守卫拦截）。如确认业务需要，请联系 admin 调整角色。

**Q3：提示「会话已过期，请重新登录」？**
A：JWT 令牌已过期（默认有效期有限）。重新登录即可，系统会自动跳转登录页。

**Q4：批量吊销操作可以撤销吗？**
A：不可以。吊销是终态操作，执行前请通过列表搜索与状态筛选仔细核对目标授权。

**Q5：授权列表中「到期」列显示「-」是什么意思？**
A：表示该授权为永久授权（perpetual），没有到期时间。

**Q6：如何切换英文界面？**
A：点击顶部工具栏的语言图标，选择 **English**；界面所有菜单与文案即时切换，无需刷新。

**Q7：忘记管理员密码怎么办？**
A：管理员密码由服务端 `Seed:AdminPassword` 配置初始化。请让运维人员在部署配置中重置后重启服务，再通过控制台重新修改。

**Q8：授权向导填写一半关闭了页面，内容会丢失吗？**
A：不会。向导草稿保存在浏览器本地存储，重新进入向导时自动恢复；不需要时可点击「丢弃草稿」。

**Q9：如何让业务系统实时感知授权变更？**
A：配置 Webhook 端点（见第 9 章）订阅相关事件；也可在「Webhook 投递」页面监控推送成功率。

**Q10：第三方系统如何不登录控制台直接调用 API？**
A：由 admin 在「API 密钥」页创建密钥（见第 10 章），调用方在请求头携带密钥即可。

---

## 15. 登录方式与系统配置（2026-10 新增）

### 15.1 短信验证码登录

登录页提供「密码登录」与「短信验证码」两个 Tab。切换到短信 Tab 后输入手机号，点击「发送验证码」（60 秒倒计时后可重发），输入 6 位验证码即可登录。验证码 5 分钟有效、输错 5 次作废。手机号由管理员在「用户管理」中维护到对应账户；未绑定手机号的账户发送验证码同样会提示已发送（防枚举），但无法通过验证。

> 短信 Tab 是否显示由管理员在「系统配置」中通过 `feature.sms_login` 开关控制（默认开启）。

### 15.2 系统配置（管理端）

「系统」菜单新增「系统配置」页面，可查看与切换系统特性开关，保存后即时生效（无需重启）：

| 特性 | 默认 | 说明 |
| --- | --- | --- |
| 短信验证码登录 | 开启 | 登录页显示短信验证码登录方式（国内市场特性） |
| Cookie 同意横幅 | 关闭 | 向访客展示 Cookie 使用同意横幅（欧美市场特性） |
| SCIM 目录同步 | 关闭 | 在 API Keys 页展示 SCIM 2.0 目录同步说明（欧美市场特性） |

页面同时展示每项的默认值与最近更新时间 / 操作者。

### 15.3 公开状态页

Portal 登录页底部提供「服务状态」链接（`/status`，无需登录），展示服务版本、运行时长与数据库 / Redis 健康状态，可直接转发给客户查询服务可用性。

## 附录 A：截图采集与验证说明

本手册全部界面截图由自动化脚本（`web/admin/scripts/capture-manual-screenshots.mjs`）在中文界面下以 1440×900 视口采集，采集过程同时监听每页的浏览器控制台错误（`console.error` / `pageerror`）。本版手册对应的错误报告为 **零错误**（见 `docs/images/user-manual/_console-errors.json`，内容为空对象 `{}`），确保截图所示界面无前端运行时报错。

如需重新采集：

```bash
# 前置：Vite dev server (5173) 与 API (8080) 均已启动
cd web/admin
node scripts/capture-manual-screenshots.mjs
```
