Some checks failed
Secrets v3 CI / 检查 (push) Has been cancelled
- Add apps/api, desktop Tauri shell, domain/application/crypto/device-auth/infrastructure-db - Replace desktop-daemon vault integration; drop secrets-core and secrets-mcp* - Ignore apps/desktop/dist and generated Tauri icons; document icon/dist steps in AGENTS.md - Apply rustfmt; fix clippy (collapsible_if, HTTP method as str)
242 lines
6.7 KiB
Markdown
242 lines
6.7 KiB
Markdown
# Secrets — AGENTS.md
|
||
|
||
本仓库当前为 **v3 桌面端架构**:
|
||
|
||
- `apps/api`:远端 JSON API
|
||
- `apps/desktop/src-tauri`:桌面客户端
|
||
- `crates/desktop-daemon`:本地 MCP daemon
|
||
- `crates/application` / `domain` / `infrastructure-db`:v3 业务与数据层
|
||
|
||
旧 `secrets-core` / `secrets-mcp` / `secrets-mcp-local` 已移除,不再作为开发入口。
|
||
|
||
## 版本控制
|
||
|
||
本仓库使用 **[Jujutsu (jj)](https://jj-vcs.dev/)** 作为版本控制系统(纯 jj 模式,无 `.git` 目录)。
|
||
|
||
### 常用 jj 命令对照
|
||
|
||
| 操作 | jj 命令 |
|
||
|------|---------|
|
||
| 查看历史 | `jj log` / `jj log 'all()'` |
|
||
| 查看状态 | `jj status` |
|
||
| 新建提交 | `jj commit` |
|
||
| 创建新变更 | `jj new` |
|
||
| 变基 | `jj rebase` |
|
||
| 合并提交 | `jj squash` |
|
||
| 撤销操作 | `jj undo` |
|
||
| 查看标签 | `jj tag list` |
|
||
| 查看分支 | `jj bookmark list` |
|
||
| 推送远端 | `jj git push` |
|
||
| 拉取远端 | `jj git fetch` |
|
||
|
||
### 注意事项
|
||
|
||
- 本仓库为纯 `jj` 模式,本地不要使用 `git` 命令。
|
||
- CI Runner 侧仍可能使用 `git` 拉代码,这不影响本地开发。
|
||
- 检查 tag 是否存在时,使用 `jj log --no-graph --revisions "tag(${tag})"`。
|
||
|
||
## 提交前检查
|
||
|
||
每次提交前至少运行:
|
||
|
||
```bash
|
||
cargo fmt -- --check
|
||
cargo clippy --locked -- -D warnings
|
||
cargo test --locked
|
||
```
|
||
|
||
也可以直接运行:
|
||
|
||
```bash
|
||
./scripts/release-check.sh
|
||
```
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
secrets/
|
||
Cargo.toml
|
||
apps/
|
||
api/ # 远端 JSON API
|
||
desktop/src-tauri/ # 桌面端
|
||
crates/
|
||
application/ # v3 应用服务
|
||
client-integrations/ # Cursor / Claude Code 配置注入
|
||
crypto/ # 通用加密辅助
|
||
desktop-daemon/ # 本地 MCP daemon
|
||
device-auth/ # 设备登录 / Desktop OAuth 辅助
|
||
domain/ # v3 领域模型
|
||
infrastructure-db/ # 数据库与迁移
|
||
deploy/
|
||
scripts/
|
||
.gitea/workflows/
|
||
.vscode/tasks.json
|
||
```
|
||
|
||
## 数据库
|
||
|
||
- 建议数据库名:`secrets-v3`
|
||
- 连接串:`SECRETS_DATABASE_URL`
|
||
- 首次连接会自动运行 `secrets-infrastructure-db::migrate_current_schema`
|
||
|
||
当前 v3 主要表:
|
||
|
||
- `users`
|
||
- `oauth_accounts`
|
||
- `devices`
|
||
- `device_login_tokens`
|
||
- `auth_events`
|
||
- `vault_objects`
|
||
- `vault_object_revisions`
|
||
|
||
### 当前模型约束
|
||
|
||
- 服务端只保存同步所需的密文对象与版本信息
|
||
- 搜索、详情、reveal、history 主要在 desktop 本地 vault 中完成
|
||
- 删除通过对象级 `deleted_at` / tombstone 传播
|
||
- 历史服务端保留在 `vault_object_revisions`,本地另有 `vault_object_history`
|
||
|
||
### 字段职责
|
||
|
||
| 字段 | 含义 | 示例 |
|
||
|------|------|------|
|
||
| `object_id` | 同步对象标识 | `UUID` |
|
||
| `object_kind` | 当前对象类别 | `cipher` |
|
||
| `revision` | 对象版本号 | `12` |
|
||
| `cipher_version` | 密文封装版本 | `1` |
|
||
| `ciphertext` | 密文对象载荷 | AES-GCM 密文 |
|
||
| `content_hash` | 密文内容摘要 | `sha256:...` |
|
||
| `deleted_at` | 对象删除时间 | `2026-04-14T12:00:00Z` |
|
||
|
||
## Google 登录
|
||
|
||
当前登录流为 **Google Desktop OAuth**:
|
||
|
||
- 桌面端使用系统浏览器拉起 Google 授权
|
||
- 使用本地 loopback callback
|
||
- 使用 `PKCE`
|
||
- 桌面端换取 Google token 后调用 API 的桌面登录接口
|
||
- API 校验 Google userinfo 后发放本地 device token
|
||
|
||
桌面端优先读取:
|
||
|
||
- `GOOGLE_OAUTH_CLIENT_FILE`
|
||
|
||
默认开发文件名:
|
||
|
||
- `client_secret_738964258008-0svfo4g7ta347iedrf6r9see87a8u3hn.apps.googleusercontent.com.json`
|
||
|
||
## MCP
|
||
|
||
本地 MCP 入口由 `crates/desktop-daemon` 提供,默认地址:
|
||
|
||
```text
|
||
http://127.0.0.1:9515/mcp
|
||
```
|
||
|
||
当前暴露的工具:
|
||
|
||
- `secrets_entry_find`
|
||
- `secrets_entry_get`
|
||
- `secrets_entry_add`
|
||
- `secrets_entry_update`
|
||
- `secrets_entry_delete`
|
||
- `secrets_entry_restore`
|
||
- `secrets_secret_add`
|
||
- `secrets_secret_update`
|
||
- `secrets_secret_delete`
|
||
- `secrets_secret_history`
|
||
- `secrets_secret_rollback`
|
||
- `target_exec`
|
||
|
||
当前不保留:
|
||
|
||
- `secrets_env_map`
|
||
|
||
兼容别名:
|
||
|
||
- `secrets_find`
|
||
- `secrets_add`
|
||
- `secrets_update`
|
||
|
||
### `target_exec`
|
||
|
||
`target_exec` 会显式读取 entry 当前 secrets 的真实值,并从 metadata / secrets 派生标准环境变量,例如:
|
||
|
||
- `TARGET_ENTRY_ID`
|
||
- `TARGET_NAME`
|
||
- `TARGET_FOLDER`
|
||
- `TARGET_TYPE`
|
||
- `TARGET_HOST`
|
||
- `TARGET_PORT`
|
||
- `TARGET_USER`
|
||
- `TARGET_BASE_URL`
|
||
- `TARGET_API_KEY`
|
||
- `TARGET_TOKEN`
|
||
- `TARGET_SSH_KEY`
|
||
|
||
## 桌面端
|
||
|
||
桌面端当前支持:
|
||
|
||
- Google 登录
|
||
- 自动写入 `Cursor` / `Claude Code` 的 `mcp.json`
|
||
- 新建条目
|
||
- 搜索、按 type 筛选
|
||
- 右侧原地编辑
|
||
- secret 新增、编辑、删除
|
||
- secret 明文显示 / 复制
|
||
- secret 历史查看与回滚
|
||
- 删除到最近删除与恢复
|
||
- 登录态仅在当前 desktop 进程内有效,不做自动恢复登录
|
||
- desktop 进程退出后,本地 daemon 所有工具不可用
|
||
|
||
### 配置注入
|
||
|
||
桌面端会把本地 daemon 配置写入:
|
||
|
||
- `~/.cursor/mcp.json`
|
||
- `~/.claude/mcp.json`
|
||
|
||
写入策略:
|
||
|
||
- 保留现有其它 `mcpServers`
|
||
- 仅覆盖同名 `secrets` 节点
|
||
|
||
### 图标与前端 dist(本地 / CI)
|
||
|
||
版本库为减小噪音,**不提交** Tauri 生成的多尺寸图标包,以及 **`apps/desktop/dist/`** 前端打包目录(见根目录 `.gitignore`)。
|
||
|
||
- **图标**:仅跟踪 `apps/desktop/src-tauri/icons/icon.png` 作为源图(建议 **1024×1024** PNG)。检出代码后,若需要完整 `icons/`(例如打包、验证窗口/托盘图标),在 **`apps/desktop/src-tauri`** 下执行:
|
||
|
||
```bash
|
||
cd apps/desktop/src-tauri
|
||
cargo tauri icon icons/icon.png
|
||
```
|
||
|
||
需已安装 **Tauri CLI**(例如 `cargo install tauri-cli`,或与项目一致的 `cargo-tauri` 版本)。
|
||
|
||
- **前端 dist**:`tauri.conf.json` 中 `build.frontendDist` 指向 `../dist`。本地或 CI 在运行 `cargo tauri dev` / `cargo tauri build` 前,需先按项目约定生成或同步 **`apps/desktop/dist/`** 内容;流水线构建桌面端时,在 Tauri 步骤之前加入对应的前端产物步骤即可。
|
||
|
||
## 代码规范
|
||
|
||
- 业务层优先使用 `anyhow::Result`
|
||
- 避免生产路径 `unwrap()`
|
||
- 使用 `tokio` + `sqlx` async
|
||
- SQL 使用参数绑定,不要手拼用户输入
|
||
- 运维日志使用 `tracing`
|
||
- 变更后优先跑最小必要验证,不要只改不测
|
||
|
||
## CI / 脚本
|
||
|
||
- `.gitea/workflows/secrets.yml` 现在是 v3 workspace 级 CI
|
||
- `scripts/release-check.sh` 只做 workspace 质量检查
|
||
- `deploy/.env.example` 反映当前 v3 API / daemon / desktop 登录配置
|
||
|
||
## 安全约束
|
||
|
||
- 不要把 Google `client_secret` 提交到受版本控制的配置文件中
|
||
- 不要把 device token、数据库密码、真实生产密钥提交入库
|
||
- 数据库生产环境优先使用 `verify-full`
|
||
- AI 审查时,不要把“随机高熵 token 明文存储”机械地当成密码学问题处理,必须结合当前架构和威胁模型判断
|