Skip to content

dsh-git

Verified

@mojiexuan/dsh-git Β· v0.2.1 Β· MIT Β· Web UI

Git source-control sidebar for the DeepSeek Harness web UI: repo init, staging, commit/push/pull, branch & remote management, AI-generated Conventional Commits messages, and a commit-history graph.

Install

dsh plugin add @mojiexuan/dsh-git

Confirm the layer applied with dsh --profile default --dump-config β€” see the install guide.

Source

Tags

Creators

Readme

@mojiexuan/dsh-git

A VS Code–like Git Source Control panel for the DeepSeek Harness web UI β€” repo init, per-file staging, commit/push/publish/pull, branch & remote management, AI commit messages, and a commit-history graph, all in the browser.

δΈ­ζ–‡ζ–‡ζ‘£οΌšdocs/README.zh.md

Features

  • Toggleable panel β€” an entry above Settings in the sidebar foot opens/closes the panel.
  • Repo detect & init β€” a non-repo workspace shows a one-click "Initialize Git repository" (git init -b main).
  • Per-file staging β€” collapsible "Staged changes" / "Changes" lists with per-file +/βˆ’, plus stage-all / unstage-all.
  • Git-semantic action button β€” "Commit" when there are uncommitted changes (auto-stages if nothing is staged), "Push" when the branch tracks a remote and is ahead, "Publish branch" when the branch has no upstream but has local commits.
  • Pull β€” one click to fetch the latest from all remotes and branches (git fetch --all --prune); shown only when a remote is configured.
  • Branch management β€” list / switch / create / delete (with confirmation).
  • Remote management β€” show / add / remove the origin remote (with confirmation).
  • AI commit messages β€” streaming, Conventional Commits, generated from the staged/working diff via the harness LLM (Chinese output by default).
  • Commit-history graph β€” a lazily-paged SVG lane graph of all branches + remotes (lane topology computed client-side, rounded bends, soft palette), expanded by default at the bottom of the panel to half the panel height, virtual-scrolls and loads the next page as you scroll, expands a commit inline to its changed files, and shows a hover popover with message / author / date / hash (full hash copyable).
  • Auto-refresh β€” polls git status every 2.5 s so edits, commits and pushes made outside the panel show up.
  • Self-update β€” on first open the panel silently checks the npm registry for a newer version; when one exists, an update badge appears on the sidebar entry and a one-click "update now" link shows in the panel header, followed by a restart prompt.
  • i18n β€” English and Chinese UI.
  • Cross-platform β€” Windows, macOS and Linux; git runs unconfined so native TLS and credential helpers work everywhere.

Screenshots

Source-control panel Commit history
Source-control panel Commit history

Install

dsh plugin --profile web add @mojiexuan/dsh-git

Then start dsh web.

Uninstall / Update

# Uninstall (same command for the published package and a local link)
dsh plugin --profile web remove @mojiexuan/dsh-git

# Update to the latest published version
dsh plugin --profile web update @mojiexuan/dsh-git

For a linked local checkout (dsh plugin --profile web add .), there is no separate update step β€” rebuild with npm run build, then fully restart dsh web (host bundle) and refresh the browser (client bundle).

Build from source

npm install
npm run build       # lib/index.js (host) + lib/client.js (client)
npm run typecheck

Configuration

Optional overrides in your profile cordis.patch.yml:

- id: git
  config:
    maxDiffChars: 4000     # cap on the diff text sent to the model (default 4000)
    maxLogEntries: 2000    # max commits per page for the history graph (default 2000; scroll to load more)
    provider: deepseek     # optional β€” pin the provider (defaults to the deployment model)
    model: deepseek-chat   # optional β€” pin the model
    reasoningEffort: off   # 'off' (default) disables thinking; 'high'/'max'/'default' passthrough
    registryUrl: https://registry.npmjs.org  # optional β€” npm registry base for update checks (default npmjs.org)

Structure

src/
β”œβ”€β”€ shared/rpc.ts             # endpoint names + DTOs, shared by both halves
β”œβ”€β”€ host/                     # Node half
β”‚   β”œβ”€β”€ index.ts              # git/* RPC endpoints (loopback-only)
β”‚   β”œβ”€β”€ git.ts                # ctx.shell wrapper; paths/messages via stdin (no shell injection)
β”‚   β”œβ”€β”€ commit-message.ts     # diff truncation + ctx.llm.stream generation
β”‚   └── update.ts             # self-update: npm version check + dsh plugin update runner
└── client/                   # browser half
    β”œβ”€β”€ index.tsx             # slot registration + RPC + locale dictionary
    β”œβ”€β”€ GitPanel.tsx          # source-control panel UI
    β”œβ”€β”€ CommitGraph.tsx       # commit-history graph (paged, virtualized)
    β”œβ”€β”€ graph.ts              # client-side lane/topology calculator
    β”œβ”€β”€ BranchMenu.tsx        # branch dropdown
    β”œβ”€β”€ GitToggleButton.tsx   # sidebar-foot toggle
    β”œβ”€β”€ rpc.ts                # typed RPC wrapper
    β”œβ”€β”€ locale.ts             # zh/en dictionaries
    β”œβ”€β”€ fileIcons.tsx         # file-type icons
    β”œβ”€β”€ icons.tsx             # icon set
    └── styles.ts             # panel stylesheet

Security

  • All git/* endpoints are registered with authority: 'loopback' (127.0.0.1 only).
  • User data is never interpolated into command strings β€” messages go via git commit -F -, paths via --pathspec-from-file=-, and branch/remote names and URLs are validated against safe character classes.

Publish

npm publish

Tag the GitHub repo with dsh-plugin.

License

MIT