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.ru.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness с Composer Plus: у работающего проекта на боковой панели крутится индикатор, а панель изменений показывает git diff"></p>
|
|
16
16
|
|
|
17
|
-
Неофициальный плагин сообщества. Сетевые запросы плагин делает только для проверки обновлений (выпуски GitHub и реестр npm). Чтобы при запуске их не было, выключите **Автоматические обновления**. **Идеи функций** обращается к модели вашего чата, только когда вы нажимаете **Предложить функции**. **Предсказание следующего сообщения** (по умолчанию включено) обращается к модели, выбранной в настройках (по умолчанию это модель dsh, если вы не выберете другую), один раз после каждого завершённого хода, без нажатия. Чтобы остановить эти запросы, выключите его в **Настройки → Composer Plus**. **Дополнение при вводе** (по умолчанию выключено) после включения обращается к выбранной для него модели (по умолчанию это модель предсказания) при каждой паузе в наборе. **Улучшить промпт** обращается к модели, только когда вы нажимаете волшебную палочку. **Мобильное подключение** (по умолчанию выключено) принимает подключения iPhone из вашей локальной сети или tailnet только после того, как вы его включите.
|
|
17
|
+
Неофициальный плагин сообщества. Сетевые запросы плагин делает только для проверки обновлений (выпуски GitHub и реестр npm). Чтобы при запуске их не было, выключите **Автоматические обновления**. **Идеи функций** обращается к модели вашего чата, только когда вы нажимаете **Предложить функции**. **Предсказание следующего сообщения** (по умолчанию включено) обращается к модели, выбранной в настройках (по умолчанию это модель dsh, если вы не выберете другую), один раз после каждого завершённого хода, без нажатия. Чтобы остановить эти запросы, выключите его в **Настройки → Composer Plus**. **Дополнение при вводе** (по умолчанию выключено) после включения обращается к выбранной для него модели (по умолчанию это модель предсказания) при каждой паузе в наборе. **Улучшить промпт** обращается к модели, только когда вы нажимаете волшебную палочку. **Проверка цели** (по умолчанию включена) обращается к модели один раз каждый раз, когда агент в автоматическом раунде отмечает `/goal` как выполненную. **Мобильное подключение** (по умолчанию выключено) принимает подключения iPhone из вашей локальной сети или tailnet только после того, как вы его включите.
|
|
18
18
|
|
|
19
19
|
## Установка
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Затем перезапустите dsh. (CLI не может устанавливать плагины в профиль настольного приложения: им управляет само приложение.)
|
|
31
31
|
|
|
32
|
-
> pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.
|
|
32
|
+
> pnpm в dsh пропускает версии, которые вышли меньше 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>Правая боковая панель → `+` → **Изменения**. Выберите **Незафиксированные**, **Непроиндексированные**, **Проиндексированные** или **Ветка**: вы увидите изменённые файлы со счётчиками `+/-`. Нажмите на файл, чтобы открыть его diff. **Последний ход** открывает встроенный обзор dsh для последнего хода. Нажмите на имя ветки (или выберите **Дерево**), чтобы увидеть дерево веток. Нажмите на ветку над ним, чтобы перейти к ней, или на коммит, чтобы увидеть его файлы и их diff. **Этот чат** показывает только файлы, которые записали файловые инструменты открытого чата (write, edit) во всех его ходах, и их общий diff с первого сообщения. Кнопка **␣** скрывает изменения пробелов (`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 и манифеста,
|
|
40
|
+
| **Панель изменений** | <a id="feature-changespanel"></a>Правая боковая панель → `+` → **Изменения**. Выберите **Незафиксированные**, **Непроиндексированные**, **Проиндексированные** или **Ветка**: вы увидите изменённые файлы со счётчиками `+/-`. Нажмите на файл, чтобы открыть его diff. **Последний ход** открывает встроенный обзор dsh для последнего хода. Нажмите на имя ветки (или выберите **Дерево**), чтобы увидеть дерево веток. Нажмите на ветку над ним, чтобы перейти к ней, или на коммит, чтобы увидеть его файлы и их diff. **Этот чат** показывает только файлы, которые записали файловые инструменты открытого чата (write, edit) во всех его ходах, и их общий diff с первого сообщения. Кнопка **␣** скрывает изменения пробелов (`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; сетевых запросов при этом нет. **Открыть issue на GitHub** у идеи открывает issue с её названием и кратким описанием (и тем, почему она важна) в репозитории проекта на GitHub через ваш собственный вход в GitHub CLI (`gh`); затем рядом с идеей появляется ссылка **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 уже есть, но выключен. Эта функция включает его и хранит поисковый индекс в файле на вашем компьютере. Индекс создаётся при первом поиске после запуска (около 15 с для 250 чатов, см. «Ограничения») и сохраняется для следующих запусков. Включено по умолчанию. Изменение действует после перезапуска 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 рядом с кнопкой проекта → **Новая ветка**, затем введите первое сообщение и отправьте его. ИИ называет ветку (`feat/…`, `fix/…`) по этому сообщению, Composer Plus создаёт для неё git worktree в `<project>/.worktrees/`, копирует игнорируемые файлы из списка `.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` скрывает его. Функция предлагает только ваши собственные следующие слова: никогда не ответ вам и без выдуманных текстов ошибок или имён. Если сообщение выглядит законченным или модель не уверена, ничего не появляется. Если вы набираете следующие буквы серого текста, он остаётся, без нового вызова модели. Под её переключателем есть своё меню **Модель**. Первый пункт, **Как у предсказания следующего сообщения**, использует модель **Предсказание следующего сообщения** (выбран по умолчанию). Выберите другую модель, чтобы у каждой функции была своя, например более быстрая модель для дополнений. Она делает один вызов модели при каждой паузе в наборе, поэтому расходует намного больше токенов, чем предсказание: выберите быструю и недорогую модель. Она не работает для слеш-команды, для сообщения со значком файла и когда курсор стоит не в конце. В 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` и результат теста. Если проверка не пройдена, цель остаётся активной, агент читает причину, и начинается следующий раунд. Строка под панелью цели (**Проверка цели**) показывает тест и последний результат. **Изменить** задаёт вашу собственную тестовую команду и лимит времени или токенов; при превышении лимита цель становится заблокированной. **Запустить сейчас** запускает проверку, не закрывая цель. У функции есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Когда вы сами завершаете цель, ничего не проверяется. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Снимок экрана: Проверка цели"></a> |
|
|
61
65
|
| **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами, пока не истечёт лимит времени (по умолчанию 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 «готово»; её получает и ход, который закончился ошибкой), затем выполняющиеся или ожидающие чаты, затем чаты с активной автоматизацией (расписанием), затем остальные в порядке 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 с. Поэтому одобрения, на которые ответили автоматически (разрешения автопроверки, другие плагины), не вызывают уведомлений. Уведомление убирается, как только на его запрос ответили. Значок в Dock или на панели задач показывает число ожидающих чатов. Щелчок по уведомлению открывает этот чат. | <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>Работайте с dsh на iPhone через приложение [Tether](tether/) в той же сети Wi-Fi или через [Tailscale](https://tailscale.com). Включите функцию в **Настройки → Composer Plus** (по умолчанию она выключена, потому что открывает сетевой порт на этом Mac). Затем нажмите **Мобильное подключение** внизу слева на боковой панели, отсканируйте QR-код камерой iPhone (коснитесь **Open in Tether**) или кнопкой **Scan code** в Tether, коснитесь **Connect** и нажмите **Approve**. Сначала установите Tether: без него камера не сможет открыть код. Телефон показывает ваши чаты, отправляет
|
|
75
|
+
| **Мобильное подключение (iPhone)** | <a id="feature-mobileconnect"></a>Работайте с dsh на iPhone через приложение [Tether](tether/) в той же сети Wi-Fi или через [Tailscale](https://tailscale.com). Включите функцию в **Настройки → Composer Plus** (по умолчанию она выключена, потому что открывает сетевой порт на этом Mac). Затем нажмите **Мобильное подключение** внизу слева на боковой панели, отсканируйте QR-код камерой iPhone (коснитесь **Open in Tether**) или кнопкой **Scan code** в Tether, коснитесь **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](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 с описанием этой функции, в README на языке интерфейса dsh. Изменения применяются сразу, без перезапуска, и запоминаются на этом устройстве. По умолчанию включено всё, кроме **Мобильное подключение**, **Продолжать после перезапуска** и **Дополнение при вводе**. Переключатели этих трёх функций, а также **Поиск по содержимому**, **Откат
|
|
84
|
+
Каждую функцию можно включить или выключить отдельно: dsh **Настройки → Composer Plus**. В каждой строке есть маленький снимок экрана: наведите на него указатель, чтобы увидеть его крупнее, или нажмите, чтобы открыть в полном размере (`Esc` закрывает). Поле **Поиск функций** вверху фильтрует страницу по названию или описанию (на любом языке, без учёта регистра и диакритических знаков); `Esc` очищает его. В каждой строке есть переключатель и короткое описание. Маленький **?** после названия строки открывает часть README с описанием этой функции, в README на языке интерфейса dsh. Изменения применяются сразу, без перезапуска, и запоминаются на этом устройстве. По умолчанию включено всё, кроме **Мобильное подключение**, **Продолжать после перезапуска** и **Дополнение при вводе**. Переключатели этих трёх функций, а также **Поиск по содержимому**, **Откат хода**, **Предсказание следующего сообщения** и **Проверка цели** хранит Host dsh, поэтому они действуют во всех окнах и сохраняются после перезапуска. Выбор в меню **Модель** для **Предсказание следующего сообщения**, для **Дополнение при вводе** (по умолчанию **Как у предсказания следующего сообщения**), для **Улучшить промпт** и для **Проверка цели** (у обоих по умолчанию **Как модель чата**), а также **Лимит времени** для **Разрешить для этого чата** (по умолчанию 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
|
+
| `Cmd+F` на Mac, `Ctrl+F` в Windows и Linux | открытый чат | открыть **Поиск в чате** |
|
|
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-часть хранит только ID чатов и время их запуска в `$DSH_HOME/storages/dsh-composer-plus/resume.json` (доступ только для владельца), и ничего не покидает ваш компьютер. Чат продолжается, только если собственный журнал dsh показывает, что последний ход остановил dsh, а не вы. Одобрения и автопроверка действуют для продолженного хода как обычно.
|
|
124
135
|
|
|
125
|
-
- **Панель изменений:** git работает только на чтение на вашем компьютере, в папке самого чата, через аутентифицированный канал dsh `/api`. Он никогда не выполняет commit, stage или fetch и показывает только пути, которые перечислил сам git. Дерево показывает
|
|
126
|
-
- **Идеи функций:** ничего не запускается, пока вы не нажмёте **Предложить функции**. Затем Host-часть читает только папку самого чата (браузер никогда не отправляет путь): имена записей верхнего уровня, первые 6 КБ файлов README, AGENTS.md и манифеста (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) и `git log --
|
|
136
|
+
- **Панель изменений:** git работает только на чтение на вашем компьютере, в папке самого чата, через аутентифицированный канал dsh `/api`. Он никогда не выполняет commit, stage или fetch и показывает только пути, которые перечислил сам git. Дерево показывает до 1000 локальных и удалённых веток и последние 300 коммитов одной ветки: только линию первого родителя, поэтому коммит слияния заменяет коммиты, которые он принёс. Оно никогда не переключает ветку (checkout). **Этот чат** читает собственный журнал чата, чтобы найти файлы, которые записали его файловые инструменты, и сравнивает их со снимком отката хода этого чата во временной папке, которая сразу удаляется; он ничего не записывает ни в ваш репозиторий, ни в хранилище снимков.
|
|
137
|
+
- **Идеи функций:** ничего не запускается, пока вы не нажмёте **Предложить функции**. Затем Host-часть читает только папку самого чата (браузер никогда не отправляет путь): имена записей верхнего уровня, первые 6 КБ файлов README, AGENTS.md и манифеста (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …), структуру остальной части README (заголовки, строки таблиц, пункты списков; не более 6 КБ) и заголовки последних коммитов (`git log --format=%s`, не более 6 КБ), всего не более 28 КБ. Она пропускает `.env*`, файлы ключей и папки вроде `node_modules` и читает только обычные файлы внутри папки: символическая ссылка за пределы папки, FIFO или устройство пропускаются. Эта сводка уходит одним запросом к модели, которую использует чат, через настройки провайдера самого dsh. Она не добавляется ни в один чат. В проекте ничего не записывается. Идея, смахнутая вправо, начинает новый чат в режиме плана, поэтому одобрения и проверка плана действуют как обычно. **Создать сразу** начинает чат без режима плана: модель может сразу менять файлы, с обычными одобрениями чата и автопроверкой. Идеи, отложенные на потом (заголовок, описание, обоснование, объём работы), хранятся вместе с путём к папке проекта в `storages/dsh-composer-plus/later.json` в домашней папке dsh (файл доступен только владельцу); в проект ничего не попадает. История предложенных идей (заголовок, описание, обоснование, объём работы, дата, начата ли идея) хранится так же, в `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 делает git-снимок папки чата в собственном хранилище `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (папка доступна только владельцу). В нём хранятся копии тех файлов этой папки, которые видит git (кроме игнорируемых), поэтому оно так же конфиденциально, как сам проект. Хранилище читает объекты вашего репозитория (то, что уже есть в git, не копируется) и никогда не записывает индекс, `HEAD`, ветки, теги, stash или конфигурацию вашего репозитория. Единственное, что git там меняет, — более новая отметка времени у файлов объектов, которые он использует повторно (из-за этого `git gc` удаляет их позже). Откат с файлами записывает только обычные файлы внутри папки чата; символические ссылки, каналы (pipes) и всё за пределами папки он пропускает. Ничего не покидает ваш компьютер. Хранилище можно удалить, пока dsh закрыт (тогда откат работает только для чата, пока не появятся новые сообщения). **Удалить чат** удаляет и хранилище чата. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Откат с файлами также сохраняет файлы в том виде, в каком они были непосредственно перед ним (`refs/r/…` в том же хранилище), для кнопки **Повторить**; повторённые откаты перечислены в `$DSH_HOME/storages/dsh-composer-plus/redone.json` (доступ только для владельца).
|
|
140
|
+
- **Открыть issue на GitHub** (Идеи функций → список **На потом**): запускается, только когда вы нажимаете эту кнопку. Host-часть запускает ваш собственный GitHub CLI (`gh issue create`) в папке чата с сохранёнными названием и кратким описанием идеи (и тем, почему она важна); `gh` использует свой вход и удалённый репозиторий GitHub этой папки, поэтому issue создаётся в этом репозитории от вашей учётной записи, и GitHub показывает её всем, кто видит этот репозиторий. dsh удаляет из запускаемых им команд переменные с именами, похожими на токен; если вы передали `gh` токен через `GH_TOKEN` или `GITHUB_TOKEN`, плагин передаёт `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-часть запускает тестовую команду в папке чата в режиме песочницы этого чата (как собственный инструмент `bash` в dsh: та же политика доступа к файлам; если эта песочница не может запуститься, тест не запускается и проверка не пройдена). Чтобы найти команду, она читает только `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 с той же домашней папкой dsh удерживает блокировку чата. Закройте это окно или dsh и удалите чат снова. До этого чат остаётся в архиве.
|
|
150
166
|
- **iPhone не подключается после включения «Tailscale only»:** Tailscale должен быть включён и на Mac, и на iPhone. Панель «Мобильное подключение» предупреждает, если на Mac он выключен. Журнал доступа показывает каждую отклонённую попытку и её причину.
|
|
151
167
|
- **Чат не продолжился после перезапуска:** функция «Продолжать после перезапуска» была выключена, когда dsh завершил работу; вы сами остановили этот ход; ход уже закончился (готово или сбой); чат был в архиве; или работало больше 20 чатов (продолжаются 20 самых новых).
|
|
152
|
-
-
|
|
168
|
+
- **Открыть issue на GitHub сообщает «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`: установите его или запустите dsh из терминала, в котором `gh` работает.
|
|
169
|
+
- **На строке чата нет метки ветки:** у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
|
|
170
|
+
- **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, 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
|
+
- **Открыть issue на GitHub** требует GitHub CLI (`gh`) в PATH dsh и удалённый репозиторий GitHub в папке чата. Команда работает не дольше 60 с; если `gh` работает дольше, issue может уже существовать на GitHub без ссылки в списке (прежде чем нажать ещё раз, проверьте GitHub: список читает ссылку только из завершённого запуска, поэтому новое нажатие может открыть вторую issue). Папка с несколькими удалёнными репозиториями GitHub использует значение по умолчанию самого `gh` (`gh repo set-default`).
|
|
197
|
+
- **Чаты, которые изменили этот файл**, как и **Этот чат**, знают только файловые инструменты dsh (`write`, `edit`, `str_replace_editor`): изменение, сделанное командой (`bash`), в списке не появляется. Список читает 300 самых новых чатов репозитория (по времени создания) и сообщает, если их больше; он показывает не более 100 строк. Переименованный файл показан под тем именем, которое записал инструмент. Чат, папка которого находится вне репозитория (в том числе через другой путь к тем же файлам), не учитывается. Первое открытие после запуска dsh читает все журналы чатов репозитория (около 4 с для 275 чатов); последующие открытия читают только чаты, изменившиеся с тех пор.
|
|
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 (`startSession` службы рабочих областей dsh). Если обновление dsh его переименует, **Новый сеанс** откроется там, где выберет dsh (открытый или последний проект). Каждый вызов без проекта использует значение по умолчанию: кнопка на боковой панели, её сочетание клавиш, логотип, а также **Создать** на странице **Задачи автоматизации**. При запуске dsh по-прежнему открывает последний чат. Общая папка создаётся и добавляется в ваши проекты при первом использовании; в Windows или Linux с перемещённой папкой Documents она может отличаться от папки самого dsh.
|
|
181
206
|
- Для подсказки в поле ввода у dsh тоже нет точки расширения, поэтому текст **Предсказание следующего сообщения** накладывается на собственный текст-заполнитель dsh (`[data-composer-placeholder]`). Если обновление dsh изменит эту разметку, предсказание не появится. Пока функция включена, каждый завершённый ход стоит один короткий вызов модели.
|
|
182
207
|
- **Дополнение при вводе** показывает свой текст через собственную подсказку поля ввода dsh (стиль `--dsh-composer-hint`, который dsh использует для подсказки аргумента слеш-команды). Функция не работает для слеш-команды, для сообщения со значком файла или символа и когда курсор стоит не в конце сообщения. Если обновление dsh изменит этот стиль, дополнение не появится. Каждая пауза в наборе стоит один вызов модели.
|
|
183
208
|
- **Улучшить промпт** видит только краткую сводку проекта, изменённые пути и пути, имена которых совпадают с вашими словами, но не сам код. Поэтому функция может пропустить нужный файл и называет только те пути, которые получила. Прочитайте новый текст перед отправкой. Она не работает для слеш-команды и для сообщения со значком файла или символа (новый текст — обычный текст, поэтому значок бы потерялся), а в сообщении может быть не более 8 000 символов. Изображения остаются прикреплёнными: меняется только текст. Каждое нажатие стоит один вызов модели; сильной модели может понадобиться минута (`Esc` отменяет).
|
|
209
|
+
- **Проверка цели** проверяет только выполнение, которое агент отмечает в автоматическом раунде цели: выполнение, о котором вы просите в чате, `/goal` и панель цели не проверяются. Агент может сам изменить тесты или файлы тестовой команды; верификатор читает чат и может это увидеть, но может ошибиться в обе стороны (ошибочное «не выполнено» стоит ещё одного раунда; ошибочное «выполнено» закрывает цель). Верификатор видит чат и `git status`, но не сам код. Запуск тестов используется повторно, только если последним шагом агента, который может менять файлы, был его собственный успешный запуск `bash` точно той же команды в той же папке; команда с конвейером (`| tail`) или `&&` повторно не используется. Бюджет измеряется, когда заканчивается ход, поэтому один ход может его превысить. Учитываются только вызовы модели самого чата (не его субагентов). `update_goal` ждёт, пока идёт проверка (тест не более 15 минут, верификатор не более 3 минут). Ответвление получает новый id чата, поэтому начинает без собственной тестовой команды и лимитов родительского чата. Каждое выполнение, которое доходит до верификатора, стоит одного вызова модели.
|
|
184
210
|
- Встроенную поддержку запросили у разработчиков dsh: `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 улучшить мой промпт перед отправкой, как кнопка Enhance prompt в Roo Code или Augment?** Да, с функцией **Улучшить промпт** (включена по умолчанию): напишите черновой запрос и нажмите волшебную палочку рядом с меню моделей. Функция переписывает текст с этим чатом и проектом в качестве контекста, на вашем языке, и не отправляет его. `Cmd/Ctrl+Z` или **Отменить улучшение** возвращает ваш текст. Модель для неё выбирается в **Настройки → Composer Plus → Улучшить промпт → Модель**.
|
|
209
235
|
|
|
236
|
+
**Можно ли сделать так, чтобы агент сам не отмечал свою работу как выполненную, как в циклах с верификатором из loop engineering?** Да, с функцией **Проверка цели** (включена по умолчанию): начните цель командой `/goal`. Когда агент говорит, что цель выполнена, запускаются тесты проекта, а независимый вызов модели сверяет цель с чатом; если что-то не пройдено, цель остаётся открытой, а агент читает причину. Свою тестовую команду, лимит времени или лимит токенов задайте кнопкой **Изменить** в строке **Проверка цели** под целью.
|
|
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
|
**Как сделать, чтобы автопроверка не спрашивала об одном и том же инструменте в одном чате?** Нажмите **Разрешить для этого чата** на карточке одобрения. Разрешение действует только для этого инструмента в этом чате, по умолчанию 1 час; отозвать его можно через значок в заголовке. Изменить время можно в **Настройки → Composer Plus → Разрешить для этого чата**.
|
|
@@ -237,6 +269,12 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
237
269
|
|
|
238
270
|
**Как пользоваться dsh с iPhone?** Соберите приложение Tether из `tether/ios` (Xcode), включите **Настройки → Composer Plus → Мобильное подключение (iPhone)**, нажмите **Мобильное подключение** внизу слева, отсканируйте QR-код (камерой iPhone или кнопкой **Scan code** в Tether), коснитесь **Connect** и нажмите **Approve**. Вне дома используйте Tailscale на обоих устройствах.
|
|
239
271
|
|
|
272
|
+
**Как сделать, чтобы Новый сеанс всегда открывался в одном проекте?** Настройки → Composer Plus → **Рабочая область по умолчанию для нового сеанса** → **Открывать «Новый сеанс» в** → выберите проект. «`+`» рядом с другим проектом по-прежнему открывает этот проект.
|
|
273
|
+
|
|
274
|
+
**Как работать над несколькими функциями одного проекта одновременно, каждой в своей ветке?** С функцией **Ветка для каждого чата**: новый чат → кнопка ⑂ main → **Новая ветка**, затем отправьте первое сообщение. Каждый чат получает свою ветку и папку worktree, а также ваши `.env` и `node_modules`, если они перечислены в `.worktreeinclude`. Заголовок чата показывает, в какой ветке вы находитесь.
|
|
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 функции в `SHOT_OF` в `client.js` и в `SHOTS` в `index.js` и включите в пакет `assets/features/<id>.webp` (снимок из одноразового демо-dsh с английским интерфейсом, около 60 КБ или меньше). Добавьте функцию с тем же изображением в `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
|
-
Тесты запускают настоящий `client.js` с фальшивым React/DOM и настоящий `index.js` (Host-часть) с временным репозиторием git. Тесты шлюза Tether (`test/tether-gateway.test.mjs`) используют имитацию хоста dsh и настоящий TLS-шлюз. Приложение для iPhone находится в `tether/ios` (см. [tether/README.md](tether/README.md) и [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` проверяет историю ввода в настоящем браузере с одноразовым `dsh web`, у которого свой `DSH_HOME`.
|
|
340
|
+
Тесты запускают настоящий `client.js` с фальшивым React/DOM и настоящий `index.js` (Host-часть) с временным репозиторием git. Тесты шлюза Tether (`test/tether-gateway.test.mjs`) используют имитацию хоста dsh и настоящий 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 web`, у которого свой `DSH_HOME`.
|
|
287
341
|
|
|
288
342
|
Языковые пакеты — это JSON-файлы только с данными в `locales/<id>.json`. `npm run build:locales` встраивает их в единственную клиентскую точку входа (без сервиса перевода и без загрузки во время работы). `npm test` проверяет, что каждый пакет покрывает все ключи и сохраняет те же подстановки и переносы строк, а также проверяет работу системного языка и ручного выбора. Для изолированных проверок в настоящем приложении с локально установленным Playwright:
|
|
289
343
|
|