feat(mobile-ios): scaffold Xcode app under mobile/ios#112
Conversation
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
WalkthroughIntroduces a complete iOS Xcode project named ForgeApp with minimal SwiftUI entry point, configured to use the existing ForgeMobile Swift package as a dependency. Includes project configuration files, documentation, and development environment setup files. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@mobile/ios/README.md`:
- Around line 21-30: The xcodebuild commands in the README currently omit the
project flag which can cause ambiguous selection between Package.swift and
ForgeApp.xcodeproj; update each command that calls xcodebuild (the lines using
xcodebuild -list and xcodebuild -scheme ForgeApp -destination ...) to include
the explicit project flag (add -project ForgeApp.xcodeproj) so the commands
become deterministic and always target the ForgeApp.xcodeproj.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (4)
.gitignoremobile/ios/App/ForgeApp.swiftmobile/ios/ForgeApp.xcodeproj/project.pbxprojmobile/ios/README.md
…Mobile - Move app entry from top-level App/ to Sources/App/ForgeApp.swift - Update Xcode project to reference Sources/App - Document Sources/App and Sources/ForgeMobile layout in README Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
mobile/ios/ForgeApp.xcodeproj/project.pbxproj (1)
88-96: Xcode tools version metadata suggests Xcode 15, but Swift 6 requires Xcode 16+.
CreatedOnToolsVersion = 15.0andLastSwiftUpdateCheck = 1500indicate Xcode 15, yet the target setsSWIFT_VERSION = 6.0(lines 217, 241), which shipped with Xcode 16. While Xcode will silently update this metadata on first open, it may confuse contributors into thinking Xcode 15 is sufficient.Consider bumping to
16.0/1600to match reality, or adding a note in the README about the minimum Xcode version.Suggested metadata update
attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1500; - LastUpgradeCheck = 1500; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; TargetAttributes = { A1B2C3D4E5F60000000A = { - CreatedOnToolsVersion = 15.0; + CreatedOnToolsVersion = 16.0; }; }; };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj` around lines 88 - 96, Update the Xcode tool metadata so it matches the Swift/Xcode requirement: change CreatedOnToolsVersion and LastSwiftUpdateCheck in the project attributes block (the attributes / TargetAttributes entries shown) to reflect Xcode 16 (e.g., set CreatedOnToolsVersion = 16.0 and LastSwiftUpdateCheck = 1600) to align with the SWIFT_VERSION = 6.0 entries found on the target(s); alternatively add a short note to the repo README stating Xcode 16+ is required if you prefer not to modify the pbxproj.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj`:
- Around line 88-96: Update the Xcode tool metadata so it matches the
Swift/Xcode requirement: change CreatedOnToolsVersion and LastSwiftUpdateCheck
in the project attributes block (the attributes / TargetAttributes entries
shown) to reflect Xcode 16 (e.g., set CreatedOnToolsVersion = 16.0 and
LastSwiftUpdateCheck = 1600) to align with the SWIFT_VERSION = 6.0 entries found
on the target(s); alternatively add a short note to the repo README stating
Xcode 16+ is required if you prefer not to modify the pbxproj.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
mobile/ios/ForgeApp.xcodeproj/project.pbxprojmobile/ios/README.mdmobile/ios/Sources/App/ForgeApp.swift
🚧 Files skipped from review as they are similar to previous changes (1)
- mobile/ios/README.md
…, Xcode 16 metadata - README: add -project ForgeApp.xcodeproj to all xcodebuild commands - README: note Xcode 16+ required for Swift 6 - project.pbxproj: set LastSwiftUpdateCheck/LastUpgradeCheck to 1600, CreatedOnToolsVersion to 16.0 Co-authored-by: Cursor <cursoragent@cursor.com>
Review feedback addressed (2050609)Fixed:
Not changed: n/a — both actionable and nitpick items were applied. |
Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
mobile/ios/Sources/ForgeMobile/ForgeApp.swift (1)
7-9:.accessibilityLabelis redundant when it mirrors theTextcontent exactly.SwiftUI's
Textview uses its string content as the default VoiceOver label. The explicit modifier here has no effect and can be removed.♻️ Proposed simplification
public var body: some View { Text("Forge iOS") - .accessibilityLabel("Forge iOS") }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/Sources/ForgeMobile/ForgeApp.swift` around lines 7 - 9, The Text view in ForgeApp.swift currently applies .accessibilityLabel("Forge iOS") which is redundant because Text("Forge iOS") already provides the same accessibility label; remove the .accessibilityLabel modifier from the Text in the ForgeApp view (locate the Text("Forge iOS") expression) so the accessibility label is derived from the Text content instead.mobile/ios/ForgeApp.xcodeproj/project.pbxproj (2)
53-59: EmptyPackage product dependenciesgroup is dead content.The group at Line 53–59 has
children = ().ForgeMobileis correctly wired throughpackageProductDependencieson the native target and theXCSwiftPackageProductDependencysection; nothing needs to be listed here. Xcode populates this group automatically when the project is opened — it should not be committed empty.♻️ Proposed fix — remove the orphaned group and its reference
- A1B2C3D4E5F600000012 /* Package product dependencies */ = { - isa = PBXGroup; - children = ( - ); - name = "Package product dependencies"; - sourceTree = "<group>"; - };Also remove the corresponding child reference from the root group (Line 32 or wherever it appears as a sibling):
- A1B2C3D4E5F600000012 /* Package product dependencies */,🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj` around lines 53 - 59, Remove the empty PBXGroup named "Package product dependencies" (the PBXGroup entry with isa = PBXGroup and children = ()) and also remove its child reference from the root group so there is no orphaned group entry; Xcode will auto-populate package product dependencies from packageProductDependencies/XCSwiftPackageProductDependency, so delete the PBXGroup block for "Package product dependencies" and the corresponding reference in the root group's children array to fully eliminate the dead content.
198-245: NoDEVELOPMENT_TEAMset — device and CI builds will fail without it.Neither the Debug (Line 200–221) nor Release (Line 223–244) target build configurations include a
DEVELOPMENT_TEAM. WithCODE_SIGN_STYLE = Automatic, Xcode requires a team identifier to resolve provisioning for device and archive builds. This is acceptable for a local simulator-only scaffold, but any CI pipeline or on-device run will error out with a signing failure unless the team is set either here or via a CI-levelxcodebuildoverride (DEVELOPMENT_TEAM=...). Document this requirement in the README or add a placeholder.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj` around lines 198 - 245, The Debug and Release XCBuildConfiguration blocks (names "Debug" and "Release") set CODE_SIGN_STYLE = Automatic but omit DEVELOPMENT_TEAM, which causes device/CI signing failures; add a DEVELOPMENT_TEAM = <YOUR_TEAM_ID>; entry inside the buildSettings for both the A1B2C3D4E5F600000010 (Debug) and A1B2C3D4E5F600000011 (Release) configurations or alternatively document that CI must supply DEVELOPMENT_TEAM via xcodebuild environment override (e.g., DEVELOPMENT_TEAM=...), so automatic signing can resolve provisioning.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj`:
- Line 6: The project file's objectVersion is incorrect for Xcode 16; update the
pbxproj so objectVersion is 70 (not 56) and set the compatibilityVersion string
to "Xcode 16.0" to match the existing CreatedOnToolsVersion/LastUpgradeCheck
(CreatedOnToolsVersion = 16.0, LastUpgradeCheck = 1600), ensuring the project
metadata is consistent and preventing Xcode from auto-upgrading the file on
first open.
---
Nitpick comments:
In `@mobile/ios/ForgeApp.xcodeproj/project.pbxproj`:
- Around line 53-59: Remove the empty PBXGroup named "Package product
dependencies" (the PBXGroup entry with isa = PBXGroup and children = ()) and
also remove its child reference from the root group so there is no orphaned
group entry; Xcode will auto-populate package product dependencies from
packageProductDependencies/XCSwiftPackageProductDependency, so delete the
PBXGroup block for "Package product dependencies" and the corresponding
reference in the root group's children array to fully eliminate the dead
content.
- Around line 198-245: The Debug and Release XCBuildConfiguration blocks (names
"Debug" and "Release") set CODE_SIGN_STYLE = Automatic but omit
DEVELOPMENT_TEAM, which causes device/CI signing failures; add a
DEVELOPMENT_TEAM = <YOUR_TEAM_ID>; entry inside the buildSettings for both the
A1B2C3D4E5F600000010 (Debug) and A1B2C3D4E5F600000011 (Release) configurations
or alternatively document that CI must supply DEVELOPMENT_TEAM via xcodebuild
environment override (e.g., DEVELOPMENT_TEAM=...), so automatic signing can
resolve provisioning.
In `@mobile/ios/Sources/ForgeMobile/ForgeApp.swift`:
- Around line 7-9: The Text view in ForgeApp.swift currently applies
.accessibilityLabel("Forge iOS") which is redundant because Text("Forge iOS")
already provides the same accessibility label; remove the .accessibilityLabel
modifier from the Text in the ForgeApp view (locate the Text("Forge iOS")
expression) so the accessibility label is derived from the Text content instead.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
mobile/ios/ForgeApp.xcodeproj/project.pbxprojmobile/ios/README.mdmobile/ios/Sources/ForgeMobile/ForgeApp.swift
🚧 Files skipped from review as they are similar to previous changes (1)
- mobile/ios/README.md
- README: document SweetPad (Build & Run, task) as preferred method - .vscode: SweetPad workspace path and ForgeApp launch task Co-authored-by: Cursor <cursoragent@cursor.com>
…ad workspace - Move project and app source under app/ (ForgeApp.xcodeproj, app/ForgeApp/) - Add project.xcworkspace/contents.xcworkspacedata for SweetPad - Rename Sources/ForgeMobile/ForgeApp.swift to ForgeRootView.swift - Update README and SweetPad path to App/ForgeApp.xcodeproj Co-authored-by: Cursor <cursoragent@cursor.com>
… with Xcode 16 CodeRabbit: set objectVersion to 70 and compatibilityVersion to Xcode 16.0 Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
mobile/ios/App/ForgeApp.xcodeproj/project.pbxproj (1)
6-6:objectVersion = 70andcompatibilityVersion = "Xcode 16.0"are now correctly aligned.The previously flagged mismatch (objectVersion 56 / "Xcode 14.0") is fully resolved. Metadata is consistent with Xcode 16 / Swift 6.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/App/ForgeApp.xcodeproj/project.pbxproj` at line 6, The project metadata mismatch has been resolved by updating objectVersion to 70 and compatibilityVersion to "Xcode 16.0"; verify that both symbols (objectVersion and compatibilityVersion) are present and consistent in the project.pbxproj, and if any other entries still show the old values (e.g., 56 or "Xcode 14.0") update them to 70 and "Xcode 16.0" respectively so the file is fully aligned with Xcode 16 / Swift 6.
🧹 Nitpick comments (1)
mobile/ios/Sources/ForgeMobile/ForgeRootView.swift (1)
7-9: Redundant.accessibilityLabel—Textalready uses its string content as the label.
Text("Forge iOS")automatically exposes"Forge iOS"as its accessibility label. The explicit modifier is a no-op here and could mislead future contributors into thinking a custom override is intentional.♻️ Proposed simplification
Text("Forge iOS") - .accessibilityLabel("Forge iOS")🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@mobile/ios/Sources/ForgeMobile/ForgeRootView.swift` around lines 7 - 9, Remove the redundant accessibility modifier on the SwiftUI Text view: delete the explicit .accessibilityLabel call applied to Text("Forge iOS") in ForgeRootView (the modifier is a no-op because Text uses its string as the accessibility label), leaving just Text("Forge iOS") so future readers aren’t misled about an intentional override.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.vscode/settings.json:
- Line 2: Update the SweetPad workspace setting: change the
"sweetpad.workspacePath" value to point to the auto-generated .xcworkspace
(e.g., "mobile/ios/App/ForgeApp.xcodeproj/project.xcworkspace") instead of the
.xcodeproj so SPM/CocoaPods schemes resolve correctly; locate the
"sweetpad.workspacePath" entry in .vscode/settings.json and replace the
.xcodeproj path with the .xcworkspace path.
---
Duplicate comments:
In `@mobile/ios/App/ForgeApp.xcodeproj/project.pbxproj`:
- Line 6: The project metadata mismatch has been resolved by updating
objectVersion to 70 and compatibilityVersion to "Xcode 16.0"; verify that both
symbols (objectVersion and compatibilityVersion) are present and consistent in
the project.pbxproj, and if any other entries still show the old values (e.g.,
56 or "Xcode 14.0") update them to 70 and "Xcode 16.0" respectively so the file
is fully aligned with Xcode 16 / Swift 6.
---
Nitpick comments:
In `@mobile/ios/Sources/ForgeMobile/ForgeRootView.swift`:
- Around line 7-9: Remove the redundant accessibility modifier on the SwiftUI
Text view: delete the explicit .accessibilityLabel call applied to Text("Forge
iOS") in ForgeRootView (the modifier is a no-op because Text uses its string as
the accessibility label), leaving just Text("Forge iOS") so future readers
aren’t misled about an intentional override.
ℹ️ Review info
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (7)
.vscode/settings.json.vscode/tasks.jsonmobile/ios/App/ForgeApp.xcodeproj/project.pbxprojmobile/ios/App/ForgeApp.xcodeproj/project.xcworkspace/contents.xcworkspacedatamobile/ios/App/ForgeApp/ForgeApp.swiftmobile/ios/README.mdmobile/ios/Sources/ForgeMobile/ForgeRootView.swift
✅ Files skipped from review due to trivial changes (1)
- mobile/ios/App/ForgeApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
🚧 Files skipped from review as they are similar to previous changes (1)
- mobile/ios/README.md
…esolution Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Summary
Adds a buildable iOS app target under
mobile/ioswith minimal SwiftUI entry (ForgeApp), local SPM dependency on ForgeMobile, and documented build commands. Unblocks GraphQL and section-renderer work (issues #102–#111).@mainapp withWindowGroup { ForgeRootView() }xcodebuildcommandsResolves #101
Contracts Changed
Regeneration Required
Validation
xcodebuild -scheme ForgeApp -destination 'platform=iOS Simulator,name=iPhone 16' buildpassesswiftlint lint --strictpasses in mobile/iosMade with Cursor
Summary by CodeRabbit
Documentation
New Features
Accessibility
Chores