dsh-kaban-board
Verifieddsh-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 (сброс кэша клиента).
Использование
- Нажмите иконку «Канбан доска» на левой панели — откроется экран доски. Сверху — табы проектов: клик по табу открывает соответствующую доску; «+ Проект» создаёт новый проект, «Переименовать» и «Удалить» работают с активным проектом (удаление подтверждается и тянет за собой все карточки).
- Добавить колонку — кнопка «+ Добавить колонку» в шапке экрана.
- Переименовать колонку — клик по названию колонки (или «⋮» → «Переименовать»).
- Удалить колонку — «⋮» → «Удалить колонку» (подтверждается; вместе с карточками).
- Задать цвет колонки — при создании колонки (сразу после ввода названия)
или через «⋮» → «Цвет колонки» открывается всплывающее окно с вопросом
«Какой цвет будет у статуса карточек колонки „…"?» и палитрой готовых цветов;
рядом объясняется, на что влияет выбор. Выбранный цвет применяется к чипу
статуса карточек этой колонки и к цветному индикатору в её шапке; в меню
«Изменить статус» у каждой колонки рядом с названием тоже показывается её
цвет. Колонка без заданного цвета использует системный акцент. Цвет колонки
хранится в
board.json(полеcolor). - Добавить карточку — «+ Добавить карточку» внутри колонки. В диалоге два обязательных поля: «Название» и «Статус» (предзаполнен названием столбца).
- Перенести карточку — перетащите карточку в другую колонку (drag & drop).
Статус карточки меняется на название целевого столбца, а в лог файла
добавляется запись «статус изменён на …». Текущий статус дублируется и
в
.md-файл карточки: строкаСтатус: …под заголовком пишется при создании карточки и обновляется при каждом переносе. - Переставить колонки / карточки — потяните колонку за её область
(drag & drop) и отпустите на нужном месте в ряду колонок — колонки
поменяются местами. Аналогично карточку можно перетащить внутри своей
колонки, чтобы изменить её очередность. Порядок колонок и карточек
сохраняется в
board.json(поляorder). Изменить статус прямо из карточки — клик по чипу статуса на карточке доски (или по чипу статуса в шапке открытого окна карточки) открывает выпадающий список со всеми колонками; выбор переносит карточку в выбранный столбец и меняет статус (с записью в лог), то же самое, что и drag & drop. - Открыть/посмотреть карточку — клик по карточке открывает окно просмотра
разметки Markdown + раздел «Лог:». Кнопка «Открыть в Obsidian» открывает
.md-файл во внешнем Obsidian для правки (требует один раз добавить каталог хранилища как vault). Открытие выполняется на стороне host (xdg-open) по RPCopenObsidian { path }— без скрытых<iframe>в браузере (это исключает зависание вкладки, которое раньше случалось из-за pending-навигации при запуске схемыobsidian://). При открытии карточка заново читает файл, поэтому правки, сделанные в Obsidian (заголовок из первой строки# …, содержимое), сразу подхватываются. В окне просмотра размечается встроенным рендерером: заголовки, списки (включая чекбоксы-задачи- [ ]/- [x]), таблицы (| a | b |), ссылки, выделение, код и т.п. - «Открыть в Obsidian» помечает карточку как «изменена в Obsidian»: на ней
появляется точка
•, и она попадает в счётчик кнопки обновления сверху. - Подтянуть изменения (иконка
⟳на карточке) — перечитывает.mdтолько этой карточки: применяет заголовок (# …), статус (Статус: …) и имя файла с диска, очищает пометку. Тултип: «Подтянуть изменения». - Кнопка «⟳ Обновить» в шапке доски — перечитывает только те карточки, что отмечены как «изменены в Obsidian». Тултип: «Подтянуть изменения по n карточкам» (n — количество отмеченных).
- Перезагрузка страницы — при открытии доски автоматически перечитываются
все карточки из их
.md-файлов. - Если при любом обновлении файл карточки на диске пропал (карточку удалили), показывается алерт со списком отсутствующих карточек, и они удаляются с доски.
Все изменения сохраняются автоматически. Положение экрана (скролл доски и колонок) сохраняется между перерисовками (закрытие окна карточки, обновление), а при создании колонки или карточки доска автоматически подскролливает к новому элементу.
Доску удобно скроллить горизонтально: колесо с зажатым 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(keykaban-board); сверху рисует табы проектов, под ними — доску активного проекта; интерфейс рисуется через plain-DOM внутри React-оболочки (без React-порталов — проверенный подход dsh-skill-folder).
Проверка
npm run check # node --check всех lib/*.js
Разработка / раскатка
Следуйте скиллу module-rollout: самопроверка → изолированная сборка →
предпросмотр на свободном порту → одобрение → подготовка отката → накат.
Лицензия
MIT (см. LICENSE).