New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

dsh-ezcommit-plugin

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

dsh-ezcommit-plugin

DSH「一键 Commit」动态插件:由当前会话模型按业务颗粒度拆分 git 改动并分批提交

Source
npmnpm
Version
0.0.2
Version published
Weekly downloads
10
-33.33%
Maintainers
1
Weekly downloads
 
Created
Source

DSH-EZ Commit Plugin

DSH(DeepSeek Harness)「一键 Commit」动态插件:在会话标题栏提供 一键 Commit 按钮,由当前会话模型按业务颗粒度把工作区 git 改动拆分为多个提交(Conventional Commits),经用户审查后分批执行;当模型判定改动为「环境噪音」时只提示、不执行任何 git 写操作。

License: MIT Node.js Version Release

English | 简体中文

目录

简介

DSH-EZ Commit 是一个 DSH 动态插件:

  • 一个 Plugin,双平面(Host + Client),符合 DSH 动态插件模型:Client 负责 UI(按钮 + 弹窗),Host 负责 git 采集、模型裁决与分批提交。
  • 标准安装:dsh plugin --profile <name> add dsh-ezcommit-plugin 即可安装/升级(dsh.bundle 规范,见 docs/INSTALL.md);启动时静态锚点行打印安装公告、agent preset 诊断(cordis 工具链前置条件)与自检结果。
  • 零运行时依赖:src/host.js 与 src/client.js 即 cordis_define 的 code.host / code.client「函数体」,可直接求值;仓库内源码与线上运行的 Package 保持逐字节一致。
  • 模型优先:拆分与噪音裁决完全由当前会话模型完成,插件本身不做任何猜测性的 git 写操作。

特性

#需求实现
1非 git 仓库 → 按钮置灰Host shell 执行 git rev-parse --is-inside-work-tree
2按钮左侧展示分支名git symbolic-ref --short HEAD(detached 退化为短 hash)
3点击弹二次确认框Client shell.overlay 插槽自绘 modal
4模型按业务颗粒度拆分 commitHost llm.stream() 分析改动事实,输出 JSON 计划
5无改动 → 置灰git status --porcelain 计数为 0 时禁用
6模型判定「环境噪音」→ 提示不 commit裁决 verdict: "noise",Host 零 git 写操作

快速开始

安装与加载

安装用 DSH 官方 CLI 完成分发与版本管理(完整规范见 docs/INSTALL.md,English):

# 从 npm 安装(发布后)——登记为 profile bundle 层,由 pnpm 管理版本
dsh plugin --profile web add dsh-ezcommit-plugin

# 或从 git 仓库 / 本地 checkout 安装
dsh plugin --profile web add git+https://github.com/PenguinAndy/dsh-ezcommit-plugin.git
dsh plugin --profile web add link:/path/to/dsh-ezcommit-plugin

安装后界面不会自动出现按钮,这是符合设计的(安装 ≠ 激活)。本插件是动态会话插件:安装只完成分发与版本管理,启动日志可见公告、agent preset 诊断与自检;功能在会话内通过 Cordis 工具链加载(过程内生效,不写任何仓库文件)。

前置条件:目标会话必须运行 cordis agent preset(创造模式) —— cordis_define / cordis_run 工具链只挂在该 preset 上,standard(标准模式)等其它 preset 没有 tool-cordis。仅空白会话可切换 preset。

加载(推荐用本包生成的粘贴式载荷):

  • 在安装包目录生成 cordis_define 载荷:node scripts/print-define-payload.mjs(--json 可重定向为文件)。
  • 把载荷交给「创造模式」会话中的 agent,调用 cordis_define(plugin.kind='new'、idPrefix='gcmt',code.host / code.client 已内置为安装包 src/host.js / src/client.js 原文)。
  • 用返回的 pluginId / packageId 调用 cordis_run:首次运行 Client 半会触发一次授权提示(单勾 = 授权当前 Package,双勾 = 授权后续版本),属正常流程。
  • 会话标题栏出现 [分支名] [一键 Commit],工作区非 git 仓库或无改动时按钮置灰。

使用流程

  • 点击「一键 Commit」→ 确认框展示分支与改动计数(二次确认)。
  • 「开始分析」→ Host 采集 status / diff / 未跟踪采样(敏感路径自动过滤,不采样、不进入提示词),调用当前会话已路由的模型裁决:
    • noise → 黄色提示框展示原因,不执行任何 git 写操作;
    • commit → 计划审查框展示拆分批次(顺序、message、文件清单)、被过滤的敏感文件与未覆盖文件告警。
  • 「执行 N 批提交」→ 逐批 git add --pathspec-from-file=- --(文件清单经 stdin,天然规避空格/特殊字符路径)+ git commit -m title [-m body],返回每批短 hash。
  • 完成后按钮立即刷新置灰;任一批失败即停止(不回滚),已成功批次照常报告。

工作原理

一个 Plugin,双平面(Host + Client),通过包私有 RPC 通信。一次完整操作的时序如下:

