dsh-git-worktree 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +418 -386
- package/LICENSE +21 -21
- package/NOTICE +16 -14
- package/README.en.md +169 -169
- package/README.md +169 -169
- package/cordis.patch.yml +11 -11
- package/docs/i18n.md +63 -63
- package/lib/adapters/initial-commit.js +3 -3
- package/lib/adapters/project-skill-provider.js +14 -4
- package/lib/adapters/project-skill-provider.js.map +1 -1
- package/lib/client/actions.d.ts +19 -3
- package/lib/client/actions.js +23 -3
- package/lib/client/actions.js.map +1 -1
- package/lib/client/console-remote/adapter.js +1 -1
- package/lib/client/console-remote/adapter.js.map +1 -1
- package/lib/client/console-remote/index.d.ts +10 -3
- package/lib/client/console-remote/index.js +56 -13
- package/lib/client/console-remote/index.js.map +1 -1
- package/lib/client/index.js +1 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/pre-session/controller.d.ts +1 -1
- package/lib/client/pre-session/controller.js +33 -18
- package/lib/client/pre-session/controller.js.map +1 -1
- package/lib/client/review-console/recovery-continuation.d.ts +1 -1
- package/lib/client/review-console/recovery-continuation.js +9 -4
- package/lib/client/review-console/recovery-continuation.js.map +1 -1
- package/lib/client/review-console/review-console.styles.js +190 -190
- package/lib/client/styles.js +146 -140
- package/lib/client/styles.js.map +1 -1
- package/lib/client/target-console/target-console.styles.js +155 -155
- package/lib/client/workspace-sidebar/index.d.ts +11 -2
- package/lib/client/workspace-sidebar/index.js +89 -9
- package/lib/client/workspace-sidebar/index.js.map +1 -1
- package/lib/client.js +10501 -1345
- package/lib/console-contract.d.ts +2 -0
- package/lib/console-contract.js.map +1 -1
- package/lib/console-host/service.js +4 -2
- package/lib/console-host/service.js.map +1 -1
- package/lib/console-remote/descriptors.js +10 -3
- package/lib/console-remote/descriptors.js.map +1 -1
- package/lib/console-remote/schemas.js +1 -0
- package/lib/console-remote/schemas.js.map +1 -1
- package/lib/host-compat.d.ts +4 -0
- package/lib/host-compat.js +25 -0
- package/lib/host-compat.js.map +1 -0
- package/lib/i18n/client-messages.d.ts +4 -0
- package/lib/i18n/client-messages.js +4 -0
- package/lib/i18n/client-messages.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +9 -2
- package/lib/index.js.map +1 -1
- package/lib/workspace-provider-lifecycle.d.ts +16 -1
- package/lib/workspace-provider-lifecycle.js +69 -5
- package/lib/workspace-provider-lifecycle.js.map +1 -1
- package/package.json +153 -149
- package/scripts/check-publish.mjs +239 -238
- package/scripts/check-workspace-sidebar-version.mjs +18 -14
- package/scripts/clean-lib.mjs +7 -7
- package/scripts/dev-dsh-lib.mjs +547 -509
- package/scripts/dev-dsh.mjs +98 -95
- package/scripts/dsh-source-runner.mjs +20 -14
- package/scripts/workspace-sidebar-upstream-alpha.mjs +102 -0
- package/scripts/workspace-sidebar-upstream-next.mjs +134 -0
- package/scripts/workspace-sidebar-upstream.d.mts +8 -8
- package/scripts/workspace-sidebar-upstream.mjs +182 -162
package/README.md
CHANGED
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
# dsh-git-worktree
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/dsh-git-worktree)
|
|
4
|
-
[](https://www.npmjs.com/package/dsh-git-worktree)
|
|
5
|
-
[](https://github.com/wloops/dsh-git-worktree/actions/workflows/ci.yml)
|
|
6
|
-
[](LICENSE)
|
|
7
|
-
|
|
8
|
-
**让 Agent 在独立 Git Worktree 中完成任务,你看过修改后再决定是否保存。**
|
|
9
|
-
|
|
10
|
-
`dsh-git-worktree` 是 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness) 的 Git Worktree 插件。它会为每个编码任务创建独立的 Worktree(工作目录),Agent 不会直接改动你正在使用的项目。任务完成后,你可以先预览结果,再选择保存、退回修改或放弃。
|
|
11
|
-
|
|
12
|
-
这套 Git Worktree 工作方式最初来自基于 Pi Agent Runtime 的开源桌面 coding 工作台 [Domi](https://github.com/restflux/domi),本插件是针对 DeepSeek Harness 独立适配的版本,可以单独安装和使用。
|
|
13
|
-
|
|
14
|
-
[English](README.en.md) · [完整使用指南](docs/USAGE.md) · [架构说明](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
15
|
-
|
|
16
|
-
## 为什么使用它?
|
|
17
|
-
|
|
18
|
-
让 Agent 直接修改当前项目时,它的改动可能与你尚未提交的内容混在一起;同时运行多个任务时,也更容易互相影响。使用本插件后:
|
|
19
|
-
|
|
20
|
-
- 每个任务都在自己的 Git Worktree(独立工作目录)中修改和测试;
|
|
21
|
-
- 多个任务可以同时进行,不会共用同一个工作目录;
|
|
22
|
-
- Agent 完成后,你可以先把修改临时显示在当前项目中查看;
|
|
23
|
-
- 只有确认后才会保存本轮修改,遇到冲突时不会自动覆盖你的内容。
|
|
24
|
-
|
|
25
|
-
## 核心能力
|
|
26
|
-
|
|
27
|
-
- **Git Worktree 隔离**:每个任务都有独立的工作目录和 Agent 对话。
|
|
28
|
-
- **多个 Worktree 并行**:可以同时开发多个任务;为了避免混入修改,同一项目每次只验收一个任务。
|
|
29
|
-
- **提交前预览**:先在当前项目中查看真实效果,不会立即创建 Git 提交。
|
|
30
|
-
- **不满意可以退回**:撤回本次预览,继续让 Agent 修改,不影响其他本地改动。
|
|
31
|
-
- **只保存本轮任务**:确认后只提交这个任务的修改,不把无关内容一起带入。
|
|
32
|
-
- **长任务可分阶段**:先保存当前阶段的进度,再继续开发;最终仍合并为一次交付。
|
|
33
|
-
- **出错时保护现场**:检测到分支变化、内容冲突或中断时停止操作,保留现场供你处理。
|
|
34
|
-
- **集中查看任务**:同一项目的当前及历史 Worktree 会按 Host 导航归属聚合到侧边栏,归属不明确时保守保留原位置。
|
|
35
|
-
- **验收详情集中查看**:从验收条打开只读详情,查看文件列表、验证记录与版本信息,不必翻找聊天工具记录。
|
|
36
|
-
- **空仓库安全起步**:无提交仓库可在明确确认后创建不包含用户文件的空首次提交,再建立隔离 Worktree。
|
|
37
|
-
- **携带项目 Skills**:首次及下一轮 Worktree 创建时一次性携带 `.dsh/skills`、`.agents/skills` 和 `.claude/skills`,辅助文件与 Git 交付隔离。
|
|
38
|
-
- **原对话继续下一轮**:任务交付后,无需新开对话即可继续下一项修改。
|
|
39
|
-
|
|
40
|
-
> 当前版本管理单个项目中的 Git Worktree,暂不提供跨项目的全局管理界面。
|
|
41
|
-
|
|
42
|
-
## 工作流
|
|
43
|
-
|
|
44
|
-
```mermaid
|
|
45
|
-
flowchart LR
|
|
46
|
-
A[当前项目] -->|创建隔离任务| B[独立 Git Worktree]
|
|
47
|
-
B --> C[Agent 修改并测试]
|
|
48
|
-
C --> D[查看验收结果]
|
|
49
|
-
D -->|预览修改| E[在当前项目中查看效果]
|
|
50
|
-
E -->|确认并保存| F[创建本轮提交]
|
|
51
|
-
F --> G[在原对话继续下一轮]
|
|
52
|
-
|
|
53
|
-
D -.->|保存阶段进度| H[继续开发]
|
|
54
|
-
E -.->|撤回本次预览| I[返回修改]
|
|
55
|
-
D -.->|跳过预览| F
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 怎么选?
|
|
59
|
-
|
|
60
|
-
| 目标 | 操作 |
|
|
61
|
-
| --- | --- |
|
|
62
|
-
| 先在当前项目中查看效果 | **预览修改** |
|
|
63
|
-
| 预览结果没有问题 | **确认并保存** |
|
|
64
|
-
| 任务很长,先固定当前进度 | **保存阶段并继续** |
|
|
65
|
-
| 还要让 Agent 改代码 | **继续修改**或**撤回本次预览** |
|
|
66
|
-
| 不需要先查看效果 | **跳过预览并保存** |
|
|
67
|
-
|
|
68
|
-
详细的操作、恢复场景和命令见[完整使用指南](docs/USAGE.md)。
|
|
69
|
-
|
|
70
|
-
## 快速开始
|
|
71
|
-
|
|
72
|
-
### 环境要求
|
|
73
|
-
|
|
74
|
-
- Node.js `^22.19.0 || >=24.0.0`
|
|
75
|
-
- DeepSeek Harness:`0.1.2-rc.1` 为开发验证基线;`0.1.5-rc.1` 已有用户可用反馈并通过部分隔离验证,详见[兼容矩阵与限制](docs/COMPATIBILITY.md#中文)。并非只能使用最新版。
|
|
76
|
-
- Harness Web Client
|
|
77
|
-
- Git Workspace
|
|
78
|
-
|
|
79
|
-
从旧 Harness 升级时请先处理 Host 数据迁移:`0.1.2-rc.1` 已移除可选 SQLite Session 后端,旧数据需使用旧版 Harness 导出;Code Mode 已更名为 PTC mode,但现有会话记录仍可读取。应用和本插件统一通过 `dsh` Profile 启动与安装。
|
|
80
|
-
|
|
81
|
-
从旧版 Harness 升级后,如果 Web 界面提示 **Failed to load plugins**,请按[兼容矩阵](docs/COMPATIBILITY.md#中文)选择修复版本并重启 Harness
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
dsh plugin --profile web add dsh-git-worktree@0.9.2
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### 安装
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
dsh plugin --profile web add dsh-git-worktree
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
也可以安装指定版本:
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
dsh plugin --profile web add github:wloops/dsh-git-worktree#v0.9.2
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
安装后打开 Git Workspace,在新建 Session 时启用 **Worktree**;已有 Local Session 也可以让模型调用 `worktree_create` 创建隔离 Session。
|
|
100
|
-
|
|
101
|
-
第一次使用建议先完成一次“创建 → 预览修改 → 确认并保存 → cleanup”的完整流程。
|
|
102
|
-
|
|
103
|
-
如果 Git 源安装被 pnpm build approval 阻止,或需要查看完整命令和排错步骤,请阅读[安装与使用指南](docs/USAGE.md#安装与排错)。
|
|
104
|
-
|
|
105
|
-
## 界面预览
|
|
106
|
-
|
|
107
|
-
### 项目聚合与任务状态
|
|
108
|
-
|
|
109
|
-

|
|
110
|
-
|
|
111
|
-
### 准备验收
|
|
112
|
-
|
|
113
|
-

|
|
114
|
-
|
|
115
|
-
完整操作步骤见[完整使用指南](docs/USAGE.md#完整交付示例)。
|
|
116
|
-
|
|
117
|
-
## 安全边界
|
|
118
|
-
|
|
119
|
-
每次把任务修改写回当前项目之前,插件都会重新确认任务版本、项目位置和文件状态仍与验收时一致。如果你切换了分支、修改发生冲突,或上一次操作意外中断,插件会停止写入并保留现场,而不是猜测后继续覆盖。
|
|
120
|
-
|
|
121
|
-
Worktree 隔离主要用于避免任务之间误改文件,不是用来运行不受信任代码的系统沙箱。
|
|
122
|
-
|
|
123
|
-
更详细的状态检查与恢复规则见:
|
|
124
|
-
|
|
125
|
-
- [Worktree Console 架构](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
126
|
-
- [Session Target 迁移说明](docs/PORTING.md)
|
|
127
|
-
|
|
128
|
-
## 当前限制
|
|
129
|
-
|
|
130
|
-
- 只有归属关系明确的任务才会聚合到原项目;无法确认时仍保留原位置,避免任务被隐藏。
|
|
131
|
-
- 隔离任务可以重命名和归档,暂不支持从任务对话直接复制出新任务(Fork)。
|
|
132
|
-
- 子 Agent 与父任务使用同一个工作目录,不会再为每个子 Agent 创建新的 Worktree。
|
|
133
|
-
- 已保存的阶段记录暂不支持编辑、删除、调整顺序或回退到任意阶段。
|
|
134
|
-
- [Domi](https://github.com/restflux/domi) 中更完整的跨项目管理、直接修复当前项目、依赖复用和协作交接能力不在本插件当前范围内。
|
|
135
|
-
|
|
136
|
-
## 本地开发
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
pnpm install
|
|
140
|
-
pnpm run typecheck
|
|
141
|
-
pnpm test
|
|
142
|
-
pnpm run build
|
|
143
|
-
pnpm run check:publish
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
端到端启动:
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
pnpm run dev:dsh
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
更多开发命令见[完整使用指南](docs/USAGE.md#本地开发),发布前检查见[发布清单](docs/RELEASE.md)。
|
|
153
|
-
|
|
154
|
-
## 文档
|
|
155
|
-
|
|
156
|
-
- [完整使用指南](docs/USAGE.md)
|
|
157
|
-
- [Worktree Console 架构](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
158
|
-
- [Session Target 迁移说明](docs/PORTING.md)
|
|
159
|
-
- [UI 开发说明](docs/UI-DEVELOPMENT.md)
|
|
160
|
-
- [发布清单](docs/RELEASE.md)
|
|
161
|
-
- [变更记录](CHANGELOG.md)
|
|
162
|
-
|
|
163
|
-
## 许可证
|
|
164
|
-
|
|
165
|
-
[MIT](LICENSE)
|
|
166
|
-
|
|
167
|
-
## 界面语言
|
|
168
|
-
|
|
169
|
-
插件跟随 DSH 的中英文选择,不提供独立语言开关。请在 DSH 中明确选择 English,以便界面、工具和 `/worktree` 消息都使用英文;自动浏览器语言尚未写入 DSH 偏好时,工具和命令会回退中文。详见 [语言传递与文案贡献说明](docs/i18n.md)。
|
|
1
|
+
# dsh-git-worktree
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-git-worktree)
|
|
4
|
+
[](https://www.npmjs.com/package/dsh-git-worktree)
|
|
5
|
+
[](https://github.com/wloops/dsh-git-worktree/actions/workflows/ci.yml)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
**让 Agent 在独立 Git Worktree 中完成任务,你看过修改后再决定是否保存。**
|
|
9
|
+
|
|
10
|
+
`dsh-git-worktree` 是 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness) 的 Git Worktree 插件。它会为每个编码任务创建独立的 Worktree(工作目录),Agent 不会直接改动你正在使用的项目。任务完成后,你可以先预览结果,再选择保存、退回修改或放弃。
|
|
11
|
+
|
|
12
|
+
这套 Git Worktree 工作方式最初来自基于 Pi Agent Runtime 的开源桌面 coding 工作台 [Domi](https://github.com/restflux/domi),本插件是针对 DeepSeek Harness 独立适配的版本,可以单独安装和使用。
|
|
13
|
+
|
|
14
|
+
[English](README.en.md) · [完整使用指南](docs/USAGE.md) · [架构说明](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
15
|
+
|
|
16
|
+
## 为什么使用它?
|
|
17
|
+
|
|
18
|
+
让 Agent 直接修改当前项目时,它的改动可能与你尚未提交的内容混在一起;同时运行多个任务时,也更容易互相影响。使用本插件后:
|
|
19
|
+
|
|
20
|
+
- 每个任务都在自己的 Git Worktree(独立工作目录)中修改和测试;
|
|
21
|
+
- 多个任务可以同时进行,不会共用同一个工作目录;
|
|
22
|
+
- Agent 完成后,你可以先把修改临时显示在当前项目中查看;
|
|
23
|
+
- 只有确认后才会保存本轮修改,遇到冲突时不会自动覆盖你的内容。
|
|
24
|
+
|
|
25
|
+
## 核心能力
|
|
26
|
+
|
|
27
|
+
- **Git Worktree 隔离**:每个任务都有独立的工作目录和 Agent 对话。
|
|
28
|
+
- **多个 Worktree 并行**:可以同时开发多个任务;为了避免混入修改,同一项目每次只验收一个任务。
|
|
29
|
+
- **提交前预览**:先在当前项目中查看真实效果,不会立即创建 Git 提交。
|
|
30
|
+
- **不满意可以退回**:撤回本次预览,继续让 Agent 修改,不影响其他本地改动。
|
|
31
|
+
- **只保存本轮任务**:确认后只提交这个任务的修改,不把无关内容一起带入。
|
|
32
|
+
- **长任务可分阶段**:先保存当前阶段的进度,再继续开发;最终仍合并为一次交付。
|
|
33
|
+
- **出错时保护现场**:检测到分支变化、内容冲突或中断时停止操作,保留现场供你处理。
|
|
34
|
+
- **集中查看任务**:同一项目的当前及历史 Worktree 会按 Host 导航归属聚合到侧边栏,归属不明确时保守保留原位置。
|
|
35
|
+
- **验收详情集中查看**:从验收条打开只读详情,查看文件列表、验证记录与版本信息,不必翻找聊天工具记录。
|
|
36
|
+
- **空仓库安全起步**:无提交仓库可在明确确认后创建不包含用户文件的空首次提交,再建立隔离 Worktree。
|
|
37
|
+
- **携带项目 Skills**:首次及下一轮 Worktree 创建时一次性携带 `.dsh/skills`、`.agents/skills` 和 `.claude/skills`,辅助文件与 Git 交付隔离。
|
|
38
|
+
- **原对话继续下一轮**:任务交付后,无需新开对话即可继续下一项修改。
|
|
39
|
+
|
|
40
|
+
> 当前版本管理单个项目中的 Git Worktree,暂不提供跨项目的全局管理界面。
|
|
41
|
+
|
|
42
|
+
## 工作流
|
|
43
|
+
|
|
44
|
+
```mermaid
|
|
45
|
+
flowchart LR
|
|
46
|
+
A[当前项目] -->|创建隔离任务| B[独立 Git Worktree]
|
|
47
|
+
B --> C[Agent 修改并测试]
|
|
48
|
+
C --> D[查看验收结果]
|
|
49
|
+
D -->|预览修改| E[在当前项目中查看效果]
|
|
50
|
+
E -->|确认并保存| F[创建本轮提交]
|
|
51
|
+
F --> G[在原对话继续下一轮]
|
|
52
|
+
|
|
53
|
+
D -.->|保存阶段进度| H[继续开发]
|
|
54
|
+
E -.->|撤回本次预览| I[返回修改]
|
|
55
|
+
D -.->|跳过预览| F
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 怎么选?
|
|
59
|
+
|
|
60
|
+
| 目标 | 操作 |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| 先在当前项目中查看效果 | **预览修改** |
|
|
63
|
+
| 预览结果没有问题 | **确认并保存** |
|
|
64
|
+
| 任务很长,先固定当前进度 | **保存阶段并继续** |
|
|
65
|
+
| 还要让 Agent 改代码 | **继续修改**或**撤回本次预览** |
|
|
66
|
+
| 不需要先查看效果 | **跳过预览并保存** |
|
|
67
|
+
|
|
68
|
+
详细的操作、恢复场景和命令见[完整使用指南](docs/USAGE.md)。
|
|
69
|
+
|
|
70
|
+
## 快速开始
|
|
71
|
+
|
|
72
|
+
### 环境要求
|
|
73
|
+
|
|
74
|
+
- Node.js `^22.19.0 || >=24.0.0`
|
|
75
|
+
- DeepSeek Harness:`0.1.2-rc.1` 为开发验证基线;`0.1.5-rc.1` 已有用户可用反馈并通过部分隔离验证,详见[兼容矩阵与限制](docs/COMPATIBILITY.md#中文)。并非只能使用最新版。
|
|
76
|
+
- Harness Web Client
|
|
77
|
+
- Git Workspace
|
|
78
|
+
|
|
79
|
+
从旧 Harness 升级时请先处理 Host 数据迁移:`0.1.2-rc.1` 已移除可选 SQLite Session 后端,旧数据需使用旧版 Harness 导出;Code Mode 已更名为 PTC mode,但现有会话记录仍可读取。应用和本插件统一通过 `dsh` Profile 启动与安装。
|
|
80
|
+
|
|
81
|
+
从旧版 Harness 升级后,如果 Web 界面提示 **Failed to load plugins**,请按[兼容矩阵](docs/COMPATIBILITY.md#中文)选择修复版本并重启 Harness;下方以 `0.9.2` 为安装示例。`0.7.2` 及更早版本依赖已停止发布的 `dsh-client-runtime`;`0.7.3` 在 rc.1 Web Client 中还可能形成 `conversation` / `uiWorkspace` 循环等待。
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
dsh plugin --profile web add dsh-git-worktree@0.9.2
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 安装
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
dsh plugin --profile web add dsh-git-worktree
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
也可以安装指定版本:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
dsh plugin --profile web add github:wloops/dsh-git-worktree#v0.9.2
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
安装后打开 Git Workspace,在新建 Session 时启用 **Worktree**;已有 Local Session 也可以让模型调用 `worktree_create` 创建隔离 Session。
|
|
100
|
+
|
|
101
|
+
第一次使用建议先完成一次“创建 → 预览修改 → 确认并保存 → cleanup”的完整流程。
|
|
102
|
+
|
|
103
|
+
如果 Git 源安装被 pnpm build approval 阻止,或需要查看完整命令和排错步骤,请阅读[安装与使用指南](docs/USAGE.md#安装与排错)。
|
|
104
|
+
|
|
105
|
+
## 界面预览
|
|
106
|
+
|
|
107
|
+
### 项目聚合与任务状态
|
|
108
|
+
|
|
109
|
+

|
|
110
|
+
|
|
111
|
+
### 准备验收
|
|
112
|
+
|
|
113
|
+

|
|
114
|
+
|
|
115
|
+
完整操作步骤见[完整使用指南](docs/USAGE.md#完整交付示例)。
|
|
116
|
+
|
|
117
|
+
## 安全边界
|
|
118
|
+
|
|
119
|
+
每次把任务修改写回当前项目之前,插件都会重新确认任务版本、项目位置和文件状态仍与验收时一致。如果你切换了分支、修改发生冲突,或上一次操作意外中断,插件会停止写入并保留现场,而不是猜测后继续覆盖。
|
|
120
|
+
|
|
121
|
+
Worktree 隔离主要用于避免任务之间误改文件,不是用来运行不受信任代码的系统沙箱。
|
|
122
|
+
|
|
123
|
+
更详细的状态检查与恢复规则见:
|
|
124
|
+
|
|
125
|
+
- [Worktree Console 架构](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
126
|
+
- [Session Target 迁移说明](docs/PORTING.md)
|
|
127
|
+
|
|
128
|
+
## 当前限制
|
|
129
|
+
|
|
130
|
+
- 只有归属关系明确的任务才会聚合到原项目;无法确认时仍保留原位置,避免任务被隐藏。
|
|
131
|
+
- 隔离任务可以重命名和归档,暂不支持从任务对话直接复制出新任务(Fork)。
|
|
132
|
+
- 子 Agent 与父任务使用同一个工作目录,不会再为每个子 Agent 创建新的 Worktree。
|
|
133
|
+
- 已保存的阶段记录暂不支持编辑、删除、调整顺序或回退到任意阶段。
|
|
134
|
+
- [Domi](https://github.com/restflux/domi) 中更完整的跨项目管理、直接修复当前项目、依赖复用和协作交接能力不在本插件当前范围内。
|
|
135
|
+
|
|
136
|
+
## 本地开发
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
pnpm install
|
|
140
|
+
pnpm run typecheck
|
|
141
|
+
pnpm test
|
|
142
|
+
pnpm run build
|
|
143
|
+
pnpm run check:publish
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
端到端启动:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
pnpm run dev:dsh
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
更多开发命令见[完整使用指南](docs/USAGE.md#本地开发),发布前检查见[发布清单](docs/RELEASE.md)。
|
|
153
|
+
|
|
154
|
+
## 文档
|
|
155
|
+
|
|
156
|
+
- [完整使用指南](docs/USAGE.md)
|
|
157
|
+
- [Worktree Console 架构](docs/WORKTREE-CONSOLE-ARCHITECTURE.md)
|
|
158
|
+
- [Session Target 迁移说明](docs/PORTING.md)
|
|
159
|
+
- [UI 开发说明](docs/UI-DEVELOPMENT.md)
|
|
160
|
+
- [发布清单](docs/RELEASE.md)
|
|
161
|
+
- [变更记录](CHANGELOG.md)
|
|
162
|
+
|
|
163
|
+
## 许可证
|
|
164
|
+
|
|
165
|
+
[MIT](LICENSE)
|
|
166
|
+
|
|
167
|
+
## 界面语言
|
|
168
|
+
|
|
169
|
+
插件跟随 DSH 的中英文选择,不提供独立语言开关。请在 DSH 中明确选择 English,以便界面、工具和 `/worktree` 消息都使用英文;自动浏览器语言尚未写入 DSH 偏好时,工具和命令会回退中文。详见 [语言传递与文案贡献说明](docs/i18n.md)。
|
package/cordis.patch.yml
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Keep the official Workspace available when this bundle remains installed but
|
|
2
|
-
# its replacement entry (or an owning group) is disabled. Provider selection is
|
|
3
|
-
# evaluated by the Loader; restart DSH after changing the plugin's enabled state.
|
|
4
|
-
|
|
5
|
-
- id: ui-workspace
|
|
6
|
-
name: '@deepseek-ai/dsh-client-ui-workspace'
|
|
7
|
-
disabled: !!js "!!get('worktreeWorkspaceProvider') && [...loader.entries()].some(entry => entry.options?.name === 'dsh-git-worktree' && !entry.disabled)"
|
|
8
|
-
|
|
9
|
-
- insert:
|
|
10
|
-
- id: dsh-git-worktree
|
|
11
|
-
name: dsh-git-worktree
|
|
1
|
+
# Keep the official Workspace available when this bundle remains installed but
|
|
2
|
+
# its replacement entry (or an owning group) is disabled. Provider selection is
|
|
3
|
+
# evaluated by the Loader; restart DSH after changing the plugin's enabled state.
|
|
4
|
+
|
|
5
|
+
- id: ui-workspace
|
|
6
|
+
name: '@deepseek-ai/dsh-client-ui-workspace'
|
|
7
|
+
disabled: !!js "!!get('worktreeWorkspaceProvider') && [...loader.entries()].some(entry => entry.options?.name === 'dsh-git-worktree' && !entry.disabled)"
|
|
8
|
+
|
|
9
|
+
- insert:
|
|
10
|
+
- id: dsh-git-worktree
|
|
11
|
+
name: dsh-git-worktree
|
package/docs/i18n.md
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
# 中英文支持 / English support
|
|
2
|
-
|
|
3
|
-
This document describes the language contract for the maintained version of `dsh-git-worktree`. It is not a backport commitment for 0.4.0.
|
|
4
|
-
|
|
5
|
-
## Selecting a language
|
|
6
|
-
|
|
7
|
-
The plugin follows DSH's language selection; it does not add a separate language switch. Select **English** in DSH to use English across the plugin UI, Console operations, tools, and `/worktree` commands. Select Chinese to retain Chinese messages.
|
|
8
|
-
|
|
9
|
-
The Client reads and subscribes to the public `@deepseek-ai/dsh-client-locale` runtime. The official-derived Workspace UI keeps its upstream locale implementation; only plugin-owned additions use the plugin catalog. No generated dependency bundle is edited.
|
|
10
|
-
|
|
11
|
-
## Host language and compatibility
|
|
12
|
-
|
|
13
|
-
There are two request paths:
|
|
14
|
-
|
|
15
|
-
| Surface | Language source | Missing information |
|
|
16
|
-
| --- | --- | --- |
|
|
17
|
-
| Client UI | DSH Client locale runtime | Chinese |
|
|
18
|
-
| Client → Worktree Console Remote | Active Client language, snapshotted into a trailing optional `locale` argument on each call | Host settings, then Chinese |
|
|
19
|
-
| Tools and `/worktree` commands | Public Host settings service: `get('locale').preference`, snapshotted for each invocation | Chinese |
|
|
20
|
-
|
|
21
|
-
The inspected DSH packages are version `0.1.2-rc.1`. The locale Host entry registers the `locale` settings namespace and its `preference` field. Tool and command invocation interfaces do not expose the browser's resolved locale. DSH's automatic browser-language resolution is a Client behavior and does not guarantee a saved Host preference.
|
|
22
|
-
|
|
23
|
-
**Limitation:** with automatic browser English and no saved DSH language preference, the UI and its Console requests can be English while tools and commands fall back to Chinese. Explicitly selecting English in DSH supplies the preference needed by all surfaces. The plugin does not guess from user text, machine locale, or the last browser request, and does not write a preference on the user's behalf.
|
|
24
|
-
|
|
25
|
-
Host language is scoped with `AsyncLocalStorage`, not a mutable process-wide language variable. Async operations retain their invocation's snapshot even if a concurrent request uses another language or the setting changes. An explicit Console request locale takes precedence over the Host setting. Old wire callers may omit locale; the new Client passes every positional slot required by the strict DSH Remote SDK. The additional field accepts only `zh`, `en`, or omission.
|
|
26
|
-
|
|
27
|
-
Tool/command registration descriptions, command hints, and generic tool presentation titles are shared, replayable metadata without an Agent context. They use static Chinese / English text rather than binding the shared registration to one user's preference. Dynamic execution results and command output use the invocation language.
|
|
28
|
-
|
|
29
|
-
Historical user-authored summaries and suggested commit messages remain stored content, not retranslated text. The existing cleanup recovery discriminants remain unchanged in storage; only a finite allowlist of known legacy system cleanup messages is localized at the public projection boundary. Unknown persisted or third-party errors pass through unchanged.
|
|
30
|
-
|
|
31
|
-
Error codes, result shapes, Git operations, review confirmation, cleanup decisions, and persisted schemas remain independent of translated text. Plugin-owned messages are translated at their source. Paths, branches, user-written titles and summaries, identifiers, and raw Git/filesystem/carrier error details are not translated.
|
|
32
|
-
|
|
33
|
-
## Catalogs and contributions
|
|
34
|
-
|
|
35
|
-
- `src/i18n/core.ts`: supported languages, normalization, typed keys and interpolation.
|
|
36
|
-
- `src/i18n/client-messages.ts`: plugin-owned Client messages.
|
|
37
|
-
- `src/i18n/host-messages.ts`: Host messages.
|
|
38
|
-
- `src/i18n/transport-messages.ts`: Client transport diagnostics.
|
|
39
|
-
- `src/client/i18n.tsx`: DSH Client locale bridge.
|
|
40
|
-
- `src/i18n/host.ts`: Host settings lookup and invocation scope.
|
|
41
|
-
|
|
42
|
-
Every entry has both `zh` and `en`. Preserve the meaning of existing Chinese copy and use matching named `{placeholder}` parameters in both languages. Insert dynamic values through parameters rather than constructing translation keys or translating user content. The typed translator checks keys and required parameters; tests verify language behavior and catalog agreement.
|
|
43
|
-
|
|
44
|
-
When adding a message, classify it first: plugin-owned UI (including accessibility text), official-derived UI, Host user message, model-facing instruction, or developer-only log. Keep the official UI's locale mechanism and source-version/hash validation intact. Comments, development logs, and machine-readable values are not UI translation targets.
|
|
45
|
-
|
|
46
|
-
## Source inventory
|
|
47
|
-
|
|
48
|
-
The initial extraction contains 380 Client entries, 364 Host entries, and 2 transport entries. Counts are informational, not stable identifiers.
|
|
49
|
-
|
|
50
|
-
| Category | Covered sources / handling |
|
|
51
|
-
| --- | --- |
|
|
52
|
-
| Plugin Client UI | Create/review tool rows, pre-session toggle, target status/actions, manager, review/preview/preflight/recovery panels, sidebar/task labels, tooltips, placeholders, accessibility labels, and operation feedback |
|
|
53
|
-
| Official-derived UI | Upstream Workspace locale remains in place; plugin augmentation is localized, source version and SHA-256 checks retained |
|
|
54
|
-
| Host user messages | Session checkout domain and Apply engine, Console control plane/projection/Diff/errors, Git/files/registry adapters, tools and `/worktree` output |
|
|
55
|
-
| Shared metadata | Bilingual tool/command registration and generic presentation titles; no request-local state stored in shared registrations |
|
|
56
|
-
| Non-translation data | User text, paths, branch/Session/Git IDs, error codes, persisted schemas, internal artifact labels and model protocol/context instruction text |
|
|
57
|
-
| Developer material | Code comments, maintenance scripts and raw process diagnostics are not end-user UI strings |
|
|
58
|
-
|
|
59
|
-
An AST scan after extraction finds six Chinese literal fragments outside the catalogs: five existing cleanup-reason discriminant fragments and one legacy transport codec-rejection marker. These are compatibility recognizers, not unlocalized UI output.
|
|
60
|
-
|
|
61
|
-
## Verification boundaries
|
|
62
|
-
|
|
63
|
-
Automated tests cover normalization, Chinese fallback, interpolation, Client language changes, Host async isolation, and strict Console transport compatibility, alongside existing Client and Host behavior. Type checking, build, upstream sidebar validation, and publish-integrity checks are separate gates. Mock and DOM-based component tests are not deployment or browser E2E evidence; actual Web/Docker validation, when performed, must be reported separately in the delivery report.
|
|
1
|
+
# 中英文支持 / English support
|
|
2
|
+
|
|
3
|
+
This document describes the language contract for the maintained version of `dsh-git-worktree`. It is not a backport commitment for 0.4.0.
|
|
4
|
+
|
|
5
|
+
## Selecting a language
|
|
6
|
+
|
|
7
|
+
The plugin follows DSH's language selection; it does not add a separate language switch. Select **English** in DSH to use English across the plugin UI, Console operations, tools, and `/worktree` commands. Select Chinese to retain Chinese messages.
|
|
8
|
+
|
|
9
|
+
The Client reads and subscribes to the public `@deepseek-ai/dsh-client-locale` runtime. The official-derived Workspace UI keeps its upstream locale implementation; only plugin-owned additions use the plugin catalog. No generated dependency bundle is edited.
|
|
10
|
+
|
|
11
|
+
## Host language and compatibility
|
|
12
|
+
|
|
13
|
+
There are two request paths:
|
|
14
|
+
|
|
15
|
+
| Surface | Language source | Missing information |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| Client UI | DSH Client locale runtime | Chinese |
|
|
18
|
+
| Client → Worktree Console Remote | Active Client language, snapshotted into a trailing optional `locale` argument on each call | Host settings, then Chinese |
|
|
19
|
+
| Tools and `/worktree` commands | Public Host settings service: `get('locale').preference`, snapshotted for each invocation | Chinese |
|
|
20
|
+
|
|
21
|
+
The inspected DSH packages are version `0.1.2-rc.1`. The locale Host entry registers the `locale` settings namespace and its `preference` field. Tool and command invocation interfaces do not expose the browser's resolved locale. DSH's automatic browser-language resolution is a Client behavior and does not guarantee a saved Host preference.
|
|
22
|
+
|
|
23
|
+
**Limitation:** with automatic browser English and no saved DSH language preference, the UI and its Console requests can be English while tools and commands fall back to Chinese. Explicitly selecting English in DSH supplies the preference needed by all surfaces. The plugin does not guess from user text, machine locale, or the last browser request, and does not write a preference on the user's behalf.
|
|
24
|
+
|
|
25
|
+
Host language is scoped with `AsyncLocalStorage`, not a mutable process-wide language variable. Async operations retain their invocation's snapshot even if a concurrent request uses another language or the setting changes. An explicit Console request locale takes precedence over the Host setting. Old wire callers may omit locale; the new Client passes every positional slot required by the strict DSH Remote SDK. The additional field accepts only `zh`, `en`, or omission.
|
|
26
|
+
|
|
27
|
+
Tool/command registration descriptions, command hints, and generic tool presentation titles are shared, replayable metadata without an Agent context. They use static Chinese / English text rather than binding the shared registration to one user's preference. Dynamic execution results and command output use the invocation language.
|
|
28
|
+
|
|
29
|
+
Historical user-authored summaries and suggested commit messages remain stored content, not retranslated text. The existing cleanup recovery discriminants remain unchanged in storage; only a finite allowlist of known legacy system cleanup messages is localized at the public projection boundary. Unknown persisted or third-party errors pass through unchanged.
|
|
30
|
+
|
|
31
|
+
Error codes, result shapes, Git operations, review confirmation, cleanup decisions, and persisted schemas remain independent of translated text. Plugin-owned messages are translated at their source. Paths, branches, user-written titles and summaries, identifiers, and raw Git/filesystem/carrier error details are not translated.
|
|
32
|
+
|
|
33
|
+
## Catalogs and contributions
|
|
34
|
+
|
|
35
|
+
- `src/i18n/core.ts`: supported languages, normalization, typed keys and interpolation.
|
|
36
|
+
- `src/i18n/client-messages.ts`: plugin-owned Client messages.
|
|
37
|
+
- `src/i18n/host-messages.ts`: Host messages.
|
|
38
|
+
- `src/i18n/transport-messages.ts`: Client transport diagnostics.
|
|
39
|
+
- `src/client/i18n.tsx`: DSH Client locale bridge.
|
|
40
|
+
- `src/i18n/host.ts`: Host settings lookup and invocation scope.
|
|
41
|
+
|
|
42
|
+
Every entry has both `zh` and `en`. Preserve the meaning of existing Chinese copy and use matching named `{placeholder}` parameters in both languages. Insert dynamic values through parameters rather than constructing translation keys or translating user content. The typed translator checks keys and required parameters; tests verify language behavior and catalog agreement.
|
|
43
|
+
|
|
44
|
+
When adding a message, classify it first: plugin-owned UI (including accessibility text), official-derived UI, Host user message, model-facing instruction, or developer-only log. Keep the official UI's locale mechanism and source-version/hash validation intact. Comments, development logs, and machine-readable values are not UI translation targets.
|
|
45
|
+
|
|
46
|
+
## Source inventory
|
|
47
|
+
|
|
48
|
+
The initial extraction contains 380 Client entries, 364 Host entries, and 2 transport entries. Counts are informational, not stable identifiers.
|
|
49
|
+
|
|
50
|
+
| Category | Covered sources / handling |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| Plugin Client UI | Create/review tool rows, pre-session toggle, target status/actions, manager, review/preview/preflight/recovery panels, sidebar/task labels, tooltips, placeholders, accessibility labels, and operation feedback |
|
|
53
|
+
| Official-derived UI | Upstream Workspace locale remains in place; plugin augmentation is localized, source version and SHA-256 checks retained |
|
|
54
|
+
| Host user messages | Session checkout domain and Apply engine, Console control plane/projection/Diff/errors, Git/files/registry adapters, tools and `/worktree` output |
|
|
55
|
+
| Shared metadata | Bilingual tool/command registration and generic presentation titles; no request-local state stored in shared registrations |
|
|
56
|
+
| Non-translation data | User text, paths, branch/Session/Git IDs, error codes, persisted schemas, internal artifact labels and model protocol/context instruction text |
|
|
57
|
+
| Developer material | Code comments, maintenance scripts and raw process diagnostics are not end-user UI strings |
|
|
58
|
+
|
|
59
|
+
An AST scan after extraction finds six Chinese literal fragments outside the catalogs: five existing cleanup-reason discriminant fragments and one legacy transport codec-rejection marker. These are compatibility recognizers, not unlocalized UI output.
|
|
60
|
+
|
|
61
|
+
## Verification boundaries
|
|
62
|
+
|
|
63
|
+
Automated tests cover normalization, Chinese fallback, interpolation, Client language changes, Host async isolation, and strict Console transport compatibility, alongside existing Client and Host behavior. Type checking, build, upstream sidebar validation, and publish-integrity checks are separate gates. Mock and DOM-based component tests are not deployment or browser E2E evidence; actual Web/Docker validation, when performed, must be reported separately in the delivery report.
|
|
@@ -81,9 +81,9 @@ export function initialCommitActions(inspect, run) {
|
|
|
81
81
|
// Git prepares the HEAD update and locks HEAD plus the resolved branch. Only
|
|
82
82
|
// after rechecking under those locks may the transaction publish the commit.
|
|
83
83
|
await checked(root, ['update-ref', '--stdin'], {
|
|
84
|
-
prepare: `start
|
|
85
|
-
update HEAD ${oid} ${'0'.repeat(oid.length)}
|
|
86
|
-
prepare
|
|
84
|
+
prepare: `start
|
|
85
|
+
update HEAD ${oid} ${'0'.repeat(oid.length)}
|
|
86
|
+
prepare
|
|
87
87
|
`,
|
|
88
88
|
async beforeCommit() {
|
|
89
89
|
const locked = await preflightInitialCommit(root);
|
|
@@ -3,6 +3,14 @@ import { lstat, readFile, realpath } from 'node:fs/promises';
|
|
|
3
3
|
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
4
4
|
import { assertSkillPath, assertSkillTree } from './project-skills.js';
|
|
5
5
|
const NAME = 'worktree-project-claude';
|
|
6
|
+
/** DSH 0.1 exposed `candidate.path`; DSH 0.2 keeps it inside `locator`. */
|
|
7
|
+
function candidatePath(candidate) {
|
|
8
|
+
const locator = candidate.locator;
|
|
9
|
+
if (typeof locator?.path === 'string')
|
|
10
|
+
return locator.path;
|
|
11
|
+
const legacyPath = candidate.path;
|
|
12
|
+
return typeof legacyPath === 'string' ? legacyPath : undefined;
|
|
13
|
+
}
|
|
6
14
|
/** Resolve against host-owned records, never a root claimed by a Skill file. */
|
|
7
15
|
export function managedSkillRoot(registry) {
|
|
8
16
|
return async (cwd) => {
|
|
@@ -84,9 +92,10 @@ export class ClaudeProjectSkillProvider {
|
|
|
84
92
|
const candidates = Array.isArray(observation) ? observation : observation.candidates;
|
|
85
93
|
const result = [];
|
|
86
94
|
for (const candidate of candidates) {
|
|
87
|
-
|
|
95
|
+
const candidateFile = candidatePath(candidate);
|
|
96
|
+
if (!candidateFile)
|
|
88
97
|
continue;
|
|
89
|
-
const path = relative(root,
|
|
98
|
+
const path = relative(root, candidateFile).split('\\').join('/');
|
|
90
99
|
await assertSkillPath(root, path);
|
|
91
100
|
result.push({ ...candidate, provider: NAME, source: 'project-claude', rank: 250, locator: { root, candidate } });
|
|
92
101
|
}
|
|
@@ -100,10 +109,11 @@ export class ClaudeProjectSkillProvider {
|
|
|
100
109
|
return undefined;
|
|
101
110
|
const root = await this.resolveRoot(options.cwd);
|
|
102
111
|
const locator = candidate.locator;
|
|
103
|
-
|
|
112
|
+
const candidateFile = locator?.candidate ? candidatePath(locator.candidate) : undefined;
|
|
113
|
+
if (!root || locator?.root !== root || !candidateFile)
|
|
104
114
|
return undefined;
|
|
105
115
|
await assertSkillTree(root, '.claude/skills');
|
|
106
|
-
await assertSkillPath(root, relative(root,
|
|
116
|
+
await assertSkillPath(root, relative(root, candidateFile).split('\\').join('/'));
|
|
107
117
|
const skill = await (await this.provider(root)).get(locator.candidate, options);
|
|
108
118
|
return skill ? { ...skill, provider: NAME, source: 'project-claude' } : undefined;
|
|
109
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-skill-provider.js","sourceRoot":"","sources":["../../src/adapters/project-skill-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAE3E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEtE,MAAM,IAAI,GAAG,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"project-skill-provider.js","sourceRoot":"","sources":["../../src/adapters/project-skill-provider.ts"],"names":[],"mappings":"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"}
|