# GitMate **[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 右侧栏里的 Git 面板 —— 同一套能力也注册成十五个 Agent 工具。** macOS、Linux、Windows(PowerShell)都能跑。 跨平台这件事上真正会出问题的只有两处,都在 Host 侧:**命令怎么引号**(PowerShell 里单引号靠翻倍转义,POSIX 是闭合-转义-重开;按 `process.platform` 选择)和**环境变量怎么传**(走 shell 请求的 `env` 字段,而不是 POSIX 的 `VAR=value` 前缀——Windows 上那不是命令)。除此之外只用 `node:path`,不写 `lib/` 之外的东西,也不写任何需要执行位的文件。沙箱起不来时的提示会**按平台给对应的建议**(Linux 是 bubblewrap/Landlock,macOS 是 sandbox-exec,Windows 是 `%TEMP%`)。 [English](README.md) | 中文 看改动、读差异、暂存、用生成的说明提交、合并、贮藏、同步、回滚历史——都不用离开面板。每个操作同样是 Agent 能调用的工具,所以在对话里说一句也能做。 ```sh dsh plugin --profile web add github:alanhaskey/dsh-gitmate ``` 装好后重启一次 DSH,刷新页面,右侧栏「+」里就会出现 **GitMate**。 > 内部标识(Loader 行 id `dsh-git`、标签页 key)和包名不同名是有意的:行 id 是你已有配置行的键,改它会让已保存的设置失配。 ## 看改动与提交 - **四组**:冲突 / 已暂存 / 改动 / 未跟踪。每行是「**改动类型用文字**(修改 / 删除 / 新增)+ 路径 + 该文件 `+N −M`」,行内可暂存、取消暂存、丢弃,任何破坏性操作都要二次确认。 - **按编辑器的方式看差异**:左右两个行号栏、`+`/`−` 标记、整行淡色底,被替换的行只给**真正变化的那一段**加深底色。点文件就地展开,再点收拢;hunk 上下文可以从 3 行展开到 24 行。 - **列表级操作只有一行**,而且按需出现,按钮里带着各自的数量。 - **修订上次提交**:把暂存的改动折进上一个提交;说明框留空就保留原说明。 - 列表与提交区之间是**可拖动的分割线**,拖动改变说明框高度。 - **正在忙的时候面板会说话**:每个操作都显示一个转圈提示并写明在做什么(「正在提交…」「正在审阅暂存的改动…」),而不是只把按钮变灰。提示和消息一样固定在**列表区底部、分割线上方**,不会盖住提交区。 ## AI 功能 | 功能 | 做什么 | | --- | --- | | **生成提交说明** | 从暂存差异生成。**你写了几句就变成「补充优化」**——模型拿到你的原文,保留你的意图和细节、把缺的补上,而不是另写一条。 | | **提交前审阅** | 读一遍暂存的改动,只报告真会出问题的地方——算错的结果、漏掉的边界、没处理的错误、被提交的密钥、留下的调试输出、没有测试的行为改动。点一条跳到那个文件的差异。 | | **拆分提交** | 按意图把暂存改动分成能独立成立的提交,每组给一条说明。**方案是草稿,随你改**:改任意一组的说明、把某组并入上一组、删掉某组、让模型重新规划、一次提交一组,或按顺序全部提交。每次提交后其余文件仍保持暂存。 | | **解释改动** | 用 2–5 条要点说清一个文件改了什么,不必逐行读。 | | **`.gitignore`** | 从项目的清单文件和目录结构推断规则。一个按钮创建,一个按钮补齐缺的**并整理整个文件**:去掉重复条目、去掉已被更宽的规则覆盖的条目(`node_modules/` 之后的 `node_modules/.cache/`)、合并空行;只有在**不会改变含义**时才按分组归类——文件里有 `!` 规则(git 按最后一条匹配决定,重排会改变结果)或你自己的注释时,顺序原样保留,并会说明这一点。 | 调用模型的按钮都标了 **AI**。生成一律用当前会话的默认模型,没有第二个模型要配。 ## 分支、历史、远程 - **分支选择**:切换、新建、删除,以及把任意分支合并进当前分支。冲突会列出需要你决定的文件,可以中止。 - **提交图**:`git log --all`,**所有分支和远程跟踪分支都在图上**,不是一根线。展开一个提交看完整信息、改了哪些文件,以及能对它做什么——回滚 / 还原 / 遴选 / 变基 / 打标签。**点文件看它在这次提交里的差异**。 - **远程**:推送 / 拉取 / 获取,以及一键**同步**(fetch → 快进 → push)。分支分叉时它会拒绝合并,而不是替你造一个合并提交。 - **贮藏**:把改动收起来,之后取回(pop / apply / drop)。 ## 初始化 不是仓库时,**历史(分支图表)按钮不可点**——没有仓库就没有历史可看;**设置仍然可以进入**——面板不按预期工作时,人第一个想去的就是设置。如果面板开着的时候仓库消失了(切换了文件夹、`.git` 被删掉),视图会退回改动列表,而不是让按钮亮着一个显示不出来的页面。 一键初始化仓库并写入本机提交身份;`.gitignore` 两个按钮。**不需要你从一串技术栈里选**——插件自己读项目再决定。 ## 配置 设置存在插件自己的 `cordis.patch.yml` 行里,升级后仍在,也能在插件页看到。下面每一项都是按钮或勾选框,除非你要写自定义指令,否则不用打字。 | 键 | 默认 | 含义 | | --- | --- | --- | | `messageLanguage` | `auto` | 生成文本的语言:`auto`(跟随仓库)/ `en` / `zh`。未设置或 `auto` 时,面板自己的消息读作中文。 | | `messageStyle` | `conventional` | `conventional`(`feat: …`)或 `plain`。 | | `messageTemplate` | — | 追加在最后的额外指令,因此会覆盖默认规则。 | | `signoff` | `false` | 追加 `Signed-off-by`。 | | `defaultBranch` | `main` | 「初始化」创建的分支名。 | | `maxPromptBytes` | `24000` | 每次交给模型的差异文本上限。 | | `maxDiffBytes` | `80000` | 工具返回的补丁文本上限,超出截断。 | | `commandTimeoutMs` | `60000` | 单条 git 命令超时;网络命令是它的四倍。 | ## 安全边界 - **破坏性操作都不是一键完成**:丢弃、删分支、丢贮藏、变基、回滚,都先问一次,并说明会失去什么。 - **回滚和还原是两件事**,因为本来就不同:回滚移动分支指针、改写历史;还原追加一个反向提交,对已推送的内容安全。回滚会改写已推送历史时,面板会先警告。 - **「撤销这个提交」和「回滚到此处」也是两件事**:点最新提交上的按钮是**撤销它**,它的改动按你选的方式保留或丢弃;点更早的提交才是把分支指针移回去。提示里报的是**实际被撤销的那个提交**,并且永远说明丢弃了几个——包括"一个都没丢"。 - **被权限模式拦下时会说是哪个模式**:只读模式写不了 `.git`,所以提交、切换分支这类操作会被拒——提示会写明当前模式并说明切到哪个模式;如果已经是 `danger-full-access` 仍被拒,那是这台机器的沙箱后端在拒绝写入,需要重启 DSH。区分这两件事,才知道该改设置还是该重启。 - **git 的诊断固定用英文**:`LC_ALL=C`。插件自己的文案照旧按设置本地化,但 git 的输出需要保持稳定——`lib/text.js` 的短语表是按英文句子匹配的,而本地化的 git 会让它失效;Windows 上更糟,git 按控制台代码页输出、管道按 UTF-8 解码,中文会变成乱码。 - **面板也跟随它所属会话的权限模式**:面板的每个请求都绑定着一个会话(它就是这个会话的标签页),所以 git 以该会话的权限执行,而不是部署默认值。这条很重要——如果一台机器上的默认模式(`workspace-write`)跑不起来,面板会完全无法执行 git,而用户在自己的会话里怎么设都没用。 - **每个工具调用跟随调用方会话的权限模式**:git 以该会话自己的 sandbox policy 执行,而部署默认值只作为兜底。面板那条路径没有会话,因此完全不插手策略,交给 Host 决定。 - **git 完全跑不起来时不再每 5 秒重试**:`unavailable` 不是暂时性失败——每次探测都会重走一遍沙箱启动,而在 Windows 上失败的那次已知会让**整次运行**失去写权限。面板说明一次并给出「重试」按钮,而不是反复触发。 - **「无法运行 git」和「这里还不是仓库」是两种失败**,面板分开说:前者给原因和重试,不会让你去 `git init` 一个其实存在、只是读不到的仓库。沙箱起不来这类环境问题会有一条中文说明,并附上原始原因。 - **模型的输出当作不可信输入**:审阅里指向未暂存文件的条目会被丢弃;拆分方案没覆盖全部暂存文件会被标记;解析不出来的回答原样附上,而不是显示成"没有发现问题"。 - **不会自动提交、自动推送、自动修复**。AI 功能产出的是给你做判断的材料,不是替你做的决定。 ## 开发 ```sh node test/smoke.mjs # 604 项断言,跑真实 git,不需要 DSH ``` ``` lib/plugin.js 入口;实现在文件变化时重新加载 lib/impl.js 操作 + 十五个 Agent 工具 lib/git-core.js git 操作、补丁解析、提交图泳道 lib/messages.js 文本生成的提示词与模型调用 lib/review.js 提交前审阅与拆分提交 lib/text.js 面板消息的中英文本 lib/rpc.js 面板的 HTTP 路由 lib/client.js 浏览器一半(无构建步骤、无依赖) ``` 整个包**没有任何依赖**——不用装东西,也不会在 profile 里复制一份。`lib/client.js` 是手写的,改它只需要刷新页面;改 Host 那一半需要重载 bundle。 ## 许可 [MIT](LICENSE)