Skip to content

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

English

Плагин @opfield/dsh-multi-repo для DeepSeek Harness (DSH) добавляет многокорневые воркспейсы, как проекты из нескольких папок в приложении Codex. Открой сессию в одном репозитории как обычно и подключи к воркспейсу другие репозитории. Агент работает со всеми ними в одной сессии.

  • Общий список на воркспейс. Список корней хранится в хранилище DSH (~/.dsh/storages/multi_repo.json) по пути воркспейса, поэтому его видят все сессии воркспейса. В репозитории ничего не пишется, отдельная папка воркспейса и файл-манифест не нужны.
  • Запись как в основной корень. В режиме workspace-write файловые инструменты и shell-команды могут писать в подключённые корни.
  • В контексте модели. Агент видит все корни, правила работы с ними и AGENTS.md / CLAUDE.md подключённых корней.
  • Список меняет только пользователь. У агента есть только инструмент чтения workspace_roots, поэтому он не может сам расширить себе доступ на запись.

Сборки не требует: это обычные JS-файлы.

Установка

  1. Plugins → Add plugin: введи @opfield/dsh-multi-repo (или github:opfield/dsh-plugins#path:/packages/multi-repo, чтобы поставить с GitHub), затем Enable now.
  2. Перезапусти 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-write shell-команды не могут писать в подключённые корни, файловые инструменты — могут.
  • git status запускается с выключенным core.fsmonitor, чтобы конфиг подключённого репозитория не мог через него запустить программу.

Разработка

Из корня репозитория:

npm install
npm test

Лицензия

MIT