@autobest-ui/agent 1.0.19 → 1.0.21

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 CHANGED
@@ -7,13 +7,13 @@ Autobest 面向 Codex 等智能体发布的 Skills、Plugins 和 MCP 服务集
7
7
  Common Skills 对当前用户全局生效,安装到 `~/.agents/skills`:
8
8
 
9
9
  ```bash
10
- npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync common
10
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-agent-sync common
11
11
  ```
12
12
 
13
13
  React Skills 只对单个项目生效。在项目根目录运行,安装到该项目的 `.agents/skills`:
14
14
 
15
15
  ```bash
16
- npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync react
16
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-agent-sync react
17
17
  ```
18
18
 
19
19
  也可以把项目绝对路径作为最后一个参数。完整的分类、Skill 清单和更新行为见 [Skills 使用说明](skills/README.md)。
@@ -27,7 +27,7 @@ npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync react
27
27
  ```bash
28
28
  RAG_API_BASE_URL="http://192.168.1.12:3000/api/knowledge" \
29
29
  npx --yes \
30
- --package=@autobest-ui/agent@latest \
30
+ --package=@autobest-ui/agent@1.0.19 \
31
31
  autobest-rag-mcp
32
32
  ```
33
33
 
@@ -36,19 +36,19 @@ npx --yes \
36
36
  ```bash
37
37
  AZURE_DEVOPS_PAT="your-personal-access-token" \
38
38
  npx --yes \
39
- --package=@autobest-ui/agent@latest \
39
+ --package=@autobest-ui/agent@1.0.19 \
40
40
  autobest-azurepr-mcp
41
41
  ```
42
42
 
43
43
  启动 Playwright Trace 人工录制 MCP:
44
44
 
45
45
  ```bash
46
- npx --yes --package=@autobest-ui/agent@latest playwright install chromium
46
+ npx --yes --package=@autobest-ui/agent@1.0.19 playwright install chromium
47
47
 
48
48
  BACKEND_BASE_URL="http://127.0.0.1:3001" \
49
49
  MAX_RECORD_DURATION="1800000" \
50
50
  npx --yes \
51
- --package=@autobest-ui/agent@latest \
51
+ --package=@autobest-ui/agent@1.0.19 \
52
52
  autobest-trace-mcp-recorder
53
53
  ```
54
54
 
@@ -70,7 +70,7 @@ Codex 配置示例分别位于:
70
70
  - [Figma MCP 配置](mcp/figma-mcp-bridge/config.toml.example)
71
71
  - [Trace Recorder MCP 配置](mcp/trace-mcp-recorder/config.toml.example)
72
72
 
73
- 生产环境可将 `@latest` 替换为明确版本,以固定 MCP 行为。
73
+ 安装示例固定使用当前版本 `1.0.19`,升级时应同步更新这里的版本号。
74
74
 
75
75
  如果 `@autobest-ui` 发布在私有 npm registry,使用前需要在 npm 的 `.npmrc` 中配置该 scope 对应的 registry 和认证信息。
76
76
 
@@ -79,7 +79,7 @@ Codex 配置示例分别位于:
79
79
  Figma Plugin 与 `figma-mcp-bridge` 分目录维护,并通过同一个 npm 包提供两个独立命令。安装或更新到稳定目录:
80
80
 
81
81
  ```bash
82
- npx --yes --package=@autobest-ui/agent@latest figma-plugin
82
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-plugin
83
83
  ```
84
84
 
85
85
  命令会输出 `manifest.json` 的稳定路径。首次安装后,在 Figma 中通过 **Plugins -> Development -> Import plugin from manifest** 导入该文件。详细说明见 [Figma Plugin 使用说明](plugins/figma-plugin/README.md)。
@@ -87,7 +87,7 @@ npx --yes --package=@autobest-ui/agent@latest figma-plugin
87
87
  卸载本地文件:
88
88
 
89
89
  ```bash
90
- npx --yes --package=@autobest-ui/agent@latest figma-plugin uninstall
90
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-plugin uninstall
91
91
  ```
92
92
 
93
93
  ## Codex Plugin
@@ -97,7 +97,7 @@ Autobest Delivery 将交付闭环 Skills 和隔离的 Playwright MCP 运行器
97
97
  安装或更新:
98
98
 
99
99
  ```bash
100
- npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup
100
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup
101
101
  ```
102
102
 
103
103
  安装器会下载固定版本的运行依赖和 Chromium,将插件持久化到 `~/.autobest-agent/marketplaces/autobest-team`,注册 `autobest-team` 本地市场并安装 `autobest-delivery`。如果同名市场仍指向旧的源码仓库,安装器会自动迁移。完成后重启 Codex,并在新会话中使用插件。
@@ -105,10 +105,10 @@ npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup
105
105
  卸载:
106
106
 
107
107
  ```bash
108
- npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup uninstall
108
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup uninstall
109
109
  ```
110
110
 
111
- 生产环境可以把 `@latest` 替换为明确版本。插件能力、运行隔离和本地开发验证见 [Autobest Delivery 使用说明](plugins/autobest-delivery/README.md)。
111
+ 安装示例固定使用当前版本 `1.0.19`。插件能力、运行隔离和本地开发验证见 [Autobest Delivery 使用说明](plugins/autobest-delivery/README.md)。
112
112
 
113
113
  ## 发布前本地联调
114
114
 
@@ -19,10 +19,10 @@ PAT 至少需要目标项目的代码读取权限。不要把 PAT 直接写进 `
19
19
  Codex 将通过 npm 安装并启动发布包中的 MCP。也可以手动验证启动命令:
20
20
 
21
21
  ```bash
22
- npx --yes --package=@autobest-ui/agent@latest autobest-azurepr-mcp
22
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-azurepr-mcp
23
23
  ```
24
24
 
25
- `@latest` 可以替换为明确版本,例如 `@1.0.0`。
25
+ 安装示例固定使用当前版本 `1.0.19`。
26
26
 
27
27
  工具 `get_azure_pull_request` 接受 PR URL。可以使用 `path` 查询参数限制变更目录:
28
28
 
@@ -1,6 +1,6 @@
1
1
  [mcp_servers.azurepr-mcp-bridge]
2
2
  command = "npx"
3
- args = ["--yes", "--package=@autobest-ui/agent@latest", "autobest-azurepr-mcp"]
3
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "autobest-azurepr-mcp"]
4
4
  env_vars = ["AZURE_DEVOPS_PAT"]
5
5
  startup_timeout_sec = 30
6
6
  tool_timeout_sec = 120
@@ -23,7 +23,7 @@ npm start
23
23
  随 `@autobest-ui/agent` 包运行:
24
24
 
25
25
  ```bash
