@vnejs/docs 0.2.64 → 0.2.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +35 -35
  2. package/architecture/backends.md +18 -0
  3. package/architecture/build.md +37 -0
  4. package/architecture/bundles.md +20 -0
  5. package/architecture/cli.md +25 -0
  6. package/architecture/compatibility.md +22 -0
  7. package/architecture/configs.md +19 -0
  8. package/architecture/contracts.md +30 -0
  9. package/architecture/dependencies.md +55 -0
  10. package/architecture/editor.md +7 -0
  11. package/architecture/games.md +38 -0
  12. package/architecture/helpers.md +14 -0
  13. package/architecture/model.md +43 -0
  14. package/architecture/modules.md +87 -0
  15. package/architecture/packages.md +43 -0
  16. package/architecture/plugins.md +36 -0
  17. package/architecture/uis.md +23 -0
  18. package/changelog/0.2.18.md +7 -0
  19. package/changelog/0.2.19.md +14 -0
  20. package/changelog/0.2.20.md +10 -0
  21. package/changelog/0.2.21.md +5 -0
  22. package/changelog/0.2.22.md +11 -0
  23. package/changelog/0.2.23.md +4 -0
  24. package/changelog/0.2.25.md +6 -0
  25. package/changelog/0.2.26.md +12 -0
  26. package/changelog/0.2.29.md +10 -0
  27. package/changelog/0.2.31.md +5 -0
  28. package/changelog/0.2.32.md +3 -0
  29. package/changelog/0.2.33.md +5 -0
  30. package/changelog/0.2.34.md +8 -0
  31. package/changelog/0.2.35.md +33 -0
  32. package/changelog/0.2.36.md +10 -0
  33. package/changelog/0.2.38.md +19 -0
  34. package/changelog/0.2.39.md +16 -0
  35. package/changelog/0.2.40.md +9 -0
  36. package/changelog/0.2.42.md +3 -0
  37. package/changelog/0.2.43.md +10 -0
  38. package/changelog/0.2.46.md +3 -0
  39. package/changelog/0.2.47.md +25 -0
  40. package/changelog/0.2.49.md +3 -0
  41. package/changelog/0.2.50.md +6 -0
  42. package/changelog/0.2.51.md +6 -0
  43. package/changelog/0.2.52.md +5 -0
  44. package/changelog/0.2.53.md +12 -0
  45. package/changelog/0.2.55.md +19 -0
  46. package/changelog/0.2.56.md +11 -0
  47. package/changelog/0.2.57.md +7 -0
  48. package/changelog/0.2.58.md +8 -0
  49. package/changelog/0.2.59.md +6 -0
  50. package/changelog/0.2.60.md +5 -0
  51. package/changelog/0.2.61.md +11 -0
  52. package/changelog/0.2.62.md +8 -0
  53. package/changelog/0.2.63.md +4 -0
  54. package/changelog/0.2.64.md +4 -0
  55. package/changelog/0.2.65.md +3 -0
  56. package/changelog/0.2.66.md +5 -0
  57. package/changelog/README.md +43 -0
  58. package/manifest.json +66 -5
  59. package/package.json +6 -4
  60. package/plugins/ai/ai.md +29 -29
  61. package/plugins/ai/checkers.md +26 -26
  62. package/plugins/audio/ambient.md +20 -20
  63. package/plugins/audio/audio.md +40 -40
  64. package/plugins/audio/music.md +20 -20
  65. package/plugins/audio/sound.md +20 -20
  66. package/plugins/audio/voice.md +23 -23
  67. package/plugins/canvas/bg.md +44 -44
  68. package/plugins/canvas/bg.speak.md +34 -34
  69. package/plugins/canvas/fill.md +33 -33
  70. package/plugins/canvas/layer.md +35 -35
  71. package/plugins/canvas/sprite.md +46 -46
  72. package/plugins/canvas/sprite.speak.md +33 -33
  73. package/plugins/canvas/text.md +37 -37
  74. package/plugins/canvas/video.md +37 -37
  75. package/plugins/canvas.layers/bl.md +33 -33
  76. package/plugins/canvas.layers/fl.md +33 -33
  77. package/plugins/canvas.layers/ml.md +33 -33
  78. package/plugins/canvas.layers/ul.md +32 -32
  79. package/plugins/canvas.props/animation.md +25 -25
  80. package/plugins/canvas.props/clip.md +22 -22
  81. package/plugins/canvas.props/filters.md +20 -20
  82. package/plugins/canvas.props/mask.md +23 -23
  83. package/plugins/canvas.props/scale.md +20 -20
  84. package/plugins/common/grid.md +23 -23
  85. package/plugins/common/turn.md +18 -18
  86. package/plugins/controls/controls.md +31 -31
  87. package/plugins/controls/cursor.md +54 -54
  88. package/plugins/controls/gamepad.md +56 -56
  89. package/plugins/controls/keyboard.md +17 -17
  90. package/plugins/core/components.md +28 -28
  91. package/plugins/core/interact.md +26 -26
  92. package/plugins/core/logs.md +28 -28
  93. package/plugins/core/media.md +38 -38
  94. package/plugins/core/memory.md +28 -28
  95. package/plugins/core/platforms.md +19 -19
  96. package/plugins/core/scenario.md +48 -48
  97. package/plugins/core/settings.md +24 -24
  98. package/plugins/core/stack.md +39 -39
  99. package/plugins/core/state.md +30 -30
  100. package/plugins/core/storage.md +56 -56
  101. package/plugins/core/system.md +37 -37
  102. package/plugins/core/vendors.md +19 -19
  103. package/plugins/entities/entities.md +16 -16
  104. package/plugins/entities/wallet.md +27 -27
  105. package/plugins/font/montserrat.md +16 -16
  106. package/plugins/game/checkers.md +38 -38
  107. package/plugins/platform/android.md +17 -17
  108. package/plugins/platform/electron.md +21 -21
  109. package/plugins/platform/metric.md +23 -23
  110. package/plugins/rpg/damage.md +22 -22
  111. package/plugins/rpg/hit.md +24 -24
  112. package/plugins/rpg/skills.md +26 -26
  113. package/plugins/save/auto.md +26 -26
  114. package/plugins/save/continue.md +23 -23
  115. package/plugins/save/quick.md +24 -24
  116. package/plugins/save/save.md +37 -37
  117. package/plugins/scales/health.md +17 -17
  118. package/plugins/scales/mana.md +17 -17
  119. package/plugins/scales/scales.md +31 -31
  120. package/plugins/scenario/autoread.md +36 -36
  121. package/plugins/scenario/choose.md +74 -65
  122. package/plugins/scenario/fastforward.md +46 -46
  123. package/plugins/scenario/history.md +41 -41
  124. package/plugins/scenario/pause.md +27 -27
  125. package/plugins/scenario/point_and_click.md +51 -51
  126. package/plugins/scenario/qte.md +54 -54
  127. package/plugins/scenario/random.md +17 -17
  128. package/plugins/settings/filter.md +19 -19
  129. package/plugins/settings/potato.md +22 -22
  130. package/plugins/settings/ratio.md +19 -19
  131. package/plugins/settings/textsize.md +19 -19
  132. package/plugins/settings/volume.md +21 -21
  133. package/plugins/text/inject.md +22 -22
  134. package/plugins/text/locs.md +36 -36
  135. package/plugins/text/meet.md +19 -19
  136. package/plugins/text/smooth.md +33 -33
  137. package/plugins/text/text.md +76 -69
  138. package/plugins/text/wall.md +20 -20
  139. package/plugins/time/date.md +22 -22
  140. package/plugins/time/time.md +23 -23
  141. package/plugins/vars/counters.md +28 -28
  142. package/plugins/vars/flags.md +24 -24
  143. package/plugins/vars/vars.md +29 -29
  144. package/plugins/views/achievement.md +44 -44
  145. package/plugins/views/comment.md +31 -31
  146. package/plugins/views/controls.hints.md +34 -34
  147. package/plugins/views/cursor.md +19 -19
  148. package/plugins/views/fps.md +33 -33
  149. package/plugins/views/gamepad.debug.md +32 -32
  150. package/plugins/views/settings.md +39 -39
  151. package/plugins/views/video.md +37 -37
  152. package/plugins/views.scenario/choose.md +41 -41
  153. package/plugins/views.scenario/interface.controls.md +31 -31
  154. package/plugins/views.scenario/interface.fastforward.md +29 -29
  155. package/plugins/views.scenario/interface.md +74 -74
  156. package/plugins/views.scenario/point_and_click.md +39 -39
  157. package/plugins/views.scenario/qte.md +51 -51
  158. package/plugins/views.screens/checkers.md +35 -35
  159. package/plugins/views.screens/confirm.md +35 -35
  160. package/plugins/views.screens/credits.md +31 -31
  161. package/plugins/views.screens/disclaimer.md +42 -42
  162. package/plugins/views.screens/eula.md +37 -37
  163. package/plugins/views.screens/gallery.full.md +41 -41
  164. package/plugins/views.screens/gallery.md +75 -75
  165. package/plugins/views.screens/gamemenu.md +41 -41
  166. package/plugins/views.screens/history.md +39 -39
  167. package/plugins/views.screens/intro.md +32 -32
  168. package/plugins/views.screens/loading.md +30 -30
  169. package/plugins/views.screens/mainmenu.md +49 -49
  170. package/plugins/views.screens/mainmenu.socials.md +25 -25
  171. package/plugins/views.screens/save.md +66 -66
  172. package/plugins/views.screens/settings.defaults.md +37 -37
  173. package/plugins/views.screens/settings.md +40 -40
  174. package/scenario.catalog/README.md +13 -13
  175. package/scenario.catalog/index.md +35 -35
  176. package/scenario.catalog/stubs/achievement.md +4 -4
  177. package/scenario.catalog/stubs/audio.ambient.md +4 -4
  178. package/scenario.catalog/stubs/audio.music.md +4 -4
  179. package/scenario.catalog/stubs/audio.sound.md +4 -4
  180. package/scenario.catalog/stubs/audio.voice.md +4 -4
  181. package/scenario.catalog/stubs/bl.animation.md +5 -5
  182. package/scenario.catalog/stubs/bl.bg.md +5 -5
  183. package/scenario.catalog/stubs/bl.clip.md +5 -5
  184. package/scenario.catalog/stubs/bl.fill.md +5 -5
  185. package/scenario.catalog/stubs/bl.filter.md +5 -5
  186. package/scenario.catalog/stubs/bl.mask.md +5 -5
  187. package/scenario.catalog/stubs/bl.scale.md +5 -5
  188. package/scenario.catalog/stubs/bl.sprite.md +5 -5
  189. package/scenario.catalog/stubs/bl.text.md +5 -5
  190. package/scenario.catalog/stubs/bl.video.md +5 -5
  191. package/scenario.catalog/stubs/choose.block.md +7 -7
  192. package/scenario.catalog/stubs/choose.md +4 -4
  193. package/scenario.catalog/stubs/choose.option.md +7 -7
  194. package/scenario.catalog/stubs/comment.md +5 -5
  195. package/scenario.catalog/stubs/counter.md +5 -5
  196. package/scenario.catalog/stubs/credits.md +4 -4
  197. package/scenario.catalog/stubs/date.md +4 -4
  198. package/scenario.catalog/stubs/disclaimer.md +5 -5
  199. package/scenario.catalog/stubs/fl.animation.md +5 -5
  200. package/scenario.catalog/stubs/fl.bg.md +5 -5
  201. package/scenario.catalog/stubs/fl.clip.md +5 -5
  202. package/scenario.catalog/stubs/fl.fill.md +5 -5
  203. package/scenario.catalog/stubs/fl.filter.md +5 -5
  204. package/scenario.catalog/stubs/fl.mask.md +5 -5
  205. package/scenario.catalog/stubs/fl.scale.md +5 -5
  206. package/scenario.catalog/stubs/fl.sprite.md +5 -5
  207. package/scenario.catalog/stubs/fl.text.md +5 -5
  208. package/scenario.catalog/stubs/fl.video.md +5 -5
  209. package/scenario.catalog/stubs/flag.md +13 -13
  210. package/scenario.catalog/stubs/interface.md +4 -4
  211. package/scenario.catalog/stubs/intro.md +4 -4
  212. package/scenario.catalog/stubs/mainmenu.md +4 -4
  213. package/scenario.catalog/stubs/ml.animation.md +5 -5
  214. package/scenario.catalog/stubs/ml.bg.md +5 -5
  215. package/scenario.catalog/stubs/ml.clip.md +5 -5
  216. package/scenario.catalog/stubs/ml.fill.md +5 -5
  217. package/scenario.catalog/stubs/ml.filter.md +5 -5
  218. package/scenario.catalog/stubs/ml.mask.md +5 -5
  219. package/scenario.catalog/stubs/ml.scale.md +5 -5
  220. package/scenario.catalog/stubs/ml.sprite.md +5 -5
  221. package/scenario.catalog/stubs/ml.text.md +5 -5
  222. package/scenario.catalog/stubs/ml.video.md +5 -5
  223. package/scenario.catalog/stubs/other.md +6 -6
  224. package/scenario.catalog/stubs/pause.md +5 -5
  225. package/scenario.catalog/stubs/point-and-click.block.md +4 -4
  226. package/scenario.catalog/stubs/point-and-click.md +4 -4
  227. package/scenario.catalog/stubs/point-and-click.option.md +4 -4
  228. package/scenario.catalog/stubs/qte.md +4 -4
  229. package/scenario.catalog/stubs/random.md +4 -4
  230. package/scenario.catalog/stubs/random.option.md +4 -4
  231. package/scenario.catalog/stubs/save.auto.md +4 -4
  232. package/scenario.catalog/stubs/save.md +5 -5
  233. package/scenario.catalog/stubs/scenario.md +4 -4
  234. package/scenario.catalog/stubs/settings.defaults.md +4 -4
  235. package/scenario.catalog/stubs/stack.md +4 -4
  236. package/scenario.catalog/stubs/text.meet.md +4 -4
  237. package/scenario.catalog/stubs/text.wall.md +4 -4
  238. package/scenario.catalog/stubs/time.md +4 -4
  239. package/scenario.catalog/stubs/ul.animation.md +5 -5
  240. package/scenario.catalog/stubs/ul.bg.md +5 -5
  241. package/scenario.catalog/stubs/ul.clip.md +5 -5
  242. package/scenario.catalog/stubs/ul.fill.md +5 -5
  243. package/scenario.catalog/stubs/ul.filter.md +5 -5
  244. package/scenario.catalog/stubs/ul.mask.md +5 -5
  245. package/scenario.catalog/stubs/ul.scale.md +5 -5
  246. package/scenario.catalog/stubs/ul.sprite.md +5 -5
  247. package/scenario.catalog/stubs/ul.text.md +5 -5
  248. package/scenario.catalog/stubs/video.md +4 -4
  249. package/scenario.catalog/stubs/wallet.md +4 -4
  250. package/scenario.guide/README.md +38 -38
  251. package/scenario.guide/audio.md +11 -11
  252. package/scenario.guide/canvas.md +23 -23
  253. package/scenario.guide/choose.md +28 -28
  254. package/scenario.guide/dialogue.md +23 -23
  255. package/scenario.guide/flow.md +21 -21
  256. package/scenario.guide/point-and-click.md +12 -12
  257. package/scenario.guide/qte-random.md +20 -20
  258. package/scenario.guide/vars.md +19 -19
  259. package/scenario.guide/views.md +20 -20
  260. package/CHANGELOG.md +0 -383
  261. package/architecture.md +0 -566
