前言¶
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