Migrate to Swift 6.4: mise-based lint tooling, rebuilt CI, and source cleanups#127
Conversation
… ci] Apply the issue #54 config migration to the vendored BrightDigit libraries (SyndiKit, TransistorPublishPlugin, Contribute, ContributeWordPress, NPMPublishPlugin, YoutubePublishPlugin) using the MistKit/SundialKit library config variant: - .swiftlint.yml: strict library ruleset + no_unchecked_sendable custom rule - .swiftformat -> .swift-format: Apple swift-format JSON - .mise.toml: swift-format 604 (Swift 6.4-aligned), swiftlint, periphery - Scripts/lint.sh (mise-based, replaces Mint) + Scripts/header.sh - CI workflow -> brightdigit/swift-build@v1 (ubuntu + macos) + STRICT lint job - Remove obsolete .hound.yml Configs + CI only; source reformatting/headers deferred (matches main repo). SwiftTube and Spinetail skipped (slated for OpenAPI-generator migration). Committed in the monorepo only; no git subrepo push performed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a `test-packages` matrix job to main.yaml that builds, tests, and lints the 6 vendored BrightDigit packages in-place. In the monorepo checkout every sibling already sits at its relative-path location, so each package resolves with zero dependency reconstruction — replacing the per-package setup-deps CI. - detect-changes: add `packages` paths-filter + `packages-changed` output - remove standalone workflows + orphaned setup-deps from the 4 rel-dep packages (ContributeWordPress, Transistor, NPM, Youtube); their standalone CI was synthetic (relative deps are committed) - keep SyndiKit + Contribute standalone CIs (genuinely standalone libraries) - bump all GitHub Actions to latest: checkout v6, cache v5, upload-artifact v7, download-artifact v8, dorny/paths-filter v4 (swift-build@v1 unchanged) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Post-rebase cleanup after replaying the config migration onto v1.0.0: - Fix swiftlint/swift-format violations surfaced by the stricter standardized configs (explicit ACLs, formatting, XCTFail messages, XCTUnwrap instead of force-unwraps, doc-comment corrections) - Inline-disable intentional exceptions in source: iTunes* type names, RSS-spec webMaster, @unchecked Sendable fallback, large test fixtures - Split files violating one_declaration_per_file - Normalize license headers via Scripts/header.sh (straight quotes) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Update requirements to match Package.swift (Swift 5.10 / Xcode 15.3, iOS 13 / watchOS 6 / tvOS 13 / macOS 10.15 deployment targets) - Bump install snippet to from: "1.0.0" - Fix transposed JSONFeed column in the Feedable mapping table (siteURL -> homePageUrl, summary -> description) - Fix invalid Swift in code snippets (Data(contentsOf:) usage, missing paren in case pattern) - Fix typos and stale LICENSE link Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Code Review — PR #127: Integrate brightdigit.com vendored changes + Swift 6.4 CIOverviewThis PR syncs the monorepo-vendored copy of SyndiKit back to the standalone repository and modernizes the CI/toolchain setup to match the BrightDigit Swift 6.4 template. The changes touch 145 files across CI workflows, linting configuration, package requirements, and source/test code. CI / Workflow (
|
| Area | Status |
|---|---|
| CI platform coverage | |
| Branch trigger cleanup | |
| Tooling migration (Mint → mise) | ✅ Good approach, minor shell-safety concerns |
| Breaking min deployment target | |
| Linting rule changes | |
| Copy-paste doc comment errors | ❌ Stale "Atom category" comments in two new/moved files |
| Test improvements | ✅ Variable naming, force-unwrap removal |
try! suppressions in tests |
The structural changes (file splits, doc comment cleanup, tooling migration) are well-executed. The main items to address before merge: (1) document or reconsider the CI coverage reduction, (2) remove the PR branch from the push trigger, (3) fix the stale doc comments in SiteCollectionDirectoryBuilder.swift and SiteLanguage.swift, and (4) document the macOS minimum version bump as a breaking change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review: Integrate brightdigit.com vendored changes + Swift 6.4 CISummary: This PR syncs the brightdigit.com monorepo-vendored copy of SyndiKit back to the standalone repo and updates CI/tooling to align with the BrightDigit Swift 6.4 template. Most changes are CI infrastructure, tooling migration (Mint to mise), linting config, and mechanical code reformatting. There are a few items that need attention before merge. Must Fix1. Feature branch name hardcoded in CI workflow The new workflow hard-codes the PR own branch name ( 2. Major loss of CI coverage The old
If the intent is to permanently simplify CI, this is a significant regression in cross-platform assurance for a library that targets Linux, Windows, Android, and Apple platforms. If this is a temporary step for the monorepo sync, that should be documented in the PR description. Consider either restoring the full matrix or tracking the removed jobs as follow-up issues. Issues3. Prerelease tooling pinned in
4. Stale copy-paste doc comment in three newly-separated files In 5. set -e removed from lint.sh without equivalent safety The manual ERRORS counter only wraps explicit 6. swift build --build-tests added to the lint path
Improvements (Noted Positively)
SummaryThe tooling migration (Mint to mise) and code quality improvements are well-structured. The two blocking items are the hardcoded branch name in CI (will silently break post-merge) and the significant loss of cross-platform CI coverage (which may be intentional but must be explicitly acknowledged). The stale doc comments and lint script safety gap are lower-priority but worth fixing before the stricter rules surface them. |
…lone repos Extend ButtondownKit/Spinetail/SwiftTube/Contribute/SyndiKit standalone CI to the BrightDigit multi-platform template now that a self-hosted macOS runner with /Applications/Xcode-beta.app (Swift 6.4) is available: - build-macos: [self-hosted, macOS] + swift-build xcode=Xcode-beta. Blocking on all 5. Contribute & SyndiKit migrated off macos-15; their Ubuntu + lint legs migrated swift:6.3-noble -> swiftlang/swift:nightly-6.4.x-noble. - build-windows: hosted windows-2022/2025, swift.org nightly snapshot 6.4.x-DEVELOPMENT-SNAPSHOT-2026-06-01-a. Gated to full-matrix runs via a single-package configure job. continue-on-error on the OpenAPI repos + Contribute (unverified deps); blocking on SyndiKit. - SyndiKit also gains build-macos-platforms (iOS/watchOS/tvOS on released Xcode_26.4 — not nightly 6.4). WASM + Android deferred: no nightly 6.4 support yet. WASM is a swift-build limitation (brightdigit/swift-build#115 — no input to override the auto-derived -RELEASE wasm SDK URL); Android is blocked upstream (no nightly 6.4 SDK). Each workflow documents re-adding them. Contribute WASM is permanently N/A (Yams on the Musl/wasm SDK). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-bundle inputs Now that swift.org publishes nightly 6.4 SDK bundles on swift-6.4.x-branch and brightdigit/swift-build#116 adds inputs to install caller-supplied bundles, add: - build-wasm to ButtondownKit/Spinetail/SwiftTube/SyndiKit (NOT Contribute — Yams fails on the Musl/wasm SDK). Uses wasm-sdk-url + wasm-sdk-checksum pointing at the swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-06-15-a_wasm artifactbundle, with WASI emulation + memory flags. - build-android to all 5 repos. Uses android-sdk-url + android-sdk-id (+ matching android-swift-version) for the swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-06-15-a_android artifactbundle via skiptools custom-sdk-url; build-only (android-run-tests: false). Both legs are full-matrix-gated and continue-on-error: they reference @v1 and are inert until swift-build#116 is released and the v1 tag moved, after which they should be confirmed green and promoted to blocking (SyndiKit first). Bump the snapshot SDK URLs/checksums periodically. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ift 6.4) Per the rule that Swift 6.4 builds use the self-hosted runners (the only macOS Swift 6.4 toolchain is /Applications/Xcode-beta.app = Xcode 27 / Swift 6.4): - Move SyndiKit + Contribute build-macos-platforms off hosted macos-26/Xcode_26.4 (which is only Swift 6.2) onto [self-hosted, macOS] + Xcode-beta. - Add build-macos-platforms (iOS/watchOS/tvOS) to ButtondownKit/Spinetail/SwiftTube on the same self-hosted runner — these are swift-tools-version:6.4, so hosted released-Xcode runners can't even parse their manifests. All use the iOS/watchOS/tvOS 27.0 simulator runtimes present on the runner (iPhone 17 Pro / Apple Watch Ultra 3 (49mm) / Apple TV 4K (3rd generation)), full-matrix-gated and continue-on-error (simulator-on-nightly is the most fragile leg; promote once green). lint now needs build-macos-platforms. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Three CI tiers instead of two: small set (build-ubuntu/build-macos/lint, always) < full-matrix (macОS-platforms/wasm/android) < +Windows. configure now emits a second output, run-windows, equal to full-matrix MINUS PRs into semver branches. build-windows (the most expensive leg — hosted windows-2022/2025 ×2) gates on run-windows; the rest keep full-matrix. So PRs into semver branches still exercise the full non-Windows matrix but skip Windows. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nto build-ubuntu - Point every brightdigit/swift-build@v1 reference at @sdk-url-checksum-nightly-6.4 (PR #116) TEMPORARILY so CI exercises the new wasm-sdk-url/android-sdk-url code before it ships in @v1. Revert to @v1 once #116 is merged + the v1 tag moved. - Fold build-wasm into build-ubuntu as a continue-on-error step in the same nightly-6.4.x-noble container (one spin-up; runs on every push/PR now, not just full-matrix). Removed the standalone build-wasm job from ButtondownKit/Spinetail/ SwiftTube/SyndiKit (Contribute has no wasm — Yams on Musl/wasm). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## v1.0.0 #127 +/- ##
==========================================
+ Coverage 77.65% 78.30% +0.64%
==========================================
Files 74 74
Lines 1553 1553
==========================================
+ Hits 1206 1216 +10
+ Misses 347 337 -10
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
… trigger) Push events now trigger only on main (+ release tags). Feature/integration branches like brightdigit-com-260406 get CI through their PRs instead of a redundant branch-push run. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Windows is now blocking everywhere (dropped continue-on-error from build-windows
in all 5, not just SyndiKit).
- The only per-package functional difference — the wasm step (Contribute can't
build Yams on wasm) — is externalized to the ENABLE_WASM repo variable:
`if: ${{ vars.ENABLE_WASM != 'false' }}`. Set ENABLE_WASM=false on Contribute.
- Normalized all comments to a shared template.
Result: the five workflow files are byte-identical except the `name:` line; the
only behavioral knob is each repo's ENABLE_WASM variable. Filed Contribute#10 to
fix Yams-on-wasm and re-enable it there.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review: PR #127 — Integrate brightdigit.com vendored changes + Swift 6.4 CISummary: This PR syncs vendored changes from the brightdigit.com monorepo, migrates the CI pipeline to Swift 6.4 nightly using mise instead of Mint, tightens SwiftLint/swift-format rules, and improves test quality. 145 files changed (+1108/-1046). 🚨 Breaking Changes
This is a semver-breaking change that drops support for macOS Catalina (10.15), Big Sur (11), and Monterey (12). Users on those systems will no longer be able to use this package. This change should be clearly called out in release notes and warrants a major version bump per SemVer. Additionally, the The new documentation line is still incorrect — it says macOS 10.15 but
|
| Dimension | Old | New |
|---|---|---|
| Ubuntu Swift versions | 5.10, 6.0, 6.1, 6.2, 6.3 | 6.4 nightly only |
| Windows Swift versions | 6.1-RELEASE, 6.2-RELEASE, 6.3-RELEASE | 6.4 nightly only |
| Android API levels | 28, 33, 36 (with tests) | 34 only (no tests) |
| visionOS | ✅ Tested | ❌ Removed |
| Swift source compat suite | swift:6.0–6.3 containers | ❌ Removed entirely |
Testing exclusively on a nightly snapshot (nightly-6.4.x-noble) is risky: snapshots can break APIs or introduce regressions that releases wouldn't have, and narrowing to one Swift version misses real-world backwards-compatibility issues for downstream users on older toolchains.
Self-hosted runner dependency: macOS builds now require [self-hosted, macOS] runners. This blocks contributors from forking and running CI, which hurts open-source ergonomics. The previous workflow used public GitHub runners (macos-14, macos-15, macos-26).
⚠️ SwiftLint Rule Changes Worth Noting
File length error threshold lowered 550 → 300 while the warning stays at 225. This is tighter than the CLAUDE.md documents (which still says 225/550) and will cause existing files already between 300–550 lines to fail. CLAUDE.md should be updated to reflect the new limits.
one_declaration_per_file rule added. This could break existing files that have multiple declarations and weren't touched in this PR. A lint pass over the whole codebase should be verified before merging.
iTunes type name exclusions removed from type_name. The CLAUDE.md explicitly documents these exclusions (iTunesDuration, iTunesEpisode, iTunesOwner, iTunesImage) as intentional. If SwiftLint now flags them, downstream lint failures will occur.
⚠️ Scripts/lint.sh — set -e removed
# Remove set -e to allow script to continue running
# set -e # Exit on any errorThe comment says "allow script to continue running" but the manual ERRORS counter only increments on failure — it does not replicate the semantics of set -e for all commands (e.g., unquoted variables, subshell issues). This is a behavior change worth documenting explicitly.
Also note pushd $PACKAGE_DIR (unquoted variable) — if $PACKAGE_DIR contains spaces, this will fail without set -e to catch it.
✅ Positive Changes
Test quality improvements are excellent:
- Force-unwraps replaced with
try XCTUnwrap()throughout — catches test setup failures properly rather than crashing - Repeated long URL strings extracted to private static constants (
hostImageURLString,guestImageURLString) youtubeID(from:)helper method extracts repeated pattern-match logic from the test bodyXCTFail()calls now include diagnostic messages (e.g.,XCTFail("Expected AtomFeed for \(name)"))[Int]($0.map { $0 }.reversed())→Array($0.reversed())— cleaner, idiomatic Swiftcase let .pattern(x) = y→case .pattern(let x) = y— correct Swift 5.9+ binding syntax
SwiftLint additions that improve safety:
no_unchecked_sendablecustom rule is a strong addition — enforces proper Sendable conformance in a Swift 6 concurrency worldNeverForceUnwrap,NeverUseForceTry,NeverUseImplicitlyUnwrappedOptionalsall enabled in swift-format
header.sh now skips CI: Running the header-rewrite script only locally (not in CI) is correct — it was a latent CI risk before.
Mise migration: Replacing Mint with mise is a reasonable modernization, and the .mise.toml is clear. The lint script's mise detection logic (checking known paths before falling back to command -v) is solid.
Minor Nits
.swift-formatinconsistency:FileScopedDeclarationPrivacyrule is disabled (false) butaccessLevelis still set tofileprivate. The disabled rule means theaccessLevelsetting is never applied — this is harmless but confusing.- Codecov regression: Old CI had
fail_ci_if_error: true; new CI hasfail_ci_if_error: false. This silently ignores Codecov upload failures. WASM continue-on-error: truewith no result check is acceptable for an experimental leg, but the comment mentioning it should be validated is a bit aspirational without a tracking issue.
Summary
The test improvements and tooling modernization are solid. The main concerns before merging are:
- The macOS 13 minimum is a breaking change — confirm this is intentional and bump the major version
- Fix the documentation in
SyndiKit.docc/SyndiKit.mdto accurately state the new minimum (macOS 13, not 10.15) - Verify lint passes with the new
one_declaration_per_filerule and the tighter file-length limit before merging - Confirm CI coverage reduction is intentional — dropping Swift 5.x/6.x compatibility testing and visionOS/Android tests could mask regressions for downstream users
🤖 Generated with Claude Code
Make the WASM step, the Apple-platforms job (iOS/watchOS/tvOS), and the Android job blocking across all five subrepos. Tidy the now-stale continue-on-error comment phrases. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review — PR #127: Integrate brightdigit.com vendored changes + Swift 6.4 CIOverviewThis PR syncs the monorepo-vendored copy of SyndiKit back to its standalone repo and upgrades CI to Swift 6.4. It touches 145 files, but most changes are mechanical (license header quote fixes, IssuesBreaking: macOS minimum version bump (Package.swift)- .macOS(.v10_15),
+ .macOS(.v13),This drops support for macOS 10.15, 11, and 12 — a significant breaking change for anyone running SyndiKit on those systems. Since the repo already has CI no longer tests older Swift versionsThe old matrix tested Swift 5.6 through 6.3 across Ubuntu jammy and noble. The new workflow targets only Swift 6.4 nightly. The source still contains Self-hosted macOS runners are a reliability concernruns-on: [self-hosted, macOS]The macOS and platform jobs now require a self-hosted runner with
|
watchOS-27 SDK rejects deps that infer an 8.0 deployment target (SwiftPM #10188, not fixable in-repo). Gate the build-macos-platforms watchOS leg on a new ENABLE_WATCHOS repo variable (mirrors ENABLE_WASM), keeping the 5 workflows byte-identical. ENABLE_WATCHOS=false is set on ButtondownKit/SwiftTube/ Contribute/Spinetail; SyndiKit (unaffected) keeps running watchOS. Tracked in brightdigit.com#119. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror brightdigit/MistKit: the configure job emits ubuntu-type (gated by
ENABLE_WASM), and build-ubuntu fans out over it via fromJSON. Standard ('')
always runs; wasm + wasm-embedded run unless ENABLE_WASM=false (e.g. Yams on
Contribute). Both wasm variants share the nightly-6.4.x SDK bundle. Replaces the
single folded WASM step. Byte-identical across all 5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review: Integrate brightdigit.com vendored changes + Swift 6.4 CIOverview: This PR syncs vendored changes from the brightdigit.com monorepo back to the standalone SyndiKit repo and upgrades CI to a Swift 6.4 template. The scope is large (145 files, +1119/-1046) but most changes are mechanical (license header escaping, adding explicit `internal` modifiers, pattern matching style). I've focused on the substantive concerns. 🔴 Breaking Change — macOS Deployment Target`Package.swift`: `macOS(.v10_15)` → `macOS(.v13)` This is a semver-major breaking change. Consumers on macOS 10.15 (Catalina), 11, and 12 are silently dropped. For a library package, this should be:
If the rationale is Swift 6.4's minimum requirements, that's worth documenting. 🔴 CI Action Version ConcernsSeveral action versions appear to reference tags that don't yet exist or use non-SHA-pinned references:
Recommended: pin all third-party actions to a full commit SHA, not a tag or branch. 🟡 Self-hosted Runner DependencySeveral jobs (`build-macos`, `build-macos-platforms`) require `[self-hosted, macOS]` runners. For an open-source repo:
🟡 SwiftLint iTunes Type Exclusions RemovedThe `type_name` rule no longer excludes `iTunesDuration`, `iTunesEpisode`, `iTunesOwner`, `iTunesImage`. These types use the project-convention lowercase-`i` prefix (matching Apple's APIs). Without the exclusion, `type_name` will flag them as violations. Verify linting still passes. 🟡 `missing_docs` Rule Enabled Without VerificationEnabling `missing_docs` means every undocumented `public` API will now be a lint error in `STRICT` mode. This is a good long-term direction, but the PR should confirm all existing public APIs are documented, or linting will fail in CI. 🟡 Nightly Snapshot StalenessSeveral snapshots are hardcoded with specific dates:
swift.org rotates and eventually removes old snapshots. These will silently break CI unless bumped periodically. Consider adding a comment with a reminder cadence, or a link to where current snapshots can be found. 🟢 Positives
Minor Notes
Summary: The CI action version issues (`checkout@v6`, `codecov@v7`) need to be resolved before this can merge — the CI will likely fail immediately. The macOS deployment target bump deserves explicit acknowledgment as a breaking change. All other concerns are addressable with minor follow-up. |
The wasm/embedded BUILD passes (OpenAPIURLSession is guarded out on WASI), but running the suite under WasmKit fails: Foundation resource bundles (test Fixtures) aren't mounted in the WASI sandbox, and embedded hits OpenAPIRuntime keypath-demangling limits at runtime. Neither is our bug. Build-only validates wasm/embedded compilation (the goal); the standard leg still runs the full suite + coverage. Mirrors the Android leg's build-only stance. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review: PR #127 — Integrate brightdigit.com vendored changes + Swift 6.4 CIOverviewThis PR syncs changes from a monorepo vendored copy back to the standalone SyndiKit repository, and upgrades the CI pipeline to Swift 6.4. It touches 145 files (+1,123 / -1,046 lines), though the vast majority of those changes are cosmetic. Change Categories~80% of the diff is mechanical, non-functional cleanup:
These are all correct and appropriate. CI Workflow Overhaul (
|
| Priority | Issue |
|---|---|
| High | actions/checkout@v6 likely doesn't exist — verify or pin to a valid ref |
| High | brightdigit/swift-build@sdk-url-checksum-nightly-6.4 branch ref is a supply-chain risk — pin to SHA |
| Medium | Self-hosted runner requirement for macOS jobs is undocumented and blocks contributors |
| Medium | Lint job may deadlock when build-windows is conditionally skipped |
| Medium | Package.swift macOS(.v13) bump is breaking — needs changelog entry and version bump |
| Low | CLAUDE.md still documents 90-char line limit; now 108/200 |
| Low | swift build --build-tests inside lint.sh adds unnecessary build overhead |
| Info | macOS coverage still uses unfixed sersoft-gmbh/swift-coverage-action@v5 — intentional? |
Overall Assessment
The content of this PR is broadly correct and well-organized. The file-extraction refactors, documentation fixes, and Swift 6 access-modifier cleanup are all improvements. The main concerns are around CI robustness (action version pinning, self-hosted runner assumptions) and the undocumented breaking platform change in Package.swift.
🤖 Generated with Claude Code
Covers the 9 patch-coverage gaps flagged on PR #127: - EntryID: init(string:)/init?(_:)/description/Codable for all four cases - SiteCollectionDirectoryBuilder: init() + directory(fromCollection:) - PodcastEpisodeProperties.init?(rssItem:) nil branch (no enclosure) - YouTubeIDProperties.init?(entry:) nil branch (non-YouTube Atom entry) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review — PR #127: Migrate to Swift 6.4This is a comprehensive modernisation PR covering CI, tooling, and source cleanups. The overall direction is sound and the changes are well-motivated. Notes below are organised by area. CI Workflow (
|
….4 branch deleted) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code Review — PR #127: Migrate to Swift 6.4 / mise tooling / rebuilt CIThis is a well-structured migration PR. The changes are logically grouped, the commit message is detailed, and the intent is clear. Below are observations organized by severity. 🔴 Critical Issues1. The old CI used # Old (safe)
if: ${{ always() && !cancelled() && !failure() }}
needs: [build-ubuntu, build-macos, build-windows, build-android]
# New (risky)
if: ${{ !cancelled() && !failure() && ... }}
needs: [build-ubuntu, build-macos, build-windows, build-macos-platforms]
Fix: Restore if: ${{ always() && !cancelled() && !failure() && !contains(github.event.head_commit.message, 'ci skip') }}🟠 Notable Concerns2. macOS minimum deployment target bumped from 10.15 → 13 (breaking change) This is a 3-major-version drop that removes support for macOS Monterey (12), Big Sur (11), and Catalina (10.15). Downstream consumers targeting those versions will get a broken build with no warning. The PR description doesn't flag this as a breaking change. Consider a minor version bump or at least a note in the PR/changelog. 3. Swift source compatibility suite removed The old CI explicitly tested 4. Android tests changed from The old CI actually ran Android tests (3 Swift versions × 3 API levels). The new one is build-only ( 5. visionOS removed from CI The old CI included visionOS builds. It's not mentioned in the PR description as a conscious removal—if this is intentional, it should be called out. 🟡 Quality Observations6. Doc comment copy-paste error in
/// A struct representing an Atom category.
/// Creates a site collection directory from a site collection."A struct representing an Atom category" does not describe this type. The same malformed boilerplate appears in 7. The config sets 8. Relaxed SwiftLint thresholds weaken existing quality guardrails Several thresholds were loosened:
The old 90-char line limit was strict but enforced readable, reviewable code. 200 chars as an error threshold is extremely permissive. If these are being relaxed to accommodate the new formatter's output, consider whether the existing code actually required these limits to be raised or whether the formatter settings should be adjusted instead. 9. Prerelease "spm:swiftlang/swift-format" = "604.0.0-prerelease-2025-12-17"Pinning a prerelease is fine for bootstrapping against a nightly toolchain, but it should be noted that this tag may be removed or its behavior may differ from the eventual stable 604.0.0 release. When 604.0.0 stable ships, bump this. ✅ Positive Changes
SummaryThe migration direction is sound. The main blockers are the 🤖 Generated with Claude Code |
Migrates the package to the Swift 6.4 toolchain, modernizes the lint/format tooling, and rebuilds the CI workflow accordingly.
CI
swiftlang/swift:nightly-6.4.x-noblecontainer) covering Linux, macOS, Windows, Android, and the Apple-platform simulator suite (iOS/watchOS/tvOS).configurematrix job that scales coverage by event/branch (small set always; full matrix onmain/semver/dispatch/PRs into them; Windows as its own tier).standard,wasm, andwasm-embeddedvariants (wasm legs build-only), gated on theENABLE_WASMrepo variable.brightdigit/swift-coverage-actionfork (handles the Swift 6.4 swiftbuild output layout) and upload to Codecov; installcurlwhere the uploader needs it.jdx/mise-action.Tooling / Lint
mise(.mise.toml) to manageswift-format, SwiftLint, and Periphery, replacing the Mint-based setup.Scripts/lint.shto bootstrap and run tools throughmise, accumulate errors instead of exiting early, build tests for compilation checks, and restrict in-place rewrites (header.sh, periphery) to local runs..swiftlint.yml: enablemissing_docs,one_declaration_per_file, relax/retune length and complexity thresholds, refresh exclusions, and add a customno_unchecked_sendablerule..swift-format: enableNeverForceUnwrap,NeverUseForceTry,NeverUseImplicitlyUnwrappedOptionals,UseLetInEveryBoundCaseVariable, andValidateDocumentationComments; switch file-scoped privacy tofileprivate..swiftformatand.hound.ymlconfigs.Scripts/header.shto skip generated files and use straight quotes in the license header.Swift 6.4 / Concurrency
Package.swift.case letpatterns to per-bindingletto satisfy the format rules.@unchecked Sendablesuppression to the legacyJSONDecoderretroactive conformance on Swift < 5.7 only.Source
SiteCollectionDirectoryBuilderout ofSiteDirectoryBuilder.swiftinto its own file.PodcastEpisodePropertiesout ofPodcastEpisode.swiftinto its own file.webMasterAPI with a scopedinclusive_languagesuppression (spec element name; public API cannot be renamed).🤖 Generated with Claude Code