package/README.md CHANGED
@@ -1,51 +1,51 @@
1
- # Документация VNEJS
1
+ # VNEJS docs
2
2
 
3
- Монорепозиторий движка визуальных новелл **VNEJS** — plugin-архитектура на TypeScript с событийной шиной и композицией через `bundles/`.
3
+ The **VNEJS** monorepo is a TypeScript visual-novel engine. It uses plugins, an event bus, and composition through `bundles/`.
4
4
 
5
- Публикуемый пакет: **`@vnejs/docs`**. Установка у потребителя:
5
+ Published package: **`@vnejs/docs`**. Install:
6
6
 
7
7
  ```bash
8
8
  npm i @vnejs/docs
9
9
  ```
10
10
 
11
- Машинное оглавление: [`manifest.json`](./manifest.json).
11
+ Machine index: [`manifest.json`](./manifest.json).
12
12
 
13
- ## Для агента / автора сценария
13
+ ## For an agent or a scenario author
14
14
 
15
- Пишете или правите `.vne` во внешней игре — **сначала** смотрите сценарные разделы, не архитектуру плагинов.
15
+ When you write or edit `.vne` in an external game, open the scenario sections first. Do not start with plugin architecture.
16
16
 
17
- | Приоритет | Раздел | Когда открывать |
18
- | --------- | ------------------------------------------ | --------------------------------------------------------------- |
19
- | 1 | [`scenario.guide/`](./scenario.guide/) | Авторские гайды с примерами (вариант B) |
20
- | 1 | [`scenario.catalog/`](./scenario.catalog/) | Полный индекс команд из `SCENARIO_COMMANDS` + stubs (вариант C) |
21
- | 2 | [`plugins/`](./plugins/) | События, модули, internals плагина |
22
- | 3 | [`architecture.md`](./architecture.md) | Модель монорепы — редко, не для написания реплик |
17
+ | Priority | Section | When to open |
18
+ | -------- | ------------------------------------------ | ------------------------------------------------------------------- |
19
+ | 1 | [`scenario.guide/`](./scenario.guide/) | Author guides with examples (variant B) |
20
+ | 1 | [`scenario.catalog/`](./scenario.catalog/) | Full command index from `SCENARIO_COMMANDS`, plus stubs (variant C) |
21
+ | 2 | [`plugins/`](./plugins/) | Events, modules, plugin internals |
22
+ | 3 | [`architecture/`](./architecture/) | Monorepo model. Read every file in this folder, together |
23
23
 
