dsh-shell-cmd
在 DSH 输入框输入 /cmd <终端命令>,先执行该命令,再把命令与输出一起发给模型,并在对话中以终端卡片样式渲染这次输入。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:xx529/dsh-shell-cmd说明文档
阅读完整 README ↗使用
- 在输入框键入
/,从命令菜单选择 cmd(或直接输入/cmd),菜单会显示命令说明与输入提示。 - 在
/cmd之后写终端命令,回车提交。命令在当前会话工作目录执行。 - 命令结束后,模型会自动收到命令与输出并给出回复。
示例:
/cmd ls -la
/cmd git log --oneline -5
/cmd cat package.json
/cmd npm test
行为细节
| 情况 | 表现 |
|---|---|
| 命令退出码非 0 | 卡片显示红色 退出 N 胶囊;输出照常发给模型(非零退出是结果,不是插件错误) |
| 命令超时 | 默认 120s 后杀掉进程,卡片显示 已超时,输出与超时标记发给模型 |
| 执行器报错(如无法启动) | 卡片显示错误文本,不会触发模型轮次 |
| 输出过长 | 单流最多读取 256 KiB;卡片与模型文本各自截断到 24k 字符并标注省略量 |
| 会话正在运行 | 命令照常执行;命令消息经 agent.followup() 排队,等当前轮次结束再送达 |
| 取消 | 命令执行绑定 UI 请求的取消信号;被取消时不向模型发送任何内容 |
| 会话标题 | 执行前用命令命名当前会话(见下节) |
| 权限 / 沙箱 | 默认以 danger-full-access 运行(等价终端,见「权限与运行环境」) |
会话标题规则
只有当 /cmd 是对话的第一个动作时,才用命令命名会话;对话中途执行的 /cmd 不改标题。
判定条件(isConversationStart(),两者同时满足才算开始):
- 会话还没有任何标题(人工命名、自动生成都算已有);
- 会话日志里没有
user/message/turn/start活动,且 Agent inbox 里没有待处理输入。
| 场景 | /cmd 的行为 |
|---|---|
新会话(侧边栏「未命名」),第一条输入就是 /cmd | 写入命令本身 |
对话已经开始(有过普通提示词 / 已有标题)后再 /cmd | 不改标题,命令照常执行并回复 |
同一会话里第二次 /cmd | 不改标题(第一次已命名) |
| fork / 续接的会话(继承历史消息) | 视为非开始,不改标题 |
命名通过 ctx.sessionTitle.rename(session, 命令) 完成(source: 'user',会固定标题,之后自动标题不再覆盖)。命令会先做一行化处理(换行/连续空白折叠为单个空格),最终长度由标题服务的 maxTitleBytes 截断。标题失败(例如被服务拒绝)不影响命令执行。若不需要这个行为,在行配置里加 nameSession: false。
权限与运行环境
权限(文件/网络):/cmd 是人类显式输入的命令,语义上等价于用户自己开终端执行,默认以
danger-full-access 策略交给 ctx.shell 执行——即不套 macOS seatbelt 沙箱,可写工作区之外、可联网。
注意:不能靠“不传
sandboxPolicy”来达到不沙箱。@deepseek-ai/dsh-bash-sandbox的resolve()会把缺省值补成部署默认策略(ctx.sandboxPolicy.resolve(),不带 session), 于是命令会跑在部署默认的 workspace root / 模式下。典型症状:在仓库里/cmd git pull报error: cannot open .git/FETCH_HEAD: Operation not permitted,而终端里正常。 本插件显式传danger-full-access,所以不会再出现这种“权限和终端不一致”。
需要让 /cmd 与模型 bash 工具保持同一边界(例如会话策略是 workspace-write / read-only)时,
在行配置里加 useSessionPolicy: true,此时改用该会话的 ctx.sandboxPolicy.resolve({ session })。
环境变量:命令由 dsh 的本地 bash executor 以 bash -c 执行,环境是 DSH 桌面进程的环境:
- 不加载你的交互式 shell rc(
~/.zshrc/~/.zprofile/~/.bash_profile),因此PATH、函数、别名、 部分工具链变量可能与终端不同; - 固定覆盖
NO_COLOR=1、TERM=dumb、PAGER=cat、GIT_PAGER=cat(保证输出适合卡片/模型); - 不注入
DSH_*(除非显式传dshEnv)。
需要登录 shell 环境时,在命令里显式 source,或写成 zsh -lc '…' / bash -lc '…'。
不是模型工具:/cmd 只由人触发,模型不能调用它;模型只能看到执行结果,不能借此执行命令。
可调常量与行配置
index.js 顶部导出:
| 常量 | 默认值 | 含义 |
|---|---|---|
DEFAULT_TIMEOUT_MS | 120000 | 单条命令超时(毫秒) |
DEFAULT_MAX_OUTPUT_CHARS | 24000 | 卡片与模型文本各自保留的最大字符数 |
STDOUT_MAX_BYTES | 262144 | 执行器侧单流读取上限 |
当前版本未导出 Config(避免依赖 schemastery);apply(ctx, config) 仍会读取行配置中的 timeoutMs / maxOutputChars / nameSession / useSessionPolicy(若 Loader 透传)。