sequenceDiagram
    participant C as Client(浏览器)
    participant H as Host(Node 进程)
    participant M as 当前会话模型

    Note over C: timer:每 5s 轮询
    C->>H: git.state(sessionId)
    H-->>C: { inRepo, branch, hasChanges, changedCount }
    Note over C: 非 git 仓库 / 无改动 → 按钮置灰

    C->>C: 点击「一键 Commit」→ 二次确认框
    C->>H: commit.analyze(sessionId)
    H->>H: 采集 status / diff / 未跟踪采样<br/>截断上限 + 敏感路径过滤
    H->>M: llm.stream(改动事实 + 系统提示词)
    M-->>H: JSON 计划 { verdict, commits }
    alt verdict = "noise"
        H-->>C: 环境噪音 → 提示弹窗(零 git 写操作)
    else verdict = "commit"
        H-->>C: 拆分批次 + 文件清单(用户审查)
        C->>H: commit.execute(sessionId, commits)
        H->>H: 逐批 git add + git commit<br/>任一批失败即停止(不回滚)
        H-->>C: { results: [{ title, hash }], leftoverCount }
    end

API 契约

RPC 一览

Host 半对外提供三个包私有 RPC(harness.handle / host.call,参数与返回值仅无损 JSON):

方法入参出参要点
git.state{sessionId}{ok, inRepo, branch, hasChanges, changedCount, untrackedCount}
commit.analyze{sessionId}{ok, verdict:'noise'|'commit', reason, commits:[{title,body,files}], unplanned, problems, sensitive:[path], diffTruncated, target}
commit.execute{sessionId, commits}{ok, results:[{title,hash}], leftoverCount}

失败统一返回 {ok:false, error:{message, code}}。

模型输出契约

系统提示词要求模型仅输出如下 JSON(响应解析时自动剥离 markdown 代码围栏,解析失败自动重试一次):

{
  "verdict": "noise",
  "reason": "一句话说明(noise 时必填)",
  "commits": [
    { "title": "feat(scope): ...", "body": "可选多行说明", "files": ["相对路径..."] }
  ]
}
  • files 必须逐字取自改动清单;不存在/重复的文件归入 unplanned 并在 UI 告警。
  • 模型目标解析顺序:会话已路由配置(session.requestHeader().config)→ agent.options → 默认模型(agentDefaultModel.currentSelection())。

安全与隐私

  • 噪音裁决在 git add/commit 之前完成,noise 路径零 git 写操作。
  • 敏感路径过滤:.env*、.npmrc、.pypirc、.netrc、.git-credentials、*.pem、*.key、id_rsa*、.ssh/、.aws/、.kube/、credentials*.json 等文件的路径与内容不会发送给模型,也不会进入计划或被执行提交;计划/噪音弹窗会列出被过滤文件(仅本地展示)。
  • 隐私边界:点击「开始分析」后,工作区 status、diff 与未跟踪文本采样(每文件前 8KB、最多 32 个)会发送给当前会话模型服务商;敏感路径除外。请仅对允许发送给模型服务商的工作区使用。
  • commit.execute 执行前用当前 porcelain 重建已知文件集合,陈旧/发明路径一律无效。
  • 不 git push、不 --force、不修改历史;多批次中某批失败 → 停止、不回滚、如实报告。
  • 同一 sessionId 的 analyze/execute 有进程内 in-flight 锁,重复点击直接拒绝。
  • 所有副作用(RPC 注册、插槽、轮询、样式)均挂在本 Package 生命周期上,stop / update / undefine 时自动清理。

开发

目录结构

.
├── .github/workflows/
│   └── release.yml               发布工作流
├── docs/
│   ├── README.en.md              英文版 README
│   ├── INSTALL.md                插件安装规范(中文)
│   ├── INSTALL.en.md             插件安装规范(English)
│   ├── dsh-ez-commit-design.md  设计文档(需求→契约映射、决策点、风险)
│   └── VERIFICATION.md          真机验证走查(六条需求)
├── src/
│   ├── host.js                   Host 半:3 个 RPC + git/模型逻辑(函数体)
│   ├── client.js                 Client 半:按钮 + 弹窗 + 样式(函数体)
│   └── index.js                  静态 bundle 入口:安装公告 + 启动自检
├── scripts/
│   ├── verify.mjs                离线冒烟校验(不依赖 DSH 运行时)
│   ├── print-define-payload.mjs  生成可粘贴的 cordis_define 载荷(host/client 原文内置)
│   └── stage-fixture.mjs         场景制备:demo | noise | clean
├── cordis.patch.yml              profile bundle 层补丁(ezcommit 安装锚点行)
├── package.json                  版本与 dsh.bundle 契约;零运行时依赖
├── pnpm-lock.yaml
└── LICENSE                       MIT

src/host.js 与 src/client.js 的内容即 cordis_define 的 code.host / code.client 「函数体」,可直接求值:new Function(body)() 得到 Plugin 对象。仓库内源码与 线上运行的 Package 保持逐字节一致。

本地验证

pnpm verify   # 或 npm run verify:离线求值 + 形状/注册冒烟校验

运行时验证:在 DSH 会话中 cordis_define + cordis_run 后,按 docs/VERIFICATION.md 的走查矩阵逐项验证六条需求(配 node scripts/stage-fixture.mjs demo|noise|clean 场景制备工具);模型裁决路径可用包含 .DS_Store、锁文件等「噪音」的工作区验证。

相关文档

贡献

欢迎 Issue 与 PR。提交 PR 时请:

  • 提交信息遵循 Conventional Commits 规范;
  • 修改 src/ 后运行 pnpm verify 确保离线冒烟校验通过;
  • 涉及行为变更时同步更新本 README 与 docs/ 文档。

许可证

MIT © PenguinAndy

Keywords

dsh

FAQs

Package last updated on 22 Aug 2026

Related posts