xcode-mcp-server 1.3.9__tar.gz → 1.3.10__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 (134) hide show
  1. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/PKG-INFO +1 -1
  2. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/__init__.py +1 -1
  3. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/build_project.py +182 -1
  4. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/build_log_parser.py +17 -8
  5. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/.github/workflows/claude-code.yml +0 -0
  6. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/.github/workflows/claude-self-review.yml +0 -0
  7. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/.gitignore +0 -0
  8. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/CLAUDE.md +0 -0
  9. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/LICENSE +0 -0
  10. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/README.md +0 -0
  11. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/TODO.md +0 -0
  12. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/_venv-setup.sh +0 -0
  13. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/deploy-beta.sh +0 -0
  14. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/deploy.sh +0 -0
  15. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/dev.sh +0 -0
  16. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/fools-errand.md +0 -0
  17. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/info.sh +0 -0
  18. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/pyproject.toml +0 -0
  19. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/requirements.txt +0 -0
  20. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/run_local_for_claude.sh +0 -0
  21. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/cleanup_tests.sh +0 -0
  22. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/create_projects.py +0 -0
  23. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/create_real_projects.py +0 -0
  24. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/create_spm_projects.sh +0 -0
  25. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/create_xcode_projects.sh +0 -0
  26. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/run_all_tests.sh +0 -0
  27. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/setup_test_projects.sh +0 -0
  28. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/scripts/setup_tests.sh +0 -0
  29. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  30. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  31. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/Assets.xcassets/Contents.json +0 -0
  32. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/ContentView.swift +0 -0
  33. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp/iosEmptySwiftUIAppApp.swift +0 -0
  34. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.pbxproj +0 -0
  35. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  36. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  37. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/iosEmptySwiftUIApp/iosEmptySwiftUIApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  38. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp/main.swift +0 -0
  39. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.pbxproj +0 -0
  40. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  41. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  42. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptyCommandLineApp/macosEmptyCommandLineApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  43. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  44. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  45. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/Assets.xcassets/Contents.json +0 -0
  46. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/ContentView.swift +0 -0
  47. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp/macosEmptySwiftUIAppApp.swift +0 -0
  48. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.pbxproj +0 -0
  49. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  50. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  51. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/fromXcode/macosEmptySwiftUIApp/macosEmptySwiftUIApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  52. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/BrokenApp/BrokenApp/main.swift +0 -0
  53. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.pbxproj +0 -0
  54. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  55. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  56. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/BrokenApp/BrokenApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  57. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/ConsoleApp/ConsoleApp/main.swift +0 -0
  58. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.pbxproj +0 -0
  59. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  60. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  61. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/ConsoleApp/ConsoleApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  62. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SimpleApp/SimpleApp/main.swift +0 -0
  63. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.pbxproj +0 -0
  64. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  65. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  66. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SimpleApp/SimpleApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  67. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  68. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  69. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/Assets.xcassets/Contents.json +0 -0
  70. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/ContentView.swift +0 -0
  71. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp/macosEmptySwiftUIAppApp.swift +0 -0
  72. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.pbxproj +0 -0
  73. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  74. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  75. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/SwiftUITestApp/SwiftUITestApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  76. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  77. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  78. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp/Assets.xcassets/Contents.json +0 -0
  79. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp/ContentView.swift +0 -0
  80. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp/iosEmptySwiftUIAppApp.swift +0 -0
  81. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.pbxproj +0 -0
  82. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  83. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/project.xcworkspace/xcuserdata/andrew.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  84. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/test_projects/templates/iOSTestApp/iOSTestApp.xcodeproj/xcuserdata/andrew.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  85. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/debug_build.py +0 -0
  86. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/debug_test.py +0 -0
  87. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/test_basic.py +0 -0
  88. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/test_build.py +0 -0
  89. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/test_fixed.py +0 -0
  90. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/test_minimal.py +0 -0
  91. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/tests/test_runner.py +0 -0
  92. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/__main__.py +0 -0
  93. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/cli.py +0 -0
  94. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/config_manager.py +0 -0
  95. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/config_ui.py +0 -0
  96. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/exceptions.py +0 -0
  97. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/security.py +0 -0
  98. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/server.py +0 -0
  99. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/__init__.py +0 -0
  100. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/clean_project.py +0 -0
  101. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/create_project.py +0 -0
  102. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/debug_list_notification_history.py +0 -0
  103. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_active_run_destination.py +0 -0
  104. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_build_errors.py +0 -0
  105. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_build_results.py +0 -0
  106. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_directory_listing.py +0 -0
  107. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_directory_tree.py +0 -0
  108. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_latest_test_results.py +0 -0
  109. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_project_schemes.py +0 -0
  110. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_runtime_output.py +0 -0
  111. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/get_xcode_projects.py +0 -0
  112. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/list_booted_simulators.py +0 -0
  113. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/list_mac_app_windows.py +0 -0
  114. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/list_project_tests.py +0 -0
  115. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/list_run_destinations.py +0 -0
  116. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/list_running_mac_apps.py +0 -0
  117. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/run_project_tests.py +0 -0
  118. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/run_project_unmonitored.py +0 -0
  119. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/run_project_until_terminated.py +0 -0
  120. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/run_project_with_user_interaction.py +0 -0
  121. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/set_run_destination.py +0 -0
  122. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/stop_project.py +0 -0
  123. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/take_app_screenshot.py +0 -0
  124. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/take_simulator_screenshot.py +0 -0
  125. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/take_window_screenshot.py +0 -0
  126. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/take_xcode_screenshot.py +0 -0
  127. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/tools/version.py +0 -0
  128. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/__init__.py +0 -0
  129. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/applescript.py +0 -0
  130. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/decode_active_destination.swift +0 -0
  131. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/decode_xcode_recents.swift +0 -0
  132. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/project_templates.py +0 -0
  133. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/xcode_mcp_server/utils/screenshot.py +0 -0
  134. {xcode_mcp_server-1.3.9 → xcode_mcp_server-1.3.10}/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.9
