dsh-commands
已验证@morehao/dsh-commands · v0.1.3 · MIT
把 ai-kit 的 git-kit Git 工作流以 dsh 原生斜杠命令接入(薄意图表,委托 git-kit skill 执行)
安装
dsh plugin add @morehao/dsh-commands 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
作者
说明文档
dsh-commands
一个可扩展的 dsh 原生斜杠命令集合包(npm 名 @morehao/dsh-commands,仓库目录仍为 commands-dsh/)。当前内置 git-kit 的 Git 工作流命令(与 opencode 入口、自然语言入口共用 git-kit 同一实现,单一真源);将来其它 skill 的命令只需往 lib/index.js 的 COMMANDS 表加条目即可。
提供的命令
| 命令 | 参数 | 委托的 git-kit 分支 |
|---|---|---|
/git-message |
<中文描述>(必填) |
commit-message |
/git-commit-push |
无 | commit-push |
/git-branch |
<中文描述>(必填) |
branch |
/git-pr-create |
[目标分支] |
pr-create |
/git-pr-merge |
[PR/MR 编号] |
pr-merge |
/git-tag |
[tag名或分支名] |
tag |
/git-slim |
[保留天数] |
slim |
/git-star-classify |
无 | star-classify |
原理(命令 = 意图表)
每条 dsh 命令注册到 ctx.commands(name/description/input.hint/recordInput/handler,即 CommandDefinition),出现在 dsh 斜杠菜单。COMMANDS 表是自包含的意图表:一行声明 = 注册元数据 + 对应的 git-kit 分支 key,不再读取任何仓库文件,逻辑与路由唯一真源在 skills/git-kit(SKILL.md 意图决策树 + references/ + scripts/)。
命令执行时 handler 校验必填输入,然后构造一条 user 消息经 invocation.agent.followup() 注入当前会话,由 agent 加载 git-kit 并落到对应分支执行——交互确认步骤与自然语言触发 git-kit 完全一致。
因为输入已逐字写进这条注入的 user 消息(会话日志的真实事件),全部命令统一注册 recordInput: false,避免 command/run 再记一份同样的 args(dsh 官方指引:命令自身的权威事件已承载 payload 时置 false)。这不影响聊天区的命令行显示——GenericCommandCard 只渲染命令名与结算文案,不渲染 args。
描述文本不做 i18n(有意为之):dsh 只本地化它自己的 6 条一方命令——客户端
HOST_DESCRIPTION_KEYS硬编码compact/export/feedback/goal/permission/plan,且要求description与英文原文逐字相等才翻译,其余一律原样透传;第三方也无法用同名客户端CommandContribution覆盖(同名会在候选合成时collides with a host command直接抛错),CommandDecoration又没有 description 字段。Host 侧同样拿不到语言偏好(SettingsProvider只提供register(),namespacelocale已被 locale 插件独占、重复注册会抛错;且locale.preference缺省时本就交给浏览器navigator.language决定)。因此本插件 8 条描述直接写中文:中文界面下与一方命令表现一致。若将来 dsh 开放第三方描述 i18n 钩子,再改为按键取值。
- 编辑
skills/git-kit/的内容无需重启,下次执行即生效。 - 修改本插件的
lib/index.js(含COMMANDS表)需重启 dsh web 生效。但只有以link:方式接入时改源码才生效:若 profile 里装的是 npm 版(dsh plugin --profile web add @morehao/dsh-commands),profile 下的node_modules是一份拷贝,改仓库源码不会生效,需先升版本发版再重装。
安装
本插件已发布到 npm(@morehao/dsh-commands),可通过 dsh 一条命令安装:
# 从 npm 安装已发布版本(git-kit skill 仍需由 ai-kit 提供,见下方说明)
dsh plugin --profile web add @morehao/dsh-commands
# 重启 dsh web
skill 依赖:插件只声明「命令 → git-kit 分支」意图表,真正的执行授权给
git-kitskill。而 dsh 不从 node_modules 扫描 skill,所以仍需把skills/git-kit/放入$DSH_HOME/skills(默认~/.dsh/skills)。完整一键接入见仓库根./scripts/dsh-install.sh,它同时软链skills/*并以link:(开发模式,源码改动即生效)方式接入本插件。
本地开发 / 测试用 link: 方式(源码即时生效):
./scripts/dsh-install.sh
# 重启 dsh web
开发
- 增删命令:改
lib/index.js的COMMANDS表即可(每条一行声明);branch值必须与 git-kitSKILL.md决策树的分支 key 一致。 - 命令与 opencode 侧
commands-opencode/git/*.md是同一 git-kit 的两条入口,只声明意图、不重复逻辑。
发布(自动)
用打 tag 自动发布到 npm(OIDC / Trusted Publishing,无需长效 token;见仓库根 .github/workflows/release.yml;完整流程与踩坑见 PUBLISHING.md):
- 发布方式:升好版本后打 tag 并推送,workflow 用 OIDC 把该版本发布到 npmjs:
workflow 会校验# 1) 升版本:改 commands-dsh/package.json 的 version(如 0.1.1 -> 0.2.0),在分支上提交并 push,开 PR 合并到 main # (稳定分支不接受直接提交,发版升版本也不例外;见 skills/git-kit/references/stable-branch.md) # 2) 合并后切回 main 拉取,再打与版本一致的 tag(去掉 v 前缀,指向合并后的提交): # git switch main && git pull --ff-only origin main # git tag -a v0.2.0 -m "release: v0.2.0" origin/main && git push origin v0.2.0tag 版本 == package.json version(不一致拒绝发布);同版本在 npm 已存在则跳过(幂等)。细则见PUBLISHING.md「日常发新版」与skills/git-kit/references/tag.md「发版约束」。 - 关键约定:
package.json的name(npm 包名)与cordis.patch.yml的insert[0].name(dsh 启动时import()的模块标识符)必须一致;lib/index.js的export const name(cordis 插件名)与cordis.patch.yml的insert[0].id保持一致即可,但与模块标识符解耦。改包名时请三者同步核对。