dsh-composer-plus 1.17.0 → 1.18.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 +18 -2
- package/README.es.md +18 -2
- package/README.fr.md +18 -2
- package/README.hi.md +18 -2
- package/README.id.md +18 -2
- package/README.ja.md +18 -2
- package/README.ko.md +18 -2
- package/README.md +18 -2
- package/README.pt-BR.md +18 -2
- package/README.ru.md +18 -2
- package/README.tr.md +18 -2
- package/README.vi.md +18 -2
- package/README.zh.md +18 -2
- package/assets/features/blockedCommands.webp +0 -0
- package/assets/features/plannedSteps.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +879 -41
- package/index.js +1036 -1
- package/package.json +2 -2
- package/tether/gateway/server.mjs +1 -0
package/README.ru.md
CHANGED
|
@@ -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.18.0`.
|
|
33
33
|
|
|
34
34
|
## Функции
|
|
35
35
|
|
|
@@ -68,7 +68,10 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
68
68
|
| **Проверка цели** | <a id="feature-goalcheck"></a>Начните цель командой `/goal`. Когда агент в автоматическом раунде отмечает цель как выполненную, цель закрывается только после двух проверок. Сначала тестовая команда проекта запускается в папке чата, в режиме песочницы этого чата. Это ваша собственная команда или команда, найденная в `package.json`, `Makefile`, `Cargo.toml`, `go.mod` или pytest. Если последним шагом самого агента был успешный запуск этого теста, повторно он не запускается. Затем независимый вызов модели без инструментов читает цель, этот чат, `git status` и результат теста. Модель отвечает таблицей доказательств: каждая часть цели отмечается как подтверждённая, неверная или нерешённая, с доказательством и исправлением; цель закрывается, только когда подтверждены все части. Если проверка не пройдена, цель остаётся активной, агент читает каждую открытую часть с её доказательством и исправлением, и начинается следующий раунд. Строка под панелью цели (**Проверка цели**) показывает тест, последний результат и число подтверждённых частей (наведите на неё указатель, чтобы увидеть таблицу). **Изменить** задаёт вашу собственную тестовую команду и лимит времени или токенов; при превышении лимита цель становится заблокированной. Лимит токенов учитывает и субагентов чата. **Запустить сейчас** запускает проверку, не закрывая цель. У функции есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Когда вы сами завершаете цель, ничего не проверяется. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Снимок экрана: Проверка цели"></a> |
|
|
69
69
|
| **Продолжить в новом чате** | <a id="feature-handoffchat"></a>Правый щелчок по чату на боковой панели (или его меню **…**) → **Продолжить в новом чате…**. Один вызов собственной модели чата пишет заметку для передачи по тому, что показывает чат: Задача, Результаты, Сделано, Решения, Открытые вопросы и Следующий шаг (вызовы инструментов и их результаты служат доказательствами; шаги, которые вы откатили, не учитываются). Заметка открывается в диалоге: прочитайте и отредактируйте её. **Написать заново** пишет новую заметку. **Начать новый чат** (или `Cmd/Ctrl+Enter`) открывает новый чат в том же проекте; его первое сообщение — заметка и ссылка на старый чат. Старый чат остаётся как есть. Используйте функцию, когда длинный чат заполнен или работает медленно, или чтобы продолжить завтра. В проект ничего не записывается. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Снимок экрана: Продолжить в новом чате"></a> |
|
|
70
70
|
| **Состав контекста** | <a id="feature-contextbreakdown"></a>Правая боковая панель → `+` → **Контекст**. Страница показывает, что сейчас заполняет контекст модели открытого чата и какую часть контекстного окна это занимает: системный промпт, инструкции проекта (AGENTS.md), навыки, ваши сообщения, ответы агента и вызовы инструментов, результаты инструментов (по инструментам), результаты MCP (по серверам), определения инструментов, сводку сжатия и другие заметки контекста — для каждого число токенов и доля. Нажмите на часть, чтобы увидеть её инструменты или серверы. Страница читает только журнал чата, после `/compact` и откатов, и не вызывает модель; она перечитывает его после каждого хода и по кнопке **Обновить**. Используйте её, чтобы понять, почему чат медленный или заполнен, например из-за большого результата инструмента MCP или множества определений инструментов. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Снимок экрана: Состав контекста"></a> |
|
|
71
|
+
| **Запланированные шаги** | <a id="feature-plannedsteps"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Агент получает инструмент `plan_next_steps`: в том же сообщении, что и команда, он может спланировать следующие команды с точными аргументами и условием, например «запусти `npm test`, если сборка прошла». Когда результат выполняет условие, Composer Plus сам запускает следующий шаг без нового вызова модели, и длинный чат расходует меньше токенов. Шаг видно в чате как короткую строку «Composer Plus · Planned steps: ran `test` … without a model call», за ней идут вызов инструмента и результат. Только шаги `bash`, `read`, `grep` и `glob`; подтверждения, песочница и «Защищённые файлы» действуют на каждый шаг как обычно. Модель отвечает снова, когда условие не выполнено, когда два шага готовы одновременно, после последнего шага и когда вы отправляете сообщение. Идея взята из HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Снимок экрана: Запланированные шаги"></a> |
|
|
71
72
|
| **Защищённые файлы** | <a id="feature-protectedfiles"></a>Включено по умолчанию. Собственные файловые инструменты агента не могут читать или изменять файлы, подходящие под ваши шаблоны: `read`, `read_image` и `grep` по файлу отклоняются для шаблонов **чтение и запись**, а `write`, `edit` и `str_replace_editor` — для обоих видов. Агент читает причину, и ему предлагается спросить вас. Шаблоны по умолчанию: `.env*`, `*.pem` и `*.key`. Настройки → Composer Plus → **Защищённые файлы**: добавьте шаблон (например, `published/**` или `config/*.yml`), нажмите на его вид, чтобы переключить между **чтение и запись** и **только запись**, удалите его кнопкой ✕ или нажмите **Использовать значения по умолчанию**. Шаблон без `/` подходит к имени файла в любой папке. Это ограждение, а не песочница: команда оболочки (`cat .env`), скрипт или инструмент MCP всё равно могут добраться до файла (см. «Ограничения»). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Снимок экрана: Защищённые файлы"></a> |
|
|
73
|
+
| **Заблокированные команды** | <a id="feature-blockedcommands"></a>Включено по умолчанию, список изначально пуст. Команды оболочки агента (`bash`, `pwsh`) не могут запустить команду, подходящую под ваши правила: правило **блокировать** отклоняет вызов (агент читает причину, и ему предлагается спросить вас), правило **сначала спросить** показывает карточку одобрения dsh, и команда запускается, только когда вы её разрешите. Настройки → Composer Plus → **Заблокированные команды**: введите правило (например, `npm publish`, `git push --force` или `ssh *192.168.2.19`), нажмите на вид, чтобы переключить между **блокировать** и **сначала спросить**, затем нажмите **Добавить**; нажмите на вид правила, чтобы изменить его, удалите правило кнопкой ✕. Правило — это имя команды и слова, которые должны идти после него в этом порядке; `*` подходит к любому тексту. Функция также находит команду после `&&`, `;`, `\|`, внутри `$(…)`, `bash -c "…"` или `eval`, а также после `sudo` или `env`. Это ограждение, а не песочница: переменная (`$CMD`), файл скрипта или другая программа всё равно могут запустить команду (см. «Ограничения»). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Снимок экрана: Заблокированные команды"></a> |
|
|
74
|
+
| **Доска задач** | <a id="feature-taskboard"></a>Левая боковая панель → **Доска задач**. Канбан-доска ваших проектов dsh для вас и агентов: **К выполнению**, **В работе**, **На проверке** и **Готово** (и **Бэклог**, см. ниже). Выберите слева проект или **Все проекты**. **Новая задача** (или `n`) открывает новую карточку: введите её название и нажмите `Enter`. Перетащите карточку в другую колонку или между двумя карточками. Нажмите на карточку, чтобы увидеть и изменить её поля **Статус**, **Теги**, **Ручная** (агенты её пропускают), описание (Markdown) и комментарии. `/` ищет во всех проектах, `h` показывает только ручные задачи, кнопка экспорта сохраняет доску в Markdown или JSON. Агенты получают инструменты доски: попросите чат «взять следующую задачу с доски», и агент переместит верхнюю карточку из **К выполнению** в **В работе**, напишет комментарий о сделанном и переместит её в **На проверке**; в **Готово** её перемещаете вы. В проекте с открытыми задачами каждый чат получает это правило сам. Настройки → Composer Plus → **Доска задач**: здесь есть переключатель колонки **Бэклог**; её карточки агенты оставляют вам. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Снимок экрана: Доска задач"></a> |
|
|
72
75
|
| **Память проекта** | <a id="feature-projectmemory"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. У каждой папки проекта своя память, которую читают следующие чаты этого проекта, так же как DS Bot хранит память для каждого бота. После каждого завершённого хода один вызов модели чата читает новые сообщения (без отменённых откатом), сохраняет ваши постоянные предпочтения, решения и факты как короткие заметки и изменяет или удаляет старые. Агент также может сам сохранять, удалять и искать заметки (`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> |
|
|
73
76
|
| **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами, пока не истечёт лимит времени (по умолчанию 1 час; выберите его в **Настройки → Composer Plus → Разрешить для этого чата**). Затем агент снова спрашивает. Значок в заголовке показывает список разрешений со временем их окончания и позволяет их отозвать. Разрешения сохраняются после перезапуска. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Снимок экрана: Разрешить для этого чата"></a> |
|
|
74
77
|
| **Статус проекта** | <a id="feature-projectstatus"></a>Строка проекта на боковой панели показывает ту же метку, что и его чаты: индикатор выполнения, ожидание или «готово». Поэтому даже свёрнутый проект сообщает, что чат внутри работает или ждёт вас. Сначала показывается чат, который ждёт вас, затем завершённый чат, который вы ещё не открыли (зелёная точка, даже пока другой чат ещё выполняется), затем индикатор выполнения. Наведите на метку указатель, чтобы увидеть подробности. В режиме **Дерево рабочих областей** строка родительской папки также показывает чаты каждого проекта внутри неё (например, каждой папки ветки в `.worktrees/`), даже когда папка свёрнута. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Статус проекта"></a> |
|
|
@@ -166,7 +169,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
166
169
|
- **Проверка цели:** запускается, только когда агент в автоматическом раунде отмечает `/goal` как выполненную (или когда вы нажимаете **Запустить сейчас**). Host-часть запускает тестовую команду в папке чата в режиме песочницы этого чата (как собственный инструмент `bash` в dsh: та же политика доступа к файлам; если эта песочница не может запуститься, тест не запускается и проверка не пройдена). Чтобы найти команду, она читает только `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` и `pytest.ini`, как обычные файлы внутри папки (без символических ссылок за пределы папки, без FIFO). Затем она одним запросом без инструментов отправляет модели, выбранной для **Проверка цели** (по умолчанию это модель самого чата), цель, чат с момента начала цели (ваши сообщения, ответы агента, вызовы инструментов, обрезанные до 1 000 символов, и последние 2 000 символов каждого результата инструмента; без рассуждений и шагов, убранных откатом; не более примерно 60 000 символов, самую новую часть), `git status --short` и конец вывода теста. Вывод инструментов может содержать то, что прочитал агент, поэтому в этом запросе могут быть части ваших файлов, как и в самом чате. В чат и в проект ничего не записывается. Ваша тестовая команда, лимиты, последний результат (с концом его вывода) и выбранная модель хранятся в `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (файл доступен только владельцу, последние 500 чатов).
|
|
167
170
|
- **Продолжить в новом чате:** ничего не запускается, пока вы не нажмёте этот пункт. Затем Host-часть отправляет чат (так, как его читает Проверка цели: без рассуждений и шагов, убранных откатом) собственной модели чата и показывает заметку для передачи; новый чат создаёт только **Начать новый чат**. В проект ничего не записывается.
|
|
168
171
|
- **Состав контекста:** Host-часть читает только журнал чата; без вызова модели и без файлов проекта.
|
|
172
|
+
- **Доска задач:** доска (названия, описания, теги и комментарии ваших задач, пути папок проектов и их короткие id) хранится в `$DSH_HOME/storages/dsh-composer-plus/board.json` (файл доступен только владельцу); переключатель хранится рядом, в `board-switch.json`. Ничего не покидает ваш компьютер, и ничего не записывается в папку проекта. Инструменты доски передают агентам то, что вы написали на доске, поэтому текст задачи попадает к модели чата, когда агент его читает. Повреждённый файл доски сохраняется как `board.json.broken-<time>`, и доска начинается пустой.
|
|
169
173
|
- **Защищённые файлы:** список и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (файл доступен только владельцу). Проверка читает только путь каждого вызова файлового инструмента (и его реальный путь), но никогда не сам файл.
|
|
174
|
+
- **Заблокированные команды:** правила и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (файл доступен только владельцу). Проверка читает только текст команды каждого вызова `bash` и `pwsh`; она ничего не запускает и ничего не отправляет.
|
|
170
175
|
- **Память проекта:** выключена, пока вы её не включите. Когда она включена, после каждого завершённого хода чата верхнего уровня часть Host отправляет новые сообщения этого чата с момента последнего разбора (ваши сообщения и текстовые ответы агента; без вывода инструментов, рассуждений, скрытого контекста и сообщений, убранных откатом; в ответвлённом чате копия родительского чата не учитывается; не больше примерно 16 000 символов) и сохранённые заметки модели этого чата, одним запросом без инструментов. Заметки — это файлы Markdown в `$DSH_HOME/storages/dsh-composer-plus/memory/` (доступны только владельцу): `projects/<id>/` для каждой папки проекта (`<id>` — хеш реального пути папки; `project.json` указывает папку), `global/`, `journal.jsonl` (каждое изменение со строкой до и после) и `reviewed.json` (до какого места прочитан каждый чат). В папку проекта ничего не записывается. Заметки, похожие на ключ, токен, пароль или номер документа, отклоняются. Заметки проекта попадают в системный промпт каждого нового чата в этой папке, поэтому уходят модели с каждым запросом этого чата. Переключатель хранится в `memory.json` там же. **Открыть память** ничего не отправляет, пока вы не нажмёте **Предпросмотр изменений**; тогда она отправляет показанные заметки и ваш текст модели dsh по умолчанию одним запросом без инструментов. Изменения записываются только по **Применить**, в журнале с `editor`. Tether читает и изменяет заметки через тот же маршрут.
|
|
171
176
|
- **Резервное копирование:** ничего не покидает ваш компьютер. Архивы сохраняются в `~/Desktop/dsh-backups` (файлы доступны только владельцу). Секретов в архиве нет: файлы учётных данных (`.credentials.yaml`, `.env`), файлы ключей (`.pem`, `.key`, `.p12`, `.pfx`) и значения настроек token, secret, password и API-ключей в файлах yml скрыты; их настоящие копии остаются в `composer-plus-vault/<archive>/` в той же папке (доступно только владельцу) и только на этом компьютере. **Для другого компьютера** не копирует vault: введите эти секреты там заново. Ваши журналы чатов, настройки и остальное содержимое домашней папки dsh лежат в архиве как есть: держите папку закрытой, как и сам `$DSH_HOME`. Резервное копирование читает файлы с `O_NOFOLLOW | O_NONBLOCK`; символическая ссылка сохраняется как ссылка (переход по ней не выполняется), а FIFO или устройство пропускается. Переключатель и настройки автоматического резервного копирования хранятся в `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, переключатель аварийной консоли — в `rescue-console.json`, а пока dsh работает, `running/host-<pid>.json` указывает каждый процесс dsh (аварийная консоль читает эти файлы, чтобы отказать в восстановлении).
|
|
172
177
|
- **Аварийная консоль:** меню в терминале; она не открывает сетевой порт. Восстановление пишет только в новую папку рядом с домашней папкой dsh (файлы — с `O_EXCL | O_NOFOLLOW`, символические ссылки — в последнюю очередь и без перехода по ним) и отклоняет архив с небезопасным именем (`..`, абсолютный путь), устройством или FIFO, более чем одной папкой верхнего уровня или записью внутри ссылки.
|
|
@@ -189,7 +194,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
189
194
|
- **На строке чата нет метки ветки:** у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
|
|
190
195
|
- **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
|
|
191
196
|
- **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
|
|
192
|
-
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.
|
|
197
|
+
- **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.18.0`), см. примечание об установке выше.
|
|
193
198
|
- **Кнопка «Создать копию сейчас» сообщает «Уже выполняется другое действие с резервными копиями»:** действие выполняется в другом окне dsh или в аварийной консоли (они используют общий файл блокировки `.composer-plus.lock` в папке резервных копий). Дождитесь его окончания. Если никакое действие не выполняется, блокировку закрытого процесса перехватит следующее нажатие.
|
|
194
199
|
- **Аварийная консоль сообщает «dsh is running»:** сначала выйдите из dsh. Если dsh действительно закрыт, файл, названный в сообщении, остался после сбоя: удалите его и повторите попытку.
|
|
195
200
|
- **После восстановления dsh не запускается или не хватает плагина:** пакеты плагинов профиля нужно установить заново. Аварийная консоль предлагает это после восстановления; или выполните `pnpm install` в каждой папке внутри `$DSH_HOME/profiles/`, которую она перечисляет. Секреты, которых не было в vault (другой компьютер), нужно ввести заново: консоль перечисляет их.
|
|
@@ -239,8 +244,11 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
239
244
|
- **Улучшить промпт** видит только краткую сводку проекта, изменённые пути и пути, имена которых совпадают с вашими словами, но не сам код. Поэтому функция может пропустить нужный файл и называет только те пути, которые получила. Прочитайте новый текст перед отправкой. Она не работает для слеш-команды, кроме `/goal <цель>`, для управляющего слова `/goal` (`clear`, `pause`, `resume`) и для сообщения со значком файла или символа (новый текст — обычный текст, поэтому значок бы потерялся), а в сообщении может быть не более 8 000 символов. Для цели `/goal` функция пишет условия только из черновика и контекста; слишком строгое условие может стоить лишних раундов цели, поэтому прочитайте его перед отправкой. Изображения остаются прикреплёнными: меняется только текст. Каждое нажатие стоит один вызов модели; сильной модели может понадобиться минута (`Esc` отменяет).
|
|
240
245
|
- **Проверка цели** проверяет только выполнение, которое агент отмечает в автоматическом раунде цели: выполнение, о котором вы просите в чате, `/goal` и панель цели не проверяются. Агент может сам изменить тесты или файлы тестовой команды; верификатор читает чат и может это увидеть, но может ошибиться в обе стороны (ошибочное «не выполнено» стоит ещё одного раунда; ошибочное «выполнено» закрывает цель). Верификатор видит чат и `git status`, но не сам код. Запуск тестов используется повторно, только если последним шагом агента, который может менять файлы, был его собственный успешный запуск `bash` точно той же команды в той же папке; команда с конвейером (`| tail`) или `&&` повторно не используется. Бюджет измеряется, когда заканчивается ход, поэтому один ход может его превысить. Бюджет токенов учитывает и вызовы чатов субагентов этого чата (они читаются из их сохранённых журналов в конце каждого хода, поэтому проверка чата с большим числом субагентов идёт немного дольше). Таблица доказательств основана на том, как верификатор сам прочитал чат: часть, которую он называет подтверждённой, всё равно стоит проверить самому, если она важна. `update_goal` ждёт, пока идёт проверка (тест не более 15 минут, верификатор не более 3 минут). Ответвление получает новый id чата, поэтому начинает без собственной тестовой команды и лимитов родительского чата. Каждое выполнение, которое доходит до верификатора, стоит одного вызова модели.
|
|
241
246
|
- **Защищённые файлы** — это ограждение, а не песочница. Функция охватывает собственные файловые инструменты dsh (`read`, `read_image`, `grep` по файлу, `write`, `edit`, `str_replace_editor`). Команда оболочки (`cat .env`), скрипт, который пишет агент, оболочка субагента, инструмент MCP, список `glob` и `grep` по всей папке всё равно могут добраться до защищённого файла. Для настоящего ограничения используйте режимы песочницы dsh или храните секреты вне папки проекта. Шаблоны понимают `*`, `**` и `?`, но не `{a,b}` и не `[ab]`, и не учитывают регистр букв.
|
|
247
|
+
- **Заблокированные команды** — это ограждение, а не песочница. Функция читает только текст команд инструментов dsh `bash` и `pwsh`. Переменная или псевдоним, который называет команду (`CMD=npm; $CMD publish`), функция оболочки, файл скрипта, который пишет агент, другая программа (`python -c`, `node -e`, `make`), инструмент MCP и ваш собственный терминал всё равно могут её запустить. Правило может подходить к большему, чем вы хотите: любое слово команды может быть именем команды (`echo npm publish` подходит к `npm publish`), а между словами правила могут стоять другие слова (`git push --force` подходит и к `git push origin main --force`). Если правило подходит к слишком многому, сделайте его длиннее. Для правила **сначала спросить** нужен чат, который может спросить: в чате с политикой одобрения never (например, у делегированного субагента) dsh не может показать карточку, поэтому вызов отклоняется с причиной. Карточка одобрения показывает причину на английском. **Разрешить для этого чата** не отвечает на карточку **сначала спросить**.
|
|
242
248
|
- **Продолжить в новом чате** отправляет чат (сообщения, вызовы инструментов и конец каждого результата инструмента, не более примерно 60 000 символов, самую новую часть) собственной модели чата. Заметка для передачи может пропустить решение или файл: прочитайте её перед запуском. Новый чат знает только заметку и связанный чат (dsh прикрепляет старый чат как контекст только для чтения); его контекст модели начинается с малого, а старый чат остаётся как есть. Для одного чата одновременно идёт только одна заметка или один запуск.
|
|
243
249
|
- **Состав контекста** показывает оценки по собственному правилу dsh (около 4 символов на токен), тому же правилу, что и у кольца контекста dsh; собственный подсчёт модели может отличаться. Определения инструментов взяты из самого нового запроса. Функция показывает контекст так, как он записан в журнале чата; ход, который идёт сейчас, появляется после своего следующего шага.
|
|
250
|
+
- **Запланированные шаги** экономят токены, только когда модель действительно планирует: пока функция включена, каждый запрос несёт инструмент `plan_next_steps` и короткую инструкцию (около 500 токенов), даже в чатах, где модель никогда не планирует. Условие доказывает только то, что в нём сказано (например: код выхода сборки был 0), а не то, что работа сделана верно. `ok` читает собственные отметки результата dsh (`[exit code: N]`, тайм-ауты, отказы песочницы); команда, которая завершилась неудачей без ненулевого кода выхода, считается успешной. Шаги выполняются по одному; два шага, готовые одновременно, возвращаются модели. Сообщение шага сохраняется как сообщение ассистента модели чата (в dsh нет отметки для сообщения, написанного плагином), поэтому его текст говорит, что шаг запустил Composer Plus. В Tether нет.
|
|
251
|
+
- **Доска задач** знает только проекты dsh: чат вне проекта показывает **Все проекты**, а папка ветки для каждого чата (`<project>/.worktrees/<name>`) считается частью своего проекта. Id проектов (`acme#12`) берутся из имени папки и не меняются, когда вы переименовываете проект в dsh. Правило «держите доску в актуальном состоянии» попадает в чат, только когда в его проекте есть открытые задачи; чат, который его получил, сохраняет его. Агентам сказано оставлять вам **Готово**, **Бэклог** и ручные задачи, но инструменты этого не запрещают: агент всё равно может переместить такую карточку. Инструменты доски есть в списке инструментов каждого чата, пока функция включена (около 1 000 токенов на запрос); выключите её, если не пользуетесь доской. Пока страница открыта, она читает доску каждые 2 секунды; изменение от агента появляется за это время. Текст, который вы редактируете, пока агент меняет то же поле, не сохраняется: панель показывает новый текст и причину. Нет изображений, нет синхронизации через git между компьютерами и нет общего доступа по сети (в Kanzo всё это есть). Идея и внешний вид взяты из [Kanzo](https://github.com/emanuele-em/kanzo) от emanuele-em (AGPL-3.0); Composer Plus не использует его код.
|
|
244
252
|
- **Приоритет сообщения после остановки** работает только после того, как вы остановили чат (или после хода с ошибкой, или когда вы открываете чат, у которого ещё есть очередь): сообщение, отправленное во время хода, по-прежнему ждёт в конце очереди. Оно обгоняет только ваши собственные сообщения в очереди: если в очереди ждёт раунд цели или ответ на вопрос, остаётся порядок dsh. Функция читает часть dsh, которая не является публичным API (завершается ли ещё остановленный ход); если обновление dsh её переименует, сообщение встанет первым только после завершения этого хода. Чаты субагентов сохраняют порядок dsh.
|
|
245
253
|
- **Память проекта** принадлежит первой папке чата (папке проекта dsh): чат, который меняет папку командой `cd`, сохраняет память своего первого проекта, а та же папка, открытая по другому пути к тем же файлам, использует ту же память. Чат замораживает свой раздел памяти при запуске, поэтому заметка, сохранённая позже, появляется со следующего чата (`memory_recall` находит её сразу). Разбор сохраняет только то, что решила сохранить модель: он может пропустить факт или сохранить неверный; проверьте их в **Открыть память** и измените там, или правьте файлы вручную, когда dsh закрыт. **Открыть память** отправляет заметки выбранного проекта и глобальные заметки (все проекты, если выбрано «Все заметки»; не больше примерно 60 000 символов, остальные только считаются и не могут измениться в этом запросе) и ваш текст модели dsh по умолчанию, а не модели чата. Предпросмотр хранится на Mac 30 минут и до перезапуска dsh; если за это время разбор или агент изменят заметки, **Применить** откажет, и нужно запросить предпросмотр снова. **Применить** сохраняет все изменения предпросмотра или ни одного: если одно изменение нельзя сохранить (например, MEMORY.md заполнен), заметки остаются как были, и показывается причина. Каждый завершённый ход с вашим сообщением стоит одного вызова модели; неудачный вызов перечитывает те же сообщения после следующего хода. Чаты субагентов не разбираются. Идея и формат файлов взяты из [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus не использует его код и никогда не читает и не записывает собственную память DS Bot.
|
|
246
254
|
- **Резервное копирование** использует одну постоянную папку, `~/Desktop/dsh-backups` (папку dsh-backup по умолчанию, поэтому его архивы остаются пригодными); настройки для другой папки нет. Архив примерно такого же размера, как домашняя папка dsh без `cache/` и `dsh-runtimes/` (измерено: из 1,6 ГБ файлов получился архив 830 МБ примерно за 30 с на Apple Silicon; dsh при этом отвечал). Файл, который меняется во время чтения, сохраняется в том виде, в каком он был, когда резервное копирование его открыло, поэтому журнал открытого чата может заканчиваться обрезанной записью, которую dsh исправляет при следующей записи. Скрытие находит секрет в файле yml по имени ключа в одной строке (`token:`, `apiKey:`, …); секрет в потоковом словаре (`{token: x}`), в списке под таким ключом, в файле JSON (например, `apiKey` сервера MCP в файле `.json`) или под другим именем остаётся в архиве. Архивы dsh-backup по типам (`dsh-t-…`) не показываются в списке. **Для другого компьютера** копирует архив (в APFS — клон, без дополнительного места); vault с ним не копируется. **Создать копию сейчас** не удаляет ни одной резервной копии. Автоматическое резервное копирование хранит самые новые резервные копии, которые создал Composer Plus (настройка **Хранить** функции **Автоматическое резервное копирование**), и удаляет более старые из них; снимки перед обновлением считаются отдельно (остаются 2 самых новых). Архивы dsh-backup не удаляются никогда: уберите их кнопкой **Удалить**. Пока dsh-backup ещё установлен, он учитывает архивы Composer Plus в своём лимите хранимых копий и может их удалить.
|
|
@@ -277,6 +285,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
277
285
|
|
|
278
286
|
**Может ли агент помнить мои предпочтения между чатами, как память DS Bot?** Да, с функцией **Память проекта** (по умолчанию выключена): включите её в **Настройки → Composer Plus**. После каждого хода ваши постоянные предпочтения и решения сохраняются короткими заметками для проекта чата, и каждый новый чат этого проекта их читает. Попросите агента что-то запомнить, и он сразу сохранит это. Чтобы посмотреть или изменить заметки, нажмите **Открыть память** в той же строке и напишите, что изменить.
|
|
279
287
|
|
|
288
|
+
**Можем ли мы с агентами вести одну общую доску задач, как в Kanzo?** Да, с функцией **Доска задач** (по умолчанию включена): откройте её на левой боковой панели и добавляйте задачи кнопкой **Новая задача**. В чате попросите агента «взять следующую задачу с доски»: он переместит карточку в **В работе**, напишет комментарий о сделанном и переместит её в **На проверке**. Отметьте задачу как **Ручная**, чтобы оставить её себе.
|
|
289
|
+
|
|
280
290
|
**Может ли dsh создавать резервные копии моих чатов и настроек, как dsh-backup?** Да: **Настройки → Composer Plus → Резервное копирование → Создать копию сейчас**. Он записывает архив того же формата в ту же папку (`~/Desktop/dsh-backups`), поэтому архивы dsh-backup тоже показываются и восстанавливаются, а dsh-backup можно удалить. Чтобы копии создавались по расписанию, включите **Автоматическое резервное копирование**.
|
|
281
291
|
|
|
282
292
|
**dsh больше не запускается. Как восстановить резервную копию?** Откройте папку резервных копий (`~/Desktop/dsh-backups`) и дважды щёлкните `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Выберите `3) Restore a backup`, выберите копию и введите `RESTORE`. Это работает без dsh.
|
|
@@ -301,6 +311,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
301
311
|
|
|
302
312
|
**Как увидеть только файлы, которые изменил один чат?** Правая боковая панель → **Изменения** → **Этот чат**. Нажмите **␣**, чтобы скрыть изменения, которые состоят только из пробелов.
|
|
303
313
|
|
|
314
|
+
**Как запретить агенту запускать `npm publish` или `git push --force`?** **Настройки → Composer Plus → Заблокированные команды**: введите `npm publish`, выберите **блокировать** или **сначала спросить** и нажмите **Добавить**. Правило **блокировать** отклоняет команду, и агент спрашивает вас; правило **сначала спросить** каждый раз показывает карточку одобрения. «Защищённые файлы» охватывают файловые инструменты агента, а «Заблокированные команды» — его команды оболочки.
|
|
315
|
+
|
|
304
316
|
**Как сделать, чтобы автопроверка не спрашивала об одном и том же инструменте в одном чате?** Нажмите **Разрешить для этого чата** на карточке одобрения. Разрешение действует только для этого инструмента в этом чате, по умолчанию 1 час; отозвать его можно через значок в заголовке. Изменить время можно в **Настройки → Composer Plus → Разрешить для этого чата**.
|
|
305
317
|
|
|
306
318
|
**Я потерял iPhone. Как не дать ему подключаться к моему Mac?** Нажмите **Мобильное подключение** внизу слева на боковой панели и нажмите **Remove** рядом с этим iPhone. Его ключ сразу перестаёт работать; вернуться он сможет только после нового сопряжения, которое вы подтвердите на Mac.
|
|
@@ -329,6 +341,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
329
341
|
|
|
330
342
|
**Можно ли отправить фото с iPhone?** Да. В чате Tether коснитесь **+** рядом с полем сообщения → Camera, Photos (до 4) или Paste image. Фотографии попадают в чат на Mac как вложения вашего сообщения, поэтому модель их видит.
|
|
331
343
|
|
|
344
|
+
**Может ли dsh выполнить следующую команду, не спрашивая модель снова?** Да, с помощью **Запланированные шаги** (по умолчанию выключено): включите функцию в Настройки → Composer Plus. Тогда модель может планировать следующие команды с условием, например «запусти тесты, если сборка прошла», и Composer Plus выполняет шаг без нового вызова модели, когда результат выполняет условие. Подтверждения и песочница остаются как есть.
|
|
345
|
+
|
|
332
346
|
**Работает ли плагин с настольным приложением?** Да: Настройки → Плагины → **Добавить плагин** → `dsh-composer-plus`. Проверено на dsh 0.2.0-rc.2 (настольное приложение и веб) и 0.2.1-rc.2 (веб).
|
|
333
347
|
|
|
334
348
|
## Разработка
|
|
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
393
407
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
394
408
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
395
409
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
410
|
+
# Task board: the page, the agent tools (fake model), drag and drop, search, the switch
|
|
411
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
396
412
|
```
|
|
397
413
|
|
|
398
414
|
```sh
|
package/README.tr.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz; bu profili uygulama yönetir.)
|
|
31
31
|
|
|
32
|
-
> dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.
|
|
32
|
+
> dsh’nin pnpm’i, yayımlanmasının üzerinden 24 saat geçmemiş sürümleri atlar. Bir yayından hemen sonra sürümü ekleyin: `dsh-composer-plus@1.18.0`.
|
|
33
33
|
|
|
34
34
|
## Özellikler
|
|
35
35
|
|
|
@@ -68,7 +68,10 @@ Sonra dsh’yi yeniden başlatın. (CLI, masaüstü profiline yükleme yapamaz;
|
|
|
68
68
|
| **Hedef kontrolü** | <a id="feature-goalcheck"></a>`/goal` ile bir hedef başlatın. Ajan otomatik bir turda hedefi tamamlandı olarak işaretlediğinde hedef yalnızca iki kontrolden sonra kapanır. Önce projenin test komutu sohbetin klasöründe, sohbetin korumalı alan moduyla çalışır. Komut sizin kendi komutunuzdur ya da `package.json`, `Makefile`, `Cargo.toml`, `go.mod` veya pytest içinde bulunan komuttur. Ajanın kendi en yeni adımı bu testin başarılı bir çalıştırmasıysa test yeniden çalışmaz. Sonra araç kullanmayan bağımsız bir model çağrısı hedefi, bu sohbeti, `git status` çıktısını ve test sonucunu okur. Model bir kanıt tablosuyla yanıt verir: hedefin her parçası kanıtı ve düzeltmesiyle birlikte doğrulandı, yanlış ya da çözülmedi olarak işaretlenir. Hedef yalnız her parça doğrulandığında kapanır. Bir kontrol başarısız olursa hedef etkin kalır, ajan açık her parçayı kanıtı ve düzeltmesiyle okur ve sonraki tur devam eder. Hedef çubuğunun altındaki bir satır (**Hedef kontrolü**) testi, son sonucu ve kaç parçanın doğrulandığını gösterir (tablo için üzerine gelin). **Düzenle** kendi test komutunuzu ve bir süre ya da token sınırını belirler; sınır aşılınca hedef engellenir. Token sınırı sohbetin alt ajanlarını da sayar. **Şimdi çalıştır** kontrolü hedefi kapatmadan çalıştırır. Ayarlar'da kendi **Model** menüsü vardır (varsayılan: **Sohbetin modeliyle aynı**). Hedefi kendiniz tamamladığınızda hiçbir şey kontrol edilmez. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Ekran görüntüsü: Hedef kontrolü"></a> |
|
|
69
69
|
| **Yeni sohbette devam et** | <a id="feature-handoffchat"></a>Kenar çubuğunda bir sohbete sağ tıklayın (ya da sohbetin **…** menüsünü açın) → **Yeni sohbette devam et…**. Sohbetin kendi modeline yapılan tek çağrı, sohbetten bir devir notu yazar: Görev, Çıktılar, Tamamlananlar, Kararlar, Açık sorunlar ve Sonraki adım. Not, sohbetin gösterdiklerinden yazılır (araç çağrıları ve sonuçları kanıttır; geri aldığınız adımlar dışarıda kalır). Not bir pencerede açılır: okuyun ve düzenleyin. **Yeniden yaz** yeni bir not yazar. **Yeni sohbet başlat** (ya da `Cmd/Ctrl+Enter`), aynı projede ilk mesajı not ve eski sohbetin bağlantısı olan yeni bir sohbet açar; eski sohbet olduğu gibi kalır. Uzun bir sohbet dolduğunda ya da yavaşladığında veya ertesi gün devam etmek için kullanın. Projeye hiçbir şey yazılmaz. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Ekran görüntüsü: Yeni sohbette devam et"></a> |
|
|
70
70
|
| **Bağlam dökümü** | <a id="feature-contextbreakdown"></a>Sağ kenar çubuğu → `+` → **Bağlam**. Sayfa, açık sohbetin model bağlamını şu anda neyin doldurduğunu ve bağlam penceresinin ne kadarını kullandığını gösterir: sistem istemi, proje talimatları (AGENTS.md), beceriler, mesajlarınız, ajan yanıtları ve araç çağrıları, araç sonuçları (araca göre), MCP sonuçları (sunucuya göre), araç tanımları, sıkıştırma özeti ve diğer bağlam notları; her biri token sayısı ve payıyla. Bir parçaya tıklayın, araçlarını ya da sunucularını görün. Yalnız sohbet günlüğünü okur (`/compact` ve geri almalardan sonraki hâlini), model çağırmaz; her turdan sonra ve **Yenile** ile yeniden okur. Bir sohbetin neden yavaş ya da dolu olduğunu görmek için kullanın, örneğin büyük bir MCP araç sonucu ya da çok sayıda araç tanımı. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Ekran görüntüsü: Bağlam dökümü"></a> |
|
|
71
|
+
| **Planlı adımlar** | <a id="feature-plannedsteps"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Ajan `plan_next_steps` aracını alır: bir komutla aynı mesajda, sonraki komutları kesin argümanları ve bir koşulla planlayabilir; örneğin "derleme geçince `npm test` çalıştır". Sonuç koşulu karşılarsa Composer Plus sonraki adımı yeni bir model çağrısı yapmadan kendisi çalıştırır; böylece uzun bir sohbet daha az token harcar. Adım sohbette kısa bir satırla görünür: "Composer Plus · Planned steps: ran `test` … without a model call"; ardından araç çağrısı ve sonucu gelir. Yalnız `bash`, `read`, `grep` ve `glob` adımları; onaylar, sandbox ve Korunan dosyalar her adımda her zamanki gibi geçerlidir. Koşul tutmazsa, aynı anda iki adım hazırsa, son adımdan sonra ve siz mesaj yazınca model yeniden yanıt verir. Fikir HarnessMM'den (arXiv 2610.32813) gelir. | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Ekran görüntüsü: Planlı adımlar"></a> |
|
|
71
72
|
| **Korunan dosyalar** | <a id="feature-protectedfiles"></a>Varsayılan olarak açık. Ajanın kendi dosya araçları, desenlerinizle eşleşen dosyaları okuyamaz ve değiştiremez: **okuma ve yazma** desenlerinde bir dosya üzerindeki `read`, `read_image` ve `grep` reddedilir; her iki türde de `write`, `edit` ve `str_replace_editor` reddedilir. Ajan nedenini okur ve size sorması söylenir. Varsayılan desenler `.env*`, `*.pem` ve `*.key`. Ayarlar → Composer Plus → **Korunan dosyalar**: bir desen ekleyin (örneğin `published/**` ya da `config/*.yml`), türüne tıklayarak **okuma ve yazma** ile **yalnızca yazma** arasında geçin, ✕ ile kaldırın ya da **Varsayılanları kullan**. `/` içermeyen bir desen, her klasördeki dosya adıyla eşleşir. Bu bir korkuluktur, korumalı alan değildir: bir kabuk komutu (`cat .env`), bir betik ya da bir MCP aracı dosyaya yine erişebilir (bkz. Sınırlar). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ekran görüntüsü: Korunan dosyalar"></a> |
|
|
73
|
+
| **Engellenen komutlar** | <a id="feature-blockedcommands"></a>Varsayılan olarak açık, liste başta boştur. Ajanın kabuk komutları (`bash`, `pwsh`) kurallarınızla eşleşen bir komutu çalıştıramaz: bir **engelle** kuralı çağrıyı reddeder (ajan nedenini okur ve size sorması söylenir), bir **önce sor** kuralı dsh’nin onay kartını gösterir ve komut yalnızca siz izin verince çalışır. Ayarlar → Composer Plus → **Engellenen komutlar**: bir kural yazın (örneğin `npm publish`, `git push --force` ya da `ssh *192.168.2.19`), türüne tıklayarak **engelle** ile **önce sor** arasında geçin, sonra **Ekle** düğmesine tıklayın; bir kuralın türünü değiştirmek için türüne tıklayın, kuralı ✕ ile kaldırın. Bir kural, bir komut adı ve ondan sonra bu sırayla gelmesi gereken sözcüklerdir; `*` herhangi bir metinle eşleşir. Kontrol, komutu `&&`, `;`, `\|` sonrasında, `$(…)`, `bash -c "…"` ya da `eval` içinde ve `sudo` ya da `env` sonrasında da bulur. Bu bir korkuluktur, korumalı alan değildir: bir değişken (`$CMD`), bir betik dosyası ya da başka bir program komutu yine çalıştırabilir (bkz. Sınırlar). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ekran görüntüsü: Engellenen komutlar"></a> |
|
|
74
|
+
| **Görev panosu** | <a id="feature-taskboard"></a>Sol kenar çubuğu → **Görev panosu**. Sizin ve ajanların birlikte kullandığı, dsh projelerinizin kanban panosu: **Yapılacak**, **Yapılıyor**, **İncelemede** ve **Bitti** (ve **Bekleyenler**, aşağıya bakın). Soldan bir proje ya da **Tüm projeler** seçin. **Yeni görev** (ya da `n`) yeni bir kart açar: başlığını yazın ve `Enter` tuşuna basın. Bir kartı başka bir sütuna ya da iki kartın arasına sürükleyin. Bir karta tıklayınca kartın **Durum**, **Etiketler**, **İnsan** (ajanlar bunu atlar), açıklama (Markdown) ve yorum alanlarını görür ve değiştirirsiniz. `/` her projede arar, `h` yalnız insan görevlerini gösterir, dışa aktarma düğmesi panoyu Markdown ya da JSON olarak kaydeder. Ajanlar pano araçlarını alır: bir sohbetten "panodaki sonraki görevi al" isteyin; ajan en üstteki **Yapılacak** kartını **Yapılıyor** sütununa taşır, yaptığı işi yorum olarak yazar ve kartı **İncelemede** sütununa taşır; kartı **Bitti** sütununa siz taşırsınız. Açık görevi olan bir projede her sohbet bu kuralı kendiliğinden alır. Ayarlar → Composer Plus → **Görev panosu** satırında **Bekleyenler** sütununun anahtarı vardır: ajanlar bu sütundaki kartları size bırakır. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ekran görüntüsü: Görev panosu"></a> |
|
|
72
75
|
| **Proje hafızası** | <a id="feature-projectmemory"></a>Varsayılan olarak kapalıdır: **Ayarlar → Composer Plus** içinden açın. Her proje klasörünün kendi hafızası olur ve o projenin sonraki sohbetleri bu hafızayı okur. DS Bot da her Bot için böyle bir hafıza tutar. Her tur bittikten sonra sohbetin modeline bir çağrı yapılır: yeni mesajları okur (geri alınanları okumaz), kalıcı tercihlerinizi, kararlarınızı ve olguları kısa notlar olarak saklar, eski notları değiştirir ya da siler. Ajan da notları kendisi kaydedebilir, silebilir ve arayabilir (`memory_remember`, `memory_forget`, `memory_recall`). Bir not genel de olabilir: o notu her proje okur. Yeni bir sohbet notları sistem isteminde alır; sonra kaydedilen bir not bir sonraki sohbette görünür. Dosyalar dsh ana klasöründe Markdown dosyalarıdır (`storages/dsh-composer-plus/memory/`), hiçbir zaman proje klasöründe değildir. Aynı satırdaki **Hafızayı aç**, kaydedilen tüm notları proje proje (ve genel hafızayı) gösterir; notları filtreleyebilirsiniz. Neyin değişeceğini kendi sözlerinizle yazın (örneğin "yarn yerine artık pnpm kullanıyorum"), sonra **Değişiklikleri önizle**: değişiklikleri dsh’nin varsayılan modeli önerir, yalnız **Uygula** onları kaydeder. Tether’de: sohbet başlığı menüsü → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ekran görüntüsü: Proje hafızası"></a> |
|
|
73
76
|
| **Sohbet boyunca izin** | <a id="feature-allowforchat"></a>Otomatik inceleme size sorduğunda onay kartında **Bu sohbet boyunca izin ver** düğmesi görünür. Bundan sonra aynı sohbette aynı araca, parametreleri ne olursa olsun, süre sınırı dolana kadar izin verilir (varsayılan olarak 1 saat; süreyi **Ayarlar → Composer Plus → Sohbet boyunca izin** içinden seçin). Sonra ajan yeniden sorar. Başlıktaki küçük bir etiket izinleri bitiş saatleriyle listeler ve kaldırır. İzinler yeniden başlatmadan sonra da korunur. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ekran görüntüsü: Sohbet boyunca izin"></a> |
|
|
74
77
|
| **Proje durumu** | <a id="feature-projectstatus"></a>Kenar çubuğundaki proje satırı, sohbetlerindeki dönen simge / bekliyor / tamamlandı işaretinin aynısını gösterir. Böylece daraltılmış bir proje de içindeki bir sohbetin çalıştığını ya da sizi beklediğini gösterir. Önce sizi bekleyen bir sohbet gösterilir, sonra henüz açmadığınız tamamlanmış bir sohbet (yeşil nokta, başka bir sohbet hâlâ çalışırken de), sonra dönen simge. Ayrıntılar için üzerine gelin. **Çalışma alanı ağacı** görünümünde üst klasörün satırı, içindeki her projenin (örneğin `.worktrees/` içindeki her dal klasörünün) sohbetlerini de gösterir. Bu, klasör daraltılmışken de geçerlidir. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ekran görüntüsü: Proje durumu"></a> |
|
|
@@ -166,7 +169,9 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
166
169
|
- **Hedef kontrolü:** yalnızca ajan otomatik bir turda bir `/goal` hedefini tamamlandı olarak işaretlediğinde (ya da siz **Şimdi çalıştır** düğmesine tıkladığınızda) çalışır. Host tarafı test komutunu sohbetin klasöründe, sohbetin korumalı alan moduyla çalıştırır (dsh’nin kendi `bash` aracı gibi: aynı dosya erişimi politikası; bu korumalı alan başlayamazsa test çalışmaz ve kontrol başarısız olur). Komutu bulmak için yalnızca `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` ve `pytest.ini` dosyalarını, klasörün içindeki normal dosyalar olarak okur (klasörün dışını gösteren sembolik bağlantılar ve FIFO’lar okunmaz). Sonra **Hedef kontrolü** için seçilen modele (varsayılan olarak sohbetin kendi modeline), araç içermeyen tek bir istek gönderir. İstekte şunlar vardır: hedef; hedef başladığından beri sohbet (mesajlarınız, ajanın yanıtları, 1.000 karaktere kısaltılmış araç çağrıları ve her araç sonucunun son 2.000 karakteri; akıl yürütme metni ve geri alınan adımlar yoktur; en çok yaklaşık 60.000 karakter, en yeni kısım); `git status --short` çıktısı ve test çıktısının sonu. Araç çıktısı ajanın okuduklarını içerebilir. Bu yüzden bu istek, sohbetin kendisi gibi, dosyalarınızın parçalarını içerebilir. Sohbete ve projeye hiçbir şey yazılmaz. Test komutunuz, sınırlar, son sonuç (çıktısının sonuyla) ve model seçimi `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` dosyasındadır (yalnızca sahibin erişebildiği dosya, en yeni 500 sohbet).
|
|
167
170
|
- **Yeni sohbette devam et:** siz tıklayana kadar hiçbir şey çalışmaz. Sonra Host tarafı sohbeti (Hedef kontrolü'nün okuduğu gibi: akıl yürütme yok, geri alınan adımlar yok) sohbetin kendi modeline gönderir ve notu gösterir; yalnız **Yeni sohbet başlat** yeni bir sohbet açar. Projeye hiçbir şey yazılmaz.
|
|
168
171
|
- **Bağlam dökümü:** Host'ta yalnız sohbet günlüğünü okur; model çağrısı yapmaz, proje dosyası okumaz.
|
|
172
|
+
- **Görev panosu:** pano (görevlerinizin başlıkları, açıklamaları, etiketleri ve yorumları, proje klasörlerinin yolları ve kısa kimlikleri) `$DSH_HOME/storages/dsh-composer-plus/board.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya); anahtar, yanındaki `board-switch.json` dosyasındadır. Hiçbir şey bilgisayarınızdan çıkmaz ve hiçbir proje klasörüne bir şey yazılmaz. Pano araçları, panoya yazdıklarınızı ajanlara verir. Bu yüzden bir ajan bir görevi okuduğunda görevin metni sohbetin modeline ulaşır. Bozuk bir pano dosyası `board.json.broken-<time>` olarak saklanır ve pano boş başlar.
|
|
169
173
|
- **Korunan dosyalar:** liste ve anahtar `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her dosya aracı çağrısının yalnız yolunu (ve gerçek yolunu) okur, dosyanın kendisini okumaz.
|
|
174
|
+
- **Engellenen komutlar:** kurallar ve anahtar `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` dosyasındadır (yalnız sahibinin okuyabildiği dosya). Kontrol, her `bash` ve `pwsh` çağrısının yalnız komut metnini okur; hiçbir şey çalıştırmaz ve hiçbir şey göndermez.
|
|
170
175
|
- **Proje hafızası:** siz açana kadar kapalıdır. Açıkken, üst düzey bir sohbetin her turu bittikten sonra Host tarafı, sohbetin son incelemeden bu yana gelen kendi yeni mesajlarını (sizin mesajlarınız ve ajanın metin yanıtları; araç çıktısı, akıl yürütme, gizli bağlam ve geri alınan mesajlar yok; çatallanmış bir sohbette üst sohbetten gelen kopya dışarıda kalır; en çok yaklaşık 16.000 karakter) ve kayıtlı notları, araç içermeyen tek bir istek olarak sohbetin kendi modeline gönderir. Notlar `$DSH_HOME/storages/dsh-composer-plus/memory/` altındaki Markdown dosyalarıdır (yalnız sahibinin erişebildiği dosyalar): her proje klasörü için `projects/<id>/` (`<id>`, klasörün gerçek yolunun bir özetidir; `project.json` klasörün yolunu yazar), `global/`, `journal.jsonl` (her değişiklik, öncesi ve sonrasındaki satırla) ve `reviewed.json` (her sohbetin nereye kadar okunduğu). Proje klasörüne hiçbir şey yazılmaz. Anahtar, token, parola ya da kimlik numarasına benzeyen notlar reddedilir. Bir projenin notları o klasördeki her yeni sohbetin sistem istemine girer, bu yüzden o sohbetin her isteğiyle modele gider. Anahtar, aynı yerdeki `memory.json` dosyasındadır. **Hafızayı aç**, siz **Değişiklikleri önizle** düğmesine basana kadar hiçbir şey göndermez; basınca gösterdiği notları ve metninizi araçsız tek bir istek olarak dsh’nin varsayılan modeline gönderir. Değişiklikler yalnız **Uygula** ile yazılır, günlükte `editor` olarak görünür. Tether notları aynı yoldan okur ve değiştirir.
|
|
171
176
|
- **Yedekleme:** hiçbir şey bilgisayarınızdan çıkmaz. Arşivler `~/Desktop/dsh-backups` klasörüne gider (yalnızca sahibin erişebildiği dosyalar). Gizli bilgiler arşivde yoktur: kimlik bilgisi dosyaları (`.credentials.yaml`, `.env`), anahtar dosyaları (`.pem`, `.key`, `.p12`, `.pfx`) ve yml dosyalarındaki token, secret, password ve API anahtarı ayarlarının değerleri maskelenir. Bunların gerçek kopyaları aynı klasördeki `composer-plus-vault/<archive>/` içinde (yalnızca sahibin erişebildiği), yalnızca bu bilgisayarda kalır. **Başka bir bilgisayar için** vault’u kopyalamaz: bu gizli bilgileri orada yeniden girin. Sohbet günlükleriniz, ayarlarınız ve dsh ana klasörünün geri kalanı arşivde olduğu gibi durur: klasörü, `$DSH_HOME` klasörünün kendisi gibi gizli tutun. Yedekleme, dosyaları `O_NOFOLLOW | O_NONBLOCK` ile okur. Sembolik bağlantı, bağlantı olarak saklanır (hiçbir zaman izlenmez); FIFO ve aygıt dosyaları atlanır. Otomatik yedekleme anahtarı ve ayarları `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json` dosyasında, kurtarma konsolu anahtarı `rescue-console.json` dosyasındadır. dsh çalışırken `running/host-<pid>.json` her dsh sürecini belirtir (kurtarma konsolu, bir geri yüklemeyi reddetmek için bu dosyaları okur).
|
|
172
177
|
- **Kurtarma konsolu:** bir terminal menüsüdür ve ağ portu açmaz. Geri yükleme yalnızca dsh ana klasörünün yanındaki yeni bir klasöre yazar (dosyalar `O_EXCL | O_NOFOLLOW` ile; sembolik bağlantılar en son ve hiçbir zaman izlenmeden yazılır). Güvenli olmayan bir ad (`..`, mutlak bir yol), aygıt dosyası ya da FIFO, birden çok üst klasör veya bir bağlantının altındaki bir öğe içeren arşivi reddeder.
|
|
@@ -189,7 +194,7 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
189
194
|
- **Bir sohbet satırında dal etiketi yok:** bu sürümü yüklediğinizden beri sohbette hiç tur olmadı, sohbetin klasörü bir git deposu değil ya da **Sohbet satırlarında Git dalı** kapalı. Bir güncellemeden sonra dsh’yi yeniden başlatın (dalı Host tarafı kaydeder).
|
|
190
195
|
- **Hedef kontrolü, testin 127 koduyla ya da "not found" ile çıktığını söylüyor:** Finder’dan veya Dock’tan başlatılan dsh’nin PATH’i terminalinizdekinden daha kısa olabilir. Bu yüzden dsh `npm`, `pnpm` veya `cargo` aracını bulamaz. dsh’yi bir terminalden başlatın ya da **Hedef kontrolü** → **Düzenle** içinde tam yolu olan kendi test komutunuzu belirleyin. **Şimdi çalıştır** sonucu hemen gösterir.
|
|
191
196
|
- **Hedef kapanmıyor ve ajan çalışmaya devam ediyor:** **Hedef kontrolü** başarısız bir test ya da eksik bir iş buldu. Hedefin altındaki satır nedenini gösterir (ayrıntılar için imleci sonucun üzerine getirin). Nedeni ya da test komutunu düzeltin veya hedefi `/goal` ya da hedef çubuğuyla kendiniz tamamlayın (bu tamamlama kontrol edilmez).
|
|
192
|
-
- **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.
|
|
197
|
+
- **Bir yayından hemen sonra yükleme başarısız oluyor:** sürümü ekleyin (`dsh-composer-plus@1.18.0`) ve yukarıdaki kurulum notuna bakın.
|
|
193
198
|
- **Şimdi yedekle, "Başka bir yedekleme işlemi sürüyor" diyor:** başka bir dsh penceresinde ya da kurtarma konsolunda bir işlem çalışıyor (ikisi, yedek klasöründeki `.composer-plus.lock` kilit dosyasını paylaşır). İşlemin bitmesini bekleyin. Çalışan bir işlem yoksa, kapanmış bir sürecin kilidi bir sonraki tıklamada devralınır.
|
|
194
199
|
- **Kurtarma konsolu "dsh is running" diyor:** önce dsh’den çıkın. dsh gerçekten kapalıysa mesajda adı geçen dosya bir çökmeden kalmıştır: dosyayı silin ve yeniden deneyin.
|
|
195
200
|
- **Geri yüklemeden sonra dsh açılmıyor ya da bir eklenti eksik:** bir profilin eklenti paketlerinin yeniden yüklenmesi gerekir. Kurtarma konsolu bunu geri yüklemeden sonra önerir. Ya da konsolun listelediği, `$DSH_HOME/profiles/` altındaki her klasörde `pnpm install` komutunu çalıştırın. Vault’ta olmayan gizli bilgiler (başka bir bilgisayar) yeniden girilmelidir: konsol bunları listeler.
|
|
@@ -239,8 +244,11 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
239
244
|
- **İstemi iyileştir** yalnızca kısa bir proje özetini, değişen yolları ve adı sözcüklerinizle eşleşen yolları görür: kodun kendisini görmez. Bu yüzden doğru dosyayı kaçırabilir ve yalnızca kendisine verilen yolların adını yazar. Yeni metni göndermeden önce okuyun. `/goal <hedef>` dışındaki bir eğik çizgi komutunda, bir `/goal` kontrol sözcüğünde (`clear`, `pause`, `resume`) veya dosya ya da sembol etiketi olan bir mesajda çalışmaz (yeni metin düz metindir, bu yüzden etiket kaybolurdu). Bir `/goal` hedefinde koşulları yalnız taslaktan ve bağlamdan yazar. Fazla katı bir koşul hedef turlarını harcayabilir, bu yüzden göndermeden önce okuyun. Bir mesaj en çok 8.000 karakter olabilir. Görseller ekli kalır: yalnızca metin değişir. Her tıklama bir model çağrısı yapar. Güçlü bir model bir dakika sürebilir (`Esc` iptal eder).
|
|
240
245
|
- **Hedef kontrolü** yalnızca ajanın otomatik bir hedef turunda yaptığı tamamlamayı kontrol eder: sohbette sizin istediğiniz bir tamamlama, `/goal` ve hedef çubuğu kontrol edilmez. Ajan testleri ya da test komutunun dosyalarını kendisi değiştirebilir. Doğrulayıcı sohbeti okur ve bunu görebilir, ama iki yönde de yanılabilir (yanlış bir "tamamlanmadı" bir tur daha harcar; yanlış bir "tamamlandı" hedefi kapatır). Doğrulayıcı sohbeti ve `git status` çıktısını görür, kodun kendisini görmez. Bir test çalıştırması yalnızca ajanın dosya değiştirebilen en yeni adımı, aynı klasörde tam olarak aynı komutun ajanın kendi başarılı `bash` çalıştırmasıysa yeniden kullanılır. Kanal (`| tail`) ya da `&&` içeren bir komut yeniden kullanılmaz. Bütçe bir tur bittiğinde ölçülür. Bu yüzden tek bir tur bütçeyi aşabilir. Token bütçesi sohbetin alt ajan sohbetlerinin çağrılarını da sayar (her tur sonunda kayıtlı günlüklerinden okunur, bu yüzden çok alt ajanı olan bir sohbetin kontrolü biraz daha uzun sürer). Kanıt tablosu doğrulayıcının sohbeti kendi okumasından gelir: doğrulandı dediği bir parçaya, önemliyse siz de bakın. Kontrol çalışırken `update_goal` bekler (test en çok 15 dakika, doğrulayıcı en çok 3 dakika). Dallandırılmış bir sohbet yeni bir sohbet kimliği alır. Bu yüzden üst sohbetin kendi test komutu ve sınırları olmadan başlar. Doğrulayıcıya ulaşan her tamamlama bir model çağrısı yapar.
|
|
241
246
|
- **Korunan dosyalar** bir korkuluktur, korumalı alan değildir. dsh'nin kendi dosya araçlarını kapsar (`read`, `read_image`, bir dosyada `grep`, `write`, `edit`, `str_replace_editor`). Bir kabuk komutu (`cat .env`), ajanın yazdığı bir betik, bir alt ajanın kabuğu, bir MCP aracı, bir `glob` listesi ve bütün bir klasörde `grep` korumalı bir dosyaya yine erişebilir. Gerçek bir sınır için dsh'nin korumalı alan modlarını kullanın ya da gizli bilgileri proje klasörünün dışında tutun. Desenler `*`, `**` ve `?` bilir, `{a,b}` ya da `[ab]` bilmez ve büyük-küçük harf farkını yok sayar.
|
|
247
|
+
- **Engellenen komutlar** bir korkuluktur, korumalı alan değildir. Yalnız dsh’nin `bash` ve `pwsh` araçlarının komut metnini okur. Komutu adlandıran bir değişken ya da takma ad (`CMD=npm; $CMD publish`), bir kabuk fonksiyonu, ajanın yazdığı bir betik dosyası, başka bir program (`python -c`, `node -e`, `make`), bir MCP aracı ve kendi terminaliniz komutu yine çalıştırabilir. Bir kural, istediğinizden fazlasıyla eşleşebilir: bir komutun her sözcüğü komut adı olabilir (`echo npm publish`, `npm publish` ile eşleşir) ve kuralın sözcükleri arasında başka sözcükler olabilir (`git push --force`, `git push origin main --force` ile de eşleşir). Bir kural fazla eşleşiyorsa onu uzatın. **önce sor** için sorabilen bir sohbet gerekir: onay politikası never olan bir sohbette (örneğin görev verilmiş bir alt ajan) dsh kartı gösteremez, bu yüzden çağrı nedeniyle birlikte reddedilir. Onay kartı nedeni İngilizce gösterir. **Sohbet boyunca izin** bir **önce sor** kartını yanıtlamaz.
|
|
242
248
|
- **Yeni sohbette devam et** sohbeti (mesajlar, araç çağrıları ve her araç sonucunun sonu; en çok yaklaşık 60.000 karakter, en yeni kısım) sohbetin kendi modeline gönderir. Not bir kararı ya da dosyayı atlayabilir: başlatmadan önce okuyun. Yeni sohbet yalnız notu ve bağlantılı sohbeti bilir (dsh eski sohbeti salt okunur bağlam olarak ekler); model bağlamı küçük başlar, eski sohbet olduğu gibi kalır. Her sohbet için aynı anda tek not ya da başlatma çalışır.
|
|
243
249
|
- **Bağlam dökümü** dsh'nin kendi kuralıyla tahmin gösterir (token başına yaklaşık 4 karakter), dsh'nin bağlam halkasıyla aynı kural; modelin kendi sayımı farklı olabilir. Araç tanımları en yeni isteğinkilerdir. Bağlamı sohbet günlüğündeki hâliyle gösterir; şu anda çalışan bir tur bir sonraki adımından sonra görünür.
|
|
250
|
+
- **Planlı adımlar** yalnız model plan yaptığında token kazandırır: açıkken her istek `plan_next_steps` aracını ve kısa bir talimatı (yaklaşık 500 token) taşır; modelin hiç plan yapmadığı sohbetlerde de. Koşul yalnız yazdığını kanıtlar (örneğin: derlemenin çıkış kodu 0 oldu); işin doğru olduğunu kanıtlamaz. `ok`, dsh'nin kendi sonuç işaretlerini okur (`[exit code: N]`, zaman aşımı, sandbox reddi); sıfırdan farklı çıkış kodu vermeden başarısız olan bir komut geçmiş sayılır. Adımlar tek tek çalışır; aynı anda hazır olan iki adım modele geri döner. Adımın mesajı, sohbetin modelinin bir asistan mesajı olarak kaydedilir (dsh'de bir eklentinin yazdığı mesaj için işaret yok); bu yüzden metni, adımı Composer Plus'ın çalıştırdığını söyler. Tether'de yok.
|
|
251
|
+
- **Görev panosu** yalnız dsh'nin projelerini bilir: proje dışındaki bir sohbette **Tüm projeler** görünür ve sohbet başına dal klasörü (`<project>/.worktrees/<name>`) kendi projesinden sayılır. Proje kimlikleri (`acme#12`) klasör adından gelir ve projeyi dsh'de yeniden adlandırdığınızda değişmez. "Panoyu güncel tut" kuralı bir sohbete yalnız projesinin açık görevleri varsa eklenir; kuralı almış bir sohbet onu korur. Ajanlara **Bitti**, **Bekleyenler** ve insan görevlerini size bırakmaları söylenir, ama araçlar bunu reddetmez: bir ajan böyle bir kartı yine de taşıyabilir. Özellik açıkken pano araçları her sohbetin araç listesindedir (istek başına yaklaşık 1.000 token); panoyu kullanmıyorsanız özelliği kapatın. Sayfa görünürken panoyu 2 saniyede bir okur; bir ajanın değişikliği bu süre içinde görünür. Bir ajan aynı alanı değiştirirken düzenlediğiniz metin kaydedilmez: panel yeni metni ve nedenini gösterir. Görsel, bilgisayarlar arasında git eşitlemesi ve ağ üzerinden paylaşım yoktur (Kanzo'da bunlar vardır). Fikir ve görünüm emanuele-em'in [Kanzo](https://github.com/emanuele-em/kanzo) projesinden gelir (AGPL-3.0); Composer Plus onun kodunu kullanmaz.
|
|
244
252
|
- **Durdurduktan sonra gönderilen önce gider** yalnız sohbeti durdurduktan sonra çalışır (ya da bir tur hata verdikten sonra veya hâlâ kuyruğu olan bir sohbeti açtığınızda): bir tur çalışırken gönderdiğiniz mesaj yine kuyruğun sonunda bekler. Mesaj yalnız sizin kuyruktaki mesajlarınızın önüne geçer: kuyrukta bir hedef turu ya da bir soru yanıtı bekliyorsa dsh’nin kendi sırası kalır. dsh’nin herkese açık API olmayan bir bölümünü okur (durdurulan turun hâlâ bitip bitmediğini); bir dsh güncellemesi bunun adını değiştirirse mesaj, o tur bittikten sonra öne alınır. Alt ajan sohbetleri dsh’nin kendi sırasını korur.
|
|
245
253
|
- **Proje hafızası** sohbetin ilk klasörüne (dsh'nin proje klasörüne) aittir: klasörünü `cd` ile değiştiren bir sohbet ilk projesinin hafızasını kullanmaya devam eder; aynı klasör aynı dosyalara giden başka bir yoldan açılırsa hafızayı paylaşır. Bir sohbet, başladığında hafıza bölümünü dondurur; bu yüzden sonra kaydedilen bir not bir sonraki sohbette görünür (`memory_recall` onu hemen bulur). İnceleme yalnız modelin saklamaya karar verdiği şeyi saklar: bir olguyu kaçırabilir ya da yanlış bir şeyi saklayabilir. Notları **Hafızayı aç** içinde kontrol edip orada değiştirin ya da dsh kapalıyken dosyaları elle düzenleyin. **Hafızayı aç**, seçili projenin notlarını ve genel notları (Tüm notlar seçiliyse bütün projeleri; en çok yaklaşık 60.000 karakter, kalanı yalnız sayılır ve o istekte değişemez) ve yazdığınız metni sohbetin modeline değil, dsh’nin varsayılan modeline gönderir. Önizleme Mac’te 30 dakika ve dsh yeniden başlayana kadar tutulur; bu arada bir inceleme ya da ajan notları değiştirirse **Uygula** reddeder ve yeniden önizlersiniz. **Uygula** bir önizlemenin ya bütün değişikliklerini ya hiçbirini kaydeder: bir değişiklik kaydedilemezse (örneğin MEMORY.md doluysa) notlar olduğu gibi kalır ve nedeni görünür. Sizden bir mesaj içeren her bitmiş tur bir model çağrısına mal olur; başarısız bir çağrı, sonraki turdan sonra aynı mesajları yeniden okur. Alt ajan sohbetleri incelenmez. Fikir ve dosya biçimi [DS Bot](https://github.com/Fei2411/DS-Bot) projesinden gelir (Apache-2.0); Composer Plus onun kodunu kullanmaz ve DS Bot'un kendi hafızasını hiçbir zaman okumaz ya da yazmaz.
|
|
246
254
|
- **Yedekleme** tek ve sabit bir klasör kullanır: `~/Desktop/dsh-backups` (dsh-backup’ın varsayılan klasörü; böylece onun arşivleri kullanılabilir kalır). Başka bir klasör için ayar yoktur. Bir arşiv, `cache/` ve `dsh-runtimes/` olmadan dsh ana klasörü kadar büyüktür (ölçüm: Apple Silicon’da 1,6 GB dosya, yaklaşık 30 sn’de 830 MB’lık bir arşiv oldu; dsh bu sırada yanıt vermeye devam etti). Okunurken değişen bir dosya, yedeklemenin onu açtığı andaki hâliyle saklanır. Bu yüzden açık bir sohbetin günlüğü kesik bir kayıtla bitebilir; dsh bunu bir sonraki yazmada onarır. Maskeleme, yml dosyasındaki bir gizli bilgiyi tek satırdaki anahtar adından bulur (`token:`, `apiKey:`, …). Akış eşlemindeki (`{token: x}`), böyle bir anahtarın altındaki bir listedeki, bir JSON dosyasındaki (örneğin bir `.json` dosyasındaki bir MCP sunucusunun `apiKey` değeri) ya da başka bir ad altındaki gizli bilgi arşivde kalır. dsh-backup’ın türe göre aldığı arşivler (`dsh-t-…`) listelenmez. **Başka bir bilgisayar için** arşivi kopyalar (APFS’te bir klon: ek yer kaplamaz); vault onunla gitmez. **Şimdi yedekle** hiçbir yedeği silmez. Otomatik yedekleme, Composer Plus’ın aldığı en yeni yedekleri tutar (**Otomatik yedekleme** içindeki **Sakla** ayarı) ve kendi aldığı daha eski yedekleri siler. Yükseltme öncesi anlık görüntüler ayrı sayılır (en yeni 2 tanesi kalır). dsh-backup’ın arşivleri hiçbir zaman silinmez: onları **Sil** ile kaldırın. dsh-backup hâlâ yüklüyse Composer Plus arşivlerini kendi saklama sayısına katar ve onları silebilir.
|
|
@@ -277,6 +285,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
277
285
|
|
|
278
286
|
**Ajan, DS Bot'un hafızası gibi tercihlerimi sohbetler arasında hatırlayabilir mi?** Evet, **Proje hafızası** ile (varsayılan olarak kapalı): **Ayarlar → Composer Plus** içinden açın. Her turdan sonra kalıcı tercihleriniz ve kararlarınız, sohbetin projesi için kısa notlar olarak saklanır; o projedeki her yeni sohbet bunları okur. Ajandan bir şeyi hatırlamasını isterseniz onu hemen kaydeder. Notları görmek ya da değiştirmek için aynı satırdaki **Hafızayı aç** düğmesine basın ve neyin değişeceğini yazın.
|
|
279
287
|
|
|
288
|
+
**Ajanlarım ve ben, Kanzo'daki gibi tek bir görev panosunu paylaşabilir miyiz?** Evet, **Görev panosu** ile (varsayılan olarak açık): sol kenar çubuğundan açın ve **Yeni görev** ile görev ekleyin. Bir sohbette ajandan "panodaki sonraki görevi al" isteyin: ajan kartı **Yapılıyor** sütununa taşır, yaptığı işi yorum olarak yazar ve kartı **İncelemede** sütununa taşır. Bir görevi kendinize ayırmak için onu **İnsan** olarak işaretleyin.
|
|
289
|
+
|
|
280
290
|
**dsh, dsh-backup gibi sohbetlerimi ve ayarlarımı yedekleyebilir mi?** Evet: **Ayarlar → Composer Plus → Yedekleme → Şimdi yedekle**. Aynı arşiv biçimini aynı klasöre (`~/Desktop/dsh-backups`) yazar. Bu yüzden dsh-backup’ın arşivleri de görünür ve geri yüklenebilir; dsh-backup’ı kaldırabilirsiniz. Zamanlanmış yedekleme için **Otomatik yedekleme** ayarını açın.
|
|
281
291
|
|
|
282
292
|
**dsh artık açılmıyor. Bir yedeği nasıl geri yüklerim?** Yedek klasörünü (`~/Desktop/dsh-backups`) açın ve `Composer Plus Rescue.command` dosyasına çift tıklayın (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). `3) Restore a backup` seçeneğini seçin, bir yedek seçin ve `RESTORE` yazın. Bu, dsh olmadan çalışır.
|
|
@@ -301,6 +311,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
301
311
|
|
|
302
312
|
**Yalnızca bir sohbetin değiştirdiği dosyaları nasıl görürüm?** Sağ kenar çubuğu → **Değişiklikler** → **Bu sohbet**. Yalnızca boşluk olan değişiklikleri gizlemek için **␣** düğmesine tıklayın.
|
|
303
313
|
|
|
314
|
+
**Ajanın `npm publish` ya da `git push --force` çalıştırmasını nasıl engellerim?** **Ayarlar → Composer Plus → Engellenen komutlar**: `npm publish` yazın, **engelle** ya da **önce sor** seçin, sonra **Ekle** düğmesine tıklayın. **engelle** komutu reddeder ve ajan size sorar; **önce sor** her seferinde onay kartını gösterir. Korunan dosyalar ajanın dosya araçlarını kapsar; Engellenen komutlar ise kabuk komutlarını kapsar.
|
|
315
|
+
|
|
304
316
|
**Otomatik inceleme’nin tek bir sohbette aynı araç için tekrar sormasını nasıl durdururum?** Onay kartında **Bu sohbet boyunca izin ver** düğmesine tıklayın. Bu izin yalnızca o sohbetteki o aracı kapsar ve varsayılan olarak 1 saat sürer. İzni başlıktaki etiketten kaldırın. Süreyi **Ayarlar → Composer Plus → Sohbet boyunca izin** içinden değiştirin.
|
|
305
317
|
|
|
306
318
|
**iPhone’umu kaybettim. Mac’ime erişmesini nasıl engellerim?** Kenar çubuğunun sol altındaki **Mobil bağlantı** düğmesine tıklayın, sonra o iPhone’un yanındaki **Remove** düğmesine tıklayın. iPhone’un anahtarı hemen geçersiz olur. iPhone, ancak sizin Mac’te onayladığınız yeni bir eşleştirmeyle yeniden bağlanabilir.
|
|
@@ -329,6 +341,8 @@ dsh `0.2.0-rc.2` (masaüstü ve web) ve `0.2.1-rc.2` (web) üzerinde test edildi
|
|
|
329
341
|
|
|
330
342
|
**iPhone’umdan fotoğraf gönderebilir miyim?** Evet. Tether’deki bir sohbette mesaj alanının yanındaki **+** düğmesine dokunun → Camera, Photos (en çok 4) ya da Paste image. Fotoğraflar, mesajınızın ekleri olarak Mac’teki sohbete gider. Bu yüzden model onları görür.
|
|
331
343
|
|
|
344
|
+
**dsh, modele yeniden sormadan sonraki komutu çalıştırabilir mi?** Evet, **Planlı adımlar** ile (varsayılan olarak kapalı): Ayarlar → Composer Plus içinden açın. Model sonraki komutlarını bir koşulla planlayabilir, örneğin "derleme geçince testleri çalıştır"; sonuç koşulu karşılarsa Composer Plus adımı yeni bir model çağrısı yapmadan çalıştırır. Onaylar ve sandbox olduğu gibi kalır.
|
|
345
|
+
|
|
332
346
|
**Masaüstü uygulamasıyla çalışır mı?** Evet: Ayarlar → Eklentiler → **Eklenti ekle** → `dsh-composer-plus`. dsh 0.2.0-rc.2 (masaüstü ve web) ve 0.2.1-rc.2 (web) üzerinde test edildi.
|
|
333
347
|
|
|
334
348
|
## Geliştirme
|
|
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
393
407
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
394
408
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
395
409
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
410
|
+
# Task board: the page, the agent tools (fake model), drag and drop, search, the switch
|
|
411
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
396
412
|
```
|
|
397
413
|
|
|
398
414
|
```sh
|
package/README.vi.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Sau đó khởi động lại dsh. (CLI không cài được vào profile desktop; ứng dụng tự quản lý profile này.)
|
|
31
31
|
|
|
32
|
-
> pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.
|
|
32
|
+
> pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.18.0`.
|
|
33
33
|
|
|
34
34
|
## Tính năng
|
|
35
35
|
|
|
@@ -68,7 +68,10 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
|
|
|
68
68
|
| **Kiểm tra mục tiêu** | <a id="feature-goalcheck"></a>Bắt đầu một mục tiêu bằng `/goal`. Khi tác tử đánh dấu mục tiêu là hoàn tất trong một vòng tự động, mục tiêu chỉ đóng sau hai bước kiểm tra. Đầu tiên, lệnh kiểm thử của dự án chạy trong thư mục của cuộc trò chuyện, theo chế độ sandbox của cuộc trò chuyện. Lệnh này là lệnh của riêng bạn hoặc lệnh tìm thấy trong `package.json`, `Makefile`, `Cargo.toml`, `go.mod` hoặc pytest. Khi bước mới nhất của chính tác tử là một lần chạy đạt của bài kiểm thử đó, lệnh không chạy lại. Sau đó, một lần gọi mô hình độc lập, không có công cụ, đọc mục tiêu, cuộc trò chuyện này, `git status` và kết quả kiểm thử. Mô hình trả lời bằng một bảng bằng chứng: mỗi phần của mục tiêu được đánh dấu là đã xác minh, sai hoặc chưa giải quyết, kèm bằng chứng và cách sửa; mục tiêu chỉ đóng khi mọi phần đều đã xác minh. Nếu một bước kiểm tra không đạt, mục tiêu vẫn đang hoạt động và tác tử đọc từng phần còn mở kèm bằng chứng và cách sửa, rồi vòng tiếp theo tiếp tục. Một dòng bên dưới thanh mục tiêu (**Kiểm tra mục tiêu**) hiện bài kiểm thử, kết quả gần nhất và số phần đã xác minh (di chuột lên dòng này để xem bảng). **Sửa** đặt lệnh kiểm thử của riêng bạn và giới hạn thời gian hoặc token; khi vượt giới hạn, mục tiêu bị chặn. Giới hạn token cũng tính cả các subagent của cuộc trò chuyện. **Chạy ngay** chạy bước kiểm tra mà không đóng mục tiêu. Tính năng có menu **Mô hình** riêng trong Cài đặt (mặc định: **Giống mô hình của cuộc trò chuyện**). Khi bạn tự hoàn tất mục tiêu, không có gì được kiểm tra. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Ảnh chụp màn hình: Kiểm tra mục tiêu"></a> |
|
|
69
69
|
| **Tiếp tục trong cuộc trò chuyện mới** | <a id="feature-handoffchat"></a>Nhấp chuột phải vào một cuộc trò chuyện trên thanh bên (hoặc mở menu **…** của nó) → **Tiếp tục trong cuộc trò chuyện mới…**. Một lần gọi chính mô hình của cuộc trò chuyện viết ghi chú bàn giao từ những gì cuộc trò chuyện hiển thị: Nhiệm vụ, Kết quả đầu ra, Đã hoàn thành, Quyết định, Vấn đề còn mở và Hành động tiếp theo (các lệnh gọi công cụ và kết quả của chúng là bằng chứng; các bước bạn đã hoàn tác được bỏ ra). Ghi chú mở trong một hộp thoại: hãy đọc và sửa ghi chú. **Viết lại** viết một ghi chú mới. **Bắt đầu cuộc trò chuyện mới** (hoặc `Cmd/Ctrl+Enter`) mở một cuộc trò chuyện mới trong cùng dự án với ghi chú và liên kết đến cuộc trò chuyện cũ làm tin nhắn đầu tiên; cuộc trò chuyện cũ vẫn giữ nguyên. Dùng tính năng này khi một cuộc trò chuyện dài đã đầy hoặc chậm, hoặc để tiếp tục vào ngày mai. Không có gì được ghi vào dự án. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Ảnh chụp màn hình: Tiếp tục trong cuộc trò chuyện mới"></a> |
|
|
70
70
|
| **Phân tích ngữ cảnh** | <a id="feature-contextbreakdown"></a>Thanh bên phải → `+` → **Ngữ cảnh**. Trang cho biết những gì đang chiếm ngữ cảnh mô hình của cuộc trò chuyện đang mở và lượng cửa sổ ngữ cảnh đã dùng: system prompt, hướng dẫn dự án (AGENTS.md), skill, tin nhắn của bạn, câu trả lời của tác tử và lệnh gọi công cụ, kết quả công cụ (theo từng công cụ), kết quả MCP (theo từng máy chủ), định nghĩa công cụ, bản tóm tắt nén và các ghi chú ngữ cảnh khác, mỗi mục kèm số token và tỷ lệ. Nhấp vào một phần để xem các công cụ hoặc máy chủ của phần đó. Trang chỉ đọc nhật ký cuộc trò chuyện, sau `/compact` và các lần hoàn tác, và không gọi mô hình nào; trang đọc lại sau mỗi lượt và khi nhấn **Làm mới**. Dùng trang này để xem vì sao một cuộc trò chuyện chậm hoặc đầy, ví dụ do một kết quả công cụ MCP lớn hoặc nhiều định nghĩa công cụ. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Ảnh chụp màn hình: Phân tích ngữ cảnh"></a> |
|
|
71
|
+
| **Các bước đã lên kế hoạch** | <a id="feature-plannedsteps"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Tác tử nhận công cụ `plan_next_steps`: trong cùng tin nhắn với một lệnh, tác tử có thể lên kế hoạch cho các lệnh tiếp theo với đối số chính xác và một điều kiện, ví dụ “chạy `npm test` khi bản dựng thành công”. Khi kết quả đáp ứng điều kiện, Composer Plus tự chạy bước tiếp theo mà không gọi lại mô hình, nhờ đó cuộc trò chuyện dài tốn ít token hơn. Bước đó hiện trong cuộc trò chuyện thành một dòng ngắn “Composer Plus · Planned steps: ran `test` … without a model call”, sau đó là lời gọi công cụ và kết quả. Chỉ các bước `bash`, `read`, `grep` và `glob`; phê duyệt, sandbox và Tệp được bảo vệ vẫn áp dụng cho từng bước như thường lệ. Mô hình trả lời lại khi điều kiện không đạt, khi hai bước cùng sẵn sàng, sau bước cuối cùng và khi bạn gửi tin nhắn. Ý tưởng đến từ HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Ảnh chụp màn hình: Các bước đã lên kế hoạch"></a> |
|
|
71
72
|
| **Tệp được bảo vệ** | <a id="feature-protectedfiles"></a>Bật theo mặc định. Các công cụ tệp riêng của tác tử không thể đọc hoặc thay đổi các tệp khớp với mẫu của bạn: `read`, `read_image` và `grep` trên một tệp bị từ chối với mẫu **đọc và ghi**, còn `write`, `edit` và `str_replace_editor` bị từ chối với cả hai loại. Tác tử đọc lý do và được yêu cầu hỏi bạn. Mẫu mặc định là `.env*`, `*.pem` và `*.key`. Cài đặt → Composer Plus → **Tệp được bảo vệ**: thêm một mẫu (ví dụ `published/**` hoặc `config/*.yml`), nhấp vào loại của mẫu để chuyển giữa **đọc và ghi** và **chỉ ghi**, xóa mẫu bằng ✕, hoặc nhấp **Dùng giá trị mặc định**. Mẫu không có `/` khớp với tên tệp trong bất kỳ thư mục nào. Đây là rào chắn bảo vệ, không phải sandbox: lệnh shell (`cat .env`), script hoặc công cụ MCP vẫn có thể truy cập tệp (xem Giới hạn). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ảnh chụp màn hình: Tệp được bảo vệ"></a> |
|
|
73
|
+
| **Lệnh bị chặn** | <a id="feature-blockedcommands"></a>Bật theo mặc định, với danh sách trống. Các lệnh shell của tác tử (`bash`, `pwsh`) không thể chạy lệnh khớp với quy tắc của bạn: quy tắc **chặn** từ chối lệnh gọi (tác tử đọc lý do và được yêu cầu hỏi bạn), quy tắc **hỏi trước** hiện thẻ phê duyệt của dsh, và lệnh chỉ chạy khi bạn cho phép. Cài đặt → Composer Plus → **Lệnh bị chặn**: nhập một quy tắc (ví dụ `npm publish`, `git push --force` hoặc `ssh *192.168.2.19`), nhấp vào loại để chuyển giữa **chặn** và **hỏi trước**, rồi nhấp **Thêm**; nhấp vào loại của một quy tắc để đổi loại, xóa quy tắc bằng ✕. Một quy tắc là tên lệnh và các từ phải đứng sau nó theo đúng thứ tự này; `*` khớp với mọi văn bản. Tính năng cũng tìm thấy lệnh sau `&&`, `;`, `\|`, bên trong `$(…)`, `bash -c "…"` hoặc `eval`, và sau `sudo` hoặc `env`. Đây là rào chắn bảo vệ, không phải sandbox: một biến (`$CMD`), một tệp script hoặc một chương trình khác vẫn có thể chạy lệnh (xem Giới hạn). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ảnh chụp màn hình: Lệnh bị chặn"></a> |
|
|
74
|
+
| **Bảng tác vụ** | <a id="feature-taskboard"></a>Thanh bên trái → **Bảng tác vụ**. Bảng kanban cho các dự án dsh của bạn, dùng chung giữa bạn và các tác tử: **Cần làm**, **Đang làm**, **Đang duyệt** và **Xong** (và **Tồn đọng**, xem bên dưới). Chọn một dự án hoặc **Tất cả dự án** ở bên trái. **Tác vụ mới** (hoặc `n`) mở một thẻ mới: nhập tiêu đề rồi nhấn `Enter`. Kéo thẻ sang cột khác hoặc vào giữa hai thẻ. Nhấp vào thẻ để xem và thay đổi **Trạng thái**, **Nhãn**, **Thủ công** (tác tử bỏ qua), mô tả (Markdown) và bình luận. `/` tìm trong mọi dự án, `h` chỉ hiện tác vụ thủ công, nút xuất lưu bảng dưới dạng Markdown hoặc JSON. Tác tử nhận được các công cụ bảng: hãy bảo một cuộc trò chuyện "lấy tác vụ tiếp theo từ bảng", tác tử sẽ chuyển thẻ trên cùng của **Cần làm** sang **Đang làm**, bình luận về việc đã làm rồi chuyển thẻ sang **Đang duyệt**; bạn là người chuyển thẻ sang **Xong**. Trong dự án có tác vụ đang mở, mỗi cuộc trò chuyện tự nhận quy tắc này. Cài đặt → Composer Plus → **Bảng tác vụ** có công tắc cho cột **Tồn đọng**: tác tử để các thẻ trong cột này lại cho bạn. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ảnh chụp màn hình: Bảng tác vụ"></a> |
|
|
72
75
|
| **Bộ nhớ dự án** | <a id="feature-projectmemory"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Mỗi thư mục dự án có bộ nhớ riêng, các cuộc trò chuyện sau này của dự án đó sẽ đọc, giống như DS Bot giữ một bộ nhớ cho mỗi Bot. Sau mỗi lượt kết thúc, một lần gọi mô hình của cuộc trò chuyện đọc các tin nhắn mới (không đọc tin nhắn đã hoàn tác), lưu sở thích, quyết định và dữ kiện lâu dài của bạn thành ghi chú ngắn, đồng thời sửa hoặc xóa ghi chú cũ. Tác tử cũng có thể tự lưu, xóa và tìm ghi chú (`memory_remember`, `memory_forget`, `memory_recall`). Ghi chú cũng có thể là ghi chú chung: mọi dự án đều đọc. Cuộc trò chuyện mới nhận các ghi chú trong system prompt; ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo. Các tệp là Markdown trong thư mục home của dsh (`storages/dsh-composer-plus/memory/`), không bao giờ nằm trong thư mục dự án. **Mở bộ nhớ** ở cùng hàng hiển thị mọi ghi chú đã lưu, nhóm theo dự án (và bộ nhớ chung), có bộ lọc. Viết bằng lời của bạn điều cần thay đổi (ví dụ "tôi đã chuyển từ yarn sang pnpm"), rồi bấm **Xem trước thay đổi**: mô hình mặc định của dsh đề xuất các thay đổi, và chỉ **Áp dụng** mới lưu chúng. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ảnh chụp màn hình: Bộ nhớ dự án"></a> |
|
|
73
76
|
| **Cho phép trong cuộc trò chuyện này** | <a id="feature-allowforchat"></a>Khi Đánh giá tự động hỏi bạn, thẻ phê duyệt có thêm nút **Cho phép trong cuộc trò chuyện này**: từ đó trở đi, cùng công cụ đó trong cùng cuộc trò chuyện được cho phép, với mọi đối số, cho đến khi hết giới hạn thời gian (mặc định 1 giờ; chọn trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**). Sau đó, agent sẽ hỏi lại. Một nhãn nhỏ ở phần đầu liệt kê các quyền đã cấp kèm thời điểm kết thúc và cho phép thu hồi. Quyền vẫn còn sau khi khởi động lại. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ảnh chụp màn hình: Cho phép trong cuộc trò chuyện này"></a> |
|
|
74
77
|
| **Trạng thái dự án** | <a id="feature-projectstatus"></a>Dòng dự án trên thanh bên hiện cùng dấu đang chạy / đang chờ / xong như các cuộc trò chuyện của nó. Vì vậy, dự án đã thu gọn vẫn cho bạn biết có cuộc trò chuyện bên trong đang làm việc hoặc cần bạn. Cuộc trò chuyện đang chờ bạn được hiện trước, sau đó là cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh, kể cả khi một cuộc trò chuyện khác vẫn đang chạy), rồi đến dấu đang chạy. Di chuột lên để xem chi tiết. Trong **Cây không gian làm việc**, dòng của thư mục cha cũng hiện các cuộc trò chuyện của từng dự án bên trong (ví dụ mỗi thư mục nhánh trong `.worktrees/`), kể cả khi thư mục đã thu gọn. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Trạng thái dự án"></a> |
|
|
@@ -166,7 +169,9 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
166
169
|
- **Kiểm tra mục tiêu:** chỉ chạy khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động (hoặc khi bạn nhấp **Chạy ngay**). Phần Host chạy lệnh kiểm thử trong thư mục của cuộc trò chuyện theo chế độ sandbox của cuộc trò chuyện (giống công cụ `bash` của chính dsh: cùng chính sách truy cập tệp; khi sandbox đó không khởi động được, bài kiểm thử không chạy và bước kiểm tra thất bại). Để tìm lệnh, phần Host chỉ đọc `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` và `pytest.ini`, dưới dạng tệp thông thường bên trong thư mục (không có symlink trỏ ra ngoài thư mục, không có FIFO). Sau đó phần Host gửi mục tiêu, cuộc trò chuyện kể từ khi mục tiêu bắt đầu (tin nhắn của bạn, câu trả lời của tác tử, các lệnh gọi công cụ cắt còn 1.000 ký tự và 2.000 ký tự cuối của mỗi kết quả công cụ; không có phần suy luận, không có bước đã bị hoàn tác; tối đa khoảng 60.000 ký tự, phần mới nhất), `git status --short` và phần cuối đầu ra kiểm thử đến mô hình đã chọn trong **Kiểm tra mục tiêu** (mặc định là mô hình của chính cuộc trò chuyện), dưới dạng một yêu cầu duy nhất không có công cụ. Đầu ra công cụ có thể chứa những gì tác tử đã đọc, nên yêu cầu này có thể chứa một phần tệp của bạn, giống như chính cuộc trò chuyện. Không có gì được ghi vào cuộc trò chuyện hay dự án. Lệnh kiểm thử của bạn, các giới hạn, kết quả gần nhất (kèm phần cuối đầu ra) và mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (tệp chỉ chủ sở hữu truy cập được, 500 cuộc trò chuyện mới nhất).
|
|
167
170
|
- **Tiếp tục trong cuộc trò chuyện mới:** không có gì chạy cho đến khi bạn nhấp. Sau đó phần Host gửi cuộc trò chuyện (như Kiểm tra mục tiêu đọc: không có phần suy luận, không có bước đã bị hoàn tác) đến mô hình của chính cuộc trò chuyện và hiện ghi chú bàn giao; chỉ **Bắt đầu cuộc trò chuyện mới** mới tạo cuộc trò chuyện mới. Không có gì được ghi vào dự án.
|
|
168
171
|
- **Phân tích ngữ cảnh:** phần Host chỉ đọc nhật ký cuộc trò chuyện; không gọi mô hình, không đọc tệp dự án.
|
|
172
|
+
- **Bảng tác vụ:** bảng (tiêu đề, mô tả, nhãn và bình luận của các tác vụ, đường dẫn thư mục dự án và id ngắn của chúng) nằm trong `$DSH_HOME/storages/dsh-composer-plus/board.json` (tệp chỉ chủ sở hữu truy cập được); công tắc nằm trong `board-switch.json` bên cạnh. Không có gì rời khỏi máy của bạn và không có gì được ghi vào thư mục dự án. Các công cụ bảng đưa cho tác tử những gì bạn viết trên bảng, nên văn bản của một tác vụ đến mô hình của cuộc trò chuyện khi tác tử đọc tác vụ đó. Tệp bảng bị hỏng được giữ lại dưới tên `board.json.broken-<time>` và bảng bắt đầu trống.
|
|
169
173
|
- **Tệp được bảo vệ:** danh sách và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc đường dẫn của mỗi lệnh gọi công cụ tệp (và đường dẫn thật của nó), không bao giờ đọc tệp.
|
|
174
|
+
- **Lệnh bị chặn:** các quy tắc và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc văn bản lệnh của mỗi lệnh gọi `bash` và `pwsh`; nó không chạy gì và không gửi gì.
|
|
170
175
|
- **Bộ nhớ dự án:** tắt cho đến khi bạn bật. Khi bật, sau mỗi lượt kết thúc của một cuộc trò chuyện cấp cao nhất, phần Host gửi các tin nhắn mới của chính cuộc trò chuyện đó kể từ lần xem xét trước (tin nhắn của bạn và câu trả lời dạng văn bản của tác tử; không có đầu ra công cụ, suy luận, ngữ cảnh ẩn hay tin nhắn đã hoàn tác; trong cuộc trò chuyện rẽ nhánh, bản sao từ cuộc trò chuyện cha bị bỏ qua; tối đa khoảng 16.000 ký tự) và các ghi chú đã lưu tới mô hình của chính cuộc trò chuyện, trong một yêu cầu không có công cụ. Ghi chú là các tệp Markdown trong `$DSH_HOME/storages/dsh-composer-plus/memory/` (chỉ chủ sở hữu đọc/ghi): `projects/<id>/` cho mỗi thư mục dự án (`<id>` là mã băm của đường dẫn thật của thư mục; `project.json` ghi tên thư mục), `global/`, `journal.jsonl` (mỗi thay đổi kèm dòng trước và sau) và `reviewed.json` (đã đọc mỗi cuộc trò chuyện đến đâu). Không có gì được ghi vào thư mục dự án. Ghi chú trông giống khóa, token, mật khẩu hoặc số giấy tờ tùy thân bị từ chối. Ghi chú của một dự án đi vào system prompt của mỗi cuộc trò chuyện mới trong thư mục đó, nên chúng tới mô hình cùng mọi yêu cầu của cuộc trò chuyện đó. Công tắc nằm trong `memory.json` ở cùng chỗ. **Mở bộ nhớ** không gửi gì cho đến khi bạn bấm **Xem trước thay đổi**; khi đó nó gửi các ghi chú đang hiển thị và văn bản của bạn tới mô hình mặc định của dsh, trong một yêu cầu không có công cụ. Các thay đổi chỉ được ghi khi **Áp dụng**, với `editor` trong nhật ký. Tether đọc và thay đổi ghi chú qua cùng một tuyến.
|
|
171
176
|
- **Sao lưu:** không có gì rời khỏi máy của bạn. Tệp lưu trữ được ghi vào `~/Desktop/dsh-backups` (tệp chỉ chủ sở hữu truy cập được). Thông tin bí mật không có trong tệp lưu trữ: các tệp thông tin xác thực (`.credentials.yaml`, `.env`), tệp khóa (`.pem`, `.key`, `.p12`, `.pfx`) và giá trị của các cài đặt token, secret, password và khóa API trong các tệp yml được che; bản thật của chúng nằm trong `composer-plus-vault/<archive>/` ở cùng thư mục (chỉ chủ sở hữu truy cập được), chỉ trên máy tính này. **Cho máy tính khác** không sao chép vault: hãy nhập lại các thông tin bí mật đó ở máy kia. Nhật ký trò chuyện, cài đặt và phần còn lại của thư mục home của dsh nằm nguyên trong tệp lưu trữ: hãy giữ thư mục này riêng tư, như chính `$DSH_HOME`. Quá trình sao lưu đọc tệp bằng `O_NOFOLLOW | O_NONBLOCK`; symlink được lưu dưới dạng liên kết (không bao giờ đi theo), còn FIFO hoặc thiết bị bị bỏ qua. Công tắc và cài đặt của sao lưu tự động nằm trong `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, công tắc của bảng điều khiển cứu hộ nằm trong `rescue-console.json`, và trong lúc dsh chạy, `running/host-<pid>.json` cho biết từng tiến trình dsh (bảng điều khiển cứu hộ đọc các tệp này để từ chối khôi phục).
|
|
172
177
|
- **Bảng điều khiển cứu hộ:** một menu trong terminal; nó không mở cổng mạng nào. Khi khôi phục, nó chỉ ghi vào một thư mục mới bên cạnh thư mục home của dsh (tệp được ghi với `O_EXCL | O_NOFOLLOW`, symlink được tạo sau cùng và không bao giờ đi theo) và từ chối tệp lưu trữ có tên không an toàn (`..`, đường dẫn tuyệt đối), thiết bị hoặc FIFO, nhiều hơn một thư mục cấp cao nhất hoặc một mục nằm dưới liên kết.
|
|
@@ -189,7 +194,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
189
194
|
- **Dòng cuộc trò chuyện không có nhãn branch:** cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
|
|
190
195
|
- **Kiểm tra mục tiêu báo bài kiểm thử thoát với mã 127 hoặc "not found":** dsh khởi động từ Finder hoặc Dock có thể có PATH ngắn hơn terminal của bạn, nên không tìm thấy `npm`, `pnpm` hoặc `cargo`. Hãy khởi động dsh từ terminal, hoặc đặt lệnh kiểm thử của riêng bạn với đường dẫn đầy đủ trong **Kiểm tra mục tiêu** → **Sửa**. **Chạy ngay** hiện kết quả ngay lập tức.
|
|
191
196
|
- **Mục tiêu không đóng và tác tử tiếp tục làm việc:** **Kiểm tra mục tiêu** đã tìm thấy một bài kiểm thử thất bại hoặc phần việc còn thiếu; dòng bên dưới mục tiêu cho biết lý do (di chuột lên kết quả để xem chi tiết). Hãy sửa nguyên nhân hoặc lệnh kiểm thử, hoặc tự hoàn tất mục tiêu bằng `/goal` hoặc thanh mục tiêu (việc này không được kiểm tra).
|
|
192
|
-
- **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.
|
|
197
|
+
- **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.18.0`), xem ghi chú cài đặt ở trên.
|
|
193
198
|
- **Sao lưu ngay báo "Một thao tác sao lưu khác đang chạy":** một thao tác đang chạy trong cửa sổ dsh khác hoặc trong bảng điều khiển cứu hộ (chúng dùng chung tệp khóa `.composer-plus.lock` trong thư mục sao lưu). Hãy chờ thao tác đó xong. Nếu không có thao tác nào đang chạy, khóa của tiến trình đã đóng sẽ được tiếp quản ở lần nhấp tiếp theo.
|
|
194
199
|
- **Bảng điều khiển cứu hộ báo "dsh is running":** trước tiên hãy thoát dsh. Nếu dsh thật sự đã đóng, tệp được nêu trong thông báo là phần còn sót lại sau một sự cố: hãy xóa tệp đó rồi thử lại.
|
|
195
200
|
- **Sau khi khôi phục, dsh không khởi động hoặc thiếu một plugin:** cần cài lại các gói plugin của profile. Bảng điều khiển cứu hộ đề nghị việc này sau khi khôi phục; hoặc chạy `pnpm install` trong từng thư mục dưới `$DSH_HOME/profiles/` mà nó liệt kê. Các thông tin bí mật không có trong vault (máy tính khác) phải được nhập lại: bảng điều khiển liệt kê chúng.
|
|
@@ -239,8 +244,11 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
239
244
|
- **Cải thiện prompt** chỉ thấy bản tóm tắt ngắn về dự án, các đường dẫn đã thay đổi và các đường dẫn có tên khớp với từ ngữ của bạn: không thấy chính mã nguồn. Vì vậy tính năng có thể bỏ sót đúng tệp cần dùng, và chỉ nêu những đường dẫn được cung cấp. Hãy đọc văn bản mới trước khi gửi. Tính năng không chạy với lệnh gạch chéo khác `/goal <mục tiêu>`, với từ điều khiển của `/goal` (`clear`, `pause`, `resume`) hoặc tin nhắn có nhãn tệp hoặc nhãn ký hiệu (văn bản mới là văn bản thuần, nên sẽ mất nhãn), và một tin nhắn có tối đa 8.000 ký tự. Với một mục tiêu `/goal`, tính năng chỉ viết điều kiện từ bản nháp và ngữ cảnh; một điều kiện quá chặt có thể tốn thêm vòng mục tiêu, nên hãy đọc điều kiện trước khi gửi. Hình ảnh vẫn được đính kèm: chỉ văn bản thay đổi. Mỗi lần nhấp tốn một lần gọi mô hình; một mô hình mạnh có thể mất một phút (`Esc` để hủy).
|
|
240
245
|
- **Kiểm tra mục tiêu** chỉ kiểm tra lần hoàn tất mà tác tử thực hiện trong một vòng mục tiêu tự động: lần hoàn tất mà bạn yêu cầu trong cuộc trò chuyện, `/goal` và thanh mục tiêu không được kiểm tra. Tác tử có thể tự thay đổi các bài kiểm thử hoặc các tệp của lệnh kiểm thử; bộ xác minh đọc cuộc trò chuyện và có thể thấy điều đó, nhưng có thể sai theo cả hai hướng (một kết quả "chưa xong" sai tốn thêm một vòng; một kết quả "đã xong" sai đóng mục tiêu). Bộ xác minh thấy cuộc trò chuyện và `git status`, không thấy chính mã nguồn. Một lần chạy kiểm thử chỉ được dùng lại khi bước mới nhất có thể thay đổi tệp của tác tử là lần chạy `bash` đạt của chính tác tử với đúng cùng một lệnh trong cùng thư mục; lệnh có pipe (`| tail`) hoặc `&&` không được dùng lại. Ngân sách được đo khi một lượt kết thúc, nên một lượt có thể vượt quá ngân sách. Ngân sách token cũng tính các lần gọi của các cuộc trò chuyện subagent của cuộc trò chuyện (đọc từ nhật ký đã lưu của chúng ở cuối mỗi lượt, nên một cuộc trò chuyện có nhiều subagent cần lâu hơn một chút để kiểm tra). Bảng bằng chứng đến từ việc bộ xác minh tự đọc cuộc trò chuyện: một phần mà bộ xác minh gọi là đã xác minh vẫn cần bạn tự xem lại khi phần đó quan trọng. `update_goal` chờ trong khi bước kiểm tra chạy (bài kiểm thử tối đa 15 phút, bộ xác minh tối đa 3 phút). Cuộc trò chuyện tách nhánh nhận một id cuộc trò chuyện mới, nên bắt đầu mà không có lệnh kiểm thử và các giới hạn riêng của cuộc trò chuyện gốc. Mỗi lần hoàn tất đi đến bộ xác minh tốn một lần gọi mô hình.
|
|
241
246
|
- **Tệp được bảo vệ** là rào chắn bảo vệ, không phải sandbox. Tính năng bao gồm các công cụ tệp của chính dsh (`read`, `read_image`, `grep` trên một tệp, `write`, `edit`, `str_replace_editor`). Một lệnh shell (`cat .env`), một script mà tác tử viết, shell của một subagent, một công cụ MCP, một danh sách `glob` và một lệnh `grep` trên cả thư mục vẫn có thể truy cập tệp được bảo vệ. Để có giới hạn thật, hãy dùng các chế độ sandbox của dsh hoặc giữ bí mật bên ngoài thư mục dự án. Mẫu hiểu `*`, `**` và `?`, không hiểu `{a,b}` hoặc `[ab]`, và không phân biệt chữ hoa/thường.
|
|
247
|
+
- **Lệnh bị chặn** là rào chắn bảo vệ, không phải sandbox. Tính năng chỉ đọc văn bản lệnh của các công cụ `bash` và `pwsh` của dsh. Một biến hoặc alias mang tên lệnh (`CMD=npm; $CMD publish`), một hàm shell, một tệp script mà tác tử viết, một chương trình khác (`python -c`, `node -e`, `make`), một công cụ MCP và terminal của chính bạn vẫn có thể chạy lệnh đó. Một quy tắc có thể khớp nhiều hơn bạn muốn: bất kỳ từ nào trong lệnh cũng có thể là tên lệnh (`echo npm publish` khớp với `npm publish`), và các từ khác có thể nằm giữa các từ của quy tắc (`git push --force` cũng khớp với `git push origin main --force`). Hãy làm quy tắc dài hơn khi nó khớp quá nhiều. **hỏi trước** cần một cuộc trò chuyện có thể hỏi: trong cuộc trò chuyện có chính sách phê duyệt là never (ví dụ một subagent được ủy quyền), dsh không thể hiện thẻ, nên lệnh gọi bị từ chối kèm lý do. Thẻ phê duyệt hiện lý do bằng tiếng Anh. **Cho phép trong cuộc trò chuyện này** không trả lời thẻ **hỏi trước**.
|
|
242
248
|
- **Tiếp tục trong cuộc trò chuyện mới** gửi cuộc trò chuyện (tin nhắn, lệnh gọi công cụ và phần cuối của mỗi kết quả công cụ, tối đa khoảng 60.000 ký tự, phần mới nhất) đến mô hình của chính cuộc trò chuyện. Ghi chú bàn giao có thể bỏ sót một quyết định hoặc một tệp: hãy đọc ghi chú trước khi bắt đầu. Cuộc trò chuyện mới chỉ biết ghi chú và cuộc trò chuyện được liên kết (dsh đính kèm cuộc trò chuyện cũ làm ngữ cảnh chỉ đọc); ngữ cảnh mô hình của nó bắt đầu nhỏ, cuộc trò chuyện cũ vẫn giữ nguyên. Mỗi cuộc trò chuyện chỉ có một lần viết ghi chú hoặc bắt đầu tại một thời điểm.
|
|
243
249
|
- **Phân tích ngữ cảnh** hiện số ước tính theo quy tắc của chính dsh (khoảng 4 ký tự cho mỗi token), cùng quy tắc với vòng ngữ cảnh của dsh; số đếm của chính mô hình có thể khác. Định nghĩa công cụ là định nghĩa của yêu cầu mới nhất. Tính năng hiện ngữ cảnh như nhật ký cuộc trò chuyện ghi lại; một lượt đang chạy xuất hiện sau bước tiếp theo của lượt đó.
|
|
250
|
+
- **Các bước đã lên kế hoạch** chỉ tiết kiệm token khi mô hình thực sự lên kế hoạch: khi đang bật, mỗi yêu cầu đều mang công cụ `plan_next_steps` và một chỉ dẫn ngắn (khoảng 500 token), kể cả trong những cuộc trò chuyện mà mô hình không bao giờ lên kế hoạch. Một điều kiện chỉ chứng minh đúng điều nó nêu (ví dụ: mã thoát của bản dựng là 0), không chứng minh công việc là đúng. `ok` đọc các dấu kết quả riêng của dsh (`[exit code: N]`, hết thời gian, sandbox từ chối); một lệnh thất bại mà không có mã thoát khác 0 vẫn được tính là đạt. Các bước chạy lần lượt từng bước; hai bước cùng sẵn sàng sẽ được trả lại cho mô hình. Tin nhắn của bước được lưu dưới dạng tin nhắn trợ lý của mô hình trong cuộc trò chuyện (dsh không có dấu cho tin nhắn do plugin viết), nên nội dung của nó ghi rằng Composer Plus đã chạy bước đó. Không có trong Tether.
|
|
251
|
+
- **Bảng tác vụ** chỉ biết các dự án của dsh: cuộc trò chuyện nằm ngoài dự án hiện **Tất cả dự án**, và thư mục branch riêng của từng cuộc trò chuyện (`<project>/.worktrees/<name>`) được tính là thuộc dự án của nó. Id dự án (`acme#12`) lấy từ tên thư mục và giữ nguyên khi bạn đổi tên dự án trong dsh. Quy tắc "giữ bảng luôn cập nhật" chỉ được đưa vào cuộc trò chuyện khi dự án của nó có tác vụ đang mở; cuộc trò chuyện đã nhận quy tắc thì giữ lại. Tác tử được dặn để **Xong**, **Tồn đọng** và các tác vụ thủ công lại cho bạn, nhưng công cụ không từ chối: tác tử vẫn có thể chuyển một thẻ như vậy. Khi tính năng bật, các công cụ bảng có trong danh sách công cụ của mọi cuộc trò chuyện (khoảng 1.000 token mỗi yêu cầu); hãy tắt tính năng nếu bạn không dùng bảng. Trang đọc bảng mỗi 2 giây khi đang hiện; thay đổi của tác tử hiện trong khoảng thời gian đó. Văn bản bạn sửa trong lúc tác tử thay đổi cùng trường sẽ không được lưu: khung chi tiết hiện văn bản mới và lý do. Không có hình ảnh, không đồng bộ git giữa các máy và không chia sẻ qua mạng (Kanzo có các tính năng này). Ý tưởng và giao diện lấy từ [Kanzo](https://github.com/emanuele-em/kanzo) của emanuele-em (AGPL-3.0); Composer Plus không dùng mã của nó.
|
|
244
252
|
- **Ưu tiên tin nhắn gửi sau khi Dừng** chỉ hoạt động sau khi bạn dừng cuộc trò chuyện (hoặc sau một lượt bị lỗi, hoặc khi bạn mở một cuộc trò chuyện vẫn còn hàng đợi): tin nhắn bạn gửi khi một lượt đang chạy vẫn chờ ở cuối hàng đợi. Nó chỉ vượt lên trước các tin nhắn của chính bạn trong hàng đợi: nếu trong hàng đợi có một vòng mục tiêu hoặc một câu trả lời cho câu hỏi đang chờ, thứ tự của dsh được giữ nguyên. Nó đọc một phần của dsh không phải là API công khai (lượt đã dừng có còn đang kết thúc không); nếu một bản cập nhật dsh đổi tên phần đó, tin nhắn chỉ được đưa lên đầu sau khi lượt đó kết thúc. Cuộc trò chuyện của subagent giữ thứ tự của dsh.
|
|
245
253
|
- **Bộ nhớ dự án** thuộc về thư mục đầu tiên của cuộc trò chuyện (thư mục dự án của dsh): cuộc trò chuyện đổi thư mục bằng `cd` vẫn giữ bộ nhớ của dự án đầu tiên, và cùng thư mục được mở qua một đường dẫn khác tới cùng các tệp sẽ dùng chung bộ nhớ. Cuộc trò chuyện cố định phần bộ nhớ khi bắt đầu, nên ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo (`memory_recall` tìm thấy ngay). Việc xem xét chỉ giữ những gì mô hình quyết định giữ: có thể bỏ sót một dữ kiện hoặc giữ một dữ kiện sai; hãy kiểm tra trong **Mở bộ nhớ** và sửa ở đó, hoặc sửa các tệp bằng tay khi dsh đã đóng. **Mở bộ nhớ** gửi ghi chú của dự án được chọn và ghi chú chung (mọi dự án khi bạn chọn Tất cả ghi chú; tối đa khoảng 60.000 ký tự, phần còn lại chỉ được đếm và không thể thay đổi trong yêu cầu đó) cùng văn bản của bạn tới mô hình mặc định của dsh, không phải mô hình của cuộc trò chuyện. Bản xem trước được giữ trên Mac trong 30 phút và cho đến khi dsh khởi động lại; nếu việc xem xét hoặc tác tử thay đổi ghi chú trong lúc đó, **Áp dụng** sẽ từ chối và bạn xem trước lại. **Áp dụng** lưu tất cả thay đổi của một bản xem trước hoặc không lưu gì: nếu một thay đổi không lưu được (ví dụ MEMORY.md đã đầy), ghi chú giữ nguyên và lý do được hiển thị. Mỗi lượt kết thúc có tin nhắn của bạn tốn một lần gọi mô hình; lần gọi thất bại sẽ đọc lại cùng các tin nhắn sau lượt tiếp theo. Cuộc trò chuyện của tác tử con không được xem xét. Ý tưởng và định dạng tệp lấy từ [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus không dùng mã của nó và không bao giờ đọc hay ghi bộ nhớ riêng của DS Bot.
|
|
246
254
|
- **Sao lưu** dùng một thư mục cố định duy nhất, `~/Desktop/dsh-backups` (thư mục mặc định của dsh-backup, nên các tệp lưu trữ của nó vẫn dùng được); không có cài đặt cho thư mục khác. Một tệp lưu trữ lớn gần bằng thư mục home của dsh khi không tính `cache/` và `dsh-runtimes/` (đo thực tế: 1,6 GB tệp tạo ra tệp lưu trữ 830 MB trong khoảng 30 giây trên Apple Silicon; dsh vẫn phản hồi bình thường). Một tệp thay đổi trong lúc được đọc sẽ được lưu ở trạng thái lúc quá trình sao lưu mở nó, nên nhật ký của một cuộc trò chuyện đang mở có thể kết thúc bằng một bản ghi bị cắt, và dsh sửa bản ghi đó ở lần ghi tiếp theo. Việc che tìm thông tin bí mật trong tệp yml theo tên khóa trên một dòng (`token:`, `apiKey:`, …); thông tin bí mật trong flow map (`{token: x}`), trong một danh sách dưới khóa như vậy, trong tệp JSON (ví dụ `apiKey` của một máy chủ MCP trong tệp `.json`) hoặc dưới tên khác vẫn nằm trong tệp lưu trữ. Các tệp lưu trữ theo loại của dsh-backup (`dsh-t-…`) không được liệt kê. **Cho máy tính khác** sao chép tệp lưu trữ (trên APFS là bản clone: không tốn thêm dung lượng); vault không đi kèm. **Sao lưu ngay** không xóa bản sao lưu nào. Một lần sao lưu tự động giữ các bản sao lưu mới nhất do Composer Plus tạo (cài đặt **Giữ** của **Tự động sao lưu**) và xóa các bản cũ hơn do nó tạo; các snapshot trước khi nâng cấp được đếm riêng (giữ lại 2 bản mới nhất). Các tệp lưu trữ của dsh-backup không bao giờ bị xóa: hãy xóa chúng bằng **Xóa**. Khi dsh-backup vẫn còn được cài, nó tính các tệp lưu trữ của Composer Plus vào số bản giữ lại của riêng nó và có thể xóa chúng.
|
|
@@ -277,6 +285,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
277
285
|
|
|
278
286
|
**Tác tử có thể nhớ sở thích của tôi giữa các cuộc trò chuyện, như bộ nhớ của DS Bot không?** Có, với **Bộ nhớ dự án** (mặc định tắt): hãy bật trong **Cài đặt → Composer Plus**. Sau mỗi lượt, sở thích và quyết định lâu dài của bạn được lưu thành ghi chú ngắn cho dự án của cuộc trò chuyện, và mọi cuộc trò chuyện mới trong dự án đó đều đọc chúng. Hãy bảo tác tử nhớ một điều, nó sẽ lưu ngay. Để xem hoặc thay đổi ghi chú, bấm **Mở bộ nhớ** ở cùng hàng và viết điều cần thay đổi.
|
|
279
287
|
|
|
288
|
+
**Tôi và các tác tử có thể dùng chung một bảng tác vụ như Kanzo không?** Có, với **Bảng tác vụ** (mặc định bật): mở nó ở thanh bên trái và thêm tác vụ bằng **Tác vụ mới**. Trong một cuộc trò chuyện, hãy bảo tác tử "lấy tác vụ tiếp theo từ bảng": tác tử chuyển thẻ sang **Đang làm**, bình luận về việc đã làm rồi chuyển thẻ sang **Đang duyệt**. Đánh dấu một tác vụ là **Thủ công** để giữ nó cho chính bạn.
|
|
289
|
+
|
|
280
290
|
**dsh có thể sao lưu các cuộc trò chuyện và cài đặt của tôi như dsh-backup không?** Có: **Cài đặt → Composer Plus → Sao lưu → Sao lưu ngay**. Nó ghi cùng định dạng tệp lưu trữ vào cùng thư mục (`~/Desktop/dsh-backups`), nên các tệp lưu trữ của dsh-backup cũng hiện ra và khôi phục được, và bạn có thể gỡ dsh-backup. Bật **Tự động sao lưu** để sao lưu theo lịch.
|
|
281
291
|
|
|
282
292
|
**dsh không khởi động được nữa. Làm sao để khôi phục một bản sao lưu?** Mở thư mục sao lưu (`~/Desktop/dsh-backups`) và nhấp đúp vào `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Chọn `3) Restore a backup`, chọn một bản sao lưu rồi gõ `RESTORE`. Cách này chạy được mà không cần dsh.
|
|
@@ -301,6 +311,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
301
311
|
|
|
302
312
|
**Làm sao để chỉ xem các tệp mà một cuộc trò chuyện đã thay đổi?** Thanh bên phải → **Thay đổi** → **Cuộc trò chuyện này**. Nhấp **␣** để ẩn các thay đổi chỉ có khoảng trắng.
|
|
303
313
|
|
|
314
|
+
**Làm sao để ngăn tác tử chạy `npm publish` hoặc `git push --force`?** **Cài đặt → Composer Plus → Lệnh bị chặn**: nhập `npm publish`, chọn **chặn** hoặc **hỏi trước**, rồi nhấp **Thêm**. **chặn** từ chối lệnh và tác tử hỏi bạn; **hỏi trước** hiện thẻ phê duyệt mỗi lần. Tệp được bảo vệ áp dụng cho các công cụ tệp của tác tử; Lệnh bị chặn áp dụng cho các lệnh shell của tác tử.
|
|
315
|
+
|
|
304
316
|
**Làm sao để Đánh giá tự động thôi hỏi về cùng một công cụ trong một cuộc trò chuyện?** Nhấp **Cho phép trong cuộc trò chuyện này** trên thẻ phê duyệt. Quyền này chỉ áp dụng cho đúng công cụ đó trong cuộc trò chuyện đó, mặc định trong 1 giờ; thu hồi quyền từ nhãn ở phần đầu. Đổi thời gian trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**.
|
|
305
317
|
|
|
306
318
|
**Tôi bị mất iPhone. Làm sao để chặn nó truy cập máy Mac của tôi?** Nhấp **Kết nối di động** ở góc dưới bên trái thanh bên, rồi nhấp **Remove** bên cạnh iPhone đó. Khóa của iPhone đó ngừng hoạt động ngay; nó chỉ có thể kết nối lại bằng một lần ghép nối mới mà bạn phê duyệt trên máy Mac.
|
|
@@ -329,6 +341,8 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
329
341
|
|
|
330
342
|
**Tôi có thể gửi ảnh từ iPhone không?** Có. Trong một cuộc trò chuyện Tether, chạm vào **+** bên cạnh ô tin nhắn → Camera, Photos (tối đa 4) hoặc Paste image. Ảnh được gửi tới cuộc trò chuyện trên Mac dưới dạng tệp đính kèm của tin nhắn, nên mô hình nhìn thấy chúng.
|
|
331
343
|
|
|
344
|
+
**dsh có thể chạy lệnh tiếp theo mà không hỏi lại mô hình không?** Có, với **Các bước đã lên kế hoạch** (mặc định tắt): hãy bật trong Cài đặt → Composer Plus. Khi đó mô hình có thể lên kế hoạch cho các lệnh tiếp theo kèm điều kiện, ví dụ “chạy kiểm thử khi bản dựng thành công”, và Composer Plus chạy một bước mà không gọi lại mô hình khi kết quả đáp ứng điều kiện. Phê duyệt và sandbox vẫn giữ nguyên.
|
|
345
|
+
|
|
332
346
|
**Plugin có hoạt động với ứng dụng desktop không?** Có: Cài đặt → Plugin → **Thêm plugin** → `dsh-composer-plus`. Đã kiểm thử trên dsh 0.2.0-rc.2 (desktop và web) và 0.2.1-rc.2 (web).
|
|
333
347
|
|
|
334
348
|
## Phát triển
|
|
@@ -393,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
393
407
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
394
408
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
395
409
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
410
|
+
# Task board: the page, the agent tools (fake model), drag and drop, search, the switch
|
|
411
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
396
412
|
```
|
|
397
413
|
|
|
398
414
|
```sh
|