Skip to content

Overhaul CI matrix, add Windows/Android builds, clean up tooling scaffolding#79

Merged
leogdion merged 2 commits intomainfrom
v2.0.0-alpha.2
Apr 10, 2026
Merged

Overhaul CI matrix, add Windows/Android builds, clean up tooling scaffolding#79
leogdion merged 2 commits intomainfrom
v2.0.0-alpha.2

Conversation

@leogdion
Copy link
Copy Markdown
Member

No description provided.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 10, 2026

Important

Review skipped

Too many files!

This PR contains 160 files, which is 10 over the limit of 150.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8c678e3e-32bf-4b69-98b7-7dbdde9ffd7c

📥 Commits

Reviewing files that changed from the base of the PR and between 532371b and 0af4314.

⛔ Files ignored due to path filters (1)
  • Examples/Sundial/Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (160)
  • .claude/TM_COMMANDS_GUIDE.md
  • .claude/agents/task-checker.md
  • .claude/agents/task-executor.md
  • .claude/agents/task-orchestrator.md
  • .claude/commands/tm/add-dependency/add-dependency.md
  • .claude/commands/tm/add-subtask/add-subtask.md
  • .claude/commands/tm/add-subtask/convert-task-to-subtask.md
  • .claude/commands/tm/add-task/add-task.md
  • .claude/commands/tm/analyze-complexity/analyze-complexity.md
  • .claude/commands/tm/clear-subtasks/clear-all-subtasks.md
  • .claude/commands/tm/clear-subtasks/clear-subtasks.md
  • .claude/commands/tm/complexity-report/complexity-report.md
  • .claude/commands/tm/expand/expand-all-tasks.md
  • .claude/commands/tm/expand/expand-task.md
  • .claude/commands/tm/fix-dependencies/fix-dependencies.md
  • .claude/commands/tm/generate/generate-tasks.md
  • .claude/commands/tm/help.md
  • .claude/commands/tm/init/init-project-quick.md
  • .claude/commands/tm/init/init-project.md
  • .claude/commands/tm/learn.md
  • .claude/commands/tm/list/list-tasks-by-status.md
  • .claude/commands/tm/list/list-tasks-with-subtasks.md
  • .claude/commands/tm/list/list-tasks.md
  • .claude/commands/tm/models/setup-models.md
  • .claude/commands/tm/models/view-models.md
  • .claude/commands/tm/next/next-task.md
  • .claude/commands/tm/parse-prd/parse-prd-with-research.md
  • .claude/commands/tm/parse-prd/parse-prd.md
  • .claude/commands/tm/remove-dependency/remove-dependency.md
  • .claude/commands/tm/remove-subtask/remove-subtask.md
  • .claude/commands/tm/remove-task/remove-task.md
  • .claude/commands/tm/set-status/to-cancelled.md
  • .claude/commands/tm/set-status/to-deferred.md
  • .claude/commands/tm/set-status/to-done.md
  • .claude/commands/tm/set-status/to-in-progress.md
  • .claude/commands/tm/set-status/to-pending.md
  • .claude/commands/tm/set-status/to-review.md
  • .claude/commands/tm/setup/install-taskmaster.md
  • .claude/commands/tm/setup/quick-install-taskmaster.md
  • .claude/commands/tm/show/show-task.md
  • .claude/commands/tm/status/project-status.md
  • .claude/commands/tm/sync-readme/sync-readme.md
  • .claude/commands/tm/tm-main.md
  • .claude/commands/tm/update/update-single-task.md
  • .claude/commands/tm/update/update-task.md
  • .claude/commands/tm/update/update-tasks-from-id.md
  • .claude/commands/tm/utils/analyze-project.md
  • .claude/commands/tm/validate-dependencies/validate-dependencies.md
  • .claude/commands/tm/workflows/auto-implement-tasks.md
  • .claude/commands/tm/workflows/command-pipeline.md
  • .claude/commands/tm/workflows/smart-workflow.md
  • .cursor/mcp.json
  • .cursor/rules/cursor_rules.mdc
  • .cursor/rules/self_improve.mdc
  • .cursor/rules/taskmaster/dev_workflow.mdc
  • .cursor/rules/taskmaster/taskmaster.mdc
  • .devcontainer/devcontainer.json
  • .devcontainer/swift-6.1/devcontainer.json
  • .devcontainer/swift-6.2-nightly/devcontainer.json
  • .devcontainer/swift-6.2/devcontainer.json
  • .devcontainer/swift-6.3/devcontainer.json
  • .env.example
  • .github/workflows/SundialKit.yml
  • .github/workflows/sundial-demo.yml
  • .mcp.json
  • .swiftlint.yml
  • Examples/Sundial/Fastlane/Fastfile
  • Package.swift
  • Sources/SundialKit/SundialKit.swift
  • Sources/SundialKitConnectivity/BinaryMessagable.swift
  • Sources/SundialKitConnectivity/BinaryMessageEncoder.swift
  • Sources/SundialKitConnectivity/ConnectivityActivation+Implementation.swift
  • Sources/SundialKitConnectivity/ConnectivityActivation.swift
  • Sources/SundialKitConnectivity/ConnectivityDelegateHandling.swift
  • Sources/SundialKitConnectivity/ConnectivityHandler.swift
  • Sources/SundialKitConnectivity/ConnectivityManager+DelegateHandling.swift
  • Sources/SundialKitConnectivity/ConnectivityManager.swift
  • Sources/SundialKitConnectivity/ConnectivityMessaging+Actor.swift
  • Sources/SundialKitConnectivity/ConnectivityMessaging.swift
  • Sources/SundialKitConnectivity/ConnectivityObserverManaging+Actor.swift
  • Sources/SundialKitConnectivity/ConnectivityObserverManaging.swift
  • Sources/SundialKitConnectivity/ConnectivityReceiveContext.swift
  • Sources/SundialKitConnectivity/ConnectivityReceiveResult.swift
  • Sources/SundialKitConnectivity/ConnectivitySendContext.swift
  • Sources/SundialKitConnectivity/ConnectivitySendResult.swift
  • Sources/SundialKitConnectivity/ConnectivitySession.swift
  • Sources/SundialKitConnectivity/ConnectivitySessionDelegate.swift
  • Sources/SundialKitConnectivity/ConnectivityStateObserver.swift
  • Sources/SundialKitConnectivity/Extensions/WCSession.swift
  • Sources/SundialKitConnectivity/Messagable.swift
  • Sources/SundialKitConnectivity/MessagableKeys.swift
  • Sources/SundialKitConnectivity/MessageDecoder.swift
  • Sources/SundialKitConnectivity/MessageTransport.swift
  • Sources/SundialKitConnectivity/NeverConnectivitySession.swift
  • Sources/SundialKitConnectivity/SendOptions.swift
  • Sources/SundialKitConnectivity/WatchConnectivitySession+ConnectivitySession.swift
  • Sources/SundialKitConnectivity/WatchConnectivitySession+WCSessionDelegate.swift
  • Sources/SundialKitConnectivity/WatchConnectivitySession.swift
  • Sources/SundialKitConnectivity/WatchConnectivitySessionProtocol.swift
  • Sources/SundialKitCore/ActivationState.swift
  • Sources/SundialKitCore/ConnectivityError+LocalizedError.swift
  • Sources/SundialKitCore/ConnectivityError+LocalizedInfo.swift
  • Sources/SundialKitCore/ConnectivityError.swift
  • Sources/SundialKitCore/ConnectivityManagement.swift
  • Sources/SundialKitCore/ConnectivityMessage.swift
  • Sources/SundialKitCore/Interfaceable.swift
  • Sources/SundialKitCore/NetworkError.swift
  • Sources/SundialKitCore/NetworkMonitoring.swift
  • Sources/SundialKitCore/ObserverRegistry.swift
  • Sources/SundialKitCore/PassthroughSubject.swift
  • Sources/SundialKitCore/PathStatus.swift
  • Sources/SundialKitCore/SerializationError+LocalizedError.swift
  • Sources/SundialKitCore/SerializationError.swift
  • Sources/SundialKitCore/SundialError.swift
  • Sources/SundialKitCore/SundialLogger+Custom.swift
  • Sources/SundialKitCore/SundialLogger.swift
  • Sources/SundialKitCore/Task+Sleep.swift
  • Sources/SundialKitNetwork/Extensions/NWInterface.swift
  • Sources/SundialKitNetwork/Extensions/NWPath.swift
  • Sources/SundialKitNetwork/Extensions/NWPathMonitor.swift
  • Sources/SundialKitNetwork/Extensions/PathStatus+Network.swift
  • Sources/SundialKitNetwork/Extensions/PathStatus.UnsatisfiedReason.swift
  • Sources/SundialKitNetwork/NetworkMonitor.swift
  • Sources/SundialKitNetwork/NetworkPath.swift
  • Sources/SundialKitNetwork/NetworkPing.swift
  • Sources/SundialKitNetwork/NetworkState.swift
  • Sources/SundialKitNetwork/NetworkStateObserver.swift
  • Sources/SundialKitNetwork/NeverPing.swift
  • Sources/SundialKitNetwork/PathMonitor.swift
  • Sources/SundialKitNetwork/PingCoordinator.swift
  • Tests/SundialKitConnectivityTests/BinaryMessagableTests.swift
  • Tests/SundialKitConnectivityTests/ConnectivityManagerTestHelpers.swift
  • Tests/SundialKitConnectivityTests/TestBinaryMessage.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorComprehensiveTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorConfigurationTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorDeviceTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorGenericTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorMessagingTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorSessionTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorTests+HashableTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorTransferTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorWCErrorMappingTests+ExtendedTests.swift
  • Tests/SundialKitCoreTests/ConnectivityErrorWCErrorMappingTests.swift
  • Tests/SundialKitCoreTests/MockPathMonitor.swift
  • Tests/SundialKitCoreTests/NetworkErrorTests+ConcurrencyTests.swift
  • Tests/SundialKitCoreTests/NetworkErrorTests.swift
  • Tests/SundialKitCoreTests/ObserverRegistryTests+NotifyTests.swift
  • Tests/SundialKitCoreTests/ObserverRegistryTests.swift
  • Tests/SundialKitCoreTests/SerializationErrorFactoryMethodsTests.swift
  • Tests/SundialKitCoreTests/SerializationErrorLocalizedErrorTests+BinaryTests.swift
  • Tests/SundialKitCoreTests/SerializationErrorLocalizedErrorTests.swift
  • Tests/SundialKitCoreTests/TestObserverImpl.swift
  • Tests/SundialKitCoreTests/WASMSupport.swift
  • Tests/SundialKitNetworkTests/MockPathMonitor.swift
  • Tests/SundialKitNetworkTests/NetworkMonitorTests+ConcurrencyTests.swift
  • Tests/SundialKitNetworkTests/NetworkMonitorTests+ObserverTests.swift
  • Tests/SundialKitNetworkTests/NetworkMonitorTests.swift
  • Tests/SundialKitNetworkTests/PathStatusNetworkTests.swift
  • Tests/SundialKitNetworkTests/WASMSupport.swift

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch v2.0.0-alpha.2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 10, 2026

