前言¶
DeepSeek Harness (DSH) 生态采用「一切皆插件」的架构,插件在本地以当前进程权限运行。对于使用 Jujutsu (jj) 的开发者,一个常见问题是:智能体在 jj 工作区里直接调用 git commit、git reset 等命令,容易破坏 change graph,且现有 DSH 插件通常只提供 git 支持,对 jj 原生能力覆盖不足。aqian0/dsh-jj 是一个插件,它为 DeepSeek Harness 提供 Jujutsu 的一等支持。
这是什么¶
aqian0/dsh-jj 是一个 DSH 插件,维护者为 AQian0,许可证为 MIT。它为 DSH 提供了 13 个 jj 原生工具(如 jj_status、jj_log、jj_diff 等),以及仓库识别、防混淆 guard、模型上下文注入等能力。插件在 jj 仓库里会自动向模型注入「优先用 jj」的上下文,在非 jj 仓库则不注入。
核心功能¶
仓库识别
插件能区分 git 仓库、jj-colocated 仓库、jj-native 仓库和非仓库。当 jj 与 git 嵌套时,插件给出明确归属,不会把 jj 工作区当成普通 git 仓库。
防混淆 guard
在 jj 仓库里执行 git commit、git reset 等会破坏 change graph 的命令时,默认放行并在结果里提示等价的 jj 命令。也可以把 guardMutatingGit 设为 deny 来直接拒绝这些命令,并给出等价命令。
jj 原生工具
插件提供 13 个 jj_* 工具:
jj_status:工作副本@的状态jj_log:按 revset 查看提交(@、@-、bookmarks()等)jj_diff:指定 revset 的 diffjj_new:新建 change 并设为@jj_describe:就地修改提交描述(代替git commit --amend)jj_squash:把改动并进另一个提交jj_undo:撤销/恢复到某个 operationjj_op_log:operation 历史,用于找jj_undo的目标jj_workspace_add/jj_workspace_list:新建/列出 jj workspacejj_bookmark_list/jj_bookmark_set:列出/设置 bookmarkjj_rebase:rebase 提交及其后代
模型上下文
在 jj 仓库里自动向模型注入「优先用 jj」的上下文;非 jj 仓库不注入。
项目根发现
让 agent-instructions 也能把 .jj 当作项目根标记(headless/CLI profile 生效)。
不回退 git
jj 不可用或目录不是 jj 仓库时,jj_* 工具会报错并给出处理建议,不会静默改用 git。
安装与启用¶
安装前需确保 DSH 与 jj CLI(jj 在 PATH 中,或通过 jjCommand 指定)。插件无其他运行时依赖。
从 npm 安装,在 Plugin Manager 里把 spec 填成精确版本(如 @aqian0/dsh-jj@0.2.1),或执行:
dsh plugin --profile <name> add @aqian0/dsh-jj@0.2.1
本地目录安装:lib/ 是构建产物、不入库,先在仓库根执行 npm run build,再在 Plugin Manager 里安装本地 bundle,spec 填本仓库绝对路径(如 /path/to/dsh-jj);Web GUI 在设置 → 插件管理,Agent 侧用 plugin_manager 的 install_bundle。
安装后自动启用 jj-runtime / jj-tools / jj-guard 三行,并给 agent-instructions 加上 .jj 根标记。用 Plugin 页面或 list_plugins 确认。
典型用法¶
安装后自动生效,无需手工写 profile。典型的 agent 用法如下:
| 你说 | 模型调用 |
|---|---|
| “看下当前 jj 状态” | jj_status |
| “列出最近 10 个提交” | jj_log |
| “把当前改动并进上一个提交” | jj_squash |
| “改一下当前 change 的描述” | jj_describe |
| “撤销刚才那次 jj 操作” | jj_undo |
| “新建一个 workspace 放到 /tmp/wt” | jj_workspace_add |
在 jj 仓库里直接让 agent 跑 git commit 之类的命令时,默认会在工具结果里追加「优先用 jj」的提示。把 guardMutatingGit 设为 deny 后会直接拒绝并给出等价命令:
Blocked: `git commit` in a Jujutsu (jj) workspace (jj-colocated: /path/to/repo).
Use the jj equivalent instead:
jj commit -m "…" (or: jj describe -m "…" then jj new)
配置¶
所有配置键可选,写在 profile 中对应 bundle 行的 config 里:
| 键 | 默认 | 说明 |
|---|---|---|
jjCommand / gitCommand |
jj / git |
可执行文件名;gitCommand 只用于探测和提示 |
timeoutMs / graceMs |
30000 / 3000 |
子进程超时,以及超时后强制结束前的宽限时间 |
maxOutputBytes |
262144 |
单个输出流(stdout / stderr)的上限 |
detectCacheTtlMs |
10000 |
仓库检测结果的缓存时长 |
guardMutatingGit |
warn |
jj 仓库内 mutating git 的处置:warn(放行+提示) / deny(拒绝) / off |
guardGitInJjNative |
warn |
仅 jj-native 仓库内 git 的处置 |
guardJjRepositoryWide |
warn |
jj undo / jj op restore 等仓库级 jj 操作的处置 |
guardTools |
bash / pwsh / terminal_send |
参与上述守卫判定的 shell 工具名 |
guardCreateWorktree |
true |
在 jj 仓库里拒绝 create_worktree,引导用 jj workspace add |
readOnlyGitNotice |
true |
colocated 仓库内只读 git 命令是否附「优先用 jj」提示 |
preferJjContext |
true |
会话开始时注入「优先用 jj」的模型可见上下文 |
defaultLogLimit / maxLogLimit |
30 / 200 |
jj_log 的默认与最大返回条数 |
defaultCwd |
'' |
工具没有 workdir 时的回退目录(空 = 进程 cwd) |
适用场景与注意¶
适合需要智能体在 jj 工作区里进行版本控制操作的团队和个人开发者。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
已知限制:
- jj 未安装或目录不是 jj 仓库时,
jj_*工具会报错并给出处理建议,不会退回 git。 agent-instructions的.jj根标记覆盖在 Web profile 不生效(Web 在 bundle 层禁用了顶层该行),headless/CLI profile 生效。- jj-native 工作区里项目级 skill 根仍按
.git查找(上游硬编码),暂不可用。
结语¶
aqian0/dsh-jj 为 DSH 提供了完整的 jj 原生工具链与上下文注入,让智能体在 jj 工作区里能安全、高效地执行版本控制操作。插件目录页:https://www.skillhub.cn/plugins/AQian0/dsh-jj;GitHub:https://github.com/AQian0/dsh-jj