mlspace-plugin 0.2.1__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. mlspace_plugin-0.2.1/.env.example +43 -0
  2. mlspace_plugin-0.2.1/.gitignore +53 -0
  3. mlspace_plugin-0.2.1/AGENTS.md +10 -0
  4. mlspace_plugin-0.2.1/CONTRIBUTING.md +59 -0
  5. mlspace_plugin-0.2.1/INSTALL.md +110 -0
  6. mlspace_plugin-0.2.1/INSTALL_AGENT.md +56 -0
  7. mlspace_plugin-0.2.1/LICENSE +21 -0
  8. mlspace_plugin-0.2.1/PKG-INFO +427 -0
  9. mlspace_plugin-0.2.1/README.md +376 -0
  10. mlspace_plugin-0.2.1/RELEASE.md +41 -0
  11. mlspace_plugin-0.2.1/plugin/.claude-plugin/plugin.json +18 -0
  12. mlspace_plugin-0.2.1/plugin/.codex-plugin/plugin.json +24 -0
  13. mlspace_plugin-0.2.1/plugin/.mcp.json +15 -0
  14. mlspace_plugin-0.2.1/plugin/README.md +119 -0
  15. mlspace_plugin-0.2.1/plugin/mcp.json +19 -0
  16. mlspace_plugin-0.2.1/plugin/plugin.json +19 -0
  17. mlspace_plugin-0.2.1/plugin/skills/mlspace-call-deployed-model-predict/SKILL.md +36 -0
  18. mlspace_plugin-0.2.1/plugin/skills/mlspace-deploy-inference-service/SKILL.md +42 -0
  19. mlspace_plugin-0.2.1/plugin/skills/mlspace-diagnose-data-transfer/SKILL.md +41 -0
  20. mlspace_plugin-0.2.1/plugin/skills/mlspace-diagnose-failed-training-job/SKILL.md +64 -0
  21. mlspace_plugin-0.2.1/plugin/skills/mlspace-diagnose-job-launch-rejection/SKILL.md +44 -0
  22. mlspace_plugin-0.2.1/plugin/skills/mlspace-diagnose-unhealthy-inference/SKILL.md +40 -0
  23. mlspace_plugin-0.2.1/plugin/skills/mlspace-discover-launchable-resources/SKILL.md +45 -0
  24. mlspace_plugin-0.2.1/plugin/skills/mlspace-launch-training-job/SKILL.md +66 -0
  25. mlspace_plugin-0.2.1/plugin/skills/mlspace-list-running-jobs/SKILL.md +43 -0
  26. mlspace_plugin-0.2.1/plugin/skills/mlspace-resume-notebook-and-set-autoshutdown/SKILL.md +44 -0
  27. mlspace_plugin-0.2.1/plugin/skills/mlspace-stage-s3-to-nfs/SKILL.md +45 -0
  28. mlspace_plugin-0.2.1/plugin/skills/mlspace-transfer-compute-node/SKILL.md +63 -0
  29. mlspace_plugin-0.2.1/pyproject.toml +80 -0
  30. mlspace_plugin-0.2.1/scripts/build_plugin.py +100 -0
  31. mlspace_plugin-0.2.1/scripts/demo_multi_workspace.py +202 -0
  32. mlspace_plugin-0.2.1/scripts/gen_body_schemas.py +98 -0
  33. mlspace_plugin-0.2.1/scripts/gen_plugin.py +139 -0
  34. mlspace_plugin-0.2.1/scripts/mcp_call.py +63 -0
  35. mlspace_plugin-0.2.1/scripts/serve_stdio.sh +9 -0
  36. mlspace_plugin-0.2.1/scripts/serve_stdio_dryrun.sh +11 -0
  37. mlspace_plugin-0.2.1/src/mlspace_mcp/__init__.py +3 -0
  38. mlspace_plugin-0.2.1/src/mlspace_mcp/__main__.py +125 -0
  39. mlspace_plugin-0.2.1/src/mlspace_mcp/_status.py +18 -0
  40. mlspace_plugin-0.2.1/src/mlspace_mcp/auth.py +109 -0
  41. mlspace_plugin-0.2.1/src/mlspace_mcp/bodyspec.py +184 -0
  42. mlspace_plugin-0.2.1/src/mlspace_mcp/client.py +170 -0
  43. mlspace_plugin-0.2.1/src/mlspace_mcp/client_setup.py +235 -0
  44. mlspace_plugin-0.2.1/src/mlspace_mcp/config.py +283 -0
  45. mlspace_plugin-0.2.1/src/mlspace_mcp/errors.py +241 -0
  46. mlspace_plugin-0.2.1/src/mlspace_mcp/formatting.py +502 -0
  47. mlspace_plugin-0.2.1/src/mlspace_mcp/init_cli.py +356 -0
  48. mlspace_plugin-0.2.1/src/mlspace_mcp/job_hooks.py +242 -0
  49. mlspace_plugin-0.2.1/src/mlspace_mcp/jsonc.py +90 -0
  50. mlspace_plugin-0.2.1/src/mlspace_mcp/overview.py +421 -0
  51. mlspace_plugin-0.2.1/src/mlspace_mcp/registry.py +632 -0
  52. mlspace_plugin-0.2.1/src/mlspace_mcp/resource_refs.py +188 -0
  53. mlspace_plugin-0.2.1/src/mlspace_mcp/server.py +190 -0
  54. mlspace_plugin-0.2.1/src/mlspace_mcp/setup_ui.py +103 -0
  55. mlspace_plugin-0.2.1/src/mlspace_mcp/spec/body_schemas.json +7506 -0
  56. mlspace_plugin-0.2.1/src/mlspace_mcp/spec/openapi.json +28347 -0
  57. mlspace_plugin-0.2.1/src/mlspace_mcp/tls.py +46 -0
  58. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/__init__.py +1 -0
  59. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/allocations.py +92 -0
  60. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/async_inference.py +77 -0
  61. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/build_image.py +76 -0
  62. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/dalle.py +52 -0
  63. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/data_transfer.py +260 -0
  64. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/docker_registry.py +156 -0
  65. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/inference.py +88 -0
  66. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/jobs.py +155 -0
  67. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/notebooks.py +174 -0
  68. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/queues.py +202 -0
  69. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/resources.py +86 -0
  70. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/tensorboards.py +112 -0
  71. mlspace_plugin-0.2.1/src/mlspace_mcp/tools/workspaces.py +92 -0
  72. mlspace_plugin-0.2.1/src/mlspace_mcp/workspace_context.py +107 -0
  73. mlspace_plugin-0.2.1/tests/conftest.py +51 -0
  74. mlspace_plugin-0.2.1/tests/specutil.py +66 -0
  75. mlspace_plugin-0.2.1/tests/test_allocations.py +23 -0
  76. mlspace_plugin-0.2.1/tests/test_artifact_sync.py +33 -0
  77. mlspace_plugin-0.2.1/tests/test_async_inference.py +20 -0
  78. mlspace_plugin-0.2.1/tests/test_auth.py +64 -0
  79. mlspace_plugin-0.2.1/tests/test_autofill.py +74 -0
  80. mlspace_plugin-0.2.1/tests/test_bodyspec.py +198 -0
  81. mlspace_plugin-0.2.1/tests/test_build_image.py +19 -0
  82. mlspace_plugin-0.2.1/tests/test_client.py +118 -0
  83. mlspace_plugin-0.2.1/tests/test_client_setup.py +233 -0
  84. mlspace_plugin-0.2.1/tests/test_configs_shrink.py +150 -0
  85. mlspace_plugin-0.2.1/tests/test_dalle.py +25 -0
  86. mlspace_plugin-0.2.1/tests/test_data_transfer.py +42 -0
  87. mlspace_plugin-0.2.1/tests/test_docker_registry.py +63 -0
  88. mlspace_plugin-0.2.1/tests/test_drift.py +113 -0
  89. mlspace_plugin-0.2.1/tests/test_dry_run.py +74 -0
  90. mlspace_plugin-0.2.1/tests/test_dry_run_fidelity.py +87 -0
  91. mlspace_plugin-0.2.1/tests/test_env_file.py +415 -0
  92. mlspace_plugin-0.2.1/tests/test_errors.py +109 -0
  93. mlspace_plugin-0.2.1/tests/test_false_success.py +138 -0
  94. mlspace_plugin-0.2.1/tests/test_formatting.py +167 -0
  95. mlspace_plugin-0.2.1/tests/test_init_cli.py +90 -0
  96. mlspace_plugin-0.2.1/tests/test_integration.py +114 -0
  97. mlspace_plugin-0.2.1/tests/test_job_status.py +73 -0
  98. mlspace_plugin-0.2.1/tests/test_jobs.py +20 -0
  99. mlspace_plugin-0.2.1/tests/test_log_normalisation.py +92 -0
  100. mlspace_plugin-0.2.1/tests/test_mcp_error_contract.py +109 -0
  101. mlspace_plugin-0.2.1/tests/test_notebooks.py +20 -0
  102. mlspace_plugin-0.2.1/tests/test_onboarding_init.py +210 -0
  103. mlspace_plugin-0.2.1/tests/test_onboarding_tls.py +75 -0
  104. mlspace_plugin-0.2.1/tests/test_overview.py +261 -0
  105. mlspace_plugin-0.2.1/tests/test_plugin_bundle.py +208 -0
  106. mlspace_plugin-0.2.1/tests/test_plugin_cli.py +34 -0
  107. mlspace_plugin-0.2.1/tests/test_plugin_release.py +74 -0
  108. mlspace_plugin-0.2.1/tests/test_preflight.py +157 -0
  109. mlspace_plugin-0.2.1/tests/test_queue_scope.py +225 -0
  110. mlspace_plugin-0.2.1/tests/test_queues.py +24 -0
  111. mlspace_plugin-0.2.1/tests/test_registry.py +184 -0
  112. mlspace_plugin-0.2.1/tests/test_resource_refs.py +228 -0
  113. mlspace_plugin-0.2.1/tests/test_resources.py +23 -0
  114. mlspace_plugin-0.2.1/tests/test_route_confusion.py +184 -0
  115. mlspace_plugin-0.2.1/tests/test_setup_ui.py +84 -0
  116. mlspace_plugin-0.2.1/tests/test_skills.py +151 -0
  117. mlspace_plugin-0.2.1/tests/test_tensorboards.py +20 -0
  118. mlspace_plugin-0.2.1/tests/test_workspace_context.py +195 -0
  119. mlspace_plugin-0.2.1/tests/test_workspaces.py +21 -0
  120. mlspace_plugin-0.2.1/tests/test_wrapper_hardening.py +156 -0
