项目结构
IfAI 源代码的组织方式概述。
仓库布局
ifai/
├── docs/ # 文档站点
│ ├── .vitepress/ # VitePress 配置
│ ├── user/ # 用户文档
│ ├── development/ # 开发文档
│ └── technical/ # 技术深度
│
├── src/ # 前端源码 (React/TypeScript)
│ ├── components/ # React 组件 (23 个模块)
│ ├── stores/ # Zustand 状态存储 (26 个)
│ ├── services/ # 业务逻辑
│ ├── hooks/ # 自定义 React hooks
│ ├── utils/ # 工具函数
│ ├── i18n/ # 国际化
│ ├── core/ # 核心抽象
│ └── types/ # TypeScript 定义
│
├── src-tauri/ # Rust 后端
│ ├── src/
│ │ ├── commands/ # Tauri 命令
│ │ ├── agent_system/ # Agent 框架
│ │ ├── llm_inference/ # 本地 LLM(可选)
│ │ ├── conversation/ # 聊天管理
│ │ ├── prompt_manager/ # 提示词模板
│ │ └── lib.rs # 主入口
│ ├── Cargo.toml # Rust 依赖
│ └── tauri.conf.json # Tauri 配置
│
├── tests/ # E2E 测试
│ └── e2e/ # Playwright 测试
│
├── package.json # Node.js 依赖
├── vite.config.ts # Vite 配置
└── tsconfig.json # TypeScript 配置前端结构
组件 (src/components/)
components/
├── AIChat/ # AI 聊天面板
│ ├── AIChat.tsx
│ ├── MessageList.tsx
│ ├── MessageInput.tsx
│ └── ContextBar.tsx
│
├── Composer/ # 多文件编辑器
│ ├── Composer.tsx
│ ├── FileList.tsx
│ ├── DiffView.tsx
│ └── ApplyButton.tsx
│
├── Editor/ # Monaco 包装器
│ ├── EditorContainer.tsx
│ ├── MonacoWrapper.tsx
│ └── EditorDecorations.tsx
│
├── FileTree/ # 项目浏览器
│ ├── FileTree.tsx
│ ├── TreeNode.tsx
│ └── FileActions.tsx
│
├── Terminal/ # 集成终端
│ ├── Terminal.tsx
│ ├── TerminalManager.tsx
│ └── TerminalTabs.tsx
│
├── CommandPalette/ # 快速命令
├── Settings/ # 设置 UI
├── SnippetManager/ # 代码片段
└── TaskBreakdown/ # 任务可视化Stores (src/stores/)
stores/
├── useChatStore.ts # 主聊天状态 (100KB+)
├── fileStore.ts # 文件操作
├── editorStore.ts # 编辑器配置
├── agentStore.ts # Agent 执行
├── settingsStore.ts # 用户偏好
├── shortcutStore.ts # 键盘快捷键
├── terminalStore.ts # 终端状态
└── ...Services (src/services/)
services/
├── codeAnalysis.ts # 代码理解
├── refactoring.ts # AI 重构
├── errorFixService.ts # 错误解决
├── multimodalService.ts # 图片处理
├── symbolService.ts # 代码导航
└── ...后端结构
Rust 模块 (src-tauri/src/)
src/
├── lib.rs # 主入口
├── ai_utils.rs # AI 提供商抽象
├── local_model.rs # 本地 LLM 支持
├── intelligence_router.rs # AI 路由逻辑
├── multimodal.rs # 图片处理
│
├── commands/
│ ├── atomic_commands.rs # 文件操作
│ ├── core_wrappers.rs # 核心功能
│ └── symbol_commands.rs # 符号索引
│
├── agent_system/
│ ├── supervisor.rs # Agent 编排
│ └── toolchain.rs # 工具执行
│
├── conversation/
│ ├── manager.rs # 聊天历史
│ └── context.rs # 上下文管理
│
├── prompt_manager/
│ ├── templates.rs # 提示词模板
│ └── builder.rs # 提示词构建
│
└── llm_inference/
├── engine.rs # GGUF 推理(可选)
└── model_loader.rs # 模型加载关键后端文件
| 文件 | 用途 |
|---|---|
lib.rs | Tauri 设置、命令注册 |
ai_utils.rs | 多提供商 AI 客户端 |
local_model.rs | Ollama 集成 |
commands/atomic_commands.rs | 文件 I/O 操作 |
agent_system/supervisor.rs | 自主 agent 逻辑 |
配置文件
前端
| 文件 | 用途 |
|---|---|
package.json | 依赖、脚本 |
vite.config.ts | 构建配置 |
tsconfig.json | TypeScript 配置 |
tailwind.config.js | 样式配置 |
后端
| 文件 | 用途 |
|---|---|
Cargo.toml | Rust 依赖 |
tauri.conf.json | Tauri 应用配置 |
build.rs | 构建脚本 |
文档
| 文件 | 用途 |
|---|---|
.vitepress/config.mts | VitePress 站点配置 |
package.json (docs) | 文档依赖 |
模块依赖
┌─────────────────────────────────────────────────────────┐
│ 前端 │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ 组件 │───▶│ 存储 │◀───│ 服务 │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
│ │ │
│ ┌───────▼─────┐│
│ │ Tauri 调用 ││
│ └───────┬─────┘│
└───────────────────────────────────────────────│───────┘
│ IPC
┌───────────────────────────────────────────────▼───────┐
│ 后端 │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ 命令 │───▶│ 模块 │◀───│ Crates │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 外部集成 │ │
│ │ Ollama │ OpenAI │ Claude │ 文件系统 │ Git │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────┘文件命名约定
前端
- 组件:PascalCase (
AIChat.tsx) - Hooks:带 'use' 前缀的 camelCase (
useChatStore.ts) - Stores:带 'use' 前缀的 camelCase (
useChatStore.ts) - Services:camelCase (
codeAnalysis.ts) - Types:PascalCase (
ChatMessage.ts)
后端
- 模块:snake_case (
ai_utils.rs) - 命令:snake_case (
atomic_commands.rs) - 类型:PascalCase (
ChatMessage.rs) - Traits:PascalCase (
LLMProvider.rs)
构建产物
生成的文件
dist/ # 前端构建输出
├── assets/ # 静态资源
├── index.html # 入口 HTML
└── *.js # 打包的 JavaScript
src-tauri/target/
├── release/ # 最终应用包
│ ├── IfAI.app # macOS
│ ├── IfAI-setup.exe # Windows
│ └── ifai.AppImage # Linux
└── *.dylib / *.dll # 原生库测试结构
tests/
├── e2e/
│ ├── basic-usage.spec.ts # 核心工作流程
│ ├── ai-chat.spec.ts # AI 功能
│ ├── composer.spec.ts # 多文件编辑
│ └── navigation.spec.ts # 代码导航
│
src-tauri/tests/ # Rust 单元测试
└── src/__tests__/ # 前端单元测试添加新功能
前端功能
- 在
src/components/中创建组件 - 如需要在
src/stores/中添加 store - 在
src/services/中创建服务 - 在
src-tauri/src/commands/中注册命令
后端功能
- 在适当的模块中添加 Rust 代码
- 在
lib.rs中注册命令 - 在
src/types/中创建 TypeScript 类型 - 添加前端服务包装器