ios-project-setup
| Type | Skill |
| Plugin | awl-ios · v0.0.6 |
| Invoke | /awl-ios:ios-project-setup |
| Source | plugins/awl-ios/skills/ios-project-setup/SKILL.md |
When Claude uses it
Abschnitt betitelt „When Claude uses it“Start a new iOS project from the AWL template or bring an existing one in line with it — Tuist Project.swift with App, Feature, and test targets pinned to minIosVersion, Swift 6 settings (approachable concurrency, main-actor default isolation), SwiftLint and SwiftFormat, the mise plus Brewfile toolchain, fastlane lanes with the .env split, 1Password CLI secrets, the GitLab pipeline shape (lint and test in parallel, SAST, Danger coverage gate, VulnTracker). Use when the user says “set up an iOS project”, “new iOS app”, “align with the template”, “add a feature module”, “migrate to Swift 6”, “add fastlane”, “set up CI for iOS”, “where do secrets go”, or a Tuist, xcconfig, or .gitlab-ci.yml question comes up on an iOS repo. NOT for writing tests (use awl-testing testing-swift), not for day-to-day build and simulator commands (use awl-ios-ref), not for KMP shared Kotlin code or the Android side (use awl-android kotlin-expert).
Trigger phrases: set up an iOS project · new iOS app · align with the template · add a feature module · migrate to Swift 6 · add fastlane · set up CI for iOS · where do secrets go
Definition
Abschnitt betitelt „Definition“The source of truth is ios-infra/templates/project-template-ios on GitLab. Copy files from the template rather than writing them from memory, and read SETUP.md there when a step below is not enough.
Decide what you are doing
Abschnitt betitelt „Decide what you are doing“| Situation | Path | Read |
|---|---|---|
| Green-field app | Copy the template, run sh rename_project.sh, then work through the checklist below in order |
all references |
| Existing Tuist project drifted from the template | Diff Project.swift, .mise.toml, Brewfile, .swiftlint.yml, .swiftformat, fastlane/, .gitlab-ci.yml against the template and adopt section by section |
the reference for each section |
Existing .xcodeproj project without Tuist |
Write a Project.swift that mirrors the current targets, move sources into buildable folders, gitignore the project file, then continue as a Tuist project |
references/project-structure.md |
| Only Swift 6 migration | Add the three build settings, fix the errors, keep everything else | references/project-structure.md, then swift-optimization |
| Only CI or secrets | Keep the code, replace .gitlab-ci.yml, fastlane/, and the env files |
references/ci-pipeline.md, references/fastlane-secrets.md |
| KMP project with an iOS shell | Same layout under iosApp/, but no API_BASE_URL, no Feature framework, and import Shared; see kmp-template/iosApp/README.md |
references/project-structure.md |
Checklist for a new or realigned project
Abschnitt betitelt „Checklist for a new or realigned project“Work top to bottom, because each step feeds the next.
- Toolchain.
brew bundlefrom theBrewfile,mise installfor Tuist,bundle installfor fastlane. Pin Xcode in.xcode-versionand Ruby in.ruby-version. Readreferences/toolchain.mdwhen a tool is missing or the versions differ. - Project definition.
Project.swiftwith the app target, its test target, and one framework per feature plus its tests. All four usedeploymentTargets: .iOS(minIosVersion), so a feature never compiles against a different SDK floor than the app. Readreferences/project-structure.mdfor the full target, scheme, configuration, and xcconfig layout. - Swift 6 settings. In the project-level
settings.base:SWIFT_VERSION = 6.0,SWIFT_APPROACHABLE_CONCURRENCY = YES,SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor. They apply to every target, so a feature framework gets the same isolation model as the app. - Lint and format. Copy
.swiftlint.ymland.swiftformat, add theSwiftLintBuildToolPluginpackage to the app and feature targets, and extendincluded:in.swiftlint.ymlwhen you add source folders. The template lists onlyProjectTemplate/SourcesandProjectTemplate/Tests, so a newFeature/Sourcesfolder is unlinted until you add it. - Generate and build.
tuist install && tuist generate --no-open, then build thestagingscheme. Fix Swift 6 errors before adding fastlane, becausefastlane buildcompiles in release mode and hides warnings behindgymoutput. - fastlane and secrets. Keep
fastlane/.env.stagingand.env.prodcommitted with<VAR>_OP_REFpointers; never a bare secret. Runop signin, thenbundle exec fastlane resolve_all_secrets --env stagingto prove every reference resolves. Readreferences/fastlane-secrets.mdfor the lanes and the env split. - Signing. Bundle IDs in the xcconfigs and env files,
bundle exec fastlane certificates --env stagingfor match profiles. The xcconfigs useCODE_SIGN_STYLE = Manualwithmatch Developmentfor Debug andmatch AppStorefor Release. - CI. Copy
.gitlab-ci.yml, add the GitLab variablesSLACK_URL,LOCO_API_KEY,FASTLANE_GIT_DEPLOY_TOKEN(masked, environment-scoped), and set up the Apple App Store integration. Readreferences/ci-pipeline.mdfor the stage layout and why Danger waits for the test job. - Localization and Firebase. Loco project and
LOCO_*env values,GoogleService-Info-<env>.plistunderConfigurations/Firebase/.awl-ios-refcovers the Loco workflow. - Project docs. Fill
README.mdplaceholders, keepCLAUDE.md, commit.claude/settings.jsonwith the marketplace entry so the team gets theawl-generalandawl-testingplugins.
Non-negotiables
Abschnitt betitelt „Non-negotiables“- Secrets never land in a committed file.
.env.stagingand.env.prodare committed, so they holdop://references only.fastlane/.envis gitignored and exists as an env-agnostic fallback for machines withoutop. .xcodeprojand.xcworkspaceare gitignored. Every developer and every CI job regenerates fromProject.swift.- Feature and test targets share
minIosVersionwith the app. A lower target on a framework compiles against older availability and hides API misuse until runtime. - The
SwiftLintBuildToolPluginruns on every build, which is whybefore_allin the Fastfile disables Xcode’s plugin fingerprint validation. Keep thosedefaults writelines when editing the Fastfile. - Danger reads coverage from the pipeline API, so the
danger-review-securityoverride must keepneeds: - job: test. Removing it makes the coverage check read a stale or missing value. - Only
main,testing,production, merge requests, and schedules create pipelines. Feature branch pushes without an MR produce no pipeline by design.
After setup, verify
Abschnitt betitelt „After setup, verify“tuist install && tuist generate --no-openbundle exec fastlane lint --env stagingbundle exec fastlane test --env stagingbundle exec fastlane resolve_all_secrets --env stagingThen open an MR from a feature branch and confirm that lint, test, semgrep-sast, secret_detection, and danger-review-security all appear.
Related skills
Abschnitt betitelt „Related skills“awl-ios-reffor the build, run, and Loco command loop once the project existsswiftui-expert-skillandswift-optimizationfor code that fits the Swift 6 settingsawl-testing:testing-swiftfor the tests that feed the coverage gateawl-cicd:gitlab-cicdfor GitLab components shared with other stacks

