Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .changeset/mcp-android-integration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@prover-coder-ai/docker-git": minor
---

Add Android MCP integration alongside the existing Playwright MCP support (issue #436).

Projects can now opt into a nested Android emulator sidecar driven by the
first-party Rust `android-connection` MCP server, mirroring how Playwright MCP works. Enable it
Comment on lines +7 to +8

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Уточните упоминание "first-party" и версионирование android-connection.

Строка 8 упоминает "first-party Rust android-connection MCP server", но в changeset не указывается:

  • Где находится крейт (например, crates/android-connection)
  • Что это — новый компонент в этом PR

Рекомендуется добавить уточнение в скобках: "новый Rust крейт android-connection" или аналогично для ясности, что это не существующий компонент.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.changeset/mcp-android-integration.md around lines 7 - 8, The changeset text
mentions "first-party Rust `android-connection` MCP server" but does not clarify
that this is a newly introduced component. Update the changeset text to
explicitly indicate that `android-connection` is a new Rust crate being added in
this PR. You can add a parenthetical clarification such as "new Rust crate
`android-connection`" or include the location context (e.g.,
`crates/android-connection`) to make it clear this is not an existing component
and is being introduced for the first time.

with the new `--mcp-android` / `--no-mcp-android` create flags, the `mcp-android`
subcommand, the interactive create-flow prompt, or the `enableMcpAndroid` field
on the web/API create-project request. When enabled, the generated
`docker-compose.yml` adds a gated `docker-android` emulator service (KVM,
ADB port forwarding, headless CI mode) and the agent MCP config writers register
the Android server so it coexists with Playwright.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ bun run docker-git clone https://github.com/ProverCoderAI/docker-git/issues/122

- `--force` пересоздаёт окружение и удаляет volumes проекта.
- `--mcp-playwright` включает Playwright MCP и Chromium sidecar для браузерной автоматизации.
- `--mcp-android` включает first-party Android MCP (`android-connection`) и вложенный sidecar с Android-эмулятором (`docker-android`) для мобильной автоматизации.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Упростите формулировку для параллельности со строкой --mcp-playwright.

Текущая формулировка:

- `--mcp-android` включает first-party Android MCP (`android-connection`) и вложенный sidecar с Android-эмулятором (`docker-android`) для мобильной автоматизации.

содержит больше деталей реализации, чем описание Playwright выше (line 73). Для лучшей параллельности и читаемости рекомендуется:

- `--mcp-android` включает Android MCP и Android-эмулятор sidecar для мобильной автоматизации.

Либо, если детали важны, добавьте аналогичную детализацию для Playwright:

- `--mcp-playwright` включает Playwright MCP (chromium-connection) и Chromium sidecar для браузерной автоматизации.
- `--mcp-android` включает Android MCP (android-connection) и Android-эмулятор sidecar для мобильной автоматизации.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 74, The documentation line describing the --mcp-android
flag contains excessive implementation details (mentioning first-party
designation, specific component names like android-connection and
docker-android) compared to the --mcp-playwright line above it, breaking
parallel structure. Simplify the --mcp-android description by removing the
implementation-specific terminology and details to match the conciseness of the
--mcp-playwright description, keeping only the essential information about what
capabilities are enabled for mobile automation.

Source: Path instructions


Автоматический запуск агента:

