npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-kaban-board

v0.1.0

Published

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.

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).