Skip to content

feat: 引入 99designs/keyring 作为默认凭证存储后端#69

Merged
bigmanBass666 merged 3 commits into
mainfrom
worktree-feat+keyring-core
Jul 17, 2026
Merged

feat: 引入 99designs/keyring 作为默认凭证存储后端#69
bigmanBass666 merged 3 commits into
mainfrom
worktree-feat+keyring-core

Conversation

@bigmanBass666

Copy link
Copy Markdown
Contributor

变更内容

将 API Key 的存储后端从明文 JSON 文件迁移到 OS 密码管理器(Keychain / WinCred / Secret Service),使用 99designs/keyring Go 库。

核心改动

  1. 新增 internal/keypool/keyring.go — keyring 后端封装

    • saveToKeyring() / loadFromKeyring() — 对 keyring 的读写操作
    • setTestKeyring() / resetTestKeyring() — mock 支持,测试用
    • 每个 provider 的数据存在 keyring 的 akswitch:<provider> 键下
  2. 修改 internal/keypool/store.go — 新增 provider 级 API

    • SaveKeys(provider, store) / LoadKeys(provider) — 基于 provider 名的读写
    • LoadKeysFromStore 优先尝试 keyring,再回退到文件
    • 自动迁移逻辑:检测旧 .enc 文件 → 读入 → 写入 keyring → 重命名为 .bak
  3. 修改 internal/cmd/key.go — 适配新 API

    • key add / key list / key remove/disable/enable 改为调用 SaveKeys/LoadKeys
    • 不再依赖文件路径
  4. 新增 keyring_test.go — 11 个测试全覆盖

    • SaveKeys/LoadKeys 读写回环
    • 多个 provider 隔离
    • 旧文件自动迁移
    • LoadKeysFromStore keyring 优先

修复

  1. crypto_test.go — 补全两个测试的 defer SetEncryptionKey(nil),消除全局状态泄漏

测试

  • make test-all(unit → integration → e2e)— 等待 CI 确认
  • 本地全量单元测试通过

设计决策

详见 ADR-003: docs/internal/adr/adr-003-os-keyring-storage.md

wingIsCrazy added 2 commits July 18, 2026 02:37
- 新增 keyring.go — keyring 后端封装,支持 mock 测试
- 修改 store.go — 新增 SaveKeys/LoadKeys 基于 provider 名的 API
- 修改 store.go — LoadKeysFromStore 优先尝试 keyring
- 修改 cmd/key.go — 使用 provider 名而非文件路径操作
- 新增 keyring_test.go — 11 个测试覆盖 SaveKeys/LoadKeys/迁移
- 修复 crypto_test.go — 补全 SetEncryptionKey 的 defer 清理

Closes #44
- 修复 keyAddCmd 和 keyListCmd 使用 LoadKeys/SaveKeys (keyring)
- 新增 RemoveKeys 公共 API 用于测试清理
- 更新集成测试从文件验证改为 keyring 验证
- 修复 keyring 持久化导致的测试间污染
@bigmanBass666
bigmanBass666 marked this pull request as ready for review July 17, 2026 19:08
@bigmanBass666
bigmanBass666 enabled auto-merge (squash) July 17, 2026 19:08
@bigmanBass666
bigmanBass666 merged commit 740f73e into main Jul 17, 2026
5 checks passed
@bigmanBass666
bigmanBass666 deleted the worktree-feat+keyring-core branch July 17, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant