swift-project-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited swift-project-setup (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Ask the user (if not already provided):
references/ in swift-testing skill)Ask if not already provided: SwiftUI, UIKit, or Mixed (SwiftUI + UIKit)?
Then load the matching reference:
references/structure-swiftui.mdreferences/structure-uikit.mdreferences/structure-mixed.mdApply the template exactly. Then consult references/file-naming.md for group naming rules and the "What Never Goes Where" table before placing any file.
Create core protocol files:
// Core/Protocols/ViewModelProtocol.swift
import Foundation
@MainActor
protocol ViewModelProtocol: AnyObject {
func onAppear() async
}// Core/Protocols/RepositoryProtocol.swift
import Foundation
protocol RepositoryProtocol {
associatedtype Model
func fetch() async throws -> [Model]
}Generate a placeholder feature (e.g., Home):
// Features/Home/HomeView.swift
import SwiftUI
struct HomeView: View {
@State private var viewModel = HomeViewModel()
var body: some View {
Text("Hello, \(viewModel.title)")
.task { await viewModel.onAppear() }
}
}
#Preview {
HomeView()
}// Features/Home/HomeViewModel.swift
import Foundation
import Observation
@MainActor
@Observable
final class HomeViewModel {
private(set) var title: String = ""
func onAppear() async {
title = "World"
}
}Copy CLAUDE.md from swift-unit-test-instructions into the project root. Fill in the Project Configuration block:
Create .claude/skills/ in the project root. Copy the following skills from swift-unit-test-instructions/skills/:
swift-testing/ (mandatory)swift-architecture-audit/ (recommended)swiftui-component/ (if using SwiftUI)swift-networking/ (if networking needed)swift-persistence/ (if persistence selected)swift-code-review/ (recommended)Also copy .claude/commands/ and .claude/agents/ from swift-unit-test-instructions/ into the project's .claude/ folder.
STOP. Present the plan to the user and wait for confirmation before generating any files.
Plan: [ProjectName]
Structure: [SwiftUI | UIKit | Mixed]
Persistence: [None | SwiftData | CoreData]
Testing: [enterprise | indie]
Files to create:
- [list key files]
Confirm to proceed?Create placeholder tests to validate the setup compiles:
// ProjectNameTests/HomeViewModelTests.swift
import Testing
@testable import ProjectName
@MainActor
struct HomeViewModelTests {
@Test func test_when_onAppear_should_setTitle() async {
// Arrange
let sut = HomeViewModel()
// Act
await sut.onAppear()
// Assert
#expect(sut.title == "World")
}
}User says: "Create a new SwiftUI project called TaskMate for iOS 17+"
Actions:
TaskMateApp.swift, HomeView.swift, HomeViewModel.swiftCLAUDE.md with filled-in configUser says: "Start a new UIKit project called BankingApp, enterprise testing"
Actions:
HomeViewController + HomeViewModelreferences/structure-swiftui.md — SwiftUI folder structure + test targetsreferences/structure-uikit.md — UIKit folder structure + test targetsreferences/structure-mixed.md — Mixed SwiftUI + UIKit structure + Bridge/ rulesreferences/file-naming.md — file naming good/bad, group naming, "What Never Goes Where"references/gitignore-xcode.md — .gitignore for Xcode/Swift projectsreferences/spm-skeleton.md — Package.swift skeleton for extracting modulesXcode targets not created: The skill generates source files and folder structure, but Xcode targets (Unit Test Target, UI Test Target) must be added manually in Xcode → File → New → Target.
Preview not working: Ensure @Observable is imported from Observation (iOS 17+). For older targets, use ObservableObject + @Published.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.