3
+ Version: 1.3.10
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.9"
3
+ __version__ = "1.3.10"
4
4
 
5
5
 
6
6
  def main():
@@ -1,7 +1,10 @@
1
1
  #!/usr/bin/env python3
2
2
  """build_project tool - Build an Xcode project"""
3
3
 
4
+ import json
4
5
  import os
6
+ import re
7
+ import sys
5
8
  from typing import Optional
6
9
 
7
10
  from xcode_mcp_server.server import mcp
@@ -17,6 +20,179 @@ from xcode_mcp_server.utils.applescript import (
17
20
  show_warning_notification
18
21
  )
19
22
  from xcode_mcp_server.utils.xcresult import extract_build_errors_and_warnings
23
+ from xcode_mcp_server.utils.build_log_parser import (
24
+ find_derived_data_for_project,
25
+ aggregate_warnings_since_clean
26
+ )
27
+
28
+
29
+ def _supplement_with_xcactivitylog_warnings(
30
+ errors_json: str,
31
+ project_path: str,
32
+ include_warnings: Optional[bool],
33
+ regex_filter: Optional[str],
34
+ max_lines: int
35
+ ) -> str:
36
+ """
37
+ Supplement build results with comprehensive warnings from xcactivitylog files.
38
+
39
+ The AppleScript build log only contains warnings for files recompiled in the
40
+ current build. xcactivitylog files contain warnings from all builds since the
41
+ last clean, providing comprehensive coverage across incremental builds.
42
+
43
+ xcactivitylog is the primary source. Any errors or warnings from the AppleScript
44
+ build log not already present in xcactivitylog are preserved as supplements.
45
+ """
46
+ from xcode_mcp_server.utils.xcresult import BUILD_WARNINGS_FORCED, BUILD_WARNINGS_ENABLED
47
+
48
+ if BUILD_WARNINGS_FORCED is not None:
49
+ show_warnings = BUILD_WARNINGS_FORCED
50
+ else:
51
+ show_warnings = include_warnings if include_warnings is not None else BUILD_WARNINGS_ENABLED
52
+
53
+ if not show_warnings:
54
+ return errors_json
55
+
56
+ try:
57
+ derived_data_path = find_derived_data_for_project(project_path)
58
+ if not derived_data_path:
59
+ return errors_json
60
+
61
+ logs_dir = os.path.join(derived_data_path, "Logs", "Build")
62
+ manifest_path = os.path.join(logs_dir, "LogStoreManifest.plist")
63
+
64
+ if not os.path.exists(manifest_path):
65
+ return errors_json
66
+
67
+ xcactivity_result = aggregate_warnings_since_clean(manifest_path, logs_dir)
68
+ xcactivity_items = xcactivity_result.get('aggregated_warnings', [])
69
+
70
+ if not xcactivity_items:
71
+ return errors_json
72
+
73
+ # Apply regex_filter to xcactivitylog items if provided
74
+ if regex_filter and regex_filter.strip():
75
+ filter_re = re.compile(regex_filter)
76
+ xcactivity_items = [
77
+ w for w in xcactivity_items
78
+ if filter_re.search(
79
+ f"{w['file']}:{w['line']}:{w['column']}: {w['type']}: {w['message']}"
80
+ )
81
+ ]
82
+ if not xcactivity_items:
83
+ return errors_json
84
+
85
+ result = json.loads(errors_json)
86
+ existing_text = result.get('errors_and_warnings', '')
87
+ build_failed = result.get('summary', {}).get('build_failed', False)
88
+
89
+ # Parse error/warning lines from existing AppleScript result
90
+ error_re = re.compile(
91
+ r'(:\d+:\d+: error:)|(^error\s*:)|(:\s+error:)', re.IGNORECASE
92
+ )
93
+ warning_re = re.compile(
94
+ r'(:\d+:\d+: warning:)|(^warning\s*:)|(:\s+warning:)', re.IGNORECASE
95
+ )
96
+ flc_re = re.compile(r'(.+?):(\d+):(\d+): (?:warning|error):')
97
+
98
+ existing_lines = existing_text.split('\n')
99
+ applescript_error_lines = [l for l in existing_lines if error_re.search(l)]
100
+ applescript_warning_lines = [l for l in existing_lines if warning_re.search(l)]
101
+
102
+ # Build dedup set from xcactivitylog entries
103
+ xcact_keys = set()
104
+ for w in xcactivity_items:
105
+ xcact_keys.add((w['file'], w['line'], w['column']))
106
+
107
+ # Separate xcactivitylog items into error and warning text lines
108
+ xcact_error_lines = []
109
+ xcact_warning_lines = []
110
+ for w in xcactivity_items:
111
+ line = f"{w['file']}:{w['line']}:{w['column']}: {w['type']}: {w['message']}"
112
+ if w['type'] == 'error':
113
+ xcact_error_lines.append(line)
114
+ else:
115
+ xcact_warning_lines.append(line)
116
+
117
+ # Find AppleScript lines not already in xcactivitylog
118
+ extra_errors = []
119
+ for line in applescript_error_lines:
120
+ m = flc_re.match(line)
121
+ if m:
122
+ key = (m.group(1), int(m.group(2)), int(m.group(3)))
123
+ if key not in xcact_keys:
124
+ extra_errors.append(line)
125
+ else:
126
+ extra_errors.append(line)
127
+
128
+ extra_warnings = []
129
+ for line in applescript_warning_lines:
130
+ m = flc_re.match(line)
131
+ if m:
132
+ key = (m.group(1), int(m.group(2)), int(m.group(3)))
133
+ if key not in xcact_keys:
134
+ extra_warnings.append(line)
135
+ else:
136
+ extra_warnings.append(line)
137
+
138
+ # Combine: errors first (xcactivitylog + extras), then warnings
139
+ all_error_lines = xcact_error_lines + extra_errors
140
+ all_warning_lines = xcact_warning_lines + extra_warnings
141
+ total_errors = len(all_error_lines)
142
+ total_warnings = len(all_warning_lines)
143
+
144
+ # Apply max_lines with errors prioritized
145
+ combined = all_error_lines + all_warning_lines
146
+ displayed_errors = min(total_errors, max_lines)
147
+ displayed_warnings = max(0, min(total_warnings, max_lines - displayed_errors))
148
+ if len(combined) > max_lines:
149
+ combined = combined[:max_lines]
150
+
151
+ # Build count message
152
+ if build_failed:
153
+ if total_errors > 0 and total_warnings > 0:
154
+ count_msg = (
155
+ f"Build failed with {total_errors} error{'s' if total_errors != 1 else ''}"
156
+ f" and {total_warnings} warning{'s' if total_warnings != 1 else ''}."
157
+ )
158
+ elif total_errors > 0:
159
+ count_msg = f"Build failed with {total_errors} error{'s' if total_errors != 1 else ''}."
160
+ elif total_warnings > 0:
161
+ count_msg = (
162
+ f"Build failed with 0 recognized errors"
163
+ f" and {total_warnings} warning{'s' if total_warnings != 1 else ''}."
164
+ f" See full log for failure details."
165
+ )
166
+ else:
167
+ return errors_json
168
+ else:
169
+ if total_warnings > 0 and total_errors > 0:
170
+ count_msg = (
171
+ f"Build succeeded with {total_errors} error{'s' if total_errors != 1 else ''}"
172
+ f" and {total_warnings} warning{'s' if total_warnings != 1 else ''}."
173
+ )
174
+ elif total_warnings > 0:
175
+ count_msg = f"Build succeeded with {total_warnings} warning{'s' if total_warnings != 1 else ''}."
176
+ else:
177
+ return errors_json
178
+
179
+ if total_errors + total_warnings > max_lines:
180
+ count_msg += f" Showing first {len(combined)} of {total_errors + total_warnings}."
181
+
182
+ important_list = "\n".join(combined)
183
+ output_text = f"{count_msg}\n{important_list}" if combined else count_msg
184
+
185
+ result['summary']['total_errors'] = total_errors
186
+ result['summary']['total_warnings'] = total_warnings
187
+ result['summary']['showing_errors'] = displayed_errors
188
+ result['summary']['showing_warnings'] = displayed_warnings
189
+ result['errors_and_warnings'] = output_text
190
+
191
+ return json.dumps(result)
192
+
193
+ except Exception as e:
194
+ print(f"Debug: xcactivitylog supplement failed: {e}", file=sys.stderr)
195
+ return errors_json
20
196
 
21
197
 
22
198
  @mcp.tool()
@@ -179,8 +355,13 @@ end tell
179
355
  # Always extract and format errors/warnings (returns JSON)
180
356
  errors_output = extract_build_errors_and_warnings(build_log, include_warnings, regex_filter, max_lines, build_status=build_status)
181
357
 
358
+ # Supplement with comprehensive warnings from xcactivitylog files
359
+ # (AppleScript build log only has warnings for files recompiled in this build)
360
+ errors_output = _supplement_with_xcactivitylog_warnings(
361
+ errors_output, normalized_path, include_warnings, regex_filter, max_lines
362
+ )
363
+
182
364
  # Parse JSON to show appropriate notification
183
- import json
184
365
  try:
185
366
  result = json.loads(errors_output)
186
367
  summary = result.get("summary", {})
@@ -178,7 +178,7 @@ def aggregate_warnings_since_clean(manifest_path: str, logs_dir: str) -> Dict:
178
178
 
179
179
  # Parse each build's xcactivitylog file
180
180
  all_warnings = []
181
- all_recompiled_files = set()
181
+ file_last_compiled: Dict[str, float] = {}
182
182
  builds_analyzed = []
183
183
 
184
184
  for build in builds_to_analyze:
@@ -190,19 +190,22 @@ def aggregate_warnings_since_clean(manifest_path: str, logs_dir: str) -> Dict:
190
190
 
