更新: 97 个文件 - 2026-03-17 02:30:01

这个提交包含在:
hao
2026-03-17 02:30:01 -07:00
父节点 4e3b4bf107
当前提交 f95f14d3d8
修改 97 个文件,包含 3298 行新增1193 行删除

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `26`
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `14`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `12`
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `1`
- 待人工/缺浏览器证据: `36`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
## 目标约束

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:03:14+00:00",
"generated_at": "2026-03-17T09:27:20+00:00",
"title": "\u5f53\u524d\u67b6\u6784\u5e93",
"summary": "\u5de5\u4f5c\u53f0\u3001\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u3001\u6388\u6743\u8fb9\u754c\u4e0e\u7cfb\u7edf\u8986\u76d6\u7684\u5f53\u524d\u771f\u503c\u89c6\u56fe\u3002",
"sections": [
@@ -49,29 +49,29 @@
},
{
"label": "\u751f\u6210\u65f6\u95f4",
"value": "2026-03-17T09:03:14+00:00"
"value": "2026-03-17T09:27:20+00:00"
}
],
"links": [
{
"label": "\u6b63\u5f0f\u5de5\u4f5c\u53f0",
"href": "./index.html",
"description": "\u672c\u5730\u5316\u4e3b UI\uff0c\u9ed8\u8ba4\u5165\u53e3\u3002"
"label": "\u603b\u89c8\u9996\u9875",
"href": "/overview/index.html",
"description": "\u5de5\u4f5c\u53f0\u603b\u89c8\u3001\u6700\u65b0\u8fd0\u884c\u548c\u5168\u5c40\u6458\u8981\u3002"
},
{
"label": "\u65e7\u7248\u5de5\u4f5c\u53f0",
"href": "./legacy/index.html",
"description": "\u4fdd\u7559\u7684 legacy \u56de\u9000\u5165\u53e3\u3002"
"label": "\u8fd0\u884c\u4e2d\u5fc3",
"href": "/runs/index.html",
"description": "\u8fd0\u884c\u961f\u5217\u3001\u8be6\u60c5\u3001\u8bc1\u636e\u548c\u65e5\u5fd7\u5165\u53e3\u3002"
},
{
"label": "\u9879\u76ee\u529f\u80fd\u6587\u6863",
"href": "./docs/project-features.html",
"description": "\u9879\u76ee\u80fd\u529b\u3001\u76ee\u5f55\u7ed3\u6784\u4e0e\u81ea\u52a8\u5316\u94fe\u8def\u603b\u89c8\u3002"
"label": "\u7cfb\u7edf\u5206\u7ec4",
"href": "/systems/index.html",
"description": "\u6309\u7cfb\u7edf\u548c\u5206\u7c7b\u6d4f\u89c8\u8986\u76d6\u60c5\u51b5\u3002"
},
{
"label": "\u524d\u7aef\u8bbe\u8ba1\u6587\u6863",
"href": "./docs/frontend-dashboard-design.html",
"description": "\u5f53\u524d\u672c\u5730\u5de5\u4f5c\u53f0\u7684\u4ea4\u4e92\u4e0e\u89c6\u89c9\u89c4\u8303\u3002"
"label": "\u67b6\u6784\u5e93",
"href": "/architecture/index.html",
"description": "\u67e5\u770b\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u548c\u6388\u6743\u8fb9\u754c\u3002"
}
]
},
@@ -199,93 +199,118 @@
"open": false,
"links": [
{
"label": "\u6b63\u5f0f\u5de5\u4f5c\u53f0",
"href": "./index.html",
"description": "\u672c\u5730\u5316\u4e3b UI\uff0c\u9ed8\u8ba4\u5165\u53e3\u3002"
"label": "\u603b\u89c8\u9996\u9875",
"href": "/overview/index.html",
"description": "\u5de5\u4f5c\u53f0\u603b\u89c8\u3001\u6700\u65b0\u8fd0\u884c\u548c\u5168\u5c40\u6458\u8981\u3002"
},
{
"label": "\u8fd0\u884c\u4e2d\u5fc3",
"href": "/runs/index.html",
"description": "\u8fd0\u884c\u961f\u5217\u3001\u8be6\u60c5\u3001\u8bc1\u636e\u548c\u65e5\u5fd7\u5165\u53e3\u3002"
},
{
"label": "\u7cfb\u7edf\u5206\u7ec4",
"href": "/systems/index.html",
"description": "\u6309\u7cfb\u7edf\u548c\u5206\u7c7b\u6d4f\u89c8\u8986\u76d6\u60c5\u51b5\u3002"
},
{
"label": "\u67b6\u6784\u5e93",
"href": "/architecture/index.html",
"description": "\u67e5\u770b\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u548c\u6388\u6743\u8fb9\u754c\u3002"
},
{
"label": "\u6587\u6863\u4e2d\u5fc3",
"href": "/docs/index.html",
"description": "\u96c6\u4e2d\u67e5\u770b\u9879\u76ee\u6587\u6863\u3001\u672c\u5730\u955c\u50cf\u548c\u8bf4\u660e\u3002"
},
{
"label": "\u6570\u636e\u4e2d\u5fc3",
"href": "/data/index.html",
"description": "\u67e5\u770b summary\u3001runs\u3001systems \u7b49 JSON \u5165\u53e3\u3002"
},
{
"label": "\u65e7\u7248\u5de5\u4f5c\u53f0",
"href": "./legacy/index.html",
"href": "/legacy/index.html",
"description": "\u4fdd\u7559\u7684 legacy \u56de\u9000\u5165\u53e3\u3002"
},
{
"label": "\u9879\u76ee\u529f\u80fd\u6587\u6863",
"href": "./docs/project-features.html",
"href": "/docs/project-features.html",
"description": "\u9879\u76ee\u80fd\u529b\u3001\u76ee\u5f55\u7ed3\u6784\u4e0e\u81ea\u52a8\u5316\u94fe\u8def\u603b\u89c8\u3002"
},
{
"label": "\u524d\u7aef\u8bbe\u8ba1\u6587\u6863",
"href": "./docs/frontend-dashboard-design.html",
"href": "/docs/frontend-dashboard-design.html",
"description": "\u5f53\u524d\u672c\u5730\u5de5\u4f5c\u53f0\u7684\u4ea4\u4e92\u4e0e\u89c6\u89c9\u89c4\u8303\u3002"
},
{
"label": "\u5b89\u5168\u7f16\u7801\u7d22\u5f15",
"href": "./docs/secure-code-index.html",
"href": "/docs/secure-code-index.html",
"description": "secure-code \u4fee\u590d\u5e93\u672c\u5730\u955c\u50cf\u3002"
},
{
"label": "\u4ed3\u5e93\u5165\u53e3\u955c\u50cf",
"href": "./docs/root-readme.html",
"href": "/docs/root-readme.html",
"description": "\u4ed3\u5e93\u6839 README \u7684\u672c\u5730\u955c\u50cf\u3002"
},
{
"label": "\u6388\u6743\u6a21\u578b",
"href": "./docs/authorization-model.html",
"href": "/docs/authorization-model.html",
"description": "\u5141\u8bb8\u76ee\u6807\u8303\u56f4\u3001\u5168\u5c40\u539f\u5219\u4e0e\u8bb0\u5f55\u8981\u6c42\u3002"
},
{
"label": "source-map \u771f\u503c",
"href": "./docs/source-map.html",
"href": "/docs/source-map.html",
"description": "\u7cfb\u7edf\u8986\u76d6\u3001\u6765\u6e90\u548c\u8f93\u51fa\u76ee\u5f55\u771f\u503c\u3002"
},
{
"label": "repro-map \u771f\u503c",
"href": "./docs/repro-map.html",
"href": "/docs/repro-map.html",
"description": "\u590d\u73b0\u65cf\u8def\u7531\u3001\u6d4f\u89c8\u5668\u8981\u6c42\u548c\u65e5\u5fd7\u7b56\u7565\u3002"
},
{
"label": "\u8986\u76d6\u77e9\u9635",
"href": "./docs/coverage-matrix.html",
"href": "/docs/coverage-matrix.html",
"description": "\u81ea\u52a8\u751f\u6210\u8986\u76d6\u6458\u8981\u7684\u672c\u5730\u955c\u50cf\u3002"
},
{
"label": "\u8bbe\u8ba1\u6765\u6e90\u6e05\u5355",
"href": "./docs/design-source.html",
"href": "/docs/design-source.html",
"description": "Lovart \u6a21\u677f\u672c\u5730 vendor manifest\u3002"
},
{
"label": "\u67b6\u6784\u5e93\u955c\u50cf",
"href": "./docs/architecture-library.html",
"href": "/docs/architecture-library.html",
"description": "\u5f53\u524d\u67b6\u6784\u5e93\u7684\u7ed3\u6784\u5316\u955c\u50cf\u9875\u3002"
},
{
"label": "summary.json",
"href": "./summary.json",
"href": "/summary.json",
"description": "\u5168\u5c40\u6458\u8981\u3001\u72b6\u6001\u5206\u5e03\u548c\u6700\u8fd1\u5931\u8d25\u3002"
},
{
"label": "runs.json",
"href": "./runs.json",
"href": "/runs.json",
"description": "\u6700\u8fd1 run \u7684\u7ed3\u6784\u5316\u8be6\u60c5\u3002"
},
{
"label": "systems.json",
"href": "./systems.json",
"href": "/systems.json",
"description": "\u7cfb\u7edf\u7ea7\u8986\u76d6\u4e0e\u6d4f\u89c8\u5668\u8bc1\u636e\u6458\u8981\u3002"
},
{
"label": "advisories.json",
"href": "./advisories.json",
"description": "advisory \u5143\u6570\u636e\u4e0e\u6765\u6e90\u3002"
"href": "/advisories.json",
"description": "\u6f0f\u6d1e\u6761\u76ee\u5143\u6570\u636e\u4e0e\u6765\u6e90\u3002"
},
{
"label": "profiles.json",
"href": "./profiles.json",
"description": "repro profile \u5143\u6570\u636e\u3002"
"href": "/profiles.json",
"description": "\u590d\u73b0\u6863\u6848\u5143\u6570\u636e\u3002"
},
{
"label": "architecture.json",
"href": "./architecture.json",
"href": "/architecture.json",
"description": "\u5f53\u524d\u67b6\u6784\u5e93\u7ed3\u6784\u5316 JSON\u3002"
}
],
@@ -299,9 +324,33 @@
"value": "06-case-studies/generated-runs/<run-id>/"
},
{
"label": "\u5de5\u4f5c\u53f0\u5165\u53e3",
"label": "\u9ed8\u8ba4\u5165\u53e3",
"value": "/index.html"
},
{
"label": "\u603b\u89c8\u5165\u53e3",
"value": "/overview/index.html"
},
{
"label": "\u8fd0\u884c\u5165\u53e3",
"value": "/runs/index.html"
},
{
"label": "\u7cfb\u7edf\u5165\u53e3",
"value": "/systems/index.html"
},
{
"label": "\u67b6\u6784\u5165\u53e3",
"value": "/architecture/index.html"
},
{
"label": "\u6587\u6863\u5165\u53e3",
"value": "/docs/index.html"
},
{
"label": "\u6570\u636e\u5165\u53e3",
"value": "/data/index.html"
},
{
"label": "\u65e7\u7248\u5165\u53e3",
"value": "/legacy/index.html"

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

文件差异内容过多而无法显示 加载差异

查看文件

@@ -289,6 +289,157 @@ select {
margin-top: 22px;
}
.section-nav,
.top-menus {
position: relative;
margin-top: 18px;
}
.section-nav {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 12px;
}
.nav-pill {
display: grid;
gap: 8px;
padding: 14px 16px;
border-radius: 18px;
border: 1px solid var(--border-color);
background: rgba(255, 255, 255, 0.04);
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.nav-pill:hover,
.nav-pill.is-active {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.1);
}
.nav-pill-top {
display: inline-flex;
align-items: center;
gap: 8px;
}
.nav-pill-top strong {
font-size: 0.95rem;
}
.nav-pill-copy {
color: var(--text-secondary);
font-size: 0.82rem;
line-height: 1.45;
}
.top-menus {
display: grid;
gap: 12px;
}
.route-note,
.menu-row,
.hub-card,
.hub-card-static {
border: 1px solid var(--border-color);
border-radius: 16px;
background: rgba(255, 255, 255, 0.04);
}
.route-note,
.menu-row {
padding: 14px 16px;
}
.route-note {
display: flex;
justify-content: space-between;
gap: 16px;
align-items: flex-start;
}
.route-note strong {
display: block;
font-size: 1rem;
}
.route-note span {
display: block;
margin-top: 6px;
color: var(--text-secondary);
line-height: 1.5;
}
.menu-row {
display: grid;
gap: 12px;
}
.menu-row-compact {
padding-top: 12px;
padding-bottom: 12px;
}
.menu-row-head {
display: flex;
justify-content: space-between;
gap: 12px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.74rem;
}
.chip-strip {
display: flex;
gap: 10px;
overflow-x: auto;
padding-bottom: 4px;
}
.chip-strip::-webkit-scrollbar {
height: 6px;
}
.chip-strip::-webkit-scrollbar-thumb {
background: rgba(148, 163, 184, 0.3);
border-radius: 999px;
}
.menu-chip {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 34px;
padding: 8px 14px;
border-radius: 999px;
border: 1px solid var(--border-color);
background: rgba(255, 255, 255, 0.04);
color: var(--text-primary);
cursor: pointer;
white-space: nowrap;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.menu-chip:hover,
.menu-chip.is-active,
.menu-chip-link:hover {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.1);
}
.menu-chip-muted {
color: var(--text-secondary);
}
.menu-chip-link {
text-decoration: none;
}
.metric-card {
position: relative;
padding: 16px 18px;
@@ -502,6 +653,10 @@ select {
padding-right: 4px;
}
.run-list-compact {
max-height: 560px;
}
.run-card {
cursor: pointer;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
@@ -582,6 +737,35 @@ select {
min-width: 0;
}
.workspace-stack,
.system-grid,
.hub-grid {
display: grid;
gap: 16px;
}
.system-grid {
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
.hub-grid {
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.hub-card,
.hub-card-static {
display: grid;
gap: 10px;
padding: 14px 16px;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.hub-card:hover {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.08);
}
.workspace-empty {
display: grid;
place-items: center;
@@ -619,6 +803,12 @@ select {
margin-top: 18px;
}
.button-small {
min-height: 36px;
padding: 8px 12px;
font-size: 0.84rem;
}
.detail-stat-grid,
.plan-grid,
.raw-json-grid {
@@ -918,6 +1108,10 @@ select {
word-break: break-all;
}
.system-card-compact .detail-actions {
margin-top: 10px;
}
.viewer-frame {
min-height: 320px;
border: 1px solid rgba(148, 163, 184, 0.16);
@@ -1181,6 +1375,7 @@ select {
@media (max-width: 1320px) {
.hero-top,
.main-container,
.section-nav,
.detail-stat-grid,
.plan-grid,
.raw-json-grid {
@@ -1211,6 +1406,7 @@ select {
}
.hero-links,
.route-note,
.detail-actions,
.tag-row,
.panel-meta,

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -82,12 +82,12 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>当前架构库镜像</h1>
<div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div>
<pre>{
&quot;generated_at&quot;: &quot;2026-03-17T09:03:14+00:00&quot;,
&quot;generated_at&quot;: &quot;2026-03-17T09:27:20+00:00&quot;,
&quot;title&quot;: &quot;当前架构库&quot;,
&quot;summary&quot;: &quot;工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。&quot;,
&quot;sections&quot;: [
@@ -137,29 +137,29 @@
},
{
&quot;label&quot;: &quot;生成时间&quot;,
&quot;value&quot;: &quot;2026-03-17T09:03:14+00:00&quot;
&quot;value&quot;: &quot;2026-03-17T09:27:20+00:00&quot;
}
],
&quot;links&quot;: [
{
&quot;label&quot;: &quot;正式工作台&quot;,
&quot;href&quot;: &quot;./index.html&quot;,
&quot;description&quot;: &quot;本地化主 UI,默认入口&quot;
&quot;label&quot;: &quot;总览首页&quot;,
&quot;href&quot;: &quot;/overview/index.html&quot;,
&quot;description&quot;: &quot;工作台总览、最新运行和全局摘要&quot;
},
{
&quot;label&quot;: &quot;旧版工作台&quot;,
&quot;href&quot;: &quot;./legacy/index.html&quot;,
&quot;description&quot;: &quot;保留的 legacy 回退入口。&quot;
&quot;label&quot;: &quot;运行中心&quot;,
&quot;href&quot;: &quot;/runs/index.html&quot;,
&quot;description&quot;: &quot;运行队列、详情、证据和日志入口。&quot;
},
{
&quot;label&quot;: &quot;项目功能文档&quot;,
&quot;href&quot;: &quot;./docs/project-features.html&quot;,
&quot;description&quot;: &quot;项目能力、目录结构与自动化链路总览&quot;
&quot;label&quot;: &quot;系统分组&quot;,
&quot;href&quot;: &quot;/systems/index.html&quot;,
&quot;description&quot;: &quot;按系统和分类浏览覆盖情况&quot;
},
{
&quot;label&quot;: &quot;前端设计文档&quot;,
&quot;href&quot;: &quot;./docs/frontend-dashboard-design.html&quot;,
&quot;description&quot;: &quot;当前本地工作台的交互与视觉规范&quot;
&quot;label&quot;: &quot;架构库&quot;,
&quot;href&quot;: &quot;/architecture/index.html&quot;,
&quot;description&quot;: &quot;查看控制面、数据层和授权边界&quot;
}
]
},
@@ -287,93 +287,118 @@
&quot;open&quot;: false,
&quot;links&quot;: [
{
&quot;label&quot;: &quot;正式工作台&quot;,
&quot;href&quot;: &quot;./index.html&quot;,
&quot;description&quot;: &quot;本地化主 UI,默认入口&quot;
&quot;label&quot;: &quot;总览首页&quot;,
&quot;href&quot;: &quot;/overview/index.html&quot;,
&quot;description&quot;: &quot;工作台总览、最新运行和全局摘要&quot;
},
{
&quot;label&quot;: &quot;运行中心&quot;,
&quot;href&quot;: &quot;/runs/index.html&quot;,
&quot;description&quot;: &quot;运行队列、详情、证据和日志入口。&quot;
},
{
&quot;label&quot;: &quot;系统分组&quot;,
&quot;href&quot;: &quot;/systems/index.html&quot;,
&quot;description&quot;: &quot;按系统和分类浏览覆盖情况。&quot;
},
{
&quot;label&quot;: &quot;架构库&quot;,
&quot;href&quot;: &quot;/architecture/index.html&quot;,
&quot;description&quot;: &quot;查看控制面、数据层和授权边界。&quot;
},
{
&quot;label&quot;: &quot;文档中心&quot;,
&quot;href&quot;: &quot;/docs/index.html&quot;,
&quot;description&quot;: &quot;集中查看项目文档、本地镜像和说明。&quot;
},
{
&quot;label&quot;: &quot;数据中心&quot;,
&quot;href&quot;: &quot;/data/index.html&quot;,
&quot;description&quot;: &quot;查看 summary、runs、systems 等 JSON 入口。&quot;
},
{
&quot;label&quot;: &quot;旧版工作台&quot;,
&quot;href&quot;: &quot;./legacy/index.html&quot;,
&quot;href&quot;: &quot;/legacy/index.html&quot;,
&quot;description&quot;: &quot;保留的 legacy 回退入口。&quot;
},
{
&quot;label&quot;: &quot;项目功能文档&quot;,
&quot;href&quot;: &quot;./docs/project-features.html&quot;,
&quot;href&quot;: &quot;/docs/project-features.html&quot;,
&quot;description&quot;: &quot;项目能力、目录结构与自动化链路总览。&quot;
},
{
&quot;label&quot;: &quot;前端设计文档&quot;,
&quot;href&quot;: &quot;./docs/frontend-dashboard-design.html&quot;,
&quot;href&quot;: &quot;/docs/frontend-dashboard-design.html&quot;,
&quot;description&quot;: &quot;当前本地工作台的交互与视觉规范。&quot;
},
{
&quot;label&quot;: &quot;安全编码索引&quot;,
&quot;href&quot;: &quot;./docs/secure-code-index.html&quot;,
&quot;href&quot;: &quot;/docs/secure-code-index.html&quot;,
&quot;description&quot;: &quot;secure-code 修复库本地镜像。&quot;
},
{
&quot;label&quot;: &quot;仓库入口镜像&quot;,
&quot;href&quot;: &quot;./docs/root-readme.html&quot;,
&quot;href&quot;: &quot;/docs/root-readme.html&quot;,
&quot;description&quot;: &quot;仓库根 README 的本地镜像。&quot;
},
{
&quot;label&quot;: &quot;授权模型&quot;,
&quot;href&quot;: &quot;./docs/authorization-model.html&quot;,
&quot;href&quot;: &quot;/docs/authorization-model.html&quot;,
&quot;description&quot;: &quot;允许目标范围、全局原则与记录要求。&quot;
},
{
&quot;label&quot;: &quot;source-map 真值&quot;,
&quot;href&quot;: &quot;./docs/source-map.html&quot;,
&quot;href&quot;: &quot;/docs/source-map.html&quot;,
&quot;description&quot;: &quot;系统覆盖、来源和输出目录真值。&quot;
},
{
&quot;label&quot;: &quot;repro-map 真值&quot;,
&quot;href&quot;: &quot;./docs/repro-map.html&quot;,
&quot;href&quot;: &quot;/docs/repro-map.html&quot;,
&quot;description&quot;: &quot;复现族路由、浏览器要求和日志策略。&quot;
},
{
&quot;label&quot;: &quot;覆盖矩阵&quot;,
&quot;href&quot;: &quot;./docs/coverage-matrix.html&quot;,
&quot;href&quot;: &quot;/docs/coverage-matrix.html&quot;,
&quot;description&quot;: &quot;自动生成覆盖摘要的本地镜像。&quot;
},
{
&quot;label&quot;: &quot;设计来源清单&quot;,
&quot;href&quot;: &quot;./docs/design-source.html&quot;,
&quot;href&quot;: &quot;/docs/design-source.html&quot;,
&quot;description&quot;: &quot;Lovart 模板本地 vendor manifest。&quot;
},
{
&quot;label&quot;: &quot;架构库镜像&quot;,
&quot;href&quot;: &quot;./docs/architecture-library.html&quot;,
&quot;href&quot;: &quot;/docs/architecture-library.html&quot;,
&quot;description&quot;: &quot;当前架构库的结构化镜像页。&quot;
},
{
&quot;label&quot;: &quot;summary.json&quot;,
&quot;href&quot;: &quot;./summary.json&quot;,
&quot;href&quot;: &quot;/summary.json&quot;,
&quot;description&quot;: &quot;全局摘要、状态分布和最近失败。&quot;
},
{
&quot;label&quot;: &quot;runs.json&quot;,
&quot;href&quot;: &quot;./runs.json&quot;,
&quot;href&quot;: &quot;/runs.json&quot;,
&quot;description&quot;: &quot;最近 run 的结构化详情。&quot;
},
{
&quot;label&quot;: &quot;systems.json&quot;,
&quot;href&quot;: &quot;./systems.json&quot;,
&quot;href&quot;: &quot;/systems.json&quot;,
&quot;description&quot;: &quot;系统级覆盖与浏览器证据摘要。&quot;
},
{
&quot;label&quot;: &quot;advisories.json&quot;,
&quot;href&quot;: &quot;./advisories.json&quot;,
&quot;description&quot;: &quot;advisory 元数据与来源。&quot;
&quot;href&quot;: &quot;/advisories.json&quot;,
&quot;description&quot;: &quot;漏洞条目元数据与来源。&quot;
},
{
&quot;label&quot;: &quot;profiles.json&quot;,
&quot;href&quot;: &quot;./profiles.json&quot;,
&quot;description&quot;: &quot;repro profile 元数据。&quot;
&quot;href&quot;: &quot;/profiles.json&quot;,
&quot;description&quot;: &quot;复现档案元数据。&quot;
},
{
&quot;label&quot;: &quot;architecture.json&quot;,
&quot;href&quot;: &quot;./architecture.json&quot;,
&quot;href&quot;: &quot;/architecture.json&quot;,
&quot;description&quot;: &quot;当前架构库结构化 JSON。&quot;
}
],
@@ -387,9 +412,33 @@
&quot;value&quot;: &quot;06-case-studies/generated-runs/&lt;run-id&gt;/&quot;
},
{
&quot;label&quot;: &quot;工作台入口&quot;,
&quot;label&quot;: &quot;默认入口&quot;,
&quot;value&quot;: &quot;/index.html&quot;
},
{
&quot;label&quot;: &quot;总览入口&quot;,
&quot;value&quot;: &quot;/overview/index.html&quot;
},
{
&quot;label&quot;: &quot;运行入口&quot;,
&quot;value&quot;: &quot;/runs/index.html&quot;
},
{
&quot;label&quot;: &quot;系统入口&quot;,
&quot;value&quot;: &quot;/systems/index.html&quot;
},
{
&quot;label&quot;: &quot;架构入口&quot;,
&quot;value&quot;: &quot;/architecture/index.html&quot;
},
{
&quot;label&quot;: &quot;文档入口&quot;,
&quot;value&quot;: &quot;/docs/index.html&quot;
},
{
&quot;label&quot;: &quot;数据入口&quot;,
&quot;value&quot;: &quot;/data/index.html&quot;
},
{
&quot;label&quot;: &quot;旧版入口&quot;,
&quot;value&quot;: &quot;/legacy/index.html&quot;

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>授权模型镜像</h1>
<div class="meta">工作台内置镜像页:目标范围、授权模型、最小化验证建议和记录要求。</div>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>覆盖矩阵镜像</h1>
<div class="meta">工作台内置镜像页:当前覆盖矩阵生成结果。</div>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>Lovart 设计来源与本地化清单</h1>
<div class="meta">工作台内置镜像页Lovart 来源文件、本地 vendor 路径和本地化说明。</div>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>本地前端工作台设计文档</h1>
<div class="meta">工作台内置镜像页:前端交互、展示结构和视觉规范。</div>
@@ -108,7 +108,7 @@
### 2.1 页面名称
- 页面名称:`Authorized Lab Dashboard`
- 页面名称:`授权攻防实验工作台`
- 页面语境:本地静态前端 + 本地文件 JSON 数据源
- 非目标:在线 SaaS、多用户后端、生产管理台
@@ -119,7 +119,7 @@
- 信息密度高,但必须可折叠、可筛选、可逐层展开
- 日志与原始 JSON 必须能直接预览
- 页面视觉应更生动,但不能牺牲扫描效率
- 默认路由采用正式新 UI,同时保留 `legacy` 回退入口
- 默认路由采用分板块 URL,同时保留 `legacy` 回退入口
- 运行期不得依赖外部 HTML、字体 CDN 或图标 CDN
## 3. 信息架构
@@ -127,7 +127,8 @@
```mermaid
flowchart LR
A[&quot;Hero + Global Status&quot;] --&gt; B[&quot;Sidebar Filters&quot;]
A --&gt; C[&quot;Run Queue List&quot;]
A --&gt; B1[&quot;Top Section Nav&quot;]
B1 --&gt; C[&quot;Overview / Runs / Systems / Architecture / Docs / Data&quot;]
C --&gt; D[&quot;Run Detail Hero&quot;]
D --&gt; E[&quot;Progress Timeline&quot;]
D --&gt; F[&quot;Attack Plan &amp; Reasoning&quot;]
@@ -150,6 +151,8 @@ flowchart LR
- 自动刷新开关
- 当前同步状态
- 核心 metric cards
- 顶部板块菜单
- 顶部 chips 分类筛选
视觉要求:
@@ -159,24 +162,22 @@ flowchart LR
### 4.2 左侧侧栏
包含四块
改为按板块变化,不再固定使用长下拉
- Filters
- Overview
- 搜索
- system filter
- status filter
- profile filter
- 最近失败
- 最新运行
- 系统概览
- Runs
- 搜索
- 最近失败
- 运行队列
- Systems
- 系统覆盖度
- browser evidence 覆盖
- latest update
- Recent Failures
- 最近 blocker
- status
- 原因摘要
- Run Queue View
- 最近 run 卡片列表
- 可选中并切换到 detail panel
- 搜索
- 系统目录
- Architecture / Docs / Data
- 对应目录、入口或结构列表
### 4.3 右侧 Detail Workspace
@@ -241,7 +242,7 @@ flowchart LR
- 点击左侧 run card 后,右侧 detail panel 即时刷新
- 当前选中项要有强视觉区别
- URL hash 应保留 `#run=&lt;id&gt;`,方便直接打开特定 run
- URL 应按板块进入不同入口,并通过 query 参数保留筛选与 `run=&lt;id&gt;`
### 5.3 Artifact 预览
@@ -387,7 +388,19 @@ flowchart LR
## 10. 路由与文档地址
- `/index.html`
- 默认正式入口,使用本地化 Lovart UI 外壳
- 根入口别名
- `/overview/index.html`
- 总览入口
- `/runs/index.html`
- 运行中心
- `/systems/index.html`
- 系统中心
- `/architecture/index.html`
- 架构中心
- `/docs/index.html`
- 文档中心
- `/data/index.html`
- 数据中心
- `/legacy/index.html`
- 旧版 dashboard 回退入口
- `/docs/project-features.html`
@@ -415,7 +428,8 @@ flowchart LR
- 能折叠与展开各信息区
- 能打开并预览 JSON / text / image / html artifact
- 能看到失败原因、思路、来源、修复主题
- 能筛选 system / status / profile
- 能通过顶部 chips 筛选状态 / 板块 / 漏洞家族
- 能通过分板块 URL 直接打开 overview / runs / systems / architecture / docs / data
- 能在自动刷新开启时重新载入 dashboard 数据
- 页面视觉比“普通表格页”更生动,但仍适合高密度阅读
</pre>

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>项目功能与特性总览</h1>
<div class="meta">工作台内置镜像页:仓库功能、目录和自动化链路说明。</div>
@@ -149,7 +149,8 @@
- `report.md`, `report.html`, `timeline.mmd`, `assets/`, `logs/`
- `08-threat-intel/generated/dashboard/`
- 静态前端工作台
- `/index.html` 为本地化 Lovart 正式 UI
- `/index.html` 为根入口别名
- `/overview/index.html`, `/runs/index.html`, `/systems/index.html`, `/architecture/index.html`, `/docs/index.html`, `/data/index.html` 为分类入口
- `/legacy/index.html` 为旧版工作台回退入口
- `/docs/*.html` 为本地可访问的说明、真值配置与设计镜像页
- `architecture.json` 为当前架构库结构化真值
@@ -244,6 +245,8 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
前端不只是“一个结果页”,而是本地实验控制台与证据阅读器。它需要:
- 快速定位系统 / advisory / repro profile
- 通过顶部板块菜单切换总览、运行、系统、架构、文档和数据中心
- 使用顶部 chips 做状态 / 板块 / 漏洞家族筛选,不再依赖过长下拉
- 折叠与展开 timeline、evidence、sources、raw JSON
- 折叠与展开“当前架构库”,查看控制面、数据层、地址入口、授权边界和系统分组
- 直接查看 compose、JSON、日志、截图、报告
@@ -257,7 +260,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
当前地址布局固定为:
- `/index.html`
- 默认新 UI,基于本地化 Lovart 视觉壳层,绑定真实 dashboard JSON
- 根入口别名,默认进入概览
- `/overview/index.html`
- 总览入口
- `/runs/index.html`
- 运行中心
- `/systems/index.html`
- 系统中心
- `/architecture/index.html`
- 架构中心
- `/docs/index.html`
- 文档中心
- `/data/index.html`
- 数据中心
- `/legacy/index.html`
- 旧版工作台显式保留,用于快速回退和对照
- `/docs/design-source.html`

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>repro-map 真值镜像</h1>
<div class="meta">工作台内置镜像页:默认漏洞家族、浏览器要求和日志策略真值。</div>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>仓库入口镜像</h1>
<div class="meta">工作台内置镜像页:仓库定位、能力矩阵、入口和自动化入口。</div>
@@ -163,7 +163,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
本地 dashboard 路由:
- `/index.html`
- 默认正式 UI,使用本地化 Lovart 视觉壳层
- 根入口别名,默认进入概览视图
- `/overview/index.html`
- 总览入口,显示全局指标、最新运行、系统摘要与架构预览
- `/runs/index.html`
- 运行中心,显示运行队列、详情、证据、日志与原始 JSON
- `/systems/index.html`
- 系统中心,按板块查看系统覆盖并跳转到对应运行
- `/architecture/index.html`
- 架构中心,折叠查看控制面、数据层、授权边界与本地入口
- `/docs/index.html`
- 文档中心,集中访问功能文档、设计文档和镜像页
- `/data/index.html`
- 数据中心,集中访问 summary、runs、systems、profiles 等 JSON
- `/legacy/index.html`
- 旧版工作台回退入口
- `/docs/design-source.html`

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>安全编码修复库索引</h1>
<div class="meta">工作台内置镜像页secure-code 修复主题索引。</div>

查看文件

@@ -82,7 +82,7 @@
<main>
<div class="panel">
<div class="actions">
<a class="chip" href="../index.html">返回工作台</a>
<a class="chip" href="/overview/index.html">返回工作台</a>
</div>
<h1>source-map 真值镜像</h1>
<div class="meta">工作台内置镜像页:系统覆盖、来源、输出目录和 secure-code 主题真值。</div>

查看文件

@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="./assets/styles.css">
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
@@ -16,7 +16,7 @@
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="./assets/icons.svg#spark"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
@@ -28,7 +28,7 @@
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="./assets/icons.svg#refresh"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
@@ -39,27 +39,27 @@
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="./assets/icons.svg#sync"></use></svg>
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="./docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#docs"></use></svg>
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="./docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#playbook"></use></svg>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="./docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="./legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#legacy"></use></svg>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
@@ -67,85 +67,16 @@
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside class="sidebar">
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#filter"></use></svg>
筛选器
</span>
<span id="runCount" class="section-badge">0 条</span>
</div>
<div class="filter-group">
<label class="field">
<span>搜索</span>
<div class="search-box">
<svg class="icon"><use href="./assets/icons.svg#search"></use></svg>
<input id="searchInput" type="text" placeholder="搜索 run id、advisory、标题、概要">
</div>
</label>
<label class="field">
<span>系统</span>
<select id="systemFilter" class="filter-select">
<option value="">全部系统</option>
</select>
</label>
<label class="field">
<span>状态</span>
<select id="statusFilter" class="filter-select">
<option value="">全部状态</option>
</select>
</label>
<label class="field">
<span>Profile</span>
<select id="profileFilter" class="filter-select">
<option value="">全部复现档案</option>
</select>
</label>
</div>
</section>
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
系统概览
</span>
</div>
<div id="systemStats" class="system-stats"></div>
</section>
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#failure"></use></svg>
最近失败
</span>
</div>
<div id="recentFailures" class="failure-list"></div>
</section>
<section class="sidebar-section sidebar-section-fill">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#queue"></use></svg>
运行队列
</span>
</div>
<div id="runQueue" class="run-list"></div>
</section>
</aside>
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="./assets/icons.svg#shield"></use></svg>
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
@@ -155,19 +86,19 @@
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="./assets/icons.svg#source"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="./docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="./assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="./architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="./summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="./assets/app.js"></script>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -94,10 +94,10 @@
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/gitea-livecheck-20260316/timeline.mmd"
},
"dashboard_refs": {
"report_html": "./runs/gitea-livecheck-20260316/report.html",
"report_md": "./runs/gitea-livecheck-20260316/report.md",
"timeline": "./runs/gitea-livecheck-20260316/timeline.mmd",
"bundle": "./runs/gitea-livecheck-20260316/run.json"
"report_html": "/runs/gitea-livecheck-20260316/report.html",
"report_md": "/runs/gitea-livecheck-20260316/report.md",
"timeline": "/runs/gitea-livecheck-20260316/timeline.mmd",
"bundle": "/runs/gitea-livecheck-20260316/run.json"
},
"browser_links": [],
"container_links": [],
@@ -201,22 +201,22 @@
"count": 4,
"items": [
{
"href": "./runs/gitea-livecheck-20260316/report.html",
"href": "/runs/gitea-livecheck-20260316/report.html",
"label": "report.html",
"kind": "text"
},
{
"href": "./runs/gitea-livecheck-20260316/report.md",
"href": "/runs/gitea-livecheck-20260316/report.md",
"label": "report.md",
"kind": "text"
},
{
"href": "./runs/gitea-livecheck-20260316/timeline.mmd",
"href": "/runs/gitea-livecheck-20260316/timeline.mmd",
"label": "timeline.mmd",
"kind": "text"
},
{
"href": "./runs/gitea-livecheck-20260316/run.json",
"href": "/runs/gitea-livecheck-20260316/run.json",
"label": "run.json",
"kind": "text"
}
@@ -228,7 +228,7 @@
"count": 1,
"items": [
{
"href": "./runs/gitea-livecheck-20260316/compose/compose.yaml",
"href": "/runs/gitea-livecheck-20260316/compose/compose.yaml",
"label": "compose.yaml",
"kind": "text"
}
@@ -267,10 +267,10 @@
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd"
},
"dashboard_refs": {
"report_html": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
"report_md": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
"timeline": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
"bundle": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json"
"report_html": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
"report_md": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
"timeline": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
"bundle": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json"
},
"browser_evidence": {
"required": false,
@@ -280,8 +280,8 @@
"browser_links": [],
"container_links": [],
"request_links": [
"./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
"./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json"
"/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
"/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json"
],
"advisory_meta": {
"canonical_id": "gitea--CVE-2025-68939",
@@ -382,22 +382,22 @@
"count": 4,
"items": [
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
"label": "report.html",
"kind": "text"
},
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
"label": "report.md",
"kind": "text"
},
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
"label": "timeline.mmd",
"kind": "text"
},
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json",
"label": "run.json",
"kind": "text"
}
@@ -409,12 +409,12 @@
"count": 2,
"items": [
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
"label": "attack.json",
"kind": "text"
},
{
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json",
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json",
"label": "baseline.json",
"kind": "text"
}
@@ -462,10 +462,10 @@
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd"
},
"dashboard_refs": {
"report_html": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
"report_md": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
"timeline": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
"bundle": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json"
"report_html": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
"report_md": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
"timeline": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
"bundle": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json"
},
"browser_evidence": {
"required": false,
@@ -475,8 +475,8 @@
"browser_links": [],
"container_links": [],
"request_links": [
"./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
"./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json"
"/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
"/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json"
],
"advisory_meta": {
"canonical_id": "nextjs--CVE-2025-29927",
@@ -580,22 +580,22 @@
"count": 4,
"items": [
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
"label": "report.html",
"kind": "text"
},
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
"label": "report.md",
"kind": "text"
},
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
"label": "timeline.mmd",
"kind": "text"
},
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json",
"label": "run.json",
"kind": "text"
}
@@ -607,7 +607,7 @@
"count": 1,
"items": [
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json",
"label": "baseline.json",
"kind": "text"
}
@@ -619,7 +619,7 @@
"count": 1,
"items": [
{
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
"label": "attack.json",
"kind": "text"
}

查看文件

@@ -1 +0,0 @@
../../../../06-case-studies/generated-runs/gitea-gitea--CVE-2025-68939-20260317063330

查看文件

@@ -1 +0,0 @@
../../../../06-case-studies/generated-runs/gitea-livecheck-20260316

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -1 +0,0 @@
../../../../06-case-studies/generated-runs/nextjs-nextjs--CVE-2025-29927-20260317063047

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:03:14+00:00",
"generated_at": "2026-03-17T09:27:20+00:00",
"advisory_count": 89,
"run_count": 3,
"statuses": {
@@ -40,7 +40,10 @@
"manual": 36,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-03T04:57:57.697708Z"
"latest_update": "2026-03-03T04:57:57.697708Z",
"category": "platforms",
"tier": "rolling-24m",
"output_dir": "07-framework-security/platforms/gitea"
},
{
"system_id": "nextjs",
@@ -52,7 +55,10 @@
"manual": 26,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-13T22:14:13.665535Z"
"latest_update": "2026-03-13T22:14:13.665535Z",
"category": "frameworks",
"tier": "history-full",
"output_dir": "07-framework-security/frameworks/nextjs"
},
{
"system_id": "undici",
@@ -64,7 +70,10 @@
"manual": 14,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-14T09:19:54.772219Z"
"latest_update": "2026-03-14T09:19:54.772219Z",
"category": "frameworks",
"tier": "rolling-24m",
"output_dir": "07-framework-security/frameworks/undici"
},
{
"system_id": "vite",
@@ -76,7 +85,10 @@
"manual": 12,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-02-04T04:37:24.129476Z"
"latest_update": "2026-02-04T04:37:24.129476Z",
"category": "frameworks",
"tier": "history-full",
"output_dir": "07-framework-security/frameworks/vite"
}
]
}

查看文件

@@ -9,7 +9,10 @@
"manual": 36,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-03T04:57:57.697708Z"
"latest_update": "2026-03-03T04:57:57.697708Z",
"category": "platforms",
"tier": "rolling-24m",
"output_dir": "07-framework-security/platforms/gitea"
},
{
"system_id": "nextjs",
@@ -21,7 +24,10 @@
"manual": 26,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-13T22:14:13.665535Z"
"latest_update": "2026-03-13T22:14:13.665535Z",
"category": "frameworks",
"tier": "history-full",
"output_dir": "07-framework-security/frameworks/nextjs"
},
{
"system_id": "undici",
@@ -33,7 +39,10 @@
"manual": 14,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-03-14T09:19:54.772219Z"
"latest_update": "2026-03-14T09:19:54.772219Z",
"category": "frameworks",
"tier": "rolling-24m",
"output_dir": "07-framework-security/frameworks/undici"
},
{
"system_id": "vite",
@@ -45,6 +54,9 @@
"manual": 12,
"browser_required": 0,
"browser_present": 0,
"latest_update": "2026-02-04T04:37:24.129476Z"
"latest_update": "2026-02-04T04:37:24.129476Z",
"category": "frameworks",
"tier": "history-full",
"output_dir": "07-framework-security/frameworks/vite"
}
]

查看文件

@@ -0,0 +1,104 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<div class="dashboard-shell">
<header class="hero">
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
</section>
</main>
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -1,6 +1,6 @@
# 最新同步摘要
- 渲染时间: `2026-03-17T09:03:14+00:00`
- 渲染时间: `2026-03-17T09:27:20+00:00`
- 系统数量: `62`
- Advisory 数量: `89`
- 重点 Markdown 数量: `89`

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:03:14+00:00",
"generated_at": "2026-03-17T09:27:20+00:00",
"system_count": 62,
"advisory_count": 89,
"markdown_count": 89,

查看文件

@@ -75,7 +75,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
本地 dashboard 路由:
- `/index.html`
- 默认正式 UI,使用本地化 Lovart 视觉壳层
- 根入口别名,默认进入概览视图
- `/overview/index.html`
- 总览入口,显示全局指标、最新运行、系统摘要与架构预览
- `/runs/index.html`
- 运行中心,显示运行队列、详情、证据、日志与原始 JSON
- `/systems/index.html`
- 系统中心,按板块查看系统覆盖并跳转到对应运行
- `/architecture/index.html`
- 架构中心,折叠查看控制面、数据层、授权边界与本地入口
- `/docs/index.html`
- 文档中心,集中访问功能文档、设计文档和镜像页
- `/data/index.html`
- 数据中心,集中访问 summary、runs、systems、profiles 等 JSON
- `/legacy/index.html`
- 旧版工作台回退入口
- `/docs/design-source.html`

查看文件

@@ -20,7 +20,7 @@
### 2.1 页面名称
- 页面名称:`Authorized Lab Dashboard`
- 页面名称:`授权攻防实验工作台`
- 页面语境:本地静态前端 + 本地文件 JSON 数据源
- 非目标:在线 SaaS、多用户后端、生产管理台
@@ -31,7 +31,7 @@
- 信息密度高,但必须可折叠、可筛选、可逐层展开
- 日志与原始 JSON 必须能直接预览
- 页面视觉应更生动,但不能牺牲扫描效率
- 默认路由采用正式新 UI,同时保留 `legacy` 回退入口
- 默认路由采用分板块 URL,同时保留 `legacy` 回退入口
- 运行期不得依赖外部 HTML、字体 CDN 或图标 CDN
## 3. 信息架构
@@ -39,7 +39,8 @@
```mermaid
flowchart LR
A["Hero + Global Status"] --> B["Sidebar Filters"]
A --> C["Run Queue List"]
A --> B1["Top Section Nav"]
B1 --> C["Overview / Runs / Systems / Architecture / Docs / Data"]
C --> D["Run Detail Hero"]
D --> E["Progress Timeline"]
D --> F["Attack Plan & Reasoning"]
@@ -62,6 +63,8 @@ flowchart LR
- 自动刷新开关
- 当前同步状态
- 核心 metric cards
- 顶部板块菜单
- 顶部 chips 分类筛选
视觉要求:
@@ -71,24 +74,22 @@ flowchart LR
### 4.2 左侧侧栏
包含四块
改为按板块变化,不再固定使用长下拉
- Filters
- Overview
- 搜索
- system filter
- status filter
- profile filter
- 最近失败
- 最新运行
- 系统概览
- Runs
- 搜索
- 最近失败
- 运行队列
- Systems
- 系统覆盖度
- browser evidence 覆盖
- latest update
- Recent Failures
- 最近 blocker
- status
- 原因摘要
- Run Queue View
- 最近 run 卡片列表
- 可选中并切换到 detail panel
- 搜索
- 系统目录
- Architecture / Docs / Data
- 对应目录、入口或结构列表
### 4.3 右侧 Detail Workspace
@@ -153,7 +154,7 @@ flowchart LR
- 点击左侧 run card 后,右侧 detail panel 即时刷新
- 当前选中项要有强视觉区别
- URL hash 应保留 `#run=<id>`,方便直接打开特定 run
- URL 应按板块进入不同入口,并通过 query 参数保留筛选与 `run=<id>`
### 5.3 Artifact 预览
@@ -299,7 +300,19 @@ flowchart LR
## 10. 路由与文档地址
- `/index.html`
- 默认正式入口,使用本地化 Lovart UI 外壳
- 根入口别名
- `/overview/index.html`
- 总览入口
- `/runs/index.html`
- 运行中心
- `/systems/index.html`
- 系统中心
- `/architecture/index.html`
- 架构中心
- `/docs/index.html`
- 文档中心
- `/data/index.html`
- 数据中心
- `/legacy/index.html`
- 旧版 dashboard 回退入口
- `/docs/project-features.html`
@@ -327,6 +340,7 @@ flowchart LR
- 能折叠与展开各信息区
- 能打开并预览 JSON / text / image / html artifact
- 能看到失败原因、思路、来源、修复主题
-筛选 system / status / profile
-通过顶部 chips 筛选状态 / 板块 / 漏洞家族
- 能通过分板块 URL 直接打开 overview / runs / systems / architecture / docs / data
- 能在自动刷新开启时重新载入 dashboard 数据
- 页面视觉比“普通表格页”更生动,但仍适合高密度阅读

查看文件

@@ -61,7 +61,8 @@
- `report.md`, `report.html`, `timeline.mmd`, `assets/`, `logs/`
- `08-threat-intel/generated/dashboard/`
- 静态前端工作台
- `/index.html`本地化 Lovart 正式 UI
- `/index.html`根入口别名
- `/overview/index.html`, `/runs/index.html`, `/systems/index.html`, `/architecture/index.html`, `/docs/index.html`, `/data/index.html` 为分类入口
- `/legacy/index.html` 为旧版工作台回退入口
- `/docs/*.html` 为本地可访问的说明、真值配置与设计镜像页
- `architecture.json` 为当前架构库结构化真值
@@ -156,6 +157,8 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
前端不只是“一个结果页”,而是本地实验控制台与证据阅读器。它需要:
- 快速定位系统 / advisory / repro profile
- 通过顶部板块菜单切换总览、运行、系统、架构、文档和数据中心
- 使用顶部 chips 做状态 / 板块 / 漏洞家族筛选,不再依赖过长下拉
- 折叠与展开 timeline、evidence、sources、raw JSON
- 折叠与展开“当前架构库”,查看控制面、数据层、地址入口、授权边界和系统分组
- 直接查看 compose、JSON、日志、截图、报告
@@ -169,7 +172,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
当前地址布局固定为:
- `/index.html`
- 默认新 UI,基于本地化 Lovart 视觉壳层,绑定真实 dashboard JSON
- 根入口别名,默认进入概览
- `/overview/index.html`
- 总览入口
- `/runs/index.html`
- 运行中心
- `/systems/index.html`
- 系统中心
- `/architecture/index.html`
- 架构中心
- `/docs/index.html`
- 文档中心
- `/data/index.html`
- 数据中心
- `/legacy/index.html`
- 旧版工作台显式保留,用于快速回退和对照
- `/docs/design-source.html`

查看文件

@@ -289,6 +289,157 @@ select {
margin-top: 22px;
}
.section-nav,
.top-menus {
position: relative;
margin-top: 18px;
}
.section-nav {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 12px;
}
.nav-pill {
display: grid;
gap: 8px;
padding: 14px 16px;
border-radius: 18px;
border: 1px solid var(--border-color);
background: rgba(255, 255, 255, 0.04);
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.nav-pill:hover,
.nav-pill.is-active {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.1);
}
.nav-pill-top {
display: inline-flex;
align-items: center;
gap: 8px;
}
.nav-pill-top strong {
font-size: 0.95rem;
}
.nav-pill-copy {
color: var(--text-secondary);
font-size: 0.82rem;
line-height: 1.45;
}
.top-menus {
display: grid;
gap: 12px;
}
.route-note,
.menu-row,
.hub-card,
.hub-card-static {
border: 1px solid var(--border-color);
border-radius: 16px;
background: rgba(255, 255, 255, 0.04);
}
.route-note,
.menu-row {
padding: 14px 16px;
}
.route-note {
display: flex;
justify-content: space-between;
gap: 16px;
align-items: flex-start;
}
.route-note strong {
display: block;
font-size: 1rem;
}
.route-note span {
display: block;
margin-top: 6px;
color: var(--text-secondary);
line-height: 1.5;
}
.menu-row {
display: grid;
gap: 12px;
}
.menu-row-compact {
padding-top: 12px;
padding-bottom: 12px;
}
.menu-row-head {
display: flex;
justify-content: space-between;
gap: 12px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.74rem;
}
.chip-strip {
display: flex;
gap: 10px;
overflow-x: auto;
padding-bottom: 4px;
}
.chip-strip::-webkit-scrollbar {
height: 6px;
}
.chip-strip::-webkit-scrollbar-thumb {
background: rgba(148, 163, 184, 0.3);
border-radius: 999px;
}
.menu-chip {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 34px;
padding: 8px 14px;
border-radius: 999px;
border: 1px solid var(--border-color);
background: rgba(255, 255, 255, 0.04);
color: var(--text-primary);
cursor: pointer;
white-space: nowrap;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.menu-chip:hover,
.menu-chip.is-active,
.menu-chip-link:hover {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.1);
}
.menu-chip-muted {
color: var(--text-secondary);
}
.menu-chip-link {
text-decoration: none;
}
.metric-card {
position: relative;
padding: 16px 18px;
@@ -502,6 +653,10 @@ select {
padding-right: 4px;
}
.run-list-compact {
max-height: 560px;
}
.run-card {
cursor: pointer;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
@@ -582,6 +737,35 @@ select {
min-width: 0;
}
.workspace-stack,
.system-grid,
.hub-grid {
display: grid;
gap: 16px;
}
.system-grid {
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
.hub-grid {
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.hub-card,
.hub-card-static {
display: grid;
gap: 10px;
padding: 14px 16px;
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}
.hub-card:hover {
transform: translateY(-1px);
border-color: rgba(77, 141, 255, 0.42);
background: rgba(77, 141, 255, 0.08);
}
.workspace-empty {
display: grid;
place-items: center;
@@ -619,6 +803,12 @@ select {
margin-top: 18px;
}
.button-small {
min-height: 36px;
padding: 8px 12px;
font-size: 0.84rem;
}
.detail-stat-grid,
.plan-grid,
.raw-json-grid {
@@ -918,6 +1108,10 @@ select {
word-break: break-all;
}
.system-card-compact .detail-actions {
margin-top: 10px;
}
.viewer-frame {
min-height: 320px;
border: 1px solid rgba(148, 163, 184, 0.16);
@@ -1181,6 +1375,7 @@ select {
@media (max-width: 1320px) {
.hero-top,
.main-container,
.section-nav,
.detail-stat-grid,
.plan-grid,
.raw-json-grid {
@@ -1211,6 +1406,7 @@ select {
}
.hero-links,
.route-note,
.detail-actions,
.tag-row,
.panel-meta,

查看文件

@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>授权攻防实验工作台</title>
<link rel="stylesheet" href="./assets/styles.css">
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
@@ -16,7 +16,7 @@
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="./assets/icons.svg#spark"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
@@ -28,7 +28,7 @@
<div class="hero-actions">
<button id="refreshDashboard" class="button button-primary" type="button">
<svg class="icon"><use href="./assets/icons.svg#refresh"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
<span>立即刷新</span>
</button>
<label class="toggle-card">
@@ -39,27 +39,27 @@
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="./assets/icons.svg#sync"></use></svg>
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</span>
</div>
</div>
<div class="hero-links">
<a class="button button-secondary" href="./docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#docs"></use></svg>
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
<span>功能文档</span>
</a>
<a class="button button-secondary" href="./docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#playbook"></use></svg>
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
<span>前端设计</span>
</a>
<a class="button button-secondary" href="./docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</span>
</a>
<a class="button button-secondary" href="./legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="./assets/icons.svg#legacy"></use></svg>
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
<span>旧版工作台</span>
</a>
</div>
@@ -67,85 +67,16 @@
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</header>
<main class="main-container">
<aside class="sidebar">
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#filter"></use></svg>
筛选器
</span>
<span id="runCount" class="section-badge">0 条</span>
</div>
<div class="filter-group">
<label class="field">
<span>搜索</span>
<div class="search-box">
<svg class="icon"><use href="./assets/icons.svg#search"></use></svg>
<input id="searchInput" type="text" placeholder="搜索 run id、advisory、标题、概要">
</div>
</label>
<label class="field">
<span>系统</span>
<select id="systemFilter" class="filter-select">
<option value="">全部系统</option>
</select>
</label>
<label class="field">
<span>状态</span>
<select id="statusFilter" class="filter-select">
<option value="">全部状态</option>
</select>
</label>
<label class="field">
<span>Profile</span>
<select id="profileFilter" class="filter-select">
<option value="">全部复现档案</option>
</select>
</label>
</div>
</section>
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
系统概览
</span>
</div>
<div id="systemStats" class="system-stats"></div>
</section>
<section class="sidebar-section">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#failure"></use></svg>
最近失败
</span>
</div>
<div id="recentFailures" class="failure-list"></div>
</section>
<section class="sidebar-section sidebar-section-fill">
<div class="section-header">
<span>
<svg class="icon"><use href="./assets/icons.svg#queue"></use></svg>
运行队列
</span>
</div>
<div id="runQueue" class="run-list"></div>
</section>
</aside>
<aside id="sidebar" class="sidebar"></aside>
<section id="detailWorkspace" class="workspace">
<div class="workspace-empty">
<svg class="icon icon-xl"><use href="./assets/icons.svg#shield"></use></svg>
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
<h2>选择一个运行</h2>
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
</div>
@@ -155,19 +86,19 @@
<footer class="dashboard-footer">
<div class="footer-left">
<span class="footer-note">
<svg class="icon"><use href="./assets/icons.svg#source"></use></svg>
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
</span>
</div>
<div class="footer-links">
<a href="./docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="./assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="./architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="./summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
</div>
</footer>
</div>
<script src="./assets/app.js"></script>
<script src="/assets/app.js"></script>
</body>
</html>

查看文件

@@ -779,6 +779,14 @@ def _render_section_dashboard_shells() -> None:
source_index = LOVART_TEMPLATE_DIR / "index.html"
for section in SECTION_ROUTE_DIRS:
section_dir = DASHBOARD_DIR / section
if section == "runs":
# Preserve existing /runs/<run-id>/ bundles; only refresh the section shell.
ensure_dir(section_dir)
index_path = section_dir / "index.html"
if index_path.exists():
index_path.unlink()
shutil.copy2(source_index, index_path)
continue
_remove_path(section_dir)
ensure_dir(section_dir)
shutil.copy2(source_index, section_dir / "index.html")