@@ -0,0 +1,43 @@
1
+ # mlspace-plugin configuration — copy to a private file and select it via MLSPACE_ENV_FILE.
2
+ # Cloud.ru Key ID and Key Secret: console profile → Access keys.
3
+ # Workspace x-api-key: MLSpace profile → Develop; setup resolves it automatically.
4
+ #
5
+ # Easier: `mlspace-plugin setup` discovers workspaces and saves your selected set in
6
+ # ~/.config/mlspace-plugin/.env (mode 600) for you. Search order, least specific first:
7
+ # ~/.config/mlspace-plugin/.env -> $MLSPACE_ENV_FILE -> the environment
8
+
9
+ # --- shared Cloud.ru access-key credentials ---
10
+ MLSPACE_CLIENT_ID= # Key ID
11
+ MLSPACE_CLIENT_SECRET= # Key Secret
12
+
13
+ # --- legacy singleton (used when no selected catalogue is configured) ---
14
+ MLSPACE_WORKSPACE_ID= # x-workspace-id
15
+ # MLSPACE_API_KEY= # optional workspace x-api-key; fetched automatically when unset
16
+
17
+ # setup writes MLSPACE_WORKSPACES as JSON: a fixed selected set, no default workspace.
18
+ # IDs must be nonblank and unique. Per-workspace keys may be resolved lazily.
19
+ # Example metadata only; use setup to configure real access, never commit credentials.
20
+ # MLSPACE_WORKSPACES='[{"id":"workspace-a","name":"A","project_name":"Project"}]'
21
+ # setup --base-url https://your-api.example saves a nonstandard endpoint; re-setup
22
+ # preserves the saved endpoint unless explicitly overridden. Production is the default.
23
+
24
+ # --- optional (defaults shown) ---
25
+ # Name a credentials file outright; it outranks the user config. Set this
26
+ # in the environment, not here — it is what points AT a file. The Agent Plugins bundle
27
+ # sets it to ${PLUGIN_DATA}/.env so per-install credentials survive plugin updates.
28
+ # MLSPACE_ENV_FILE=/path/to/.env
29
+ MLSPACE_BASE_URL=https://api.ai.cloud.ru
30
+ MLSPACE_READONLY=false # true hides and blocks all 58 write actions
31
+ # when writes are enabled, destructive actions
32
+ # additionally require confirm=true
33
+ MLSPACE_TRANSPORT=streamable-http # streamable-http | stdio
34
+ MLSPACE_HOST=127.0.0.1 # loopback only (no server-side auth in v1)
35
+ MLSPACE_PORT=8000
36
+ MLSPACE_TIMEOUT=60
37
+ # MLSPACE_ENABLED_DOMAINS=inference,jobs,notebooks # empty = all 13 domains
38
+ # MLSPACE_LIST_DEFAULT_LIMIT=50
39
+ # MLSPACE_LIST_MAX_LIMIT=200
40
+ # MLSPACE_LOG_TAIL_LINES=200
41
+
42
+ # Optional trusted corporate CA PEM; setup copies it for persistent runtime use.
43
+ # MLSPACE_CA_FILE=/absolute/path/to/corporate-ca.pem
@@ -0,0 +1,53 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+
11
+ # Tooling
12
+ .pytest_cache/
13
+ .mypy_cache/
14
+ .ruff_cache/
15
+ .coverage
16
+ htmlcov/
17
+
18
+ # Env / secrets
19
+ .env
20
+ .env.*
21
+ !.env.example
22
+ *.secret
23
+
24
+ # OS
25
+ .DS_Store
26
+
27
+ # Local audit harnesses & artifacts (not part of the shipped product)
28
+ scripts/write_audit.py
29
+ scripts/api_audit.py
30
+ scripts/coverage_probe.py
31
+ docs/_*.json
32
+ docs/_*.png
33
+ _planning/api_evidence.txt
34
+ _planning/api_critique_and_prompts.json
35
+
36
+ # Agent worktrees (local scratch, never part of the product)
37
+ .claude/
38
+ .superpowers/
39
+
40
+ # Internal audit & planning artefacts (not part of the published server)
41
+ audit/
42
+ after_audit/
43
+ _planning/
44
+ docs/proposals/
45
+ docs/superpowers/
46
+ docs/DESIGN.md
47
+ docs/MLSPACE_API_*.md
48
+ docs/LLM_FRIENDLINESS_AUDIT.md
49
+ docs/E2E_TEST_REPORT.md
50
+ docs/EXEC_SUMMARY.md
51
+ docs/article_*.md
52
+ docs/slides*.md
53
+ docs/_*.json
@@ -0,0 +1,10 @@
1
+ # MLSpace MCP
2
+
3
+ Если пользователь просит **установить или настроить** этот MCP, сначала прочитайте
4
+ [INSTALL_AGENT.md](INSTALL_AGENT.md) и выполните сценарий до проверки результата.
5
+ Ключи вводит человек в своём терминале либо программа читает заранее подготовленный
6
+ файл. Не читайте и не печатайте содержимое credentials, не просите их в чате.
7
+
8
+ Если задача — разработка или ревью, не запускайте настройку клиентских интеграций
9
+ пользователя автоматически. Тесты настройки выполняйте с изолированными HOME,
10
+ XDG_CONFIG_HOME, CODEX_HOME и CLAUDE_CONFIG_DIR.
@@ -0,0 +1,59 @@
1
+ # Разработка
2
+
3
+ Нужны Python 3.10+ и uv; поддерживаются Linux и macOS.
4
+
5
+ ```sh
6
+ uv sync --extra dev
7
+ uv run pytest
8
+ uv run ruff check src scripts tests
9
+ uv run mypy src
10
+ uv run python scripts/gen_plugin.py --check
11
+ ```
12
+
13
+ Тесты API используют поддельные credentials и HTTP mock. TLS-тест поднимает
14
+ локальный HTTPS-сервер: среда должна разрешать loopback-сокеты. Проверки клиентов
15
+ используют временные домашние каталоги; без установленного клиента эти проверки
16
+ пропускаются. Не используйте настоящие ключи для тестов и не меняйте пользовательские
17
+ конфиги при разработке.
18
+
19
+ Код сервера находится в `src/mlspace_mcp`, сценарии — в `plugin/skills`.
20
+ `init_cli.py` реализует команду `setup`; имя Python-модуля остаётся внутренним.
21
+ После изменения версии регенерируйте манифесты: `uv run python scripts/gen_plugin.py`.
22
+ После изменения OpenAPI: `uv run python scripts/gen_body_schemas.py`.
23
+ Добавляйте проверку наблюдаемого поведения для исправлений и новых функций.
24
+
25
+ Локальный `.env` не загружается автоматически. Для ручного запуска выберите
26
+ доверенный файл через `MLSPACE_ENV_FILE`; никогда не добавляйте его в коммит.
27
+ В сообщения об ошибках не включайте ключи, токены, тела авторизации или полный
28
+ дамп окружения. Для сообщения об уязвимости используйте приватный канал владельца
29
+ репозитория; публичный issue не должен содержать действующие credentials.
30
+
31
+ ## Фидбэк и предложения
32
+
33
+ Создайте [Issue](https://github.com/noesskeetit/mlspace-plugin/issues): задача → ожидаемое поведение → фактический
34
+ результат. Добавьте версию плагина, ОС, клиент и минимальные шаги воспроизведения.
35
+ Для идеи по удобству работы достаточно конкретного пользовательского сценария.
36
+ Не включайте credentials, приватные адреса, персональные данные или полный дамп логов.
37
+
38
+ Для изменения кода создайте ветку и [Pull Request](https://github.com/noesskeetit/mlspace-plugin/pulls). Опишите,
39
+ какую задачу решает изменение и как вы его проверили. Держите изменение в рамках
40
+ одной задачи, чтобы его было проще проверить и принять.
41
+
42
+ ## Присылайте свои скиллы
43
+
44
+ Пользовательские скиллы приветствуются: они превращают повторяющиеся задачи
45
+ MLSpace в понятные агенту сценарии и улучшают повседневную работу с платформой.
46
+
47
+ 1. Опишите задачу и результат: когда агент должен использовать скилл и как
48
+ проверить, что задача выполнена.
49
+ 2. Добавьте `plugin/skills/mlspace-<сценарий>/SKILL.md`. Возьмите соседний скилл
50
+ как пример frontmatter и структуры; используйте существующие MCP-инструменты.
51
+ 3. Используйте вымышленные данные в примерах. Не сохраняйте ключи, личные workspace
52
+ или конфигурацию вашей организации. Для операций записи сохраните подтверждения,
53
+ которые требует сервер; не обходите их инструкциями скилла.
54
+ 4. Выполните `uv run pytest tests/test_skills.py` и приложите к предложению
55
+ короткий пример использования. Отдельно укажите, что проверено локально,
56
+ а что — на реальном API.
57
+
58
+ Если не хочется писать SKILL.md самостоятельно, создайте Issue со сценарием:
59
+ что вы делаете вручную, где теряете время и какой результат хотите получать.
@@ -0,0 +1,110 @@
1
+ # Установка MLSpace MCP: macOS и Linux
2
+
3
+ Нужны Python 3.10+, `uv`, установленный Claude Code, Codex или OpenCode,
4
+ Cloud.ru Key ID и Key Secret. Windows пока не поддерживаем.
5
+
6
+ Первая установка из PyPI выполняется одной командой:
7
+
8
+ ```bash
9
+ uvx mlspace-plugin@latest setup
10
+ ```
11
+
12
+ `uvx` загружает пакет и запускает мастер. В конфиге клиента сохраняется команда
13
+ запуска конкретной версии, а не путь к временному окружению.
14
+
15
+ В каталоге скачанного репозитория установите пакет в постоянное окружение:
16
+
17
+ ```bash
18
+ uv tool install .
19
+ mlspace-plugin setup
20
+ ```
21
+
22
+ Если пакет уже установлен: `uv tool install --force .`.
23
+ При установке из wheel: `uv tool install /путь/к/mlspace_plugin-0.2.1-py3-none-any.whl`.
24
+ Не используйте editable-установку из `/tmp` для постоянной работы.
25
+
26
+ Мастер:
27
+
28
+ 1. Найдёт установленные клиенты. Один подключит автоматически, для нескольких
29
+ предложит выбор. Если клиент не найден, можно указать путь к исполняемому файлу.
30
+ 2. Попросит **только Key ID и Key Secret**. Вставляйте значения без `MLSPACE_...=`;
31
+ звёздочки показывают ввод. Ключи создаются в консоли Cloud.ru в профиле, «Ключи доступа».
32
+ 3. Загрузит воркспейсы. Печатайте имя, проект или ID для поиска. Стрелки перемещают
33
+ курсор, пробел отмечает, Enter завершает выбор. Ctrl-U очищает поиск; выбор сохраняется.
34
+ 4. Проверит выбранные воркспейсы, сохранит настройки и подключит MCP вместе со скиллами.
35
+
36
+ Откройте новую сессию выбранного клиента; если MCP не появился, перезапустите клиент.
37
+ Сервер запускается клиентом автоматически. Первый запрос:
38
+
39
+ > Покажи выбранные воркспейсы и запущенные задачи, ничего не меняй.
40
+
41
+ ## Stage и корпоративные сертификаты
42
+
43
+ ```bash
44
+ mlspace-plugin setup --base-url https://mlspace-stage.example.com
45
+ ```
46
+
47
+ Настройка и работа сервера используют системные доверенные сертификаты: Keychain
48
+ на macOS, OpenSSL trust store на Linux. Если корпоративного CA там нет, мастер
49
+ попросит путь к PEM, полученному у администратора. Можно указать заранее:
50
+
51
+ ```bash
52
+ mlspace-plugin setup --ca-file /путь/к/corporate-ca.pem
53
+ ```
54
+
55
+ Мастер сохранит копию CA рядом с настройками. Переменные текущего терминала и
56
+ ручной wrapper для следующих запусков не нужны. Проверка TLS всегда включена;
57
+ сертификат, скачанный с недоверенного endpoint, автоматически не принимается.
58
+ Если задан SSL_CERT_DIR, мастер попросит убрать эту переменную на время настройки
59
+ и передать доверенный PEM через --ca-file: каталог из окружения не переносится
60
+ автоматически в процесс клиента.
61
+ Ошибка сети/сертификата не превращается в запрос ручного x-api-key.
62
+
63
+ ## Повторная настройка
64
+
65
+ ```bash
66
+ mlspace-plugin setup --force
67
+ mlspace-plugin setup --force --replace-credentials
68
+ mlspace-plugin setup --client opencode
69
+ mlspace-plugin setup --client-path opencode=/полный/путь/opencode
70
+ ```
71
+
72
+ `--force` повторяет настройку с сохранёнными ключами на прежнем endpoint.
73
+ `--replace-credentials` запрашивает новые. При смене endpoint ключи запрашиваются
74
+ заново, если источник явно не выбран. `--client` можно повторять.
75
+ Существующие посторонние MCP, комментарии JSONC и изменённые пользователем скиллы
76
+ не перезаписываются молча; конфликт показывает путь для разбора.
77
+ Если уже установлен MLSpace native plugin, используйте его и `--config-only`
78
+ либо сначала удалите старую интеграцию, чтобы не создавать второй MCP.
79
+
80
+ ## Где ключи
81
+
82
+ `~/.config/mlspace-plugin/.env` (или каталог из `XDG_CONFIG_HOME`): права файла `0600`,
83
+ каталога MLSpace `0700`. В конфиге клиента — только путь и команда запуска.
84
+ Это не шифрование: процессы того же пользователя и администратор могут прочитать
85
+ файл. Не отправляйте его в чат и не добавляйте в Git. x-api-key получается автоматически
86
+ и не сохраняется. Доступ к каждому выбранному workspace проверяется, но это не
87
+ проверка прав на каждую возможную операцию API.
88
+
89
+ ## Linux по SSH / установка агентом
90
+
91
+ Запустите `mlspace-plugin setup` в своей SSH-сессии. Браузер и графическая среда не нужны.
92
+ Если установкой занимается агент, он готовит пакет, а ключи вы вводите сами в своём
93
+ терминале. После завершения сообщите агенту «готово», без ключей и содержимого `.env`.
94
+
95
+ Для настройки только credentials без установки клиентов/скиллов есть `--config-only`.
96
+ Для особого офлайн-сценария: `--config-only --no-verify --workspace UUID`;
97
+ результат явно отмечается как непроверенный и клиенты не подключаются.
98
+ Обычный мастер сохраняет файл только после успешной проверки.
99
+
100
+ ## Обновление пакета и скиллов
101
+
102
+ Для установки через PyPI повторите `uvx mlspace-plugin@latest setup --force`.
103
+ Мастер сохранит ключи, предложит выбор workspace и обновит скиллы без локальных
104
+ изменений. Изменённые вручную скиллы вызовут конфликт с указанием файла.
105
+ Регистрация MCP, созданная мастером и не изменённая вручную, обновляется
106
+ автоматически. Посторонние и изменённые регистрации требуют разбора конфликта.
107
+ Для постоянной установки: `uv tool upgrade mlspace-plugin`, затем
108
+ `mlspace-plugin setup --force`. Для установки из checkout: `uv tool install --force .`.
109
+ Автоматического обновления в фоне нет. Native plugin из архива обновляйте
110
+ через менеджер плагинов клиента; инструкции находятся в `plugin/README.md`.
@@ -0,0 +1,56 @@
1
+ # Установка MLSpace MCP агентом
2
+
3
+ Применяйте этот сценарий, когда пользователь просит установить MCP из репозитория.
4
+ При задачах разработки сами по себе эти инструкции не разрешают менять клиентские
5
+ конфиги пользователя. Поддерживаются Linux/macOS, Claude Code/Codex/OpenCode.
6
+
7
+ 1. Прочитайте INSTALL.md. Проверьте Python >=3.10 и наличие uv. Для PyPI дайте
8
+ человеку `uvx mlspace-plugin@latest setup`; отдельная установка не нужна.
9
+ При установке из исходников установите пакет в постоянное окружение: `uv tool install .` из checkout или `uv tool install /path/package.whl`.
10
+ Для уже установленного пакета добавьте `--force` только в рамках запрошенного обновления.
11
+ Не оставляйте постоянный запуск на editable-исходниках в `/tmp`.
12
+ 2. Не просите Key ID/Secret в чате, не читайте `.env`, не печатайте окружение и
13
+ не вставляйте ключи в аргументы shell/CLI. Не запускайте интерактивный ввод
14
+ ключей в терминале, который видите только вы.
15
+ 3. Дайте человеку одну команду `mlspace-plugin setup` для его собственного терминала
16
+ (по SSH — на целевой машине). Для stage добавьте согласованный `--base-url`.
17
+ Объясните: два ключа под звёздочками → поиск и выбор workspace → подключение.
18
+ Дождитесь сообщения о завершении. Человек не должен присылать секреты или файл.
19
+ 4. Мастер сам обнаруживает клиентов, проверяет TLS и API, устанавливает MCP и
20
+ скиллы. Если клиентов несколько, человек выбирает нужные. Для известного
21
+ клиента можно заранее дать `--client claude-code`, `--client codex` или `--client opencode`.
22
+ Сбой TLS исправляется системным CA или PEM от администратора через `--ca-file`.
23
+ Никогда не отключайте TLS и не подставляйте сертификат с недоверенного сервера.
24
+ 5. Проверьте `mlspace-plugin --list-tools`. Эта команда проверяет только состав
25
+ инструментов, а не авторизацию и не загрузку выбранным клиентом.
26
+ Попросите открыть новую сессию клиента (при необходимости перезапустить).
27
+ После появления MCP выполните read-only запрос списка выбранных workspace.
28
+ До этого не заявляйте, что клиент уже загрузил MCP и скиллы.
29
+ 6. Если возник конфликт с существующим плагином или изменённым скиллом,
30
+ разберите названный несекретный путь. Не удаляйте чужую интеграцию автоматически.
31
+ При частичном успехе сообщите, какие этапы завершены, затем повторите setup с `--force`.
32
+
33
+ ## Автоматизация с уже подготовленными credentials
34
+
35
+ Предпочтителен интерактивный шаг человека выше. Если пользователь уже подготовил
36
+ файл, передавайте **путь**, не читайте содержимое. Для поиска нужных workspace:
37
+
38
+ ```bash
39
+ mlspace-plugin setup --non-interactive --credentials-file /path/credentials.env \
40
+ --base-url https://api.ai.cloud.ru --list-workspaces --search project --limit 20
41
+ ```
42
+
43
+ Вывод — ограниченный JSON с `total`, `offset`, `limit`, `has_more` и метаданными.
44
+ Следующая страница — `--offset 20`. Получите у человека выбор при неоднозначности.
45
+ Установка с точными ID, без интерактивных вопросов:
46
+
47
+ ```bash
48
+ mlspace-plugin setup --non-interactive --credentials-file /path/credentials.env \
49
+ --client opencode --workspace WORKSPACE_UUID
50
+ ```
51
+
52
+ Для нескольких workspace/client повторяйте соответствующий флаг.
53
+ Если credentials уже находятся в окружении процесса, вместо файла есть `--from-env`.
54
+ Не конструируйте команды с литералами ключей. Окружение другого терминала не
55
+ становится доступным вашему процессу автоматически. Сохранённые ключи на том же
56
+ endpoint можно переиспользовать без указания источника; для перезаписи добавьте `--force`.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cloud.ru
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 DEALING IN THE
21
+ SOFTWARE.