现在AI 开发项目了,我发现我IDEA 都很少打开了,我发现我现在使用IDEA来管理项目,用得最多的无非就是启动项目,运行下命令行,git管理下提交内容,但不知道为什么这个吃内存大户占用了我非常多的内存,但不得不说我用了这么多年了的确很好用,但现在项目启动多了,内存感觉不太够用,于是想着自己写一个前后端分离的项目
当我们的项目多了以后,这些操作会反复出现。启动命令散在不同的 README 里,终端开了一排,切回一个项目时,还得重新确认哪些服务正在运行。
我给自己做了一个桌面工具,把这些日常操作放到一起。现在它已经基本能满足我的使用需求,就整理出来开源了,名字叫 项目工作台(AI Project Manager)。
先放一张界面图:

项目地址:GitHub · ai-project-manager
它适合配合平时的 IDE 使用:工作台负责项目切换、服务运行、日志和一些文件、Git 操作,复杂编码和调试继续交给熟悉的编辑器。
名字里虽然有 AI,目前还没有接入模型,也不需要配置 API Key。现阶段做的都是本地开发工具的基础功能。
启动一个项目,少翻几次 README
我最先想解决的是服务启动。
一个仓库可能同时包含前端、后端和其他任务。每个服务的工作目录、启动命令、环境变量都不一样,如果能把这些配置记下来,下次打开项目就会方便很多。
工作台支持导入本地目录,也可以克隆 Git 仓库。导入后会扫描常见的项目描述文件和入口,识别 Node.js、FastAPI、Java 等项目的部分启动信息。
识别结果可以手工修改,也可以直接添加自定义服务。每个服务都能配置:
- 工作目录和启动命令。
- 环境变量。
- HTTP 就绪检查地址。
- 启动依赖。
例如,一个仓库的前端放在 web,后端放在 backend,就可以分别保存两份运行配置。以后进入这个项目,核对配置后启动即可。
这里有两个细节。
一是扫描只负责识别,不会自动安装依赖或执行脚本。识别到命令以后,仍然需要自己确认。
二是"进程已经启动"和"服务可以访问"分开显示。配置了 HTTP 就绪地址后,工作台会继续探测,避免进程刚创建就被当成服务已经准备好了。组合启动则按配置的依赖顺序执行。
服务输出会进入下方日志面板,支持筛选、复制和跟随输出。需要手工执行命令时,可以打开项目终端。

文件管理补到日常够用
服务能跑起来以后,我又补上了文件浏览和编辑。
有时只是改一行配置、补一段 README,或者把一个目录复制进项目,直接在工作台里处理会更方便。
目前支持树形目录、多标签编辑、语法高亮,以及新建文件和目录。文件、目录都可以复制、粘贴或拖入,也可以按住 Ctrl 逐项选择,按住 Shift 选择一段,再批量操作。
删除会移入系统回收站。拖入按复制处理,遇到同名项可以保留副本或跳过,不会直接覆盖现有文件。
编辑器里的草稿也做了保留:切换文件标签时,输入的内容、光标位置和撤销记录会留着,按 Ctrl+S 才保存到磁盘。保存前还会检查文件是否被外部工具修改过,避免覆盖刚刚在 IDE 里保存的内容。
这部分定位是轻量编辑。目前没有完整的语言服务和断点调试,复杂的代码修改我还是会回到 IDE。
Git 三栏合并,比放三个编辑器难不少

日常 Git 操作也放进来了:查看文件变更、暂存、提交、切换本地分支、获取、拉取和推送。
花时间比较多的是冲突处理。我希望它接近 IntelliJ IDEA 的使用方式:先列出冲突文件,点开以后,左边看本地版本,右边看待合入版本,中间编辑最后的结果。

最初只是把三份内容放出来,很快就发现不够用。文件一长,找不到冲突位置;三栏滚动不同步,很难比较同一段;只有顶部的"采用本地"和"采用远端",处理起来也不直观。
现在合并界面使用独立的大弹窗,改动位置有高亮和两侧操作入口。可以把一侧内容采用到中间,也可以拒绝这一侧的改动,保留当前结果。中间的内容仍然可以直接编辑。
三栏支持横向、纵向同步滚动,合并操作支持 Ctrl+Z 撤销,Ctrl+Y 或 Ctrl+Shift+Z 重做。除了双方都改过的冲突块,也会展示单侧新增等差异。
做这部分时,一个很容易踩的坑是:把"还存在差异"当成"还没有处理完成"。
比如我采用了右侧内容,合并结果自然可能和左侧不同。如果每次都根据这个差异重新生成待处理按钮,就会出现一种循环:刚处理完,按钮又回来了;为了去掉按钮继续操作,又把已经合并好的内容删掉了。
这里需要单独记录对改动块的处理决定。左右原文和最终结果可以不同,用户已经确认过的取舍不应该反复变成待处理项。撤销时,恢复的也要包括处理状态,不能只恢复中间的文本。
处理完成后,点击"应用更改"会保存并暂存该文件。所有冲突文件处理完,再提交合并、推送到远端。
普通拉取采用仅快进策略。本地与远端已经分叉时,可以使用"合并远端",再进入上面的流程。目前还没有提供 rebase 和强制推送。
界面和关闭行为,也要适合每天用
界面做成了玻璃质感,支持浅色和深色模式。

