一键导入
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 职业分类
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
Add a new screen to an existing feature module with StateHolder, UI, factories, and tests
Add missing test cases, targeting a specific file or all changed files on the branch
Bump library versions in gradle.properties and prepare release notes
Diagnose and fix an error from a build failure, stack trace, or error message
| 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, build configuration, and DI wiring following MESA conventions.
Input: $ARGUMENTS
Extract the feature name from the input (e.g., my-feature). This becomes:
features/<feature-name>/myfeature or my_feature)com.jkjamies.mesa.features.<package-segment>If --headless is provided: Default to api + 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 —
api+domain+data+presentation(UI with StateHolder, Screen, Events)- Headless library —
api+domain+data(no UI)- Custom — Let me pick individual layers
For custom, which layers? (e.g., "api, domain")
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?"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 6.
api/ layerfeatures/<feature-name>/api/
├── build.gradle.kts
└── src/main/java/<package>/api/
The api module defines the public contract: interfaces for use cases, the Screen type (if navigable), and any shared data types.
build.gradle.kts — Pure Kotlin/JVM or Android library with no internal dependencies.
domain/ layerfeatures/<feature-name>/domain/
├── build.gradle.kts
└── src/main/java/<package>/domain/
The domain module contains business logic implementations. Depends on api and data.
build.gradle.kts — Depends on :features:<feature-name>:api and :features:<feature-name>:data.
data/ layerfeatures/<feature-name>/data/
├── build.gradle.kts
└── src/main/java/<package>/data/
The data module contains repository implementations and data sources.
build.gradle.kts — Minimal dependencies. No dependency on domain or presentation.
presentation/ layer (directory and build config only)If presentation is included, create only the module shell:
features/<feature-name>/presentation/
├── build.gradle.kts
└── src/main/java/<package>/presentation/
build.gradle.kts — Depends on :features:<feature-name>:api and :features:<feature-name>:domain. Includes Compose dependencies.
The actual Screen, State, Event, StateHolder, UI, and Factories files are created by the /add-screen skill in Step 6.
Add the new module(s) to settings.gradle.kts:
include(":features:<feature-name>:api")
include(":features:<feature-name>:domain") // if included
include(":features:<feature-name>:data") // if included
include(":features:<feature-name>:presentation") // if included
Each build.gradle.kts should follow existing module patterns in the project. Read an existing feature module's build files (e.g., features/counter/) to match:
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> based on common patterns (e.g., feature settings → FetchSettings or ObserveSettings)StrataInteractor (no flag)StrataSubjectInteractor (--observe)/add-interactor <feature-name> <InteractorName> [--observe]All source files generated directly by this skill (e.g., build.gradle.kts, placeholder source files) 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 ./gradlew :<new-module>:compileDebugKotlin for each created module to verify they compile.
Report: