Repository navigation
Issue 137 Validation
- 日期:2026-10-01
- Issue:仓库数据总览
- 设计:Issue-137;UI 以新版 UI 规范 和现有统一弹窗为准。
- PR:#150(草稿)
- 代码:
2745885bda01064f4bef4346db88c454e4652023(分支codex/repository-overview-137) - 状态:实现完成,草稿 PR 待审阅/合并;以下为 macOS 开发环境验收,未声称跨平台生产验收。
仓库页提供卡片/列表/数据总览,保留默认卡片和设备偏好;连接页仍为卡片/列表。总览包含六项指标、五类图表、来源与周期筛选、关注表、逐日语义化表格、按指标/状态/来源交集/排行/语言下钻、正确工作区打开和单仓库重试。列表每页 20 行,原按钮消失后关闭弹窗的焦点回退到仓库总数。
使用现有主题变量、Geist 字体、Ant Design 控件、AluneModal 与静态 SVG/CSS;没有引入 ECharts 或新的图表依赖。历史 HTML 原型只作为信息架构参考,生产 UI 采用重构后的产品样式;未产品化趋势分析和全屏大屏两种备选布局。

这些截图来自真实临时 Git 仓库与 loopback SSH 服务,名称与提交内容为测试夹具;不包含用户的真实仓库数据。不能与 2026-09-30 的虚构演示图混淆。
- 单位:每条已登记工作区记录独立计数。同一提交在多个 clone/worktree 中可重复计入不同工作区;一个 HEAD 的可达 DAG 内由 Git log 自身去重。未自动合并不同来源、克隆或 worktree,不能解释为项目级唯一提交数或个人贡献。
-
时间:当前 HEAD 的可达提交,使用提交者时间
%ct。7/30/90 天均为截至今日 00:00 UTC 的完整自然日,排除今天尚未完成的自然日。上期为紧邻的等长完整 UTC 周期,边界[start,end)。总共读取 180 日摘要,周期切换不重新探测 Git。 -
时间倒序:使用
--since-as-filter,不会因为某个祖先的提交时间较早而提前中止历史遍历。已固定 HEAD SHA;浅克隆与超过 100000 条日志均标注不完整,覆盖不全不计算环比。 - 零与未知:读取成功且无提交显示 0;未获取、过期、失败显示未知/待采集而非零。上期为零显示新增提交或两期无提交,不显示无穷百分比。部分可用数据明确标注覆盖比例。
- 状态:复用状态队列和 60 秒缓存;新鲜且有改动/新鲜且无改动/未获取或过期失败三类互斥。文件路径去重;待推送和待拉取按仓库 ID 取并集。无上游、游离 HEAD、未首次提交独立标注,不宣称已同步。同步仅相对本地远端跟踪引用。
- 语言:按索引中已跟踪文件扩展名数量识别,不读取内容、不递归磁盘、不跟随链接;支持 TS/JS/Python/Rust/Go/Java 等常见扩展名。排除 node_modules、vendor、dist、build、coverage、target、generated、.next、.git 与常见压缩/生成/声明文件。相同路径去重,数量相同按语言名排序。无法识别与读取失败分别显示;这是主要语言仓库数量,不是代码行数占比。
POST /repositories/analytics/summary 请求 { ids, collect?, refresh? },最多 20 个已登记 ID,返回各仓库 180 日计数、语言、覆盖标记、采集时间与错误。
打开页面只读取缓存,不因总览新增后台 Git 探测;现有侧栏可见仓库的状态行为保持不变。明确点击“采集统计”后按来源轮流安排,服务端全局最多 3 个读取、同一 SSH 来源最多 1 个,每仓库包含连接阶段的总时限为 10 秒。队列最多 40 个等待任务、同 ID 合并请求,连接失败后该来源冷却 30 秒,重复点击不会延长冷却。
统计缓存 5 分钟,UTC 跨日后失效;显式重新采集绕过缓存。最多缓存 1000 份摘要,移除登记时清理。语言输出最多 4 MiB/100000 文件,日志最多 2 MiB/100000 提交,越界明确报错或标注截断。状态仍复用原有队列、超时和 60 秒有效期。采集不执行 fetch/pull/push,不读取 diff 文件内容。
停止、切换来源或离开页面会取消客户端等待并停止安排后续批次;已经交给服务端的当前批次最多 20 个任务可能继续完成,仍受上述限额约束。较慢环境可能在大批次完成前使前面仓库状态过期,页面会如实转为未知,不扩展缓存有效期来冒充新鲜。
环境:macOS 15.5 arm64,Node v25.5.0,Git 2.43.1。
| 命令 | 实际结果 |
|---|---|
npm run build -w @alune/shared |
通过 |
npm run build -w @alune/ssh-client |
通过 |
npm run build -w server |
通过 |
npm run build -w web |
通过;Vite 仍提示既有主包超过 500 kB;未新增图表库 |
npm test -w web |
218 通过 |
npm test -w server -- --runInBand |
25 套件、272 项通过 |
最终 npm test -w server -- --runInBand repository-analytics.service.spec.ts
|
5 项通过,包含全量之后新增的冷却重试回归 |
npm test -w @alune/ssh-client |
149 通过,2 项平台相关跳过,无失败 |
git diff --check、新增代码 Prettier 检查 |
通过 |
新增真实 Git/SSH 夹具覆盖:无提交、提交者与作者时间不同、7 天边界、今天边界、祖先时间非单调、主要语言排除、游离 HEAD、共享历史 worktree、浅克隆、无效目录与中止。解析上限、缓存过期、并发 3/每来源 1、请求合并、连接超时后禁止迟到 Git、冷却、不丢失旧数据错误标记、注册移除与非法批次另有针对性测试。
前端聚合测试覆盖来源与周期共 15 组、状态和来源/语言守恒、并集去重、文件去重、旧状态、旧日期、活动缺失与无上游。浏览器通过真实页面验证以下行为:
- 5 个范围(全部、本机、有效 SSH、离线 SSH、无匹配)× 7/30/90 天;总数和来源小计一致,离线活动显示
—。15 组记录 - 全部范围 9 仓库、30 天 36 次提交;本机 4 个/12 次,SSH 4 个/24 次;离线 1 个未知。7 天本机 8 次、SSH 12 次,共 20 次。
- 来源×有改动交集打开 3 个本机仓库;SSH 明细按实际行 ID 打开“命令行工具”对应工作区。
- 逐日表 7 行;Esc 关闭并恢复原按钮。将测试页面时钟向前推进 61 秒后,工作区状态转为未知;原来源色段消失后 Esc 恢复到仓库总数。
- 偏好刷新后仍为总览;卡片和列表均保留 9 个仓库;连接页仅两种视图。
- 明暗主题、减少动态效果、768/1024/1440 px;页面无整体横向溢出,明细表格使用可聚焦的横向滚动区。
- 停止采集按钮退出进行中状态;分页约束明细最多 20 行。
早期验证中修正过前端测试比较范围、1024 px 顶栏换行、消失触发器的焦点回退,以及基准脚本在同步创建大量 clone 后复用过期 HTTP keep-alive 连接的问题;上述结果为修正后的复验。
复现:构建四个工作区后执行 node apps/server/test/repository-overview-benchmark.cjs --serve。脚本创建隔离数据库、单提交单 TypeScript 文件 seed、真实 git clone --shared 工作区和真实 loopback SSH;不连接用户的主机。每组测量前清空该测试实例统计缓存;一半本机、一半 SSH(1 仓库场景只有本机)。查询经实际 HTTP/Nest/SSH/Git 路径。该夹具验证规模与调用开销,不代表大型历史、冷磁盘、公网延迟或生产仓库的性能。
| 仓库数 | 冷采集 | 缓存读取 | 每轮摘要请求 | 摘要响应字节 |
|---|---|---|---|---|
| 0 | 0 ms | 0 ms | 0 | 0 |
| 1 | 56.4 ms | 1.9 ms | 1 | 566 |
| 20 | 530.9 ms | 1.3 ms | 1 | 11301 |
| 100 | 2255 ms | 4.9 ms | 5 | 56505 |
| 500 | 11287.3 ms | 35 ms | 25 | 282525 |
原始采集/缓存记录 · 浏览器初次渲染、DOM、请求与分页记录
从真实浏览器点击完整采集 500 个工作区:17.248 秒,25 个摘要请求、500 个状态请求,统计和状态均为 500/500;500 个活动仓库、500 次提交,无改动/待同步/未知均为 0。页面完整采集记录
新增统计采集测试已加入 macOS、Linux、Windows 的本地 Git 矩阵。首次 Windows 验证暴露浅克隆测试夹具的 file:///C:/… 路径兼容性问题(前序统计断言已通过),已改为原生路径加 --no-local;修复提交 2745885,macOS 针对性 5 项复验通过。GitHub 上一次 macOS 网络代理任务在下载 Electron 时返回 HTTP 504,属于依赖下载失败;不将失败记录直接改成通过。最终提交 2745885bda01064f4bef4346db88c454e4652023 的完整 CI已通过:Web/Server/SSH client/Desktop 单元测试、macOS/Linux/Windows 本地 Git(包含新增统计采集)与三平台网络代理均成功;提交规范检查也通过。这验证了三平台 Git/构建链路,仍不等同于 Windows/Linux 原生桌面的视觉验收。
未运行 Windows/Linux 原生桌面、屏幕阅读器真机、公网高延迟 SSH、生产大历史库或长期驻留测试;目前不将这些项目标为通过。Git --since-as-filter 需要支持该选项的 Git 版本,旧版本会得到明确采集错误,不伪造零数据。
无数据库迁移。回退代码会使旧版无法识别的 overview 偏好自然回退到 grid;注册与磁盘仓库保持原有格式。Wiki 为独立历史,回退代码时需单独核对本页。
设计文档首页 · Alune 品牌说明 · 维护约定 · 代码仓库