dsh-composer-plus 1.13.0 → 1.14.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/README.de.md +65 -11
- package/README.es.md +65 -11
- package/README.fr.md +65 -11
- package/README.hi.md +65 -11
- package/README.id.md +65 -11
- package/README.ja.md +65 -11
- package/README.ko.md +65 -11
- package/README.md +65 -11
- package/README.pt-BR.md +65 -11
- package/README.ru.md +65 -11
- package/README.tr.md +65 -11
- package/README.vi.md +65 -11
- package/README.zh.md +65 -11
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1222 -222
- package/index.js +1414 -52
- package/package.json +2 -2
- package/tether/gateway/server.mjs +3 -2
package/README.zh.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="装有 Composer Plus 的 DeepSeek Harness:正在运行的项目在侧边栏中显示加载图标,改动面板显示 git diff"></p>
|
|
16
16
|
|
|
17
|
-
这是非官方的社区插件。插件只在检查更新时访问网络(GitHub releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词**
|
|
17
|
+
这是非官方的社区插件。插件只在检查更新时访问网络(GitHub releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词** 才会调用模型。**目标检查**(默认开启)在智能体每次于自动轮次中把 `/goal` 标记为完成时调用一次模型。**手机连接**(默认关闭)只有在你开启后,才会接受来自本地网络或 tailnet 的 iPhone 连接。
|
|
18
18
|
|
|
19
19
|
## 安装
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
然后重启 dsh。(CLI 无法安装到桌面版 profile 中;桌面版 profile 由应用自己管理。)
|
|
31
31
|
|
|
32
|
-
> dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.
|
|
32
|
+
> dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.14.0`。
|
|
33
33
|
|
|
34
34
|
## 功能
|
|
35
35
|
|
|
@@ -37,8 +37,8 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
37
37
|
|
|
38
38
|
| 功能 | 使用方法 | 截图 |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **改动面板** | <a id="feature-changespanel"></a>右侧边栏 → `+` → **改动**。选择 **未提交**、**未暂存**、**已暂存** 或 **分支**,即可查看有改动的文件及其 `+/-` 行数;点击某个文件可查看它的差异。**上一轮** 会打开 dsh 自带的最近一轮改动审阅。点击分支名(或选择 **树**)即可查看分支树:点击上方的分支会跳到该分支,点击提交可查看它的文件及差异。**本对话** 只列出当前对话的文件工具(write、edit)在所有轮次中写入的文件,以及从第一条消息起的总差异。**␣** 按钮可隐藏空白改动(`git diff -w
|
|
41
|
-
| **功能创意** | <a id="feature-featureideas"></a>右侧边栏 → `+` → **功能创意** → **推荐功能**。对话自己的模型会读取对话所属项目的简短概要(顶层文件、README
|
|
40
|
+
| **改动面板** | <a id="feature-changespanel"></a>右侧边栏 → `+` → **改动**。选择 **未提交**、**未暂存**、**已暂存** 或 **分支**,即可查看有改动的文件及其 `+/-` 行数;点击某个文件可查看它的差异。**上一轮** 会打开 dsh 自带的最近一轮改动审阅。点击分支名(或选择 **树**)即可查看分支树:点击上方的分支会跳到该分支,点击提交可查看它的文件及差异。**本对话** 只列出当前对话的文件工具(write、edit)在所有轮次中写入的文件,以及从第一条消息起的总差异。**␣** 按钮可隐藏空白改动(`git diff -w`):仅缩进或换行符改变的行不显示。文件的 **…** 菜单 → **改动此文件的对话** 会列出同一仓库中用写入或编辑工具改动过该文件的对话(最新的在前)以及对应的请求;点击即可打开该对话并定位到那条请求。 | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="截图:改动面板"></a> |
|
|
41
|
+
| **功能创意** | <a id="feature-featureideas"></a>右侧边栏 → `+` → **功能创意** → **推荐功能**。对话自己的模型会读取对话所属项目的简短概要(顶层文件、README 和清单文件的开头部分、README 其余部分的大纲、最近提交的标题),并推荐最多 8 个功能。这些功能以一叠卡片的形式显示,语言与 dsh 的界面语言一致。向右滑动卡片(或点击 **✓**,或按 `→`;无论哪种方式,卡片都会飞向对应的一侧),即可在同一项目中新建对话:新对话以计划模式启动,并把该创意作为请求,因此在你批准计划之前不会有任何改动。要跳过计划,请点击 **▶ 直接实现**(或按 `↑`;卡片会向上飞出):新对话会立即启动,并把该创意作为普通请求,模型会做出改动并运行检查(审批照常适用)。向左滑动(或点击 **✕**,或按 `←`)可跳过;**撤销**(或按 `Z`)可找回跳过的卡片。点击 **↓**(或按 `↓`)可把好的创意留到以后:它会进入项目的 **稍后** 列表,同一项目文件夹中的每个对话都会显示这个列表(重启后也一样)。**稍后(N)** 会打开这个列表;**规划** 会为该创意启动同样的计划模式对话,**直接实现** 则启动不做规划的对话,两者都会把它从列表中移除;**全部合并规划(N)** 会为列表中的所有创意启动一个计划模式对话,因此共同的部分只需规划一次;**从列表中移除** 会删除它。**复制为清单** 会把整个列表以 Markdown 清单的形式复制到剪贴板(`- [ ] Title — Summary`,每个创意一行),可用于问题跟踪器或 TODO 文件;它不会发起任何网络请求。在某个创意上点击 **创建 GitHub issue**,会用你自己的 GitHub CLI(`gh`)登录,在项目的 GitHub 仓库中以该创意的标题和概要(以及理由)创建 issue;之后创意旁会显示 **Issue #N** 链接,点击即可打开该 issue。**更多创意** 会添加更多卡片。如果只想获得某一方面的创意,请在 **推荐功能** 旁边的输入框中输入一个简短的 **关注主题**(最多 80 个字符;按 `Enter` 也会开始推荐),或点击输入框下方的某个固定主题:**性能**、**无障碍**、**测试**、**安全**、**易用性** 或 **文档**(再次点击可清除)。之后,模型只会推荐与该主题相关的功能;输入框为空表示不限主题。同一项目中不会重复推荐同一个创意:每个推荐过的创意(跳过的、留到以后的或已开始的)都会进入项目的 **历史**,模型会被告知不要再推荐这些创意,标题重复的创意会被丢弃。**历史** 会列出这些创意,并标为 **已开始** 或 **已建议**;**忘记**(或 **全部忘记**)可让某个创意再次出现;仍在 **稍后** 列表中的创意不会被推荐,直到你从该列表中移除它。只有在你点击时才会调用模型。 | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="截图:功能创意"></a> |
|
|
42
42
|
| **内容搜索** | <a id="feature-contentsearch"></a>dsh 自带的侧边栏搜索(**工作区** 旁边的放大镜;桌面应用中按 `Cmd+K`,浏览器中按 `Cmd+Alt+K`)不仅能按标题查找对话,还能按你的消息和回复中的词语查找对话,并在对话下方显示匹配的文字。dsh 本身已经带有这个搜索功能,但默认是关闭的;本功能会开启它,并在你的电脑上为它提供一个搜索索引文件。每次启动后的第一次搜索会创建索引(250 个对话约需 15 秒,见“限制”),之后的启动会继续使用这个索引。默认开启;更改在重启 dsh 后生效。 | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="截图:内容搜索"></a> |
|
|
43
43
|
| **回合回退** | <a id="feature-turnrollback"></a>将鼠标悬停在你的某条消息上,点击 **↶**(在“复制”旁边)。**仅对话** 会把这条消息及其后的所有内容(回复、工具调用)从对话和模型上下文中移除,并把这条消息放回输入框:修改后再次发送即可。**对话和文件** 会先列出这条消息之后发生变化的项目文件,然后把它们也恢复原样。这也包括命令(`bash`)所做的更改,而不只是 dsh 编辑工具所做的更改。正在运行的回合会先停止。对话日志永远不会被重写:一个隐藏标记会隐藏被撤回的部分,方式与 dsh 自带的 `/compact` 隐藏旧消息相同。如果安装了 [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin),则由它负责这项工作,Composer Plus 不会再显示第二个按钮。回退之后,输入框上方会出现 **重新应用** 栏:它会从回退之前开始一个新对话(消息和上下文相同),选择 **对话和文件** 时还会恢复文件;回退之后你更改过的文件会被列出并保留,除非你勾选覆盖它的选项。 | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="截图:回合回退"></a> |
|
|
44
44
|
| **删除对话** | <a id="feature-deletechat"></a>侧边栏 → 对话的 **…** 菜单(或右键点击)→ **删除…** → **删除**。dsh 本身只能归档。对话会停止(包括它的回合、后台任务、子代理和定时任务,与 dsh 自带的归档相同),它保存的历史记录连同子代理对话会移到 macOS 废纸篓(在其他系统上为 `$DSH_HOME/trash`)。要找回它,请把文件夹放回原处并重启 dsh:它会显示在侧边栏的 **仅显示已归档** 视图中。 | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="截图:删除对话"></a> |
|
|
@@ -55,11 +55,16 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
55
55
|
| **将对话导出为 Markdown** | <a id="feature-exportmarkdown"></a>在侧边栏中右键点击对话(或打开它的 **…** 菜单)→ **导出为 Markdown…**。对话框会显示该对话有多少条消息;**复制到剪贴板** 会把对话以 Markdown 格式复制,**保存 .md 文件** 会通过浏览器的下载功能把它保存为 `<chat title>.md`(dsh 桌面版:按你的系统设置,保存到“下载”文件夹或打开保存对话框)。文件包含对话标题、项目名称和日期,之后每条消息各有一个 `## 你` 或 `## 助手` 部分。代码块保持原样;如果某条消息中的代码块没有闭合,它会被闭合。 | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="截图:将对话导出为 Markdown"></a> |
|
|
56
56
|
| **复制项目路径** | <a id="feature-copyprojectpath"></a>在侧边栏中右键点击项目 → **复制路径**,即可复制它的文件夹的完整路径。 | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="截图:复制项目路径"></a> |
|
|
57
57
|
| **新对话中的项目搜索** | <a id="feature-projectpicker"></a>新对话 → 输入框上方的项目按钮。项目按 A–Z 顺序显示,顶部有 **搜索项目** 框。输入名称的一部分(不区分大小写和重音符号),按 `Enter` 即可选择第一个匹配项。没有匹配项时会显示 **没有匹配的项目**。侧边栏中 dsh 保存的项目顺序不会改变。 | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="截图:新对话中的项目搜索"></a> |
|
|
58
|
+
| **新会话的默认工作区** | <a id="feature-defaultworkspace"></a>设置 → Composer Plus → **新会话的默认工作区** → **新会话打开于**:选择一个项目,或选择 **通用文件夹(default-workspace)**(默认值:dsh 自己的文件夹 `Documents/deepseek-harness/default-workspace`,首次使用时创建)。之后,侧边栏顶部的 **新会话**(及其快捷键)总是在那里打开新对话,即使另一个项目的对话正在打开也是如此。项目旁的 `+` 仍会打开该项目,新对话中输入框上方的项目按钮仍可更换项目。 | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="截图:新会话的默认工作区"></a> |
|
|
59
|
+
| **在对话中查找** | <a id="feature-findinchat"></a>在对话中按 `Cmd+F`(Mac)或 `Ctrl+F`(Windows 和 Linux),对话上方会打开查找框。输入词语后,屏幕上的消息和回复中所有匹配项都会高亮,当前匹配项颜色更深,查找框显示 **n / 总数**。`Enter` 或 `↓` 跳到下一个匹配项,`Shift+Enter` 或 `↑` 跳到上一个(也可用箭头按钮);对话会把匹配项滚动到中间。不区分大小写、重音和土耳其语无点 ı。`Esc` 关闭查找框,并把光标放回原处。回复流式输出时,查找结果会随之更新。 | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="截图:在对话中查找"></a> |
|
|
60
|
+
| **每个对话一个分支** | <a id="feature-worktreechats"></a>新对话 → 项目按钮旁边的 ⑂ main 按钮 → **新分支**,然后输入第一条消息并发送。AI 根据这条消息给分支命名(`feat/…`、`fix/…`),Composer Plus 在 `<项目>/.worktrees/` 中为它创建 git worktree,复制 `.worktreeinclude` 列出的被忽略文件(例如 `.env` 和 `node_modules/`),并在那里打开一个带有你消息的新对话。打开的对话标题栏显示 ⑂ 分支 · N 处改动 · ↑ ↓(或 **未推送**);点击它打开 **改动**。同一菜单列出已打开的 worktree:选择一个即可在其中开始对话。要在侧边栏中把分支文件夹显示在其项目内,请选择 dsh 的 **视图选项** → **按工作区树**。 | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="截图:每个对话一个分支"></a> |
|
|
58
61
|
| **下一条消息预测** | <a id="feature-nextprediction"></a>默认开启;可在 **设置 → Composer Plus** 中关闭。智能体完成一个回合后(被停止或失败的回合除外),空输入框会以灰色文字显示对你下一条消息的猜测,并带有 **按 Tab 接受** 提示。`Tab` 会把文字放入输入框,但不会发送。`Esc` 会在本回合隐藏它。开始输入也会隐藏它,新的回合会替换它。开关下方的 **模型** 菜单列出 dsh 自己的模型(与 dsh 模型菜单的列表相同)。默认选中 **dsh 默认**,它跟随 dsh 的默认模型。每完成一个回合会进行一次简短的模型调用。在 Tether 中,猜测显示在空输入框上方:轻点它即可放入输入框。 | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="截图:下一条消息预测"></a> |
|
|
59
62
|
| **输入时补全** | <a id="feature-typingcompletion"></a>默认关闭;可在 **设置 → Composer Plus** 中开启。输入时,光标后紧跟的灰色文字会显示你的消息可能的后续内容。`Tab` 会把它添加到消息中,但不会发送。`Esc` 会隐藏它。它只建议你自己接下来要写的话:不会回答你,也不会编造错误信息或名称。消息看起来已完整,或模型不确定时,不显示任何内容。继续输入灰色文字中接下来的字符时,它会保留,不会再次调用模型。它的开关下方有自己的 **模型** 菜单。第一项 **与“下一条消息预测”相同**(默认)使用 **下一条消息预测** 的模型;选择其他模型,就可以为每个功能使用不同的模型,例如为补全选择更快的模型。你每次输入停顿时,它都会调用一次模型,因此消耗的 token 比预测多得多:请选择快速、低成本的模型。输入斜杠命令、消息中带有文件标签,或光标不在末尾时,它不会运行。在 Tether 中,输入时剩余部分会显示在输入框上方:轻点它即可添加。 | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="截图:输入时补全"></a> |
|
|
60
63
|
| **优化提示词** | <a id="feature-promptimprove"></a>输入一个粗略的请求,然后点击模型菜单旁边的魔法棒(**优化提示词**)。一次模型调用会把它改写成更清晰的提示词:先写目标,有多个部分时列出简短的编号步骤,并写明要运行的检查。它会读取此对话(已回滚的消息除外)、项目的 README、AGENTS.md 和清单文件、已更改的文件以及文件名与你的用词匹配的文件,并保留你的语言。它从不编造文件名。新文本会替换你的草稿,但不会发送:阅读、修改后再按 `Enter`。`Cmd/Ctrl+Z` 一步即可恢复你的原文,该按钮(**撤销优化**)也可以。如果你在它处理时继续输入,你的新文本会保留。`Esc` 或再次点击可取消。它在设置中有自己的 **模型** 菜单(默认:**与对话的模型相同**)。不适用于斜杠命令或带文件标签的消息。在 Tether 中,魔法棒位于输入框旁边。 | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="截图:优化提示词"></a> |
|
|
64
|
+
| **目标检查** | <a id="feature-goalcheck"></a>用 `/goal` 开始一个目标。当智能体在自动轮次中把目标标记为完成时,目标要通过两项检查才会关闭。首先,项目的测试命令会在对话的文件夹中、按对话的沙箱模式运行。命令是你自己设置的,或者从 `package.json`、`Makefile`、`Cargo.toml`、`go.mod` 或 pytest 中找到的。如果智能体自己最新的一步就是该测试的成功运行,则不再重复运行。然后,一次不带工具的独立模型调用会阅读目标、此对话、`git status` 和测试结果。任一检查失败时,目标保持进行中,智能体会看到原因,下一轮继续。目标栏下方的一行(**目标检查**)显示测试和上次结果。**编辑** 可设置你自己的测试命令以及时间或 token 上限;超过上限时目标会变为受阻。**立即运行** 会运行检查但不关闭目标。它在设置中有自己的 **模型** 菜单(默认:**与对话的模型相同**)。你自己完成目标时,不做任何检查。 | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="截图:目标检查"></a> |
|
|
61
65
|
| **本对话内允许** | <a id="feature-allowforchat"></a>当 Auto Review 询问你时,审批卡片上会多出 **本对话内允许**:从此以后,同一对话中的同一工具都会被允许,参数不限,直到时限结束(默认 1 小时;可在 **设置 → Composer Plus → 本对话内允许** 中选择)。之后代理会再次询问。标题栏中的标签会列出这些授权及其结束时间,也可以撤销它们。授权在重启后仍然有效。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="截图:本对话内允许"></a> |
|
|
62
66
|
| **项目状态** | <a id="feature-projectstatus"></a>侧边栏中的项目行会显示与其对话相同的加载图标 / 等待 / 完成标记。因此,即使项目已折叠,你也能知道其中有对话正在运行或需要你处理。等待你处理的对话优先显示,其次是你尚未打开的已完成对话(绿色圆点,即使另一个对话仍在运行也会显示),最后是加载图标。将鼠标悬停在上面可查看详情。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:项目状态"></a> |
|
|
67
|
+
| **对话行显示 Git 分支** | <a id="feature-sessionbranch"></a>侧边栏中的每个对话行会显示一个小的灰色标签,内容是该对话最后一轮时项目文件夹所在的 git 分支(例如 `main` 或 `feature/login`;分离的 HEAD 会在括号中显示短提交 ID)。同一项目中位于不同分支的两个对话不再看起来一样,你也能立即发现自己是否要在错误的分支上继续对话。将鼠标悬停在标签上可查看完整名称。Host 部分会在每轮开始和结束时读取分支(`git branch --show-current`,只读);安装后还没有新一轮的对话,或不是 git 仓库的文件夹,不会显示标签。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="截图:对话行显示 Git 分支"></a> |
|
|
63
68
|
| **全部标为已读** | <a id="feature-markprojectread"></a>在侧边栏中,点击项目的 **…** 按钮 → **全部标为已读**。该项目中所有对话的绿色未读圆点会立即消失;其他项目的圆点保持不变。项目中没有未读对话时,此项显示为灰色(**没有未读对话**)。 | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="截图:全部标为已读"></a> |
|
|
64
69
|
| **活跃项目置顶** | <a id="feature-activeprojectsfirst"></a>当某个对话开始运行或需要你处理时,它所在的项目会移到侧边栏顶部,并使用 dsh 自带的行动画(与把它拖到那里的效果相同)。已完成的项目保持原位;你可以像往常一样把它们拖到任意位置。移动会保存到 dsh 的项目顺序中,因此关闭此功能后会保留当前顺序。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:活跃项目置顶"></a> |
|
|
65
70
|
| **近期项目筛选** | <a id="feature-recentprojects"></a>侧边栏 → 视图选项(滑块图标)→ **最近 2 小时内活跃**。选中后,侧边栏只显示最近 2 小时内有活跃对话的项目。活跃对话包括:这段时间内更新过的对话、正在运行或等待中的对话、当前打开的对话,以及你尚未打开的已完成对话(dsh 的绿色“完成”圆点),超过 2 小时后也一样。没有这类对话的项目会被隐藏,新建的空项目也会被隐藏。再次选择该项即可显示所有项目。这个选择保存在本设备上。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="截图:近期项目筛选"></a> |
|
|
@@ -67,7 +72,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
67
72
|
| **按状态排序** | <a id="feature-statusorder"></a>侧边栏 → 视图选项 → **排序方式** → **按状态**(配合 **单列表** 使用)。已完成的对话排在最前(即带 dsh “完成”圆点的对话,以出错结束的回合也会显示这个圆点),然后是正在运行或等待中的对话,再然后是带有活跃自动化任务(Schedule)的对话,其余对话按 dsh 的顺序排列。打开已完成的对话后,它会往下移。只有视图会改变:选择 **手动排序** 或 **最近更新** 即可恢复。 | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="截图:按状态排序"></a> |
|
|
68
73
|
| **后台通知** | <a id="feature-notifications"></a>dsh 在后台时,如果回合完成(通知显示回复的第一行),或对话确实在等你处理,你都会收到通知。等你处理的情况包括:审批(显示工具名称)、回答(显示问题)或计划审阅。请求必须在 1.5 秒后仍未处理,才会发出通知,因此被自动处理的审批(Auto Review 授权、其他插件)不会发出通知;请求一旦得到处理,对应的通知也会立即撤回。程序坞/任务栏角标会显示等待中的对话数量。点击通知会打开对应的对话。 | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="截图:后台通知"></a> |
|
|
69
74
|
| **应用语言** | <a id="feature-language"></a>设置 → Composer Plus → **应用语言** 可以把整个 dsh 界面切换为 Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt 或 हिन्दी(见下文)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="截图:应用语言"></a> |
|
|
70
|
-
| **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether
|
|
75
|
+
| **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether:没有它,相机无法打开这个二维码。手机可以显示你的对话、发送消息(可附照片:输入框的 **+** → Camera、Photos 或 Paste image)、回答审批和问题,以及切换模型和智能体。你可以配对任意多台 Mac:点击应用左上角的 Mac 名称即可在它们之间切换。**手机连接** 面板会列出已配对的 iPhone 及其上次连接时间:点击 **Remove** 可立即断开其中一部。“Tailscale only”会拒绝来自本地网络的连接(适用于共享 Wi-Fi),访问日志会显示谁尝试过连接。在 Tether 中,“Settings → Privacy”可以用 Face ID 锁定应用。 | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="截图:手机连接(iPhone)"></a> |
|
|
71
76
|
| **自动更新** | <a id="feature-autoupdate"></a>dsh 启动时,插件会检查 [最新的 GitHub release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)。如果它比当前版本新,并且已发布到 npm,插件会通过 dsh 自带的插件管理器(与 设置 → 插件 相同的途径)安装这个确切的版本,并通知你。重启 dsh 即可加载新版本。**设置 → Composer Plus → Composer Plus 更新** 会显示版本号,并提供 **检查更新** / **立即更新**。dsh 第一次以新版本启动时,会显示一次 **Composer Plus N 的新功能** 窗口,内容是该版本的发布说明(来自同一次更新检查,不会额外联网);点击 **关闭** 或按 `Esc` 关闭。 | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="截图:自动更新"></a> |
|
|
72
77
|
|
|
73
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -76,7 +81,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
76
81
|
|
|
77
82
|
## 设置
|
|
78
83
|
|
|
79
|
-
每项功能都可以单独开启或关闭:dsh **设置 → Composer Plus**。每一行都有一张小截图:将鼠标悬停在上面可查看放大的预览,点击可按原尺寸打开(按 `Esc` 关闭)。顶部的 **搜索功能** 框会按名称或描述筛选页面(支持任何语言,不区分大小写和重音符号);按 `Esc` 可清空。每一行都有一个开关和一段简短说明;更改会立即生效,不需要重启,并会保存在该设备上。行名后面的小 **?** 会打开 README 中介绍该功能的部分,使用与 dsh 界面语言相同的 README。除 **手机连接**、**重启后继续** 和 **输入时补全** 外,所有功能默认开启。这三项以及
|
|
84
|
+
每项功能都可以单独开启或关闭:dsh **设置 → Composer Plus**。每一行都有一张小截图:将鼠标悬停在上面可查看放大的预览,点击可按原尺寸打开(按 `Esc` 关闭)。顶部的 **搜索功能** 框会按名称或描述筛选页面(支持任何语言,不区分大小写和重音符号);按 `Esc` 可清空。每一行都有一个开关和一段简短说明;更改会立即生效,不需要重启,并会保存在该设备上。行名后面的小 **?** 会打开 README 中介绍该功能的部分,使用与 dsh 界面语言相同的 README。除 **手机连接**、**重启后继续** 和 **输入时补全** 外,所有功能默认开启。这三项以及 **内容搜索**、**回合回退**、**下一条消息预测** 和 **目标检查** 的开关由 dsh 的 Host 保存,因此它们对每个窗口都有效,并在重启后保留。**下一条消息预测**、**输入时补全**、**优化提示词** 和 **目标检查** 的 **模型** 选择也由 Host 保存(**输入时补全** 默认 **与“下一条消息预测”相同**,**优化提示词** 和 **目标检查** 默认 **与对话的模型相同**);**本对话内允许** 的 **时限**(默认 1 小时)也由 Host 保存。**内容搜索** 只有在重启 dsh 后才会改变(dsh 在启动时读取它);在此之前,它所在的行会显示 **重启 dsh 后此更改生效。**
|
|
80
85
|
|
|
81
86
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="设置 → Composer Plus:功能搜索、语言选择器、更新行和每项功能的开关,悬停时显示截图预览"></p>
|
|
82
87
|
|
|
@@ -90,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
90
95
|
|
|
91
96
|
整个应用会立即切换语言。这个选择保存在 dsh 自己的 `locale.preference` 中(与 通用设置 → 语言 是同一个设置),因此重启后依然有效。**系统语言** 会清除这个选择:桌面应用跟随操作系统语言,网页版跟随浏览器语言,不支持的语言会回退为英语。安装插件绝不会覆盖你已经选择的语言。
|
|
92
97
|
|
|
93
|
-
每个语言包有 3,
|
|
98
|
+
每个语言包有 3,280 条文本:dsh `0.2.0-rc.2` 和 `0.2.1-rc.2` 的全部界面文本(对话、侧边栏、设置、审批、自动化任务、文件预览、插件管理器、插件市场)、插件自己的控件,以及常用的 [dsh-rewind](https://github.com/SiriLee/dsh-rewind) 插件。以下内容不会翻译:你的消息、模型输出、代码、斜杠命令名称(`/plan`、`/compact`)、由提供商定义的标签(例如推理强度 `High`)、其他插件的文本,以及桌面应用的原生菜单和更新对话框(dsh 只提供这些内容的英文和中文版本)。较新版本的 dsh 新增的字符串,在语言包更新之前会以英文显示。如果其他插件已经提供了某种语言,该语言仍由那个插件提供。
|
|
94
99
|
|
|
95
100
|
## 键盘快捷键
|
|
96
101
|
|
|
@@ -110,6 +115,12 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
110
115
|
| `Tab` | 显示预测的空输入框 | 把预测放入输入框 |
|
|
111
116
|
| `Tab` | 光标后的灰色补全 | 把补全添加到消息中 |
|
|
112
117
|
| `Esc` | 显示预测的空输入框 | 隐藏预测 |
|
|
118
|
+
| `Cmd/Ctrl+Z` | 使用 **优化提示词** 后的输入框 | 恢复你输入的文本 |
|
|
119
|
+
| `Esc` | **优化提示词** 运行时的输入框 | 取消优化 |
|
|
120
|
+
| `Enter` / `Esc` | 你双击的排队消息 | 保存 / 取消编辑 |
|
|
121
|
+
| Mac 上为 `Cmd+F`,Windows 和 Linux 上为 `Ctrl+F` | 打开的对话 | 打开 **在对话中查找** |
|
|
122
|
+
| `Enter` / `Shift+Enter`、`↓` / `↑` | **在对话中查找** 框 | 下一个 / 上一个匹配项 |
|
|
123
|
+
| `Esc` | **在对话中查找** 框 | 关闭查找框 |
|
|
113
124
|
|
|
114
125
|
打开的 `/` 或 `@` 菜单会自己占用这些按键。
|
|
115
126
|
|
|
@@ -122,10 +133,14 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
122
133
|
- **继续:** 经过身份验证的本地接口只会恢复最后一个被中断的回合,会拒绝过期或重复的请求,并保留现有的审批钩子。它不会发送新的用户消息。
|
|
123
134
|
- **重启后继续:** 在你开启之前一直关闭。Host 端只在 `$DSH_HOME/storages/dsh-composer-plus/resume.json`(仅所有者可访问)中保存对话 ID 和开始时间,任何数据都不会离开你的电脑。只有当 dsh 自己的日志表明是 dsh(而不是你)停止了最后一个回合时,它才会继续该对话。审批和 Auto Review 照常适用于继续的回合。
|
|
124
135
|
|
|
125
|
-
- **改动面板:** git 在你的电脑上、在对话自己的文件夹中以只读方式运行,并通过 dsh 经过身份验证的 `/api` 通道调用。它从不提交、暂存或拉取,只显示 git
|
|
126
|
-
- **功能创意:** 在你点击 **推荐功能** 之前,什么都不会运行。点击后,Host 端只读取对话自己的文件夹(浏览器从不发送路径):顶层条目的名称,README、AGENTS.md 和清单文件(`package.json`、`pyproject.toml`、`Cargo.toml`、`go.mod` 等)的前 6 kB
|
|
136
|
+
- **改动面板:** git 在你的电脑上、在对话自己的文件夹中以只读方式运行,并通过 dsh 经过身份验证的 `/api` 通道调用。它从不提交、暂存或拉取,只显示 git 自己列出的路径。树最多列出 1000 个本地和远程分支,每个分支最多显示最新的 300 个提交:只沿第一父提交,合并提交代表它带入的提交。它从不切换(checkout)分支。**本对话** 会读取对话自己的日志,找出它的文件工具写入的文件,并在一个会立即删除的临时文件夹中,把它们与该对话的回合回退快照进行比较;它不会向你的仓库或快照存储写入任何内容。
|
|
137
|
+
- **功能创意:** 在你点击 **推荐功能** 之前,什么都不会运行。点击后,Host 端只读取对话自己的文件夹(浏览器从不发送路径):顶层条目的名称,README、AGENTS.md 和清单文件(`package.json`、`pyproject.toml`、`Cargo.toml`、`go.mod` 等)的前 6 kB,README 其余部分的大纲(标题、表格行、列表项,最多 6 kB),以及最近提交的标题(`git log --format=%s`,最多 6 kB),总计最多 28 kB。它会跳过 `.env*`、密钥文件和 `node_modules` 等文件夹,并且只读取位于该文件夹内的普通文件:指向文件夹外部的符号链接、FIFO 或设备文件都会被跳过。这份概要会通过 dsh 自己的提供商设置,以一次请求的形式发送给对话所用的模型;它不会被添加到任何对话中。项目中的任何内容都不会被写入。向右滑动的创意会以计划模式新建对话,因此审批和计划审阅照常适用。**直接实现** 不使用计划模式启动对话:模型可以立即修改文件,对话平常的审批和 Auto Review 照常适用。留到以后的创意(标题、概要、理由、工作量)会与项目的文件夹路径一起,保存在 dsh home 下的 `storages/dsh-composer-plus/later.json` 中(仅所有者可访问的文件);不会向项目写入任何内容。推荐过的创意的历史(标题、概要、理由、工作量、日期、是否已启动)也以同样方式保存在 `storages/dsh-composer-plus/idea-history.json` 中,每个项目最多 200 条(最早的先被移除);该项目下次 **推荐功能** 时,这些标题会发送给模型。
|
|
127
138
|
- **内容搜索:** 没有新的代码来搜索你的对话:插件只是开启 dsh 自带的消息索引(SQLite FTS5,`dsh-session-query-sqlite`),并为它提供一个文件 `$DSH_HOME/cache/composer-plus/session-search.db`(文件和文件夹仅所有者可访问)。这个文件包含你的用户消息和助手消息的文本,因此它的私密程度与 `$DSH_HOME/sessions` 中的对话日志相同。任何数据都不会离开你的电脑。它是 dsh 可以重新生成的副本:你可以在 dsh 关闭时删除它。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/content-search.json` 中。
|
|
128
139
|
- **回合回退:** 在你发送每条消息之前,Host 会在它自己的存储 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(仅所有者可访问的文件夹)中,为对话的文件夹创建一个 git 快照。快照保存该文件夹中 git 能看到的文件(不包括被忽略的文件)的副本,因此它的私密程度与项目相同。它会读取你仓库中的对象(不会再复制一份 git 已有的内容),并且从不写入你仓库的索引、`HEAD`、分支、标签、stash 或配置;git 在你的仓库中做出的唯一更改,是更新它复用的对象文件的时间戳(这会推迟 `git gc` 对这些文件的清理)。带文件的回退只会写入对话文件夹内的普通文件;它会跳过符号链接、管道以及文件夹外的任何内容。任何数据都不会离开你的电脑。你可以在 dsh 关闭时删除这个存储(此后在发送新消息之前,回退只能用于对话本身)。**删除对话** 也会删除对话的存储。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/rollback.json` 中。带文件的回退还会保留回退之前那一刻的文件(同一存储中的 `refs/r/…`),供 **重新应用** 使用;已重新应用的回退记录在 `$DSH_HOME/storages/dsh-composer-plus/redone.json` 中(仅所有者可访问)。
|
|
140
|
+
- **创建 GitHub issue**(功能创意 → **稍后** 列表):只在你点击时运行。Host 端会在对话的文件夹中运行你自己的 GitHub CLI(`gh issue create`),使用该创意保存的标题和概要(以及理由);`gh` 使用它自己的登录和该文件夹的 GitHub 远程仓库,因此 issue 会以你的账号创建在那个仓库中,能看到那个仓库的所有人都能看到它。dsh 会从它启动的命令中移除名称像令牌(token)的变量;如果你通过 `GH_TOKEN` 或 `GITHUB_TOKEN` 给 `gh` 提供了令牌,插件只把这两个变量传给 `gh`。issue 链接会与该创意一起保存在 `later.json` 中。
|
|
141
|
+
- **改动此文件的对话**(改动面板,文件的“…”菜单):Host 端按 dsh 保存的样子,读取文件夹位于同一仓库中的对话的日志,并返回每个对话的标题、时间和请求的第一行;它从不打开该文件本身。
|
|
142
|
+
- **对话行显示 Git 分支:** Host 端会在每轮开始和结束时,在对话的文件夹中运行 `git branch --show-current`(只读),并只把对话 id、分支名和时间保存在 `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` 中(仅所有者可访问的文件,最多保留最新的 2000 个对话)。开关保存在它旁边的 `branches.json` 中。
|
|
143
|
+
- **在对话中查找** 只在页面中运行:它读取页面显示的文本,不发送任何内容。
|
|
129
144
|
- **将对话导出为 Markdown:** Host 端只读取对话自己的日志(即 dsh 显示的那些消息),并把它们交给页面;它不读取任何项目文件,也不通过网络发送任何内容。Markdown 只会进入你的剪贴板或你保存的文件。
|
|
130
145
|
- **删除对话:** 把对话自己的日志文件夹(`$DSH_HOME/sessions/<project>/<chat>`)移到废纸篓。它不会触碰项目文件夹。
|
|
131
146
|
- **本对话内允许:** 授权连同授予时间一起保存在 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` 中(仅所有者可访问)。一项授权只覆盖一个对话中的一个确切工具,直到时限结束(默认 1 小时)。如果该工具可以写入,授权也覆盖任何写入操作。可以在标题栏的标签中撤销授权。
|
|
@@ -135,6 +150,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
135
150
|
- **下一条消息预测:** 默认开启;在 **设置 → Composer Plus** 中关闭它,即可停止这些模型调用。每完成一个回合,Host 端会把该对话中你自己的消息和智能体的文字回复(不含工具输出、隐藏上下文和推理内容),最多约 6,000 个字符(最新的部分),发送给所选的模型(除非你另选,否则为 dsh 的默认模型)。它通过 dsh 自己的提供商设置,以一次请求的形式发送。对话中不会保存任何内容:猜测不会被添加到对话历史中。开关和模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/predict.json` 中(仅所有者可访问的文件)。
|
|
136
151
|
- **输入时补全:** 在你开启之前一直关闭。开启后,你每次输入停顿时,Host 端会把你目前已输入的文字,以及该对话中你自己的消息和智能体的文字回复(不含工具输出、隐藏上下文和推理内容;对话部分最多约 3,000 个字符),发送给在 **输入时补全** 下选择的模型(默认为 **下一条消息预测** 的模型)。新的停顿会停止较早的请求。对话中不会保存任何内容。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/complete.json` 中(仅所有者可访问的文件)。
|
|
137
152
|
- **优化提示词:** 在你点击魔法棒之前,什么都不会运行。点击后,Host 端会以一次请求的形式,把以下内容发送给在 **优化提示词** 下选择的模型(默认为对话自己的模型):你的草稿;该对话中你自己的消息和智能体的文字回复(不含工具输出、隐藏上下文、推理内容和已回退的消息;最多约 6,000 个字符,最新的部分);与 **功能创意** 相同的项目概要(文件规则也相同:不读取 `.env*` 或密钥文件,跳过指向文件夹外部的符号链接和 FIFO);`git status` 列为已更改的路径;以及最多 30 个名称与你的草稿有相同词语的已跟踪或未跟踪(未被忽略)路径。除这份概要外,不会发送任何文件内容。对话和项目中都不会写入任何内容:回答只会替换输入框中的草稿,是否发送由你决定。模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/improve.json` 中(仅所有者可访问的文件)。
|
|
153
|
+
- **目标检查:** 只有当智能体在自动轮次中把 `/goal` 标记为完成时(或者你点击 **立即运行** 时)才会运行。Host 端在对话的文件夹中、按对话的沙箱模式运行测试命令(与 dsh 自己的 `bash` 工具相同:同样的文件访问策略;沙箱无法启动时,测试不会运行,检查判为失败)。为了找到命令,它只读取 `package.json`、`Makefile`、`Cargo.toml`、`go.mod`、`pyproject.toml` 和 `pytest.ini`,并且只读取文件夹内的普通文件(不跟随指向文件夹外部的符号链接,不读取 FIFO)。然后,它以一次不带工具的请求,把以下内容发送给在 **目标检查** 下选择的模型(默认为对话自己的模型):目标;从目标开始以来的对话(你的消息、智能体的回复、截断到 1,000 个字符的工具调用以及每个工具结果的最后 2,000 个字符;不含推理内容和已回退的步骤;最多约 60,000 个字符,最新的部分);`git status --short`;以及测试输出的末尾。工具输出可能包含智能体读取过的内容,因此这次请求可能包含你文件的一部分,与对话本身相同。对话和项目中都不会写入任何内容。你的测试命令、上限、上次结果(含其输出的末尾)和模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` 中(仅所有者可访问的文件,最新的 500 个对话)。
|
|
138
154
|
|
|
139
155
|
## 故障排除
|
|
140
156
|
|
|
@@ -149,7 +165,11 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
149
165
|
- **删除时提示另一个 dsh 已打开此对话:** 使用同一 dsh home 的另一个 dsh 持有该对话的锁。关闭那个窗口或那个 dsh,然后再次删除。在此期间,对话会保持归档状态。
|
|
150
166
|
- **开启“Tailscale only”后 iPhone 无法连接:** Mac 和 iPhone 上都必须开启 Tailscale。Mac 上的 Tailscale 关闭时,手机连接面板会发出警告。访问日志会显示每次被拒绝的尝试及其原因。
|
|
151
167
|
- **重启后对话没有继续:** dsh 退出时“重启后继续”处于关闭状态;或者你自己停止了那个回合;或者回合已经结束(完成或失败);或者对话已被归档;或者当时有超过 20 个对话正在运行(只有最新的 20 个会继续)。
|
|
152
|
-
-
|
|
168
|
+
- **创建 GitHub issue 提示“gh could not open the issue”:** 这条消息是 `gh` 自己输出的第一行。请在终端中运行 `gh auth status`,并用 `gh auth login` 登录;对话的文件夹必须有 GitHub 远程仓库(`git remote -v`)。“not installed or not on the PATH of dsh”表示 dsh 没有找到 `gh`:请安装它,或从一个能运行 `gh` 的终端启动 dsh。
|
|
169
|
+
- **对话行上没有分支标签:** 安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
|
|
170
|
+
- **目标检查显示测试以代码 127 或 “not found” 退出:** 从 Finder 或程序坞启动的 dsh 的 PATH 可能比终端里的短,因此找不到 `npm`、`pnpm` 或 `cargo`。请从终端启动 dsh,或者在 **目标检查** → **编辑** 中用完整路径设置你自己的测试命令。**立即运行** 会马上显示结果。
|
|
171
|
+
- **目标没有关闭,智能体一直在工作:** **目标检查** 发现了失败的测试或缺少的工作;目标下方的一行会显示原因(将鼠标悬停在结果上可查看详情)。请修正原因或测试命令,或者用 `/goal` 或目标栏自己完成目标(这不会被检查)。
|
|
172
|
+
- **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.14.0`),见上文的安装说明。
|
|
153
173
|
|
|
154
174
|
## 限制
|
|
155
175
|
|
|
@@ -173,14 +193,20 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
173
193
|
- **原地编辑排队消息** 打开的是 dsh 自带的队列编辑器,因此也有它的限制:带图片或文件的消息不能编辑;在此期间已经开始发送的消息不会被修改(dsh 会显示它自己的错误)。
|
|
174
194
|
- **重新应用** 从不更改被回退的对话:它会从回退之前开始一个新对话(dsh 自带的分叉,模型上下文相同),因此新对话有新的 id 和标题。只有对话中最新的一次回退可以重新应用,只能一次,并且只在它之后没有新内容时可用(发送新消息后该选项消失)。回退之后你更改过的文件会被保留,除非你勾选覆盖它的选项。重新应用需要回退时保留的快照(同样是最新 50 个快照的范围);在此版本之前做的回退,或用 **仅对话** 做的回退,只会恢复消息。
|
|
175
195
|
- **本对话** 只统计 dsh 的文件工具(`write`、`edit`、`str_replace_editor`)写入的文件。命令(`bash`)更改的文件不在这个视图中;它们显示在 **未提交** 下。如果没有该对话的回合回退快照(回合回退已关闭、安装了 dsh-rewind-plugin,或对话比插件更早),视图会与最后一次提交比较,并给出提示。回合回退为每个对话保留最新的 50 个快照:在更长的对话中,视图与保留的最早快照比较,说明从哪条消息开始,并且不计入更早的改动。**隐藏空白改动** 就是 `git diff -w`:只在行内空格上有变化的行也会被隐藏。
|
|
196
|
+
- **创建 GitHub issue** 需要 dsh 的 PATH 中有 GitHub CLI(`gh`),并且对话的文件夹中有 GitHub 远程仓库。它最多运行 60 秒;如果 `gh` 用时更长,issue 可能已经在 GitHub 上创建,但列表中没有它的链接(再次点击之前,请先到 GitHub 上查看:列表只从已完成的运行中读取链接,所以再次点击可能会创建第二个 issue)。有多个 GitHub 远程仓库的文件夹使用 `gh` 自己的默认仓库(`gh repo set-default`)。
|
|
197
|
+
- **改动此文件的对话** 与 **本对话** 一样,只识别 dsh 的文件工具(`write`、`edit`、`str_replace_editor`):命令(`bash`)做出的改动不会列出。它读取该仓库最新的 300 个对话(按创建时间),对话更多时会给出提示;它最多显示 100 行。重命名的文件按工具写入时的名称列出。文件夹在仓库之外的对话(包括通过另一条路径指向相同文件的情况)不计入。dsh 启动后第一次打开时,会读取该仓库的所有对话日志(275 个对话约需 4 秒);之后再打开时,只读取此后有变化的对话。
|
|
198
|
+
- **对话行显示 Git 分支** 显示的是对话最后一轮开始或结束时其文件夹所在的分支,而不是当前的分支:在回合之外切换分支,要到下一轮之后才会显示。此版本之前的对话,在下一轮之前不显示标签。标签放在 dsh 的对话行标记中(dsh 在那里没有插槽);如果 dsh 更新改变了这部分标记,就不会显示标签。
|
|
199
|
+
- **在对话中查找** 只搜索页面显示的内容:已加载的消息和回复(向上滚动或点击 **加载更早** 可查看更早的内容),不搜索已收起的工具步骤,也不搜索工具输出中被折叠的文本。它最多统计 2,000 个匹配项(之后显示“2000+”)。它使用浏览器的高亮 API(Chromium 105 及更高版本;桌面应用支持):在较旧的浏览器中,计数和跳转仍然可用,只是没有颜色。`Cmd+F`(Mac)或 `Ctrl+F`(Windows 和 Linux)只在屏幕上有对话时打开它;在其他地方,浏览器自带的查找照常工作。在 Mac 上,`Ctrl+F` 在文本框中仍保持 macOS 的用法(光标向前移动一个字符)。
|
|
176
200
|
- 重启前发出的通知,点击后只会把 dsh 带到前台。
|
|
177
201
|
- 活跃项目通过 dsh 保存的项目顺序来移动,因此新顺序在重启后依然保留。不属于任何项目的对话(“未分组”)无法移动;dsh 总是把它们列在最后。
|
|
178
202
|
- dsh 在侧边栏的视图选项菜单中没有扩展点,所以近期项目选项被添加到 dsh 自己的菜单中。如果 dsh 更新修改了这个菜单,该选项将不会显示,所有项目都保持可见。筛选作用于项目行,因此 **单列表** 不会被筛选。请与 **按工作区** 一起使用:在 **按工作区树** 中,被隐藏的父文件夹也会隐藏其中的活跃项目。**按状态** 也有同类限制:dsh 没有排序插槽,因此该菜单项和行顺序依赖 dsh 的菜单和列表标记。
|
|
179
203
|
- dsh 也没有项目行菜单或“工作区”标题栏插槽。**复制路径** 通过 dsh 的行标记找到项目行;**折叠全部项目** 放在 dsh 的标题栏中,并用与点击项目行相同的方式折叠每个展开的项目。如果 dsh 更新修改了这些标记,右键点击会显示浏览器自己的菜单,按钮也不会显示。
|
|
180
204
|
- dsh 在新对话的项目菜单中也没有扩展点,所以 **搜索项目** 框和 A–Z 顺序依赖 dsh 的菜单标记。如果 dsh 更新修改了这些标记,菜单会按 dsh 自己的样子显示:使用保存的顺序,没有搜索框。A–Z 顺序只是一种视图,不会改变 dsh 保存的项目顺序。
|
|
205
|
+
- dsh 也没有决定 **新会话** 在何处打开的扩展点。**新会话的默认工作区** 包装了 dsh 的一个非公开 API 方法(dsh 工作区服务的 `startSession`)。如果 dsh 更新改了它的名字,**新会话** 会在 dsh 自己选择的位置打开(当前或最近的项目)。所有不指定项目的调用都使用默认值:侧边栏按钮、它的快捷键、徽标,以及 **自动化任务** 页面上的 **新建**。dsh 启动时仍会打开上一个对话。通用文件夹在首次使用时创建并加入你的项目;在 Windows 或 Linux 上,如果 Documents 文件夹被移动过,它可能与 dsh 自己的文件夹不同。
|
|
181
206
|
- dsh 也没有输入框提示的扩展点,所以 **下一条消息预测** 的文字覆盖在 dsh 自己的占位文字(`[data-composer-placeholder]`)上。如果 dsh 更新修改了这部分标记,就不会显示预测。开启期间,每完成一个回合都会进行一次简短的模型调用。
|
|
182
207
|
- **输入时补全** 通过 dsh 自己的输入框提示显示文字(即 dsh 用于斜杠命令参数提示的 `--dsh-composer-hint` 样式)。输入斜杠命令、消息中带有文件或符号标签,或光标不在消息末尾时,它不会运行。如果 dsh 更新修改了这个样式,就不会显示补全。你每次输入停顿都会进行一次模型调用。
|
|
183
208
|
- **优化提示词** 只能看到简短的项目概要、已更改的路径以及名称与你的用词匹配的路径,看不到代码本身。因此它可能漏掉正确的文件,并且只会提到提供给它的路径。发送前请先阅读新文本。输入斜杠命令或消息中带有文件或符号标签时,它不会运行(新文本是纯文本,标签会丢失);一条消息最多 8,000 个字符。图片仍保留在附件中:只有文字会改变。每次点击都会进行一次模型调用;较强的模型可能需要一分钟(按 `Esc` 取消)。
|
|
209
|
+
- **目标检查** 只检查智能体在自动目标轮次中做出的完成:你在对话中要求的完成、`/goal` 和目标栏都不会被检查。智能体可以自己修改测试或测试命令用到的文件;审核模型会阅读对话,可以看到这一点,但它在两个方向上都可能出错(错误的“尚未完成”会多花一轮;错误的“已完成”会关闭目标)。审核模型看到的是对话和 `git status`,而不是代码本身。只有当智能体最新的一步能更改文件的操作就是它自己在同一文件夹中成功运行完全相同命令的 `bash` 时,才会复用这次测试;带管道(`| tail`)或 `&&` 的命令不会被复用。预算在回合结束时计算,因此一个回合可能会超出预算。只计算对话自己的模型调用(不含其子智能体的调用)。检查运行期间 `update_goal` 会等待(测试最多 15 分钟,审核最多 3 分钟)。分支对话会得到新的对话 id,因此它开始时没有父对话自己的测试命令和上限。每次进入审核的完成都会花费一次模型调用。
|
|
184
210
|
- 已向上游请求内置支持:队列 `move` 见 [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773),“继续”状态见 [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269)。
|
|
185
211
|
|
|
186
212
|
## 常见问题
|
|
@@ -207,6 +233,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
207
233
|
|
|
208
234
|
**dsh 能在发送前优化我的提示词吗,就像 Roo Code 或 Augment 中的 Enhance prompt 按钮那样?** 可以,使用 **优化提示词**(默认开启):输入一个粗略的请求,然后点击模型菜单旁边的魔法棒。它会以此对话和项目为上下文,用你的语言改写文字,但不会发送。`Cmd/Ctrl+Z` 或 **撤销优化** 可恢复你的原文。在 **设置 → Composer Plus → 优化提示词 → 模型** 中选择它的模型。
|
|
209
235
|
|
|
236
|
+
**能否让智能体不再自己宣布工作已完成,就像 loop engineering 中的审核循环那样?** 可以,使用 **目标检查**(默认开启):用 `/goal` 开始一个目标。当智能体说目标已完成时,会运行项目的测试,并由一次独立的模型调用对照对话检查目标;任一项失败时,目标保持进行中,智能体会看到原因。在目标下方的 **目标检查** 行中用 **编辑** 设置你自己的测试命令、时间上限或 token 上限。
|
|
237
|
+
|
|
210
238
|
**如何在 dsh 中调整排队消息的顺序?** 拖动排队消息上的 ⠿ 把手,或者让它获得焦点后按 `↑` / `↓`。
|
|
211
239
|
|
|
212
240
|
**如何修改排队消息中的错字?** 在队列中双击这条消息,修改文字后按 `Enter`(按 `Esc` 取消)。它在队列中的位置不变。
|
|
@@ -217,6 +245,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
217
245
|
|
|
218
246
|
**我误回退了一个回合。可以找回来吗?** 可以:回退之后,立即使用输入框上方的 **重新应用**。它会从回退之前开始一个新对话,消息相同;如果回退时选择了 **对话和文件**,它还会把文件恢复回来。
|
|
219
247
|
|
|
248
|
+
**哪个对话改动了这个文件?** 右侧边栏 → **改动** → 文件的 **…** → **改动此文件的对话**。点击某一行,即可打开该对话并定位到做出改动的那条请求。
|
|
249
|
+
|
|
250
|
+
**可以在一个很长的对话中搜索吗?** 可以:在对话中按 `Cmd+F`(Mac)或 `Ctrl+F`(Windows 和 Linux)。**在对话中查找** 会高亮每个匹配项,并用 `Enter` 和 `Shift+Enter` 在它们之间跳转。
|
|
251
|
+
|
|
220
252
|
**如何只查看一个对话更改过的文件?** 右侧边栏 → **改动** → **本对话**。点击 **␣** 可隐藏只有空白的改动。
|
|
221
253
|
|
|
222
254
|
**如何让 Auto Review 在同一个对话中不再反复询问同一个工具?** 点击审批卡片上的 **本对话内允许**。它只覆盖该对话中的这个确切工具,默认有效 1 小时;可以在标题栏的标签中撤销它。在 **设置 → Composer Plus → 本对话内允许** 中更改时间。
|
|
@@ -237,6 +269,12 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
237
269
|
|
|
238
270
|
**如何在 iPhone 上使用 dsh?** 用 Xcode 从 `tether/ios` 构建 Tether 应用,开启 **设置 → Composer Plus → 手机连接(iPhone)**,点击左下角的 **手机连接**,扫描二维码(用 iPhone 相机或 Tether 中的 **Scan code**),轻点 **Connect**,然后点击 **Approve**。不在家时,请在两台设备上都使用 Tailscale。
|
|
239
271
|
|
|
272
|
+
**如何让新会话总在同一个项目中打开?** 设置 → Composer Plus → **新会话的默认工作区** → **新会话打开于** → 选择项目。其他项目旁的 `+` 仍会打开那个项目。
|
|
273
|
+
|
|
274
|
+
**如何在同一个项目中同时开发多个功能,并让每个功能在自己的分支上?** 使用 **每个对话一个分支**:新对话 → ⑂ main 按钮 → **新分支**,然后发送第一条消息。每个对话都有自己的分支和 worktree 文件夹;如果 `.worktreeinclude` 列出了你的 `.env` 和 `node_modules`,它们也会一起复制过去。对话标题栏会显示你当前所在的分支。
|
|
275
|
+
|
|
276
|
+
**可以从 iPhone 发送照片吗?** 可以。在 Tether 的对话中,轻点消息输入框旁边的 **+** → Camera、Photos(最多 4 张)或 Paste image。照片会作为你消息的附件发送到 Mac 上的对话,因此模型能看到它们。
|
|
277
|
+
|
|
240
278
|
**它支持桌面应用吗?** 支持:设置 → 插件 → **添加插件** → `dsh-composer-plus`。已在 dsh 0.2.0-rc.2(桌面版和网页版)和 0.2.1-rc.2(网页版)上测试。
|
|
241
279
|
|
|
242
280
|
## 开发
|
|
@@ -273,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
273
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
274
312
|
# Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
|
|
275
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
+
# Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
276
330
|
```
|
|
277
331
|
|
|
278
332
|
```sh
|
|
@@ -283,7 +337,7 @@ npm test
|
|
|
283
337
|
|
|
284
338
|
**新功能规则:** 设置 → Composer Plus 中的每个功能行都会显示一张截图。把功能 id 添加到 `client.js` 的 `SHOT_OF` 和 `index.js` 的 `SHOTS` 中,并发布 `assets/features/<id>.webp`(从临时演示 dsh 中截取,使用英文界面,大小约 60 kB 或更小)。把该功能(使用同一张图片)添加到 `docs/features.json`,然后运行 `npm run build:readme`:它会写入 `README.md` 和每个翻译版 `README.<id>.md` 的功能表格,以及 `llms.txt` 中的列表。功能没有截图时,`test/shots.test.mjs` 会失败;`test/browser-settings-shots.mjs` 会检查真实的设置页面。每次更改的完整检查清单见 [AGENTS.md](AGENTS.md)。
|
|
285
339
|
|
|
286
|
-
测试会在假的 React/DOM 上运行真实的 `client.js`,并在临时 git 仓库上运行真实的 `index.js`(Host 端)。Tether 网关测试(`test/tether-gateway.test.mjs`)使用模拟的 dsh host 和真实的 TLS 网关。iPhone 应用位于 `tether/ios` 中(见 [tether/README.md](tether/README.md) 和 [tether/AGENTS.md](tether/AGENTS.md)
|
|
340
|
+
测试会在假的 React/DOM 上运行真实的 `client.js`,并在临时 git 仓库上运行真实的 `index.js`(Host 端)。Tether 网关测试(`test/tether-gateway.test.mjs`)使用模拟的 dsh host 和真实的 TLS 网关。iPhone 应用位于 `tether/ios` 中(见 [tether/README.md](tether/README.md) 和 [tether/AGENTS.md](tether/AGENTS.md))。每个 Host 路由、它的请求以及 Tether 能否调用它,都列在 [docs/ROUTES.md](docs/ROUTES.md) 中。`node test/browser-history.mjs '<dsh web URL with ?token=…>'` 会在真实浏览器中,针对一个使用独立 `DSH_HOME` 的临时 `dsh web` 检查输入历史。
|
|
287
341
|
|
|
288
342
|
语言包是 `locales/<id>.json` 中的纯数据 JSON,由 `npm run build:locales` 嵌入到唯一的客户端入口中(不使用翻译服务,也不在运行时下载)。`npm test` 会检查每个语言包是否覆盖全部键、占位符和换行是否一致,以及跟随系统语言和手动覆盖时的行为。如需在本地安装的 Playwright 中进行隔离的真实应用检查:
|
|
289
343
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|