ワンクリックで
add-feature
Scaffold a new feature module with the appropriate layers and MESA conventions
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Scaffold a new feature module with the appropriate layers and MESA conventions
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Add a new screen to an existing feature module with Store, UI, factories, and tests
Add missing test cases, targeting a specific file or all changed files on the branch
Thorough pre-merge audit — dependency graph, correctness, conventions, security, test coverage, and improvement suggestions
Quick review of the current diff for bugs, logic errors, convention violations, and test gaps
Scaffold a new Strata interactor with interface, implementation, fake, and test
Bump library version in VERSION file and prepare release notes
| name | add-feature |
| description | Scaffold a new feature module with the appropriate layers and MESA conventions |
| disable-model-invocation | true |
| argument-hint | <feature-name> [--headless] |
Scaffold a new feature module with the correct directory structure and DI wiring following MESA conventions.
Input: $ARGUMENTS
Identify the app target (<AppTarget>) by looking at the Xcode project's main application target (e.g., Counter for the sample app). This is the folder that contains the app's feature modules — not the Swift package (MESA).
Extract the feature name from the input (e.g., Profile). This becomes:
<AppTarget>/<FeatureName>/Profile → ProfileScreen, ProfileStore, etc.)If --headless is provided: Default to Domain + Data (no presentation). Ask the user to confirm, or if any of these should also be excluded.
If no flags are provided: Ask the user which layers this feature needs:
Which layers does this feature need?
- Full feature —
Domain+Data+Presentation(UI with Store, Screen, Events)- Headless library —
Domain+Data(no UI)- Custom — Let me pick individual layers
For custom, which layers? (e.g., "Domain, Presentation")
If the user selects custom, also ask follow-up questions based on the selected layers:
Domain is included: "Does this feature need Strata interactors?"Data is included: "Does this feature need a repository?"Data is included: "Does this feature need SwiftData persistence?"Create the module directories and files based on the selected layers. Do not scaffold presentation layer files directly — that is handled by the /add-screen skill in Step 5.
Domain/ layer<AppTarget>/<FeatureName>/Domain/
The Domain module contains pure Swift business logic. No UI framework imports (no SwiftUI, SwiftData, UIKit). Foundation is allowed. Repository protocols and use cases live here.
Data/ layer<AppTarget>/<FeatureName>/Data/
The Data module contains repository implementations using actor isolation. Depends only on Domain.
Presentation/ layer (directory only)If presentation is included, create only the directory shell:
<AppTarget>/<FeatureName>/
The actual Screen, State, Event, Store, UI, and Factory files are created by the /add-screen skill in Step 5.
Place at: <AppTarget>/<FeatureName>/Domain/<FeatureName>Repository.swift
import Foundation
public protocol <FeatureName>Repository: Sendable {
// Define data operations
}
Place at: <AppTarget>/<FeatureName>/Data/<FeatureName>RepositoryImpl.swift
Without persistence:
import Foundation
public actor <FeatureName>RepositoryImpl: <FeatureName>Repository {
public init() {}
// Implement protocol methods
}
With SwiftData persistence:
import Foundation
import SwiftData
public actor <FeatureName>RepositoryImpl: <FeatureName>Repository, ModelActor {
public let modelContainer: ModelContainer
public let modelExecutor: any ModelExecutor
public init(container: ModelContainer) {
self.modelContainer = container
let context = ModelContext(container)
self.modelExecutor = DefaultSerialModelExecutor(modelContext: context)
}
// Implement protocol methods
}
After scaffolding the module structure (delegated skills handle their own license headers):
If presentation is included: Automatically run the /add-screen skill to scaffold the first screen. Offer the user two options for the screen name:
<FeatureName>Screen (e.g., feature Settings → SettingsScreen)If domain is included and interactors are needed: Repeat the following loop:
<FeatureName><Action>UseCase based on common patterns (e.g., FetchSettingsUseCase)StrataInteractor (no flag)StrataSubjectInteractor (--observe)/add-interactor <feature-name> <InteractorName> [--observe]All source files generated directly by this skill MUST include the Apache 2.0 license header. Files generated by delegated skills (/add-screen, /add-interactor) handle their own headers.
/*
* Copyright 2026 Jason Jamieson
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Run cd MESA && swift build to verify the package compiles. If app target files were changed, also run xcodebuild build -scheme <AppTarget> -destination 'platform=iOS Simulator,name=<SimulatorDevice>' (e.g., -scheme Counter -destination 'platform=iOS Simulator,name=iPhone 16').
Report: