Skip to content

fix(mcp): keep Playwright MCP handshake nonblocking#321

Open
skulidropek wants to merge 4 commits into
mainfrom
issue-319
Open

fix(mcp): keep Playwright MCP handshake nonblocking#321
skulidropek wants to merge 4 commits into
mainfrom
issue-319

Conversation

@skulidropek
Copy link
Copy Markdown
Member

@skulidropek skulidropek commented May 18, 2026

Summary

Closes #319.

  • Make docker-git-playwright-mcp start Playwright MCP stdio immediately in guarded mode instead of blocking initialize on CDP readiness.
  • Wait for nested browser CDP in the project entrypoint and export MCP_PLAYWRIGHT_ENABLE=0 when the runtime cannot start or CDP never becomes ready.
  • Render MCP client config after the browser runtime so Codex/Claude/Gemini/Grok only keep Playwright MCP when the current boot can support it.
  • Sync app/lib template copies, route app tests through a local adapter, and add focused regression coverage.

Screenshots / Proof

Verification

Issue 319 verification

Implementation Invariants

Issue 319 implementation evidence

Validation

  • bun --cwd packages/lib vitest run tests/core/templates.test.ts tests/usecases/mcp-playwright.test.ts
  • bun run --cwd packages/lib lint
  • bun run --cwd packages/app typecheck
  • bun run --cwd packages/app lint
  • bun run --cwd packages/app lint:effect
  • bun run --cwd packages/app test
  • git diff --check

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 18, 2026

Review Change Stack

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 30035ba4-0548-48e8-be0e-4ffbc9716c6a

📥 Commits

Reviewing files that changed from the base of the PR and between 54ee160 and 3f4a7b2.

📒 Files selected for processing (14)
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/test-adapters/core-templates.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
📝 Walkthrough

Walkthrough

Обновления MCP Playwright фокусируются на надёжности: добавлен вложенный browser runtime с проверками готовности CDP и явным отключением при ошибках; динамическая генерация конфигурации для Gemini и Grok; смена дефолтного CDP endpoint на localhost; guard/timeout в wrapper‑скриптах; и расширение тестов/адаптеров.

Changes

MCP Playwright reliability and nested runtime

