Issue 122 - ShaoClean/Alune GitHub Wiki
Issue #122:在 Alune 内查看 PR/MR 详情、代码变动与评论
- 类型:功能
- 状态:已实现,待 PR 审阅;真实私有 GitLab 与跨平台桌面待验收
- Issue:https://github.com/ShaoClean/Alune/issues/122
- PR:https://github.com/ShaoClean/Alune/pull/125
- 最近更新:2026-09-29
- 代码基线:
development/08ff93c - 实现提交:d06b505bd37f9f70d091b06ae2f984702e1294ca
背景与问题
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 的历史验收截图,标题为浏览器外链;这是既有交互的历史证据,并非本次基线的逐像素对照。

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




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