dsh-canvas-tsx-sidebar
A dsh-better-sidebar tab that statically parses Qoder Canvas `*.canvas.tsx` files into structured pages in the DSH right sidebar (the source is never executed: no eval, no bundler, no sandbox iframe), with a file-viewer takeover for `.tsx` and a bundled Skill for authoring the format.
Install
dsh plugin --profile web add dsh-canvas-tsx-sidebar
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✗ |
| 2 list | — |
| 3 mount | — |
| 4 boot | — |
dsh: initialized profile web at /home/node/.dsh/profiles/webFour stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-canvas-tsx-sidebar
[简体中文](README.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Italiano](README.it.md) | [Русский](README.ru.md) | [Español](README.es.md)
Веб-плагин DSH (DeepSeek Harness) — плагин-потребитель dsh-better-sidebar.
Статически разбирает файлы *.canvas.tsx из Qoder Canvas в рабочей области в структурированные страницы и отображает их в правой боковой панели DSH.
Полностью статический конвейер: исходники canvas не выполняются. Безeval, безnew Function, без бандлера, без sandbox-iframe.
Разбор выполняется на стороне браузера собственным легковесным рекурсивным парсером (ноль зависимостей парсера).
В репозитории также есть Skill: skills/writing-qoder-canvas/, который учит LLM писать этот формат. См. [Интеграция Skill](#интеграция-skill-научить-llm-писать-canvastsx).
Диапазон совместимости: полное перечисление единой линией — engines.dsh — точное перечисление из 16 позиций (та же строка в package.json engines, peer @deepseek-ai/dsh-client-locale и dsh.plugin.json; без интервалов, без caret):
0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2 || 0.2.1-rc.3 || 0.2.1-rc.4 || 0.2.1-rc.5
0.7.2 (latest / dsh-0.2.1-rc.2) и выше устанавливается на любой из перечисленных хостов; неперечисленные версии хоста (в т.ч. 0.2.1 stable и линия 0.2.2) вне заявленной области — при выпуске stable-версии перечисление нужно расширить и перевыпустить; не используйте latest вслепую на необъявленных хостах (engines не удовлетворены → тихая блокировка стартовой проверкой). Исторические dist-tag старых линий (все = 0.6.0, 15 позиций до 0.2.0-rc.2):
DSH host · plugin version · install dist-tag
any in the 20-term enum (incl. 0.2.1-rc.1 and rc.2) · 0.7.2 (latest) · latest or dsh-0.2.1-rc.1 / dsh-0.2.1-rc.2
0.2.0-rc.1/rc.2 · 0.6.0 · dsh-0.2.0
0.1.7-rc.1/rc.2 · 0.6.0 · dsh-0.1.7
0.1.5 line · 0.6.0 · dsh-0.1.5
0.1.2-rc.1 · 0.6.0 · dsh-0.1.2
(по состоянию на 2026-10-17; старые линии обслуживаются ветками compat/0.1.7 / замороженной compat/0.1.5 и archive/release/0.1.2.)
Предварительные требования
- DSH
dsh webнормально запускается - Установлен dsh-better-sidebar (
>=0.19.1)
Без better-sidebar плагин полностью пассивен: обе регистрации молча пропускаются и не затрагивают остальные функции DSH.
Установка
Способ A (рекомендуется, официальный CLI)
# hosts inside the 20-term enum (incl. 0.2.1-rc.1 and rc.2): latest works dsh plugin --profile <profile> add dsh-canvas-tsx-sidebar@latest # 0.7.2, 17-term full enumeration dsh plugin --profile <profile> add dsh-canvas-tsx-sidebar@dsh-0.2.1-rc.1 # same, explicit line tag # alt: local tarball (this line: dsh-canvas-tsx-sidebar-0.7.2.tgz) dsh plugin --profile <profile> add <dsh-canvas-tsx-sidebar-0.7.2.tgz>
`dsh` добавляет этот пакет в `dsh.profile.bundles`; при запуске входящий в пакет `cordis.patch.yml` вставляет запись загрузчика, и клиентский бандл регистрируется и доставляется согласно `entry.name`. ### Способ B (вручную, альтернативный) 1. Скопировать пакет в `~/.dsh/profiles/<profile>/node_modules/dsh-canvas-tsx-sidebar` (либо добавить `"dsh-canvas-tsx-sidebar": "link:<путь-к-плагину>"` в `dependencies` файла `package.json` профиля); 2. дописать следующую строку в `~/.dsh/profiles/<profile>/cordis.patch.yml`:
- insert:
- id: dsh-canvas-tsx-sidebar
name: dsh-canvas-tsx-sidebar
3. выполнить `pnpm install` в каталоге профиля.
> ⚠️ **Выберите способ A или способ B — не регистрируйте дважды.**
### Активация
4. **Перезапустите `dsh web`** — добавление бандла требует перезагрузки на стороне хоста (hot reload работает только для изменений клиента **уже подключённого** плагина);
5. жёсткое обновление страницы в браузере (Ctrl+Shift+R).
Состояние подключения можно перепроверить через `pwsh -NoProfile -File ./scripts/mount-check.ps1`.
## Использование
Две точки входа:
| Точка входа | Как вызывается | Поведение |
|---|---|---|
| **Просмотрщик файлов** (перехват) | Открыть любой `.tsx` в дереве файлов | `.canvas.tsx` → структурированная страница + переключатель `Просмотр/Код`; остальные `.tsx` → просмотр исходника |
| **Вкладка** | меню `+` правой панели → **Отчёт Canvas** | ввести путь вручную и посмотреть, не открывая файл в редакторе |
Просмотрщик файлов можно отключить в настройках карточки Side; после отключения такие файлы возвращаются к встроенному просмотрщику кода.
Открытие **одного** файла рендерит **именно этот** файл — плагин не сканирует рабочую область.
### Почему просмотрщик файлов обязан перехватывать все .tsx
`exts: ['tsx']` — единственный работоспособный способ перехвата; цена в том, что перехватываются и `.tsx` вне canvas. Все доказательства взяты из исходников better-sidebar и практических проверок в экосистеме:
| # | Ограничение | Доказательство |
|---|---|---|
| L1 | `extOf()` берёт только последний сегмент расширения → `extOf('a.canvas.tsx') === 'tsx'` | `src/client/paths.ts:80-85` |
| L2 | `exts: ['tsx']` перехватывает **все** `.tsx` рабочей области, а priority 0 перекрывает CodeMirror встроенного `code` (-100) | `service.ts:847-875` |
| L3 | `detect` вызывается только при доступных байтах `head`, а `head` приходит только из бинарного `fs.read` — текстовый `.tsx` до этой ветки никогда не доходит | `service.ts:860` |
| L4 | после перехвата дескриптором `component` обязан отрисоваться, **API делегирования/отката нет** | `EditorHost.tsx:349,486` |
| L5 | экосистемный плагин `dsh-code-nav` уже содержит `tsx` в своём `LANG_EXT` и перехватывает с `priority: 10` | `dsh-code-nav/src/lang-registry.js` |
→ Определение `.canvas.tsx`
…(truncated)Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::19,最后更新 2026-11-06