xcode-mcp-server 1.3.12__tar.gz → 1.3.13__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 (137) hide show
  1. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/PKG-INFO +1 -1
  2. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/__init__.py +1 -1
  3. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/build_project.py +15 -7
  4. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/clean_project.py +7 -3
  5. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/run_project_tests.py +19 -10
  6. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/run_project_until_terminated.py +17 -11
  7. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/applescript.py +48 -5
  8. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/.github/workflows/claude-code.yml +0 -0
  9. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/.github/workflows/claude-self-review.yml +0 -0
  10. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/.gitignore +0 -0
  11. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/CLAUDE.md +0 -0
  12. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/LICENSE +0 -0
  13. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/README.md +0 -0
  14. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/TODO.md +0 -0
  15. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/__PUBLIC_REPO +0 -0
  16. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/_venv-setup.sh +0 -0
  17. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/deploy-beta.sh +0 -0
  18. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/deploy.sh +0 -0
  19. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/dev.sh +0 -0
  20. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/info.sh +0 -0
  21. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/pyproject.toml +0 -0
  22. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/requirements.txt +0 -0
  23. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/run_local_for_claude.sh +0 -0
  24. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/cleanup_tests.sh +0 -0
  25. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/create_projects.py +0 -0
  26. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/create_real_projects.py +0 -0
  27. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/create_spm_projects.sh +0 -0
  28. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/create_xcode_projects.sh +0 -0
  29. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/run_all_tests.sh +0 -0
  30. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/setup_test_projects.sh +0 -0
  31. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/scripts/setup_tests.sh +0 -0
  32. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  33. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  34. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/Contents.json +0 -0
  35. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/ContentView.swift +0 -0
  36. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/iosEmptySwiftUIAppApp.swift +0 -0
  37. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.pbxproj +0 -0
  38. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  39. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  40. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  41. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp/main.swift +0 -0
  42. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.pbxproj +0 -0
  43. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  44. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  45. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  46. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  47. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  48. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/Contents.json +0 -0
  49. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/ContentView.swift +0 -0
  50. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/macosEmptySwiftUIAppApp.swift +0 -0
  51. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.pbxproj +0 -0
  52. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  53. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  54. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  55. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/BrokenApp/BrokenApp/main.swift +0 -0
  56. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.pbxproj +0 -0
  57. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  58. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  59. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  60. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/ConsoleApp/ConsoleApp/main.swift +0 -0
  61. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.pbxproj +0 -0
  62. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  63. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  64. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  65. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SimpleApp/SimpleApp/main.swift +0 -0
  66. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.pbxproj +0 -0
  67. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  68. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  69. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  70. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  71. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  72. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/Contents.json +0 -0
  73. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/ContentView.swift +0 -0
  74. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/macosEmptySwiftUIAppApp.swift +0 -0
  75. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.pbxproj +0 -0
  76. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  77. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  78. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  79. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  80. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  81. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/Contents.json +0 -0
  82. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp/ContentView.swift +0 -0
  83. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp/iosEmptySwiftUIAppApp.swift +0 -0
  84. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.pbxproj +0 -0
  85. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  86. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  87. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  88. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/debug_build.py +0 -0
  89. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/debug_test.py +0 -0
  90. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_basic.py +0 -0
  91. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_build.py +0 -0
  92. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_build_log_parser.py +0 -0
  93. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_fixed.py +0 -0
  94. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_manifest_wait.py +0 -0
  95. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_minimal.py +0 -0
  96. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/tests/test_runner.py +0 -0
  97. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/__main__.py +0 -0
  98. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/cli.py +0 -0
  99. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/config_manager.py +0 -0
  100. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/config_ui.py +0 -0
  101. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/exceptions.py +0 -0
  102. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/security.py +0 -0
  103. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/server.py +0 -0
  104. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/__init__.py +0 -0
  105. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/create_project.py +0 -0
  106. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/debug_list_notification_history.py +0 -0
  107. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_active_run_destination.py +0 -0
  108. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_build_errors.py +0 -0
  109. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_build_results.py +0 -0
  110. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_directory_listing.py +0 -0
  111. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_directory_tree.py +0 -0
  112. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_latest_test_results.py +0 -0
  113. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_project_schemes.py +0 -0
  114. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_runtime_output.py +0 -0
  115. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/get_xcode_projects.py +0 -0
  116. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/list_booted_simulators.py +0 -0
  117. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/list_mac_app_windows.py +0 -0
  118. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/list_project_tests.py +0 -0
  119. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/list_run_destinations.py +0 -0
  120. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/list_running_mac_apps.py +0 -0
  121. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/run_project_unmonitored.py +0 -0
  122. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/run_project_with_user_interaction.py +0 -0
  123. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/set_run_destination.py +0 -0
  124. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/stop_project.py +0 -0
  125. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/take_app_screenshot.py +0 -0
  126. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/take_simulator_screenshot.py +0 -0
  127. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/take_window_screenshot.py +0 -0
  128. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/take_xcode_screenshot.py +0 -0
  129. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/tools/version.py +0 -0
  130. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/__init__.py +0 -0
  131. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/build_log_parser.py +0 -0
  132. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/decode_active_destination.swift +0 -0
  133. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/decode_xcode_recents.swift +0 -0
  134. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/paths.py +0 -0
  135. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/project_templates.py +0 -0
  136. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/screenshot.py +0 -0
  137. {xcode_mcp_server-1.3.12 → xcode_mcp_server-1.3.13}/xcode_mcp_server/utils/xcresult.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xcode-mcp-server
