dsh-composer-plus 1.17.0 → 1.19.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 +24 -7
- package/README.es.md +24 -7
- package/README.fr.md +24 -7
- package/README.hi.md +24 -7
- package/README.id.md +24 -7
- package/README.ja.md +24 -7
- package/README.ko.md +24 -7
- package/README.md +24 -7
- package/README.pt-BR.md +24 -7
- package/README.ru.md +24 -7
- package/README.tr.md +24 -7
- package/README.vi.md +24 -7
- package/README.zh.md +24 -7
- package/assets/features/blockedCommands.webp +0 -0
- package/assets/features/plannedSteps.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +715 -73
- package/index.js +699 -3
- package/package.json +3 -2
- package/release-notes.json +18 -0
- package/tether/gateway/server.mjs +1 -0
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.19.0`。
|
|
33
33
|
|
|
34
34
|
## 功能
|
|
35
35
|
|
|
@@ -68,11 +68,14 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
68
68
|
| **目标检查** | <a id="feature-goalcheck"></a>用 `/goal` 开始一个目标。当智能体在自动轮次中把目标标记为完成时,目标要通过两项检查才会关闭。首先,项目的测试命令会在对话的文件夹中、按对话的沙箱模式运行。命令是你自己设置的,或者从 `package.json`、`Makefile`、`Cargo.toml`、`go.mod` 或 pytest 中找到的。如果智能体自己最新的一步就是该测试的成功运行,则不再重复运行。然后,一次不带工具的独立模型调用会阅读目标、此对话、`git status` 和测试结果。模型会用一张证据表回答:目标的每一部分都标为已验证、不正确或未解决,并附上证据和修正办法;只有每一部分都已验证时,目标才会关闭。任一检查失败时,目标保持进行中,智能体会看到每个未完成的部分及其证据和修正办法,下一轮继续。目标栏下方的一行(**目标检查**)显示测试、上次结果以及已验证的部分数量(将鼠标悬停在上面可查看表格)。**编辑** 可设置你自己的测试命令以及时间或 token 上限;超过上限时目标会变为受阻。token 上限也会计入该对话的子智能体。**立即运行** 会运行检查但不关闭目标。它在设置中有自己的 **模型** 菜单(默认:**与对话的模型相同**)。你自己完成目标时,不做任何检查。 | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="截图:目标检查"></a> |
|
|
69
69
|
| **在新对话中继续** | <a id="feature-handoffchat"></a>在侧边栏中右键点击对话(或打开它的 **…** 菜单)→ **在新对话中继续…**。调用一次该对话自己的模型,根据对话显示的内容写出交接说明:任务、产出、已完成、决定、未解决问题和下一步(工具调用及其结果是证据;你回滚的步骤不计入)。说明会在一个对话框中打开:阅读并修改它。**重新生成** 会写一份新说明。**开始新对话**(或 `Cmd/Ctrl+Enter`)会在同一项目中打开一个新对话,以该说明和旧对话的链接作为第一条消息;旧对话保持不变。当长对话已满或变慢,或者想第二天继续时,可以使用它。不会向项目写入任何内容。 | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="截图:在新对话中继续"></a> |
|
|
70
70
|
| **上下文明细** | <a id="feature-contextbreakdown"></a>右侧边栏 → `+` → **上下文**。该页面显示当前是什么在占用打开的对话的模型上下文,以及它占用了上下文窗口的多少:系统提示词、项目指令(AGENTS.md)、技能、你的消息、智能体回复和工具调用、工具结果(按工具)、MCP 结果(按服务器)、工具定义、压缩摘要和其他上下文说明,每项附令牌数和占比。点击某一部分可查看它的工具或服务器。它只读取对话日志(`/compact` 和回滚之后的状态),不调用模型;每个回合结束后以及点击 **刷新** 时会重新读取。可用它查看对话为何变慢或已满,例如一个很大的 MCP 工具结果或大量工具定义。 | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="截图:上下文明细"></a> |
|
|
71
|
+
| **计划步骤** | <a id="feature-plannedsteps"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。智能体会获得工具 `plan_next_steps`:它可以在发出某条命令的同一条消息中,预先计划接下来的命令及其确切参数和条件,例如“构建通过后运行 `npm test`”。结果满足条件时,Composer Plus 会自行运行下一步,无需再次调用模型,因此长对话消耗的令牌更少。该步骤在对话中显示为一行简短说明“Composer Plus · Planned steps: ran `test` … without a model call”,随后是它的工具调用和结果。仅限 `bash`、`read`、`grep` 和 `glob` 步骤;审批、沙箱和受保护的文件照常作用于每一步。条件不满足、同时有两个步骤就绪、最后一步完成后以及你发送消息时,模型会重新作答。这个想法来自 HarnessMM(arXiv 2610.32813)。 | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="截图:计划步骤"></a> |
|
|
71
72
|
| **受保护的文件** | <a id="feature-protectedfiles"></a>默认开启。智能体自己的文件工具不能读取或更改与你的模式匹配的文件:对于 **读取和写入** 模式,对文件使用的 `read`、`read_image` 和 `grep` 会被拒绝;两种模式下 `write`、`edit` 和 `str_replace_editor` 都会被拒绝。智能体会看到原因,并被告知要问你。默认模式是 `.env*`、`*.pem` 和 `*.key`。设置 → Composer Plus → **受保护的文件**:添加一个模式(例如 `published/**` 或 `config/*.yml`),点击它的类型可在 **读取和写入** 与 **仅写入** 之间切换,用 ✕ 移除它,或点击 **使用默认值**。不含 `/` 的模式会匹配任意文件夹中的文件名。这是护栏,不是沙箱:shell 命令(`cat .env`)、脚本或 MCP 工具仍能访问该文件(见“限制”)。 | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="截图:受保护的文件"></a> |
|
|
73
|
+
| **禁止的命令** | <a id="feature-blockedcommands"></a>默认开启,列表为空。智能体的 shell 命令(`bash`、`pwsh`)不能运行与你的规则匹配的命令:**阻止** 规则会拒绝调用(智能体会看到原因,并被告知要问你),**先询问** 规则会显示 dsh 的审批卡片,只有你允许后命令才会运行。设置 → Composer Plus → **禁止的命令**:输入一条规则(例如 `npm publish`、`git push --force` 或 `ssh *192.168.2.19`),点击类型可在 **阻止** 与 **先询问** 之间切换,然后点击 **添加**;点击规则的类型可以更改它,用 ✕ 移除它。一条规则是一个命令名和必须按此顺序出现在它后面的词;`*` 匹配任意文本。它也能找到 `&&`、`;`、`\|` 之后,`$(…)`、`bash -c "…"` 或 `eval` 之中,以及 `sudo` 或 `env` 之后的命令。这是护栏,不是沙箱:变量(`$CMD`)、脚本文件或其他程序仍能运行该命令(见“限制”)。 | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="截图:禁止的命令"></a> |
|
|
74
|
+
| **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**。dsh 对话的看板,显示与侧边栏相同的实时状态:等待你审批、回答或审阅计划的对话在**审核**中并带橙色圆点,运行中的对话在**进行中**,已完成的对话在**已完成**中(打开前为绿色)。在左侧选择一个项目或**所有项目**;“每个对话一个分支”的文件夹算作它所属的项目。**新建任务**(或按 `n`)只需输入提示:按 `Enter` 会在项目中开始一个新对话,卡片显示在**待办**中,dsh 为对话命名,对话的模型最多写出 3 个标签。点击卡片可打开它的对话。在橙色卡片上点击**回答**,即可直接在看板上回答:**拒绝**或**允许一次**;计划则选**同意执行**或**要求修改**;问题则选择选项或输入你自己的文字。**隐藏已完成**会在此设备上隐藏**已完成**。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="截图:任务看板"></a> |
|
|
72
75
|
| **项目记忆** | <a id="feature-projectmemory"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。每个项目文件夹都有自己的记忆,该项目之后的对话都会读取,就像 DS Bot 为每个 Bot 保存一份记忆。每个回合结束后,会用对话的模型调用一次,读取新消息(不含已回滚的消息),把你长期的偏好、决定和事实保存为简短笔记,并修改或删除旧笔记。智能体也可以自己保存、删除和搜索笔记(`memory_remember`、`memory_forget`、`memory_recall`)。笔记也可以是全局的:所有项目都会读取。新对话会在系统提示词中获得这些笔记;之后保存的笔记从下一个对话开始显示。文件是 dsh 主目录下的 Markdown(`storages/dsh-composer-plus/memory/`),绝不写入项目文件夹。 同一行的 **打开记忆** 会按项目(以及全局记忆)分组显示所有已保存的笔记,并可筛选。用你自己的话写下要修改的内容(例如“我从 yarn 换成了 pnpm”),然后点 **预览修改**:由 dsh 的默认模型提出修改,只有点 **应用** 才会保存。在 Tether 中:聊天标题菜单 → Project memory。 | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="截图:项目记忆"></a> |
|
|
73
76
|
| **本对话内允许** | <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> |
|
|
74
77
|
| **项目状态** | <a id="feature-projectstatus"></a>侧边栏中的项目行会显示与其对话相同的加载图标 / 等待 / 完成标记。因此,即使项目已折叠,你也能知道其中有对话正在运行或需要你处理。等待你处理的对话优先显示,其次是你尚未打开的已完成对话(绿色圆点,即使另一个对话仍在运行也会显示),最后是加载图标。将鼠标悬停在上面可查看详情。在**按工作区树**中,父文件夹的行也会显示其中每个项目(例如 `.worktrees/` 中的每个分支文件夹)的对话状态,折叠时也一样。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:项目状态"></a> |
|
|
75
|
-
| **对话行显示 Git 分支** | <a id="feature-sessionbranch"></a
|
|
78
|
+
| **对话行显示 Git 分支** | <a id="feature-sessionbranch"></a>在侧边栏的“单列表”视图中,每个对话行会显示一个小的灰色标签,内容是该对话最后一轮时项目文件夹所在的 git 分支(例如 `main` 或 `feature/login`;分离的 HEAD 没有分支,不显示标签)。同一项目中位于不同分支的两个对话不再看起来一样,你也能立即发现自己是否要在错误的分支上继续对话。将鼠标悬停在标签上可查看完整名称。Host 部分会在每轮开始和结束时读取分支(`git branch --show-current`,只读);安装后还没有新一轮的对话,或不是 git 仓库的文件夹,不会显示标签。在“按工作区”和“按工作区树”视图中,对话已位于其项目行下,因此对话行不显示标签。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="截图:对话行显示 Git 分支"></a> |
|
|
76
79
|
| **全部标为已读** | <a id="feature-markprojectread"></a>在侧边栏中,点击项目的 **…** 按钮 → **全部标为已读**。该项目中所有对话的绿色未读圆点会立即消失;其他项目的圆点保持不变。项目中没有未读对话时,此项显示为灰色(**没有未读对话**)。 | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="截图:全部标为已读"></a> |
|
|
77
80
|
| **活跃项目置顶** | <a id="feature-activeprojectsfirst"></a>当某个对话开始运行或需要你处理时,它所在的项目会移到侧边栏顶部,并使用 dsh 自带的行动画(与把它拖到那里的效果相同)。已完成的项目保持原位;你可以像往常一样把它们拖到任意位置。移动会保存到 dsh 的项目顺序中,因此关闭此功能后会保留当前顺序。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:活跃项目置顶"></a> |
|
|
78
81
|
| **近期项目筛选** | <a id="feature-recentprojects"></a>侧边栏 → 视图选项(滑块图标)→ **最近 2 小时内活跃**。选中后,侧边栏只显示最近 2 小时内有活跃对话的项目。活跃对话包括:这段时间内更新过的对话、正在运行或等待中的对话、当前打开的对话,以及你尚未打开的已完成对话(dsh 的绿色“完成”圆点),超过 2 小时后也一样。没有这类对话的项目会被隐藏,新建的空项目也会被隐藏。在 **按工作区树** 中,只要父文件夹中的某个项目处于活跃状态,父文件夹就会保持显示,最近 2 小时内不活跃的对话也会被隐藏,因此只显示最近的对话。再次选择该项即可显示所有项目。这个选择保存在本设备上。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="截图:近期项目筛选"></a> |
|
|
@@ -82,7 +85,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
82
85
|
| **空闲时打开等待中的对话** | <a id="feature-idleswitch"></a>当某个对话提出问题,或等待审批或计划审阅(橙色圆点),或完成了你尚未查看的一轮(绿色圆点),而你 30 秒没有使用 dsh 时,dsh 会打开该对话。橙色对话先于绿色对话打开。同一组中,等待最久的先打开;下一个会在再次 30 秒没有使用后打开。按键、点击、移动鼠标、滚轮或触摸都会让 30 秒重新计时。有焦点的输入框中有文字、选中了文本,或打开了菜单或对话框时,也不会切换。等待中的对话正在屏幕上时,不会切换。如果你没有回答就离开了等待中的对话,再次 30 秒没有使用后,它会再次打开。绿色对话打开后,它的圆点会消失;下一个绿色对话要等你再次使用 dsh,之后又 30 秒没有使用时才会打开。dsh 在后台时也会生效,但 dsh 不会被带到前台。 | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="截图:空闲时打开等待中的对话"></a> |
|
|
83
86
|
| **应用语言** | <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> |
|
|
84
87
|
| **手机连接(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> |
|
|
85
|
-
| **自动更新** | <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 的新功能**
|
|
88
|
+
| **自动更新** | <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> |
|
|
86
89
|
| **备份** | <a id="feature-backup"></a>设置 → Composer Plus → **备份** → **立即备份**:把整个 dsh 主目录(对话、设置、插件、MCP、技能)连同校验和写成 `~/Desktop/dsh-backups` 中的一个归档。归档中的机密会被遮蔽:凭据文件、密钥文件(`.pem`、`.key`)以及 yml 设置中的 token、secret 和 password 值只保存在这台电脑上,位于该文件夹的 `vault` 中。`cache/`、`dsh-runtimes/` 和 `node_modules` 不会归档(dsh 会重新生成它们)。列表中的每份备份都有 **检查**(完整读取)、**用于另一台电脑**(一个可复制到新电脑的文件夹,含救援控制台)和 **删除**。同一文件夹中 dsh-backup 的归档也会显示并可使用。要恢复,请退出 dsh 并使用救援控制台。 | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="截图:备份"></a> |
|
|
87
90
|
| **自动备份** | <a id="feature-autobackup"></a>打开 **自动备份**(默认关闭:每份大约与不含缓存的 dsh 主目录一样大)。选择频率(**每**:6 小时到 7 天,默认 24 小时)和保留的份数(**保留**:3 到 14 份,默认 7 份)。下次备份时间显示在开关下方;失败的备份也会显示在那里,并在 30 分钟后重试。dsh 或 Composer Plus 以新版本启动时,会在启动后不久、新版本长时间使用你的数据之前拍一份快照(保留最新的两份,标记为 **升级前**)。 | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="截图:自动备份"></a> |
|
|
88
91
|
| **会话日志检查** | <a id="feature-sessiondoctor"></a>**检查会话日志** 会读取每个对话的日志,并列出 dsh 无法打开的日志(帧损坏、记录被截断、序号错误)。尾部撕裂的日志不会列出:dsh 会自行修复。**从备份修复** 会放回最新一份含有健康副本的备份中的副本,并把损坏的文件保留在旁边(`.corrupt-<时间>`)。该备份之后写入的消息不在副本中。在此 dsh 中打开的对话不会在这里修复:请退出 dsh,在救援控制台中修复。 | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="截图:会话日志检查"></a> |
|
|
@@ -166,7 +169,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
166
169
|
- **目标检查:** 只有当智能体在自动轮次中把 `/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 个对话)。
|
|
167
170
|
- **在新对话中继续:** 在你点击之前,什么都不会运行。点击后,Host 端会把对话(与目标检查读取的方式相同:不含推理内容和已回退的步骤)发送给对话自己的模型,并显示交接说明;只有 **开始新对话** 才会创建新对话。项目中不会写入任何内容。
|
|
168
171
|
- **上下文明细:** 只在 Host 上读取对话日志;不调用模型,不读取项目文件。
|
|
172
|
+
- **任务看板:** 看板显示 dsh 自己的对话,数据来自 dsh 在此窗口中自己的列表;它不会添加自己的对话数据。你开始一个任务时,Host 端会在你选择的项目中新建一个对话,并把你的提示作为第一条消息发送给它,就像你在那里输入的一样,因此审批、沙箱和对话的模型照常适用。然后,它会以另一次不带工具的请求,把提示(只有前 4,000 个字符,没有其他内容)发送给该对话的模型,以获得最多 3 个标签。每个任务的提示、标签和开始时间保存在 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` 中(仅所有者可访问的文件,保留最新的 2,000 个);开关保存在旁边的 `board-switch.json` 中。不会向任何项目文件夹写入内容。**回答** 会把你的回答发送给 dsh 自己的待处理请求,与对话中自己的卡片做法相同。早期版本的旧任务列表(`board.json`)原样留在磁盘上,不会被读取。
|
|
169
173
|
- **受保护的文件:** 列表和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` 中(仅所有者可访问的文件)。检查只读取每次文件工具调用的路径(及其真实路径),从不读取文件本身。
|
|
174
|
+
- **禁止的命令:** 规则和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` 中(仅所有者可访问的文件)。检查只读取每次 `bash` 和 `pwsh` 调用的命令文本;它不运行任何内容,也不发送任何内容。
|
|
170
175
|
- **项目记忆:** 在你开启之前一直关闭。开启后,每个顶层对话的回合结束时,Host 部分会把该对话自上次整理以来的新消息(你的消息和智能体的文字回复;不含工具输出、推理、隐藏上下文和已回滚的消息;分叉对话中复制自父对话的部分不算在内;最多约 16,000 个字符)和已保存的笔记,作为一次不带工具的请求发给对话自己的模型。笔记是 `$DSH_HOME/storages/dsh-composer-plus/memory/` 下的 Markdown 文件(仅所有者可读写):每个项目文件夹对应 `projects/<id>/`(`<id>` 是文件夹真实路径的哈希;`project.json` 记录文件夹路径),另有 `global/`、`journal.jsonl`(每次改动及改动前后的那一行)和 `reviewed.json`(每个对话读到的位置)。项目文件夹中不会写入任何内容。看起来像密钥、令牌、密码或证件号码的笔记会被拒绝。项目的笔记会进入该文件夹中每个新对话的系统提示词,因此该对话的每次请求都会把它们发给模型。开关保存在同一位置的 `memory.json` 中。在你点 **预览修改** 之前,**打开记忆** 不会发送任何内容;点了之后,它会把显示的笔记和你的文字作为一次不带工具的请求发给 dsh 的默认模型。修改只在点 **应用** 时写入,日志中记为 `editor`。Tether 通过同一路由读取和修改笔记。
|
|
171
176
|
- **备份:** 任何数据都不会离开你的电脑。归档保存在 `~/Desktop/dsh-backups` 中(仅所有者可访问的文件)。机密不在归档中:凭据文件(`.credentials.yaml`、`.env`)、密钥文件(`.pem`、`.key`、`.p12`、`.pfx`)以及 yml 文件中 token、secret、password 和 API key 设置的值都会被遮蔽;它们的真实副本保存在同一文件夹的 `composer-plus-vault/<archive>/` 中(仅所有者可访问),只在这台电脑上。**用于另一台电脑** 不会复制 vault:请在那台电脑上重新输入这些机密。你的对话日志、设置和 dsh 主目录的其余内容按原样保存在归档中:请像对待 `$DSH_HOME` 本身一样,不要公开该文件夹。备份使用 `O_NOFOLLOW | O_NONBLOCK` 读取文件;符号链接按链接保存(从不跟随),FIFO 和设备文件会被跳过。自动备份的开关和设置保存在 `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json` 中,救援控制台的开关保存在 `rescue-console.json` 中;dsh 运行期间,`running/host-<pid>.json` 标明每个 dsh 进程(救援控制台读取它们,以便拒绝恢复)。
|
|
172
177
|
- **救援控制台:** 一个终端菜单;它不打开网络端口。恢复只写入 dsh 主目录旁边的一个新文件夹(文件使用 `O_EXCL | O_NOFOLLOW` 写入,符号链接最后写入且从不跟随),并拒绝以下归档:含有不安全名称(`..`、绝对路径)、设备文件或 FIFO、多于一个顶层文件夹,或位于链接之下的条目。
|
|
@@ -186,10 +191,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
186
191
|
- **重启后对话没有继续:** dsh 退出时“重启后继续”处于关闭状态;或者你自己停止了那个回合;或者回合已经结束(完成或失败);或者对话已被归档;或者当时有超过 20 个对话正在运行(只有最新的 20 个会继续)。
|
|
187
192
|
- **重启后队列是空的:** 清空队列的是 dsh 自己的退出流程。重启后继续只会在它继续的对话中放回队列;其他对话请重新发送消息。退出前刚删除的消息可能会回来:请再删除一次。
|
|
188
193
|
- **创建 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。
|
|
189
|
-
- **对话行上没有分支标签:**
|
|
194
|
+
- **对话行上没有分支标签:** 侧边栏不是“单列表”视图(在“按工作区”和“按工作区树”中,对话行都不显示标签);或者安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
|
|
190
195
|
- **目标检查显示测试以代码 127 或 “not found” 退出:** 从 Finder 或程序坞启动的 dsh 的 PATH 可能比终端里的短,因此找不到 `npm`、`pnpm` 或 `cargo`。请从终端启动 dsh,或者在 **目标检查** → **编辑** 中用完整路径设置你自己的测试命令。**立即运行** 会马上显示结果。
|
|
191
196
|
- **目标没有关闭,智能体一直在工作:** **目标检查** 发现了失败的测试或缺少的工作;目标下方的一行会显示原因(将鼠标悬停在结果上可查看详情)。请修正原因或测试命令,或者用 `/goal` 或目标栏自己完成目标(这不会被检查)。
|
|
192
|
-
- **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.
|
|
197
|
+
- **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.19.0`),见上文的安装说明。
|
|
193
198
|
- **立即备份显示“另一个备份操作正在进行”:** 另一个 dsh 窗口或救援控制台中正在运行一个操作(它们共用备份文件夹中的锁文件 `.composer-plus.lock`)。请等待它完成。如果没有操作在运行,下次点击时会接管已关闭进程留下的锁。
|
|
194
199
|
- **救援控制台显示“dsh is running”:** 请先退出 dsh。如果 dsh 确实已关闭,消息中提到的文件是崩溃后留下的:删除它,然后重试。
|
|
195
200
|
- **恢复后 dsh 无法启动或缺少插件:** 需要重新安装 profile 的插件包。恢复后,救援控制台会提供这一步;你也可以在它列出的 `$DSH_HOME/profiles/` 下的每个文件夹中运行 `pnpm install`。不在 vault 中的机密(另一台电脑)必须重新输入:控制台会列出它们。
|
|
@@ -209,6 +214,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
209
214
|
- **删除对话** 需要 dsh 的归档功能(dsh 0.2.0 及更高版本)。如果对话(或它的某个子代理对话)在 15 秒内没有停止,或被另一个 dsh 持有,它会保持归档状态,不会移动任何内容。在 macOS 以外的系统上,废纸篓文件夹必须与对话历史位于同一磁盘。你删除的已打开对话会以归档和隐藏的状态留在 dsh 的内存中,直到 dsh 重启。请自行清倒废纸篓;dsh 不会替你清倒。
|
|
210
215
|
- dsh 的队列没有 `move` 操作,所以由插件的 Host 端在 dsh 的队列中直接移动排队的消息本身(一次改动,还是同一条消息)。带有图片或文件的消息也能移动。只有你自己的消息可以移动:队列中的目标轮次或对问题的回答会留在原处。如果在你拖动时有消息开始发送,则不会移动任何消息,并会显示一条提示说明这一点。
|
|
211
216
|
- 如果新版本不改动任何 dsh 设置,dsh 0.2.1 会立即加载更新;否则(以及在 dsh 0.2.0 上),请重启 dsh 来加载更新。插件从不替你重启 dsh。没有 dsh 插件管理器的网页版/CLI profile 只会提示有新版本。
|
|
217
|
+
- **Composer Plus N 的新功能** 使用 **应用语言** 中的语言显示说明。带其他地区的界面语言使用其基础语言的说明(`en-GB` 显示英文说明,`zh-TW` 显示 `zh` 的中文说明)。没有说明的语言(由其他语言包添加的语言,或不是 `pt-BR` 的 `pt-PT`)显示英文说明。说明随新版本一起安装。如果运行的副本没有可读的说明文件(`release-notes.json`),窗口会显示 GitHub 上的英文说明。
|
|
212
218
|
- **本对话内允许** 从授权的那一刻开始计算时限。新的时限会立即应用于仍在生效的授权,因此更短的时限可能会让它们立即结束。1.12 及更早版本的授权没有时间信息:更新后,代理会就这些工具再询问一次。
|
|
213
219
|
- **保持输入框焦点** 只在发送 `/` 命令或技能后才会把焦点还给输入框。dsh 解析命令时,输入框会有几毫秒处于只读状态,因此这段时间内按下的键会丢失。如果 dsh 的 `/` 菜单仍然打开,`Enter` 会选择高亮的行,而不会发送。
|
|
214
220
|
- **问题卡片适应窗口** 只改变 dsh 的问题卡片,不改变计划审阅卡片。它通过 dsh 的标记(`data-question-key`、`data-question-scroll`)找到卡片;如果 dsh 更新改变了这些标记,卡片会按 dsh 自己的样子显示。卡片高度跟随窗口,而不是对话:在较窄侧边面板中的对话里,较高的卡片仍可能超出对话上方。
|
|
@@ -222,7 +228,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
222
228
|
- **本对话** 只统计 dsh 的文件工具(`write`、`edit`、`str_replace_editor`)写入的文件。命令(`bash`)更改的文件不在这个视图中;它们显示在 **未提交** 下。如果没有该对话的回合回退快照(回合回退已关闭、安装了 dsh-rewind-plugin,或对话比插件更早),视图会与最后一次提交比较,并给出提示。回合回退为每个对话保留最新的 50 个快照:在更长的对话中,视图与保留的最早快照比较,说明从哪条消息开始,并且不计入更早的改动。**隐藏空白改动** 就是 `git diff -w`:只在行内空格上有变化的行也会被隐藏。
|
|
223
229
|
- **创建 GitHub issue** 需要 dsh 的 PATH 中有 GitHub CLI(`gh`),并且对话的文件夹中有 GitHub 远程仓库。它最多运行 60 秒;如果 `gh` 用时更长,issue 可能已经在 GitHub 上创建,但列表中没有它的链接(再次点击之前,请先到 GitHub 上查看:列表只从已完成的运行中读取链接,所以再次点击可能会创建第二个 issue)。有多个 GitHub 远程仓库的文件夹使用 `gh` 自己的默认仓库(`gh repo set-default`)。
|
|
224
230
|
- **改动此文件的对话** 与 **本对话** 一样,只识别 dsh 的文件工具(`write`、`edit`、`str_replace_editor`):命令(`bash`)做出的改动不会列出。它读取该仓库最新的 300 个对话(按创建时间),对话更多时会给出提示;它最多显示 100 行。重命名的文件按工具写入时的名称列出。文件夹在仓库之外的对话(包括通过另一条路径指向相同文件的情况)不计入。dsh 启动后第一次打开时,会读取该仓库的所有对话日志(275 个对话约需 4 秒);之后再打开时,只读取此后有变化的对话。
|
|
225
|
-
- **对话行显示 Git 分支** 显示的是对话最后一轮开始或结束时其文件夹所在的分支,而不是当前的分支:在回合之外切换分支,要到下一轮之后才会显示。此版本之前的对话,在下一轮之前不显示标签。标签放在 dsh 的对话行标记中(dsh 在那里没有插槽);如果 dsh
|
|
231
|
+
- **对话行显示 Git 分支** 显示的是对话最后一轮开始或结束时其文件夹所在的分支,而不是当前的分支:在回合之外切换分支,要到下一轮之后才会显示。此版本之前的对话,在下一轮之前不显示标签。标签放在 dsh 的对话行标记中(dsh 在那里没有插槽);如果 dsh 更新改变了这部分标记,就不会显示标签。标签只在“单列表”中显示。
|
|
226
232
|
- **每个对话一个分支** 在计划模式下:dsh 把 `/plan <消息>` 作为命令而不是消息发送,因此 Composer Plus 会在 dsh 的输入框中接管该命令的提交(不是公开 API)。如果 dsh 更新改变了这一点,选择 **新分支** 时的 `/plan <消息>` 会在已打开的新对话中作为 dsh 自己的命令运行。当 Host 无法在新对话中开启计划模式时,分支文件夹会保留,消息不会发送,因此新对话不会在默认模式下修改文件。
|
|
227
233
|
- **每个对话一个分支**:当对话的分支文件夹(`<project>/.worktrees/<name>`)被删除时(例如对话自己的智能体移除了 worktree 并删除了分支),对话的下一步会把对话移出该文件夹。它的分支文件夹项目会从侧边栏消失,对话显示在“未分组”下并保持打开。在 dsh 0.2.1 及更高版本中,对话在主项目文件夹中继续,模型会收到一条关于新文件夹的说明。在 dsh 0.2.0 上,对话保留已删除的文件夹:在那里运行的命令会失败,直到你开始一个新对话。没有对话使用的已删除分支的项目也会从侧边栏消失:Composer Plus 在启动时和每 30 秒检查一次分支文件夹,不需要任何侧边栏筛选。对话移动期间,同一仓库中的**新分支**会回答“请重试”。关闭开关后,dsh 自己的错误会再次出现(“working-directory: directory does not exist”)。
|
|
228
234
|
- **工作区树中的分支** 会在无需点击的情况下写入 git:移动对话时,它把项目文件夹切回原来的分支(`git switch`),并添加一个 worktree(`git worktree add`)。它从不删除分支、worktree 或文件。dsh 不能更改对话的文件夹,所以被移动的对话是一个副本(dsh 自己的分叉,带有新的 id),旧对话会被归档。副本会继续已停止的任务;分支出现时正在运行的工具调用会以拒绝结束,智能体会在新文件夹中再次运行它。旧对话的目标不会随之移动。只有文件夹是仓库主文件夹的对话会移动,而且只针对它在该轮中创建并切换到的分支(`git switch -c`、`git checkout -b`):只用 `git branch` 创建的分支、有未提交改动的文件夹、链接的 worktree 或子文件夹都不会移动。只有直接位于 `<project>/.worktrees/` 中且有分支的 worktree 会显示在树中;分离的 worktree 或位于其他位置的 worktree 不会显示。只有当原对话是正在打开的对话时,副本才会自动打开(插件通过 dsh 的侧边栏行判断);否则它在分支项目中。
|
|
@@ -239,8 +245,11 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
239
245
|
- **优化提示词** 只能看到简短的项目概要、已更改的路径以及名称与你的用词匹配的路径,看不到代码本身。因此它可能漏掉正确的文件,并且只会提到提供给它的路径。发送前请先阅读新文本。输入除 `/goal <目标>` 以外的斜杠命令、`/goal` 控制词(`clear`、`pause`、`resume`),或消息中带有文件或符号标签时,它不会运行(新文本是纯文本,标签会丢失);一条消息最多 8,000 个字符。对于 `/goal` 目标,它只根据草稿和上下文写出条件;过于严格的条件可能会多花目标轮次,因此发送前请先阅读。图片仍保留在附件中:只有文字会改变。每次点击都会进行一次模型调用;较强的模型可能需要一分钟(按 `Esc` 取消)。
|
|
240
246
|
- **目标检查** 只检查智能体在自动目标轮次中做出的完成:你在对话中要求的完成、`/goal` 和目标栏都不会被检查。智能体可以自己修改测试或测试命令用到的文件;审核模型会阅读对话,可以看到这一点,但它在两个方向上都可能出错(错误的“尚未完成”会多花一轮;错误的“已完成”会关闭目标)。审核模型看到的是对话和 `git status`,而不是代码本身。只有当智能体最新的一步能更改文件的操作就是它自己在同一文件夹中成功运行完全相同命令的 `bash` 时,才会复用这次测试;带管道(`| tail`)或 `&&` 的命令不会被复用。预算在回合结束时计算,因此一个回合可能会超出预算。token 预算也会计算该对话的子智能体对话的调用(在每个回合结束时从它们保存的日志中读取,因此子智能体很多的对话检查起来会稍慢一些)。证据表来自审核模型自己对对话的阅读:它标为已验证的部分,在重要时仍需要你自己查看。检查运行期间 `update_goal` 会等待(测试最多 15 分钟,审核最多 3 分钟)。分支对话会得到新的对话 id,因此它开始时没有父对话自己的测试命令和上限。每次进入审核的完成都会花费一次模型调用。
|
|
241
247
|
- **受保护的文件** 是护栏,不是沙箱。它覆盖 dsh 自己的文件工具(`read`、`read_image`、对文件使用 `grep`、`write`、`edit`、`str_replace_editor`)。shell 命令(`cat .env`)、智能体编写的脚本、子智能体的 shell、MCP 工具、`glob` 列表以及对整个文件夹使用的 `grep` 仍能访问受保护的文件。如需真正的限制,请使用 dsh 的沙箱模式,或者不要把机密放在项目文件夹中。模式支持 `*`、`**` 和 `?`,不支持 `{a,b}` 或 `[ab]`,并且不区分大小写。
|
|
248
|
+
- **禁止的命令** 是护栏,不是沙箱。它只读取 dsh 的 `bash` 和 `pwsh` 工具的命令文本。指代该命令的变量或别名(`CMD=npm; $CMD publish`)、shell 函数、智能体编写的脚本文件、其他程序(`python -c`、`node -e`、`make`)、MCP 工具以及你自己的终端仍能运行它。规则匹配的范围可能比你想要的更大:命令中的任何词都可以被当作命令名(`echo npm publish` 会匹配 `npm publish`),规则的词之间也可以夹着其他词(`git push --force` 也会匹配 `git push origin main --force`)。规则匹配过多时,请把它写得更长。**先询问** 需要一个能够询问的对话:在审批策略为 never 的对话中(例如委派的子智能体),dsh 无法显示卡片,因此调用会被拒绝并附上原因。审批卡片以英文显示原因。**本对话内允许** 不会回答 **先询问** 卡片。
|
|
242
249
|
- **在新对话中继续** 会把对话(消息、工具调用以及每个工具结果的末尾,最多约 60,000 个字符,最新的部分)发送给对话自己的模型。交接说明可能漏掉某个决定或文件:开始前请先阅读。新对话只知道这份交接说明和链接的对话(dsh 会把旧对话作为只读上下文附加进来);它的模型上下文从很小开始,旧对话保持不变。每个对话同一时间只能进行一次写说明或开始操作。
|
|
243
250
|
- **上下文明细** 按 dsh 自己的规则显示估算值(每个 token 约 4 个字符),与 dsh 的上下文环使用相同的规则;模型自己的计数可能不同。工具定义取自最新的一次请求。它按对话日志中的样子显示上下文;正在运行的回合会在它的下一步之后出现。
|
|
251
|
+
- **计划步骤** 只有在模型确实做了计划时才会节省令牌:开启后,每个请求都会带上 `plan_next_steps` 工具和一段简短说明(约 500 个令牌),即使在模型从不做计划的对话中也是如此。条件只证明它所写的内容(例如:构建的退出码为 0),并不证明工作正确。`ok` 读取 dsh 自己的结果标记(`[exit code: N]`、超时、沙箱拒绝);一个失败但退出码不为非零的命令会被视为通过。步骤一次只运行一个;同时就绪的两个步骤会交回给模型。该步骤的消息会作为对话模型的助手消息保存(dsh 没有标记插件所写消息的方式),因此它的文字会说明是 Composer Plus 运行的。Tether 中没有此功能。
|
|
252
|
+
- **任务看板** 显示 dsh 在此窗口中列出的对话:不在项目中的对话只显示在**所有项目**中,“每个对话一个分支”的文件夹(`<project>/.worktrees/<name>`)算作它所属的项目。卡片所在的列就是对话的实时状态,因此卡片不能拖动:对话的回合结束时(包括出错或停止之后)会移到**已完成**,再次运行时会回到**进行中**。绿色圆点是 dsh 自己的完成圆点,dsh 只在此窗口中保留它:重新加载后,已完成的对话不再显示圆点。**已完成** 显示最新的 50 个对话(**显示更早的 N 个** 显示其余对话)。标签来自每个已开始任务的一次模型调用:它们可能不准确,不是在看板上开始的对话没有标签。标题是 dsh 自己的对话标题(由 dsh 的标题服务使用对话的模型生成);标题出现前,卡片显示提示的第一行。以 dsh 认识的 `/` 命令(`/plan`、`/goal`)开头的提示会作为该命令运行。**回答** 只回答对话最新的请求:如果对话已在别处(另一个窗口、Tether、Auto Review)回答了它,或提出了新的问题,面板会说明这一点,并且不发送任何内容。早期版本有带评论和智能体工具的任务列表;它们已被移除,旧的 `board.json` 不会显示。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。
|
|
244
253
|
- **停止后发送的消息优先** 只在你停止对话后生效(或在某一轮失败后,或打开仍有队列的对话时):对话运行时发送的消息仍会排在队列末尾。它只会越过你自己的排队消息:如果队列中有目标轮次或问题回复,仍保持 dsh 自己的顺序。它会读取 dsh 中一个非公开 API 的部分(被停止的那一轮是否仍在结束中);如果 dsh 更新后改了它的名称,消息要等那一轮结束后才会被移到前面。子代理对话保持 dsh 自己的顺序。
|
|
245
254
|
- **项目记忆** 属于对话的第一个文件夹(dsh 的项目文件夹):用 `cd` 更换文件夹的对话仍使用第一个项目的记忆;通过另一条路径打开的同一文件夹共用同一份记忆。对话开始时会冻结其记忆部分,所以之后保存的笔记从下一个对话开始显示(`memory_recall` 能立即找到)。整理只保留模型决定保留的内容:它可能漏掉某个事实,也可能保留错误的内容;请在 **打开记忆** 中检查并在那里修改,或在 dsh 关闭时手动编辑文件。**打开记忆** 会把所选项目的笔记和全局笔记(选择“全部笔记”时为所有项目;最多约 60,000 个字符,其余只计数,在该次请求中无法修改)以及你的文字发送给 dsh 的默认模型,而不是对话的模型。预览在 Mac 上保留 30 分钟,直到 dsh 重启;如果在此期间整理或智能体修改了笔记,**应用** 会拒绝,你需要重新预览。**应用** 要么保存预览中的全部修改,要么一项也不保存:只要有一项修改无法保存(例如 MEMORY.md 已满),笔记就保持原样,并显示原因。每个包含你的消息的回合结束后都会调用一次模型;调用失败时,下一个回合后会再次读取同样的消息。子智能体对话不做整理。这个思路和文件格式来自 [DS Bot](https://github.com/Fei2411/DS-Bot)(Apache-2.0);Composer Plus 没有使用它的代码,也从不读取或写入 DS Bot 自己的记忆。
|
|
246
255
|
- **备份** 只使用一个固定文件夹 `~/Desktop/dsh-backups`(dsh-backup 的默认文件夹,因此它的归档仍然可用);没有设置可以改用其他文件夹。归档大小约等于不含 `cache/` 和 `dsh-runtimes/` 的 dsh 主目录(实测:在 Apple Silicon 上,1.6 GB 的文件约用 30 秒生成 830 MB 的归档;期间 dsh 保持响应)。读取期间发生变化的文件,会按备份打开它时的状态保存,因此打开中的对话的日志末尾可能是一条被截断的记录,dsh 会在下次写入时修复它。遮蔽按单行中的键名查找 yml 文件中的机密(`token:`、`apiKey:`、…);流式映射(`{token: x}`)中、此类键下的列表中、JSON 文件中(例如 `.json` 文件中某个 MCP 服务器的 `apiKey`)或使用其他名称的机密会留在归档中。dsh-backup 按类型生成的归档(`dsh-t-…`)不会列出。**用于另一台电脑** 会复制归档(在 APFS 上是克隆:不占用额外空间);vault 不会随之复制。**立即备份** 不会删除任何备份。自动备份会保留 Composer Plus 生成的最新备份(**自动备份** 的 **保留** 设置),并删除它生成的更早备份;升级前的快照单独计数(保留最新的 2 份)。dsh-backup 的归档永远不会被删除:请用 **删除** 移除它们。只要 dsh-backup 仍已安装,它就会把 Composer Plus 的归档计入自己的保留份数,并可能删除它们。
|
|
@@ -277,6 +286,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
277
286
|
|
|
278
287
|
**智能体能像 DS Bot 的记忆那样,在不同对话之间记住我的偏好吗?** 可以,使用 **项目记忆**(默认关闭):在 **设置 → Composer Plus** 中开启。每个回合结束后,你长期的偏好和决定会作为简短笔记保存到该对话的项目中,该项目的每个新对话都会读取。让智能体记住某件事,它会立即保存。要查看或修改笔记,请点同一行的 **打开记忆**,写下要修改的内容。
|
|
279
288
|
|
|
289
|
+
**我能把所有对话看成一个看板,并从中开始新对话吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它。每个对话都是一张卡片,位于**进行中**、**审核**(等待你处理)或**已完成**中。**新建任务**只需输入提示,并用它开始一个新对话;在橙色卡片上点击**回答**,无需打开对话即可回答。
|
|
290
|
+
|
|
280
291
|
**dsh 能像 dsh-backup 那样备份我的对话和设置吗?** 可以:**设置 → Composer Plus → 备份 → 立即备份**。它把相同格式的归档写入同一个文件夹(`~/Desktop/dsh-backups`),因此 dsh-backup 的归档也会显示并可以恢复,你可以卸载 dsh-backup。打开 **自动备份** 即可按计划备份。
|
|
281
292
|
|
|
282
293
|
**dsh 无法再启动了。如何恢复备份?** 打开备份文件夹(`~/Desktop/dsh-backups`),双击 `Composer Plus Rescue.command`(Linux:`composer-plus-rescue.sh`,Windows:`Composer Plus Rescue.cmd`)。选择 `3) Restore a backup`,选中一份备份并输入 `RESTORE`。它不需要 dsh 也能运行。
|
|
@@ -301,6 +312,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
301
312
|
|
|
302
313
|
**如何只查看一个对话更改过的文件?** 右侧边栏 → **改动** → **本对话**。点击 **␣** 可隐藏只有空白的改动。
|
|
303
314
|
|
|
315
|
+
**如何阻止智能体运行 `npm publish` 或 `git push --force`?** **设置 → Composer Plus → 禁止的命令**:输入 `npm publish`,选择 **阻止** 或 **先询问**,然后点击 **添加**。**阻止** 会拒绝该命令,智能体会问你;**先询问** 每次都会显示审批卡片。受保护的文件覆盖智能体的文件工具;禁止的命令覆盖它的 shell 命令。
|
|
316
|
+
|
|
304
317
|
**如何让 Auto Review 在同一个对话中不再反复询问同一个工具?** 点击审批卡片上的 **本对话内允许**。它只覆盖该对话中的这个确切工具,默认有效 1 小时;可以在标题栏的标签中撤销它。在 **设置 → Composer Plus → 本对话内允许** 中更改时间。
|
|
305
318
|
|
|
306
319
|
**我的 iPhone 丢了。如何阻止它访问我的 Mac?** 点击侧边栏左下角的 **手机连接**,然后点击该 iPhone 旁边的 **Remove**。它的密钥会立即失效;只有通过你在 Mac 上批准的新配对,它才能重新连接。
|
|
@@ -329,6 +342,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
329
342
|
|
|
330
343
|
**可以从 iPhone 发送照片吗?** 可以。在 Tether 的对话中,轻点消息输入框旁边的 **+** → Camera、Photos(最多 4 张)或 Paste image。照片会作为你消息的附件发送到 Mac 上的对话,因此模型能看到它们。
|
|
331
344
|
|
|
345
|
+
**dsh 能否不再询问模型就运行下一条命令?** 可以,使用 **计划步骤**(默认关闭):在 设置 → Composer Plus 中开启。之后模型可以带条件地计划接下来的命令,例如“构建通过后运行测试”,结果满足条件时,Composer Plus 会在不重新调用模型的情况下运行该步骤。审批和沙箱保持不变。
|
|
346
|
+
|
|
332
347
|
**它支持桌面应用吗?** 支持:设置 → 插件 → **添加插件** → `dsh-composer-plus`。已在 dsh 0.2.0-rc.2(桌面版和网页版)和 0.2.1-rc.2(网页版)上测试。
|
|
333
348
|
|
|
334
349
|
## 开发
|
|
@@ -393,6 +408,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
393
408
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
394
409
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
395
410
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
411
|
+
# Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
|
|
412
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
396
413
|
```
|
|
397
414
|
|
|
398
415
|
```sh
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|