dsh-composer-plus 1.22.0 → 1.24.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 +46 -11
- package/README.es.md +46 -11
- package/README.fr.md +46 -11
- package/README.hi.md +46 -11
- package/README.id.md +46 -11
- package/README.ja.md +46 -11
- package/README.ko.md +46 -11
- package/README.md +46 -11
- package/README.pt-BR.md +46 -11
- package/README.ru.md +46 -11
- package/README.tr.md +46 -11
- package/README.vi.md +46 -11
- package/README.zh.md +46 -11
- package/assets/features/assistant.webp +0 -0
- package/assets/features/featureFilter.webp +0 -0
- package/assets/features/issueReport.webp +0 -0
- package/assets/features/previewQuote.webp +0 -0
- package/assets/features/remoteComputers.webp +0 -0
- package/assets/features/turkishSkill.webp +0 -0
- package/assets/features/untangleCodebase.webp +0 -0
- package/assets/features/windowSize.webp +0 -0
- package/assets/skills/untangle-codebase/LICENSE +21 -0
- package/assets/skills/untangle-codebase/SKILL.md +142 -0
- package/client.js +1044 -164
- package/index.js +800 -39
- package/package.json +4 -3
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +40 -11
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
|
-
Неофициальный плагин сообщества.
|
|
17
|
+
Неофициальный плагин сообщества. Проверка обновлений делает сетевые запросы (выпуски GitHub и реестр npm). Чтобы при запуске их не было, выключите **Автоматические обновления**. **Пакет навыка для турецкого** (включён по умолчанию) загружает turkish-anti-ai-skill с GitHub и раз в день проверяет новую версию, только пока **Язык приложения** — Türkçe; выключите его в **Настройки → Composer Plus**, чтобы остановить эти запросы. **Идеи функций** обращается к модели вашего чата, только когда вы нажимаете **Предложить функции**. **Предсказание следующего сообщения** (по умолчанию включено) обращается к модели, выбранной в настройках (по умолчанию это модель dsh, если вы не выберете другую), один раз после каждого завершённого хода, без нажатия. Чтобы остановить эти запросы, выключите его в **Настройки → Composer Plus**. **Дополнение при вводе** (по умолчанию выключено) после включения обращается к выбранной для него модели (по умолчанию это модель предсказания) при каждой паузе в наборе. **Улучшить промпт** обращается к модели, только когда вы нажимаете волшебную палочку. **Доска задач** обращается к модели нового чата один раз для тегов каждой задачи, которую вы начинаете на доске. В режиме **Сводка ИИ** (по умолчанию **Быстро (без ИИ)**) она также обращается к модели работающего чата за короткой заметкой о ходе работы, пока вы смотрите ход этой задачи на доске или в Tether. **Проверка цели** (по умолчанию включена) обращается к модели один раз каждый раз, когда агент в автоматическом раунде отмечает `/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.24.0`.
|
|
33
33
|
|
|
34
34
|
## Функции
|
|
35
35
|
|
|
@@ -48,6 +48,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
48
48
|
| **Сохранять фокус в поле ввода** | <a id="feature-keepfocus"></a>После отправки команды `/` или навыка курсор остаётся в поле ввода, и можно сразу печатать дальше. Это работает и для клавиатурных макросов, которые вводят команду и нажимают `Enter`. Пока dsh обрабатывает команду, поле ввода доступно только для чтения, и браузер снимает с него фокус. Эта функция возвращает фокус, если он не занят меню, диалогом или другим полем. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Снимок экрана: Сохранять фокус в поле ввода"></a> |
|
|
49
49
|
| **Подгонять карточку вопроса под окно** | <a id="feature-questionfit"></a>Когда агент задаёт вам вопрос, вопрос и ответы прокручиваются в карточке вместе, а **Пропустить** и **Отправить** остаются видны внизу. Карточка занимает высоту окна (минус 200 px на заголовок чата и полосу чата), поэтому растёт и уменьшается вместе с окном. Без этой функции dsh ограничивает карточку 60% окна (не больше 520 px) и прокручивает только ответы: длинный вопрос может вытолкнуть из карточки свой конец, ответы и кнопки. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Снимок экрана: Подгонять карточку вопроса под окно"></a> |
|
|
50
50
|
| **Подогнать заголовок чата под окно** | <a id="feature-headerfit"></a>В узком окне кнопки в заголовке чата dsh (режим, субагенты, фоновые задачи, Открыть в, метка ветки и метка разрешений) больше не перекрывают друг друга. Название чата сохраняет не меньше 120 px; кнопки, которые не помещаются, переходят на вторую строку справа, и каждая остаётся кликабельной. Когда всё помещается в одну строку (широкое окно), заголовок точно такой же, как у dsh. Без этой функции dsh сжимает только название: при субагенте и фоновых задачах его кнопки наезжают друг на друга в узкой колонке чата. Метка ветки (**Ветка для каждого чата**) и метка разрешений (**Разрешить для этого чата**) подстраиваются под заголовок и при выключенном переключателе. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Снимок экрана: Подогнать заголовок чата под окно"></a> |
|
|
51
|
+
| **Запоминать размер окна** | <a id="feature-windowsize"></a>Настольное приложение dsh при каждом запуске открывает окно размером 1280 × 820. С этой функцией окно открывается с тем размером и положением, которые были в прошлый раз. Размер сохраняется каждый раз, когда вы меняете размер окна или перемещаете его, и возвращается при следующем запуске, когда загружается плагин. Полноэкранное или свёрнутое окно не сохраняется; положение на экране, который сейчас не подключён, переносится на основной экран. Только в настольном приложении: вкладка браузера не может менять размер своего окна. | <a href="assets/features/windowSize.webp"><img src="assets/features/windowSize.webp" width="160" alt="Снимок экрана: Запоминать размер окна"></a> |
|
|
51
52
|
| **Продолжение в один клик** | <a id="feature-continuebutton"></a>После остановленного, завершившегося сбоем или оборванного хода в пустом поле ввода появляется **▶**. Один щелчок продолжает работу с текущего разговора. Ничего не нужно писать в поле ввода, и в чате не появляется новое сообщение. (Модель получает короткую скрытую заметку «продолжи с того места, где остановился», потому что некоторые провайдеры, например Claude, отклоняют запрос, который заканчивается ответом ассистента.) Сообщения в очереди остаются в ней: ▶ продолжает только остановленную задачу, а потом выполняется очередь. После завершённого хода остаётся обычная кнопка отправки. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Снимок экрана: Продолжение в один клик"></a> |
|
|
52
53
|
| **Продолжать после перезапуска** | <a id="feature-resumeafterrestart"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Если выйти из dsh (или он закроется), пока чат работает, этот чат сам продолжит работу, когда вы снова откроете dsh. Он получает ту же скрытую заметку, что и при продолжении в один клик. Если выполнялся раунд цели (`/goal`), цель продолжается со следующего раунда (при каждом запуске dsh приостанавливает цели, пока вы их не возобновите). Чаты, которые вы остановили, которые завершились или завершились сбоем, не продолжаются. В самом dsh такой настройки нет: он только помечает такой ход как прерванный. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Снимок экрана: Продолжать после перезапуска"></a> |
|
|
53
54
|
| **Перетаскивание в очереди** | <a id="feature-queuereorder"></a>У сообщений в очереди появляется маркер (⠿). Перетащите его, чтобы изменить порядок, или переведите на него фокус и нажмите `↑` / `↓`. `Esc` отменяет перемещение. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Снимок экрана: Перетаскивание в очереди"></a> |
|
|
@@ -69,9 +70,12 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
69
70
|
| **Продолжить в новом чате** | <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
71
|
| **Состав контекста** | <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
72
|
| **Запланированные шаги** | <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> |
|
|
73
|
+
| **Пакет навыка для турецкого** | <a id="feature-turkishskill"></a>Только пока **Язык приложения** — Türkçe (включено по умолчанию; выключите в **Настройки → Composer Plus**). Composer Plus загружает с GitHub навык с открытым кодом [turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) (MIT, автор Yüce Zerey) и добавляет его в навыки dsh. Попросите агента очеловечить, переписать или написать текст на турецком: dsh загружает навык, и его правила помогают агенту писать естественный турецкий без шаблонов ИИ. Сохраняются только файлы Markdown пакета; каждый файл должен совпадать со списком файлов GitHub, и ни один скрипт пакета не запускается. Раз в день плагин спрашивает GitHub о новой версии и устанавливает её. Строка показывает установленную версию или причину, по которой она не установлена. На другом языке навык не устанавливается; верните язык Türkçe, и он вернётся. | <a href="assets/features/turkishSkill.webp"><img src="assets/features/turkishSkill.webp" width="160" alt="Снимок экрана: Пакет навыка для турецкого"></a> |
|
|
74
|
+
| **Распутать кодовую базу** | <a id="feature-untanglecodebase"></a>Включено по умолчанию; выключить можно в **Настройки → Composer Plus**. Добавляет в список навыков dsh навык `/untangle-codebase` из [caldoai/skills](https://github.com/caldoai/skills) (MIT, © 2026 Maze). Введите в чате `/untangle-codebase` (навык есть в меню `/`), при желании с областью, на которой нужно сосредоточиться, например `/untangle-codebase src/api`, и отправьте. Сначала агент спрашивает, удалять ли также комментарии, которые лишь повторяют код, и тесты, которые не могут поймать настоящую ошибку. Затем он перечисляет все копии, скрытые и лишние связи, обёртки, которые только передают вызов, мёртвый код и разовые особые случаи, планирует исправления с нуля, выполняет их как цель и проверяет снова с помощью субагентов, пока не останется ничего, что стоит исправлять. Запустить навык можете только вы: модель не видит его в своём списке навыков, поэтому в других чатах он не тратит токены. Навык с тем же именем в проекте или в `~/.dsh/skills` имеет приоритет. Запускайте его в чате функции **Ветка для каждого чата** и проверяйте результат в **Панель изменений**. В Tether: введите `/untangle-codebase` в поле сообщения. | <a href="assets/features/untangleCodebase.webp"><img src="assets/features/untangleCodebase.webp" width="160" alt="Снимок экрана: Распутать кодовую базу"></a> |
|
|
72
75
|
| **Защищённые файлы** | <a id="feature-protectedfiles"></a>Включено по умолчанию. Собственные файловые инструменты агента не могут читать или изменять файлы, подходящие под ваши шаблоны: `read`, `read_image` и `grep` по файлу отклоняются для шаблонов **чтение и запись**, а `write`, `edit` и `str_replace_editor` — для обоих видов. Агент читает причину, и ему предлагается спросить вас. Шаблоны по умолчанию: `.env*`, `*.pem` и `*.key`. Настройки → Composer Plus → **Защищённые файлы**: добавьте шаблон (например, `published/**` или `config/*.yml`), нажмите на его вид, чтобы переключить между **чтение и запись** и **только запись**, удалите его кнопкой ✕ или нажмите **Использовать значения по умолчанию**. Шаблон без `/` подходит к имени файла в любой папке. Это ограждение, а не песочница: команда оболочки (`cat .env`), скрипт или инструмент MCP всё равно могут добраться до файла (см. «Ограничения»). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Снимок экрана: Защищённые файлы"></a> |
|
|
73
76
|
| **Заблокированные команды** | <a id="feature-blockedcommands"></a>Включено по умолчанию, список изначально пуст. Команды оболочки агента (`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
77
|
| **Доска задач** | <a id="feature-taskboard"></a>Левая боковая панель → **Доска задач** или `Cmd+Shift+K` (`Ctrl+Shift+K` в Windows и Linux) в любом месте dsh. Канбан-доска ваших чатов dsh с тем же живым состоянием, что показывает боковая панель: чат, который ждёт вашего одобрения, ответа или проверки плана, находится в **На проверке** с оранжевой точкой, работающий чат — в **В работе**, завершённый чат, который вы ещё не открыли, — в **Готово** (зелёный). Когда вы открываете чат, его карточка сама уходит из **Готово**; нажмите **Недавно завершённые (N)** под зелёными карточками, чтобы увидеть прочитанные завершённые чаты (10 самых новых, затем **Показать более старые: N**; открыто или закрыто — запоминается на этом устройстве). Чат, который завершился, пока был открыт за доской (**Новая задача**), остаётся зелёным, пока вы его не откроете. Нажмите на название проекта вверху доски, чтобы открыть список проектов, и выберите проект или **Все проекты**; папка ветки для каждого чата считается частью своего проекта. Список закрывается после выбора, по `Esc` или по щелчку вне его. Введите текст в **Поиск проектов** вверху списка, чтобы найти проект по названию (регистр и диакритические знаки не важны; `Esc` очищает поле), нажмите `Enter`, чтобы выбрать первое совпадение, и нажмите **Активные за последние 2 часа**, чтобы показать только проекты с чатом, который ждёт, работает, завершился и ещё не просмотрен или изменился за последние 2 часа (настройка хранится на этом устройстве). **Новая задача** (или `n`) открывает собственный новый чат dsh в проекте, который показывает доска (при **Все проекты** — в проекте, который выбирает «Новый сеанс» dsh), поэтому вы можете добавлять файлы, использовать команды и выбирать модель, как в любом чате. Когда ваше первое сообщение отправлено, доска возвращается сама. До этого чат ждёт в самом верху столбца **В работе** как **Новая задача**: нажмите на него, чтобы написать первое сообщение. У проекта с чатом, который ждёт вас, в списке проектов есть оранжевая точка (пока какой-либо чат ждёт, она есть и у названия проекта вверху). dsh даёт чату название, а модель чата пишет до 3 тегов по этому сообщению. Нажмите на карточку, чтобы открыть её чат. Нажмите на оранжевую карточку (или на её **Ответить**), чтобы ответить прямо на доске; в панели есть **Открыть чат**, чтобы увидеть весь чат: **Отклонить** или **Разрешить один раз**, **Одобрить** или **Запросить изменения** для плана, либо варианты и ваш собственный текст для вопроса. Нажмите **×** на завершённой карточке, чтобы убрать её с доски, или откройте **Недавно завершённые** и нажмите **Очистить всё** вверху столбца **Готово**, чтобы убрать эти карточки с доски: сначала окно показывает, сколько карточек какого проекта уйдёт, а непрочитанные (зелёные) карточки остаются. В течение 8 секунд после этого кнопка **Отменить** возвращает карточки; **Убранные (N)** под столбцом **Готово** показывает список карточек, убранных с доски, а **Вернуть на доску** снова показывает одну из них в **Готово**. Ни один чат не удаляется: чаты остаются на боковой панели dsh, доска помнит это и после перезапуска (Tether показывает ту же доску), а чат, который снова запускается, возвращается на доску. Наведите указатель на карточку в **В работе** (или переведите на неё фокус клавиатуры), чтобы увидеть ход работы: сколько времени работает чат, шаг его списка задач, инструмент, который работает сейчас, и последнюю строку агента. В разделе Настройки → Composer Plus → Доска задач параметр **Ход работы при наведении** выбирает **Быстро (без ИИ)** (по умолчанию: только читает чат) или **Сводка ИИ** (один короткий вызов модели чата дополнительно пишет одно-два предложения). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Снимок экрана: Доска задач"></a> |
|
|
78
|
+
| **Ассистент** | <a id="feature-assistant"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Затем нажмите **Ассистент** на левой боковой панели (сразу под **Доска задач**): откроется один постоянный чат, которым вы пользуетесь как личным ассистентом, как чатом ChatGPT или Grok. Первое нажатие создаёт папку `~/Assistant`, добавляет её как проект "Assistant" и запускает чат с режимом разрешений workspace-write и моделью dsh по умолчанию; каждое следующее нажатие открывает тот же чат (архивированный возвращается, удалённый создаётся заново). Попросите его напомнить вам что-нибудь («напомни мне выпить воды через 2 минуты»): он использует запланированные задачи dsh, поэтому в нужное время напоминание запускает чат, а Tether присылает своё уведомление "Turn finished", когда включено «Мобильное подключение». Попросите его поискать в интернете или спросите о ваших других чатах: он может показать список чатов всех проектов (выполняется, ждёт вас или простаивает) и прочитать последние сообщения одного из них. Он также может отправить сообщение в чат, начать новый чат в проекте, остановить выполняющийся чат или архивировать чат: перед каждым из этих четырёх действий сначала появляется карточка подтверждения dsh (также в Tether), и ничего не происходит, пока вы не нажмёте **Разрешить один раз**. Инструмента для удаления у него нет. Эти инструменты и короткие инструкции есть только у этого чата; текст, который он читает на веб-странице или в другом чате, считается данными, а не приказом. Храните свой профиль в памяти этого проекта (**Память проекта**, тема "profil"), чтобы не рассказывать о себе каждый раз. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Снимок экрана: Ассистент"></a> |
|
|
75
79
|
| **Память проекта** | <a id="feature-projectmemory"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. У каждой папки проекта своя память, которую читают следующие чаты этого проекта, так же как DS Bot хранит память для каждого бота. После каждого завершённого хода один вызов модели чата читает новые сообщения (без отменённых откатом), сохраняет ваши постоянные предпочтения, решения и факты как короткие заметки и изменяет или удаляет старые. Агент также может сам сохранять, удалять и искать заметки (`memory_remember`, `memory_forget`, `memory_recall`). Заметка может быть и глобальной: её читают все проекты. Новый чат получает заметки в системном промпте; заметка, сохранённая позже, появляется со следующего чата. Файлы хранятся в формате Markdown в домашней папке dsh (`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> |
|
|
76
80
|
| **История версий памяти** | <a id="feature-memoryhistory"></a>По умолчанию включено, пока включена **Память проекта**. Перед каждым сохранением памяти (агентом, проверкой после хода, через **Открыть память**) сохраняется копия заметок в прежнем виде. В **Открыть память** выберите проект или **Глобальная память**, затем **История**: версии по дате и кто изменил память после каждой. Выберите версию, чтобы увидеть в виде diff, что изменит восстановление, затем **Восстановить**. Заметки до восстановления тоже сохраняются, поэтому его можно отменить. Для каждой памяти остаются 50 последних версий. В Tether: меню заголовка чата → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Снимок экрана: История версий памяти"></a> |
|
|
77
81
|
| **Экспорт памяти в AGENTS.md** | <a id="feature-memoryexport"></a>В **Открыть память** выберите проект, затем **Экспорт в AGENTS.md**: заметки проекта попадут в отмеченный раздел `AGENTS.md` в его папке, чтобы вы могли закоммитить их и поделиться с командой и другими инструментами агентов. Сначала вы видите изменение в виде diff; сохраняет только **Записать AGENTS.md**. Следующий экспорт заменяет только этот раздел. Глобальная память, источники и даты не записываются. В Tether: меню заголовка чата → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Снимок экрана: Экспорт памяти в AGENTS.md"></a> |
|
|
@@ -84,6 +88,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
84
88
|
| **Отклонить с примечанием** | <a id="feature-rejectnote"></a>На карточке подтверждения рядом с **Отклонить** появляется **Отклонить с примечанием…**. Нажмите её, напишите причину или что сделать вместо этого и нажмите **Отклонить** (или `Enter`; `Shift+Enter` добавляет строку, `Esc` закрывает поле). Сначала примечание уходит агенту как сообщение в ожидающий ход, затем запрос отклоняется: модель читает отказ и ваше примечание в том же ходе, без отдельного сообщения от вас. Если примечание не удалось отправить, ничего не отклоняется и поле остаётся открытым. В Tether: лист подтверждения → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Снимок экрана: Отклонить с примечанием"></a> |
|
|
85
89
|
| **Ввод секрета** | <a id="feature-secretinput"></a>Агент получает инструмент `request_secret`. Когда ему нужен пароль, токен или ключ API, он запрашивает его этим инструментом, а не в чате: в строке инструмента появляется карточка с названием, причиной, полем пароля и кнопками **Сохранить** и **Отклонить**. **Сохранить** записывает значение в файл на этом Mac, который можете читать только вы, а агент получает только путь к файлу и использует его как входные данные команды (например, `"$(cat <path>)"`). Если позже результат инструмента покажет значение, `[secret]` заменит его до того, как его увидит модель. Файл удаляется в конце хода. **Отклонить** сообщает агенту, что вы не дали значение. Выключите функцию в **Настройки → Composer Plus**, чтобы убрать инструмент. В Tether: полоса «Secret: …» над полем ввода → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Снимок экрана: Ввод секрета"></a> |
|
|
86
90
|
| **Цитата в ответе** | <a id="feature-quotereply"></a>Выделите часть ответа: над выделением появится кнопка **Цитировать**. Нажмите её: эта часть попадёт в поле ввода, в позицию курсора, как цитата Markdown (`> …`) с пустой строкой после неё, а поле ввода получит фокус, и вы напишете ответ ниже. Учитывается только текст ответа, а не рассуждения, строки инструментов или ваши собственные сообщения. Цитата содержит не больше 2 000 символов. `Cmd+Z` (`Ctrl+Z`) убирает её. В Tether: нажмите и удерживайте ответ → Quote (весь ответ). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Снимок экрана: Цитата в ответе"></a> |
|
|
91
|
+
| **Цитата из предпросмотра файла** | <a id="feature-previewquote"></a>Откройте файл на правой боковой панели (**Файлы рабочей области** или файл, который открыл чат) и выделите в нём строки: над выделением появится кнопка **Цитировать**. Нажмите её: путь к файлу, номера строк и сами строки попадут в поле ввода, в позицию курсора, чтобы агент знал, какую часть вы имеете в виду, а поле ввода получит фокус. Файлы кода и текстовые файлы дают `src/login.js:2-3` и строки как блок кода; файлы Markdown и PDF дают путь (для PDF ещё и страницу, `docs/spec.pdf#page=3`) и цитату `> …`. Путь внутри папки чата относительный. Не больше 2 000 символов. `Cmd+Z` (`Ctrl+Z`) убирает вставку. В Tether этой функции нет. | <a href="assets/features/previewQuote.webp"><img src="assets/features/previewQuote.webp" width="160" alt="Снимок экрана: Цитата из предпросмотра файла"></a> |
|
|
87
92
|
| **Побочный чат** | <a id="feature-sidechat"></a>Напишите побочный вопрос в поле ввода и нажмите кнопку с облачками (**Спросить в побочном чате**): откроется копия чата, которая ответит в режиме только чтения dsh, а чат продолжит работу. Копия знает чат до текущего момента, кроме сообщений, которые ещё ждут в очереди, и использует его модель. На панели над её полем ввода есть **Вернуть**: откроется чат, и в его поле ввода попадут ваши вопросы (как цитаты `> `) и ответы. **Назад в чат** только открывает чат. Побочный чат остаётся на боковой панели как «↳ <вопрос>»; архивируйте его там. В Tether: меню заголовка чата → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Снимок экрана: Побочный чат"></a> |
|
|
88
93
|
| **Заметки к diff** | <a id="feature-diffcomments"></a>В разделе **Панель изменений** откройте diff файла и нажмите **+** у строки (Shift+щелчок по второй строке того же блока — диапазон), напишите заметку и нажмите **Сохранить заметку**. Заметки чата ждут на панели сверху; **Отправить в поле ввода** помещает их в позицию курсора в формате Markdown: `path:12-14`, строки как блок `diff` и ваша заметка. **Очистить** удаляет их. Заметки хранятся в этом браузере, пока вы их не отправите или не очистите. Нужна **Панель изменений**. В Tether: diff файла → удерживайте строку → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Снимок экрана: Заметки к diff"></a> |
|
|
89
94
|
| **Статус проекта** | <a id="feature-projectstatus"></a>Строка проекта на боковой панели показывает ту же метку, что и его чаты: индикатор выполнения, ожидание или «готово». Поэтому даже свёрнутый проект сообщает, что чат внутри работает или ждёт вас. Сначала показывается чат, который ждёт вас, затем завершённый чат, который вы ещё не открыли (зелёная точка, даже пока другой чат ещё выполняется), затем индикатор выполнения. Наведите на метку указатель, чтобы увидеть подробности. В режиме **Дерево рабочих областей** строка родительской папки также показывает чаты каждого проекта внутри неё (например, каждой папки ветки в `.worktrees/`), даже когда папка свёрнута. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Статус проекта"></a> |
|
|
@@ -95,12 +100,14 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
95
100
|
| **Сортировка по состоянию** | <a id="feature-statusorder"></a>Боковая панель → параметры просмотра → **Сортировать** → **По состоянию** (вместе с **Одним списком**). Сначала идут завершённые чаты (с точкой dsh «готово»; её получает и ход, который закончился ошибкой), затем выполняющиеся или ожидающие чаты, затем чаты с активной автоматизацией (расписанием), затем остальные в порядке dsh. Когда вы открываете завершённый чат, он опускается ниже. Меняется только вид: чтобы вернуться, выберите **Вручную** или **По дате изменения**. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Снимок экрана: Сортировка по состоянию"></a> |
|
|
96
101
|
| **Фоновые уведомления** | <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> |
|
|
97
102
|
| **Открывать ожидающий чат при бездействии** | <a id="feature-idleswitch"></a>Когда чат задаёт вопрос, ждёт одобрения или проверки плана (оранжевая точка) или завершает ход, который вы ещё не прочитали (зелёная точка), а вы не пользуетесь dsh 30 секунд, dsh открывает этот чат. Оранжевые чаты открываются раньше зелёных. В каждой группе первым открывается тот, что ждёт дольше всех; следующий открывается ещё через 30 секунд бездействия. Нажатие клавиши, щелчок, движение мыши, колесо прокрутки или касание запускают отсчёт 30 секунд заново. Текст в поле с фокусом, выделенный текст или открытое меню либо диалог тоже не дают переключиться. Пока ожидающий чат на экране, ничего не меняется. Если вы ушли из ожидающего чата, не ответив, он может открыться снова после следующих 30 секунд бездействия. Когда открывается зелёный чат, его точка исчезает; следующий зелёный чат откроется только после того, как вы снова воспользуетесь dsh, а затем 30 секунд не будете им пользоваться. Функция работает и когда dsh в фоне, но окно dsh не выходит на передний план. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Снимок экрана: Открывать ожидающий чат при бездействии"></a> |
|
|
98
|
-
| **Следующий ожидающий чат** | <a id="feature-nextwaiting"></a>Кнопка в заголовке боковой панели показывает, сколько других чатов ждут вас, и точку цвета следующего чата: оранжевую, когда он задаёт вопрос или ждёт одобрения или проверки плана, зелёную, когда он завершил ход, который вы ещё не прочитали. Нажмите на кнопку или нажмите Cmd+Shift+E (Ctrl+Shift+E в Windows и Linux), чтобы открыть этот чат. Оранжевые чаты идут раньше зелёных; в каждой группе первым идёт чат, который ждёт дольше всех. Чат на экране не считается. Если других ожидающих чатов нет, кнопка не видна, а клавиша ничего не делает. Клавишу можно изменить на странице сочетаний клавиш dsh (Следующий ожидающий чат). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Снимок экрана: Следующий ожидающий чат"></a> |
|
|
103
|
+
| **Следующий ожидающий чат** | <a id="feature-nextwaiting"></a>Кнопка в заголовке боковой панели показывает, сколько других чатов ждут вас, и точку цвета следующего чата: оранжевую, когда он задаёт вопрос или ждёт одобрения или проверки плана, зелёную, когда он завершил ход, который вы ещё не прочитали. Нажмите на кнопку или нажмите Cmd+Shift+E (Ctrl+Shift+E в Windows и Linux), чтобы открыть этот чат. Нажатие на кнопку также находит чат на боковой панели: свёрнутый проект открывается, список прокручивается к чату, и чат мигает 5 секунд. Оранжевые чаты идут раньше зелёных; в каждой группе первым идёт чат, который ждёт дольше всех. Чат на экране не считается. Если других ожидающих чатов нет, кнопка не видна, а клавиша ничего не делает. Клавишу можно изменить на странице сочетаний клавиш dsh (Следующий ожидающий чат). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Снимок экрана: Следующий ожидающий чат"></a> |
|
|
99
104
|
| **Кнопки вариантов** | <a id="feature-optionpicks"></a>Когда ответ заканчивается списком вариантов (нумерованный список из 1–9 пунктов под заголовком «Варианты» или жирной строкой «Варианты», а также «Следующие шаги» и те же слова на языках приложения), под ответом появляется кнопка для каждого варианта. Нажатие отправляет «Option N: …» с полным текстом варианта как ваше сообщение, как будто вы его напечатали. Вариант с пометкой «(рекомендуется)» выделен. Кнопки появляются только под самым новым ответом, пока чат простаивает и поле сообщения пусто; у уже выбранного ответа и у ответа, отозванного откатом, кнопок нет. Пока кнопки видны, прогноз следующего сообщения ничего не предлагает. На карточке вопроса агента клавиши 1–9 выбирают этот вариант, как нажатие (не в поле ответа и не в первые 0,8 секунды после появления вопроса). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Снимок экрана: Кнопки вариантов"></a> |
|
|
100
105
|
| **Язык приложения** | <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> |
|
|
101
106
|
| **Мобильное подключение (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> |
|
|
102
|
-
| **Удалённые компьютеры** | <a id="feature-remotecomputers"></a>Открывайте dsh на других ваших Mac через [Tailscale](https://tailscale.com) и
|
|
103
|
-
| **Автоматические обновления** | <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` закрывает его. Окно также показывается после обновления через Настройки → Плагины или скопированную папку, один раз для каждой новой версии; при первой установке оно не показывается. **Что нового в этой версии** в строке обновлений открывает его снова. Если на диске версия новее, чем запущенная, строка просит перезапустить dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Снимок экрана: Автоматические обновления"></a> |
|
|
107
|
+
| **Удалённые компьютеры** | <a id="feature-remotecomputers"></a>Открывайте dsh на других ваших Mac через [Tailscale](https://tailscale.com) и работайте с ними в этом окне dsh. Включите функцию в **Настройки → Composer Plus** на каждом Mac (по умолчанию она выключена, потому что открывает сетевые порты). На Mac, который вы хотите открыть, включите **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку. На этом Mac выберите **Добавить компьютер…** в меню выбора компьютера на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** (не имя этого Mac и не имя другого компьютера) и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого меню показывает **Этот Mac** и ваши компьютеры. Выберите компьютер, и его dsh займёт это окно со своими чатами, боковой панелью, инструментами и файлами, а этот Mac продолжит работать за ним. Меню выбора остаётся на том же месте и показывает **Вернуться к этому Mac**: нажмите, чтобы вернуться. Если компьютеров больше одного, нажатие открывает меню, где вы выбираете **Этот Mac** или другой компьютер. Панель настроек переименовывает и удаляет компьютеры и показывает компьютеры, которые могут открывать этот Mac (**Удалить** сразу отключает любой из них). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Снимок экрана: Удалённые компьютеры"></a> |
|
|
108
|
+
| **Автоматические обновления** | <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` закрывает его. Под примечаниями одна строка просит поставить звезду на GitHub, не чаще одного раза в 30 дней (без сетевого запроса); после **Поставить звезду на GitHub** или **Больше не спрашивать** она больше не показывается. Окно также показывается после обновления через Настройки → Плагины или скопированную папку, один раз для каждой новой версии; при первой установке оно не показывается. **Что нового в этой версии** в строке обновлений открывает его снова. Если на диске версия новее, чем запущенная, строка просит перезапустить dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Снимок экрана: Автоматические обновления"></a> |
|
|
109
|
+
| **Фильтр «вкл./выкл.»** | <a id="feature-featurefilter"></a>Рядом с полем **Поиск функций** в разделе **Настройки → Composer Plus**: **Все** показывает все функции, **Включённые** — только функции с включённым переключателем, **Выключенные** — только с выключенным. Решает переключатель самой строки, в том числе переключатель, который хранит Host dsh (например, **Мобильное подключение**). Фильтр работает вместе с поиском: введите слово и выберите **Выключенные**, чтобы найти функцию, которую вы выключили. Строка, которую вы переключили при выбранном фильтре **Включённые** или **Выключенные**, остаётся, пока вы снова не выберете фильтр, поэтому фокус остаётся на её переключателе. **Включённые** и **Выключенные** скрывают строки **Язык приложения** и **Обновления Composer Plus** (у них нет переключателя). Настройки каждый раз открываются с фильтром **Все**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Снимок экрана: Фильтр «вкл./выкл.»"></a> |
|
|
110
|
+
| **Сообщить о проблеме** | <a id="feature-issuereport"></a>Настройки → Composer Plus → **Сообщить о проблеме…** (под вводным текстом) или правый щелчок по чату на боковой панели (или его меню **…**) → **Сообщить о проблеме с Composer Plus…**. Выберите тип: **Ошибка**, **Запрос функции**, **Улучшение**, **Перевод** или **Вопрос**. Напишите описание своими словами и на своём языке, затем нажмите **Написать черновик** (или `Cmd/Ctrl+Enter`). Один вызов модели dsh по умолчанию пишет issue на английском: заголовок с префиксом типа (например, `[Bug]`) и разделы этого типа (для ошибки: What happened, Steps to reproduce, Expected, Actual), а также одну строку с версиями Composer Plus, dsh и системы. Прочитайте и отредактируйте заголовок и описание; **Написать заново** пишет новый черновик. **Открыть issue** открывает issue в репозитории Composer Plus на GitHub через ваш вход в GitHub CLI (`gh`) и показывает ссылку на неё. Issue публичная: текст, похожий на ключ или пароль, отклоняется. Если `gh` не может открыть issue, **Открыть на сайте GitHub** открывает собственную страницу GitHub с заполненным черновиком. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Снимок экрана: Сообщить о проблеме"></a> |
|
|
104
111
|
| **Резервное копирование** | <a id="feature-backup"></a>Настройки → Composer Plus → **Резервное копирование** → **Создать копию сейчас** записывает всю домашнюю папку dsh (чаты, настройки, плагины, MCP, навыки) в один архив в `~/Desktop/dsh-backups` вместе с контрольной суммой. Секреты в архиве скрыты: файлы учётных данных, файлы ключей (`.pem`, `.key`) и значения token, secret и password в настройках yml остаются только на этом компьютере, в `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> |
|
|
105
112
|
| **Автоматическое резервное копирование** | <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> |
|
|
106
113
|
| **Проверка журналов сеансов** | <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> |
|
|
@@ -112,7 +119,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
112
119
|
|
|
113
120
|
## Настройки
|
|
114
121
|
|
|
115
|
-
Каждую функцию можно включить или выключить отдельно: dsh **Настройки → Composer Plus**. В каждой строке есть маленький снимок экрана: наведите на него указатель, чтобы увидеть его крупнее, или нажмите, чтобы открыть в полном размере (`Esc` закрывает). Поле **Поиск функций** вверху фильтрует страницу по названию или описанию (на любом языке, без учёта регистра и диакритических знаков); `Esc` очищает его. В каждой строке есть переключатель и короткое описание. Маленький **?** после названия строки открывает часть README с описанием этой функции, в README на языке интерфейса dsh. Изменения применяются сразу, без перезапуска, и запоминаются на этом устройстве. По умолчанию включено всё, кроме **Мобильное подключение**, **Продолжать после перезапуска** и **Дополнение при вводе**. Переключатели этих трёх функций, а также **Поиск по содержимому**, **Откат хода**, **Предсказание следующего сообщения** и **Проверка цели** хранит Host dsh, поэтому они действуют во всех окнах и сохраняются после перезапуска. Выбор в меню **Модель** для **Предсказание следующего сообщения**, для **Дополнение при вводе** (по умолчанию **Как у предсказания следующего сообщения**), для **Улучшить промпт** и для **Проверка цели** (у обоих по умолчанию **Как модель чата**), а также **Лимит времени** для **Разрешить для этого чата** (по умолчанию 1 час) тоже хранит Host. **Поиск по содержимому** меняется только после перезапуска dsh (dsh читает эту настройку при запуске). До этого в его строке написано **Перезапустите dsh, чтобы применить это изменение.**
|
|
122
|
+
Каждую функцию можно включить или выключить отдельно: dsh **Настройки → Composer Plus**. В каждой строке есть маленький снимок экрана: наведите на него указатель, чтобы увидеть его крупнее, или нажмите, чтобы открыть в полном размере (`Esc` закрывает). Поле **Поиск функций** вверху фильтрует страницу по названию или описанию (на любом языке, без учёта регистра и диакритических знаков); `Esc` очищает его. Рядом кнопки **Все**, **Включённые** и **Выключенные** показывают все функции, только включённые или только выключенные (чтобы скрыть их, выключите **Фильтр «вкл./выкл.»**). В каждой строке есть переключатель и короткое описание. Маленький **?** после названия строки открывает часть README с описанием этой функции, в README на языке интерфейса dsh. Изменения применяются сразу, без перезапуска, и запоминаются на этом устройстве. По умолчанию включено всё, кроме **Мобильное подключение**, **Продолжать после перезапуска** и **Дополнение при вводе**. Переключатели этих трёх функций, а также **Поиск по содержимому**, **Откат хода**, **Предсказание следующего сообщения** и **Проверка цели** хранит Host dsh, поэтому они действуют во всех окнах и сохраняются после перезапуска. Выбор в меню **Модель** для **Предсказание следующего сообщения**, для **Дополнение при вводе** (по умолчанию **Как у предсказания следующего сообщения**), для **Улучшить промпт** и для **Проверка цели** (у обоих по умолчанию **Как модель чата**), а также **Лимит времени** для **Разрешить для этого чата** (по умолчанию 1 час) тоже хранит Host. **Поиск по содержимому** меняется только после перезапуска dsh (dsh читает эту настройку при запуске). До этого в его строке написано **Перезапустите dsh, чтобы применить это изменение.**
|
|
116
123
|
|
|
117
124
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="Настройки → Composer Plus: поиск функций, выбор языка, строка обновлений и переключатель для каждой функции; при наведении показывается снимок экрана"></p>
|
|
118
125
|
|
|
@@ -172,6 +179,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
172
179
|
- **Поиск по содержимому:** никакой новый код не ищет по вашим чатам. Плагин только включает встроенный индекс сообщений 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`.
|
|
173
180
|
- **Откат хода:** перед каждым вашим сообщением 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` (доступ только для владельца).
|
|
174
181
|
- **Открыть issue на GitHub** (Идеи функций → список **На потом**): запускается, только когда вы нажимаете эту кнопку. Host-часть запускает ваш собственный GitHub CLI (`gh issue create`) в папке чата с сохранёнными названием и кратким описанием идеи (и тем, почему она важна); `gh` использует свой вход и удалённый репозиторий GitHub этой папки, поэтому issue создаётся в этом репозитории от вашей учётной записи, и GitHub показывает её всем, кто видит этот репозиторий. dsh удаляет из запускаемых им команд переменные с именами, похожими на токен; если вы передали `gh` токен через `GH_TOKEN` или `GITHUB_TOKEN`, плагин передаёт `gh` только эти переменные. Ссылка на issue хранится вместе с идеей в `later.json`.
|
|
182
|
+
- **Сообщить о проблеме** (Настройки → Composer Plus → **Сообщить о проблеме…** или меню **…** чата → **Сообщить о проблеме с Composer Plus…**): ничего не запускается, пока вы не нажмёте кнопку. **Написать черновик** одним запросом отправляет модели dsh по умолчанию только тип и текст, который вы ввели (не чат и не проект). Host-часть добавляет одну строку с версиями Composer Plus, dsh и операционной системы и заменяет путь к вашей домашней папке на `~`. **Открыть issue** запускает ваш собственный GitHub CLI (`gh issue create --repo furkancak1r/dsh-composer-plus`) с вашим входом в `gh`, поэтому issue публичная и показывает вашу учётную запись GitHub. Текст, похожий на ключ, токен или пароль, отклоняется и не покидает ваш Mac.
|
|
175
183
|
- **Чаты, которые изменили этот файл** (Изменения, меню «…» файла): Host-часть читает журналы чатов, папка которых находится в том же репозитории, в том виде, в каком их хранит dsh, и возвращает название каждого чата, время и первую строку запроса; сам файл она никогда не открывает.
|
|
176
184
|
- **Ветка Git в строках чатов:** Host-часть запускает `git branch --show-current` (только чтение) в папке чата, когда ход начинается и когда заканчивается, и хранит только ID чата, имя ветки и время в `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (файл доступен только владельцу, 2000 самых новых чатов). Переключатель хранится рядом, в `branches.json`.
|
|
177
185
|
- **Поиск в чате** работает только на странице: он читает текст, который показывает страница, и ничего не отправляет.
|
|
@@ -180,9 +188,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
180
188
|
- **Разрешить для этого чата:** разрешения хранятся вместе со временем выдачи в `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (доступ только для владельца). Разрешение действует для одного конкретного инструмента в одном чате, пока не истечёт лимит времени (по умолчанию 1 час). Если этот инструмент может выполнять запись, разрешение покрывает и любую запись. Отозвать его можно через значок в заголовке.
|
|
181
189
|
- Автопроверка по-прежнему выполняется при каждом вызове. Если проверка завершилась сбоем, вызов никогда не разрешается автоматически.
|
|
182
190
|
- **Мобильное подключение:** выключено, пока вы его не включите. Когда оно включено, Host-часть запускает шлюз Tether: HTTPS на порту 19390, который принимает подключения только из вашей подсети Wi-Fi и вашего tailnet (100.64.0.0/10), и страницу сопряжения на `127.0.0.1:19391` (только для этого Mac). Телефону нужен одноразовый код из QR-кода (действует 5 минут) и ваше подтверждение **Approve** на Mac. Телефон закрепляет сертификат шлюза. Mac хранит только хеш токена каждого телефона (30 дней, срок продлевается при использовании); **Remove** сразу закрывает подключения этого телефона. Телефоны могут вызывать только разрешённый список методов dsh (чаты, запросы, вложения, слеш-команды, одобрения, вопросы, модели, агенты, цели), но не настройки, учётные данные, обозреватель файлов или терминал. «Tailscale only» отклоняет любое подключение из локальной сети, в том числе уже открытые. Журнал доступа хранит 200 самых новых попыток подключения (время, IP-адрес, имя устройства, разрешено или отклонено и причина) в `access.json`; токенов и кодов сопряжения в нём никогда нет. Данные: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (файлы доступны только владельцу). Подробности: [tether/README.md](tether/README.md).
|
|
183
|
-
- **Удалённые компьютеры:** функция выключена, пока вы не включите её на каждом Mac. **Разрешить другим компьютерам открывать этот Mac** открывает второй порт HTTPS (19392) только на адресе Tailscale этого Mac (не в сети Wi-Fi и без объявления через Bonjour). Другому Mac нужна одноразовая ссылка для сопряжения (действует 5 минут), соответствующий сертификат (закреплённый) и ваше подтверждение **Одобрить**. Этот Mac хранит только хеш его токена. Сопряжённый компьютер получает полный контроль над dsh на этом Mac, как если бы вы работали здесь: чаты, модели, инструменты, файлы и терминал. Удалите его на панели настроек, и его подключения сразу закроются. Mac, который открывает другой Mac, хранит токен этого компьютера в `$DSH_HOME/storages/dsh-composer-plus/computers.json` (файл доступен только владельцу). Для каждого выбранного компьютера он открывает ретранслятор (relay) на `127.0.0.1`. Страница получает одноразовую ссылку (действует 60 секунд), а ретранслятор принимает только свою страницу (свой адрес, никакой другой сайт).
|
|
191
|
+
- **Удалённые компьютеры:** функция выключена, пока вы не включите её на каждом Mac. **Разрешить другим компьютерам открывать этот Mac** открывает второй порт HTTPS (19392) только на адресе Tailscale этого Mac (не в сети Wi-Fi и без объявления через Bonjour). Другому Mac нужна одноразовая ссылка для сопряжения (действует 5 минут), соответствующий сертификат (закреплённый) и ваше подтверждение **Одобрить**. Этот Mac хранит только хеш его токена. Сопряжённый компьютер получает полный контроль над dsh на этом Mac, как если бы вы работали здесь: чаты, модели, инструменты, файлы и терминал. Удалите его на панели настроек, и его подключения сразу закроются. Mac, который открывает другой Mac, хранит токен этого компьютера в `$DSH_HOME/storages/dsh-composer-plus/computers.json` (файл доступен только владельцу). Для каждого выбранного компьютера он открывает ретранслятор (relay) на `127.0.0.1`. Страница получает одноразовую ссылку (действует 60 секунд), а ретранслятор принимает только свою страницу (свой адрес, никакой другой сайт). Страница другого Mac в этом окне может читать имена и состояния компьютеров этого Mac (без адресов и токенов) и может переключать это окно между ними. Она не может добавлять, переименовывать или удалять компьютеры и не может менять настройки этого Mac.
|
|
184
192
|
- **Обновления:** Host-часть запрашивает у `api.github.com` последний выпуск, а у `registry.npmjs.org` — именно эту версию. Никакие данные о вас или ваших чатах не отправляются. Установка идёт через менеджер плагинов dsh (`pnpm add dsh-composer-plus@<version>`; если dsh 0.2.1 отклоняет её для уже установленного плагина, то `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, и тогда профиль указывает этот URL как источник плагина), поэтому действуют встроенные проверки dsh: реестр, скрипты и совместимость версий. Предварительные выпуски и более старые версии никогда не устанавливаются.
|
|
185
|
-
-
|
|
193
|
+
- **Пакет навыка для турецкого:** включён по умолчанию и работает, только пока язык приложения — Türkçe: браузер сообщает Host-части язык интерфейса dsh. Затем не чаще раза в день Host-часть запрашивает у `api.github.com` последний коммит `yucezerey/turkish-anti-ai-skill` и его список файлов и загружает изменившиеся файлы Markdown с `raw.githubusercontent.com`. GitHub видит ваш IP-адрес, как при каждой проверке обновлений; ничего о вас или ваших чатах не отправляется. Сохраняются только обычные файлы `.md` из папки `skills/turkish-anti-ai-skill/` (не больше 20 файлов и 1 МБ), и каждый файл должен совпадать со своим идентификатором в списке файлов GitHub. Копия лежит в `$DSH_HOME/cache/composer-plus/turkish-skill/<commit>` (доступ только у владельца) и попадает в список навыков dsh; ни один скрипт пакета не запускается. Переключатель и последний сообщённый язык хранятся в `$DSH_HOME/storages/dsh-composer-plus/turkish-skill.json`. Выключение удаляет навык и копию.
|
|
194
|
+
- **Подсчёт использования:** Host-часть запрашивает у GitHub два маленьких файла из выпуска установленной версии (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/<file>`): `active.txt` раз в день, а `installed.txt` только один раз для каждой домашней папки dsh. GitHub считает эти запросы для каждого файла, поэтому автор видит только, сколько копий каждой версии запросили `active.txt` в этот день и сколько копий всего запросили `installed.txt` (число копий). В запросе нет идентификатора, cookie и данных о вас или ваших чатах; GitHub видит ваш IP-адрес, как и при каждой проверке обновлений. День последнего запроса `active.txt` хранится в `$DSH_HOME/storages/dsh-composer-plus/active.json`, а отметка о том, что `installed.txt` уже засчитан, — в `$DSH_HOME/storages/dsh-composer-plus/installed.json`. Git-клон этого репозитория и переименованная копия ничего не отправляют. Переключателя для этого нет.
|
|
186
195
|
- **Предсказание следующего сообщения:** по умолчанию включено. Чтобы остановить эти вызовы модели, выключите его в **Настройки → Composer Plus**. После каждого завершённого хода Host-часть отправляет ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста и рассуждений), не более примерно 6 000 символов (самую новую часть), выбранной модели (по умолчанию это модель dsh, если вы не выберете другую). Это один запрос через настройки провайдера самого dsh. В чате ничего не сохраняется: предположение не попадает в историю чата. Переключатель и выбранная модель хранятся в `$DSH_HOME/storages/dsh-composer-plus/predict.json` (файл доступен только владельцу).
|
|
187
196
|
- **Дополнение при вводе:** выключено, пока вы его не включите. Когда оно включено, при каждой паузе в наборе Host-часть отправляет уже набранный текст, а также ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста и рассуждений), не более примерно 3 000 символов чата, модели, выбранной для **Дополнение при вводе** (по умолчанию это модель **Предсказание следующего сообщения**). Новая пауза останавливает предыдущий запрос. В чате ничего не сохраняется. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/complete.json` (файл доступен только владельцу).
|
|
188
197
|
- **Улучшить промпт:** ничего не запускается, пока вы не нажмёте волшебную палочку. Затем Host-часть одним запросом отправляет модели, выбранной для **Улучшить промпт** (по умолчанию это модель самого чата), ваш черновик, ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста, рассуждений и сообщений, убранных откатом; не более примерно 6 000 символов, самую новую часть), ту же сводку проекта, что и **Идеи функций** (с теми же правилами для файлов: без `.env*` и файлов ключей, без символических ссылок за пределы папки, без FIFO), пути, которые `git status` показывает как изменённые, и до 30 отслеживаемых или неотслеживаемых (не игнорируемых) путей, в именах которых есть слова из вашего черновика. Другое содержимое файлов, кроме этой сводки, не отправляется. В чат и в проект ничего не записывается: ответ только заменяет ваш черновик в поле ввода, а отправлять ли его, решаете вы. Выбранная модель хранится в `$DSH_HOME/storages/dsh-composer-plus/improve.json` (файл доступен только владельцу).
|
|
@@ -190,6 +199,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
190
199
|
- **Продолжить в новом чате:** ничего не запускается, пока вы не нажмёте этот пункт. Затем Host-часть отправляет чат (так, как его читает Проверка цели: без рассуждений и шагов, убранных откатом) собственной модели чата и показывает заметку для передачи; новый чат создаёт только **Начать новый чат**. В проект ничего не записывается.
|
|
191
200
|
- **Состав контекста:** Host-часть читает только журнал чата; без вызова модели и без файлов проекта.
|
|
192
201
|
- **Доска задач:** доска показывает чаты dsh из собственных списков dsh в этом окне; своих данных о чатах она не добавляет. **Новая задача** открывает собственный новый чат dsh, и вы пишете первое сообщение в поле ввода dsh, поэтому подтверждения, песочница и модель чата действуют как обычно. Host-часть сохраняет первое сообщение этого чата как промпт карточки и отправляет его (первые 4 000 символов, больше ничего) модели этого чата ещё одним запросом, без инструментов, чтобы получить до 3 тегов. Промпт, теги и время запуска каждой задачи хранятся в `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (файл доступен только владельцу, последние 2 000), а также идентификаторы чатов, которые вы убрали с доски кнопкой **×** или **Очистить всё** (последние 5 000); переключатель хранится рядом, в `board-switch.json`. В папку проекта ничего не записывается. **Ответить** отправляет ваш ответ в ожидающий запрос dsh так же, как это делает карточка в самом чате. Старый список задач прежних версий (`board.json`) остаётся на диске без изменений и не читается. **Ход работы при наведении** читает журнал чата на этом Mac. В режиме **Быстро (без ИИ)** (по умолчанию) ничего не отправляется. В режиме **Сводка ИИ**, пока видно окно хода работы у работающей карточки (или пока доска в Tether открыта, не более чем для 8 работающих карточек), часть Host отправляет самую новую часть этого чата (не более примерно 6 000 символов: ваши сообщения, текстовые ответы агента, его вызовы инструментов и конец их результатов; без рассуждений и сообщений, убранных откатом) модели чата одним запросом без инструментов. Снова она отправляет только после того, как чат продвинулся, и не чаще одного раза в 20 секунд для каждого чата. Заметка хранится только в памяти; настройка хранится в `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (файл доступен только владельцу).
|
|
202
|
+
- **Ассистент:** чат ассистента — это обычный чат dsh в `~/Assistant`; его вызовы модели идут к модели dsh по умолчанию, как в любом чате. Его инструменты читают журналы ваших других чатов на этом Mac (названия, проекты, состояние, а с chat_read — их последние сообщения) и передают их этой модели, только когда она вызывает инструмент. Отправка, запуск, остановка и архивирование чата каждый раз ждут вашего подтверждения. Идентификатор чата хранится в `$DSH_HOME/storages/dsh-composer-plus/assistant.json`, а переключатель — в `assistant-switch.json` (файлы доступны только владельцу). Напоминания и автоматизации — это собственные запланированные задачи dsh. Ничто не покидает этот Mac, кроме запросов к модели и веб-поиска, который делает чат.
|
|
193
203
|
- **Защищённые файлы:** список и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (файл доступен только владельцу). Проверка читает только путь каждого вызова файлового инструмента (и его реальный путь), но никогда не сам файл.
|
|
194
204
|
- **Заблокированные команды:** правила и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (файл доступен только владельцу). Проверка читает только текст команды каждого вызова `bash` и `pwsh`; она ничего не запускает и ничего не отправляет.
|
|
195
205
|
- **Ввод секрета:** значение уходит из карточки (или из Tether через шлюз, который не записывает содержимое запросов) на Host только в запросе ответа. Host записывает его в `$DSH_HOME/storages/dsh-composer-plus/secrets/<случайное имя>` (папка 0700, файл 0600); ничего не попадает в проект, журнал чата или результат инструмента. Host хранит значение в памяти, чтобы заменять его на `[secret]` в следующих результатах инструментов этого чата. Файл и эта копия удаляются в конце хода чата и при запуске dsh. Переключатель находится рядом, в `secrets.json`. Команда, которую агент запускает с этим файлом, может отправить значение туда, куда отправляет эта команда: в этом и состоит цель.
|
|
@@ -212,10 +222,11 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
212
222
|
- **Чат не продолжился после перезапуска:** функция «Продолжать после перезапуска» была выключена, когда dsh завершил работу; вы сами остановили этот ход; ход уже закончился (готово или сбой); чат был в архиве; или работало больше 20 чатов (продолжаются 20 самых новых).
|
|
213
223
|
- **После перезапуска очередь пуста:** очередь очищает сам dsh при завершении. Функция «Продолжать после перезапуска» возвращает её только в чате, который продолжается; в других чатах отправьте сообщения снова. Сообщение, удалённое прямо перед выходом, может вернуться: удалите его снова.
|
|
214
224
|
- **Открыть 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` работает.
|
|
225
|
+
- **«Сообщить о проблеме» сообщает «gh could not open the issue»:** это первая строка вывода самого `gh`. Выполните `gh auth status` в терминале и войдите с помощью `gh auth login`. Или нажмите **Открыть на сайте GitHub**: откроется собственная страница новой issue на GitHub с заполненным черновиком, и вы отправите её там.
|
|
215
226
|
- **На строке чата нет метки ветки:** боковая панель не в режиме «Одним списком» (в режимах «По рабочей области» и «Дерево рабочих областей» ни одна строка чата не показывает метку), у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
|
|
216
227
|
- **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
|
|
217
228
|
- **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
|
|
218
|
-
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.
|
|
229
|
+
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.24.0`), см. примечание об установке выше.
|
|
219
230
|
- **Кнопка «Создать копию сейчас» сообщает «Уже выполняется другое действие с резервными копиями»:** действие выполняется в другом окне dsh или в аварийной консоли (они используют общий файл блокировки `.composer-plus.lock` в папке резервных копий). Дождитесь его окончания. Если никакое действие не выполняется, блокировку закрытого процесса перехватит следующее нажатие.
|
|
220
231
|
- **Аварийная консоль сообщает «dsh is running»:** сначала выйдите из dsh. Если dsh действительно закрыт, файл, названный в сообщении, остался после сбоя: удалите его и повторите попытку.
|
|
221
232
|
- **После восстановления dsh не запускается или не хватает плагина:** пакеты плагинов профиля нужно установить заново. Аварийная консоль предлагает это после восстановления; или выполните `pnpm install` в каждой папке внутри `$DSH_HOME/profiles/`, которую она перечисляет. Секреты, которых не было в vault (другой компьютер), нужно ввести заново: консоль перечисляет их.
|
|
@@ -237,9 +248,11 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
237
248
|
- dsh 0.2.1 загружает обновление сразу, если новая версия не меняет никаких настроек dsh; в остальных случаях, а также в dsh 0.2.0, перезапустите dsh, чтобы загрузить его. Плагин никогда не перезапускает dsh за вас. Профили Web/CLI без менеджера плагинов dsh только сообщают о новой версии.
|
|
238
249
|
- **Что нового в Composer Plus N** показывает примечания на языке из **Язык приложения**. Язык интерфейса с другим регионом получает примечания своего основного языка (`en-GB` — английские, `zh-TW` — китайские примечания `zh`). Для языка без примечаний (его добавляет другой языковой пакет, или это `pt-PT`, а не `pt-BR`) показываются английские примечания. Примечания приходят вместе с новой версией. Если у запущенной копии нет читаемого файла примечаний (`release-notes.json`), окно показывает английские примечания с GitHub.
|
|
239
250
|
- Версия, установленная во время работы dsh (обновление через Настройки → Плагины или скопированную папку), загружается только после перезапуска dsh: до этого **Обновления Composer Plus** показывает запущенную версию и просит перезапустить dsh. Её окно **Что нового в Composer Plus N** показывается один раз при первом запуске этой версии. Первый запуск после установки плагина не показывает окно; **Что нового в этой версии** открывает примечания запущенной версии.
|
|
251
|
+
- Строка со звездой GitHub под примечаниями не может знать, поставили ли вы звезду репозиторию: плагин не делает для этого сетевых запросов. Каждый браузер (и настольное приложение) хранит свою запись, поэтому в другом браузере строка может показаться ещё раз.
|
|
240
252
|
- **Отклонить с примечанием** отправляет примечание как сообщение в ожидающий ход, а затем отклоняет запрос; dsh показывает примечание в чате как ваше сообщение. Пока поле примечания открыто, карточка показывает только **Отмена** и **Отклонить**, поэтому щелчок не может по ошибке разрешить запрос; `Esc` или **Отмена** возвращает кнопки dsh. Пустое примечание ничего не отправляет (используйте собственную кнопку **Отклонить** в dsh). Если отклонить запрос не удалось уже после отправки примечания (например, на запрос тем временем ответили в другом месте), примечание остаётся в чате, и модель прочитает его на своём следующем шаге. Кнопка встраивается в разметку карточки одобрения dsh (`data-approval-key`), потому что в dsh нет места для действий карточки; если обновление dsh изменит эту разметку, кнопка не появится, а собственная кнопка **Отклонить** в dsh работает как раньше. Примечание может содержать не более 4 000 символов.
|
|
241
253
|
- **Ввод секрета** скрывает только точный текст значения: в следующих результатах инструментов того же чата его заменяет `[secret]`. Агент всё равно может прочитать файл командой shell и вывести значение в другой форме (base64, часть значения, с пробелами), и эта форма дойдёт до модели. Собственные файловые инструменты агента (read, grep, write, edit) не могут открыть папку секретов. Если значение — ещё и частое слово, другие результаты этого чата тоже покажут `[secret]`. Файл хранится до конца хода; если dsh закроется во время хода, следующий запуск удалит его. В чате может быть только один открытый запрос одновременно. Инструмент добавляет к каждому запросу к модели около 870 символов (примерно 220 токенов, оценка): выключите его, если не пользуетесь.
|
|
242
254
|
- **Цитата в ответе** цитирует текст так, как его показывает страница: блок кода, таблица или список приходят простыми строками, без разметки Markdown. Если выделение начинается в одном ответе и заканчивается в другом или задевает рассуждения, строку инструмента или ваше собственное сообщение, кнопка не появится: выделяйте внутри одного ответа. Кнопка находит ответ по структуре чата dsh, потому что в dsh нет слота для выделения текста; если обновление dsh изменит эту структуру, кнопка не появится. Если цитата стоит в конце поля, после неё добавляется ещё одна пустая строка, чтобы следующая строка начиналась ниже; при отправке dsh удаляет пустые строки в конце.
|
|
255
|
+
- **Цитата из предпросмотра файла** читает собственный предпросмотр файлов dsh: номера строк берутся из его строк, поэтому для файлов кода и текстовых файлов они верные. Файл Markdown показывается как оформленная страница, поэтому его цитата содержит текст без разметки Markdown и без номеров строк; цитата из PDF содержит страницу, а не строку. Если выделение находится в заголовке с путём, в другом средстве просмотра (таблица, файл Office, изображение) или захватывает два открытых файла, кнопка не появится; не появится она и тогда, когда правая боковая панель развёрнута на весь экран (поля ввода тогда нет на экране). Кнопка находит предпросмотр по разметке dsh, потому что в dsh там нет слота для выделения; если обновление dsh изменит эту разметку, кнопка не появится. В поле ввода попадает только выделенный текст: если файл потом изменится, цитата не изменится.
|
|
243
256
|
- **Побочный чат** работает только на чтение благодаря собственному режиму только чтения dsh: файловые инструменты не могут писать, а команды оболочки выполняются в песочнице dsh без записи (или не выполняются, если песочница не может запуститься). Агент всё же может запросить больше доступа через карточку подтверждения dsh, а сетевой вызов (например, запрос к API) всё же может изменить что-то за пределами компьютера. Копия делается на самый новый момент, когда в очереди не ждало ни одного сообщения, поэтому вопрос, заданный, пока сообщения ждут в очереди, не видит того, что было после них. Выполняемый шаг чата в копии закрывается, поэтому побочный чат знает начало этого шага, но не его результат. Побочный чат — обычный чат: он остаётся на боковой панели и учитывается в использовании модели; архивируйте его там. «Вернуть» берёт только собственные сообщения побочного чата (не более 12 000 символов) и только последний ответ на каждый вопрос; заметки агента между вызовами инструментов не попадают. dsh не даёт плагинам места для чата на правой боковой панели, поэтому побочный чат открывается в основном виде.
|
|
244
257
|
- **Заметки к diff** работают только на панели изменений, а не в представлении «Последний ход» dsh. Диапазон должен оставаться в одном блоке diff (в одной части `@@`). Заметки хранятся в хранилище этого браузера, поэтому другой браузер или dsh на другом компьютере их не видит; Tether хранит свои заметки в памяти. Заметка сохраняет строки такими, какими они были в момент щелчка: если агент потом изменит файл, заметка покажет старые строки и номера. Не более 50 заметок на чат, 2 000 символов и 40 строк на заметку (дальше строка `…`).
|
|
245
258
|
- **Разрешить для этого чата** отсчитывает лимит времени с момента выдачи разрешения. Новый лимит времени сразу применяется к действующим разрешениям, поэтому более короткий лимит может сразу их завершить. У разрешений из версии 1.12 и более ранних нет времени: после обновления агент ещё раз спросит об этих инструментах.
|
|
@@ -247,7 +260,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
247
260
|
- **Подгонять карточку вопроса под окно** меняет только карточку вопроса dsh, а не карточку проверки плана. Она находит карточку по разметке dsh (`data-question-key`, `data-question-scroll`); если обновление dsh изменит эту разметку, карточка будет выглядеть так, как её рисует dsh. Высота карточки следует за окном, а не за чатом: в чате в узкой боковой панели высокая карточка всё ещё может выходить выше чата.
|
|
248
261
|
- **Подогнать заголовок чата под окно** находит заголовок чата dsh по его сгенерированным именам классов (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), потому что dsh не даёт точки подключения для его раскладки. Если обновление dsh переименует их, заголовок показывается так, как его рисует dsh. В очень узкой колонке чата заголовок может занять две или три строки, и места над сообщениями становится меньше.
|
|
249
262
|
- **Мобильное подключение** работает только в macOS (оно использует `en0`, `openssl`, `swift` и `dns-sd`). Оно использует фиксированные порты 19390 и 19391, поэтому на каждом Mac его может одновременно запускать только один dsh (каждый Mac — одна запись в списке Mac на телефоне). С ключом APNs в `apns.json` (см. `tether/README.md`) Mac отправляет уведомления через push-сервис Apple, поэтому они приходят и при закрытом Tether; Mac должен быть активен, а dsh открыт. Без ключа телефон получает уведомления, только пока Tether открыт или только что ушёл в фон. Tether отправляет их только после того, как вы включите в Tether «Settings → Notifications → Send notifications». Tether хранит этот переключатель и его часы отдельно для каждого сопряжённого Mac. По умолчанию он выключен на каждом Mac, а разрешение iOS запрашивает в момент включения. Приложения для iOS пока нет в App Store: соберите его из `tether/ios` в Xcode. «Tailscale only» всё равно требует адрес Wi-Fi или Ethernet на Mac (шлюз запускается только при таком адресе). Журнал доступа у каждого Mac свой и хранит только 200 самых новых попыток; повторная попытка в течение минуты увеличивает счётчик той же строки на один. Каждое уведомление показывает Mac и проект чата (`Studio Mac · recipe-box`), название чата и текст: Turn finished показывает последний ответ агента. С ключом APNs этот текст проходит через push-сервис Apple. Блокировка приложения Tether не скрывает превью уведомлений на экране блокировки iPhone: выключите их в настройках iOS. Зелёные точки в Tether следуют за Mac: у чата, который вы открыли в dsh, точка пропадает и на телефоне. У чата, который вы открыли в Tether, точка пропадает только на телефонах. Собственная точка dsh на Mac остаётся, пока вы не откроете чат на Mac.
|
|
250
|
-
- **Удалённые компьютеры** требуют Tailscale на обоих Mac и Composer Plus с включённой функцией на Mac, который вы открываете. Этот Mac не должен быть в режиме сна, и на нём должен работать dsh.
|
|
263
|
+
- **Удалённые компьютеры** требуют Tailscale на обоих Mac и Composer Plus с включённой функцией на Mac, который вы открываете. Этот Mac не должен быть в режиме сна, и на нём должен работать dsh. Меню выбора компьютера видно, только когда левая боковая панель открыта (а не свёрнута до значков). Если на странице другого Mac нет своего меню выбора (там Composer Plus версии ниже 1.23.0), меню выбора этого Mac появляется в том же месте поверх этой страницы. Если там версия 1.23.0, меню показывает имя того Mac: чтобы вернуться, выберите в нём **Этот Mac**. Каждый открытый вами компьютер держит свою страницу в памяти, пока вы не выключите функцию или не перезапустите dsh. В настольном приложении страница другого Mac — встроенная страница: собственные сочетания клавиш dsh (например, новый чат) в ней не работают, и загрузка файлов, микрофон и уведомления там тоже не работают. Функция использует порт 19392 (на каждом Mac пускать другие компьютеры может только один dsh). Со страницы другого Mac меню выбора переключает только между компьютерами этого Mac: открыть третий Mac через другой Mac нельзя.
|
|
251
264
|
- Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат. Ссылка, созданная через **Копировать ссылку на сообщение**, открывает своё сообщение только в dsh 0.2.1 и новее и только из сообщения в чате (в dsh 0.2.0 нет правил для пользовательского текста, поэтому там ссылка копируется, но показывается как обычный текст). Сообщение, которое убрал откат или которое сжатие удалило из истории, загружаемой dsh, показать нельзя: ссылка тогда сообщает об этом. Кнопки 🔗 привязаны к строкам сообщений dsh; если обновление dsh изменит эту разметку, они не появятся.
|
|
252
265
|
- **Отметить все как прочитанные** меняет собственные точки непрочитанного dsh через часть dsh, которая не является публичным API (список `completionUnread` в состоянии сеансов dsh). Если обновление dsh переименует его, пункт не появится. Пункт добавляется в меню «…» проекта в dsh, где нет места для плагинов; если dsh изменит это меню, пункт тоже не появится.
|
|
253
266
|
- **Правка сообщения в очереди на месте** не меняет сообщение, которое тем временем начало отправляться, и не перезаписывает сообщение, которое тем временем изменилось (например, в Tether на iPhone): об этом сообщает уведомление. Для нового изображения нужна модель, которая принимает изображения (действуют собственные ограничения dsh на изображения), а новый файл должен загрузиться до того, как вы сможете сохранить. Изменять можно только свои сообщения в очереди: раунд цели или ответ на вопрос в очереди изменить нельзя. После обновления плагина сразу работает только правка текста: перезапустите dsh, прежде чем сохранять сообщение с изображениями или файлами (Host-часть загружается при запуске).
|
|
@@ -255,6 +268,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
255
268
|
- Карта веток в режиме **Дерево** угадывает, куда идёт каждая стрелка, потому что git не сохраняет, в какую ветку слита ветка. Слитая ветка указывает на ветку, коммит слияния которой первым принял её. Ожидающая ветка указывает на ближайшую ветку, от которой она началась (в первую очередь на основную ветку); если две ветки начались от одного коммита, карта может выбрать не ту. У ветки, которая продвинулась перемоткой вперёд (fast-forward), нет коммита слияния, поэтому её метка **Слито** ничего не открывает. Основная ветка — это ветка по умолчанию у `origin`, иначе `main` или `master`, иначе открытая ветка. Карта читает последние 20 000 коммитов и показывает не больше 60 веток; если история длиннее, она сообщает, что некоторые стрелки могут быть неверными. Ветка, слитая через squash или rebase (например, на GitHub), показывается как **Ожидает**: git не хранит связи с её коммитами.
|
|
256
269
|
- **Этот чат** учитывает только файлы, которые записали файловые инструменты dsh (`write`, `edit`, `str_replace_editor`). Файлов, которые изменила команда (`bash`), в этом представлении нет; они показаны в разделе **Незафиксированные**. Без снимка отката хода для чата (откат хода выключен, установлен dsh-rewind-plugin или чат старше плагина) представление сравнивает с последним коммитом и сообщает об этом. Откат хода хранит 50 последних снимков чата: в более длинном чате представление сравнивает с самым старым сохранённым снимком, сообщает, с какого сообщения, и не учитывает более ранние изменения. **Скрыть изменения пробелов** — это `git diff -w`: строка, в которой изменились только пробелы внутри неё, тоже скрывается.
|
|
257
270
|
- **Открыть issue на GitHub** требует GitHub CLI (`gh`) в PATH dsh и удалённый репозиторий GitHub в папке чата. Команда работает не дольше 60 с; если `gh` работает дольше, issue может уже существовать на GitHub без ссылки в списке (прежде чем нажать ещё раз, проверьте GitHub: список читает ссылку только из завершённого запуска, поэтому новое нажатие может открыть вторую issue). Папка с несколькими удалёнными репозиториями GitHub использует значение по умолчанию самого `gh` (`gh repo set-default`).
|
|
271
|
+
- **Сообщить о проблеме** открывает issue только в репозитории Composer Plus (`furkancak1r/dsh-composer-plus`), а не в вашем проекте (для проекта используйте **Открыть issue на GitHub** в списке **На потом** функции «Идеи функций»). Для черновика нужна модель по умолчанию в dsh, а чтобы открыть issue — GitHub CLI (`gh`) с выполненным входом. Черновик всегда на английском. Модель может ошибиться в деталях: прочитайте черновик, прежде чем нажать **Открыть issue**. Открытие длится не более 60 с; если в течение часа снова отправить тот же заголовок и текст, вместо копии показывается прежняя issue. **Открыть на сайте GitHub** обрезает очень длинное описание, чтобы ссылка оставалась короткой.
|
|
258
272
|
- **Чаты, которые изменили этот файл**, как и **Этот чат**, знают только файловые инструменты dsh (`write`, `edit`, `str_replace_editor`): изменение, сделанное командой (`bash`), в списке не появляется. Список читает 300 самых новых чатов репозитория (по времени создания) и сообщает, если их больше; он показывает не более 100 строк. Переименованный файл показан под тем именем, которое записал инструмент. Чат, папка которого находится вне репозитория (в том числе через другой путь к тем же файлам), не учитывается. Первое открытие после запуска dsh читает все журналы чатов репозитория (около 4 с для 275 чатов); последующие открытия читают только чаты, изменившиеся с тех пор.
|
|
259
273
|
- **Ветка Git в строках чатов** показывает ветку папки чата на момент начала или конца его последнего хода, а не текущую ветку: переключение ветки вне хода появится после следующего хода. У чатов, созданных до этой версии, метки нет до их следующего хода. Метка встроена в разметку строк чатов dsh (в dsh нет для неё отдельного места); если обновление dsh изменит эту разметку, метка не появится. Метка видна только в режиме «Одним списком».
|
|
260
274
|
- **Ветка для каждого чата** в режиме плана: dsh отправляет `/plan <сообщение>` как команду, а не как сообщение, поэтому Composer Plus перехватывает отправку команды в поле ввода dsh (это не публичный API). Если обновление dsh это изменит, `/plan <сообщение>` при выбранном пункте **Новая ветка** выполнится на открытом экране нового чата как собственная команда dsh. Если Host не может включить режим плана в новом чате, папка ветки остаётся, а сообщение не отправляется, поэтому новый чат не меняет файлы в режиме по умолчанию.
|
|
@@ -279,7 +293,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
279
293
|
- **Продолжить в новом чате** отправляет чат (сообщения, вызовы инструментов и конец каждого результата инструмента, не более примерно 60 000 символов, самую новую часть) собственной модели чата. Заметка для передачи может пропустить решение или файл: прочитайте её перед запуском. Новый чат знает только заметку и связанный чат (dsh прикрепляет старый чат как контекст только для чтения); его контекст модели начинается с малого, а старый чат остаётся как есть. Для одного чата одновременно идёт только одна заметка или один запуск.
|
|
280
294
|
- **Состав контекста** показывает оценки по собственному правилу dsh (около 4 символов на токен), тому же правилу, что и у кольца контекста dsh; собственный подсчёт модели может отличаться. Определения инструментов взяты из самого нового запроса. Функция показывает контекст так, как он записан в журнале чата; ход, который идёт сейчас, появляется после своего следующего шага.
|
|
281
295
|
- **Запланированные шаги** экономят токены, только когда модель действительно планирует: пока функция включена, каждый запрос несёт инструмент `plan_next_steps` и короткую инструкцию (около 500 токенов), даже в чатах, где модель никогда не планирует. Условие доказывает только то, что в нём сказано (например: код выхода сборки был 0), а не то, что работа сделана верно. `ok` читает собственные отметки результата dsh (`[exit code: N]`, тайм-ауты, отказы песочницы); команда, которая завершилась неудачей без ненулевого кода выхода, считается успешной. Шаги выполняются по одному; два шага, готовые одновременно, возвращаются модели. Сообщение шага сохраняется как сообщение ассистента модели чата (в dsh нет отметки для сообщения, написанного плагином), поэтому его текст говорит, что шаг запустил Composer Plus. В Tether нет.
|
|
296
|
+
- **Пакет навыка для турецкого** устанавливает сторонний навык: его правила приходят из репозитория автора на GitHub, а не из Composer Plus, и новая версия используется со следующей ежедневной проверки без нашего просмотра. Проверка доказывает, что файлы — те, которые GitHub перечисляет для этого коммита, но не то, что правила хороши. Когда загружать навык, решает модель (вы также можете вызвать его по имени); правила относятся только к турецким текстам. Host-часть использует язык, о котором браузер сообщил последним: если два браузера используют разные языки, действует более новый. Без входа GitHub разрешает 60 запросов к API в час; при отказе проверка сохраняет установленную копию и показывает причину в настройках.
|
|
297
|
+
- **Распутать кодовую базу** содержит фиксированную копию навыка (caldoai/skills, коммит f3cf477): изменение в оригинале приходит только с новой версией Composer Plus. Навык выполняет долгую цель, которая может изменить много файлов, а его субагенты и проверки тратят много токенов. Там, где у проекта нет тестов, он может незаметно изменить поведение: запускайте его в отдельной ветке и читайте diff перед слиянием. Навык с тем же именем в проекте, в своей папке навыков или в `~/.dsh/skills` заменяет его. Пока переключатель выключен, `/untangle-codebase` уходит модели как обычный текст.
|
|
282
298
|
- **Доска задач** показывает чаты, которые dsh перечисляет в этом окне: чат вне проекта виден только в **Все проекты**, а папка ветки для каждого чата (`<project>/.worktrees/<name>`) считается частью своего проекта. Колонка карточки — это живое состояние чата, поэтому карточки нельзя перетаскивать: чат переходит в **Готово**, когда его ход заканчивается, в том числе после ошибки или остановки, и возвращается в **В работе**, когда снова запускается. Зелёная точка — это собственная точка завершения dsh, которую dsh хранит только в этом окне: после перезагрузки завершённые чаты показываются без неё. **Готово** показывает 50 последних чатов (**Показать более старые: N** показывает остальные). **Поиск проектов** находит проект только по названию, а не по пути к его папке. **Активные за последние 2 часа** скрывает проект, если каждый его чат старше 2 часов, неактивен и прочитан; доска всё равно показывает выбранный вами проект. **Новая задача** помнит только последний новый чат этого окна: если вы открываете другой чат до первого сообщения, тот чат остаётся в самом верху колонки **В работе** как **Новая задача**, пока вы в нём не напишете, но доска возвращается сама только для последнего. После перезагрузки новый чат без сообщения не показывается на доске (dsh хранит его как свой пустой «Новый сеанс»). Теги берутся из одного вызова модели на каждую задачу, по её первому сообщению: они могут быть ошибочными, а у чата, который вы начали не на доске, их нет. Название — это собственное название чата в dsh (служба названий dsh, с моделью чата); пока его нет, карточка показывает первую строку первого сообщения. **×** и **Очистить всё** только убирают карточки с доски: ни один чат не удаляется. Кнопка **Отменить** видна только 8 секунд и только в этом окне; позже карточку возвращает **Убранные (N)** → **Вернуть на доску**, а чат, который снова запускается, возвращается сам. **Очистить всё** сначала спрашивает и убирает прочитанные завершённые карточки показанного проекта (при **Все проекты** — всех проектов), в том числе те, что скрыты за **Показать более старые: N**; непрочитанная (зелёная) карточка остаётся. dsh хранит свою зелёную точку только в этом окне, поэтому после перезагрузки «Очистить всё» может убрать карточку, ответ в которой вы не прочитали. Список хранится на этом Mac и действует для всех окон и для Tether; когда в нём 5 000 чатов, самые старые возвращаются. **Ответить** отвечает только на последний запрос чата: если на него уже ответили в другом месте (другое окно, Tether, автопроверка) или чат спрашивает что-то новое, панель сообщает об этом и ничего не отправляет. В прежних версиях был список задач с комментариями и инструментами для агентов; их больше нет, а старый `board.json` не показывается. Идея и внешний вид взяты из [Kanzo](https://github.com/emanuele-em/kanzo) от emanuele-em (AGPL-3.0); Composer Plus не использует его код. `Cmd+Shift+K` — сочетание клавиш dsh: в браузере на Linux у него нет клавиши по умолчанию (задайте её на странице сочетаний клавиш dsh), а расширение браузера или другое приложение может перехватить её раньше. Карточка уходит из **Готово**, когда исчезает зелёная точка dsh (вы открыли чат), а для чата, который завершился за доской, будучи открытым чатом, — когда этот чат показан без панели поверх него. Это состояние «прочитано» хранится только в этом окне dsh, как и точки dsh: после перезагрузки или в другом окне каждый завершённый чат считается прочитанным и находится в **Недавно завершённые**.
|
|
299
|
+
- **Ассистент** — один чат для всех окон этого Mac. Он работает в режиме разрешений workspace-write: записывает файлы только в `~/Assistant`, а команда за пределами этой папки сначала спрашивает. Если переключить чат в режим без подтверждений (Полный доступ), dsh отклоняет каждое подтверждение, поэтому ассистент не может отправить сообщение в чат, начать, остановить или архивировать чат. Карточка подтверждения защищает только шесть инструментов: команда оболочки ассистента всё равно может обращаться к сети, как в любом чате с этим режимом. В dsh 0.2.0 и 0.2.1 инструменты расписания dsh видят только напоминания самого чата ассистента, а не автоматизации других чатов; начиная с dsh 0.2.2 они показывают и изменяют все запланированные задачи. chats_list не показывает архивированные и пустые чаты, чаты субагентов и сам чат ассистента; «ждёт вас» означает открытый запрос подтверждения, вопрос или проверку плана в выполняющемся чате. chat_read отдаёт сообщения пользователя и ответы агента (без вывода инструментов), не более 50 сообщений и примерно 24 000 символов. chat_archive отказывается архивировать чат, который ещё выполняется или у которого есть активные напоминания. Текст, который читает модель, всё же может ввести её в заблуждение: карточка подтверждения — последняя проверка, поэтому прочитайте её, прежде чем нажать **Разрешить один раз**.
|
|
283
300
|
- **Приоритет сообщения после остановки** работает только после того, как вы остановили чат (или после хода с ошибкой, или когда вы открываете чат, у которого ещё есть очередь): сообщение, отправленное во время хода, по-прежнему ждёт в конце очереди. Оно обгоняет только ваши собственные сообщения в очереди: если в очереди ждёт раунд цели или ответ на вопрос, остаётся порядок dsh. Функция читает часть dsh, которая не является публичным API (завершается ли ещё остановленный ход); если обновление dsh её переименует, сообщение встанет первым только после завершения этого хода. Чаты субагентов сохраняют порядок dsh.
|
|
284
301
|
- **Память проекта** принадлежит первой папке чата (папке проекта 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.
|
|
285
302
|
- **История версий памяти** хранит 50 последних версий каждой памяти (каждого проекта и глобальной памяти); более старые удаляются. Версия хранит всю память проекта, а не одну заметку. **Восстановить** возвращает все файлы этой версии (включая темы) и отказывает, если память изменилась после открытия версии; память до восстановления становится новой версией, поэтому восстановление можно отменить. Пока переключатель выключен, новые версии не сохраняются и **Восстановить** отказывает; сохранённые версии остаются. Версий до появления этой функции нет: история начинается с первого сохранения после установки.
|
|
@@ -293,6 +310,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
293
310
|
- **Восстановить** можно только в аварийной консоли, пока dsh закрыт: восстановление заменяет всю домашнюю папку dsh. Старая остаётся рядом как `.dsh.pre-restore-<time>`, пока вы её не удалите, поэтому на диске нужно место для обеих. Чаты сохраняют пути своих проектов: на другом компьютере проект по другому пути показывается как отсутствующий, пока вы не добавите его снова. Символические ссылки, которые указывают за пределы домашней папки dsh (например, навыки, подключённые ссылкой из другой папки), возвращаются как ссылки; их цели должны существовать на том компьютере.
|
|
294
311
|
- **Проверка журналов сеансов** читает самый новый журнал каждого чата по собственным правилам dsh о том, что открывается: строка, которая не является JSON или стоит не по порядку, считается повреждением, только когда после неё идёт конец хода (иначе dsh открывает чат без строк начиная с этой, поэтому чат не попадает в список). Она не сверяет события журнала с собственными правилами событий dsh, поэтому журнал, который она считает исправным, всё равно может не открыться после обновления dsh. Исправление берёт копию из резервной копии: сообщения после этой резервной копии из чата пропадают (повреждённый файл остаётся рядом). Чат, открытый в этом dsh, в Настройках не исправляется: его удерживает dsh.
|
|
295
312
|
- **Автоматическое резервное копирование** работает, только пока работает dsh: копия, срок которой наступил, пока dsh был закрыт, создаётся примерно через 45 с после следующего запуска. Снимок для новой версии создаётся после этого запуска, а не перед обновлением.
|
|
313
|
+
- **Запоминать размер окна** работает только в настольном приложении. При каждом запуске dsh сначала показывает окно размером 1280 × 820; окно переходит к сохранённому размеру, когда загружается плагин. У страницы нет события для перемещения окна, поэтому плагин читает окно раз в секунду: изменение за последние 2 секунды перед закрытием dsh не сохраняется. Размер хранится для каждого компьютера в собственном хранилище приложения.
|
|
314
|
+
- **Подсчёт использования:** считает копии, а не людей: каждая домашняя папка dsh — это одна копия. Подсчёт уникальных копий (`installed.txt`) учитывает только копии, которые обновились до первой версии с этим файлом или до более новой; копия, которая осталась на более старой версии, не учитывается. Копия, у которой удалили папку `storages`, засчитывается снова. GitHub может засчитать как один запросы с одного IP-адреса (например, с нескольких компьютеров за одним NAT-маршрутизатором), пришедшие примерно за 10 минут.
|
|
296
315
|
- Встроенную поддержку запросили у разработчиков dsh: `move` для очереди в [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), состояние «Продолжить» в [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
297
316
|
|
|
298
317
|
## Частые вопросы
|
|
@@ -331,6 +350,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
331
350
|
|
|
332
351
|
**Можно ли видеть все мои чаты в виде канбан-доски и начинать с неё новые?** Да, с функцией **Доска задач** (по умолчанию включена): откройте её на левой боковой панели. Каждый чат — это карточка в **В работе**, **На проверке** (он ждёт вас) или **Готово**. **Новая задача** открывает новый чат dsh в проекте, а доска возвращается, когда ваше первое сообщение отправлено; нажмите **Ответить** на оранжевой карточке, чтобы ответить, не открывая чат. **Очистить всё** в **Готово** сначала спрашивает и убирает с доски завершённые карточки, которые вы прочитали; **Отменить** и **Убранные (N)** возвращают их, а чаты остаются в dsh.
|
|
333
352
|
|
|
353
|
+
**Можно ли завести личный чат-ассистент, который напоминает мне о делах и управляет моими другими чатами?** Да, с функцией **Ассистент** (по умолчанию выключена): включите её в Настройки → Composer Plus, затем нажмите **Ассистент** на левой боковой панели. Он создаёт напоминания с помощью запланированных задач dsh, ищет в интернете, показывает и читает ваши чаты, а отправляет сообщение в чат, начинает, останавливает или архивирует чат только после вашего подтверждения. Храните свой профиль в памяти его проекта, в теме "profil".
|
|
354
|
+
|
|
334
355
|
**Может ли dsh создавать резервные копии моих чатов и настроек, как dsh-backup?** Да: **Настройки → Composer Plus → Резервное копирование → Создать копию сейчас**. Он записывает архив того же формата в ту же папку (`~/Desktop/dsh-backups`), поэтому архивы dsh-backup тоже показываются и восстанавливаются, а dsh-backup можно удалить. Чтобы копии создавались по расписанию, включите **Автоматическое резервное копирование**.
|
|
335
356
|
|
|
336
357
|
**dsh больше не запускается. Как восстановить резервную копию?** Откройте папку резервных копий (`~/Desktop/dsh-backups`) и дважды щёлкните `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Выберите `3) Restore a backup`, выберите копию и введите `RESTORE`. Это работает без dsh.
|
|
@@ -363,6 +384,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
363
384
|
|
|
364
385
|
**Как ответить только на часть длинного ответа?** Выделите эту часть и нажмите **Цитировать** над выделением (**Цитата в ответе**, включена по умолчанию). Часть попадёт в поле ввода как цитата `> …`, а ниже вы напишете ответ.
|
|
365
386
|
|
|
387
|
+
**Как показать агенту точные строки файла?** Откройте файл на правой боковой панели (**Файлы рабочей области**), выделите строки и нажмите **Цитировать** над выделением (**Цитата из предпросмотра файла**, включена по умолчанию). В поле ввода попадут путь и номера строк (например, `src/login.js:2-3`) и сами строки как блок кода; напишите свой вопрос ниже.
|
|
388
|
+
|
|
366
389
|
**Можно ли спросить что-то, пока агент работает, не останавливая его?** Напишите вопрос и нажмите **Спросить в побочном чате** в поле ввода (**Побочный чат**, включено по умолчанию). Копия чата только для чтения ответит, а чат продолжит работу. В побочном чате **Вернуть** помещает ответ в поле ввода чата.
|
|
367
390
|
|
|
368
391
|
**Как сказать агенту, что изменить в его diff?** В разделе **Панель изменений** откройте diff файла, нажмите **+** у строки и напишите заметку (**Заметки к diff**, включено по умолчанию). Затем нажмите **Отправить в поле ввода**: заметки попадут в поле ввода вместе с файлом, номерами строк и самими строками.
|
|
@@ -371,7 +394,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
371
394
|
|
|
372
395
|
**Я потерял iPhone. Как не дать ему подключаться к моему Mac?** Нажмите **Мобильное подключение** внизу слева на боковой панели и нажмите **Remove** рядом с этим iPhone. Его ключ сразу перестаёт работать; вернуться он сможет только после нового сопряжения, которое вы подтвердите на Mac.
|
|
373
396
|
|
|
374
|
-
**Как продолжить на этом Mac чат с другого моего Mac?** На другом Mac включите **Настройки → Composer Plus → Удалённые компьютеры** и **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку (отправьте её себе, например через AirDrop или «Заметки»). На этом Mac тоже включите **Удалённые компьютеры**, выберите **Добавить компьютер…**
|
|
397
|
+
**Как продолжить на этом Mac чат с другого моего Mac?** На другом Mac включите **Настройки → Composer Plus → Удалённые компьютеры** и **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку (отправьте её себе, например через AirDrop или «Заметки»). На этом Mac тоже включите **Удалённые компьютеры**, выберите **Добавить компьютер…** в меню выбора на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого выбирайте этот компьютер в том же меню: он займёт это окно. Чтобы вернуться, нажмите **Вернуться к этому Mac** в том же месте. Тем временем чаты этого Mac продолжают работать.
|
|
375
398
|
|
|
376
399
|
**Можно ли заблокировать Tether с помощью Face ID?** Да: в Tether включите «Settings → Privacy → Lock with Face ID». После этого Tether запрашивает Face ID (или код-пароль) при открытии и при возврате в приложение.
|
|
377
400
|
|
|
@@ -403,6 +426,12 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
403
426
|
|
|
404
427
|
**Может ли dsh выполнить следующую команду, не спрашивая модель снова?** Да, с помощью **Запланированные шаги** (по умолчанию выключено): включите функцию в Настройки → Composer Plus. Тогда модель может планировать следующие команды с условием, например «запусти тесты, если сборка прошла», и Composer Plus выполняет шаг без нового вызова модели, когда результат выполняет условие. Подтверждения и песочница остаются как есть.
|
|
405
428
|
|
|
429
|
+
**Откуда берётся турецкий навык и можно ли его удалить?** Из [yucezerey/turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill) на GitHub (MIT). Composer Plus устанавливает его, только пока **Язык приложения** — Türkçe, хранит только его файлы Markdown и не запускает ни одного его скрипта. Чтобы удалить его, выключите **Пакет навыка для турецкого** в Настройки → Composer Plus: навык и загруженная копия сразу удаляются.
|
|
430
|
+
|
|
431
|
+
**Как сообщить об ошибке в Composer Plus или попросить новую функцию?** Настройки → Composer Plus → **Сообщить о проблеме…** (или меню **…** чата → **Сообщить о проблеме с Composer Plus…**). Выберите тип, напишите описание на своём языке и нажмите **Написать черновик**. Проверьте черновик на английском, затем нажмите **Открыть issue**.
|
|
432
|
+
|
|
433
|
+
**Как агенту навести порядок в запутанном коде?** Введите `/untangle-codebase` в чате (**Распутать кодовую базу**, включено по умолчанию), при желании с областью, например `/untangle-codebase src/api`. Сначала агент перечисляет копии, скрытые связи, лишние обёртки, мёртвый код и особые случаи, затем исправляет их как цель и снова проверяет с помощью субагентов. Запускайте его в чате функции **Ветка для каждого чата**, чтобы работа осталась в отдельной ветке.
|
|
434
|
+
|
|
406
435
|
**Работает ли плагин с настольным приложением?** Да: Настройки → Плагины → **Добавить плагин** → `dsh-composer-plus`. Проверено на dsh 0.2.0-rc.2 (настольное приложение и веб) и 0.2.1-rc.2 (веб).
|
|
407
436
|
|
|
408
437
|
## Разработка
|
|
@@ -422,6 +451,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/t
|
|
|
422
451
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
|
|
423
452
|
# Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
|
|
424
453
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
|
|
454
|
+
# Quote from file preview (fake model): lines of a code, text, Markdown and PDF file in the right sidebar → Quote → the path, the line numbers and the lines in the sent message; no button for the path header; switch off + its thumbnail
|
|
455
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-preview-quote.mjs /path/to/dsh/lib/bin.js
|
|
425
456
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
426
457
|
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
427
458
|
# What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
|
|
@@ -473,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
|
|
|
473
504
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
474
505
|
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
|
|
475
506
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
507
|
+
# Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
|
|
508
|
+
SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
|
|
476
509
|
```
|
|
477
510
|
|
|
478
511
|
```sh
|
|
@@ -494,3 +527,5 @@ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/b
|
|
|
494
527
|
## License
|
|
495
528
|
|
|
496
529
|
MIT
|
|
530
|
+
|
|
531
|
+
`assets/skills/untangle-codebase/SKILL.md` — это навык `untangle-codebase` из [caldoai/skills](https://github.com/caldoai/skills), © 2026 Maze, лицензия MIT ([его лицензия](assets/skills/untangle-codebase/LICENSE)).
|