Layer / File(s) Summary
Readiness checks and MCP lifecycle management
packages/app/src/lib/core/templates/playwright-browser-runtime.ts, packages/lib/src/core/templates/playwright-browser-runtime.ts
Добавлены bash-функции для управления жизненным циклом MCP: docker_git_disable_playwright_mcp, docker_git_playwright_cdp_endpoint, docker_git_fetch_playwright_cdp_version, docker_git_wait_for_playwright_cdp и интеграция вызовов отключения при ошибках.
Nested Playwright browser runtime entrypoint & render order
packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts, packages/app/src/lib/core/templates-entrypoint.ts, packages/lib/src/core/templates-entrypoint.ts
Новый renderEntrypointPlaywrightBrowserRuntime и перестановка renderEntrypointMcpPlaywright(config) в pipeline renderEntrypoint в app и lib.
Gemini dynamic MCP Playwright sync
packages/app/src/lib/core/templates-entrypoint/gemini.ts, packages/lib/src/core/templates-entrypoint/gemini.ts
Удалена статическая секция mcpServers.playwright; добавлен renderGeminiMcpPlaywrightConfig с bash/Node.js синхронизацией settings.json по GEMINI_CONFIG_SETTINGS_FILE с режимом записи 0600.
Grok dynamic MCP Playwright sync
packages/app/src/lib/core/templates-entrypoint/grok.ts, packages/lib/src/core/templates-entrypoint/grok.ts
Удалена статическая секция mcpServers.playwright; добавлен renderGrokMcpPlaywrightConfig с inline Node.js для безопасного обновления GROK_CONFIG_SETTINGS_FILE по MCP_PLAYWRIGHT_ENABLE.
Dockerfile playwright-mcp wrapper with guard mode and timeout
packages/app/src/lib/core/templates/dockerfile.ts, packages/lib/src/core/templates/dockerfile.ts
Переработана обёртка /usr/local/bin/docker-git-playwright-mcp: дефолт CDP endpoint → http://127.0.0.1:9223, добавлен режим MCP_PLAYWRIGHT_CDP_GUARD, параметр MCP_PLAYWRIGHT_CDP_TIMEOUT, логика перепривязки WS и финальный exec с --cdp-timeout; включение runtime-скриптов в образ.
Dockerfile runtime inclusion & entrypoint runtime template
packages/app/src/lib/core/templates/dockerfile.ts, packages/app/src/lib/core/templates/playwright-browser-runtime.ts
Добавлен renderDockerfilePlaywrightRuntime(config) в сборку Dockerfile и создан шаблон nested browser runtime для conditional source/старт-стоп.
CDP endpoint defaults and CLI usage
packages/app/src/docker-git/cli/usage.ts, packages/app/src/lib/core/templates-entrypoint/codex.ts, packages/lib/src/core/templates-entrypoint/codex.ts
Смена дефолта MCP_PLAYWRIGHT_CDP_ENDPOINT на http://127.0.0.1:9223 в шаблонах и обновление help с параметрами MCP_PLAYWRIGHT_CDP_TIMEOUT, MCP_PLAYWRIGHT_READY_ATTEMPTS, MCP_PLAYWRIGHT_READY_DELAY, MCP_PLAYWRIGHT_RETRY_ATTEMPTS, MCP_PLAYWRIGHT_RETRY_DELAY.
Test coverage and test-adapter exports
packages/app/tests/docker-git/core-templates.test.ts, packages/lib/tests/core/templates.test.ts, packages/lib/tests/usecases/mcp-playwright.test.ts, packages/app/test-adapters/core-templates.ts
Расширение тестов: проверки COPY директив, MCP_PLAYWRIGHT_CDP_TIMEOUT, ожиданий docker_git_wait_for_playwright_cdp(), readiness параметров, явного MCP_PLAYWRIGHT_ENABLE=0, синхронизации Gemini/Grok и порядка старта browser перед конфигурацией; добавлен re-export renderDockerfile в тест-адаптер.
Small imports / exports / type tweaks
packages/app/src/docker-git/api-client-auth.ts, packages/app/src/docker-git/api-client.ts, packages/app/src/docker-git/program-auth.ts, packages/app/src/web/*
Переупорядочены списки импортов/экспортов и уточнена аннотация типа в Grok login handler; мелкие перестановки импортов/экспортов без изменений API.

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • ProverCoderAI/docker-git#312: Перекрывающиеся изменения по nested Playwright runtime и интеграции MCP (runtime wiring, CDP guard/readiness).
  • ProverCoderAI/docker-git#305: Пересечение по изменениям Grok entrypoint и синхронизации settings.json для MCP Playwright.
🚥 Pre-merge checks | ✅ 6 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Security Regression ❓ Inconclusive No result was produced after verification. Marking as INCONCLUSIVE. Re-run the check or adjust instructions to produce a final result.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок точно отражает основное изменение: переход к неблокирующему режиму для MCP Playwright, что соответствует сути PR.
Description check ✅ Passed Описание содержит краткое резюме, ссылку на issue #319, перечень ключевых изменений, скриншоты верификации и детальные команды валидации.
Linked Issues check ✅ Passed PR адресует все основные требования issue #319: неблокирующий запуск MCP, отключение MCP при недоступности CDP, рендеринг конфига после браузерного runtime и синхронизация конфигов для Gemini/Grok.
Out of Scope Changes check ✅ Passed Все изменения в пакетах app и lib сфокусированы на целевых компонентах MCP Playwright, шаблонах entrypoint и синхронизации. Незначительные переупорядочивания импортов в других файлах остаются в логических границах PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Requirements Alignment ✅ Passed Все обещанные требования реализованы. 5 ключевых поведений проверены в коде и имеют полное тестовое покрытие.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-319

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 Prompt for all review comments with 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.

Inline comments:
In `@packages/app/src/lib/core/templates-entrypoint/gemini.ts`:
- Around line 200-233: The shell snippet generated by
renderGeminiMcpPlaywrightConfig uses bare $MCP_PLAYWRIGHT_ENABLE which skips
local safe defaults; update the embedded heredoc so the environment check uses
${MCP_PLAYWRIGHT_ENABLE:-0} (e.g., in the assignment and the if that checks
MCP_PLAYWRIGHT_ENABLE) inside the docker_git_sync_gemini_playwright_mcp block in
renderGeminiMcpPlaywrightConfig, and apply the same ${MCP_PLAYWRIGHT_ENABLE:-0}
pattern to the equivalent syncing functions in grok.ts and claude.ts to maintain
consistent safe defaults.

In `@packages/app/src/lib/core/templates-entrypoint/grok.ts`:
- Around line 185-218: The bootstrap script generated by
renderGrokMcpPlaywrightConfig embeds MCP_PLAYWRIGHT_ENABLE without a default
which can break under nounset; change the environment assignment in the
docker_git_sync_grok_playwright_mcp function to provide a default (use the same
pattern as elsewhere, e.g. "${MCP_PLAYWRIGHT_ENABLE:-0}") so
MCP_PLAYWRIGHT_ENABLE is defined when renderGrokMcpPlaywrightConfig is invoked;
update the string that sets GROK_CONFIG_SETTINGS_FILE and MCP_PLAYWRIGHT_ENABLE
in renderGrokMcpPlaywrightConfig accordingly.

In `@packages/app/src/lib/core/templates/dockerfile.ts`:
- Around line 177-199: The template relies on a CLI contract from
`@playwright/mcp` and should pin that package version: add a Docker ARG like
PLAYWRIGHT_MCP_VERSION with default "0.0.75" and use it wherever the image
installs or references playwright-mcp so the binary/flags (used by the guarded
branch invoking exec playwright-mcp --cdp-endpoint ...) remain stable; update
the template's installation step to install
`@playwright/mcp`@${PLAYWRIGHT_MCP_VERSION} (or otherwise reference the ARG) and
mirror the exact same ARG + usage change in the sibling template (the other
dockerfile template in packages/lib/src/core/templates/dockerfile.ts) so
MCP_PLAYWRIGHT_CDP_GUARD behavior remains deterministic across templates.

In `@packages/app/src/lib/core/templates/playwright-browser-runtime.ts`:
- Around line 47-53: Validate MCP_PLAYWRIGHT_READY_ATTEMPTS before using it with
seq: ensure the local variable attempts (derived from
MCP_PLAYWRIGHT_READY_ATTEMPTS) is a positive integer and if not, reset it to the
default (60); then replace the fragile for attempt in $(seq 1 "$attempts") with
a safe numeric loop (e.g. attempt=1; while [ "$attempt" -le "$attempts" ]; do
...; attempt=$((attempt+1)); done) so docker_git_fetch_playwright_cdp_version
and the subsequent retry logic never crash when the env var is non-numeric.

In `@packages/app/tests/docker-git/core-templates.test.ts`:
- Line 5: В тестах удалите прямой импорт renderDockerfile из legacy/internal
surface и вместо этого проверяйте Dockerfile через уже сгенерированные артефакты
(вызов planFiles(...) или через разрешённый app-адаптер): найдите места где
используется renderDockerfile, уберите импорт и вызовы к renderDockerfile,
вызовите planFiles(...) для получения сгенерированных файлов и делайте ассерты
по содержимому файла Dockerfile из возвращённого набора; при необходимости
адаптируйте ожидания к формату артефакта, вместо прямого рендера внутренней
функции.

In `@packages/lib/src/core/templates-entrypoint/gemini.ts`:
- Around line 199-232: The MCP_PLAYWRIGHT_ENABLE env var is expanded without a
safe default in the docker_git_sync_gemini_playwright_mcp shell wrapper produced
by renderGeminiMcpPlaywrightConfig; update the expansion to provide an explicit
default (e.g. use ${MCP_PLAYWRIGHT_ENABLE:-0}) so MCP_PLAYWRIGHT_ENABLE is "0"
when unset, ensuring the Node check (process.env.MCP_PLAYWRIGHT_ENABLE === "1")
behaves predictably and only enables the playwright entry when the flag is
explicitly set.

In `@packages/lib/src/core/templates/playwright-browser-runtime.ts`:
- Around line 46-52: Перед входом в цикл (где используется seq 1 "$attempts" и
sleep "$delay") добавьте валидацию переменных MCP_PLAYWRIGHT_READY_ATTEMPTS
(attempts) и MCP_PLAYWRIGHT_READY_DELAY (delay) при включённом set -euo
pipefail: проверьте соответствие целочисленному регулярному выражению и диапазон
(например attempts > 0 и delay >= 0), и в случае невалидного значения выведите
понятную ошибку и завершите скрипт с ненулевым кодом; разместите эту проверку до
использования seq и sleep (в той же функции/блоке, где объявлены local attempts
и local delay и где вызывается docker_git_fetch_playwright_cdp_version), чтобы
избежать аварийного выхода командой seq или sleep.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 0f4b1d2a-7b4b-48cc-b471-e0075a69b631

📥 Commits

Reviewing files that changed from the base of the PR and between e7107a6 and b6a0fb7.

⛔ Files ignored due to path filters (2)
  • .github/pr-screenshots/issue-319/implementation.png is excluded by !**/*.png
  • .github/pr-screenshots/issue-319/verification.png is excluded by !**/*.png
📒 Files selected for processing (18)
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: E2E (OpenCode)
  • GitHub Check: E2E (Browser command)
  • GitHub Check: E2E (Runtime volumes + SSH)
  • GitHub Check: E2E (Login context)
  • GitHub Check: E2E (Clone auto-open SSH)
  • GitHub Check: E2E (Clone cache)
🧰 Additional context used
📓 Path-based instructions (8)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Implement Functional Core, Imperative Shell (FCIS) pattern: CORE layer contains only pure functions with immutable data and mathematical operations; SHELL layer isolates all effects (IO, network, database). Strict dependency direction: SHELL → CORE (never reverse).
Never use any, unknown, eslint-disable, ts-ignore, or as type assertions (except in rigorously justified cases with documentation). Always use exhaustive union type analysis through .exhaustive() pattern matching.
All external dependencies must be wrapped through typed interfaces and injected via Effect-TS Layer pattern. Never call external services directly from CORE functions.
Use monadic composition with Effect-TS for all effects: Effect<Success, Error, Requirements>. Compose effects through pipe() and Effect.flatMap(). Implement dependency injection via Layer pattern. Handle errors without try/catch blocks.
All functions must be pure in the CORE layer: no side effects (logging, console output, IO operations, mutations). Separate all side effects into the SHELL layer.
Use exhaustive pattern matching with Effect.Match instead of switch statements. Example: Match.value(item).pipe(Match.when(...), Match.exhaustive).
Document all functions with comprehensive TSDoc including: @pure (true/false), @effect (required services), @invariant (mathematical invariants), @precondition, @postcondition, @complexity (time and space), @throws Never (errors must be typed in Effect).
Use functional comment markers for code clarity: CHANGE (brief description), WHY (mathematical/architectural justification), QUOTE(ТЗ) (requirement citation), REF (RTM or message ID), SOURCE (external source with quote), FORMAT THEOREM (∀x ∈ Domain: P(x) → Q(f(x))), PURITY (CORE|SHELL), EFFECT (Effect type signature), INVARIANT (mathematical invariant), COMPLEXITY (time/space).
Define all external service dependencies as Context.Tag classes with fully typed methods returning Effect types. Example: `class Da...

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,js,jsx}: Forbidden constructs in CORE code: any, eslint-disable, ts-ignore, async/await, raw Promise chains (then/catch), Promise.all, try/catch for logic control, console.*, switch statements (use Match with .exhaustive() instead)
All functions must use Effect-TS for composing effects: Effect<Success, Error, Requirements>. No direct async/await, Promise chains, or try/catch in product logic.
Functional comments must include: CHANGE, WHY, QUOTE(ТЗ) or n/a, REF, SOURCE or n/a, FORMAT THEOREM, PURITY (CORE|SHELL), EFFECT signature for SHELL functions, INVARIANT, and COMPLEXITY.
All data mutations must use immutable patterns (ReadonlyArray, readonly properties, Object.freeze); mutation in SHELL only when absolutely necessary and documented.

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*.{sh,bash,py,js,ts,jsx,tsx,go,java,rb,php}

📄 CodeRabbit inference engine (Custom checks)

Fail if changed files introduce command injection or unsafe shell/process execution with user-controlled input

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*.{py,js,ts,jsx,tsx,go,java,rb,php,sh,bash,c,cpp}

📄 CodeRabbit inference engine (Custom checks)

Fail if changed files introduce path traversal or writes outside intended project/container state directories

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*.{js,ts,jsx,tsx,py,java,go,rb,php,sh,bash,yml,yaml,json,env*,toml,cfg,config,dockerfile,dockerignore}

📄 CodeRabbit inference engine (Custom checks)

Fail if changed files expose credentials, tokens, private-keys, or PII in source, generated config, logs, or CI output

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*

⚙️ CodeRabbit configuration file

**/*: Ты строгий ревьюер SPEC DRIVEN DEVELOPMENT.

