🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

源代码管理 xzy-nine/dsh-source-control

DeepSeek Harness
xzy-nine21 天前有提交已提供中文文档扫描:含敏感能力

在侧边栏查看仓库变更、提交图并完成提交

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/14 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xzy-nine/dsh-source-control
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 21 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 45 处,展示前 43 条)
  • 读取本地文件
    scripts/install-hooks.mjs:21
    if (!existsSync(hooksDir)) {
  • 执行外部命令固定命令
    scripts/install-hooks.mjs:27
    execFileSync('git', ['rev-parse', '--git-dir'], { cwd: root, stdio: 'ignore' })
  • 执行外部命令固定命令
    scripts/install-hooks.mjs:35
    return execFileSync('git', ['config', '--get', 'core.hooksPath'], { cwd: root, encoding: 'utf8' }).trim()
  • 执行外部命令固定命令
    scripts/install-hooks.mjs:52
    execFileSync('git', ['config', 'core.hooksPath', '.githooks'], { cwd: root, stdio: 'inherit' })
  • 读取本地文件
    scripts/agent-note-tree.ts:45
    for (const entry of readdirSync(agentNoteRoot, { withFileTypes: true })) {
  • 读取本地文件
    scripts/bench-discovery.mjs:13
    if (!existsSync(modulePath)) {
  • 读取本地文件
    scripts/bench-enrich.mjs:16
    if (!existsSync(modulePath)) { console.error('先 pnpm build:host'); process.exit(1); }
  • 读取本地文件
    scripts/bench-first-paint.mjs:17
    if (!existsSync(routesPath) || !existsSync(discoveryPath)) {
  • 读取本地文件
    scripts/bench-git-info.mjs:21
    if (!existsSync(routesPath)) {
  • 删除本地文件递归
    scripts/bench-git-info.mjs:147
    process.on('exit', () => rmSync(syncRoot, { recursive: true, force: true }));
  • 读取本地文件
    scripts/bench-refresh.mjs:13
    if (!existsSync(routesPath)) {
  • 读取本地文件
    scripts/bench-verify.mjs:15
    if (!existsSync(routesPath)) {
  • 执行外部命令固定命令
    scripts/bench-verify.mjs:137
    const baseline = execFileSync('git', ['log', '--topo-order', '--max-count=200', '--format=%H', '--branches', '--tags', '--remotes', 'HEAD', '--'], { c
  • 写入本地文件
    scripts/check-duplication.mjs:102
    writeFileSync(baselinePath, `${JSON.stringify({
  • 读取本地文件
    scripts/check-duplication.mjs:113
    if (!existsSync(baselinePath)) {
  • 读取本地文件
    scripts/check-duplication.mjs:118
    const baseline = JSON.parse(readFileSync(baselinePath, 'utf8'));
  • 读取本地文件
    scripts/repo-files.ts:200
    target = statSync(childAbs)
  • 读取本地文件
    scripts/repo-files.ts:242
    entries = readdirSync(dirAbs, { withFileTypes: true })
  • 读取本地文件
    scripts/repo-files.ts:283
    const source = readFileSync(absPath, 'utf8')
  • 读取本地文件
    scripts/verify-agent-note-classification.ts:16
    if (existsSync(resolve(repoRoot, legacyRoot))) {
  • 读取本地文件
    scripts/verify-agent-note-format.ts:45
    const lines = splitLines(readFileSync(resolve(agentNoteRoot, note.rel), 'utf8'))
  • 执行外部命令来自配置/变量
    scripts/verify-all.ts:55
    const child = spawn(process.execPath, [
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:39
    if (!existsSync(resolve(archiveRoot, 'AGENTS.md'))) errors.push(`${archiveRel}/AGENTS.md is required`)
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:41
    for (const entry of readdirSync(archiveRoot, { withFileTypes: true })) {
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:55
    for (const child of readdirSync(resolve(archiveRoot, entry.name), { withFileTypes: true })) {
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:63
    artifacts.set(rel, readFileSync(resolve(archiveRoot, rel)))
  • 执行外部命令固定命令
    scripts/verify-archived-agent-notes.ts:72
    const result = spawnSync('git', gitArgs, { cwd: projectRoot, encoding: 'utf8' })
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:86
    if (existsSync(manifestPath)) {
  • 读取本地文件
    scripts/verify-archived-agent-notes.ts:88
    manifest = parseArchiveManifest(readFileSync(manifestPath, 'utf8'))
  • 写入本地文件
    scripts/verify-archived-agent-notes.ts:121
    writeFileSync(manifestPath, rendered)
  • 读取本地文件
    scripts/verify-doc-budgets.ts:54
    const manifest = JSON.parse(readFileSync(MANIFEST_PATH, 'utf8')) as Record<string, number>
  • 读取本地文件
    scripts/verify-doc-budgets.ts:77
    if (!existsSync(abs)) {
  • 读取本地文件
    scripts/verify-doc-budgets.ts:82
    const words = countWords(readFileSync(abs, 'utf8'))
  • 读取本地文件
    scripts/verify-md-links.ts:170
    entries = readdirSync(current === '' ? '.' : current)
  • 读取本地文件
    scripts/verify-md-links.ts:204
    const document = markdownLinkDocument(readFileSync(absPath, 'utf8'))
  • 读取本地文件
    scripts/verify-md-links.ts:211
    const exists = existsSync(absPath)
  • 读取本地文件
    scripts/verify-md-wrap.ts:40
    const source = readFileSync(absPath, 'utf8')
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:35
    if (!existsSync(skillsRoot)) return []
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:36
    return readdirSync(skillsRoot, { withFileTypes: true })
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:37
    .filter(entry => entry.isDirectory() && existsSync(resolve(skillsRoot, entry.name, 'agents/openai.yaml')))
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:54
    if (!existsSync(skillFile)) {
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:62
    frontmatter = parseSkillFrontmatter(readFileSync(skillFile, 'utf8'))
  • 读取本地文件
    scripts/verify-skill-invocation-metadata.ts:69
    const parsed = asRecord(load(readFileSync(openaiFile, 'utf8')))
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-primitives
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

dsh中的类vscode源代码管理页面

README

由 DeepSeek 最新模型翻译生成
dsh-source-control DSH 插件:在 DSH Web GUI 内置右侧 Sidebar 中以「源代码管理」页显示当前会话工作区的仓库、提交图、变更列表与提交框。界面控件取自 DSH 内置组件,因此外观与 Harness 本身一致。 仓库自动绑定当前会话工作区,无需手动选择。 功能 存储库 列出当前会话工作区内的仓库,并展开其工作树与子模块。按种类用不同图标区分,同一行显示所在分支与相对上游的领先 / 落后数量。右键菜单提供刷新、抓取、推送与复制路径;对工作树额外提供「移除工作树」。 更改 工作区变更列表,按「暂存的更改 / 更改」两个分组。 - 文件行显示文件类型图标、文件名与最右列的状态字符(与文件夹数量同列)。点击文件行即打开该文件;未跟踪的新文件按普通文件打开。 - 悬停出现丢弃与暂存(或取消暂存)按钮;右键菜单提供同样的动作、打开与复制路径。 - 文件树从最早分叉的公共目录开始显示:目录逐级只有单个子目录时合并为一行,不再从仓库根逐级展开。 - 提交框固定在顶部,只有变更列表滚动。分组头右键可全部暂存 / 取消暂存 / 丢弃。 提交框 - 提交信息支持 Enter 提交、Shift+Enter 换行、Esc 清空草稿。 - 「修补上一次提交」勾选后提交为 --amend。 - 提交按钮显示已暂存的文件数量。
展开完整文档(README 剩余 1 节)
dsh-source-control

DSH 插件:在 DSH Web GUI 内置右侧 Sidebar 中以「源代码管理」页显示当前会话工作区的仓库、提交图、变更列表与提交框。界面控件取自 DSH 内置组件,因此外观与 Harness 本身一致。
仓库自动绑定当前会话工作区,无需手动选择。

功能

存储库

列出当前会话工作区内的仓库,并展开其工作树与子模块。按种类用不同图标区分,同一行显示所在分支与相对上游的领先 / 落后数量。右键菜单提供刷新、抓取、推送与复制路径;对工作树额外提供「移除工作树」。

更改

工作区变更列表,按「暂存的更改 / 更改」两个分组。

- 文件行显示文件类型图标、文件名与最右列的状态字符(与文件夹数量同列)。点击文件行即打开该文件;未跟踪的新文件按普通文件打开。
- 悬停出现丢弃与暂存(或取消暂存)按钮;右键菜单提供同样的动作、打开与复制路径。
- 文件树从最早分叉的公共目录开始显示:目录逐级只有单个子目录时合并为一行,不再从仓库根逐级展开。
- 提交框固定在顶部,只有变更列表滚动。分组头右键可全部暂存 / 取消暂存 / 丢弃。

提交框

- 提交信息支持 Enter 提交、Shift+Enter 换行、Esc 清空草稿。
- 「修补上一次提交」勾选后提交为 --amend。
- 提交按钮显示已暂存的文件数量。
- 可由 AI 生成提交信息(见下)。

图形

提交泳道图,标题栏可点击收起。标题上方的分界线是拖拽手柄,向上拖让图形变高(120–720px,持久保存)。

- 每行为「泳道 + 提交信息(作者紧随其后,空间不足时省略号截断)+ 右对齐的引用标记」。
- 引用标记:当前分支与本地分支是「图标 + 名称」药丸,远端、标签、贮藏是圆形图标,名称见悬停提示与右键菜单。
远程 HEAD 不作为标记列出;被其它工作树检出的分支也不列出。
- 节点形状区分种类:当前分支为双同心圆、合并提交为环加内点、其余为实心点;线段停在节点外沿,不穿过节点。
- 未提交行以虚线表示且不画节点,也不触发浮窗与右键菜单。
- 分页加载时,父提交未加载仍占住泳道并把线画到行底,因此已加载部分的泳道与颜色不会因加载更多而改变。
- 滚动到接近底部时自动加载下一页,无需点击按钮;一页取回后若仍未填满图形区会继续取,直到无更多提交。
- 悬停某行浮出卡片:作者、时间、完整提交信息、改动文件与增减行数、引用标记、短哈希与复制按钮。
- 点击某提交在该行下方就地展开改动文件区,逐文件显示 +/− 与状态;点击文件行打开差异,再次点击同一行收起。

提交右键菜单

在 GitHub 上打开(仅有 GitHub 远端时出现)、签出到(二级菜单列出该提交上的分支,仅在分支头位置出现)、签出(已分离)、创建分支、删除分支、创建标签、删除标签、从此提交拣选、从此提交还原、重置当前分支到此处、合并到当前分支、变基当前分支到此处、复制哈希、复制提交信息、创建归档。

- 删除分支的二级菜单列出包含该提交的本地与远程分支——分支只由尖端提交标识,中间提交若只看尖端会无法删除所属分支。
- 删除标签在没有标签时不显示。
- 删除当前分支照常列出,点击后说明原因(而不是置灰)。
- 有二级菜单的项右侧带箭头标识。

差异页

在侧边栏中打开文件的差异视图,含行号列、hunk 头与代码高亮。

- 默认左右并排,可切换为统一视图。
- 默认自动换行,可切换为不换行。
- 只显示改动附近的行(按 git hunk),而不是整文件。

GitHub 集成

通过 gh CLI 完成,无需在插件内保存令牌(沿用 gh 自己的登录凭据)。

| 能力 | 入口 | 说明 |
| 创建 Pull Request | 提交右键菜单「创建 Pull Request…」(当前分支为分支尖端、且分支已推送到 GitHub 远程时出现) | 选择目标分支、填写标题与正文,可创建为草稿 |
| 发布到 GitHub | 无远程时的「发布」 | 新建仓库并推送:可选公开 / 私有,可选个人账号或其组织,可选 HTTPS / SSH 远程协议 |

权限不足时降级而非失败:未安装 gh、未登录、token 缺少所需 scope 时,GitHub 入口隐藏或提示所需 scope 与补授权命令,发布仍可改用手工输入远程地址完成。

SSH 远程地址

远程地址的协议在编辑表单内切换,两个方向都可换算:

- Remote Configuration 的地址输入接受 git@host:owner/repo.git 与 ssh:// 两种写法;下方的「协议」分段控件在 HTTPS 与 SSH 之间切换时就地改写输入框内容,推送 URL 同主机时一并改写。
- 改写只发生在表单里:点远程行的笔图标进入编辑,切换协议并保存后写入仓库配置。
- 发布对话框的 GitHub 页与手工页都可选协议:手工页按所选协议换算地址(HTTPS ⇄ SSH);GitHub 页让 gh repo create 以所选协议建立远程。

切到 SSH 前先检测本地 SSH 状态:ssh 客户端、~/.ssh 私钥,以及目标主机是否接受本机公钥(非交互、带连接超时)。
未就绪时说明原因且不改写配置;切回 HTTPS 不依赖本地 SSH。

状态与 GitHub 账号状态同样处理:由宿主按主机缓存,就绪结果缓存 5 分钟、未就绪结果 15 秒,期间的重复请求不再探测,界面上的多处校验共用同一份结果。分区内的「检测 SSH 状态」按钮忽略缓存,重新探测一次。

破坏性操作的确认

以下操作会先弹确认框,确认按钮为红色:丢弃改动、删除本地 / 远程分支、删除标签、丢弃贮藏、重置当前分支、移除工作树、删除远程仓库配置。合并与变基也走确认框。

放弃暂存不算破坏性操作,不加确认。丢弃未跟踪文件时按「删除」措辞——它们是被真正删除而非还原。

仓库配置

设置面板提供:

| 分区 | 内容 |
| General | 提交排序(拓扑 / 时间 / 作者时间)、日期格式、提交框与图形区的显示开关 |
| User Details | 用户身份(姓名与邮箱),可写入全局或当前仓库 |
| Remote Configuration | 远程仓库的增删改,以及 HTTPS / SSH 协议切换 |
| Issue Linking | Issue 链接规则 |
| Pull Request Creation | PR 创建相关配置 |
| 仓库配置 | 仓库级配置导出 |
| AI 提交信息 | 专用的供应商与模型,以及追加到系统提示词末尾的自定义规则 |

AI 提交信息

选择服务商与模型(未配置时回退到当前会话模型),可填写自定义规则;生成时把工作区差异交给所选模型,流式返回并填入提交框。

勾选「修补上一次提交」后,差异改为「上一次提交的改动 + 本次改动」,提示词同时说明这是修补提交。

打开入口

不依赖任何第三方侧栏插件,两个入口打开同一个页:

| 入口 | 行为 |
| 引导页入口胶囊 | 右侧栏 tab 条「+」打开引导页后,点「源代码管理」胶囊 |
| 会话 header 图标按钮 | 直接打开该页;已打开时聚焦 |

切到别的侧栏页或工作区再回来时,页面保持原状(不会重新加载,展开状态也不丢失)。

安装

dsh plugin --profile web add dsh-source-control
重启 dsh web,页面右侧栏「+」→ 引导页出现「源代码管理」,会话 header 亦有图标按钮

许可

本项目自身代码为 MIT,见 LICENSE。
预览分享卡片长什么样 ↓xzy-nine/dsh-source-control
分享 · DeepSeek Harness Hub
xzy-nine/dsh-source-control

在侧边栏查看仓库变更、提交图并完成提交

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部