# dsh-git

[English](README.md) | 中文

适用于 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 界面的 Git 状态、提交与推送插件。它在侧边栏底部为当前会话的项目目录增加一个动作入口，面板会显示分支、上游、改动文件与行数汇总，并提供 **提交**、**提交并推送** 和 **推送** 操作。

## 功能

- **跟随当前会话** — Git 状态和所有写操作都使用 Web 界面当前会话的项目目录。
- **工作区详情** — 显示插件只读状态路由返回的分支、上游、领先/落后计数、改动文件和增删行数。
- **提交与推送** — 请求当前会话 agent 使用输入的信息提交、提交后推送，或单独推送已有本地提交。
- **AI 生成提交信息** — 提交信息为空时按下 **提交**，会请求当前会话的 agent 暂存并提交工作区，由 agent 生成简洁的提交信息。
- **安全刷新** — 刷新时保留上一次成功状态；当前项目改变后会丢弃已过期的在途读取结果。

## 安装

> 插件面向 DeepSeek Harness **Web** 界面（`dsh web`）。Node 半份挂载只读状态路由，且只接受当前存活会话已持有的目录；Git 写操作遵循当前会话 agent 的标准工具与权限流程。

通过 `dsh plugin` 安装到 profile：

```bash
dsh plugin --profile web add @necokeine/dsh-git
```

重启 `dsh web` 并刷新页面。包内 bundle patch 会禁用内置 `ui-git` 行，再用独立的 Loader 条目挂载本包，因此只会运行一个 Git 底部动作。

卸载命令：

```bash
dsh plugin --profile web remove @necokeine/dsh-git
```

也支持其他安装形式：

- **本地检出** — `dsh plugin --profile web add ./path/to/dsh-git` 或 `link:./path/to/dsh-git`。
- **Tarball** — 运行 `pnpm pack` 后安装生成的 `.tgz`；包内包含预构建的 `lib/` 产物。
- **Git** — `dsh plugin --profile web add github:necokeine/dsh-git#<sha>`；从源码安装时，需要在 profile 的 pnpm 构建策略中允许执行本包的构建脚本。

## 开发

```bash
pnpm install
pnpm test
pnpm typecheck
pnpm build
pnpm lint
pnpm pack
```

Node 入口挂载 `/dsh-git/status`，校验 JSON 请求，并在运行只读 Git 命令前拒绝任何不属于存活会话的目录。浏览器入口注册 `sidebar.footer.action` 组件与本地化词典，创建 `GitController`，通过该路由获取状态，并把提交/推送请求交给当前会话 agent。独立浏览器测试使用小型本地 store 与图标 stub。`tests/apply.harness.spec.ts` 保留在 Harness 检出中使用真实 SlotRegistry 与 locale 插件的集成覆盖，并由独立 Vitest 配置排除。

### 项目结构

```text
src/
  index.ts                   # 仅限存活会话目录的只读 Git 状态路由
  invariant.ts               # 包 invariant companion
  client/
    index.ts                 # 浏览器注册与 Git 写操作委托
    git-api.ts               # 面向浏览器的插件状态传输
    git-controller.ts        # 状态与面板状态
    GitAction.tsx            # 底部触发器与面板
    git-action.module.css
    locales.ts               # 中英文词典
tests/                       # controller、组件与注册测试
cordis.patch.yml             # 禁用内置 ui-git 行并挂载本包
tsdown.config.ts             # 独立 Node 与浏览器 bundle 构建
```

## 模型体验

底部动作不贡献提示词段或工具 schema。提交、提交并推送与推送操作会通过当前会话的提示管道发送一条普通用户消息，该消息由标准用户消息日志记录。

## 已知限制

- 没有项目目录的会话不显示 Git 状态。
- 提交与推送由当前会话 agent 执行，遵循该会话的标准工具权限和认证环境。
- 二进制文件和未跟踪文件不计入行数汇总。
- 没有上游的分支没有领先计数，因此配置上游前，独立 **推送** 操作保持禁用。

## 许可证

MIT
