dsh-multi-repo
Verified@opfield/dsh-multi-repo · v0.3.1 · MIT · Web UI
Multi-root workspaces for DeepSeek Harness: attach other repositories to a workspace, writable under workspace-write, listed in the model context with their AGENTS.md, and editable from the composer or /roots
Install
dsh plugin add @opfield/dsh-multi-repo Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
Многокорневые воркспейсы для DeepSeek Harness
Плагин @opfield/dsh-multi-repo для DeepSeek Harness (DSH) добавляет многокорневые воркспейсы, как проекты из нескольких папок в приложении Codex. Открой сессию в одном репозитории как обычно и подключи к воркспейсу другие репозитории. Агент работает со всеми ними в одной сессии.
- Общий список на воркспейс. Список корней хранится в хранилище DSH (
~/.dsh/storages/multi_repo.json) по пути воркспейса, поэтому его видят все сессии воркспейса. В репозитории ничего не пишется, отдельная папка воркспейса и файл-манифест не нужны. - Запись как в основной корень. В режиме
workspace-writeфайловые инструменты и shell-команды могут писать в подключённые корни. - В контексте модели. Агент видит все корни, правила работы с ними и
AGENTS.md/CLAUDE.mdподключённых корней. - Список меняет только пользователь. У агента есть только инструмент чтения
workspace_roots, поэтому он не может сам расширить себе доступ на запись.
Сборки не требует: это обычные JS-файлы.
Установка
- Plugins → Add plugin: введи
@opfield/dsh-multi-repo(илиgithub:opfield/dsh-plugins#path:/packages/multi-repo, чтобы поставить с GitHub), затем Enable now. - Перезапусти DSH: плагин расширяет файловую и shell-песочницу при старте хоста.
DSH пока не обновляет плагины сам: чтобы обновить, удали плагин и добавь новую версию.
Использование
- Кнопка под композером: значок папки рядом со счётчиком контекста. Показывает все корни с веткой и числом изменённых файлов. Папку можно подключить по пути или выбрать из соседних репозиториев (соседи воркспейса и
~/projects/*). Отключить корень —×. - Команда:
/roots— список корней./roots add ~/projects/web [--name web]— подключить папку./roots remove web— отключить. Файлы на диске не трогаются.
Корнем нельзя сделать домашнюю папку или её предков, сам /tmp, папку внутри основного корня или содержащую его, а также папку, пересекающуюся с другим подключённым корнем.
Где видны корни
- Сайдбар: группа воркспейса переименовывается в
api + web. Заменяется только название по умолчанию (имя папки) или созданное плагином; своё название остаётся. После отключения последнего корня возвращается имя папки. - Карточка сессии при наведении в сайдбаре: строка
Roots: api + web. - Заголовок сессии: чип
api + web, открывает панель корней. Скрыт, если дополнительных корней нет. - Композер: кнопка-папка со счётчиком
2 roots. Видна всегда, потому что корни подключаются здесь.
Что получает агент
Контекст: секция со списком корней, правилами работы и инструкциями подключённых корней (
AGENTS.md,CLAUDE.md, … в пределахinstructionMaxBytes; одинаковые файлы — один раз). Инструкции основного корня DSH загружает как обычно. Секция меняется только при изменении корней, прав записи или этих файлов, поэтому prompt cache сохраняется.Запись: в
workspace-writeподключённые корни доступны на запись как основной:- файловые инструменты (
write,edit); - shell-команды и терминалы — через bind mount в bwrap,
--rwв Landlock илиsubpathв Seatbelt.
read-onlyиdanger-full-accessработают как раньше.- файловые инструменты (
Инструмент
workspace_roots: ветка, ahead/behind относительно upstream, последний коммит и незакоммиченные изменения каждого корня.
Как работает запись
В политике песочницы DSH ровно один записываемый корень на сессию, и настройки для других нет. Плагин оборачивает два метода запущенного DSH:
checkedTargetфайловой песочницы: запись, запрещённая вworkspace-write, разрешается, если заново канонизированный путь лежит внутри подключённого корня;confineпровайдера песочницы: подключённые корни добавляются в набор записываемых путей раннера. Раннер определяется по программе (bwrap,landlock-run,sandbox-exec); командная строка любого другого раннера не меняется.
Обёртки снимаются при выгрузке плагина. Если обновление DSH переименует эти методы или песочница использует незнакомый раннер, плагин их не трогает, а в контексте агенту прямо сказано, какой вид записи (файловые инструменты или shell) не достаёт до подключённых корней. extendSandbox: false выключает расширение полностью.
Настройки
Запись multi-repo в cordis.patch.yml профиля. Значение неверного типа заменяется значением по умолчанию.
| Поле | По умолчанию | Что делает |
|---|---|---|
extendSandbox |
true |
Делать подключённые корни записываемыми в workspace-write |
instructionFiles |
AGENTS.md, AGENTS.override.md, CLAUDE.md, AGENTS.local.md, CLAUDE.local.md |
Имена файлов в корне каждого подключённого репозитория (без путей) |
instructionMaxBytes |
32768 |
Бюджет этих файлов в контексте модели |
gitTimeoutMs |
15000 |
Таймаут одной команды git |
maxChangedFiles |
50 |
Сколько изменённых файлов на корень показывает workspace_roots |
suggestionDirs |
['~/projects'] |
Папки, чьи Git-репозитории предлагает панель композера |
workspaceTitle |
true |
Переименовывать группу воркспейса в сайдбаре в основной + корень + ... |
Ограничения
- Сайдбар Files и карточка изменённых файлов за ход показывают только основной корень.
- ACL-раннер песочницы Windows не расширяется: на Windows в
workspace-writeshell-команды не могут писать в подключённые корни, файловые инструменты — могут. - git status запускается с выключенным
core.fsmonitor, чтобы конфиг подключённого репозитория не мог через него запустить программу.
Разработка
Из корня репозитория:
npm install
npm test
Лицензия
MIT