Repository navigation
Issue 107
- 类型:优化
- 状态:功能已实现,待 PR 审阅;真实私有平台与 Windows/Linux 原生桌面待验收
- Issue:https://github.com/ShaoClean/Alune/issues/107
- PR:#110
- 最近更新:2026-09-28
- 代码基线:development / 50cce92b691496457d0a912d068cad3ded874fa2
- 实现提交:ab58fb7
- 实际验证与前后截图:Issue-107-Validation
设置页、仓库按名称选择、加密持久化与逐远端关联已接入正式应用代码。下方保留原型设计和原型阶段的验证记录;它们与本次实际应用验证分别记录,不将演示原型当成持久化或真实平台验证依据。
- 命名令牌使用稳定 ID;改名、更换值、删除及关联保存由 SQLite 事务和 revision 检查保证一致性,删除后清理密文及引用,并保留“原令牌已删除”的提示状态。
- 共享
secrets模块供 AI 和访问令牌使用,保留原 AI 兼容导出与ai-master-key文件。桌面使用 Electron safeStorage;独立服务使用本机 AES-GCM,常规 API 仅返回元数据。 - 后端重新读取实际 Git 远端后才解析凭据,首次应用绑定平台与 HTTPS origin(含端口);目标变更使旧关联失效,即使目标恢复也需重新应用。平台请求拒绝重定向,并拒绝凭据或关联变更后的过时响应。
- 从独立数据库首次导入桌面时,事务性重加密命名令牌并保留 ID、作用域和关联;密钥不可用时保留原密文及待迁移标记,下次启动重试。
- 仓库管理入口保留返回位置,新增后返回仓库仍需明确应用;WebSocket 仅通知元数据刷新。匿名读取与“仅本次输入”继续可用。
本次本地自动化共 374 项通过,另通过桌面构建、macOS Electron 跨进程恢复及浏览器交互检查。平台 API 响应使用隔离测试数据,尚未验证真实私有账号、SSO、自建 GitLab 实例或 Windows/Linux 原生桌面。Issue #107 保持打开,具体证据和限制见实际验证记录。
优化前,PR/MR 令牌仅存在于视图组件内,离开视图、切换仓库或远端后清除。用户希望在设置页保存“令牌名字 + 令牌值”,再在具体仓库按名字选择,避免重复输入。
本方案采用“设备级令牌管理 + 仓库远端独立关联”。名称是展示信息,关联使用稳定 ID。保存令牌及仓库选择均持久化,重启后恢复。无需再加一个“记住令牌”开关。
入口:设置 → 应用 → 访问令牌。沿用现有设置中心的导航、字号、月光主题及 Ant Design 组件。
页面标题“访问令牌”,说明“给令牌起个名字,在仓库的 PR/MR 页面按名称选择。”右上角提供“新增令牌”。
列表:
| 列 | 展示及行为 |
|---|---|
| 令牌名称 | 如“公司 GitLab”“项目只读”;次行显示已关联主机,未使用时显示“首次使用时关联主机” |
| 令牌值 | 固定遮罩,不展示原值或可恢复密文;辅助显示更新时间 |
| 使用情况 | “2 个仓库关联”或“尚未使用”;点击查看仓库与远端 |
| 操作 | 编辑、删除,均有文字提示和可访问名称 |
只有两个可填写的字段:
| 字段 | 规则 |
|---|---|
| 令牌名称 | 必填、去除首尾空格、1–50 个字符;此设备内忽略大小写后唯一 |
| 令牌值 | 新增时必填,默认隐藏,录入时允许切换显示;沿用后端格式/长度校验,不依据前缀猜测平台 |
编辑已保存的令牌时,名称预填;令牌值展示“已保存”和“更换令牌值”按钮。仅改名无需重新输入。点击更换才显示新值输入框,提示涉及的关联数量。保存后退出编辑,清空输入中的敏感值。
删除前展示受影响的“仓库 · 远端”清单,确认后删除凭据及关联。明确只删除 Alune 保存的配置,不会在 GitLab/GitHub 撤销令牌。不自动切换到其他令牌。
空状态:“还没有保存令牌”,主按钮“添加第一个令牌”。搜索与列表加载/保存失败使用现有设置页的交互规范。
在远端/项目/筛选区域下、请求列表上方,放置一行:
“访问令牌” → 名称下拉框 → “应用到此仓库”或“已记住选择” → “管理令牌”。
- 初次进入没有关联的仓库,默认“不使用令牌”,允许匿名读取。
- 下拉框支持搜索,展示未绑定主机或与当前主机、平台匹配的命名令牌。其他主机的条目不可选,并标注适用主机。
- 修改下拉框后显示“应用到此仓库”。选择本身不会立即发送凭据;点击应用才保存关联并读取列表。
- 应用前,界面始终可见实际目标主机和项目。未绑定主机的令牌另提示:“首次应用时,‘名称’将关联到 host。”
- 应用后显示“已记住选择”;下次进入、切换回来或重启应用,自动使用此前关联。
- 选择“不使用令牌”并应用,仅解除此仓库/远端的关联,不删除设置里的令牌。
- “管理令牌”进入设置并保留返回位置,包括仓库、远端和 PR/MR 视图。
- 没有可选令牌时提供“去添加令牌”。新增表单按钮为“保存并返回仓库”;返回后选中新名称,再由用户应用到已显示的目标。
关联粒度为“仓库 + 远端 + 远端目标”。同一主机下的多个仓库可主动选择同一个令牌,但不会因为某个仓库配置过,就自动用于其他仓库。
保持表单只有名称和值两项;主机/平台来自仓库现有远端识别,而非增加必填配置。
- 首次明确应用时,记录平台与规范化 HTTPS origin(主机及端口);同一令牌记录限制在这个 origin 和平台内使用。
- 自建 GitLab 沿用现有的明确平台选择,并在关联中记住它。
- 远端地址改变时,后端重新解析并校验;项目、主机、端口或平台不匹配则停止使用旧关联,提示重新选择。
- 不跟随跨 origin 重定向携带凭据。沿用原有目标校验和请求限制。
- 同主机多账号或项目/群组令牌,创建不同名称,逐仓库明确选择;不按名称、用户名或 token 前缀自动匹配。
- 重命名不改变 ID,因此不破坏仓库关联。
- 更换值保留 ID 和作用域;新请求使用新值,清除旧验证状态/缓存,旧请求不能覆盖新状态。
- 删除后清除所有引用;仍打开的仓库立即提示重新选择,不静默回退到其他凭据。
- 新建设置记录只代表已保存,不宣称已验证有效。实际访问结果属于特定项目、令牌版本和目标。
如果同一个凭据确实需要用于不同主机,首版为每个主机单独创建命名记录。解除或迁移主机绑定的高级管理可后续讨论。
| 情况 | 提示与恢复 |
|---|---|
| 401 / 身份凭据无效 | 保留名称选择,提示重新配置或更换令牌 |
| 403 / 项目权限不足 | 提示检查项目访问、权限范围或组织授权,不把令牌标记为对所有仓库无效 |
| 404 | 说明项目不存在或当前身份不可见,不武断认定令牌过期 |
| 网络、超时、限流 | 保留令牌及关联,提供重试,不要求再次输入 |
| 已关联令牌被删除 | 提示“原令牌已删除,请重新选择”,不自动选中其他项 |
| 远端目标变化 | 展示新目标并要求重新应用,不将旧令牌自动发给新目标 |
| 加密存储不可用 | 明确说明保存失败;保留匿名读取,以及可按需使用原有“仅本次输入”作为次要入口 |
旧版临时输入不会被悄悄升级为持久保存;新建命名令牌必须经过保存动作。匿名读取和临时使用可作为兼容路径,命名选择是主路径。
本节保留实施前的方案与基线代码线索;最终模块、接口、迁移行为及验证结果见实际验证记录。
- 命名令牌:稳定 ID、名称、是否已保存 secret、作用域、更新时间与版本号。响应不包含原文或密文。
- 密文单独保存,复用现有 secret-storage 抽象的能力;可抽成通用凭据基础设施,避免访问令牌模块依赖 AI 业务配置。
- 关联:repositoryId、remoteName、规范化目标指纹、provider、tokenId 或 null。
- 新增/更换时前端单次提交明文给 Alune 本机后端;保存后清空表单。
- 列表、选择和常规 PR/MR 请求只使用 ID/元数据。后端校验当前远端后读取凭据,并向指定平台添加认证头。
- 应用关联与首次设定作用域需保证原子性;并发编辑/删除采用版本检查,保存失败不先展示成功。
- 不增加全局默认令牌,不枚举所有令牌自动试错。
建议的 API 职责:令牌列表/新增/改名/更换/删除;仓库远端的关联读取/应用/解除;现有 PR/MR 查询由后端解析关联。具体端点命名在实现阶段与现有 controller 风格统一。
桌面版复用主进程提供的 Electron safeStorage 能力;独立服务模式评估复用现有受限权限的本机 AES-GCM 存储。不得将令牌原文写入 localStorage、普通配置、日志、错误消息、URL 或导出数据。加密不可用时不静默降级成明文。
现有代码线索:
- SettingsCenter.tsx:新增访问令牌分类。
- PullRequestsView.tsx:临时 token 的组件状态和选择 UI。
- pull-requests.service.ts:远端校验和平台请求。
- secret-storage.ts:已有加密抽象。
以下为使用虚构项目、示例数据制作的交互原型截图,不代表功能已发布。