Перед выводами изучи README.md, другие *.md файлы, linked issues,
PR description, PR comments/discussion и релевантную кодовую базу.

Сверь изменения с исходным ТЗ/спекой и обсуждением. Флагай любой уход
от спеки, недокументированное изменение поведения, отсутствие тестов
для заявленного поведения и security-риск. Если спека не видна,
попроси автора добавить ее в issue или PR description.

Проверь решение с точки зрения формальной верификации: какие инварианты,
предусловия и постусловия можно доказать математически, а где доказуемость
слабая. Оцени решение с точки зрения теории игр: устойчивы ли стимулы,
нет ли выгодного обхода правил, и какое решение было бы сильнее.

Files:

  • packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/codex.ts
  • packages/app/src/lib/usecases/mcp-playwright.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/lib/src/core/templates-entrypoint/codex.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/app/src/lib/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates-entrypoint.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/lib/src/core/templates-entrypoint/gemini.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/app/src/lib/core/templates/dockerfile.ts
**/*.test.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.test.{ts,tsx}: Implement property-based testing using fast-check for mathematical properties and invariants. Example: fc.property(fc.array(messageArbitrary), (messages) => isChronologicallySorted(sortMessagesByTimestamp(messages))).
Mock external dependencies in unit tests using Effect's testing utilities. Run tests without Effect runtime for speed. Example: Effect.provide(MockService), Effect.runPromise.

Files:

  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/lib/tests/core/templates.test.ts
**/*.{test,spec}.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Property-based tests (fast-check) must verify mathematical invariants; unit tests must use Effect test utilities without async/await.