24
- Сейчас в пакете **два** параллельных входа для сценария — сравните и выберите удобный. Оба ссылаются на `plugins/` за деталями.
24
+ The package has two scenario entries. Compare them and pick one. Both link to `plugins/` for detail.
25
25
 
26
- ## Содержание
26
+ ## Contents
27
27
 
28
- - [Сценарий — guide](./scenario.guide/README.md) — синтаксис `.vne` и тематические гайды
29
- - [Сценарий — catalog](./scenario.catalog/README.md) — каталог `$` / `%` команд
30
- - [Архитектура](./architecture.md) — каталоги монорепы и их связи, mermaid-диаграммы
31
- - [Changelog](./CHANGELOG.md) — изменения движка и API по версиям `@vnejs/docs`
28
+ - [Scenario guide](./scenario.guide/README.md) — `.vne` syntax and topic guides
29
+ - [Scenario catalog](./scenario.catalog/README.md) — `$` / `%` commands
30
+ - [Architecture](./architecture/) — monorepo model, one file per directory. Read every file in the folder, together
31
+ - [Changelog](./changelog/README.md) — engine and API changes, one file per `@vnejs/docs` release
32
32
 
33
- ## Быстрый ориентир по монорепе
33
+ ## Monorepo map
34
34
 
35
- | Каталог | Роль |
36
- | ------------------------------------------------------------- | ---------------------------------------- |
37
- | [`packages/`](./architecture.md#packages) | Runtime: `shared`, `observer`, `core`, … |
38
- | [`modules_extensions/`](./architecture.md#modules_extensions) | Базовые классы модулей |
39
- | [`configs/`](./architecture.md#configs) | Общие TypeScript-конфиги |
40
- | [`contracts/`](./architecture.md#contracts) | Публичный API плагина |
41
- | [`plugins/`](./architecture.md#plugins) | Реализация поведения |
42
- | [`compatibility/`](./architecture.md#compatibility) | Связка между плагинами |
43
- | [`bundles/`](./architecture.md#bundles) | Сборка набора плагинов для игры |
44
- | [`helpers/`](./architecture.md#helpers) | Утилиты без привязки к движку |
45
- | [`uis/`](./architecture.md#uis) | React-компоненты для view-плагинов |
46
- | [`cli/`](./architecture.md#cli) | Сборка монорепы и игр |
47
- | [`games/`](./architecture.md#games) | Проекты игр: сценарий, entry, dist |
48
- | [`backends/`](./architecture.md#backends) | Workers: токен Steam и JSON меток |
49
- | [`vs_code_extensions/`](./architecture.md#vs_code_extensions) | Подсветка `.vne` в редакторе |
35
+ | Directory | Role |
36
+ | --------------------------------------------------- | ---------------------------------------- |
37
+ | [`packages/`](./architecture/packages.md) | Runtime: `shared`, `observer`, `core`, … |
38
+ | [`modules_extensions/`](./architecture/modules.md) | Module base classes |
39
+ | [`configs/`](./architecture/configs.md) | Shared TypeScript configs |
40
+ | [`contracts/`](./architecture/contracts.md) | Public plugin API |
41
+ | [`plugins/`](./architecture/plugins.md) | Behavior on the bus |
42
+ | [`compatibility/`](./architecture/compatibility.md) | Link between plugins |
43
+ | [`bundles/`](./architecture/bundles.md) | Plugin set for a game |
44
+ | [`helpers/`](./architecture/helpers.md) | Utils with no engine tie |
45
+ | [`uis/`](./architecture/uis.md) | React components for view plugins |
46
+ | [`cli/`](./architecture/cli.md) | Build the monorepo and the games |
47
+ | [`games/`](./architecture/games.md) | Game projects: scenario, entry, dist |
48
+ | [`backends/`](./architecture/backends.md) | Workers: Steam token and label JSON |
49
+ | [`vs_code_extensions/`](./architecture/editor.md) | `.vne` highlighting in the editor |
50
50
 
51
- `games/` подключает один `bundles/` и получает `VneCore` — точку входа в движок.
51
+ A game imports one `bundles/` package and gets `VneCore`, the engine entry.
@@ -0,0 +1,18 @@
1
+ # backends/
2
+
3
+ **Отдельные Cloudflare Workers** — не плагины и не часть `VneCore`. Игра ходит к ним по HTTP. Пакеты в `plugins/` их не импортируют.
4
+
5
+ | Пакет | Назначение |
6
+ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
7
+ | **`backends/auth`** | Steam OpenID и проверка покупки своего AppID. Отдаёт подписанный JWT (`steamId`, `ownsApp`, `exp`). |
8
+ | **`backends/content`** | `GET /label/*` — JSON меток из `dist/label`. Пускает только запрос с тем же JWT и `ownsApp`. Картинки и `mods.json` не отдаёт. |
9
+
10
+ Оба воркера знают один `AUTH_SECRET`. Контент-воркер Steam не вызывает. Каталог ассетов при деплое указывает на `dist` игры, сами JSON в репозиторий воркера не копируются. Закрытый деплой не кладёт то же дерево `label/` рядом со статикой игры.
11
+
12
+ ```mermaid
13
+ flowchart LR
14
+ Game[games/] -->|popup OpenID| Auth[backends/auth]
15
+ Auth --> Steam[steamcommunity.com]
16
+ Game -->|GET /label Bearer| Content[backends/content]
17
+ Auth -.->|общий AUTH_SECRET| Content
18
+ ```
@@ -0,0 +1,37 @@
1
+ # Сборка end-to-end
2
+
3
+ ```mermaid
4
+ flowchart TD
5
+ subgraph repo ["Монорепозиторий"]
6
+ CFG[configs/]
7
+ PKG[packages/]
8
+ ME[modules_extensions/]
9
+ CT[contracts/]
10
+ PL[plugins/]
11
+ CP[compatibility/]
12
+ BD[bundles/]
13
+ CL[cli/]
14
+ end
15
+
16
+ subgraph game_proj ["games/my-game/"]
17
+ SC[scenario .vne]
18
+ EN[entry/]
19
+ end
20
+
21
+ CFG --> PL
22
+ PKG --> ME --> PL
23
+ CT --> PL
24
+ CT --> CP
25
+ PL --> BD
26
+ CP --> BD
27
+ BD --> EN
28
+ SC --> CL
29
+ CL -->|"data + client"| ART[dist/]
30
+ EN --> ART
31
+ ART --> PLAY[Browser / Electron]
32
+ ```
33
+
34
+ 1. `bundles/` регистрирует `plugins/` и `compatibility/` в `VNE`.
35
+ 2. `cli/` собирает сценарий в JSON и клиент в `dist/`.
36
+ 3. `new VneCore().init()` — модули, media, lifecycle до `start`.
37
+ 4. Игра живёт на событиях шины; cross-plugin связи — через `compatibility/` из `bundles/`.
@@ -0,0 +1,20 @@
1
+ # bundles/
2
+
3
+ **Композиция** без бизнес-логики — цепочка side-effect импортов из `plugins/` и `compatibility/`.
4
+
5
+ - Определяет **набор возможностей** для `games/`.
6
+ - Экспортирует **`VneCore`**.
7
+ - Дочерний пакет в `bundles/` импортирует родительский и **добавляет** плагины.
8
+
9
+ ```mermaid
10
+ flowchart BT
11
+ CORE["bundles/core/"]
12
+ CANVAS["bundles/canvas.react/"]
13
+ SKEL["bundles/vn.skeleton/"]
14
+ BASE["bundles/vn.base/"]
15
+ GAME["bundles/coraline/"]
16
+
17
+ CORE --> CANVAS --> SKEL --> BASE --> GAME
18
+ ```
19
+
20
+ Entry point: re-export `VneCore` → импорт `plugins/` → импорт `compatibility/`.
@@ -0,0 +1,25 @@
1
+ # cli/
2
+
3
+ **CLI** для монорепы и сборки `games/` (`npx @vnejs/*`).
4
+
5
+ ```mermaid
6
+ flowchart LR
7
+ MR["@vnejs/monorepo"]
8
+ BD["@vnejs/build"]
9
+ DS["@vnejs/desktop"]
10
+ TL["@vnejs/tools"]
11
+
12
+ MR --> WS[workspace-пакеты]
13
+ BD --> G[games/]
14
+ DS --> G
15
+ TL --> G
16
+ ```
17
+
18
+ | CLI | Роль |
19
+ | --------------------- | ----------------------------------------------------------------------------------- |
20
+ | **`@vnejs/monorepo`** | `build`, `package`, `publish`, `bump`, `sync-deps`, `graph`, `run-changed`, `clear` |
21
+ | **`@vnejs/build`** | **`data`** — `game/` → JSON в `dist/`; **`client`** — Vite entry → `dist/` |
22
+ | **`@vnejs/desktop`** | **`web`** — static-сервер для `dist/` |
23
+ | **`@vnejs/tools`** | Resize image/video/audio, контент-пайплайн |
24
+
25
+ Корень: `npm run build` → monorepo build; **Turbo** кэширует `build` с `dependsOn: ["^build"]`.
@@ -0,0 +1,22 @@
1
+ # compatibility/
2
+
3
+ **Опциональная интеграция** между независимыми плагинами — включается в `bundles/`, не зашивается внутрь `plugins/`.
4
+
5
+ - Один модуль, наследник `ModuleCore`.
6
+ - В **`subscribe`** слушает A, эмитит B.
7
+ - **`regModule`** без `regPlugin` — нет своего namespace в `VNE`.
8
+ - Зависит только от **контрактов** из `contracts/`, не от реализаций в `plugins/`.
9
+
10
+ Именование: `@vnejs/compatibility.{источник}-with-{цель}` → путь `compatibility/{источник}/{цель}/`.
11
+
12
+ ```mermaid
13
+ flowchart LR
14
+ PA[plugins/ A] -->|"emit EVENT_A"| OBS[Observer]
15
+ OBS --> CM[compatibility/]
16
+ CM -->|"emit EVENT_B"| OBS
17
+ OBS --> PB[plugins/ B]
18
+
19
+ PA -.->|"не импортирует"| PB
20
+ CM --> CTA[contracts/ A]
21
+ CM --> CTB[contracts/ B]
22
+ ```
@@ -0,0 +1,19 @@
1
+ # configs/
2
+
3
+ **Общие конфигурации сборки** — переиспользуемые TypeScript-настройки, не runtime.
4
+
5
+ | Пакет | Назначение |
6
+ | ------------------------------ | ------------------------------------------------------------------------------------- |
7
+ | **`@vnejs/configs.ts-common`** | tsconfig для `plugins/`, `contracts/`, `packages/`, `modules_extensions/`, `helpers/` |
8
+ | **`@vnejs/configs.ts-uis`** | tsconfig для `uis/react/` и view-кода `games/` (JSX, React-типы) |
9
+ | **`@vnejs/configs.vitest`** | Общий Vitest-конфиг (`create-config.js`, `setup.js`) для пакетов с тестами |
10
+
11
+ ```mermaid
12
+ flowchart LR
13
+ TC[configs.ts-common] --> PL[plugins/ / contracts/ / packages/]
14
+ TU[configs.ts-uis] --> UI[uis/react/]
15
+ TU --> GM[games/]
16
+ TV[configs.vitest] --> TEST[пакеты с vitest]
17
+ ```
18
+
19
+ Пакеты `ts-*` экспортируют json; локальный `tsconfig.json` пакета **extends** общий и задаёт `rootDir` / `outDir`. Vitest-конфиг — JS-хелперы, не tsconfig.
@@ -0,0 +1,30 @@
1
+ # contracts/
2
+
3
+ **Контракт** — публичный API одного плагина: **спецификация**, не поведение.
4
+
5
+ ### Что входит в контракт
6
+
7
+ - **`PLUGIN_NAME`** — namespace в реестре `VNE`.
8
+ - **`CONSTANTS`**, **`SUBSCRIBE_EVENTS`**, **`PARAMS`**, **`SETTINGS_KEYS`**.
9
+ - **Типы** — payload событий, shape глобального state, shared-поля.
10
+
11
+ ### TypeScript augmentation
12
+
13
+ Контракт расширяет типы через `declare module`:
14
+
15
+ - `@vnejs/shared` — `VnePluginEventsMap`, `VnePluginConstantsMap`, …
16
+ - `@vnejs/module` — `ModuleGlobalState`, `ModuleShared`
17
+ - другие контракты — при cross-cutting типах
18
+
19
+ ### Принципы
20
+
21
+ - Один контракт обычно соответствует **одному плагину** в `plugins/` (1:1).
22
+ - Контракт **не импортирует** реализацию из `plugins/`.
23
+ - Доменная структура `contracts/` зеркалит таксономию `plugins/`.
24
+
25
+ ```mermaid
26
+ flowchart LR
27
+ CT[contracts/] -->|"declare module"| TS[Типы VNE / Module]
28
+ CT -->|"CONSTANTS, EVENTS, PARAMS"| REG[regPlugin при загрузке plugins/]
29
+ PL[plugins/] -->|"import"| CT
30
+ ```
@@ -0,0 +1,55 @@
1
+ # Граф зависимостей между каталогами
2
+
3
+ ```mermaid
4
+ flowchart TD
5
+ G[games/] --> B[bundles/]
6
+ G --> CLI[cli/]
7
+ G -.->|HTTP| BE[backends/]
8
+ B --> P[plugins/]
9
+ B --> C[compatibility/]
10
+ P --> CT[contracts/]
11
+ C --> CT
12
+ P --> H[helpers/]
13
+ P --> U[uis/]
14
+ P --> ME[modules_extensions/]
15
+ ME --> PKG[packages/]
16
+ CT --> PKG
17
+ CFG[configs/] --> P
18
+ CFG --> PKG
19
+ CFG --> U
20
+ VSC[vs_code_extensions/] -.->|"подсветка .vne"| G
21
+ ```
22
+
23
+ **Направление зависимостей:**
24
+
25
+ | От | К | Смысл |
26
+ | ---------------- | ----------------------------------- | -------------------------------------------------------- |
27
+ | `games/` | `bundles/`, `cli/` | Игра не знает про отдельные плагины; сборка через `cli/` |
28
+ | `games/` | `backends/` | HTTP к воркерам токена и меток, без импорта пакетов |
29
+ | `bundles/` | `plugins/`, `compatibility/` | Только импорт нужного набора |
30
+ | `plugins/` | `contracts/` | Реализация следует объявленному API |
31
+ | `plugins/` | `modules_extensions/` → `packages/` | Модули наследуют базы, базы опираются на shared/observer |
32
+ | `compatibility/` | `contracts/` (2+) | Связка по событиям, без импорта реализаций |
33
+ | `plugins/` | `helpers/`, `uis/` | Горизонтальные утилиты и UI |
34
+ | `plugins/` | — другой `plugins/` | **Напрямую не зависит** |
35
+ | `configs/` | пакеты workspace | Общие tsconfig, не runtime |
36
+
37
+ ## Резюме
38
+
39
+ | Каталог | Одной фразой |
40
+ | ------------------------- | --------------------------------- |
41
+ | **`packages/`** | Реестр, шина, VneCore |
42
+ | **`modules_extensions/`** | Базовые классы модулей |
43
+ | **`configs/`** | Общие tsconfig |
44
+ | **`contracts/`** | API плагина: события, типы |
45
+ | **`plugins/`** | Реализация на шине |
46
+ | **`compatibility/`** | Opt-in связка двух плагинов |
47
+ | **`bundles/`** | Набор способностей для игры |
48
+ | **`helpers/`** | Утилиты без движка |
49
+ | **`uis/`** | React/UI для view |
50
+ | **`cli/`** | Сборка монорепы и игр |
51
+ | **`games/`** | Сценарий + entry + dist |
52
+ | **`backends/`** | Workers: токен Steam и JSON меток |
53
+ | **`vs_code_extensions/`** | Подсветка `.vne` |
54
+
55
+ **Главное правило:** `plugins/` не знают друг о друге; интеграция — через события по `contracts/` и явный `compatibility/` в `bundles/`.
@@ -0,0 +1,7 @@
1
+ # vs_code_extensions/
2
+
3
+ **Расширения редактора** для формата сценария — не runtime.
4
+
5
+ | Расширение | Назначение |
6
+ | --------------------- | -------------------------------------------------- |
7
+ | **`@vnejs/language`** | Подсветка **`.vne`** в `games/*/game/**/scenario/` |
@@ -0,0 +1,38 @@
1
+ # games/
2
+
3
+ **Проекты игр** — потребители `bundles/` + `cli/`.
4
+
5
+ ```
6
+ games/<name>/
7
+ ├── entry/ # index.ts, index.html → импорт bundles/, new VneCore()
8
+ ├── game/<mod>/ # scenario (.vne), scripts, media, public
9
+ ├── desktop/ # Electron dev/prod
10
+ ├── dist/ # JSON + JS после сборки
11
+ │ ├── mods.json
12
+ │ ├── label/ # label/<path>.json (например label/prologue/1.json)
13
+ │ └── media_info/ # media_info/<mod>.json (не путать с /media/ ассетов)
14
+ └── package.json
15
+ ```
16
+
17
+ ```mermaid
18
+ flowchart LR
19
+ SC["game/**/*.vne"]
20
+ DATA["build data"]
21
+ JSON["dist mods.json label/ media_info/"]
22
+ ENTRY["entry/index.ts"]
23
+ CLIENT["build client"]
24
+ DIST["dist/"]
25
+ SRV["desktop web"]
26
+
27
+ SC --> DATA --> JSON
28
+ ENTRY --> CLIENT --> DIST
29
+ JSON --> RUN[Browser / Electron]
30
+ DIST --> RUN
31
+ SRV --> RUN
32
+ ```
33
+
34
+ 1. **`build:data`** — JSON для **`VneCore.init()`**: `mods.json`, `label/<path>.json`, `media_info/<mod>.json`.
35
+ 2. **`build:client`** — Vite + `bundles/`.
36
+ 3. **`entry/`** — `new VneCore()`, `await init()`.
37
+
38
+ `games/` **не собирает** `plugins/` — выбирает `bundles/` и добавляет контент.
@@ -0,0 +1,14 @@
1
+ # helpers/
2
+
3
+ **Чистые утилиты** вне event-архитектуры.
4
+
5
+ - **`helpers/primitives/`** — атомарные функции (`tokenize-*`, `get-id`, `to-json`, …).
6
+ - **`helpers/composites/`** — составные утилиты поверх primitives (например `call-all-promises`).
7
+ - **`helpers/base/`** — barrel **`@vnejs/helpers`** (реэкспорт primitives и composites).
8
+
9
+ ```mermaid
10
+ flowchart LR
11
+ H[helpers/] --> P[plugins/]
12
+ H --> CORE[VneCore]
13
+ H -.->|"не связан"| VNE[(VNE / Observer)]
14
+ ```
@@ -0,0 +1,43 @@
1
+ # Архитектура монорепозитория VNEJS
2
+
3
+ Документ описывает **общую модель** монорепозитория: каталоги движка, направление зависимостей и сборку игры. Конкретные пакеты не перечисляются — только принципы и связи.
4
+
5
+ ## Суть модели
6
+
7
+ Движок построен на **событийной шине** и **глобальном реестре**:
8
+
9
+ - **`Observer`** — шина событий; модули подписываются (`on`) и публикуют (`emit`) по строковым ключам.
10
+ - **`VNE`** — реестр, заполняемый при загрузке: `CONST`, `EVENTS`, `SETTINGS`, `PARAMS` — по namespace каждого плагина.
11
+ - **`VneCore`** — runtime: собирает зарегистрированные модули, инжектит зависимости и запускает lifecycle (`inject → subscribe → setup → init → start`).
12
+
13
+ Регистрация происходит **side-effect импортами** — при импорте пакета код сразу вызывает `regPlugin` или `regModule`, не дожидаясь явного вызова API.
14
+
15
+ ```mermaid
16
+ flowchart LR
17
+ subgraph load ["Загрузка bundles/"]
18
+ I[side-effect import]
19
+ RP[regPlugin / regModule]
20
+ VNE[(VNE + VNE_MODULES)]
21
+ I --> RP --> VNE
22
+ end
23
+
24
+ subgraph runtime ["Runtime"]
25
+ VC[VneCore]
26
+ OBS[Observer]
27
+ VC -->|"создаёт модули из VNE_MODULES"| MOD[Модули]
28
+ MOD -->|"on / emit"| OBS
29
+ MOD -->|"читает"| VNE
30
+ end
31
+
32
+ VNE --> VC
33
+ ```
34
+
35
+ ## Именование npm-пакетов
36
+
37
+ ```
38
+ plugins/core/system/ → @vnejs/plugins.core.system
39
+ contracts/text/text/ → @vnejs/contracts.text
40
+ compatibility/text/scenario.autoread/ → @vnejs/compatibility.text-with-scenario.autoread
41
+ ```
42
+
43
+ Слеш в пути → точка в имени; `compatibility/` — суффикс **`-with-`**.
@@ -0,0 +1,87 @@
1
+ # modules_extensions/
2
+
3
+ **Иерархия базовых классов** для модулей внутри `plugins/`.
4
+
5
+ ### Иерархия классов
6
+
7
+ ```mermaid
8
+ flowchart TD
9
+ M["@vnejs/module<br/>Module"]
10
+ MC["@vnejs/module.core<br/>ModuleCore"]
11
+ MR["@vnejs/module.replace<br/>ModuleReplace"]
12
+ MRE["@vnejs/module.replace.exec<br/>ModuleReplaceExec"]
13
+ MCO["@vnejs/module.components<br/>ModuleController, ModuleView"]
14
+ ML["@vnejs/module.layer<br/>canvas-слои"]
15
+ MA["@vnejs/module.audio"]
16
+ MCA["@vnejs/module.controller.audio"]
17
+ MCT["@vnejs/module.controller.tabs"]
18
+ MCP["@vnejs/module.controller.preload"]
19
+ MCB["@vnejs/module.controller.backgrounds"]
20
+ MCBG["@vnejs/module.controller.bg"]
21
+ MCAC["@vnejs/module.controller.accept"]
22
+ MCIN["@vnejs/module.controller.interact"]
23
+ MCAV["@vnejs/module.controller.arrows.vertical"]
24
+ MCAH["@vnejs/module.controller.arrows.horizontal"]
25
+ MCAG["@vnejs/module.controller.arrows.grid"]
26
+ MCPG["@vnejs/module.controller.pages"]
27
+ MCHS["@vnejs/module.controller.hide.on.state"]
28
+ MCHC["@vnejs/module.controller.hide.on.controls"]
29
+ MSC["@vnejs/module.scales.common"]
30
+
31
+ M --> MC
32
+ MC --> MR
33
+ MC --> MRE
34
+ MC --> MCO
35
+ MC --> MA
36
+ MC --> MCA
37
+ MC --> MCT
38
+ MC --> MCP
39
+ MC --> MCB
40
+ MC --> MCBG
41
+ MC --> MCAC
42
+ MC --> MCIN
43
+ MC --> MCAV
44
+ MC --> MCAH
45
+ MC --> MCAG
46
+ MC --> MCPG
47
+ MC --> MCHS
48
+ MC --> MCHC
49
+ MC --> MSC
50
+ MCO --> ML
51
+ ```
52
+
53
+ | Пакет | Назначение |
54
+ | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
+ | **`@vnejs/module`** | **`Module`**: `VNE`, `on`/`emit`, `inject`, state, shared, media, lifecycle |
56
+ | **`@vnejs/module.core`** | **`ModuleCore`** — типизированный доступ к **core-контрактам** |
57
+ | **`@vnejs/module.replace`** | **`ModuleReplace`** — последовательная подмена значения поля payload через `REPLACE_KEY` и цепочку handlers |
58
+ | **`@vnejs/module.replace.exec`** | **`ModuleReplaceExec`** — реестр exec-handlers по имени модуля (`EXEC_REG` / `EXEC_GET`) |
59
+ | **`@vnejs/module.components`** | **`ModuleView`**, **`ModuleController`** — React-view, zustand, media, controls. `SHOW`: `GATE` `-200`, `BEFORE` `-100`, `MAIN` `0`, `CONTROLS` `100`, `AFTER` `200`, `CLEANUP` `300`. `HIDE`: `GATE` `-300`, `CONTROLS` `-200`, `BEFORE` `-100`, `MAIN` `0`, `AFTER` `100`, `CLEANUP` `200`. `setShow` эмитит `UPDATE_STATE` `{ isShow }`, затем `updateView(isForce, false)`. `UPDATE_FAST`, `EXTERNAL_UPDATE` (`isShow` → `updateViewFast`) |
60
+ | **`@vnejs/module.layer`** | Canvas layers: controller, image, sprite, text, video, props, view |
61
+ | **`@vnejs/module.audio`** | База для audio-плагинов scenario-слоёв (`music` / `sound` / …) |
62
+ | **`@vnejs/module.controller.audio`** | Overlay-BGM для view-экранов: pause global / play `view` / resume на `SHOW.AFTER` / `HIDE.AFTER` / PRELOAD |
63
+ | **`@vnejs/module.controller.tabs`** | Навигация по вкладкам: TAB_PREV/TAB_NEXT → `TAB_SET`; guard + `applyTab` (`UPDATE_STATE` `{ tab }`) + abstract `onTabSet`; вкладка на `SHOW.BEFORE`, PUSH/POP на `CONTROLS` |
64
+ | **`@vnejs/module.controller.preload`** | Предзагрузка меток и событий на `SHOW.BEFORE` (эмитит PRELOAD) и по PRELOAD. `isShow` из `UPDATE_STATE`; `MEMORY.CLEARED` — только при `isShow`. События задаёт плагин (`EVENT_SHOW` / `EVENT_HIDE` / `EVENT_PRELOAD` / `EVENT_UPDATE_STATE`) |
65
+ | **`@vnejs/module.controller.backgrounds`** | Ротация списка фонов на `SHOW.AFTER` / таймеру / `MEMORY.CLEARED` при `isShow` из `UPDATE_STATE`. Таймер на `HIDE.AFTER` снимается всегда. События и список задаёт плагин |
66
+ | **`@vnejs/module.controller.bg`** | Статичный фон экрана: `SHOW.BEFORE` пишет `bgSrc` через `UPDATE_STATE`; `isShow` приходит из `UPDATE_STATE`. Опционально PRELOAD / start / STATE.CLEAR; `MEMORY.CLEARED` — preload и/или refresh при `isShow` |
67
+ | **`@vnejs/module.controller.accept`** | ACCEPT / INTERACT → событие ACCEPT плагина; PUSH/POP controls на `SHOW.CONTROLS` / `HIDE.CONTROLS` |
68
+ | **`@vnejs/module.controller.interact`** | `BUTTONS.ANY` → `INTERACT.EMIT`; после показа `INTERACT.PUSH` (`onInteract`), перед скрытием `INTERACT.POP`; PUSH/POP controls на `SHOW.CONTROLS` / `HIDE.CONTROLS` |
69
+ | **`@vnejs/module.controller.arrows.vertical`** | ARROW_UP / ARROW_BOTTOM по видимым пунктам; PUSH/POP controls на `SHOW.CONTROLS` / `HIDE.CONTROLS`; индекс через `UPDATE_STATE`; на `HIDE.CLEANUP` `currentArrowVerticalItem` становится `undefined` через `UPDATE_STATE`, затем `UPDATE_FAST` |
70
+ | **`@vnejs/module.controller.arrows.horizontal`** | ARROW_LEFT / ARROW_RIGHT по пунктам; PUSH/POP controls на `SHOW.CONTROLS` / `HIDE.CONTROLS`; индекс через `UPDATE_STATE`; на `HIDE.CLEANUP` `currentArrowHorizontalItem` становится `undefined` через `UPDATE_STATE`, затем `UPDATE_FAST` |
71
+ | **`@vnejs/module.controller.arrows.grid`** | Четыре стрелки по сетке; `GRID_NEXT` / `GRID_PREV` на краю; PUSH/POP на `SHOW.CONTROLS` / `HIDE.CONTROLS`; `GRID_UPDATE_ITEMS` без payload, meta через `UPDATE_STATE`; на `HIDE.CLEANUP` `gridRow` / `gridColumn` становятся `undefined` через `UPDATE_STATE`, затем `UPDATE_FAST` |
72
+ | **`@vnejs/module.controller.pages`** | Пагинация: `PAGE_SET` / `PAGE_NEXT` / `PAGE_PREV` → `setPage` → `UPDATE_STATE` (`pageIndex`) + abstract `applyPage` + `UPDATE_FAST` |
73
+ | **`@vnejs/module.controller.hide.on.state`** | STATE.SET / STATE.CLEAR → emit HIDE плагина (`isForce` задаёт наследник) |
74
+ | **`@vnejs/module.controller.hide.on.controls`** | BACK / MENU / GAMEMENU → emit HIDE плагина; PUSH/POP controls на `SHOW.CONTROLS` / `HIDE.CONTROLS` |
75
+ | **`@vnejs/module.scales.common`** | База для scales / RPG-модулей |
76
+
77
+ ### Принципы
78
+
79
+ - Плагин берёт нужную базу (`ModuleCore`, `ModuleView`, `ModuleLayerController`, …), а не `Module` напрямую.
80
+ - Базы тянут **контракты** из `contracts/` — отсюда типизация `EVENTS` / `CONST`.
81
+ - **`ModuleCore`** — `plugins/core/` и `compatibility/`; **`ModuleView` / `ModuleLayer*`** — view/canvas + **`@vnejs/uis.react`**.
82
+
83
+ | | `packages/` | `modules_extensions/` |
84
+ | ----------------- | ------------------------ | ---------------------------- |
85
+ | Роль | Runtime и инфраструктура | Шаблоны для модулей плагинов |
86
+ | Регистрация в VNE | да (`shared`, `core`) | нет |
87
+ | Наследование | — | `plugins/` наследуют базы |
@@ -0,0 +1,43 @@
1
+ # packages/
2
+
3
+ **Runtime-основа движка** — публикуемые npm-пакеты `@vnejs/*`, на которых держатся `plugins/`, `bundles/` и `VneCore`.
4
+
5
+ ### Состав и зависимости
6
+
7
+ ```mermaid
8
+ flowchart BT
9
+ CONST["constants"]
10
+ OBS["observer"]
11
+ SH["shared"]
12
+ SS["sources-set"]
13
+ SEM["semaphore"]
14
+ HELP["helpers/"]
15
+ CR["core — VneCore"]
16
+
17
+ CONST --> CR
18
+ OBS --> CR
19
+ SH --> CR
20
+ HELP --> CR
21
+ SS --> CT[contracts/ / plugins/]
22
+ SEM --> PL[plugins/]
23
+ SH --> PL
24
+ OBS --> ME[modules_extensions/]
25
+ SH --> ME
26
+ ```
27
+
28
+ | Пакет | Назначение |
29
+ | ------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
30
+ | **`@vnejs/shared`** | Реестр **`VNE`**, массив **`VNE_MODULES`**, **`regPlugin`** / **`regModule`**, типы для module augmentation |
31
+ | **`@vnejs/observer`** | **`Observer`** — pub/sub: `subscribe` / `emit` с `priority` (группы по возрастанию), `emitOne`, `emitReal`, `emitReals` |
32
+ | **`@vnejs/core`** | **`VneCore`**: модули из `VNE_MODULES`, lifecycle, загрузка `mods.json` / `media_info/`, `reset` |
33
+ | **`@vnejs/constants`** | Общие константы-заглушки (`EMPTY_OBJECT`, `EMPTY_ARRAY`) |
34
+ | **`@vnejs/sources-set`** | **`SourcesSet`** — управление множеством «источников» (text и связанная логика) |
35
+ | **`@vnejs/semaphore`** | **`Semaphore`** — очередь задач с весами и ограничением параллелизма |
36
+ | **`@vnejs/test-utils`** | Harness для тестов модулей: observer stubs, `createTestModule`, spies, DOM mocks |
37
+
38
+ ### Принципы
39
+
40
+ - **`shared` + `observer`** — фундамент; почти все плагины и модули зависят от них.
41
+ - **`core`** — точка сборки runtime; `games/` создают `new VneCore()` после импорта `bundles/`.
42
+ - **`test-utils`** — только для тестов workspace-пакетов; не часть игрового runtime.
43
+ - Пакеты **не содержат** игровой логики и **не привязаны** к конкретному `bundles/`.
@@ -0,0 +1,36 @@
1
+ # plugins/
2
+
3
+ **Плагин** — реализация поведения, описанного в `contracts/`.
4
+
5
+ ### Регистрация
6
+
7
+ 1. Импорт контракта из `contracts/`.
8
+ 2. `regPlugin(PLUGIN_NAME, { constants, events, params, settings }, [ModuleClasses])`.
9
+ 3. Классы попадают в `VNE_MODULES` через `regModule`.
10
+
11
+ ### Модули и lifecycle
12
+
13
+ Плагин — **набор модулей** с уникальным `name`. После `new VneCore()`:
14
+
15
+ 1. **`inject`** — observer, global state, shared, media. В конце, если метод есть, вызывается `postinject`.
16
+ 2. **`subscribe`** — подписки на события.
17
+ 3. **`setup`** — подготовка до `init` (все `setup` завершаются раньше любого `init`).
18
+ 4. **`init`** — асинхронная инициализация.
19
+ 5. **`start`** — после всех `init` (все `init` завершаются раньше любого `start`).
20
+
21
+ ```mermaid
22
+ sequenceDiagram
23
+ participant A as Модуль plugins/ A
24
+ participant OBS as Observer
25
+ participant B as Модуль plugins/ B
26
+
27
+ A->>OBS: emit(EVENT_A.DONE, payload)
28
+ OBS->>B: handler
29
+ B->>OBS: emit(EVENT_B.START)
30
+ ```
31
+
32
+ Пакеты из `plugins/` **не импортируют** код соседних плагинов — только контракт и `VNE`.
33
+
34
+ ### Зависимости
35
+
36
+ - `contracts/`, **`@vnejs/module.*`**, **`@vnejs/helpers`**, **`@vnejs/uis.*`** (view).