26
- npx --yes --package=@autobest-ui/agent@latest autobest-code-mcp-pr
26
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-code-mcp-pr
27
27
  ```
28
28
 
29
29
  Codex 配置示例见 [config.toml.example](config.toml.example)。
@@ -1,4 +1,4 @@
1
1
  [mcp_servers.code-mcp-pr]
2
2
  command = "npx"
3
- args = ["--yes", "--package=@autobest-ui/agent@latest", "autobest-code-mcp-pr"]
3
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "autobest-code-mcp-pr"]
4
4
  env_vars = ["AZURE_DEVOPS_PAT", "DINGDING_ALERT_TOKEN"]
@@ -7,13 +7,13 @@
7
7
  先安装 Figma Plugin:
8
8
 
9
9
  ```bash
10
- npx --yes --package=@autobest-ui/agent@latest figma-plugin
10
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-plugin
11
11
  ```
12
12
 
13
13
  然后将 [config.toml.example](config.toml.example) 中的配置加入 `~/.codex/config.toml`,重启 Codex。Codex 会通过 npm 安装并启动 MCP:
14
14
 
15
15
  ```bash
16
- npx --yes --package=@autobest-ui/agent@latest figma-mcp-bridge
16
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-mcp-bridge
17
17
  ```
18
18
 
19
19
  MCP 使用 stdio 通信,启动后持续等待客户端请求属于正常状态。WebSocket 默认从 `3055` 端口开始;如果端口已被占用,会依次尝试到 `3070`。
@@ -22,4 +22,4 @@ MCP 使用 stdio 通信,启动后持续等待客户端请求属于正常状态
22
22
 
23
23
  在 Figma 中通过 **Plugins -> Development -> Import plugin from manifest** 导入安装器输出的 `manifest.json`。打开目标文件并运行插件,将插件显示的端口设置为 MCP 实际监听端口。状态显示 `Connected` 后即可使用。
24
24
 
25
- 生产环境可将 `@latest` 替换为明确版本,以固定 MCP 行为。
25
+ 安装示例固定使用当前版本 `1.0.19`,以固定 MCP 行为。
@@ -1,6 +1,6 @@
1
1
  [mcp_servers.figma-mcp-bridge]
2
2
  command = "npx"
3
- args = ["--yes", "--package=@autobest-ui/agent@latest", "figma-mcp-bridge"]
3
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "figma-mcp-bridge"]
4
4
  startup_timeout_sec = 30
5
5
  tool_timeout_sec = 120
6
6
  enabled = true
@@ -9,18 +9,18 @@
9
9
  ```bash
10
10
  RAG_API_BASE_URL="http://192.168.1.12:3000/api/knowledge" \
11
11
  npx --yes \
12
- --package=@autobest-ui/agent@latest \
12
+ --package=@autobest-ui/agent@1.0.19 \
13
13
  autobest-rag-mcp
14
14
  ```
15
15
 
16
- `@latest` 可以替换为明确版本,例如 `@1.0.0`。启动成功后,服务会通过 stdio 持续等待 MCP 客户端请求,并且不会向标准输出写日志;终端看起来没有响应属于正常状态,可按 `Ctrl+C` 停止。
16
+ 安装示例固定使用当前版本 `1.0.19`。启动成功后,服务会通过 stdio 持续等待 MCP 客户端请求,并且不会向标准输出写日志;终端看起来没有响应属于正常状态,可按 `Ctrl+C` 停止。
17
17
 
18
18
  供 Codex 长期使用时,将下面的完整配置加入 `~/.codex/config.toml`,然后重启 Codex:
19
19
 
20
20
  ```toml
21
21
  [mcp_servers.rag-mcp-bridge]
22
22
  command = "npx"
23
- args = ["--yes", "--package=@autobest-ui/agent@latest", "autobest-rag-mcp"]
23
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "autobest-rag-mcp"]
24
24
  startup_timeout_sec = 30
25
25
  tool_timeout_sec = 120
26
26
  enabled = true
@@ -1,6 +1,6 @@
1
1
  [mcp_servers.rag-mcp-bridge]
2
2
  command = "npx"
3
- args = ["--yes", "--package=@autobest-ui/agent@latest", "autobest-rag-mcp"]
3
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "autobest-rag-mcp"]
4
4
  startup_timeout_sec = 30
5
5
  tool_timeout_sec = 120
6
6
  enabled = true
@@ -1,6 +1,6 @@
1
1
  # trace-mcp-recorder
2
2
 
3
- `trace-mcp-recorder` 是基于 `@modelcontextprotocol/sdk` 和 `StdioServerTransport` 的 Node.js MCP Server。它打开非无头 Chromium,并在页面左下角注入半透明的“开始录制”“停止录制”和设备切换按钮供测试人员手动控制 Trace;默认是 PC 端,也可切换为 iPhone 14 Pro Max 移动端模拟。点击开始后先自动刷新一次页面,确保 DOM Snapshot 所引用的图片、CSS 和网络资源被 Trace 捕获;后续用户活动经过防抖后以 `步骤N | 页面标题 | 事件类型` 的 Trace Group 写入轻量 Playwright Action,空闲超过 2 分钟自动结束,然后上传原生 `trace.zip` 和浏览器元数据,并返回私有后端的 Trace Viewer 链接。同一进程同一时间只允许一个录制任务。
3
+ `trace-mcp-recorder` 是基于 `@modelcontextprotocol/sdk` 和 `StdioServerTransport` 的 Node.js MCP Server。它打开非无头 Chromium,并在页面左下角注入半透明的“开始录制”“停止录制”和设备切换按钮供测试人员手动控制 Trace;默认是 PC 端,也可切换为 iPhone 14 Pro Max 移动端模拟。页面先正常打开并等待,点击开始后才启动 Trace,不刷新当前页面;后续用户活动经过防抖后以 `步骤N | 页面标题 | 事件类型` 的 Trace Group 写入轻量 Playwright Action,空闲超过 2 分钟自动结束,然后上传原生 `trace.zip` 和浏览器元数据,并返回私有后端的 Trace Viewer 链接。同一进程同一时间只允许一个录制任务。
4
4
 
