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.
Files changed (169) hide show
  1. {hatch_xclam-0.7.0.dev12/hatch_xclam.egg-info → hatch_xclam-0.7.1}/PKG-INFO +41 -32
  2. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/README.md +39 -31
  3. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/cli_hatch.py +120 -18
  4. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/__init__.py +4 -2
  5. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/backup.py +62 -31
  6. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/models.py +125 -1
  7. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/strategies.py +268 -1
  8. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1/hatch_xclam.egg-info}/PKG-INFO +41 -32
  9. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/SOURCES.txt +24 -118
  10. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/requires.txt +1 -0
  11. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/top_level.txt +0 -2
  12. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/pyproject.toml +3 -2
  13. hatch_xclam-0.7.1/tests/integration/__init__.py +5 -0
  14. hatch_xclam-0.7.1/tests/integration/test_mcp_kiro_integration.py +153 -0
  15. hatch_xclam-0.7.1/tests/regression/__init__.py +5 -0
  16. hatch_xclam-0.7.1/tests/regression/test_mcp_codex_backup_integration.py +162 -0
  17. hatch_xclam-0.7.1/tests/regression/test_mcp_codex_host_strategy.py +163 -0
  18. hatch_xclam-0.7.1/tests/regression/test_mcp_codex_model_validation.py +117 -0
  19. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_backup_integration.py +241 -0
  20. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_cli_integration.py +141 -0
  21. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_decorator_registration.py +71 -0
  22. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_host_strategy.py +214 -0
  23. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_model_validation.py +116 -0
  24. hatch_xclam-0.7.1/tests/regression/test_mcp_kiro_omni_conversion.py +104 -0
  25. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data_utils.py +108 -0
  26. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_all_host_specific_args.py +194 -1
  27. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_direct_management.py +8 -5
  28. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py +0 -45
  29. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -365
  30. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
  31. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1272
  32. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
  33. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
  34. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -152
  35. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -270
  36. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
  37. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -704
  38. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -709
  39. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -173
  40. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -169
  41. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -113
  42. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
  43. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  44. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -805
  45. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1172
  46. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1319
  47. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -128
  48. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -104
  49. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -462
  50. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
  51. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -56
  52. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2745
  53. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3976
  54. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
  55. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2965
  56. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -67
  57. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1391
  58. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -26
  59. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3112
  60. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -99
  61. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -767
  62. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1260
  63. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
  64. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
  65. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -373
  66. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1939
  67. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +0 -54
  68. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -303
  69. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3196
  70. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
  71. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +0 -15
  72. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +0 -108
  73. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +0 -252
  74. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +0 -83
  75. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +0 -359
  76. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +0 -61
  77. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +0 -192
  78. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py +0 -252
  79. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +0 -825
  80. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
  81. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +0 -90
  82. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +0 -1030
  83. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py +0 -553
  84. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py +0 -172
  85. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py +0 -563
  86. hatch_xclam-0.7.0.dev12/node_modules/npm/node_modules/node-gyp/gyp/test_gyp.py +0 -261
  87. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/LICENSE +0 -0
  88. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/__init__.py +0 -0
  89. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/environment_manager.py +0 -0
  90. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/__init__.py +0 -0
  91. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/dependency_installation_orchestrator.py +0 -0
  92. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/docker_installer.py +0 -0
  93. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/hatch_installer.py +0 -0
  94. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/installation_context.py +0 -0
  95. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/installer_base.py +0 -0
  96. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/python_installer.py +0 -0
  97. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/registry.py +0 -0
  98. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/installers/system_installer.py +0 -0
  99. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/host_management.py +0 -0
  100. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/mcp_host_config/reporting.py +0 -0
  101. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/package_loader.py +0 -0
  102. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/python_environment_manager.py +0 -0
  103. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/registry_explorer.py +0 -0
  104. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/registry_retriever.py +0 -0
  105. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch/template_generator.py +0 -0
  106. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/dependency_links.txt +0 -0
  107. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/hatch_xclam.egg-info/entry_points.txt +0 -0
  108. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/setup.cfg +0 -0
  109. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/__init__.py +0 -0
  110. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/run_environment_tests.py +0 -0
  111. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_cli_version.py +0 -0
  112. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg/hatch_mcp_server.py +0 -0
  113. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg/mcp_server.py +0 -0
  114. {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
  115. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/base_pkg_v2/mcp_server.py +0 -0
  116. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/utility_pkg/hatch_mcp_server.py +0 -0
  117. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/basic/utility_pkg/mcp_server.py +0 -0
  118. {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
  119. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/complex_dep_pkg/mcp_server.py +0 -0
  120. {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
  121. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/docker_dep_pkg/mcp_server.py +0 -0
  122. {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
  123. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/mixed_dep_pkg/mcp_server.py +0 -0
  124. {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
  125. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/python_dep_pkg/mcp_server.py +0 -0
  126. {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
  127. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/simple_dep_pkg/mcp_server.py +0 -0
  128. {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
  129. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_data/packages/dependencies/system_dep_pkg/mcp_server.py +0 -0
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_dependency_orchestrator_consent.py +0 -0
  143. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_docker_installer.py +0 -0
  144. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_env_manip.py +0 -0
  145. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_hatch_installer.py +0 -0
  146. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_installer_base.py +0 -0
  147. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_atomic_operations.py +0 -0
  148. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_backup_integration.py +0 -0
  149. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_backup_management.py +0 -0
  150. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_discovery_listing.py +0 -0
  151. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_host_config_integration.py +0 -0
  152. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_package_management.py +0 -0
  153. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_cli_partial_updates.py +0 -0
  154. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_environment_integration.py +0 -0
  155. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_config_backup.py +0 -0
  156. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_configuration_manager.py +0 -0
  157. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_host_registry_decorator.py +0 -0
  158. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_pydantic_architecture_v4.py +0 -0
  159. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_server_config_models.py +0 -0
  160. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_server_config_type_field.py +0 -0
  161. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_sync_functionality.py +0 -0
  162. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_mcp_user_feedback_reporting.py +0 -0
  163. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_non_tty_integration.py +0 -0
  164. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_online_package_loader.py +0 -0
  165. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_python_environment_manager.py +0 -0
  166. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_python_installer.py +0 -0
  167. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_registry.py +0 -0
  168. {hatch_xclam-0.7.0.dev12 → hatch_xclam-0.7.1}/tests/test_registry_retriever.py +0 -0
  169. {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.0.dev12
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
- ![Hatch Logo](./docs/resources/images/Logo/hatch_wide_dark_bg_transparent.png)
30
+ ![Hatch Logo](https://raw.githubusercontent.com/CrackingShells/Hatch/refs/heads/main/docs/resources/images/Logo/hatch_wide_dark_bg_transparent.png)
30
31
 
31
- Hatch is the package manager for the Cracking Shells ecosystem, designed specifically for managing Model Context Protocol (MCP) servers. It handles complex dependency resolution across system packages, Python packages, Docker containers, and other Hatch packages — all in isolated environments.
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
- ## Quick start
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 an arbitrary MCP server (non-Hatch package) on Claude Desktop:
105
+ **Direct Configuration (Advanced)** — Configure arbitrary MCP servers on your hosts:
82
106
 
83
107
  ```bash
84
- # Local server with command and arguments
85
- hatch mcp configure my-weather-server --host claude-desktop \
86
- --command python --args weather_server.py \
87
- --env-var API_KEY=your_key
88
-
89
- # Remote server with URL
90
- hatch mcp configure api-server --host gemini \
91
- --httpUrl https://api.example.com \
92
- --header Authorization="Bearer token"
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**: `python -m pytest 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 help
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
- ![Hatch Logo](./docs/resources/images/Logo/hatch_wide_dark_bg_transparent.png)
3
+ ![Hatch Logo](https://raw.githubusercontent.com/CrackingShells/Hatch/refs/heads/main/docs/resources/images/Logo/hatch_wide_dark_bg_transparent.png)
4
4
 
5
- Hatch is the package manager for the Cracking Shells ecosystem, designed specifically for managing Model Context Protocol (MCP) servers. It handles complex dependency resolution across system packages, Python packages, Docker containers, and other Hatch packages — all in isolated environments.
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
- ## Quick start
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 an arbitrary MCP server (non-Hatch package) on Claude Desktop:
78
+ **Direct Configuration (Advanced)** — Configure arbitrary MCP servers on your hosts:
56
79
 
57
80
  ```bash
58
- # Local server with command and arguments
59
- hatch mcp configure my-weather-server --host claude-desktop \
60
- --command python --args weather_server.py \
61
- --env-var API_KEY=your_key
62
-
63
- # Remote server with URL
64
- hatch mcp configure api-server --host gemini \
65
- --httpUrl https://api.example.com \
66
- --header Authorization="Bearer token"
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**: `python -m pytest 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 help
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("server_name", help="Name for the MCP server")
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 (Gemini only)"
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", action="append", help="Environment variables (format: KEY=VALUE)"
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 (Gemini)"
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 (Gemini)"
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 (Gemini)"
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 - only these tools will be available (Gemini)",
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 - these tools will be excluded (Gemini)",
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 (Cursor, VS Code, LM Studio)"
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] (VS Code)",
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, MCPServerConfigOmni,
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', 'MCPServerConfigOmni',
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
- return f"mcp.json.{self.hostname}.{self.timestamp.strftime('%Y%m%d_%H%M%S_%f')}"
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 atomic_write_with_backup(self, file_path: Path, data: Dict[str, Any],
106
- backup_manager: "MCPHostConfigBackupManager",
107
- hostname: str, skip_backup: bool = False) -> bool:
108
- """Atomic write with automatic backup creation.
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 (Path): Target file path for writing
112
- data (Dict[str, Any]): Data to write as JSON
113
- backup_manager (MCPHostConfigBackupManager): Backup manager instance
114
- hostname (str): Host identifier for backup
115
- skip_backup (bool, optional): Skip backup creation. Defaults to False.
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, False otherwise
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
- json.dump(data, f, indent=2, ensure_ascii=False)
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 # Log but don't raise - original error is more important
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
- backup_name = f"mcp.json.{hostname}.{timestamp}"
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