Skip to content

dsh-kaban-board

Verified

dsh-kaban-board · v0.1.0 · MIT · Web UI

Personal kanban board for DeepSeek Harness — a global «Канбан доска» panel button that opens a dedicated board screen in the center column with columns and cards (create / rename / delete / drag-drop) persisted to a local JSON file.

Install

dsh plugin add dsh-kaban-board

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

dsh-kaban-board

Личная канбан-доска задач для DeepSeek Harness (DSH).

Модуль добавляет в веб-интерфейс DSH:

  • глобальную кнопку-иконку «Канбан доска» на боковой панели;
  • по клику открывается отдельный экран в центральной области интерфейса;
  • на экране — доска с колонками и карточками: создание, переименование, удаление, перенос (drag & drop) карточек между колонками и перестановка колонок / карточек внутри колонки перетаскиванием;
  • положение экрана (скролл) запоминается при открытии/закрытии карточки и перерисовках, а при создании колонки или карточки доска подскролливает к только что созданному элементу;
  • удобный горизонтальный скролл доски: толстый (14px) скруглённый скроллбар, скролл Ctrl + колесо, а также pan «ладошкой» — если зажать ЛКМ на пустом месте доски (вне колонок) и двигать мышь, доска скроллится за курсором;
  • при выборе «Канбан доска» в боковой панели панель DSH автоматически сворачивается, чтобы доска заняла всю ширину центральной области;
  • данные сохраняются автоматически в каталог ~/.dsh/kaban-board/;
  • проекты — каждый проект это отдельная доска со своими столбцами и карточками; проекты отображаются сверху в виде табов, переключение таба открывает соответствующую доску; есть создание нового проекта, переименование и удаление активного проекта;
  • у каждой карточки есть Статус (по умолчанию — название столбца), а в конце .md-файла ведётся Лог: изменений (создание, смена статуса);
  • для каждой колонки можно задать цвет статуса — выбор оформлен как всплывающее окно с вопросом («Какой цвет будет у статуса карточек колонки …?») и палитрой готовых цветов; выбранный цвет раскрашивает чипы статуса карточек колонки;
  • карточка открывается в режиме просмотра разметки; правка — кнопкой «Открыть в Obsidian» (файл открывается во внешнем приложении Obsidian).

Доска личная (для текущего инстанса DSH), инструментов для агентов в этой версии нет — только интерфейс.


Требования

  • DSH 0.1.1-rc.2+ (протестировано на веб-профиле)
  • Node.js 22+
  • pnpm (для локальной установки через dsh plugin)

Установка

# из npm
dsh plugin --profile web add [email protected]
# либо из локальной копии репозитория
dsh plugin --profile web add /путь/к/dsh-kaban-board
dsh web

После перезапуска профиля на боковой панели появится иконка «Канбан доска». Если интерфейс не обновился — нажмите Ctrl+Shift+R (сброс кэша клиента).

