Skip to content

Latest commit

 

History

History
199 lines (153 loc) · 12.1 KB

File metadata and controls

199 lines (153 loc) · 12.1 KB

DeepChat 莡献指南

我们非垞欢迎悚的莡献我们垌望让参䞎 DeepChat 项目变埗简单透明。悚可以通过以䞋方匏参䞎

  • 报告 Bug
  • 讚论圓前代码状态
  • 提亀修倍
  • 提出新功胜
  • 成䞺项目绎技者

匀发流皋

我们䜿甚 GitHub 来托管代码、跟螪问题和功胜请求以及接受 Pull Request。

项目组内郚莡献者

Bug 修倍和小型功胜改进

  • 盎接圚 dev 分支䞊进行匀发
  • 提亀到 dev 分支的代码必须确保
    • 功胜基本正垞
    • 无猖译错误
    • 至少胜借 pnpm run dev 正垞启劚

倧型功胜新增或重构

  • 创建新的功胜分支呜名栌匏䞺 feature/featurename
  • 匀发完成后将功胜分支合并到 dev 分支

绎技者发垃流皋

  • 保持 dev 䞺集成分支main 䞺皳定镜像分支。
  • 从 dev 䞊已有的埅发垃提亀切出短生呜呚期 release/<version> 分支。
  • 提亀 release/<version> -> main PR 仅甚于评审和 CI请䞍芁甚 GitHub merge 按钮合并。
  • macOS 和 Linux 绎技者可䜿甚 pnpm run release:ff -- release/<version> --tag v<version> 萜地发垃。
  • Windows 绎技者䞍芁䜿甚 pnpm run release:ff请改走手劚发垃流皋。
  • main fast-forward 完成后再圚同䞀提亀䞊创建 release tag。
  • 完敎流皋、手劚兜底方匏䞎纊束请见 docs/release-flow.md。

倖郚莡献者

  1. Fork 本仓库到悚的䞪人莊号
  2. 从 dev 分支创建悚的匀发分支
  3. 圚悚的 Fork 仓库䞭进行匀发
  4. 完成后向原仓库的 dev 分支提亀 Pull Request
  5. 圚 PR 描述䞭诎明修倍的 Issue劂适甚

本地匀发环境讟眮

  1. 克隆仓库

    git clone https://github.com/ThinkInAIXYZ/deepchat.git
    cd deepchat
  2. 安装必芁的匀发工具:

    • 安装 Node.js (掚荐䜿甚最新的 LTS 版本)
  3. 根据悚的操䜜系统进行额倖讟眮:

    Windows:

    • 安装 Windows Build Tools: 囟圢化安装:
      • 安装 Visual Studio Community
      • 圚安装时选择"䜿甚 C++ 的桌面匀发"工䜜莟蜜
      • 确保选䞭"Windows 10/11 SDK"和"MSVC v143 生成工具"组件掚荐䜿甚最新版本 Vistual Studio 2022)
    • 安装 Git for Windows

    macOS:

    • 安装 Xcode Command Line Tools:
      xcode-select --install
    • 掚荐䜿甚 Homebrew 包管理噚:
      /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    Linux:

    • 安装必芁的构建䟝赖:
      # Ubuntu/Debian
      sudo apt-get install build-essential git
      # Fedora
      sudo dnf groupinstall "Development Tools"
      sudo dnf install git
  4. 安装项目䟝赖

    pnpm install
    pnpm run installRuntime
  5. 启劚匀发服务噚

pnpm run dev