Files:

  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/lib/tests/core/templates.test.ts
🪛 GitHub Check: Lint Effect-TS
packages/app/tests/docker-git/core-templates.test.ts

[failure] 5-5:
Direct import or require '../../src/lib/core/templates/dockerfile.js' from legacy lib surfaces is forbidden in package/app frontend surfaces and tests. Use the API client or a local app adapter instead

🔇 Additional comments (10)
packages/app/src/lib/usecases/mcp-playwright.ts (1)

31-33: Формулировка WHY обновлена корректно и соответствует целям PR.

Изменение носит документирующий характер, с текущей логикой и инвариантами согласовано.

packages/lib/src/core/templates/dockerfile.ts (1)

177-199: Дубликат замечания про дрейф версии @playwright/mcp.

Здесь нужна та же фиксация версии, что и в packages/app/src/lib/core/templates/dockerfile.ts, иначе app и lib снова разъедутся.

packages/app/src/docker-git/cli/usage.ts (1)

105-110: LGTM!

packages/app/src/lib/core/templates-entrypoint/codex.ts (1)

101-103: LGTM!

packages/lib/src/core/templates-entrypoint/codex.ts (1)

100-102: LGTM!

packages/app/src/lib/core/templates/dockerfile.ts (1)

238-242: LGTM!