Использование

  1. Нажмите иконку «Канбан доска» на левой панели — откроется экран доски. Сверху — табы проектов: клик по табу открывает соответствующую доску; «+ Проект» создаёт новый проект, «Переименовать» и «Удалить» работают с активным проектом (удаление подтверждается и тянет за собой все карточки).
  2. Добавить колонку — кнопка «+ Добавить колонку» в шапке экрана.
  3. Переименовать колонку — клик по названию колонки (или «⋮» → «Переименовать»).
  4. Удалить колонку — «⋮» → «Удалить колонку» (подтверждается; вместе с карточками).
  5. Задать цвет колонки — при создании колонки (сразу после ввода названия) или через «⋮» → «Цвет колонки» открывается всплывающее окно с вопросом «Какой цвет будет у статуса карточек колонки „…"?» и палитрой готовых цветов; рядом объясняется, на что влияет выбор. Выбранный цвет применяется к чипу статуса карточек этой колонки и к цветному индикатору в её шапке; в меню «Изменить статус» у каждой колонки рядом с названием тоже показывается её цвет. Колонка без заданного цвета использует системный акцент. Цвет колонки хранится в board.json (поле color).
  6. Добавить карточку — «+ Добавить карточку» внутри колонки. В диалоге два обязательных поля: «Название» и «Статус» (предзаполнен названием столбца).
  7. Перенести карточку — перетащите карточку в другую колонку (drag & drop). Статус карточки меняется на название целевого столбца, а в лог файла добавляется запись «статус изменён на …». Текущий статус дублируется и в .md-файл карточки: строка Статус: … под заголовком пишется при создании карточки и обновляется при каждом переносе.
  8. Переставить колонки / карточки — потяните колонку за её область (drag & drop) и отпустите на нужном месте в ряду колонок — колонки поменяются местами. Аналогично карточку можно перетащить внутри своей колонки, чтобы изменить её очередность. Порядок колонок и карточек сохраняется в board.json (поля order). Изменить статус прямо из карточки — клик по чипу статуса на карточке доски (или по чипу статуса в шапке открытого окна карточки) открывает выпадающий список со всеми колонками; выбор переносит карточку в выбранный столбец и меняет статус (с записью в лог), то же самое, что и drag & drop.
  9. Открыть/посмотреть карточку — клик по карточке открывает окно просмотра разметки Markdown + раздел «Лог:». Кнопка «Открыть в Obsidian» открывает .md-файл во внешнем Obsidian для правки (требует один раз добавить каталог хранилища как vault). Открытие выполняется на стороне host (xdg-open) по RPC openObsidian { path } — без скрытых <iframe> в браузере (это исключает зависание вкладки, которое раньше случалось из-за pending-навигации при запуске схемы obsidian://). При открытии карточка заново читает файл, поэтому правки, сделанные в Obsidian (заголовок из первой строки # …, содержимое), сразу подхватываются. В окне просмотра размечается встроенным рендерером: заголовки, списки (включая чекбоксы-задачи - [ ] / - [x]), таблицы (| a | b |), ссылки, выделение, код и т.п.
  10. «Открыть в Obsidian» помечает карточку как «изменена в Obsidian»: на ней появляется точка •, и она попадает в счётчик кнопки обновления сверху.
  11. Подтянуть изменения (иконка ⟳ на карточке) — перечитывает .md только этой карточки: применяет заголовок (# …), статус (Статус: …) и имя файла с диска, очищает пометку. Тултип: «Подтянуть изменения».
  12. Кнопка «⟳ Обновить» в шапке доски — перечитывает только те карточки, что отмечены как «изменены в Obsidian». Тултип: «Подтянуть изменения по n карточкам» (n — количество отмеченных).
  13. Перезагрузка страницы — при открытии доски автоматически перечитываются все карточки из их .md-файлов.
  14. Если при любом обновлении файл карточки на диске пропал (карточку удалили), показывается алерт со списком отсутствующих карточек, и они удаляются с доски.

Все изменения сохраняются автоматически. Положение экрана (скролл доски и колонок) сохраняется между перерисовками (закрытие окна карточки, обновление), а при создании колонки или карточки доска автоматически подскролливает к новому элементу.

Доску удобно скроллить горизонтально: колесо с зажатым Ctrl (или само горизонтальное колесо) двигает доску вбок; у доски — толстый скруглённый скроллбар; кроме того, если зажать ЛКМ на пустом месте доски (вне колонок и карточек) и двигать мышь, доска «тянется» за курсором (pan «ладошкой»).

Хранилище

По умолчанию данные хранятся в каталоге ~/.dsh/kaban-board/. Путь следует за DSH_HOME (изолированный профиль держит свою собственную доску). Переопределить можно через config.storePath в cordis.patch.yml.

Структура — по папке на проект (полноценное раздельное хранилище):

~/.dsh/kaban-board/
  index.json                    список проектов { version, projects:[...] }
  projects/<id>/board.json      разметка доски конкретного проекта
  projects/<id>/<card>.md       файл карточки конкретного проекта
  • index.json — список проектов (id, title, order, createdAt).

  • projects/<id>/board.json — разметка доски одного проекта (колонки и карточки со статусами):

    {
      "version": 1,
      "columns": [ { "id": "col-todo", "title": "Запланировано", "order": 0 } ],
      "cards":   [ { "id": "card-1", "columnId": "col-todo", "title": "Задача",
                     "status": "Запланировано", "order": 0, "file": "Задача.md",
                     "obsidianAt": "" } ]
    }
    
  • .md файл на карточку — при создании карточки файл получает имя по её названию (Задача.md), при совпадении имён добавляется суффикс (2), (3). Когда файл переименовывается вручную (например, в Obsidian), доска при первом открытии такой карточки пересчитывает имя файла и подтягивает новый заголовок из первой строки. Формат файла:

    # Заголовок
    
    Статус: Запланировано
    
    <содержимое задачи>
    
    ---
    
    ## Лог:
    
    - [2026-09-14 17:00:59] - статус изменён на В работе
    - [2026-09-14 17:00:52] - создан
    

    Самая новая запись лога — сверху. Дату/время пишет сам модуль.

    При актуализации карточки (иконка ⟳, кнопка «Обновить» сверху или перезагрузка страницы) файл — источник правды: заголовок подтягивается из первой строки # …, а статус — из строки Статус: … (правки статуса в Obsidian отражаются на доске). Поле obsidianAt в board.json (пустое или метка времени) хранит, открывалась ли карточка в Obsidian для редактирования: такие карточки помечаются точкой • и попадают в счётчик кнопки «Обновить» сверху. Пометка сбрасывается при первой актуализации или любой правке карточки на доске.

При первом открытии (индекса нет) создаётся проект по умолчанию «Основной проект» с колонками «Запланировано», «В работе», «Готово». Если до этого в корне лежала плоская раскладка (board.json и *.md сразу под ~/.dsh/kaban-board/ — формат до появления проектов), она мигрируется в этот проект по умолчанию, так что существующие столбцы/карточки сохраняются. Удалить единственный оставшийся проект нельзя.

Архитектура

  • Host (lib/index.js, lib/storage.js) — владеет каталогом данных (ProjectsStore поверх папки projects/, внутри неё — обычные BoardStore на каждый проект) и предоставляет веб-RPC-канал POST /kaban-board/{load, save,reset,createCard,setCardTitle,setCardContent,getCard,moveCard, deleteCard,markObsidian,refreshCards,listProjects,openProject,createProject, renameProject,deleteProject} через webServer (прямой prefix-роут, паттерн dsh-skill-folder). Карточные операции идут в активный проект (переключается через openProject).
  • Client (lib/client.js) — регистрирует кнопку-панель в слоте sidebar.panellist и экран в слоте main (key kaban-board); сверху рисует табы проектов, под ними — доску активного проекта; интерфейс рисуется через plain-DOM внутри React-оболочки (без React-порталов — проверенный подход dsh-skill-folder).

Проверка

npm run check   # node --check всех lib/*.js

Разработка / раскатка

Следуйте скиллу module-rollout: самопроверка → изолированная сборка → предпросмотр на свободном порту → одобрение → подготовка отката → накат.

Лицензия

MIT (см. LICENSE).