以下保留最终验收清单;本地已通过的验证及其边界另见实际验证记录。真实平台及跨平台结果尚需补齐,不据此提前关闭 Issue。
- 设置页以名称和值创建令牌,校验必填/重名,列表不泄露原文。
- 仓库按名称选择并应用,切换视图/仓库/远端后返回,及重启后,恢复相应关联。
- 改名不破坏关联;更换值对所关联仓库的新请求生效,不继续使用旧值。
- 删除前展示影响,删除后旧引用不能继续使用凭据。
- 平台、主机、端口、项目变化会阻止误用;多账号、项目令牌能明确区分。
- 不同错误分别提示,不将网络错误或单项目权限不足当成全局凭据失效。
- GitHub PR、GitLab.com、自建 GitLab、匿名读取、筛选、分页、刷新保持可用。
- 桌面和独立服务的加密保存/恢复/删除、不可用场景经过验证;日志与普通配置不含明文。
- 浅色、深色、窄窗口与键盘操作可用。
| 日期 | 环境 | 场景 | 结果 |
|---|---|---|---|
| 2026-09-28 | 本地 Vite + React + Ant Design,Codex 内置浏览器 | 创建、重名校验、按名称搜索与选择、应用、返回设置、编辑名称、删除影响与解除关联 | 已通过交互检查;仅使用演示数据 |
| 2026-09-28 | 同上 | 改名保留关联 | 首轮发现编辑表单预填丢失,修正表单挂载后再次验证通过 |
| 2026-09-28 | 同上 | 1280×720 设置/仓库页、深色及 390px 窄窗口 | 已检查,截图见附件 |
| 2026-09-28 | 原型项目 | npm run build | 通过;Ant Design 打包体积提示不影响原型 |
| 待实施 | 正式应用 | 真实 token、平台 API、持久化、重启恢复、跨平台安全存储 | 未实施、未验证 |
原型只保留内存中的名称与关联元数据;输入的示例令牌值在保存时丢弃,刷新页面会重置演示数据。重启恢复和加密存储是设计要求,不是这次原型的实际能力。
以下为原型交付时的范围记录,当前实现状态见本页顶部。
用户已明确“设置维护名称和值,仓库按名称选择”的方向。以上主机首次绑定、逐远端关联和异常文案为推荐设计,实施前可继续调整。
首版不包含平台 OAuth 登录、令牌申请/撤销、跨设备同步或全局自动选取。远端异常、并发修改、存储迁移及平台权限需随实现补充实际测试。设计变更可通过 Wiki 历史回退;本次未修改产品源码。
设计文档首页 · Alune 品牌说明 · 维护约定 · 代码仓库