3
- Version: 1.3.12
3
+ Version: 1.3.13
4
4
  Summary: Drew's MCP server for Xcode integration
5
5
  Project-URL: Homepage, https://github.com/drewster99/xcode-mcp-server
6
6
  Project-URL: Repository, https://github.com/drewster99/xcode-mcp-server
@@ -1,6 +1,6 @@
1
1
  """Xcode MCP Server - Model Context Protocol server for Xcode integration"""
2
2
 
3
- __version__ = "1.3.12"
3
+ __version__ = "1.3.13"
4
4
 
5
5
 
6
6
  def main():
@@ -13,9 +13,9 @@ from xcode_mcp_server.config_manager import apply_config
13
13
  from xcode_mcp_server.security import validate_and_normalize_project_path
14
14
  from xcode_mcp_server.exceptions import InvalidParameterError, XCodeMCPError
15
15
  from xcode_mcp_server.utils.applescript import (
16
- BUILD_TIMEOUT_SECONDS,
17
16
  build_open_and_wait_applescript,
18
17
  build_wait_for_completion_applescript,
18
+ resolve_build_timeout,
19
19
  escape_applescript_string,
20
20
  run_applescript,
21
21
  show_notification,
@@ -289,12 +289,14 @@ def build_project(project_path: str,
289
289
  scheme: Optional[str] = None,
290
290
  include_warnings: Optional[bool] = None,
291
291
  regex_filter: Optional[str] = None,
292
- max_lines: int = 25) -> str:
292
+ max_lines: int = 25,
293
+ timeout: Optional[int] = None) -> str:
293
294
  """
294
295
  Build the specified Xcode project or workspace.
295
296
 
296
- Builds will run for up to 10 minutes before timing out. This timeout is hardcoded
297
- to prevent issues with builds hanging indefinitely.
297
+ Builds run for up to `timeout` seconds (default 600, i.e. 10 minutes) before
298
+ timing out, which guards against a build that hangs indefinitely. Raise it
299
+ for large projects whose cold build exceeds the default.
298
300
 
299
301
  Args:
300
302
  project_path: Path to an Xcode project or workspace directory.
@@ -302,6 +304,8 @@ def build_project(project_path: str,
302
304
  include_warnings: Include warnings in build output. If not provided, uses global setting.
303
305
  regex_filter: Optional regex to filter error/warning lines
304
306
  max_lines: Maximum number of error/warning lines to show (default 25)
307
+ timeout: Maximum seconds to wait for the build to complete. If not
308
+ provided, defaults to 600. Must be a positive integer.
305
309
 
306
310
  Returns:
307
311
  Always returns JSON with format:
@@ -317,6 +321,10 @@ def build_project(project_path: str,
317
321
  if include_warnings is not None and not isinstance(include_warnings, bool):
318
322
  raise InvalidParameterError("include_warnings must be a boolean value")
319
323
 
324
+ # Resolve the build timeout up front so an invalid value errors immediately,
325
+ # before any AppleScript runs.
326
+ effective_timeout = resolve_build_timeout(timeout)
327
+
320
328
  # Validate regex_filter up front so a bad pattern produces a clear error
321
329
  # immediately, before any AppleScript runs. The supplement helper assumes
322
330
  # the pattern compiles.
@@ -340,7 +348,7 @@ def build_project(project_path: str,
340
348
  script = (
341
349
  build_open_and_wait_applescript(escaped_path, escaped_scheme)
342
350
  + ' set actionResult to build workspaceDoc\n'
343
- + build_wait_for_completion_applescript("actionResult", BUILD_TIMEOUT_SECONDS)
351
+ + build_wait_for_completion_applescript("actionResult", effective_timeout)
344
352
  + ' set buildStatus to "unknown"\n'
345
353
  + ' try\n'
346
354
  + ' set buildStatus to status of actionResult as string\n'
@@ -359,10 +367,10 @@ def build_project(project_path: str,
359
367
  manifest_path = os.path.join(derived_data_path, "Logs", "Build", "LogStoreManifest.plist")
360
368
  pre_build_uuids = snapshot_build_uuids(manifest_path)
361
369
 
362
- # The script polls inside AppleScript for up to BUILD_TIMEOUT_SECONDS; the
370
+ # The script polls inside AppleScript for up to effective_timeout; the
363
371
  # subprocess timeout must exceed that, with a small buffer for workspace
364
372
  # load and IPC overhead.
365
- success, output = run_applescript(script, timeout=BUILD_TIMEOUT_SECONDS + 60)
373
+ success, output = run_applescript(script, timeout=effective_timeout + 60)
366
374
 
367
375
  if success:
368
376
  # Parse the BUILD_STATUS: prefix from the AppleScript output
@@ -2,14 +2,15 @@
2
2
  """clean_project tool - Clean an Xcode project"""
3
3
 
4
4
  import os
5
+ from typing import Optional
5
6
 
6
7
  from xcode_mcp_server.server import mcp, TOOL_CLEAN
7
8
  from xcode_mcp_server.config_manager import apply_config
8
9
  from xcode_mcp_server.security import validate_and_normalize_project_path
9
10
  from xcode_mcp_server.exceptions import XCodeMCPError
10
11
  from xcode_mcp_server.utils.applescript import (
11
- BUILD_TIMEOUT_SECONDS,
12
12
  build_open_and_wait_applescript,
13
+ resolve_build_timeout,
13
14
  escape_applescript_string,
14
15
  run_applescript,
15
16
  show_result_notification,
@@ -19,12 +20,14 @@ from xcode_mcp_server.utils.applescript import (
19
20
 
20
21
  @mcp.tool(annotations=TOOL_CLEAN)
21
22
  @apply_config
22
- def clean_project(project_path: str) -> str:
23
+ def clean_project(project_path: str, timeout: Optional[int] = None) -> str:
23
24
  """