Also applies to: 402-402

packages/lib/src/core/templates/playwright-browser-runtime.ts (1)

42-42: ⚡ Quick win

Host заголовок согласован с архитектурой порт-форвардинга и хост-валидации.

На строке 42 Host header указывает на 127.0.0.1:9222 — это корректно. Архитектура использует socat прокси (строка 260 в playwright.ts: socat TCP-LISTEN:9223,fork,reuseaddr TCP:127.0.0.1:9222), который слушает на порту 9223 и форвардит запросы на 9222. Сама система (kechangdev/browser-vnc) выполняет хост-валидацию и требует, чтобы Host header совпадал с реальным upstream сервисом (9222), а не с портом прокси (9223). Удаление Host header нарушит валидацию на upstream и приведёт к сбою readiness-проверки. Текущая реализация согласована с dockerfile.ts (строка 205) и project-browser.ts (строка 95).

			> Likely an incorrect or invalid review comment.
packages/app/src/lib/core/templates/playwright-browser-runtime.ts (1)

43-43: ⚡ Quick win

Конфликт портов в Host-заголовке разрешён архитектурой проксирования — это не баг.

На Line 43 используется Host: 127.0.0.1:9222 намеренно, несмотря на дефолтный endpoint 127.0.0.1:9223 на Line 37. Это не создаёт риск ложного fail:

  • 127.0.0.1:9223 — слой CDP guard или socat (внешний интерфейс)
  • 127.0.0.1:9222 — фактический сервис kechangdev/browser-vnc, который выполняет проверку Host-заголовка (см. dockerfile.ts:202)

