ios-tuist/SKILL.md
Use Tuist to manage and generate Xcode projects, define project manifests in Swift, and scale iOS codebases. Use when setting up Tuist, creating project manifests, managing dependencies, generating projects, or scaling team workflows. Triggers on Tuist, Project.swift, Workspace.swift, tuist generate, tuist edit, project generation, xcodeproj management.
npx skillsauth add abanoub-ashraf/manus-skills-import ios-tuistInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert in Tuist for iOS project management. When this skill activates, help set up and manage Tuist-based projects.
| Problem | Tuist Solution |
|---------|---------------|
| .xcodeproj merge conflicts | Generate projects, don't commit them |
| Inconsistent project settings | Define in Swift, share across targets |
| Slow Xcode indexing | Focused projects with only needed targets |
| Complex dependency graphs | Declarative Swift manifests |
| Onboarding new developers | tuist generate and you're ready |
# Install via Homebrew
brew install tuist
# Or install via mise (recommended for teams)
mise install tuist
# Verify installation
tuist version
MyApp/
├── Tuist/
│ ├── Config.swift # Global configuration
│ ├── ProjectDescriptionHelpers/
│ │ ├── Project+Templates.swift
│ │ └── Target+Templates.swift
│ └── Dependencies.swift # External dependencies
│
├── Projects/
│ ├── App/
│ │ └── Project.swift # Main app project
│ ├── Features/
│ │ ├── Home/
│ │ │ └── Project.swift
│ │ └── Profile/
│ │ └── Project.swift
│ └── Core/
│ ├── Networking/
│ │ └── Project.swift
│ └── DesignSystem/
│ └── Project.swift
│
├── Workspace.swift # Root workspace
└── .gitignore # Ignore *.xcodeproj, *.xcworkspace
import ProjectDescription
let workspace = Workspace(
name: "MyApp",
projects: [
"Projects/App",
"Projects/Features/**",
"Projects/Core/**"
],
schemes: [
.scheme(
name: "MyApp-Development",
shared: true,
buildAction: .buildAction(targets: [.project(path: "Projects/App", target: "MyApp")]),
runAction: .runAction(configuration: .debug),
archiveAction: .archiveAction(configuration: .release),
profileAction: .profileAction(configuration: .release),
analyzeAction: .analyzeAction(configuration: .debug)
)
],
additionalFiles: [
"README.md",
".swiftlint.yml"
]
)
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project(
name: "MyApp",
organizationName: "Company",
options: .options(
automaticSchemesOptions: .disabled,
disableBundleAccessors: false,
disableSynthesizedResourceAccessors: false
),
settings: .settings(
base: [
"DEVELOPMENT_TEAM": "XXXXXXXXXX",
"MARKETING_VERSION": "1.0.0",
"CURRENT_PROJECT_VERSION": "1"
],
configurations: [
.debug(name: "Debug", settings: [:], xcconfig: nil),
.release(name: "Release", settings: [:], xcconfig: nil)
]
),
targets: [
.target(
name: "MyApp",
destinations: .iOS,
product: .app,
bundleId: "com.company.myapp",
deploymentTargets: .iOS("17.0"),
infoPlist: .extendingDefault(with: [
"CFBundleDisplayName": "My App",
"UILaunchScreen": [
"UIColorName": "LaunchBackground"
],
"NSFaceIDUsageDescription": "Authenticate securely"
]),
sources: ["Sources/**"],
resources: ["Resources/**"],
dependencies: [
.project(target: "HomeFeature", path: "../Features/Home"),
.project(target: "ProfileFeature", path: "../Features/Profile"),
.project(target: "DesignSystem", path: "../Core/DesignSystem"),
.project(target: "Networking", path: "../Core/Networking"),
.external(name: "ComposableArchitecture")
]
),
.target(
name: "MyAppTests",
destinations: .iOS,
product: .unitTests,
bundleId: "com.company.myapp.tests",
sources: ["Tests/**"],
dependencies: [
.target(name: "MyApp")
]
)
],
schemes: [
.scheme(
name: "MyApp",
shared: true,
buildAction: .buildAction(targets: [.init(stringLiteral: "MyApp")]),
testAction: .targets([.init(stringLiteral: "MyAppTests")]),
runAction: .runAction(configuration: .debug)
)
]
)
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project(
name: "HomeFeature",
targets: [
// Interface target
.target(
name: "HomeFeatureInterface",
destinations: .iOS,
product: .framework,
bundleId: "com.company.homefeature.interface",
deploymentTargets: .iOS("17.0"),
sources: ["Interface/**"],
dependencies: [
.project(target: "Models", path: "../../Core/Models")
]
),
// Implementation target
.target(
name: "HomeFeature",
destinations: .iOS,
product: .framework,
bundleId: "com.company.homefeature",
deploymentTargets: .iOS("17.0"),
sources: ["Sources/**"],
resources: ["Resources/**"],
dependencies: [
.target(name: "HomeFeatureInterface"),
.project(target: "DesignSystem", path: "../../Core/DesignSystem"),
.project(target: "Networking", path: "../../Core/Networking")
]
),
// Tests
.target(
name: "HomeFeatureTests",
destinations: .iOS,
product: .unitTests,
bundleId: "com.company.homefeature.tests",
sources: ["Tests/**"],
dependencies: [
.target(name: "HomeFeature")
]
)
]
)
import ProjectDescription
let config = Config(
compatibleXcodeVersions: .upToNextMajor("15.0"),
swiftVersion: "5.9",
generationOptions: .options(
enforceExplicitDependencies: true,
resolveDependenciesWithSystemScm: false,
disablePackageVersionLocking: false
)
)
import ProjectDescription
let dependencies = Dependencies(
swiftPackageManager: SwiftPackageManagerDependencies(
[
.remote(
url: "https://github.com/pointfreeco/swift-composable-architecture",
requirement: .upToNextMajor(from: "1.5.0")
),
.remote(
url: "https://github.com/pointfreeco/swift-dependencies",
requirement: .upToNextMajor(from: "1.0.0")
),
.remote(
url: "https://github.com/onevcat/Kingfisher",
requirement: .upToNextMajor(from: "7.0.0")
)
],
productTypes: [
"ComposableArchitecture": .framework,
"Dependencies": .framework
]
),
platforms: [.iOS]
)
import ProjectDescription
public extension Project {
static func feature(
name: String,
dependencies: [TargetDependency] = []
) -> Project {
Project(
name: name,
targets: [
.target(
name: "\(name)Interface",
destinations: .iOS,
product: .framework,
bundleId: "com.company.\(name.lowercased()).interface",
deploymentTargets: .iOS("17.0"),
sources: ["Interface/**"]
),
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "com.company.\(name.lowercased())",
deploymentTargets: .iOS("17.0"),
sources: ["Sources/**"],
resources: ["Resources/**"],
dependencies: [.target(name: "\(name)Interface")] + dependencies
),
.target(
name: "\(name)Tests",
destinations: .iOS,
product: .unitTests,
bundleId: "com.company.\(name.lowercased()).tests",
sources: ["Tests/**"],
dependencies: [.target(name: name)]
)
]
)
}
static func core(
name: String,
dependencies: [TargetDependency] = []
) -> Project {
Project(
name: name,
targets: [
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "com.company.\(name.lowercased())",
deploymentTargets: .iOS("17.0"),
sources: ["Sources/**"],
resources: ["Resources/**"],
dependencies: dependencies
),
.target(
name: "\(name)Tests",
destinations: .iOS,
product: .unitTests,
bundleId: "com.company.\(name.lowercased()).tests",
sources: ["Tests/**"],
dependencies: [.target(name: name)]
)
]
)
}
}
// Projects/Features/Home/Project.swift
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project.feature(
name: "HomeFeature",
dependencies: [
.project(target: "DesignSystem", path: "../../Core/DesignSystem"),
.project(target: "Networking", path: "../../Core/Networking")
]
)
# Generate Xcode project
tuist generate
# Generate and open Xcode
tuist generate --open
# Edit Tuist manifests in Xcode
tuist edit
# Fetch external dependencies
tuist fetch
# Clean generated files
tuist clean
# Build from CLI
tuist build
# Run tests from CLI
tuist test
# Graph dependencies
tuist graph
# Graph specific target
tuist graph MyApp --format png
# Cache frameworks (speed up generation)
tuist cache
# Scaffold new module
tuist scaffold feature --name Profile
// Tuist/Templates/feature/feature.swift
import ProjectDescription
let nameAttribute: Template.Attribute = .required("name")
let template = Template(
description: "Creates a new feature module",
attributes: [nameAttribute],
items: [
.file(
path: "Projects/Features/\(nameAttribute)/Project.swift",
templatePath: "project.stencil"
),
.file(
path: "Projects/Features/\(nameAttribute)/Sources/\(nameAttribute)View.swift",
templatePath: "view.stencil"
),
.file(
path: "Projects/Features/\(nameAttribute)/Interface/\(nameAttribute)API.swift",
templatePath: "interface.stencil"
),
.directory(
path: "Projects/Features/\(nameAttribute)/Resources",
sourcePath: "resources"
)
]
)
// Tuist/Templates/feature/project.stencil
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project.feature(
name: "{{ name }}Feature",
dependencies: [
.project(target: "DesignSystem", path: "../../Core/DesignSystem")
]
)
tuist scaffold feature --name Profile
# Cache all cacheable targets
tuist cache
# Cache specific targets
tuist cache HomeFeature ProfileFeature
# Use cached frameworks
tuist generate # Automatically uses cache
# Clear cache
tuist cache --clean
name: iOS CI
on: [push, pull_request]
jobs:
build:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Install Tuist
run: brew install tuist
- name: Fetch Dependencies
run: tuist fetch
- name: Generate Project
run: tuist generate --no-open
- name: Build
run: tuist build -- -configuration Debug
- name: Test
run: tuist test
# Tuist managed
*.xcodeproj
*.xcworkspace
Derived/
# Keep Tuist cache locally only
.tuist-cache/
# Dependencies
Tuist/Dependencies/
development
Design principles for building polished, native-feeling SwiftUI apps and widgets. Use this skill when creating or modifying SwiftUI views, iOS widgets (WidgetKit), or any native Apple UI. Ensures proper spacing, typography, colors, and widget implementations that look and feel like quality apps rather than AI-generated slop.
data-ai
Design and implement SwiftUI views, components, and app architecture. Use when creating new SwiftUI views, implementing MVVM/TCA patterns, managing state with @Observable, @State, @Binding, or @Environment, designing navigation flows, or structuring iOS app architecture. Triggers on SwiftUI, view model, state management, navigation, coordinator pattern.
development
Implement, review, or improve SwiftUI animations and transitions. Use when adding implicit or explicit animations with withAnimation, configuring spring animations (.smooth, .snappy, .bouncy), building phase or keyframe animations with PhaseAnimator/KeyframeAnimator, creating hero transitions with matchedGeometryEffect or matchedTransitionSource, adding SF Symbol effects (bounce, pulse, variableColor, breathe, rotate, wiggle), implementing custom Transition or CustomAnimation types, or ensuring animations respect accessibilityReduceMotion.
testing
Audit SwiftUI views for accessibility (iOS + macOS) with patch-ready fixes