Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion .agents/skills/macios-xcode-beta-update/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,15 +96,44 @@ Capture resulting `tests/xtro-sharpie/api-annotations-dotnet/*.todo` and `*.igno

## Introspection workflow (all platforms)

Use explicit prebuild + run to avoid mobile run target issues:
Use explicit prebuild + run to avoid mobile run target issues.

**IMPORTANT: Run platforms sequentially, not in parallel.** The shared `obj/` directories
(`tests/common/Touch.Unit/Touch.Client/dotnet/obj` and `tests/common/MonoTouch.Dialog/obj`)
cause NETSDK1005 errors when concurrent restores overwrite `project.assets.json` with
different platform TFMs. Clean shared obj dirs before each platform build:

```bash
rm -rf tests/common/Touch.Unit/Touch.Client/dotnet/obj tests/common/MonoTouch.Dialog/obj
make -C tests/introspection/dotnet build-ios run-ios

rm -rf tests/common/Touch.Unit/Touch.Client/dotnet/obj tests/common/MonoTouch.Dialog/obj
make -C tests/introspection/dotnet build-tvos run-tvos

rm -rf tests/common/Touch.Unit/Touch.Client/dotnet/obj tests/common/MonoTouch.Dialog/obj
make -C tests/introspection/dotnet build-macOS run-macOS

rm -rf tests/common/Touch.Unit/Touch.Client/dotnet/obj tests/common/MonoTouch.Dialog/obj
make -C tests/introspection/dotnet build-MacCatalyst run-MacCatalyst
```

**Desktop test output:** For macOS and Mac Catalyst, `make run-macOS`/`run-MacCatalyst` uses
`dotnet build -t:Run` which launches the app without waiting or capturing stdout. The make
command exits immediately with success even while tests are still running. To get actual test
results, run the executable directly after building:

```bash
# Build first
make -C tests/introspection/dotnet build-macOS
# Then run directly to capture output
NUNIT_AUTOSTART=true NUNIT_AUTOEXIT=true \
tests/introspection/dotnet/macOS/bin/Debug/net10.0-macos/osx-arm64/introspection.app/Contents/MacOS/introspection
```

Same pattern for Mac Catalyst (replace `macOS` → `MacCatalyst`, `net10.0-macos` → `net10.0-maccatalyst`, `osx-arm64` → `maccatalyst-arm64`).

iOS and tvOS simulator tests capture output correctly via `make run-ios`/`run-tvos`.

These runs can take a long time; wait for completion and summarize outcomes per platform.

## Completion checklist
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,29 @@

`make -C tests/introspection/dotnet run-ios` may fail if the app isn't built first.
Prefer `build-ios run-ios` (same for other platforms) in the same command.

## Introspection parallelism gotcha

Running introspection tests for multiple platforms in parallel causes NETSDK1005 errors.
The shared test libraries (`Touch.Unit/Touch.Client/dotnet/` and `MonoTouch.Dialog/`) have
per-platform `.csproj` files that share a single `obj/` directory. When one platform restores,
it writes `project.assets.json` targeting only that platform's TFM, breaking other platforms.

**Fix:** Run sequentially and clean shared obj dirs before each platform:
```bash
rm -rf tests/common/Touch.Unit/Touch.Client/dotnet/obj tests/common/MonoTouch.Dialog/obj
```

## Desktop introspection output capture

For macOS and Mac Catalyst, `make run-macOS`/`run-MacCatalyst` uses `dotnet build -t:Run`
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make run-bare will do the right thing (in the introspection/dotnet/<platform> directory)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah perfect, will update this in the next one!

which launches the desktop app and exits immediately without waiting or capturing stdout.
The make target will report success (exit 0) while the test app is still running.

**Fix:** After building, run the executable directly with environment variables:
```bash
NUNIT_AUTOSTART=true NUNIT_AUTOEXIT=true \
tests/introspection/dotnet/macOS/bin/Debug/net10.0-macos/osx-arm64/introspection.app/Contents/MacOS/introspection
```

iOS and tvOS simulator tests do not have this problem — their output is captured correctly.
4 changes: 2 additions & 2 deletions Make.config
Original file line number Diff line number Diff line change
Expand Up @@ -208,9 +208,9 @@ MACCATALYST_NUGET_VERSION_FULL=$(MACCATALYST_NUGET_VERSION_NO_METADATA)$(NUGET_B

# Xcode version should have both a major and a minor version (even if the minor version is 0)
XCODE_VERSION=26.4
XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_26.4_beta_2.xip
XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_26.4_beta_3.xip
ifndef IS_LINUX
XCODE_DEVELOPER_ROOT=/Applications/Xcode_26.4.0-beta2.app/Contents/Developer
XCODE_DEVELOPER_ROOT=/Applications/Xcode_26.4.0-beta3.app/Contents/Developer
XCODE_PRODUCT_BUILD_VERSION:=$(shell /usr/libexec/PlistBuddy -c 'Print :ProductBuildVersion' $(XCODE_DEVELOPER_ROOT)/../version.plist 2>/dev/null || echo " $(shell tput setaf 1 2>/dev/null)The required Xcode ($(XCODE_VERSION)) is not installed in $(basename $(basename $(XCODE_DEVELOPER_ROOT)))$(shell tput sgr0 2>/dev/null)" >&2)

# We define stable Xcode as the Xcode app being named like "Xcode_#.#[.#].app"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertion::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistration::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::setPrf: not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::setPrf: not bound
58 changes: 58 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-CarPlay.todo
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,61 @@
!missing-type! CPMapTemplateWaypoint not bound
!missing-type! CPNavigationWaypoint not bound
!missing-type! CPRouteSegment not bound
!missing-enum! CPImageOverlayAlignment not bound
!missing-enum! CPPlaybackAction not bound
!missing-enum! CPPlaybackPresentation not bound
!missing-protocol! CPPlayableItem not bound
!missing-selector! +CPListTemplateDetailsHeader::maximumActionButtonCount not bound
!missing-selector! +CPListTemplateDetailsHeader::maximumActionButtonSize not bound
!missing-selector! CPImageOverlay::alignment not bound
!missing-selector! CPImageOverlay::backgroundColor not bound
!missing-selector! CPImageOverlay::image not bound
!missing-selector! CPImageOverlay::initWithImage:alignment: not bound
!missing-selector! CPImageOverlay::initWithText:textColor:backgroundColor:alignment: not bound
!missing-selector! CPImageOverlay::text not bound
!missing-selector! CPImageOverlay::textColor not bound
!missing-selector! CPListImageRowItemCardElement::initWithThumbnail:title:subtitle:tintColor: not bound
!missing-selector! CPListImageRowItemCardElement::setThumbnail: not bound
!missing-selector! CPListImageRowItemCardElement::thumbnail not bound
!missing-selector! CPListImageRowItemElementCPListImageRowItemElement::accessibilityLabel not bound
!missing-selector! CPListImageRowItemElementCPListImageRowItemElement::setAccessibilityLabel: not bound
!missing-selector! CPListTemplate::initWithTitle:listHeader:sections:assistantCellConfiguration: not bound
!missing-selector! CPListTemplate::listHeader not bound
!missing-selector! CPListTemplate::setListHeader: not bound
!missing-selector! CPListTemplateDetailsHeader::actionButtons not bound
!missing-selector! CPListTemplateDetailsHeader::bodyVariants not bound
!missing-selector! CPListTemplateDetailsHeader::initWithThumbnail:title:subtitle:actionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::initWithThumbnail:title:subtitle:bodyVariants:actionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::setActionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::setAdaptiveBackgroundStyle: not bound
!missing-selector! CPListTemplateDetailsHeader::setBodyVariants: not bound
!missing-selector! CPListTemplateDetailsHeader::setSubtitle: not bound
!missing-selector! CPListTemplateDetailsHeader::setThumbnail: not bound
!missing-selector! CPListTemplateDetailsHeader::setTitle: not bound
!missing-selector! CPListTemplateDetailsHeader::subtitle not bound
!missing-selector! CPListTemplateDetailsHeader::thumbnail not bound
!missing-selector! CPListTemplateDetailsHeader::title not bound
!missing-selector! CPListTemplateDetailsHeader::wantsAdaptiveBackgroundStyle not bound
!missing-selector! CPPlaybackConfiguration::duration not bound
!missing-selector! CPPlaybackConfiguration::elapsedTime not bound
!missing-selector! CPPlaybackConfiguration::initWithPreferredPresentation:playbackAction:elapsedTime:duration: not bound
!missing-selector! CPPlaybackConfiguration::playbackAction not bound
!missing-selector! CPPlaybackConfiguration::preferredPresentation not bound
!missing-selector! CPSessionConfiguration::supportsVideoPlayback not bound
!missing-selector! CPSportsOverlay::eventStatus not bound
!missing-selector! CPSportsOverlay::initWithLeftTeam:rightTeam:eventStatus: not bound
!missing-selector! CPSportsOverlay::leftTeam not bound
!missing-selector! CPSportsOverlay::rightTeam not bound
!missing-selector! CPThumbnailImage::image not bound
!missing-selector! CPThumbnailImage::imageOverlay not bound
!missing-selector! CPThumbnailImage::initWithImage: not bound
!missing-selector! CPThumbnailImage::initWithImage:imageOverlay:sportsOverlay: not bound
!missing-selector! CPThumbnailImage::setImage: not bound
!missing-selector! CPThumbnailImage::setImageOverlay: not bound
!missing-selector! CPThumbnailImage::setSportsOverlay: not bound
!missing-selector! CPThumbnailImage::sportsOverlay not bound
!missing-type! CPImageOverlay not bound
!missing-type! CPListTemplateDetailsHeader not bound
!missing-type! CPPlaybackConfiguration not bound
!missing-type! CPSportsOverlay not bound
!missing-type! CPThumbnailImage not bound

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!missing-field! kCTFontDescriptorLanguageAttribute not bound
!missing-pinvoke! CTFontGetUIFontType is not bound
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
!missing-enum-value! MPSGraphReducedPrecisionFastMath native value MPSGraphReducedPrecisionFastMathAllowConvertingOperandsFromFP32ToFP19 = 4 not bound
!missing-selector! MPSGraph::planarTensorWithComplexTensor:name: not bound
!missing-selector! MPSGraphCompilationDescriptor::disableAutoLayoutConversion not bound
!missing-selector! MPSGraphCompilationDescriptor::convertLayoutToNHWC not bound
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,5 @@
!missing-selector! PKDisbursementRequest::isDelegatedRequest not bound
!missing-selector! PKDisbursementRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::isDelegatedRequest not bound
!missing-selector! PKPaymentRequest::issuerRegions not bound
!missing-selector! PKPaymentRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::setIssuerRegions: not bound
!missing-selector! PKPassLibrary::openPaymentSetupWithMerchantIdentifier: not bound
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertion::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistration::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::setPrf: not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::setPrf: not bound
60 changes: 60 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/iOS-CarPlay.todo
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,63 @@
!missing-type! CPMapTemplateWaypoint not bound
!missing-type! CPNavigationWaypoint not bound
!missing-type! CPRouteSegment not bound
!missing-enum! CPImageOverlayAlignment not bound
!missing-enum! CPPlaybackAction not bound
!missing-enum! CPPlaybackPresentation not bound
!missing-protocol-conformance! CPListImageRowItemElement should conform to CPPlayableItem (defined in '' category)
!missing-protocol-conformance! CPListItem should conform to CPPlayableItem (defined in '' category)
!missing-protocol! CPPlayableItem not bound
!missing-selector! +CPListTemplateDetailsHeader::maximumActionButtonCount not bound
!missing-selector! +CPListTemplateDetailsHeader::maximumActionButtonSize not bound
!missing-selector! CPImageOverlay::alignment not bound
!missing-selector! CPImageOverlay::backgroundColor not bound
!missing-selector! CPImageOverlay::image not bound
!missing-selector! CPImageOverlay::initWithImage:alignment: not bound
!missing-selector! CPImageOverlay::initWithText:textColor:backgroundColor:alignment: not bound
!missing-selector! CPImageOverlay::text not bound
!missing-selector! CPImageOverlay::textColor not bound
!missing-selector! CPListImageRowItemCardElement::initWithThumbnail:title:subtitle:tintColor: not bound
!missing-selector! CPListImageRowItemCardElement::setThumbnail: not bound
!missing-selector! CPListImageRowItemCardElement::thumbnail not bound
!missing-selector! CPListImageRowItemElementCPListImageRowItemElement::accessibilityLabel not bound
!missing-selector! CPListImageRowItemElementCPListImageRowItemElement::setAccessibilityLabel: not bound
!missing-selector! CPListTemplate::initWithTitle:listHeader:sections:assistantCellConfiguration: not bound
!missing-selector! CPListTemplate::listHeader not bound
!missing-selector! CPListTemplate::setListHeader: not bound
!missing-selector! CPListTemplateDetailsHeader::actionButtons not bound
!missing-selector! CPListTemplateDetailsHeader::bodyVariants not bound
!missing-selector! CPListTemplateDetailsHeader::initWithThumbnail:title:subtitle:actionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::initWithThumbnail:title:subtitle:bodyVariants:actionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::setActionButtons: not bound
!missing-selector! CPListTemplateDetailsHeader::setAdaptiveBackgroundStyle: not bound
!missing-selector! CPListTemplateDetailsHeader::setBodyVariants: not bound
!missing-selector! CPListTemplateDetailsHeader::setSubtitle: not bound
!missing-selector! CPListTemplateDetailsHeader::setThumbnail: not bound
!missing-selector! CPListTemplateDetailsHeader::setTitle: not bound
!missing-selector! CPListTemplateDetailsHeader::subtitle not bound
!missing-selector! CPListTemplateDetailsHeader::thumbnail not bound
!missing-selector! CPListTemplateDetailsHeader::title not bound
!missing-selector! CPListTemplateDetailsHeader::wantsAdaptiveBackgroundStyle not bound
!missing-selector! CPPlaybackConfiguration::duration not bound
!missing-selector! CPPlaybackConfiguration::elapsedTime not bound
!missing-selector! CPPlaybackConfiguration::initWithPreferredPresentation:playbackAction:elapsedTime:duration: not bound
!missing-selector! CPPlaybackConfiguration::playbackAction not bound
!missing-selector! CPPlaybackConfiguration::preferredPresentation not bound
!missing-selector! CPSessionConfiguration::supportsVideoPlayback not bound
!missing-selector! CPSportsOverlay::eventStatus not bound
!missing-selector! CPSportsOverlay::initWithLeftTeam:rightTeam:eventStatus: not bound
!missing-selector! CPSportsOverlay::leftTeam not bound
!missing-selector! CPSportsOverlay::rightTeam not bound
!missing-selector! CPThumbnailImage::image not bound
!missing-selector! CPThumbnailImage::imageOverlay not bound
!missing-selector! CPThumbnailImage::initWithImage: not bound
!missing-selector! CPThumbnailImage::initWithImage:imageOverlay:sportsOverlay: not bound
!missing-selector! CPThumbnailImage::setImage: not bound
!missing-selector! CPThumbnailImage::setImageOverlay: not bound
!missing-selector! CPThumbnailImage::setSportsOverlay: not bound
!missing-selector! CPThumbnailImage::sportsOverlay not bound
!missing-type! CPImageOverlay not bound
!missing-type! CPListTemplateDetailsHeader not bound
!missing-type! CPPlaybackConfiguration not bound
!missing-type! CPSportsOverlay not bound
!missing-type! CPThumbnailImage not bound

This file was deleted.

2 changes: 2 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/iOS-CoreText.todo
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!missing-field! kCTFontDescriptorLanguageAttribute not bound
!missing-pinvoke! CTFontGetUIFontType is not bound
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
!missing-enum-value! MPSGraphReducedPrecisionFastMath native value MPSGraphReducedPrecisionFastMathAllowConvertingOperandsFromFP32ToFP19 = 4 not bound
!missing-selector! MPSGraph::planarTensorWithComplexTensor:name: not bound
!missing-selector! MPSGraphCompilationDescriptor::disableAutoLayoutConversion not bound
!missing-selector! MPSGraphCompilationDescriptor::convertLayoutToNHWC not bound
3 changes: 1 addition & 2 deletions tests/xtro-sharpie/api-annotations-dotnet/iOS-PassKit.todo
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,5 @@
!missing-selector! PKDisbursementRequest::isDelegatedRequest not bound
!missing-selector! PKDisbursementRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::isDelegatedRequest not bound
!missing-selector! PKPaymentRequest::issuerRegions not bound
!missing-selector! PKPaymentRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::setIssuerRegions: not bound
!missing-selector! PKPassLibrary::openPaymentSetupWithMerchantIdentifier: not bound
9 changes: 9 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/iOS-Photos.todo
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
!missing-enum-value! PHAssetResourceUploadJobState native value PHAssetResourceUploadJobStateCancelled = 5 not bound
!missing-enum! PHAssetResourceUploadJobType not bound
!missing-selector! +PHAssetResourceUploadJobChangeRequest::creationRequestForDownloadJobWithResource: not bound
!missing-selector! +PHAssetResourceUploadJobChangeRequest::creationRequestForJobWithDestination:resource: not bound
!missing-selector! PHAssetResourceUploadJob::error not bound
!missing-selector! PHAssetResourceUploadJob::responseHeaderFields not bound
!missing-selector! PHAssetResourceUploadJob::type not bound
!missing-selector! PHAssetResourceUploadJobChangeRequest::cancel not bound
!missing-selector! PHAssetResourceUploadJobChangeRequest::placeholderForCreatedAssetResourceUploadJob not bound
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertion::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistration::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialAssertionRequest::setPrf: not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::prf not bound
!missing-selector! ASAuthorizationSecurityKeyPublicKeyCredentialRegistrationRequest::setPrf: not bound

This file was deleted.

2 changes: 2 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreText.todo
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!missing-field! kCTFontDescriptorLanguageAttribute not bound
!missing-pinvoke! CTFontGetUIFontType is not bound
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
!missing-enum-value! MPSGraphReducedPrecisionFastMath native value MPSGraphReducedPrecisionFastMathAllowConvertingOperandsFromFP32ToFP19 = 4 not bound
!missing-selector! MPSGraph::planarTensorWithComplexTensor:name: not bound
!missing-selector! MPSGraphCompilationDescriptor::disableAutoLayoutConversion not bound
!missing-selector! MPSGraphCompilationDescriptor::convertLayoutToNHWC not bound
3 changes: 1 addition & 2 deletions tests/xtro-sharpie/api-annotations-dotnet/macOS-PassKit.todo
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@
!missing-selector! PKDisbursementRequest::isDelegatedRequest not bound
!missing-selector! PKDisbursementRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::isDelegatedRequest not bound
!missing-selector! PKPaymentRequest::issuerRegions not bound
!missing-selector! PKPaymentRequest::setIsDelegatedRequest: not bound
!missing-selector! PKPaymentRequest::setIssuerRegions: not bound
!missing-selector! PKPassLibrary::openPaymentSetupWithMerchantIdentifier: not bound
2 changes: 2 additions & 0 deletions tests/xtro-sharpie/api-annotations-dotnet/tvOS-CoreText.todo
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!missing-field! kCTFontDescriptorLanguageAttribute not bound
!missing-pinvoke! CTFontGetUIFontType is not bound
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
!missing-enum-value! MPSGraphReducedPrecisionFastMath native value MPSGraphReducedPrecisionFastMathAllowConvertingOperandsFromFP32ToFP19 = 4 not bound
!missing-selector! MPSGraph::planarTensorWithComplexTensor:name: not bound
!missing-selector! MPSGraphCompilationDescriptor::disableAutoLayoutConversion not bound
!missing-selector! MPSGraphCompilationDescriptor::convertLayoutToNHWC not bound
Loading