调整这套界面时,我发现单纯把背景调淡、把卡片变透明,并不一定能得到想要的效果。背景颜色太强,会影响文字阅读;边框太白,又容易让每个面板都像描了一圈线。
所以后来把侧边栏、服务卡片、日志、终端和弹窗的主题一起调整,也保留了主要操作的颜色区别。启动、停止和普通操作需要能分清楚,不能为了透明效果把按钮都做成同一种颜色。
另外补了一个我自己很需要的行为:关闭窗口后隐藏到系统托盘。
点击窗口的关闭按钮,或者按 Alt+F4,只会把窗口藏起来,已经启动的服务、终端和未保存编辑内容继续保留。点击托盘图标,或者再次打开工作台快捷方式,可以恢复窗口。
真正退出需要选择"退出工作台"。这时会确认运行中的服务和未保存内容,确认退出后再停止工作台管理的进程。
这样就不用担心随手关掉窗口,把正在使用的开发服务一起关掉了。
用到的技术,以及几个实现取舍
技术栈比较常见:
| 部分 | 方案 |
|---|---|
| 桌面运行时 | Electron |
| 界面 | Vue 3、Vite、TypeScript |
| 代码编辑 | CodeMirror 6 |
| 交互终端 | xterm.js、node-pty |
| Git | 调用本机 Git CLI |
| Windows 安装包 | Inno Setup 6 |
Vue 渲染端负责展示和交互,文件、Git 和进程操作放在 Electron 主进程。两边通过 preload 暴露的固定接口通信,主进程校验请求来源和参数。界面没有直接开启 Node.js 访问能力。
Git 直接复用本机配置和认证。读取状态时使用 NUL 分隔的输出,避免文件名里的空格、中文干扰解析;仓库写操作按顺序执行,减少工作台内部的并发冲突。
服务和终端使用 PTY。停止服务时,处理的是工作台登记的进程树,不会根据某个端口直接结束一个来历不明的进程。
托盘后台运行则保留原来的窗口实例,不卸载页面。这样草稿、终端和编辑器状态都能继续保留;等窗口确认真正关闭后,再清理受管进程。
本地项目配置保存在应用数据目录,仓库仍然留在原位置。移除项目记录不会删除项目目录。服务环境变量目前保存在本机明文配置中,这部分还有改进空间。
怎么运行
当前主要面向 Windows,仓库提供了 EXE 安装包构建流程。
从源码启动:
powershell
git clone https://github.com/lyunsheng051-png/ai-project-manager.git
cd ai-project-manager
npm ci
npm run dev:desktop
源码启动需要 Node.js 和 npm;Git 操作需要本机 Git。工作台复用现有开发环境,启动 Python、Java 或 Node.js 项目时,也需要先准备好对应环境和依赖。
自己构建 Windows 安装包可以运行:
powershell
npm run package:win
安装包使用 Inno Setup 6 生成,具体步骤在仓库的 打包说明 中。
文中的截图使用示例仓库,安装包功能以对应版本为准。项目目前还处于持续迭代阶段,复杂的二进制冲突、重命名冲突等情况,仍建议交给系统 Git 或熟悉的工具处理。
想听听其他人的使用场景
这个工具是从我自己的日常操作一点点补出来的。服务管理、文件编辑和 Git 合并都有了,但项目入口识别、不同终端环境的兼容,以及大仓库的使用体验,还有不少可以继续做的地方。
项目采用 MIT 协议,中文、英文 README 都已整理在仓库里。如果你也经常同时维护几个本地项目,可以试试看。
遇到问题时,欢迎带上启动方式、复现步骤和错误信息提 Issue。也想了解一下:你每天打开一个项目时,最想省掉的是哪一步?
项目地址:ai-project-manager