Skip to content

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

Merged
skulidropek merged 4 commits into
mainfrom
issue-319
May 18, 2026
Merged

fix(mcp): keep Playwright MCP handshake nonblocking#321
skulidropek merged 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

📝 Walkthrough

Summary by CodeRabbit

Заметки о выпуске

  • New Features

    • Встроенный nested Playwright runtime с явным ожиданием готовности и новым порядком запуска.
    • Динамическая синхронизация конфигураций Gemini/Grok для включения/удаления Playwright MCP.
  • Bug Fixes

    • Надёжное автоматическое отключение Playwright MCP при ошибках сборки/старта или недоступности CDP.
  • Chores

    • Дефолт CDP-эндпоинт сменён на http://127.0.0.1:9223; добавлены параметры timeout/ready/retry/guard.
  • Tests

    • Расширены тесты Dockerfile и runtime-скриптов для новых сценариев и проверок готовности.

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.
  • ProverCoderAI/docker-git#309: Пересечение по изменению Dockerfile прелюдии (базовый образ / системные пакеты).
🚥 Pre-merge checks | ✅ 7
✅ Passed checks (7 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main fix: making Playwright MCP handshake nonblocking, which directly addresses the core problem from issue #319.
Description check ✅ Passed The PR description comprehensively covers the summary, implementation details, validation steps, and includes verification evidence. While the template requires 'Fixes #' format, the description properly addresses all critical information.
Linked Issues check ✅ Passed The PR fully addresses issue #319 objectives: nonblocking MCP handshake via guarded mode [#319], CDP readiness detection with MCP disabling [#319], MCP config rendering after browser runtime [#319], and stale config cleanup [#319].
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #319: MCP handshake fixes, browser runtime CDP detection, template synchronization, and test coverage. Import reordering and minor refactoring serve these objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Requirements Alignment ✅ Passed All PR objectives from issue #319 implemented: guarded mode, non-blocking CDP, MCP disable on failure, correct render order, stale config removal, comprehensive tests, documented, app/lib synced.
Security Regression ✅ Passed No security regressions found. Shell variables properly quoted, JSON parsed safely with type guards, file permissions set to 0600, Docker config avoids privileged modes, and dependencies pinned.

✏️ 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

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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/lib/src/core/templates/dockerfile.ts (1)

203-235: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Рассмотрите валидацию MCP_PLAYWRIGHT_RETRY_ATTEMPTS в non-guarded пути для консистентности.

В playwright-browser-runtime.ts переменные attempts и delay валидируются регулярным выражением ^[0-9]+$ перед использованием в цикле. В non-guarded ветке этого wrapper-скрипта (строка 210) MCP_PLAYWRIGHT_RETRY_ATTEMPTS передаётся в seq без проверки.

Риск низкий: guard включён по умолчанию, и этот путь используется редко. Однако для консистентности с паттерном в docker_git_wait_for_playwright_cdp можно добавить аналогичную валидацию.

🤖 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/lib/src/core/templates/dockerfile.ts` around lines 203 - 235, The
non-guarded path calls seq with MCP_PLAYWRIGHT_RETRY_ATTEMPTS without validating
it's a positive integer; mirror the validation used in
docker_git_wait_for_playwright_cdp/playwright-browser-runtime by validating
MCP_PLAYWRIGHT_RETRY_ATTEMPTS (and optionally MCP_PLAYWRIGHT_RETRY_DELAY) with a
regex like ^[0-9]+$ before using it in the seq loop inside
fetch_cdp_version/for-attempt loop, and if invalid, set a safe default or exit
with a clear error so seq can't receive malformed input.
🤖 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.

Outside diff comments:
In `@packages/lib/src/core/templates/dockerfile.ts`:
- Around line 203-235: The non-guarded path calls seq with
MCP_PLAYWRIGHT_RETRY_ATTEMPTS without validating it's a positive integer; mirror
the validation used in
docker_git_wait_for_playwright_cdp/playwright-browser-runtime by validating
MCP_PLAYWRIGHT_RETRY_ATTEMPTS (and optionally MCP_PLAYWRIGHT_RETRY_DELAY) with a
regex like ^[0-9]+$ before using it in the seq loop inside
fetch_cdp_version/for-attempt loop, and if invalid, set a safe default or exit
with a clear error so seq can't receive malformed input.

ℹ️ Review info
⚙️ 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
📜 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 (Login context)
  • GitHub Check: E2E (Clone cache)
  • GitHub Check: E2E (Clone auto-open SSH)
  • GitHub Check: E2E (Runtime volumes + SSH)
  • GitHub Check: E2E (Browser command)
🧰 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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/test-adapters/core-templates.ts
  • packages/app/src/lib/core/templates-entrypoint/claude.ts
  • packages/lib/src/core/templates-entrypoint/claude.ts
  • packages/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/src/lib/core/templates-entrypoint/grok.ts
  • packages/app/src/lib/core/templates/playwright-browser-runtime.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
  • packages/app/src/lib/core/templates-entrypoint/gemini.ts
  • packages/lib/src/core/templates/playwright-browser-runtime.ts
  • packages/lib/src/core/templates-entrypoint/grok.ts
  • packages/lib/src/core/templates/dockerfile.ts
  • packages/lib/src/core/templates-entrypoint/gemini.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/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/tests/docker-git/core-templates.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/lib/tests/usecases/mcp-playwright.test.ts
  • packages/app/tests/docker-git/core-templates.test.ts
  • packages/lib/tests/core/templates.test.ts
🔇 Additional comments (15)
packages/app/test-adapters/core-templates.ts (1)

1-2: LGTM!

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

196-196: LGTM!

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

195-195: LGTM!

packages/lib/tests/usecases/mcp-playwright.test.ts (1)

128-144: LGTM!

Also applies to: 175-182

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

154-155: LGTM!

Also applies to: 185-219, 339-339

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

30-75: LGTM!

Also applies to: 133-134, 137-138, 141-142, 150-151, 163-164, 195-201

packages/app/tests/docker-git/core-templates.test.ts (1)

3-4: LGTM!

Also applies to: 28-43, 47-67

packages/lib/tests/core/templates.test.ts (1)

233-245: LGTM!

Also applies to: 452-455, 741-749, 766-777

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

200-233: LGTM!

Also applies to: 337-337

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

29-74: LGTM!


132-200: LGTM!

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

153-154: LGTM!

Also applies to: 184-218, 338-338

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

156-201: LGTM!

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

199-232: LGTM!

Also applies to: 336-336

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

156-201: LGTM!

Also applies to: 239-244, 403-403

@skulidropek skulidropek merged commit 53b3163 into main May 18, 2026
19 checks passed
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