Codecov Report

❌ Patch coverage is 86.08696% with 16 lines in your changes missing coverage. Please review.
✅ Project coverage is 65.66%. Comparing base (f20255e) to head (0af4314).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
Sources/SundialKitCore/SundialLogger.swift 0.00% 9 Missing ⚠️
Sources/SundialKitCore/SundialLogger+Custom.swift 0.00% 4 Missing ⚠️
Sources/SundialKitCore/SundialError.swift 0.00% 2 Missing ⚠️
Sources/SundialKitNetwork/PingCoordinator.swift 95.23% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #79      +/-   ##
==========================================
+ Coverage   65.39%   65.66%   +0.26%     
==========================================
  Files          31       32       +1     
  Lines         526      533       +7     
==========================================
+ Hits          344      350       +6     
- Misses        182      183       +1     
Flag Coverage Δ
spm 67.04% <95.19%> (+0.25%) ⬆️
swift-6.1 65.91% <87.27%> (?)
swift-6.1-jammy ?
swift-6.1-jammy-nightly ?
swift-6.1-noble ?
swift-6.1-noble-nightly ?
swift-6.2 65.91% <87.27%> (?)
swift-6.2-jammy ?
swift-6.2-jammy-nightly ?
swift-6.2-noble ?
swift-6.2-noble-nightly ?
swift-6.3 65.91% <87.27%> (?)
ubuntu 65.91% <87.27%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@claude
Copy link
Copy Markdown

