py-env-studio 2.1.1__tar.gz → 2.1.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.
Files changed (154) hide show
  1. {py_env_studio-2.1.1/py_env_studio.egg-info → py_env_studio-2.1.2}/PKG-INFO +2 -2
  2. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/PYPI_README.md +1 -1
  3. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/README.md +15 -3
  4. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/config.ini +1 -1
  5. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/__init__.py +13 -0
  6. py_env_studio-2.1.2/py_env_studio/core/mcp/tools/analysis.py +87 -0
  7. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/main_window.py +26 -1
  8. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/vulneribility_scanner.py +1 -1
  9. {py_env_studio-2.1.1 → py_env_studio-2.1.2/py_env_studio.egg-info}/PKG-INFO +2 -2
  10. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/SOURCES.txt +34 -1
  11. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/pyproject.toml +1 -1
  12. py_env_studio-2.1.2/tests/test_all_features.py +568 -0
  13. py_env_studio-2.1.2/tests/test_app_logging.py +183 -0
  14. py_env_studio-2.1.2/tests/test_app_updates.py +106 -0
  15. py_env_studio-2.1.2/tests/test_cli_commands.py +126 -0
  16. py_env_studio-2.1.2/tests/test_cli_progress.py +134 -0
  17. py_env_studio-2.1.2/tests/test_community_templates.py +158 -0
  18. py_env_studio-2.1.2/tests/test_configuration_service.py +139 -0
  19. py_env_studio-2.1.2/tests/test_dependency_preview.py +288 -0
  20. py_env_studio-2.1.2/tests/test_github_template_import.py +81 -0
  21. py_env_studio-2.1.2/tests/test_mcp_consistency.py +438 -0
  22. py_env_studio-2.1.2/tests/test_mcp_server.py +350 -0
  23. py_env_studio-2.1.2/tests/test_package_update_monitor.py +579 -0
  24. py_env_studio-2.1.2/tests/test_plugin_events.py +45 -0
  25. py_env_studio-2.1.2/tests/test_plugin_import.py +21 -0
  26. py_env_studio-2.1.2/tests/test_plugin_load.py +28 -0
  27. py_env_studio-2.1.2/tests/test_plugin_manager.py +205 -0
  28. py_env_studio-2.1.2/tests/test_project_contract.py +494 -0
  29. py_env_studio-2.1.2/tests/test_project_intelligence.py +631 -0
  30. py_env_studio-2.1.2/tests/test_project_openers.py +85 -0
  31. py_env_studio-2.1.2/tests/test_project_runtime.py +89 -0
  32. py_env_studio-2.1.2/tests/test_runtime_cache.py +234 -0
  33. py_env_studio-2.1.2/tests/test_runtime_providers.py +400 -0
  34. py_env_studio-2.1.2/tests/test_schema_templates.py +141 -0
  35. py_env_studio-2.1.2/tests/test_status_progress.py +192 -0
  36. py_env_studio-2.1.2/tests/test_template_engine.py +178 -0
  37. py_env_studio-2.1.2/tests/test_template_registry.py +73 -0
  38. py_env_studio-2.1.2/tests/test_template_workflow.py +54 -0
  39. py_env_studio-2.1.2/tests/test_ui_backend.py +63 -0
  40. py_env_studio-2.1.2/tests/test_user_template_store.py +125 -0
  41. py_env_studio-2.1.2/tests/test_uv_packages.py +47 -0
  42. py_env_studio-2.1.2/tests/test_vulnerability_insights_charts.py +256 -0
  43. py_env_studio-2.1.2/tests/test_vulnerability_insights_update.py +387 -0
  44. py_env_studio-2.1.2/tests/test_window_icon.py +297 -0
  45. py_env_studio-2.1.1/py_env_studio/core/mcp/tools/analysis.py +0 -20
  46. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/LICENSE +0 -0
  47. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/__init__.py +0 -0
  48. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/__main__.py +0 -0
  49. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/commands.py +0 -0
  50. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/__init__.py +0 -0
  51. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/app_updates.py +0 -0
  52. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/auto_resolve.py +0 -0
  53. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/bootstrap.py +0 -0
  54. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/configuration.py +0 -0
  55. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/database.py +0 -0
  56. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/dependency_preview.py +0 -0
  57. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/env_manager.py +0 -0
  58. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/environment_lock.py +0 -0
  59. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/integration.py +0 -0
  60. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/__init__.py +0 -0
  61. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/config.py +0 -0
  62. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/context.py +0 -0
  63. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/errors.py +0 -0
  64. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/schemas/__init__.py +0 -0
  65. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/schemas/responses.py +0 -0
  66. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/server.py +0 -0
  67. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/environments.py +0 -0
  68. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/packages.py +0 -0
  69. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/project.py +0 -0
  70. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/security.py +0 -0
  71. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/package_manager.py +0 -0
  72. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/package_update_monitor.py +0 -0
  73. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/pip_tools.py +0 -0
  74. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/__init__.py +0 -0
  75. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/base.py +0 -0
  76. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/exceptions.py +0 -0
  77. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/manager.py +0 -0
  78. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/__init__.py +0 -0
  79. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/models.py +0 -0
  80. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/repository.py +0 -0
  81. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/service.py +0 -0
  82. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/__init__.py +0 -0
  83. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/models.py +0 -0
  84. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/service.py +0 -0
  85. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_launcher.py +0 -0
  86. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/py_tonic.py +0 -0
  87. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime.py +0 -0
  88. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_cache.py +0 -0
  89. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_providers.py +0 -0
  90. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_toggle.py +0 -0
  91. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/__init__.py +0 -0
  92. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/environment_locks.sql +0 -0
  93. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/environments.sql +0 -0
  94. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/migration.sql +0 -0
  95. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/package_updates.sql +0 -0
  96. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/project_contract.sql +0 -0
  97. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/runtime_cache.sql +0 -0
  98. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/schema_core.sql +0 -0
  99. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/schema_runtime_cache.sql +0 -0
  100. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/vulnerability.sql +0 -0
  101. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/setup_state.py +0 -0
  102. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/strategies.py +0 -0
  103. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/__init__.py +0 -0
  104. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/builtin_templates.py +0 -0
  105. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/community.py +0 -0
  106. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/content_filters.py +0 -0
  107. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/engine.py +0 -0
  108. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/github_import.py +0 -0
  109. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/models.py +0 -0
  110. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/registry.py +0 -0
  111. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/user_template_store.py +0 -0
  112. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/validator.py +0 -0
  113. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/workflow.py +0 -0
  114. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/tool_probe.py +0 -0
  115. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/tools.py +0 -0
  116. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/uv_tools.py +0 -0
  117. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/windows_apps.py +0 -0
  118. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/main.py +0 -0
  119. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/__init__.py +0 -0
  120. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/__init__.py +0 -0
  121. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/about.png +0 -0
  122. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/activate-env.png +0 -0
  123. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/available-env.png +0 -0
  124. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/create-env.png +0 -0
  125. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/delete-env.png +0 -0
  126. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/export.png +0 -0
  127. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/install.png +0 -0
  128. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/list-env.png +0 -0
  129. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/logo.png +0 -0
  130. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/packages.png +0 -0
  131. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-default-transparrent.png +0 -0
  132. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-icon-default.ico +0 -0
  133. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-icon-default.png +0 -0
  134. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-transparrent-icon-default.ico +0 -0
  135. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/requirements.png +0 -0
  136. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/selected-env.png +0 -0
  137. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/uninstall.png +0 -0
  138. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/update.png +0 -0
  139. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/status_bar.py +0 -0
  140. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/ui_tasks.py +0 -0
  141. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/__init__.py +0 -0
  142. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/app_icon.py +0 -0
  143. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/app_logging.py +0 -0
  144. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/db_status.py +0 -0
  145. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/handlers.py +0 -0
  146. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/progress.py +0 -0
  147. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/version_utils.py +0 -0
  148. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/vulneribility_insights.py +0 -0
  149. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/dependency_links.txt +0 -0
  150. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/entry_points.txt +0 -0
  151. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/requires.txt +0 -0
  152. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/top_level.txt +0 -0
  153. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/setup.cfg +0 -0
  154. {py_env_studio-2.1.1 → py_env_studio-2.1.2}/tests/test_environment_lock.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-env-studio
