-
Notifications
You must be signed in to change notification settings - Fork 0
Archive Development Plan
clean edited this page Sep 16, 2026
·
1 revision
归档于 2026-09-16,来源:
TODO.md,代码基线:184210a4ebb0a5c41bab2889bb9528ba42a9ace5。原有日期、计划状态、测试结果及未验证项按原文保留,不代表当前版本已重新验收。
仅迁移项目开发计划;原文件中非项目内容未纳入 Wiki。
在本地 Mac 上通过 Web UI 管理远程 Windows 机器上的 Git 仓库,解决挂载盘方式(如 Fork)操作延迟高、体验差的问题。
┌───────────────── Mac (本地) ─────────────────┐
│ React Frontend ◄──► NestJS Backend │
│ │ │
│ SSH2 / WebSocket │
│ │ │
│ ┌──── 内网通道 ────┐ │
└──────────────┼─────────────────┼──────────────┘
│ │
┌──────────────┼─────────────────┼──────────────┐
│ Windows (远程) │ │
│ ┌────────────────────────────┘ │
│ │ SSH Server (OpenSSH) │
│ │ └─► Git CLI 执行命令 │
│ │ │
│ │ [可选] Remote Agent (轻量 NestJS 服务) │
│ │ └─► 提供 REST/WebSocket API │
│ │ └─► 文件监听、仓库索引、实时推送 │
└───────────────────────────────────────────────┘
选择理由:
- 远程 Windows 已有 SSH Server(OpenSSH),无需额外安装
- ssh2 是纯 Node.js 实现,跨平台,无需本地 SSH 依赖
- 支持公钥/密码认证、SFTP 文件传输、端口转发
- 可以执行任意 shell 命令,天然适配 Git CLI 操作
可选增强:Remote Agent 模式
- 在 Windows 上部署一个轻量 NestJS 服务
- 通过 WebSocket 实时推送仓库状态变更(比轮询 SSH 更高效)
- 支持 chokidar 文件监听,即时反映工作区变化
- 首期可不做,后期作为性能优化加入
- 初始化 monorepo 结构(nx 或 turborepo)
remote-git/ ├── apps/ │ ├── web/ # React 前端 │ └── server/ # NestJS 后端 ├── packages/ │ ├── shared/ # 共享类型/工具 │ └── ssh-client/ # SSH 连接封装 ├── package.json └── turbo.json - 配置 TypeScript、ESLint、Prettier
- 初始化 NestJS 项目(
nest new) - 初始化 React 项目(Vite + React)
- 配置 Git 仓库、.gitignore
- 安装
ssh2依赖:npm i ssh2 - 实现 SSH 连接服务(
ssh-client包)- 连接配置管理(host, port, username, auth)
- 支持密码认证和公钥认证(
ssh2.Utils.parseKey) - 连接池管理(复用连接、超时断开、自动重连)
- 连接状态事件:
connect,disconnect,error - SSH Config 文件解析(
~/.ssh/config),自动读取已有配置
- 实现 SFTP 操作服务
- 读取远程目录结构(ls / stat)
- 文件内容读写(用于 diff 查看、文件编辑)
- 文件上传/下载(批量操作时使用)
- 封装
execCommand(cmd: string, cwd?: string)方法- 基于
ssh2.Client.exec() - 支持 stdout/stderr 流式输出(用于长时间运行的 git 操作)
- 超时控制与取消(
channel.close()) - 返回
{ exitCode, stdout, stderr }
- 基于
- Git 命令封装层
-
gitStatus(repoPath)→ 解析git status --porcelain=v2 --branch -
gitLog(repoPath, opts)→ 解析git log --format=... -
gitDiff(repoPath, opts)→ 解析git diff输出 -
gitBranchList(repoPath)→ 解析git branch -a -v -
gitStashList(repoPath)→ 解析git stash list -
gitRemoteList(repoPath)→ 解析git remote -v -
gitExecute(repoPath, args)→ 通用 git 命令执行
-
- 命令输出解析器
- porcelain v2 格式状态解析
- log 格式化解析
- diff 统一格式解析(可使用
diff2html库渲染)
-
ConnectionModule/ConnectionService- CRUD 远程主机配置(加密存储密码/密钥)
- 测试连接(SSH handshake 验证)
- 连接状态管理(已连接/断开/重连中)
-
ConnectionController-
POST /connections- 添加连接 -
GET /connections- 列出连接 -
DELETE /connections/:id- 删除连接 -
POST /connections/:id/test- 测试连接
-
-
RepositoryModule/RepositoryService- 扫描远程目录查找 Git 仓库(
find . -name .git -type d) - 仓库收藏/置顶(本地数据库存储)
- 仓库状态概览(branch, status, ahead/behind)
- 扫描远程目录查找 Git 仓库(
-
RepositoryController-
GET /repositories/scan?connectionId=&path=- 扫描仓库 -
GET /repositories/:id/status- 仓库状态 -
GET /repositories/:id/log- 提交历史 -
GET /repositories/:id/diff- 文件差异 -
GET /repositories/:id/branches- 分支列表 -
GET /repositories/:id/stashes- stash 列表
-
-
GitModule/GitService- Stage/Unstage 文件(
git add/git reset) - Commit(
git commit -m/ 打开编辑器暂不支持,前端输入信息) - Push/Pull/Fetch(
git push/git pull/git fetch) - Branch 操作(create/switch/delete/merge/rebase)
- Stash 操作(save/pop/apply/drop)
- Checkout 文件(
git checkout -- <file>) - Reset(
git reset --soft/--mixed/--hard) - Cherry-pick / Revert
- Stage/Unstage 文件(
-
GitController-
POST /repositories/:id/stage- stage 文件 -
POST /repositories/:id/unstage- unstage 文件 -
POST /repositories/:id/commit- 提交 -
POST /repositories/:id/push- 推送 -
POST /repositories/:id/pull- 拉取 -
POST /repositories/:id/branch- 分支操作 - ...其他 git 操作端点
-
-
FileModule/FileService- 远程目录树浏览(SFTP)
- 文件内容读取(用于查看未追踪文件 diff)
- 简易文件编辑(修改后保存,触发 git diff)
-
EventsGateway(@WebSocketGateway)- 实时推送命令执行输出(git push/pull 长时间操作)
- 仓库状态变更通知
- 连接状态变更通知
- 事件定义
-
connection:status- 连接状态变更 -
repo:status- 仓库状态变更 -
command:output- 命令执行输出(流式) -
command:exit- 命令执行完成
-
- 项目脚手架(Vite + React + TypeScript)
- UI 组件库选型与引入
- 推荐 Ant Design(功能全面,表格/树/表单组件丰富)
- 备选:Arco Design、Shadcn UI
- 状态管理(Zustand,轻量适合本项目)
- 路由配置(React Router v6)
- API 封装(axios + SWR/React Query)
- WebSocket 连接管理(socket.io-client)
- 连接列表页
- 展示已配置的远程主机
- 连接状态指示器(在线/离线/重连)
- 添加/编辑/删除连接
- 连接配置表单
- 主机地址、端口、用户名
- 认证方式切换(密码 / 密钥文件 / SSH Agent)
- SSH Config 导入
- 连接测试按钮
- 仓库列表页
- 卡片/列表视图切换
- 显示:仓库名、当前分支、ahead/behind、最后提交
- 快捷状态图标(clean / dirty / conflicting)
- 扫描新仓库功能
- 仓库详情页
- 左侧:文件树 / 文件列表
- 右侧:diff 视图
- Changes 视图(核心功能)
- 未暂存文件列表 + 变更类型标识(M/A/D/R/U)
- 已暂存文件列表
- 文件 diff 查看(side-by-side / unified 切换)
- 单文件 stage/unstage
- 全部 stage/unstage
- Commit 输入框(消息 + 描述)
- 最近 commit 消息快速选择
- History 视图
- 提交历史列表(虚拟滚动,支持大量 commit)
- commit 详情面板
- 分支过滤
- 搜索(作者/消息/SHA)
- diff 查看(commit 间对比、与 HEAD 对比)
- Branch 视图
- 分支列表(local / remote / tags)
- 当前分支高亮
- 创建/切换/删除分支
- 合并/变基操作
- ahead/behind 统计
- Stash 视图
- Stash 列表
- apply / pop / drop 操作
- stash 内容查看
- Remote 视图
- 远程仓库列表
- push / pull / fetch 操作
- force push(需二次确认)
- 冲突提示与解决引导
- 集成
react-diff-viewer或diff2html- unified / split view 切换
- 语法高亮(monaco-editor 或 highlight.js)
- 行号显示
- 文件头部信息(变更统计 +X -Y)
- 文件过滤(只看某类变更)
- 凭据加密存储(使用
crypto模块 AES-256 加密) - SSH 密钥安全处理(不落盘,内存中使用)
- 连接超时与自动重连
- 操作审计日志
- 危险操作确认(force push、hard reset 等)
- 大仓库性能优化(diff 分页、log 懒加载)
- Windows 端轻量 Agent 服务
- 基于 NestJS 的独立微服务
- 自启动注册(Windows Service 或 PM2)
- 文件系统监听(chokidar → WebSocket 推送)
- 仓库索引缓存
- Mac 端自动发现 Agent(UDP 广播或手动配置)
- 连接模式切换(SSH 直连 / Agent 模式)
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端框架 | React 18 + TypeScript | Vite 构建 |
| UI 组件 | Ant Design 5 | 表格/树/表单等企业级组件 |
| 状态管理 | Zustand | 轻量,适合中小项目 |
| 数据请求 | React Query + axios | 缓存与自动刷新 |
| 实时通信 | Socket.IO | 命令输出流式推送 |
| Diff 渲染 | react-diff-viewer-continued | 支持 unified/split |
| 语法高亮 | Prism.js / highlight.js | diff 代码高亮 |
| 后端框架 | NestJS | 模块化架构 |
| SSH 客户端 | ssh2 | 纯 JS 实现,无需本地 SSH |
| 数据存储 | SQLite (better-sqlite3) | 轻量,本地配置/凭据存储 |
| 加密 | Node.js crypto | AES-256-GCM 凭据加密 |
| 进程管理 | PM2(可选) | Agent 模式守护进程 |
{
"dependencies": {
"ssh2": "^1.15.0",
"@nestjs/core": "^10.x",
"@nestjs/websockets": "^10.x",
"@nestjs/platform-socket.io": "^10.x",
"better-sqlite3": "^11.x",
"socket.io-client": "^4.x",
"react": "^18.x",
"antd": "^5.x",
"zustand": "^4.x",
"@tanstack/react-query": "^5.x",
"react-diff-viewer-continued": "^4.x",
"diff2html": "^3.x",
"axios": "^1.x",
"react-router-dom": "^6.x"
}
}Phase 0 (项目初始化)
↓
Phase 1 (SSH 连接层) ← 核心基础设施
↓
Phase 2.1 + 2.2 (连接 + 仓库管理) ← 最小可用后端
↓
Phase 3.1 + 3.2 + 3.3 (前端基础 + 连接 + 仓库列表) ← 最小可用前端
↓
Phase 2.3 (Git 操作 API) + 3.4 (Changes 视图) ← MVP 核心功能
↓
Phase 2.5 + 3.5 (WebSocket + Diff) ← 体验增强
↓
Phase 2.4 + 3.4 其余 (文件浏览 + History/Branch/Stash) ← 功能完善
↓
Phase 4 (安全增强) ← 生产就绪
↓
Phase 5 (Agent 模式) ← 可选,按需开发
首个可用版本应实现:
- 添加 SSH 连接到远程 Windows
- 扫描并选择 Git 仓库
- 查看 status / stage / commit / push / pull
- 查看基本 diff