mlspace-plugin 0.3.3__tar.gz → 0.3.5__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 (141) hide show
  1. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/INSTALL.md +6 -2
  2. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/INSTALL_AGENT.md +4 -0
  3. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/PKG-INFO +2 -2
  4. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/README.md +1 -1
  5. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/RELEASE.md +5 -5
  6. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/.claude-plugin/plugin.json +1 -1
  7. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/.codex-plugin/plugin.json +1 -1
  8. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/.mcp.json +1 -1
  9. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/README.md +19 -1
  10. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/mcp.json +1 -1
  11. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/plugin.json +1 -1
  12. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-diagnose-data-transfer/SKILL.md +12 -0
  13. mlspace_plugin-0.3.5/plugin/skills/mlspace-export-database-data/SKILL.md +68 -0
  14. mlspace_plugin-0.3.5/plugin/skills/mlspace-export-nfs-to-s3/SKILL.md +51 -0
  15. mlspace_plugin-0.3.5/plugin/skills/mlspace-migrate-s3-to-s3/SKILL.md +54 -0
  16. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-stage-s3-to-nfs/SKILL.md +23 -6
  17. mlspace_plugin-0.3.5/plugin/skills/mlspace-transfer-data/SKILL.md +124 -0
  18. mlspace_plugin-0.3.5/plugin/skills/mlspace-transfer-nfs-to-nfs/SKILL.md +60 -0
  19. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/pyproject.toml +1 -1
  20. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/__init__.py +1 -1
  21. mlspace_plugin-0.3.5/src/mlspace_mcp/data_transfer_hooks.py +68 -0
  22. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/init_cli.py +60 -37
  23. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/registry.py +5 -0
  24. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/setup_ui.py +18 -0
  25. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/data_transfer.py +10 -2
  26. mlspace_plugin-0.3.5/tests/test_acceptance_regressions.py +177 -0
  27. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_client_setup.py +2 -2
  28. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_init_cli.py +6 -3
  29. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_native_cli_integration.py +1 -1
  30. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_onboarding_init.py +91 -1
  31. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_opencode_journey.py +42 -2
  32. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_plugin_release.py +1 -1
  33. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_setup_native_journey.py +4 -1
  34. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_skills.py +2 -2
  35. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_user_agent.py +2 -2
  36. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/.agents/plugins/marketplace.json +0 -0
  37. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/.claude-plugin/marketplace.json +0 -0
  38. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/.env.example +0 -0
  39. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/.gitignore +0 -0
  40. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/AGENTS.md +0 -0
  41. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/CONTRIBUTING.md +0 -0
  42. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/LICENSE +0 -0
  43. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-call-deployed-model-predict/SKILL.md +0 -0
  44. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-deploy-inference-service/SKILL.md +0 -0
  45. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-diagnose-failed-training-job/SKILL.md +0 -0
  46. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-diagnose-job-launch-rejection/SKILL.md +0 -0
  47. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-diagnose-unhealthy-inference/SKILL.md +0 -0
  48. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-discover-launchable-resources/SKILL.md +0 -0
  49. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-launch-training-job/SKILL.md +0 -0
  50. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-list-running-jobs/SKILL.md +0 -0
  51. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-resume-notebook-and-set-autoshutdown/SKILL.md +0 -0
  52. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/plugin/skills/mlspace-transfer-compute-node/SKILL.md +0 -0
  53. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/build_plugin.py +0 -0
  54. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/demo_multi_workspace.py +0 -0
  55. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/gen_body_schemas.py +0 -0
  56. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/gen_plugin.py +0 -0
  57. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/mcp_call.py +0 -0
  58. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/serve_stdio.sh +0 -0
  59. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/scripts/serve_stdio_dryrun.sh +0 -0
  60. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/__main__.py +0 -0
  61. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/_status.py +0 -0
  62. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/auth.py +0 -0
  63. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/bodyspec.py +0 -0
  64. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/client.py +0 -0
  65. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/client_setup.py +0 -0
  66. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/config.py +0 -0
  67. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/errors.py +0 -0
  68. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/formatting.py +0 -0
  69. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/job_hooks.py +0 -0
  70. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/jsonc.py +0 -0
  71. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/native_plugins.py +0 -0
  72. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/overview.py +0 -0
  73. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/resource_refs.py +0 -0
  74. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/server.py +0 -0
  75. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/setup_conflicts.py +0 -0
  76. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/setup_verification.py +0 -0
  77. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/spec/body_schemas.json +0 -0
  78. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/spec/openapi.json +0 -0
  79. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tls.py +0 -0
  80. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/__init__.py +0 -0
  81. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/allocations.py +0 -0
  82. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/async_inference.py +0 -0
  83. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/build_image.py +0 -0
  84. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/dalle.py +0 -0
  85. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/docker_registry.py +0 -0
  86. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/inference.py +0 -0
  87. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/jobs.py +0 -0
  88. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/notebooks.py +0 -0
  89. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/queues.py +0 -0
  90. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/resources.py +0 -0
  91. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/tensorboards.py +0 -0
  92. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/tools/workspaces.py +0 -0
  93. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/src/mlspace_mcp/workspace_context.py +0 -0
  94. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/conftest.py +0 -0
  95. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/specutil.py +0 -0
  96. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_allocations.py +0 -0
  97. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_artifact_sync.py +0 -0
  98. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_async_inference.py +0 -0
  99. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_auth.py +0 -0
  100. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_autofill.py +0 -0
  101. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_bodyspec.py +0 -0
  102. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_build_image.py +0 -0
  103. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_client.py +0 -0
  104. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_configs_shrink.py +0 -0
  105. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_credential_pointer.py +0 -0
  106. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_dalle.py +0 -0
  107. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_data_transfer.py +0 -0
  108. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_docker_registry.py +0 -0
  109. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_drift.py +0 -0
  110. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_dry_run.py +0 -0
  111. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_dry_run_fidelity.py +0 -0
  112. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_env_file.py +0 -0
  113. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_errors.py +0 -0
  114. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_false_success.py +0 -0
  115. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_formatting.py +0 -0
  116. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_integration.py +0 -0
  117. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_job_status.py +0 -0
  118. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_jobs.py +0 -0
  119. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_log_normalisation.py +0 -0
  120. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_mcp_error_contract.py +0 -0
  121. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_native_plugins.py +0 -0
  122. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_notebooks.py +0 -0
  123. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_onboarding_tls.py +0 -0
  124. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_overview.py +0 -0
  125. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_plugin_bundle.py +0 -0
  126. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_plugin_cli.py +0 -0
  127. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_preflight.py +0 -0
  128. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_queue_scope.py +0 -0
  129. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_queues.py +0 -0
  130. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_registry.py +0 -0
  131. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_resource_refs.py +0 -0
  132. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_resources.py +0 -0
  133. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_route_confusion.py +0 -0
  134. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_secret_disclosure.py +0 -0
  135. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_setup_conflicts.py +0 -0
  136. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_setup_ui.py +0 -0
  137. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_setup_verification.py +0 -0
  138. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_tensorboards.py +0 -0
  139. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_workspace_context.py +0 -0
  140. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_workspaces.py +0 -0
  141. {mlspace_plugin-0.3.3 → mlspace_plugin-0.3.5}/tests/test_wrapper_hardening.py +0 -0