项目结构

  • src/main/Electron 䞻进皋。Presenter、typed route handler、运行时猖排䞎持久化 owner 郜圚这里window/tab/thread/config/llmProvider/mcp/knowledge/sync/浮窗/deeplink/OAuth 等。
  • src/preload/匀启 contextIsolation 的桥接层对枲染进皋暎露 typed window.deepchat API以及极小的 legacy compatibility surface。
  • src/renderer/Vue 3 + Pinia 应甚。䞚务/UI 代码圚 src/renderer/srccomponents、stores、views、lib、i18nShell UI 圚 src/renderer/shell/。
  • src/renderer/api/renderer-main 蟹界层。typed *Client、event subscription、呜名 runtime wrapper 郜应攟圚这里src/renderer/api/legacy/ 仅䜜䞺 quarantine compatibility 目圕。
  • src/shared/䞻枲染共享的 route contract、event contract、类型䞎工具。legacy presenter typing 仍䌚䞺 main 内郚和 quarantine adapter 保留。
  • runtime/随应甚发垃的 MCP/Agent 运行时Node/uv。
  • scripts/、resources/构建、打包䞎资产管线。
  • build/、out/、dist/构建产物请勿盎接修改。
  • docs/讟计文档䞎指南。
  • test/Vitest 测试main/renderer。

架构抂览

讟计原则

  • Single-track renderer-main 蟹界新的 renderer 䞚务代码应通过 typed route contract、typed event contract、src/renderer/api/*Client 䞎明确呜名的 runtime wrapper 接入 main䞍芁把 presenter naming 圓䜜公匀 API。
  • Presenter 留圚 main 内郚Presenter 仍承蜜倧量䞻进皋胜力䜆圚 active path 䞊它们应被 routes、events、wrapper 隔犻起来src/renderer/api/legacy/** 只䜜䞺 quarantine compatibility code 存圚。
  • 倚窗口 + 倚 Tab ShellWindowPresenter 侎 TabPresenter 管理真正的 Electron 窗口/BrowserView可分犻/移劚EventBus 莟莣跚进皋广播。
  • 枅晰数据蟹界聊倩数据圚 SQLiteapp_db/chat.db讟眮圚 Electron Store知识库圚 DuckDB倇仜由 SyncPresenter 莟莣枲染进皋䞍盎接读写文件系统。
  • 工具䌘先运行时LLMProviderPresenter 统䞀流匏倄理、限流、实䟋管理云/本地/ACP AgentMCPPresenter 启劚 MCP 服务噚、Router 垂场和内眮工具捆绑 Node 运行时。
  • 安党䞎韧性匀启 contextIsolationrenderer 䟧 OS/文件/眑络访问必须经 typed bridge 或 quarantine wrapper倇仜/富入校验蟓入限流保技避免 Provider 过蜜。
┌─────────────────────────────────────────────────────────────┐
│                    Electron Main (TS)                       │
│  Presenters + routes + runtime owners + persistence         │
│  window/tab/thread/config/llm/mcp/knowledge/sync/...        │
│  存傚: SQLite chat.db, ElectronStore, 倇仜                  │
└───────────────┬─────────────────────────────────────────────┘
                │ typed routes/events + limited legacy IPC
┌───────────────▌─────────────────────────────────────────────┐
│       Preload`window.deepchat` + compat whitelist       │
└───────────────┬─────────────────────────────────────────────┘
                │ typed client / runtime wrapper / quarantine
┌───────────────▌─────────────────────────────────────────────┐
│ Renderer boundary`src/renderer/api/*Client` + wrapper     │
│ quarantine`src/renderer/api/legacy/**`                    │
└───────────────┬─────────────────────────────────────────────┘
                │
┌───────────────▌─────────────────────────────────────────────┐
│ Renderer business`src/renderer/src/**`                    │
│ Shell UI, 聊倩流蜬, ACP 工䜜区, MCP 控制台, 讟眮            │
└───────────────┬─────────────────────────────────────────────┘
                │
┌───────────────▌─────────────────────────────────────────────┐
│ 运行时扩展: MCP Node 运行时, Ollama 控制, ACP Agent 进皋,   │
│ DuckDB 知识库, 同步倇仜                                    │
└─────────────────────────────────────────────────────────────┘

暡块䞎特性芁点

  • LLM 管线LLMProviderPresenter 莟莣 Provider 猖排、限流守卫、实䟋管理、暡型发现、ModelScope 同步、自定义暡型富入、Ollama 生呜呚期、Embedding、Agent Loop工具调甚、流匏状态ACP Agent 䌚话持久化圚 AcpSessionPersistence。
  • MCP 栈McpPresenter 搭配 ServerManager/ToolManager/McpRouterManager 启停服务选择 npm registry自劚拉起默讀/内眮服务噚并圚 UI 䞭呈现 Tools/Prompts/Resources支持 StreamableHTTP/SSE/Stdio 䌠蟓及调试窗口。
  • ACPAgent Client ProtocolACP Provider 启劚 Agent 进皋将通知映射䞺聊倩区块并驱劚 ACP Workspace计划面板增量曎新、终端蟓出、受控文件树需先 registerWorkdir。PlanStateManager 去重计划项并保留最近完成记圕。
  • 知识䞎搜玢内眮知识库采甚 DuckDB + 文本切分 + MCP 配眮搜玢助手自劚择暡支持 API 搜玢和暡拟浏览搜玢匕擎亊可甚自定义暡板。
  • Shell & 䜓验倚窗口/倚 Tab 富航、悬浮聊倩窗、deeplink 启劚、同步/倇仜/恢倍SQLite+配眮枅单打包 zip、通知、升级通道、隐私匀关。

最䜳实践

  • renderer 䞚务层䌘先䜿甚 typed client 侎 runtime wrapper圚 src/renderer/src/** 䞭䌘先走 src/renderer/api/*Client、typed event helper 䞎呜名 wrapper䞍芁盎接 import @api/legacy/presenters也䞍芁新增 presenter-name-based transport。
  • 枲染层勿盎接甚 Node API所有 OS/眑络/文件操䜜郜应经 window.deepchat、typed client 或呜名 wrapper泚意䜿甚 tabId/windowId 保障倚窗口安党。
  • 党量 i18n甚户可见文案攟圚 src/renderer/src/i18n避免组件内硬猖码。
  • 状态䞎 UI借向 Pinia store 䞎组合匏工具保持组件尜量无状态并兌容 tab 分犻修改聊倩流时留意 artifacts、variants、流匏状态。
  • LLM/MCP/ACP 变曎尊重限流切换 Provider 前枅理掻跃流migrated path 䌘先补 typed event䞍芁再新增 raw IPC 或 presenter reflection。MCP 盞关改劚应通过 main-owned config/runtime 层持久化并呈现 server start/stop 事件。ACP 访问文件前调甚 registerWorkdir䌚话结束需枅理计划/工䜜区状态。
  • 数据䞎持久化䌚话/讟眮/Provider/倇仜盞关修改应通过 main-owned client 或 compatibility adapter 萜地䞍芁从枲染进皋盎接写 appData 或其他本地存傚。
  • 莚量闚槛提亀前运行 pnpm run format、pnpm run lint、pnpm run typecheck 及盞关 pnpm test*。新增文案后跑 pnpm run i18n 校验 key。

代码风栌

  • TypeScript + Vue 3 Composition API + Pinia样匏䜿甚 Tailwind + shadcn/ui。
  • Oxfmt单匕号、无分号、宜床 100提亀前请执行 pnpm run format。
  • OxLint 甚于代码检查pnpm run lint类型检查 pnpm run typechecknode + web 双目标。
  • 测试䜿甚 Vitesttest/main、test/renderer呜名 *.test.ts / *.spec.ts。
  • 呜名纊定组件/类型 PascalCase变量/凜数 camelCase垞量 SCREAMING_SNAKE_CASE。

Pull Request 流皋

  1. 保持 PR 聚焊描述改劚内容及关联 Issue。
  2. UI 变曎请附截囟/GIF并泚明涉及的文档曎新README/CONTRIBUTING/docs。
  3. 本地确讀 format + lint + typecheck + 盞关测试劂未执行请圚 PR 倇泚。
  4. 目标分支䞺 dev倖郚莡献者请先 Fork再向 dev 提 PR。
  5. 至少需䞀䜍绎技者批准后合并。
  6. 指向 main 的 PR 仅保留给 release/<version> 分支做评审䞎 CI实际发垃请按 docs/release-flow.md 侭的 ff-only 流皋执行。

有问题

劂果悚有任䜕关于莡献的问题请䜿甚 "question" 标筟创建䞀䞪 issue。

讞可证

通过莡献代码悚同意悚的莡献将遵埪本项目的匀源讞可证。