standkit 0.8.0__tar.gz → 0.9.0__tar.gz

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 (120) hide show
  1. {standkit-0.8.0 → standkit-0.9.0}/LICENSE +21 -21
  2. {standkit-0.8.0 → standkit-0.9.0}/MANIFEST.in +5 -5
  3. {standkit-0.8.0/standkit.egg-info → standkit-0.9.0}/PKG-INFO +222 -180
  4. {standkit-0.8.0 → standkit-0.9.0}/README.md +198 -156
  5. {standkit-0.8.0 → standkit-0.9.0}/SECURITY.md +251 -153
  6. standkit-0.9.0/docs/ARCHITECTURE.md +304 -0
  7. {standkit-0.8.0 → standkit-0.9.0}/docs/BACKLOG.md +131 -122
  8. {standkit-0.8.0 → standkit-0.9.0}/docs/CHANGELOG.md +634 -502
  9. {standkit-0.8.0 → standkit-0.9.0}/docs/COOKBOOK_LINUX.md +1199 -1199
  10. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-001-registry-fields-out-of-hub-form.md +70 -70
  11. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-002-http-probe-down-not-explained.md +72 -72
  12. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-003-redis-endpoint-in-extra.md +79 -79
  13. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-004-cookbook-hub-register-form.md +81 -81
  14. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-005-cookbook-hub-side-secrets.md +68 -68
  15. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-006-log-dir-case-and-separator.md +101 -101
  16. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-007-agent-paths-raw-traceback.md +92 -92
  17. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/GAP-008-agent-cert-trust-on-hub.md +80 -80
  18. {standkit-0.8.0 → standkit-0.9.0}/docs/GAPs/README.md +57 -57
  19. {standkit-0.8.0 → standkit-0.9.0}/docs/HOSTING.md +184 -184
  20. {standkit-0.8.0 → standkit-0.9.0}/docs/README.md +66 -65
  21. {standkit-0.8.0 → standkit-0.9.0}/docs/REMOTE_STANDS.md +358 -358
  22. {standkit-0.8.0 → standkit-0.9.0}/docs/ROADMAP.md +95 -70
  23. {standkit-0.8.0 → standkit-0.9.0}/docs/adr/0001-hosting-backends.md +144 -144
  24. {standkit-0.8.0 → standkit-0.9.0}/docs/adr/0002-k8s-backend.md +51 -51
  25. {standkit-0.8.0 → standkit-0.9.0}/docs/adr/0003-remote-log-browsing.md +63 -63
  26. {standkit-0.8.0 → standkit-0.9.0}/docs/adr/0004-iis-site-scoped-lifecycle.md +103 -103
  27. standkit-0.9.0/docs/adr/0005-companion-transport-in-mit-core.md +199 -0
  28. {standkit-0.8.0 → standkit-0.9.0}/docs/research/companion-v2-cicd-thin-agent.md +101 -101
  29. {standkit-0.8.0 → standkit-0.9.0}/projects.sample.json +185 -185
  30. {standkit-0.8.0 → standkit-0.9.0}/pyproject.toml +55 -55
  31. {standkit-0.8.0 → standkit-0.9.0}/setup.cfg +4 -4
  32. {standkit-0.8.0 → standkit-0.9.0}/standkit/__init__.py +11 -11
  33. {standkit-0.8.0 → standkit-0.9.0}/standkit/adopt.py +704 -704
  34. {standkit-0.8.0 → standkit-0.9.0}/standkit/health.py +556 -556
  35. {standkit-0.8.0 → standkit-0.9.0}/standkit/hosting.py +1498 -1498
  36. {standkit-0.8.0 → standkit-0.9.0}/standkit/lifecycle.py +424 -424
  37. {standkit-0.8.0 → standkit-0.9.0}/standkit/logs.py +409 -409
  38. {standkit-0.8.0 → standkit-0.9.0}/standkit/models.py +422 -422
  39. {standkit-0.8.0 → standkit-0.9.0}/standkit/platform.py +309 -309
  40. {standkit-0.8.0 → standkit-0.9.0}/standkit/registry.py +227 -227
  41. {standkit-0.8.0 → standkit-0.9.0}/standkit/secrets.py +139 -139
  42. {standkit-0.8.0 → standkit-0.9.0/standkit.egg-info}/PKG-INFO +222 -180
  43. {standkit-0.8.0 → standkit-0.9.0}/standkit.egg-info/SOURCES.txt +22 -0
  44. {standkit-0.8.0 → standkit-0.9.0}/standkit.egg-info/top_level.txt +1 -0
  45. {standkit-0.8.0 → standkit-0.9.0}/standkit_agent/__init__.py +9 -9
  46. {standkit-0.8.0 → standkit-0.9.0}/standkit_agent/__main__.py +487 -487
  47. {standkit-0.8.0 → standkit-0.9.0}/standkit_agent/audit.py +93 -93
  48. {standkit-0.8.0 → standkit-0.9.0}/standkit_agent/security.py +303 -303
  49. {standkit-0.8.0 → standkit-0.9.0}/standkit_agent/server.py +490 -490
  50. standkit-0.9.0/standkit_companion/__init__.py +79 -0
  51. standkit-0.9.0/standkit_companion/__main__.py +377 -0
  52. standkit-0.9.0/standkit_companion/backend.py +555 -0
  53. standkit-0.9.0/standkit_companion/context.py +348 -0
  54. standkit-0.9.0/standkit_companion/ed25519.py +249 -0
  55. standkit-0.9.0/standkit_companion/errors.py +198 -0
  56. standkit-0.9.0/standkit_companion/fsutil.py +126 -0
  57. standkit-0.9.0/standkit_companion/patterns.py +812 -0
  58. standkit-0.9.0/standkit_companion/releases.py +975 -0
  59. standkit-0.9.0/standkit_companion/revocations.py +204 -0
  60. standkit-0.9.0/standkit_companion/runner.py +843 -0
  61. standkit-0.9.0/standkit_companion/signature.py +385 -0
  62. standkit-0.9.0/standkit_companion/state.py +214 -0
  63. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/__init__.py +13 -13
  64. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/__main__.py +187 -187
  65. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/agent_control.py +216 -216
  66. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/client.py +411 -411
  67. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/config.py +344 -200
  68. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/logs_browser.py +445 -445
  69. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/poller.py +228 -228
  70. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/redis_min.py +326 -326
  71. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/security.py +146 -146
  72. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/server.py +2388 -1933
  73. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/shortcut.py +269 -269
  74. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/app.js +2194 -1732
  75. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/bpmkit-logo-dark.svg +5 -5
  76. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/bpmkit-logo.svg +5 -5
  77. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/cookbook.html +2827 -2559
  78. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/favicon.svg +4 -4
  79. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/index.html +775 -547
  80. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/manifest.webmanifest +41 -41
  81. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/style.css +1512 -1319
  82. {standkit-0.8.0 → standkit-0.9.0}/tests/test_adopt.py +404 -404
  83. {standkit-0.8.0 → standkit-0.9.0}/tests/test_agent_security.py +303 -303
  84. {standkit-0.8.0 → standkit-0.9.0}/tests/test_agent_server_integration.py +192 -192
  85. {standkit-0.8.0 → standkit-0.9.0}/tests/test_agent_startup_preflight.py +842 -842
  86. standkit-0.9.0/tests/test_companion_backend.py +516 -0
  87. standkit-0.9.0/tests/test_companion_context.py +400 -0
  88. standkit-0.9.0/tests/test_companion_patterns.py +789 -0
  89. standkit-0.9.0/tests/test_companion_releases.py +773 -0
  90. standkit-0.9.0/tests/test_companion_revocations.py +353 -0
  91. standkit-0.9.0/tests/test_companion_runner.py +921 -0
  92. standkit-0.9.0/tests/test_companion_signature.py +603 -0
  93. {standkit-0.8.0 → standkit-0.9.0}/tests/test_health.py +728 -728
  94. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hosting.py +1475 -1475
  95. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_agent_control.py +192 -192
  96. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_client_tls.py +403 -403
  97. standkit-0.9.0/tests/test_hub_companion_api.py +788 -0
  98. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_config.py +153 -153
  99. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_fast_paint.py +462 -462
  100. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_logs_browser.py +552 -552
  101. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_pwa_and_compact.py +220 -220
  102. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_redis_min.py +247 -247
  103. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_register.py +597 -597
  104. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_server.py +1144 -1144
  105. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_shortcut.py +218 -218
  106. {standkit-0.8.0 → standkit-0.9.0}/tests/test_hub_single_instance.py +200 -200
  107. {standkit-0.8.0 → standkit-0.9.0}/tests/test_lifecycle.py +364 -364
  108. {standkit-0.8.0 → standkit-0.9.0}/tests/test_logs.py +490 -490
  109. {standkit-0.8.0 → standkit-0.9.0}/tests/test_models.py +477 -477
  110. {standkit-0.8.0 → standkit-0.9.0}/tests/test_no_window.py +311 -298
  111. {standkit-0.8.0 → standkit-0.9.0}/tests/test_registry.py +95 -95
  112. {standkit-0.8.0 → standkit-0.9.0}/tests/test_registry_resolver.py +140 -140
  113. {standkit-0.8.0 → standkit-0.9.0}/tests/test_secrets.py +106 -106
  114. standkit-0.8.0/docs/ARCHITECTURE.md +0 -123
  115. {standkit-0.8.0 → standkit-0.9.0}/standkit.egg-info/dependency_links.txt +0 -0
  116. {standkit-0.8.0 → standkit-0.9.0}/standkit.egg-info/entry_points.txt +0 -0
  117. {standkit-0.8.0 → standkit-0.9.0}/standkit.egg-info/requires.txt +0 -0
  118. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/assets/bpmkit-icon.ico +0 -0
  119. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/assets/icon.png +0 -0
  120. {standkit-0.8.0 → standkit-0.9.0}/standkit_hub/web/favicon.png +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 standkit contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 standkit contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,5 +1,5 @@
