standkit 0.5.0__tar.gz → 0.5.2__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.
- {standkit-0.5.0 → standkit-0.5.2}/LICENSE +21 -21
- {standkit-0.5.0 → standkit-0.5.2}/MANIFEST.in +5 -5
- {standkit-0.5.0/standkit.egg-info → standkit-0.5.2}/PKG-INFO +157 -158
- {standkit-0.5.0 → standkit-0.5.2}/README.md +133 -133
- {standkit-0.5.0 → standkit-0.5.2}/SECURITY.md +119 -119
- {standkit-0.5.0 → standkit-0.5.2}/docs/ARCHITECTURE.md +111 -111
- {standkit-0.5.0 → standkit-0.5.2}/docs/HOSTING.md +183 -165
- {standkit-0.5.0 → standkit-0.5.2}/docs/REMOTE_STANDS.md +271 -271
- {standkit-0.5.0 → standkit-0.5.2}/docs/adr/0001-hosting-backends.md +144 -144
- {standkit-0.5.0 → standkit-0.5.2}/docs/adr/0002-k8s-backend.md +51 -51
- {standkit-0.5.0 → standkit-0.5.2}/projects.sample.json +167 -167
- {standkit-0.5.0 → standkit-0.5.2}/pyproject.toml +55 -55
- {standkit-0.5.0 → standkit-0.5.2}/setup.cfg +4 -4
- {standkit-0.5.0 → standkit-0.5.2}/standkit/__init__.py +11 -11
- {standkit-0.5.0 → standkit-0.5.2}/standkit/health.py +183 -179
- {standkit-0.5.0 → standkit-0.5.2}/standkit/hosting.py +596 -524
- {standkit-0.5.0 → standkit-0.5.2}/standkit/lifecycle.py +277 -269
- {standkit-0.5.0 → standkit-0.5.2}/standkit/logs.py +233 -221
- {standkit-0.5.0 → standkit-0.5.2}/standkit/models.py +273 -273
- {standkit-0.5.0 → standkit-0.5.2}/standkit/platform.py +165 -174
- {standkit-0.5.0 → standkit-0.5.2}/standkit/registry.py +227 -223
- {standkit-0.5.0 → standkit-0.5.2}/standkit/secrets.py +139 -144
- {standkit-0.5.0 → standkit-0.5.2/standkit.egg-info}/PKG-INFO +157 -158
- {standkit-0.5.0 → standkit-0.5.2}/standkit_agent/__init__.py +9 -9
- {standkit-0.5.0 → standkit-0.5.2}/standkit_agent/__main__.py +192 -192
- {standkit-0.5.0 → standkit-0.5.2}/standkit_agent/audit.py +93 -93
- {standkit-0.5.0 → standkit-0.5.2}/standkit_agent/security.py +300 -300
- {standkit-0.5.0 → standkit-0.5.2}/standkit_agent/server.py +383 -386
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/__init__.py +13 -13
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/__main__.py +146 -131
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/agent_control.py +216 -216
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/assets/bpmkit-icon.ico +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/assets/icon.png +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/client.py +157 -159
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/config.py +169 -156
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/logs_browser.py +197 -174
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/redis_min.py +326 -326
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/security.py +146 -146
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/server.py +1049 -1031
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/shortcut.py +264 -264
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/app.js +992 -921
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/bpmkit-logo-dark.svg +5 -5
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/bpmkit-logo.svg +5 -5
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/favicon.png +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/favicon.svg +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/index.html +398 -387
- {standkit-0.5.0 → standkit-0.5.2}/standkit_hub/web/style.css +953 -911
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_agent_security.py +303 -303
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_agent_server_integration.py +192 -192
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_health.py +146 -146
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hosting.py +876 -772
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_agent_control.py +192 -192
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_config.py +153 -140
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_logs_browser.py +301 -238
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_redis_min.py +247 -247
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_register.py +298 -298
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_server.py +1002 -1002
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_hub_shortcut.py +203 -203
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_lifecycle.py +153 -126
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_logs.py +220 -205
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_models.py +212 -212
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_registry.py +95 -78
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_registry_resolver.py +140 -140
- {standkit-0.5.0 → standkit-0.5.2}/tests/test_secrets.py +106 -106
- {standkit-0.5.0 → standkit-0.5.2}/standkit.egg-info/SOURCES.txt +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit.egg-info/dependency_links.txt +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit.egg-info/entry_points.txt +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit.egg-info/requires.txt +0 -0
- {standkit-0.5.0 → standkit-0.5.2}/standkit.egg-info/top_level.txt +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,158 +1,157 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: standkit
|
|
3
|
-
Version: 0.5.
|
|
4
|
-
Summary: Свободное ядро (MIT) для управления жизненным циклом локальных и удалённых стендов BPMSoft: headless start/stop/restart, health-пробы, логи, реестр стендов. Часть экосистемы BPMkit.
|
|
5
|
-
Author: standkit contributors
|
|
6
|
-
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/thinkquattro/BPMkitStand
|
|
8
|
-
Project-URL: Экосистема BPMkit, https://github.com/thinkquattro/BPMkit-dev
|
|
9
|
-
Classifier:
|
|
10
|
-
Classifier: Programming Language :: Python :: 3
|
|
11
|
-
Classifier:
|
|
12
|
-
Classifier:
|
|
13
|
-
Classifier:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
[](LICENSE)
|
|
35
|
+
[](https://www.python.org/)
|
|
36
|
+
[]()
|
|
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
|
+
- **Безопасность по умолчанию** — дашборд слушает только `127.0.0.1`, сессионный токен, защита мутаций (CSRF + проверка Origin).
|
|
62
|
+
- **Удалённые стенды** *(в развитии)* — через лёгкие кроссплатформенные headless-агенты с TLS/mTLS.
|
|
63
|
+
|
|
64
|
+
## Скриншоты
|
|
65
|
+
|
|
66
|
+
| Дашборд (светлая тема) | Дашборд (тёмная тема) |
|
|
67
|
+
|---|---|
|
|
68
|
+
|  |  |
|
|
69
|
+
|
|
70
|
+
<div align="center">
|
|
71
|
+
<img src="https://raw.githubusercontent.com/thinkquattro/BPMkitStand/main/docs/img/about.png" alt="Модальное окно «О программе»" width="360"/>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
## Как это работает
|
|
75
|
+
|
|
76
|
+
BPMkitStand состоит из **ядра и двух оболочек**:
|
|
77
|
+
|
|
78
|
+
- **`standkit`** — ядро (MIT) на чистой стандартной библиотеке Python: движок жизненного цикла
|
|
79
|
+
над реестром `projects.json` (старт/стоп/рестарт процесса стенда), health-пробы (процесс / HTTP
|
|
80
|
+
/ порт БД / порт Redis), tail лога, Secret-first доступ к секретам. Без веб-слоя и сетевых
|
|
81
|
+
зависимостей — можно использовать и как библиотеку/CLI.
|
|
82
|
+
- **`standkit_hub`** — локальный веб-дашборд (то, что видно на скриншотах). Сам себя отдаёт по
|
|
83
|
+
HTTP через `stdlib http.server` (vanilla JS/CSS, без CDN и сборки) и открывается в системном
|
|
84
|
+
браузере; опционально — в нативном окне (`standkit[desktop]`, `--desktop`). Устанавливается
|
|
85
|
+
только на машину оператора.
|
|
86
|
+
- **`standkit_agent`** — лёгкий headless-демон на хосте удалённого стенда (см. ниже).
|
|
87
|
+
|
|
88
|
+
Дашборд — **федеративный клиент**: он собирает в один список и локальные стенды (управляет ими
|
|
89
|
+
напрямую через ядро), и удалённые (ходит к их агентам по HTTP). В таблице колонка «Транспорт»
|
|
90
|
+
показывает, как дашборд дотягивается до стенда: `local` или `agent`.
|
|
91
|
+
|
|
92
|
+
Реестр стендов — **единый с MCP BPMkit**: один `projects.json` (стенды под ключом `projects`),
|
|
93
|
+
путь резолвится через `BPMSOFT_PROJECTS_FILE` → `%APPDATA%\BPMkit\projects.json`
|
|
94
|
+
(`~/.config/BPMkit/...` на Linux) → `./projects.json`. Секреты (пароли БД, токены агентов) в
|
|
95
|
+
реестре не хранятся — только ссылки на них (Secret-first).
|
|
96
|
+
|
|
97
|
+
Запуск стенда честный: дашборд поднимает `dotnet <stand_dll>` и держит спиннер до реального
|
|
98
|
+
ответа web-хоста по HTTP, а не рапортует «запущено» по факту создания процесса.
|
|
99
|
+
|
|
100
|
+
Виды хостинга (kestrel/iis/docker) — см. [docs/HOSTING.md](docs/HOSTING.md).
|
|
101
|
+
|
|
102
|
+
## Удалённые стенды
|
|
103
|
+
|
|
104
|
+
Стенды на других хостах (виртуалки, серверы, контуры заказчика) управляются через **федерацию
|
|
105
|
+
лёгких кроссплатформенных агентов** (`standkit_agent`, Windows/Linux, только stdlib). На хосте
|
|
106
|
+
стенда поднимается агент, дашборд оператора ходит к нему по HTTPS с Bearer-токеном; стенд
|
|
107
|
+
объявляется удалённым одним полем `transport: "agent"` в реестре. Агент — RCE-поверхность по
|
|
108
|
+
дизайну, поэтому защищён secure-defaults: loopback по умолчанию, fail-closed на non-loopback без
|
|
109
|
+
TLS, TLS 1.2+/mTLS, скоупы control/readonly, lockout по IP, аудит.
|
|
110
|
+
|
|
111
|
+
**Полное описание, установка агента, TLS/mTLS, служба и траблшутинг — в
|
|
112
|
+
[docs/REMOTE_STANDS.md](docs/REMOTE_STANDS.md).**
|
|
113
|
+
|
|
114
|
+
## Установка
|
|
115
|
+
|
|
116
|
+
Нужен Python 3.10+.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
pip install "git+https://github.com/thinkquattro/BPMkitStand.git"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Запуск дашборда:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
standkit-hub
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Откроется браузер с локальным дашбордом. Реестр стендов берётся из
|
|
129
|
+
`%APPDATA%\BPMkit\projects.json` (или из переменной окружения `BPMSOFT_PROJECTS_FILE`).
|
|
130
|
+
|
|
131
|
+
## Реестр стендов
|
|
132
|
+
|
|
133
|
+
BPMkitStand использует тот же реестр, что и MCP BPMkit — единый `projects.json`.
|
|
134
|
+
Образец формата — [`projects.sample.json`](projects.sample.json). Стенд можно
|
|
135
|
+
зарегистрировать прямо из дашборда (кнопка «Зарегистрировать стенд»).
|
|
136
|
+
|
|
137
|
+
## Безопасность
|
|
138
|
+
|
|
139
|
+
Дашборд и агент проектировались с расчётом на прод-контур. Модель угроз, харденинг и чек-лист —
|
|
140
|
+
в [SECURITY.md](SECURITY.md). Кратко: fail-closed bind на loopback, TLS 1.2+/mTLS для агента,
|
|
141
|
+
скоупы токена, per-IP lockout, аудит без утечки секретов.
|
|
142
|
+
|
|
143
|
+
## BPMkitStand и Companion
|
|
144
|
+
|
|
145
|
+
Бесплатная версия — полноценный диспетчер стендов. **Companion-версия** дополнительно даёт
|
|
146
|
+
автообновление MCP BPMkit и контроль лицензии; поставляется в составе установщика MCP-клиента.
|
|
147
|
+
Подробнее — на [bpmkit.pro](https://bpmkit.pro).
|
|
148
|
+
|
|
149
|
+
## Лицензия
|
|
150
|
+
|
|
151
|
+
[MIT](LICENSE) © Владимир Терновский
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
<div align="center">
|
|
156
|
+
<sub>Часть экосистемы <a href="https://bpmkit.pro">BPMkit</a> — AI-ассистента для разработки на BPMSoft.</sub>
|
|
157
|
+
</div>
|