Add a new screen to an existing feature module. Creates Screen object, TestTags, Presenter, UiState, Events, Ui composable, and full test suite (9+ files).
Add a new screen to an existing feature with all required files.
Parameters: feature name, screen name, screen type (Screen | ProtectedScreen | TabScreen)
The user may provide additional context in three ways — all are optional:
@file reference — e.g., /add-screen @specs/checkout.md. The CLI resolves the file and includes its content. Use it to populate UiState fields, events, presenter logic, UI layout, test tags, and test assertions instead of using placeholders. If no feature/screen name is provided as arguments, extract them from the spec's Overview section.When context is provided, replace placeholders with real values everywhere: UiState, events, presenter logic, UI composable, test tags, and test assertions. If context is partial, fill in what you can and leave only for genuinely unknown parts.
// TODOTemplates are available in .agents/templates/new-spec.md for structured input.
.agents/standards/naming-conventions.md.agents/standards/dependency-injection.md.agents/standards/testing-unit.md.agents/standards/testing-ui-component.md.agents/standards/design-system.mdUse existing screens in features/order/ as the pattern reference.
| File | Location | Template |
|---|---|---|
{Screen}Screen.kt | api/navigation/src/commonMain | Data object with @Parcelize |
{Screen}TestTags.kt | api/navigation/src/commonMain (ui package) | Object with const val tags |
{Screen}Presenter.kt | impl/presentation/src/commonMain | @CircuitInject + @Inject + @Composable |
{Screen}UiState.kt | impl/presentation/src/commonMain | Data class : CircuitUiState + sealed Event |
{Screen}Ui.kt | impl/presentation/src/androidMain | @CircuitInject Composable |
{Screen}PresenterTest.kt | impl/presentation/src/commonTest | BehaviorSpec with presenterTestOf |
{Screen}UiTest.kt | impl/presentation/src/androidDeviceTest | BehaviorSpec with UiRobot |
{Screen}UiRobot.kt | impl/presentation/src/androidDeviceTest | Robot with StateRobot |
{Screen}StateRobot.kt | impl/presentation/src/androidDeviceTest | Extends core StateRobot |
Screen — standard navigation target (most common)ProtectedScreen — requires authentication, triggers AuthInterceptor redirect to loginTabScreen — bottom navigation tab, needs override val tag: String@Parcelize@CircuitInject({Screen}::class, AppScope::class), @Inject, and @ComposableCircuitUiState and include eventSink: ({Event}) -> Unitsealed class (not sealed interface) for iOS interop@CircuitInject({Screen}::class, AppScope::class) and @ComposableWork is NEVER complete until verification passes. Run the verify skill to validate all changes. It will:
If ANY check fails, fix the issue and re-run. Do not declare the task complete until verification passes.