claude bot commented Apr 10, 2026

PR Review: 2.0.0 alpha.2

Thanks for the alpha.2 update. This is a well-scoped PR with clear intent. Here is my review:


Summary of Changes

  • Copyright year update (2025 to 2026) across all files
  • visionOS support added to WatchConnectivity platform guards
  • #if canImport(Dispatch) guards added for WASM cross-platform support
  • Test refactoring: monolithic test files split into focused suites
  • Code formatting improvements (line wrapping for long strings/docs)
  • Minor log message cleanup

Positive Aspects

visionOS support (WCSession.swift, WatchConnectivitySession+WCSessionDelegate.swift): Adding || os(visionOS) to the #if os(iOS) guards is correct. visionOS supports WatchConnectivity with isWatchAppInstalled, and the inactive/deactivated session lifecycle delegates are iOS/visionOS-specific.

WASM/cross-platform improvements: Wrapping NetworkMonitoring, NetworkMonitor, and PingCoordinator with #if canImport(Dispatch) guards and adding .disabled(if: isWasm) to the test suite is the right approach for WASM targets that lack GCD.

Test refactoring: Splitting ObserverRegistryTests, NetworkMonitorTests, and ConnectivityErrorTests into focused files improves discoverability and makes it easier to add new cases without growing monolithic test files.


