hatch-xclam 0.7.0.dev12__tar.gz → 0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hatch_xclam-0.7.0.dev12/hatch_xclam.egg-info → hatch_xclam-0.7.1}/PKG-INFO +41 -32
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/README.md +39 -31
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/cli_hatch.py +120 -18
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/__init__.py +4 -2
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/backup.py +62 -31
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/models.py +125 -1
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/strategies.py +268 -1
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1/hatch_xclam.egg-info}/PKG-INFO +41 -32
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/SOURCES.txt +24 -118
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/requires.txt +1 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/top_level.txt +0 -2
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/pyproject.toml +3 -2
- hatch_xclam-0.7.1/tests/integration/__init__.py +5 -0
- hatch_xclam-0.7.1/tests/integration/test_mcp_kiro_integration.py +153 -0
- hatch_xclam-0.7.1/tests/regression/__init__.py +5 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_codex_backup_integration.py +162 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_codex_host_strategy.py +163 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_codex_model_validation.py +117 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_backup_integration.py +241 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_cli_integration.py +141 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_decorator_registration.py +71 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_host_strategy.py +214 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_model_validation.py +116 -0
- hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_omni_conversion.py +104 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data_utils.py +108 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_all_host_specific_args.py +194 -1
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_direct_management.py +8 -5
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py +0 -45
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -365
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1272
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -152
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -270
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -704
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -709
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -173
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -169
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -113
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -805
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1172
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1319
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -128
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -104
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -462
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -56
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2745
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3976
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2965
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -67
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1391
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -26
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3112
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -99
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -767
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1260
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -373
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1939
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +0 -54
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -303
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3196
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +0 -15
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +0 -108
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +0 -252
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +0 -83
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +0 -359
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +0 -61
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +0 -192
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py +0 -252
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +0 -825
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +0 -90
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +0 -1030
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py +0 -553
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py +0 -172
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py +0 -563
- hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/test_gyp.py +0 -261
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/LICENSE +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/__init__.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/environment_manager.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/__init__.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/dependency_installation_orchestrator.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/docker_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/hatch_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/installation_context.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/installer_base.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/python_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/registry.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/system_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/host_management.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/reporting.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/package_loader.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/python_environment_manager.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/registry_explorer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/registry_retriever.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/template_generator.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/dependency_links.txt +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/entry_points.txt +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/setup.cfg +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/__init__.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/run_environment_tests.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_cli_version.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg_v2/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg_v2/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/utility_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/utility_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/complex_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/complex_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/docker_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/docker_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/mixed_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/mixed_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/python_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/python_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/simple_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/simple_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/system_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/system_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/circular_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/circular_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/circular_dep_pkg_b/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/circular_dep_pkg_b/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/invalid_dep_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/invalid_dep_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/version_conflict_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/error_scenarios/version_conflict_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/schema_versions/schema_v1_1_0_pkg/main.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/schema_versions/schema_v1_2_0_pkg/main.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/schema_versions/schema_v1_2_1_pkg/hatch_mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/schema_versions/schema_v1_2_1_pkg/mcp_server.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_dependency_orchestrator_consent.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_docker_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_env_manip.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_hatch_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_installer_base.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_atomic_operations.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_backup_integration.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_backup_management.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_discovery_listing.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_host_config_integration.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_package_management.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_partial_updates.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_environment_integration.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_config_backup.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_configuration_manager.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_registry_decorator.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_pydantic_architecture_v4.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_server_config_models.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_server_config_type_field.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_sync_functionality.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_user_feedback_reporting.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_non_tty_integration.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_online_package_loader.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_python_environment_manager.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_python_installer.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_registry.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_registry_retriever.py +0 -0
- {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_system_installer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hatch-xclam
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Package manager for the Cracking Shells ecosystem
|
|
5
5
|
Author: Cracking Shells Team
|
|
6
6
|
Project-URL: Homepage, https://github.com/CrackingShells/Hatch
|
|
@@ -17,6 +17,7 @@ Requires-Dist: packaging>=20.0
|
|
|
17
17
|
Requires-Dist: docker>=7.1.0
|
|
18
18
|
Requires-Dist: pydantic>=2.0.0
|
|
19
19
|
Requires-Dist: hatch-validator>=0.8.0
|
|
20
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
20
21
|
Provides-Extra: docs
|
|
21
22
|
Requires-Dist: mkdocs>=1.4.0; extra == "docs"
|
|
22
23
|
Requires-Dist: mkdocstrings[python]>=0.20.0; extra == "docs"
|
|
@@ -26,13 +27,36 @@ Dynamic: license-file
|
|
|
26
27
|
|
|
27
28
|
# Hatch
|
|
28
29
|
|
|
29
|
-

|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
## Introduction
|
|
33
|
+
|
|
34
|
+
Hatch is the package manager for managing Model Context Protocol (MCP) servers with environment isolation, multi-type dependency resolution, and multi-host deployment. Deploy MCP servers to Claude Desktop, VS Code, Cursor, Kiro, Codex, and other platforms with automatic dependency management.
|
|
32
35
|
|
|
33
36
|
The canonical documentation is at `docs/index.md` and published at <https://hatch.readthedocs.io/en/latest/>.
|
|
34
37
|
|
|
35
|
-
##
|
|
38
|
+
## Key Features
|
|
39
|
+
|
|
40
|
+
- **Environment Isolation** — Create separate, isolated workspaces for different projects without conflicts
|
|
41
|
+
- **Multi-Type Dependency Resolution** — Automatically resolve and install system packages, Python packages, Docker containers, and Hatch packages
|
|
42
|
+
- **Multi-Host Deployment** — Configure MCP servers on multiple host platforms
|
|
43
|
+
- **Package Validation** — Ensure packages meet schema requirements before distribution
|
|
44
|
+
- **Development-Focused** — Optimized for rapid development and testing of MCP server ecosystems
|
|
45
|
+
|
|
46
|
+
## Supported MCP Hosts
|
|
47
|
+
|
|
48
|
+
Hatch supports deployment to the following MCP host platforms:
|
|
49
|
+
|
|
50
|
+
- **Claude Desktop** — Anthropic's desktop application for Claude with native MCP support
|
|
51
|
+
- **Claude Code** — Claude integration for VS Code with MCP capabilities
|
|
52
|
+
- **VS Code** — Visual Studio Code with the MCP extension for tool integration
|
|
53
|
+
- **Cursor** — AI-first code editor with built-in MCP server support
|
|
54
|
+
- **Kiro** — Kiro IDE with MCP support
|
|
55
|
+
- **Codex** — OpenAI Codex with MCP server configuration support
|
|
56
|
+
- **LM Studio** — Local LLM inference platform with MCP server integration
|
|
57
|
+
- **Google Gemini CLI** — Command-line interface for Google's Gemini model with MCP support
|
|
58
|
+
|
|
59
|
+
## Quick Start
|
|
36
60
|
|
|
37
61
|
### Install from PyPI
|
|
38
62
|
|
|
@@ -72,41 +96,26 @@ hatch validate ./my_mcp_server
|
|
|
72
96
|
|
|
73
97
|
### Deploy MCP servers to your tools
|
|
74
98
|
|
|
75
|
-
Add a Hatch package and automatically configure it on Claude Desktop and Cursor:
|
|
99
|
+
**Package-First Deployment (Recommended)** — Add a Hatch package and automatically configure it on Claude Desktop and Cursor:
|
|
76
100
|
|
|
77
101
|
```bash
|
|
78
102
|
hatch package add ./my_mcp_server --host claude-desktop,cursor
|
|
79
103
|
```
|
|
80
104
|
|
|
81
|
-
Configure
|
|
105
|
+
**Direct Configuration (Advanced)** — Configure arbitrary MCP servers on your hosts:
|
|
82
106
|
|
|
83
107
|
```bash
|
|
84
|
-
#
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
--
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
--
|
|
108
|
+
# Remote server example: GitHub MCP Server with authentication
|
|
109
|
+
export GIT_PAT_TOKEN=your_github_personal_access_token
|
|
110
|
+
hatch mcp configure github-mcp --host gemini \
|
|
111
|
+
--httpUrl https://api.github.com/mcp \
|
|
112
|
+
--header Authorization="Bearer $GIT_PAT_TOKEN"
|
|
113
|
+
|
|
114
|
+
# Local server example: Context7 via npx
|
|
115
|
+
hatch mcp configure context7 --host vscode \
|
|
116
|
+
--command npx --args "-y @upstash/context7-mcp"
|
|
93
117
|
```
|
|
94
118
|
|
|
95
|
-
List configured servers and hosts:
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
hatch mcp list servers
|
|
99
|
-
hatch mcp list hosts --detailed
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Key features
|
|
103
|
-
|
|
104
|
-
- **Environment isolation**: Create separate workspaces for different projects
|
|
105
|
-
- **Multi-type dependencies**: Automatically resolve and install system packages, Python packages, Docker containers, and Hatch packages
|
|
106
|
-
- **MCP host configuration**: Deploy MCP servers to Claude Desktop, Cursor, VSCode, and other platforms
|
|
107
|
-
- **Package validation**: Ensure packages meet schema requirements before distribution
|
|
108
|
-
- **Development-focused**: Optimized for rapid development and testing of MCP server ecosystems
|
|
109
|
-
|
|
110
119
|
## Documentation
|
|
111
120
|
|
|
112
121
|
- **[Full Documentation](https://hatch.readthedocs.io/en/latest/)** — Complete reference and guides
|
|
@@ -128,12 +137,12 @@ We welcome contributions! See the [How to Contribute](./docs/articles/devs/contr
|
|
|
128
137
|
3. **Create a feature branch**: `git checkout -b feat/your-feature`
|
|
129
138
|
4. **Make changes** and add tests
|
|
130
139
|
5. **Use conventional commits**: `npm run commit` for guided commits
|
|
131
|
-
6. **Run tests**: `
|
|
140
|
+
6. **Run tests**: `wobble`
|
|
132
141
|
7. **Create a pull request**
|
|
133
142
|
|
|
134
143
|
We use [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning. Use `npm run commit` for guided commit messages.
|
|
135
144
|
|
|
136
|
-
## Getting
|
|
145
|
+
## Getting Help
|
|
137
146
|
|
|
138
147
|
- Search existing [GitHub Issues](https://github.com/CrackingShells/Hatch/issues)
|
|
139
148
|
- Read [Troubleshooting](./docs/articles/users/Troubleshooting/ReportIssues.md) for common problems
|
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
# Hatch
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Introduction
|
|
6
|
+
|
|
7
|
+
Hatch is the package manager for managing Model Context Protocol (MCP) servers with environment isolation, multi-type dependency resolution, and multi-host deployment. Deploy MCP servers to Claude Desktop, VS Code, Cursor, Kiro, Codex, and other platforms with automatic dependency management.
|
|
6
8
|
|
|
7
9
|
The canonical documentation is at `docs/index.md` and published at <https://hatch.readthedocs.io/en/latest/>.
|
|
8
10
|
|
|
9
|
-
##
|
|
11
|
+
## Key Features
|
|
12
|
+
|
|
13
|
+
- **Environment Isolation** — Create separate, isolated workspaces for different projects without conflicts
|
|
14
|
+
- **Multi-Type Dependency Resolution** — Automatically resolve and install system packages, Python packages, Docker containers, and Hatch packages
|
|
15
|
+
- **Multi-Host Deployment** — Configure MCP servers on multiple host platforms
|
|
16
|
+
- **Package Validation** — Ensure packages meet schema requirements before distribution
|
|
17
|
+
- **Development-Focused** — Optimized for rapid development and testing of MCP server ecosystems
|
|
18
|
+
|
|
19
|
+
## Supported MCP Hosts
|
|
20
|
+
|
|
21
|
+
Hatch supports deployment to the following MCP host platforms:
|
|
22
|
+
|
|
23
|
+
- **Claude Desktop** — Anthropic's desktop application for Claude with native MCP support
|
|
24
|
+
- **Claude Code** — Claude integration for VS Code with MCP capabilities
|
|
25
|
+
- **VS Code** — Visual Studio Code with the MCP extension for tool integration
|
|
26
|
+
- **Cursor** — AI-first code editor with built-in MCP server support
|
|
27
|
+
- **Kiro** — Kiro IDE with MCP support
|
|
28
|
+
- **Codex** — OpenAI Codex with MCP server configuration support
|
|
29
|
+
- **LM Studio** — Local LLM inference platform with MCP server integration
|
|
30
|
+
- **Google Gemini CLI** — Command-line interface for Google's Gemini model with MCP support
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
10
33
|
|
|
11
34
|
### Install from PyPI
|
|
12
35
|
|
|
@@ -46,41 +69,26 @@ hatch validate ./my_mcp_server
|
|
|
46
69
|
|
|
47
70
|
### Deploy MCP servers to your tools
|
|
48
71
|
|
|
49
|
-
Add a Hatch package and automatically configure it on Claude Desktop and Cursor:
|
|
72
|
+
**Package-First Deployment (Recommended)** — Add a Hatch package and automatically configure it on Claude Desktop and Cursor:
|
|
50
73
|
|
|
51
74
|
```bash
|
|
52
75
|
hatch package add ./my_mcp_server --host claude-desktop,cursor
|
|
53
76
|
```
|
|
54
77
|
|
|
55
|
-
Configure
|
|
78
|
+
**Direct Configuration (Advanced)** — Configure arbitrary MCP servers on your hosts:
|
|
56
79
|
|
|
57
80
|
```bash
|
|
58
|
-
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
--
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
--
|
|
81
|
+
# Remote server example: GitHub MCP Server with authentication
|
|
82
|
+
export GIT_PAT_TOKEN=your_github_personal_access_token
|
|
83
|
+
hatch mcp configure github-mcp --host gemini \
|
|
84
|
+
--httpUrl https://api.github.com/mcp \
|
|
85
|
+
--header Authorization="Bearer $GIT_PAT_TOKEN"
|
|
86
|
+
|
|
87
|
+
# Local server example: Context7 via npx
|
|
88
|
+
hatch mcp configure context7 --host vscode \
|
|
89
|
+
--command npx --args "-y @upstash/context7-mcp"
|
|
67
90
|
```
|
|
68
91
|
|
|
69
|
-
List configured servers and hosts:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
hatch mcp list servers
|
|
73
|
-
hatch mcp list hosts --detailed
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Key features
|
|
77
|
-
|
|
78
|
-
- **Environment isolation**: Create separate workspaces for different projects
|
|
79
|
-
- **Multi-type dependencies**: Automatically resolve and install system packages, Python packages, Docker containers, and Hatch packages
|
|
80
|
-
- **MCP host configuration**: Deploy MCP servers to Claude Desktop, Cursor, VSCode, and other platforms
|
|
81
|
-
- **Package validation**: Ensure packages meet schema requirements before distribution
|
|
82
|
-
- **Development-focused**: Optimized for rapid development and testing of MCP server ecosystems
|
|
83
|
-
|
|
84
92
|
## Documentation
|
|
85
93
|
|
|
86
94
|
- **[Full Documentation](https://hatch.readthedocs.io/en/latest/)** — Complete reference and guides
|
|
@@ -102,12 +110,12 @@ We welcome contributions! See the [How to Contribute](./docs/articles/devs/contr
|
|
|
102
110
|
3. **Create a feature branch**: `git checkout -b feat/your-feature`
|
|
103
111
|
4. **Make changes** and add tests
|
|
104
112
|
5. **Use conventional commits**: `npm run commit` for guided commits
|
|
105
|
-
6. **Run tests**: `
|
|
113
|
+
6. **Run tests**: `wobble`
|
|
106
114
|
7. **Create a pull request**
|
|
107
115
|
|
|
108
116
|
We use [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning. Use `npm run commit` for guided commit messages.
|
|
109
117
|
|
|
110
|
-
## Getting
|
|
118
|
+
## Getting Help
|
|
111
119
|
|
|
112
120
|
- Search existing [GitHub Issues](https://github.com/CrackingShells/Hatch/issues)
|
|
113
121
|
- Read [Troubleshooting](./docs/articles/users/Troubleshooting/ReportIssues.md) for common problems
|
|
@@ -713,6 +713,15 @@ def handle_mcp_configure(
|
|
|
713
713
|
include_tools: Optional[list] = None,
|
|
714
714
|
exclude_tools: Optional[list] = None,
|
|
715
715
|
input: Optional[list] = None,
|
|
716
|
+
disabled: Optional[bool] = None,
|
|
717
|
+
auto_approve_tools: Optional[list] = None,
|
|
718
|
+
disable_tools: Optional[list] = None,
|
|
719
|
+
env_vars: Optional[list] = None,
|
|
720
|
+
startup_timeout: Optional[int] = None,
|
|
721
|
+
tool_timeout: Optional[int] = None,
|
|
722
|
+
enabled: Optional[bool] = None,
|
|
723
|
+
bearer_token_env_var: Optional[str] = None,
|
|
724
|
+
env_header: Optional[list] = None,
|
|
716
725
|
no_backup: bool = False,
|
|
717
726
|
dry_run: bool = False,
|
|
718
727
|
auto_approve: bool = False,
|
|
@@ -826,6 +835,35 @@ def handle_mcp_configure(
|
|
|
826
835
|
if inputs_list is not None:
|
|
827
836
|
omni_config_data["inputs"] = inputs_list
|
|
828
837
|
|
|
838
|
+
# Host-specific fields (Kiro)
|
|
839
|
+
if disabled is not None:
|
|
840
|
+
omni_config_data["disabled"] = disabled
|
|
841
|
+
if auto_approve_tools is not None:
|
|
842
|
+
omni_config_data["autoApprove"] = auto_approve_tools
|
|
843
|
+
if disable_tools is not None:
|
|
844
|
+
omni_config_data["disabledTools"] = disable_tools
|
|
845
|
+
|
|
846
|
+
# Host-specific fields (Codex)
|
|
847
|
+
if env_vars is not None:
|
|
848
|
+
omni_config_data["env_vars"] = env_vars
|
|
849
|
+
if startup_timeout is not None:
|
|
850
|
+
omni_config_data["startup_timeout_sec"] = startup_timeout
|
|
851
|
+
if tool_timeout is not None:
|
|
852
|
+
omni_config_data["tool_timeout_sec"] = tool_timeout
|
|
853
|
+
if enabled is not None:
|
|
854
|
+
omni_config_data["enabled"] = enabled
|
|
855
|
+
if bearer_token_env_var is not None:
|
|
856
|
+
omni_config_data["bearer_token_env_var"] = bearer_token_env_var
|
|
857
|
+
if env_header is not None:
|
|
858
|
+
# Parse KEY=ENV_VAR_NAME format into dict
|
|
859
|
+
env_http_headers = {}
|
|
860
|
+
for header_spec in env_header:
|
|
861
|
+
if '=' in header_spec:
|
|
862
|
+
key, env_var_name = header_spec.split('=', 1)
|
|
863
|
+
env_http_headers[key] = env_var_name
|
|
864
|
+
if env_http_headers:
|
|
865
|
+
omni_config_data["env_http_headers"] = env_http_headers
|
|
866
|
+
|
|
829
867
|
# Partial update merge logic
|
|
830
868
|
if is_update:
|
|
831
869
|
# Merge with existing configuration
|
|
@@ -1557,11 +1595,13 @@ def main():
|
|
|
1557
1595
|
mcp_configure_parser = mcp_subparsers.add_parser(
|
|
1558
1596
|
"configure", help="Configure MCP server directly on host"
|
|
1559
1597
|
)
|
|
1560
|
-
mcp_configure_parser.add_argument(
|
|
1598
|
+
mcp_configure_parser.add_argument(
|
|
1599
|
+
"server_name", help="Name for the MCP server [hosts: all]"
|
|
1600
|
+
)
|
|
1561
1601
|
mcp_configure_parser.add_argument(
|
|
1562
1602
|
"--host",
|
|
1563
1603
|
required=True,
|
|
1564
|
-
help="Host platform to configure (e.g., claude-desktop, cursor)",
|
|
1604
|
+
help="Host platform to configure (e.g., claude-desktop, cursor) [hosts: all]",
|
|
1565
1605
|
)
|
|
1566
1606
|
|
|
1567
1607
|
# Create mutually exclusive group for server type
|
|
@@ -1569,72 +1609,125 @@ def main():
|
|
|
1569
1609
|
server_type_group.add_argument(
|
|
1570
1610
|
"--command",
|
|
1571
1611
|
dest="server_command",
|
|
1572
|
-
help="Command to execute the MCP server (for local servers)",
|
|
1612
|
+
help="Command to execute the MCP server (for local servers) [hosts: all]",
|
|
1573
1613
|
)
|
|
1574
1614
|
server_type_group.add_argument(
|
|
1575
|
-
"--url", help="Server URL for remote MCP servers (SSE transport)"
|
|
1615
|
+
"--url", help="Server URL for remote MCP servers (SSE transport) [hosts: all except claude-desktop, claude-code]"
|
|
1576
1616
|
)
|
|
1577
1617
|
server_type_group.add_argument(
|
|
1578
|
-
"--http-url", help="HTTP streaming endpoint URL
|
|
1618
|
+
"--http-url", help="HTTP streaming endpoint URL [hosts: gemini]"
|
|
1579
1619
|
)
|
|
1580
1620
|
|
|
1581
1621
|
mcp_configure_parser.add_argument(
|
|
1582
1622
|
"--args",
|
|
1583
1623
|
nargs="*",
|
|
1584
|
-
help="Arguments for the MCP server command (only with --command)",
|
|
1624
|
+
help="Arguments for the MCP server command (only with --command) [hosts: all]",
|
|
1585
1625
|
)
|
|
1586
1626
|
mcp_configure_parser.add_argument(
|
|
1587
|
-
"--env-var",
|
|
1627
|
+
"--env-var",
|
|
1628
|
+
action="append",
|
|
1629
|
+
help="Environment variables (format: KEY=VALUE) [hosts: all]",
|
|
1588
1630
|
)
|
|
1589
1631
|
mcp_configure_parser.add_argument(
|
|
1590
1632
|
"--header",
|
|
1591
1633
|
action="append",
|
|
1592
|
-
help="HTTP headers for remote servers (format: KEY=VALUE, only with --url)",
|
|
1634
|
+
help="HTTP headers for remote servers (format: KEY=VALUE, only with --url) [hosts: all except claude-desktop, claude-code]",
|
|
1593
1635
|
)
|
|
1594
1636
|
|
|
1595
1637
|
# Host-specific arguments (Gemini)
|
|
1596
1638
|
mcp_configure_parser.add_argument(
|
|
1597
|
-
"--timeout", type=int, help="Request timeout in milliseconds
|
|
1639
|
+
"--timeout", type=int, help="Request timeout in milliseconds [hosts: gemini]"
|
|
1598
1640
|
)
|
|
1599
1641
|
mcp_configure_parser.add_argument(
|
|
1600
|
-
"--trust", action="store_true", help="Bypass tool call confirmations
|
|
1642
|
+
"--trust", action="store_true", help="Bypass tool call confirmations [hosts: gemini]"
|
|
1601
1643
|
)
|
|
1602
1644
|
mcp_configure_parser.add_argument(
|
|
1603
|
-
"--cwd", help="Working directory for stdio transport
|
|
1645
|
+
"--cwd", help="Working directory for stdio transport [hosts: gemini, codex]"
|
|
1604
1646
|
)
|
|
1605
1647
|
mcp_configure_parser.add_argument(
|
|
1606
1648
|
"--include-tools",
|
|
1607
1649
|
nargs="*",
|
|
1608
|
-
help="Tool allowlist
|
|
1650
|
+
help="Tool allowlist / enabled tools [hosts: gemini, codex]",
|
|
1609
1651
|
)
|
|
1610
1652
|
mcp_configure_parser.add_argument(
|
|
1611
1653
|
"--exclude-tools",
|
|
1612
1654
|
nargs="*",
|
|
1613
|
-
help="Tool blocklist
|
|
1655
|
+
help="Tool blocklist / disabled tools [hosts: gemini, codex]",
|
|
1614
1656
|
)
|
|
1615
1657
|
|
|
1616
1658
|
# Host-specific arguments (Cursor/VS Code/LM Studio)
|
|
1617
1659
|
mcp_configure_parser.add_argument(
|
|
1618
|
-
"--env-file", help="Path to environment file
|
|
1660
|
+
"--env-file", help="Path to environment file [hosts: cursor, vscode, lmstudio]"
|
|
1619
1661
|
)
|
|
1620
1662
|
|
|
1621
1663
|
# Host-specific arguments (VS Code)
|
|
1622
1664
|
mcp_configure_parser.add_argument(
|
|
1623
1665
|
"--input",
|
|
1624
1666
|
action="append",
|
|
1625
|
-
help="Input variable definitions in format: type,id,description[,password=true]
|
|
1667
|
+
help="Input variable definitions in format: type,id,description[,password=true] [hosts: vscode]",
|
|
1668
|
+
)
|
|
1669
|
+
|
|
1670
|
+
# Host-specific arguments (Kiro)
|
|
1671
|
+
mcp_configure_parser.add_argument(
|
|
1672
|
+
"--disabled",
|
|
1673
|
+
action="store_true",
|
|
1674
|
+
default=None,
|
|
1675
|
+
help="Disable the MCP server [hosts: kiro]"
|
|
1676
|
+
)
|
|
1677
|
+
mcp_configure_parser.add_argument(
|
|
1678
|
+
"--auto-approve-tools",
|
|
1679
|
+
action="append",
|
|
1680
|
+
help="Tool names to auto-approve without prompting [hosts: kiro]"
|
|
1681
|
+
)
|
|
1682
|
+
mcp_configure_parser.add_argument(
|
|
1683
|
+
"--disable-tools",
|
|
1684
|
+
action="append",
|
|
1685
|
+
help="Tool names to disable [hosts: kiro]"
|
|
1686
|
+
)
|
|
1687
|
+
|
|
1688
|
+
# Codex-specific arguments
|
|
1689
|
+
mcp_configure_parser.add_argument(
|
|
1690
|
+
"--env-vars",
|
|
1691
|
+
action="append",
|
|
1692
|
+
help="Environment variable names to whitelist/forward [hosts: codex]"
|
|
1693
|
+
)
|
|
1694
|
+
mcp_configure_parser.add_argument(
|
|
1695
|
+
"--startup-timeout",
|
|
1696
|
+
type=int,
|
|
1697
|
+
help="Server startup timeout in seconds (default: 10) [hosts: codex]"
|
|
1698
|
+
)
|
|
1699
|
+
mcp_configure_parser.add_argument(
|
|
1700
|
+
"--tool-timeout",
|
|
1701
|
+
type=int,
|
|
1702
|
+
help="Tool execution timeout in seconds (default: 60) [hosts: codex]"
|
|
1703
|
+
)
|
|
1704
|
+
mcp_configure_parser.add_argument(
|
|
1705
|
+
"--enabled",
|
|
1706
|
+
action="store_true",
|
|
1707
|
+
default=None,
|
|
1708
|
+
help="Enable the MCP server [hosts: codex]"
|
|
1709
|
+
)
|
|
1710
|
+
mcp_configure_parser.add_argument(
|
|
1711
|
+
"--bearer-token-env-var",
|
|
1712
|
+
type=str,
|
|
1713
|
+
help="Name of environment variable containing bearer token for Authorization header [hosts: codex]"
|
|
1714
|
+
)
|
|
1715
|
+
mcp_configure_parser.add_argument(
|
|
1716
|
+
"--env-header",
|
|
1717
|
+
action="append",
|
|
1718
|
+
help="HTTP header from environment variable in KEY=ENV_VAR_NAME format [hosts: codex]"
|
|
1626
1719
|
)
|
|
1627
1720
|
|
|
1628
1721
|
mcp_configure_parser.add_argument(
|
|
1629
1722
|
"--no-backup",
|
|
1630
1723
|
action="store_true",
|
|
1631
|
-
help="Skip backup creation before configuration",
|
|
1724
|
+
help="Skip backup creation before configuration [hosts: all]",
|
|
1632
1725
|
)
|
|
1633
1726
|
mcp_configure_parser.add_argument(
|
|
1634
|
-
"--dry-run", action="store_true", help="Preview configuration without execution"
|
|
1727
|
+
"--dry-run", action="store_true", help="Preview configuration without execution [hosts: all]"
|
|
1635
1728
|
)
|
|
1636
1729
|
mcp_configure_parser.add_argument(
|
|
1637
|
-
"--auto-approve", action="store_true", help="Skip confirmation prompts"
|
|
1730
|
+
"--auto-approve", action="store_true", help="Skip confirmation prompts [hosts: all]"
|
|
1638
1731
|
)
|
|
1639
1732
|
|
|
1640
1733
|
# Remove MCP commands (object-action pattern)
|
|
@@ -2693,6 +2786,15 @@ def main():
|
|
|
2693
2786
|
getattr(args, "include_tools", None),
|
|
2694
2787
|
getattr(args, "exclude_tools", None),
|
|
2695
2788
|
getattr(args, "input", None),
|
|
2789
|
+
getattr(args, "disabled", None),
|
|
2790
|
+
getattr(args, "auto_approve_tools", None),
|
|
2791
|
+
getattr(args, "disable_tools", None),
|
|
2792
|
+
getattr(args, "env_vars", None),
|
|
2793
|
+
getattr(args, "startup_timeout", None),
|
|
2794
|
+
getattr(args, "tool_timeout", None),
|
|
2795
|
+
getattr(args, "enabled", None),
|
|
2796
|
+
getattr(args, "bearer_token_env_var", None),
|
|
2797
|
+
getattr(args, "env_header", None),
|
|
2696
2798
|
args.no_backup,
|
|
2697
2799
|
args.dry_run,
|
|
2698
2800
|
args.auto_approve,
|
|
@@ -11,7 +11,8 @@ from .models import (
|
|
|
11
11
|
PackageHostConfiguration, EnvironmentPackageEntry, ConfigurationResult, SyncResult,
|
|
12
12
|
# Host-specific configuration models
|
|
13
13
|
MCPServerConfigBase, MCPServerConfigGemini, MCPServerConfigVSCode,
|
|
14
|
-
MCPServerConfigCursor, MCPServerConfigClaude,
|
|
14
|
+
MCPServerConfigCursor, MCPServerConfigClaude, MCPServerConfigKiro,
|
|
15
|
+
MCPServerConfigCodex, MCPServerConfigOmni,
|
|
15
16
|
HOST_MODEL_REGISTRY
|
|
16
17
|
)
|
|
17
18
|
from .host_management import (
|
|
@@ -30,7 +31,8 @@ __all__ = [
|
|
|
30
31
|
'PackageHostConfiguration', 'EnvironmentPackageEntry', 'ConfigurationResult', 'SyncResult',
|
|
31
32
|
# Host-specific configuration models
|
|
32
33
|
'MCPServerConfigBase', 'MCPServerConfigGemini', 'MCPServerConfigVSCode',
|
|
33
|
-
'MCPServerConfigCursor', 'MCPServerConfigClaude', '
|
|
34
|
+
'MCPServerConfigCursor', 'MCPServerConfigClaude', 'MCPServerConfigKiro',
|
|
35
|
+
'MCPServerConfigCodex', 'MCPServerConfigOmni',
|
|
34
36
|
'HOST_MODEL_REGISTRY',
|
|
35
37
|
# User feedback reporting
|
|
36
38
|
'FieldOperation', 'ConversionReport', 'generate_conversion_report', 'display_report',
|
|
@@ -9,7 +9,7 @@ import shutil
|
|
|
9
9
|
import tempfile
|
|
10
10
|
from datetime import datetime
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Dict, List, Optional, Any
|
|
12
|
+
from typing import Dict, List, Optional, Any, Callable, TextIO
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel, Field, validator
|
|
15
15
|
|
|
@@ -36,8 +36,8 @@ class BackupInfo(BaseModel):
|
|
|
36
36
|
def validate_hostname(cls, v):
|
|
37
37
|
"""Validate hostname is supported."""
|
|
38
38
|
supported_hosts = {
|
|
39
|
-
'claude-desktop', 'claude-code', 'vscode',
|
|
40
|
-
'cursor', 'lmstudio', 'gemini'
|
|
39
|
+
'claude-desktop', 'claude-code', 'vscode',
|
|
40
|
+
'cursor', 'lmstudio', 'gemini', 'kiro', 'codex'
|
|
41
41
|
}
|
|
42
42
|
if v not in supported_hosts:
|
|
43
43
|
raise ValueError(f"Unsupported hostname: {v}. Supported: {supported_hosts}")
|
|
@@ -53,7 +53,9 @@ class BackupInfo(BaseModel):
|
|
|
53
53
|
@property
|
|
54
54
|
def backup_name(self) -> str:
|
|
55
55
|
"""Get backup filename."""
|
|
56
|
-
|
|
56
|
+
# Extract original filename from backup path if available
|
|
57
|
+
# Backup filename format: {original_name}.{hostname}.{timestamp}
|
|
58
|
+
return self.file_path.name
|
|
57
59
|
|
|
58
60
|
@property
|
|
59
61
|
def age_days(self) -> int:
|
|
@@ -101,22 +103,29 @@ class BackupResult(BaseModel):
|
|
|
101
103
|
|
|
102
104
|
class AtomicFileOperations:
|
|
103
105
|
"""Atomic file operations for safe configuration updates."""
|
|
104
|
-
|
|
105
|
-
def
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
|
|
107
|
+
def atomic_write_with_serializer(
|
|
108
|
+
self,
|
|
109
|
+
file_path: Path,
|
|
110
|
+
data: Any,
|
|
111
|
+
serializer: Callable[[Any, TextIO], None],
|
|
112
|
+
backup_manager: "MCPHostConfigBackupManager",
|
|
113
|
+
hostname: str,
|
|
114
|
+
skip_backup: bool = False
|
|
115
|
+
) -> bool:
|
|
116
|
+
"""Atomic write with custom serializer and automatic backup creation.
|
|
117
|
+
|
|
110
118
|
Args:
|
|
111
|
-
file_path
|
|
112
|
-
data
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
file_path: Target file path for writing
|
|
120
|
+
data: Data to serialize and write
|
|
121
|
+
serializer: Function that writes data to file handle
|
|
122
|
+
backup_manager: Backup manager instance
|
|
123
|
+
hostname: Host identifier for backup
|
|
124
|
+
skip_backup: Skip backup creation
|
|
125
|
+
|
|
117
126
|
Returns:
|
|
118
|
-
bool: True if operation successful
|
|
119
|
-
|
|
127
|
+
bool: True if operation successful
|
|
128
|
+
|
|
120
129
|
Raises:
|
|
121
130
|
BackupError: If backup creation fails and skip_backup is False
|
|
122
131
|
"""
|
|
@@ -126,32 +135,52 @@ class AtomicFileOperations:
|
|
|
126
135
|
backup_result = backup_manager.create_backup(file_path, hostname)
|
|
127
136
|
if not backup_result.success:
|
|
128
137
|
raise BackupError(f"Required backup failed: {backup_result.error_message}")
|
|
129
|
-
|
|
130
|
-
# Create temporary file for atomic write
|
|
138
|
+
|
|
131
139
|
temp_file = None
|
|
132
140
|
try:
|
|
133
|
-
# Write to temporary file first
|
|
134
141
|
temp_file = file_path.with_suffix(f"{file_path.suffix}.tmp")
|
|
135
142
|
with open(temp_file, 'w', encoding='utf-8') as f:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
# Atomic move to target location
|
|
143
|
+
serializer(data, f)
|
|
144
|
+
|
|
139
145
|
temp_file.replace(file_path)
|
|
140
146
|
return True
|
|
141
|
-
|
|
147
|
+
|
|
142
148
|
except Exception as e:
|
|
143
|
-
# Clean up temporary file on failure
|
|
144
149
|
if temp_file and temp_file.exists():
|
|
145
150
|
temp_file.unlink()
|
|
146
|
-
|
|
147
|
-
# Restore from backup if available
|
|
151
|
+
|
|
148
152
|
if backup_result and backup_result.backup_path:
|
|
149
153
|
try:
|
|
150
154
|
backup_manager.restore_backup(hostname, backup_result.backup_path.name)
|
|
151
155
|
except Exception:
|
|
152
|
-
pass
|
|
153
|
-
|
|
156
|
+
pass
|
|
157
|
+
|
|
154
158
|
raise BackupError(f"Atomic write failed: {str(e)}")
|
|
159
|
+
|
|
160
|
+
def atomic_write_with_backup(self, file_path: Path, data: Dict[str, Any],
|
|
161
|
+
backup_manager: "MCPHostConfigBackupManager",
|
|
162
|
+
hostname: str, skip_backup: bool = False) -> bool:
|
|
163
|
+
"""Atomic write with JSON serialization (backward compatible).
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
file_path (Path): Target file path for writing
|
|
167
|
+
data (Dict[str, Any]): Data to write as JSON
|
|
168
|
+
backup_manager (MCPHostConfigBackupManager): Backup manager instance
|
|
169
|
+
hostname (str): Host identifier for backup
|
|
170
|
+
skip_backup (bool, optional): Skip backup creation. Defaults to False.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
bool: True if operation successful, False otherwise
|
|
174
|
+
|
|
175
|
+
Raises:
|
|
176
|
+
BackupError: If backup creation fails and skip_backup is False
|
|
177
|
+
"""
|
|
178
|
+
def json_serializer(data: Any, f: TextIO) -> None:
|
|
179
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
180
|
+
|
|
181
|
+
return self.atomic_write_with_serializer(
|
|
182
|
+
file_path, data, json_serializer, backup_manager, hostname, skip_backup
|
|
183
|
+
)
|
|
155
184
|
|
|
156
185
|
def atomic_copy(self, source: Path, target: Path) -> bool:
|
|
157
186
|
"""Atomic file copy operation.
|
|
@@ -228,8 +257,10 @@ class MCPHostConfigBackupManager:
|
|
|
228
257
|
host_backup_dir.mkdir(exist_ok=True)
|
|
229
258
|
|
|
230
259
|
# Generate timestamped backup filename with microseconds for uniqueness
|
|
260
|
+
# Preserve original filename instead of hardcoding 'mcp.json'
|
|
231
261
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
232
|
-
|
|
262
|
+
original_filename = config_path.name
|
|
263
|
+
backup_name = f"{original_filename}.{hostname}.{timestamp}"
|
|
233
264
|
backup_path = host_backup_dir / backup_name
|
|
234
265
|
|
|
235
266
|
# Get original file size
|