Issue 122 - ShaoClean/Alune GitHub Wiki

Issue #122:在 Alune 内查看 PR/MR 详情、代码变动与评论

背景与问题

PR/MR 列表的标题原先只跳转托管平台网页,读取描述、文件变动与讨论需要离开 Alune。此次点击标题直接进入当前仓库内的详情,并保留独立的“在浏览器中打开”入口。

目标与范围

覆盖当前已支持的 GitHub、GitLab 和根路径 HTTPS 自建 GitLab。复用命名令牌关联或仅本次输入的临时令牌,支持基本信息、Markdown 描述、文件列表与统一 Diff、普通评论、回复、Review 记录及代码行讨论。只读:不包含发表评论、回复、发起 Review、批准、合并、关闭或检出。

方案与取舍

  • 详情位于原 PR/MR 面板内,提供“概览”“文件变动”“评论与讨论”。返回保留远端、筛选和列表页码;下拉框切换当前列表页中的条目。刷新详情保留当前页签,重新读取该条目的内容。
  • 增加只读 POST detail、files、discussions,均位于 /api/repositories/:id/pull-requests/。共享已有远端目标校验、令牌解析与版本检查、20 秒时限、2 MiB 响应上限及错误脱敏;使用请求体传临时令牌,响应 no-store,拒绝重定向,不跟随分页返回的任意 URL。
  • GitHub 分别读取 PR 详情、文件、Issue comments、Reviews、Review comments;跨页代码回复按所属讨论归并,保留原始行号及旧版本标记。GitLab 读取 MR 详情、分页 diffs 与 discussions,保留回复、代码位置和已解决状态;旧实例的 diffs 返回 404 时回退到 changes,并标出 overflow。
  • 文件每页 30 个,独立切换并展示新增、删除、修改及重命名,使用现有补丁行解析器显示真实新旧行号。检查 hunk 与增删统计,标明不完整补丁;二进制、缺失补丁、平台折叠或超过 200,000 字符的补丁明确说明。GitHub 的 3,000 文件上限和 GitLab 省略内容均保留浏览器查看入口。
  • 描述与评论复用安全 Markdown 展示:GFM、代码和表格可读,原始 HTML 不执行,外链仅允许 HTTP(S),远端图片显示替代文字。代码讨论保留文件、行号、作者、时间与可用代码上下文。
  • 元数据、文件和各讨论来源独立读取、重试,分页追加保留已加载内容。条目、仓库、远端、平台或凭据版本变化时取消旧请求,并通过结果身份校验避免迟到数据覆盖新条目。

验收标准

  • 点击列表标题在应用内展示详情,基本信息、状态与描述可读。
  • 文件分页、文件切换及新旧行号可用;缺失、二进制、过大和截断内容有说明。
  • 普通评论、回复、Review 和代码行讨论可阅读,空内容明确显示。
  • GitHub、GitLab 与自建 GitLab API、认证和旧版本回退由自动化用例覆盖。
  • 返回列表保留筛选及页码;刷新保留页签;慢响应切换不串用数据。
  • 权限失败可重试;深浅主题以及 640px / 390px 窗口可读且无页面横向溢出。
  • 真实私有 GitLab / 自建实例的账号权限及组织配置验收。
  • Windows / Linux 原生桌面验收。

验证记录

环境:macOS arm64,Node.js v25.5.0;交互与截图使用 Ego Lite Chromium。Git、SQLite 和 SSH 集成测试均使用临时隔离目录;托管平台响应由 fixture 模拟,真实 GitHub 检查另行列出。

日期 代码提交 / 环境 命令或场景 结果与证据
2026-09-29 d06b505 / macOS arm64 shared、ssh-client、server、web 分别 npm run build -w ... 通过;Vite 保留现有大 bundle 提示
2026-09-29 d06b505 / Node 25.5.0 npm test -w web 179 项通过,包括 PR/MR、Markdown 安全展示与新增上游反馈回归
2026-09-29 d06b505 / Node 25.5.0 npm test -w server -- --runInBand 21 套、211 项通过;含详情、Diff、讨论、认证、目标变化及输入校验
2026-09-29 d06b505 / 本机 SSH + HTTP node --test apps/web/tests/pull-requests.integration.cjs 3 项通过:真实 HTTP、SQLite、SSH、分页、私有令牌复用、三平台内容、讨论回复与错误恢复
2026-09-29 d06b505 / macOS arm64 npm run test:hooks、npm run test:release-notes、npm run desktop:test:unit 22、10、44 项通过
2026-09-29 同步基线前的本次实现 / Ego Lite GitHub、GitLab、自建 GitLab fixture;普通评论、分页回复、旧版本代码上下文、空内容、401 与 403 重试 通过;全部状态和第 2 页返回保留,详情刷新保留页签;延迟 3 秒的 #98 切换至 #94 后无旧数据覆盖
2026-09-29 同步基线前的本次实现 / Ego Lite 浅色、深色、1920px / 640px / 390px 窗口 通过;窄窗文档宽度与窗口宽度一致,Diff 单独滚动,截图见下
2026-09-29 本次服务实现 / 真实 GitHub API 读取 ShaoClean/Alune PR #124 已合并状态、8 个文件和 8 个补丁读取成功,三个讨论接口返回空列表;匿名访问触发限流提示,使用本机已有 GitHub CLI 认证后通过

复验:构建完成后运行 node apps/web/tests/pull-requests-fixture.cjs,打开输出 URL;自建 GitLab 选择平台并输入任意非空测试令牌。退出进程清理临时数据。本页及附件不包含真实令牌。

界面证据

原有列表可参考 Issue #98 的历史验收截图,标题为浏览器外链;这是既有交互的历史证据,并非本次基线的逐像素对照。

Alune 原有 PR/MR 列表

以下截图采集于 2026-09-29 的本次实现工作区(同步最新 development 前,基础提交 7c5b9ee);展示新增详情和文件 Diff。随后同步 08ff93c 并执行上表中的最终构建与自动测试。

Alune 应用内文件 Diff

Alune 640px 浅色详情

Alune 640px 深色详情

Alune 390px 深色详情

风险、未决事项与回退

平台的响应上限、Diff 截断和分页期间数据变化可能使内容不完整;界面提供说明及浏览器入口,不尝试下载超大原始文件。没有新增数据库迁移或令牌持久化;认证与平台支持边界保持现有配置。真实私有 GitLab、组织 SSO 和 Windows/Linux 原生桌面未验收,不以模拟结果替代。回退本次代码提交即可恢复原有列表入口,Wiki 页面与附件需单独处理。

关联资料