24
25
  Clean the specified Xcode project or workspace.
25
26
 
26
27
  Args:
27
28
  project_path: Path to an Xcode project/workspace directory.
29
+ timeout: Maximum seconds to wait for the clean to complete. If not
30
+ provided, defaults to 600. Must be a positive integer.
28
31
 
29
32
  Returns:
30
33
  Output message
@@ -32,6 +35,7 @@ def clean_project(project_path: str) -> str:
32
35
  # Validate and normalize path
33
36
  normalized_path = validate_and_normalize_project_path(project_path, "Cleaning")
34
37
  escaped_path = escape_applescript_string(normalized_path)
38
+ effective_timeout = resolve_build_timeout(timeout)
35
39
 
36
40
  script = build_open_and_wait_applescript(escaped_path) + (
37
41
  ' clean workspaceDoc\n'
@@ -41,7 +45,7 @@ def clean_project(project_path: str) -> str:
41
45
 
42
46
  # Clean is synchronous in AppleScript and can take minutes on large projects;
43
47
  # use the same budget as build/test rather than the short default.
44
- success, output = run_applescript(script, timeout=BUILD_TIMEOUT_SECONDS + 60)
48
+ success, output = run_applescript(script, timeout=effective_timeout + 60)
45
49
 
46
50
  project_name = os.path.basename(normalized_path)
47
51
 
@@ -12,9 +12,10 @@ from xcode_mcp_server.config_manager import apply_config
12
12
  from xcode_mcp_server.security import validate_and_normalize_project_path
13
13
  from xcode_mcp_server.exceptions import InvalidParameterError
14
14
  from xcode_mcp_server.utils.applescript import (
15
- BUILD_TIMEOUT_SECONDS,
16
15
  build_open_and_wait_applescript,
17
16
  build_wait_for_completion_applescript,
17
+ resolve_build_timeout,
18
+ format_timeout_duration,
18
19
  escape_applescript_string,
19
20
  run_applescript,
20
21
  show_notification,
@@ -152,16 +153,20 @@ from xcode_mcp_server.utils.xcresult import find_xcresult_bundle, extract_test_r
152
153
  @mcp.tool(annotations=TOOL_BUILD)
153
154
  @apply_config
154
155
  def run_project_tests(project_path: str,
155
- scheme: Optional[str] = None) -> str:
156
+ scheme: Optional[str] = None,
157
+ timeout: Optional[int] = None) -> str:
156
158
  """
157
159
  Run tests for the specified Xcode project or workspace.
158
160
 
159
- Tests will run for up to 10 minutes before timing out. This timeout is hardcoded
160
- to prevent issues with test runs hanging indefinitely.
161
+ Tests run for up to `timeout` seconds (default 600, i.e. 10 minutes) before
162
+ timing out, which guards against a test run hanging indefinitely. Raise it
163
+ for large projects whose build-for-testing alone exceeds the default.
161
164
 
162
165
  Args:
163
166
  project_path: Path to Xcode project/workspace directory
164
167
  scheme: Optional scheme to test (uses active scheme if not specified)
168
+ timeout: Maximum seconds to wait for the build-for-testing plus test run
169
+ to complete. If not provided, defaults to 600. Must be a positive integer.
165
170
 
166
171
  Returns:
167
172
  JSON with test results if tests complete, otherwise plain text status message.
@@ -176,6 +181,10 @@ def run_project_tests(project_path: str,
176
181
  # Validate and normalize the project path
177
182
  project_path = validate_and_normalize_project_path(project_path, "run_project_tests")
178
183
 
184
+ # Resolve the test timeout up front so an invalid value errors immediately,
185
+ # before any AppleScript runs or notifications post.
186
+ effective_timeout = resolve_build_timeout(timeout)
187
+
179
188
  # Show notification
180
189
  show_notification("Drew's Xcode MCP", subtitle=os.path.basename(project_path), message="Running tests")
181
190
 
@@ -275,14 +284,14 @@ def run_project_tests(project_path: str,
275
284
  script = (
276
285
  build_open_and_wait_applescript(escaped_path, escaped_scheme)
277
286
  + ' set testResult to test workspaceDoc\n'
278
- + build_wait_for_completion_applescript("testResult", BUILD_TIMEOUT_SECONDS)
287
+ + build_wait_for_completion_applescript("testResult", effective_timeout)
279
288
  + failure_extraction_tail
280
289
  + 'end tell\n'
281
290
  )
282
291
 
283
- # The script polls inside AppleScript for up to BUILD_TIMEOUT_SECONDS; the
292
+ # The script polls inside AppleScript for up to effective_timeout; the
284
293
  # subprocess timeout must exceed that, plus buffer for workspace load.
285
- success, output = run_applescript(script, timeout=BUILD_TIMEOUT_SECONDS + 60)
294
+ success, output = run_applescript(script, timeout=effective_timeout + 60)
286
295
 
287
296
  if not success:
288
297
  show_error_notification("Failed to run tests", os.path.basename(project_path))
@@ -307,10 +316,10 @@ def run_project_tests(project_path: str,
307
316
  output_lines = []
308
317
 
309
318
  if not completed:
310
- minutes = BUILD_TIMEOUT_SECONDS // 60
311
- output_lines.append(f"⏳ Tests did not complete within {minutes} minutes")
319
+ duration = format_timeout_duration(effective_timeout)
320
+ output_lines.append(f"⏳ Tests did not complete within {duration}")
312
321
  output_lines.append(f"Status: {status}")
313
- show_warning_notification(f"Tests timeout ({minutes} min)")
322
+ show_warning_notification(f"Tests timeout ({duration})")
314
323
  return '\n'.join(output_lines)
315
324
 
316
325
  # If tests completed, get detailed results from xcresult
@@ -12,7 +12,8 @@ from xcode_mcp_server.config_manager import apply_config
12
12
  from xcode_mcp_server.security import validate_and_normalize_project_path
13
13
  from xcode_mcp_server.exceptions import XCodeMCPError
14
14
  from xcode_mcp_server.utils.applescript import (
15
- BUILD_TIMEOUT_SECONDS,
15
+ resolve_build_timeout,
16
+ format_timeout_duration,
16
17
  build_open_and_wait_applescript,
17
18
  escape_applescript_string,
18
19
  run_applescript,
@@ -32,12 +33,14 @@ from xcode_mcp_server.utils.xcresult import (
32
33
  def run_project_until_terminated(project_path: str,
33
34
  scheme: Optional[str] = None,
34
35
  regex_filter: Optional[str] = None,
35
- max_lines: int = 20) -> str:
36
+ max_lines: int = 20,
37
+ timeout: Optional[int] = None) -> str:
36
38
  """
37
- Run the app and wait for it to terminate naturally (up to 10 minutes).
39
+ Run the app and wait for it to terminate naturally (up to `timeout` seconds).
38
40
 
39
- The app will run in Xcode/Simulator. If it doesn't terminate within 10 minutes,
40
- it will be force-stopped and runtime logs will be extracted.
41
+ The app will run in Xcode/Simulator. If it doesn't terminate within `timeout`
42
+ seconds (default 600, i.e. 10 minutes), it will be force-stopped and runtime
43
+ logs will be extracted.
41
44
 
42
45
  No user interaction required - fully automated.
43
46
 
@@ -48,6 +51,9 @@ def run_project_until_terminated(project_path: str,
48
51
  scheme: Optional scheme to run. If not provided, uses the active scheme.
49
52
  regex_filter: Optional regex pattern to find matching lines in the output
50
53
  max_lines: Maximum number of matching lines to return (default 20)
54
+ timeout: Maximum seconds to wait for the app to terminate before
55
+ force-stopping it. If not provided, defaults to 600. Must be a
56
+ positive integer.
51
57
 
52
58
  Returns:
53
59
  JSON string with structured console output
@@ -56,6 +62,7 @@ def run_project_until_terminated(project_path: str,
56
62
  scheme_desc = scheme if scheme else "active scheme"
57
63
  normalized_path = validate_and_normalize_project_path(project_path, f"Running {scheme_desc} in")
58
64
  escaped_path = escape_applescript_string(normalized_path)
65
+ effective_timeout = resolve_build_timeout(timeout)
59
66
 
60
67
  # Show running notification
61
68
  project_name = os.path.basename(normalized_path)
@@ -83,13 +90,12 @@ def run_project_until_terminated(project_path: str,
83
90
  show_error_notification("Failed to launch app", project_name)
84
91
  raise XCodeMCPError(f"Launch failed: {output}")
85
92
 
86
- print(f"App launched, polling for termination (up to {BUILD_TIMEOUT_SECONDS // 60} minutes)...", file=sys.stderr)
93
+ print(f"App launched, polling for termination (up to {format_timeout_duration(effective_timeout)})...", file=sys.stderr)
87
94
 
88
- timeout = BUILD_TIMEOUT_SECONDS
89
95
  elapsed = 0
90
96
  app_terminated = False
91
97
 
92
- while elapsed < timeout:
98
+ while elapsed < effective_timeout:
93
99
  # Check if app terminated
94
100
  check_script = f'''
95
101
  set projectPath to "{escaped_path}"
@@ -112,9 +118,9 @@ def run_project_until_terminated(project_path: str,
112
118
 
113
119
  # If still running after timeout, force-stop
114
120
  if not app_terminated:
115
- minutes = BUILD_TIMEOUT_SECONDS // 60
116
- print(f"App did not terminate within {minutes} minutes, force-stopping...", file=sys.stderr)
117
- show_warning_notification(f"App timeout ({minutes} min)", "Force-stopping app")
121
+ duration = format_timeout_duration(effective_timeout)
122
+ print(f"App did not terminate within {duration}, force-stopping...", file=sys.stderr)
123
+ show_warning_notification(f"App timeout ({duration})", "Force-stopping app")
118
124
 
119
125
  stop_script = f'''
120
126
  set projectPath to "{escaped_path}"
@@ -8,7 +8,7 @@ import threading
8
8
  from collections import deque
9
9
  from typing import Tuple, List, Dict, Optional
10
10
 
11
- from xcode_mcp_server.exceptions import XCodeMCPError
11
+ from xcode_mcp_server.exceptions import XCodeMCPError, InvalidParameterError
12
12
 
13
13
  # Global notification setting - initialized by CLI
14
14
  NOTIFICATIONS_ENABLED = True
@@ -27,8 +27,9 @@ _NOTIFICATION_HISTORY_LOCK = threading.Lock()
27
27
  # workspace document to load.
28
28
  WORKSPACE_LOAD_REPEATS = 60
29
29
 
30
- # Maximum time (seconds) to wait for a build or run action to complete in
31
- # AppleScript polling loops.
30
+ # Default maximum time (seconds) to wait for a build or run action to complete
31
+ # in AppleScript polling loops. Used when a caller doesn't pass an explicit
32
+ # `timeout` — see resolve_build_timeout.
32
33
  BUILD_TIMEOUT_SECONDS = 600
33
34
 
34
35
  # Default subprocess timeout for `osascript` invocations that are expected to
@@ -116,6 +117,19 @@ def build_open_and_wait_applescript(escaped_path: str, escaped_scheme: Optional[
116
117
  )
117
118
 
118
119
 
120
+ def format_timeout_duration(seconds: int) -> str:
121
+ """Render a timeout as human-readable text for user-facing messages.
122
+
123
+ Uses whole minutes only when the value is a clean minute multiple (so the
124
+ common 600s default reads as "10 minutes"); otherwise reports seconds, so a
125
+ short caller-supplied timeout reads as "5 seconds" rather than "0 minutes".
126
+ """
127
+ if seconds >= 60 and seconds % 60 == 0:
128
+ minutes = seconds // 60
129
+ return f"{minutes} minute" + ("" if minutes == 1 else "s")
130
+ return f"{seconds} second" + ("" if seconds == 1 else "s")
131
+
132
+
119
133
  def build_wait_for_completion_applescript(
120
134
  result_var: str = "actionResult",
121
135
  timeout_seconds: int = BUILD_TIMEOUT_SECONDS,
@@ -128,13 +142,13 @@ def build_wait_for_completion_applescript(
128
142
  result_var: AppleScript variable holding a scheme-action-result.
129
143
  timeout_seconds: Seconds before the loop errors out.
130
144
  """
131
- minutes = timeout_seconds // 60
145
+ duration = format_timeout_duration(timeout_seconds)
132
146
  return (
133
147
  f' set buildWaitTime to 0\n'
134
148
  f' repeat\n'
135
149
  f' if completed of {result_var} is true then exit repeat\n'
136
150
  f' if buildWaitTime >= {timeout_seconds} then\n'
137
- f' error "Build timed out after {minutes} minutes"\n'
151
+ f' error "Build timed out after {duration}"\n'
138
152
  f' end if\n'
139
153
  f' delay 0.5\n'
140
154
  f' set buildWaitTime to buildWaitTime + 0.5\n'
@@ -142,6 +156,35 @@ def build_wait_for_completion_applescript(
142
156
  )
143
157
 
144
158
 
159
+ def resolve_build_timeout(timeout: Optional[int]) -> int:
160
+ """Resolve the effective build/test timeout in seconds for a tool call.
161
+
162
+ Args:
163
+ timeout: Per-call override in seconds, or None to use the default
164
+ BUILD_TIMEOUT_SECONDS.
165
+
166
+ Returns:
167
+ The validated timeout in seconds. The caller threads this into BOTH the
168
+ inner AppleScript poll budget (build_wait_for_completion_applescript)
169
+ and the outer run_applescript subprocess timeout so the two stay
170
+ consistent.
171
+
172
+ Raises:
173
+ InvalidParameterError: If `timeout` is provided but is not a positive
174
+ integer number of seconds. Short timeouts (e.g. 5) are allowed; the
175
+ caller owns that trade-off.
176
+ """
177
+ if timeout is None:
178
+ return BUILD_TIMEOUT_SECONDS
179
+ # bool is a subclass of int; reject it explicitly so True/False can't slip
180
+ # through as 1/0.
181
+ if isinstance(timeout, bool) or not isinstance(timeout, int):
182
+ raise InvalidParameterError("timeout must be an integer number of seconds")
183
+ if timeout <= 0:
184
+ raise InvalidParameterError("timeout must be a positive number of seconds")
185
+ return timeout
186
+
187
+
145
188
  def run_applescript(script: str, timeout: int = DEFAULT_APPLESCRIPT_TIMEOUT) -> Tuple[bool, str]:
146
189
  """Run an AppleScript and return success status and output.
147
190