@@ -21,7 +21,7 @@ mlspace-plugin setup
21
21
  ```
22
22
 
23
23
  Если пакет уже установлен: `uv tool install --force .`.
24
- При установке из wheel: `uv tool install /путь/к/mlspace_plugin-0.3.3-py3-none-any.whl`.
24
+ При установке из wheel: `uv tool install /путь/к/mlspace_plugin-0.3.5-py3-none-any.whl`.
25
25
  Не используйте editable-установку из `/tmp` для постоянной работы.
26
26
  Далее команды показаны для PyPI. После установки исходников или wheel через
27
27
  `uv tool install` заменяйте `uvx mlspace-plugin@latest` на `mlspace-plugin`,
@@ -35,7 +35,11 @@ mlspace-plugin setup
35
35
  звёздочки показывают ввод. Ключи создаются в консоли Cloud.ru в профиле, «Ключи доступа».
36
36
  3. Загрузит воркспейсы. Печатайте имя, проект или ID для поиска. Стрелки перемещают
37
37
  курсор, пробел отмечает, Enter завершает выбор. Ctrl-U очищает поиск; выбор сохраняется.
38
- 4. Проверит выбранные воркспейсы и сохранит настройки.
38
+ 4. Проверит выбранные воркспейсы. Если проверка не пройдёт, например из-за 403,
39
+ вернёт к выбору: проверенные останутся отмечены, с непроверенных отметки снимутся.
40
+ Можно выбрать другие или снова отметить нужные для повторной проверки, без
41
+ повторного ввода ключей. Enter подтверждает выбор, Ctrl-C отменяет настройку.
42
+ Настройки сохраняются только после успешной проверки всего нового выбора.
39
43
  5. Для Claude Code и Codex добавит marketplace этого GitHub-репозитория и установит
40
44
  `mlspace@mlspace`. Для OpenCode запишет MCP-подключение и скиллы в
41
45
  `~/.config/opencode/skills` (учитывается `XDG_CONFIG_HOME`).
@@ -65,6 +65,10 @@ uvx mlspace-plugin@latest setup --non-interactive --credentials-file /path/crede
65
65
  ```
66
66
 
67
67
  Для нескольких workspace/client повторяйте соответствующий флаг.
68
+ При ошибке проверки воркспейса интерактивный мастер возвращает человека к выбору
69
+ без повторного ввода ключей. В `--non-interactive` он завершится с ошибкой и сохранит
70
+ прежний файл настроек: уточните выбор и повторите команду с нужными `--workspace`.
71
+ Не исключайте недоступные воркспейсы молча и не обходите проверку через `--no-verify`.
68
72
  Если credentials уже находятся в окружении процесса, вместо файла есть `--from-env`.
69
73
  Не конструируйте команды с литералами ключей. Окружение другого терминала не
70
74
  становится доступным вашему процессу автоматически. Сохранённые ключи на том же
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mlspace-plugin
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Cloud.ru MLSpace plugin: MCP server, agent skills and setup
5
5
  Project-URL: Repository, https://github.com/noesskeetit/mlspace-plugin
6
6
  Project-URL: Issues, https://github.com/noesskeetit/mlspace-plugin/issues
@@ -277,7 +277,7 @@ write-запросов подаются параметром `body: dict`; об
277
277
 
278
278
  ## Плагин: Codex, Claude Code и совместимые агенты
279
279
 
280
- [Поставка MLSpace](plugin/README.md) объединяет MCP-сервер и 12 скиллов.
280
+ [Поставка MLSpace](plugin/README.md) объединяет MCP-сервер и 17 скиллов.
281
281
  Обычная установка — `uvx mlspace-plugin@latest setup`: marketplace подключается
282
282
  автоматически. Нативные клиенты управляют плагином `mlspace@mlspace` сами.
283
283
  Манифест фиксирует точную версию runtime из PyPI вместе со скиллами.
@@ -226,7 +226,7 @@ write-запросов подаются параметром `body: dict`; об
226
226
 
227
227
  ## Плагин: Codex, Claude Code и совместимые агенты
228
228
 
229
- [Поставка MLSpace](plugin/README.md) объединяет MCP-сервер и 12 скиллов.
229
+ [Поставка MLSpace](plugin/README.md) объединяет MCP-сервер и 17 скиллов.
230
230
  Обычная установка — `uvx mlspace-plugin@latest setup`: marketplace подключается
231
231
  автоматически. Нативные клиенты управляют плагином `mlspace@mlspace` сами.
232
232
  Манифест фиксирует точную версию runtime из PyPI вместе со скиллами.
@@ -7,11 +7,11 @@
7
7
  `uv lock` и `uv run python scripts/gen_plugin.py`. Обновите примеры имён wheel/ZIP
8
8
  в инструкциях, если версия присутствует в имени файла.
9
9
  2. Выполните проверки из `CONTRIBUTING.md` на Linux и macOS.
10
- 3. Соберите пакет (в командах ниже замените 0.3.3 на выпускаемую версию):
10
+ 3. Соберите пакет (в командах ниже замените 0.3.5 на выпускаемую версию):
11
11
 
12
12
  ```sh
13
- uv build --out-dir dist/release-0.3.3
14
- uv run python scripts/build_plugin.py --output dist/plugin-release-0.3.3
13
+ uv build --out-dir dist/release-0.3.5
14
+ uv run python scripts/build_plugin.py --output dist/plugin-release-0.3.5
15
15
  ```
16
16
 
17
17
  4. Просмотрите содержимое wheel, sdist и ZIP. В них не должно быть credentials,
@@ -23,11 +23,11 @@ uv run python scripts/build_plugin.py --output dist/plugin-release-0.3.3
23
23
  `UV_PUBLISH_TOKEN` средствами вашего хранилища секретов, не аргументом команды:
24
24
 
25
25
  ```sh
26
- uv publish --trusted-publishing never dist/release-0.3.3/mlspace_plugin-0.3.3-py3-none-any.whl dist/release-0.3.3/mlspace_plugin-0.3.3.tar.gz
26
+ uv publish --trusted-publishing never dist/release-0.3.5/mlspace_plugin-0.3.5-py3-none-any.whl dist/release-0.3.5/mlspace_plugin-0.3.5.tar.gz
27
27
  ```
28
28
 
29
29
  6. Проверьте версию и SHA256 обоих файлов через PyPI JSON API; проверьте установку
30
- `uvx --from mlspace-plugin==0.3.3 mlspace-plugin --version` из нового кеша.
30
+ `uvx --from mlspace-plugin==0.3.5 mlspace-plugin --version` из нового кеша.
31
31
  7. Только после проверки точной версии в PyPI обновите рабочую ветку GitHub
32
32
  marketplace и создайте тег релиза. До этого проверяйте изменения на отдельной
33
33
  release-ветке или локальном Git marketplace: main не должен ссылаться на
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mlspace",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Cloud.ru MLSpace: training jobs, inference, notebooks, data transfer, registry and compute catalog — an MCP server plus skills.",
5
5
  "author": {
6
6
  "name": "Cloud.ru"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mlspace",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Cloud.ru MLSpace: training jobs, inference, notebooks, data transfer, registry and compute catalog — an MCP server plus skills.",
5
5
  "author": {
6
6
  "name": "Cloud.ru"
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "mlspace-plugin==0.3.3",
8
+ "mlspace-plugin==0.3.5",
9
9
  "mlspace-plugin",
10
10
  "--transport",
11
11
  "stdio"
@@ -16,7 +16,7 @@ marketplace этого репозитория и устанавливает `mls
16
16
 
17
17
  ## Состав
18
18
 
19
- - 12 скиллов в `skills/`;
19
+ - 17 скиллов в `skills/`;
20
20
  - манифесты Agent Plugins, Claude Code и Codex;
21
21
  - команда MCP `uvx --from mlspace-plugin==<версия> mlspace-plugin --transport stdio`.
22
22
 
@@ -25,6 +25,24 @@ marketplace этого репозитория и устанавливает `mls
25
25
  нет: для запуска нужен доступ к PyPI. Исходники скиллов находятся в одном месте —
26
26
  `plugin/skills`; их копиями в кеше управляют нативные клиенты.
27
27
 
28
+ ## Сценарии переноса данных
29
+
30
+ | Задача | Скилл |
31
+ | --- | --- |
32
+ | Выбрать маршрут, настроить расписание и проверить результат | [Общий сценарий Data Transfer](skills/mlspace-transfer-data/SKILL.md) |
33
+ | Подготовить данные из S3 на NFS для обучения | [S3 → NFS](skills/mlspace-stage-s3-to-nfs/SKILL.md) |
34
+ | Скопировать данные между регионами, вариантами NFS или воркспейсами | [NFS → NFS](skills/mlspace-transfer-nfs-to-nfs/SKILL.md) |
35
+ | Выгрузить результаты, датасеты или чекпоинты в бакет | [NFS → S3](skills/mlspace-export-nfs-to-s3/SKILL.md) |
36
+ | Перенести данные между бакетами, включая Evolution и Advanced | [S3 → S3](skills/mlspace-migrate-s3-to-s3/SKILL.md) |
37
+ | Выгрузить данные PostgreSQL, MySQL, MS SQL, Oracle DB или ClickHouse в поддерживаемое хранилище | [БД → хранилище](skills/mlspace-export-database-data/SKILL.md) |
38
+ | Разобраться в неудачном или частичном переносе | [Диагностика](skills/mlspace-diagnose-data-transfer/SKILL.md) |
39
+
40
+ Пример запроса: «Скопируй датасет с NFS одного региона на NFS другого воркспейса;
41
+ сначала проверь маршрут и покажи параметры». Другой пример: «Выгрузи чекпоинты
42
+ обучения с NFS в мой S3-бакет». Агент уточнит недостающие пути и назначение.
43
+ Доступность конкретного маршрута и права проверяются для вашего API и коннекторов;
44
+ поддержка источника не означает поддержку того же типа в качестве назначения.
45
+
28
46
  Ключи, CA и указатель на credentials находятся вне кеша плагина. Изменение
29
47
  `XDG_CONFIG_HOME` при запуске клиента не теряет выбранный файл настроек.
30
48
 
@@ -6,7 +6,7 @@
6
6
  "command": "uvx",
7
7
  "args": [
8
8
  "--from",
9
- "mlspace-plugin==0.3.3",
9
+ "mlspace-plugin==0.3.5",
10
10
  "mlspace-plugin",
11
11
  "--transport",
12
12
  "stdio"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "mlspace",
4
- "version": "0.3.3",
4
+ "version": "0.3.5",
5
5
  "description": "Cloud.ru MLSpace: training jobs, inference, notebooks, data transfer, registry and compute catalog — an MCP server plus skills.",
6
6
  "author": {
7
7
  "name": "Cloud.ru"
@@ -23,6 +23,18 @@ carried out any other way.
23
23
 
24
24
  ## Procedure
25
25
 
26
+ Final-answer contract:
27
+ - **Status and reported counters**: observations returned by the API.
28
+ - **Failure cause and phase**: use explicit matching log evidence; otherwise unknown.
29
+ - **Data impact**: unknown until an independent source/destination contents check
30
+ establishes it. Even a known cause such as AccessDenied at PutObject does not
31
+ establish whether other writes in the run already happened. A known cause and
32
+ unknown data impact can both be true. Zero counters are not that contents check.
33
+
34
+ The tool's `_mcp_evidence` describes the limits of those observations, not an API
35
+ defect or a separate user-facing warning. Never translate zero counters into
36
+ "the run failed before transfer started" or "nothing was read/written".
37
+
26
38
  Goal: determine whether a data transfer truly failed / was partial, and why.
27
39
  1. Resolve the transfer: if transfer_id given use it, else data_transfer list_transfers
28
40
  and match transfer_name.
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: mlspace-export-database-data
3
+ description: "Export data from PostgreSQL, MySQL, MS SQL, Oracle DB or ClickHouse into an allowed storage destination through Cloud.ru MLSpace. Uses mlspace_data_transfer; resolves the extraction query and format without promising database replication or database-to-database support."
4
+ license: MIT
5
+ ---
6
+
7
+ # Export database data to storage
8
+
9
+ Read [the shared transfer procedure](../mlspace-transfer-data/SKILL.md). This is
10
+ database → supported storage export. Database source support does not establish
11
+ database destination support, CDC, transaction-consistent snapshots or live replication.
12
+
13
+ ## Establish the extraction contract
14
+
15
+ 1. Identify the DB connector, database/schema/table or approved extraction query,
16
+ destination connector/path, intended file format and schedule. Resolve whether
17
+ the user wants a full extract or a bounded incremental selection. Do not invent
18
+ table names, watermarks, partitions or output formats.
19
+ 2. Use `mlspace_data_transfer` actions `list_sources`, `list_connectors` and
20
+ `get_connector`. Match the actual `postgresql`, `mysql`, `mssql`, `oracledb` or
21
+ `clickhouse` connector. Saved success is not proof of current connectivity.
22
+ Do not activate a connector with `try_connector` just to perform a read-only check.
23
+ 3. Inspect the configured endpoint's source schema and a verified existing rule
24
+ where available. Older client_lib documentation shows SQL `query`/`schema` under
25
+ connector parameters; that alone does not establish their placement or semantics
26
+ in the current transfer API. Establish how `query.source` represents this source
27
+ before creating the rule. If the contract or format is unclear, request a known
28
+ working rule or service clarification instead of trying arbitrary SQL/body fields.
29
+ 4. Prefer an existing least-privilege DB connector. If a new connector is requested,
30
+ use its current schema and secure credential workflow; do not ask for a password
31
+ in chat, broaden DB grants or edit a shared connector's query automatically.
32
+ Restrict the extraction to the requested read-only data selection.
33
+ 5. Check destination support independently (`ConnectorTypesTarget`): select an
34
+ accepted S3/NFS/storage connector, not another database merely because it appears
35
+ in source discovery. Establish the execution cluster and any NFS variant/path.
36
+
37
+ ## Apply source-specific prerequisites only when relevant
38
+
39
+ - For Advanced RDS SQL Server, Cloud.ru documents network configuration and allowing
40
+ the connector service's source IPs. Obtain the current IP list from support;
41
+ do not substitute the developer machine's public IP or open access to all networks.
42
+ Creating RDS instances or editing security groups/NAT is not part of an export
43
+ unless separately requested.
44
+ - For ClickHouse, the service documentation recommends `readonly=2`, or an appropriate
45
+ `changeable_in_readonly` configuration when using `readonly=1`. Treat this as a
46
+ prerequisite to resolve with the DB owner; never change server settings automatically.
47
+ - Apply current driver/version prerequisites from the source documentation if a
48
+ compatibility question arises. Do not turn an old supported-version list into
49
+ a blanket claim that every later DB version fails.
50
+
51
+ ## Run and assess the export
52
+
53
+ Use the shared write/readback/history procedure after the extraction contract is
54
+ established. `append_new` is a service transfer strategy, not evidence that SQL rows
55
+ are deduplicated or that a changing database is captured consistently. A recurring
56
+ full extract is not automatically incremental extraction.
57
+
58
+ Report the rule/run ID, destination, observed status and reported rows/bytes.
59
+ Distinguish those counters from source-to-destination reconciliation. For failure,
60
+ use matching event evidence; do not infer a missing table or unchanged destination
61
+ from a generic error or zero counters.
62
+
63
+ ## Sources
64
+
65
+ - [Supported DB sources and ClickHouse prerequisites](https://cloud.ru/docs/aicloud/mlspace/concepts/data-catalog__data-processing__data-migration)
66
+ - [Connector configuration](https://cloud.ru/docs/aicloud/mlspace/concepts/guides/guides__dc/data-catalog__data-processing__data-migration__create-connector)
67
+ - [Advanced SQL Server connectivity](https://cloud.ru/docs/aicloud/mlspace/concepts/guides/guides__advanced/guides__sql_adv__connect)
68
+ - [Older client_lib SQL parameter reference](https://cloud.ru/docs/aicloud/mlspace/concepts/client-lib__copy-to-nfs)
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: mlspace-export-nfs-to-s3
3
+ description: "Export datasets, model checkpoints or job results from NFS to S3 on Cloud.ru MLSpace, including Evolution, Advanced and compatible external buckets. Uses mlspace_data_transfer; preserves source files and verifies the destination connector and prefix."
4
+ license: MIT
5
+ ---
6
+
7
+ # Export NFS files to an S3 bucket
8
+
9
+ Read [the shared transfer procedure](../mlspace-transfer-data/SKILL.md). This skill
10
+ handles NFS → S3; for the reverse direction use `mlspace-stage-s3-to-nfs`.
11
+
12
+ ## Establish the export destination
13
+
14
+ 1. Resolve the NFS workspace, region/storage variant and connector-relative path.
15
+ A job's region identifies relevant storage, but does not prove its output files
16
+ exist. Obtain a verified output path instead of assuming the script directory
17
+ contains the checkpoint. The MCP is not a general NFS file browser.
18
+ 2. With `mlspace_data_transfer` actions `list_connectors` and `get_connector`,
19
+ identify the destination by endpoint, bucket and connector ID, not name alone.
20
+ Confirm the object prefix and intended overwrite/append/sync behavior. A local
21
+ directory path and an S3 object prefix are different namespaces.
22
+ 3. Select a destination type accepted by the endpoint's `ConnectorTypesTarget`.
23
+ An Amazon/Google source connector type is not automatically accepted as a target;
24
+ use a verified destination-compatible connector (often `s3custom`). Reuse an
25
+ existing system Evolution connector where available. For a new custom connector,
26
+ use the current create_connector schema and an authorized credential workflow;
27
+ do not ask for keys in chat or derive S3 credentials from unrelated Registry secrets.
28
+ 4. For Advanced, check the migration guide's SSE-KMS prerequisite if relevant.
29
+ Never disable encryption on an existing bucket automatically. Ask for a destination
30
+ compatible with the documented transfer path or resolve the prerequisite first.
31
+ 5. Confirm `cluster_name` for the selected NFS storage using the endpoint schema and
32
+ verified context. Do not hardcode a tutorial's cluster or infer it from the bucket
33
+ endpoint. Apply the shared transfer file-count limits.
34
+
35
+ ## Run and verify
36
+
37
+ Create/update the requested rule using the actual connector types and
38
+ `query.source`/`query.destination` paths. For a recurring export, retain the shared
39
+ schedule checks; recurrence does not imply full synchronization or deduplication.
40
+
41
+ Read back the rule and inspect its matching history/status. Report API-reported
42
+ bytes/objects separately from an independent destination-content check. Do not claim
43
+ that a backup is restorable, checksums match, or the model artifact is valid solely
44
+ because the transfer status is successful. Keep the NFS originals unless deletion
45
+ was separately requested and verified as safe.
46
+
47
+ ## Sources
48
+
49
+ - [Transfers between S3 and NFS](https://cloud.ru/docs/aicloud/mlspace/concepts/guides/guides__dc/data-catalog__data-processing__move-data-s3-nfs)
50
+ - [Destination connector types](https://cloud.ru/docs/aicloud/mlspace-cli/topics/references__transfer-create)
51
+ - [Advanced destination prerequisites](https://cloud.ru/docs/aicloud/mlspace/concepts/tutorials/data-use/data-use-migration-from-s3-to-adv)
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: mlspace-migrate-s3-to-s3
3
+ description: "Copy or sync between S3 buckets through Cloud.ru MLSpace Data Transfer, including external S3 to Evolution/Advanced and cross-project buckets. Uses mlspace_data_transfer; checks endpoint/bucket identity and destination-specific prerequisites."
4
+ license: MIT
5
+ ---
6
+
7
+ # Migrate data between S3 buckets
8
+
9
+ Read [the shared transfer procedure](../mlspace-transfer-data/SKILL.md). Use this
10
+ for object-storage → object-storage, without silently introducing NFS as a staging hop.
11
+
12
+ ## Resolve two independent S3 ends
13
+
14
+ 1. Establish source and destination endpoint, bucket, prefix and owning project/account.
15
+ Equal bucket names on different endpoints do not identify the same storage.
16
+ Resolve identical or overlapping prefixes on the same bucket before synchronizing.
17
+ 2. Use `mlspace_data_transfer` actions `list_connectors` and `get_connector` to reuse
18
+ matching connectors. Confirm IDs and actual types separately. Cross-project
19
+ migration can require a custom connector for the other project's bucket;
20
+ availability of one project's system connector does not establish access to another.
21
+ 3. Check source and destination enums separately. The current target schema includes
22
+ `s3custom` and `s3evolution`, but not every S3 source type. Select a verified target
23
+ connector; do not relabel an existing connector to force a match.
24
+ 4. Evolution's documented migration path can use a Custom S3 destination. Obtain
25
+ its precise endpoint and S3-compatible authentication through the approved secret
26
+ workflow; do not guess credential formatting from an IAM Key ID alone. Advanced
27
+ uses its bucket endpoint and OBS AK/SK. Reuse existing connectors without reading
28
+ or displaying their secret values.
29
+ 5. The Advanced migration guide requires a destination compatible with its SSE-KMS
30
+ restriction. Do not automatically disable bucket encryption. Resolve this with
31
+ the user or choose an agreed compatible destination. Recommended chunking in
32
+ that tutorial is preparation guidance, not a universal API object-size limit.
33
+
34
+ ## Configure a copy, not an implicit cutover
35
+
36
+ - Use the actual endpoint's transfer schema. Older tutorials include `legacy` and
37
+ a fixed cluster: do not copy those into `TransferInputViewModelV5` blindly. Even an
38
+ S3 → S3 rule needs a verified execution `cluster_name`; no NFS end is implied.
39
+ - Preserve exact object-prefix semantics. Multiple source prefixes, where supported,
40
+ go into the API's `query.source` list; the CLI's comma syntax is not proof that the
41
+ API wants a comma-joined string.
42
+ - Confirm copy/append/sync intent and apply shared file-count checks. Neither a
43
+ scheduled copy nor `append_new` proves bidirectional replication or CDC.
44
+ - Create/update once, then read back and track the matching run. On an uncertain
45
+ write result, locate the existing rule/run before retrying. Report any unverified
46
+ destination-content checks explicitly.
47
+ - Do not delete the source bucket, rotate keys, switch application endpoints or
48
+ perform a cutover as an implicit part of migration. Those are separate operations.
49
+
50
+ ## Sources
51
+
52
+ - [External S3 to Evolution](https://cloud.ru/docs/aicloud/mlspace/concepts/tutorials/data-use/data-use-migration-from-s3-to-evo)
53
+ - [External S3 to Advanced](https://cloud.ru/docs/aicloud/mlspace/concepts/tutorials/data-use/data-use-migration-from-s3-to-adv)
54
+ - [Cross-project S3 transfers](https://cloud.ru/docs/aicloud/mlspace/concepts/faq__data-catalog)
@@ -9,6 +9,13 @@ compatibility: Requires the `mlspace` MCP server from this plugin (Cloud.ru MLSp
9
9
 
10
10
  Copy/sync S3 -> NFS for a GPU job, optionally on a schedule. Write action.
11
11
 
12
+ Read [the shared transfer checks](../mlspace-transfer-data/SKILL.md) for file-count
13
+ limits, connector permissions and destination prerequisites, then follow this
14
+ S3-specific procedure. Do not reload this file when following the shared router.
15
+
16
+ For NFS -> NFS, cross-cluster/cross-workspace transfers, other connector routes,
17
+ or checking NFS file-count limits, use `mlspace-transfer-data` from this plugin.
18
+
12
19
  This skill drives the `mlspace` MCP server shipped in the same plugin. If its
13
20
  tools are not connected, say so instead of guessing — none of these steps can be
14
21
  carried out any other way.
@@ -29,8 +36,11 @@ carried out any other way.
29
36
  Goal: copy/sync S3 -> NFS, optionally on a nightly schedule (write actions;
30
37
  refused under MLSPACE_READONLY=true).
31
38
  1. data_transfer list_connectors with page=1, page_size=20; continue as needed to
32
- locate the requested connectors. SOURCE: an object-storage connector (s3amazon/
33
- s3custom/s3google). DEST: an NFS/cluster connector. Capture both connector ids.
39
+ locate the requested connectors. SOURCE: a verified object-storage connector
40
+ (e.g. s3amazon/s3custom/s3google/s3evolution, as supported by the endpoint).
41
+ DEST: an NFS/cluster connector with its actual nfs/nfsprivate/nfsshared type.
42
+ Capture both connector ids. Do not create a custom s3evolution or NFS connector;
43
+ reuse system connectors or use an authorized custom S3 connector where appropriate.
34
44
  Reuse existing system connectors rather than attempting to create them. A system
35
45
  NFS connector may be absent from list output. For the selected destination
36
46
  workspace, its workspace ID can be tested as a candidate via get_connector
@@ -44,7 +54,10 @@ refused under MLSPACE_READONLY=true).
44
54
  direct route is not established; do not launch a multi-hop transfer without an
45
55
  agreed intermediate destination and confirmation of both supported legs.
46
56
  If names or destination remain ambiguous, ask the user.
47
- 3. (optional, S3 only) try_connector to pre-check connectivity (+ its /try/logs).
57
+ 3. Read existing connector details/logs first. Only for a supported custom S3
58
+ connector, and when activation is authorized, use try_connector to check
59
+ connectivity and activate it. Never use it for a system s3evolution connector
60
+ or merely to read logs; get_connector_logs reads the existing logs.
48
61
  4. Ensure source_path + destination_path are known (ask if absent). Choose the
49
62
  strategy from the user's overwrite/append/sync intent; recurrence alone does
50
63
  not determine it. For a schedule, confirm the time and timezone and build
@@ -57,10 +70,14 @@ refused under MLSPACE_READONLY=true).
57
70
  For a one-off run omit crontab; creation starts the transfer immediately.
58
71
  5. list_transfers; if one matches this source->dest and the user means "edit", capture
59
72
  its id for update instead of create.
60
- 6. create_transfer (body=TransferInputViewModelV5: name, connector ids, paths,
61
- cluster_name, strategy, optional crontab) OR update_transfer(id_, full body).
73
+ 6. create_transfer (body=TransferInputViewModelV5: name, cluster_name, connector_id,
74
+ destination_connector_id, connector_type, destination_connector_type, strategy,
75
+ favorite, query={source, destination}, optional crontab/description)
76
+ OR update_transfer(id_, full body).
62
77
  To just enable/disable: switch_transfer(id_, body={"active": true|false}).
63
- 7. Verify: list_history(transfer_id) -> latest run id + status; get_history_status.
78
+ 7. Verify: get_transfer(transfer_id) to read back the rule; list_history(transfer_id,
79
+ page=1, page_size=20) to identify the matching run by IDs and times rather than
80
+ list order; get_history_status(ids=[history_id]) to check that run's status.
64
81
  Output: source and destination, the created/updated transfer id, schedule with
65
82
  timezone, and verified run status. A future scheduled run has not succeeded yet.
66
83
  Before writing, summarize the destination, strategy and schedule for the user;
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: mlspace-transfer-data
3
+ description: "Plan Cloud.ru MLSpace data movement when the route is not yet chosen, or apply the shared create/update/schedule/verification procedure for mlspace_data_transfer. Route-specific skills cover NFS to NFS, NFS to S3, S3 to NFS, S3 to S3 and database exports."
4
+ license: MIT
5
+ compatibility: Requires the `mlspace` MCP server from this plugin (Cloud.ru MLSpace credentials needed).
6
+ ---
7
+
8
+ # Transfer data between supported sources and destinations
9
+
10
+ Use `mlspace_data_transfer` to prepare and, when requested, create/update a transfer.
11
+ An explanation or route feasibility question needs reads only. Creation without a
12
+ schedule starts a transfer immediately; it is not a dry run. Respect read-only mode.
13
+
14
+ For a known route, read only the matching procedure:
15
+
16
+ | Requested movement | Procedure |
17
+ | --- | --- |
18
+ | NFS → NFS, including other regions/workspaces | [NFS transfer](../mlspace-transfer-nfs-to-nfs/SKILL.md) |
19
+ | NFS → S3: results, checkpoints, datasets | [S3 export](../mlspace-export-nfs-to-s3/SKILL.md) |
20
+ | S3 → NFS: staging data for jobs | [NFS staging](../mlspace-stage-s3-to-nfs/SKILL.md) |
21
+ | S3 → S3, including Evolution/Advanced | [Bucket migration](../mlspace-migrate-s3-to-s3/SKILL.md) |
22
+ | Database → supported storage | [Database export](../mlspace-export-database-data/SKILL.md) |
23
+
24
+ If arriving from that procedure, continue below without reloading it. Do not read
25
+ all sibling skills for one request.
26
+
27
+ ## Resolve both ends
28
+
29
+ 1. Identify the workspace where the rule will live (`target`), source and destination
30
+ connectors, both paths, and the user's copy/append/sync intent. For each NFS end,
31
+ identify its workspace and exact region/storage variant separately. The same path
32
+ in two regions need not refer to the same files. Do not silently use the current
33
+ workspace for a destination in another workspace.
34
+ 2. Find connectors with `list_connectors(page=1, page_size=20)`, paging as needed,
35
+ and confirm selected IDs/types with `get_connector(connector_type, id_)` in the
36
+ relevant connected workspace. Keep `target` explicit for multi-workspace work.
37
+ A system NFS connector can be absent from the list: the intended workspace ID
38
+ can be checked as a candidate with `get_connector(connector_type="nfs", id_=...)`.
39
+ Use it only after confirming its identity. Do not treat every workspace ID as
40
+ a connector ID or probe unrelated workspaces.
41
+ 3. Reuse system connectors (`nfs`, `nfsprivate`, `nfsshared`, etc.). `list_sources`
42
+ describes types/parameters; it does not authorize creating every listed type.
43
+ Only create a custom connector when requested, using the create_connector schema.
44
+ Do not request connector passwords in chat or expose them in the answer.
45
+
46
+ ## Establish the route before writing
47
+
48
+ - Read the configured endpoint's current transfer schema: `TransferInputViewModelV5`,
49
+ `TransferClusterEnum`, `TransferMultiClusterEnum`, `ConnectorTypes` and
50
+ `ConnectorTypesTarget`. These are in `/public/v2/openapi.json`; use schemas already
51
+ exposed by the connected tools or retrieve that public document if available.
52
+ If unavailable, use verified task context or ask for the missing route details.
53
+ A bundled schema is a snapshot, not evidence of current access or reachability.
54
+ - A source type is not automatically allowed as a destination. Check both enums.
55
+ - For cross-cluster NFS → NFS, use an exact directed value from
56
+ `TransferMultiClusterEnum` for `cluster_name`. Do not concatenate region labels,
57
+ infer the reverse route, or assume all pairs are supported. Two NFS variants
58
+ within one region may also require an explicit route. A shared connector ID
59
+ does not make two storage locations identical; check the route and paths.
60
+ - Enum membership establishes an accepted value, not permission or a working
61
+ data path. Verify both connectors and available access information. If a route
62
+ cannot be established, explain what is missing before creating anything.
63
+ Do not substitute another region or start a two-hop copy via S3 without an agreed
64
+ intermediate destination and verification of both legs.
65
+ - `try_connector` is for supported custom connectors and changes state. Do not
66
+ apply it to system NFS connectors or use it as a read-only route check.
67
+
68
+ ## Relevant NFS limits
69
+
70
+ The official documentation linked below was checked on 2026-10-13. Recheck it
71
+ when the requested scale, storage type or deployment makes these limits relevant.
72
+
73
+ - The documented per-transfer threshold is 400,000 files. For append-new and full
74
+ synchronization, count source and destination files together. The prose and
75
+ example disagree at exactly 400,000: do not promise that boundary succeeds;
76
+ confirm it with the service team or propose smaller batches with the user.
77
+ - NFS also has namespace file quotas. Byte capacity alone does not establish room
78
+ for the copy. The MCP does not provide a general NFS directory walk: do not invent
79
+ file counts or available capacity. Use available evidence, or explain which size
80
+ check remains unverified when it affects the requested transfer.
81
+ - For a Personal Directory destination, documentation requires updating workspaces
82
+ created before 2024-11-01. Check whether it is already updated; do not update a
83
+ workspace automatically as part of copying data.
84
+
85
+ These are task-specific checks, not a general warning block for every answer.
86
+
87
+ ## Create, update and verify
88
+
89
+ 1. For an existing rule, use `get_transfer(transfer_id)` or locate it with
90
+ `list_transfers`. A shortened list does not establish that no matching rule
91
+ exists. Do not create a duplicate to work around an unknown ID.
92
+ 2. Build the write schema explicitly; do not POST the GET response unchanged:
93
+ `name`, `cluster_name`, `connector_id`, `destination_connector_id`,
94
+ `connector_type`, `destination_connector_type`, `strategy`, `favorite`,
95
+ `query={source, destination}`, and optional `description`/`crontab`.
96
+ Use the actual connector type returned for each end, not a guessed generic NFS type.
97
+ 3. Choose `write_all`, `append_new` or `sync_all` from the requested behavior and
98
+ verified service semantics. A recurring schedule alone does not determine the
99
+ strategy. For scheduling use a `CronViewModel` object, not a cron string; establish
100
+ period units and timezone semantics before converting a human recurrence.
101
+ 4. Summarize source → destination, region/storage variants, strategy and schedule.
102
+ Obtain missing intent before writing, particularly destructive sync behavior.
103
+ Use `create_transfer(body=...)` or `update_transfer(id_, body=...)` as requested.
104
+ If a write times out, check whether the rule/run already exists before retrying.
105
+ 5. Read back with `get_transfer`, comparing both ends, route, strategy and schedule.
106
+ Use `list_history(transfer_id, page=1, page_size=20)` and
107
+ `get_history_status(ids=[history_id])` for the matching run. A saved rule or future
108
+ scheduled run is not a completed copy. Do not assume list ordering proves which
109
+ run belongs to this request; compare IDs and times.
110
+ 6. On failure, use `get_event_logs(history_id, offset=0, limit=50,
111
+ as_enum_resolved=true)` or the `mlspace-diagnose-data-transfer` skill. Zero counters
112
+ or AccessDenied do not prove that the destination was unchanged. Do not rerun
113
+ merely to diagnose a failure.
114
+
115
+ Answer in the user's language: what was configured, where data goes, rule/run ID,
116
+ and observed status. Keep tool-specific cautions internal unless they block this
117
+ task or the user asks for diagnosis. For the narrower S3 → NFS staging workflow,
118
+ the `mlspace-stage-s3-to-nfs` skill is also available.
119
+
120
+ ## Official references
121
+
122
+ - [Cross-region and cross-workspace NFS transfers](https://cloud.ru/docs/aicloud/mlspace/concepts/faq__data-catalog)
123
+ - [Creating a rule and Personal Directory prerequisites](https://cloud.ru/docs/aicloud/mlspace/concepts/guides/guides__dc/data-catalog__data-processing__create-transfer-rule)
124
+ - [File-count limits](https://cloud.ru/docs/aicloud/mlspace/concepts/overview__limitations)
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: mlspace-transfer-nfs-to-nfs
3
+ description: "Copy or sync NFS data on Cloud.ru MLSpace between regions, storage variants or workspaces, including Personal Directory and shared NFS. Uses mlspace_data_transfer; verifies both locations and the directed route before writing."
4
+ license: MIT
5
+ ---
6
+
7
+ # Copy NFS data between storage locations
8
+
9
+ Use this for NFS → NFS, including regional migration and copying a dataset to
10
+ another workspace. Read [the shared transfer procedure](../mlspace-transfer-data/SKILL.md)
11
+ for discovery, write authorization, limits, scheduling and verification, then apply
12
+ the checks below. Tools must be connected before carrying out the operation.
13
+
14
+ ## Resolve the two locations
15
+
16
+ - Ask only for missing source/destination workspace, region/storage variant and path.
17
+ Confirm which workspace owns the transfer rule (`target`). Never change `target`
18
+ implicitly halfway through a multi-workspace operation.
19
+ - Inspect both connectors with `mlspace_data_transfer` actions `list_connectors`
20
+ and `get_connector`. Use their actual `nfs`, `nfsprivate` or `nfsshared` type.
21
+ System connectors are reused, not created as custom connectors.
22
+ - A notebook's `/home/jovyan/...` mount is not automatically the transfer-service
23
+ path. Establish the connector-relative path from the selected storage's metadata,
24
+ a verified existing rule or the user's copied NFS object path; do not strip or
25
+ prepend path segments by guesswork.
26
+ - The same workspace/connector ID can address different regional NFS locations.
27
+ Compare workspace, storage variant, route and path together. Conversely, copying
28
+ onto the exact same storage/path is not a migration; resolve that ambiguity before
29
+ creating a rule. Check overlapping source/destination folders when synchronizing.
30
+
31
+ ## Match the exact direction
32
+
33
+ For cross-cluster or cross-storage transfer, select the directed value published
34
+ in the configured endpoint's `TransferMultiClusterEnum`. Never turn UI labels into
35
+ a route by joining them with `->`. Do not infer a supported reverse route from
36
+ the forward one. For a same-storage copy, use the applicable single-cluster value.
37
+ Schema acceptance is not a reachability or permissions test.
38
+
39
+ If the requested direct route is absent or uncertain, keep the task pending at
40
+ route selection. A two-leg copy via S3 requires an agreed intermediate location
41
+ and verification of both legs; it is not an automatic fallback.
42
+
43
+ Before writing, apply the shared file-count and namespace quota checks. For an
44
+ individual notebook's Personal Directory, establish whether the documented
45
+ pre-2024-11-01 workspace update prerequisite is satisfied. Do not update the
46
+ workspace, change quota or create a notebook to make the copy work automatically.
47
+
48
+ ## Complete the requested copy
49
+
50
+ Use `create_transfer` or `update_transfer` with the confirmed connector IDs,
51
+ types, direction, paths and strategy. Follow the shared readback/history checks.
52
+ Report both storage locations and the matching run status. A successful copy does
53
+ not authorize deleting the original data, and a scheduled rule is not completed
54
+ data movement.
55
+
56
+ ## Sources
57
+
58
+ - [NFS transfers across regions and workspaces](https://cloud.ru/docs/aicloud/mlspace/concepts/faq__data-catalog)
59
+ - [Rule creation and Personal Directory prerequisites](https://cloud.ru/docs/aicloud/mlspace/concepts/guides/guides__dc/data-catalog__data-processing__create-transfer-rule)
60
+ - [Transfer limits](https://cloud.ru/docs/aicloud/mlspace/concepts/overview__limitations)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mlspace-plugin"
3
- version = "0.3.3"
3
+ version = "0.3.5"
4
4
  description = "Cloud.ru MLSpace plugin: MCP server, agent skills and setup"
5
5
  keywords = ["mlspace", "mcp", "agent-skills", "cloudru"]
6
6
  classifiers = [