1
- include projects.sample.json
2
- include README.md
3
- include LICENSE
4
- include SECURITY.md
5
- recursive-include docs *.md
1
+ include projects.sample.json
2
+ include README.md
3
+ include LICENSE
4
+ include SECURITY.md
5
+ recursive-include docs *.md
@@ -1,180 +1,222 @@
1
- Metadata-Version: 2.4
2
- Name: standkit
3
- Version: 0.8.0
4
- Summary: Свободное ядро (MIT) для управления жизненным циклом локальных и удалённых стендов BPMSoft: headless start/stop/restart, health-пробы, логи, реестр стендов. Часть экосистемы BPMkit.
5
- Author: standkit contributors
6
- License-Expression: MIT
7
- Project-URL: Homepage, https://github.com/thinkquattro/BPMkitStand
8
- Project-URL: Экосистема BPMkit, https://bpmkit.pro
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Operating System :: OS Independent
12
- Classifier: Intended Audience :: System Administrators
13
- Classifier: Topic :: System :: Systems Administration
14
- Requires-Python: >=3.10
15
- Description-Content-Type: text/markdown
16
- License-File: LICENSE
17
- Provides-Extra: secrets
18
- Requires-Dist: keyring>=24; extra == "secrets"
19
- Provides-Extra: desktop
20
- Requires-Dist: pywebview>=5; extra == "desktop"
21
- Provides-Extra: dev
22
- Requires-Dist: pytest>=7.0; extra == "dev"
23
- Dynamic: license-file
24
-
25
- <div align="center">
26
-
27
- <img src="https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/standkit_hub/web/bpmkit-logo.svg" alt="BPMkit" width="300"/>
28
-
29
- # BPMkitStand
30
-
31
- **Свободный диспетчер стендов BPMSoft.**
32
- Локальный веб-дашборд для запуска, остановки и мониторинга ваших стендов — в один клик, без консоли.
33
-
34
- [![License: MIT](https://img.shields.io/badge/License-MIT-f9763d.svg)](LICENSE)
35
- [![Python 3.10+](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/)
36
- [![Platform](https://img.shields.io/badge/OS-Windows%20%7C%20Linux-lightgrey.svg)]()
37
-
38
- [Сайт](https://bpmkit.pro) · [Telegram](https://t.me/quattrolife) · [Companion-версия](https://bpmkit.pro)
39
-
40
- </div>
41
-
42
- ---
43
-
44
- ## Что это
45
-
46
- **BPMkitStand** — бесплатный инструмент экосистемы [BPMkit](https://bpmkit.pro) для управления
47
- локальными и удалёнными стендами BPMSoft. Открывает лёгкий локальный веб-дашборд в браузере:
48
- видно состояние каждого стенда, его можно запустить/остановить/перезапустить, посмотреть логи
49
- текущей сессии и очистить Redis — всё без ручных команд в PowerShell.
50
-
51
- Ядро (`standkit`) написано на чистой стандартной библиотеке Python — без тяжёлых зависимостей,
52
- работает на Windows и Linux.
53
-
54
- ## Возможности
55
-
56
- - **Дашборд стендов** — список из общего реестра BPMkit (`projects.json`), состояние в реальном времени.
57
- - **Жизненный цикл** — старт / стоп / рестарт стенда с честной обратной связью (спиннер до готовности, без ложных «не поднялся» на прогреве).
58
- - **Логи** — просмотр логов текущей сессии стенда, открытие папки логов стенда и папки BPMkit-проекта.
59
- - **Redis** — очистка кэша стенда (номер БД берётся из конфигурации стенда).
60
- - **Тёмная и светлая тема** с переключателем.
61
- - **Встроенная справка** — кнопка «?» в шапке открывает кукбук: установка, работа с дашбордом, удалённые агенты, траблшутинг. Один самодостаточный файл, работает офлайн.
62
- - **Безопасность по умолчанию** — дашборд слушает только `127.0.0.1`, сессионный токен, защита мутаций (CSRF + проверка Origin).
63
- - **Удалённые стенды** *(в развитии)* — через лёгкие кроссплатформенные headless-агенты с TLS/mTLS.
64
-
65
- ## Скриншоты
66
-
67
- | Дашборд (светлая тема) | Дашборд (тёмная тема) |
68
- |---|---|
69
- | ![Дашборд, светлая тема](https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/dashboard-light.png) | ![Дашборд, тёмная тема](https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/dashboard-dark.png) |
70
-
71
- <div align="center">
72
- <img src="https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/about.png" alt="Модальное окно «О программе»" width="360"/>
73
- </div>
74
-
75
- ## Как это работает
76
-
77
- BPMkitStand состоит из **ядра и двух оболочек**:
78
-
79
- - **`standkit`** — ядро (MIT) на чистой стандартной библиотеке Python: движок жизненного цикла
80
- над реестром `projects.json` (старт/стоп/рестарт процесса стенда), health-пробы (процесс / HTTP
81
- / порт БД / порт Redis), tail лога, Secret-first доступ к секретам. Без веб-слоя и сетевых
82
- зависимостей — можно использовать и как библиотеку/CLI.
83
- - **`standkit_hub`** — локальный веб-дашборд (то, что видно на скриншотах). Сам себя отдаёт по
84
- HTTP через `stdlib http.server` (vanilla JS/CSS, без CDN и сборки) и открывается в системном
85
- браузере; опционально — в нативном окне (`standkit[desktop]`, `--desktop`). Устанавливается
86
- только на машину оператора.
87
- - **`standkit_agent`** — лёгкий headless-демон на хосте удалённого стенда (см. ниже).
88
-
89
- Дашборд — **федеративный клиент**: он собирает в один список и локальные стенды (управляет ими
90
- напрямую через ядро), и удалённые (ходит к их агентам по HTTP). В таблице колонка «Транспорт»
91
- показывает, как дашборд дотягивается до стенда: `local` или `agent`.
92
-
93
- Реестр стендов — **единый с MCP BPMkit**: один `projects.json` (стенды под ключом `projects`),
94
- путь резолвится через `BPMSOFT_PROJECTS_FILE` → `%APPDATA%\BPMkit\projects.json`
95
- (`~/.config/BPMkit/...` на Linux) → `./projects.json`. Секреты (пароли БД, токены агентов) в
96
- реестре не хранятся — только ссылки на них (Secret-first).
97
-
98
- Запуск стенда честный: дашборд поднимает `dotnet <stand_dll>` и держит спиннер до реального
99
- ответа web-хоста по HTTP, а не рапортует «запущено» по факту создания процесса.
100
-
101
- Виды хостинга (kestrel/iis/docker) — см. [docs/HOSTING.md](docs/HOSTING.md).
102
-
103
- ## Удалённые стенды
104
-
105
- Стенды на других хостах (виртуалки, серверы, контуры заказчика) управляются через **федерацию
106
- лёгких кроссплатформенных агентов** (`standkit_agent`, Windows/Linux, только stdlib). На хосте
107
- стенда поднимается агент, дашборд оператора ходит к нему по HTTPS с Bearer-токеном; стенд
108
- объявляется удалённым одним полем `transport: "agent"` в реестре. Агент — RCE-поверхность по
109
- дизайну, поэтому защищён secure-defaults: loopback по умолчанию, fail-closed на non-loopback без
110
- TLS, TLS 1.2+/mTLS, скоупы control/readonly, lockout по IP, аудит.
111
-
112
- **Полное описание, установка агента, TLS/mTLS, служба и траблшутинг — в
113
- [docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md).**
114
-
115
- ## Установка
116
-
117
- Нужен Python 3.10+.
118
-
119
- ```bash
120
- pip install standkit
121
- ```
122
-
123
- Обновление — `pip install -U standkit`. Конкретная версия (в том числе откат) —
124
- `pip install "standkit==0.6.1"`; полный список выпусков — на
125
- [PyPI](https://pypi.org/project/standkit/).
126
-
127
- Запуск дашборда:
128
-
129
- ```bash
130
- standkit-hub
131
- ```
132
-
133
- Откроется браузер с локальным дашбордом. Реестр стендов берётся из
134
- `%APPDATA%\BPMkit\projects.json` (или из переменной окружения `BPMSOFT_PROJECTS_FILE`).
135
-
136
- ## Реестр стендов
137
-
138
- BPMkitStand использует тот же реестр, что и MCP BPMkit — единый `projects.json`.
139
- Образец формата — [`projects.sample.json`](projects.sample.json). Стенд можно
140
- зарегистрировать прямо из дашборда (кнопка «Зарегистрировать стенд»).
141
-
142
- ## Безопасность
143
-
144
- Дашборд и агент проектировались с расчётом на прод-контур. Модель угроз, харденинг и чек-лист —
145
- в [SECURITY.md](SECURITY.md). Кратко: fail-closed bind на loopback, TLS 1.2+/mTLS для агента,
146
- скоупы токена, per-IP lockout, аудит без утечки секретов.
147
-
148
- ## Документация проекта
149
-
150
- **Карта всех документов — [docs/README.md](docs/README.md)**: кому, о чём и когда открывать.
151
- Коротко:
152
-
153
- | Документ | Для кого |
154
- |---|---|
155
- | [**Кукбук**](standkit_hub/web/cookbook.html) — обзор, установка, дашборд, реестр, хостинг, агент, безопасность, траблшутинг. Один standalone-файл: в работающем диспетчере открывается кнопкой «?» в шапке, без него — прямо с диска в браузере | оператор |
156
- | [docs/COOKBOOK_LINUX.md](docs/COOKBOOK_LINUX.md) — пошаговое развёртывание агента на Linux: pipx/venv, реестр, секреты, systemd, TLS/mTLS, разбор типичных ошибок с реальными сообщениями | администратор |
157
- | [docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md) · [docs/HOSTING.md](docs/HOSTING.md) · [SECURITY.md](SECURITY.md) | оператор / администратор |
158
- | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · [docs/adr/](docs/adr/) · [docs/CHANGELOG.md](docs/CHANGELOG.md) | разработчик |
159
- | [docs/ROADMAP.md](docs/ROADMAP.md) — крупные работы · [docs/BACKLOG.md](docs/BACKLOG.md) — заглушки и заделы в коде · [docs/GAPs/](docs/GAPs/README.md) — код прав, а сценарий оператора ломается | планирование |
160
-
161
- > Статус: `standkit` — молодой проект (0.8.x). Ядро/агент/хаб работоспособны, но
162
- > ряд возможностей — это **каркас/заделы** (например, глубокие пробы БД/Redis,
163
- > транспорты ssh/winrm, живая приёмка Docker/k8s/IIS). Что именно ещё не
164
- > дописано — прозрачно перечислено в [docs/BACKLOG.md](docs/BACKLOG.md).
165
-
166
- ## BPMkitStand и Companion
167
-
168
- Бесплатная версия — полноценный диспетчер стендов. **Companion-версия** дополнительно даёт
169
- автообновление MCP BPMkit и контроль лицензии; поставляется в составе установщика MCP-клиента.
170
- Подробнее — на [bpmkit.pro](https://bpmkit.pro).
171
-
172
- ## Лицензия
173
-
174
- [MIT](LICENSE) © Владимир Терновский
175
-
176
- ---
177
-
178
- <div align="center">
179
- <sub>Часть экосистемы <a href="https://bpmkit.pro">BPMkit</a> — AI-ассистента для разработки на BPMSoft.</sub>
180
- </div>
1
+ Metadata-Version: 2.4
2
+ Name: standkit
3
+ Version: 0.9.0
4
+ Summary: Свободное ядро (MIT) для управления жизненным циклом локальных и удалённых стендов BPMSoft: headless start/stop/restart, health-пробы, логи, реестр стендов. Часть экосистемы BPMkit.
5
+ Author: standkit contributors
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/thinkquattro/BPMkitStand
8
+ Project-URL: Экосистема BPMkit, https://bpmkit.pro
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Topic :: System :: Systems Administration
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Provides-Extra: secrets
18
+ Requires-Dist: keyring>=24; extra == "secrets"
19
+ Provides-Extra: desktop
20
+ Requires-Dist: pywebview>=5; extra == "desktop"
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest>=7.0; extra == "dev"
23
+ Dynamic: license-file
24
+
25
+ <div align="center">
26
+
27
+ <img src="https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/standkit_hub/web/bpmkit-logo.svg" alt="BPMkit" width="300"/>
28
+
29
+ # BPMkitStand
30
+
31
+ **Свободный диспетчер стендов BPMSoft.**
32
+ Локальный веб-дашборд для запуска, остановки и мониторинга ваших стендов — в один клик, без консоли.
33
+
34
+ [![License: MIT](https://img.shields.io/badge/License-MIT-f9763d.svg)](LICENSE)
35
+ [![Python 3.10+](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/)
36
+ [![Platform](https://img.shields.io/badge/OS-Windows%20%7C%20Linux-lightgrey.svg)]()
37
+
38
+ [Сайт](https://bpmkit.pro) · [Telegram](https://t.me/quattrolife) · [Companion-версия](https://bpmkit.pro)
39
+
40
+ </div>
41
+
42
+ ---
43
+
44
+ ## Что это
45
+
46
+ **BPMkitStand** — бесплатный инструмент экосистемы [BPMkit](https://bpmkit.pro) для управления
47
+ локальными и удалёнными стендами BPMSoft. Открывает лёгкий локальный веб-дашборд в браузере:
48
+ видно состояние каждого стенда, его можно запустить/остановить/перезапустить, посмотреть логи
49
+ текущей сессии и очистить Redis — всё без ручных команд в PowerShell.
50
+
51
+ Ядро (`standkit`) написано на чистой стандартной библиотеке Python — без тяжёлых зависимостей,
52
+ работает на Windows и Linux.
53
+
54
+ ## Возможности
55
+
56
+ - **Дашборд стендов** — список из общего реестра BPMkit (`projects.json`), состояние в реальном времени.
57
+ - **Жизненный цикл** — старт / стоп / рестарт стенда с честной обратной связью (спиннер до готовности, без ложных «не поднялся» на прогреве).
58
+ - **Логи** — просмотр логов текущей сессии стенда, открытие папки логов стенда и папки BPMkit-проекта.
59
+ - **Redis** — очистка кэша стенда (номер БД берётся из конфигурации стенда).
60
+ - **Тёмная и светлая тема** с переключателем.
61
+ - **Встроенная справка** — кнопка «?» в шапке открывает кукбук: установка, работа с дашбордом, удалённые агенты, траблшутинг. Один самодостаточный файл, работает офлайн.
62
+ - **Безопасность по умолчанию** — дашборд слушает только `127.0.0.1`, сессионный токен, защита мутаций (CSRF + проверка Origin).
63
+ - **Удалённые стенды** *(в развитии)* — через лёгкие кроссплатформенные headless-агенты с TLS/mTLS.
64
+ - **Канал обновлений** *(редакция Companion)* — вкладка «Обновления»: паттерны разработки, обновление MCP с проверкой подписи и откатом, список отзыва лицензий.
65
+
66
+ ## Скриншоты
67
+
68
+ | Дашборд (светлая тема) | Дашборд (тёмная тема) |
69
+ |---|---|
70
+ | ![Дашборд, светлая тема](https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/dashboard-light.png) | ![Дашборд, тёмная тема](https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/dashboard-dark.png) |
71
+
72
+ <div align="center">
73
+ <img src="https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/about.png" alt="Модальное окно «О программе»" width="360"/>
74
+ </div>
75
+
76
+ ## Как это работает
77
+
78
+ BPMkitStand состоит из **ядра, двух оболочек и канала обновлений**:
79
+
80
+ - **`standkit`** — ядро (MIT) на чистой стандартной библиотеке Python: движок жизненного цикла
81
+ над реестром `projects.json` (старт/стоп/рестарт процесса стенда), health-пробы (процесс / HTTP
82
+ / порт БД / порт Redis), tail лога, Secret-first доступ к секретам. Без веб-слоя и сетевых
83
+ зависимостей — можно использовать и как библиотеку/CLI.
84
+ - **`standkit_hub`** — локальный веб-дашборд (то, что видно на скриншотах). Сам себя отдаёт по
85
+ HTTP через `stdlib http.server` (vanilla JS/CSS, без CDN и сборки) и открывается в системном
86
+ браузере; опционально — в нативном окне (`standkit[desktop]`, `--desktop`). Устанавливается
87
+ только на машину оператора.
88
+ - **`standkit_agent`** — лёгкий headless-демон на хосте удалённого стенда (см. ниже).
89
+ - **`standkit_companion`** — транспорт канала обновлений издателя (см. ниже). Хаб импортирует
90
+ его мягко: пакета нет — дашборд работает как обычно, в свободной редакции.
91
+
92
+ Дашборд — **федеративный клиент**: он собирает в один список и локальные стенды (управляет ими
93
+ напрямую через ядро), и удалённые (ходит к их агентам по HTTP). В таблице колонка «Транспорт»
94
+ показывает, как дашборд дотягивается до стенда: `local` или `agent`.
95
+
96
+ Реестр стендов — **единый с MCP BPMkit**: один `projects.json` (стенды под ключом `projects`),
97
+ путь резолвится через `BPMSOFT_PROJECTS_FILE` → `%APPDATA%\BPMkit\projects.json`
98
+ (`~/.config/BPMkit/...` на Linux) → `./projects.json`. Секреты (пароли БД, токены агентов) в
99
+ реестре не хранятся — только ссылки на них (Secret-first).
100
+
101
+ Запуск стенда честный: дашборд поднимает `dotnet <stand_dll>` и держит спиннер до реального
102
+ ответа web-хоста по HTTP, а не рапортует «запущено» по факту создания процесса.
103
+
104
+ Виды хостинга (kestrel/iis/docker) — см. [docs/HOSTING.md](docs/HOSTING.md).
105
+
106
+ ## Удалённые стенды
107
+
108
+ Стенды на других хостах (виртуалки, серверы, контуры заказчика) управляются через **федерацию
109
+ лёгких кроссплатформенных агентов** (`standkit_agent`, Windows/Linux, только stdlib). На хосте
110
+ стенда поднимается агент, дашборд оператора ходит к нему по HTTPS с Bearer-токеном; стенд
111
+ объявляется удалённым одним полем `transport: "agent"` в реестре. Агент — RCE-поверхность по
112
+ дизайну, поэтому защищён secure-defaults: loopback по умолчанию, fail-closed на non-loopback без
113
+ TLS, TLS 1.2+/mTLS, скоупы control/readonly, lockout по IP, аудит.
114
+
115
+ **Полное описание, установка агента, TLS/mTLS, служба и траблшутинг — в
116
+ [docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md).**
117
+
118
+ ## Установка
119
+
120
+ Нужен Python 3.10+.
121
+
122
+ ```bash
123
+ pip install standkit
124
+ ```
125
+
126
+ Обновление — `pip install -U standkit`. Конкретная версия (в том числе откат) —
127
+ `pip install "standkit==0.6.1"`; полный список выпусков — на
128
+ [PyPI](https://pypi.org/project/standkit/).
129
+
130
+ Запуск дашборда:
131
+
132
+ ```bash
133
+ standkit-hub
134
+ ```
135
+
136
+ Откроется браузер с локальным дашбордом. Реестр стендов берётся из
137
+ `%APPDATA%\BPMkit\projects.json` (или из переменной окружения `BPMSOFT_PROJECTS_FILE`).
138
+
139
+ ## Реестр стендов
140
+
141
+ BPMkitStand использует тот же реестр, что и MCP BPMkit — единый `projects.json`.
142
+ Образец формата — [`projects.sample.json`](projects.sample.json). Стенд можно
143
+ зарегистрировать прямо из дашборда (кнопка «Зарегистрировать стенд»).
144
+
145
+ ## Канал обновлений
146
+
147
+ Вкладка **«Обновления»** в дашборде — канал доставки от издателя BPMkit: паттерны
148
+ разработки, обновления самого MCP и список отозванных лицензий. В репозитории живёт
149
+ **транспорт** (пакет `standkit_companion`, stdlib-only: HTTP-клиент, планировщик трёх
150
+ циклов, проверка целостности и подписи Ed25519, раскладка файлов, откат). Лицензия,
151
+ содержимое паттернов и подписанные бинари — на стороне издателя, поэтому без
152
+ лицензионного ключа канал ничего не делает и честно об этом сообщает.
153
+
154
+ Редакция определяется наличием пакета: нет `standkit_companion` рядом — вкладка говорит
155
+ «свободная редакция», управление стендами работает как работало. Главный рубильник —
156
+ `companion.enabled` в настройках диспетчера; интервалы и циклы включаются там же
157
+ («Настройки» → «Канал обновлений»).
158
+
159
+ Два правила, которые канал не нарушает: **бинарь MCP не подменяется без вашей команды**
160
+ (автоматика доходит максимум до скачивания в отдельный каталог) и **обновление не
161
+ применяется без подтверждённой подписи** — это не отключается настройкой.
162
+
163
+ То же самое из консоли, когда дашборд под рукой не нужен:
164
+
165
+ ```bash
166
+ python -m standkit_companion status # состояние канала (плюс --json)
167
+ python -m standkit_companion sync # синхронизировать паттерны
168
+ python -m standkit_companion check-update # проверить обновление MCP (не качая файл)
169
+ python -m standkit_companion stage-update # скачать и проверить, не применяя
170
+ python -m standkit_companion apply-update # применить подготовленное
171
+ python -m standkit_companion rollback # вернуть предыдущую версию
172
+ ```
173
+
174
+ Подробности — в [кукбуке](standkit_hub/web/cookbook.html), раздел «Канал обновлений»
175
+ (что приезжает, чем различаются три цикла, где лежат файлы, таблица диагностик).
176
+ Почему транспорт живёт в MIT-ядре и чего модуль не делает никогда —
177
+ [docs/adr/0005-companion-transport-in-mit-core.md](docs/adr/0005-companion-transport-in-mit-core.md).
178
+
179
+ ## Безопасность
180
+
181
+ Дашборд и агент проектировались с расчётом на прод-контур. Модель угроз, харденинг и чек-лист —
182
+ в [SECURITY.md](SECURITY.md). Кратко: fail-closed bind на loopback, TLS 1.2+/mTLS для агента,
183
+ скоупы токена, per-IP lockout, аудит без утечки секретов. Канал обновлений разобран там же
184
+ отдельным разделом (§4.2): fail-closed подпись исполняемого артефакта, публичный ключ из
185
+ поставки, запись только в пользовательские каталоги.
186
+
187
+ ## Документация проекта
188
+
189
+ **Карта всех документов — [docs/README.md](docs/README.md)**: кому, о чём и когда открывать.
190
+ Коротко:
191
+
192
+ | Документ | Для кого |
193
+ |---|---|
194
+ | [**Кукбук**](standkit_hub/web/cookbook.html) — обзор, установка, дашборд, реестр, хостинг, агент, безопасность, траблшутинг. Один standalone-файл: в работающем диспетчере открывается кнопкой «?» в шапке, без него — прямо с диска в браузере | оператор |
195
+ | [docs/COOKBOOK_LINUX.md](docs/COOKBOOK_LINUX.md) — пошаговое развёртывание агента на Linux: pipx/venv, реестр, секреты, systemd, TLS/mTLS, разбор типичных ошибок с реальными сообщениями | администратор |
196
+ | [docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md) · [docs/HOSTING.md](docs/HOSTING.md) · [SECURITY.md](SECURITY.md) | оператор / администратор |
197
+ | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · [docs/adr/](docs/adr/) · [docs/CHANGELOG.md](docs/CHANGELOG.md) | разработчик |
198
+ | [docs/ROADMAP.md](docs/ROADMAP.md) — крупные работы · [docs/BACKLOG.md](docs/BACKLOG.md) — заглушки и заделы в коде · [docs/GAPs/](docs/GAPs/README.md) — код прав, а сценарий оператора ломается | планирование |
199
+
200
+ > Статус: `standkit` — молодой проект (0.9.x). Ядро/агент/хаб работоспособны, но
201
+ > ряд возможностей — это **каркас/заделы** (например, глубокие пробы БД/Redis,
202
+ > транспорты ssh/winrm, живая приёмка Docker/k8s/IIS). Что именно ещё не
203
+ > дописано — прозрачно перечислено в [docs/BACKLOG.md](docs/BACKLOG.md).
204
+
205
+ ## BPMkitStand и Companion
206
+
207
+ Бесплатная версия — полноценный диспетчер стендов. **Companion-версия** дополнительно даёт
208
+ канал обновлений: паттерны разработки, автообновление MCP BPMkit и контроль лицензии;
209
+ поставляется в составе установщика MCP-клиента. Код транспорта канала лежит в этом
210
+ репозитории под MIT (см. раздел «Канал обновлений» выше) — платное здесь то, что канал
211
+ доставляет: лицензия, содержимое паттернов и подписанные бинари.
212
+ Подробнее — на [bpmkit.pro](https://bpmkit.pro).
213
+
214
+ ## Лицензия
215
+
216
+ [MIT](LICENSE) © Владимир Терновский
217
+
218
+ ---
219
+
220
+ <div align="center">
221
+ <sub>Часть экосистемы <a href="https://bpmkit.pro">BPMkit</a> — AI-ассистента для разработки на BPMSoft.</sub>
222
+ </div>