191
191
  warnings, compiled_files = parse_xcactivitylog(log_file)
192
192
 
193
- # Track recompiled files (files compiled in this build)
194
- all_recompiled_files.update(compiled_files)
193
+ # Track the latest build time each file was compiled in
194
+ build_time = build['timeStartedRecording']
195
+ for f in compiled_files:
196
+ if f not in file_last_compiled or build_time > file_last_compiled[f]:
197
+ file_last_compiled[f] = build_time
195
198
 
196
199
  # Store warnings with build context
197
200
  for warning in warnings:
198
201
  warning['build_uuid'] = build['uuid']
199
- warning['build_time'] = build['timeStartedRecording']
202
+ warning['build_time'] = build_time
200
203
  all_warnings.append(warning)
201
204
 
202
205
  builds_analyzed.append({
203
206
  'uuid': build['uuid'],
204
207
  'title': build['title'],
205
- 'time': build['timeStartedRecording'],
208
+ 'time': build_time,
206
209
  'warnings_found': len(warnings),
207
210
  'files_compiled': len(compiled_files)
208
211
  })
@@ -226,11 +229,17 @@ def aggregate_warnings_since_clean(manifest_path: str, logs_dir: str) -> Dict:
226
229
  # Sort by build time (descending) to get most recent first
227
230
  file_warnings.sort(key=lambda x: x['build_time'], reverse=True)
228
231
 
229
- # Get the most recent build time for this file
230
- most_recent_time = file_warnings[0]['build_time']
232
+ # Get the most recent build time for this file's warnings
233
+ most_recent_warning_time = file_warnings[0]['build_time']
234
+
235
+ # If this file was recompiled in a later build without warnings, the
236
+ # old warnings are stale — the file now compiles cleanly.
237
+ last_compiled = file_last_compiled.get(file_path)
238
+ if last_compiled is not None and last_compiled > most_recent_warning_time:
239
+ continue
231
240
 
232
241
  # Keep only warnings from the most recent build
233
- recent_warnings = [w for w in file_warnings if w['build_time'] == most_recent_time]
242
+ recent_warnings = [w for w in file_warnings if w['build_time'] == most_recent_warning_time]
234
243
 
235
244
  # Track if file had warnings in multiple builds
236
245
  unique_build_times = set(w['build_time'] for w in file_warnings)