Архитектура: клиент → 9223 (guard/socat) → 9222 (browser-vnc). Сервис browser-vnc требует Host-заголовок, указывающий на его фактический порт (9222), а не на прокси-интерфейс. Удаление заголовка нарушит проверку хоста на стороне browser-vnc.

			> Likely an incorrect or invalid review comment.
packages/app/src/lib/core/templates-entrypoint/playwright-browser.ts (1)

24-24: ⚡ Quick win

Переменная MCP_PLAYWRIGHT_ENABLE всегда инициализируется в заголовке entrypoint, поэтому риск unbound variable отсутствует.

Функция renderEntrypointHeader (из base.ts:42) выполняется первой и устанавливает:

MCP_PLAYWRIGHT_ENABLE="${MCP_PLAYWRIGHT_ENABLE:-${config.enableMcpPlaywright ? "1" : "0"}}"

Это гарантирует, что переменная инициализируется с значением "0" или "1" до того, как будет использована в renderEntrypointPlaywrightBrowserRuntime (и других renderers: claude, gemini, grok, codex). Порядок композиции в renderEntrypoint подтверждает, что header рендеруется первым, поэтому set -euo pipefail не вызовет ошибку unbound variable.

Предлагаемый фикс (${MCP_PLAYWRIGHT_ENABLE:-0}) был бы избыточным, так как переменная уже инициализирована выше по потоку выполнения скрипта.

			> Likely an incorrect or invalid review comment.
packages/lib/src/core/templates-entrypoint/grok.ts (1)

184-217: ⚡ Quick win

Нет проблемы; MCP_PLAYWRIGHT_ENABLE гарантирует инициализацию в renderEntrypointHeader перед использованием в grok.ts.

renderEntrypointHeader(config) выполняется первым в массиве композиции (templates-entrypoint.ts) и устанавливает:

MCP_PLAYWRIGHT_ENABLE="${MCP_PLAYWRIGHT_ENABLE:-${config.enableMcpPlaywright ? "1" : "0"}}"

К моменту вызова renderEntrypointGrokConfig(config) переменная уже инициализирована с дефолтом. Даже под set -u (nounset) ошибки не будет. Тесты подтверждают, что текущий код без дефолта на строке 187 — это правильное поведение.

			> Likely an incorrect or invalid review comment.

Comment thread packages/app/src/lib/core/templates-entrypoint/gemini.ts
Comment thread packages/app/src/lib/core/templates-entrypoint/grok.ts
Comment thread packages/app/src/lib/core/templates/dockerfile.ts
Comment thread packages/app/src/lib/core/templates/playwright-browser-runtime.ts
Comment thread packages/app/tests/docker-git/core-templates.test.ts Outdated
Comment thread packages/lib/src/core/templates-entrypoint/gemini.ts
Comment thread packages/lib/src/core/templates/playwright-browser-runtime.ts
@skulidropek
Copy link
Copy Markdown
Member Author

skulidropek commented May 18, 2026

AI Session Backup

Commit: e4c579f
Status: success
Files: 2 (5.00 MB)
Links: README | Manifest

git status

On branch issue-319
Your branch is up to date with 'origin/issue-319'.

nothing to commit, working tree clean

@skulidropek
Copy link
Copy Markdown
Member Author

skulidropek commented May 18, 2026

AI Session Backup

Commit: 54ee160
Status: success
Files: 2 (5.53 MB)
Links: README | Manifest

git status

On branch issue-319
Your branch is up to date with 'origin/issue-319'.

nothing to commit, working tree clean

@skulidropek
Copy link
Copy Markdown
Member Author

skulidropek commented May 18, 2026

AI Session Backup

Commit: 3f4a7b2
Status: success
Files: 2 (6.06 MB)
Links: README | Manifest

git status

On branch issue-319
Your branch is up to date with 'origin/issue-319'.

nothing to commit, working tree clean

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MCP Playright падает при создании новых проектов

1 participant