3
- Version: 2.1.1
3
+ Version: 2.1.2
4
4
  Summary: A comprehensive cross-platform GUI and CLI tool for managing Python virtual environments and packages with advanced features including environment lifecycle management, package operations, vulnerability scanning, security insights, project templates, Py-Tonic interactive learning mode, an extensible plugin system for custom functionality, and a local read-only MCP control plane (beta) for AI coding agents.
5
5
  Author-email: Py Env Studio Team <contact.shaikh.wasim@gmail.com>
6
6
  License: MIT License
@@ -161,7 +161,7 @@ Setup steps for VS Code and other clients:
161
161
 
162
162
  - Documentation home: [https://py-env-studio.readthedocs.io/](https://py-env-studio.readthedocs.io/)
163
163
  - Usage manual: [https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html](https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html)
164
- - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html)
164
+ - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html)
165
165
  - Source code: [https://github.com/pyenvstudio/py-env-studio](https://github.com/pyenvstudio/py-env-studio)
166
166
  - Issue tracker: [https://github.com/pyenvstudio/py-env-studio/issues](https://github.com/pyenvstudio/py-env-studio/issues)
167
167
 
@@ -96,7 +96,7 @@ Setup steps for VS Code and other clients:
96
96
 
97
97
  - Documentation home: [https://py-env-studio.readthedocs.io/](https://py-env-studio.readthedocs.io/)
98
98
  - Usage manual: [https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html](https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html)
99
- - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html)
99
+ - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html)
100
100
  - Source code: [https://github.com/pyenvstudio/py-env-studio](https://github.com/pyenvstudio/py-env-studio)
101
101
  - Issue tracker: [https://github.com/pyenvstudio/py-env-studio/issues](https://github.com/pyenvstudio/py-env-studio/issues)
102
102
 
@@ -29,7 +29,7 @@ Perfect for:
29
29
 
30
30
  ---
31
31
 
32
- ## 🆕 What's new in v2.1.0
32
+ ## 🆕 What's new in v2.1.2
33
33
 
34
34
  - 🧪 **MCP control plane (beta)** — a local, read-only MCP server lets AI coding
35
35
  agents (VS Code Copilot and other MCP clients) read authoritative
@@ -48,7 +48,7 @@ Perfect for:
48
48
  - 📊 **Native dashboard charts** (`tkinter-dash`, no matplotlib), 📶 a CLI
49
49
  progress gauge and GUI status gauge, and consistent application icons.
50
50
 
51
- → [Full v2.1.0 release notes](docs/releases/v2.1.0.md)
51
+ → [Full v2.1.2 release notes](docs/releases/v2.1.2.md)
52
52
 
53
53
  ---
54
54
 
@@ -105,7 +105,7 @@ PyEnvStudio now features a powerful plugin system that allows developers to exte
105
105
  - **Easy Development** - Simple plugin API with lifecycle management
106
106
  - **Examples Included** - Full working sample plugin with documentation
107
107
 
108
- See the [v2.1.0 release notes](docs/releases/v2.1.0.md) and the [plugin development guide](docs/plugins/development.md).
108
+ See the [v2.1.2 release notes](docs/releases/v2.1.2.md) and the [plugin development guide](docs/plugins/development.md).
109
109
 
110
110
  ### Additional implemented capabilities
111
111
 
@@ -272,6 +272,18 @@ APIs are public, read-only, no auth required.
272
272
  We welcome contributions!
273
273
  Feel free to fork the repository, raise issues, or submit pull requests.
274
274
 
275
+ ## Acknowledgements
276
+
277
+ Py Env Studio is built on the work of the Python community and the broader open-source ecosystem.
278
+
279
+ **Built with:** [Python](https://www.python.org/), [CustomTkinter](https://github.com/TomSchimansky/CustomTkinter), which provides the desktop UI foundation, and [Pillow](https://python-pillow.org/) for image and icon handling.
280
+
281
+ **Integrates with:** the [Python Install Manager](https://docs.python.org/3/using/windows.html#python-install-manager) for Python runtime management; [PyPI](https://pypi.org/) and the [Python Packaging community](https://packaging.python.org/) for package distribution and metadata; and [pip](https://pip.pypa.io/) and [uv](https://docs.astral.sh/uv/) for package management.
282
+
283
+ Thanks to the maintainers and contributors behind these projects and to everyone building Python and open-source software. These acknowledgements do not imply endorsement, affiliation, or official partnership.
284
+
285
+ *Built with Python. Powered by open source.*
286
+
275
287
  **⚖️ License**
276
288
  This project is licensed under the MIT License.
277
289
 
@@ -1,5 +1,5 @@
1
1
  [project]
2
- version = 2.1.1
2
+ version = 2.1.2
3
3
 
4
4
  [settings]
5
5
  venv_dir = ~/.py_env_studio/venvs
@@ -93,6 +93,19 @@ TOOL_DEFINITIONS = [
93
93
  },
94
94
  "handler": analysis.analyze_project,
95
95
  },
96
+ {
97
+ "name": "pyenv_check_consistency",
98
+ "description": "Before modifying any Python project's dependencies or running its tests, call this to determine which interpreter, environment, lockfile, and manifest the project actually uses, and whether they agree.",
99
+ "inputSchema": {
100
+ "type": "object",
101
+ "properties": {
102
+ "path": {"type": "string"},
103
+ "project_path": {"type": "string"},
104
+ },
105
+ "additionalProperties": False,
106
+ },
107
+ "handler": analysis.check_consistency,
108
+ },
96
109
  ]
97
110
 
98
111
 
@@ -0,0 +1,87 @@
1
+ """Project-intelligence tools (thin adapters over ProjectIntelligenceService).
2
+
3
+ Both tools are strictly read-only and reuse the same service. The consistency
4
+ tool is a stub: it reports what the existing analysis already knows and never
5
+ computes a verdict.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from ..errors import McpError
11
+ from ..schemas.responses import failure, success
12
+
13
+ # Probe stub: the tool does not read manifests or lockfiles yet, so these
14
+ # blocks are reported as unavailable instead of being guessed.
15
+ DECLARED_UNAVAILABLE_REASON = (
16
+ "Declared dependency manifests are not read by this tool."
17
+ )
18
+ RESOLVED_UNAVAILABLE_REASON = (
19
+ "Lockfile / resolved dependency state is not read by this tool."
20
+ )
21
+
22
+
23
+ def analyze_project(arguments):
24
+ # type: (dict) -> dict
25
+ from py_env_studio.core.project_intelligence import ProjectIntelligenceService
26
+
27
+ arguments = arguments or {}
28
+ try:
29
+ analysis = ProjectIntelligenceService().analyze(arguments.get("project_path"))
30
+ except McpError as exc:
31
+ return failure(exc.code, exc.message, exc.details)
32
+ except Exception as exc:
33
+ return failure("SERVICE_UNAVAILABLE", "Project analysis failed: {}".format(exc))
34
+ return success(analysis.to_dict(), cached=True)
35
+
36
+
37
+ def check_consistency(arguments):
38
+ # type: (dict) -> dict
39
+ """Report project/environment context for a Python project (stub).
40
+
41
+ Same project-path semantics as :func:`analyze_project` (``path``, or the
42
+ ``project_path`` spelling used by the other project tools; both optional).
43
+ The response reuses the existing ``ProjectAnalysis`` payload and adds
44
+ ``declared``/``resolved``/``installed`` blocks plus ``consistent``. The
45
+ verdict is always ``"unknown"`` because this tool does not evaluate
46
+ consistency (no manifest/lockfile reading, no new algorithms) — ``unknown``
47
+ does not mean consistent.
48
+ """
49
+ arguments = arguments or {}
50
+ path = arguments.get("path")
51
+ if path is None:
52
+ path = arguments.get("project_path")
53
+ try:
54
+ from py_env_studio.core.project_intelligence import ProjectIntelligenceService
55
+
56
+ analysis = ProjectIntelligenceService().analyze(path)
57
+ except McpError as exc:
58
+ return failure(exc.code, exc.message, exc.details)
59
+ except Exception as exc:
60
+ return failure("SERVICE_UNAVAILABLE", "Project analysis failed: {}".format(exc))
61
+ return success(_consistency_report(analysis.to_dict()), cached=True)
62
+
63
+
64
+ def _consistency_report(data):
65
+ # type: (dict) -> dict
66
+ """Map the existing analysis payload onto the consistency response shape.
67
+
68
+ Nothing is recalculated: ``declared`` and ``resolved`` are unavailable
69
+ (this tool reads neither), and ``installed`` re-exposes the
70
+ installed-package fact the analysis already produced.
71
+ """
72
+ dependencies = data.get("dependencies") or {}
73
+ environment = data.get("environment") or {}
74
+ installed = {"available": False}
75
+ if dependencies.get("analysis_available"):
76
+ installed = {
77
+ "available": True,
78
+ "environment_id": environment.get("id"),
79
+ "count": dependencies.get("installed"),
80
+ }
81
+ return {
82
+ "project": data,
83
+ "declared": {"available": False, "reason": DECLARED_UNAVAILABLE_REASON},
84
+ "resolved": {"available": False, "reason": RESOLVED_UNAVAILABLE_REASON},
85
+ "installed": installed,
86
+ "consistent": "unknown",
87
+ }
@@ -727,6 +727,20 @@ class PyEnvStudio(ctk.CTk):
727
727
  except Exception:
728
728
  logger.debug("Could not hide Create Environment dialog", exc_info=True)
729
729
 
730
+ def _create_env_dialog_is_open(self) -> bool:
731
+ """True while the Create Environment dialog is on screen.
732
+
733
+ Guard for helper windows that take a grab: stealing the grab from this
734
+ dialog makes its fields - the environment name first - uneditable.
735
+ """
736
+ dialog = getattr(self, "_create_env_dialog", None)
737
+ if dialog is None:
738
+ return False
739
+ try:
740
+ return bool(dialog.winfo_exists()) and bool(dialog.winfo_viewable())
741
+ except Exception:
742
+ return False
743
+
730
744
  def _build_env_create_form(self, parent):
731
745
  parent.grid_rowconfigure(1, weight=1)
732
746
  parent.grid_columnconfigure(0, weight=1)
@@ -743,7 +757,7 @@ class PyEnvStudio(ctk.CTk):
743
757
  # Environment name label and entry
744
758
  self.lbl(f, "New Environment Name:").grid(row=0, column=0, padx=(10, 5), pady=5, sticky="w")
745
759
  self.entry_env_name = self.entry(f, "Enter environment name")
746
- self.entry_env_name.grid(row=0, column=1, padx=(0, 10), pady=5, sticky="ew")
760
+ self.entry_env_name.grid(row=0, column=2, padx=(0, 10), pady=5, sticky="ew")
747
761
 
748
762
  # Python path label, entry, and browse button on row 1
749
763
  self.lbl(f, "Python Path (Optional):").grid(row=1, column=0, padx=(10, 5), pady=5, sticky="w")
@@ -3756,6 +3770,17 @@ class PyEnvStudio(ctk.CTk):
3756
3770
  """
3757
3771
  if once_per_session and getattr(self, "_pymanager_help_session_shown", False):
3758
3772
  return
3773
+ if self._create_env_dialog_is_open():
3774
+ # The Create Environment dialog already shows this guidance inline
3775
+ # (hint label plus the 'Get Python Install Manager' buttons), so the
3776
+ # popup would only duplicate it. Worse, its grab_set()/focus_force()
3777
+ # would take the pointer and the keyboard away from the dialog the
3778
+ # user just opened, making fields such as the environment name
3779
+ # impossible to edit.
3780
+ logger.debug(
3781
+ "Skipping Python Install Manager help popup; Create Environment dialog is open"
3782
+ )
3783
+ return
3759
3784
  existing = getattr(self, "_pymanager_help_popup", None)
3760
3785
  if existing is not None:
3761
3786
  try:
@@ -236,7 +236,7 @@ if __name__ == "__main__":
236
236
  sm = SecurityMatrix()
237
237
 
238
238
  # # Example: Scan single package
239
- # sm.scan_pkg("django", "2.1.0", env_id=DBHelper.get_or_create_env("test_env"))
239
+ # sm.scan_pkg("django", "2.1.2", env_id=DBHelper.get_or_create_env("test_env"))
240
240
 
241
241
  # Example: Scan entire environment
242
242
  # sm.scan_env("env_update2")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-env-studio
3
- Version: 2.1.1
3
+ Version: 2.1.2
4
4
  Summary: A comprehensive cross-platform GUI and CLI tool for managing Python virtual environments and packages with advanced features including environment lifecycle management, package operations, vulnerability scanning, security insights, project templates, Py-Tonic interactive learning mode, an extensible plugin system for custom functionality, and a local read-only MCP control plane (beta) for AI coding agents.
5
5
  Author-email: Py Env Studio Team <contact.shaikh.wasim@gmail.com>
6
6
  License: MIT License
@@ -161,7 +161,7 @@ Setup steps for VS Code and other clients:
161
161
 
162
162
  - Documentation home: [https://py-env-studio.readthedocs.io/](https://py-env-studio.readthedocs.io/)
163
163
  - Usage manual: [https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html](https://py-env-studio.readthedocs.io/en/latest/getting-started/usage.html)
164
- - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.0.html)
164
+ - Release notes: [https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html](https://py-env-studio.readthedocs.io/en/latest/releases/v2.1.2.html)
165
165
  - Source code: [https://github.com/pyenvstudio/py-env-studio](https://github.com/pyenvstudio/py-env-studio)
166
166
  - Issue tracker: [https://github.com/pyenvstudio/py-env-studio/issues](https://github.com/pyenvstudio/py-env-studio/issues)
167
167
 
@@ -115,4 +115,37 @@ py_env_studio/utils/progress.py
115
115
  py_env_studio/utils/version_utils.py
116
116
  py_env_studio/utils/vulneribility_insights.py
117
117
  py_env_studio/utils/vulneribility_scanner.py
118
- tests/test_environment_lock.py
118
+ tests/test_all_features.py
119
+ tests/test_app_logging.py
120
+ tests/test_app_updates.py
121
+ tests/test_cli_commands.py
122
+ tests/test_cli_progress.py
123
+ tests/test_community_templates.py
124
+ tests/test_configuration_service.py
125
+ tests/test_dependency_preview.py
126
+ tests/test_environment_lock.py
127
+ tests/test_github_template_import.py
128
+ tests/test_mcp_consistency.py
129
+ tests/test_mcp_server.py
130
+ tests/test_package_update_monitor.py
131
+ tests/test_plugin_events.py
132
+ tests/test_plugin_import.py
133
+ tests/test_plugin_load.py
134
+ tests/test_plugin_manager.py
135
+ tests/test_project_contract.py
136
+ tests/test_project_intelligence.py
137
+ tests/test_project_openers.py
138
+ tests/test_project_runtime.py
139
+ tests/test_runtime_cache.py
140
+ tests/test_runtime_providers.py
141
+ tests/test_schema_templates.py
142
+ tests/test_status_progress.py
143
+ tests/test_template_engine.py
144
+ tests/test_template_registry.py
145
+ tests/test_template_workflow.py
146
+ tests/test_ui_backend.py
147
+ tests/test_user_template_store.py
148
+ tests/test_uv_packages.py
149
+ tests/test_vulnerability_insights_charts.py
150
+ tests/test_vulnerability_insights_update.py
151
+ tests/test_window_icon.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "py-env-studio"
7
- version = "2.1.1"
7
+ version = "2.1.2"
8
8
  description = "A comprehensive cross-platform GUI and CLI tool for managing Python virtual environments and packages with advanced features including environment lifecycle management, package operations, vulnerability scanning, security insights, project templates, Py-Tonic interactive learning mode, an extensible plugin system for custom functionality, and a local read-only MCP control plane (beta) for AI coding agents."
9
9
  requires-python = ">=3.12"
10
10
  authors = [