5
5
  ## 安装与启动
6
6
 
@@ -1,6 +1,6 @@
1
1
  [mcp_servers.trace-mcp-recorder]
2
2
  command = "npx"
3
- args = ["--yes", "--package=@autobest-ui/agent@latest", "autobest-trace-mcp-recorder"]
3
+ args = ["--yes", "--package=@autobest-ui/agent@1.0.19", "autobest-trace-mcp-recorder"]
4
4
  startup_timeout_sec = 30
5
5
  tool_timeout_sec = 180
6
6
  enabled = true
@@ -491,11 +491,6 @@ export class TraceRecorder {
491
491
  if (session.tracingStarted || session.state !== 'waiting_for_start') return;
492
492
  await session.context.tracing.start({ screenshots: true, snapshots: true, sources: true });
493
493
  session.tracingStarted = true;
494
- // The initial navigation happened before Trace started. Reload now so the
495
- // DOM snapshot also has response bodies for images, CSS, and other assets.
496
- if (typeof session.page.reload === 'function') {
497
- await session.page.reload({ waitUntil: 'load' });
498
- }
499
494
  session.state = 'recording';
500
495
  session.lastActivityAt = Date.now();
501
496
  session.timer = this.setTimer(() => {
@@ -111,7 +111,7 @@ test('page controls start recording, record activity, upload and clean up one se
111
111
  state: 'recording',
112
112
  deviceMode: 'desktop'
113
113
  });
114
- assert.ok(calls.some(call => call[0] === 'reload' && call[1].waitUntil === 'load'));
114
+ assert.equal(calls.some(call => call[0] === 'reload'), false);
115
115
  recorder.handleUserActivity(recorder.activeSession, {
116
116
  type: 'click',
117
117
  title: '首页功能'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autobest-ui/agent",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "private": false,
5
5
  "description": "Autobest Agent skills/plugins/mcp assets + sync cli",
6
6
  "files": [
@@ -19,7 +19,7 @@
19
19
  安装或更新插件:
20
20
 
21
21
  ```bash
22
- npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup
22
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup
23
23
  ```
24
24
 
25
25
  安装器会在临时目录中执行 `npm ci` 并下载固定版本的 Chromium。运行时完整就绪后,插件才会替换到以下持久化目录:
@@ -35,19 +35,19 @@ npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup
35
35
  生产环境建议固定 npm 包版本,例如:
36
36
 
37
37
  ```bash
38
- npx --yes --package=@autobest-ui/agent@1.0.0 autobest-delivery-setup
38
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup
39
39
  ```
40
40
 
41
41
  卸载插件及 Autobest 专用本地市场:
42
42
 
43
43
  ```bash
44
- npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup uninstall
44
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup uninstall
45
45
  ```
46
46
 
47
47
  卸载命令只会删除 `~/.autobest-agent/marketplaces/autobest-team` 这一精确路径。查看命令帮助可执行:
48
48
 
49
49
  ```bash
50
- npx --yes --package=@autobest-ui/agent@latest autobest-delivery-setup --help
50
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-delivery-setup --help
51
51
  ```
52
52
 
53
53
  ## MCP 工具
@@ -5,7 +5,7 @@
5
5
  ## 安装
6
6
 
7
7
  ```bash
8
- npx --yes --package=@autobest-ui/agent@latest figma-plugin
8
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-plugin
9
9
  ```
10
10
 
11
11
  安装器会将插件文件同步到稳定目录:
@@ -19,7 +19,7 @@ npx --yes --package=@autobest-ui/agent@latest figma-plugin
19
19
  卸载本地文件:
20
20
 
21
21
  ```bash
22
- npx --yes --package=@autobest-ui/agent@latest figma-plugin uninstall
22
+ npx --yes --package=@autobest-ui/agent@1.0.19 figma-plugin uninstall
23
23
  ```
24
24
 
25
25
  卸载后,Figma Development Plugins 列表中的记录需要在 Figma 内移除。
package/skills/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  Common Skills 适用于当前用户的所有项目,安装到 `~/.agents/skills`:
8
8
 
9
9
  ```bash
10
- npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync common
10
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-agent-sync common
11
11
  ```
12
12
 
13
13
  当前包含:
@@ -27,19 +27,19 @@ npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync common
27
27
  React Skills 只应用于单个项目。进入项目根目录后运行:
28
28
 
29
29
  ```bash
30
- npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync react
30
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-agent-sync react
31
31
  ```
32
32
 
33
33
  安装目标为当前项目的 `.agents/skills`。也可以显式指定项目目录:
34
34
 
35
35
  ```bash
36
- npx --yes --package=@autobest-ui/agent@latest autobest-agent-sync react /absolute/path/to/project
36
+ npx --yes --package=@autobest-ui/agent@1.0.19 autobest-agent-sync react /absolute/path/to/project
37
37
  ```
38
38
 
39
39
  当前包含:
40
40
 
41
41
  - `react-code-standards`
42
42
 
43
- 再次运行相同命令会更新包内已有的同名文件,不会删除目标 Skill 目录中的额外文件。生产环境可将 `@latest` 替换为明确版本。
43
+ 再次运行相同命令会更新包内已有的同名文件,不会删除目标 Skill 目录中的额外文件。安装示例固定使用当前版本 `1.0.19`。
44
44
 
45
45
  Codex 会自动检测 Skill 变更;如果新安装的 Skill 没有出现,请重启 Codex。目录规则参考 [OpenAI Codex Skills 文档](https://developers.openai.com/codex/skills/)。
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: code-quality
3
+ description: 对前端与 Node.js 服务执行稳定、可重复的只读安全审计,按固定 Phase 1-7、OWASP/CWE 标准和证据规则检查依赖、认证、会话、数据流、注入、服务端风险及环境配置,并在项目根目录 `.scratch/code-quality-report.md` 生成固定格式报告。用户要求前端或 Node.js 安全扫描、依赖漏洞检查、代码安全 Review 或工程安全风险审查时使用;不修改源码、依赖、锁文件、构建配置或提交历史。
4
+ ---
5
+
6
+ # 前端与 Node.js 服务安全审计
7
+
8
+ 目标是在相同审查范围内重复执行时尽量得到一致的结果。必须依次完成 Phase 1-7;不能用单次 `grep`、单次 `npm audit` 或单个静态规则替代完整流程。所有结论必须由源码、配置、依赖树或工具输出证据支持,最终只生成项目根目录的 `.scratch/code-quality-report.md`。报告章节、finding 字段和状态遵循 [report-format.md](references/report-format.md)。
9
+
10
+ ## 审计标准
11
+
12
+ 将以下标准作为审计依据,并在 finding 中注明适用的标准或 CWE(无法映射时说明原因):
13
+
14
+ - OWASP Top 10。
15
+ - OWASP API Security Top 10。
16
+ - OWASP ASVS:V2 Authentication、V3 Session Management、V4 Access Control、V5 Validation, Sanitization and Encoding、V6 Stored Cryptography、V7 Error Handling and Logging、V8 Data Protection、V9 Communications、V12 Files and Resources、V14 Configuration。
17
+ - CWE-79 XSS、CWE-22/CWE-23 路径穿越、CWE-601 Open Redirect、CWE-200 敏感信息暴露、CWE-312/CWE-319 明文敏感数据、CWE-327/CWE-328 弱密码学、CWE-532 日志中的敏感信息、CWE-798 硬编码凭据、CWE-918 SSRF、CWE-400/CWE-1333 DoS/ReDoS、CWE-94 代码注入。
18
+ - `npm audit`/OSV、Node.js Security Best Practices、供应链安全和 lockfile 完整性。
19
+
20
+ 工具或漏洞数据库不可用时,必须在工具执行记录和未执行检查中写明 `Incomplete` 或 `Blocked`,不能将缺失证据写成通过。
21
+
22
+ ## 只读边界
23
+
24
+ - 开始时执行 `git rev-parse --show-toplevel`,确认审查目标在仓库根目录内;记录当前分支、提交和 `git status --short`。
25
+ - 唯一允许生成的项目产物是 `.scratch/code-quality-report.md`。可以创建 `.scratch`,但不得在其中生成其他文件。
26
+ - 读取源码、manifest、锁文件、配置、Docker/nginx/启动脚本、测试和 CI 文件,以及 Git 元数据;跳过 `node_modules`、构建缓存、二进制和无关的大型产物。
27
+ - 不读取 `.env` 内容、私钥、凭据或 secret store;只记录文件位置、变量名或脱敏类型。
28
+ - 对 `.env`、secret store 和私钥文件只记录存在性、路径和脱敏变量名;不得读取、复制或输出其值。
29
+ - 不修改业务源码、依赖、锁文件、构建配置、测试、Git 历史、远程状态或运行中的业务数据;不安装依赖或改变项目配置。
30
+ - 运行现有只读检查命令前确认命令不会写入项目;命令失败、网络不可达或范围不可读时保留失败证据。
31
+
32
+ ## 固定审计流程
33
+
34
+ ### Phase 1: 项目识别
35
+
36
+ 确认并记录:
37
+
38
+ - 仓库根目录、当前分支、提交和工作树状态。
39
+ - React、Vue、Angular、Svelte、Node、Express、Koa、Nest、Fastify 等已由依赖或源码证明的技术栈。
40
+ - package manager、lockfile 类型和 workspace/package 边界。
41
+ - `build`、`lint`、`typecheck`、`test`、`audit` 脚本及其实际存在性。
42
+ - 前端 SPA、SSR、Node API、BFF、CLI、构建工具和开发服务器边界。
43
+ - 所有环境配置入口和环境变量来源;只记录位置和脱敏变量类型,不读取秘密值。
44
+
45
+ 没有证据的技术栈或运行边界标记为“未确认”,不得猜测。
46
+
47
+ ### Phase 2: 依赖与供应链
48
+
49
+ 按项目实际工具执行适用的检查:
50
+
51
+ - `npm audit --json`、OSV 或仓库已配置的等价审计。
52
+ - `npm ls` 或对应 package manager 的实际依赖树。
53
+ - lockfile 完整性和 manifest/lockfile 一致性。
54
+ - direct/transitive dependency 区分、实际安装版本和 workspace 归属。
55
+ - 维护状态、过期版本、危险安装脚本和 postinstall 风险。
56
+ - 构建工具、开发服务器和可暴露服务的攻击面。
57
+
58
+ 每个依赖漏洞必须记录包名、实际安装版本、direct/transitive、CVE/OSV/GHSA 编号、受影响范围、修复版本或升级路径、运行时/构建时/开发时影响,以及是否实际进入生产 bundle(无法确认时标记待确认)。按攻击面和依赖链聚合重复漏洞,但保留代表性工具证据,不机械地把全部审计输出合成一个 finding。
59
+
60
+ ### Phase 3: 认证、会话和敏感数据路径
61
+
62
+ 这是强制步骤,即使仓库看起来只有前端也必须确认是否存在这些路径;不存在时在报告中记录“未发现实现证据”。追踪登录、登出、刷新 token、token/cookie/session 初始化、改密、重置密码、MFA/验证码、角色与权限判断,以及支付、退款、订单审批等高权限操作。
63
+
64
+ 对每条存在的路径追踪:
65
+
66
+ ```text
67
+ 用户输入
68
+ -> UI state/form
69
+ -> API client
70
+ -> base URL
71
+ -> transport
72
+ -> retry/error handler
73
+ -> logger/telemetry
74
+ -> storage/cache/cookie
75
+ -> redirect/navigation
76
+ ```
77
+
78
+ 必须明确区分:HTTPS 请求体中的密码通常不是传输漏洞;HTTP 发送密码是传输安全漏洞;密码进入日志、遥测、错误上报、`localStorage`、URL 或缓存是敏感信息泄露;token 使用 HttpOnly/Secure/SameSite cookie 还是 `localStorage`;是否存在 token 泄露、过期、重放或跨环境混用风险。
79
+
80
+ 敏感字段检查至少覆盖:`password`、`passwd`、`pwd`、`adminPassword`、`adminPassWord`、`oldPassword`、`newPassword`、`confirmPassword`、`secret`、`token`、`accessToken`、`refreshToken`、`authorization`、`cookie`。不能只搜索 `password`。
81
+
82
+ ### 敏感 key 和凭据检查
83
+
84
+ 必须单独执行敏感 key 检查,覆盖源码、配置模板、测试 fixture、文档示例、构建产物(如纳入审查范围)和 Git 可见文本中的硬编码值。字段名和格式至少包括:
85
+
86
+ - `apiKey`、`api_key`、`API_KEY`、`openaiKey`、`OPENAI_API_KEY`、`accessKey`、`access_key`、`secretKey`、`clientSecret`、`privateKey`、`serviceAccountKey`、`webhookSecret`。
87
+ - OpenAI、AWS、GitHub、Google、Azure、Stripe 等供应商的已知前缀或结构;例如 `sk-`、`AKIA`、`ASIA`、`ghp_`、`github_pat_`、`AIza`、`xoxb-`、`xoxp-`、`SG.` 等。具体模式必须结合上下文核验,不得只因前缀就确认泄露。
88
+ - PEM 私钥/证书块、JWT、Bearer Token、Basic 凭据和明显的高熵长字符串。
89
+ - 赋值、对象字段、JSON/YAML 配置、HTTP header、SDK 初始化、环境变量映射、日志和错误上报中的 key 值流转。
90
+
91
+ 检查结果必须区分:真实可用的密钥、占位符/示例值、测试假值、变量引用和仅有字段名没有值的配置。`key` 字段本身不是漏洞:React `key`、对象索引或业务标识只有在值呈现凭据特征、进入认证/请求/日志路径或具备敏感上下文时才报告。静态命中没有可验证值或数据流时标记 `Needs Manual Verification`。
92
+
93
+ 发现疑似 key 时,报告只写脱敏指纹(例如前缀、后缀、长度、SHA-256 截断值),不得写入完整密钥。若证据显示密钥已提交到 Git 历史、生产 bundle、日志、遥测、URL、客户端存储或公开接口,必须评估撤销/轮换、受影响权限、环境和暴露范围,并按严重级别报告;不因为密钥位于 `.env` 就默认安全。
94
+
95
+ ### Phase 4: 前端注入与浏览器安全
96
+
97
+ 审查以下 source-to-sink 数据流:
98
+
99
+ - `dangerouslySetInnerHTML`、`innerHTML`、`outerHTML`、`insertAdjacentHTML`。
100
+ - `eval`、`new Function`、动态 script、iframe、object、embed。
101
+ - `window.open`、`location.assign`、`location.replace`、`location.href`。
102
+ - URL 参数到导航、HTML、脚本或资源 URL 的流转。
103
+ - `javascript:`、`data:`、协议相对 URL。
104
+ - `postMessage` 的 origin 校验。
105
+ - CORS、CSP、SRI、安全响应头、第三方脚本和 CDN 资源。
106
+
107
+ 每个 DOM XSS finding 必须确认:输入来自用户、URL、接口、数据库或第三方内容;是否经过 sanitizer/allowlist;是否只是固定常量 HTML;是否允许事件属性、危险 URL、SVG 或 `style`;是否确实到达浏览器执行点。仅凭出现 `dangerouslySetInnerHTML` 或某个危险 API 不得判定为 Confirmed XSS。
108
+
109
+ ### Phase 5: Node.js 服务端风险
110
+
111
+ 如果存在 Node.js 服务端代码,必须检查:
112
+
113
+ - 路由鉴权、越权、参数校验和 schema。
114
+ - 原型污染、SSRF、路径穿越、文件上传、解压和临时文件。
115
+ - 命令执行、shell 拼接、模板注入、SQL/NoSQL/LDAP 注入。
116
+ - HTTP 请求代理、WebSocket 和不安全反序列化。
117
+ - ReDoS、资源耗尽、body size、timeout 和 rate limit。
118
+ - 错误栈、敏感信息、日志注入和敏感字段记录。
119
+ - CORS、CSRF、cookie、安全响应头及实际可达的 middleware 配置。
120
+
121
+ 必须区分服务端实际可达风险与仅构建工具/开发依赖风险;后者不能直接升级为生产服务漏洞。
122
+
123
+ ### Phase 6: 配置和环境
124
+
125
+ 逐环境审查 `local`、`development`、`test`、`staging/uat`、`production`(只对仓库中有证据的环境下结论)。不能把 local/dev 配置直接判定为生产漏洞,也不能因为 production 看起来安全就忽略默认启动路径。
126
+
127
+ 检查 API HTTPS、HTTP 降级、mixed content、CORS、CSP、HSTS、cookie 属性、默认凭据、debug 模式、source map、错误页、开发服务器暴露、生产 bundle 中的测试地址/内网 IP/管理接口,以及 Dockerfile、nginx、启动脚本和构建阶段是否把错误环境打进生产产物。
128
+
129
+ ### Phase 7: 工程质量和安全测试保护
130
+
131
+ 检查 `typecheck`、`lint`、`test`、`build`、安全路径测试数量,以及鉴权、重定向、富文本、上传、支付和日志脱敏测试。检查是否存在 `test` script、CI 安全门禁、bundle/依赖/secret scanning 门禁。
132
+
133
+ 测试缺失只能作为工程风险,不能伪装成已确认安全漏洞;命令不可执行时记录原因和范围。
134
+
135
+ ## 证据和 finding 规则
136
+
137
+ 所有 High/Critical finding 必须具备:至少一个明确文件和行号、至少一个来源、至少一个危险汇点、明确中间调用链、受影响环境、攻击前置条件、用户/系统影响,以及修复后的验证命令或测试。每条 finding 必须标记 `Confirmed`、`Suspected`、`Needs Manual Verification` 或 `False Positive`,并提供置信度。
138
+
139
+ 静态关键词命中但没有 source-to-sink 证据时,只能标记 `Needs Manual Verification`,不能作为 Confirmed High。相同根因在多个文件中出现时聚合为一个 finding,并列出代表性位置;只有攻击面不同才拆分。
140
+
141
+ ## 固定严重级别
142
+
143
+ ### Critical
144
+
145
+ 仅用于生产环境可远程利用的 RCE、认证绕过或任意管理员接管、生产密钥/密码/token 大规模暴露、可直接导致供应链执行或生产构建接管、严重未授权高权限操作。可直接接管生产构建或具备高权限的真实供应商 key 也属于此级别。
146
+
147
+ ### High
148
+
149
+ 用于已确认的 DOM XSS 或服务端注入、认证/授权绕过、生产密码/token/支付数据进入日志或客户端不安全存储、生产明文传输敏感数据、SSRF、路径穿越、任意文件读取、高权限操作的开放重定向或 CSRF、可用但权限受限的硬编码供应商 key,以及有明确攻击路径的高危依赖。
150
+
151
+ ### Medium
152
+
153
+ 用于需要额外前置条件的 XSS/注入、非生产但可能误部署的安全配置、低权限敏感数据泄露、DoS、弱安全头、宽松 CORS 和中等风险依赖漏洞。
154
+
155
+ ### Low/Info
156
+
157
+ 用于仅本地开发风险、构建维护性问题、需要人工确认但暂无利用证据的问题、浏览器兼容性和测试覆盖不足。
158
+
159
+ ## 确定性与完成条件
160
+
161
+ - 每次执行固定 Phase 1-7、固定严重级别、固定 finding 编号前缀和固定报告章节。
162
+ - 不能因为发现数量多而省略认证、日志或环境配置审查。
163
+ - 不能把“未扫描”写成“通过”,也不能把工具成功运行等同于项目安全。
164
+ - 完成前重新读取 `.scratch/code-quality-report.md`,检查章节、行号、命令结果、证据和 Git 状态。
165
+ - 只有报告已生成且可读、所有 Phase 都有结果(含未发现/未执行原因)、High/Critical 满足证据门槛、工作树除报告外没有本次 Skill 产生的项目文件时才算完成。
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Code Quality"
3
+ short_description: "审计前端与 Node.js 服务安全和工程质量"
4
+ default_prompt: "使用 $code-quality 按固定 Phase 1-7 审计当前前端与 Node.js 服务,并生成 .scratch/code-quality-report.md。"
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,126 @@
1
+ # Code Quality 报告格式
2
+
3
+ 唯一输出路径是项目根目录 `.scratch/code-quality-report.md`。Skill 执行时不得在 `.scratch` 生成其他项目产物。报告使用简体中文;命令、包名、规则编号、CVE/OSV/GHSA、路径、指标和代码标识符保留原始格式。
4
+
5
+ ## 固定章节
6
+
7
+ 报告必须按以下顺序出现;没有发现或没有适用项时保留章节并写明“未发现实现证据”或“不适用”。
8
+
9
+ ```md
10
+ # Code Quality Security Report
11
+
12
+ ## 扫描摘要
13
+ ## 扫描范围
14
+ ## 项目与环境
15
+ ## 工具执行记录
16
+ ## 认证与敏感数据路径
17
+ ## 风险统计
18
+ ## Critical 问题
19
+ ## High 问题
20
+ ## Medium/Low/Info 问题
21
+ ## 工程质量问题
22
+ ## 未执行检查
23
+ ## 修改建议与验证方式
24
+ ## 未覆盖范围与残余风险
25
+ ```
26
+
27
+ ## 摘要和统计
28
+
29
+ 摘要必须说明审计状态、审计时间、审计目标、是否存在阻断项和结论边界。风险统计必须分别列出:
30
+
31
+ - Confirmed 漏洞数量。
32
+ - Needs Manual Verification 数量。
33
+ - Suspected 数量。
34
+ - False Positive 数量(如有复核记录)。
35
+ - 工程质量问题数量。
36
+ - 依赖漏洞数量。
37
+ - 生产环境问题数量。
38
+ - 非生产环境问题数量。
39
+ - 敏感 key/凭据发现数量,并区分真实值、占位符、测试假值和待确认值。
40
+ - 未执行检查数量。
41
+
42
+ 状态使用:
43
+
44
+ - `Passed`:声明范围内已完成所有可执行 Phase,未发现 Confirmed Critical/High 阻断项;仍必须列出残余风险。
45
+ - `Findings`:流程完成并发现一个或多个 finding。
46
+ - `Incomplete`:部分工具、目录、数据源或环境不可用,但仍完成其余 Phase。
47
+ - `Blocked`:目标不可读、范围不明确或只读边界无法满足,无法完成可靠审计。
48
+
49
+ `Passed` 不表示项目绝对安全、不表示完成渗透测试,也不覆盖后端、运行时基础设施或未声明环境。
50
+
51
+ ## 认证与敏感数据路径
52
+
53
+ 对每条发现的认证/会话/敏感数据路径使用表格或固定小节,至少记录:
54
+
55
+ | 路径 | 来源 | API/传输 | 日志/遥测 | 存储/缓存/Cookie | 重定向 | 环境 | 结论 |
56
+ | --- | --- | --- | --- | --- | --- | --- | --- |
57
+ | 登录 | `src/...:line` | `src/...:line` | `src/...:line` | `src/...:line` | `src/...:line` | production | ... |
58
+
59
+ 必须明确记录未发现的登录、登出、刷新 token、改密、重置密码、MFA、角色判断和高权限操作证据;不能用空白表格表示已检查。
60
+
61
+ ## 单条 finding
62
+
63
+ 每条 finding 使用稳定编号:安全 finding 使用 `CQ-SEC-001`,依赖使用 `CQ-DEP-001`,工程质量使用 `CQ-ENG-001`。同一报告重跑时,按章节、严重级别和首次出现位置保持排序,避免无关的随机重排。
64
+
65
+ ```md
66
+ ### CQ-SEC-001: 问题标题
67
+
68
+ - 严重级别:High
69
+ - 状态:Confirmed
70
+ - 置信度:High
71
+ - 标准映射:OWASP A03 / ASVS V5 / CWE-79
72
+ - 文件位置:`src/example.ts:42`
73
+ - 来源:`src/input.ts:18`
74
+ - 危险汇点:`src/render.ts:42`
75
+ - 数据流:`URL 参数 -> form state -> API client -> logger -> innerHTML`
76
+ - 类型:DOM XSS / authentication / dependency / configuration / Node.js server
77
+ - 受影响环境:production
78
+ - 攻击前置条件:说明攻击者能力、权限和部署条件
79
+ - 证据:简短、脱敏的源码、配置、依赖树或工具输出证据
80
+ - 敏感值处理:只记录前缀/后缀/长度或截断指纹,绝不记录完整 key/token/私钥
81
+ - 影响:说明用户、系统、数据或供应链后果
82
+ - 修复建议:给出可执行但不直接改代码的建议
83
+ - 修复优先级:立即 / 本迭代 / 后续
84
+ - 验证方式:修复后应运行的命令、测试或人工复核
85
+ - 误报排除说明:如适用,说明为何不是固定常量、不可达路径或开发专用代码
86
+ ```
87
+
88
+ `Suspected`、`Needs Manual Verification` 和 `False Positive` 也必须使用同样字段;无法提供来源、汇点或数据流时,在对应字段中明确写“未确认”,不能补写推测性证据。
89
+
90
+ ## 敏感 key finding 补充字段
91
+
92
+ 发现 API key、访问 key、client secret、私钥、JWT、Bearer Token 或其他疑似凭据时,必须额外记录:
93
+
94
+ - 字段/变量名及文件位置;`.env`、secret store 和私钥文件只记录路径与脱敏类型,不读取值。
95
+ - 凭据类型和供应商(如可确认)。
96
+ - 脱敏指纹:前缀、后缀、长度或 SHA-256 截断值;不得写完整秘密。
97
+ - 出现位置:源码、配置模板、测试 fixture、文档、构建产物、日志、URL、客户端存储或 Git 历史。
98
+ - 是否具备真实格式、是否可能有效、权限范围和受影响环境;无法确认时使用 `Needs Manual Verification`。
99
+ - 是否进入生产 bundle、请求 header、日志/遥测或公开接口。
100
+ - 建议的撤销、轮换、历史清理、权限收缩和复测步骤。
101
+
102
+ 普通 `key` 字段、React `key`、对象索引和业务标识不是自动漏洞。若只有字段名而没有敏感值或可验证数据流,必须记录为未确认或不报告,不能作为 High/Critical。
103
+
104
+ ## 依赖 finding 补充字段
105
+
106
+ 依赖漏洞至少包含:
107
+
108
+ - 包名和实际安装版本。
109
+ - `direct` 或 `transitive`。
110
+ - CVE/OSV/GHSA 编号。
111
+ - 受影响范围和修复版本/升级路径。
112
+ - 运行时、构建时或开发时影响。
113
+ - 是否实际进入生产 bundle;无法确认时标记 `Needs Manual Verification`。
114
+ - `npm audit`、OSV、`npm ls` 或其他工具的代表性输出位置。
115
+
116
+ 相同根因可以按攻击面和依赖链聚合,但必须保留代表性漏洞证据,不得把全部工具输出压成没有包名和版本的单条问题。
117
+
118
+ ## 工具执行记录
119
+
120
+ 每个计划工具都要记录:
121
+
122
+ | 工具/命令 | 适用范围 | 状态 | 版本 | 证据/输出 | 未执行或失败原因 |
123
+ | --- | --- | --- | --- | --- | --- |
124
+ | `npm audit --json` | workspace | Executed/Incomplete/Blocked | ... | ... | ... |
125
+
126
+ 网络、数据库、命令权限、项目脚本失败或源码不可读都必须进入“未执行检查”或“未覆盖范围”,不能默认为通过。
@@ -14,7 +14,7 @@ description: 通过 trace-mcp-recorder 启动或停止 Playwright Trace 人工
14
14
  1. 从原话提取 `url`、`version`、`title`、`operator`。支持 `key=value` 和自然语言表达,不改写用户给出的值。
15
15
  2. `url` 必填;缺少时只询问目标页面地址。其他字段缺失时不要阻断录制。
16
16
  3. 调用 `start_trace_recording`,只传入用户明确提供的可选字段。服务端会优先使用 MCP 上下文中的操作人身份。
17
- 4. 告知用户浏览器已打开:默认是 PC 端;如需移动端测试,先点击左下角“切换移动端”(iPhone 14 Pro Max,430×932,DPR 3),再点击“开始录制”;点击开始后服务会先刷新一次当前页面以捕获图片等资源,再启动计时,用户正式操作前不要提交表单或进行其他操作;操作完成后点击“停止录制”。新打开的页面会继承当前设备模式。连续 2 分钟没有真实操作时服务会自动停止并上传。真实操作经防抖后会在官方 Trace Viewer 中以 `步骤N | 页面标题 | 事件类型` 的分组节点呈现。
17
+ 4. 告知用户浏览器已打开:默认是 PC 端;如需移动端测试,先点击左下角“切换移动端”(iPhone 14 Pro Max,430×932,DPR 3),再点击“开始录制”;点击开始后才启动 Trace 和计时,不刷新当前页面;操作完成后点击“停止录制”。新打开的页面会继承当前设备模式。连续 2 分钟没有真实操作时服务会自动停止并上传。真实操作经防抖后会在官方 Trace Viewer 中以 `步骤N | 页面标题 | 事件类型` 的分组节点呈现。
18
18
 
19
19
  示例:`trace-mcp-recorder 启动Playwright trace 访问https://cpd.dev.autobestdevops.com,version=v2.1.0 title=bug3452 operator=张三`。这里 `title=bug3452` 是本次录制的标题/功能描述,页面由 `url=https://cpd.dev.autobestdevops.com` 确定。
20
20
 
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: ui-pagespeed
3
+ description: 对前端页面执行只读的 PageSpeed/Lighthouse 性能、Core Web Vitals、布局和 CSS 检查,并在项目根目录 `.scratch` 下生成带证据和修改建议的 Markdown 报告。用户要求页面性能、移动端适配、布局溢出、CSS 或 PageSpeed 分析时使用;不修改业务代码、样式、资源或配置。
4
+ ---
5
+
6
+ # 前端 UI 与 PageSpeed 检查
7
+
8
+ 对前端项目执行静态或运行时 UI 性能审查。最终必须生成 `.scratch/ui-pagespeed-report.md`;报告字段、指标和证据要求遵循 [report-format.md](references/report-format.md)。
9
+
10
+ ## 模式选择
11
+
12
+ - **静态模式**:没有可访问的页面时,读取源码、资源引用、构建配置和 CSS;可以分析包体积风险、加载策略和样式结构,但不得伪造浏览器性能指标。
13
+ - **运行时模式**:用户提供启动命令或 URL 时,使用可用的 Lighthouse、PageSpeed、Playwright 或浏览器性能能力;至少覆盖桌面和移动视口,并记录浏览器、视口、网络、CPU 和运行环境。
14
+ - 页面无法启动、访问或稳定复现时,将运行时结果标记为 `Blocked`/`Incomplete`,保留失败原因和已取得的证据。
15
+
16
+ ## 边界
17
+
18
+ - 只读源码、构建产物分析结果和运行时页面;报告写入前创建 `.scratch`,不得修改组件、CSS、图片、字体、依赖、配置或服务端状态。
19
+ - 运行时测试使用用户提供或仓库已有的启动方式,不安装依赖、不改变端口配置、不写入业务数据。
20
+ - 截图、Trace、HAR 等证据如需保存,放在 `.scratch` 内并在报告中链接;不要把秘密、用户数据或生产凭据复制进报告。
21
+ - 单次实验室测试不能代表线上真实用户体验;区分 Lighthouse 实验室数据、PageSpeed/CrUX 真实用户数据和本地观察。
22
+
23
+ ## 执行流程
24
+
25
+ 1. 确认仓库根目录、页面入口、启动方式和测试范围;记录工作树状态与扫描时间。
26
+ 2. 识别静态检查能力,读取 manifest、构建脚本、资源引用和样式组织;确认可用的 Lighthouse/Playwright/PageSpeed 工具。
27
+ 3. 运行时可用时,在桌面和移动视口执行稳定的性能采样;保留指标、控制台错误、网络失败和截图证据,必要时重复运行并说明采样方式。
28
+ 4. 分析 LCP、INP、CLS、FCP、TBT、TTFB、Speed Index、资源瀑布、长任务、包体积、图片、字体、缓存和第三方脚本。
29
+ 5. 检查布局与 CSS:横向溢出、重叠遮挡、响应式断点、固定尺寸、布局抖动、层叠上下文、冗余/冲突样式、触控区域和加载/错误状态。
30
+ 6. 将客观可验证的问题与主观设计建议分开;每条结论必须绑定指标、截图、DOM、网络或源码证据。
31
+ 7. 按报告格式写入 `.scratch/ui-pagespeed-report.md`,给出预期收益、修改成本、优先级和复测方法。
32
+ 8. 重新读取报告并校验证据链接、视口信息、指标单位和限制;最后复查 `git status --short`,确认业务文件未被修改。
33
+
34
+ ## 判定要求
35
+
36
+ - 参考阈值:LCP < 2.5s、INP < 200ms、CLS < 0.1;除非项目另有基准,不把它们当成绝对合规线。
37
+ - 性能问题要尽量定位原因,例如首屏资源过大、关键 CSS 阻塞、接口等待或主线程长任务,不能只报告分数。
38
+ - 布局问题优先报告溢出、遮挡、抖动、不可操作和断点失效;间距、层级和美观性属于建议并标记为主观判断。
39
+ - 修改建议必须保持只读:说明推荐的代码、资源或配置方向以及验证方式,不直接执行修改。
40
+ - 报告必须列出没有访问到的页面、没有执行的工具、测试环境限制和剩余风险。
41
+
42
+ ## 完成条件
43
+
44
+ 只有以下条件全部满足才算完成:`.scratch/ui-pagespeed-report.md` 已生成并可读;报告包含模式、环境、指标/静态证据、布局与 CSS 结果、修改建议和限制;工作树中除报告目录外没有本次 Skill 产生的业务改动。
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "UI PageSpeed"
3
+ short_description: "检查前端性能、PageSpeed、响应式布局与 CSS 质量"
4
+ default_prompt: "使用 $ui-pagespeed 对当前前端页面执行性能、PageSpeed、布局和 CSS 检查,并生成 .scratch/ui-pagespeed-report.md。"
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,47 @@
1
+ # UI PageSpeed 报告格式
2
+
3
+ 报告路径固定为项目根目录 `.scratch/ui-pagespeed-report.md`。报告使用简体中文;指标名、命令、URL、路径和工具原始错误保留原始格式。
4
+
5
+ ## 固定章节
6
+
7
+ ```md
8
+ # UI PageSpeed Report
9
+
10
+ ## 测试摘要
11
+ ## 页面与测试环境
12
+ ## Lighthouse/PageSpeed 结果
13
+ ## Core Web Vitals
14
+ ## 资源与加载分析
15
+ ## 布局与 CSS 问题
16
+ ## 移动端问题
17
+ ## 截图与证据
18
+ ## 修改建议、收益与优先级
19
+ ## 未覆盖范围与测试限制
20
+ ```
21
+
22
+ ## 单条 finding
23
+
24
+ ```md
25
+ ### UI-001: 问题标题
26
+
27
+ - 严重级别:High
28
+ - 类型:performance / layout / css / accessibility / resource
29
+ - 页面或组件:`/dashboard` / `DashboardPanel`
30
+ - 测试模式:静态 / 运行时
31
+ - 当前值:4.8s(如适用)
32
+ - 参考值:2.5s(如适用)
33
+ - 设备与环境:移动端,视口、浏览器、网络和 CPU 条件
34
+ - 证据:指标、截图、DOM、网络或源码位置
35
+ - 可能原因:基于证据的原因分析
36
+ - 修改建议:可执行但不直接改代码
37
+ - 预期收益:指标、布局稳定性或用户体验影响
38
+ - 修改成本:低 / 中 / 高
39
+ - 验证方式:相同条件下的复测命令或检查
40
+ ```
41
+
42
+ ## 数据边界
43
+
44
+ - 标注数据来源:`Lighthouse lab`、`PageSpeed/CrUX field`、本地浏览器观察或静态分析。
45
+ - 记录采样次数;单次运行只描述为单次结果,多次运行才可给出平均或范围。
46
+ - 运行时失败使用 `Blocked` 或 `Incomplete`,并保留失败原因。
47
+ - 没有运行时数据时,报告不得填写推测的 LCP、INP 或 CLS 数值。