内容
align="center">
<img src="public/app-icon.png" alt="N" width="112" height="112" />
# Nodify
**一款用于管理所有代码智能代理配置的统一面板。**
[](https://github.com/sijita/nodify/releases/latest)
·
🌐 [English](README.en.md)
</div>
odify 是一款桌面应用程序,可以安全地检测、读取和编辑 **Claude、**Codex** 和 **OpenCode配置,从一个:它们的 MCP、默认模型、规则商和 API 密钥。并通过 Git 仓库之间**同步**。
使用 **Tauri v2**(原生窗口)、**Rust 核心**(无 GUI,可进行无头测试React + TypeScript** 前端,搭配复古/黑客风格的设计系统,支持双语(西班牙语/英语)和亮/暗主题。
---
## 目录
- [下载](#下载)
问题](#问题)
-](#关键特性)
- [界面](#界面 [支持的代理和兼容性](#支持的代理和兼容性)
- [](#安全保证)
- [架构](#架构)
- [安装](#安装)
开发](#开发)
- [项目结构](#项目结构 [多设备同步设备同步)
-问题](#常见问题)
- [路线图](#路线- [约定和和贡献)
许可证](#许可证)
---
## 下载
从 **[最新发布://github.com/nodify/releases/latest)** 下载适用于您程序:
| 文件 |
| --- | **macOS Silicon) | `Nodify_*_mg` |
| **macOS** ( `Nodify_*_x64.d| **Windows** | `Nodify-setup.exe` 或 `Nodify_*64_en-US.msi` |
| **LinuxNodifyamd64.AppImage*_amd64.deb` 或 `*.x86.rpm` |
> **首次打开(未签名应用 安装程序尚未签名/公证。
> - **macOS:** 如果出现 *"Nodify 已,请使用 `xattr -dr com.appleine /Applications/Nodify.app` 取消打开。(在 Apple Silicon 上,*右键单击 → 不足以解决此特定错误消息。)
> - **Windows:** SmartScreen → *更多信息 →运行*。
您自己编译吗?阅 [安装](#---
## 问题
每个代码智能代理存储其配置的格式、位置都不同:
| 代理 | 位置 | 格式 |
| --- | --- | --- |
| Claude Code | `~/.claude.json`、`~/.claude/` | JSON |
| Codex | `~/.codex/config.toml` | TOML |
| OpenCode | `~/.config/opencode/opencode.json(c)` | JSON / JSONC |
如果您使用多个代理,在所有代理中保持相同的 MCP、技能或模型是一项容易出错且难以在不同机器上复制的手动任务。Nodify 解决了这个问题:**读取每种原生格式,将其转换为通用模型,然后写回保留不理解的内容**。
---
## 关键特性
### 🔌 MCP(模型上下文协议服务器)
- **状态矩阵**:行 = MCP,列 = 代理,单元格 = 已安装 / 缺失 / 不同。
- **详细信息模式**:单击任何单元格都会包含 MCP 完整配置的面板端点/状态、引、代理)。
- **安装** MCP(模式:stdio 或 HTTP,参数,键值器)。
- **删除** MCP()。
- **共享在代理之间**自动转换格式**(例如 `command 数组,` ↔ `,` 头 ↔ `_token_env_var。
### 🧩 技能
每个代理的发现技能(matter 的 `SKILL.md` **详细信息模式单元格会显示从 frontmatter 中描述和 `.md`内容。
- **共享** 技能(文件夹递归复制)和**。
- **代理可见性**顶部栏中的切换按钮隐藏或显示列(代理)。仅影响视图 - Nodify 仍然正常读写隐藏代理的配置 ⚙️ 代理特定配置
- **默认模型**:读取和编辑,具有代理之间差异的检测。
- **规则**(`CLAUDE.md` / `AGENTS.md`):集成编辑器在详细信息面板中。
- **提供商**:读取 ID / 名称 / `base_url` 和 **环境变量名称** (而非值)。
### 🔑 API 密钥 / 机密
- **机密** 视图,聚合所有引用的环境变量名称(按 MCP 和提供商),并显示哪些代理使用每个变量。
- **设置和传播**:在代理支持的情况下,将值写入其中(Claude,`settings.json → env`)。Codex/OpenCode 从 shell 或 `auth.json` 读取,Nodify **从不触及**。
### ⚖️ 对齐(ALIGN)
- 选择一个代理作为**真实来源**,并 **传播** 其 MCP、技能和模型到其他代理,单击即可(按代理或“全部对齐”)。
- 在应用前,显示每个目标的**更改计划**(`+`/`~` MCP,`+` 技能,`~` 模型),并带有全局同步。
- **添加**:从不删除目标内容。以块为单位解决差异,矩阵仅暴露差异。
### 🔄 多设备同步
- 导出**规范包**(将机密转换为环境变量引用,而非值)。
- 在 Git 仓库上进行 `push` / `pull` 以在机器之间复制配置。
- 应用前的 **差异** 视图(`+` 已添加,`-` 已删除,`~` 已更改)。
---
## 界面
复古/黑客风格的单色设计系统:
- **亮主题**,带有切换按钮(☾/☀),并持久化。
- **双语支持**(西班牙语/英语),顶部栏中有:自定义 i18n 和轻量级(and + 类型字典),检测浏览器语言并好。
- **官方代理徽标**(通过 [simple-icons](https://simpleicons.org) 和 [svgl.app](https://svgl.app),单色 `currentColor`)适用于 Claude Code、OpenCode 和 Codex。
- 使用 [`motion`](https://motion.dev) (Framer Motion)的**细微动画**:滑动 dock、部分过渡、矩阵单元格“弹出”变体、对齐面板的级联、扫描按钮。尊重 `prefers-reduced-motion`。
- **自定义对话框**(确认/提示)样式adcn,而非原生浏览器对话框。
- **浏览器预览**:在原生应用之外,有一个可变的模拟,因此所有 UI 和操作都可以在无后端的情况下`npm run dev`)。
---
## 支持的代理和兼容性
并非所有代理都支持相同的Nodify可以翻译的内容并保留无法理解的内容。摘要(详见 [docs/canonical-model.md](docs/canonical-model.md)):
| 功能 | Claude Code | Codex | OpenCode |
| --- | :---------: | :---: | :------: |
| MCP stdio | ✓ | ✓ | ✓ |
| MCP HTTP/SSE | ✓ | ✓\* | ✓ |
| 默认模型 | ✓ | ✓ | ✓ |
| 规则(内存) | ✓ `CLAUDE.md` | ✓ `AGENTS.md` | ✓ `AGENTS.md` |
| 提供商(读取) | — | ✓ | ✓ |
| 编写 API 密钥值 | ✓ `settings.env` | shell/`auth.json` | shell/`auth.json` |
| 技能 | ✓ | ✓ | ✓ |
\* 取决于代理版本/支持;请参阅 [docs/adapters/](docs/adapters/)。
---
## 安全保证
Nodify 编写您未创建的文件。这些是使其安全编码为 ADRs 的规则:
- **原位编辑,无独立来源** ([ADR-0002](docs/adr/0002-editor-in-place-no-source-of-truth.md)):每个代理的原生文件是唯一的真实来源。Nodify 没有可以不同步的独立数据库。
- **外科手术写入** ([ADR-0005](docs/adr/0005-surgical-writes-preserve-unknown.md)):所有写入操作**保留未知字段、顺序和注释**,进行**备份**并使用**原子替换**(写入临时文件 + `rename`)。Claude 使用 `serde_json` 带有 `preserve_order`;Codex 使用 `toml_edit保留注释);OpenCode 对 `mcp` 块进行文本拼接,以避免丢失 JSONC 注释。
- **传通机密,屏蔽** ([ADR-0004](docs/adr/0004-secrets-passthrough-masked.md)):值**已屏蔽**发送到 webview;Nodify 不存储它们;同步包将它们简化为环境变量引用。`auth.json` 从不读取或写入。
- **无 GUI 核心**,以便可以彻底进行 headless 领域逻辑测试。
---
## 架构
### 规范模型 + 适配器
Nodify 的核心([ADR-0003](docs/adr/0003-canonical-model-with-adapters.md))是一个中立的**规范模型**(`CanonicalMcp`、`CanonicalSkill`、`SecretValue`、`Transport`...)和一个由每个代理实现的 `Adapter` 特在**原生 ↔ 规范**之间进行转换:
```
┌──────────────────────────────┐
原始文件 │ Adapter 特性 │ 规范模型
(JSON/TOML/JSONC) parse_mcps / upsert_mcp │ (中立,共同)
───────────▶ │ parse_model / set_model │ ───────────▶ UI / 同步
◀─────────── │ parse_providers / set_env │ ◀───────────
(外科写入) │ remove_mcp │
└──────────────────────────────┘
aude.rs · codex.rs · op
```
添加新代理 = 编写** 适配器;无需其他更改。
### Rust crates(工作区,无 GUI)
```
crates/
nodify-core/ 纯领域:规范模型 + Adapter 特性 + 同步包
nodify-adapters/ # 每个代理一个 Adapter 实现 + 操作(共享/查找)
nodify-io/ # 路径检测、安全写入(备份+原子)、技能扫描
```
> `src-tauri/` **故意从** Cargo 工作区中**排除**。它依赖于 webkit/GUI,并且排除它允许 `cargo test --workspace` 在 CI/headless 中运行完整的核心,而无需拖累图形依赖。Shell 通过 *path* 消费 crates。
### 完整流程
```
React(功能/) ──调用──▶ Tauri 命令(src-tauri/src/mutate.rs)
▲ │
│ SWR ▼
│ nodify-adapters ──▶ nodify-core(规范)
└──── 代理扫描 JSON ◀── nodify-io(检测路径,安全写入)
```
- **前端**:React 19 + Vite 6 + Tailwind v4 + shadcn 样式组件(CVA)+ SWR(获取/缓存)+ Zustand(导航和语言)+ `motion`(动画)+ `simple-icons`(徽标)+ Biome(- **在 Tauri 之外预览)有一个**可变模拟**:所有操作(安装、删除、共享、模型、技能、规则、对齐、导出)都适用于模拟数据,因此后端的情况下查看 UI。
### 架构决策记录(ADRs)
| ADR | 决策 |
| --- | --- |
| [0001](docs/0001-desktop-app-tauri.md) | 桌面应用使用 Tauri |
| [0002](docs/adr/0002-editor-in-place-no-source-of-truth.md)编辑,无独立来源 |
| [000/adr/0003-canonical-modelapters.md) | 规范模型 + | [0004](docs/adr-secrets-passthrough-masked.md) | 传递机密,屏蔽 |
| [0005](docs/adr/0005-surgical-writes-preserve-unknown.md) | 外科保留未知) |
| [000/adr/0006-github-sync-canonical-bundle.md) | 通过 GitHub 同步规范包 |
| [0007](docs/adr/0007-canonical-mcp-translation-rules.md) | MCP 在代理之间转换规则 |
---
## 安装 要求
- **Rust**(稳定版)- [rustup.rs](https://rustup.rs)
- **Node 20+**
- **Tauri 先决条件**阅 [tauri.app/start/prerequisites://tauri.app/start/prerequisites/)。
在 Linux 上,需要 **`webkit2gtk-4.1`**(Tauri v2)。Ubuntu 20.04 仅提供 `-4.0`**,因此原生窗口无法编译;请使用 Ubuntu 22.04+、macOS 或 Windows 进行原生应用。(Rust 核心和前端预览操作系统上都。)
###原生应用
``` clone https.com/sijodify.git
ify
npm# 为生成图标运行一次 Tauri 要求):
npx tauri icon nodify_logo.png src-tauri/icons/
npm run tauri dev # 开发(热重载)
npm run tauri build # 生产二进制/安装程序
```
> 第一次在真实文件上运行原生应用时,请遵循 [SMOKE-TEST.md](SMOKE-TEST.md) 的检查清单:它会在写入终端前进行备份并验证每次写入。
---
## 开发
```bash
# ── Rust 核心(不需要 GUI) ──
cargo test --workspace # ~44 个领域测试
cargo clippy --workspace --all-target -D warnings
cargo run -ify-adapters --example scan 扫描您的真实代理(只读# ── 前端 ── install
npm run dev # Vite 在 http://localhost:1420( DEMO 数据)
npm run build # tsc + vite 构建
npm run lint # biome check
npm # biome format --write
# ── 完整应用(Tauri─
npm run tauri dev> **提示:** `cargo run -p nodify-adapters --example scan` 是检查 Nodify 是否正确检测和解析您真实代理配置的最快方法(仅读取)。
---
## 项目结构
```
nodify/
├── crates/ # Rust 核心(无 GUI 的可测试工作区)
│ ├── nodify-core/ # 规范模型、Adapter 特性、同步包
│ ├── nodify-adapters/ # claude.rs · codex.rs · opencode.rs.rs └──-io/ # detect.rs(路径)· write.rs()· skills.rs
├── src/ # Tauri shell:暴露核心的命令(mutate.rs、scan.rs)
├── src/ #端(按功能组织)
│ # 布局、dock 导航、网格背景、顶部徽标、主题
│ / # 品牌(亮/暗)
│ / # ui/(卡片、输入、徽章、对话框... 代理字│ ├── features/ #ps/ · 代理(AL 抽屉)· 机 · 同步/
│ ├──n # + .ts / es.ts │ └── lib/ #uri.ts(包装器)· mock.ts · 类型.ts · 代理├── public/ # favicon图标 docs/ #模型、适配器/、、设计系统
├── CONTEXT.md.md · PLAN.md ·IONS SMOKE-└── Cargo.toml · · vite.config.ts · biome.json---
## 多设备同步
N 可以通过 Git 设备之间复制您的配置([ADR-0006](adr/0006-github-sync.md)):
1. **导出**:生成一个包含所有代理的模型和技能规范包**。机密**环境变量引用** - 在写入值。
2. **推送**:将包写入仓库并执行 `git add/commit/push`。
3. **拉取**:`git pull --ff-only` 然后 **应用** 包到本地代理(外科手术写入)。
4. **差异**应用前查看更改(`+`,`-` 已删除,`~` 已更改)。
在浏览器预览中,可以导出 demo 包;`push` / `pull` 需要原生应用 + 已安装的 `git`。
---
## 常见问题
**Nodify 会损坏我的配置吗?**
每次写入操作都会先备份,操作原子(临时 + `rename`),并保留无法识别的字段和注释。逻辑涵盖了包括往返测试在内的测试。
**你会保存我的 API **
否。值以屏蔽形式发送到 webview,并且只它的代理的文件(Claude.env`)。没有存储或保险`` 从不触及。
**为什么原生窗口在 Ubuntu 20.04 上无法运行?**
Tauri v2 需要 `webkit2gtk-4.1`,而 Ubuntu 20.04 仅提供 `4.0`。使用 22.04+、macOS 或 Windows。核心和前端预览在任何操作系统上都运行正常。
**如何为另一个代理添加支持(Cursor、Gemini CLI...)?**
在 `nodify-adapters` 中为新文件实现 `Adapter` 特性并在 `all()` 中注册它。系统(UI、同步、安全写入)的其余部分无需更改即可使用。
**我需要安装三个代理吗?**
否。Nodify 检测到您拥有的代理并显示其他代理为缺失。
---
## 路線圖
已完成(MVP,第一阶段至第五阶段):MCP、技能、模型、规则、提供商、API 密钥、代理对齐和 Git 同步;另有 i18n(西班牙语/英语)、亮/暗主题和品牌。
查看 [PLAN.md](PLAN.md)。
发布后(待办事项):
-精选的MCP注册表。
- 通过每个代理的本地机制启用/禁用技能。
- 加密的库(操作系统密钥链)。
- 声明式状态 + 漂移检测 + 历史/回滚。
- 项目范围(`.claude/` 本地,项目规则)。
- 更多代理:Cursor,Gemini CLI,Cline ...
---
## 约定和贡献
- **Screaming 架构**(按功能划分的文件夹),**TDD** 在核心,**Conventional Commits**。
- 在 PR 之前:`cargo test --workspace`,`cargo clippy … -D warnings`,`npm run lint`,`npm run build`。
- 详见 [CONVENTIONS.md](CONVENTIONS.md)。
---
## 许可证
MIT。