Issues and Concerns

1. Redundant #else branch in WASM-disabled test suite

In NetworkMonitorTests.swift, individual test bodies have:

#if canImport(Dispatch)
  // test body
#else
  Issue.record("This test requires Dispatch and should be disabled on WASM")
#endif

Since the entire suite is already annotated with .disabled(if: isWasm), the #else branch should never execute on WASM. Calling Issue.record here reads as an unexpected failure path rather than a graceful unsupported-platform skip. Consider removing the #else branch entirely (trusting the suite-level disable) or replacing it with a comment.

2. @unchecked Sendable in PingCoordinator

The class retains @unchecked Sendable (now with a reformatted multi-line declaration). The inline comment documents the synchronization rationale, which is good. Since PingCoordinator lives in SundialKitNetwork and not a plugin, the CLAUDE.md "Zero @unchecked Sendable in plugins" goal is not violated. That said, it is worth confirming the DispatchQueue-based synchronization referenced in the comments is fully covered within the #if canImport(Dispatch) guard, since the entire class is now conditionally compiled.

3. Cascading #if canImport(Dispatch) requirements

Wrapping the NetworkMonitoring protocol itself (not just implementations) in #if canImport(Dispatch) means any conformance or usage also needs this guard. This is correct but a potential footgun: someone adding a new conformance without the guard will get a confusing "type not found" error on WASM. A brief doc comment on NetworkMonitoring.swift noting that this protocol is Dispatch-only and all conformances must be similarly guarded would help future contributors.


Minor Nits

  • Log message change from "WCSession.sessionReachabilityDidChange fired - isReachable: ..." to "sessionReachabilityDidChange - isReachable: ..." is fine. The original WCSession. prefix was slightly more grep-friendly in logs, but not a blocker.
  • ConnectivityError+LocalizedInfo.swift uses + string concatenation for line-length compliance. These concatenate at compile time with zero runtime cost, but multi-line string literals (""") might be easier to maintain if these strings are frequently edited.
  • Copyright year updates are mechanical but correct.

Test Coverage

The new test files (NetworkMonitorTests+ConcurrencyTests.swift, ObserverRegistryTests+NotifyTests.swift, connectivity error category tests) represent a meaningful expansion of coverage. The split into domain-specific test files aligns well with the existing Swift Testing migration pattern.


Verdict

No blocking issues. The two items most worth a second look before merging are (1) the redundant Issue.record in #else branches and (2) confirming PingCoordinator synchronization invariants are fully inside the Dispatch guard. Otherwise this is a clean, well-organized alpha.2 increment.

@leogdion leogdion changed the title 2.0.0 alpha.2 Overhaul CI matrix, add Windows/Android builds, clean up tooling scaffolding Apr 10, 2026
@leogdion leogdion merged commit c74d7f2 into main Apr 10, 2026
48 checks passed
@leogdion leogdion deleted the v2.0.0-alpha.2 branch April 10, 2026 15:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant