Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
12 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed / Исправлено
- Нотации: оборванная связь больше не становится узлом, удаление конца снимает ребро, копия карты сохраняет родителя, роль не теряется при вставке, недопустимая связь не записывается. Упоминание AML в документе .mboard не отвергает файл
### Added / Добавлено
- Нотации eEPC, VACD и интеллект-карта на том же графе и в схеме v1: палитра «Нотации», метка в `profileData`, пустая метка не пишется. Экспорт ARIS AML не импортируется
- Подпись на стрелке и линии: двойной клик по штриху, перетаскивание относительно середины маршрута. Нулевой сдвиг не пишется; схема остаётся v1
- Свободная стрелка и линия прилипают к фигуре и следуют за ней, в том числе после сохранения. Это не поток BPMN и не ребро: `content.link` необязателен, схема остаётся v1, удаление фигуры оставляет стрелку
- Стиль стрелки: пунктир, толщина и наконечник пишутся в сам объект и переживают сохранение. Сплошная линия не получает ключ `dash`; схема остаётся v1. Память пера живёт только на устройстве
- Раздельные заливка и обводка: у прямоугольника и круга клик пишет только одно поле (`fill` или `color`); стикер красится заливкой, узел BPMN — обводкой. Схема остаётся v1
- Блокировка объекта: выделенное не сдвигается перетаскиванием и стрелками, не меняет размер и не поворачивается; удаление, правка текста и перекраска остаются. В файле только `locked: true`, схема остаётся v1
- Поиск по доске (Ctrl+F): текст, роль, условие потока; переход к совпадению без смены масштаба; список совпадений, клик прыгает к выбранному
- Умные направляющие при перетаскивании и при изменении размера: край и центр соседа важнее сетки, в документ не пишутся
- Группы (Ctrl+G / Ctrl+Shift+G): один токен `parentId`, двигаются, копируются и удаляются вместе, без элемента-контейнера
- Настройки интерфейса (тема, сетка, мини-карта, цвет, толщина) запоминаются на устройстве
- Фронтир мощности в панели симуляции: Парето время/численность по узкой роли, без новой зависимости и без записи в документ
- Поворот объекта: ручка над выделением, Shift — шаг 15°, угол пишется в уже существующее поле `rotation`
- Зафиксирован стек документации: Markdown и rustdoc, без Antora/Typst/Markdoc; в продукт допускаются только MIT и Apache-2.0
- Enhanced documentation: Phase 2 architecture and cursor rules
- Phase 1 documentation, tutorials, and architecture reference
- BPMN token visibility coverage
Expand Down
12 changes: 12 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ dist/ # результат сборки (один файл index.html

- `dist/index.html` — единственный артефакт сборки. Убедитесь, что сборка не начинает генерировать дополнительные файлы.

**Лицензии зависимостей:**

- Продукт — MIT, коммерческое использование разрешено.
- В `package.json` `dependencies` и в `wasm/board-core` допустимы только MIT и Apache-2.0 (включая «MIT OR Apache-2.0»). GPL, AGPL, MPL и проприетарные SDK не добавлять: они либо заразят сборку, либо запретят продажу.
- AsciiDoc/Antora, Typst и Markdoc не подключать. Обоснование: [`docs/DOCUMENTATION_STACK.md`](docs/DOCUMENTATION_STACK.md).

### Процесс Pull Request

1. Форкните репозиторий и создайте ветку от `main`.
Expand Down Expand Up @@ -176,6 +182,12 @@ dist/ # build output (single index.html)

- `dist/index.html` is the only build artifact. Verify that your changes do not cause the build to emit additional files.

**Dependency licenses:**

- The product is MIT. Commercial use is allowed.
- `dependencies` in `package.json` and crates in `wasm/board-core` must be MIT or Apache-2.0, including the "MIT OR Apache-2.0" dual license. Do not add GPL, AGPL, MPL, or a proprietary SDK: those either infect the build or block selling it.
- Do not add AsciiDoc/Antora, Typst, or Markdoc. Rationale: [`docs/DOCUMENTATION_STACK.md`](docs/DOCUMENTATION_STACK.md).

### Pull request process

1. Fork the repository and branch off `main`.
Expand Down
6 changes: 6 additions & 0 deletions docs/COLLABORATION_ANALYSIS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Совместная работа в MiroBoard: анализ и план

> **Решение 2026-09-22: живую сессию не реализуем.** Документ остаётся
> исследованием схемы данных и того, почему «просто добавить провайдер» ломает
> правки. Продукт — офлайн single-file, Rust/WASM, без сети и без новых
> зависимостей. Не начинать relay, awareness, ключи и приглашения.

> Дата анализа: 2026-09-20. Ветка: `arena/01a0c0ca-miroboard`, базовый коммит `6fe690d`.
> Все утверждения ниже проверены по исходникам и измерениям, а не взяты из документации.
> Ссылки вида `src/App.tsx:268` — на конкретные строки на момент анализа.
Expand Down Expand Up @@ -488,6 +493,7 @@ BPMN XML, `.mboard` save/load, история с таймлайном, симу
| 0.4 | Явные origins транзакций (`LOCAL_EDIT`, `LOCAL_GESTURE`, `RECOVERY`, …) | M | ✅ сделано: `src/collab/origins.ts`, UndoManager переведён на allow-list локальных origins |
| 0.5 | Декомпозиция `App.tsx`: canvas-render, tool-state-machine, selection, viewport, panels | XL | 🟡 в работе: в `src/board/` — типы, геометрия, id, палитра, примеры, тема, шаги тура, `useSimulationSettings`, математика вьюпорта и `commands.ts`; в `src/collab/` — selection, marquee, clipboard, origins, user-profile; в `src/components/` — 19 компонентов. `App.tsx` = 2104 строки при целевых 800, `useState` 63 → 54. Остаток — `renderElement` (~230 строк), обработчики указателя, BPMN/симуляция, файлы. Перенос разметки исчерпан; цель 800 достижима только через разделение состояния доски (отдельный этап, за рамками 0.x) |
| 0.6 | Командный слой: все мутации через `commands/*` с явной транзакцией | M | ✅ `src/board/commands.ts`: add/update/delete/deleteMany/updateMany/move/duplicate/bringToFront. Два инварианта в одном месте — одно действие = одна транзакция (один шаг undo, один чекпоинт, один update для пиров) и каждая запись с origin. `updateSelected` перестал быть циклом. 27 тестов против настоящих функций вместо 6 против копий кода в тест-файле |
| 0.7 | Группы: Ctrl+G / Ctrl+Shift+G, общий токен, движение/копирование/удаление как одно целое | M | ✅ `src/board/group.ts`. Токен `groupId` пишется в `parentId` (это не id узла и не контейнер). Клик раскрывает только уже сгруппированное; перенос, рамка, удаление и копирование добирают членов и связку, у которой оба конца в наборе. Вставка и дублирование получают новый токен. Вложенных групп нет |

Покрытие Этапа 0: 263 unit-теста, включая jsdom-smoke всего приложения
(`src/app-smoke.test.tsx`) и два browser-level набора — `tests/multi-select.spec.ts`
Expand Down
55 changes: 55 additions & 0 deletions docs/DOCUMENTATION_STACK.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Стек документации и лицензии

Решение от 2026-09-23. Документация остаётся обычным Markdown в этом репозитории.
Специализированные генераторы не подключаем. В собранный продукт — `dist/index.html`
и крейт `board-core` — не попадает ничего, кроме MIT и Apache-2.0.

## Когда специализированный стек имел бы смысл

| Требование | Стек | Есть ли оно у MiroBoard |
|---|---|---|
| Несколько репозиториев, версии документации рядом с версиями продукта | AsciiDoc + Antora | Нет. Один репозиторий, учебник уже лежит в `docs/tutorial/`. |
| Печатная вёрстка: формулы, колонки, PDF как основной артефакт | Typst | Нет. Артефакт — интерактивная доска, не книга. |
| Жёсткая схема контента: неизвестный тег — ошибка сборки | Markdoc | Нет для сайта. Схема процесса уже проверяется в Rust (`validate_bpmn`), схема файла — в TypeScript. |
| Чертёж как код, который надо издавать отдельно от редактора | Typst или AsciiDoc + диаграммы | Нет. Чертёж — это сама доска. Обмен с другими инструментами уже делает BPMN XML. |

Пока ни одной из этих четырёх причин нет, второй язык разметки только раздваивает правки.

## Лицензии, если когда-нибудь понадобится генератор

Коммерческое использование само по себе разрешено у всех четырёх. «Без проблем»
для MIT-продукта — более узкое условие: зависимость не должна заражать
`dist/index.html` и не должна тащить чужой веб-сервис.

| Инструмент | Лицензия | Коммерция | Почему не берём сейчас |
|---|---|---|---|
| Asciidoctor | MIT | Да, без условий сверх сохранения копирайта | Второй язык разметки без выигрыша. |
| Antora | MPL-2.0 | Да, но изменённые файлы Antora нужно публиковать под MPL | Слабый копилефт. Как внешний генератор сайта не заражает Markdown, но в бандл его класть нельзя. Мультирепозиторности у нас нет. |
| Компилятор Typst, крейт `typst` | Apache-2.0 | Да. При распространении изменённого компилятора нужен файл `NOTICE` | Веб-приложение typst.app — отдельный проприетарный продукт, на него опираться нельзя. Компилятор в WASM раздует единственный HTML и не нужен доске. |
| Markdoc | MIT | Да | Ещё одна Node-схема поверх уже существующих типов. |

`mdBook` (Rust, MPL-2.0) — тот же класс, что Antora: годится как внешняя утилита,
не годится как зависимость крейта, который уезжает в браузер. GitHub и так
показывает текущий Markdown. Отдельный генератор книги не добавляем.

## Что берём из Rust

Не новый генератор документации, а то, что уже держит домен и остаётся
пермиссивным:

- `serde` / `serde_json` — MIT OR Apache-2.0. Граница WASM — JSON, без сети.
- `quick-xml` — MIT. Это и есть diagram-as-code: импорт и экспорт BPMN 2.0 XML
с BPMN-DI. Отдельный CAD-язык не нужен.
- `wasm-bindgen` — MIT OR Apache-2.0.
- `rustdoc` — часть rustc, MIT OR Apache-2.0. Документация крейта живёт в
`///` над публичными функциями `wasm/board-core`. Отдельный сайт для неё не
собираем: публичный контракт для браузера — это шесть `#[wasm_bindgen]`
функций, их и так вызывает TypeScript.

Новый крейт в `wasm/board-core` допустим только если он MIT, Apache-2.0 или
«MIT OR Apache-2.0», не тянет сеть и не нужен лишь ради документации.
GPL, AGPL, MPL, SSPL, BUSL и проприетарные SDK в этот крейт не входят:
они либо обяжут публиковать исходники сборки, либо запретят коммерческий
бандл. То же правило для `dependencies` в `package.json` — они вшиваются
в `dist/index.html`. Dev-зависимости в файл не попадают, но копилефт туда
тоже не кладём, чтобы случайный импорт не утащил его в бандл.
Loading
Loading