Expand Down
1 change: 1 addition & 0 deletions packages/api/src/api/contracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ export type CreateProjectRequest = {
readonly dockerNetworkMode?: string | undefined
readonly dockerSharedNetworkName?: string | undefined
readonly enableMcpPlaywright?: boolean | undefined
readonly enableMcpAndroid?: boolean | undefined
readonly outDir?: string | undefined
readonly gitTokenLabel?: string | undefined
readonly skipGithubAuth?: boolean | undefined
Expand Down
1 change: 1 addition & 0 deletions packages/api/src/api/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export const CreateProjectRequestSchema = Schema.Struct({
dockerNetworkMode: OptionalString,
dockerSharedNetworkName: OptionalString,
enableMcpPlaywright: OptionalBoolean,
enableMcpAndroid: OptionalBoolean,
outDir: OptionalString,
gitTokenLabel: OptionalString,
skipGithubAuth: OptionalBoolean,
Expand Down
1 change: 1 addition & 0 deletions packages/api/src/services/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ const toCreateRawOptions = (request: CreateProjectRequest): RawOptions => ({
? {}
: { dockerSharedNetworkName: request.dockerSharedNetworkName }),
...(request.enableMcpPlaywright === undefined ? {} : { enableMcpPlaywright: request.enableMcpPlaywright }),
...(request.enableMcpAndroid === undefined ? {} : { enableMcpAndroid: request.enableMcpAndroid }),
...(request.outDir === undefined ? {} : { outDir: request.outDir }),
...(request.gitTokenLabel === undefined ? {} : { gitTokenLabel: request.gitTokenLabel }),
...(request.skipGithubAuth === undefined ? {} : { skipGithubAuth: request.skipGithubAuth }),
Expand Down
9 changes: 9 additions & 0 deletions packages/app/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# @prover-coder-ai/docker-git

## 1.3.14

### Patch Changes

- chore: automated version bump

- Updated dependencies []:
- @prover-coder-ai/docker-git-session-sync@1.0.70

## 1.3.13

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@prover-coder-ai/docker-git",
"version": "1.3.13",
"version": "1.3.14",
"description": "docker-git Bun and Gridland CLI plus browser frontend",
"main": "dist/src/docker-git/main.js",
"bin": {
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/docker-git/api-client-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export const buildCreateProjectRequest = (
dockerNetworkMode: config.dockerNetworkMode,
dockerSharedNetworkName: config.dockerSharedNetworkName,
enableMcpPlaywright: config.enableMcpPlaywright,
enableMcpAndroid: config.enableMcpAndroid ?? false,
outDir: command.outDir,
gitTokenLabel: config.gitTokenLabel,
skipGithubAuth: config.skipGithubAuth,
Expand Down
3 changes: 2 additions & 1 deletion packages/app/src/docker-git/cli/parser-apply.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const parseApply = (
playwrightCpuLimit,
playwrightRamLimit,
gpu,
enableMcpPlaywright: raw.enableMcpPlaywright
enableMcpPlaywright: raw.enableMcpPlaywright,
enableMcpAndroid: raw.enableMcpAndroid
}
})
24 changes: 24 additions & 0 deletions packages/app/src/docker-git/cli/parser-mcp-android.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Either } from "effect"

import { type McpAndroidUpCommand, type ParseError } from "../frontend-lib/core/domain.js"

import { parseProjectDirWithOptions } from "./parser-shared.js"

// CHANGE: parse "mcp-android" command for existing docker-git projects
// WHY: allow enabling Android MCP in an already created container/project dir
// QUOTE(ТЗ): "Подключить mcp-android так же как работает MCP PLAYRIGHT"
// REF: issue-436
// SOURCE: n/a
// FORMAT THEOREM: forall argv: parseMcpAndroid(argv) = cmd -> deterministic(cmd)
// PURITY: CORE
// EFFECT: Effect<McpAndroidUpCommand, ParseError, never>
// INVARIANT: projectDir is never empty
// COMPLEXITY: O(n) where n = |argv|
export const parseMcpAndroid = (
args: ReadonlyArray<string>
): Either.Either<McpAndroidUpCommand, ParseError> =>
Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({
_tag: "McpAndroidUp",
projectDir,
runUp: raw.up ?? true
}))
2 changes: 2 additions & 0 deletions packages/app/src/docker-git/cli/parser-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ const booleanFlagUpdaters: Readonly<Record<string, (raw: RawOptions) => RawOptio
"--force-env": (raw) => ({ ...raw, forceEnv: true }),
"--mcp-playwright": (raw) => ({ ...raw, enableMcpPlaywright: true }),
"--no-mcp-playwright": (raw) => ({ ...raw, enableMcpPlaywright: false }),
"--mcp-android": (raw) => ({ ...raw, enableMcpAndroid: true }),
"--no-mcp-android": (raw) => ({ ...raw, enableMcpAndroid: false }),
"--wipe": (raw) => ({ ...raw, wipe: true }),
"--no-wipe": (raw) => ({ ...raw, wipe: false }),
"--web": (raw) => ({ ...raw, authWeb: true }),
Expand Down
2 changes: 2 additions & 0 deletions packages/app/src/docker-git/cli/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { parseAttach } from "./parser-attach.js"
import { parseAuth } from "./parser-auth.js"
import { parseClone } from "./parser-clone.js"
import { buildCreateCommand } from "./parser-create.js"
import { parseMcpAndroid } from "./parser-mcp-android.js"
import { parseMcpPlaywright } from "./parser-mcp-playwright.js"
import { parseOpen } from "./parser-open.js"
import { parseRawOptions } from "./parser-options.js"
Expand Down Expand Up @@ -93,6 +94,7 @@ export const parseArgs = (args: ReadonlyArray<string>): Either.Either<Command, P
Match.when("sessions", () => parseSessions(rest)),
Match.when("scrap", () => parseScrap(rest)),
Match.when("mcp-playwright", () => parseMcpPlaywright(rest)),
Match.when("mcp-android", () => parseMcpAndroid(rest)),
Match.when("help", () => Either.right(helpCommand)),
Match.when("ps", () => Either.right(statusCommand)),
Match.when("status", () => Either.right(statusCommand)),
Expand Down
3 changes: 3 additions & 0 deletions packages/app/src/docker-git/cli/usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ docker-git clone <url> [options]
docker-git open [<selector>] [options]
docker-git apply [<url>] [options]
docker-git mcp-playwright [<url>] [options]
docker-git mcp-android [<url>] [options]
docker-git attach [<project-dir>] [options]
docker-git panes [<url>] [options]
docker-git scrap <action> [<url>] [options]
Expand All @@ -27,6 +28,7 @@ Commands:
open Open an existing docker-git project by selector, URL, or path
apply Apply docker-git config to an existing project/container (current dir by default)
mcp-playwright Enable Playwright MCP + nested Chromium browser for an existing project dir
mcp-android Enable Android MCP (android-connection) + nested Android emulator for an existing project dir
attach, tmux Attach to an existing docker-git project workspace with tmux
panes, terms List tmux panes for a docker-git project
scrap Export/import project scrap (session snapshot + rebuildable deps)
Expand Down Expand Up @@ -78,6 +80,7 @@ Options:
--up | --no-up Run docker compose up after init (default: --up)
--ssh | --no-ssh Auto-open SSH after create/clone (default: clone=--ssh, create=--no-ssh)
--mcp-playwright | --no-mcp-playwright Enable Rust browser MCP + noVNC/CDP session (default: --no-mcp-playwright)
--mcp-android | --no-mcp-android Enable Android MCP (android-connection) + nested Android emulator sidecar (default: --no-mcp-android)
--auto[=claude|codex|gemini|grok] Auto-execute an agent; without value picks by auth, random if multiple are available
-d, --daemon browser: run the browser frontend server in the background after build
--active apply-all: apply only to currently running containers (skip stopped ones)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type BuildTemplateConfigInput = {
readonly geminiAuthLabel: string | undefined
readonly grokAuthLabel: string | undefined
readonly enableMcpPlaywright: boolean
readonly enableMcpAndroid: boolean
readonly agentMode: AgentMode | undefined
readonly agentAuto: boolean
/**
Expand Down Expand Up @@ -96,6 +97,7 @@ export const buildTemplateConfig = (input: BuildTemplateConfigInput): CreateComm
dockerNetworkMode: input.dockerNetworkMode,
dockerSharedNetworkName: input.dockerSharedNetworkName,
enableMcpPlaywright: input.enableMcpPlaywright,
enableMcpAndroid: input.enableMcpAndroid,
bunVersion: defaultTemplateConfig.bunVersion,
agentMode: input.agentMode,
agentAuto: input.agentAuto,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ type CreateBehavior = {
readonly force: boolean
readonly forceEnv: boolean
readonly enableMcpPlaywright: boolean
readonly enableMcpAndroid: boolean
}

const resolveCreateBehavior = (raw: RawOptions): CreateBehavior => ({
Expand All @@ -209,7 +210,8 @@ const resolveCreateBehavior = (raw: RawOptions): CreateBehavior => ({
skipGithubAuth: raw.skipGithubAuth ?? false,
force: raw.force ?? false,
forceEnv: raw.forceEnv ?? false,
enableMcpPlaywright: raw.enableMcpPlaywright ?? false
enableMcpPlaywright: raw.enableMcpPlaywright ?? false,
enableMcpAndroid: raw.enableMcpAndroid ?? false
})

type TokenLabelConfig = {
Expand Down Expand Up @@ -277,6 +279,7 @@ export const buildCreateCommand = (
...tokenLabels,
skipGithubAuth: behavior.skipGithubAuth,
enableMcpPlaywright: behavior.enableMcpPlaywright,
enableMcpAndroid: behavior.enableMcpAndroid,
agentMode,
agentAuto: isAgentAuto,
clonedOnHostname: raw.clonedOnHostname
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export interface RawOptions {
readonly dockerNetworkMode?: string
readonly dockerSharedNetworkName?: string
readonly enableMcpPlaywright?: boolean
readonly enableMcpAndroid?: boolean
readonly archivePath?: string
readonly scrapMode?: string
readonly wipe?: boolean
Expand Down
9 changes: 9 additions & 0 deletions packages/app/src/docker-git/frontend-lib/core/domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ export interface TemplateConfig {
readonly dockerNetworkMode: DockerNetworkMode
readonly dockerSharedNetworkName: string
readonly enableMcpPlaywright: boolean
readonly enableMcpAndroid?: boolean | undefined
readonly bunVersion: string
readonly agentMode?: AgentMode | undefined
readonly agentAuto?: boolean | undefined
Expand Down Expand Up @@ -204,6 +205,12 @@ export interface McpPlaywrightUpCommand {
readonly runUp: boolean
}

export interface McpAndroidUpCommand {
readonly _tag: "McpAndroidUp"
readonly projectDir: string
readonly runUp: boolean
}

export interface ApplyCommand {
readonly _tag: "Apply"
readonly projectDir: string
Expand All @@ -219,6 +226,7 @@ export interface ApplyCommand {
readonly playwrightRamLimit?: string | undefined
readonly gpu?: GpuMode | undefined
readonly enableMcpPlaywright?: boolean | undefined
readonly enableMcpAndroid?: boolean | undefined
}

// CHANGE: add apply-all command to apply docker-git config to every known project; support --active flag
Expand Down Expand Up @@ -262,6 +270,7 @@ export type Command =
| SessionsCommand
| ScrapCommand
| McpPlaywrightUpCommand
| McpAndroidUpCommand
| ApplyCommand
| ApplyAllCommand
| HelpCommand
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type DefaultTemplateConfig = Pick<
| "dockerNetworkMode"
| "dockerSharedNetworkName"
| "enableMcpPlaywright"
| "enableMcpAndroid"
| "bunVersion"
>

Expand Down Expand Up @@ -75,6 +76,7 @@ export const defaultTemplateConfig = {
dockerNetworkMode: defaultDockerNetworkMode,
dockerSharedNetworkName: defaultDockerSharedNetworkName,
enableMcpPlaywright: false,
enableMcpAndroid: false,
bunVersion: "1.3.11"
} satisfies DefaultTemplateConfig
/* jscpd:ignore-end */
5 changes: 5 additions & 0 deletions packages/app/src/docker-git/menu-create-command-parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ const unsupportedCreatePrefixes = new Set([
"gists",
"help",
"kill-all",
"mcp-android",
"mcp-playwright",
"menu",
"open",
Expand Down Expand Up @@ -164,6 +165,9 @@ const runUpCreateInput = (raw: RawCreateOptions, command: CreateCommand): Partia
const playwrightCreateInput = (raw: RawCreateOptions, command: CreateCommand): Partial<CreateInputs> =>
raw.enableMcpPlaywright === undefined ? {} : { enableMcpPlaywright: command.config.enableMcpPlaywright }

const androidCreateInput = (raw: RawCreateOptions, command: CreateCommand): Partial<CreateInputs> =>
raw.enableMcpAndroid === undefined ? {} : { enableMcpAndroid: command.config.enableMcpAndroid ?? false }

const forceCreateInput = (raw: RawCreateOptions, command: CreateCommand): Partial<CreateInputs> =>
raw.force === undefined ? {} : { force: command.force }

Expand All @@ -183,6 +187,7 @@ const createInputsFromCommand = (
...gpuCreateInput(raw, command),
...runUpCreateInput(raw, command),
...playwrightCreateInput(raw, command),
...androidCreateInput(raw, command),
...forceCreateInput(raw, command),
...forceEnvCreateInput(raw, command)
})
Expand Down
2 changes: 2 additions & 0 deletions packages/app/src/docker-git/menu-create-draft.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const createProjectDraftFromInputs = (
readonly gpu: GpuMode
readonly up: boolean
readonly enableMcpPlaywright: boolean
readonly enableMcpAndroid: boolean
readonly force: boolean
readonly forceEnv: boolean
} => ({
Expand All @@ -23,6 +24,7 @@ export const createProjectDraftFromInputs = (
gpu: input.gpu,
up: input.runUp,
enableMcpPlaywright: input.enableMcpPlaywright,
enableMcpAndroid: input.enableMcpAndroid,
force: input.force,
forceEnv: input.forceEnv
})
1 change: 1 addition & 0 deletions packages/app/src/docker-git/menu-create-inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ export const resolveCreateInputs = (
gpu: values.gpu ?? defaultTemplateConfig.gpu,
runUp: values.runUp !== false,
enableMcpPlaywright: values.enableMcpPlaywright === true,
enableMcpAndroid: values.enableMcpAndroid === true,
force: values.force === true,
forceEnv: values.forceEnv === true
}
Expand Down
10 changes: 10 additions & 0 deletions packages/app/src/docker-git/menu-create-labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ export const renderCreateStepLabel = (step: CreateStep, defaults: CreateInputs):
renderExplicitBooleanChoice(defaults.enableMcpPlaywright)
}]`
),
Match.when(
"mcpAndroid",
() => `Enable Android MCP (nested Android emulator)? [${renderExplicitBooleanChoice(defaults.enableMcpAndroid)}]`
),
Comment on lines +26 to +29

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Функциональная корректность подтверждена.

Логика соответствует паттерну других boolean-шагов wizard (mcpPlaywright). Использование Match.exhaustive и renderExplicitBooleanChoice обеспечивает типовую безопасность и консистентность отображения.

Опциональное улучшение терминологии: В usage.ts строка 31 использует "Android MCP (android-connection)", но в wizard метке (строка 28) упоминается только "Android MCP (nested Android emulator)" без идентификатора сервера. Для полной согласованности с документацией можно рассмотреть упоминание "(android-connection)" и в wizard, либо принять текущий паттерн (где wizard использует более краткие пользовательские формулировки, а usage.ts — технические детали).

Also applies to: 64-69

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/app/src/docker-git/menu-create-labels.ts` around lines 26 - 29, For
consistency with the technical terminology used in usage.ts (which references
"android-connection"), update the prompt label in the Match.when case for
"mcpAndroid" to include the server identifier alongside the user-friendly
description. Specifically, modify the string template to include
"(android-connection)" in addition to "(nested Android emulator)" to align the
wizard terminology with the technical details referenced in usage.ts at line 31,
ensuring consistent naming across the codebase.

Match.when(
"force",
() => `Force recreate (overwrite files + wipe volumes)? [${renderExplicitBooleanChoice(defaults.force)}]`
Expand Down Expand Up @@ -57,6 +61,12 @@ export const renderCreateStepLabelWithBufferPreview = (
? renderCreateStepLabel(step, defaults)
: `Enable Playwright MCP (nested Chromium browser)? [${renderExplicitBooleanChoice(enableMcpPlaywright)}]`
}),
Match.when("mcpAndroid", () => {
const enableMcpAndroid = parseExplicitBooleanChoice(buffer)
return enableMcpAndroid === null
? renderCreateStepLabel(step, defaults)
: `Enable Android MCP (nested Android emulator)? [${renderExplicitBooleanChoice(enableMcpAndroid)}]`
}),
Match.when("force", () => {
const force = parseExplicitBooleanChoice(buffer)
return force === null
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/docker-git/menu-create-navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ export const resolveCreateSettingsChoiceBuffer = (
Match.when("gpu", () => gpuChoiceBuffer(direction)),
Match.when("runUp", () => booleanChoiceBuffer(direction)),
Match.when("mcpPlaywright", () => booleanChoiceBuffer(direction)),
Match.when("mcpAndroid", () => booleanChoiceBuffer(direction)),
Match.when("force", () => booleanChoiceBuffer(direction)),
Match.exhaustive
)
Expand Down
4 changes: 3 additions & 1 deletion packages/app/src/docker-git/menu-create-step-apply.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@ const applyGpuStep = (

const applyBooleanStep = (
input: ApplyCreateStepInput,
key: "runUp" | "enableMcpPlaywright" | "force"
key: "runUp" | "enableMcpPlaywright" | "enableMcpAndroid" | "force"
): Either.Either<Partial<Mutable<CreateInputs>>, ParseError> => {
const isValue = isYesDefault(input.buffer, input.currentDefaults[key])
return Match.value(key).pipe(
Match.when("runUp", () => Either.right({ runUp: isValue })),
Match.when("enableMcpPlaywright", () => Either.right({ enableMcpPlaywright: isValue })),
Match.when("enableMcpAndroid", () => Either.right({ enableMcpAndroid: isValue })),
Match.when("force", () => Either.right({ force: isValue })),
Match.exhaustive
)
Expand All @@ -64,6 +65,7 @@ const applyCreateStep = (
Match.when("gpu", () => applyGpuStep(input)),
Match.when("runUp", () => applyBooleanStep(input, "runUp")),
Match.when("mcpPlaywright", () => applyBooleanStep(input, "enableMcpPlaywright")),
Match.when("mcpAndroid", () => applyBooleanStep(input, "enableMcpAndroid")),
Match.when("force", () => applyBooleanStep(input, "force")),
Match.exhaustive
)
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/docker-git/menu-create-steps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const isCreateStepSatisfied = (
Match.when("gpu", () => hasOwn(values, "gpu")),
Match.when("runUp", () => hasOwn(values, "runUp")),
Match.when("mcpPlaywright", () => hasOwn(values, "enableMcpPlaywright")),
Match.when("mcpAndroid", () => hasOwn(values, "enableMcpAndroid")),
Match.when("force", () => hasOwn(values, "force")),
Match.exhaustive
)
Expand Down
Loading
Loading