æä»¬éåžžæ¬¢è¿æšç莡ç®ïŒæä»¬åžæè®©åäž DeepChat 项ç®ååŸç®åéæãæšå¯ä»¥éè¿ä»¥äžæ¹åŒåäžïŒ
- æ¥å Bug
- 讚论åœå代ç ç¶æ
- æäº€ä¿®å€
- æåºæ°åèœ
- æäžºé¡¹ç®ç»Žæ€è
æä»¬äœ¿çš GitHub æ¥æç®¡ä»£ç ãè·èžªé®é¢ååèœè¯·æ±ïŒä»¥åæ¥å Pull Requestã
- çŽæ¥åš
dev忝äžè¿è¡åŒå - æäº€å°
dev忝ç代ç å¿ é¡»ç¡®ä¿ïŒ- åèœåºæ¬æ£åžž
- æ çŒè¯é误
- è³å°èœå€
pnpm run devæ£åžžå¯åš
- å建æ°çåèœåæ¯ïŒåœåæ ŒåŒäžº
feature/featurename - åŒå宿åå°åèœåæ¯åå¹¶å°
dev忝
- ä¿æ
dev䞺éæåæ¯ïŒmain䞺皳å®éå忝ã - ä»
deväžå·²æçåŸ ååžæäº€ååºççåœåšærelease/<version>忝ã - æäº€
release/<version> -> mainPR ä» çšäºè¯å®¡å CIïŒè¯·äžèŠçš GitHub merge æé®åå¹¶ã - macOS å Linux 绎æ€è
å¯äœ¿çš
pnpm run release:ff -- release/<version> --tag v<version>èœå°ååžã - Windows 绎æ€è
äžèŠäœ¿çš
pnpm run release:ffïŒè¯·æ¹èµ°æåšååžæµçšã mainfast-forward 宿åïŒååšåäžæäº€äžå建 release tagã- 宿޿µçšãæåšå åºæ¹åŒäžçºŠæè¯·è§ docs/release-flow.mdã
- Fork æ¬ä»åºå°æšç䞪人莊å·
- ä»
dev忝å建æšçåŒå忝 - åšæšç Fork ä»åºäžè¿è¡åŒå
- 宿åååä»åºç
dev忝æäº€ Pull Request - åš PR æè¿°äžè¯Žæä¿®å€ç IssueïŒåŠéçšïŒ
-
å éä»åºïŒ
git clone https://github.com/ThinkInAIXYZ/deepchat.git cd deepchat -
å®è£ å¿ èŠçåŒåå·¥å ·:
- å®è£ Node.js (æšèäœ¿çšææ°ç LTS çæ¬)
-
æ ¹æ®æšçæäœç³»ç»è¿è¡é¢å€è®Ÿçœ®:
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
- å®è£
Windows Build Tools:
åŸåœ¢åå®è£
:
-
å®è£ 项ç®äŸèµïŒ
pnpm install pnpm run installRuntime
-
å¯åšåŒåæå¡åšïŒ
pnpm run devsrc/main/ïŒElectron äž»è¿çšãPresenterãtyped route handlerãè¿è¡æ¶çŒæäžæä¹ å owner éœåšè¿éïŒwindow/tab/thread/config/llmProvider/mcp/knowledge/sync/æµ®çª/deeplink/OAuth çïŒãsrc/preload/ïŒåŒå¯contextIsolationçæ¡¥æ¥å±ïŒå¯¹æž²æè¿çšæŽé² typedwindow.deepchatAPIïŒä»¥åæå°ç 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ã
- ä¿æ PR èçŠïŒæè¿°æ¹åšå 容åå ³è Issueã
- UI åæŽè¯·éæªåŸ/GIFïŒå¹¶æ³šææ¶åçææ¡£æŽæ°ïŒREADME/CONTRIBUTING/docsïŒã
- æ¬å°ç¡®è®€ format + lint + typecheck + çžå ³æµè¯ïŒåŠæªæ§è¡è¯·åš PR 倿³šã
- ç®æ åæ¯äžº
devïŒå€éšèŽ¡ç®è 请å ForkïŒåådevæ PRã - è³å°éäžäœç»Žæ€è æ¹åååå¹¶ã
- æå
mainç PR ä» ä¿çç»release/<version>忝åè¯å®¡äž CIïŒå®é ååžè¯·æ docs/release-flow.md äžçff-onlyæµçšæ§è¡ã
åŠææšæä»»äœå ³äºèŽ¡ç®çé®é¢ïŒè¯·äœ¿çš "question" æ çŸå建äžäžª issueã
éè¿èŽ¡ç®ä»£ç ïŒæšåææšç莡ç®å°éµåŸªæ¬é¡¹ç®çåŒæºè®žå¯è¯ã