standkit 0.7.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 (126) hide show
  1. {standkit-0.7.0 → standkit-0.9.0}/LICENSE +21 -21
  2. {standkit-0.7.0 → standkit-0.9.0}/MANIFEST.in +5 -5
  3. {standkit-0.7.0/standkit.egg-info → standkit-0.9.0}/PKG-INFO +222 -175
  4. {standkit-0.7.0 → standkit-0.9.0}/README.md +198 -151
  5. {standkit-0.7.0 → standkit-0.9.0}/SECURITY.md +251 -153
  6. standkit-0.9.0/docs/ARCHITECTURE.md +304 -0
  7. {standkit-0.7.0 → standkit-0.9.0}/docs/BACKLOG.md +131 -112
  8. {standkit-0.7.0 → standkit-0.9.0}/docs/CHANGELOG.md +634 -344
  9. standkit-0.9.0/docs/COOKBOOK_LINUX.md +1199 -0
  10. standkit-0.9.0/docs/GAPs/GAP-001-registry-fields-out-of-hub-form.md +70 -0
  11. standkit-0.9.0/docs/GAPs/GAP-002-http-probe-down-not-explained.md +72 -0
  12. standkit-0.9.0/docs/GAPs/GAP-003-redis-endpoint-in-extra.md +79 -0
  13. standkit-0.9.0/docs/GAPs/GAP-004-cookbook-hub-register-form.md +81 -0
  14. standkit-0.9.0/docs/GAPs/GAP-005-cookbook-hub-side-secrets.md +68 -0
  15. standkit-0.9.0/docs/GAPs/GAP-006-log-dir-case-and-separator.md +101 -0
  16. standkit-0.9.0/docs/GAPs/GAP-007-agent-paths-raw-traceback.md +92 -0
  17. standkit-0.9.0/docs/GAPs/GAP-008-agent-cert-trust-on-hub.md +80 -0
  18. standkit-0.9.0/docs/GAPs/README.md +57 -0
  19. {standkit-0.7.0 → standkit-0.9.0}/docs/HOSTING.md +184 -183
  20. standkit-0.9.0/docs/README.md +66 -0
  21. {standkit-0.7.0 → standkit-0.9.0}/docs/REMOTE_STANDS.md +358 -352
  22. {standkit-0.7.0 → standkit-0.9.0}/docs/ROADMAP.md +95 -69
  23. {standkit-0.7.0 → standkit-0.9.0}/docs/adr/0001-hosting-backends.md +144 -144
  24. {standkit-0.7.0 → standkit-0.9.0}/docs/adr/0002-k8s-backend.md +51 -51
  25. {standkit-0.7.0 → standkit-0.9.0}/docs/adr/0003-remote-log-browsing.md +63 -63
  26. {standkit-0.7.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.9.0/docs/research/companion-v2-cicd-thin-agent.md +101 -0
  29. {standkit-0.7.0 → standkit-0.9.0}/projects.sample.json +185 -173
  30. {standkit-0.7.0 → standkit-0.9.0}/pyproject.toml +55 -55
  31. {standkit-0.7.0 → standkit-0.9.0}/setup.cfg +4 -4
  32. {standkit-0.7.0 → standkit-0.9.0}/standkit/__init__.py +11 -11
  33. {standkit-0.7.0 → standkit-0.9.0}/standkit/adopt.py +704 -704
  34. standkit-0.9.0/standkit/health.py +556 -0
  35. {standkit-0.7.0 → standkit-0.9.0}/standkit/hosting.py +1498 -1492
  36. {standkit-0.7.0 → standkit-0.9.0}/standkit/lifecycle.py +424 -424
  37. {standkit-0.7.0 → standkit-0.9.0}/standkit/logs.py +409 -233
  38. {standkit-0.7.0 → standkit-0.9.0}/standkit/models.py +422 -310
  39. {standkit-0.7.0 → standkit-0.9.0}/standkit/platform.py +309 -309
  40. {standkit-0.7.0 → standkit-0.9.0}/standkit/registry.py +227 -227
  41. {standkit-0.7.0 → standkit-0.9.0}/standkit/secrets.py +139 -139
  42. {standkit-0.7.0 → standkit-0.9.0/standkit.egg-info}/PKG-INFO +222 -175
  43. {standkit-0.7.0 → standkit-0.9.0}/standkit.egg-info/SOURCES.txt +36 -0
  44. {standkit-0.7.0 → standkit-0.9.0}/standkit.egg-info/top_level.txt +1 -0
  45. {standkit-0.7.0 → standkit-0.9.0}/standkit_agent/__init__.py +9 -9
  46. standkit-0.9.0/standkit_agent/__main__.py +487 -0
  47. {standkit-0.7.0 → standkit-0.9.0}/standkit_agent/audit.py +93 -93
  48. {standkit-0.7.0 → standkit-0.9.0}/standkit_agent/security.py +303 -303
  49. {standkit-0.7.0 → standkit-0.9.0}/standkit_agent/server.py +490 -416
  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.7.0 → standkit-0.9.0}/standkit_hub/__init__.py +13 -13
  64. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/__main__.py +187 -187
  65. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/agent_control.py +216 -216
  66. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/client.py +411 -225
  67. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/config.py +344 -200
  68. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/logs_browser.py +445 -338
  69. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/poller.py +228 -228
  70. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/redis_min.py +326 -326
  71. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/security.py +146 -146
  72. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/server.py +2388 -1871
  73. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/shortcut.py +269 -269
  74. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/app.js +2194 -1657
  75. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/bpmkit-logo-dark.svg +5 -5
  76. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/bpmkit-logo.svg +5 -5
  77. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/cookbook.html +2827 -1868
  78. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/favicon.svg +4 -4
  79. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/index.html +775 -478
  80. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/manifest.webmanifest +41 -41
  81. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/web/style.css +1512 -1289
  82. {standkit-0.7.0 → standkit-0.9.0}/tests/test_adopt.py +404 -404
  83. {standkit-0.7.0 → standkit-0.9.0}/tests/test_agent_security.py +303 -303
  84. {standkit-0.7.0 → standkit-0.9.0}/tests/test_agent_server_integration.py +192 -192
  85. standkit-0.9.0/tests/test_agent_startup_preflight.py +842 -0
  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.9.0/tests/test_health.py +728 -0
  94. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hosting.py +1475 -1406
  95. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_agent_control.py +192 -192
  96. standkit-0.9.0/tests/test_hub_client_tls.py +403 -0
  97. standkit-0.9.0/tests/test_hub_companion_api.py +788 -0
  98. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_config.py +153 -153
  99. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_fast_paint.py +462 -462
  100. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_logs_browser.py +552 -344
  101. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_pwa_and_compact.py +220 -220
  102. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_redis_min.py +247 -247
  103. standkit-0.9.0/tests/test_hub_register.py +597 -0
  104. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_server.py +1144 -1144
  105. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_shortcut.py +218 -218
  106. {standkit-0.7.0 → standkit-0.9.0}/tests/test_hub_single_instance.py +200 -200
  107. {standkit-0.7.0 → standkit-0.9.0}/tests/test_lifecycle.py +364 -364
  108. standkit-0.9.0/tests/test_logs.py +490 -0
  109. standkit-0.9.0/tests/test_models.py +477 -0
  110. {standkit-0.7.0 → standkit-0.9.0}/tests/test_no_window.py +311 -298
  111. {standkit-0.7.0 → standkit-0.9.0}/tests/test_registry.py +95 -95
  112. {standkit-0.7.0 → standkit-0.9.0}/tests/test_registry_resolver.py +140 -140
  113. {standkit-0.7.0 → standkit-0.9.0}/tests/test_secrets.py +106 -106
  114. standkit-0.7.0/docs/ARCHITECTURE.md +0 -123
  115. standkit-0.7.0/standkit/health.py +0 -267
  116. standkit-0.7.0/standkit_agent/__main__.py +0 -192
  117. standkit-0.7.0/tests/test_health.py +0 -319
  118. standkit-0.7.0/tests/test_hub_register.py +0 -298
  119. standkit-0.7.0/tests/test_logs.py +0 -220
  120. standkit-0.7.0/tests/test_models.py +0 -258
  121. {standkit-0.7.0 → standkit-0.9.0}/standkit.egg-info/dependency_links.txt +0 -0
  122. {standkit-0.7.0 → standkit-0.9.0}/standkit.egg-info/entry_points.txt +0 -0
  123. {standkit-0.7.0 → standkit-0.9.0}/standkit.egg-info/requires.txt +0 -0
  124. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/assets/bpmkit-icon.ico +0 -0
  125. {standkit-0.7.0 → standkit-0.9.0}/standkit_hub/assets/icon.png +0 -0
  126. {standkit-0.7.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,175 +1,222 @@
1
- Metadata-Version: 2.4
2
- Name: standkit
3
- Version: 0.7.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`. Свежий `main` до релиза (если нужна ещё не выпущенная
124
- правка) — `pip install --force-reinstall "git+https://github.com/thinkquattro/BPMkitStand.git"`.
125
-
126
- Запуск дашборда:
127
-
128
- ```bash
129
- standkit-hub
130
- ```
131
-
132
- Откроется браузер с локальным дашбордом. Реестр стендов берётся из
133
- `%APPDATA%\BPMkit\projects.json` (или из переменной окружения `BPMSOFT_PROJECTS_FILE`).
134
-
135
- ## Реестр стендов
136
-
137
- BPMkitStand использует тот же реестр, что и MCP BPMkit — единый `projects.json`.
138
- Образец формата — [`projects.sample.json`](projects.sample.json). Стенд можно
139
- зарегистрировать прямо из дашборда (кнопка «Зарегистрировать стенд»).
140
-
141
- ## Безопасность
142
-
143
- Дашборд и агент проектировались с расчётом на прод-контур. Модель угроз, харденинг и чек-лист —
144
- в [SECURITY.md](SECURITY.md). Кратко: fail-closed bind на loopback, TLS 1.2+/mTLS для агента,
145
- скоупы токена, per-IP lockout, аудит без утечки секретов.
146
-
147
- ## Документация проекта
148
-
149
- - [standkit_hub/web/cookbook.html](standkit_hub/web/cookbook.html) — **кукбук**: обзор, установка (отдельно Windows и Linux), обновление, дашборд, реестр стендов, виды хостинга, удалённые стенды и агент-демон, безопасность, траблшутинг. Один standalone-файл: в работающем диспетчере открывается кнопкой «?» в шапке, без него — прямо с диска в браузере.
150
- - [docs/ROADMAP.md](docs/ROADMAP.md) — дорожная карта приложения (что сделано / ближайшее / бэклог).
151
- - [docs/CHANGELOG.md](docs/CHANGELOG.md) — история изменений по версиям.
152
- - [docs/BACKLOG.md](docs/BACKLOG.md) — честный список «упомянуто в коде, но не реализовано» (заделы/заглушки) со ссылками на код.
153
- - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · [docs/HOSTING.md](docs/HOSTING.md) · [docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md) · [SECURITY.md](SECURITY.md)
154
- - Решения (ADR): [0001 — hosting backends](docs/adr/0001-hosting-backends.md) · [0002 — k8s backend](docs/adr/0002-k8s-backend.md) · [0003 — браузинг логов удалённых стендов (предложено)](docs/adr/0003-remote-log-browsing.md) · [0004 — IIS: жизненный цикл по Site](docs/adr/0004-iis-site-scoped-lifecycle.md)
155
-
156
- > Статус: `standkit` — молодой проект (0.5.x). Ядро/агент/хаб работоспособны, но
157
- > ряд возможностей — это **каркас/заделы** (например, глубокие пробы БД/Redis,
158
- > транспорты ssh/winrm, живая приёмка Docker/k8s/IIS). Что именно ещё не
159
- > дописано — прозрачно перечислено в [docs/BACKLOG.md](docs/BACKLOG.md).
160
-
161
- ## BPMkitStand и Companion
162
-
163
- Бесплатная версия — полноценный диспетчер стендов. **Companion-версия** дополнительно даёт
164
- автообновление MCP BPMkit и контроль лицензии; поставляется в составе установщика MCP-клиента.
165
- Подробнее — на [bpmkit.pro](https://bpmkit.pro).
166
-
167
- ## Лицензия
168
-
169
- [MIT](LICENSE) © Владимир Терновский
170
-
171
- ---
172
-
173
- <div align="center">
174
- <sub>Часть экосистемы <a href="https://bpmkit.pro">BPMkit</a> — AI-ассистента для разработки на BPMSoft.</sub>
175
- </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>