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.
- {py_env_studio-2.1.1/py_env_studio.egg-info → py_env_studio-2.1.2}/PKG-INFO +2 -2
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/PYPI_README.md +1 -1
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/README.md +15 -3
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/config.ini +1 -1
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/__init__.py +13 -0
- py_env_studio-2.1.2/py_env_studio/core/mcp/tools/analysis.py +87 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/main_window.py +26 -1
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/vulneribility_scanner.py +1 -1
- {py_env_studio-2.1.1 → py_env_studio-2.1.2/py_env_studio.egg-info}/PKG-INFO +2 -2
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/SOURCES.txt +34 -1
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/pyproject.toml +1 -1
- py_env_studio-2.1.2/tests/test_all_features.py +568 -0
- py_env_studio-2.1.2/tests/test_app_logging.py +183 -0
- py_env_studio-2.1.2/tests/test_app_updates.py +106 -0
- py_env_studio-2.1.2/tests/test_cli_commands.py +126 -0
- py_env_studio-2.1.2/tests/test_cli_progress.py +134 -0
- py_env_studio-2.1.2/tests/test_community_templates.py +158 -0
- py_env_studio-2.1.2/tests/test_configuration_service.py +139 -0
- py_env_studio-2.1.2/tests/test_dependency_preview.py +288 -0
- py_env_studio-2.1.2/tests/test_github_template_import.py +81 -0
- py_env_studio-2.1.2/tests/test_mcp_consistency.py +438 -0
- py_env_studio-2.1.2/tests/test_mcp_server.py +350 -0
- py_env_studio-2.1.2/tests/test_package_update_monitor.py +579 -0
- py_env_studio-2.1.2/tests/test_plugin_events.py +45 -0
- py_env_studio-2.1.2/tests/test_plugin_import.py +21 -0
- py_env_studio-2.1.2/tests/test_plugin_load.py +28 -0
- py_env_studio-2.1.2/tests/test_plugin_manager.py +205 -0
- py_env_studio-2.1.2/tests/test_project_contract.py +494 -0
- py_env_studio-2.1.2/tests/test_project_intelligence.py +631 -0
- py_env_studio-2.1.2/tests/test_project_openers.py +85 -0
- py_env_studio-2.1.2/tests/test_project_runtime.py +89 -0
- py_env_studio-2.1.2/tests/test_runtime_cache.py +234 -0
- py_env_studio-2.1.2/tests/test_runtime_providers.py +400 -0
- py_env_studio-2.1.2/tests/test_schema_templates.py +141 -0
- py_env_studio-2.1.2/tests/test_status_progress.py +192 -0
- py_env_studio-2.1.2/tests/test_template_engine.py +178 -0
- py_env_studio-2.1.2/tests/test_template_registry.py +73 -0
- py_env_studio-2.1.2/tests/test_template_workflow.py +54 -0
- py_env_studio-2.1.2/tests/test_ui_backend.py +63 -0
- py_env_studio-2.1.2/tests/test_user_template_store.py +125 -0
- py_env_studio-2.1.2/tests/test_uv_packages.py +47 -0
- py_env_studio-2.1.2/tests/test_vulnerability_insights_charts.py +256 -0
- py_env_studio-2.1.2/tests/test_vulnerability_insights_update.py +387 -0
- py_env_studio-2.1.2/tests/test_window_icon.py +297 -0
- py_env_studio-2.1.1/py_env_studio/core/mcp/tools/analysis.py +0 -20
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/LICENSE +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/__main__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/commands.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/app_updates.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/auto_resolve.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/bootstrap.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/configuration.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/database.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/dependency_preview.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/env_manager.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/environment_lock.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/integration.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/config.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/context.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/errors.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/schemas/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/schemas/responses.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/server.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/environments.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/packages.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/project.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/mcp/tools/security.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/package_manager.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/package_update_monitor.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/pip_tools.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/base.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/exceptions.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/plugins/manager.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/models.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/repository.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_contract/service.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/models.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_intelligence/service.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/project_launcher.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/py_tonic.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_cache.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_providers.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/runtime_toggle.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/environment_locks.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/environments.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/migration.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/package_updates.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/project_contract.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/runtime_cache.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/schema_core.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/schema_runtime_cache.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/schema/vulnerability.sql +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/setup_state.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/strategies.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/builtin_templates.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/community.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/content_filters.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/engine.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/github_import.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/models.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/registry.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/user_template_store.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/validator.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/templates/workflow.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/tool_probe.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/tools.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/uv_tools.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/core/windows_apps.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/main.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/about.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/activate-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/available-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/create-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/delete-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/export.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/install.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/list-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/logo.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/packages.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-default-transparrent.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-icon-default.ico +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/pes-icon-default.png +0 -0
- {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
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/requirements.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/selected-env.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/uninstall.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/static/icons/update.png +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/status_bar.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/ui/ui_tasks.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/__init__.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/app_icon.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/app_logging.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/db_status.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/handlers.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/progress.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/version_utils.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio/utils/vulneribility_insights.py +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/dependency_links.txt +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/entry_points.txt +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/requires.txt +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/py_env_studio.egg-info/top_level.txt +0 -0
- {py_env_studio-2.1.1 → py_env_studio-2.1.2}/setup.cfg +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -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=
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
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.
|
|
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 = [
|