ios-app-scaffold

Scaffold iOS apps with Tuist and layered architecture (Domain, Infrastructure, App). Use when: (1) Creating a new iOS app project, (2) Setting up Tuist project structure, (3) User asks to "create an iOS app", "scaffold an app", or "set up a new Swift project", (4) User wants layered/clean architecture for iOS, (5) User mentions Tuist setup.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "ios-app-scaffold" with this command: npx skills add tddworks/claude-skills/tddworks-claude-skills-ios-app-scaffold

iOS App Scaffold

Scaffold iOS apps with Tuist, Swift 6, and layered architecture.

Quick Start

Run the scaffold script:

python3 scripts/scaffold.py <AppName> <output-directory> [--bundle-id <id>] [--team-id <id>]

Example:

python3 scripts/scaffold.py MyApp /Users/me/projects --bundle-id com.mycompany.myapp --team-id ABC123

Then generate and open:

cd /Users/me/projects/MyApp
tuist generate
open MyApp.xcworkspace

Generated Structure

AppName/
├── Sources/
│   ├── App/                    # SwiftUI views, app entry
│   │   ├── Views/
│   │   ├── Resources/
│   │   │   ├── Assets.xcassets
│   │   │   ├── XCConfig/       # Build configuration
│   │   │   │   ├── shared.xcconfig
│   │   │   │   ├── debug.xcconfig
│   │   │   │   └── release.xcconfig
│   │   │   └── en.lproj/
│   │   ├── Application/
│   │   ├── Info.plist
│   │   └── AppNameApp.swift
│   ├── Domain/                 # Business logic (no dependencies)
│   │   ├── Models/
│   │   ├── Protocols/          # @Mockable repository interfaces
│   │   └── Utils/
│   └── Infrastructure/         # Persistence implementations
│       └── Local/              # SwiftData repositories
├── Tests/
│   ├── DomainTests/
│   └── InfrastructureTests/
├── Project.swift               # Tuist configuration
├── Tuist.swift
├── .gitignore
└── README.md

Architecture

LayerPurposeDependencies
DomainModels, protocols, business logicNone
InfrastructureSwiftData persistenceDomain
AppSwiftUI views, app entryDomain, Infrastructure

For detailed patterns, see references/architecture.md.

After Scaffolding

  1. Replace example files: Edit Example.swift, ExampleRepository.swift, LocalExampleRepository.swift
  2. Add domain models: Create models in Sources/Domain/Models/
  3. Define protocols: Add repository protocols in Sources/Domain/Protocols/
  4. Implement persistence: Add SwiftData entities in Sources/Infrastructure/Local/
  5. Build UI: Create views in Sources/App/Views/

Adding Dependencies

Edit Project.swift packages array:

packages: [
    .remote(url: "https://github.com/Kolos65/Mockable.git", requirement: .upToNextMajor(from: "0.5.0")),
    // Add more packages here
],

Then add to target dependencies:

dependencies: [
    .package(product: "PackageName"),
]

Key Patterns

Domain models are rich - Include computed properties and business logic:

public struct Order: Identifiable, Codable, Sendable {
    public var items: [Item]
    public var total: Decimal { items.reduce(0) { $0 + $1.price } }
}

Protocols use @Mockable - Enables testing without real persistence:

@Mockable
public protocol OrderRepository: Sendable {
    func fetchAll() async throws -> [Order]
}

Views consume Domain directly - No ViewModel layer needed:

struct OrdersView: View {
    let orders: [Order]  // Domain model directly
}

Version Management

Version numbers are managed in Project.swift build settings:

settings: .settings(
    base: [
        "MARKETING_VERSION": "1.0.0",      // App Store version
        "CURRENT_PROJECT_VERSION": "1",     // Build number
    ],
    ...
)

The Info.plist references these via build setting variables:

  • CFBundleShortVersionString$(MARKETING_VERSION)
  • CFBundleVersion$(CURRENT_PROJECT_VERSION)

To bump version, edit Project.swift:

"MARKETING_VERSION": "1.1.0",
"CURRENT_PROJECT_VERSION": "2",

XCConfig

Build settings are managed via xcconfig files in Sources/App/Resources/XCConfig/:

FilePurpose
shared.xcconfigCommon settings (bundle ID, team ID, deployment target)
debug.xcconfigDebug configuration (Apple Development signing)
release.xcconfigRelease configuration (Apple Development signing)

Edit shared.xcconfig to customize:

PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.app
DEVELOPMENT_TEAM = YOUR_TEAM_ID
IPHONEOS_DEPLOYMENT_TARGET = 18.0

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

appstore-info-generator

No summary provided by upstream source.

Repository SourceNeeds Review
General

ios-ux-prototype

No summary provided by upstream source.

Repository SourceNeeds Review
General

app-localization

No summary provided by upstream source.

Repository SourceNeeds Review
General

template-skill

No summary provided by upstream source.

Repository SourceNeeds Review